diff --git a/Cargo.lock b/Cargo.lock index 5e455d0f1..313de021a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -976,7 +976,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c3d2abadaa28e0d277f9f6d07a2052544f045d929cd4d6f7bcfb43567c9767" dependencies = [ "hasher", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "rlp", ] @@ -1034,9 +1034,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.11.3" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba00838774b4ab0233e355d26710fbfc8327a05c017f6dc4873f876d1f79f78" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" dependencies = [ "cfg-if", "cpufeatures", @@ -1403,7 +1403,7 @@ dependencies = [ "lazy_static", "log", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "paste", "revm", "rpds", @@ -1429,9 +1429,10 @@ dependencies = [ "edr_provider", "edr_rpc_client", "edr_rpc_eth", + "edr_solidity", "edr_test_utils", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "paste", "serde", "serde_json", @@ -1462,9 +1463,9 @@ dependencies = [ "napi-build", "napi-derive", "openssl-sys", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "rand", - "semver 1.0.22", + "semver 1.0.23", "serde", "serde_json", "strum", @@ -1485,6 +1486,7 @@ dependencies = [ "edr_generic", "edr_provider", "edr_rpc_client", + "edr_solidity", "itertools 0.12.1", "napi", "serde", @@ -1506,10 +1508,11 @@ dependencies = [ "edr_napi_core", "edr_provider", "edr_rpc_eth", + "edr_solidity", "edr_test_utils", "log", "op-alloy-rpc-types", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "paste", "revm-optimism", "serde", @@ -1534,6 +1537,7 @@ dependencies = [ "edr_eth", "edr_evm", "edr_rpc_eth", + "edr_solidity", "edr_test_utils", "edr_utils", "indexmap 2.2.6", @@ -1542,7 +1546,7 @@ dependencies = [ "lazy_static", "log", "lru", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "paste", "rand", "revm-precompile", @@ -1621,13 +1625,18 @@ version = "0.3.5" dependencies = [ "alloy-dyn-abi 0.7.7", "alloy-json-abi 0.7.7", + "alloy-sol-types 0.7.7", "anyhow", + "derive-where", "edr_eth", "edr_evm", "indexmap 2.2.6", + "parking_lot 0.12.3", + "semver 1.0.23", "serde", "serde_json", "strum", + "thiserror", ] [[package]] @@ -2528,7 +2537,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "semver 1.0.22", + "semver 1.0.23", "syn 2.0.58", ] @@ -2831,9 +2840,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core 0.9.9", @@ -3549,7 +3558,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.22", + "semver 1.0.23", ] [[package]] @@ -3689,9 +3698,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "semver-parser" @@ -3766,7 +3775,7 @@ dependencies = [ "futures", "lazy_static", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "serial_test_derive", ] @@ -4151,7 +4160,7 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project-lite", "socket2", "tokio-macros", @@ -4264,9 +4273,11 @@ dependencies = [ "edr_optimism", "edr_provider", "edr_rpc_eth", + "edr_solidity", "flate2", "indicatif", "mimalloc", + "parking_lot 0.12.3", "reqwest", "serde", "serde_json", @@ -4336,7 +4347,7 @@ dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "regex", "sharded-slab", "smallvec", diff --git a/crates/edr_evm/src/trace.rs b/crates/edr_evm/src/trace.rs index be7710f99..82840f2cf 100644 --- a/crates/edr_evm/src/trace.rs +++ b/crates/edr_evm/src/trace.rs @@ -203,7 +203,7 @@ pub struct Trace { #[derive(Clone, Debug)] pub struct Step { /// The program counter - pub pc: u64, + pub pc: u32, /// The call depth pub depth: u64, /// The executed op code @@ -515,7 +515,10 @@ impl TraceCollector { None }; self.current_trace_mut().add_step(Step { - pc: interp.program_counter() as u64, + pc: interp + .program_counter() + .try_into() + .expect("program counter fits into u32"), depth: data.journaled_state.depth(), opcode: interp.current_opcode(), stack, diff --git a/crates/edr_generic/Cargo.toml b/crates/edr_generic/Cargo.toml index 711c9a6e1..3c1f513d7 100644 --- a/crates/edr_generic/Cargo.toml +++ b/crates/edr_generic/Cargo.toml @@ -11,6 +11,7 @@ edr_eth = { path = "../edr_eth" } edr_evm = { path = "../edr_evm" } edr_provider = { path = "../edr_provider" } edr_rpc_eth = { path = "../edr_rpc_eth" } +edr_solidity = { path = "../edr_solidity" } log = { version = "0.4.17", default-features = false } serde = { version = "1.0.209", default-features = false, features = ["derive"] } thiserror = { version = "1.0.37", default-features = false } diff --git a/crates/edr_generic/tests/integration/issue_570.rs b/crates/edr_generic/tests/integration/issue_570.rs index 0ad985990..8beade90a 100644 --- a/crates/edr_generic/tests/integration/issue_570.rs +++ b/crates/edr_generic/tests/integration/issue_570.rs @@ -1,4 +1,4 @@ -use std::str::FromStr as _; +use std::{str::FromStr as _, sync::Arc}; use edr_eth::{l1, B256}; use edr_evm::hardfork; @@ -7,10 +7,10 @@ use edr_provider::{ hardhat_rpc_types::ForkConfig, test_utils::create_test_config_with_fork, time::CurrentTime, MethodInvocation, NoopLogger, Provider, ProviderError, ProviderRequest, }; +use edr_solidity::contract_decoder::ContractDecoder; use edr_test_utils::env::get_alchemy_url; use serial_test::serial; use tokio::runtime; - // SAFETY: tests that modify the environment should be run serially. fn get_provider() -> anyhow::Result> { @@ -39,6 +39,7 @@ fn get_provider() -> anyhow::Result> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?) } diff --git a/crates/edr_napi/CHANGELOG.md b/crates/edr_napi/CHANGELOG.md index d1a58a238..acaaf03f3 100644 --- a/crates/edr_napi/CHANGELOG.md +++ b/crates/edr_napi/CHANGELOG.md @@ -1,5 +1,11 @@ # @nomicfoundation/edr +## 0.7.0 + +### Minor Changes + +- d419f36: Add a `stackTrace` getter to the provider's response and remove the old, lower-level `solidityTrace` getter. + ## 0.6.5 ### Patch Changes diff --git a/crates/edr_napi/index.d.ts b/crates/edr_napi/index.d.ts index 474fdfa68..77df3041d 100644 --- a/crates/edr_napi/index.d.ts +++ b/crates/edr_napi/index.d.ts @@ -310,8 +310,6 @@ export interface LoggerConfig { /** Whether to enable the logger. */ enable: boolean decodeConsoleLogInputsCallback: (inputs: Buffer[]) => string[] - /** Used to resolve the contract and function name when logging. */ - getContractAndFunctionNameCallback: (code: Buffer, calldata?: Buffer) => ContractAndFunctionName printLineCallback: (message: string, replace: boolean) => void } /** The possible reasons for successful termination of the EVM. */ @@ -411,18 +409,7 @@ export interface SubscriptionEvent { filterId: bigint result: any } -export declare function createModelsAndDecodeBytecodes(solcVersion: string, compilerInput: any, compilerOutput: any): Array export declare function linkHexStringBytecode(code: string, address: string, position: number): string -export enum ContractFunctionType { - CONSTRUCTOR = 0, - FUNCTION = 1, - FALLBACK = 2, - RECEIVE = 3, - GETTER = 4, - MODIFIER = 5, - FREE_FUNCTION = 6 -} -export declare function printMessageTrace(trace: PrecompileMessageTrace | CallMessageTrace | CreateMessageTrace, depth?: number | undefined | null): void export declare function printStackTrace(trace: SolidityStackTrace): void /** Represents the exit code of the EVM. */ export enum ExitCode { @@ -445,51 +432,14 @@ export enum ExitCode { /** Unknown halt reason. */ UNKNOWN_HALT_REASON = 8 } -export interface EvmStep { - pc: number -} -export interface PrecompileMessageTrace { - value: bigint - returnData: Uint8Array - exit: Exit - gasUsed: bigint - depth: number - precompile: number - calldata: Uint8Array -} -export interface CreateMessageTrace { - value: bigint - returnData: Uint8Array - exit: Exit - gasUsed: bigint - depth: number - code: Uint8Array - steps: Array - /** - * Reference to the resolved `Bytecode` EDR data. - * Only used on the JS side by the `VmTraceDecoder` class. - */ - bytecode?: BytecodeWrapper - numberOfSubtraces: number - deployedContract?: Uint8Array | undefined -} -export interface CallMessageTrace { - value: bigint - returnData: Uint8Array - exit: Exit - gasUsed: bigint - depth: number - code: Uint8Array - steps: Array - /** - * Reference to the resolved `Bytecode` EDR data. - * Only used on the JS side by the `VmTraceDecoder` class. - */ - bytecode?: BytecodeWrapper - numberOfSubtraces: number - calldata: Uint8Array - address: Uint8Array - codeAddress: Uint8Array +export enum ContractFunctionType { + CONSTRUCTOR = 0, + FUNCTION = 1, + FALLBACK = 2, + RECEIVE = 3, + GETTER = 4, + MODIFIER = 5, + FREE_FUNCTION = 6 } export enum StackTraceEntryType { CALLSTACK_ENTRY = 0, @@ -645,11 +595,6 @@ export interface ContractCallRunOutOfGasError { type: StackTraceEntryType.CONTRACT_CALL_RUN_OUT_OF_GAS_ERROR sourceReference?: SourceReference } -export interface ContractAndFunctionName { - contractName: string - functionName: string | undefined -} -export declare function initializeVmTraceDecoder(vmTraceDecoder: VmTraceDecoder, tracingConfig: any): void export interface TracingMessage { /** Sender address */ readonly caller: Buffer @@ -693,6 +638,11 @@ export interface TracingMessageResult { /** Execution result */ readonly executionResult: ExecutionResult } +/** + * Returns the latest version of solc that EDR officially + * supports and is tested against. + */ +export declare function getLatestSupportedSolcVersion(): string export interface Withdrawal { /** The index of withdrawal */ index: bigint @@ -707,7 +657,7 @@ export declare class EdrContext { /**Creates a new [`EdrContext`] instance. Should only be called once! */ constructor() /**Constructs a new provider with the provided configuration. */ - createProvider(chainType: string, providerConfig: ProviderConfig, loggerConfig: LoggerConfig, subscriptionConfig: SubscriptionConfig): Promise + createProvider(chainType: string, providerConfig: ProviderConfig, loggerConfig: LoggerConfig, subscriptionConfig: SubscriptionConfig, tracingConfig: any): Promise /**Registers a new provider factory for the provided chain type. */ registerProviderFactory(chainType: string, factory: ProviderFactory): Promise } @@ -715,8 +665,8 @@ export declare class ProviderFactory { } export declare class Response { /**Returns the response data as a JSON string or a JSON object. */ get data(): string | any - /**Returns the Solidity trace of the transaction that failed to execute, if any. */ - get solidityTrace(): RawTrace | null + /**Compute the error stack trace. Return the stack trace if it can be decoded, otherwise returns none. Throws if there was an error computing the stack trace. */ + stackTrace(): SolidityStackTrace | null /**Returns the raw traces of executed contracts. This maybe contain zero or more traces. */ get traces(): Array } @@ -733,16 +683,16 @@ export declare class Provider { */ setVerboseTracing(verboseTracing: boolean): Promise } -/** - * Opaque handle to the `Bytecode` struct. - * Only used on the JS side by the `VmTraceDecoder` class. - */ -export declare class BytecodeWrapper { } export declare class Exit { get kind(): ExitCode isError(): boolean getReason(): string } +/** + * Opaque handle to the `Bytecode` struct. + * Only used on the JS side by the `VmTraceDecoder` class. + */ +export declare class BytecodeWrapper { } export declare class ReturnData { readonly value: Uint8Array constructor(value: Uint8Array) @@ -752,26 +702,6 @@ export declare class ReturnData { decodeError(): string decodePanic(): bigint } -export declare class SolidityTracer { - - constructor() - getStackTrace(trace: PrecompileMessageTrace | CallMessageTrace | CreateMessageTrace): SolidityStackTrace -} -export declare class VmTraceDecoder { - constructor() - addBytecode(bytecode: BytecodeWrapper): void - tryToDecodeMessageTrace(messageTrace: PrecompileMessageTrace | CallMessageTrace | CreateMessageTrace): PrecompileMessageTrace | CallMessageTrace | CreateMessageTrace - getContractAndFunctionNamesForCall(code: Uint8Array, calldata: Uint8Array | undefined): ContractAndFunctionName -} -export type VMTracer = VmTracer -/** N-API bindings for the Rust port of `VMTracer` from Hardhat. */ -export declare class VmTracer { - constructor() - /** Observes a trace, collecting information about the execution of the EVM. */ - observe(trace: RawTrace): void - getLastTopLevelMessageTrace(): PrecompileMessageTrace | CallMessageTrace | CreateMessageTrace | undefined - getLastError(): Error | undefined -} export declare class RawTrace { trace(): Array } diff --git a/crates/edr_napi/index.js b/crates/edr_napi/index.js index 7491b4dda..139bfd91c 100644 --- a/crates/edr_napi/index.js +++ b/crates/edr_napi/index.js @@ -310,7 +310,7 @@ if (!nativeBinding) { throw new Error(`Failed to load native binding`) } -const { GENERIC_CHAIN_TYPE, genericChainProviderFactory, L1_CHAIN_TYPE, l1GenesisState, l1HardforkFromString, l1ProviderFactory, SpecId, FRONTIER, FRONTIER_THAWING, HOMESTEAD, DAO_FORK, TANGERINE, SPURIOUS_DRAGON, BYZANTIUM, CONSTANTINOPLE, PETERSBURG, ISTANBUL, MUIR_GLACIER, BERLIN, LONDON, ARROW_GLACIER, GRAY_GLACIER, MERGE, SHANGHAI, CANCUN, PRAGUE, PRAGUE_EOF, LATEST, MineOrdering, EdrContext, ProviderFactory, Response, Provider, SuccessReason, ExceptionalHalt, createModelsAndDecodeBytecodes, linkHexStringBytecode, BytecodeWrapper, ContractFunctionType, printMessageTrace, printStackTrace, Exit, ExitCode, ReturnData, StackTraceEntryType, stackTraceEntryTypeToString, FALLBACK_FUNCTION_NAME, RECEIVE_FUNCTION_NAME, CONSTRUCTOR_FUNCTION_NAME, UNRECOGNIZED_FUNCTION_NAME, UNKNOWN_FUNCTION_NAME, PRECOMPILE_FUNCTION_NAME, UNRECOGNIZED_CONTRACT_NAME, SolidityTracer, VmTraceDecoder, initializeVmTraceDecoder, VmTracer, RawTrace } = nativeBinding +const { GENERIC_CHAIN_TYPE, genericChainProviderFactory, L1_CHAIN_TYPE, l1GenesisState, l1HardforkFromString, l1ProviderFactory, SpecId, FRONTIER, FRONTIER_THAWING, HOMESTEAD, DAO_FORK, TANGERINE, SPURIOUS_DRAGON, BYZANTIUM, CONSTANTINOPLE, PETERSBURG, ISTANBUL, MUIR_GLACIER, BERLIN, LONDON, ARROW_GLACIER, GRAY_GLACIER, MERGE, SHANGHAI, CANCUN, PRAGUE, PRAGUE_EOF, LATEST, MineOrdering, EdrContext, ProviderFactory, Response, Provider, SuccessReason, ExceptionalHalt, linkHexStringBytecode, printStackTrace, Exit, ExitCode, BytecodeWrapper, ContractFunctionType, ReturnData, StackTraceEntryType, stackTraceEntryTypeToString, FALLBACK_FUNCTION_NAME, RECEIVE_FUNCTION_NAME, CONSTRUCTOR_FUNCTION_NAME, UNRECOGNIZED_FUNCTION_NAME, UNKNOWN_FUNCTION_NAME, PRECOMPILE_FUNCTION_NAME, UNRECOGNIZED_CONTRACT_NAME, RawTrace, getLatestSupportedSolcVersion } = nativeBinding module.exports.GENERIC_CHAIN_TYPE = GENERIC_CHAIN_TYPE module.exports.genericChainProviderFactory = genericChainProviderFactory @@ -347,14 +347,12 @@ module.exports.Response = Response module.exports.Provider = Provider module.exports.SuccessReason = SuccessReason module.exports.ExceptionalHalt = ExceptionalHalt -module.exports.createModelsAndDecodeBytecodes = createModelsAndDecodeBytecodes module.exports.linkHexStringBytecode = linkHexStringBytecode -module.exports.BytecodeWrapper = BytecodeWrapper -module.exports.ContractFunctionType = ContractFunctionType -module.exports.printMessageTrace = printMessageTrace module.exports.printStackTrace = printStackTrace module.exports.Exit = Exit module.exports.ExitCode = ExitCode +module.exports.BytecodeWrapper = BytecodeWrapper +module.exports.ContractFunctionType = ContractFunctionType module.exports.ReturnData = ReturnData module.exports.StackTraceEntryType = StackTraceEntryType module.exports.stackTraceEntryTypeToString = stackTraceEntryTypeToString @@ -365,8 +363,5 @@ module.exports.UNRECOGNIZED_FUNCTION_NAME = UNRECOGNIZED_FUNCTION_NAME module.exports.UNKNOWN_FUNCTION_NAME = UNKNOWN_FUNCTION_NAME module.exports.PRECOMPILE_FUNCTION_NAME = PRECOMPILE_FUNCTION_NAME module.exports.UNRECOGNIZED_CONTRACT_NAME = UNRECOGNIZED_CONTRACT_NAME -module.exports.SolidityTracer = SolidityTracer -module.exports.VmTraceDecoder = VmTraceDecoder -module.exports.initializeVmTraceDecoder = initializeVmTraceDecoder -module.exports.VmTracer = VmTracer module.exports.RawTrace = RawTrace +module.exports.getLatestSupportedSolcVersion = getLatestSupportedSolcVersion diff --git a/crates/edr_napi/package.json b/crates/edr_napi/package.json index ff2b06694..dcb6d6a5c 100644 --- a/crates/edr_napi/package.json +++ b/crates/edr_napi/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/edr", - "version": "0.6.5", + "version": "0.7.0", "devDependencies": { "@napi-rs/cli": "^2.18.4", "@nomicfoundation/ethereumjs-util": "^9.0.4", diff --git a/crates/edr_napi/src/chains/generic.rs b/crates/edr_napi/src/chains/generic.rs index 5a0d2edd0..2dae87426 100644 --- a/crates/edr_napi/src/chains/generic.rs +++ b/crates/edr_napi/src/chains/generic.rs @@ -8,6 +8,7 @@ use edr_napi_core::{ spec::SyncNapiSpec as _, subscription, }; +use edr_solidity::contract_decoder::ContractDecoder; use napi_derive::napi; use crate::provider::ProviderFactory; @@ -21,8 +22,9 @@ impl SyncProviderFactory for GenericChainProviderFactory { provider_config: edr_napi_core::provider::Config, logger_config: logger::Config, subscription_config: subscription::Config, + contract_decoder: Arc, ) -> napi::Result> { - let logger = Logger::::new(logger_config)?; + let logger = Logger::::new(logger_config, Arc::clone(&contract_decoder))?; let provider_config = edr_provider::ProviderConfig::::from(provider_config); @@ -30,6 +32,7 @@ impl SyncProviderFactory for GenericChainProviderFactory { subscription::Callback::new(env, subscription_config.subscription_callback)?; Ok(Box::new(ProviderBuilder::new( + contract_decoder, Box::new(logger), provider_config, subscription_callback, diff --git a/crates/edr_napi/src/chains/l1.rs b/crates/edr_napi/src/chains/l1.rs index 4b9b5fc36..5b713b617 100644 --- a/crates/edr_napi/src/chains/l1.rs +++ b/crates/edr_napi/src/chains/l1.rs @@ -10,6 +10,7 @@ use edr_napi_core::{ spec::SyncNapiSpec as _, subscription, }; +use edr_solidity::contract_decoder::ContractDecoder; use napi::bindgen_prelude::{BigInt, Uint8Array}; use napi_derive::napi; @@ -24,8 +25,9 @@ impl SyncProviderFactory for L1ProviderFactory { provider_config: edr_napi_core::provider::Config, logger_config: edr_napi_core::logger::Config, subscription_config: edr_napi_core::subscription::Config, + contract_decoder: Arc, ) -> napi::Result> { - let logger = Logger::::new(logger_config)?; + let logger = Logger::::new(logger_config, Arc::clone(&contract_decoder))?; let provider_config = edr_provider::ProviderConfig::::from(provider_config); @@ -33,6 +35,7 @@ impl SyncProviderFactory for L1ProviderFactory { subscription::Callback::new(env, subscription_config.subscription_callback)?; Ok(Box::new(ProviderBuilder::new( + contract_decoder, Box::new(logger), provider_config, subscription_callback, @@ -64,7 +67,8 @@ pub fn l1_genesis_state(hardfork: SpecId) -> Vec { /// hardfork. #[napi] pub fn l1_hardfork_from_string(hardfork: String) -> SpecId { - edr_eth::l1::SpecId::from(hardfork.as_str()).into() + let hardfork = edr_eth::l1::SpecId::from(hardfork.as_str()); + hardfork.into() } #[napi] diff --git a/crates/edr_napi/src/chains/optimism.rs b/crates/edr_napi/src/chains/optimism.rs index efc8c1107..8db68c98d 100644 --- a/crates/edr_napi/src/chains/optimism.rs +++ b/crates/edr_napi/src/chains/optimism.rs @@ -7,6 +7,7 @@ use edr_napi_core::{ subscription, }; use edr_optimism::{OptimismChainSpec, OptimismSpecId}; +use edr_solidity::contract_decoder::ContractDecoder; use napi_derive::napi; use crate::provider::ProviderFactory; @@ -20,8 +21,10 @@ impl SyncProviderFactory for OptimismProviderFactory { provider_config: provider::Config, logger_config: logger::Config, subscription_config: subscription::Config, + contract_decoder: Arc, ) -> napi::Result> { - let logger = Logger::::new(logger_config)?; + let logger = + Logger::::new(logger_config, Arc::clone(&contract_decoder))?; let provider_config = edr_provider::ProviderConfig::::from(provider_config); @@ -29,6 +32,7 @@ impl SyncProviderFactory for OptimismProviderFactory { subscription::Callback::new(env, subscription_config.subscription_callback)?; Ok(Box::new(ProviderBuilder::new( + contract_decoder, Box::new(logger), provider_config, subscription_callback, diff --git a/crates/edr_napi/src/context.rs b/crates/edr_napi/src/context.rs index db3948977..2e88c1800 100644 --- a/crates/edr_napi/src/context.rs +++ b/crates/edr_napi/src/context.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use edr_eth::HashMap; use edr_napi_core::provider::{self, SyncProviderFactory}; +use edr_solidity::contract_decoder::ContractDecoder; use napi::{ tokio::{runtime, sync::Mutex as AsyncMutex}, Env, JsObject, @@ -42,10 +43,20 @@ impl EdrContext { provider_config: ProviderConfig, logger_config: LoggerConfig, subscription_config: SubscriptionConfig, + tracing_config: serde_json::Value, ) -> napi::Result { let provider_config = edr_napi_core::provider::Config::try_from(provider_config)?; let logger_config = logger_config.resolve(&env)?; + // TODO: https://github.com/NomicFoundation/edr/issues/760 + let build_info_config: edr_solidity::contract_decoder::BuildInfoConfig = + serde_json::from_value(tracing_config)?; + + let contract_decoder = ContractDecoder::new(&build_info_config).map_or_else( + |error| Err(napi::Error::from_reason(error.to_string())), + |contract_decoder| Ok(Arc::new(contract_decoder)), + )?; + #[cfg(feature = "scenarios")] let scenario_file = runtime::Handle::current().block_on(crate::scenarios::scenario_file( @@ -56,13 +67,17 @@ impl EdrContext { let runtime = runtime::Handle::current(); let builder = { + // TODO: https://github.com/NomicFoundation/edr/issues/760 + // TODO: Don't block the JS event loop let context = runtime.block_on(async { self.inner.lock().await }); + context.create_provider_builder( &env, &chain_type, provider_config, logger_config, subscription_config.into(), + &contract_decoder, )? }; @@ -72,6 +87,7 @@ impl EdrContext { Provider::new( provider, runtime, + contract_decoder, #[cfg(feature = "scenarios")] scenario_file, ) @@ -164,6 +180,7 @@ impl Context { provider_config: edr_napi_core::provider::Config, logger_config: edr_napi_core::logger::Config, subscription_config: edr_napi_core::subscription::Config, + contract_decoder: &Arc, ) -> napi::Result> { if let Some(factory) = self.provider_factories.get(chain_type) { factory.create_provider_builder( @@ -171,6 +188,7 @@ impl Context { provider_config, logger_config, subscription_config, + contract_decoder.clone(), ) } else { Err(napi::Error::new( diff --git a/crates/edr_napi/src/logger.rs b/crates/edr_napi/src/logger.rs index b024064fe..4d835c4be 100644 --- a/crates/edr_napi/src/logger.rs +++ b/crates/edr_napi/src/logger.rs @@ -20,12 +20,6 @@ pub struct ContractAndFunctionName { pub function_name: Option, } -struct ContractAndFunctionNameCall { - code: Bytes, - /// Only present for calls. - calldata: Option, -} - impl TryCast<(String, Option)> for ContractAndFunctionName { type Error = napi::Error; @@ -40,9 +34,6 @@ pub struct LoggerConfig { pub enable: bool, #[napi(ts_type = "(inputs: Buffer[]) => string[]")] pub decode_console_log_inputs_callback: JsFunction, - #[napi(ts_type = "(code: Buffer, calldata?: Buffer) => ContractAndFunctionName")] - /// Used to resolve the contract and function name when logging. - pub get_contract_and_function_name_callback: JsFunction, #[napi(ts_type = "(message: string, replace: boolean) => void")] pub print_line_callback: JsFunction, } @@ -93,61 +84,6 @@ impl LoggerConfig { receiver.recv().unwrap() }); - let mut get_contract_and_function_name_callback: ThreadsafeFunction< - _, - ErrorStrategy::Fatal, - > = self - .get_contract_and_function_name_callback - .create_threadsafe_function( - 0, - |ctx: ThreadSafeCallContext| { - // Buffer - let code = ctx - .env - .create_buffer_with_data(ctx.value.code.to_vec())? - .into_unknown(); - - // Option - let calldata = if let Some(calldata) = ctx.value.calldata { - ctx.env - .create_buffer_with_data(calldata.to_vec())? - .into_unknown() - } else { - ctx.env.get_undefined()?.into_unknown() - }; - - Ok(vec![code, calldata]) - }, - )?; - - // Maintain a weak reference to the function to avoid the event loop from - // exiting. - get_contract_and_function_name_callback.unref(env)?; - - let get_contract_and_function_name_fn = Arc::new(move |code, calldata| { - let (sender, receiver) = channel(); - - let status = get_contract_and_function_name_callback.call_with_return_value( - ContractAndFunctionNameCall { code, calldata }, - ThreadsafeFunctionCallMode::Blocking, - move |result: ContractAndFunctionName| { - let contract_and_function_name = result.try_cast(); - sender.send(contract_and_function_name).map_err(|_error| { - napi::Error::new( - Status::GenericFailure, - "Failed to send result from get_contract_and_function_name", - ) - }) - }, - ); - assert_eq!(status, Status::Ok); - - receiver - .recv() - .unwrap() - .expect("Failed call to get_contract_and_function_name") - }); - let mut print_line_callback: ThreadsafeFunction<_, ErrorStrategy::Fatal> = self .print_line_callback .create_threadsafe_function(0, |ctx: ThreadSafeCallContext<(String, bool)>| { @@ -178,7 +114,6 @@ impl LoggerConfig { Ok(edr_napi_core::logger::Config { enable: self.enable, decode_console_log_inputs_fn, - get_contract_and_function_name_fn, print_line_fn, }) } diff --git a/crates/edr_napi/src/provider.rs b/crates/edr_napi/src/provider.rs index 0ae2dfcff..05256cc81 100644 --- a/crates/edr_napi/src/provider.rs +++ b/crates/edr_napi/src/provider.rs @@ -5,6 +5,7 @@ mod response; use std::sync::Arc; use edr_napi_core::provider::SyncProvider; +use edr_solidity::contract_decoder::ContractDecoder; use napi::{tokio::runtime, Env, JsFunction, JsObject, Status}; use napi_derive::napi; @@ -15,6 +16,7 @@ use crate::call_override::CallOverrideCallback; /// A JSON-RPC provider for Ethereum. #[napi] pub struct Provider { + contract_decoder: Arc, provider: Arc, runtime: runtime::Handle, #[cfg(feature = "scenarios")] @@ -26,11 +28,13 @@ impl Provider { pub fn new( provider: Arc, runtime: runtime::Handle, + contract_decoder: Arc, #[cfg(feature = "scenarios")] scenario_file: Option< napi::tokio::sync::Mutex, >, ) -> Self { Self { + contract_decoder, provider, runtime, #[cfg(feature = "scenarios")] @@ -51,8 +55,10 @@ impl Provider { crate::scenarios::write_request(scenario_file, &request).await?; } + let contract_decoder = Arc::clone(&self.contract_decoder); + self.runtime - .spawn_blocking(move || provider.handle_request(request)) + .spawn_blocking(move || provider.handle_request(request, contract_decoder)) .await .map_err(|error| napi::Error::new(Status::GenericFailure, error.to_string()))? .map(Response::from) diff --git a/crates/edr_napi/src/provider/response.rs b/crates/edr_napi/src/provider/response.rs index 8fe96c2f8..f30337495 100644 --- a/crates/edr_napi/src/provider/response.rs +++ b/crates/edr_napi/src/provider/response.rs @@ -1,8 +1,12 @@ use edr_eth::result::HaltReason; +use edr_napi_core::spec::SolidityTraceData; use napi::Either; use napi_derive::napi; -use crate::trace::RawTrace; +use crate::{ + cast::TryCast, + trace::{solidity_stack_trace::SolidityStackTrace, RawTrace}, +}; #[napi] pub struct Response { @@ -23,13 +27,35 @@ impl Response { self.inner.data.clone() } - #[doc = "Returns the Solidity trace of the transaction that failed to execute, if any."] - #[napi(getter)] - pub fn solidity_trace(&self) -> Option { - self.inner - .solidity_trace - .as_ref() - .map(|trace| RawTrace::from(trace.clone())) + // Rust port of https://github.com/NomicFoundation/hardhat/blob/c20bf195a6efdc2d74e778b7a4a7799aac224841/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts#L590 + #[doc = "Compute the error stack trace. Return the stack trace if it can be decoded, otherwise returns none. Throws if there was an error computing the stack trace."] + #[napi] + pub fn stack_trace(&self) -> napi::Result> { + let Some(SolidityTraceData { + trace, + contract_decoder, + }) = &self.inner.solidity_trace + else { + return Ok(None); + }; + let nested_trace = edr_solidity::nested_tracer::convert_trace_messages_to_nested_trace( + trace.as_ref().clone(), + ) + .map_err(|err| napi::Error::from_reason(err.to_string()))?; + + if let Some(vm_trace) = nested_trace { + let decoded_trace = contract_decoder.try_to_decode_message_trace(vm_trace); + let stack_trace = edr_solidity::solidity_tracer::get_stack_trace(decoded_trace) + .map_err(|err| napi::Error::from_reason(err.to_string()))?; + let stack_trace = stack_trace + .into_iter() + .map(TryCast::try_cast) + .collect::, _>>()?; + + Ok(Some(stack_trace)) + } else { + Ok(None) + } } #[doc = "Returns the raw traces of executed contracts. This maybe contain zero or more traces."] diff --git a/crates/edr_napi/src/trace.rs b/crates/edr_napi/src/trace.rs index ae01ee187..121ac85d4 100644 --- a/crates/edr_napi/src/trace.rs +++ b/crates/edr_napi/src/trace.rs @@ -17,20 +17,13 @@ use napi_derive::napi; use crate::result::ExecutionResult; -mod compiler; mod library_utils; -mod model; mod debug; -mod error_inferrer; mod exit; -mod mapped_inlined_internal_functions_heuristics; -mod message_trace; +mod model; mod return_data; -mod solidity_stack_trace; -mod solidity_tracer; -mod vm_trace_decoder; -mod vm_tracer; +pub mod solidity_stack_trace; #[napi(object)] pub struct TracingMessage { @@ -150,7 +143,7 @@ impl TracingStep { Self { depth: step.depth as u8, - pc: BigInt::from(step.pc), + pc: BigInt::from(u64::from(step.pc)), opcode: OpCode::name_by_op(step.opcode).to_string(), stack, memory, @@ -158,7 +151,7 @@ impl TracingStep { } } -fn u256_to_bigint(v: &edr_eth::U256) -> BigInt { +pub(crate) fn u256_to_bigint(v: &edr_eth::U256) -> BigInt { BigInt { sign_bit: false, words: v.into_limbs().to_vec(), @@ -205,3 +198,10 @@ impl RawTrace { .collect::>() } } + +#[napi] +/// Returns the latest version of solc that EDR officially +/// supports and is tested against. +pub fn get_latest_supported_solc_version() -> String { + "0.8.28".to_string() +} diff --git a/crates/edr_napi/src/trace/compiler.rs b/crates/edr_napi/src/trace/compiler.rs deleted file mode 100644 index 88956b160..000000000 --- a/crates/edr_napi/src/trace/compiler.rs +++ /dev/null @@ -1,27 +0,0 @@ -use std::rc::Rc; - -use edr_solidity::artifacts::{CompilerInput, CompilerOutput}; -use napi::{bindgen_prelude::ClassInstance, Env}; -use napi_derive::napi; - -use crate::trace::model::BytecodeWrapper; - -#[napi(catch_unwind)] -pub fn create_models_and_decode_bytecodes( - solc_version: String, - compiler_input: serde_json::Value, - compiler_output: serde_json::Value, - env: Env, -) -> napi::Result>> { - let compiler_input: CompilerInput = serde_json::from_value(compiler_input)?; - let compiler_output: CompilerOutput = serde_json::from_value(compiler_output)?; - - edr_solidity::compiler::create_models_and_decode_bytecodes( - solc_version, - &compiler_input, - &compiler_output, - )? - .into_iter() - .map(|bytecode| BytecodeWrapper::new(Rc::new(bytecode)).into_instance(env)) - .collect() -} diff --git a/crates/edr_napi/src/trace/debug.rs b/crates/edr_napi/src/trace/debug.rs index e51410428..18daef116 100644 --- a/crates/edr_napi/src/trace/debug.rs +++ b/crates/edr_napi/src/trace/debug.rs @@ -1,270 +1,11 @@ //! Port of `hardhat-network/stack-traces/debug.ts` from Hardhat. -use edr_eth::{bytecode::opcode::OpCode, hex, U256}; -use edr_solidity::build_model::JumpType; -use napi::{ - bindgen_prelude::{Either24, Either3, Either4}, - Either, Env, -}; +use napi::bindgen_prelude::Either24; use napi_derive::napi; -use super::{ - message_trace::{CallMessageTrace, CreateMessageTrace, PrecompileMessageTrace}, - solidity_stack_trace::{RevertErrorStackTraceEntry, SolidityStackTrace}, -}; +use super::solidity_stack_trace::{RevertErrorStackTraceEntry, SolidityStackTrace}; use crate::trace::return_data::ReturnData; -const MARGIN_SPACE: usize = 6; - -#[napi] -fn print_message_trace( - trace: Either3, - depth: Option, - env: Env, -) -> napi::Result<()> { - let trace = match &trace { - Either3::A(precompile) => Either3::A(precompile), - Either3::B(call) => Either3::B(call), - Either3::C(create) => Either3::C(create), - }; - - let depth = depth.unwrap_or(0); - - print_message_trace_inner(trace, depth, env) -} - -fn print_message_trace_inner( - trace: Either3<&PrecompileMessageTrace, &CallMessageTrace, &CreateMessageTrace>, - depth: u32, - env: Env, -) -> napi::Result<()> { - println!(); - - match trace { - Either3::A(precompile) => print_precompile_trace(precompile, depth), - Either3::B(call) => print_call_trace(call, depth, env)?, - Either3::C(create) => print_create_trace(create, depth, env)?, - } - - println!(); - - Ok(()) -} - -fn print_precompile_trace(trace: &PrecompileMessageTrace, depth: u32) { - let margin = " ".repeat(depth as usize * MARGIN_SPACE); - - let value = U256::from_limbs_slice(&trace.value.words); - - println!("{margin}Precompile trace"); - - println!("{margin} precompile number: {}", trace.precompile); - println!("{margin} value: {value}"); - println!( - "{margin} calldata: {}", - hex::encode_prefixed(&*trace.calldata) - ); - - if trace.exit.is_error() { - println!("{margin} error: {}", trace.exit.get_reason()); - } - - println!( - "{margin} returnData: {}", - hex::encode_prefixed(&*trace.return_data) - ); -} - -fn print_call_trace(trace: &CallMessageTrace, depth: u32, env: Env) -> napi::Result<()> { - let margin = " ".repeat(depth as usize * MARGIN_SPACE); - - println!("{margin}Call trace"); - - if let Some(bytecode) = &trace.bytecode { - let contract = bytecode.contract.borrow(); - let file = contract.location.file(); - let file = file.borrow(); - - println!( - "{margin} calling contract: {}:{}", - file.source_name, contract.name - ); - } else { - println!( - "{margin} unrecognized contract code: {:?}", - hex::encode_prefixed(&*trace.code) - ); - println!( - "{margin} contract: {}", - hex::encode_prefixed(&*trace.address) - ); - } - - println!( - "{margin} value: {}", - U256::from_limbs_slice(&trace.value.words) - ); - println!( - "{margin} calldata: {}", - hex::encode_prefixed(&*trace.calldata) - ); - - if trace.exit.is_error() { - println!("{margin} error: {}", trace.exit.get_reason()); - } - - println!( - "{margin} returnData: {}", - hex::encode_prefixed(&*trace.return_data) - ); - - trace_steps(Either::A(trace), depth, env) -} - -fn print_create_trace(trace: &CreateMessageTrace, depth: u32, env: Env) -> napi::Result<()> { - let margin = " ".repeat(depth as usize * MARGIN_SPACE); - - println!("{margin}Create trace"); - - if let Some(bytecode) = &trace.bytecode { - let contract = bytecode.contract.borrow(); - - println!("{margin} deploying contract: {}", contract.name); - println!("{margin} code: {}", hex::encode_prefixed(&*trace.code)); - } else { - println!( - "{margin} unrecognized deployment code: {}", - hex::encode_prefixed(&*trace.code) - ); - } - - println!( - "{margin} value: {}", - U256::from_limbs_slice(&trace.value.words) - ); - - if let Some(Either::A(deployed_contract)) = &trace.deployed_contract { - println!( - "{margin} contract address: {}", - hex::encode_prefixed(deployed_contract) - ); - } - - if trace.exit.is_error() { - println!("{margin} error: {}", trace.exit.get_reason()); - // The return data is the deployed-bytecode if there was no error, so we don't - // show it - println!( - "{margin} returnData: {}", - hex::encode_prefixed(&*trace.return_data) - ); - } - - trace_steps(Either::B(trace), depth, env)?; - - Ok(()) -} - -fn trace_steps( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - depth: u32, - env: Env, -) -> napi::Result<()> { - let margin = " ".repeat(depth as usize * MARGIN_SPACE); - - println!("{margin} steps:"); - println!(); - - let (bytecode, steps) = match &trace { - Either::A(call) => (&call.bytecode, &call.steps), - Either::B(create) => (&create.bytecode, &create.steps), - }; - - for step in steps { - let step = match step { - Either4::A(step) => step, - trace @ (Either4::B(..) | Either4::C(..) | Either4::D(..)) => { - let trace = match trace { - Either4::A(..) => unreachable!(), - Either4::B(precompile) => Either3::A(precompile), - Either4::C(call) => Either3::B(call), - Either4::D(create) => Either3::C(create), - }; - - print_message_trace_inner(trace, depth + 1, env)?; - continue; - } - }; - - let pc = format!("{:>5}", format!("{:03}", step.pc)); - - if let Some(bytecode) = bytecode { - let inst = bytecode.get_instruction(step.pc)?; - - let location = inst - .location - .as_ref() - .map(|inst_location| { - let inst_location = &inst_location; - let file = inst_location.file(); - let file = file.borrow(); - - let mut location_str = file.source_name.clone(); - - if let Some(func) = inst_location.get_containing_function() { - let file = func.location.file(); - let file = file.borrow(); - - let source_name = func - .contract_name - .as_ref() - .unwrap_or_else(|| &file.source_name); - - location_str += &format!(":{source_name}:{}", func.name); - } - location_str += - &format!(" - {}:{}", inst_location.offset, inst_location.length); - - napi::Result::Ok(location_str) - }) - .transpose()? - .unwrap_or_default(); - - if matches!(inst.opcode, OpCode::JUMP | OpCode::JUMPI) { - let jump = if inst.jump_type == JumpType::NotJump { - "".to_string() - } else { - format!("({})", inst.jump_type) - }; - - let entry = format!("{margin} {pc} {opcode} {jump}", opcode = inst.opcode); - - println!("{entry:<50}{location}"); - } else if inst.opcode.is_push() { - let entry = format!( - "{margin} {pc} {opcode} {push_data}", - opcode = inst.opcode, - push_data = inst - .push_data - .as_deref() - .map(hex::encode_prefixed) - .unwrap_or_default() - ); - - println!("{entry:<50}{location}"); - } else { - let entry = format!("{margin} {pc} {opcode}", opcode = inst.opcode); - - println!("{entry:<50}{location}"); - } - } else { - println!("{margin} {pc}"); - } - } - - Ok(()) -} - #[napi] fn print_stack_trace(trace: SolidityStackTrace) -> napi::Result<()> { let entry_values = trace diff --git a/crates/edr_napi/src/trace/error_inferrer.rs b/crates/edr_napi/src/trace/error_inferrer.rs deleted file mode 100644 index 99746b00d..000000000 --- a/crates/edr_napi/src/trace/error_inferrer.rs +++ /dev/null @@ -1,2255 +0,0 @@ -use std::{borrow::Cow, collections::HashSet}; - -use alloy_dyn_abi::{DynSolValue, JsonAbiExt}; -use edr_eth::{bytecode::opcode::OpCode, hex}; -use edr_solidity::build_model::{ - Bytecode, ContractFunction, ContractFunctionType, ContractKind, Instruction, JumpType, - SourceLocation, -}; -use napi::{ - bindgen_prelude::{BigInt, Either24, Either3, Either4}, - Either, -}; -use semver::{Version, VersionReq}; - -use super::{ - exit::ExitCode, - message_trace::{CallMessageTrace, CreateMessageTrace, EvmStep, PrecompileMessageTrace}, - model::ContractFunctionType as ContractFunctionTypeNapi, - return_data::ReturnData, - solidity_stack_trace::{ - CallFailedErrorStackTraceEntry, CallstackEntryStackTraceEntry, CustomErrorStackTraceEntry, - FallbackNotPayableErrorStackTraceEntry, InternalFunctionCallStackEntry, - InvalidParamsErrorStackTraceEntry, NonContractAccountCalledErrorStackTraceEntry, - PanicErrorStackTraceEntry, SolidityStackTrace, SolidityStackTraceEntry, - SolidityStackTraceEntryExt, SourceReference, UnmappedSolc063RevertErrorStackTraceEntry, - }, -}; -use crate::trace::solidity_stack_trace::{ - ContractCallRunOutOfGasError, ContractTooLargeErrorStackTraceEntry, - DirectLibraryCallErrorStackTraceEntry, FallbackNotPayableAndNoReceiveErrorStackTraceEntry, - FunctionNotPayableErrorStackTraceEntry, MissingFallbackOrReceiveErrorStackTraceEntry, - OtherExecutionErrorStackTraceEntry, ReturndataSizeErrorStackTraceEntry, - RevertErrorStackTraceEntry, StackTraceEntryTypeConst, - UnrecognizedFunctionWithoutFallbackErrorStackTraceEntry, CONSTRUCTOR_FUNCTION_NAME, - FALLBACK_FUNCTION_NAME, RECEIVE_FUNCTION_NAME, -}; - -/// Specifies whether a heuristic was applied and modified the stack trace. -/// -/// Think of it as happy [`Result`] - the [`Heuristic::Hit`] should be -/// propagated to the caller. -#[must_use] -pub enum Heuristic { - /// The heuristic was applied and modified the stack trace. - Hit(SolidityStackTrace), - /// The heuristic did not apply; the stack trace is unchanged. - Miss(SolidityStackTrace), -} - -const FIRST_SOLC_VERSION_CREATE_PARAMS_VALIDATION: Version = Version::new(0, 5, 9); -const FIRST_SOLC_VERSION_RECEIVE_FUNCTION: Version = Version::new(0, 6, 0); -const FIRST_SOLC_VERSION_WITH_UNMAPPED_REVERTS: &str = "0.6.3"; - -/// Port of `SubmessageData` from Hardhat to Rust -// However, it borrows the traces (instead of copying them) because the traces -// do not implement `Clone` due to inner references -pub struct SubmessageDataRef<'a> { - pub message_trace: - Either3<&'a PrecompileMessageTrace, &'a CallMessageTrace, &'a CreateMessageTrace>, - pub stacktrace: SolidityStackTrace, - pub step_index: u32, -} -#[derive(Default)] -pub struct ErrorInferrer; - -impl ErrorInferrer { - pub fn infer_before_tracing_call_message( - trace: &CallMessageTrace, - ) -> napi::Result> { - if Self::is_direct_library_call(trace)? { - return Ok(Some(Self::get_direct_library_call_error_stack_trace( - trace, - )?)); - } - - let bytecode = trace - .bytecode - .as_ref() - .expect("The TS code type-checks this to always have bytecode"); - let contract = bytecode.contract.borrow(); - - let called_function = contract - .get_function_from_selector(trace.calldata.get(..4).unwrap_or(&trace.calldata[..])); - - if let Some(called_function) = called_function { - if Self::is_function_not_payable_error(trace, called_function)? { - return Ok(Some(vec![FunctionNotPayableErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_function_start_source_reference( - Either::A(trace), - called_function, - )?, - value: trace.value.clone(), - } - .into()])); - } - } - - let called_function = called_function.map(AsRef::as_ref); - - if Self::is_missing_function_and_fallback_error(trace, called_function)? { - let source_reference = - Self::get_contract_start_without_function_source_reference(Either::A(trace))?; - - if Self::empty_calldata_and_no_receive(trace)? { - return Ok(Some(vec![MissingFallbackOrReceiveErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - } - .into()])); - } - - return Ok(Some(vec![ - UnrecognizedFunctionWithoutFallbackErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - } - .into(), - ])); - } - - if Self::is_fallback_not_payable_error(trace, called_function)? { - let source_reference = Self::get_fallback_start_source_reference(trace)?; - - if Self::empty_calldata_and_no_receive(trace)? { - return Ok(Some(vec![ - FallbackNotPayableAndNoReceiveErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - value: trace.value.clone(), - } - .into(), - ])); - } - - return Ok(Some(vec![FallbackNotPayableErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - value: trace.value.clone(), - } - .into()])); - } - - Ok(None) - } - - pub fn infer_before_tracing_create_message( - trace: &CreateMessageTrace, - ) -> napi::Result> { - if Self::is_constructor_not_payable_error(trace)? { - return Ok(Some(vec![FunctionNotPayableErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_constructor_start_source_reference(trace)?, - value: trace.value.clone(), - } - .into()])); - } - - if Self::is_constructor_invalid_arguments_error(trace)? { - return Ok(Some(vec![InvalidParamsErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_constructor_start_source_reference(trace)?, - } - .into()])); - } - - Ok(None) - } - - pub fn infer_after_tracing( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - stacktrace: SolidityStackTrace, - function_jumpdests: &[&Instruction], - jumped_into_function: bool, - last_submessage_data: Option>, - ) -> napi::Result { - /// Convenience macro to early return the result if a heuristic hits. - macro_rules! return_if_hit { - ($heuristic: expr) => { - match $heuristic { - Heuristic::Hit(stacktrace) => return Ok(stacktrace), - Heuristic::Miss(stacktrace) => stacktrace, - } - }; - } - - let result = Self::check_last_submessage(trace, stacktrace, last_submessage_data)?; - let stacktrace = return_if_hit!(result); - - let result = Self::check_failed_last_call(trace, stacktrace)?; - let stacktrace = return_if_hit!(result); - - let result = Self::check_last_instruction( - trace, - stacktrace, - function_jumpdests, - jumped_into_function, - )?; - let stacktrace = return_if_hit!(result); - - let result = Self::check_non_contract_called(trace, stacktrace)?; - let stacktrace = return_if_hit!(result); - - let result = Self::check_solidity_0_6_3_unmapped_revert(trace, stacktrace)?; - let stacktrace = return_if_hit!(result); - - if let Some(result) = Self::check_contract_too_large(trace)? { - return Ok(result); - } - - let stacktrace = Self::other_execution_error_stacktrace(trace, stacktrace)?; - Ok(stacktrace) - } - - pub fn filter_redundant_frames( - stacktrace: SolidityStackTrace, - ) -> napi::Result { - // To work around the borrow checker, we'll collect the indices of the frames we - // want to keep. We can't clone the frames, because some of them contain - // non-Clone `ClassInstance`s` - let retained_indices: HashSet<_> = stacktrace - .iter() - .enumerate() - .filter(|(idx, frame)| { - let next_frame = stacktrace.get(idx + 1); - let next_next_frame = stacktrace.get(idx + 2); - - let Some(next_frame) = next_frame else { - return true; - }; - - // we can only filter frames if we know their sourceReference - // and the one from the next frame - let (Some(frame_source), Some(next_frame_source)) = - (frame.source_reference(), next_frame.source_reference()) - else { - return true; - }; - - // look TWO frames ahead to determine if this is a specific occurrence of - // a redundant CALLSTACK_ENTRY frame observed when using Solidity 0.8.5: - match (&frame, next_next_frame) { - ( - Either24::A(CallstackEntryStackTraceEntry { - source_reference, .. - }), - Some(Either24::N(ReturndataSizeErrorStackTraceEntry { - source_reference: next_next_source_reference, - .. - })), - ) if source_reference.range == next_next_source_reference.range - && source_reference.line == next_next_source_reference.line => - { - return false; - } - _ => {} - } - - if frame_source.function.as_deref() == Some("constructor") - && next_frame_source.function.as_deref() != Some("constructor") - { - return true; - } - - // this is probably a recursive call - if *idx > 0 - && frame.type_() == next_frame.type_() - && frame_source.range == next_frame_source.range - && frame_source.line == next_frame_source.line - { - return true; - } - - if frame_source.range[0] <= next_frame_source.range[0] - && frame_source.range[1] >= next_frame_source.range[1] - { - return false; - } - - true - }) - .map(|(idx, _)| idx) - .collect(); - - Ok(stacktrace - .into_iter() - .enumerate() - .filter(|(idx, _)| retained_indices.contains(idx)) - .map(|(_, frame)| frame) - .collect()) - } - - // Heuristics - - fn check_contract_too_large( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result> { - Ok(match trace { - Either::B(create @ CreateMessageTrace { .. }) - if create.exit.kind() == ExitCode::CODESIZE_EXCEEDS_MAXIMUM => - { - Some(vec![ContractTooLargeErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Some(Self::get_constructor_start_source_reference(create)?), - } - .into()]) - } - - _ => None, - }) - } - /// Check if the last call/create that was done failed. - fn check_failed_last_call( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - stacktrace: SolidityStackTrace, - ) -> napi::Result { - let (bytecode, steps) = match &trace { - Either::A(call) => (&call.bytecode, &call.steps), - Either::B(create) => (&create.bytecode, &create.steps), - }; - - let bytecode = bytecode.as_ref().expect("JS code asserts"); - - if steps.is_empty() { - return Ok(Heuristic::Miss(stacktrace)); - } - - for step_index in (0..steps.len() - 1).rev() { - let (step, next_step) = match &steps[step_index..][..2] { - &[Either4::A(ref step), ref next_step] => (step, next_step), - _ => return Ok(Heuristic::Miss(stacktrace)), - }; - - let inst = bytecode.get_instruction(step.pc)?; - - if let (OpCode::CALL | OpCode::CREATE, Either4::A(EvmStep { .. })) = - (inst.opcode, next_step) - { - if Self::is_call_failed_error(trace, step_index as u32, inst)? { - let mut inferred_stacktrace = stacktrace.clone(); - inferred_stacktrace.push( - Self::call_instruction_to_call_failed_to_execute_stack_trace_entry( - bytecode, inst, - )? - .into(), - ); - - return Ok(Heuristic::Hit(Self::fix_initial_modifier( - trace, - inferred_stacktrace, - )?)); - } - } - } - - Ok(Heuristic::Miss(stacktrace)) - } - - /// Check if the trace reverted with a panic error. - fn check_panic( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - mut stacktrace: SolidityStackTrace, - last_instruction: &Instruction, - ) -> napi::Result { - let return_data = ReturnData::new( - match &trace { - Either::A(call) => &call.return_data, - Either::B(create) => &create.return_data, - } - .clone(), - ); - - if !return_data.is_panic_return_data() { - return Ok(Heuristic::Miss(stacktrace)); - } - - // If the last frame is an internal function, it means that the trace - // jumped there to return the panic. If that's the case, we remove that - // frame. - if let Some(Either24::W(InternalFunctionCallStackEntry { .. })) = stacktrace.last() { - stacktrace.pop(); - } - - // if the error comes from a call to a zero-initialized function, - // we remove the last frame, which represents the call, to avoid - // having duplicated frames - let error_code = return_data.decode_panic()?; - let (panic_error_code, lossless) = error_code.get_i64(); - if let (0x51, false) = (panic_error_code, lossless) { - stacktrace.pop(); - } - - stacktrace.push( - Self::instruction_within_function_to_panic_stack_trace_entry( - trace, - last_instruction, - error_code, - )? - .into(), - ); - - Self::fix_initial_modifier(trace, stacktrace).map(Heuristic::Hit) - } - - fn check_custom_errors( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - stacktrace: SolidityStackTrace, - last_instruction: &Instruction, - ) -> napi::Result { - let (bytecode, return_data) = match &trace { - Either::A(call) => (&call.bytecode, &call.return_data), - Either::B(create) => (&create.bytecode, &create.return_data), - }; - - let bytecode = bytecode.as_ref().expect("JS code asserts"); - let contract = bytecode.contract.borrow(); - - let return_data = ReturnData::new(return_data.clone()); - - if return_data.is_empty() || return_data.is_error_return_data() { - // if there is no return data, or if it's a Error(string), - // then it can't be a custom error - return Ok(Heuristic::Miss(stacktrace)); - } - - let raw_return_data = hex::encode(&*return_data.value); - let mut error_message = format!( - "reverted with an unrecognized custom error (return data: 0x{raw_return_data})", - ); - - for custom_error in &contract.custom_errors { - if return_data.matches_selector(custom_error.selector) { - // if the return data matches a custom error in the called contract, - // we format the message using the returnData and the custom error instance - let decoded = custom_error - .decode_error_data(&return_data.value) - .map_err(|e| { - napi::Error::from_reason(format!("Error decoding custom error: {e}")) - })?; - - let params = decoded - .body - .iter() - .map(format_dyn_sol_value) - .collect::>(); - - error_message = format!( - "reverted with custom error '{name}({params})'", - name = custom_error.name, - params = params.join(", ") - ); - - break; - } - } - - let mut stacktrace = stacktrace; - stacktrace.push( - Self::instruction_within_function_to_custom_error_stack_trace_entry( - trace, - last_instruction, - error_message, - )? - .into(), - ); - - Self::fix_initial_modifier(trace, stacktrace).map(Heuristic::Hit) - } - - fn check_solidity_0_6_3_unmapped_revert( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - mut stacktrace: SolidityStackTrace, - ) -> napi::Result { - if Self::solidity_0_6_3_maybe_unmapped_revert(trace)? { - let revert_frame = - Self::solidity_0_6_3_get_frame_for_unmapped_revert_within_function(trace)?; - - if let Some(revert_frame) = revert_frame { - stacktrace.push(revert_frame.into()); - - return Ok(Heuristic::Hit(stacktrace)); - } - - return Ok(Heuristic::Hit(stacktrace)); - } - - Ok(Heuristic::Miss(stacktrace)) - } - - fn check_non_contract_called( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - mut stacktrace: SolidityStackTrace, - ) -> napi::Result { - if Self::is_called_non_contract_account_error(trace)? { - let source_reference = Self::get_last_source_reference(trace)?; - - // We are sure this is not undefined because there was at least a call - // instruction - let source_reference = - source_reference.expect("Expected source reference to be defined"); - - let non_contract_called_frame = NonContractAccountCalledErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - }; - - stacktrace.push(non_contract_called_frame.into()); - - Ok(Heuristic::Hit(stacktrace)) - } else { - Ok(Heuristic::Miss(stacktrace)) - } - } - - /// Check if the last submessage can be used to generate the stack trace. - fn check_last_submessage( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - stacktrace: SolidityStackTrace, - last_submessage_data: Option>, - ) -> napi::Result { - let (bytecode, steps) = match &trace { - Either::A(call) => (&call.bytecode, &call.steps), - Either::B(create) => (&create.bytecode, &create.steps), - }; - - let bytecode = bytecode.as_ref().expect("JS code asserts"); - - let Some(last_submessage_data) = last_submessage_data else { - return Ok(Heuristic::Miss(stacktrace)); - }; - - let mut inferred_stacktrace = Cow::from(&stacktrace); - - // get the instruction before the submessage and add it to the stack trace - let call_step = match steps.get(last_submessage_data.step_index as usize - 1) { - Some(Either4::A(call_step)) => call_step, - _ => panic!("This should not happen: MessageTrace should be preceded by a EVM step"), - }; - - let call_inst = bytecode.get_instruction(call_step.pc)?; - let call_stack_frame = instruction_to_callstack_stack_trace_entry(bytecode, call_inst)?; - - let (call_stack_frame_source_reference, call_stack_frame) = match call_stack_frame { - Either::A(frame) => (frame.source_reference.clone(), frame.into()), - Either::B(frame) => (frame.source_reference.clone(), frame.into()), - }; - - let last_message_failed = match last_submessage_data.message_trace { - Either3::A(precompile) => precompile.exit.is_error(), - Either3::B(call) => call.exit.is_error(), - Either3::C(create) => create.exit.is_error(), - }; - if last_message_failed { - // add the call/create that generated the message to the stack trace - let inferred_stacktrace = inferred_stacktrace.to_mut(); - inferred_stacktrace.push(call_stack_frame); - - if Self::is_subtrace_error_propagated(trace, last_submessage_data.step_index)? - || Self::is_proxy_error_propagated(trace, last_submessage_data.step_index)? - { - inferred_stacktrace.extend(last_submessage_data.stacktrace); - - if Self::is_contract_call_run_out_of_gas_error( - trace, - last_submessage_data.step_index, - )? { - let last_frame = match inferred_stacktrace.pop() { - Some(frame) => frame, - _ => panic!("Expected inferred stack trace to have at least one frame"), - }; - - inferred_stacktrace.push( - ContractCallRunOutOfGasError { - type_: StackTraceEntryTypeConst, - source_reference: last_frame.source_reference().cloned(), - } - .into(), - ); - } - - return Self::fix_initial_modifier(trace, inferred_stacktrace.to_owned()) - .map(Heuristic::Hit); - } - } else { - let is_return_data_size_error = - Self::fails_right_after_call(trace, last_submessage_data.step_index)?; - if is_return_data_size_error { - inferred_stacktrace.to_mut().push( - ReturndataSizeErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: call_stack_frame_source_reference, - } - .into(), - ); - - return Self::fix_initial_modifier(trace, inferred_stacktrace.into_owned()) - .map(Heuristic::Hit); - } - } - - Ok(Heuristic::Miss(stacktrace)) - } - - /// Check if the execution stopped with a revert or an invalid opcode. - fn check_revert_or_invalid_opcode( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - stacktrace: SolidityStackTrace, - last_instruction: &Instruction, - function_jumpdests: &[&Instruction], - jumped_into_function: bool, - ) -> napi::Result { - match last_instruction.opcode { - OpCode::REVERT | OpCode::INVALID => {} - _ => return Ok(Heuristic::Miss(stacktrace)), - } - - let (bytecode, return_data) = match &trace { - Either::A(call) => (&call.bytecode, &call.return_data), - Either::B(create) => (&create.bytecode, &create.return_data), - }; - let bytecode = bytecode.as_ref().expect("JS code asserts"); - - let mut inferred_stacktrace = stacktrace.clone(); - - if let Some(location) = &last_instruction.location { - if jumped_into_function || matches!(trace, Either::B(CreateMessageTrace { .. })) { - // There should always be a function here, but that's not the case with - // optimizations. - // - // If this is a create trace, we already checked args and nonpayable failures - // before calling this function. - // - // If it's a call trace, we already jumped into a function. But optimizations - // can happen. - let failing_function = location.get_containing_function(); - - // If the failure is in a modifier we add an entry with the function/constructor - match failing_function { - Some(func) if func.r#type == ContractFunctionType::Modifier => { - let frame = - Self::get_entry_before_failure_in_modifier(trace, function_jumpdests)?; - - inferred_stacktrace.push(match frame { - Either::A(frame) => frame.into(), - Either::B(frame) => frame.into(), - }); - } - _ => {} - } - } - } - - let panic_stacktrace = Self::check_panic(trace, inferred_stacktrace, last_instruction)?; - let inferred_stacktrace = match panic_stacktrace { - hit @ Heuristic::Hit(..) => return Ok(hit), - Heuristic::Miss(stacktrace) => stacktrace, - }; - - let custom_error_stacktrace = - Self::check_custom_errors(trace, inferred_stacktrace, last_instruction)?; - let mut inferred_stacktrace = match custom_error_stacktrace { - hit @ Heuristic::Hit(..) => return Ok(hit), - Heuristic::Miss(stacktrace) => stacktrace, - }; - - if let Some(location) = &last_instruction.location { - if jumped_into_function || matches!(trace, Either::B(CreateMessageTrace { .. })) { - let failing_function = location.get_containing_function(); - - if failing_function.is_some() { - let frame = Self::instruction_within_function_to_revert_stack_trace_entry( - trace, - last_instruction, - )?; - - inferred_stacktrace.push(frame.into()); - } else { - let is_invalid_opcode_error = last_instruction.opcode == OpCode::INVALID; - - match &trace { - Either::A(CallMessageTrace { calldata, .. }) => { - let contract = bytecode.contract.borrow(); - - // This is here because of the optimizations - let function_from_selector = contract.get_function_from_selector( - calldata.get(..4).unwrap_or(&calldata[..]), - ); - - // in general this shouldn't happen, but it does when viaIR is enabled, - // "optimizerSteps": "u" is used, and the called function is fallback or - // receive - let Some(function) = function_from_selector else { - return Ok(Heuristic::Miss(inferred_stacktrace)); - }; - - let frame = RevertErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_function_start_source_reference( - trace, function, - )?, - return_data: return_data.clone(), - is_invalid_opcode_error, - }; - - inferred_stacktrace.push(frame.into()); - } - Either::B(trace @ CreateMessageTrace { .. }) => { - // This is here because of the optimizations - let frame = RevertErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_constructor_start_source_reference( - trace, - )?, - return_data: return_data.clone(), - is_invalid_opcode_error, - }; - - inferred_stacktrace.push(frame.into()); - } - } - } - - return Self::fix_initial_modifier(trace, inferred_stacktrace).map(Heuristic::Hit); - } - } - - // If the revert instruction is not mapped but there is return data, - // we add the frame anyway, sith the best sourceReference we can get - if last_instruction.location.is_none() && !return_data.is_empty() { - let revert_frame = RevertErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_contract_start_without_function_source_reference( - trace, - )?, - return_data: return_data.clone(), - is_invalid_opcode_error: last_instruction.opcode == OpCode::INVALID, - }; - - inferred_stacktrace.push(revert_frame.into()); - - return Self::fix_initial_modifier(trace, inferred_stacktrace).map(Heuristic::Hit); - } - - Ok(Heuristic::Miss(stacktrace)) - } - - fn check_last_instruction( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - stacktrace: SolidityStackTrace, - function_jumpdests: &[&Instruction], - jumped_into_function: bool, - ) -> napi::Result { - let (bytecode, steps) = match &trace { - Either::A(call) => (&call.bytecode, &call.steps), - Either::B(create) => (&create.bytecode, &create.steps), - }; - let bytecode = bytecode.as_ref().expect("JS code asserts"); - - if steps.is_empty() { - return Ok(Heuristic::Miss(stacktrace)); - } - - let last_step = match steps.last() { - Some(Either4::A(step)) => step, - _ => panic!("This should not happen: MessageTrace ends with a subtrace"), - }; - - let last_instruction = bytecode.get_instruction(last_step.pc)?; - - let revert_or_invalid_stacktrace = Self::check_revert_or_invalid_opcode( - trace, - stacktrace, - last_instruction, - function_jumpdests, - jumped_into_function, - )?; - let stacktrace = match revert_or_invalid_stacktrace { - hit @ Heuristic::Hit(..) => return Ok(hit), - Heuristic::Miss(stacktrace) => stacktrace, - }; - - let (Either::A(trace @ CallMessageTrace { ref calldata, .. }), false) = - (&trace, jumped_into_function) - else { - return Ok(Heuristic::Miss(stacktrace)); - }; - - if Self::has_failed_inside_the_fallback_function(trace)? - || Self::has_failed_inside_the_receive_function(trace)? - { - let frame = Self::instruction_within_function_to_revert_stack_trace_entry( - Either::A(trace), - last_instruction, - )?; - - return Ok(Heuristic::Hit(vec![frame.into()])); - } - - // Sometimes we do fail inside of a function but there's no jump into - if let Some(location) = &last_instruction.location { - let failing_function = location.get_containing_function(); - - if let Some(failing_function) = failing_function { - let frame = RevertErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_function_start_source_reference( - Either::A(trace), - &failing_function, - )?, - return_data: trace.return_data.clone(), - is_invalid_opcode_error: last_instruction.opcode == OpCode::INVALID, - }; - - return Ok(Heuristic::Hit(vec![frame.into()])); - } - } - - let contract = bytecode.contract.borrow(); - - let selector = calldata.get(..4).unwrap_or(&calldata[..]); - let calldata = &calldata.get(4..).unwrap_or(&[]); - - let called_function = contract.get_function_from_selector(selector); - - if let Some(called_function) = called_function { - let abi = alloy_json_abi::Function::try_from(&**called_function).map_err(|e| { - napi::Error::from_reason(format!("Error converting to alloy ABI: {e}")) - })?; - - let is_valid_calldata = match &called_function.param_types { - Some(_) => abi.abi_decode_input(calldata, true).is_ok(), - // if we don't know the param types, we just assume that the call is valid - None => true, - }; - - if !is_valid_calldata { - let frame = InvalidParamsErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_function_start_source_reference( - Either::A(trace), - called_function, - )?, - }; - - return Ok(Heuristic::Hit(vec![frame.into()])); - } - } - - if Self::solidity_0_6_3_maybe_unmapped_revert(Either::A(trace))? { - let revert_frame = - Self::solidity_0_6_3_get_frame_for_unmapped_revert_before_function(trace)?; - - if let Some(revert_frame) = revert_frame { - return Ok(Heuristic::Hit(vec![revert_frame.into()])); - } - } - - let frame = Self::get_other_error_before_called_function_stack_trace_entry(trace)?; - - Ok(Heuristic::Hit(vec![frame.into()])) - } - - // Helpers - - fn fix_initial_modifier( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - mut stacktrace: SolidityStackTrace, - ) -> napi::Result { - if let Some(Either24::A(CallstackEntryStackTraceEntry { - function_type: ContractFunctionTypeNapi::MODIFIER, - .. - })) = stacktrace.first() - { - let entry_before_initial_modifier = - Self::get_entry_before_initial_modifier_callstack_entry(trace)?; - - stacktrace.insert(0, entry_before_initial_modifier); - } - - Ok(stacktrace) - } - - fn get_entry_before_initial_modifier_callstack_entry( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result { - let trace = match trace { - Either::B(create) => { - return Ok(CallstackEntryStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_constructor_start_source_reference(create)?, - function_type: ContractFunctionType::Constructor.into(), - } - .into()) - } - Either::A(call) => call, - }; - - let bytecode = trace.bytecode.as_ref().expect("JS code asserts"); - let contract = bytecode.contract.borrow(); - - let called_function = contract - .get_function_from_selector(trace.calldata.get(..4).unwrap_or(&trace.calldata[..])); - - let source_reference = match called_function { - Some(called_function) => { - Self::get_function_start_source_reference(Either::A(trace), called_function)? - } - None => Self::get_fallback_start_source_reference(trace)?, - }; - - let function_type = match called_function { - Some(_) => ContractFunctionType::Function, - None => ContractFunctionType::Fallback, - }; - - Ok(CallstackEntryStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - function_type: function_type.into(), - } - .into()) - } - - fn call_instruction_to_call_failed_to_execute_stack_trace_entry( - bytecode: &Bytecode, - call_inst: &Instruction, - ) -> napi::Result { - let location = call_inst.location.as_deref(); - - let source_reference = source_location_to_source_reference(bytecode, location)?; - let source_reference = source_reference.expect("Expected source reference to be defined"); - - // Calls only happen within functions - Ok(CallFailedErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - }) - } - - fn get_entry_before_failure_in_modifier( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - function_jumpdests: &[&Instruction], - ) -> napi::Result> { - let bytecode = match &trace { - Either::A(call) => &call.bytecode, - Either::B(create) => &create.bytecode, - }; - let bytecode = bytecode.as_ref().expect("JS code asserts"); - - // If there's a jumpdest, this modifier belongs to the last function that it - // represents - if let Some(last_jumpdest) = function_jumpdests.last() { - let entry = instruction_to_callstack_stack_trace_entry(bytecode, last_jumpdest)?; - - return Ok(entry); - } - - // This function is only called after we jumped into the initial function in - // call traces, so there should always be at least a function jumpdest. - let trace = match trace { - Either::A(_call) => return Err( - napi::Error::new( - napi::Status::GenericFailure, - "This shouldn't happen: a call trace has no functionJumpdest but has already jumped into a function" - )), - Either::B(create) => create, - }; - - // If there's no jump dest, we point to the constructor. - Ok(Either::A(CallstackEntryStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_constructor_start_source_reference(trace)?, - function_type: ContractFunctionType::Constructor.into(), - })) - } - - fn fails_right_after_call( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - call_subtrace_step_index: u32, - ) -> napi::Result { - let (bytecode, steps) = match &trace { - Either::A(call) => (&call.bytecode, &call.steps), - Either::B(create) => (&create.bytecode, &create.steps), - }; - - let bytecode = bytecode.as_ref().expect("JS code asserts"); - - let Some(Either4::A(last_step)) = steps.last() else { - return Ok(false); - }; - - let last_inst = bytecode.get_instruction(last_step.pc)?; - if last_inst.opcode != OpCode::REVERT { - return Ok(false); - } - - let call_opcode_step = steps.get(call_subtrace_step_index as usize - 1); - let call_opcode_step = match call_opcode_step { - Some(Either4::A(step)) => step, - _ => panic!("JS code asserts this is always an EvmStep"), - }; - let call_inst = bytecode.get_instruction(call_opcode_step.pc)?; - - // Calls are always made from within functions - let call_inst_location = call_inst - .location - .as_ref() - .expect("Expected call instruction location to be defined"); - - Self::is_last_location(trace, call_subtrace_step_index + 1, call_inst_location) - } - - fn is_call_failed_error( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - inst_index: u32, - call_instruction: &Instruction, - ) -> napi::Result { - let call_location = match &call_instruction.location { - Some(location) => location, - None => panic!("Expected call location to be defined"), - }; - - Self::is_last_location(trace, inst_index, call_location) - } - - fn is_last_location( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - from_step: u32, - location: &SourceLocation, - ) -> napi::Result { - let (bytecode, steps) = match &trace { - Either::A(call) => (&call.bytecode, &call.steps), - Either::B(create) => (&create.bytecode, &create.steps), - }; - - let bytecode = bytecode.as_ref().expect("JS code asserts"); - - for step in steps.iter().skip(from_step as usize) { - let step = match step { - Either4::A(step) => step, - _ => return Ok(false), - }; - - let step_inst = bytecode.get_instruction(step.pc)?; - - if let Some(step_inst_location) = &step_inst.location { - if **step_inst_location != *location { - return Ok(false); - } - } - } - - Ok(true) - } - - fn is_subtrace_error_propagated( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - call_subtrace_step_index: u32, - ) -> napi::Result { - let (return_data, exit, steps) = match &trace { - Either::A(call) => (&call.return_data, call.exit.kind(), &call.steps), - Either::B(create) => (&create.return_data, create.exit.kind(), &create.steps), - }; - - let (call_return_data, call_exit) = match steps.get(call_subtrace_step_index as usize) { - None | Some(Either4::A(_)) => panic!("Expected call to be a message trace"), - Some(Either4::B(precompile)) => (&precompile.return_data, precompile.exit.kind()), - Some(Either4::C(call)) => (&call.return_data, call.exit.kind()), - Some(Either4::D(create)) => (&create.return_data, create.exit.kind()), - }; - - if return_data.as_ref() != call_return_data.as_ref() { - return Ok(false); - } - - if exit == ExitCode::OUT_OF_GAS && call_exit == ExitCode::OUT_OF_GAS { - return Ok(true); - } - - // If the return data is not empty, and it's still the same, we assume it - // is being propagated - if return_data.len() > 0 { - return Ok(true); - } - - Self::fails_right_after_call(trace, call_subtrace_step_index) - } - - fn is_contract_call_run_out_of_gas_error( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - call_step_index: u32, - ) -> napi::Result { - let (steps, return_data, exit_code) = match &trace { - Either::A(call) => (&call.steps, &call.return_data, call.exit.kind()), - Either::B(create) => (&create.steps, &create.return_data, create.exit.kind()), - }; - - if return_data.len() > 0 { - return Ok(false); - } - - if exit_code != ExitCode::REVERT { - return Ok(false); - } - - let call_exit = match steps.get(call_step_index as usize) { - None | Some(Either4::A(_)) => panic!("Expected call to be a message trace"), - Some(Either4::B(precompile)) => precompile.exit.kind(), - Some(Either4::C(call)) => call.exit.kind(), - Some(Either4::D(create)) => create.exit.kind(), - }; - - if call_exit != ExitCode::OUT_OF_GAS { - return Ok(false); - } - - Self::fails_right_after_call(trace, call_step_index) - } - - fn is_proxy_error_propagated( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - call_subtrace_step_index: u32, - ) -> napi::Result { - let trace = match &trace { - Either::A(call) => call, - Either::B(_) => return Ok(false), - }; - - let bytecode = trace.bytecode.as_ref().expect("JS code asserts"); - - let call_step = match trace.steps.get(call_subtrace_step_index as usize - 1) { - Some(Either4::A(step)) => step, - _ => return Ok(false), - }; - - let call_inst = bytecode.get_instruction(call_step.pc)?; - - if call_inst.opcode != OpCode::DELEGATECALL { - return Ok(false); - } - - let subtrace = match trace.steps.get(call_subtrace_step_index as usize) { - None | Some(Either4::A(_) | Either4::B(_)) => return Ok(false), - Some(Either4::C(call)) => Either::A(call), - Some(Either4::D(create)) => Either::B(create), - }; - - let (subtrace_bytecode, subtrace_return_data) = match &subtrace { - Either::A(call) => (&call.bytecode, &call.return_data), - Either::B(create) => (&create.bytecode, &create.return_data), - }; - let subtrace_bytecode = match subtrace_bytecode { - Some(bytecode) => bytecode, - // If we can't recognize the implementation we'd better don't consider it as such - None => return Ok(false), - }; - - if subtrace_bytecode.contract.borrow().r#type == ContractKind::Library { - return Ok(false); - } - - if trace.return_data.as_ref() != subtrace_return_data.as_ref() { - return Ok(false); - } - - for step in trace - .steps - .iter() - .skip(call_subtrace_step_index as usize + 1) - { - let step = match step { - Either4::A(step) => step, - _ => return Ok(false), - }; - - let inst = bytecode.get_instruction(step.pc)?; - - // All the remaining locations should be valid, as they are part of the inline - // asm - if inst.location.is_none() { - return Ok(false); - } - - if matches!( - inst.jump_type, - JumpType::IntoFunction | JumpType::OutofFunction - ) { - return Ok(false); - } - } - - let last_step = match trace.steps.last() { - Some(Either4::A(step)) => step, - _ => panic!("Expected last step to be an EvmStep"), - }; - let last_inst = bytecode.get_instruction(last_step.pc)?; - - Ok(last_inst.opcode == OpCode::REVERT) - } - - fn other_execution_error_stacktrace( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - mut stacktrace: SolidityStackTrace, - ) -> napi::Result { - let other_execution_error_frame = OtherExecutionErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Self::get_last_source_reference(trace)?, - }; - - stacktrace.push(other_execution_error_frame.into()); - Ok(stacktrace) - } - - fn is_direct_library_call(trace: &CallMessageTrace) -> napi::Result { - let contract = &trace.bytecode.as_ref().expect("JS code asserts").contract; - let contract = contract.borrow(); - - Ok(trace.depth == 0 && contract.r#type == ContractKind::Library) - } - - fn get_direct_library_call_error_stack_trace( - trace: &CallMessageTrace, - ) -> napi::Result { - let contract = &trace.bytecode.as_ref().expect("JS code asserts").contract; - let contract = contract.borrow(); - - let func = contract - .get_function_from_selector(trace.calldata.get(..4).unwrap_or(&trace.calldata[..])); - - let source_reference = match func { - Some(func) => Self::get_function_start_source_reference(Either::A(trace), func)?, - None => Self::get_contract_start_without_function_source_reference(Either::A(trace))?, - }; - - Ok(vec![DirectLibraryCallErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - } - .into()]) - } - - fn get_function_start_source_reference( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - func: &ContractFunction, - ) -> napi::Result { - let bytecode = match &trace { - Either::A(create) => &create.bytecode, - Either::B(call) => &call.bytecode, - }; - - let contract = &bytecode.as_ref().expect("JS code asserts").contract; - let contract = contract.borrow(); - - let file = func.location.file(); - let file = file.borrow(); - - let location = &func.location; - - Ok(SourceReference { - source_name: file.source_name.clone(), - source_content: file.content.clone(), - contract: Some(contract.name.clone()), - - function: Some(func.name.clone()), - line: location.get_starting_line_number(), - range: [location.offset, location.offset + location.length].to_vec(), - }) - } - - fn is_missing_function_and_fallback_error( - trace: &CallMessageTrace, - called_function: Option<&ContractFunction>, - ) -> napi::Result { - // This error doesn't return data - if trace.return_data.len() > 0 { - return Ok(false); - } - - // the called function exists in the contract - if called_function.is_some() { - return Ok(false); - } - - let bytecode = trace - .bytecode - .as_ref() - .expect("The TS code type-checks this to always have bytecode"); - let contract = bytecode.contract.borrow(); - - // there's a receive function and no calldata - if trace.calldata.len() == 0 && contract.receive.is_some() { - return Ok(false); - } - - Ok(contract.fallback.is_none()) - } - - fn empty_calldata_and_no_receive(trace: &CallMessageTrace) -> napi::Result { - let bytecode = trace - .bytecode - .as_ref() - .expect("The TS code type-checks this to always have bytecode"); - let contract = bytecode.contract.borrow(); - - let version = - Version::parse(&bytecode.compiler_version).expect("Failed to parse SemVer version"); - - // this only makes sense when receive functions are available - if version < FIRST_SOLC_VERSION_RECEIVE_FUNCTION { - return Ok(false); - } - - Ok(trace.calldata.is_empty() && contract.receive.is_none()) - } - - fn is_fallback_not_payable_error( - trace: &CallMessageTrace, - called_function: Option<&ContractFunction>, - ) -> napi::Result { - // This error doesn't return data - if !trace.return_data.is_empty() { - return Ok(false); - } - - let (neg, value, _) = trace.value.get_u64(); - if neg || value == 0 { - return Ok(false); - } - - // the called function exists in the contract - if called_function.is_some() { - return Ok(false); - } - - let bytecode = trace.bytecode.as_ref().expect("JS code asserts"); - let contract = bytecode.contract.borrow(); - - match &contract.fallback { - Some(fallback) => Ok(fallback.is_payable != Some(true)), - None => Ok(false), - } - } - - fn get_fallback_start_source_reference( - trace: &CallMessageTrace, - ) -> napi::Result { - let bytecode = trace.bytecode.as_ref().expect("JS code asserts"); - let contract = bytecode.contract.borrow(); - - let func = match &contract.fallback { - Some(func) => func, - None => panic!("This shouldn't happen: trying to get fallback source reference from a contract without fallback"), - }; - - let location = &func.location; - let file = location.file(); - let file = file.borrow(); - - Ok(SourceReference { - source_name: file.source_name.clone(), - source_content: file.content.clone(), - contract: Some(contract.name.clone()), - function: Some(FALLBACK_FUNCTION_NAME.to_string()), - line: location.get_starting_line_number(), - range: [location.offset, location.offset + location.length].to_vec(), - }) - } - - fn is_constructor_not_payable_error(trace: &CreateMessageTrace) -> napi::Result { - // This error doesn't return data - if !trace.return_data.is_empty() { - return Ok(false); - } - - let bytecode = trace.bytecode.as_ref().expect("JS code asserts"); - let contract = bytecode.contract.borrow(); - - // This function is only matters with contracts that have constructors defined. - // The ones that don't are abstract contracts, or their constructor - // doesn't take any argument. - let constructor = match &contract.constructor { - Some(constructor) => constructor, - None => return Ok(false), - }; - - let (neg, value, _) = trace.value.get_u64(); - if neg || value == 0 { - return Ok(false); - } - - Ok(constructor.is_payable != Some(true)) - } - - /// Returns a source reference pointing to the constructor if it exists, or - /// to the contract otherwise. - fn get_constructor_start_source_reference( - trace: &CreateMessageTrace, - ) -> napi::Result { - let bytecode = trace.bytecode.as_ref().expect("JS code asserts"); - let contract = bytecode.contract.borrow(); - let contract_location = &contract.location; - - let line = match &contract.constructor { - Some(constructor) => constructor.location.get_starting_line_number(), - None => contract_location.get_starting_line_number(), - }; - - let file = contract_location.file(); - let file = file.borrow(); - - Ok(SourceReference { - source_name: file.source_name.clone(), - source_content: file.content.clone(), - contract: Some(contract.name.clone()), - function: Some(CONSTRUCTOR_FUNCTION_NAME.to_string()), - line, - range: [ - contract_location.offset, - contract_location.offset + contract_location.length, - ] - .to_vec(), - }) - } - - fn is_constructor_invalid_arguments_error(trace: &CreateMessageTrace) -> napi::Result { - if trace.return_data.len() > 0 { - return Ok(false); - } - - let bytecode = trace.bytecode.as_ref().expect("JS code asserts"); - let contract = bytecode.contract.borrow(); - - // This function is only matters with contracts that have constructors defined. - // The ones that don't are abstract contracts, or their constructor - // doesn't take any argument. - let Some(constructor) = &contract.constructor else { - return Ok(false); - }; - - let Ok(version) = Version::parse(&bytecode.compiler_version) else { - return Ok(false); - }; - if version < FIRST_SOLC_VERSION_CREATE_PARAMS_VALIDATION { - return Ok(false); - } - - let last_step = trace.steps.last(); - let Some(Either4::A(last_step)) = last_step else { - return Ok(false); - }; - - let last_inst = bytecode.get_instruction(last_step.pc)?; - - if last_inst.opcode != OpCode::REVERT || last_inst.location.is_some() { - return Ok(false); - } - - let mut has_read_deployment_code_size = false; - for step in &trace.steps { - let step = match step { - Either4::A(step) => step, - _ => return Ok(false), - }; - - let inst = bytecode.get_instruction(step.pc)?; - - if let Some(inst_location) = &inst.location { - if contract.location != *inst_location && constructor.location != *inst_location { - return Ok(false); - } - } - - if inst.opcode == OpCode::CODESIZE { - has_read_deployment_code_size = true; - } - } - - Ok(has_read_deployment_code_size) - } - - fn get_contract_start_without_function_source_reference( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result { - let bytecode = match &trace { - Either::A(create) => &create.bytecode, - Either::B(call) => &call.bytecode, - }; - - let contract = &bytecode.as_ref().expect("JS code asserts").contract; - - let contract = contract.borrow(); - - let location = &contract.location; - let file = location.file(); - let file = file.borrow(); - - Ok(SourceReference { - source_name: file.source_name.clone(), - source_content: file.content.clone(), - contract: Some(contract.name.clone()), - - function: None, - line: location.get_starting_line_number(), - range: [location.offset, location.offset + location.length].to_vec(), - }) - } - - fn is_function_not_payable_error( - trace: &CallMessageTrace, - called_function: &ContractFunction, - ) -> napi::Result { - // This error doesn't return data - if !trace.return_data.is_empty() { - return Ok(false); - } - - let (neg, value, _) = trace.value.get_u64(); - if neg || value == 0 { - return Ok(false); - } - - let bytecode = trace.bytecode.as_ref().expect("JS code asserts"); - let contract = bytecode.contract.borrow(); - - // Libraries don't have a nonpayable check - if contract.r#type == ContractKind::Library { - return Ok(false); - } - - Ok(called_function.is_payable != Some(true)) - } - - fn get_last_source_reference( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result> { - let (bytecode, steps) = match trace { - Either::A(create) => (&create.bytecode, &create.steps), - Either::B(call) => (&call.bytecode, &call.steps), - }; - - let bytecode = bytecode - .as_ref() - .expect("JS code only accepted variants that had bytecode defined"); - - for step in steps.iter().rev() { - let step = match step { - Either4::A(step) => step, - _ => continue, - }; - - let inst = bytecode.get_instruction(step.pc)?; - - let Some(location) = &inst.location else { - continue; - }; - - let source_reference = source_location_to_source_reference(bytecode, Some(location))?; - - if let Some(source_reference) = source_reference { - return Ok(Some(source_reference)); - } - } - - Ok(None) - } - - fn has_failed_inside_the_fallback_function(trace: &CallMessageTrace) -> napi::Result { - let contract = &trace.bytecode.as_ref().expect("JS code asserts").contract; - let contract = contract.borrow(); - - match &contract.fallback { - Some(fallback) => Self::has_failed_inside_function(trace, fallback), - None => Ok(false), - } - } - - fn has_failed_inside_the_receive_function(trace: &CallMessageTrace) -> napi::Result { - let contract = &trace.bytecode.as_ref().expect("JS code asserts").contract; - let contract = contract.borrow(); - - match &contract.receive { - Some(receive) => Self::has_failed_inside_function(trace, receive), - None => Ok(false), - } - } - - fn has_failed_inside_function( - trace: &CallMessageTrace, - func: &ContractFunction, - ) -> napi::Result { - let last_step = trace - .steps - .last() - .expect("There should at least be one step"); - - let last_step = match last_step { - Either4::A(step) => step, - _ => panic!("JS code asserted this is always an EvmStep"), - }; - - let last_instruction = trace - .bytecode - .as_ref() - .expect("The TS code type-checks this to always have bytecode") - .get_instruction(last_step.pc)?; - - Ok(match &last_instruction.location { - Some(last_instruction_location) => { - last_instruction.opcode == OpCode::REVERT - && func.location.contains(last_instruction_location) - } - _ => false, - }) - } - - fn instruction_within_function_to_revert_stack_trace_entry( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - inst: &Instruction, - ) -> napi::Result { - let bytecode = match &trace { - Either::A(create) => &create.bytecode, - Either::B(call) => &call.bytecode, - } - .as_ref() - .expect("JS code asserts"); - - let source_reference = - source_location_to_source_reference(bytecode, inst.location.as_deref())? - .expect("Expected source reference to be defined"); - - let return_data = match &trace { - Either::A(create) => &create.return_data, - Either::B(call) => &call.return_data, - }; - - Ok(RevertErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - is_invalid_opcode_error: inst.opcode == OpCode::INVALID, - return_data: return_data.clone(), - }) - } - - fn instruction_within_function_to_unmapped_solc_0_6_3_revert_error_stack_trace_entry( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - inst: &Instruction, - ) -> napi::Result { - let bytecode = match &trace { - Either::A(create) => &create.bytecode, - Either::B(call) => &call.bytecode, - } - .as_ref() - .expect("JS code asserts"); - - let source_reference = - source_location_to_source_reference(bytecode, inst.location.as_deref())?; - - Ok(UnmappedSolc063RevertErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - }) - } - - fn instruction_within_function_to_panic_stack_trace_entry( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - inst: &Instruction, - error_code: BigInt, - ) -> napi::Result { - let last_source_reference = Self::get_last_source_reference(trace)?; - - let bytecode = match &trace { - Either::A(create) => &create.bytecode, - Either::B(call) => &call.bytecode, - } - .as_ref() - .expect("JS code asserts"); - - let source_reference = - source_location_to_source_reference(bytecode, inst.location.as_deref())?; - - let source_reference = source_reference.or(last_source_reference); - - Ok(PanicErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - error_code, - }) - } - - fn instruction_within_function_to_custom_error_stack_trace_entry( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - inst: &Instruction, - message: String, - ) -> napi::Result { - let last_source_reference = Self::get_last_source_reference(trace)?; - let last_source_reference = - last_source_reference.expect("Expected source reference to be defined"); - - let bytecode = match &trace { - Either::A(create) => &create.bytecode, - Either::B(call) => &call.bytecode, - } - .as_ref() - .expect("JS code asserts"); - - let source_reference = - source_location_to_source_reference(bytecode, inst.location.as_deref())?; - - let source_reference = source_reference.unwrap_or(last_source_reference); - - Ok(CustomErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - message, - }) - } - - fn solidity_0_6_3_maybe_unmapped_revert( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result { - let (bytecode, steps) = match &trace { - Either::A(create) => (&create.bytecode, &create.steps), - Either::B(call) => (&call.bytecode, &call.steps), - }; - - let bytecode = bytecode - .as_ref() - .expect("JS code only accepted variants that had bytecode defined"); - - if steps.is_empty() { - return Ok(false); - } - - let last_step = steps.last(); - let last_step = match last_step { - Some(Either4::A(step)) => step, - _ => return Ok(false), - }; - - let last_instruction = bytecode.get_instruction(last_step.pc)?; - - let Ok(version) = Version::parse(&bytecode.compiler_version) else { - return Ok(false); - }; - let req = VersionReq::parse(&format!("^{FIRST_SOLC_VERSION_WITH_UNMAPPED_REVERTS}")) - .expect("valid semver"); - - Ok(req.matches(&version) && last_instruction.opcode == OpCode::REVERT) - } - - // Solidity 0.6.3 unmapped reverts special handling - // For more info: https://github.com/ethereum/solidity/issues/9006 - fn solidity_0_6_3_get_frame_for_unmapped_revert_before_function( - trace: &CallMessageTrace, - ) -> napi::Result> { - let bytecode = trace.bytecode.as_ref().expect("JS code asserts"); - let contract = bytecode.contract.borrow(); - - let revert_frame = - Self::solidity_0_6_3_get_frame_for_unmapped_revert_within_function(Either::A(trace))?; - - let revert_frame = match revert_frame { - None - | Some(UnmappedSolc063RevertErrorStackTraceEntry { - source_reference: None, - .. - }) => { - if contract.receive.is_none() || trace.calldata.len() > 0 { - // Failed within the fallback - if let Some(fallback) = &contract.fallback { - let location = &fallback.location; - let file = location.file(); - let file = file.borrow(); - - let revert_frame = UnmappedSolc063RevertErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Some(SourceReference { - contract: Some(contract.name.clone()), - function: Some(FALLBACK_FUNCTION_NAME.to_string()), - source_name: file.source_name.clone(), - source_content: file.content.clone(), - line: location.get_starting_line_number(), - range: [location.offset, location.offset + location.length] - .to_vec(), - }), - }; - - Some(Self::solidity_0_6_3_correct_line_number(revert_frame)) - } else { - None - } - } else { - let receive = contract - .receive - .as_ref() - .expect("None always hits branch above"); - - let location = &receive.location; - let file = location.file(); - let file = file.borrow(); - - let revert_frame = UnmappedSolc063RevertErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Some(SourceReference { - contract: Some(contract.name.clone()), - function: Some(RECEIVE_FUNCTION_NAME.to_string()), - source_name: file.source_name.clone(), - source_content: file.content.clone(), - line: location.get_starting_line_number(), - range: [location.offset, location.offset + location.length].to_vec(), - }), - }; - - Some(Self::solidity_0_6_3_correct_line_number(revert_frame)) - } - } - Some(revert_frame) => Some(revert_frame), - }; - - Ok(revert_frame) - } - - fn solidity_0_6_3_get_frame_for_unmapped_revert_within_function( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result> { - let (bytecode, steps) = match &trace { - Either::A(create) => (&create.bytecode, &create.steps), - Either::B(call) => (&call.bytecode, &call.steps), - }; - - let bytecode = bytecode - .as_ref() - .expect("JS code only accepted variants that had bytecode defined"); - - let contract = bytecode.contract.borrow(); - - // If we are within a function there's a last valid location. It may - // be the entire contract. - let prev_inst = Self::get_last_instruction_with_valid_location(trace)?; - let last_step = match steps.last() { - Some(Either4::A(step)) => step, - _ => panic!("JS code asserts this is always an EvmStep"), - }; - let next_inst_pc = last_step.pc + 1; - let has_next_inst = bytecode.has_instruction(next_inst_pc); - - if has_next_inst { - let next_inst = bytecode.get_instruction(next_inst_pc)?; - - let prev_loc = prev_inst.and_then(|i| i.location.as_deref()); - let next_loc = next_inst.location.as_deref(); - - let prev_func = prev_loc.and_then(SourceLocation::get_containing_function); - let next_func = next_loc.and_then(SourceLocation::get_containing_function); - - // This is probably a require. This means that we have the exact - // line, but the stack trace may be degraded (e.g. missing our - // synthetic call frames when failing in a modifier) so we still - // add this frame as UNMAPPED_SOLC_0_6_3_REVERT_ERROR - match (&prev_func, &next_loc, &prev_loc) { - (Some(_), Some(next_loc), Some(prev_loc)) if prev_loc == next_loc => { - return Ok(Some(Self::instruction_within_function_to_unmapped_solc_0_6_3_revert_error_stack_trace_entry( - trace, - next_inst, - - )?)); - } - _ => {} - } - - let revert_frame = if prev_func.is_some() && prev_inst.is_some() { - Some(Self::instruction_within_function_to_unmapped_solc_0_6_3_revert_error_stack_trace_entry( - trace, - prev_inst.as_ref().unwrap(), - - )?) - } else if next_func.is_some() { - Some(Self::instruction_within_function_to_unmapped_solc_0_6_3_revert_error_stack_trace_entry( - trace, - next_inst, - - )?) - } else { - None - }; - - return Ok(revert_frame.map(Self::solidity_0_6_3_correct_line_number)); - } - - if matches!(trace, Either::B(CreateMessageTrace { .. })) && prev_inst.is_some() { - // Solidity is smart enough to stop emitting extra instructions after - // an unconditional revert happens in a constructor. If this is the case - // we just return a special error. - - let mut constructor_revert_frame = Self::instruction_within_function_to_unmapped_solc_0_6_3_revert_error_stack_trace_entry( - trace, - prev_inst.as_ref().unwrap(), - - )?; - - // When the latest instruction is not within a function we need - // some default sourceReference to show to the user - if constructor_revert_frame.source_reference.is_none() { - let location = &contract.location; - let file = location.file(); - let file = file.borrow(); - - let mut default_source_reference = SourceReference { - function: Some(CONSTRUCTOR_FUNCTION_NAME.to_string()), - contract: Some(contract.name.clone()), - source_name: file.source_name.clone(), - source_content: file.content.clone(), - line: location.get_starting_line_number(), - range: [location.offset, location.offset + location.length].to_vec(), - }; - - if let Some(constructor) = &contract.constructor { - default_source_reference.line = constructor.location.get_starting_line_number(); - } - - constructor_revert_frame.source_reference = Some(default_source_reference); - } else { - constructor_revert_frame = - Self::solidity_0_6_3_correct_line_number(constructor_revert_frame); - } - - return Ok(Some(constructor_revert_frame)); - } - - if let Some(prev_inst) = prev_inst { - // We may as well just be in a function or modifier and just happen - // to be at the last instruction of the runtime bytecode. - // In this case we just return whatever the last mapped intruction - // points to. - let mut latest_instruction_revert_frame = Self::instruction_within_function_to_unmapped_solc_0_6_3_revert_error_stack_trace_entry( - trace, - prev_inst, - - )?; - - if latest_instruction_revert_frame.source_reference.is_some() { - latest_instruction_revert_frame = - Self::solidity_0_6_3_correct_line_number(latest_instruction_revert_frame); - } - return Ok(Some(latest_instruction_revert_frame)); - } - - Ok(None) - } - - fn solidity_0_6_3_correct_line_number( - mut revert_frame: UnmappedSolc063RevertErrorStackTraceEntry, - ) -> UnmappedSolc063RevertErrorStackTraceEntry { - let Some(source_reference) = &mut revert_frame.source_reference else { - return revert_frame; - }; - - let lines: Vec<_> = source_reference.source_content.split('\n').collect(); - - let current_line = lines[source_reference.line as usize - 1]; - if current_line.contains("require") || current_line.contains("revert") { - return revert_frame; - } - - let next_lines = &lines - .get(source_reference.line as usize..) - .unwrap_or_default(); - let first_non_empty_line = next_lines.iter().position(|l| !l.trim().is_empty()); - - let Some(first_non_empty_line) = first_non_empty_line else { - return revert_frame; - }; - - let next_line = next_lines[first_non_empty_line]; - if next_line.contains("require") || next_line.contains("revert") { - source_reference.line += 1 + first_non_empty_line as u32; - } - - revert_frame - } - - fn get_other_error_before_called_function_stack_trace_entry( - trace: &CallMessageTrace, - ) -> napi::Result { - let source_reference = - Self::get_contract_start_without_function_source_reference(Either::A(trace))?; - - Ok(OtherExecutionErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: Some(source_reference), - }) - } - - fn is_called_non_contract_account_error( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result { - // We could change this to checking that the last valid location maps to a call, - // but it's way more complex as we need to get the ast node from that - // location. - - let (bytecode, steps) = match &trace { - Either::A(create) => (&create.bytecode, &create.steps), - Either::B(call) => (&call.bytecode, &call.steps), - }; - - let bytecode = bytecode - .as_ref() - .expect("JS code only accepted variants that had bytecode defined"); - - let last_index = Self::get_last_instruction_with_valid_location_step_index(trace)?; - - let last_index = match last_index { - None | Some(0) => return Ok(false), - Some(last_index) => last_index as usize, - }; - - let last_step = match &steps[last_index] { - Either4::A(step) => step, - _ => panic!("We know this is an EVM step"), - }; - - let last_inst = bytecode.get_instruction(last_step.pc)?; - - if last_inst.opcode != OpCode::ISZERO { - return Ok(false); - } - - let prev_step = match &steps[last_index - 1] { - Either4::A(step) => step, - _ => panic!("We know this is an EVM step"), - }; - - let prev_inst = bytecode.get_instruction(prev_step.pc)?; - - Ok(prev_inst.opcode == OpCode::EXTCODESIZE) - } - - fn get_last_instruction_with_valid_location_step_index( - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result> { - let (bytecode, steps) = match &trace { - Either::A(create) => (&create.bytecode, &create.steps), - Either::B(call) => (&call.bytecode, &call.steps), - }; - - let bytecode = bytecode - .as_ref() - .expect("JS code only accepted variants that had bytecode defined"); - - for (i, step) in steps.iter().enumerate().rev() { - let step = match step { - Either4::A(step) => step, - _ => return Ok(None), - }; - - let inst = bytecode.get_instruction(step.pc)?; - - if inst.location.is_some() { - return Ok(Some(i as u32)); - } - } - - Ok(None) - } - - fn get_last_instruction_with_valid_location<'a>( - trace: Either<&'a CallMessageTrace, &'a CreateMessageTrace>, - ) -> napi::Result> { - let last_location_index = Self::get_last_instruction_with_valid_location_step_index(trace)?; - - let Some(last_location_index) = last_location_index else { - return Ok(None); - }; - - let (bytecode, steps) = match &trace { - Either::A(create) => (&create.bytecode, &create.steps), - Either::B(call) => (&call.bytecode, &call.steps), - }; - - let bytecode = bytecode - .as_ref() - .expect("JS code only accepted variants that had bytecode defined"); - - match &steps.get(last_location_index as usize) { - Some(Either4::A(step)) => { - let inst = bytecode.get_instruction(step.pc)?; - - Ok(Some(inst)) - } - _ => Ok(None), - } - } -} - -fn source_location_to_source_reference( - bytecode: &Bytecode, - location: Option<&SourceLocation>, -) -> napi::Result> { - let Some(location) = location else { - return Ok(None); - }; - let Some(func) = location.get_containing_function() else { - return Ok(None); - }; - - let func_name = match func.r#type { - ContractFunctionType::Constructor => CONSTRUCTOR_FUNCTION_NAME.to_string(), - ContractFunctionType::Fallback => FALLBACK_FUNCTION_NAME.to_string(), - ContractFunctionType::Receive => RECEIVE_FUNCTION_NAME.to_string(), - _ => func.name.clone(), - }; - - let func_location_file = func.location.file(); - let func_location_file = func_location_file.borrow(); - - Ok(Some(SourceReference { - function: Some(func_name.clone()), - contract: if func.r#type == ContractFunctionType::FreeFunction { - None - } else { - Some(bytecode.contract.borrow().name.clone()) - }, - source_name: func_location_file.source_name.clone(), - source_content: func_location_file.content.clone(), - line: location.get_starting_line_number(), - range: [location.offset, location.offset + location.length].to_vec(), - })) -} - -pub fn instruction_to_callstack_stack_trace_entry( - bytecode: &Bytecode, - inst: &Instruction, -) -> napi::Result> { - let contract = bytecode.contract.borrow(); - - // This means that a jump is made from within an internal solc function. - // These are normally made from yul code, so they don't map to any Solidity - // function - let inst_location = match &inst.location { - None => { - let location = &contract.location; - let file = location.file(); - let file = file.borrow(); - - return Ok(Either::B(InternalFunctionCallStackEntry { - type_: StackTraceEntryTypeConst, - pc: inst.pc, - source_reference: SourceReference { - source_name: file.source_name.clone(), - source_content: file.content.clone(), - contract: Some(contract.name.clone()), - function: None, - line: location.get_starting_line_number(), - range: [location.offset, location.offset + location.length].to_vec(), - }, - })); - } - Some(inst_location) => inst_location, - }; - - if let Some(func) = inst_location.get_containing_function() { - let source_reference = source_location_to_source_reference(bytecode, Some(inst_location))? - .expect("Expected source reference to be defined"); - - return Ok(Either::A(CallstackEntryStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference, - function_type: func.r#type.into(), - })); - }; - - let file = inst_location.file(); - let file = file.borrow(); - - Ok(Either::A(CallstackEntryStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: SourceReference { - function: None, - contract: Some(contract.name.clone()), - source_name: file.source_name.clone(), - source_content: file.content.clone(), - line: inst_location.get_starting_line_number(), - range: [ - inst_location.offset, - inst_location.offset + inst_location.length, - ] - .to_vec(), - }, - function_type: ContractFunctionType::Function.into(), - })) -} - -// Rewrite of `AbiHelpers.formatValues` from Hardhat -fn format_dyn_sol_value(val: &DynSolValue) -> String { - match val { - // print nested values as [value1, value2, ...] - DynSolValue::Array(items) - | DynSolValue::Tuple(items) - | DynSolValue::FixedArray(items) - | DynSolValue::CustomStruct { tuple: items, .. } => { - let mut result = String::from("["); - for (i, val) in items.iter().enumerate() { - if i > 0 { - result.push_str(", "); - } - result.push_str(&format_dyn_sol_value(val)); - } - - result.push(']'); - result - } - // surround string values with quotes - DynSolValue::String(s) => format!("\"{s}\""), - - DynSolValue::Address(address) => format!("\"{address}\""), - DynSolValue::Bytes(bytes) => format!("\"{}\"", hex::encode_prefixed(bytes)), - DynSolValue::FixedBytes(word, size) => { - format!("\"{}\"", hex::encode_prefixed(&word.0.as_slice()[..*size])) - } - DynSolValue::Bool(b) => b.to_string(), - DynSolValue::Function(_) => "".to_string(), - DynSolValue::Int(int, _bits) => int.to_string(), - DynSolValue::Uint(uint, _bits) => uint.to_string(), - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_sol_value_to_string() { - assert_eq!( - format_dyn_sol_value(&DynSolValue::String("hello".to_string())), - "\"hello\"" - ); - // Uniform, 0-prefixed hex strings - assert_eq!( - format_dyn_sol_value(&DynSolValue::Address([0u8; 20].into())), - format!(r#""0x{}""#, "0".repeat(2 * 20)) - ); - assert_eq!( - format_dyn_sol_value(&DynSolValue::Bytes(vec![0u8; 32])), - format!(r#""0x{}""#, "0".repeat(2 * 32)) - ); - assert_eq!( - format_dyn_sol_value(&DynSolValue::FixedBytes([0u8; 32].into(), 10)), - format!(r#""0x{}""#, "0".repeat(2 * 10)) - ); - assert_eq!( - format_dyn_sol_value(&DynSolValue::FixedBytes([0u8; 32].into(), 32)), - format!(r#""0x{}""#, "0".repeat(2 * 32)) - ); - } -} diff --git a/crates/edr_napi/src/trace/exit.rs b/crates/edr_napi/src/trace/exit.rs index 2a7e414f3..280189044 100644 --- a/crates/edr_napi/src/trace/exit.rs +++ b/crates/edr_napi/src/trace/exit.rs @@ -51,9 +51,9 @@ impl fmt::Display for ExitCode { } #[allow(clippy::fallible_impl_from)] // naively ported for now -impl From for ExitCode { - fn from(code: edr_solidity::message_trace::ExitCode) -> Self { - use edr_solidity::message_trace::ExitCode; +impl From> for ExitCode { + fn from(code: edr_solidity::exit_code::ExitCode) -> Self { + use edr_solidity::exit_code::ExitCode; match code { ExitCode::Success => Self::SUCCESS, diff --git a/crates/edr_napi/src/trace/mapped_inlined_internal_functions_heuristics.rs b/crates/edr_napi/src/trace/mapped_inlined_internal_functions_heuristics.rs deleted file mode 100644 index 3dde1ac7c..000000000 --- a/crates/edr_napi/src/trace/mapped_inlined_internal_functions_heuristics.rs +++ /dev/null @@ -1,180 +0,0 @@ -//! This file includes Solidity tracing heuristics for solc starting with -//! version 0.6.9. -//! -//! This solc version introduced a significant change to how sourcemaps are -//! handled for inline yul/internal functions. These were mapped to the -//! unmapped/-1 file before, which lead to many unmapped reverts. Now, they are -//! mapped to the part of the Solidity source that lead to their inlining. -//! -//! This change is a very positive change, as errors would point to the correct -//! line by default. The only problem is that we used to rely very heavily on -//! unmapped reverts to decide when our error detection heuristics were to be -//! run. In fact, these heuristics were first introduced because of unmapped -//! reverts. -//! -//! Instead of synthetically completing stack traces when unmapped reverts -//! occur, we now start from complete stack traces and adjust them if we can -//! provide more meaningful errors. - -use edr_eth::bytecode::opcode::OpCode; -use napi::{ - bindgen_prelude::{Either24, Either4}, - Either, -}; -use semver::Version; - -use super::{ - message_trace::{CallMessageTrace, CreateMessageTrace, EvmStep}, - solidity_stack_trace::{ - InvalidParamsErrorStackTraceEntry, NonContractAccountCalledErrorStackTraceEntry, - RevertErrorStackTraceEntry, SolidityStackTrace, StackTraceEntryTypeConst, - }, -}; - -const FIRST_SOLC_VERSION_WITH_MAPPED_SMALL_INTERNAL_FUNCTIONS: Version = Version::new(0, 6, 9); - -pub fn stack_trace_may_require_adjustments( - stacktrace: &SolidityStackTrace, - decoded_trace: Either<&CallMessageTrace, &CreateMessageTrace>, -) -> bool { - let bytecode = match &decoded_trace { - Either::A(create) => &create.bytecode, - Either::B(call) => &call.bytecode, - }; - let bytecode = bytecode.as_ref().expect("JS code asserts"); - - let Some(last_frame) = stacktrace.last() else { - return false; - }; - - if let Either24::E(last_frame @ RevertErrorStackTraceEntry { .. }) = last_frame { - return !last_frame.is_invalid_opcode_error - && last_frame.return_data.is_empty() - && Version::parse(&bytecode.compiler_version) - .map(|version| version >= FIRST_SOLC_VERSION_WITH_MAPPED_SMALL_INTERNAL_FUNCTIONS) - .unwrap_or(false); - } - - false -} - -pub fn adjust_stack_trace( - mut stacktrace: SolidityStackTrace, - decoded_trace: Either<&CallMessageTrace, &CreateMessageTrace>, -) -> napi::Result { - let Some(Either24::E(revert @ RevertErrorStackTraceEntry { .. })) = stacktrace.last() else { - unreachable!("JS code asserts that; it's only used immediately after we check with `stack_trace_may_require_adjustments` that the last frame is a revert frame"); - }; - - // Replace the last revert frame with an adjusted frame if needed - if is_non_contract_account_called_error(decoded_trace)? { - let last_revert_frame_source_reference = revert.source_reference.clone(); - stacktrace.pop(); - stacktrace.push( - NonContractAccountCalledErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: last_revert_frame_source_reference, - } - .into(), - ); - return Ok(stacktrace); - } - - if is_constructor_invalid_params_error(decoded_trace)? { - let last_revert_frame_source_reference = revert.source_reference.clone(); - stacktrace.pop(); - stacktrace.push( - InvalidParamsErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: last_revert_frame_source_reference, - } - .into(), - ); - return Ok(stacktrace); - } - - if is_call_invalid_params_error(decoded_trace)? { - let last_revert_frame_source_reference = revert.source_reference.clone(); - stacktrace.pop(); - stacktrace.push( - InvalidParamsErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: last_revert_frame_source_reference, - } - .into(), - ); - - return Ok(stacktrace); - } - - Ok(stacktrace) -} - -fn is_non_contract_account_called_error( - decoded_trace: Either<&CallMessageTrace, &CreateMessageTrace>, -) -> napi::Result { - match_opcodes( - decoded_trace, - -9, - &[ - OpCode::EXTCODESIZE, - OpCode::ISZERO, - OpCode::DUP1, - OpCode::ISZERO, - ], - ) -} - -fn is_constructor_invalid_params_error( - decoded_trace: Either<&CallMessageTrace, &CreateMessageTrace>, -) -> napi::Result { - Ok(match_opcodes(decoded_trace, -20, &[OpCode::CODESIZE])? - && match_opcodes(decoded_trace, -15, &[OpCode::CODECOPY])? - && match_opcodes(decoded_trace, -7, &[OpCode::LT, OpCode::ISZERO])?) -} - -fn is_call_invalid_params_error( - decoded_trace: Either<&CallMessageTrace, &CreateMessageTrace>, -) -> napi::Result { - Ok(match_opcodes(decoded_trace, -11, &[OpCode::CALLDATASIZE])? - && match_opcodes(decoded_trace, -7, &[OpCode::LT, OpCode::ISZERO])?) -} - -fn match_opcodes( - decoded_trace: Either<&CallMessageTrace, &CreateMessageTrace>, - first_step_index: i32, - opcodes: &[OpCode], -) -> napi::Result { - let (bytecode, steps) = match &decoded_trace { - Either::A(call) => (&call.bytecode, &call.steps), - Either::B(create) => (&create.bytecode, &create.steps), - }; - let bytecode = bytecode.as_ref().expect("JS code asserts"); - - // If the index is negative, we start from the end of the trace, - // just like in the original JS code - let mut index = match first_step_index { - 0.. => first_step_index as usize, - ..=-1 if first_step_index.abs() < steps.len() as i32 => { - (steps.len() as i32 + first_step_index) as usize - } - // Out of bounds - _ => return Ok(false), - }; - - for opcode in opcodes { - let Some(Either4::A(EvmStep { pc })) = steps.get(index) else { - return Ok(false); - }; - - let instruction = bytecode.get_instruction(*pc)?; - - if instruction.opcode != *opcode { - return Ok(false); - } - - index += 1; - } - - Ok(true) -} diff --git a/crates/edr_napi/src/trace/message_trace.rs b/crates/edr_napi/src/trace/message_trace.rs deleted file mode 100644 index 45616ea55..000000000 --- a/crates/edr_napi/src/trace/message_trace.rs +++ /dev/null @@ -1,179 +0,0 @@ -//! Bridging type for the existing `MessageTrace` interface in Hardhat. - -use napi::{ - bindgen_prelude::{BigInt, ClassInstance, Either3, Either4, Uint8Array, Undefined}, - Either, Env, -}; -use napi_derive::napi; - -use super::{exit::Exit, model::BytecodeWrapper}; - -#[napi(object)] -pub struct EvmStep { - pub pc: u32, -} - -#[napi(object)] -pub struct PrecompileMessageTrace { - // `BaseMessageTrace` - pub value: BigInt, - pub return_data: Uint8Array, - pub exit: ClassInstance, - pub gas_used: BigInt, - pub depth: u32, - // `PrecompileMessageTrace` - pub precompile: u32, - pub calldata: Uint8Array, -} - -// NOTE: Because of the hack below for `deployed_contract`, now the -// `CallMessageTrace` is a strict superset of `CreateMessageTrace`, so we need -// to take care to keep the order consistent from most-specific to -// least-specific in the `Either{3,4}` type when converting to or from N-API. -#[napi(object)] -pub struct CreateMessageTrace { - // `BaseMessageTrace` - pub value: BigInt, - pub return_data: Uint8Array, - pub exit: ClassInstance, - pub gas_used: BigInt, - pub depth: u32, - // `BaseEvmMessageTrace` - pub code: Uint8Array, - pub steps: Vec>, - /// Reference to the resolved `Bytecode` EDR data. - /// Only used on the JS side by the `VmTraceDecoder` class. - pub bytecode: Option>, - pub number_of_subtraces: u32, - // `CreateMessageTrace` - // HACK: It seems that `Either` means exactly what we - // want (a required property but can be explicitly `undefined`) but internally - // the napi-rs treats an encountered `Undefined` like a missing property - // and it throws a validation error. While not 100% backwards compatible, we - // work around using an optional type. - // See https://github.com/napi-rs/napi-rs/issues/1986 for context on the PR - // that introduced this behavior. - pub deployed_contract: Option>, -} - -#[napi(object)] -pub struct CallMessageTrace { - // `BaseMessageTrace` - pub value: BigInt, - pub return_data: Uint8Array, - pub exit: ClassInstance, - pub gas_used: BigInt, - pub depth: u32, - // `BaseEvmMessageTrace` - pub code: Uint8Array, - pub steps: Vec>, - /// Reference to the resolved `Bytecode` EDR data. - /// Only used on the JS side by the `VmTraceDecoder` class. - pub bytecode: Option>, - pub number_of_subtraces: u32, - // `CallMessageTrace` - pub calldata: Uint8Array, - pub address: Uint8Array, - pub code_address: Uint8Array, -} - -/// Converts [`edr_solidity::message_trace::MessageTraceStep`] to the N-API -/// representation. -/// -/// # Panics -/// This function will panic if the value is mutably borrowed. -pub fn message_trace_step_to_napi( - value: edr_solidity::message_trace::MessageTraceStep, - env: Env, -) -> napi::Result> { - Ok(match value { - edr_solidity::message_trace::MessageTraceStep::Evm(step) => { - Either4::A(EvmStep { pc: step.pc as u32 }) - } - edr_solidity::message_trace::MessageTraceStep::Message(msg) => { - // Immediately drop the borrow lock to err on the safe side as we - // may be recursing. - let owned = msg.borrow().clone(); - match message_trace_to_napi(owned, env)? { - Either3::A(precompile) => Either4::B(precompile), - Either3::B(call) => Either4::C(call), - Either3::C(create) => Either4::D(create), - } - } - }) -} - -/// Converts the Rust representation of a `MessageTrace` to the N-API -/// representation. -pub fn message_trace_to_napi( - value: edr_solidity::message_trace::MessageTrace, - env: Env, -) -> napi::Result> { - Ok(match value { - edr_solidity::message_trace::MessageTrace::Precompile(precompile) => { - Either3::A(PrecompileMessageTrace { - value: BigInt { - sign_bit: false, - words: precompile.base.value.as_limbs().to_vec(), - }, - return_data: Uint8Array::from(precompile.base.return_data.as_ref()), - exit: Exit(precompile.base.exit.into()).into_instance(env)?, - gas_used: BigInt::from(precompile.base.gas_used), - depth: precompile.base.depth as u32, - - precompile: precompile.precompile, - calldata: Uint8Array::from(precompile.calldata.as_ref()), - }) - } - edr_solidity::message_trace::MessageTrace::Call(call) => Either3::B(CallMessageTrace { - value: BigInt { - sign_bit: false, - words: call.base.base.value.as_limbs().to_vec(), - }, - return_data: Uint8Array::from(call.base.base.return_data.as_ref()), - exit: Exit(call.base.base.exit.into()).into_instance(env)?, - gas_used: BigInt::from(call.base.base.gas_used), - depth: call.base.base.depth as u32, - code: Uint8Array::from(call.base.code.as_ref()), - steps: call - .base - .steps - .into_iter() - .map(|step| message_trace_step_to_napi(step, env)) - .collect::>>()?, - // NOTE: We specifically use None as that will be later filled on the JS side - bytecode: None, - number_of_subtraces: call.base.number_of_subtraces, - - address: Uint8Array::from(call.address.as_slice()), - calldata: Uint8Array::from(call.calldata.as_ref()), - code_address: Uint8Array::from(call.code_address.as_slice()), - }), - edr_solidity::message_trace::MessageTrace::Create(create) => { - Either3::C(CreateMessageTrace { - value: BigInt { - sign_bit: false, - words: create.base.base.value.as_limbs().to_vec(), - }, - return_data: Uint8Array::from(create.base.base.return_data.as_ref()), - exit: Exit(create.base.base.exit.into()).into_instance(env)?, - gas_used: BigInt::from(create.base.base.gas_used), - depth: create.base.base.depth as u32, - code: Uint8Array::from(create.base.code.as_ref()), - steps: create - .base - .steps - .into_iter() - .map(|step| message_trace_step_to_napi(step, env)) - .collect::>>()?, - // NOTE: We specifically use None as that will be later filled on the JS side - bytecode: None, - - number_of_subtraces: create.base.number_of_subtraces, - deployed_contract: create - .deployed_contract - .map(|contract| Either::A(Uint8Array::from(contract.as_ref()))), - }) - } - }) -} diff --git a/crates/edr_napi/src/trace/model.rs b/crates/edr_napi/src/trace/model.rs index 8072d68a7..b1495a48c 100644 --- a/crates/edr_napi/src/trace/model.rs +++ b/crates/edr_napi/src/trace/model.rs @@ -1,6 +1,6 @@ use std::rc::Rc; -use edr_solidity::build_model::Bytecode; +use edr_solidity::build_model::ContractMetadata; use napi_derive::napi; use serde::Serialize; @@ -9,20 +9,20 @@ use serde::Serialize; // NOTE: Needed, because we store the resolved `Bytecode` in the MessageTrace // JS plain objects and those need a dedicated (class) type. #[napi] -pub struct BytecodeWrapper(pub(crate) Rc); +pub struct BytecodeWrapper(pub(crate) Rc); impl BytecodeWrapper { - pub fn new(bytecode: Rc) -> Self { + pub fn new(bytecode: Rc) -> Self { Self(bytecode) } - pub fn inner(&self) -> &Rc { + pub fn inner(&self) -> &Rc { &self.0 } } impl std::ops::Deref for BytecodeWrapper { - type Target = Bytecode; + type Target = ContractMetadata; fn deref(&self) -> &Self::Target { &self.0 diff --git a/crates/edr_napi/src/trace/solidity_stack_trace.rs b/crates/edr_napi/src/trace/solidity_stack_trace.rs index 09d6ce750..679763a8e 100644 --- a/crates/edr_napi/src/trace/solidity_stack_trace.rs +++ b/crates/edr_napi/src/trace/solidity_stack_trace.rs @@ -7,6 +7,7 @@ use napi_derive::napi; use serde::{Serialize, Serializer}; use super::model::ContractFunctionType; +use crate::{cast::TryCast, trace::u256_to_bigint}; #[napi] #[repr(u8)] @@ -76,6 +77,20 @@ pub struct SourceReference { pub range: Vec, } +impl From for SourceReference { + fn from(value: edr_solidity::solidity_stack_trace::SourceReference) -> Self { + let (range_start, range_end) = value.range; + Self { + source_name: value.source_name, + source_content: value.source_content, + contract: value.contract, + function: value.function, + line: value.line, + range: vec![range_start, range_end], + } + } +} + /// A [`StackTraceEntryType`] constant that is convertible to/from a /// `napi_value`. /// @@ -112,16 +127,6 @@ impl ToNapiValue for StackTraceEntryTypeConst } } -impl StackTraceEntryTypeConst { - #[allow(clippy::unused_self)] // less verbose than ::as_value() - const fn as_value(&self) -> StackTraceEntryType { - match StackTraceEntryType::from_repr(ENTRY_TYPE) { - Some(val) => val, - None => panic!("Invalid StackTraceEntryType value"), - } - } -} - impl Serialize for StackTraceEntryTypeConst { fn serialize(&self, serializer: S) -> Result where @@ -598,76 +603,215 @@ pub type SolidityStackTraceEntry = Either24< ContractCallRunOutOfGasError, >; +impl TryCast for edr_solidity::solidity_stack_trace::StackTraceEntry { + type Error = napi::Error; + + fn try_cast(self) -> Result { + use edr_solidity::solidity_stack_trace::StackTraceEntry; + let result = match self { + StackTraceEntry::CallstackEntry { + source_reference, + function_type, + } => CallstackEntryStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.into(), + function_type: function_type.into(), + } + .into(), + StackTraceEntry::UnrecognizedCreateCallstackEntry => { + UnrecognizedCreateCallstackEntryStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: None, + } + .into() + } + StackTraceEntry::UnrecognizedContractCallstackEntry { address } => { + UnrecognizedContractCallstackEntryStackTraceEntry { + type_: StackTraceEntryTypeConst, + address: Uint8Array::from(address.as_slice()), + source_reference: None, + } + .into() + } + StackTraceEntry::PrecompileError { precompile } => PrecompileErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + precompile, + source_reference: None, + } + .into(), + StackTraceEntry::RevertError { + return_data, + source_reference, + is_invalid_opcode_error, + } => RevertErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + return_data: return_data.into(), + source_reference: source_reference.into(), + is_invalid_opcode_error, + } + .into(), + StackTraceEntry::PanicError { + error_code, + source_reference, + } => PanicErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + error_code: u256_to_bigint(&error_code), + source_reference: source_reference.map(std::convert::Into::into), + } + .into(), + StackTraceEntry::CustomError { + message, + source_reference, + } => CustomErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + message, + source_reference: source_reference.into(), + } + .into(), + StackTraceEntry::FunctionNotPayableError { + value, + source_reference, + } => FunctionNotPayableErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + value: u256_to_bigint(&value), + source_reference: source_reference.into(), + } + .into(), + StackTraceEntry::InvalidParamsError { source_reference } => { + InvalidParamsErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.into(), + } + .into() + } + StackTraceEntry::FallbackNotPayableError { + value, + source_reference, + } => FallbackNotPayableErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + value: u256_to_bigint(&value), + source_reference: source_reference.into(), + } + .into(), + StackTraceEntry::FallbackNotPayableAndNoReceiveError { + value, + source_reference, + } => FallbackNotPayableAndNoReceiveErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + value: u256_to_bigint(&value), + source_reference: source_reference.into(), + } + .into(), + StackTraceEntry::UnrecognizedFunctionWithoutFallbackError { source_reference } => { + UnrecognizedFunctionWithoutFallbackErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.into(), + } + .into() + } + StackTraceEntry::MissingFallbackOrReceiveError { source_reference } => { + MissingFallbackOrReceiveErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.into(), + } + .into() + } + StackTraceEntry::ReturndataSizeError { source_reference } => { + ReturndataSizeErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.into(), + } + .into() + } + StackTraceEntry::NoncontractAccountCalledError { source_reference } => { + NonContractAccountCalledErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.into(), + } + .into() + } + StackTraceEntry::CallFailedError { source_reference } => { + CallFailedErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.into(), + } + .into() + } + StackTraceEntry::DirectLibraryCallError { source_reference } => { + DirectLibraryCallErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.into(), + } + .into() + } + StackTraceEntry::UnrecognizedCreateError { + return_data, + is_invalid_opcode_error, + } => UnrecognizedCreateErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + return_data: return_data.into(), + is_invalid_opcode_error, + source_reference: None, + } + .into(), + StackTraceEntry::UnrecognizedContractError { + address, + return_data, + is_invalid_opcode_error, + } => UnrecognizedContractErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + address: Uint8Array::from(address.as_slice()), + return_data: return_data.into(), + is_invalid_opcode_error, + source_reference: None, + } + .into(), + StackTraceEntry::OtherExecutionError { source_reference } => { + OtherExecutionErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.map(std::convert::Into::into), + } + .into() + } + StackTraceEntry::UnmappedSolc0_6_3RevertError { source_reference } => { + UnmappedSolc063RevertErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.map(std::convert::Into::into), + } + .into() + } + StackTraceEntry::ContractTooLargeError { source_reference } => { + ContractTooLargeErrorStackTraceEntry { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.map(std::convert::Into::into), + } + .into() + } + StackTraceEntry::InternalFunctionCallstackEntry { + pc, + source_reference, + } => InternalFunctionCallStackEntry { + type_: StackTraceEntryTypeConst, + pc, + source_reference: source_reference.into(), + } + .into(), + StackTraceEntry::ContractCallRunOutOfGasError { source_reference } => { + ContractCallRunOutOfGasError { + type_: StackTraceEntryTypeConst, + source_reference: source_reference.map(std::convert::Into::into), + } + .into() + } + }; + Ok(result) + } +} + #[allow(dead_code)] // Same as above, but for the `SolidityStackTrace` type. pub type SolidityStackTrace = Vec; -pub trait SolidityStackTraceEntryExt { - fn type_(&self) -> StackTraceEntryType; - fn source_reference(&self) -> Option<&SourceReference>; -} - -impl SolidityStackTraceEntryExt for SolidityStackTraceEntry { - fn type_(&self) -> StackTraceEntryType { - match self { - Either24::A(entry) => entry.type_.as_value(), - Either24::B(entry) => entry.type_.as_value(), - Either24::C(entry) => entry.type_.as_value(), - Either24::D(entry) => entry.type_.as_value(), - Either24::E(entry) => entry.type_.as_value(), - Either24::F(entry) => entry.type_.as_value(), - Either24::G(entry) => entry.type_.as_value(), - Either24::H(entry) => entry.type_.as_value(), - Either24::I(entry) => entry.type_.as_value(), - Either24::J(entry) => entry.type_.as_value(), - Either24::K(entry) => entry.type_.as_value(), - Either24::L(entry) => entry.type_.as_value(), - Either24::M(entry) => entry.type_.as_value(), - Either24::N(entry) => entry.type_.as_value(), - Either24::O(entry) => entry.type_.as_value(), - Either24::P(entry) => entry.type_.as_value(), - Either24::Q(entry) => entry.type_.as_value(), - Either24::R(entry) => entry.type_.as_value(), - Either24::S(entry) => entry.type_.as_value(), - Either24::T(entry) => entry.type_.as_value(), - Either24::U(entry) => entry.type_.as_value(), - Either24::V(entry) => entry.type_.as_value(), - Either24::W(entry) => entry.type_.as_value(), - Either24::X(entry) => entry.type_.as_value(), - } - } - - #[allow(clippy::unnecessary_lazy_evaluations)] // guards against potential variant reordering - fn source_reference(&self) -> Option<&SourceReference> { - match self { - Either24::A(entry) => Some(&entry.source_reference), - Either24::B(entry) => entry.source_reference.and_then(|_: ()| None), - Either24::C(entry) => entry.source_reference.and_then(|_: ()| None), - Either24::D(entry) => entry.source_reference.and_then(|_: ()| None), - Either24::E(entry) => Some(&entry.source_reference), - Either24::F(entry) => entry.source_reference.as_ref(), - Either24::G(entry) => Some(&entry.source_reference), - Either24::H(entry) => Some(&entry.source_reference), - Either24::I(entry) => Some(&entry.source_reference), - Either24::J(entry) => Some(&entry.source_reference), - Either24::K(entry) => Some(&entry.source_reference), - Either24::L(entry) => Some(&entry.source_reference), - Either24::M(entry) => Some(&entry.source_reference), - Either24::N(entry) => Some(&entry.source_reference), - Either24::O(entry) => Some(&entry.source_reference), - Either24::P(entry) => Some(&entry.source_reference), - Either24::Q(entry) => Some(&entry.source_reference), - Either24::R(entry) => entry.source_reference.and_then(|_: ()| None), - Either24::S(entry) => entry.source_reference.and_then(|_: ()| None), - Either24::T(entry) => entry.source_reference.as_ref(), - Either24::U(entry) => entry.source_reference.as_ref(), - Either24::V(entry) => entry.source_reference.as_ref(), - Either24::W(entry) => Some(&entry.source_reference), - Either24::X(entry) => entry.source_reference.as_ref(), - } - } -} - const _: () = { const fn assert_to_from_napi_value() {} assert_to_from_napi_value::(); diff --git a/crates/edr_napi/src/trace/solidity_tracer.rs b/crates/edr_napi/src/trace/solidity_tracer.rs deleted file mode 100644 index 014ff58d0..000000000 --- a/crates/edr_napi/src/trace/solidity_tracer.rs +++ /dev/null @@ -1,315 +0,0 @@ -use edr_eth::bytecode::opcode::OpCode; -use edr_solidity::build_model::{Instruction, JumpType}; -use napi::{ - bindgen_prelude::{Either3, Either4}, - Either, -}; -use napi_derive::napi; - -use super::{ - error_inferrer::{ - instruction_to_callstack_stack_trace_entry, ErrorInferrer, SubmessageDataRef, - }, - mapped_inlined_internal_functions_heuristics::{ - adjust_stack_trace, stack_trace_may_require_adjustments, - }, - message_trace::{CallMessageTrace, CreateMessageTrace, EvmStep, PrecompileMessageTrace}, - solidity_stack_trace::{PrecompileErrorStackTraceEntry, SolidityStackTrace}, -}; -use crate::trace::{ - exit::ExitCode, - solidity_stack_trace::{ - ContractTooLargeErrorStackTraceEntry, SolidityStackTraceEntry, StackTraceEntryTypeConst, - UnrecognizedContractCallstackEntryStackTraceEntry, - UnrecognizedContractErrorStackTraceEntry, UnrecognizedCreateCallstackEntryStackTraceEntry, - UnrecognizedCreateErrorStackTraceEntry, - }, -}; - -#[napi(constructor)] -pub struct SolidityTracer; - -#[allow(clippy::unused_self)] // we allow this for convenience for now -#[napi] -impl SolidityTracer { - #[napi(catch_unwind)] - pub fn get_stack_trace( - &self, - trace: Either3, - ) -> napi::Result { - let trace = match &trace { - Either3::A(precompile) => Either3::A(precompile), - Either3::B(call) => Either3::B(call), - Either3::C(create) => Either3::C(create), - }; - - self.get_stack_trace_inner(trace) - } - - pub fn get_stack_trace_inner( - &self, - trace: Either3<&PrecompileMessageTrace, &CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result { - let exit = match &trace { - Either3::A(precompile) => &precompile.exit, - Either3::B(call) => &call.exit, - Either3::C(create) => &create.exit, - }; - - if !exit.is_error() { - return Ok(vec![]); - } - - match trace { - Either3::A(precompile) => Ok(self.get_precompile_message_stack_trace(precompile)?), - Either3::B(call) if call.bytecode.is_some() => { - Ok(self.get_call_message_stack_trace(call)?) - } - Either3::C(create) if create.bytecode.is_some() => { - Ok(self.get_create_message_stack_trace(create)?) - } - // No bytecode is present - Either3::B(call) => Ok(self.get_unrecognized_message_stack_trace(Either::A(call))?), - Either3::C(create) => Ok(self.get_unrecognized_message_stack_trace(Either::B(create))?), - } - } - - fn get_last_subtrace<'a>( - &self, - trace: Either<&'a CallMessageTrace, &'a CreateMessageTrace>, - ) -> Option> - { - let (number_of_subtraces, steps) = match trace { - Either::A(create) => (create.number_of_subtraces, &create.steps), - Either::B(call) => (call.number_of_subtraces, &call.steps), - }; - - if number_of_subtraces == 0 { - return None; - } - - steps.iter().rev().find_map(|step| match step { - Either4::A(EvmStep { .. }) => None, - Either4::B(precompile) => Some(Either3::A(precompile)), - Either4::C(call) => Some(Either3::B(call)), - Either4::D(create) => Some(Either3::C(create)), - }) - } - - fn get_precompile_message_stack_trace( - &self, - trace: &PrecompileMessageTrace, - ) -> napi::Result { - Ok(vec![PrecompileErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - precompile: trace.precompile, - source_reference: None, - } - .into()]) - } - - fn get_create_message_stack_trace( - &self, - trace: &CreateMessageTrace, - ) -> napi::Result { - let inferred_error = ErrorInferrer::infer_before_tracing_create_message(trace)?; - - if let Some(inferred_error) = inferred_error { - return Ok(inferred_error); - } - - self.trace_evm_execution(Either::B(trace)) - } - - fn get_call_message_stack_trace( - &self, - trace: &CallMessageTrace, - ) -> napi::Result { - let inferred_error = ErrorInferrer::infer_before_tracing_call_message(trace)?; - - if let Some(inferred_error) = inferred_error { - return Ok(inferred_error); - } - - self.trace_evm_execution(Either::A(trace)) - } - - fn get_unrecognized_message_stack_trace( - &self, - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result { - let (trace_exit_kind, trace_return_data) = match &trace { - Either::A(call) => (call.exit.kind(), &call.return_data), - Either::B(create) => (create.exit.kind(), &create.return_data), - }; - - let subtrace = self.get_last_subtrace(trace); - - if let Some(subtrace) = subtrace { - let (is_error, return_data) = match subtrace { - Either3::A(precompile) => { - (precompile.exit.is_error(), precompile.return_data.clone()) - } - Either3::B(call) => (call.exit.is_error(), call.return_data.clone()), - Either3::C(create) => (create.exit.is_error(), create.return_data.clone()), - }; - - // This is not a very exact heuristic, but most of the time it will be right, as - // solidity reverts if a call fails, and most contracts are in - // solidity - if is_error && trace_return_data.as_ref() == return_data.as_ref() { - let unrecognized_entry: SolidityStackTraceEntry = match trace { - Either::A(CallMessageTrace { address, .. }) => { - UnrecognizedContractCallstackEntryStackTraceEntry { - type_: StackTraceEntryTypeConst, - address: address.clone(), - source_reference: None, - } - .into() - } - Either::B(CreateMessageTrace { .. }) => { - UnrecognizedCreateCallstackEntryStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: None, - } - .into() - } - }; - - let mut stacktrace = vec![unrecognized_entry]; - stacktrace.extend(self.get_stack_trace_inner(subtrace)?); - - return Ok(stacktrace); - } - } - - if trace_exit_kind == ExitCode::CODESIZE_EXCEEDS_MAXIMUM { - return Ok(vec![ContractTooLargeErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - source_reference: None, - } - .into()]); - } - - let is_invalid_opcode_error = trace_exit_kind == ExitCode::INVALID_OPCODE; - - match trace { - Either::A(trace @ CallMessageTrace { .. }) => { - Ok(vec![UnrecognizedContractErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - address: trace.address.clone(), - return_data: trace.return_data.clone(), - is_invalid_opcode_error, - source_reference: None, - } - .into()]) - } - Either::B(trace @ CreateMessageTrace { .. }) => { - Ok(vec![UnrecognizedCreateErrorStackTraceEntry { - type_: StackTraceEntryTypeConst, - return_data: trace.return_data.clone(), - is_invalid_opcode_error, - source_reference: None, - } - .into()]) - } - } - } - - fn trace_evm_execution( - &self, - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result { - let stack_trace = self.raw_trace_evm_execution(trace)?; - - if stack_trace_may_require_adjustments(&stack_trace, trace) { - return adjust_stack_trace(stack_trace, trace); - } - - Ok(stack_trace) - } - - fn raw_trace_evm_execution( - &self, - trace: Either<&CallMessageTrace, &CreateMessageTrace>, - ) -> napi::Result { - let (bytecode, steps, number_of_subtraces) = match &trace { - Either::A(call) => (&call.bytecode, &call.steps, call.number_of_subtraces), - Either::B(create) => (&create.bytecode, &create.steps, create.number_of_subtraces), - }; - let bytecode = bytecode.as_ref().expect("JS code asserts"); - - let mut stacktrace: SolidityStackTrace = vec![]; - - let mut subtraces_seen = 0; - - // There was a jump into a function according to the sourcemaps - let mut jumped_into_function = false; - - let mut function_jumpdests: Vec<&Instruction> = vec![]; - - let mut last_submessage_data: Option> = None; - - let mut iter = steps.iter().enumerate().peekable(); - while let Some((step_index, step)) = iter.next() { - if let Either4::A(EvmStep { pc }) = step { - let inst = bytecode.get_instruction(*pc)?; - - if inst.jump_type == JumpType::IntoFunction && iter.peek().is_some() { - let (_, next_step) = iter.peek().unwrap(); - let Either4::A(next_evm_step) = next_step else { - unreachable!("JS code asserted that"); - }; - let next_inst = bytecode.get_instruction(next_evm_step.pc)?; - - if next_inst.opcode == OpCode::JUMPDEST { - let frame = instruction_to_callstack_stack_trace_entry(bytecode, inst)?; - stacktrace.push(match frame { - Either::A(frame) => frame.into(), - Either::B(frame) => frame.into(), - }); - if next_inst.location.is_some() { - jumped_into_function = true; - } - function_jumpdests.push(next_inst); - } - } else if inst.jump_type == JumpType::OutofFunction { - stacktrace.pop(); - function_jumpdests.pop(); - } - } else { - let message_trace = match step { - Either4::A(_) => unreachable!("branch is taken above"), - Either4::B(precompile) => Either3::A(precompile), - Either4::C(call) => Either3::B(call), - Either4::D(create) => Either3::C(create), - }; - - subtraces_seen += 1; - - // If there are more subtraces, this one didn't terminate the execution - if subtraces_seen < number_of_subtraces { - continue; - } - - let submessage_trace = self.get_stack_trace_inner(message_trace)?; - - last_submessage_data = Some(SubmessageDataRef { - message_trace, - step_index: step_index as u32, - stacktrace: submessage_trace, - }); - } - } - - let stacktrace_with_inferred_error = ErrorInferrer::infer_after_tracing( - trace, - stacktrace, - &function_jumpdests, - jumped_into_function, - last_submessage_data, - )?; - - ErrorInferrer::filter_redundant_frames(stacktrace_with_inferred_error) - } -} diff --git a/crates/edr_napi/src/trace/vm_trace_decoder.rs b/crates/edr_napi/src/trace/vm_trace_decoder.rs deleted file mode 100644 index 750beee74..000000000 --- a/crates/edr_napi/src/trace/vm_trace_decoder.rs +++ /dev/null @@ -1,234 +0,0 @@ -use std::rc::Rc; - -use edr_solidity::{ - artifacts::BuildInfo, - build_model::{Bytecode, ContractFunctionType}, - compiler::create_models_and_decode_bytecodes, - contracts_identifier::ContractsIdentifier, -}; -use napi::{ - bindgen_prelude::{ClassInstance, Either3, Either4, Uint8Array, Undefined}, - Either, Env, -}; -use napi_derive::napi; -use serde::{Deserialize, Serialize}; - -use super::{ - message_trace::{CallMessageTrace, CreateMessageTrace, PrecompileMessageTrace}, - solidity_stack_trace::{ - FALLBACK_FUNCTION_NAME, RECEIVE_FUNCTION_NAME, UNRECOGNIZED_CONTRACT_NAME, - UNRECOGNIZED_FUNCTION_NAME, - }, -}; -use crate::trace::model::BytecodeWrapper; - -#[derive(Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct TracingConfig { - pub build_infos: Option>, - pub ignore_contracts: Option, -} - -#[derive(Default)] -#[napi] -pub struct VmTraceDecoder { - contracts_identifier: ContractsIdentifier, -} - -#[napi] -impl VmTraceDecoder { - #[napi(constructor)] - pub fn new() -> Self { - Self::default() - } - - #[napi(catch_unwind)] - pub fn add_bytecode(&mut self, bytecode: ClassInstance) { - self.add_bytecode_inner(bytecode.inner().clone()); - } - - pub fn add_bytecode_inner(&mut self, bytecode: Rc) { - self.contracts_identifier.add_bytecode(bytecode); - } - - #[napi(catch_unwind)] - pub fn try_to_decode_message_trace( - &mut self, - message_trace: Either3, - env: Env, - ) -> napi::Result> { - match message_trace { - precompile @ Either3::A(..) => Ok(precompile), - // NOTE: The branches below are the same with the difference of `is_create` - Either3::B(mut call) => { - let is_create = false; - - let bytecode = self - .contracts_identifier - .get_bytecode_for_call(call.code.as_ref(), is_create); - - let steps: Vec<_> = call - .steps - .into_iter() - .map(|step| { - let trace = match step { - Either4::A(step) => return Ok(Either4::A(step)), - Either4::B(precompile) => Either3::A(precompile), - Either4::C(create) => Either3::B(create), - Either4::D(call) => Either3::C(call), - }; - - Ok(match self.try_to_decode_message_trace(trace, env)? { - Either3::A(precompile) => Either4::B(precompile), - Either3::B(create) => Either4::C(create), - Either3::C(call) => Either4::D(call), - }) - }) - .collect::>()?; - - let bytecode = bytecode - .map(|b| BytecodeWrapper::new(b).into_instance(env)) - .transpose()?; - - call.bytecode = bytecode; - call.steps = steps; - - Ok(Either3::B(call)) - } - Either3::C(mut create @ CreateMessageTrace { .. }) => { - let is_create = true; - - let bytecode = self - .contracts_identifier - .get_bytecode_for_call(create.code.as_ref(), is_create); - - let steps: Vec<_> = create - .steps - .into_iter() - .map(|step| { - let trace = match step { - Either4::A(step) => return Ok(Either4::A(step)), - Either4::B(precompile) => Either3::A(precompile), - Either4::C(create) => Either3::B(create), - Either4::D(call) => Either3::C(call), - }; - - Ok(match self.try_to_decode_message_trace(trace, env)? { - Either3::A(precompile) => Either4::B(precompile), - Either3::B(create) => Either4::C(create), - Either3::C(call) => Either4::D(call), - }) - }) - .collect::>()?; - - let bytecode = bytecode - .map(|b| BytecodeWrapper::new(b).into_instance(env)) - .transpose()?; - create.bytecode = bytecode; - create.steps = steps; - - Ok(Either3::C(create)) - } - } - } - - #[napi] - pub fn get_contract_and_function_names_for_call( - &mut self, - code: Uint8Array, - calldata: Either, - ) -> napi::Result { - let is_create = matches!(calldata, Either::B(())); - let bytecode = self - .contracts_identifier - .get_bytecode_for_call(code.as_ref(), is_create); - - let contract = bytecode.map(|bytecode| bytecode.contract.clone()); - let contract = contract.as_ref().map(|c| c.borrow()); - - let contract_name = contract.as_ref().map_or_else( - || UNRECOGNIZED_CONTRACT_NAME.to_string(), - |c| c.name.clone(), - ); - - if is_create { - Ok(ContractAndFunctionName { - contract_name, - function_name: Either::B(()), - }) - } else { - match contract { - None => Ok(ContractAndFunctionName { - contract_name, - function_name: Either::A("".to_string()), - }), - Some(contract) => { - let calldata = match calldata { - Either::A(calldata) => calldata, - Either::B(_) => { - unreachable!("calldata should be Some if is_create is false") - } - }; - - let selector = &calldata.get(..4).unwrap_or(&calldata[..]); - - let func = contract.get_function_from_selector(selector); - - let function_name = match func { - Some(func) => match func.r#type { - ContractFunctionType::Fallback => FALLBACK_FUNCTION_NAME.to_string(), - ContractFunctionType::Receive => RECEIVE_FUNCTION_NAME.to_string(), - _ => func.name.clone(), - }, - None => UNRECOGNIZED_FUNCTION_NAME.to_string(), - }; - - Ok(ContractAndFunctionName { - contract_name, - function_name: Either::A(function_name), - }) - } - } - } - } -} - -#[napi(object)] -pub struct ContractAndFunctionName { - pub contract_name: String, - pub function_name: Either, -} - -#[napi(catch_unwind)] -pub fn initialize_vm_trace_decoder( - mut vm_trace_decoder: ClassInstance, - tracing_config: serde_json::Value, -) -> napi::Result<()> { - let config = serde_json::from_value::(tracing_config).map_err(|e| { - napi::Error::from_reason(format!("Failed to deserialize tracing config: {e:?}")) - })?; - - let Some(build_infos) = config.build_infos else { - return Ok(()); - }; - - for build_info in &build_infos { - let bytecodes = create_models_and_decode_bytecodes( - build_info.solc_version.clone(), - &build_info.input, - &build_info.output, - )?; - - for bytecode in bytecodes { - if config.ignore_contracts == Some(true) - && bytecode.contract.borrow().name.starts_with("Ignored") - { - continue; - } - - vm_trace_decoder.add_bytecode_inner(Rc::new(bytecode)); - } - } - - Ok(()) -} diff --git a/crates/edr_napi/src/trace/vm_tracer.rs b/crates/edr_napi/src/trace/vm_tracer.rs deleted file mode 100644 index 6d418b768..000000000 --- a/crates/edr_napi/src/trace/vm_tracer.rs +++ /dev/null @@ -1,71 +0,0 @@ -//! N-API bindings for the Rust port of `VMTracer` from Hardhat. - -use napi::{ - bindgen_prelude::{Either3, Either4, Undefined}, - Either, Env, JsError, -}; -use napi_derive::napi; - -use crate::trace::{ - message_trace::{ - message_trace_to_napi, CallMessageTrace, CreateMessageTrace, PrecompileMessageTrace, - }, - RawTrace, -}; - -/// N-API bindings for the Rust port of `VMTracer` from Hardhat. -#[napi] -pub struct VMTracer(edr_solidity::vm_tracer::VmTracer); - -#[napi] -impl VMTracer { - #[napi(constructor)] - pub fn new() -> napi::Result { - Ok(Self(edr_solidity::vm_tracer::VmTracer::new())) - } - - /// Observes a trace, collecting information about the execution of the EVM. - #[napi] - pub fn observe(&mut self, trace: &RawTrace) { - self.0.observe(&trace.inner); - } - - // Explicitly return undefined as `Option` by default returns `null` in JS - // and the null/undefined checks we use in JS are strict - #[napi] - pub fn get_last_top_level_message_trace( - &self, - env: Env, - ) -> napi::Result< - Either4, - > { - Ok( - match self - .0 - .get_last_top_level_message_trace_ref() - .map(|x| { - x.try_borrow() - .expect("cannot be executed concurrently with `VMTracer::observe`") - .clone() - }) - .map(|msg| message_trace_to_napi(msg, env)) - .transpose()? - { - Some(Either3::A(precompile)) => Either4::A(precompile), - Some(Either3::B(call)) => Either4::B(call), - Some(Either3::C(create)) => Either4::C(create), - None => Either4::D(()), - }, - ) - } - - // Explicitly return undefined as `Option` by default returns `null` in JS - // and the null/undefined checks we use in JS are strict - #[napi] - pub fn get_last_error(&self) -> Either { - match self.0.get_last_error() { - Some(err) => Either::A(napi::Error::from_reason(err).into()), - None => Either::B(()), - } - } -} diff --git a/crates/edr_napi/test/issues.ts b/crates/edr_napi/test/issues.ts index 62833a8fb..c797772cd 100644 --- a/crates/edr_napi/test/issues.ts +++ b/crates/edr_napi/test/issues.ts @@ -92,7 +92,8 @@ describe("Provider", () => { loggerConfig, { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); const debugTraceTransaction = `{ diff --git a/crates/edr_napi/test/optimism.ts b/crates/edr_napi/test/optimism.ts index 121955942..8efa50d0e 100644 --- a/crates/edr_napi/test/optimism.ts +++ b/crates/edr_napi/test/optimism.ts @@ -96,7 +96,8 @@ describe("Multi-chain", () => { loggerConfig, { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); await assert.isFulfilled(provider); @@ -113,7 +114,8 @@ describe("Multi-chain", () => { loggerConfig, { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); await assert.isFulfilled(provider); @@ -136,7 +138,8 @@ describe("Multi-chain", () => { loggerConfig, { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); await assert.isFulfilled(provider); @@ -156,7 +159,8 @@ describe("Multi-chain", () => { loggerConfig, { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); const block = provider.handleRequest( diff --git a/crates/edr_napi/test/provider.ts b/crates/edr_napi/test/provider.ts index 69dd1d51d..2ef744e23 100644 --- a/crates/edr_napi/test/provider.ts +++ b/crates/edr_napi/test/provider.ts @@ -93,7 +93,8 @@ describe("Provider", () => { loggerConfig, { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); await assert.isFulfilled(provider); @@ -116,7 +117,8 @@ describe("Provider", () => { loggerConfig, { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); await assert.isFulfilled(provider); @@ -133,10 +135,10 @@ describe("Provider", () => { ...providerConfig, }, loggerConfig, - { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); const responseObject = await provider.handleRequest( @@ -183,7 +185,8 @@ describe("Provider", () => { loggerConfig, { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); await provider.setVerboseTracing(true); @@ -235,7 +238,8 @@ describe("Provider", () => { loggerConfig, { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); const responseObject = await provider.handleRequest( @@ -281,7 +285,8 @@ describe("Provider", () => { loggerConfig, { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); await provider.setVerboseTracing(true); @@ -332,10 +337,10 @@ describe("Provider", () => { ...providerConfig, }, loggerConfig, - { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); const responseObject = await provider.handleRequest( @@ -379,10 +384,10 @@ describe("Provider", () => { ...providerConfig, }, loggerConfig, - { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); const sendTxResponse = await provider.handleRequest( @@ -439,10 +444,10 @@ describe("Provider", () => { ...providerConfig, }, loggerConfig, - { subscriptionCallback: (_event: SubscriptionEvent) => {}, - } + }, + {} ); const traceCallResponse = await provider.handleRequest( diff --git a/crates/edr_napi_core/Cargo.toml b/crates/edr_napi_core/Cargo.toml index c47516d30..a5965f8fa 100644 --- a/crates/edr_napi_core/Cargo.toml +++ b/crates/edr_napi_core/Cargo.toml @@ -11,6 +11,7 @@ edr_eth = { path = "../edr_eth" } edr_evm = { path = "../edr_evm" } edr_generic = { path = "../edr_generic" } edr_provider = { path = "../edr_provider" } +edr_solidity = { path = "../edr_solidity" } edr_rpc_client = { path = "../edr_rpc_client" } itertools = { version = "0.12.0", default-features = false } napi = { version = "2.16.10", default-features = false, features = ["async", "error_anyhow", "napi8", "serde-json"] } diff --git a/crates/edr_napi_core/src/logger.rs b/crates/edr_napi_core/src/logger.rs index 452f7ec54..77cb9372a 100644 --- a/crates/edr_napi_core/src/logger.rs +++ b/crates/edr_napi_core/src/logger.rs @@ -15,6 +15,7 @@ use edr_provider::{ time::CurrentTime, CallResult, DebugMineBlockResult, DebugMineBlockResultForChainSpec, EstimateGasFailure, ProviderError, ProviderSpec, TransactionFailure, }; +use edr_solidity::contract_decoder::{ContractAndFunctionName, ContractDecoder}; use itertools::izip; /// Trait for a function that decodes console log inputs. @@ -22,17 +23,6 @@ pub trait DecodeConsoleLogInputsFn: Fn(Vec) -> Vec + Send + Sync impl DecodeConsoleLogInputsFn for FnT where FnT: Fn(Vec) -> Vec + Send + Sync {} -/// Trait for a function that retrieves the contract and function name. -pub trait GetContractAndFunctionNameFn: - Fn(Bytes, Option) -> (String, Option) + Send + Sync -{ -} - -impl GetContractAndFunctionNameFn for FnT where - FnT: Fn(Bytes, Option) -> (String, Option) + Send + Sync -{ -} - /// Trait for a function that prints a line or replaces the last printed line. pub trait PrintLineFn: Fn(String, bool) -> Result<(), LoggerError> + Send + Sync {} @@ -43,7 +33,6 @@ pub struct Config { /// Whether to enable the logger. pub enable: bool, pub decode_console_log_inputs_fn: Arc, - pub get_contract_and_function_name_fn: Arc, pub print_line_fn: Arc, } @@ -105,9 +94,9 @@ pub struct Logger> { } impl> Logger { - pub fn new(config: Config) -> napi::Result { + pub fn new(config: Config, contract_decoder: Arc) -> napi::Result { Ok(Self { - collector: LogCollector::new(config)?, + collector: LogCollector::new(config, contract_decoder)?, }) } } @@ -183,6 +172,18 @@ where Ok(()) } + fn print_contract_decoding_error( + &mut self, + error: &str, + ) -> Result<(), Box> { + self.collector.log( + "Contract decoder failed to be updated. Please report this to help us improve Hardhat.", + ); + self.collector.print_empty_line()?; + self.collector.log(error); + Ok(()) + } + fn print_method_logs( &mut self, method: &str, @@ -238,6 +239,7 @@ pub struct CollapsedMethod { #[derive_where(Clone)] struct LogCollector> { config: Config, + contract_decoder: Arc, indentation: usize, logs: Vec, state: LoggingState, @@ -246,9 +248,10 @@ struct LogCollector> { } impl> LogCollector { - pub fn new(config: Config) -> napi::Result { + pub fn new(config: Config, contract_decoder: Arc) -> napi::Result { Ok(Self { config, + contract_decoder, indentation: 0, logs: Vec::new(), state: LoggingState::default(), @@ -745,14 +748,20 @@ impl> LogCollector { self.log("WARNING: Calling an account which is not a contract"); } } else { - let (contract_name, function_name) = - (self.config.get_contract_and_function_name_fn)( - before_message - .code - .as_ref() - .map(edr_eth::Bytecode::original_bytes) - .expect("Call must be defined"), - Some(before_message.data.clone()), + let code = before_message + .code + .as_ref() + .map(edr_eth::Bytecode::original_bytes) + .expect("Call must be defined"); + + let ContractAndFunctionName { + contract_name, + function_name, + } = self + .contract_decoder + .get_contract_and_function_names_for_call( + &code, + Some(&before_message.data), ); let function_name = function_name.expect("Function name must be defined"); @@ -778,10 +787,9 @@ impl> LogCollector { }; // Create - let (contract_name, _) = (self.config.get_contract_and_function_name_fn)( - before_message.data.clone(), - None, - ); + let ContractAndFunctionName { contract_name, .. } = self + .contract_decoder + .get_contract_and_function_names_for_call(&before_message.data, None); self.log_with_title("Contract deployment", contract_name); diff --git a/crates/edr_napi_core/src/provider.rs b/crates/edr_napi_core/src/provider.rs index 22969e6c9..1a2787a51 100644 --- a/crates/edr_napi_core/src/provider.rs +++ b/crates/edr_napi_core/src/provider.rs @@ -7,6 +7,7 @@ use std::{str::FromStr as _, sync::Arc}; use edr_eth::result::HaltReason; use edr_provider::{InvalidRequestReason, SyncCallOverride}; use edr_rpc_client::jsonrpc; +use edr_solidity::contract_decoder::ContractDecoder; pub use self::{ builder::{Builder, ProviderBuilder}, @@ -19,7 +20,11 @@ use crate::spec::{Response, SyncNapiSpec}; /// objects. pub trait SyncProvider: Send + Sync { /// Blocking method to handle a request. - fn handle_request(&self, request: String) -> napi::Result>; + fn handle_request( + &self, + request: String, + contract_decoder: Arc, + ) -> napi::Result>; /// Set to `true` to make the traces returned with `eth_call`, /// `eth_estimateGas`, `eth_sendRawTransaction`, `eth_sendTransaction`, @@ -32,7 +37,11 @@ pub trait SyncProvider: Send + Sync { } impl SyncProvider for edr_provider::Provider { - fn handle_request(&self, request: String) -> napi::Result> { + fn handle_request( + &self, + request: String, + contract_decoder: Arc, + ) -> napi::Result> { let request = match serde_json::from_str(&request) { Ok(request) => request, Err(error) => { @@ -75,7 +84,7 @@ impl SyncProvider for edr_provider::Provider) { diff --git a/crates/edr_napi_core/src/provider/builder.rs b/crates/edr_napi_core/src/provider/builder.rs index f960dba25..cb5afea37 100644 --- a/crates/edr_napi_core/src/provider/builder.rs +++ b/crates/edr_napi_core/src/provider/builder.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use edr_evm::blockchain::BlockchainErrorForChainSpec; use edr_provider::{time::CurrentTime, SyncLogger}; +use edr_solidity::contract_decoder::ContractDecoder; use napi::tokio::runtime; use crate::{provider::SyncProvider, spec::SyncNapiSpec, subscription}; @@ -13,6 +14,7 @@ pub trait Builder: Send { } pub struct ProviderBuilder { + contract_decoder: Arc, logger: Box>>, provider_config: edr_provider::ProviderConfig, @@ -22,6 +24,7 @@ pub struct ProviderBuilder { impl ProviderBuilder { /// Constructs a new instance. pub fn new( + contract_decoder: Arc, logger: Box< dyn SyncLogger>, >, @@ -29,6 +32,7 @@ impl ProviderBuilder { subscription_callback: subscription::Callback, ) -> Self { Self { + contract_decoder, logger, provider_config, subscription_callback, @@ -45,6 +49,7 @@ impl Builder for ProviderBuilder { builder.logger, Box::new(move |event| builder.subscription_callback.call(event)), builder.provider_config, + builder.contract_decoder, CurrentTime, ) .map_err(|error| napi::Error::new(napi::Status::GenericFailure, error.to_string()))?; diff --git a/crates/edr_napi_core/src/provider/factory.rs b/crates/edr_napi_core/src/provider/factory.rs index 1d843bf82..8f9432a9b 100644 --- a/crates/edr_napi_core/src/provider/factory.rs +++ b/crates/edr_napi_core/src/provider/factory.rs @@ -1,3 +1,7 @@ +use std::sync::Arc; + +use edr_solidity::contract_decoder::ContractDecoder; + use crate::{logger, provider, subscription}; /// Trait for creating a new provider using the builder pattern. @@ -9,5 +13,6 @@ pub trait SyncProviderFactory: Send + Sync { provider_config: provider::Config, logger_config: logger::Config, subscription_config: subscription::Config, + contract_decoder: Arc, ) -> napi::Result>; } diff --git a/crates/edr_napi_core/src/spec.rs b/crates/edr_napi_core/src/spec.rs index cd5d4df54..98ce17810 100644 --- a/crates/edr_napi_core/src/spec.rs +++ b/crates/edr_napi_core/src/spec.rs @@ -10,6 +10,7 @@ use edr_evm::trace::Trace; use edr_generic::GenericChainSpec; use edr_provider::{time::CurrentTime, ProviderError, ResponseWithTraces, SyncProviderSpec}; use edr_rpc_client::jsonrpc; +use edr_solidity::contract_decoder::ContractDecoder; use napi::{Either, Status}; pub type ResponseData = Either; @@ -23,7 +24,7 @@ pub struct Response { /// transaction. /// /// Only present for L1 Ethereum chains. - pub solidity_trace: Option>>, + pub solidity_trace: Option>, /// This may contain zero or more traces, depending on the (batch) request /// /// Always empty for non-L1 Ethereum chains. @@ -33,13 +34,19 @@ pub struct Response { impl From for Response { fn from(value: String) -> Self { Response { - solidity_trace: None, data: Either::A(value), + solidity_trace: None, traces: Vec::new(), } } } +#[derive(Debug)] +pub struct SolidityTraceData { + pub trace: Arc>, + pub contract_decoder: Arc, +} + /// Trait for a defining a chain's associated type in the N-API. pub trait SyncNapiSpec: SyncProviderSpec< @@ -63,6 +70,7 @@ pub trait SyncNapiSpec: /// implementing type conversions for third-party types. fn cast_response( response: Result, ProviderError>, + contract_decoder: Arc, ) -> napi::Result>; } @@ -71,25 +79,25 @@ impl SyncNapiSpec for L1ChainSpec { fn cast_response( mut response: Result, ProviderError>, + contract_decoder: Arc, ) -> napi::Result> { // We can take the solidity trace as it won't be used for anything else - let solidity_trace: Option>> = - response.as_mut().err().and_then(|error| { - if let edr_provider::ProviderError::TransactionFailed(failure) = error { - if matches!( - failure.failure.reason, - edr_provider::TransactionFailureReason::OutOfGas(_) - ) { - None - } else { - Some(Arc::new(std::mem::take( - &mut failure.failure.solidity_trace, - ))) - } - } else { + let solidity_trace = response.as_mut().err().and_then(|error| { + if let edr_provider::ProviderError::TransactionFailed(failure) = error { + if matches!( + failure.failure.reason, + edr_provider::TransactionFailureReason::OutOfGas(_) + ) { None + } else { + Some(Arc::new(std::mem::take( + &mut failure.failure.solidity_trace, + ))) } - }); + } else { + None + } + }); // We can take the traces as they won't be used for anything else let traces = match &mut response { @@ -102,10 +110,17 @@ impl SyncNapiSpec for L1ChainSpec { let response = jsonrpc::ResponseData::from(response.map(|response| response.result)); - marshal_response_data(response).map(|data| Response { - solidity_trace, - data, - traces: traces.into_iter().map(Arc::new).collect(), + marshal_response_data(response).map(|data| { + let solidity_trace = solidity_trace.map(|solidity_trace| SolidityTraceData { + trace: solidity_trace, + contract_decoder, + }); + + Response { + solidity_trace, + data, + traces: traces.into_iter().map(Arc::new).collect(), + } }) } } @@ -115,6 +130,7 @@ impl SyncNapiSpec for GenericChainSpec { fn cast_response( mut response: Result, ProviderError>, + contract_decoder: Arc, ) -> napi::Result> { // We can take the solidity trace as it won't be used for anything else let solidity_trace = response.as_mut().err().and_then(|error| { @@ -145,10 +161,17 @@ impl SyncNapiSpec for GenericChainSpec { let response = jsonrpc::ResponseData::from(response.map(|response| response.result)); - marshal_response_data(response).map(|data| Response { - solidity_trace, - data, - traces: traces.into_iter().map(Arc::new).collect(), + marshal_response_data(response).map(|data| { + let solidity_trace = solidity_trace.map(|solidity_trace| SolidityTraceData { + trace: solidity_trace, + contract_decoder, + }); + + Response { + data, + solidity_trace, + traces: traces.into_iter().map(Arc::new).collect(), + } }) } } diff --git a/crates/edr_optimism/Cargo.toml b/crates/edr_optimism/Cargo.toml index 2f70e334e..b00fe632a 100644 --- a/crates/edr_optimism/Cargo.toml +++ b/crates/edr_optimism/Cargo.toml @@ -12,6 +12,7 @@ edr_generic = { path = "../edr_generic" } edr_napi_core = { path = "../edr_napi_core" } edr_provider = { path = "../edr_provider" } edr_rpc_eth = { path = "../edr_rpc_eth" } +edr_solidity = { path = "../edr_solidity" } log = { version = "0.4.17", default-features = false } op-alloy-rpc-types = { version = "0.2.11", default-features = false } revm-optimism = { git = "https://github.com/nomicfoundation/revm", rev = "4722477", version = "1.0", default-features = false, features = ["c-kzg", "dev", "serde", "std"] } diff --git a/crates/edr_optimism/src/spec.rs b/crates/edr_optimism/src/spec.rs index 24aeaf2ad..11413968a 100644 --- a/crates/edr_optimism/src/spec.rs +++ b/crates/edr_optimism/src/spec.rs @@ -24,6 +24,7 @@ use edr_napi_core::{ }; use edr_provider::{time::TimeSinceEpoch, ProviderSpec, TransactionFailureReason}; use edr_rpc_eth::{jsonrpc, spec::RpcSpec}; +use edr_solidity::contract_decoder::ContractDecoder; use revm_optimism::{OptimismHaltReason, OptimismInvalidTransaction, OptimismSpecId}; use serde::{de::DeserializeOwned, Serialize}; @@ -166,12 +167,14 @@ impl SyncNapiSpec for OptimismChainSpec { edr_provider::ResponseWithTraces, edr_provider::ProviderError, >, + _contract_decoder: Arc, ) -> napi::Result> { let response = jsonrpc::ResponseData::from(response.map(|response| response.result)); marshal_response_data(response).map(|data| Response { - solidity_trace: None, data, + // TODO: Add support for Solidity stack traces in Optimism + solidity_trace: None, traces: Vec::new(), }) } diff --git a/crates/edr_optimism/tests/integration/provider.rs b/crates/edr_optimism/tests/integration/provider.rs index cbb9dc25c..81fb6886f 100644 --- a/crates/edr_optimism/tests/integration/provider.rs +++ b/crates/edr_optimism/tests/integration/provider.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use edr_eth::{address, bytes, Address, BlockSpec, U64}; use edr_optimism::{OptimismChainSpec, OptimismSpecId}; use edr_provider::{ @@ -7,6 +9,7 @@ use edr_provider::{ MethodInvocation, NoopLogger, Provider, ProviderRequest, }; use edr_rpc_eth::CallRequest; +use edr_solidity::contract_decoder::ContractDecoder; use edr_test_utils::env::get_alchemy_url; use tokio::runtime; @@ -60,6 +63,7 @@ async fn sepolia_call_with_remote_chain_id() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/Cargo.toml b/crates/edr_provider/Cargo.toml index 9ee42f10c..8cf7d62dd 100644 --- a/crates/edr_provider/Cargo.toml +++ b/crates/edr_provider/Cargo.toml @@ -14,6 +14,7 @@ edr_defaults = { version = "0.3.5", path = "../edr_defaults" } edr_eth = { version = "0.3.5", path = "../edr_eth" } edr_evm = { version = "0.3.5", path = "../edr_evm", features = ["tracing"] } edr_rpc_eth = { version = "0.3.5", path = "../edr_rpc_eth" } +edr_solidity = { version = "0.3.5", path = "../edr_solidity" } edr_test_utils = { version = "0.3.5", path = "../edr_test_utils", optional = true } edr_utils = { version = "0.3.5", path = "../edr_utils" } indexmap = { version = "2.0.0", default-features = false, features = ["std"] } diff --git a/crates/edr_provider/src/data.rs b/crates/edr_provider/src/data.rs index 240a65313..18a837fa0 100644 --- a/crates/edr_provider/src/data.rs +++ b/crates/edr_provider/src/data.rs @@ -65,6 +65,7 @@ use edr_rpc_eth::{ client::{EthRpcClient, HeaderMap, RpcClientError}, error::HttpError, }; +use edr_solidity::contract_decoder::{ContractDecoder, ContractDecoderError}; use gas::gas_used_ratio; use indexmap::IndexMap; use itertools::izip; @@ -187,6 +188,9 @@ where /// A blockchain error #[error(transparent)] Blockchain(BlockchainErrorForChainSpec), + /// A contract decoder error + #[error(transparent)] + ContractDecoder(#[from] ContractDecoderError), /// An error that occurred while constructing a forked blockchain. #[error(transparent)] ForkedBlockchainCreation(#[from] ForkedCreationError), @@ -251,6 +255,7 @@ pub struct ProviderData< block_state_cache: LruCache>>>, current_state_id: StateId, block_number_to_state_id: HashTrieMapSync, + contract_decoder: Arc, } impl ProviderData @@ -295,6 +300,11 @@ where self.beneficiary } + /// Get the locked contract decoder. + pub fn contract_decoder(&self) -> &ContractDecoder { + &self.contract_decoder + } + /// Returns the default caller. pub fn default_caller(&self) -> Address { self.local_accounts @@ -610,6 +620,7 @@ where subscriber_callback: Box>, call_override: Option>, config: ProviderConfig, + contract_decoder: Arc, timer: TimerT, ) -> Result> { let InitialAccounts { @@ -700,6 +711,7 @@ where block_state_cache, current_state_id, block_number_to_state_id, + contract_decoder, }) } @@ -879,6 +891,9 @@ where self.subscriber_callback.clone(), self.call_override.clone(), config, + // `hardhat_reset` doesn't discard contract metadata added with + // `hardhat_addCompilationResult` + Arc::clone(&self.contract_decoder), self.timer.clone(), )?; diff --git a/crates/edr_provider/src/error.rs b/crates/edr_provider/src/error.rs index 94ad8110b..3c4fa0fa2 100644 --- a/crates/edr_provider/src/error.rs +++ b/crates/edr_provider/src/error.rs @@ -182,6 +182,9 @@ where /// An error occurred while recovering a signature. #[error(transparent)] Signature(#[from] edr_eth::signature::SignatureError), + /// An error occurred while decoding the contract metadata. + #[error("Error decoding contract metadata: {0}")] + SolcDecoding(String), /// State error #[error(transparent)] State(#[from] StateError), @@ -299,6 +302,7 @@ where ProviderError::SetNextBlockBaseFeePerGasUnsupported { .. } => INVALID_INPUT, ProviderError::SetNextPrevRandaoUnsupported { .. } => INVALID_INPUT, ProviderError::Signature(_) => INVALID_PARAMS, + ProviderError::SolcDecoding(_) => INVALID_INPUT, ProviderError::State(_) => INVALID_INPUT, ProviderError::TimestampLowerThanPrevious { .. } => INVALID_INPUT, ProviderError::TimestampEqualsPrevious { .. } => INVALID_INPUT, diff --git a/crates/edr_provider/src/lib.rs b/crates/edr_provider/src/lib.rs index d1a201105..29c5ca0a4 100644 --- a/crates/edr_provider/src/lib.rs +++ b/crates/edr_provider/src/lib.rs @@ -54,14 +54,8 @@ pub use self::{ }; lazy_static! { - pub static ref PRIVATE_RPC_METHODS: HashSet<&'static str> = { - [ - "hardhat_getStackTraceFailuresCount", - "hardhat_setLoggingEnabled", - ] - .into_iter() - .collect() - }; + pub static ref PRIVATE_RPC_METHODS: HashSet<&'static str> = + ["hardhat_setLoggingEnabled",].into_iter().collect(); } pub type ProviderResultWithTraces = diff --git a/crates/edr_provider/src/logger.rs b/crates/edr_provider/src/logger.rs index 2650d6cbc..f9aa5721e 100644 --- a/crates/edr_provider/src/logger.rs +++ b/crates/edr_provider/src/logger.rs @@ -79,6 +79,11 @@ pub trait Logger { Ok(()) } + fn print_contract_decoding_error( + &mut self, + error: &str, + ) -> Result<(), Box>; + /// Prints the collected logs, which correspond to the method with the /// provided name. /// @@ -122,6 +127,13 @@ impl Logger for NoopLogger { fn set_is_enabled(&mut self, _is_enabled: bool) {} + fn print_contract_decoding_error( + &mut self, + _error: &str, + ) -> Result<(), Box> { + Ok(()) + } + fn print_method_logs( &mut self, _method: &str, diff --git a/crates/edr_provider/src/provider.rs b/crates/edr_provider/src/provider.rs index 349febdc8..5d4f8c8d1 100644 --- a/crates/edr_provider/src/provider.rs +++ b/crates/edr_provider/src/provider.rs @@ -5,6 +5,7 @@ use edr_eth::{ transaction::{IsEip155, IsEip4844, TransactionMut, TransactionType, TransactionValidation}, }; use edr_evm::blockchain::BlockchainErrorForChainSpec; +use edr_solidity::contract_decoder::ContractDecoder; use parking_lot::Mutex; use tokio::{runtime, sync::Mutex as AsyncMutex, task}; @@ -102,6 +103,7 @@ impl< >, subscriber_callback: Box>, config: ProviderConfig, + contract_decoder: Arc, timer: TimerT, ) -> Result> { let data = ProviderData::new( @@ -110,6 +112,7 @@ impl< subscriber_callback, None, config.clone(), + contract_decoder, timer, )?; let data = Arc::new(AsyncMutex::new(data)); @@ -388,18 +391,23 @@ impl< } // hardhat_* methods - MethodInvocation::AddCompilationResult(_, _, _) => Err(ProviderError::Unimplemented( - "AddCompilationResult".to_string(), - )), + MethodInvocation::AddCompilationResult( + solc_version, + compiler_input, + compiler_output, + ) => hardhat::handle_add_compilation_result( + data, + solc_version, + *compiler_input, + compiler_output, + ) + .and_then(to_json), MethodInvocation::DropTransaction(transaction_hash) => { hardhat::handle_drop_transaction(data, transaction_hash).and_then(to_json) } MethodInvocation::GetAutomine(()) => { hardhat::handle_get_automine_request(data).and_then(to_json) } - MethodInvocation::GetStackTraceFailuresCount(()) => Err(ProviderError::Unimplemented( - "GetStackTraceFailuresCount".to_string(), - )), MethodInvocation::ImpersonateAccount(address) => { hardhat::handle_impersonate_account_request(data, *address).and_then(to_json) } diff --git a/crates/edr_provider/src/requests/hardhat.rs b/crates/edr_provider/src/requests/hardhat.rs index 5aa0314aa..8990a67ab 100644 --- a/crates/edr_provider/src/requests/hardhat.rs +++ b/crates/edr_provider/src/requests/hardhat.rs @@ -1,4 +1,5 @@ mod accounts; +mod compiler; mod config; mod log; mod miner; @@ -6,4 +7,4 @@ pub mod rpc_types; mod state; mod transactions; -pub use self::{accounts::*, config::*, log::*, miner::*, state::*, transactions::*}; +pub use self::{accounts::*, compiler::*, config::*, log::*, miner::*, state::*, transactions::*}; diff --git a/crates/edr_provider/src/requests/hardhat/compiler.rs b/crates/edr_provider/src/requests/hardhat/compiler.rs new file mode 100644 index 000000000..0b7d1b28e --- /dev/null +++ b/crates/edr_provider/src/requests/hardhat/compiler.rs @@ -0,0 +1,51 @@ +use edr_solidity::{ + artifacts::{CompilerInput, CompilerOutput}, + compiler::create_models_and_decode_bytecodes, +}; + +use crate::{data::ProviderData, time::TimeSinceEpoch, ProviderError, ProviderSpec}; + +pub fn handle_add_compilation_result< + ChainSpecT: ProviderSpec, + TimerT: Clone + TimeSinceEpoch, +>( + data: &mut ProviderData, + solc_version: String, + compiler_input: CompilerInput, + compiler_output: CompilerOutput, +) -> Result> { + if let Err(error) = add_compilation_result_inner::( + data, + solc_version, + compiler_input, + compiler_output, + ) { + data.logger_mut() + .print_contract_decoding_error(&error.to_string()) + .map_err(ProviderError::Logger)?; + Ok(false) + } else { + Ok(true) + } +} + +fn add_compilation_result_inner< + ChainSpecT: ProviderSpec, + TimerT: Clone + TimeSinceEpoch, +>( + data: &mut ProviderData, + solc_version: String, + compiler_input: CompilerInput, + compiler_output: CompilerOutput, +) -> Result<(), ProviderError> { + let contracts = + create_models_and_decode_bytecodes(solc_version, &compiler_input, &compiler_output) + .map_err(|err| ProviderError::SolcDecoding(err.to_string()))?; + + let contract_decoder = data.contract_decoder(); + for contract in contracts { + contract_decoder.add_contract_metadata(contract); + } + + Ok(()) +} diff --git a/crates/edr_provider/src/requests/hardhat/rpc_types.rs b/crates/edr_provider/src/requests/hardhat/rpc_types.rs index 84cbc30fa..6e69e3bf0 100644 --- a/crates/edr_provider/src/requests/hardhat/rpc_types.rs +++ b/crates/edr_provider/src/requests/hardhat/rpc_types.rs @@ -1,7 +1,5 @@ -mod compiler; mod config; mod metadata; -pub use compiler::{CompilerInput, CompilerInputSource, CompilerOutput, CompilerOutputContract}; pub use config::{ForkConfig, ResetProviderConfig}; pub use metadata::{ForkMetadata, Metadata}; diff --git a/crates/edr_provider/src/requests/hardhat/rpc_types/compiler.rs b/crates/edr_provider/src/requests/hardhat/rpc_types/compiler.rs deleted file mode 100644 index 843f8c831..000000000 --- a/crates/edr_provider/src/requests/hardhat/rpc_types/compiler.rs +++ /dev/null @@ -1,136 +0,0 @@ -use edr_eth::HashMap; - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct CompilerInput { - language: String, - /// maps sourceName to content: - sources: HashMap, - settings: CompilerSettings, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct CompilerInputSource { - content: String, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -struct CompilerSettings { - #[serde(rename = "viaIR")] - via_ir: Option, - optimizer: OptimizerSettings, - metadata: Option, - /// mapping: source name -> (mapping: contract name -> compiler output - /// selections) - output_selection: HashMap>>, - evm_version: Option, - /// mapping: library file name -> (mapping: library name -> library content) - libraries: Option>>, - remappings: Option>, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -struct OptimizerSettings { - runs: Option, - enabled: Option, - details: Option, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -struct OptimizerDetails { - yul_details: YulDetails, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -struct YulDetails { - optimizer_steps: String, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -struct MetadataSettings { - use_literal_content: bool, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct CompilerOutput { - /// mapping: source name -> `CompilerOutputSource` - sources: HashMap, - /// mapping: source name -> (mapping: contract name -> - /// `CompilerOutputContract`) - contracts: HashMap>, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct CompilerOutputSource { - id: usize, - ast: serde_json::Value, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct CompilerOutputContract { - abi: serde_json::Value, - evm: CompilerOutputContractEvm, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct CompilerOutputContractEvm { - bytecode: CompilerOutputBytecode, - deployed_bytecode: CompilerOutputBytecode, - /// mapping: method signature -> method identifier - method_identifiers: HashMap, -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct CompilerOutputBytecode { - object: String, - opcodes: String, - source_map: String, - /// mapping: source name -> (mapping: library name -> `LinkReferences`) - link_references: HashMap>>, -} - -pub mod u64_that_must_be_20 { - pub fn serialize(val: &u64, s: S) -> Result - where - S: serde::Serializer, - { - if *val == 20 { - s.serialize_u64(*val) - } else { - use serde::ser::Error; - Err(S::Error::custom("value must be 20")) - } - } - - pub fn deserialize<'de, D>(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - let s: u64 = serde::de::Deserialize::deserialize(deserializer)?; - if s == 20 { - Ok(s) - } else { - use serde::de::Error; - Err(D::Error::custom("value must be 20")) - } - } -} - -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct LinkReference { - start: usize, - #[serde(with = "u64_that_must_be_20")] - length: u64, -} diff --git a/crates/edr_provider/src/requests/methods.rs b/crates/edr_provider/src/requests/methods.rs index 77134c546..cc736d0f4 100644 --- a/crates/edr_provider/src/requests/methods.rs +++ b/crates/edr_provider/src/requests/methods.rs @@ -6,13 +6,11 @@ use edr_eth::{ Address, BlockSpec, Bytes, PreEip1898BlockSpec, B256, U256, U64, }; use edr_rpc_eth::{spec::RpcSpec, StateOverrideOptions}; +use edr_solidity::artifacts::{CompilerInput, CompilerOutput}; use serde::{Deserialize, Serialize}; use super::serde::{RpcAddress, Timestamp}; -use crate::requests::{ - debug::DebugTraceConfig, - hardhat::rpc_types::{CompilerInput, CompilerOutput, ResetProviderConfig}, -}; +use crate::requests::{debug::DebugTraceConfig, hardhat::rpc_types::ResetProviderConfig}; mod optional_block_spec { use super::BlockSpec; @@ -304,7 +302,7 @@ pub enum MethodInvocation { AddCompilationResult( /// solc version: String, - CompilerInput, + Box, CompilerOutput, ), /// `hardhat_dropTransaction` @@ -313,12 +311,6 @@ pub enum MethodInvocation { /// `hardhat_getAutomine` #[serde(rename = "hardhat_getAutomine", with = "edr_eth::serde::empty_params")] GetAutomine(()), - /// `hardhat_getStackTraceFailuresCount` - #[serde( - rename = "hardhat_getStackTraceFailuresCount", - with = "edr_eth::serde::empty_params" - )] - GetStackTraceFailuresCount(()), /// `hardhat_impersonateAccount` #[serde( rename = "hardhat_impersonateAccount", @@ -479,7 +471,6 @@ impl MethodInvocation { MethodInvocation::AddCompilationResult(_, _, _) => "hardhat_addCompilationResult", MethodInvocation::DropTransaction(_) => "hardhat_dropTransaction", MethodInvocation::GetAutomine(_) => "hardhat_getAutomine", - MethodInvocation::GetStackTraceFailuresCount(_) => "hardhat_getStackTraceFailuresCount", MethodInvocation::ImpersonateAccount(_) => "hardhat_impersonateAccount", MethodInvocation::IntervalMine(_) => "hardhat_intervalMine", MethodInvocation::Metadata(_) => "hardhat_metadata", diff --git a/crates/edr_provider/src/test_utils.rs b/crates/edr_provider/src/test_utils.rs index e9fcf4f4a..043d150e7 100644 --- a/crates/edr_provider/src/test_utils.rs +++ b/crates/edr_provider/src/test_utils.rs @@ -1,5 +1,5 @@ use core::fmt::Debug; -use std::{num::NonZeroU64, time::SystemTime}; +use std::{num::NonZeroU64, sync::Arc, time::SystemTime}; use anyhow::anyhow; use edr_eth::{ @@ -15,6 +15,7 @@ use edr_eth::{ }; use edr_evm::Block as _; use edr_rpc_eth::TransactionRequest; +use edr_solidity::contract_decoder::ContractDecoder; use tokio::runtime; use crate::{ @@ -210,6 +211,7 @@ impl> ProviderTestFixture::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/eip4844.rs b/crates/edr_provider/tests/integration/eip4844.rs index ca08d4ccf..1544309dd 100644 --- a/crates/edr_provider/tests/integration/eip4844.rs +++ b/crates/edr_provider/tests/integration/eip4844.rs @@ -1,6 +1,6 @@ #![cfg(feature = "test-utils")] -use std::str::FromStr; +use std::{str::FromStr, sync::Arc}; use edr_defaults::SECRET_KEYS; use edr_eth::{ @@ -21,6 +21,7 @@ use edr_provider::{ MethodInvocation, NoopLogger, Provider, ProviderError, ProviderRequest, }; use edr_rpc_eth::{CallRequest, TransactionRequest}; +use edr_solidity::contract_decoder::ContractDecoder; use tokio::runtime; /// Helper struct to modify the pooled transaction from the value in @@ -225,6 +226,7 @@ async fn call_unsupported() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; @@ -256,6 +258,7 @@ async fn estimate_gas_unsupported() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; @@ -287,6 +290,7 @@ async fn send_transaction_unsupported() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; @@ -331,6 +335,7 @@ async fn send_raw_transaction() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; @@ -371,6 +376,7 @@ async fn get_transaction() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; @@ -419,6 +425,7 @@ async fn block_header() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; @@ -606,6 +613,7 @@ async fn blob_hash_opcode() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/eth_max_priority_fee_per_gas.rs b/crates/edr_provider/tests/integration/eth_max_priority_fee_per_gas.rs index de0c31382..a419af406 100644 --- a/crates/edr_provider/tests/integration/eth_max_priority_fee_per_gas.rs +++ b/crates/edr_provider/tests/integration/eth_max_priority_fee_per_gas.rs @@ -1,10 +1,13 @@ #![cfg(feature = "test-utils")] +use std::sync::Arc; + use edr_eth::l1::L1ChainSpec; use edr_provider::{ test_utils::create_test_config, time::CurrentTime, MethodInvocation, NoopLogger, Provider, ProviderRequest, }; +use edr_solidity::contract_decoder::ContractDecoder; use tokio::runtime; #[tokio::test(flavor = "multi_thread")] @@ -17,6 +20,7 @@ async fn eth_max_priority_fee_per_gas() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/hardhat_request_serialization.rs b/crates/edr_provider/tests/integration/hardhat_request_serialization.rs index 78df9c494..3b114790f 100644 --- a/crates/edr_provider/tests/integration/hardhat_request_serialization.rs +++ b/crates/edr_provider/tests/integration/hardhat_request_serialization.rs @@ -1,8 +1,9 @@ use edr_eth::{l1::L1ChainSpec, Address, Bytes, B256, U160, U256}; use edr_provider::{ - hardhat_rpc_types::{CompilerInput, CompilerOutput, ForkConfig, ResetProviderConfig}, + hardhat_rpc_types::{ForkConfig, ResetProviderConfig}, MethodInvocation, }; +use edr_solidity::artifacts::{CompilerInput, CompilerOutput}; use crate::common::help_test_method_invocation_serde; @@ -14,7 +15,7 @@ fn serde_hardhat_compiler() { let call = MethodInvocation::::AddCompilationResult( String::from("0.8.0"), - serde_json::from_str::(compiler_input_json).unwrap(), + Box::new(serde_json::from_str::(compiler_input_json).unwrap()), serde_json::from_str::(compiler_output_json).unwrap(), ); @@ -53,13 +54,6 @@ fn serde_hardhat_get_automine() { help_test_method_invocation_serde(MethodInvocation::::GetAutomine(())); } -#[test] -fn serde_hardhat_get_stack_trace_failures_count() { - help_test_method_invocation_serde(MethodInvocation::::GetStackTraceFailuresCount( - (), - )); -} - #[test] fn serde_hardhat_impersonate_account() { help_test_method_invocation_serde(MethodInvocation::::ImpersonateAccount( diff --git a/crates/edr_provider/tests/integration/issues/issue_324.rs b/crates/edr_provider/tests/integration/issues/issue_324.rs index c639bf493..3a6442809 100644 --- a/crates/edr_provider/tests/integration/issues/issue_324.rs +++ b/crates/edr_provider/tests/integration/issues/issue_324.rs @@ -1,4 +1,4 @@ -use std::str::FromStr; +use std::{str::FromStr, sync::Arc}; use edr_eth::{ l1::{self, L1ChainSpec}, @@ -9,6 +9,7 @@ use edr_provider::{ MethodInvocation, NoopLogger, Provider, ProviderRequest, }; use edr_rpc_eth::CallRequest; +use edr_solidity::contract_decoder::ContractDecoder; use edr_test_utils::env::get_alchemy_url; use tokio::runtime; @@ -38,6 +39,7 @@ async fn issue_324() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/issues/issue_325.rs b/crates/edr_provider/tests/integration/issues/issue_325.rs index 5879405f1..ff60d0d74 100644 --- a/crates/edr_provider/tests/integration/issues/issue_325.rs +++ b/crates/edr_provider/tests/integration/issues/issue_325.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use edr_eth::{ account::AccountInfo, l1::{self, L1ChainSpec}, @@ -9,6 +11,7 @@ use edr_provider::{ MethodInvocation, MiningConfig, NoopLogger, Provider, ProviderRequest, }; use edr_rpc_eth::TransactionRequest; +use edr_solidity::contract_decoder::ContractDecoder; use tokio::runtime; #[tokio::test(flavor = "multi_thread")] @@ -40,6 +43,7 @@ async fn issue_325() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/issues/issue_326.rs b/crates/edr_provider/tests/integration/issues/issue_326.rs index f9ae0ddff..6c1a48606 100644 --- a/crates/edr_provider/tests/integration/issues/issue_326.rs +++ b/crates/edr_provider/tests/integration/issues/issue_326.rs @@ -1,4 +1,4 @@ -use std::str::FromStr; +use std::{str::FromStr, sync::Arc}; use edr_eth::{ account::AccountInfo, @@ -11,6 +11,7 @@ use edr_provider::{ MethodInvocation, MiningConfig, NoopLogger, Provider, ProviderRequest, }; use edr_rpc_eth::{CallRequest, TransactionRequest}; +use edr_solidity::contract_decoder::ContractDecoder; use tokio::runtime; #[tokio::test(flavor = "multi_thread")] @@ -43,6 +44,7 @@ async fn issue_326() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/issues/issue_346.rs b/crates/edr_provider/tests/integration/issues/issue_346.rs index 2c5627d0a..70d45c680 100644 --- a/crates/edr_provider/tests/integration/issues/issue_346.rs +++ b/crates/edr_provider/tests/integration/issues/issue_346.rs @@ -1,5 +1,8 @@ +use std::sync::Arc; + use edr_eth::l1::L1ChainSpec; use edr_provider::{test_utils::create_test_config, time::CurrentTime, NoopLogger, Provider}; +use edr_solidity::contract_decoder::ContractDecoder; use serde_json::json; use tokio::runtime; @@ -14,6 +17,7 @@ async fn issue_346() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/issues/issue_356.rs b/crates/edr_provider/tests/integration/issues/issue_356.rs index 104a7a850..2cb2c8932 100644 --- a/crates/edr_provider/tests/integration/issues/issue_356.rs +++ b/crates/edr_provider/tests/integration/issues/issue_356.rs @@ -1,4 +1,4 @@ -use std::str::FromStr; +use std::{str::FromStr, sync::Arc}; use anyhow::Context; use edr_eth::{ @@ -10,6 +10,7 @@ use edr_provider::{ MethodInvocation, NoopLogger, Provider, ProviderRequest, }; use edr_rpc_eth::CallRequest; +use edr_solidity::contract_decoder::ContractDecoder; use edr_test_utils::env::get_alchemy_url; use sha3::{Digest, Keccak256}; use tokio::runtime; @@ -40,6 +41,7 @@ async fn issue_356() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/issues/issue_361.rs b/crates/edr_provider/tests/integration/issues/issue_361.rs index 1ee38bc5e..c05ef2443 100644 --- a/crates/edr_provider/tests/integration/issues/issue_361.rs +++ b/crates/edr_provider/tests/integration/issues/issue_361.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use edr_eth::{ account::AccountInfo, filter::LogFilterOptions, @@ -10,6 +12,7 @@ use edr_provider::{ MethodInvocation, NoopLogger, Provider, ProviderRequest, }; use edr_rpc_eth::TransactionRequest; +use edr_solidity::contract_decoder::ContractDecoder; use tokio::runtime; #[tokio::test(flavor = "multi_thread")] @@ -37,6 +40,7 @@ async fn issue_361() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/issues/issue_384.rs b/crates/edr_provider/tests/integration/issues/issue_384.rs index 2a51616f4..4c1ea8657 100644 --- a/crates/edr_provider/tests/integration/issues/issue_384.rs +++ b/crates/edr_provider/tests/integration/issues/issue_384.rs @@ -1,8 +1,11 @@ +use std::sync::Arc; + use edr_eth::l1::L1ChainSpec; use edr_provider::{ hardhat_rpc_types::ForkConfig, test_utils::create_test_config_with_fork, time::CurrentTime, MethodInvocation, NoopLogger, Provider, ProviderRequest, }; +use edr_solidity::contract_decoder::ContractDecoder; use edr_test_utils::env::get_infura_url; use tokio::runtime; @@ -24,6 +27,7 @@ async fn avalanche_chain_mine_local_block() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/issues/issue_407.rs b/crates/edr_provider/tests/integration/issues/issue_407.rs index 2662d978f..aef728ec3 100644 --- a/crates/edr_provider/tests/integration/issues/issue_407.rs +++ b/crates/edr_provider/tests/integration/issues/issue_407.rs @@ -1,5 +1,8 @@ +use std::sync::Arc; + use edr_eth::l1::L1ChainSpec; use edr_provider::{test_utils::create_test_config, time::CurrentTime, NoopLogger, Provider}; +use edr_solidity::contract_decoder::ContractDecoder; use serde_json::json; use tokio::runtime; @@ -15,6 +18,7 @@ async fn issue_407_uint() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; @@ -80,6 +84,7 @@ async fn issue_407_int() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/issues/issue_503.rs b/crates/edr_provider/tests/integration/issues/issue_503.rs index 8875224e9..7e613cc6b 100644 --- a/crates/edr_provider/tests/integration/issues/issue_503.rs +++ b/crates/edr_provider/tests/integration/issues/issue_503.rs @@ -1,4 +1,4 @@ -use std::str::FromStr as _; +use std::{str::FromStr as _, sync::Arc}; use edr_eth::{ l1::{self, L1ChainSpec}, @@ -8,6 +8,7 @@ use edr_provider::{ hardhat_rpc_types::ForkConfig, test_utils::create_test_config_with_fork, time::CurrentTime, MethodInvocation, NoopLogger, Provider, ProviderRequest, }; +use edr_solidity::contract_decoder::ContractDecoder; use edr_test_utils::env::get_alchemy_url; use tokio::runtime; @@ -29,6 +30,7 @@ async fn issue_503() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/issues/issue_533.rs b/crates/edr_provider/tests/integration/issues/issue_533.rs index 640aed920..99f897fbd 100644 --- a/crates/edr_provider/tests/integration/issues/issue_533.rs +++ b/crates/edr_provider/tests/integration/issues/issue_533.rs @@ -1,10 +1,11 @@ -use std::str::FromStr as _; +use std::{str::FromStr as _, sync::Arc}; use edr_eth::{l1::L1ChainSpec, B256}; use edr_provider::{ hardhat_rpc_types::ForkConfig, test_utils::create_test_config_with_fork, time::CurrentTime, MethodInvocation, NoopLogger, Provider, ProviderRequest, }; +use edr_solidity::contract_decoder::ContractDecoder; use edr_test_utils::env::get_alchemy_url; use tokio::runtime; @@ -28,6 +29,7 @@ async fn issue_533() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/issues/issue_588.rs b/crates/edr_provider/tests/integration/issues/issue_588.rs index 1d6801a99..b976f9e25 100644 --- a/crates/edr_provider/tests/integration/issues/issue_588.rs +++ b/crates/edr_provider/tests/integration/issues/issue_588.rs @@ -9,6 +9,7 @@ use edr_provider::{ hardhat_rpc_types::ForkConfig, test_utils::create_test_config_with_fork, time::MockTime, NoopLogger, Provider, }; +use edr_solidity::contract_decoder::ContractDecoder; use edr_test_utils::env::get_alchemy_url; use tokio::runtime; @@ -30,6 +31,7 @@ async fn issue_588() -> anyhow::Result<()> { logger, subscriber, early_mainnet_fork, + Arc::::default(), current_time_is_1970, )?; diff --git a/crates/edr_provider/tests/integration/rip7212.rs b/crates/edr_provider/tests/integration/rip7212.rs index 2e9cb1e58..2b14fdc0f 100644 --- a/crates/edr_provider/tests/integration/rip7212.rs +++ b/crates/edr_provider/tests/integration/rip7212.rs @@ -1,11 +1,14 @@ #![cfg(feature = "test-utils")] +use std::sync::Arc; + use edr_eth::{bytes, l1::L1ChainSpec, Bytes}; use edr_provider::{ test_utils::create_test_config, time::CurrentTime, MethodInvocation, NoopLogger, Provider, ProviderRequest, }; use edr_rpc_eth::CallRequest; +use edr_solidity::contract_decoder::ContractDecoder; use revm_precompile::secp256r1; use tokio::runtime; @@ -25,6 +28,7 @@ async fn rip7212_disabled() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; @@ -55,6 +59,7 @@ async fn rip7212_enabled() -> anyhow::Result<()> { logger, subscriber, config, + Arc::::default(), CurrentTime, )?; diff --git a/crates/edr_provider/tests/integration/timestamp.rs b/crates/edr_provider/tests/integration/timestamp.rs index e20d69ef0..def60251d 100644 --- a/crates/edr_provider/tests/integration/timestamp.rs +++ b/crates/edr_provider/tests/integration/timestamp.rs @@ -8,6 +8,7 @@ use edr_provider::{ time::{MockTime, TimeSinceEpoch}, MethodInvocation, NoopLogger, Provider, ProviderRequest, Timestamp, }; +use edr_solidity::contract_decoder::ContractDecoder; use tokio::runtime; struct TimestampFixture { @@ -30,6 +31,7 @@ impl TimestampFixture { logger, subscription_callback_noop, config.clone(), + Arc::::default(), mock_timer.clone(), )?; diff --git a/crates/edr_solidity/Cargo.toml b/crates/edr_solidity/Cargo.toml index 7d87600b3..27dfb9da0 100644 --- a/crates/edr_solidity/Cargo.toml +++ b/crates/edr_solidity/Cargo.toml @@ -5,14 +5,19 @@ edition = "2021" [dependencies] anyhow = { version = "1.0.75", default-features = false } -alloy-dyn-abi = { version = "0.7.6", default-features = false } +alloy-dyn-abi = { version = "0.7.6", default-features = false, features = ["eip712", "std"] } alloy-json-abi = { version = "0.7.4", default-features = false } +alloy-sol-types = { version = "0.7.4", default-features = false, features = ["std"] } +derive-where = { version = "1.2.7", default-features = false } edr_eth = { version = "0.3.5", path = "../edr_eth" } edr_evm = { version = "0.3.5", path = "../edr_evm" } indexmap = { version = "2", features = ["serde"] } +parking_lot = { version = "0.12.1", default-features = false } serde = { version = "1.0.158", default-features = false, features = ["std"] } serde_json = { version = "1.0.89", features = ["preserve_order"] } strum = { version = "0.26.0", features = ["derive"] } +semver = "1.0.23" +thiserror = "1.0.58" [lints] workspace = true diff --git a/crates/edr_solidity/src/artifacts.rs b/crates/edr_solidity/src/artifacts.rs index d3370e1f7..f2e5c8284 100644 --- a/crates/edr_solidity/src/artifacts.rs +++ b/crates/edr_solidity/src/artifacts.rs @@ -12,7 +12,7 @@ use serde::{Deserialize, Serialize}; /// A `BuildInfo` is a file that contains all the information of a solc run. It /// includes all the necessary information to recreate that exact same run, and /// all of its output. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct BuildInfo { #[serde(rename = "_format")] @@ -25,17 +25,17 @@ pub struct BuildInfo { } /// References: of source name -> library name -> link references. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct LinkReferences(HashMap>>); /// The source code of a contract. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct Source { pub content: String, } /// The main input to the Solidity compiler. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct CompilerInput { pub language: String, pub sources: HashMap, @@ -43,7 +43,7 @@ pub struct CompilerInput { } /// Additional settings like the optimizer, metadata, etc. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct CompilerSettings { #[serde(rename = "viaIR")] @@ -57,7 +57,7 @@ pub struct CompilerSettings { } /// Specifies the optimizer settings. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct OptimizerSettings { runs: Option, enabled: Option, @@ -65,28 +65,28 @@ pub struct OptimizerSettings { } /// Specifies the optimizer details. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct OptimizerDetails { yul_details: Option, } /// Yul-specific optimizer details. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct YulDetails { optimizer_steps: Option, } /// Specifies the metadata settings. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct MetadataSettings { use_literal_content: Option, } /// The main output of the Solidity compiler. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct CompilerOutput { // Retain the order of the sources as emitted by the compiler. // Our post processing relies on this order to build the codebase model. @@ -95,13 +95,13 @@ pub struct CompilerOutput { } /// The output of a contract compilation. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct CompilerOutputContract { pub abi: Vec, pub evm: CompilerOutputEvm, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct ContractAbiEntry { pub name: Option, pub r#type: Option, @@ -109,7 +109,7 @@ pub struct ContractAbiEntry { } /// The EVM-specific output of a contract compilation. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct CompilerOutputEvm { pub bytecode: CompilerOutputBytecode, @@ -118,14 +118,14 @@ pub struct CompilerOutputEvm { } /// The ID and the AST of the compiled sources. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct CompilerOutputSource { pub id: u32, pub ast: serde_json::Value, } /// The bytecode output for a given compiled contract. -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct CompilerOutputBytecode { pub object: String, @@ -136,14 +136,14 @@ pub struct CompilerOutputBytecode { } /// A reference to a library. -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct LinkReference { pub start: u32, pub length: u32, } /// A reference to an immutable value. -#[derive(Debug, Clone, Copy, Deserialize, Serialize)] +#[derive(Clone, Debug, Copy, PartialEq, Eq, Deserialize, Serialize)] pub struct ImmutableReference { pub start: u32, pub length: u32, diff --git a/crates/edr_solidity/src/build_model.rs b/crates/edr_solidity/src/build_model.rs index 0548117ff..2757bfbdf 100644 --- a/crates/edr_solidity/src/build_model.rs +++ b/crates/edr_solidity/src/build_model.rs @@ -7,19 +7,18 @@ //! - related contract and free [`ContractFunction`]s and their name, location //! and parameters //! - related [`CustomError`]s and their name, location and parameters -//! - the resolved [`Bytecode`] of the contract +//! - the resolved [`ContractMetadata`] of the contract //! - related resolved [`Instruction`]s and their location use std::{ - cell::{OnceCell, RefCell}, collections::HashMap, - rc::{Rc, Weak}, + sync::{Arc, OnceLock, Weak}, }; use alloy_dyn_abi::ErrorExt; -use anyhow::{self, Context as _}; use edr_eth::{bytecode::opcode::OpCode, hex}; use indexmap::IndexMap; +use parking_lot::RwLock; use serde::Serialize; use serde_json::Value; @@ -28,20 +27,22 @@ use crate::artifacts::{ContractAbiEntry, ImmutableReference}; /// A resolved build model from a Solidity compiler standard JSON output. #[derive(Debug, Default)] pub struct BuildModel { + // TODO https://github.com/NomicFoundation/edr/issues/759 /// Maps the contract ID to the contract. - pub contract_id_to_contract: IndexMap>>, + pub contract_id_to_contract: IndexMap>>, /// Maps the file ID to the source file. - pub file_id_to_source_file: Rc, + pub file_id_to_source_file: Arc, } +// TODO https://github.com/NomicFoundation/edr/issues/759 /// Type alias for the source file mapping used by [`BuildModel`]. -pub type BuildModelSources = HashMap>>; +pub type BuildModelSources = HashMap>>; /// A source file. #[derive(Debug)] pub struct SourceFile { // Referenced because it can be later updated by outside code - functions: Vec>, + functions: Vec>, /// The name of the source file. pub source_name: String, @@ -63,7 +64,7 @@ impl SourceFile { /// Adds a [`ContractFunction`] to the source file. /// # Note /// Should only be called when resolving the source model. - pub fn add_function(&mut self, contract_function: Rc) { + pub fn add_function(&mut self, contract_function: Arc) { self.functions.push(contract_function); } @@ -72,7 +73,7 @@ impl SourceFile { pub fn get_containing_function( &self, location: &SourceLocation, - ) -> Option<&Rc> { + ) -> Option<&Arc> { self.functions .iter() .find(|func| func.location.contains(location)) @@ -87,7 +88,7 @@ impl SourceFile { /// we can no longer access it through this reference. pub struct SourceLocation { /// Cached 1-based line number of the source location. - line: OnceCell, + line: OnceLock, /// A weak reference to the source files mapping. /// /// Used to access the source file when needed. @@ -113,17 +114,17 @@ impl SourceLocation { /// Creates a new [`SourceLocation`] with the provided file ID, offset, and /// length. pub fn new( - sources: Rc, + sources: Arc, file_id: u32, offset: u32, length: u32, ) -> SourceLocation { SourceLocation { - line: OnceCell::new(), + line: OnceLock::new(), // We need to break the cycle between SourceLocation and SourceFile // (via ContractFunction); the Bytecode struct is owning the build // model sources, so we should always be alive. - sources: Rc::downgrade(&sources), + sources: Arc::downgrade(&sources), file_id, offset, length, @@ -134,8 +135,8 @@ impl SourceLocation { /// # Panics /// This function panics if the source location is dangling, i.e. source /// files mapping has been dropped (currently only owned by the - /// [`Bytecode`]). - pub fn file(&self) -> Rc> { + /// [`ContractMetadata`]). + pub fn file(&self) -> Arc> { match self.sources.upgrade() { Some(ref sources) => sources.get(&self.file_id).unwrap().clone(), None => panic!("dangling SourceLocation; did you drop the owning Bytecode?"), @@ -149,7 +150,7 @@ impl SourceLocation { } let file = self.file(); - let contents = &file.borrow().content; + let contents = &file.read().content; *self.line.get_or_init(move || { let mut line = 1; @@ -165,9 +166,9 @@ impl SourceLocation { } /// Returns the [`ContractFunction`] that contains the source location. - pub fn get_containing_function(&self) -> Option> { + pub fn get_containing_function(&self) -> Option> { let file = self.file(); - let file = file.borrow(); + let file = file.read(); file.get_containing_function(self).cloned() } @@ -217,7 +218,7 @@ pub struct ContractFunction { /// The type of the contract function. pub r#type: ContractFunctionType, /// The source location of the contract function. - pub location: Rc, + pub location: Arc, /// The name of the contract that contains the contract function. pub contract_name: Option, /// The visibility of the contract function. @@ -226,7 +227,7 @@ pub struct ContractFunction { pub is_payable: Option, /// The selector of the contract function. /// May be fixed up by [`Contract::correct_selector`]. - pub selector: RefCell>>, + pub selector: RwLock>>, /// JSON ABI parameter types of the contract function. pub param_types: Option>, } @@ -295,7 +296,7 @@ impl CustomError { } /// A decoded EVM instruction. -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct Instruction { /// The program counter (PC) of the instruction in a bytecode. pub pc: u32, @@ -306,7 +307,7 @@ pub struct Instruction { /// The push data of the instruction, if it's a `PUSHx` instruction. pub push_data: Option>, /// The source location of the instruction, if any. - pub location: Option>, + pub location: Option>, } /// The type of a jump. @@ -322,16 +323,28 @@ pub enum JumpType { InternalJump, } +/// A [`ContractMetadata`] error. +#[derive(Clone, Debug, thiserror::Error)] +pub enum ContractMetadataError { + /// The instruction was not found at the provided program counter (PC). + #[error("Instruction not found at PC {pc}")] + InstructionNotFound { + /// The program counter (PC) of the instruction. + pc: u32, + }, +} + /// A resolved bytecode. #[derive(Debug)] -pub struct Bytecode { +pub struct ContractMetadata { pc_to_instruction: HashMap, // This owns the source files transitively used by the source locations // in the Instruction structs. - _sources: Rc, + _sources: Arc, + // TODO https://github.com/NomicFoundation/edr/issues/759 /// Contract that the bytecode belongs to. - pub contract: Rc>, + pub contract: Arc>, /// Whether the bytecode is a deployment bytecode. pub is_deployment: bool, /// Normalized code of the bytecode, i.e. replaced with zeroes for the @@ -345,25 +358,25 @@ pub struct Bytecode { pub compiler_version: String, } -impl Bytecode { - /// Creates a new [`Bytecode`] with the provided arguments. +impl ContractMetadata { + /// Creates a new [`ContractMetadata`] with the provided arguments. #[allow(clippy::too_many_arguments)] pub fn new( - sources: Rc, - contract: Rc>, + sources: Arc, + contract: Arc>, is_deployment: bool, normalized_code: Vec, instructions: Vec, library_address_positions: Vec, immutable_references: Vec, compiler_version: String, - ) -> Bytecode { + ) -> ContractMetadata { let mut pc_to_instruction = HashMap::new(); for inst in instructions { pc_to_instruction.insert(inst.pc, inst); } - Bytecode { + ContractMetadata { pc_to_instruction, _sources: sources, contract, @@ -376,10 +389,19 @@ impl Bytecode { } /// Returns the [`Instruction`] at the provided program counter (PC). - pub fn get_instruction(&self, pc: u32) -> anyhow::Result<&Instruction> { + pub fn get_instruction(&self, pc: u32) -> Result<&Instruction, ContractMetadataError> { self.pc_to_instruction .get(&pc) - .with_context(|| format!("Instruction at PC {pc} not found")) + .ok_or(ContractMetadataError::InstructionNotFound { pc }) + } + + /// Returns the [`Instruction`] at the provided program counter (PC). The + /// error type is `anyhow::Error` which can be converted to + /// `napi::Error` automatically. Usage of this method is deprecated and + /// call sites in `edr_napi` will be removed. + #[deprecated = "Use `get_instruction` instead"] + pub fn get_instruction_napi(&self, pc: u32) -> anyhow::Result<&Instruction> { + self.get_instruction(pc).map_err(anyhow::Error::from) } /// Whether the bytecode has an instruction at the provided program counter @@ -405,21 +427,21 @@ pub struct Contract { /// Custom errors defined in the contract. pub custom_errors: Vec, /// The constructor function of the contract. - pub constructor: Option>, + pub constructor: Option>, /// The fallback function of the contract. - pub fallback: Option>, + pub fallback: Option>, /// The receive function of the contract. - pub receive: Option>, + pub receive: Option>, - local_functions: Vec>, - selector_hex_to_function: HashMap>, + local_functions: Vec>, + selector_hex_to_function: HashMap>, /// The contract's name. pub name: String, /// The contract's kind, i.e. contract or library. pub r#type: ContractKind, /// The source location of the contract. - pub location: Rc, + pub location: Arc, } impl Contract { @@ -427,7 +449,7 @@ impl Contract { pub fn new( name: String, contract_type: ContractKind, - location: Rc, + location: Arc, ) -> Contract { Contract { custom_errors: Vec::new(), @@ -445,16 +467,14 @@ impl Contract { /// Adds a local function to the contract. /// # Note /// Should only be called when resolving the source model. - pub fn add_local_function(&mut self, func: Rc) { + pub fn add_local_function(&mut self, func: Arc) { if matches!( func.visibility, Some(ContractFunctionVisibility::Public | ContractFunctionVisibility::External) ) { match func.r#type { ContractFunctionType::Function | ContractFunctionType::Getter => { - let selector = func.selector.try_borrow().expect( - "Function selector to be corrected later after creating the source model", - ); + let selector = func.selector.read(); // The original code unwrapped here let selector = selector.as_ref().unwrap(); let selector = hex::encode(selector); @@ -513,10 +533,9 @@ impl Contract { let selector = base_contract_function .selector - .try_borrow() - .expect("Function selector to be corrected later after creating the source model") + .read() .clone() - .unwrap(); + .expect("selector exists"); let selector_hex = hex::encode(&*selector); self.selector_hex_to_function @@ -526,7 +545,7 @@ impl Contract { } /// Looks up the local [`ContractFunction`] with the provided selector. - pub fn get_function_from_selector(&self, selector: &[u8]) -> Option<&Rc> { + pub fn get_function_from_selector(&self, selector: &[u8]) -> Option<&Arc> { let selector_hex = hex::encode(selector); self.selector_hex_to_function.get(&selector_hex) @@ -558,10 +577,7 @@ impl Contract { }; { - let mut selector_to_be_corrected = function_to_correct - .selector - .try_borrow_mut() - .expect("Function selector to only be corrected after creating the source model"); + let mut selector_to_be_corrected = function_to_correct.selector.write(); if let Some(selector) = &*selector_to_be_corrected { let selector_hex = hex::encode(selector); self.selector_hex_to_function.remove(&selector_hex); diff --git a/crates/edr_solidity/src/compiler.rs b/crates/edr_solidity/src/compiler.rs index 1ee257fee..b7f37237d 100644 --- a/crates/edr_solidity/src/compiler.rs +++ b/crates/edr_solidity/src/compiler.rs @@ -2,17 +2,19 @@ //! creates the source model used to perform the stack trace decoding. //! //! [^1]: See . -use std::{cell::RefCell, collections::HashMap, rc::Rc, str::FromStr}; +use std::{collections::HashMap, str::FromStr, sync::Arc}; use anyhow::{self, Context as _}; use edr_eth::{hex, keccak256}; use indexmap::IndexMap; +use parking_lot::RwLock; use crate::{ artifacts::{CompilerInput, CompilerOutput, CompilerOutputBytecode, ContractAbiEntry}, build_model::{ - BuildModel, BuildModelSources, Bytecode, Contract, ContractFunction, ContractFunctionType, - ContractFunctionVisibility, ContractKind, CustomError, SourceFile, SourceLocation, + BuildModel, BuildModelSources, Contract, ContractFunction, ContractFunctionType, + ContractFunctionVisibility, ContractKind, ContractMetadata, CustomError, SourceFile, + SourceLocation, }, library_utils::{get_library_address_positions, normalize_compiler_output_bytecode}, source_map::decode_instructions, @@ -27,9 +29,9 @@ pub fn create_models_and_decode_bytecodes( solc_version: String, compiler_input: &CompilerInput, compiler_output: &CompilerOutput, -) -> anyhow::Result> { +) -> anyhow::Result> { let build_model = create_sources_model_from_ast(compiler_output, compiler_input)?; - let build_model = Rc::new(build_model); + let build_model = Arc::new(build_model); let bytecodes = decode_bytecodes(solc_version, compiler_output, &build_model)?; @@ -44,7 +46,7 @@ fn create_sources_model_from_ast( ) -> anyhow::Result { // First, collect and store all the files to be able to resolve the source // locations - let sources: Rc> = Rc::new( + let sources: Arc> = Arc::new( compiler_output .sources .iter() @@ -53,7 +55,7 @@ fn create_sources_model_from_ast( source_name.clone(), compiler_input.sources[source_name].content.clone(), ); - let file = Rc::new(RefCell::new(file)); + let file = Arc::new(RwLock::new(file)); (source.id, file.clone()) }) .collect(), @@ -118,11 +120,11 @@ fn create_sources_model_from_ast( } fn apply_contracts_inheritance( - contract_id_to_contract: &IndexMap>>, + contract_id_to_contract: &IndexMap>>, contract_id_to_linearized_base_contract_ids: &HashMap>, ) { for (cid, contract) in contract_id_to_contract { - let mut contract = contract.borrow_mut(); + let mut contract = contract.write(); let inheritance_ids = &contract_id_to_linearized_base_contract_ids[cid]; @@ -136,7 +138,7 @@ fn apply_contracts_inheritance( }; if cid != base_id { - let base_contract = &base_contract.borrow(); + let base_contract = &base_contract.read(); contract.add_next_linearized_base_contract(base_contract); } } @@ -144,13 +146,13 @@ fn apply_contracts_inheritance( } fn process_contract_ast_node( - file: &RefCell, + file: &RwLock, contract_node: &serde_json::Value, contract_type: ContractKind, - sources: &Rc, + sources: &Arc, contract_id_to_linearized_base_contract_ids: &mut HashMap>, contract_abi: Option<&[ContractAbiEntry]>, -) -> anyhow::Result<(u32, Rc>)> { +) -> anyhow::Result<(u32, Arc>)> { let contract_location = ast_src_to_source_location(contract_node["src"].as_str().unwrap(), sources)? .expect("The original JS code always asserts that"); @@ -160,7 +162,7 @@ fn process_contract_ast_node( contract_type, contract_location, ); - let contract = Rc::new(RefCell::new(contract)); + let contract = Arc::new(RwLock::new(contract)); let contract_id = contract_node["id"].as_u64().unwrap() as u32; @@ -213,9 +215,9 @@ fn process_contract_ast_node( fn process_function_definition_ast_node( node: &serde_json::Value, - sources: &Rc, - contract: Option<&RefCell>, - file: &RefCell, + sources: &Arc, + contract: Option<&RwLock>, + file: &RwLock, function_abis: Option>, ) -> anyhow::Result<()> { if node.get("implemented").and_then(serde_json::Value::as_bool) == Some(false) { @@ -278,20 +280,17 @@ fn process_function_definition_ast_node( name: node["name"].as_str().unwrap().to_string(), r#type: function_type, location: function_location, - contract_name: contract - .as_ref() - .map(|c| c.borrow()) - .map(|c| c.name.clone()), + contract_name: contract.as_ref().map(|c| c.read()).map(|c| c.name.clone()), visibility: Some(visibility), is_payable: Some(node["stateMutability"].as_str().unwrap() == "payable"), - selector: RefCell::new(selector), + selector: RwLock::new(selector), param_types, }; - let contract_func = Rc::new(contract_func); + let contract_func = Arc::new(contract_func); - file.borrow_mut().add_function(contract_func.clone()); + file.write().add_function(contract_func.clone()); if let Some(contract) = contract { - contract.borrow_mut().add_local_function(contract_func); + contract.write().add_local_function(contract_func); } Ok(()) @@ -299,9 +298,9 @@ fn process_function_definition_ast_node( fn process_modifier_definition_ast_node( node: &serde_json::Value, - sources: &Rc, - contract: &RefCell, - file: &RefCell, + sources: &Arc, + contract: &RwLock, + file: &RwLock, ) -> anyhow::Result<()> { let function_location = ast_src_to_source_location(node["src"].as_str().unwrap(), sources)? .expect("The original JS code always asserts that"); @@ -310,26 +309,26 @@ fn process_modifier_definition_ast_node( name: node["name"].as_str().unwrap().to_string(), r#type: ContractFunctionType::Modifier, location: function_location, - contract_name: Some(contract.borrow().name.clone()), + contract_name: Some(contract.read().name.clone()), visibility: None, is_payable: None, - selector: RefCell::new(None), + selector: RwLock::new(None), param_types: None, }; - let contract_func = Rc::new(contract_func); + let contract_func = Arc::new(contract_func); - file.borrow_mut().add_function(contract_func.clone()); - contract.borrow_mut().add_local_function(contract_func); + file.write().add_function(contract_func.clone()); + contract.write().add_local_function(contract_func); Ok(()) } fn process_variable_declaration_ast_node( node: &serde_json::Value, - sources: &Rc, - contract: &RefCell, - file: &RefCell, + sources: &Arc, + contract: &RwLock, + file: &RwLock, getter_abi: Option<&ContractAbiEntry>, ) -> anyhow::Result<()> { let visibility = ast_visibility_to_visibility(node["visibility"].as_str().unwrap()); @@ -351,18 +350,18 @@ fn process_variable_declaration_ast_node( name: node["name"].as_str().unwrap().to_string(), r#type: ContractFunctionType::Getter, location: function_location, - contract_name: Some(contract.borrow().name.clone()), + contract_name: Some(contract.read().name.clone()), visibility: Some(visibility), is_payable: Some(false), // Getters aren't payable - selector: RefCell::new(Some( + selector: RwLock::new(Some( get_public_variable_selector_from_declaration_ast_node(node)?, )), param_types, }; - let contract_func = Rc::new(contract_func); + let contract_func = Arc::new(contract_func); - file.borrow_mut().add_function(contract_func.clone()); - contract.borrow_mut().add_local_function(contract_func); + file.write().add_function(contract_func.clone()); + contract.write().add_local_function(contract_func); Ok(()) } @@ -563,8 +562,8 @@ fn to_canonical_abi_type(type_: &str) -> String { fn ast_src_to_source_location( src: &str, - build_model_sources: &Rc, -) -> anyhow::Result>> { + build_model_sources: &Arc, +) -> anyhow::Result>> { let parts: Vec<&str> = src.split(':').collect(); if parts.len() != 3 { return Ok(None); @@ -584,8 +583,8 @@ fn ast_src_to_source_location( return Err(anyhow::anyhow!("Failed to find file by ID: {file_id}")); } - Ok(Some(Rc::new(SourceLocation::new( - Rc::clone(build_model_sources), + Ok(Some(Arc::new(SourceLocation::new( + Arc::clone(build_model_sources), file_id, offset, length, @@ -593,15 +592,15 @@ fn ast_src_to_source_location( } fn correct_selectors( - bytecodes: &[Bytecode], + bytecodes: &[ContractMetadata], compiler_output: &CompilerOutput, ) -> anyhow::Result<()> { for bytecode in bytecodes.iter().filter(|b| !b.is_deployment) { - let mut contract = bytecode.contract.borrow_mut(); + let mut contract = bytecode.contract.write(); // Fetch the method identifiers for the contract from the compiler output let method_identifiers = match compiler_output .contracts - .get(&contract.location.file().borrow().source_name) + .get(&contract.location.file().read().source_name) .and_then(|file| file.get(&contract.name)) .map(|contract| &contract.evm.method_identifiers) { @@ -654,12 +653,12 @@ fn abi_method_id(name: &str, param_types: Vec>) -> Vec { } fn decode_evm_bytecode( - contract: Rc>, + contract: Arc>, solc_version: String, is_deployment: bool, compiler_bytecode: &CompilerOutputBytecode, - build_model: &Rc, -) -> anyhow::Result { + build_model: &Arc, +) -> anyhow::Result { let library_address_positions = get_library_address_positions(compiler_bytecode); let immutable_references = compiler_bytecode @@ -687,8 +686,8 @@ fn decode_evm_bytecode( is_deployment, ); - Ok(Bytecode::new( - Rc::clone(&build_model.file_id_to_source_file), + Ok(ContractMetadata::new( + Arc::clone(&build_model.file_id_to_source_file), contract, is_deployment, normalized_code, @@ -702,16 +701,16 @@ fn decode_evm_bytecode( fn decode_bytecodes( solc_version: String, compiler_output: &CompilerOutput, - build_model: &Rc, -) -> anyhow::Result> { + build_model: &Arc, +) -> anyhow::Result> { let mut bytecodes = Vec::new(); for contract in build_model.contract_id_to_contract.values() { let contract_rc = contract.clone(); - let mut contract = contract.borrow_mut(); + let mut contract = contract.write(); - let contract_file = &contract.location.file().borrow().source_name.clone(); + let contract_file = &contract.location.file().read().source_name.clone(); let contract_evm_output = &compiler_output.contracts[contract_file][&contract.name].evm; let contract_abi_output = &compiler_output.contracts[contract_file][&contract.name].abi; diff --git a/crates/edr_solidity/src/contract_decoder.rs b/crates/edr_solidity/src/contract_decoder.rs new file mode 100644 index 000000000..817f5f3d5 --- /dev/null +++ b/crates/edr_solidity/src/contract_decoder.rs @@ -0,0 +1,248 @@ +//! Enriches the [`NestedTrace`] with the resolved [`ContractMetadata`]. +use std::sync::Arc; + +use edr_eth::{spec::HaltReasonTrait, Bytes}; +use parking_lot::RwLock; +use serde::{Deserialize, Serialize}; + +use super::{ + nested_trace::CreateMessage, + solidity_stack_trace::{ + FALLBACK_FUNCTION_NAME, RECEIVE_FUNCTION_NAME, UNRECOGNIZED_CONTRACT_NAME, + UNRECOGNIZED_FUNCTION_NAME, + }, +}; +use crate::{ + artifacts::BuildInfo, + build_model::{ContractFunctionType, ContractMetadata}, + compiler::create_models_and_decode_bytecodes, + contracts_identifier::ContractsIdentifier, + nested_trace::{NestedTrace, NestedTraceStep}, +}; + +/// Configuration for the [`ContractDecoder`]. +#[derive(Clone, Debug, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct BuildInfoConfig { + /// Build information to use for decoding contracts. + pub build_infos: Option>, + /// Whether to ignore contracts. + pub ignore_contracts: Option, +} + +/// Errors that can occur during the decoding of the nested trace. +#[derive(Debug, thiserror::Error)] +pub enum ContractDecoderError { + /// Errors that can occur when initializing the decoder. + #[error("{0}")] + Initialization(String), +} + +/// Get contract metadata from calldata and traces. +#[derive(Debug, Default)] +pub struct ContractDecoder { + contracts_identifier: RwLock, +} + +impl ContractDecoder { + /// Creates a new [`ContractDecoder`]. + pub fn new(config: &BuildInfoConfig) -> Result { + let contracts_identifier = initialize_contracts_identifier(config) + .map_err(|err| ContractDecoderError::Initialization(err.to_string()))?; + Ok(Self { + contracts_identifier: RwLock::new(contracts_identifier), + }) + } + + /// Adds contract metadata to the decoder. + pub fn add_contract_metadata(&self, bytecode: ContractMetadata) { + self.contracts_identifier + .write() + .add_bytecode(Arc::new(bytecode)); + } + + /// Enriches the [`NestedTrace`] with the resolved [`ContractMetadata`]. + pub fn try_to_decode_message_trace( + &self, + message_trace: NestedTrace, + ) -> NestedTrace { + match message_trace { + precompile @ NestedTrace::Precompile(..) => precompile, + // NOTE: The branches below are the same with the difference of `is_create` + NestedTrace::Call(mut call) => { + let is_create = false; + + let contract_meta = { + self.contracts_identifier + .write() + .get_bytecode_for_call(call.code.as_ref(), is_create) + }; + + let steps = call + .steps + .into_iter() + .map(|step| { + let trace = match step { + NestedTraceStep::Evm(step) => return NestedTraceStep::Evm(step), + NestedTraceStep::Precompile(precompile) => { + NestedTrace::Precompile(precompile) + } + NestedTraceStep::Create(create) => NestedTrace::Create(create), + NestedTraceStep::Call(call) => NestedTrace::Call(call), + }; + + match self.try_to_decode_message_trace(trace) { + NestedTrace::Precompile(precompile) => { + NestedTraceStep::Precompile(precompile) + } + NestedTrace::Create(create) => NestedTraceStep::Create(create), + NestedTrace::Call(call) => NestedTraceStep::Call(call), + } + }) + .collect::>(); + + call.contract_meta = contract_meta; + call.steps = steps; + + NestedTrace::Call(call) + } + NestedTrace::Create(mut create @ CreateMessage { .. }) => { + let is_create = true; + + let contract_meta = { + self.contracts_identifier + .write() + .get_bytecode_for_call(create.code.as_ref(), is_create) + }; + + let steps = create + .steps + .into_iter() + .map(|step| { + let trace = match step { + NestedTraceStep::Evm(step) => return NestedTraceStep::Evm(step), + NestedTraceStep::Precompile(precompile) => { + NestedTrace::Precompile(precompile) + } + NestedTraceStep::Create(create) => NestedTrace::Create(create), + NestedTraceStep::Call(call) => NestedTrace::Call(call), + }; + + match self.try_to_decode_message_trace(trace) { + NestedTrace::Precompile(precompile) => { + NestedTraceStep::Precompile(precompile) + } + NestedTrace::Create(create) => NestedTraceStep::Create(create), + NestedTrace::Call(call) => NestedTraceStep::Call(call), + } + }) + .collect::>(); + + create.contract_meta = contract_meta; + create.steps = steps; + + NestedTrace::Create(create) + } + } + } + + /// Returns the contract and function names for the provided calldata. + pub fn get_contract_and_function_names_for_call( + &self, + code: &Bytes, + calldata: Option<&Bytes>, + ) -> ContractAndFunctionName { + let is_create = calldata.is_none(); + let bytecode = { + self.contracts_identifier + .write() + .get_bytecode_for_call(code.as_ref(), is_create) + }; + + let contract = bytecode.map(|bytecode| bytecode.contract.clone()); + let contract = contract.as_ref().map(|c| c.read()); + + let contract_name = contract.as_ref().map_or_else( + || UNRECOGNIZED_CONTRACT_NAME.to_string(), + |c| c.name.clone(), + ); + + if is_create { + ContractAndFunctionName { + contract_name, + function_name: None, + } + } else { + match contract { + None => ContractAndFunctionName { + contract_name, + function_name: Some("".to_string()), + }, + Some(contract) => { + let calldata = match calldata { + Some(calldata) => calldata, + None => { + unreachable!("calldata should be Some if is_create is false") + } + }; + + let selector = &calldata.get(..4).unwrap_or(&calldata[..]); + + let func = contract.get_function_from_selector(selector); + + let function_name = match func { + Some(func) => match func.r#type { + ContractFunctionType::Fallback => FALLBACK_FUNCTION_NAME.to_string(), + ContractFunctionType::Receive => RECEIVE_FUNCTION_NAME.to_string(), + _ => func.name.clone(), + }, + None => UNRECOGNIZED_FUNCTION_NAME.to_string(), + }; + + ContractAndFunctionName { + contract_name, + function_name: Some(function_name), + } + } + } + } + } +} + +/// A contract and a function name in the contract. +pub struct ContractAndFunctionName { + /// The name of the contract. + pub contract_name: String, + /// The name of the function. + pub function_name: Option, +} + +fn initialize_contracts_identifier( + config: &BuildInfoConfig, +) -> anyhow::Result { + let mut contracts_identifier = ContractsIdentifier::default(); + + let Some(build_infos) = &config.build_infos else { + return Ok(contracts_identifier); + }; + + for build_info in build_infos { + let bytecodes = create_models_and_decode_bytecodes( + build_info.solc_version.clone(), + &build_info.input, + &build_info.output, + )?; + + for bytecode in bytecodes { + if config.ignore_contracts == Some(true) + && bytecode.contract.read().name.starts_with("Ignored") + { + continue; + } + + contracts_identifier.add_bytecode(Arc::new(bytecode)); + } + } + + Ok(contracts_identifier) +} diff --git a/crates/edr_solidity/src/contracts_identifier.rs b/crates/edr_solidity/src/contracts_identifier.rs index 4058308f4..6845ed4c6 100644 --- a/crates/edr_solidity/src/contracts_identifier.rs +++ b/crates/edr_solidity/src/contracts_identifier.rs @@ -5,16 +5,16 @@ //! for the libraries by zeroing out the addresses of link references, i.e. the //! addresses of the libraries or immutable references for the lookup. -use std::{borrow::Cow, collections::HashMap, rc::Rc}; +use std::{borrow::Cow, collections::HashMap, sync::Arc}; use edr_eth::{bytecode::opcode::OpCode, Address}; -use crate::build_model::Bytecode; +use crate::build_model::ContractMetadata; /// The result of searching for a bytecode in a [`BytecodeTrie`]. enum TrieSearch<'a> { /// An exact match was found. - ExactHit(Rc), + ExactHit(Arc), /// No exact match found; a node with the longest prefix is returned. LongestPrefixNode(&'a BytecodeTrie), } @@ -23,11 +23,11 @@ enum TrieSearch<'a> { /// /// What makes it special is that every node has a set of all of its descendants /// and its depth. -#[derive(Clone)] +#[derive(Debug, Clone)] struct BytecodeTrie { child_nodes: HashMap>, - descendants: Vec>, - match_: Option>, + descendants: Vec>, + match_: Option>, depth: Option, } @@ -41,7 +41,7 @@ impl BytecodeTrie { } } - fn add(&mut self, bytecode: Rc) { + fn add(&mut self, bytecode: Arc) { let mut cursor = self; let bytecode_normalized_code = &bytecode.normalized_code; @@ -115,9 +115,10 @@ fn is_matching_metadata(code: &[u8], last_byte: u32) -> bool { } /// A data structure that allows searching for well-known bytecodes. +#[derive(Debug)] pub struct ContractsIdentifier { trie: BytecodeTrie, - cache: HashMap, Rc>, + cache: HashMap, Arc>, enable_cache: bool, } @@ -140,12 +141,16 @@ impl ContractsIdentifier { } /// Adds a bytecode to the tree. - pub fn add_bytecode(&mut self, bytecode: Rc) { + pub fn add_bytecode(&mut self, bytecode: Arc) { self.trie.add(bytecode); self.cache.clear(); } - fn search_bytecode_from_root(&mut self, is_create: bool, code: &[u8]) -> Option> { + fn search_bytecode_from_root( + &mut self, + is_create: bool, + code: &[u8], + ) -> Option> { let normalize_libraries = true; let first_byte_to_search = 0; @@ -164,7 +169,7 @@ impl ContractsIdentifier { normalize_libraries: bool, trie: &BytecodeTrie, first_byte_to_search: u32, - ) -> Option> { + ) -> Option> { let search_result = match trie.search(code, first_byte_to_search) { None => return None, Some(TrieSearch::ExactHit(bytecode)) => return Some(bytecode.clone()), @@ -256,7 +261,11 @@ impl ContractsIdentifier { } /// Searches for a bytecode that matches the given (call/create) code. - pub fn get_bytecode_for_call(&mut self, code: &[u8], is_create: bool) -> Option> { + pub fn get_bytecode_for_call( + &mut self, + code: &[u8], + is_create: bool, + ) -> Option> { let normalized_code = normalize_library_runtime_bytecode_if_necessary(code); if self.enable_cache { @@ -299,7 +308,9 @@ fn normalize_library_runtime_bytecode_if_necessary(bytecode: &[u8]) -> Cow<'_, [ #[cfg(test)] mod tests { - use std::{cell::RefCell, vec}; + use std::vec; + + use parking_lot::RwLock; use super::*; use crate::{ @@ -307,31 +318,31 @@ mod tests { build_model::{Contract, ContractKind, SourceFile, SourceLocation}, }; - fn create_sources() -> Rc>>> { + fn create_sources() -> Arc>>> { let mut sources = HashMap::new(); - let file = Rc::new(RefCell::new(SourceFile::new( + let file = Arc::new(RwLock::new(SourceFile::new( "test.sol".to_string(), "".to_string(), ))); sources.insert(0, file.clone()); - Rc::new(sources) + Arc::new(sources) } - fn create_test_contract() -> Rc> { + fn create_test_contract() -> Arc> { let sources = create_sources(); - let location = Rc::new(SourceLocation::new(sources.clone(), 0, 0, 0)); + let location = Arc::new(SourceLocation::new(sources.clone(), 0, 0, 0)); - Rc::new(RefCell::new(Contract::new( + Arc::new(RwLock::new(Contract::new( "TestContract".to_string(), ContractKind::Contract, location, ))) } - fn create_test_bytecode(normalized_code: Vec) -> Rc { + fn create_test_bytecode(normalized_code: Vec) -> Arc { let sources = create_sources(); let contract = create_test_contract(); let is_deployment = false; @@ -340,7 +351,7 @@ mod tests { let library_offsets = vec![]; let immutable_references = vec![]; - Rc::new(Bytecode::new( + Arc::new(ContractMetadata::new( sources, contract, is_deployment, @@ -352,7 +363,7 @@ mod tests { )) } - fn create_test_deployment_bytecode(normalized_code: Vec) -> Rc { + fn create_test_deployment_bytecode(normalized_code: Vec) -> Arc { let sources = create_sources(); let contract = create_test_contract(); let is_deployment = true; @@ -361,7 +372,7 @@ mod tests { let library_offsets = vec![]; let immutable_references = vec![]; - Rc::new(Bytecode::new( + Arc::new(ContractMetadata::new( sources, contract, is_deployment, @@ -377,14 +388,14 @@ mod tests { normalized_code: Vec, library_offsets: Vec, immutable_references: Vec, - ) -> Rc { + ) -> Arc { let sources = create_sources(); let contract = create_test_contract(); let is_deployment = false; let instructions = vec![]; - Rc::new(Bytecode::new( + Arc::new(ContractMetadata::new( sources, contract, is_deployment, @@ -422,8 +433,8 @@ mod tests { let is_create = false; let contract = contracts_identifier.search_bytecode_from_root(is_create, &[1, 2, 3, 4, 5]); assert_eq!( - contract.as_ref().map(Rc::as_ptr), - Some(Rc::as_ptr(&bytecode)) + contract.as_ref().map(Arc::as_ptr), + Some(Arc::as_ptr(&bytecode)) ); // should not find a bytecode that doesn't match @@ -444,16 +455,16 @@ mod tests { // should find the exact match let contract = contracts_identifier.search_bytecode_from_root(false, &[1, 2, 3, 4, 5]); assert_eq!( - contract.as_ref().map(Rc::as_ptr), - Some(Rc::as_ptr(&bytecode1)) + contract.as_ref().map(Arc::as_ptr), + Some(Arc::as_ptr(&bytecode1)) ); // should find the exact match let contract = contracts_identifier.search_bytecode_from_root(false, &[1, 2, 3, 4, 5, 6, 7, 8]); assert_eq!( - contract.as_ref().map(Rc::as_ptr), - Some(Rc::as_ptr(&bytecode2)) + contract.as_ref().map(Arc::as_ptr), + Some(Arc::as_ptr(&bytecode2)) ); // should not find a bytecode that doesn't match @@ -490,8 +501,8 @@ mod tests { let contract = contracts_identifier.search_bytecode_from_root(is_create, &[1, 2, 3, 4, 5, 10, 11]); assert_eq!( - contract.as_ref().map(Rc::as_ptr), - Some(Rc::as_ptr(&bytecode)) + contract.as_ref().map(Arc::as_ptr), + Some(Arc::as_ptr(&bytecode)) ); // the same bytecode, but for a call trace, should not match @@ -548,8 +559,8 @@ mod tests { ); assert_eq!( - contract.as_ref().map(Rc::as_ptr), - Some(Rc::as_ptr(&bytecode)) + contract.as_ref().map(Arc::as_ptr), + Some(Arc::as_ptr(&bytecode)) ); } @@ -590,8 +601,8 @@ mod tests { ); assert_eq!( - contract.as_ref().map(Rc::as_ptr), - Some(Rc::as_ptr(&bytecode)) + contract.as_ref().map(Arc::as_ptr), + Some(Arc::as_ptr(&bytecode)) ); } @@ -643,8 +654,8 @@ mod tests { ); assert_eq!( - contract.as_ref().map(Rc::as_ptr), - Some(Rc::as_ptr(&bytecode)) + contract.as_ref().map(Arc::as_ptr), + Some(Arc::as_ptr(&bytecode)) ); } @@ -725,8 +736,8 @@ mod tests { ); assert_eq!( - contract.as_ref().map(Rc::as_ptr), - Some(Rc::as_ptr(&bytecode)) + contract.as_ref().map(Arc::as_ptr), + Some(Arc::as_ptr(&bytecode)) ); } @@ -750,8 +761,8 @@ mod tests { ], ); assert_eq!( - contract.as_ref().map(Rc::as_ptr), - Some(Rc::as_ptr(&bytecode)) + contract.as_ref().map(Arc::as_ptr), + Some(Arc::as_ptr(&bytecode)) ); } @@ -786,8 +797,8 @@ mod tests { ); assert_eq!( - contract.as_ref().map(Rc::as_ptr), - Some(Rc::as_ptr(&bytecode)) + contract.as_ref().map(Arc::as_ptr), + Some(Arc::as_ptr(&bytecode)) ); } } diff --git a/crates/edr_solidity/src/error_inferrer.rs b/crates/edr_solidity/src/error_inferrer.rs new file mode 100644 index 000000000..fd90867bd --- /dev/null +++ b/crates/edr_solidity/src/error_inferrer.rs @@ -0,0 +1,2154 @@ +use std::{borrow::Cow, collections::HashSet, mem}; + +use alloy_dyn_abi::{DynSolValue, JsonAbiExt}; +use edr_eth::{bytecode::opcode::OpCode, hex, spec::HaltReasonTrait, U256}; +use semver::{Version, VersionReq}; + +use crate::{ + build_model::{ + ContractFunction, ContractFunctionType, ContractKind, ContractMetadata, + ContractMetadataError, Instruction, JumpType, SourceLocation, + }, + nested_trace::{ + CallMessage, CreateMessage, CreateOrCallMessageRef, NestedTrace, NestedTraceStep, + }, + return_data::ReturnData, + solidity_stack_trace::{ + SourceReference, StackTraceEntry, CONSTRUCTOR_FUNCTION_NAME, FALLBACK_FUNCTION_NAME, + RECEIVE_FUNCTION_NAME, + }, +}; + +const FIRST_SOLC_VERSION_CREATE_PARAMS_VALIDATION: Version = Version::new(0, 5, 9); +const FIRST_SOLC_VERSION_RECEIVE_FUNCTION: Version = Version::new(0, 6, 0); +const FIRST_SOLC_VERSION_WITH_UNMAPPED_REVERTS: &str = "0.6.3"; + +/// Specifies whether a heuristic was applied and modified the stack trace. +/// +/// Think of it as happy [`Result`] - the [`Heuristic::Hit`] should be +/// propagated to the caller. +#[must_use] +pub enum Heuristic { + /// The heuristic was applied and modified the stack trace. + Hit(Vec), + /// The heuristic did not apply; the stack trace is unchanged. + Miss(Vec), +} + +/// Data that is used to infer the stack trace of a submessage. +#[derive(Clone, Debug)] +pub(crate) struct SubmessageData { + pub message_trace: NestedTrace, + pub stacktrace: Vec, + pub step_index: u32, +} + +/// Errors that can occur during the inference of the stack trace. +#[derive(Debug, thiserror::Error)] +pub enum InferrerError { + /// Errors that can occur when decoding the ABI. + #[error("{0}")] + Abi(String), + /// Errors that can occur when decoding the contract metadata. + #[error(transparent)] + ContractMetadata(#[from] ContractMetadataError), + /// Invalid input or logic error: Expected an EVM step. + #[error("Expected EVM step")] + ExpectedEvmStep, + /// Invalid input or logic error: Missing contract metadata. + #[error("Missing contract")] + MissingContract, + /// Invalid input or logic error: The call trace has no functionJumpdest but + /// has already jumped into a function. + #[error("call trace has no functionJumpdest but has already jumped into a function")] + MissingFunctionJumpDest(CallMessage), + /// Invalid input or logic error: Missing source reference. + #[error("Missing source reference")] + MissingSourceReference, + /// Serde JSON error. + #[error(transparent)] + SerdeJson(#[from] serde_json::Error), + /// Solidity types error. + #[error(transparent)] + SolidityTypes(#[from] alloy_sol_types::Error), +} + +// Automatic conversion from `alloy_dyn_abi::Error` to `InferrerError` is not +// possible due to unsatisifed trait bounds. +impl From for InferrerError { + fn from(err: alloy_dyn_abi::Error) -> Self { + Self::Abi(err.to_string()) + } +} + +pub(crate) fn filter_redundant_frames( + stacktrace: Vec, +) -> Result, InferrerError> { + // To work around the borrow checker, we'll collect the indices of the frames we + // want to keep. We can't clone the frames, because some of them contain + // non-Clone `ClassInstance`s` + let retained_indices: HashSet<_> = stacktrace + .iter() + .enumerate() + .filter(|(idx, frame)| { + let next_frame = stacktrace.get(idx + 1); + let next_next_frame = stacktrace.get(idx + 2); + + let Some(next_frame) = next_frame else { + return true; + }; + + // we can only filter frames if we know their sourceReference + // and the one from the next frame + let (Some(frame_source), Some(next_frame_source)) = + (frame.source_reference(), next_frame.source_reference()) + else { + return true; + }; + + // look TWO frames ahead to determine if this is a specific occurrence of + // a redundant CALLSTACK_ENTRY frame observed when using Solidity 0.8.5: + match (&frame, next_next_frame) { + ( + StackTraceEntry::CallstackEntry { + source_reference, .. + }, + Some(StackTraceEntry::ReturndataSizeError { + source_reference: next_next_source_reference, + .. + }), + ) if source_reference.range == next_next_source_reference.range + && source_reference.line == next_next_source_reference.line => + { + return false; + } + _ => {} + } + + if frame_source.function.as_deref() == Some("constructor") + && next_frame_source.function.as_deref() != Some("constructor") + { + return true; + } + + // this is probably a recursive call + if *idx > 0 + && mem::discriminant(*frame) == mem::discriminant(next_frame) + && frame_source.range == next_frame_source.range + && frame_source.line == next_frame_source.line + { + return true; + } + + if frame_source.range.0 <= next_frame_source.range.0 + && frame_source.range.1 >= next_frame_source.range.1 + { + return false; + } + + true + }) + .map(|(idx, _)| idx) + .collect(); + + Ok(stacktrace + .into_iter() + .enumerate() + .filter(|(idx, _)| retained_indices.contains(idx)) + .map(|(_, frame)| frame) + .collect()) +} + +pub(crate) fn infer_after_tracing( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + stacktrace: Vec, + function_jumpdests: &[&Instruction], + jumped_into_function: bool, + last_submessage_data: Option>, +) -> Result, InferrerError> { + /// Convenience macro to early return the result if a heuristic hits. + macro_rules! return_if_hit { + ($heuristic: expr) => { + match $heuristic { + Heuristic::Hit(stacktrace) => return Ok(stacktrace), + Heuristic::Miss(stacktrace) => stacktrace, + } + }; + } + + let result = check_last_submessage(trace, stacktrace, last_submessage_data)?; + let stacktrace = return_if_hit!(result); + + let result = check_failed_last_call(trace, stacktrace)?; + let stacktrace = return_if_hit!(result); + + let result = + check_last_instruction(trace, stacktrace, function_jumpdests, jumped_into_function)?; + let stacktrace = return_if_hit!(result); + + let result = check_non_contract_called(trace, stacktrace)?; + let stacktrace = return_if_hit!(result); + + let result = check_solidity_0_6_3_unmapped_revert(trace, stacktrace)?; + let stacktrace = return_if_hit!(result); + + if let Some(result) = check_contract_too_large(trace)? { + return Ok(result); + } + + let stacktrace = other_execution_error_stacktrace(trace, stacktrace)?; + Ok(stacktrace) +} + +pub(crate) fn infer_before_tracing_call_message( + trace: &CallMessage, +) -> Result>, InferrerError> { + if is_direct_library_call(trace)? { + return Ok(Some(get_direct_library_call_error_stack_trace(trace)?)); + } + + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + let called_function = + contract.get_function_from_selector(trace.calldata.get(..4).unwrap_or(&trace.calldata[..])); + + if let Some(called_function) = called_function { + if is_function_not_payable_error(trace, called_function)? { + return Ok(Some(vec![StackTraceEntry::FunctionNotPayableError { + source_reference: get_function_start_source_reference( + trace.into(), + called_function, + )?, + value: trace.value, + }])); + } + } + + let called_function = called_function.map(AsRef::as_ref); + + if is_missing_function_and_fallback_error(trace, called_function)? { + let source_reference = get_contract_start_without_function_source_reference(trace.into())?; + + if empty_calldata_and_no_receive(trace)? { + return Ok(Some(vec![StackTraceEntry::MissingFallbackOrReceiveError { + source_reference, + }])); + } + + return Ok(Some(vec![ + StackTraceEntry::UnrecognizedFunctionWithoutFallbackError { source_reference }, + ])); + } + + if is_fallback_not_payable_error(trace, called_function)? { + let source_reference = get_fallback_start_source_reference(trace)?; + + if empty_calldata_and_no_receive(trace)? { + return Ok(Some(vec![ + StackTraceEntry::FallbackNotPayableAndNoReceiveError { + source_reference, + value: trace.value, + }, + ])); + } + + return Ok(Some(vec![StackTraceEntry::FallbackNotPayableError { + source_reference, + value: trace.value, + }])); + } + + Ok(None) +} + +pub(crate) fn infer_before_tracing_create_message( + trace: &CreateMessage, +) -> Result>, InferrerError> { + if is_constructor_not_payable_error(trace)? { + return Ok(Some(vec![StackTraceEntry::FunctionNotPayableError { + source_reference: get_constructor_start_source_reference(trace)?, + value: trace.value, + }])); + } + + if is_constructor_invalid_arguments_error(trace)? { + return Ok(Some(vec![StackTraceEntry::InvalidParamsError { + source_reference: get_constructor_start_source_reference(trace)?, + }])); + } + + Ok(None) +} + +pub(crate) fn instruction_to_callstack_stack_trace_entry( + contract_meta: &ContractMetadata, + inst: &Instruction, +) -> Result> { + let contract = contract_meta.contract.read(); + + // This means that a jump is made from within an internal solc function. + // These are normally made from yul code, so they don't map to any Solidity + // function + let inst_location = match &inst.location { + None => { + let location = &contract.location; + let file = location.file(); + let file = file.read(); + + return Ok(StackTraceEntry::InternalFunctionCallstackEntry { + pc: inst.pc, + source_reference: SourceReference { + source_name: file.source_name.clone(), + source_content: file.content.clone(), + contract: Some(contract.name.clone()), + function: None, + line: location.get_starting_line_number(), + range: (location.offset, location.offset + location.length), + }, + }); + } + Some(inst_location) => inst_location, + }; + + if let Some(func) = inst_location.get_containing_function() { + let source_reference = + source_location_to_source_reference(contract_meta, Some(inst_location)) + .ok_or(InferrerError::MissingSourceReference)?; + + return Ok(StackTraceEntry::CallstackEntry { + source_reference, + function_type: func.r#type, + }); + }; + + let file = inst_location.file(); + let file = file.read(); + + Ok(StackTraceEntry::CallstackEntry { + source_reference: SourceReference { + function: None, + contract: Some(contract.name.clone()), + source_name: file.source_name.clone(), + source_content: file.content.clone(), + line: inst_location.get_starting_line_number(), + range: ( + inst_location.offset, + inst_location.offset + inst_location.length, + ), + }, + function_type: ContractFunctionType::Function, + }) +} + +fn call_instruction_to_call_failed_to_execute_stack_trace_entry( + contract_meta: &ContractMetadata, + call_inst: &Instruction, +) -> Result> { + let location = call_inst.location.as_deref(); + + let source_reference = source_location_to_source_reference(contract_meta, location) + .ok_or(InferrerError::MissingSourceReference)?; + + // Calls only happen within functions + Ok(StackTraceEntry::CallFailedError { source_reference }) +} + +fn check_contract_too_large( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result>, InferrerError> { + if let CreateOrCallMessageRef::Create(create) = trace { + if create.exit.is_contract_too_large_error() { + return Ok(Some(vec![StackTraceEntry::ContractTooLargeError { + source_reference: Some(get_constructor_start_source_reference(create)?), + }])); + } + } + Ok(None) +} + +fn check_custom_errors( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + stacktrace: Vec, + last_instruction: &Instruction, +) -> Result> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + let return_data = trace.return_data(); + + let return_data = ReturnData::new(return_data.clone()); + + if return_data.is_empty() || return_data.is_error_return_data() { + // if there is no return data, or if it's a Error(string), + // then it can't be a custom error + return Ok(Heuristic::Miss(stacktrace)); + } + + let raw_return_data = hex::encode(&*return_data.value); + let mut error_message = + format!("reverted with an unrecognized custom error (return data: 0x{raw_return_data})",); + + for custom_error in &contract.custom_errors { + if return_data.matches_selector(custom_error.selector) { + // if the return data matches a custom error in the called contract, + // we format the message using the returnData and the custom error instance + let decoded = custom_error.decode_error_data(&return_data.value)?; + + let params = decoded + .body + .iter() + .map(format_dyn_sol_value) + .collect::>(); + + error_message = format!( + "reverted with custom error '{name}({params})'", + name = custom_error.name, + params = params.join(", ") + ); + + break; + } + } + + let mut stacktrace = stacktrace; + stacktrace.push( + instruction_within_function_to_custom_error_stack_trace_entry( + trace, + last_instruction, + error_message, + )?, + ); + + fix_initial_modifier(trace, stacktrace).map(Heuristic::Hit) +} + +/// Check if the last call/create that was done failed. +fn check_failed_last_call( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + stacktrace: Vec, +) -> Result> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let steps = trace.steps(); + + if steps.is_empty() { + return Ok(Heuristic::Miss(stacktrace)); + } + + for step_index in (0..steps.len() - 1).rev() { + let (step, next_step) = match &steps[step_index..][..2] { + &[NestedTraceStep::Evm(ref step), ref next_step] => (step, next_step), + _ => return Ok(Heuristic::Miss(stacktrace)), + }; + + let inst = contract_meta.get_instruction(step.pc)?; + + if let (OpCode::CALL | OpCode::CREATE, NestedTraceStep::Evm(_)) = (inst.opcode, next_step) { + if is_call_failed_error(trace, step_index as u32, inst)? { + let mut inferred_stacktrace = stacktrace.clone(); + inferred_stacktrace.push( + call_instruction_to_call_failed_to_execute_stack_trace_entry( + &contract_meta, + inst, + )?, + ); + + return Ok(Heuristic::Hit(fix_initial_modifier( + trace, + inferred_stacktrace, + )?)); + } + } + } + + Ok(Heuristic::Miss(stacktrace)) +} + +fn check_last_instruction( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + stacktrace: Vec, + function_jumpdests: &[&Instruction], + jumped_into_function: bool, +) -> Result> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let steps = trace.steps(); + + if steps.is_empty() { + return Ok(Heuristic::Miss(stacktrace)); + } + + let last_step = match steps.last() { + Some(NestedTraceStep::Evm(step)) => step, + _ => panic!("This should not happen: MessageTrace ends with a subtrace"), + }; + + let last_instruction = contract_meta.get_instruction(last_step.pc)?; + + let revert_or_invalid_stacktrace = check_revert_or_invalid_opcode( + trace, + stacktrace, + last_instruction, + function_jumpdests, + jumped_into_function, + )?; + let stacktrace = match revert_or_invalid_stacktrace { + hit @ Heuristic::Hit(..) => return Ok(hit), + Heuristic::Miss(stacktrace) => stacktrace, + }; + + let (CreateOrCallMessageRef::Call(trace @ CallMessage { calldata, .. }), false) = + (trace, jumped_into_function) + else { + return Ok(Heuristic::Miss(stacktrace)); + }; + + if has_failed_inside_the_fallback_function(trace)? + || has_failed_inside_the_receive_function(trace)? + { + let frame = instruction_within_function_to_revert_stack_trace_entry( + CreateOrCallMessageRef::Call(trace), + last_instruction, + )?; + + return Ok(Heuristic::Hit(vec![frame])); + } + + // Sometimes we do fail inside of a function but there's no jump into + if let Some(location) = &last_instruction.location { + let failing_function = location.get_containing_function(); + + if let Some(failing_function) = failing_function { + let frame = StackTraceEntry::RevertError { + source_reference: get_function_start_source_reference( + CreateOrCallMessageRef::Call(trace), + &failing_function, + )?, + return_data: trace.return_data.clone(), + is_invalid_opcode_error: last_instruction.opcode == OpCode::INVALID, + }; + + return Ok(Heuristic::Hit(vec![frame])); + } + } + + let contract = contract_meta.contract.read(); + + let selector = calldata.get(..4).unwrap_or(&calldata[..]); + let calldata = &calldata.get(4..).unwrap_or(&[]); + + let called_function = contract.get_function_from_selector(selector); + + if let Some(called_function) = called_function { + let abi = alloy_json_abi::Function::try_from(&**called_function)?; + + let is_valid_calldata = match &called_function.param_types { + Some(_) => abi.abi_decode_input(calldata, true).is_ok(), + // if we don't know the param types, we just assume that the call is valid + None => true, + }; + + if !is_valid_calldata { + let frame = StackTraceEntry::InvalidParamsError { + source_reference: get_function_start_source_reference( + CreateOrCallMessageRef::Call(trace), + called_function, + )?, + }; + + return Ok(Heuristic::Hit(vec![frame])); + } + } + + if solidity_0_6_3_maybe_unmapped_revert(CreateOrCallMessageRef::Call(trace))? { + let revert_frame = solidity_0_6_3_get_frame_for_unmapped_revert_before_function(trace)?; + + if let Some(revert_frame) = revert_frame { + return Ok(Heuristic::Hit(vec![revert_frame])); + } + } + + let frame = get_other_error_before_called_function_stack_trace_entry(trace)?; + + Ok(Heuristic::Hit(vec![frame])) +} + +/// Check if the last submessage can be used to generate the stack trace. +fn check_last_submessage( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + stacktrace: Vec, + last_submessage_data: Option>, +) -> Result> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let steps = trace.steps(); + + let Some(last_submessage_data) = last_submessage_data else { + return Ok(Heuristic::Miss(stacktrace)); + }; + + let mut inferred_stacktrace = Cow::from(&stacktrace); + + // get the instruction before the submessage and add it to the stack trace + let call_step = match steps.get(last_submessage_data.step_index as usize - 1) { + Some(NestedTraceStep::Evm(call_step)) => call_step, + _ => panic!("This should not happen: MessageTrace should be preceded by a EVM step"), + }; + + let call_inst = contract_meta.get_instruction(call_step.pc)?; + let call_stack_frame = instruction_to_callstack_stack_trace_entry(&contract_meta, call_inst)?; + // TODO: remove this expect + let call_stack_frame_source_reference = call_stack_frame + .source_reference() + .cloned() + .expect("Callstack entry must have source reference"); + + let last_message_failed = match &last_submessage_data.message_trace { + NestedTrace::Create(create) => create.exit.is_error(), + NestedTrace::Call(call) => call.exit.is_error(), + NestedTrace::Precompile(precompile) => precompile.exit.is_error(), + }; + if last_message_failed { + // add the call/create that generated the message to the stack trace + let inferred_stacktrace = inferred_stacktrace.to_mut(); + inferred_stacktrace.push(call_stack_frame); + + if is_subtrace_error_propagated(trace, last_submessage_data.step_index)? + || is_proxy_error_propagated(trace, last_submessage_data.step_index)? + { + inferred_stacktrace.extend(last_submessage_data.stacktrace); + + if is_contract_call_run_out_of_gas_error(trace, last_submessage_data.step_index)? { + let last_frame = match inferred_stacktrace.pop() { + Some(frame) => frame, + _ => panic!("Expected inferred stack trace to have at least one frame"), + }; + + inferred_stacktrace.push(StackTraceEntry::ContractCallRunOutOfGasError { + source_reference: last_frame.source_reference().cloned(), + }); + } + + return fix_initial_modifier(trace, inferred_stacktrace.to_owned()).map(Heuristic::Hit); + } + } else { + let is_return_data_size_error = + fails_right_after_call(trace, last_submessage_data.step_index)?; + if is_return_data_size_error { + inferred_stacktrace + .to_mut() + .push(StackTraceEntry::ReturndataSizeError { + source_reference: call_stack_frame_source_reference, + }); + + return fix_initial_modifier(trace, inferred_stacktrace.into_owned()) + .map(Heuristic::Hit); + } + } + + Ok(Heuristic::Miss(stacktrace)) +} + +/// Check if the trace reverted with a panic error. +fn check_panic( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + mut stacktrace: Vec, + last_instruction: &Instruction, +) -> Result> { + let return_data = ReturnData::new(trace.return_data().clone()); + + if !return_data.is_panic_return_data() { + return Ok(Heuristic::Miss(stacktrace)); + } + + // If the last frame is an internal function, it means that the trace + // jumped there to return the panic. If that's the case, we remove that + // frame. + if let Some(StackTraceEntry::InternalFunctionCallstackEntry { .. }) = stacktrace.last() { + stacktrace.pop(); + } + + // if the error comes from a call to a zero-initialized function, + // we remove the last frame, which represents the call, to avoid + // having duplicated frames + let error_code = return_data.decode_panic()?; + if error_code == U256::from(0x51) { + stacktrace.pop(); + } + + stacktrace.push(instruction_within_function_to_panic_stack_trace_entry( + trace, + last_instruction, + error_code, + )?); + + fix_initial_modifier(trace, stacktrace).map(Heuristic::Hit) +} + +fn check_non_contract_called( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + mut stacktrace: Vec, +) -> Result> { + if is_called_non_contract_account_error(trace)? { + let source_reference = get_last_source_reference(trace)?; + + // We are sure this is not undefined because there was at least a call + // instruction + let source_reference = source_reference.expect("Expected source reference to be defined"); + + let non_contract_called_frame = + StackTraceEntry::NoncontractAccountCalledError { source_reference }; + + stacktrace.push(non_contract_called_frame); + + Ok(Heuristic::Hit(stacktrace)) + } else { + Ok(Heuristic::Miss(stacktrace)) + } +} + +/// Check if the execution stopped with a revert or an invalid opcode. +fn check_revert_or_invalid_opcode( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + stacktrace: Vec, + last_instruction: &Instruction, + function_jumpdests: &[&Instruction], + jumped_into_function: bool, +) -> Result> { + match last_instruction.opcode { + OpCode::REVERT | OpCode::INVALID => {} + _ => return Ok(Heuristic::Miss(stacktrace)), + } + + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let return_data = trace.return_data(); + + let mut inferred_stacktrace = stacktrace.clone(); + + if let Some(location) = &last_instruction.location { + if jumped_into_function || matches!(trace, CreateOrCallMessageRef::Create(_)) { + // There should always be a function here, but that's not the case with + // optimizations. + // + // If this is a create trace, we already checked args and nonpayable failures + // before calling this function. + // + // If it's a call trace, we already jumped into a function. But optimizations + // can happen. + let failing_function = location.get_containing_function(); + + // If the failure is in a modifier we add an entry with the function/constructor + match failing_function { + Some(func) if func.r#type == ContractFunctionType::Modifier => { + let frame = get_entry_before_failure_in_modifier(trace, function_jumpdests)?; + + inferred_stacktrace.push(frame); + } + _ => {} + } + } + } + + let panic_stacktrace = check_panic(trace, inferred_stacktrace, last_instruction)?; + let inferred_stacktrace = match panic_stacktrace { + hit @ Heuristic::Hit(..) => return Ok(hit), + Heuristic::Miss(stacktrace) => stacktrace, + }; + + let custom_error_stacktrace = + check_custom_errors(trace, inferred_stacktrace, last_instruction)?; + let mut inferred_stacktrace = match custom_error_stacktrace { + hit @ Heuristic::Hit(..) => return Ok(hit), + Heuristic::Miss(stacktrace) => stacktrace, + }; + + if let Some(location) = &last_instruction.location { + if jumped_into_function || matches!(trace, CreateOrCallMessageRef::Create(_)) { + let failing_function = location.get_containing_function(); + + if failing_function.is_some() { + let frame = instruction_within_function_to_revert_stack_trace_entry( + trace, + last_instruction, + )?; + + inferred_stacktrace.push(frame); + } else { + let is_invalid_opcode_error = last_instruction.opcode == OpCode::INVALID; + + match &trace { + CreateOrCallMessageRef::Call(CallMessage { calldata, .. }) => { + let contract = contract_meta.contract.read(); + + // This is here because of the optimizations + let function_from_selector = contract + .get_function_from_selector(calldata.get(..4).unwrap_or(&calldata[..])); + + // in general this shouldn't happen, but it does when viaIR is enabled, + // "optimizerSteps": "u" is used, and the called function is fallback or + // receive + let Some(function) = function_from_selector else { + return Ok(Heuristic::Miss(inferred_stacktrace)); + }; + + let frame = StackTraceEntry::RevertError { + source_reference: get_function_start_source_reference(trace, function)?, + return_data: return_data.clone(), + is_invalid_opcode_error, + }; + + inferred_stacktrace.push(frame); + } + CreateOrCallMessageRef::Create(create) => { + // This is here because of the optimizations + let frame = StackTraceEntry::RevertError { + source_reference: get_constructor_start_source_reference(create)?, + return_data: return_data.clone(), + is_invalid_opcode_error, + }; + + inferred_stacktrace.push(frame); + } + } + } + + return fix_initial_modifier(trace, inferred_stacktrace).map(Heuristic::Hit); + } + } + + // If the revert instruction is not mapped but there is return data, + // we add the frame anyway, sith the best sourceReference we can get + if last_instruction.location.is_none() && !return_data.is_empty() { + let revert_frame = StackTraceEntry::RevertError { + source_reference: get_contract_start_without_function_source_reference(trace)?, + return_data: return_data.clone(), + is_invalid_opcode_error: last_instruction.opcode == OpCode::INVALID, + }; + + inferred_stacktrace.push(revert_frame); + + return fix_initial_modifier(trace, inferred_stacktrace).map(Heuristic::Hit); + } + + Ok(Heuristic::Miss(stacktrace)) +} + +fn check_solidity_0_6_3_unmapped_revert( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + mut stacktrace: Vec, +) -> Result> { + if solidity_0_6_3_maybe_unmapped_revert(trace)? { + let revert_frame = solidity_0_6_3_get_frame_for_unmapped_revert_within_function(trace)?; + + if let Some(revert_frame) = revert_frame { + stacktrace.push(revert_frame); + + return Ok(Heuristic::Hit(stacktrace)); + } + + return Ok(Heuristic::Hit(stacktrace)); + } + + Ok(Heuristic::Miss(stacktrace)) +} + +fn empty_calldata_and_no_receive( + trace: &CallMessage, +) -> Result> { + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + let version = + Version::parse(&contract_meta.compiler_version).expect("Failed to parse SemVer version"); + + // this only makes sense when receive functions are available + if version < FIRST_SOLC_VERSION_RECEIVE_FUNCTION { + return Ok(false); + } + + Ok(trace.calldata.is_empty() && contract.receive.is_none()) +} + +fn fails_right_after_call( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + call_subtrace_step_index: u32, +) -> Result> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let steps = trace.steps(); + + let Some(NestedTraceStep::Evm(last_step)) = steps.last() else { + return Ok(false); + }; + + let last_inst = contract_meta.get_instruction(last_step.pc)?; + if last_inst.opcode != OpCode::REVERT { + return Ok(false); + } + + let call_opcode_step = steps.get(call_subtrace_step_index as usize - 1); + let call_opcode_step = match call_opcode_step { + Some(NestedTraceStep::Evm(step)) => step, + _ => return Err(InferrerError::ExpectedEvmStep), + }; + let call_inst = contract_meta.get_instruction(call_opcode_step.pc)?; + + // Calls are always made from within functions + let call_inst_location = call_inst + .location + .as_ref() + .expect("Expected call instruction location to be defined"); + + is_last_location(trace, call_subtrace_step_index + 1, call_inst_location) +} + +fn fix_initial_modifier( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + mut stacktrace: Vec, +) -> Result, InferrerError> { + if let Some(StackTraceEntry::CallstackEntry { + function_type: ContractFunctionType::Modifier, + .. + }) = stacktrace.first() + { + let entry_before_initial_modifier = + get_entry_before_initial_modifier_callstack_entry(trace)?; + + stacktrace.insert(0, entry_before_initial_modifier); + } + + Ok(stacktrace) +} + +// Rewrite of `AbiHelpers.formatValues` from Hardhat +fn format_dyn_sol_value(val: &DynSolValue) -> String { + match val { + // print nested values as [value1, value2, ...] + DynSolValue::Array(items) + | DynSolValue::Tuple(items) + | DynSolValue::FixedArray(items) + | DynSolValue::CustomStruct { tuple: items, .. } => { + let mut result = String::from("["); + for (i, val) in items.iter().enumerate() { + if i > 0 { + result.push_str(", "); + } + result.push_str(&format_dyn_sol_value(val)); + } + + result.push(']'); + result + } + // surround string values with quotes + DynSolValue::String(s) => format!("\"{s}\""), + + DynSolValue::Address(address) => format!("\"{address}\""), + DynSolValue::Bytes(bytes) => format!("\"{}\"", hex::encode_prefixed(bytes)), + DynSolValue::FixedBytes(word, size) => { + format!("\"{}\"", hex::encode_prefixed(&word.0.as_slice()[..*size])) + } + DynSolValue::Bool(b) => b.to_string(), + DynSolValue::Function(_) => "".to_string(), + DynSolValue::Int(int, _bits) => int.to_string(), + DynSolValue::Uint(uint, _bits) => uint.to_string(), + } +} + +fn get_constructor_start_source_reference( + trace: &CreateMessage, +) -> Result> { + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + let contract_location = &contract.location; + + let line = match &contract.constructor { + Some(constructor) => constructor.location.get_starting_line_number(), + None => contract_location.get_starting_line_number(), + }; + + let file = contract_location.file(); + let file = file.read(); + + Ok(SourceReference { + source_name: file.source_name.clone(), + source_content: file.content.clone(), + contract: Some(contract.name.clone()), + function: Some(CONSTRUCTOR_FUNCTION_NAME.to_string()), + line, + range: ( + contract_location.offset, + contract_location.offset + contract_location.length, + ), + }) +} + +fn get_contract_start_without_function_source_reference( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result> { + let contract_meta = trace + .contract_meta() + .clone() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + let location = &contract.location; + let file = location.file(); + let file = file.read(); + + Ok(SourceReference { + source_name: file.source_name.clone(), + source_content: file.content.clone(), + contract: Some(contract.name.clone()), + + function: None, + line: location.get_starting_line_number(), + range: (location.offset, location.offset + location.length), + }) +} + +fn get_direct_library_call_error_stack_trace( + trace: &CallMessage, +) -> Result, InferrerError> { + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + let func = + contract.get_function_from_selector(trace.calldata.get(..4).unwrap_or(&trace.calldata[..])); + + let source_reference = match func { + Some(func) => { + get_function_start_source_reference(CreateOrCallMessageRef::Call(trace), func)? + } + None => get_contract_start_without_function_source_reference( + CreateOrCallMessageRef::Call(trace), + )?, + }; + + Ok(vec![StackTraceEntry::DirectLibraryCallError { + source_reference, + }]) +} + +fn get_function_start_source_reference( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + func: &ContractFunction, +) -> Result> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + let file = func.location.file(); + let file = file.read(); + + let location = &func.location; + + Ok(SourceReference { + source_name: file.source_name.clone(), + source_content: file.content.clone(), + contract: Some(contract.name.clone()), + + function: Some(func.name.clone()), + line: location.get_starting_line_number(), + range: (location.offset, location.offset + location.length), + }) +} + +fn get_entry_before_initial_modifier_callstack_entry( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result> { + let trace = match trace { + CreateOrCallMessageRef::Create(create) => { + return Ok(StackTraceEntry::CallstackEntry { + source_reference: get_constructor_start_source_reference(create)?, + function_type: ContractFunctionType::Constructor, + }) + } + CreateOrCallMessageRef::Call(call) => call, + }; + + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + let called_function = + contract.get_function_from_selector(trace.calldata.get(..4).unwrap_or(&trace.calldata[..])); + + let source_reference = match called_function { + Some(called_function) => get_function_start_source_reference( + CreateOrCallMessageRef::Call(trace), + called_function, + )?, + None => get_fallback_start_source_reference(trace)?, + }; + + let function_type = match called_function { + Some(_) => ContractFunctionType::Function, + None => ContractFunctionType::Fallback, + }; + + Ok(StackTraceEntry::CallstackEntry { + source_reference, + function_type, + }) +} + +fn get_entry_before_failure_in_modifier( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + function_jumpdests: &[&Instruction], +) -> Result> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + + // If there's a jumpdest, this modifier belongs to the last function that it + // represents + if let Some(last_jumpdest) = function_jumpdests.last() { + let entry = instruction_to_callstack_stack_trace_entry(&contract_meta, last_jumpdest)?; + + return Ok(entry); + } + + // This function is only called after we jumped into the initial function in + // call traces, so there should always be at least a function jumpdest. + let trace = match trace { + CreateOrCallMessageRef::Call(call) => { + return Err(InferrerError::MissingFunctionJumpDest(call.clone())) + } + CreateOrCallMessageRef::Create(create) => create, + }; + + // If there's no jump dest, we point to the constructor. + Ok(StackTraceEntry::CallstackEntry { + source_reference: get_constructor_start_source_reference(trace)?, + function_type: ContractFunctionType::Constructor, + }) +} + +fn get_fallback_start_source_reference( + trace: &CallMessage, +) -> Result> { + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + let func = match &contract.fallback { + Some(func) => func, + None => panic!("This shouldn't happen: trying to get fallback source reference from a contract without fallback"), + }; + + let location = &func.location; + let file = location.file(); + let file = file.read(); + + Ok(SourceReference { + source_name: file.source_name.clone(), + source_content: file.content.clone(), + contract: Some(contract.name.clone()), + function: Some(FALLBACK_FUNCTION_NAME.to_string()), + line: location.get_starting_line_number(), + range: (location.offset, location.offset + location.length), + }) +} + +fn get_last_instruction_with_valid_location_step_index( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result, InferrerError> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let steps = trace.steps(); + + for (i, step) in steps.iter().enumerate().rev() { + let step = match step { + NestedTraceStep::Evm(step) => step, + _ => return Ok(None), + }; + + let inst = contract_meta.get_instruction(step.pc)?; + + if inst.location.is_some() { + return Ok(Some(i as u32)); + } + } + + Ok(None) +} + +fn get_last_instruction_with_valid_location( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result, InferrerError> { + let last_location_index = get_last_instruction_with_valid_location_step_index(trace)?; + + let Some(last_location_index) = last_location_index else { + return Ok(None); + }; + + let steps = trace.steps(); + + match &steps.get(last_location_index as usize) { + Some(NestedTraceStep::Evm(step)) => { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let inst = contract_meta.get_instruction(step.pc)?; + + Ok(Some(inst.clone())) + } + _ => Ok(None), + } +} +fn get_last_source_reference( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result, InferrerError> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let steps = trace.steps(); + + for step in steps.iter().rev() { + let step = match step { + NestedTraceStep::Evm(step) => step, + _ => continue, + }; + + let inst = contract_meta.get_instruction(step.pc)?; + + let Some(location) = &inst.location else { + continue; + }; + + let source_reference = source_location_to_source_reference(&contract_meta, Some(location)); + + if let Some(source_reference) = source_reference { + return Ok(Some(source_reference)); + } + } + + Ok(None) +} + +fn get_other_error_before_called_function_stack_trace_entry( + trace: &CallMessage, +) -> Result> { + let source_reference = + get_contract_start_without_function_source_reference(CreateOrCallMessageRef::Call(trace))?; + + Ok(StackTraceEntry::OtherExecutionError { + source_reference: Some(source_reference), + }) +} + +fn has_failed_inside_the_fallback_function( + trace: &CallMessage, +) -> Result> { + let contract = &trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)? + .contract; + let contract = contract.read(); + + match &contract.fallback { + Some(fallback) => has_failed_inside_function(trace, fallback), + None => Ok(false), + } +} + +fn has_failed_inside_the_receive_function( + trace: &CallMessage, +) -> Result> { + let contract = &trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)? + .contract; + let contract = contract.read(); + + match &contract.receive { + Some(receive) => has_failed_inside_function(trace, receive), + None => Ok(false), + } +} + +fn has_failed_inside_function( + trace: &CallMessage, + func: &ContractFunction, +) -> Result> { + let last_step = trace + .steps + .iter() + .last() + .expect("There should at least be one step"); + + let last_step = match last_step { + NestedTraceStep::Evm(step) => step, + _ => return Err(InferrerError::ExpectedEvmStep), + }; + + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + + let last_instruction = contract_meta.get_instruction(last_step.pc)?; + + Ok(match &last_instruction.location { + Some(last_instruction_location) => { + last_instruction.opcode == OpCode::REVERT + && func.location.contains(last_instruction_location) + } + _ => false, + }) +} + +fn instruction_within_function_to_custom_error_stack_trace_entry( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + inst: &Instruction, + message: String, +) -> Result> { + let last_source_reference = get_last_source_reference(trace)?; + let last_source_reference = + last_source_reference.expect("Expected source reference to be defined"); + + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + + let source_reference = + source_location_to_source_reference(&contract_meta, inst.location.as_deref()); + + let source_reference = source_reference.unwrap_or(last_source_reference); + + Ok(StackTraceEntry::CustomError { + source_reference, + message, + }) +} + +fn instruction_within_function_to_panic_stack_trace_entry( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + inst: &Instruction, + error_code: U256, +) -> Result> { + let last_source_reference = get_last_source_reference(trace)?; + + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + + let source_reference = + source_location_to_source_reference(&contract_meta, inst.location.as_deref()); + + let source_reference = source_reference.or(last_source_reference); + + Ok(StackTraceEntry::PanicError { + source_reference, + error_code, + }) +} + +fn instruction_within_function_to_revert_stack_trace_entry( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + inst: &Instruction, +) -> Result> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + + let source_reference = + source_location_to_source_reference(&contract_meta, inst.location.as_deref()) + .ok_or(InferrerError::MissingSourceReference)?; + + Ok(StackTraceEntry::RevertError { + source_reference, + is_invalid_opcode_error: inst.opcode == OpCode::INVALID, + return_data: trace.return_data().clone(), + }) +} + +fn instruction_within_function_to_unmapped_solc_0_6_3_revert_error_source_reference< + HaltReasonT: HaltReasonTrait, +>( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + inst: &Instruction, +) -> Result, InferrerError> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + + let source_reference = + source_location_to_source_reference(&contract_meta, inst.location.as_deref()); + + Ok(source_reference) +} + +fn is_called_non_contract_account_error( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result> { + // We could change this to checking that the last valid location maps to a call, + // but it's way more complex as we need to get the ast node from that + // location. + + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let steps = trace.steps(); + + let last_index = get_last_instruction_with_valid_location_step_index(trace)?; + + let last_index = match last_index { + None | Some(0) => return Ok(false), + Some(last_index) => last_index as usize, + }; + + let last_step = match &steps[last_index] { + NestedTraceStep::Evm(step) => step, + _ => panic!("We know this is an EVM step"), + }; + + let last_inst = contract_meta.get_instruction(last_step.pc)?; + + if last_inst.opcode != OpCode::ISZERO { + return Ok(false); + } + + let prev_step = match &steps[last_index - 1] { + NestedTraceStep::Evm(step) => step, + _ => panic!("We know this is an EVM step"), + }; + + let prev_inst = contract_meta.get_instruction(prev_step.pc)?; + + Ok(prev_inst.opcode == OpCode::EXTCODESIZE) +} + +fn is_call_failed_error( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + inst_index: u32, + call_instruction: &Instruction, +) -> Result> { + let call_location = match &call_instruction.location { + Some(location) => location, + None => panic!("Expected call location to be defined"), + }; + + is_last_location(trace, inst_index, call_location) +} + +/// Returns a source reference pointing to the constructor if it exists, or +/// to the contract otherwise. +fn is_constructor_invalid_arguments_error( + trace: &CreateMessage, +) -> Result> { + if trace.return_data.len() > 0 { + return Ok(false); + } + + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + // This function is only matters with contracts that have constructors defined. + // The ones that don't are abstract contracts, or their constructor + // doesn't take any argument. + let Some(constructor) = &contract.constructor else { + return Ok(false); + }; + + let Ok(version) = Version::parse(&contract_meta.compiler_version) else { + return Ok(false); + }; + if version < FIRST_SOLC_VERSION_CREATE_PARAMS_VALIDATION { + return Ok(false); + } + + let last_step = trace.steps.last(); + let Some(NestedTraceStep::Evm(last_step)) = last_step else { + return Ok(false); + }; + + let last_inst = contract_meta.get_instruction(last_step.pc)?; + + if last_inst.opcode != OpCode::REVERT || last_inst.location.is_some() { + return Ok(false); + } + + let mut has_read_deployment_code_size = false; + for step in trace.steps.iter() { + let step = match step { + NestedTraceStep::Evm(step) => step, + _ => return Ok(false), + }; + + let inst = contract_meta.get_instruction(step.pc)?; + + if let Some(inst_location) = &inst.location { + if contract.location != *inst_location && constructor.location != *inst_location { + return Ok(false); + } + } + + if inst.opcode == OpCode::CODESIZE { + has_read_deployment_code_size = true; + } + } + + Ok(has_read_deployment_code_size) +} + +fn is_constructor_not_payable_error( + trace: &CreateMessage, +) -> Result> { + // This error doesn't return data + if !trace.return_data.is_empty() { + return Ok(false); + } + + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + // This function is only matters with contracts that have constructors defined. + // The ones that don't are abstract contracts, or their constructor + // doesn't take any argument. + let constructor = match &contract.constructor { + Some(constructor) => constructor, + None => return Ok(false), + }; + + if trace.value.is_zero() { + return Ok(false); + } + + Ok(constructor.is_payable != Some(true)) +} + +fn is_direct_library_call( + trace: &CallMessage, +) -> Result> { + let contract = &trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)? + .contract; + let contract = contract.read(); + + Ok(trace.depth == 0 && contract.r#type == ContractKind::Library) +} + +fn is_contract_call_run_out_of_gas_error( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + call_step_index: u32, +) -> Result> { + let steps = trace.steps(); + let return_data = trace.return_data(); + let exit_code = trace.exit_code(); + + if return_data.len() > 0 { + return Ok(false); + } + + if !exit_code.is_revert() { + return Ok(false); + } + + let call_exit = match steps.get(call_step_index as usize) { + None | Some(NestedTraceStep::Evm(_)) => panic!("Expected call to be a message trace"), + Some(NestedTraceStep::Precompile(precompile)) => precompile.exit.clone(), + Some(NestedTraceStep::Call(call)) => call.exit.clone(), + Some(NestedTraceStep::Create(create)) => create.exit.clone(), + }; + + if !call_exit.is_out_of_gas_error() { + return Ok(false); + } + + fails_right_after_call(trace, call_step_index) +} + +fn is_fallback_not_payable_error( + trace: &CallMessage, + called_function: Option<&ContractFunction>, +) -> Result> { + // This error doesn't return data + if !trace.return_data.is_empty() { + return Ok(false); + } + + if trace.value.is_zero() { + return Ok(false); + } + + // the called function exists in the contract + if called_function.is_some() { + return Ok(false); + } + + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + match &contract.fallback { + Some(fallback) => Ok(fallback.is_payable != Some(true)), + None => Ok(false), + } +} + +fn is_function_not_payable_error( + trace: &CallMessage, + called_function: &ContractFunction, +) -> Result> { + // This error doesn't return data + if !trace.return_data.is_empty() { + return Ok(false); + } + + if trace.value.is_zero() { + return Ok(false); + } + + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + // Libraries don't have a nonpayable check + if contract.r#type == ContractKind::Library { + return Ok(false); + } + + Ok(called_function.is_payable != Some(true)) +} + +fn is_last_location( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + from_step: u32, + location: &SourceLocation, +) -> Result> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let steps = trace.steps(); + + for step in steps.iter().skip(from_step as usize) { + let step = match step { + NestedTraceStep::Evm(step) => step, + _ => return Ok(false), + }; + + let step_inst = contract_meta.get_instruction(step.pc)?; + + if let Some(step_inst_location) = &step_inst.location { + if **step_inst_location != *location { + return Ok(false); + } + } + } + + Ok(true) +} + +fn is_missing_function_and_fallback_error( + trace: &CallMessage, + called_function: Option<&ContractFunction>, +) -> Result> { + // This error doesn't return data + if trace.return_data.len() > 0 { + return Ok(false); + } + + // the called function exists in the contract + if called_function.is_some() { + return Ok(false); + } + + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + // there's a receive function and no calldata + if trace.calldata.len() == 0 && contract.receive.is_some() { + return Ok(false); + } + + Ok(contract.fallback.is_none()) +} + +fn is_proxy_error_propagated( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + call_subtrace_step_index: u32, +) -> Result> { + let trace = match &trace { + CreateOrCallMessageRef::Call(call) => call, + CreateOrCallMessageRef::Create(_) => return Ok(false), + }; + + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + + let call_step = match trace.steps.get(call_subtrace_step_index as usize - 1) { + Some(NestedTraceStep::Evm(step)) => step, + _ => return Ok(false), + }; + + let call_inst = contract_meta.get_instruction(call_step.pc)?; + + if call_inst.opcode != OpCode::DELEGATECALL { + return Ok(false); + } + + let subtrace = match trace.steps.get(call_subtrace_step_index as usize) { + None | Some(NestedTraceStep::Evm(_) | NestedTraceStep::Precompile(_)) => return Ok(false), + Some(NestedTraceStep::Call(call)) => CreateOrCallMessageRef::Call(call), + Some(NestedTraceStep::Create(create)) => CreateOrCallMessageRef::Create(create), + }; + + let Some(subtrace_contract_meta) = subtrace.contract_meta() else { + // If we can't recognize the implementation we'd better don't consider it as + // such + return Ok(false); + }; + + if subtrace_contract_meta.contract.read().r#type == ContractKind::Library { + return Ok(false); + } + + if trace.return_data.as_ref() != subtrace.return_data().as_ref() { + return Ok(false); + } + + for step in trace + .steps + .iter() + .skip(call_subtrace_step_index as usize + 1) + { + let step = match step { + NestedTraceStep::Evm(step) => step, + _ => return Ok(false), + }; + + let inst = contract_meta.get_instruction(step.pc)?; + + // All the remaining locations should be valid, as they are part of the inline + // asm + if inst.location.is_none() { + return Ok(false); + } + + if matches!( + inst.jump_type, + JumpType::IntoFunction | JumpType::OutofFunction + ) { + return Ok(false); + } + } + + let last_step = match trace.steps.last() { + Some(NestedTraceStep::Evm(step)) => step, + _ => return Err(InferrerError::ExpectedEvmStep), + }; + let last_inst = contract_meta.get_instruction(last_step.pc)?; + + Ok(last_inst.opcode == OpCode::REVERT) +} + +fn is_subtrace_error_propagated( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + call_subtrace_step_index: u32, +) -> Result> { + let return_data = trace.return_data(); + let steps = trace.steps(); + let exit = trace.exit_code(); + + let (call_return_data, call_exit) = match steps.get(call_subtrace_step_index as usize) { + None | Some(NestedTraceStep::Evm(_)) => panic!("Expected call to be a message trace"), + Some(NestedTraceStep::Precompile(ref precompile)) => { + (precompile.return_data.clone(), precompile.exit.clone()) + } + Some(NestedTraceStep::Call(ref call)) => (call.return_data.clone(), call.exit.clone()), + Some(NestedTraceStep::Create(ref create)) => { + (create.return_data.clone(), create.exit.clone()) + } + }; + + if return_data.as_ref() != call_return_data.as_ref() { + return Ok(false); + } + + if exit.is_out_of_gas_error() && call_exit.is_out_of_gas_error() { + return Ok(true); + } + + // If the return data is not empty, and it's still the same, we assume it + // is being propagated + if return_data.len() > 0 { + return Ok(true); + } + + fails_right_after_call(trace, call_subtrace_step_index) +} + +fn other_execution_error_stacktrace( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, + mut stacktrace: Vec, +) -> Result, InferrerError> { + let other_execution_error_frame = StackTraceEntry::OtherExecutionError { + source_reference: get_last_source_reference(trace)?, + }; + + stacktrace.push(other_execution_error_frame); + Ok(stacktrace) +} + +fn solidity_0_6_3_maybe_unmapped_revert( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let steps = trace.steps(); + + if steps.is_empty() { + return Ok(false); + } + + let last_step = steps.last(); + let last_step = match last_step { + Some(NestedTraceStep::Evm(step)) => step, + _ => return Ok(false), + }; + + let last_instruction = contract_meta.get_instruction(last_step.pc)?; + + let Ok(version) = Version::parse(&contract_meta.compiler_version) else { + return Ok(false); + }; + let req = VersionReq::parse(&format!("^{FIRST_SOLC_VERSION_WITH_UNMAPPED_REVERTS}")) + .expect("valid semver"); + + Ok(req.matches(&version) && last_instruction.opcode == OpCode::REVERT) +} + +// Solidity 0.6.3 unmapped reverts special handling +// For more info: https://github.com/ethereum/solidity/issues/9006 +fn solidity_0_6_3_get_frame_for_unmapped_revert_before_function( + trace: &CallMessage, +) -> Result, InferrerError> { + let contract_meta = trace + .contract_meta + .as_ref() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + let revert_frame = solidity_0_6_3_get_frame_for_unmapped_revert_within_function( + CreateOrCallMessageRef::Call(trace), + )?; + + let revert_frame = match revert_frame { + None + | Some(StackTraceEntry::UnmappedSolc0_6_3RevertError { + source_reference: None, + .. + }) => { + if contract.receive.is_none() || trace.calldata.len() > 0 { + // Failed within the fallback + if let Some(fallback) = &contract.fallback { + let location = &fallback.location; + let file = location.file(); + let file = file.read(); + + let source_reference = SourceReference { + contract: Some(contract.name.clone()), + function: Some(FALLBACK_FUNCTION_NAME.to_string()), + source_name: file.source_name.clone(), + source_content: file.content.clone(), + line: location.get_starting_line_number(), + range: (location.offset, location.offset + location.length), + }; + let revert_frame = StackTraceEntry::UnmappedSolc0_6_3RevertError { + source_reference: Some(solidity_0_6_3_correct_line_number( + source_reference, + )), + }; + + Some(revert_frame) + } else { + None + } + } else { + let receive = contract + .receive + .as_ref() + .expect("None always hits branch above"); + + let location = &receive.location; + let file = location.file(); + let file = file.read(); + + let source_reference = SourceReference { + contract: Some(contract.name.clone()), + function: Some(RECEIVE_FUNCTION_NAME.to_string()), + source_name: file.source_name.clone(), + source_content: file.content.clone(), + line: location.get_starting_line_number(), + range: (location.offset, location.offset + location.length), + }; + let revert_frame = StackTraceEntry::UnmappedSolc0_6_3RevertError { + source_reference: Some(solidity_0_6_3_correct_line_number(source_reference)), + }; + + Some(revert_frame) + } + } + Some(revert_frame) => Some(revert_frame), + }; + + Ok(revert_frame) +} + +fn solidity_0_6_3_get_frame_for_unmapped_revert_within_function( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result, InferrerError> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let contract = contract_meta.contract.read(); + + let steps = trace.steps(); + + // If we are within a function there's a last valid location. It may + // be the entire contract. + let prev_inst = get_last_instruction_with_valid_location(trace)?; + let last_step = match steps.last() { + Some(NestedTraceStep::Evm(step)) => step, + _ => return Err(InferrerError::ExpectedEvmStep), + }; + let next_inst_pc = last_step.pc + 1; + let has_next_inst = contract_meta.has_instruction(next_inst_pc); + + if has_next_inst { + let next_inst = contract_meta.get_instruction(next_inst_pc)?; + + let prev_loc = prev_inst.as_ref().and_then(|i| i.location.as_deref()); + let next_loc = next_inst.location.as_deref(); + + let prev_func = prev_loc.and_then(SourceLocation::get_containing_function); + let next_func = next_loc.and_then(SourceLocation::get_containing_function); + + // This is probably a require. This means that we have the exact + // line, but the stack trace may be degraded (e.g. missing our + // synthetic call frames when failing in a modifier) so we still + // add this frame as UNMAPPED_SOLC_0_6_3_REVERT_ERROR + match (&prev_func, &next_loc, &prev_loc) { + (Some(_), Some(next_loc), Some(prev_loc)) if prev_loc == next_loc => { + let source_reference = instruction_within_function_to_unmapped_solc_0_6_3_revert_error_source_reference( + trace, + next_inst, + )?; + return Ok(Some(StackTraceEntry::UnmappedSolc0_6_3RevertError { + source_reference, + })); + } + _ => {} + } + + let source_reference = if prev_func.is_some() && prev_inst.is_some() { + instruction_within_function_to_unmapped_solc_0_6_3_revert_error_source_reference( + trace, + prev_inst.as_ref().unwrap(), + )? + } else if next_func.is_some() { + instruction_within_function_to_unmapped_solc_0_6_3_revert_error_source_reference( + trace, next_inst, + )? + } else { + None + }; + + return Ok(Some(StackTraceEntry::UnmappedSolc0_6_3RevertError { + source_reference: source_reference.map(solidity_0_6_3_correct_line_number), + })); + } + + if matches!(trace, CreateOrCallMessageRef::Create(_)) && prev_inst.is_some() { + // Solidity is smart enough to stop emitting extra instructions after + // an unconditional revert happens in a constructor. If this is the case + // we just return a special error. + + let source_reference = + instruction_within_function_to_unmapped_solc_0_6_3_revert_error_source_reference( + trace, + prev_inst.as_ref().unwrap(), + )? + .map_or_else( + || { + // When the latest instruction is not within a function we need + // some default sourceReference to show to the user + let location = &contract.location; + let file = location.file(); + let file = file.read(); + + let mut default_source_reference = SourceReference { + function: Some(CONSTRUCTOR_FUNCTION_NAME.to_string()), + contract: Some(contract.name.clone()), + source_name: file.source_name.clone(), + source_content: file.content.clone(), + line: location.get_starting_line_number(), + range: (location.offset, location.offset + location.length), + }; + + if let Some(constructor) = &contract.constructor { + default_source_reference.line = + constructor.location.get_starting_line_number(); + } + + default_source_reference + }, + solidity_0_6_3_correct_line_number, + ); + + return Ok(Some(StackTraceEntry::UnmappedSolc0_6_3RevertError { + source_reference: Some(source_reference), + })); + } + + if let Some(prev_inst) = prev_inst { + // We may as well just be in a function or modifier and just happen + // to be at the last instruction of the runtime bytecode. + // In this case we just return whatever the last mapped intruction + // points to. + let source_reference = + instruction_within_function_to_unmapped_solc_0_6_3_revert_error_source_reference( + trace, &prev_inst, + )? + .map(solidity_0_6_3_correct_line_number); + + return Ok(Some(StackTraceEntry::UnmappedSolc0_6_3RevertError { + source_reference, + })); + } + + Ok(None) +} + +fn solidity_0_6_3_correct_line_number(mut source_reference: SourceReference) -> SourceReference { + let lines: Vec<_> = source_reference.source_content.split('\n').collect(); + + let current_line = lines[source_reference.line as usize - 1]; + if current_line.contains("require") || current_line.contains("revert") { + return source_reference; + } + + let next_lines = &lines + .get(source_reference.line as usize..) + .unwrap_or_default(); + let first_non_empty_line = next_lines.iter().position(|l| !l.trim().is_empty()); + + let Some(first_non_empty_line) = first_non_empty_line else { + return source_reference; + }; + + let next_line = next_lines[first_non_empty_line]; + if next_line.contains("require") || next_line.contains("revert") { + source_reference.line += 1 + first_non_empty_line as u32; + } + + source_reference +} + +fn source_location_to_source_reference( + contract_meta: &ContractMetadata, + location: Option<&SourceLocation>, +) -> Option { + let location = location?; + let func = location.get_containing_function()?; + + let func_name = match func.r#type { + ContractFunctionType::Constructor => CONSTRUCTOR_FUNCTION_NAME.to_string(), + ContractFunctionType::Fallback => FALLBACK_FUNCTION_NAME.to_string(), + ContractFunctionType::Receive => RECEIVE_FUNCTION_NAME.to_string(), + _ => func.name.clone(), + }; + + let func_location_file = func.location.file(); + let func_location_file = func_location_file.read(); + + Some(SourceReference { + function: Some(func_name.clone()), + contract: if func.r#type == ContractFunctionType::FreeFunction { + None + } else { + Some(contract_meta.contract.read().name.clone()) + }, + source_name: func_location_file.source_name.clone(), + source_content: func_location_file.content.clone(), + line: location.get_starting_line_number(), + range: (location.offset, location.offset + location.length), + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_sol_value_to_string() { + assert_eq!( + format_dyn_sol_value(&DynSolValue::String("hello".to_string())), + "\"hello\"" + ); + // Uniform, 0-prefixed hex strings + assert_eq!( + format_dyn_sol_value(&DynSolValue::Address([0u8; 20].into())), + format!(r#""0x{}""#, "0".repeat(2 * 20)) + ); + assert_eq!( + format_dyn_sol_value(&DynSolValue::Bytes(vec![0u8; 32])), + format!(r#""0x{}""#, "0".repeat(2 * 32)) + ); + assert_eq!( + format_dyn_sol_value(&DynSolValue::FixedBytes([0u8; 32].into(), 10)), + format!(r#""0x{}""#, "0".repeat(2 * 10)) + ); + assert_eq!( + format_dyn_sol_value(&DynSolValue::FixedBytes([0u8; 32].into(), 32)), + format!(r#""0x{}""#, "0".repeat(2 * 32)) + ); + } +} diff --git a/crates/edr_solidity/src/exit_code.rs b/crates/edr_solidity/src/exit_code.rs new file mode 100644 index 000000000..e3ada4387 --- /dev/null +++ b/crates/edr_solidity/src/exit_code.rs @@ -0,0 +1,63 @@ +//! Exit code of the EVM. + +use edr_eth::{ + result::{HaltReason, OutOfGasError}, + spec::HaltReasonTrait, +}; + +/// Represents the exit code of the EVM. +#[derive(Clone, Debug)] +pub enum ExitCode { + /// Execution was successful. + Success, + /// Execution was reverted. + Revert, + /// Indicates that the EVM has experienced an exceptional halt. + Halt(HaltReasonT), +} + +impl ExitCode { + /// Returns whether the exit code is an error. + pub fn is_error(&self) -> bool { + !matches!(self, Self::Success) + } + + /// Returns whether the exit code is a contract too large error. + pub fn is_contract_too_large_error(&self) -> bool { + if let Self::Halt(reason) = self { + *reason == HaltReason::CreateContractSizeLimit.into() + } else { + false + } + } + + /// Returns whether the exit code is an invalid opcode error. + pub fn is_invalid_opcode_error(&self) -> bool { + if let Self::Halt(reason) = self { + (*reason == HaltReason::InvalidFEOpcode.into()) + | (*reason == HaltReason::OpcodeNotFound.into()) + | (*reason == HaltReason::NotActivated.into()) + } else { + false + } + } + + /// Returns whether the exit code is an out of gas error. + pub fn is_out_of_gas_error(&self) -> bool { + if let Self::Halt(reason) = self { + (*reason == HaltReason::OutOfGas(OutOfGasError::Basic).into()) + | (*reason == HaltReason::OutOfGas(OutOfGasError::MemoryLimit).into()) + | (*reason == HaltReason::OutOfGas(OutOfGasError::Memory).into()) + | (*reason == HaltReason::OutOfGas(OutOfGasError::Precompile).into()) + | (*reason == HaltReason::OutOfGas(OutOfGasError::InvalidOperand).into()) + | (*reason == HaltReason::OutOfGas(OutOfGasError::ReentrancySentry).into()) + } else { + false + } + } + + /// Returns whether the exit code is a revert. + pub fn is_revert(&self) -> bool { + matches!(self, Self::Revert) + } +} diff --git a/crates/edr_solidity/src/lib.rs b/crates/edr_solidity/src/lib.rs index e86a076ed..769f84c38 100644 --- a/crates/edr_solidity/src/lib.rs +++ b/crates/edr_solidity/src/lib.rs @@ -9,9 +9,16 @@ pub mod contracts_identifier; pub mod utils; pub mod artifacts; +pub mod compiler; +pub mod contract_decoder; +pub mod exit_code; pub mod library_utils; -pub mod message_trace; -pub mod vm_tracer; +pub mod nested_trace; +pub mod nested_tracer; +pub mod solidity_stack_trace; +pub mod solidity_tracer; -pub mod compiler; -pub mod source_map; +mod error_inferrer; +mod mapped_inline_internal_functions_heuristics; +mod return_data; +mod source_map; diff --git a/crates/edr_solidity/src/mapped_inline_internal_functions_heuristics.rs b/crates/edr_solidity/src/mapped_inline_internal_functions_heuristics.rs new file mode 100644 index 000000000..e32430a6b --- /dev/null +++ b/crates/edr_solidity/src/mapped_inline_internal_functions_heuristics.rs @@ -0,0 +1,176 @@ +//! This file includes Solidity tracing heuristics for solc starting with +//! version 0.6.9. +//! +//! This solc version introduced a significant change to how sourcemaps are +//! handled for inline yul/internal functions. These were mapped to the +//! unmapped/-1 file before, which lead to many unmapped reverts. Now, they are +//! mapped to the part of the Solidity source that lead to their inlining. +//! +//! This change is a very positive change, as errors would point to the correct +//! line by default. The only problem is that we used to rely very heavily on +//! unmapped reverts to decide when our error detection heuristics were to be +//! run. In fact, these heuristics were first introduced because of unmapped +//! reverts. +//! +//! Instead of synthetically completing stack traces when unmapped reverts +//! occur, we now start from complete stack traces and adjust them if we can +//! provide more meaningful errors. + +use edr_eth::{bytecode::opcode::OpCode, spec::HaltReasonTrait}; +use semver::Version; + +use crate::{ + build_model::ContractMetadataError, + nested_trace::{CreateOrCallMessageRef, EvmStep, NestedTraceStep}, + solidity_stack_trace::StackTraceEntry, +}; + +const FIRST_SOLC_VERSION_WITH_MAPPED_SMALL_INTERNAL_FUNCTIONS: Version = Version::new(0, 6, 9); + +#[derive(Debug, thiserror::Error)] +pub enum HeuristicsError { + #[error(transparent)] + BytecodeError(#[from] ContractMetadataError), + #[error("Missing contract")] + MissingContract, +} + +pub fn stack_trace_may_require_adjustments( + stacktrace: &[StackTraceEntry], + decoded_trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result { + let contract_meta = decoded_trace + .contract_meta() + .ok_or(HeuristicsError::MissingContract)?; + + let Some(last_frame) = stacktrace.last() else { + return Ok(false); + }; + + if let StackTraceEntry::RevertError { + is_invalid_opcode_error, + return_data, + .. + } = last_frame + { + let result = !is_invalid_opcode_error + && return_data.is_empty() + && Version::parse(&contract_meta.compiler_version) + .map(|version| version >= FIRST_SOLC_VERSION_WITH_MAPPED_SMALL_INTERNAL_FUNCTIONS) + .unwrap_or(false); + return Ok(result); + } + + Ok(false) +} + +pub fn adjust_stack_trace( + mut stacktrace: Vec, + decoded_trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result, HeuristicsError> { + let Some(StackTraceEntry::RevertError { + source_reference, .. + }) = stacktrace.last() + else { + unreachable!("This should be only used immediately after we check with `stack_trace_may_require_adjustments` that the last frame is a revert frame"); + }; + + // Replace the last revert frame with an adjusted frame if needed + if is_non_contract_account_called_error(decoded_trace)? { + let last_revert_frame_source_reference = source_reference.clone(); + stacktrace.pop(); + stacktrace.push(StackTraceEntry::NoncontractAccountCalledError { + source_reference: last_revert_frame_source_reference, + }); + return Ok(stacktrace); + } + + if is_constructor_invalid_params_error(decoded_trace)? { + let last_revert_frame_source_reference = source_reference.clone(); + stacktrace.pop(); + stacktrace.push(StackTraceEntry::InvalidParamsError { + source_reference: last_revert_frame_source_reference, + }); + return Ok(stacktrace); + } + + if is_call_invalid_params_error(decoded_trace)? { + let last_revert_frame_source_reference = source_reference.clone(); + stacktrace.pop(); + stacktrace.push(StackTraceEntry::InvalidParamsError { + source_reference: last_revert_frame_source_reference, + }); + + return Ok(stacktrace); + } + + Ok(stacktrace) +} + +fn is_non_contract_account_called_error( + decoded_trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result { + match_opcodes( + decoded_trace, + -9, + &[ + OpCode::EXTCODESIZE, + OpCode::ISZERO, + OpCode::DUP1, + OpCode::ISZERO, + ], + ) +} + +fn is_constructor_invalid_params_error( + decoded_trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result { + Ok(match_opcodes(decoded_trace, -20, &[OpCode::CODESIZE])? + && match_opcodes(decoded_trace, -15, &[OpCode::CODECOPY])? + && match_opcodes(decoded_trace, -7, &[OpCode::LT, OpCode::ISZERO])?) +} + +fn is_call_invalid_params_error( + decoded_trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result { + Ok(match_opcodes(decoded_trace, -11, &[OpCode::CALLDATASIZE])? + && match_opcodes(decoded_trace, -7, &[OpCode::LT, OpCode::ISZERO])?) +} + +fn match_opcodes( + decoded_trace: CreateOrCallMessageRef<'_, HaltReasonT>, + first_step_index: i32, + opcodes: &[OpCode], +) -> Result { + let contract_meta = decoded_trace + .contract_meta() + .ok_or(HeuristicsError::MissingContract)?; + let steps = decoded_trace.steps(); + + // If the index is negative, we start from the end of the trace, + // just like in the original JS code + let mut index = match first_step_index { + 0.. => first_step_index as usize, + ..=-1 if first_step_index.abs() < steps.len() as i32 => { + (steps.len() as i32 + first_step_index) as usize + } + // Out of bounds + _ => return Ok(false), + }; + + for opcode in opcodes { + let Some(NestedTraceStep::Evm(EvmStep { pc })) = steps.get(index) else { + return Ok(false); + }; + + let instruction = contract_meta.get_instruction(*pc)?; + + if instruction.opcode != *opcode { + return Ok(false); + } + + index += 1; + } + + Ok(true) +} diff --git a/crates/edr_solidity/src/message_trace.rs b/crates/edr_solidity/src/message_trace.rs deleted file mode 100644 index 6cb9a562c..000000000 --- a/crates/edr_solidity/src/message_trace.rs +++ /dev/null @@ -1,126 +0,0 @@ -//! Naive Rust port of the `MessageTrace` et al. from Hardhat. - -use std::{cell::RefCell, rc::Rc}; - -use edr_eth::{result::HaltReason, Address, Bytes, U256}; - -use crate::build_model::Bytecode; - -/// Represents the exit code of the EVM. -#[derive(Clone, Debug)] -pub enum ExitCode { - /// Execution was successful. - Success, - /// Execution was reverted. - Revert, - /// Indicates that the EVM has experienced an exceptional halt. - Halt(HaltReason), -} - -/// Represents a message trace. Naive Rust port of the `MessageTrace` from -/// Hardhat. -#[derive(Clone, Debug)] -pub enum MessageTrace { - /// Represents a create message trace. - Create(CreateMessageTrace), - /// Represents a call message trace. - Call(CallMessageTrace), - /// Represents a precompile message trace. - Precompile(PrecompileMessageTrace), -} - -impl MessageTrace { - /// Returns a reference to the the common fields of the message trace. - pub fn base(&mut self) -> &mut BaseMessageTrace { - match self { - MessageTrace::Create(create) => &mut create.base.base, - MessageTrace::Call(call) => &mut call.base.base, - MessageTrace::Precompile(precompile) => &mut precompile.base, - } - } -} - -/// Represents the common fields of a message trace. -#[derive(Clone, Debug)] -pub struct BaseMessageTrace { - /// Value of the message. - pub value: U256, - /// Return data buffer. - pub return_data: Bytes, - /// EVM exit code. - pub exit: ExitCode, - /// How much gas was used. - pub gas_used: u64, - /// Depth of the message. - pub depth: usize, -} - -/// Represents a precompile message trace. -#[derive(Clone, Debug)] -pub struct PrecompileMessageTrace { - /// Common fields of the message trace. - pub base: BaseMessageTrace, - /// Precompile number. - pub precompile: u32, - /// Calldata buffer - pub calldata: Bytes, -} - -/// Represents a base EVM message trace. -#[derive(Clone, Debug)] -pub struct BaseEvmMessageTrace { - /// Common fields of the message trace. - pub base: BaseMessageTrace, - /// Code of the contract that is being executed. - pub code: Bytes, - /// Children message traces. - pub steps: Vec, - /// Resolved metadata of the contract that is being executed. - /// Filled in the JS side by `ContractsIdentifier`. - pub bytecode: Option>, - // The following is just an optimization: When processing this traces it's useful to know ahead - // of time how many subtraces there are. - /// Number of subtraces. Used to speed up the processing of the traces in - /// JS. - pub number_of_subtraces: u32, -} - -/// Represents a create message trace. -#[derive(Clone, Debug)] -pub struct CreateMessageTrace { - /// Common fields - pub base: BaseEvmMessageTrace, - /// Address of the deployed contract. - pub deployed_contract: Option, -} - -/// Represents a call message trace. -#[derive(Clone, Debug)] -pub struct CallMessageTrace { - /// Common fields - pub base: BaseEvmMessageTrace, - /// Calldata buffer - pub calldata: Bytes, - /// Address of the contract that is being executed. - pub address: Address, - /// Address of the code that is being executed. - pub code_address: Address, -} - -/// Represents a message trace step. Naive Rust port of the `MessageTraceStep` -/// from Hardhat. -#[derive(Clone, Debug)] -pub enum MessageTraceStep { - /// [`MessageTrace`] variant. - // It's both read and written to (updated) by the `VmTracer`. - Message(Rc>), - /// [`EvmStep`] variant. - Evm(EvmStep), -} - -/// Minimal EVM step that contains only PC (program counter). -#[derive(Clone, Debug)] -pub struct EvmStep { - /// Program counter - pub pc: u64, -} diff --git a/crates/edr_solidity/src/nested_trace.rs b/crates/edr_solidity/src/nested_trace.rs new file mode 100644 index 000000000..3ffd37e58 --- /dev/null +++ b/crates/edr_solidity/src/nested_trace.rs @@ -0,0 +1,228 @@ +//! Naive Rust port of the `MessageTrace` et al. from Hardhat. + +use std::sync::Arc; + +use derive_where::derive_where; +use edr_eth::{spec::HaltReasonTrait, Address, Bytes, U256}; + +use crate::{build_model::ContractMetadata, exit_code::ExitCode}; + +/// An EVM trace where the steps are nested according to the call stack. +#[derive(Clone, Debug)] +pub enum NestedTrace { + /// Represents a create trace. + Create(CreateMessage), + /// Represents a call trace. + Call(CallMessage), + /// Represents a precompile trace. + Precompile(PrecompileMessage), +} + +impl NestedTrace { + /// Returns the exit code of the trace. + pub fn exit_code(&self) -> &ExitCode { + match self { + Self::Create(create) => &create.exit, + Self::Call(call) => &call.exit, + Self::Precompile(precompile) => &precompile.exit, + } + } +} + +/// Represents a precompile message. +#[derive(Clone, Debug)] +pub struct PrecompileMessage { + /// Precompile number. + pub precompile: u32, + /// Calldata buffer + pub calldata: Bytes, + /// Value of the message. + pub value: U256, + /// Return data buffer. + pub return_data: Bytes, + /// EVM exit code. + pub exit: ExitCode, + /// How much gas was used. + pub gas_used: u64, + /// Depth of the message. + pub depth: usize, +} + +/// Represents a create message. +#[derive(Clone, Debug)] +pub struct CreateMessage { + // The following is just an optimization: When processing this traces it's useful to know ahead + // of time how many subtraces there are. + /// Number of subtraces. Used to speed up the processing of the traces in + /// JS. + pub number_of_subtraces: u32, + /// Children messages. + pub steps: Vec>, + /// Resolved metadata of the contract that is being executed. + pub contract_meta: Option>, + /// Address of the deployed contract. + pub deployed_contract: Option, + /// Code of the contract that is being executed. + pub code: Bytes, + /// Value of the message. + pub value: U256, + /// Return data buffer. + pub return_data: Bytes, + /// EVM exit code. + pub exit: ExitCode, + /// How much gas was used. + pub gas_used: u64, + /// Depth of the message. + pub depth: usize, +} + +/// Represents a call message with contract metadata. +#[derive(Clone, Debug)] +pub struct CallMessage { + // The following is just an optimization: When processing this traces it's useful to know ahead + // of time how many subtraces there are. + /// Number of subtraces. Used to speed up the processing of the traces in + /// JS. + pub number_of_subtraces: u32, + /// Children messages. + pub steps: Vec>, + /// Resolved metadata of the contract that is being executed. + pub contract_meta: Option>, + /// Calldata buffer + pub calldata: Bytes, + /// Address of the contract that is being executed. + pub address: Address, + /// Address of the code that is being executed. + pub code_address: Address, + /// Code of the contract that is being executed. + pub code: Bytes, + /// Value of the message. + pub value: U256, + /// Return data buffer. + pub return_data: Bytes, + /// EVM exit code. + pub exit: ExitCode, + /// How much gas was used. + pub gas_used: u64, + /// Depth of the message. + pub depth: usize, +} + +/// Represents a create or call message. +#[derive(Clone, Debug)] +pub enum CreateOrCallMessage { + /// Represents a create message. + Create(CreateMessage), + /// Represents a call message. + Call(CallMessage), +} + +impl From> + for CreateOrCallMessage +{ + fn from(value: CreateMessage) -> Self { + CreateOrCallMessage::Create(value) + } +} + +impl From> + for CreateOrCallMessage +{ + fn from(value: CallMessage) -> Self { + CreateOrCallMessage::Call(value) + } +} + +/// Represents a create or call message. +#[derive(Debug)] +#[derive_where(Clone, Copy)] +pub(crate) enum CreateOrCallMessageRef<'a, HaltReasonT: HaltReasonTrait> { + /// Represents a create message. + Create(&'a CreateMessage), + /// Represents a call message. + Call(&'a CallMessage), +} + +impl<'a, HaltReasonT: HaltReasonTrait> CreateOrCallMessageRef<'a, HaltReasonT> { + pub fn contract_meta(&self) -> Option> { + match self { + CreateOrCallMessageRef::Create(create) => create.contract_meta.as_ref().map(Arc::clone), + CreateOrCallMessageRef::Call(call) => call.contract_meta.as_ref().map(Arc::clone), + } + } + + pub fn exit_code(&self) -> &ExitCode { + match self { + CreateOrCallMessageRef::Create(create) => &create.exit, + CreateOrCallMessageRef::Call(call) => &call.exit, + } + } + + pub fn number_of_subtraces(&self) -> u32 { + match self { + CreateOrCallMessageRef::Create(create) => create.number_of_subtraces, + CreateOrCallMessageRef::Call(call) => call.number_of_subtraces, + } + } + + pub fn return_data(&self) -> &Bytes { + match self { + CreateOrCallMessageRef::Create(create) => &create.return_data, + CreateOrCallMessageRef::Call(call) => &call.return_data, + } + } + + pub fn steps(&self) -> &'a [NestedTraceStep] { + match self { + CreateOrCallMessageRef::Create(create) => create.steps.as_slice(), + CreateOrCallMessageRef::Call(call) => call.steps.as_slice(), + } + } +} + +impl<'a, HaltReasonT: HaltReasonTrait> From<&'a CreateOrCallMessage> + for CreateOrCallMessageRef<'a, HaltReasonT> +{ + fn from(value: &'a CreateOrCallMessage) -> Self { + match value { + CreateOrCallMessage::Create(create) => CreateOrCallMessageRef::Create(create), + CreateOrCallMessage::Call(call) => CreateOrCallMessageRef::Call(call), + } + } +} + +impl<'a, HaltReasonT: HaltReasonTrait> From<&'a CreateMessage> + for CreateOrCallMessageRef<'a, HaltReasonT> +{ + fn from(value: &'a CreateMessage) -> Self { + CreateOrCallMessageRef::Create(value) + } +} + +impl<'a, HaltReasonT: HaltReasonTrait> From<&'a CallMessage> + for CreateOrCallMessageRef<'a, HaltReasonT> +{ + fn from(value: &'a CallMessage) -> Self { + CreateOrCallMessageRef::Call(value) + } +} + +/// Represents a nested trace step with contract metadata. +#[derive(Clone, Debug)] +pub enum NestedTraceStep { + /// Represents a create message. + Create(CreateMessage), + /// Represents a call message. + Call(CallMessage), + /// Represents a precompile message. + Precompile(PrecompileMessage), + /// Minimal EVM step that contains only PC (program counter). + Evm(EvmStep), +} + +/// Minimal EVM step that contains only PC (program counter). +#[derive(Clone, Debug)] +pub struct EvmStep { + /// Program counter + pub pc: u32, +} diff --git a/crates/edr_solidity/src/nested_tracer.rs b/crates/edr_solidity/src/nested_tracer.rs new file mode 100644 index 000000000..7ba00aa2a --- /dev/null +++ b/crates/edr_solidity/src/nested_tracer.rs @@ -0,0 +1,469 @@ +//! Naive Rust port of the `VmTracer` from Hardhat. + +use std::{cell::RefCell, rc::Rc}; + +use edr_eth::{result::ExecutionResult, spec::HaltReasonTrait, Address, Bytes, U160, U256}; +use edr_evm::trace::{BeforeMessage, Step}; + +use crate::{ + exit_code::ExitCode, + nested_trace::{ + CallMessage, CreateMessage, EvmStep, NestedTrace, NestedTraceStep, PrecompileMessage, + }, +}; + +/// Errors that can occur during the generation of the nested trace. +#[derive(Debug, thiserror::Error)] +pub enum NestedTracerError { + /// Invalid input: The created address should be defined in the successful + #[error("Created address should be defined in successful create trace")] + MissingAddressInExecutionResult, + /// Invalid input: Missing code address. + #[error("Missing code address")] + MissingCodeAddress, + /// Invalid input: Missing code. + #[error("Missing code")] + MissingCode, + /// Invalid input: Message execution started while a precompile was + /// executing. + #[error("Message execution started while a precompile was executing")] + MessageDuringPreCompile, + /// Invalid input: Step event fired while a precompile was executing. + #[error("Step event fired while a precompile was executing")] + StepDuringPreCompile, +} + +/// Observes a trace, collecting information about the execution of the EVM. +pub fn convert_trace_messages_to_nested_trace( + trace: edr_evm::trace::Trace, +) -> Result>, NestedTracerError> { + let mut tracer = NestedTracer::new(); + + tracer.add_messages(trace.messages)?; + + Ok(tracer.get_last_top_level_message_trace()) +} + +/// Naive Rust port of the `VmTracer` from Hardhat. +struct NestedTracer { + tracing_steps: Vec, + message_traces: Vec>>>, +} + +impl Default for NestedTracer { + fn default() -> Self { + Self::new() + } +} + +// Temporarily hardcoded to remove the need of using ethereumjs' common and evm +// TODO(#565): We should be using a more robust check by checking the hardfork +// config (and potentially other config like optional support for RIP +// precompiles, which start at 0x100). +const MAX_PRECOMPILE_NUMBER: u16 = 10; + +impl NestedTracer { + /// Creates a new [`NestedTracer`]. + const fn new() -> Self { + NestedTracer { + tracing_steps: Vec::new(), + message_traces: Vec::new(), + } + } + + /// Returns a reference to the last top-level message trace. + fn get_last_top_level_message_trace(mut self) -> Option> { + self.message_traces.pop().map(convert_to_external_trace) + } + + fn add_messages( + &mut self, + messages: Vec>, + ) -> Result<(), NestedTracerError> { + for msg in messages { + match msg { + edr_evm::trace::TraceMessage::Before(before) => { + self.add_before_message(before)?; + } + edr_evm::trace::TraceMessage::Step(step) => { + self.add_step(step)?; + } + edr_evm::trace::TraceMessage::After(after) => { + self.add_after_message(after.execution_result)?; + } + } + } + Ok(()) + } + + fn add_before_message(&mut self, message: BeforeMessage) -> Result<(), NestedTracerError> { + let trace: InternalNestedTrace; + + if message.depth == 0 { + self.message_traces.clear(); + self.tracing_steps.clear(); + } + + if let Some(to) = message.to { + let to_as_u160 = U160::from_be_bytes(**to); + + if to_as_u160 <= U160::from(MAX_PRECOMPILE_NUMBER) { + let precompile: u32 = to_as_u160 + .try_into() + .expect("MAX_PRECOMPILE_NUMBER is of type u16 so it fits"); + + let precompile_trace = PrecompileMessage { + value: message.value, + exit: ExitCode::Success, + return_data: Bytes::new(), + depth: message.depth, + gas_used: 0, + precompile, + calldata: message.data, + }; + + trace = InternalNestedTrace::Precompile(precompile_trace); + } else { + // if we enter here, then `to` is not None, therefore + // `code_address` and `code` should be Some + let code_address = message + .code_address + .ok_or(NestedTracerError::MissingCodeAddress)?; + let code = message.code.ok_or(NestedTracerError::MissingCode)?; + + let call_trace = InternalCallMessage { + steps: Vec::new(), + calldata: message.data, + address: to, + code_address, + depth: message.depth, + value: message.value, + exit: ExitCode::Success, + return_data: Bytes::new(), + gas_used: 0, + code: code.original_bytes(), + number_of_subtraces: 0, + }; + + trace = InternalNestedTrace::Call(call_trace); + } + } else { + let create_trace = InternalCreateMessage { + number_of_subtraces: 0, + steps: Vec::new(), + depth: message.depth, + value: message.value, + exit: ExitCode::Success, + return_data: Bytes::new(), + gas_used: 0, + code: message.data, + deployed_contract: None, + }; + + trace = InternalNestedTrace::Create(create_trace); + } + + // We need to share it so that adding steps when processing via stack + // also updates the inner elements + let trace = Rc::new(RefCell::new(trace)); + + if let Some(parent_ref) = self.message_traces.last_mut() { + let mut parent_trace = parent_ref.borrow_mut(); + match &mut *parent_trace { + InternalNestedTrace::Precompile(_) => { + return Err(NestedTracerError::MessageDuringPreCompile); + } + InternalNestedTrace::Create(create) => { + create + .steps + .push(InternalNestedTraceStep::Message(Rc::clone(&trace))); + create.number_of_subtraces += 1; + } + InternalNestedTrace::Call(call) => { + call.steps + .push(InternalNestedTraceStep::Message(Rc::clone(&trace))); + call.number_of_subtraces += 1; + } + }; + } + + self.message_traces.push(trace); + + Ok(()) + } + + fn add_step(&mut self, step: Step) -> Result<(), NestedTracerError> { + if let Some(parent_ref) = self.message_traces.last_mut() { + let mut parent_trace = parent_ref.borrow_mut(); + let steps = match &mut *parent_trace { + InternalNestedTrace::Precompile(_) => { + return Err(NestedTracerError::StepDuringPreCompile); + } + InternalNestedTrace::Create(create) => &mut create.steps, + InternalNestedTrace::Call(call) => &mut call.steps, + }; + + steps.push(InternalNestedTraceStep::Evm(EvmStep { pc: step.pc })); + } + + self.tracing_steps.push(step); + + Ok(()) + } + + fn add_after_message( + &mut self, + result: ExecutionResult, + ) -> Result<(), NestedTracerError> { + if let Some(trace) = self.message_traces.last_mut() { + let mut trace = trace.borrow_mut(); + + trace.set_gas_used(result.gas_used()); + + match result { + ExecutionResult::Success { output, .. } => { + trace.set_exit_code(ExitCode::Success); + trace.set_return_data(output.data().clone()); + + if let InternalNestedTrace::Create(trace) = &mut *trace { + let address = output + .address() + .ok_or(NestedTracerError::MissingAddressInExecutionResult)?; + + trace.deployed_contract = Some(address.as_slice().to_vec().into()); + } + } + ExecutionResult::Halt { reason, .. } => { + trace.set_exit_code(ExitCode::Halt(reason)); + trace.set_return_data(Bytes::new()); + } + ExecutionResult::Revert { output, .. } => { + trace.set_exit_code(ExitCode::Revert); + trace.set_return_data(output); + } + } + } + + if self.message_traces.len() > 1 { + self.message_traces.pop(); + } + + Ok(()) + } +} + +/// A nested trace where the message steps are shared and mutable via a +/// refcell. +#[derive(Clone, Debug)] +enum InternalNestedTrace { + Create(InternalCreateMessage), + Call(InternalCallMessage), + Precompile(PrecompileMessage), +} + +impl InternalNestedTrace { + fn set_gas_used(&mut self, gas_used: u64) { + match self { + InternalNestedTrace::Create(create) => create.gas_used = gas_used, + InternalNestedTrace::Call(call) => call.gas_used = gas_used, + + InternalNestedTrace::Precompile(precompile) => precompile.gas_used = gas_used, + } + } + + fn set_exit_code(&mut self, exit_code: ExitCode) { + match self { + InternalNestedTrace::Create(create) => create.exit = exit_code, + InternalNestedTrace::Call(call) => call.exit = exit_code, + + InternalNestedTrace::Precompile(precompile) => precompile.exit = exit_code, + } + } + + fn set_return_data(&mut self, return_data: Bytes) { + match self { + InternalNestedTrace::Create(create) => create.return_data = return_data, + InternalNestedTrace::Call(call) => call.return_data = return_data, + + InternalNestedTrace::Precompile(precompile) => precompile.return_data = return_data, + } + } +} + +/// Represents a call message. +#[derive(Clone, Debug)] +struct InternalCallMessage { + // The following is just an optimization: When processing this traces it's useful to know ahead + // of time how many subtraces there are. + /// Number of subtraces. Used to speed up the processing of the traces in + /// JS. + pub number_of_subtraces: u32, + /// Children messages. + pub steps: Vec>, + /// Calldata buffer + pub calldata: Bytes, + /// Address of the contract that is being executed. + pub address: Address, + /// Address of the code that is being executed. + pub code_address: Address, + /// Code of the contract that is being executed. + pub code: Bytes, + /// Value of the message. + pub value: U256, + /// Return data buffer. + pub return_data: Bytes, + /// EVM exit code. + pub exit: ExitCode, + /// How much gas was used. + pub gas_used: u64, + /// Depth of the message. + pub depth: usize, +} + +/// Represents a create message. +#[derive(Clone, Debug)] +struct InternalCreateMessage { + // The following is just an optimization: When processing this traces it's useful to know ahead + // of time how many subtraces there are. + /// Number of subtraces. Used to speed up the processing of the traces in + /// JS. + pub number_of_subtraces: u32, + /// Children messages. + pub steps: Vec>, + /// Address of the deployed contract. + pub deployed_contract: Option, + /// Code of the contract that is being executed. + pub code: Bytes, + /// Value of the message. + pub value: U256, + /// Return data buffer. + pub return_data: Bytes, + /// EVM exit code. + pub exit: ExitCode, + /// How much gas was used. + pub gas_used: u64, + /// Depth of the message. + pub depth: usize, +} + +/// Represents a message step. Naive Rust port of the `MessageTraceStep` +/// from Hardhat. +#[derive(Clone, Debug)] +enum InternalNestedTraceStep { + /// [`NestedTrace`] variant. + // It's both read and written to (updated) by the `[NestedTracer]`. + Message(Rc>>), + /// [`EvmStep`] variant. + Evm(EvmStep), +} + +enum InternalNestedTraceStepWithoutRefCell { + Message(NestedTrace), + Evm(EvmStep), +} + +/// Converts the [`InternalNestedTrace`] into a [`NestedTrace`] by +/// cloning it. +/// +/// # Panics +/// +/// Panics if the value is mutably borrowed. +fn convert_to_external_trace( + value: Rc>>, +) -> NestedTrace { + // We can't use `Rc::try_unwrap` because it requires that the `Rc` is unique. + let trace = value.borrow().clone(); + + match trace { + InternalNestedTrace::Create(create) => { + let InternalCreateMessage { + number_of_subtraces, + steps, + deployed_contract, + code, + value, + return_data, + exit, + gas_used, + depth, + } = create; + + NestedTrace::Create(CreateMessage { + number_of_subtraces, + steps: steps.into_iter().map(convert_to_external_step).collect(), + contract_meta: None, + deployed_contract, + code, + value, + return_data, + exit, + gas_used, + depth, + }) + } + InternalNestedTrace::Call(call) => { + let InternalCallMessage { + number_of_subtraces, + steps, + calldata, + address, + code_address, + code, + value, + return_data, + exit, + gas_used, + depth, + } = call; + NestedTrace::Call(CallMessage { + number_of_subtraces, + steps: steps.into_iter().map(convert_to_external_step).collect(), + contract_meta: None, + calldata, + address, + code_address, + code, + value, + return_data, + exit, + gas_used, + depth, + }) + } + InternalNestedTrace::Precompile(precompile) => NestedTrace::Precompile(precompile), + } +} + +/// # Panics +// Panics if a nested value is mutably borrowed. +fn convert_to_external_step( + value: InternalNestedTraceStep, +) -> NestedTraceStep { + match value { + InternalNestedTraceStep::Message(message) => { + InternalNestedTraceStepWithoutRefCell::Message(convert_to_external_trace(message)) + } + InternalNestedTraceStep::Evm(evm_step) => { + InternalNestedTraceStepWithoutRefCell::Evm(evm_step) + } + } + .into() +} + +// This can be a `From` conversion, because it can't panic. +impl From> + for NestedTraceStep +{ + fn from(step: InternalNestedTraceStepWithoutRefCell) -> Self { + match step { + InternalNestedTraceStepWithoutRefCell::Message(trace) => match trace { + NestedTrace::Create(create_trace) => NestedTraceStep::Create(create_trace), + NestedTrace::Call(call_trace) => NestedTraceStep::Call(call_trace), + NestedTrace::Precompile(precompile_trace) => { + NestedTraceStep::Precompile(precompile_trace) + } + }, + InternalNestedTraceStepWithoutRefCell::Evm(evm_step) => NestedTraceStep::Evm(evm_step), + } + } +} diff --git a/crates/edr_solidity/src/return_data.rs b/crates/edr_solidity/src/return_data.rs new file mode 100644 index 000000000..b9371171f --- /dev/null +++ b/crates/edr_solidity/src/return_data.rs @@ -0,0 +1,50 @@ +//! Rewrite of `hardhat-network/provider/return-data.ts` from Hardhat. + +use alloy_sol_types::SolError; +use edr_eth::{Bytes, U256}; + +// Built-in error types +// See +alloy_sol_types::sol! { + error Error(string); + error Panic(uint256); +} + +pub struct ReturnData { + pub value: Bytes, + selector: Option<[u8; 4]>, +} + +impl ReturnData { + pub fn new(value: Bytes) -> Self { + let selector = if value.len() >= 4 { + Some(value[0..4].try_into().expect("checked length")) + } else { + None + }; + + Self { value, selector } + } + + pub fn is_empty(&self) -> bool { + self.value.is_empty() + } + + pub fn matches_selector(&self, selector: impl AsRef<[u8]>) -> bool { + self.selector + .map_or(false, |value| value == selector.as_ref()) + } + + pub fn is_error_return_data(&self) -> bool { + self.selector == Some(Error::SELECTOR) + } + + pub fn is_panic_return_data(&self) -> bool { + self.selector == Some(Panic::SELECTOR) + } + + /// Decodes the panic error code from the return data. + pub fn decode_panic(&self) -> Result { + Panic::abi_decode(&self.value[..], false).map(|p| p._0) + } +} diff --git a/crates/edr_solidity/src/solidity_stack_trace.rs b/crates/edr_solidity/src/solidity_stack_trace.rs new file mode 100644 index 000000000..9910772fd --- /dev/null +++ b/crates/edr_solidity/src/solidity_stack_trace.rs @@ -0,0 +1,193 @@ +//! Stack trace entries for Solidity errors. + +use edr_eth::{Address, Bytes, U256}; + +use crate::build_model::ContractFunctionType; + +pub(crate) const FALLBACK_FUNCTION_NAME: &str = ""; +pub(crate) const RECEIVE_FUNCTION_NAME: &str = ""; +pub(crate) const CONSTRUCTOR_FUNCTION_NAME: &str = "constructor"; +pub(crate) const UNRECOGNIZED_FUNCTION_NAME: &str = ""; +#[allow(unused)] +pub(crate) const UNKNOWN_FUNCTION_NAME: &str = ""; +#[allow(unused)] +pub(crate) const PRECOMPILE_FUNCTION_NAME: &str = ""; +pub(crate) const UNRECOGNIZED_CONTRACT_NAME: &str = ""; + +/// A Solidity source reference. +#[derive(Debug, Clone, Eq, PartialEq)] +pub struct SourceReference { + /// The name of the source file. + pub source_name: String, + /// The content of the source file. + pub source_content: String, + /// The name of the contract. + pub contract: Option, + /// The name of the function. + pub function: Option, + /// The line number. + pub line: u32, + /// The character range on the line. + pub range: (u32, u32), +} + +// The names are self-explanatory. +#[allow(missing_docs)] +#[derive(Debug, Clone)] +pub enum StackTraceEntry { + CallstackEntry { + source_reference: SourceReference, + function_type: ContractFunctionType, + }, + UnrecognizedCreateCallstackEntry, + UnrecognizedContractCallstackEntry { + address: Address, + }, + PrecompileError { + precompile: u32, + }, + RevertError { + return_data: Bytes, + source_reference: SourceReference, + is_invalid_opcode_error: bool, + }, + PanicError { + error_code: U256, + source_reference: Option, + }, + CustomError { + message: String, + source_reference: SourceReference, + }, + FunctionNotPayableError { + value: U256, + source_reference: SourceReference, + }, + InvalidParamsError { + source_reference: SourceReference, + }, + FallbackNotPayableError { + value: U256, + source_reference: SourceReference, + }, + FallbackNotPayableAndNoReceiveError { + value: U256, + source_reference: SourceReference, + }, + // TODO: Should trying to call a private/internal be a special case of this? + UnrecognizedFunctionWithoutFallbackError { + source_reference: SourceReference, + }, + MissingFallbackOrReceiveError { + source_reference: SourceReference, + }, + ReturndataSizeError { + source_reference: SourceReference, + }, + NoncontractAccountCalledError { + source_reference: SourceReference, + }, + CallFailedError { + source_reference: SourceReference, + }, + DirectLibraryCallError { + source_reference: SourceReference, + }, + UnrecognizedCreateError { + return_data: Bytes, + is_invalid_opcode_error: bool, + }, + UnrecognizedContractError { + address: Address, + return_data: Bytes, + is_invalid_opcode_error: bool, + }, + OtherExecutionError { + source_reference: Option, + }, + // This is a special case to handle a regression introduced in solc 0.6.3 + // For more info: https://github.com/ethereum/solidity/issues/9006 + UnmappedSolc0_6_3RevertError { + source_reference: Option, + }, + ContractTooLargeError { + source_reference: Option, + }, + InternalFunctionCallstackEntry { + pc: u32, + source_reference: SourceReference, + }, + ContractCallRunOutOfGasError { + source_reference: Option, + }, +} + +impl StackTraceEntry { + /// Get the source reference of the stack trace entry if any. + pub fn source_reference(&self) -> Option<&SourceReference> { + match self { + StackTraceEntry::CallstackEntry { + source_reference, .. + } + | StackTraceEntry::RevertError { + source_reference, .. + } + | StackTraceEntry::CustomError { + source_reference, .. + } + | StackTraceEntry::FunctionNotPayableError { + source_reference, .. + } + | StackTraceEntry::InvalidParamsError { + source_reference, .. + } + | StackTraceEntry::FallbackNotPayableError { + source_reference, .. + } + | StackTraceEntry::MissingFallbackOrReceiveError { + source_reference, .. + } + | StackTraceEntry::ReturndataSizeError { + source_reference, .. + } + | StackTraceEntry::NoncontractAccountCalledError { + source_reference, .. + } + | StackTraceEntry::CallFailedError { + source_reference, .. + } + | StackTraceEntry::DirectLibraryCallError { + source_reference, .. + } + | StackTraceEntry::UnrecognizedFunctionWithoutFallbackError { + source_reference, .. + } + | StackTraceEntry::InternalFunctionCallstackEntry { + source_reference, .. + } + | StackTraceEntry::FallbackNotPayableAndNoReceiveError { + source_reference, .. + } => Some(source_reference), + StackTraceEntry::PanicError { + source_reference, .. + } + | StackTraceEntry::OtherExecutionError { + source_reference, .. + } + | StackTraceEntry::UnmappedSolc0_6_3RevertError { + source_reference, .. + } + | StackTraceEntry::ContractTooLargeError { + source_reference, .. + } + | StackTraceEntry::ContractCallRunOutOfGasError { + source_reference, .. + } => source_reference.as_ref(), + StackTraceEntry::PrecompileError { .. } + | StackTraceEntry::UnrecognizedCreateError { .. } + | StackTraceEntry::UnrecognizedCreateCallstackEntry + | StackTraceEntry::UnrecognizedContractCallstackEntry { .. } + | StackTraceEntry::UnrecognizedContractError { .. } => None, + } + } +} diff --git a/crates/edr_solidity/src/solidity_tracer.rs b/crates/edr_solidity/src/solidity_tracer.rs new file mode 100644 index 000000000..3ba5b304e --- /dev/null +++ b/crates/edr_solidity/src/solidity_tracer.rs @@ -0,0 +1,270 @@ +//! Generates JS-style stack traces for Solidity errors. + +use edr_eth::{bytecode::opcode::OpCode, spec::HaltReasonTrait}; + +use crate::{ + build_model::{ContractMetadataError, Instruction, JumpType}, + error_inferrer, + error_inferrer::{InferrerError, SubmessageData}, + mapped_inline_internal_functions_heuristics::{ + adjust_stack_trace, stack_trace_may_require_adjustments, HeuristicsError, + }, + nested_trace::{ + CallMessage, CreateMessage, CreateOrCallMessage, CreateOrCallMessageRef, EvmStep, + NestedTrace, NestedTraceStep, PrecompileMessage, + }, + solidity_stack_trace::StackTraceEntry, +}; + +/// Errors that can occur during the generation of the stack trace. +#[derive(Debug, thiserror::Error)] +pub enum SolidityTracerError { + /// Errors that can occur when decoding the contract metadata. + #[error(transparent)] + ContractMetadata(#[from] ContractMetadataError), + /// Errors that can occur during the inference of the stack trace. + #[error(transparent)] + ErrorInferrer(#[from] InferrerError), + /// Errors that can occur during the heuristics. + #[error(transparent)] + Heuristics(#[from] HeuristicsError), +} + +/// Generates a stack trace for the provided nested trace. +pub fn get_stack_trace( + trace: NestedTrace, +) -> Result, SolidityTracerError> { + if !trace.exit_code().is_error() { + return Ok(Vec::default()); + } + + match trace { + NestedTrace::Precompile(precompile) => Ok(get_precompile_message_stack_trace(&precompile)?), + NestedTrace::Call(call) if call.contract_meta.is_some() => { + Ok(get_call_message_stack_trace(call)?) + } + NestedTrace::Create(create) if create.contract_meta.is_some() => { + Ok(get_create_message_stack_trace(create)?) + } + // No bytecode is present + NestedTrace::Call(ref call) => Ok(get_unrecognized_message_stack_trace( + CreateOrCallMessageRef::Call(call), + )?), + NestedTrace::Create(ref create) => Ok(get_unrecognized_message_stack_trace( + CreateOrCallMessageRef::Create(create), + )?), + } +} + +fn get_last_subtrace( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Option> { + if trace.number_of_subtraces() == 0 { + return None; + } + + trace + .steps() + .iter() + .cloned() + .rev() + .find_map(|step| match step { + NestedTraceStep::Evm(EvmStep { .. }) => None, + NestedTraceStep::Precompile(precompile) => Some(NestedTrace::Precompile(precompile)), + NestedTraceStep::Call(call) => Some(NestedTrace::Call(call)), + NestedTraceStep::Create(create) => Some(NestedTrace::Create(create)), + }) +} + +fn get_precompile_message_stack_trace( + trace: &PrecompileMessage, +) -> Result, SolidityTracerError> { + Ok(vec![StackTraceEntry::PrecompileError { + precompile: trace.precompile, + }]) +} + +fn get_create_message_stack_trace( + trace: CreateMessage, +) -> Result, SolidityTracerError> { + let inferred_error = error_inferrer::infer_before_tracing_create_message(&trace)?; + + if let Some(inferred_error) = inferred_error { + return Ok(inferred_error); + } + + trace_evm_execution(trace.into()) +} + +fn get_call_message_stack_trace( + trace: CallMessage, +) -> Result, SolidityTracerError> { + let inferred_error = error_inferrer::infer_before_tracing_call_message(&trace)?; + + if let Some(inferred_error) = inferred_error { + return Ok(inferred_error); + } + + trace_evm_execution(trace.into()) +} + +fn get_unrecognized_message_stack_trace( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result, SolidityTracerError> { + let trace_exit_kind = trace.exit_code(); + let trace_return_data = trace.return_data(); + + let subtrace = get_last_subtrace(trace); + + if let Some(subtrace) = subtrace { + let (is_error, return_data) = match &subtrace { + NestedTrace::Precompile(precompile) => { + (precompile.exit.is_error(), precompile.return_data.clone()) + } + NestedTrace::Call(call) => (call.exit.is_error(), call.return_data.clone()), + NestedTrace::Create(create) => (create.exit.is_error(), create.return_data.clone()), + }; + + // This is not a very exact heuristic, but most of the time it will be right, as + // solidity reverts if a call fails, and most contracts are in + // solidity + if is_error && trace_return_data.as_ref() == return_data.as_ref() { + let unrecognized_entry: StackTraceEntry = match trace { + CreateOrCallMessageRef::Call(CallMessage { address, .. }) => { + StackTraceEntry::UnrecognizedContractCallstackEntry { address: *address } + } + CreateOrCallMessageRef::Create(_) => { + StackTraceEntry::UnrecognizedCreateCallstackEntry + } + }; + + let mut stacktrace = vec![unrecognized_entry]; + stacktrace.extend(get_stack_trace(subtrace)?); + + return Ok(stacktrace); + } + } + + if trace_exit_kind.is_contract_too_large_error() { + return Ok(vec![StackTraceEntry::ContractTooLargeError { + source_reference: None, + }]); + } + + let is_invalid_opcode_error = trace_exit_kind.is_invalid_opcode_error(); + + match trace { + CreateOrCallMessageRef::Call(call) => { + Ok(vec![StackTraceEntry::UnrecognizedContractError { + address: call.address, + return_data: call.return_data.clone(), + is_invalid_opcode_error, + }]) + } + CreateOrCallMessageRef::Create(call) => { + Ok(vec![StackTraceEntry::UnrecognizedCreateError { + return_data: call.return_data.clone(), + is_invalid_opcode_error, + }]) + } + } +} + +fn trace_evm_execution( + trace: CreateOrCallMessage, +) -> Result, SolidityTracerError> { + let stack_trace = raw_trace_evm_execution(CreateOrCallMessageRef::from(&trace))?; + + if stack_trace_may_require_adjustments(&stack_trace, CreateOrCallMessageRef::from(&trace))? { + return adjust_stack_trace(stack_trace, CreateOrCallMessageRef::from(&trace)) + .map_err(SolidityTracerError::from); + } + + Ok(stack_trace) +} + +fn raw_trace_evm_execution( + trace: CreateOrCallMessageRef<'_, HaltReasonT>, +) -> Result, SolidityTracerError> { + let contract_meta = trace + .contract_meta() + .ok_or(InferrerError::MissingContract)?; + let steps = trace.steps(); + let number_of_subtraces = trace.number_of_subtraces(); + + let mut stacktrace: Vec = Vec::default(); + + let mut subtraces_seen = 0; + + // There was a jump into a function according to the sourcemaps + let mut jumped_into_function = false; + + let mut function_jumpdests: Vec<&Instruction> = Vec::default(); + + let mut last_submessage_data: Option> = None; + + let mut iter = steps.iter().enumerate().peekable(); + while let Some((step_index, step)) = iter.next() { + if let NestedTraceStep::Evm(EvmStep { pc }) = step { + let inst = contract_meta.get_instruction(*pc)?; + + if inst.jump_type == JumpType::IntoFunction && iter.peek().is_some() { + let (_, next_step) = iter.peek().unwrap(); + let NestedTraceStep::Evm(next_evm_step) = next_step else { + return Err(InferrerError::ExpectedEvmStep.into()); + }; + let next_inst = contract_meta.get_instruction(next_evm_step.pc)?; + + if next_inst.opcode == OpCode::JUMPDEST { + let frame = error_inferrer::instruction_to_callstack_stack_trace_entry( + &contract_meta, + inst, + )?; + stacktrace.push(frame); + if next_inst.location.is_some() { + jumped_into_function = true; + } + function_jumpdests.push(next_inst); + } + } else if inst.jump_type == JumpType::OutofFunction { + stacktrace.pop(); + function_jumpdests.pop(); + } + } else { + let message_trace = match step { + NestedTraceStep::Evm(_) => unreachable!("branch is taken above"), + NestedTraceStep::Precompile(precompile) => { + NestedTrace::Precompile(precompile.clone()) + } + NestedTraceStep::Call(call) => NestedTrace::Call(call.clone()), + NestedTraceStep::Create(create) => NestedTrace::Create(create.clone()), + }; + + subtraces_seen += 1; + + // If there are more subtraces, this one didn't terminate the execution + if subtraces_seen < number_of_subtraces { + continue; + } + + let submessage_trace = get_stack_trace(message_trace.clone())?; + + last_submessage_data = Some(SubmessageData { + message_trace, + step_index: step_index as u32, + stacktrace: submessage_trace, + }); + } + } + + let stacktrace_with_inferred_error = error_inferrer::infer_after_tracing( + trace, + stacktrace, + &function_jumpdests, + jumped_into_function, + last_submessage_data, + )?; + + error_inferrer::filter_redundant_frames(stacktrace_with_inferred_error) + .map_err(SolidityTracerError::from) +} diff --git a/crates/edr_solidity/src/source_map.rs b/crates/edr_solidity/src/source_map.rs index 291a6c758..0e79ca417 100644 --- a/crates/edr_solidity/src/source_map.rs +++ b/crates/edr_solidity/src/source_map.rs @@ -1,5 +1,5 @@ //! Utility functions for decoding the Solidity compiler source maps. -use std::rc::Rc; +use std::sync::Arc; use edr_eth::bytecode::opcode::OpCode; @@ -146,7 +146,7 @@ fn add_unmapped_instructions(instructions: &mut Vec, bytecode: &[u8 pub fn decode_instructions( bytecode: &[u8], compressed_sourcemaps: &str, - build_model: &Rc, + build_model: &Arc, is_deployment: bool, ) -> Vec { let source_maps = uncompress_sourcemaps(compressed_sourcemaps); @@ -181,7 +181,7 @@ pub fn decode_instructions( .file_id_to_source_file .get(&(source_map.location.file as u32)) .map(|_| { - Rc::new(SourceLocation::new( + Arc::new(SourceLocation::new( build_model.file_id_to_source_file.clone(), source_map.location.file as u32, source_map.location.offset as u32, diff --git a/crates/edr_solidity/src/vm_tracer.rs b/crates/edr_solidity/src/vm_tracer.rs deleted file mode 100644 index 8d4c10327..000000000 --- a/crates/edr_solidity/src/vm_tracer.rs +++ /dev/null @@ -1,273 +0,0 @@ -//! Naive Rust port of the `VmTracer` from Hardhat. - -use std::{cell::RefCell, rc::Rc}; - -use edr_eth::{ - result::{ExecutionResult, HaltReason}, - Bytes, U160, -}; -use edr_evm::trace::{BeforeMessage, Step}; - -use crate::message_trace::{ - BaseEvmMessageTrace, BaseMessageTrace, CallMessageTrace, CreateMessageTrace, EvmStep, ExitCode, - MessageTrace, MessageTraceStep, PrecompileMessageTrace, -}; - -type MessageTraceRefCell = Rc>; - -/// Naive Rust port of the `VmTracer` from Hardhat. -pub struct VmTracer { - tracing_steps: Vec, - message_traces: Vec, - last_error: Option<&'static str>, -} - -impl Default for VmTracer { - fn default() -> Self { - Self::new() - } -} - -// Temporarily hardcoded to remove the need of using ethereumjs' common and evm -// TODO(#565): We should be using a more robust check by checking the hardfork -// config (and potentially other config like optional support for RIP -// precompiles, which start at 0x100). -const MAX_PRECOMPILE_NUMBER: u16 = 10; - -impl VmTracer { - /// Creates a new [`VmTracer`]. - pub const fn new() -> Self { - VmTracer { - tracing_steps: vec![], - message_traces: vec![], - last_error: None, - } - } - - /// Returns a reference to the last top-level message trace. - /// # Panics - /// This function panics if executed concurrently with [`Self::observe`]. - pub fn get_last_top_level_message_trace(&self) -> Option { - self.message_traces - .last() - .map(|x| RefCell::borrow(x).clone()) - } - - /// Returns a reference to the last top-level message trace. - /// The reference is only being mutated for the duration of - /// [`Self::observe`] call. - pub fn get_last_top_level_message_trace_ref(&self) -> Option<&MessageTraceRefCell> { - self.message_traces.first() - } - - /// Retrieves the last error that occurred during the tracing process. - pub fn get_last_error(&self) -> Option<&'static str> { - self.last_error - } - - /// Observes a trace, collecting information about the execution of the EVM. - pub fn observe(&mut self, trace: &edr_evm::trace::Trace) { - for msg in &trace.messages { - match msg.clone() { - edr_evm::trace::TraceMessage::Before(before) => { - self.add_before_message(before); - } - edr_evm::trace::TraceMessage::Step(step) => { - self.add_step(step); - } - edr_evm::trace::TraceMessage::After(after) => { - self.add_after_message(after.execution_result); - } - } - } - } - - fn should_keep_tracing(&self) -> bool { - self.last_error.is_none() - } - - fn add_before_message(&mut self, message: BeforeMessage) { - if !self.should_keep_tracing() { - return; - } - - let trace: MessageTrace; - - if message.depth == 0 { - self.message_traces.clear(); - self.tracing_steps.clear(); - } - - if message.to.is_none() { - let create_trace = CreateMessageTrace { - base: BaseEvmMessageTrace { - base: BaseMessageTrace { - depth: message.depth, - value: message.value, - exit: ExitCode::Success, - return_data: Bytes::new(), - gas_used: 0, - }, - code: message.data, - steps: vec![], - number_of_subtraces: 0, - // this was not in the original code - assumed to be None/undefined? - bytecode: None, - }, - - deployed_contract: None, - }; - - trace = MessageTrace::Create(create_trace); - } else { - let to = message.to.unwrap(); - let to_as_bigint = U160::from_be_bytes(**to); - - if to_as_bigint <= U160::from(MAX_PRECOMPILE_NUMBER) { - let precompile: u32 = to_as_bigint - .try_into() - .expect("MAX_PRECOMPILE_NUMBER is of type u16 so it fits"); - - let precompile_trace = PrecompileMessageTrace { - base: BaseMessageTrace { - value: message.value, - exit: ExitCode::Success, - return_data: Bytes::new(), - depth: message.depth, - gas_used: 0, - }, - precompile, - calldata: message.data, - }; - - trace = MessageTrace::Precompile(precompile_trace); - } else { - // if we enter here, then `to` is not None, therefore - // `code_address` and `code` should be Some - let code_address = if let Some(value) = message.code_address { - value - } else { - self.last_error = Some("code_address should be Some"); - return; - }; - let code = if let Some(value) = message.code { - value - } else { - self.last_error = Some("code should be Some"); - return; - }; - - let call_trace = CallMessageTrace { - base: BaseEvmMessageTrace { - base: BaseMessageTrace { - depth: message.depth, - value: message.value, - exit: ExitCode::Success, - return_data: Bytes::new(), - gas_used: 0, - }, - code: code.original_bytes(), - steps: vec![], - number_of_subtraces: 0, - // this was not in the original code - assumed to be None/undefined? - bytecode: None, - }, - calldata: message.data, - address: message.to.unwrap(), - code_address, - }; - - trace = MessageTrace::Call(call_trace); - } - } - - // We need to share it so that adding steps when processing via stack - // also updates the inner elements - let trace = Rc::new(RefCell::new(trace)); - - if let Some(parent_ref) = self.message_traces.last_mut() { - let mut parent_trace = parent_ref.borrow_mut(); - let parent_trace = match &mut *parent_trace { - MessageTrace::Precompile(_) => { - self.last_error = Some("This should not happen: message execution started while a precompile was executing"); - return; - } - MessageTrace::Create(create) => &mut create.base, - MessageTrace::Call(call) => &mut call.base, - }; - - parent_trace - .steps - .push(MessageTraceStep::Message(Rc::clone(&trace))); - parent_trace.number_of_subtraces += 1; - } - - self.message_traces.push(trace); - } - - fn add_step(&mut self, step: Step) { - if !self.should_keep_tracing() { - return; - } - - if let Some(parent_ref) = self.message_traces.last_mut() { - let mut parent_trace = parent_ref.borrow_mut(); - let parent_trace = match &mut *parent_trace { - MessageTrace::Precompile(_) => { - self.last_error = Some( - "This should not happen: step event fired while a precompile was executing", - ); - return; - } - MessageTrace::Create(create) => &mut create.base, - MessageTrace::Call(call) => &mut call.base, - }; - - parent_trace - .steps - .push(MessageTraceStep::Evm(EvmStep { pc: step.pc })); - } - - self.tracing_steps.push(step); - } - - fn add_after_message(&mut self, result: ExecutionResult) { - if !self.should_keep_tracing() { - return; - } - - if let Some(trace) = self.message_traces.last_mut() { - let mut trace = trace.borrow_mut(); - - trace.base().gas_used = result.gas_used(); - - match result { - ExecutionResult::Success { output, .. } => { - trace.base().exit = ExitCode::Success; - trace.base().return_data = output.data().clone(); - - if let MessageTrace::Create(trace) = &mut *trace { - let address = output - .address() - // The original code asserted this directly - .expect("address should be defined in create trace"); - - trace.deployed_contract = Some(address.as_slice().to_vec().into()); - } - } - ExecutionResult::Halt { reason, .. } => { - trace.base().exit = ExitCode::Halt(reason); - trace.base().return_data = Bytes::new(); - } - ExecutionResult::Revert { output, .. } => { - trace.base().exit = ExitCode::Revert; - trace.base().return_data = output; - } - } - } - - if self.message_traces.len() > 1 { - self.message_traces.pop(); - } - } -} diff --git a/crates/tools/Cargo.toml b/crates/tools/Cargo.toml index 6e7563546..aeaf1c45b 100644 --- a/crates/tools/Cargo.toml +++ b/crates/tools/Cargo.toml @@ -17,9 +17,11 @@ edr_napi_core = { path = "../edr_napi_core" } edr_optimism = { path = "../edr_optimism" } edr_provider = { version = "0.3.5", path = "../edr_provider" } edr_rpc_eth = { version = "0.3.5", path = "../edr_rpc_eth" } +edr_solidity = { version = "0.3.5", path = "../edr_solidity" } flate2 = "1.0.28" indicatif = { version = "0.17.7", features = ["rayon"] } mimalloc = { version = "0.1.39", default-features = false } +parking_lot = { version = "0.12.1", default-features = false } reqwest = { version = "0.11.12", features = ["blocking"] } serde_json = "1.0.127" serde = { version = "1.0.209", features = ["derive"] } diff --git a/crates/tools/src/scenario.rs b/crates/tools/src/scenario.rs index ef678f511..75bbef741 100644 --- a/crates/tools/src/scenario.rs +++ b/crates/tools/src/scenario.rs @@ -14,6 +14,7 @@ use edr_generic::GenericChainSpec; use edr_napi_core::spec::SyncNapiSpec; use edr_provider::{time::CurrentTime, Logger, ProviderError, ProviderRequest}; use edr_rpc_eth::jsonrpc; +use edr_solidity::contract_decoder::ContractDecoder; use flate2::bufread::GzDecoder; use indicatif::ProgressBar; use serde::Deserialize; @@ -63,6 +64,7 @@ pub async fn execute(scenario_path: &Path, max_count: Option) -> anyhow:: logger, subscription_callback, provider_config, + Arc::new(ContractDecoder::default()), CurrentTime, ) }) @@ -203,6 +205,13 @@ impl Logger for DisabledLogger fn set_is_enabled(&mut self, _is_enabled: bool) {} + fn print_contract_decoding_error( + &mut self, + _error: &str, + ) -> Result<(), Box> { + Ok(()) + } + fn print_method_logs( &mut self, _method: &str, diff --git a/hardhat-tests/package.json b/hardhat-tests/package.json index d31d8355a..abecdd674 100644 --- a/hardhat-tests/package.json +++ b/hardhat-tests/package.json @@ -57,10 +57,10 @@ "build:edr": "cd ../crates/edr_napi && pnpm build", "clean": "rimraf build-test tsconfig.tsbuildinfo test/internal/hardhat-network/provider/.hardhat_node_test_cache test/internal/hardhat-network/stack-traces/test-files/artifacts", "eslint": "eslint '**/*.ts'", - "lint": "pnpm prettier && pnpm eslint", + "lint": "pnpm prettier --check && pnpm eslint", "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "pretest": "pnpm build", - "prettier": "prettier --check \"**/*.{js,ts,md,json}\"", + "prettier": "prettier \"**/*.{js,ts,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", "test:ci": "pnpm test && pnpm test:integration", "test:integration": "bash run-integration-tests.sh" diff --git a/hardhat-tests/test/internal/hardhat-network/helpers/buildInfos.ts b/hardhat-tests/test/internal/hardhat-network/helpers/buildInfos.ts new file mode 100644 index 000000000..de3e824ea --- /dev/null +++ b/hardhat-tests/test/internal/hardhat-network/helpers/buildInfos.ts @@ -0,0 +1,684 @@ +export const exampleBuildInfo = { + id: "6dccf5d5d3b5e72e738c81b1acfbf389", + _format: "hh-sol-build-info-1", + solcVersion: "0.8.0", + solcLongVersion: "0.8.0+commit.c7dfd78e", + input: { + language: "Solidity", + sources: { + "contracts/Example.sol": { + content: + "// SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.0;\ncontract Example {\n uint public x;\n\n function inc() public {\n x++;\n }\n}", + }, + }, + settings: { + optimizer: { + enabled: false, + runs: 200, + }, + outputSelection: { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + ], + "": ["ast"], + }, + }, + }, + }, + output: { + sources: { + "contracts/Example.sol": { + ast: { + absolutePath: "contracts/Example.sol", + exportedSymbols: { + Example: [11], + }, + id: 12, + license: "Unlicense", + nodeType: "SourceUnit", + nodes: [ + { + id: 1, + literals: ["solidity", "^", "0.8", ".0"], + nodeType: "PragmaDirective", + src: "38:23:0", + }, + { + abstract: false, + baseContracts: [], + contractDependencies: [], + contractKind: "contract", + fullyImplemented: true, + id: 11, + linearizedBaseContracts: [11], + name: "Example", + nodeType: "ContractDefinition", + nodes: [ + { + constant: false, + functionSelector: "0c55699c", + id: 3, + mutability: "mutable", + name: "x", + nodeType: "VariableDeclaration", + scope: 11, + src: "85:13:0", + stateVariable: true, + storageLocation: "default", + typeDescriptions: { + typeIdentifier: "t_uint256", + typeString: "uint256", + }, + typeName: { + id: 2, + name: "uint", + nodeType: "ElementaryTypeName", + src: "85:4:0", + typeDescriptions: { + typeIdentifier: "t_uint256", + typeString: "uint256", + }, + }, + visibility: "public", + }, + { + body: { + id: 9, + nodeType: "Block", + src: "127:20:0", + statements: [ + { + expression: { + id: 7, + isConstant: false, + isLValue: false, + isPure: false, + lValueRequested: false, + nodeType: "UnaryOperation", + operator: "++", + prefix: false, + src: "137:3:0", + subExpression: { + id: 6, + name: "x", + nodeType: "Identifier", + overloadedDeclarations: [], + referencedDeclaration: 3, + src: "137:1:0", + typeDescriptions: { + typeIdentifier: "t_uint256", + typeString: "uint256", + }, + }, + typeDescriptions: { + typeIdentifier: "t_uint256", + typeString: "uint256", + }, + }, + id: 8, + nodeType: "ExpressionStatement", + src: "137:3:0", + }, + ], + }, + functionSelector: "371303c0", + id: 10, + implemented: true, + kind: "function", + modifiers: [], + name: "inc", + nodeType: "FunctionDefinition", + parameters: { + id: 4, + nodeType: "ParameterList", + parameters: [], + src: "117:2:0", + }, + returnParameters: { + id: 5, + nodeType: "ParameterList", + parameters: [], + src: "127:0:0", + }, + scope: 11, + src: "105:42:0", + stateMutability: "nonpayable", + virtual: false, + visibility: "public", + }, + ], + scope: 12, + src: "62:87:0", + }, + ], + src: "38:111:0", + }, + id: 0, + }, + }, + contracts: { + "contracts/Example.sol": { + Example: { + abi: [ + { + inputs: [], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "x", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + evm: { + bytecode: { + generatedSources: [], + linkReferences: {}, + object: + "608060405234801561001057600080fd5b50610164806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630c55699c1461003b578063371303c014610059575b600080fd5b610043610063565b6040516100509190610091565b60405180910390f35b610061610069565b005b60005481565b60008081548092919061007b906100b6565b9190505550565b61008b816100ac565b82525050565b60006020820190506100a66000830184610082565b92915050565b6000819050919050565b60006100c1826100ac565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156100f4576100f36100ff565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220f059e1364306f26c1c4d0e1654e8eb8c7aa23a31ade199b12e96e2c80bc4b6ce64736f6c63430008000033", + opcodes: + "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x164 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xC55699C EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x371303C0 EQ PUSH2 0x59 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x63 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x50 SWAP2 SWAP1 PUSH2 0x91 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x61 PUSH2 0x69 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH2 0x7B SWAP1 PUSH2 0xB6 JUMP JUMPDEST SWAP2 SWAP1 POP SSTORE POP JUMP JUMPDEST PUSH2 0x8B DUP2 PUSH2 0xAC JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0xA6 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x82 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC1 DUP3 PUSH2 0xAC JUMP JUMPDEST SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 EQ ISZERO PUSH2 0xF4 JUMPI PUSH2 0xF3 PUSH2 0xFF JUMP JUMPDEST JUMPDEST PUSH1 0x1 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE MSIZE 0xE1 CALLDATASIZE NUMBER MOD CALLCODE PUSH13 0x1C4D0E1654E8EB8C7AA23A31AD 0xE1 SWAP10 0xB1 0x2E SWAP7 0xE2 0xC8 SIGNEXTEND 0xC4 0xB6 0xCE PUSH5 0x736F6C6343 STOP ADDMOD STOP STOP CALLER ", + sourceMap: "62:87:0:-:0;;;;;;;;;;;;;;;;;;;", + }, + deployedBytecode: { + generatedSources: [ + { + ast: { + nodeType: "YulBlock", + src: "0:864:1", + statements: [ + { + body: { + nodeType: "YulBlock", + src: "72:53:1", + statements: [ + { + expression: { + arguments: [ + { + name: "pos", + nodeType: "YulIdentifier", + src: "89:3:1", + }, + { + arguments: [ + { + name: "value", + nodeType: "YulIdentifier", + src: "112:5:1", + }, + ], + functionName: { + name: "cleanup_t_uint256", + nodeType: "YulIdentifier", + src: "94:17:1", + }, + nodeType: "YulFunctionCall", + src: "94:24:1", + }, + ], + functionName: { + name: "mstore", + nodeType: "YulIdentifier", + src: "82:6:1", + }, + nodeType: "YulFunctionCall", + src: "82:37:1", + }, + nodeType: "YulExpressionStatement", + src: "82:37:1", + }, + ], + }, + name: "abi_encode_t_uint256_to_t_uint256_fromStack", + nodeType: "YulFunctionDefinition", + parameters: [ + { + name: "value", + nodeType: "YulTypedName", + src: "60:5:1", + type: "", + }, + { + name: "pos", + nodeType: "YulTypedName", + src: "67:3:1", + type: "", + }, + ], + src: "7:118:1", + }, + { + body: { + nodeType: "YulBlock", + src: "229:124:1", + statements: [ + { + nodeType: "YulAssignment", + src: "239:26:1", + value: { + arguments: [ + { + name: "headStart", + nodeType: "YulIdentifier", + src: "251:9:1", + }, + { + kind: "number", + nodeType: "YulLiteral", + src: "262:2:1", + type: "", + value: "32", + }, + ], + functionName: { + name: "add", + nodeType: "YulIdentifier", + src: "247:3:1", + }, + nodeType: "YulFunctionCall", + src: "247:18:1", + }, + variableNames: [ + { + name: "tail", + nodeType: "YulIdentifier", + src: "239:4:1", + }, + ], + }, + { + expression: { + arguments: [ + { + name: "value0", + nodeType: "YulIdentifier", + src: "319:6:1", + }, + { + arguments: [ + { + name: "headStart", + nodeType: "YulIdentifier", + src: "332:9:1", + }, + { + kind: "number", + nodeType: "YulLiteral", + src: "343:1:1", + type: "", + value: "0", + }, + ], + functionName: { + name: "add", + nodeType: "YulIdentifier", + src: "328:3:1", + }, + nodeType: "YulFunctionCall", + src: "328:17:1", + }, + ], + functionName: { + name: "abi_encode_t_uint256_to_t_uint256_fromStack", + nodeType: "YulIdentifier", + src: "275:43:1", + }, + nodeType: "YulFunctionCall", + src: "275:71:1", + }, + nodeType: "YulExpressionStatement", + src: "275:71:1", + }, + ], + }, + name: "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + nodeType: "YulFunctionDefinition", + parameters: [ + { + name: "headStart", + nodeType: "YulTypedName", + src: "201:9:1", + type: "", + }, + { + name: "value0", + nodeType: "YulTypedName", + src: "213:6:1", + type: "", + }, + ], + returnVariables: [ + { + name: "tail", + nodeType: "YulTypedName", + src: "224:4:1", + type: "", + }, + ], + src: "131:222:1", + }, + { + body: { + nodeType: "YulBlock", + src: "404:32:1", + statements: [ + { + nodeType: "YulAssignment", + src: "414:16:1", + value: { + name: "value", + nodeType: "YulIdentifier", + src: "425:5:1", + }, + variableNames: [ + { + name: "cleaned", + nodeType: "YulIdentifier", + src: "414:7:1", + }, + ], + }, + ], + }, + name: "cleanup_t_uint256", + nodeType: "YulFunctionDefinition", + parameters: [ + { + name: "value", + nodeType: "YulTypedName", + src: "386:5:1", + type: "", + }, + ], + returnVariables: [ + { + name: "cleaned", + nodeType: "YulTypedName", + src: "396:7:1", + type: "", + }, + ], + src: "359:77:1", + }, + { + body: { + nodeType: "YulBlock", + src: "485:190:1", + statements: [ + { + nodeType: "YulAssignment", + src: "495:33:1", + value: { + arguments: [ + { + name: "value", + nodeType: "YulIdentifier", + src: "522:5:1", + }, + ], + functionName: { + name: "cleanup_t_uint256", + nodeType: "YulIdentifier", + src: "504:17:1", + }, + nodeType: "YulFunctionCall", + src: "504:24:1", + }, + variableNames: [ + { + name: "value", + nodeType: "YulIdentifier", + src: "495:5:1", + }, + ], + }, + { + body: { + nodeType: "YulBlock", + src: "618:22:1", + statements: [ + { + expression: { + arguments: [], + functionName: { + name: "panic_error_0x11", + nodeType: "YulIdentifier", + src: "620:16:1", + }, + nodeType: "YulFunctionCall", + src: "620:18:1", + }, + nodeType: "YulExpressionStatement", + src: "620:18:1", + }, + ], + }, + condition: { + arguments: [ + { + name: "value", + nodeType: "YulIdentifier", + src: "543:5:1", + }, + { + kind: "number", + nodeType: "YulLiteral", + src: "550:66:1", + type: "", + value: + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + }, + ], + functionName: { + name: "eq", + nodeType: "YulIdentifier", + src: "540:2:1", + }, + nodeType: "YulFunctionCall", + src: "540:77:1", + }, + nodeType: "YulIf", + src: "537:2:1", + }, + { + nodeType: "YulAssignment", + src: "649:20:1", + value: { + arguments: [ + { + name: "value", + nodeType: "YulIdentifier", + src: "660:5:1", + }, + { + kind: "number", + nodeType: "YulLiteral", + src: "667:1:1", + type: "", + value: "1", + }, + ], + functionName: { + name: "add", + nodeType: "YulIdentifier", + src: "656:3:1", + }, + nodeType: "YulFunctionCall", + src: "656:13:1", + }, + variableNames: [ + { + name: "ret", + nodeType: "YulIdentifier", + src: "649:3:1", + }, + ], + }, + ], + }, + name: "increment_t_uint256", + nodeType: "YulFunctionDefinition", + parameters: [ + { + name: "value", + nodeType: "YulTypedName", + src: "471:5:1", + type: "", + }, + ], + returnVariables: [ + { + name: "ret", + nodeType: "YulTypedName", + src: "481:3:1", + type: "", + }, + ], + src: "442:233:1", + }, + { + body: { + nodeType: "YulBlock", + src: "709:152:1", + statements: [ + { + expression: { + arguments: [ + { + kind: "number", + nodeType: "YulLiteral", + src: "726:1:1", + type: "", + value: "0", + }, + { + kind: "number", + nodeType: "YulLiteral", + src: "729:77:1", + type: "", + value: + "35408467139433450592217433187231851964531694900788300625387963629091585785856", + }, + ], + functionName: { + name: "mstore", + nodeType: "YulIdentifier", + src: "719:6:1", + }, + nodeType: "YulFunctionCall", + src: "719:88:1", + }, + nodeType: "YulExpressionStatement", + src: "719:88:1", + }, + { + expression: { + arguments: [ + { + kind: "number", + nodeType: "YulLiteral", + src: "823:1:1", + type: "", + value: "4", + }, + { + kind: "number", + nodeType: "YulLiteral", + src: "826:4:1", + type: "", + value: "0x11", + }, + ], + functionName: { + name: "mstore", + nodeType: "YulIdentifier", + src: "816:6:1", + }, + nodeType: "YulFunctionCall", + src: "816:15:1", + }, + nodeType: "YulExpressionStatement", + src: "816:15:1", + }, + { + expression: { + arguments: [ + { + kind: "number", + nodeType: "YulLiteral", + src: "847:1:1", + type: "", + value: "0", + }, + { + kind: "number", + nodeType: "YulLiteral", + src: "850:4:1", + type: "", + value: "0x24", + }, + ], + functionName: { + name: "revert", + nodeType: "YulIdentifier", + src: "840:6:1", + }, + nodeType: "YulFunctionCall", + src: "840:15:1", + }, + nodeType: "YulExpressionStatement", + src: "840:15:1", + }, + ], + }, + name: "panic_error_0x11", + nodeType: "YulFunctionDefinition", + src: "681:180:1", + }, + ], + }, + contents: + "{\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function increment_t_uint256(value) -> ret {\n value := cleanup_t_uint256(value)\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n\n function panic_error_0x11() {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n\n}\n", + id: 1, + language: "Yul", + name: "#utility.yul", + }, + ], + immutableReferences: {}, + linkReferences: {}, + object: + "608060405234801561001057600080fd5b50600436106100365760003560e01c80630c55699c1461003b578063371303c014610059575b600080fd5b610043610063565b6040516100509190610091565b60405180910390f35b610061610069565b005b60005481565b60008081548092919061007b906100b6565b9190505550565b61008b816100ac565b82525050565b60006020820190506100a66000830184610082565b92915050565b6000819050919050565b60006100c1826100ac565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156100f4576100f36100ff565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220f059e1364306f26c1c4d0e1654e8eb8c7aa23a31ade199b12e96e2c80bc4b6ce64736f6c63430008000033", + opcodes: + "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xC55699C EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x371303C0 EQ PUSH2 0x59 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x63 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x50 SWAP2 SWAP1 PUSH2 0x91 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x61 PUSH2 0x69 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH2 0x7B SWAP1 PUSH2 0xB6 JUMP JUMPDEST SWAP2 SWAP1 POP SSTORE POP JUMP JUMPDEST PUSH2 0x8B DUP2 PUSH2 0xAC JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0xA6 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x82 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC1 DUP3 PUSH2 0xAC JUMP JUMPDEST SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 EQ ISZERO PUSH2 0xF4 JUMPI PUSH2 0xF3 PUSH2 0xFF JUMP JUMPDEST JUMPDEST PUSH1 0x1 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE MSIZE 0xE1 CALLDATASIZE NUMBER MOD CALLCODE PUSH13 0x1C4D0E1654E8EB8C7AA23A31AD 0xE1 SWAP10 0xB1 0x2E SWAP7 0xE2 0xC8 SIGNEXTEND 0xC4 0xB6 0xCE PUSH5 0x736F6C6343 STOP ADDMOD STOP STOP CALLER ", + sourceMap: + "62:87:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105:42;;;:::i;:::-;;85:13;;;;:::o;105:42::-;137:1;;:3;;;;;;;;;:::i;:::-;;;;;;105:42::o;7:118:1:-;94:24;112:5;94:24;:::i;:::-;89:3;82:37;72:53;;:::o;131:222::-;;262:2;251:9;247:18;239:26;;275:71;343:1;332:9;328:17;319:6;275:71;:::i;:::-;229:124;;;;:::o;359:77::-;;425:5;414:16;;404:32;;;:::o;442:233::-;;504:24;522:5;504:24;:::i;:::-;495:33;;550:66;543:5;540:77;537:2;;;620:18;;:::i;:::-;537:2;667:1;660:5;656:13;649:20;;485:190;;;:::o;681:180::-;729:77;726:1;719:88;826:4;823:1;816:15;850:4;847:1;840:15", + }, + methodIdentifiers: { + "inc()": "371303c0", + "x()": "0c55699c", + }, + }, + metadata: + '{"compiler":{"version":"0.8.0+commit.c7dfd78e"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"inc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"x","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"contracts/Example.sol":"Example"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"contracts/Example.sol":{"keccak256":"0x59b0856e75cd15dc2e53235ca43c23e33d46bd284bd87e25fae9c40a1b1f1f6e","license":"Unlicense","urls":["bzz-raw://7e94cba4b8a3d60b45c89e71ef6b594b9c1974ae1ab81d308fac7b6a4bde5d66","dweb:/ipfs/QmW41rG5XT6ADihjEswvg9V34LxJE6KonCK9iyD6CkVu7V"]}},"version":1}', + }, + }, + }, + }, +}; diff --git a/hardhat-tests/test/internal/hardhat-network/provider/logs.ts b/hardhat-tests/test/internal/hardhat-network/provider/logs.ts index e82b03b6e..5d83d2d8d 100644 --- a/hardhat-tests/test/internal/hardhat-network/provider/logs.ts +++ b/hardhat-tests/test/internal/hardhat-network/provider/logs.ts @@ -15,6 +15,7 @@ import { } from "../helpers/providers"; import { deployContract } from "../helpers/transactions"; import { useHelpers } from "../helpers/useHelpers"; +import { exampleBuildInfo } from "../helpers/buildInfos"; import { ansiColor } from "./utils/color"; // eslint-disable prefer-template @@ -47,7 +48,6 @@ describe("Provider logs", function () { }); it("should not log private methods", async function () { - await this.provider.send("hardhat_getStackTraceFailuresCount", []); await this.provider.send("hardhat_setLoggingEnabled", [true]); assert.lengthOf(this.logger.lines, 0); @@ -337,6 +337,72 @@ describe("Provider logs", function () { assert.equal(this.logger.lines[4], ""); } }); + + it("should update the logged information when a relevant compilation result is added", async function () { + // given: a deployed contract whose compilation info is not available + const address = await deployContract( + this.provider, + exampleBuildInfo.output.contracts["contracts/Example.sol"].Example + .evm.bytecode.object + ); + this.logger.reset(); + + // when: a call is made to the contract + await this.provider.send("eth_call", [ + { + from: DEFAULT_ACCOUNTS_ADDRESSES[0], + to: address, + gas: numberToRpcQuantity(1000000), + data: "0x0c55699c", // x() + }, + ]); + + // then: the log should not contain the contract name + assert.lengthOf(this.logger.lines, 5); + assert.equal( + this.logger.lines[0], + ansiColor(this.provider, "eth_call", chalk.green) + ); + // prettier-ignore + { + assert.match(this.logger.lines[1], /^ Contract call: $/); + assert.match(this.logger.lines[2], /^ From: 0x[0-9a-f]{40}$/); + assert.match(this.logger.lines[3], /^ To: 0x[0-9a-f]{40}$/); + assert.equal(this.logger.lines[4], ""); + } + + // when: the compilation result is added and the call is made again + await this.provider.send("hardhat_addCompilationResult", [ + exampleBuildInfo.solcVersion, + exampleBuildInfo.input, + exampleBuildInfo.output, + ]); + + this.logger.reset(); + + await this.provider.send("eth_call", [ + { + from: DEFAULT_ACCOUNTS_ADDRESSES[0], + to: address, + gas: numberToRpcQuantity(1000000), + data: "0x0c55699c", // x() + }, + ]); + + // then: the log should contain the contract name + assert.lengthOf(this.logger.lines, 5); + assert.equal( + this.logger.lines[0], + ansiColor(this.provider, "eth_call", chalk.green) + ); + // prettier-ignore + { + assert.match(this.logger.lines[1], /^ Contract call: Example#x$/); + assert.match(this.logger.lines[2], /^ From: 0x[0-9a-f]{40}$/); + assert.match(this.logger.lines[3], /^ To: 0x[0-9a-f]{40}$/); + assert.equal(this.logger.lines[4], ""); + } + }); }); describe("eth_estimateGas", function () { diff --git a/hardhat-tests/test/internal/hardhat-network/stack-traces/compilers-list.ts b/hardhat-tests/test/internal/hardhat-network/stack-traces/compilers-list.ts index 71c925f81..6d4c1ad3b 100644 --- a/hardhat-tests/test/internal/hardhat-network/stack-traces/compilers-list.ts +++ b/hardhat-tests/test/internal/hardhat-network/stack-traces/compilers-list.ts @@ -256,7 +256,6 @@ export const solidityCompilers: SolidityCompiler[] = [ { solidityVersion: "0.8.25", compilerPath: "soljson-v0.8.25+commit.b61c2a91.js", - latestSolcVersion: true, }, { solidityVersion: "0.8.25", @@ -265,7 +264,6 @@ export const solidityCompilers: SolidityCompiler[] = [ runs: 200, viaIR: true, }, - latestSolcVersion: true, }, { solidityVersion: "0.8.26", @@ -295,9 +293,23 @@ export const solidityCompilers: SolidityCompiler[] = [ }, latestSolcVersion: true, }, + { + solidityVersion: "0.8.28", + compilerPath: "soljson-v0.8.28+commit.7893614a.js", + latestSolcVersion: true, + }, + { + solidityVersion: "0.8.28", + compilerPath: "soljson-v0.8.28+commit.7893614a.js", + optimizer: { + runs: 200, + viaIR: true, + }, + latestSolcVersion: true, + }, ]; -export const getLatestSupportedVersion = () => +export const getLatestTestedSolcVersion = () => solidityCompilers.map((sc) => sc.solidityVersion).sort(semver.compare)[ solidityCompilers.length - 1 ]; diff --git a/hardhat-tests/test/internal/hardhat-network/stack-traces/execution.ts b/hardhat-tests/test/internal/hardhat-network/stack-traces/execution.ts index 8a0652242..4d9ca314d 100644 --- a/hardhat-tests/test/internal/hardhat-network/stack-traces/execution.ts +++ b/hardhat-tests/test/internal/hardhat-network/stack-traces/execution.ts @@ -5,15 +5,15 @@ import { toBytes, } from "@nomicfoundation/ethereumjs-util"; -import { MessageTrace } from "hardhat/internal/hardhat-network/stack-traces/message-trace"; import { defaultHardhatNetworkParams } from "hardhat/internal/core/config/default-config"; import { MempoolOrder, TracingConfig, } from "hardhat/internal/hardhat-network/provider/node-types"; import { EdrProviderWrapper } from "hardhat/internal/hardhat-network/provider/provider"; -import { VMTracer } from "hardhat/internal/hardhat-network/stack-traces/vm-tracer"; import { LoggerConfig } from "hardhat/internal/hardhat-network/provider/modules/logger"; +import { SolidityStackTrace } from "hardhat/internal/hardhat-network/stack-traces/solidity-stack-trace"; +import { Response } from "@nomicfoundation/edr"; function toBuffer(x: Parameters[0]) { return Buffer.from(toBytes(x)); @@ -47,7 +47,7 @@ export async function instantiateProvider( }, ], allowUnlimitedContractSize: false, - throwOnTransactionFailures: false, + throwOnTransactionFailures: true, throwOnCallFailures: false, allowBlocksWithSameTimestamp: false, coinbase: "0x0000000000000000000000000000000000000000", @@ -102,36 +102,53 @@ interface TxData { gas?: bigint; } +/** + * Returns a SolidityStackTrace object if the transaction failed, the contract address if + * the transaction successfully deployed a contract, or undefined if the transaction + * succeeded and didn't deploy a contract. + */ export async function traceTransaction( provider: EdrProviderWrapper, txData: TxData -): Promise { - const vmTracer = new VMTracer(); - provider.setVmTracer(vmTracer); - - try { - await provider.request({ - method: "eth_sendTransaction", - params: [ - { - from: senderAddress, - data: bytesToHex(txData.data), - to: txData.to !== undefined ? bytesToHex(txData.to) : undefined, - value: bigIntToHex(txData.value ?? 0n), - // If the test didn't define a gasLimit, we assume 4M is enough - gas: bigIntToHex(txData.gas ?? 4000000n), - gasPrice: bigIntToHex(10n), - }, - ], - }); - - const trace = vmTracer.getLastTopLevelMessageTrace(); - if (trace === undefined) { - const error = vmTracer.getLastError(); - throw error ?? new Error("Cannot get last top level message trace"); - } - return trace; - } finally { - provider.setVmTracer(undefined); +): Promise { + const stringifiedArgs = JSON.stringify({ + method: "eth_sendTransaction", + params: [ + { + from: senderAddress, + data: bytesToHex(txData.data), + to: txData.to !== undefined ? bytesToHex(txData.to) : undefined, + value: bigIntToHex(txData.value ?? 0n), + // If the test didn't define a gasLimit, we assume 4M is enough + gas: bigIntToHex(txData.gas ?? 4000000n), + gasPrice: bigIntToHex(10n), + }, + ], + }); + + const responseObject: Response = + // eslint-disable-next-line @typescript-eslint/dot-notation + await provider["_provider"].handleRequest(stringifiedArgs); + + let response; + if (typeof responseObject.data === "string") { + response = JSON.parse(responseObject.data); + } else { + response = responseObject.data; } + + const receipt: any = await provider.request({ + method: "eth_getTransactionReceipt", + params: [response.result ?? response.error.data.transactionHash], + }); + + const stackTrace: SolidityStackTrace | null = responseObject.stackTrace(); + + const contractAddress = receipt.contractAddress?.slice(2); + + if (stackTrace === null) { + return contractAddress; + } + + return stackTrace; } diff --git a/hardhat-tests/test/internal/hardhat-network/stack-traces/test.ts b/hardhat-tests/test/internal/hardhat-network/stack-traces/test.ts index f422393f9..43eef72fb 100644 --- a/hardhat-tests/test/internal/hardhat-network/stack-traces/test.ts +++ b/hardhat-tests/test/internal/hardhat-network/stack-traces/test.ts @@ -1,4 +1,8 @@ -import { stackTraceEntryTypeToString } from "@nomicfoundation/edr"; +import { + getLatestSupportedSolcVersion, + linkHexStringBytecode, + stackTraceEntryTypeToString, +} from "@nomicfoundation/edr"; import { toBytes } from "@nomicfoundation/ethereumjs-util"; import { assert } from "chai"; import { BUILD_INFO_FORMAT_VERSION } from "hardhat/internal/constants"; @@ -10,21 +14,10 @@ import { ConsoleLogger, } from "hardhat/internal/hardhat-network/stack-traces/consoleLogger"; import { - printMessageTrace, - printStackTrace, -} from "hardhat/internal/hardhat-network/stack-traces/debug"; -import { linkHexStringBytecode } from "hardhat/internal/hardhat-network/stack-traces/library-utils"; -import { - CallMessageTrace, - CreateMessageTrace, - MessageTrace, -} from "hardhat/internal/hardhat-network/stack-traces/message-trace"; -import { + SolidityStackTrace, SolidityStackTraceEntry, StackTraceEntryType, } from "hardhat/internal/hardhat-network/stack-traces/solidity-stack-trace"; -import { SolidityTracer } from "hardhat/internal/hardhat-network/stack-traces/solidityTracer"; -import { VmTraceDecoderT } from "hardhat/internal/hardhat-network/stack-traces/vm-trace-decoder"; import { SUPPORTED_SOLIDITY_VERSION_RANGE } from "hardhat/internal/hardhat-network/stack-traces/constants"; import { BuildInfo, @@ -45,7 +38,7 @@ import { downloadCompiler, } from "./compilation"; import { - getLatestSupportedVersion, + getLatestTestedSolcVersion, SolidityCompiler, SolidityCompilerOptimizer, solidityCompilers, @@ -479,7 +472,6 @@ async function runTest( }; const logger = new FakeModulesLogger(); - const solidityTracer = new SolidityTracer(); const provider = await instantiateProvider( { enabled: false, @@ -492,10 +484,10 @@ async function runTest( const txIndexToContract: Map = new Map(); for (const [txIndex, tx] of testDefinition.transactions.entries()) { - let trace: MessageTrace; + let stackTrace: SolidityStackTrace | undefined; if ("file" in tx) { - trace = await runDeploymentTransactionTest( + const stackTraceOrContractAddress = await runDeploymentTransactionTest( txIndex, tx, provider, @@ -503,12 +495,14 @@ async function runTest( txIndexToContract ); - if (trace.deployedContract !== undefined) { + if (typeof stackTraceOrContractAddress === "string") { txIndexToContract.set(txIndex, { file: tx.file, name: tx.contract, - address: Buffer.from(trace.deployedContract), + address: Buffer.from(stackTraceOrContractAddress, "hex"), }); + } else { + stackTrace = stackTraceOrContractAddress; } } else { const contract = txIndexToContract.get(tx.to); @@ -518,7 +512,7 @@ async function runTest( `No contract was deployed in tx ${tx.to} but transaction ${txIndex} is trying to call it` ); - trace = await runCallTransactionTest( + stackTrace = await runCallTransactionTest( txIndex, tx, provider, @@ -527,47 +521,26 @@ async function runTest( ); } - // eslint-disable-next-line @typescript-eslint/dot-notation - const vmTraceDecoder = provider["_vmTraceDecoder"] as VmTraceDecoderT; - const decodedTrace = vmTraceDecoder.tryToDecodeMessageTrace(trace); - - try { - if (tx.stackTrace === undefined) { - assert.isFalse( - trace.exit.isError(), - `Transaction ${txIndex} shouldn't have failed (${trace.exit.getReason()})` - ); - } else { - assert.isDefined( - trace.exit.isError(), - `Transaction ${txIndex} should have failed` - ); + if (tx.stackTrace === undefined) { + if (stackTrace !== undefined) { + assert.fail(`Transaction ${txIndex} shouldn't have failed`); } - } catch (error) { - printMessageTrace(decodedTrace); - - throw error; + } else { + assert.isFalse( + stackTrace === undefined, + `Transaction ${txIndex} should have failed` + ); } - if (trace.exit.isError()) { - const stackTrace = solidityTracer.getStackTrace(decodedTrace); - - try { - compareStackTraces( - txIndex, - stackTrace, - tx.stackTrace!, - compilerOptions.optimizer - ); - if (testDefinition.print !== undefined && testDefinition.print) { - console.log(`Transaction ${txIndex} stack trace`); - printStackTrace(stackTrace); - } - } catch (err) { - printMessageTrace(decodedTrace); - printStackTrace(stackTrace); - - throw err; + if (stackTrace !== undefined) { + compareStackTraces( + txIndex, + stackTrace, + tx.stackTrace!, + compilerOptions.optimizer + ); + if (testDefinition.print !== undefined && testDefinition.print) { + console.log(`Transaction ${txIndex} stack trace`); } } @@ -633,7 +606,7 @@ async function runDeploymentTransactionTest( provider: EdrProviderWrapper, compilerOutput: CompilerOutput, txIndexToContract: Map -): Promise { +): Promise { const file = compilerOutput.contracts[tx.file]; assert.isDefined( @@ -668,8 +641,10 @@ async function runDeploymentTransactionTest( gas: tx.gas !== undefined ? BigInt(tx.gas) : undefined, }); - if ("precompile" in trace || "calldata" in trace) { - assert.fail("Expected trace to be a deployment trace"); + if (trace === undefined) { + throw new Error( + "deployment transactions should either deploy a contract or fail" + ); } return trace; @@ -681,7 +656,7 @@ async function runCallTransactionTest( provider: EdrProviderWrapper, compilerOutput: CompilerOutput, contract: DeployedContract -): Promise { +): Promise { const compilerContract = compilerOutput.contracts[contract.file][contract.name]; @@ -706,8 +681,8 @@ async function runCallTransactionTest( gas: tx.gas !== undefined ? BigInt(tx.gas) : undefined, }); - if (!("calldata" in trace) || "precompile" in trace) { - assert.fail("Expected trace to be a call trace"); + if (typeof trace === "string") { + throw new Error("call transactions should not deploy contracts"); } return trace; @@ -821,7 +796,7 @@ describe("Stack traces", function () { describe("Solidity support", function () { it("check that the latest tested version is within the supported version range", async function () { - const latestSupportedVersion = getLatestSupportedVersion(); + const latestSupportedVersion = getLatestTestedSolcVersion(); assert.isTrue( semver.satisfies( latestSupportedVersion, @@ -847,6 +822,13 @@ describe("Solidity support", function () { `Expected ${nextMajorVersion} to not be within the ${SUPPORTED_SOLIDITY_VERSION_RANGE} range` ); }); + + it("check that the latest tested version matches the one that EDR exports", async function () { + const latestSupportedVersion = getLatestTestedSolcVersion(); + const edrLatestSupportedVersion = getLatestSupportedSolcVersion(); + + assert.equal(latestSupportedVersion, edrLatestSupportedVersion); + }); }); function defineTestForSolidityMajorVersion( diff --git a/patches/hardhat@2.22.17.patch b/patches/hardhat@2.22.17.patch index 6508a837f..ba6e723f3 100644 --- a/patches/hardhat@2.22.17.patch +++ b/patches/hardhat@2.22.17.patch @@ -1,8 +1,135 @@ +diff --git a/internal/cli/cli.js b/internal/cli/cli.js +index 74c6821a494cf9cf4e8ef5f04e629bb71b94bcea..95ef961445ef3d4ead59e96c68de1facdf8404fc 100644 +--- a/internal/cli/cli.js ++++ b/internal/cli/cli.js +@@ -186,7 +186,7 @@ async function main() { + } + const [abortAnalytics, hitPromise] = await analytics.sendTaskHit(scopeName, taskName); + let taskArguments; +- // --help is a also special case ++ // --help is an also special case + if (hardhatArguments.help && taskName !== task_names_1.TASK_HELP) { + // we "move" the task and scope names to the task arguments, + // and run the help task +diff --git a/internal/cli/cli.js.map b/internal/cli/cli.js.map +index 2594086e008aec98ee77db7d9f37cce5da6459e8..04df6c03bd5dc4facdd11ec021d71cb5e9601545 100644 +--- a/internal/cli/cli.js.map ++++ b/internal/cli/cli.js.map +@@ -1 +1 @@ +-{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/internal/cli/cli.ts"],"names":[],"mappings":"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"} +\ No newline at end of file ++{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/internal/cli/cli.ts"],"names":[],"mappings":"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"} +\ No newline at end of file +diff --git a/internal/cli/is-node-version-to-warn-on.d.ts b/internal/cli/is-node-version-to-warn-on.d.ts +index 89c25b7444f4cdbd04073671edc79158b5deca04..8a2d953adea8f1badee31a2a4e4e94b115022831 100644 +--- a/internal/cli/is-node-version-to-warn-on.d.ts ++++ b/internal/cli/is-node-version-to-warn-on.d.ts +@@ -2,7 +2,7 @@ + * Determine if the node version should trigger an unsupported + * warning. + * +- * The current rule is that a unsupported warning will be shown if ++ * The current rule is that an unsupported warning will be shown if + * + * 1. An odd numbered version of Node.js is used - as this will never go to LTS + * 2. The version is less than the minimum supported version +diff --git a/internal/cli/is-node-version-to-warn-on.js b/internal/cli/is-node-version-to-warn-on.js +index 50b3b0ed528aaccbc395afebb5e100cf330a1156..a1cb1a710002c2d5ae3cd0360aff2a1fe971a6eb 100644 +--- a/internal/cli/is-node-version-to-warn-on.js ++++ b/internal/cli/is-node-version-to-warn-on.js +@@ -11,7 +11,7 @@ const constants_1 = require("./constants"); + * Determine if the node version should trigger an unsupported + * warning. + * +- * The current rule is that a unsupported warning will be shown if ++ * The current rule is that an unsupported warning will be shown if + * + * 1. An odd numbered version of Node.js is used - as this will never go to LTS + * 2. The version is less than the minimum supported version +diff --git a/internal/core/config/config-loading.d.ts b/internal/core/config/config-loading.d.ts +index 122c205e6c93d31226e64313d1ac6df8f7ebac3e..e6f08d15f3a91a446d2f9598443dfa365b5e025b 100644 +--- a/internal/core/config/config-loading.d.ts ++++ b/internal/core/config/config-loading.d.ts +@@ -12,7 +12,7 @@ export declare function loadConfigAndTasks(hardhatArguments?: Partial + import type { Artifacts, EIP1193Provider, HardhatNetworkChainsConfig, RequestArguments } from "../../../types"; +-import type { EdrContext, VMTracer as VMTracerT } from "@nomicfoundation/edr"; ++import type { EdrContext } from "@nomicfoundation/edr"; + import { EventEmitter } from "events"; import { ForkConfig, GenesisAccount, IntervalMiningConfig, MempoolOrder, NodeConfig, TracingConfig } from "./node-types"; import { LoggerConfig } from "./modules/logger"; export declare const DEFAULT_COINBASE = "0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e"; @@ -11,20 +138,78 @@ index 970671b4888c4739ce919cfb48c724b0c503b49f..218fbe67a5ae9347ebd70129099246c0 interface HardhatNetworkProviderConfig { hardfork: string; chainId: number; +@@ -33,31 +33,17 @@ export declare function getNodeConfig(config: HardhatNetworkProviderConfig, trac + export declare class EdrProviderWrapper extends EventEmitter implements EIP1193Provider { + private readonly _provider; + private readonly _node; +- private readonly _vmTraceDecoder; + private readonly _common; + private _failedStackTraces; + private _callOverrideCallback?; +- /** Used for internal stack trace tests. */ +- private _vmTracer?; + private constructor(); + static create(config: HardhatNetworkProviderConfig, loggerConfig: LoggerConfig, tracingConfig?: TracingConfig): Promise; + request(args: RequestArguments): Promise; +- /** +- * Sets a `VMTracer` that observes EVM throughout requests. +- * +- * Used for internal stack traces integration tests. +- */ +- setVmTracer(vmTracer?: VMTracerT): void; + private _setCallOverrideCallback; + private _setVerboseTracing; + private _ethEventListener; + private _emitLegacySubscriptionEvent; + private _emitEip1193SubscriptionEvent; +- private _addCompilationResultParams; +- private _addCompilationResultAction; +- private _getStackTraceFailuresCountParams; +- private _getStackTraceFailuresCountAction; +- private _rawTraceToSolidityStackTrace; + } + export declare function createHardhatNetworkProvider(hardhatNetworkProviderConfig: HardhatNetworkProviderConfig, loggerConfig: LoggerConfig, artifacts?: Artifacts): Promise; + export {}; diff --git a/internal/hardhat-network/provider/provider.d.ts.map b/internal/hardhat-network/provider/provider.d.ts.map -index 9df47bce20ca6de26d13a2616bfce48eea655c67..8b7cd9b2dec1760ae5c95269640a70ac3aeb0454 100644 +index 9df47bce20ca6de26d13a2616bfce48eea655c67..9fc9c7e5dbc89fe10a2bf31d12a5a36e26c86636 100644 --- a/internal/hardhat-network/provider/provider.d.ts.map +++ b/internal/hardhat-network/provider/provider.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/internal/hardhat-network/provider/provider.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EACV,SAAS,EAGT,eAAe,EAEf,0BAA0B,EAC1B,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EACV,UAAU,EAGV,QAAQ,IAAI,SAAS,EAKtB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAmCtC,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,aAAa,EACd,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,YAAY,EAA8B,MAAM,kBAAkB,CAAC;AAO5E,eAAO,MAAM,gBAAgB,+CAA+C,CAAC;AAI7E,wBAAgB,mBAAmB,IAAI,UAAU,CAWhD;AAED,UAAU,4BAA4B;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,oBAAoB,CAAC;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,0BAA0B,CAAC;IACnC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,0BAA0B,EAAE,OAAO,CAAC;IACpC,0BAA0B,EAAE,OAAO,CAAC;IACpC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,4BAA4B,EAAE,OAAO,CAAC;IAEtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,4BAA4B,EACpC,aAAa,CAAC,EAAE,aAAa,GAC5B,UAAU,CAsBZ;AAWD,qBAAa,kBACX,SAAQ,YACR,YAAW,eAAe;IAWxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAGtB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhB1B,OAAO,CAAC,kBAAkB,CAAK;IAG/B,OAAO,CAAC,qBAAqB,CAAC,CAAuB;IAErD,2CAA2C;IAC3C,OAAO,CAAC,SAAS,CAAC,CAAY;IAE9B,OAAO;WAkBa,MAAM,CACxB,MAAM,EAAE,4BAA4B,EACpC,YAAY,EAAE,YAAY,EAC1B,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAoJjB,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA6I9D;;;;OAIG;IACI,WAAW,CAAC,QAAQ,CAAC,EAAE,SAAS;IAKvC,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,6BAA6B;IAYrC,OAAO,CAAC,2BAA2B;YAWrB,2BAA2B;IAkCzC,OAAO,CAAC,iCAAiC;IAIzC,OAAO,CAAC,iCAAiC;YAI3B,6BAA6B;CA4B5C;AAQD,wBAAsB,4BAA4B,CAChD,4BAA4B,EAAE,4BAA4B,EAC1D,YAAY,EAAE,YAAY,EAC1B,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,eAAe,CAAC,CAY1B"} \ No newline at end of file -+{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/internal/hardhat-network/provider/provider.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EACV,SAAS,EAGT,eAAe,EAEf,0BAA0B,EAC1B,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EACV,UAAU,EAGV,QAAQ,IAAI,SAAS,EAKtB,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAmCtC,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,aAAa,EACd,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,YAAY,EAA8B,MAAM,kBAAkB,CAAC;AAO5E,eAAO,MAAM,gBAAgB,+CAA+C,CAAC;AAI7E,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,UAAU,CAAC,CAgB/D;AAED,UAAU,4BAA4B;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,oBAAoB,CAAC;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,0BAA0B,CAAC;IACnC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,0BAA0B,EAAE,OAAO,CAAC;IACpC,0BAA0B,EAAE,OAAO,CAAC;IACpC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,4BAA4B,EAAE,OAAO,CAAC;IAEtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,4BAA4B,EACpC,aAAa,CAAC,EAAE,aAAa,GAC5B,UAAU,CAsBZ;AAWD,qBAAa,kBACX,SAAQ,YACR,YAAW,eAAe;IAWxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAGtB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhB1B,OAAO,CAAC,kBAAkB,CAAK;IAG/B,OAAO,CAAC,qBAAqB,CAAC,CAAuB;IAErD,2CAA2C;IAC3C,OAAO,CAAC,SAAS,CAAC,CAAY;IAE9B,OAAO;WAkBa,MAAM,CACxB,MAAM,EAAE,4BAA4B,EACpC,YAAY,EAAE,YAAY,EAC1B,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IA6JjB,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA6I9D;;;;OAIG;IACI,WAAW,CAAC,QAAQ,CAAC,EAAE,SAAS;YAKzB,wBAAwB;YAYxB,kBAAkB;IAIhC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,6BAA6B;IAYrC,OAAO,CAAC,2BAA2B;YAWrB,2BAA2B;IAkCzC,OAAO,CAAC,iCAAiC;IAIzC,OAAO,CAAC,iCAAiC;YAI3B,6BAA6B;CA4B5C;AAQD,wBAAsB,4BAA4B,CAChD,4BAA4B,EAAE,4BAA4B,EAC1D,YAAY,EAAE,YAAY,EAC1B,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,eAAe,CAAC,CAY1B"} ++{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/internal/hardhat-network/provider/provider.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EAEf,0BAA0B,EAC1B,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EACV,UAAU,EAKX,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAsBtC,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,aAAa,EACd,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,YAAY,EAA8B,MAAM,kBAAkB,CAAC;AAO5E,eAAO,MAAM,gBAAgB,+CAA+C,CAAC;AAI7E,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,UAAU,CAAC,CAgB/D;AAED,UAAU,4BAA4B;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,oBAAoB,CAAC;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,0BAA0B,CAAC;IACnC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,0BAA0B,EAAE,OAAO,CAAC;IACpC,0BAA0B,EAAE,OAAO,CAAC;IACpC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,4BAA4B,EAAE,OAAO,CAAC;IAEtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,4BAA4B,EACpC,aAAa,CAAC,EAAE,aAAa,GAC5B,UAAU,CAsBZ;AAWD,qBAAa,kBACX,SAAQ,YACR,YAAW,eAAe;IAQxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAItB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZ1B,OAAO,CAAC,kBAAkB,CAAK;IAG/B,OAAO,CAAC,qBAAqB,CAAC,CAAuB;IAErD,OAAO;WAYa,MAAM,CACxB,MAAM,EAAE,4BAA4B,EACpC,YAAY,EAAE,YAAY,EAC1B,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAmJjB,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;YAuIhD,wBAAwB;YAYxB,kBAAkB;IAIhC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,6BAA6B;CAWtC;AAQD,wBAAsB,4BAA4B,CAChD,4BAA4B,EAAE,4BAA4B,EAC1D,YAAY,EAAE,YAAY,EAC1B,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,eAAe,CAAC,CAY1B"} \ No newline at end of file diff --git a/internal/hardhat-network/provider/provider.js b/internal/hardhat-network/provider/provider.js -index b981b1efa0095eb1b02c4846d83a2fe1c003b7fa..688ac6270244b1267bfbd1498a0c184a21b6239f 100644 +index b981b1efa0095eb1b02c4846d83a2fe1c003b7fa..379d7b452ef2a49528fee8024928e93ad3fef82d 100644 --- a/internal/hardhat-network/provider/provider.js +++ b/internal/hardhat-network/provider/provider.js -@@ -27,6 +27,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { +@@ -1,52 +1,23 @@ + "use strict"; +-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { +- if (k2 === undefined) k2 = k; +- var desc = Object.getOwnPropertyDescriptor(m, k); +- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { +- desc = { enumerable: true, get: function() { return m[k]; } }; +- } +- Object.defineProperty(o, k2, desc); +-}) : (function(o, m, k, k2) { +- if (k2 === undefined) k2 = k; +- o[k2] = m[k]; +-})); +-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { +- Object.defineProperty(o, "default", { enumerable: true, value: v }); +-}) : function(o, v) { +- o["default"] = v; +-}); +-var __importStar = (this && this.__importStar) || function (mod) { +- if (mod && mod.__esModule) return mod; +- var result = {}; +- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); +- __setModuleDefault(result, mod); +- return result; +-}; + var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createHardhatNetworkProvider = exports.EdrProviderWrapper = exports.getNodeConfig = exports.getGlobalEdrContext = exports.DEFAULT_COINBASE = void 0; @@ -32,7 +217,27 @@ index b981b1efa0095eb1b02c4846d83a2fe1c003b7fa..688ac6270244b1267bfbd1498a0c184a const picocolors_1 = __importDefault(require("picocolors")); const debug_1 = __importDefault(require("debug")); const events_1 = require("events"); -@@ -57,11 +58,12 @@ const log = (0, debug_1.default)("hardhat:core:hardhat-network:provider"); + const fs_extra_1 = __importDefault(require("fs-extra")); +-const t = __importStar(require("io-ts")); + const semver_1 = __importDefault(require("semver")); + const napi_rs_1 = require("../../../common/napi-rs"); + const constants_1 = require("../../constants"); +-const solc_1 = require("../../core/jsonrpc/types/input/solc"); +-const validation_1 = require("../../core/jsonrpc/types/input/validation"); + const errors_1 = require("../../core/providers/errors"); + const http_1 = require("../../core/providers/http"); + const hardforks_1 = require("../../util/hardforks"); +-const compiler_to_model_1 = require("../stack-traces/compiler-to-model"); + const consoleLogger_1 = require("../stack-traces/consoleLogger"); +-const vm_trace_decoder_1 = require("../stack-traces/vm-trace-decoder"); + const constants_2 = require("../stack-traces/constants"); + const solidity_errors_1 = require("../stack-traces/solidity-errors"); +-const solidityTracer_1 = require("../stack-traces/solidityTracer"); +-const vm_tracer_1 = require("../stack-traces/vm-tracer"); + const packageInfo_1 = require("../../util/packageInfo"); + const convertToEdr_1 = require("./utils/convertToEdr"); + const makeCommon_1 = require("./utils/makeCommon"); +@@ -57,11 +28,12 @@ const log = (0, debug_1.default)("hardhat:core:hardhat-network:provider"); exports.DEFAULT_COINBASE = "0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e"; let _globalEdrContext; // Lazy initialize the global EDR context. @@ -47,8 +252,24 @@ index b981b1efa0095eb1b02c4846d83a2fe1c003b7fa..688ac6270244b1267bfbd1498a0c184a } return _globalEdrContext; } -@@ -108,7 +110,7 @@ class EdrProviderWrapper extends events_1.EventEmitter { - } +@@ -94,21 +66,17 @@ class EdrProviderEventAdapter extends events_1.EventEmitter { + class EdrProviderWrapper extends events_1.EventEmitter { + constructor(_provider, + // we add this for backwards-compatibility with plugins like solidity-coverage +- _node, _vmTraceDecoder, ++ _node, + // The common configuration for EthereumJS VM is not used by EDR, but tests expect it as part of the provider. +- _common, tracingConfig) { ++ _common) { + super(); + this._provider = _provider; + this._node = _node; +- this._vmTraceDecoder = _vmTraceDecoder; + this._common = _common; + this._failedStackTraces = 0; +- if (tracingConfig !== undefined) { +- (0, vm_trace_decoder_1.initializeVmTraceDecoder)(this._vmTraceDecoder, tracingConfig); +- } } static async create(config, loggerConfig, tracingConfig) { - const { Provider } = (0, napi_rs_1.requireNapiRsModule)("@nomicfoundation/edr"); @@ -56,20 +277,22 @@ index b981b1efa0095eb1b02c4846d83a2fe1c003b7fa..688ac6270244b1267bfbd1498a0c184a const coinbase = config.coinbase ?? exports.DEFAULT_COINBASE; let fork; if (config.forkConfig !== undefined) { -@@ -140,7 +142,11 @@ class EdrProviderWrapper extends events_1.EventEmitter { +@@ -138,9 +106,12 @@ class EdrProviderWrapper extends events_1.EventEmitter { + const eventAdapter = new EdrProviderEventAdapter(); + const printLineFn = loggerConfig.printLineFn ?? logger_1.printLine; const replaceLastLineFn = loggerConfig.replaceLastLineFn ?? logger_1.replaceLastLine; - const vmTraceDecoder = new vm_trace_decoder_1.VmTraceDecoder(); +- const vmTraceDecoder = new vm_trace_decoder_1.VmTraceDecoder(); const hardforkName = (0, hardforks_1.getHardforkName)(config.hardfork); - const provider = await Provider.withConfig(getGlobalEdrContext(), { + const genesisState = fork !== undefined + ? [] -+ : (0, edr_1.l1GenesisState)((0, edr_1.l1HardforkFromString)(config.hardfork)); ++ : (0, edr_1.l1GenesisState)((0, edr_1.l1HardforkFromString)((0, convertToEdr_1.ethereumsjsHardforkToEdrSpecId)(hardforkName))); + const context = await getGlobalEdrContext(); + const provider = await context.createProvider(GENERIC_CHAIN_TYPE, { allowBlocksWithSameTimestamp: config.allowBlocksWithSameTimestamp ?? false, allowUnlimitedContractSize: config.allowUnlimitedContractSize, bailOnCallFailure: config.throwOnCallFailures, -@@ -162,13 +168,8 @@ class EdrProviderWrapper extends events_1.EventEmitter { +@@ -162,13 +133,8 @@ class EdrProviderWrapper extends events_1.EventEmitter { coinbase: Buffer.from(coinbase.slice(2), "hex"), enableRip7212: config.enableRip7212, fork, @@ -84,7 +307,7 @@ index b981b1efa0095eb1b02c4846d83a2fe1c003b7fa..688ac6270244b1267bfbd1498a0c184a initialDate, initialBaseFeePerGas: config.initialBaseFeePerGas !== undefined ? BigInt(config.initialBaseFeePerGas) -@@ -182,6 +183,12 @@ class EdrProviderWrapper extends events_1.EventEmitter { +@@ -182,12 +148,15 @@ class EdrProviderWrapper extends events_1.EventEmitter { }, }, networkId: BigInt(config.networkId), @@ -97,22 +320,94 @@ index b981b1efa0095eb1b02c4846d83a2fe1c003b7fa..688ac6270244b1267bfbd1498a0c184a }, { enable: loggerConfig.enabled, decodeConsoleLogInputsCallback: consoleLogger_1.ConsoleLogger.getDecodedLogs, -@@ -196,8 +203,10 @@ class EdrProviderWrapper extends events_1.EventEmitter { +- getContractAndFunctionNameCallback: (code, calldata) => { +- return vmTraceDecoder.getContractAndFunctionNamesForCall(code, calldata); +- }, + printLineCallback: (message, replace) => { + if (replace) { + replaceLastLineFn(message); +@@ -196,14 +165,16 @@ class EdrProviderWrapper extends events_1.EventEmitter { printLineFn(message); } }, - }, (event) => { - eventAdapter.emit("ethEvent", event); +- }); + }, { + subscriptionCallback: (event) => { + eventAdapter.emit("ethEvent", event); + }, - }); ++ }, tracingConfig ?? {}); const minimalEthereumJsNode = { _vm: (0, minimal_vm_1.getMinimalEthereumJsVm)(provider), -@@ -324,14 +333,14 @@ class EdrProviderWrapper extends events_1.EventEmitter { - this._vmTracer = vmTracer; + }; + const common = (0, makeCommon_1.makeCommon)(getNodeConfig(config)); +- const wrapper = new EdrProviderWrapper(provider, minimalEthereumJsNode, vmTraceDecoder, common, tracingConfig); ++ const wrapper = new EdrProviderWrapper(provider, minimalEthereumJsNode, common); + // Pass through all events from the provider + eventAdapter.addListener("ethEvent", wrapper._ethEventListener.bind(wrapper)); + return wrapper; +@@ -213,11 +184,9 @@ class EdrProviderWrapper extends events_1.EventEmitter { + throw new errors_1.InvalidInputError("Hardhat Network doesn't support JSON-RPC params sent as an object"); + } + const params = args.params ?? []; +- if (args.method === "hardhat_addCompilationResult") { +- return this._addCompilationResultAction(...this._addCompilationResultParams(params)); +- } +- else if (args.method === "hardhat_getStackTraceFailuresCount") { +- return this._getStackTraceFailuresCountAction(...this._getStackTraceFailuresCountParams(params)); ++ if (args.method === "hardhat_getStackTraceFailuresCount") { ++ // stubbed for backwards compatibility ++ return 0; + } + const stringifiedArgs = JSON.stringify({ + method: args.method, +@@ -232,12 +201,10 @@ class EdrProviderWrapper extends events_1.EventEmitter { + response = responseObject.data; + } + const needsTraces = this._node._vm.evm.events.eventNames().length > 0 || +- this._node._vm.events.eventNames().length > 0 || +- this._vmTracer !== undefined; ++ this._node._vm.events.eventNames().length > 0; + if (needsTraces) { + const rawTraces = responseObject.traces; + for (const rawTrace of rawTraces) { +- this._vmTracer?.observe(rawTrace); + // For other consumers in JS we need to marshall the entire trace over FFI + const trace = rawTrace.trace(); + // beforeTx event +@@ -272,12 +239,14 @@ class EdrProviderWrapper extends events_1.EventEmitter { + } + if ((0, http_1.isErrorResponse)(response)) { + let error; +- const solidityTrace = responseObject.solidityTrace; +- let stackTrace; +- if (solidityTrace !== null) { +- stackTrace = await this._rawTraceToSolidityStackTrace(solidityTrace); ++ let stackTrace = null; ++ try { ++ stackTrace = responseObject.stackTrace(); + } +- if (stackTrace !== undefined) { ++ catch (e) { ++ log("Failed to get stack trace: %O", e); ++ } ++ if (stackTrace !== null) { + error = (0, solidity_errors_1.encodeSolidityStackTrace)(response.error.message, stackTrace); + // Pass data and transaction hash from the original error + error.data = response.error.data?.data ?? undefined; +@@ -315,23 +284,15 @@ class EdrProviderWrapper extends events_1.EventEmitter { + return response.result; + } } +- /** +- * Sets a `VMTracer` that observes EVM throughout requests. +- * +- * Used for internal stack traces integration tests. +- */ +- setVmTracer(vmTracer) { +- this._vmTracer = vmTracer; +- } // temporarily added to make smock work with HH+EDR - _setCallOverrideCallback(callback) { + async _setCallOverrideCallback(callback) { @@ -129,17 +424,68 @@ index b981b1efa0095eb1b02c4846d83a2fe1c003b7fa..688ac6270244b1267bfbd1498a0c184a } _ethEventListener(event) { const subscription = `0x${event.filterId.toString(16)}`; +@@ -357,50 +318,6 @@ class EdrProviderWrapper extends events_1.EventEmitter { + }; + this.emit("message", message); + } +- _addCompilationResultParams(params) { +- return (0, validation_1.validateParams)(params, t.string, solc_1.rpcCompilerInput, solc_1.rpcCompilerOutput); +- } +- async _addCompilationResultAction(solcVersion, compilerInput, compilerOutput) { +- let bytecodes; +- try { +- bytecodes = (0, compiler_to_model_1.createModelsAndDecodeBytecodes)(solcVersion, compilerInput, compilerOutput); +- } +- catch (error) { +- console.warn(picocolors_1.default.yellow("The Hardhat Network tracing engine could not be updated. Run Hardhat with --verbose to learn more.")); +- log("VmTraceDecoder failed to be updated. Please report this to help us improve Hardhat.\n", error); +- return false; +- } +- for (const bytecode of bytecodes) { +- this._vmTraceDecoder.addBytecode(bytecode); +- } +- return true; +- } +- _getStackTraceFailuresCountParams(params) { +- return (0, validation_1.validateParams)(params); +- } +- _getStackTraceFailuresCountAction() { +- return this._failedStackTraces; +- } +- async _rawTraceToSolidityStackTrace(rawTrace) { +- const vmTracer = new vm_tracer_1.VMTracer(); +- vmTracer.observe(rawTrace); +- let vmTrace = vmTracer.getLastTopLevelMessageTrace(); +- const vmTracerError = vmTracer.getLastError(); +- if (vmTrace !== undefined) { +- vmTrace = this._vmTraceDecoder.tryToDecodeMessageTrace(vmTrace); +- } +- try { +- if (vmTrace === undefined || vmTracerError !== undefined) { +- throw vmTracerError; +- } +- const solidityTracer = new solidityTracer_1.SolidityTracer(); +- return solidityTracer.getStackTrace(vmTrace); +- } +- catch (err) { +- this._failedStackTraces += 1; +- log("Could not generate stack trace. Please report this to help us improve Hardhat.\n", err); +- } +- } + } + exports.EdrProviderWrapper = EdrProviderWrapper; + async function clientVersion(edrClientVersion) { diff --git a/internal/hardhat-network/provider/provider.js.map b/internal/hardhat-network/provider/provider.js.map -index a3f76bed476f594bb8cce9f42cfae119222b9651..d750b731305b0014d7fafd41455bceed61097a01 100644 +index a3f76bed476f594bb8cce9f42cfae119222b9651..8fb33c04261890604e7e45c5a084d4eb2a25d623 100644 --- a/internal/hardhat-network/provider/provider.js.map +++ b/internal/hardhat-network/provider/provider.js.map @@ -1 +1 @@ -{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/internal/hardhat-network/provider/provider.ts"],"names":[],"mappings":"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"} \ No newline at end of file -+{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/internal/hardhat-network/provider/provider.ts"],"names":[],"mappings":"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 ++{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/internal/hardhat-network/provider/provider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/internal/hardhat-network/provider/utils/convertToEdr.d.ts b/internal/hardhat-network/provider/utils/convertToEdr.d.ts -index 3f88a622b92abfd911f4b79f5160758ee81a0f2a..adc1b7023dbb62eefcdcdaa2c9756ec84ad3241f 100644 +index 3f88a622b92abfd911f4b79f5160758ee81a0f2a..be4753717245f5701b29f34b8b461a4b7f012a90 100644 --- a/internal/hardhat-network/provider/utils/convertToEdr.d.ts +++ b/internal/hardhat-network/provider/utils/convertToEdr.d.ts @@ -1,9 +1,9 @@ @@ -312,11 +658,253 @@ index 8afd28f3b90c3bbfa7f053d380f4877291a87750..a5c829372ce9e7beb808379f471c28a4 \ No newline at end of file +{"version":3,"file":"convertToEdr.js","sourceRoot":"","sources":["../../../../src/internal/hardhat-network/provider/utils/convertToEdr.ts"],"names":[],"mappings":"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"} \ No newline at end of file +diff --git a/internal/hardhat-network/stack-traces/solidity-errors.js b/internal/hardhat-network/stack-traces/solidity-errors.js +index bfb2860de84741c49d777823e000bfdec3c24185..18042da757683b9067a015314cb9d373451c3d8f 100644 +--- a/internal/hardhat-network/stack-traces/solidity-errors.js ++++ b/internal/hardhat-network/stack-traces/solidity-errors.js +@@ -63,45 +63,45 @@ function encodeSolidityStackTrace(fallbackMessage, stackTrace, previousStack) { + exports.encodeSolidityStackTrace = encodeSolidityStackTrace; + function encodeStackTraceEntry(stackTraceEntry) { + switch (stackTraceEntry.type) { +- case 11 /* StackTraceEntryType.UNRECOGNIZED_FUNCTION_WITHOUT_FALLBACK_ERROR */: +- case 12 /* StackTraceEntryType.MISSING_FALLBACK_OR_RECEIVE_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.UNRECOGNIZED_FUNCTION_WITHOUT_FALLBACK_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.MISSING_FALLBACK_OR_RECEIVE_ERROR: + return sourceReferenceToSolidityCallsite({ + ...stackTraceEntry.sourceReference, + function: solidity_stack_trace_1.UNRECOGNIZED_FUNCTION_NAME, + }); +- case 0 /* StackTraceEntryType.CALLSTACK_ENTRY */: +- case 4 /* StackTraceEntryType.REVERT_ERROR */: +- case 6 /* StackTraceEntryType.CUSTOM_ERROR */: +- case 7 /* StackTraceEntryType.FUNCTION_NOT_PAYABLE_ERROR */: +- case 8 /* StackTraceEntryType.INVALID_PARAMS_ERROR */: +- case 9 /* StackTraceEntryType.FALLBACK_NOT_PAYABLE_ERROR */: +- case 10 /* StackTraceEntryType.FALLBACK_NOT_PAYABLE_AND_NO_RECEIVE_ERROR */: +- case 13 /* StackTraceEntryType.RETURNDATA_SIZE_ERROR */: +- case 14 /* StackTraceEntryType.NONCONTRACT_ACCOUNT_CALLED_ERROR */: +- case 15 /* StackTraceEntryType.CALL_FAILED_ERROR */: +- case 16 /* StackTraceEntryType.DIRECT_LIBRARY_CALL_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.CALLSTACK_ENTRY: ++ case solidity_stack_trace_1.StackTraceEntryType.REVERT_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.CUSTOM_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.FUNCTION_NOT_PAYABLE_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.INVALID_PARAMS_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.FALLBACK_NOT_PAYABLE_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.FALLBACK_NOT_PAYABLE_AND_NO_RECEIVE_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.RETURNDATA_SIZE_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.NONCONTRACT_ACCOUNT_CALLED_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.CALL_FAILED_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.DIRECT_LIBRARY_CALL_ERROR: + return sourceReferenceToSolidityCallsite(stackTraceEntry.sourceReference); +- case 1 /* StackTraceEntryType.UNRECOGNIZED_CREATE_CALLSTACK_ENTRY */: ++ case solidity_stack_trace_1.StackTraceEntryType.UNRECOGNIZED_CREATE_CALLSTACK_ENTRY: + return new SolidityCallSite(undefined, solidity_stack_trace_1.UNRECOGNIZED_CONTRACT_NAME, solidity_stack_trace_1.CONSTRUCTOR_FUNCTION_NAME, undefined); +- case 2 /* StackTraceEntryType.UNRECOGNIZED_CONTRACT_CALLSTACK_ENTRY */: ++ case solidity_stack_trace_1.StackTraceEntryType.UNRECOGNIZED_CONTRACT_CALLSTACK_ENTRY: + return new SolidityCallSite((0, ethereumjs_util_1.bytesToHex)(stackTraceEntry.address), solidity_stack_trace_1.UNRECOGNIZED_CONTRACT_NAME, solidity_stack_trace_1.UNKNOWN_FUNCTION_NAME, undefined); +- case 3 /* StackTraceEntryType.PRECOMPILE_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.PRECOMPILE_ERROR: + return new SolidityCallSite(undefined, ``, solidity_stack_trace_1.PRECOMPILE_FUNCTION_NAME, undefined); +- case 17 /* StackTraceEntryType.UNRECOGNIZED_CREATE_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.UNRECOGNIZED_CREATE_ERROR: + return new SolidityCallSite(undefined, solidity_stack_trace_1.UNRECOGNIZED_CONTRACT_NAME, solidity_stack_trace_1.CONSTRUCTOR_FUNCTION_NAME, undefined); +- case 18 /* StackTraceEntryType.UNRECOGNIZED_CONTRACT_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.UNRECOGNIZED_CONTRACT_ERROR: + return new SolidityCallSite((0, ethereumjs_util_1.bytesToHex)(stackTraceEntry.address), solidity_stack_trace_1.UNRECOGNIZED_CONTRACT_NAME, solidity_stack_trace_1.UNKNOWN_FUNCTION_NAME, undefined); +- case 22 /* StackTraceEntryType.INTERNAL_FUNCTION_CALLSTACK_ENTRY */: ++ case solidity_stack_trace_1.StackTraceEntryType.INTERNAL_FUNCTION_CALLSTACK_ENTRY: + return new SolidityCallSite(stackTraceEntry.sourceReference.sourceName, stackTraceEntry.sourceReference.contract, `internal@${stackTraceEntry.pc}`, undefined); +- case 23 /* StackTraceEntryType.CONTRACT_CALL_RUN_OUT_OF_GAS_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.CONTRACT_CALL_RUN_OUT_OF_GAS_ERROR: + if (stackTraceEntry.sourceReference !== undefined) { + return sourceReferenceToSolidityCallsite(stackTraceEntry.sourceReference); + } + return new SolidityCallSite(undefined, solidity_stack_trace_1.UNRECOGNIZED_CONTRACT_NAME, solidity_stack_trace_1.UNKNOWN_FUNCTION_NAME, undefined); +- case 19 /* StackTraceEntryType.OTHER_EXECUTION_ERROR */: +- case 21 /* StackTraceEntryType.CONTRACT_TOO_LARGE_ERROR */: +- case 5 /* StackTraceEntryType.PANIC_ERROR */: +- case 20 /* StackTraceEntryType.UNMAPPED_SOLC_0_6_3_REVERT_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.OTHER_EXECUTION_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.CONTRACT_TOO_LARGE_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.PANIC_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.UNMAPPED_SOLC_0_6_3_REVERT_ERROR: + if (stackTraceEntry.sourceReference === undefined) { + return new SolidityCallSite(undefined, solidity_stack_trace_1.UNRECOGNIZED_CONTRACT_NAME, solidity_stack_trace_1.UNKNOWN_FUNCTION_NAME, undefined); + } +@@ -115,30 +115,30 @@ function sourceReferenceToSolidityCallsite(sourceReference) { + } + function getMessageFromLastStackTraceEntry(stackTraceEntry) { + switch (stackTraceEntry.type) { +- case 3 /* StackTraceEntryType.PRECOMPILE_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.PRECOMPILE_ERROR: + return `Transaction reverted: call to precompile ${stackTraceEntry.precompile} failed`; +- case 7 /* StackTraceEntryType.FUNCTION_NOT_PAYABLE_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.FUNCTION_NOT_PAYABLE_ERROR: + return `Transaction reverted: non-payable function was called with value ${stackTraceEntry.value.toString(10)}`; +- case 8 /* StackTraceEntryType.INVALID_PARAMS_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.INVALID_PARAMS_ERROR: + return `Transaction reverted: function was called with incorrect parameters`; +- case 9 /* StackTraceEntryType.FALLBACK_NOT_PAYABLE_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.FALLBACK_NOT_PAYABLE_ERROR: + return `Transaction reverted: fallback function is not payable and was called with value ${stackTraceEntry.value.toString(10)}`; +- case 10 /* StackTraceEntryType.FALLBACK_NOT_PAYABLE_AND_NO_RECEIVE_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.FALLBACK_NOT_PAYABLE_AND_NO_RECEIVE_ERROR: + return `Transaction reverted: there's no receive function, fallback function is not payable and was called with value ${stackTraceEntry.value.toString(10)}`; +- case 11 /* StackTraceEntryType.UNRECOGNIZED_FUNCTION_WITHOUT_FALLBACK_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.UNRECOGNIZED_FUNCTION_WITHOUT_FALLBACK_ERROR: + return `Transaction reverted: function selector was not recognized and there's no fallback function`; +- case 12 /* StackTraceEntryType.MISSING_FALLBACK_OR_RECEIVE_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.MISSING_FALLBACK_OR_RECEIVE_ERROR: + return `Transaction reverted: function selector was not recognized and there's no fallback nor receive function`; +- case 13 /* StackTraceEntryType.RETURNDATA_SIZE_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.RETURNDATA_SIZE_ERROR: + return `Transaction reverted: function returned an unexpected amount of data`; +- case 14 /* StackTraceEntryType.NONCONTRACT_ACCOUNT_CALLED_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.NONCONTRACT_ACCOUNT_CALLED_ERROR: + return `Transaction reverted: function call to a non-contract account`; +- case 15 /* StackTraceEntryType.CALL_FAILED_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.CALL_FAILED_ERROR: + return `Transaction reverted: function call failed to execute`; +- case 16 /* StackTraceEntryType.DIRECT_LIBRARY_CALL_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.DIRECT_LIBRARY_CALL_ERROR: + return `Transaction reverted: library was called directly`; +- case 17 /* StackTraceEntryType.UNRECOGNIZED_CREATE_ERROR */: +- case 18 /* StackTraceEntryType.UNRECOGNIZED_CONTRACT_ERROR */: { ++ case solidity_stack_trace_1.StackTraceEntryType.UNRECOGNIZED_CREATE_ERROR: ++ case solidity_stack_trace_1.StackTraceEntryType.UNRECOGNIZED_CONTRACT_ERROR: { + const returnData = new return_data_1.ReturnData(stackTraceEntry.returnData); + if (returnData.isErrorReturnData()) { + return `VM Exception while processing transaction: reverted with reason string '${returnData.decodeError()}'`; +@@ -156,7 +156,7 @@ function getMessageFromLastStackTraceEntry(stackTraceEntry) { + } + return "Transaction reverted without a reason string"; + } +- case 4 /* StackTraceEntryType.REVERT_ERROR */: { ++ case solidity_stack_trace_1.StackTraceEntryType.REVERT_ERROR: { + const returnData = new return_data_1.ReturnData(stackTraceEntry.returnData); + if (returnData.isErrorReturnData()) { + return `VM Exception while processing transaction: reverted with reason string '${returnData.decodeError()}'`; +@@ -166,19 +166,19 @@ function getMessageFromLastStackTraceEntry(stackTraceEntry) { + } + return "Transaction reverted without a reason string"; + } +- case 5 /* StackTraceEntryType.PANIC_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.PANIC_ERROR: + const panicMessage = (0, panic_errors_1.panicErrorCodeToMessage)(stackTraceEntry.errorCode); + return `VM Exception while processing transaction: ${panicMessage}`; +- case 6 /* StackTraceEntryType.CUSTOM_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.CUSTOM_ERROR: + return `VM Exception while processing transaction: ${stackTraceEntry.message}`; +- case 19 /* StackTraceEntryType.OTHER_EXECUTION_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.OTHER_EXECUTION_ERROR: + // TODO: What if there was returnData? + return `Transaction reverted and Hardhat couldn't infer the reason.`; +- case 20 /* StackTraceEntryType.UNMAPPED_SOLC_0_6_3_REVERT_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.UNMAPPED_SOLC_0_6_3_REVERT_ERROR: + return "Transaction reverted without a reason string and without a valid sourcemap provided by the compiler. Some line numbers may be off. We strongly recommend upgrading solc and always using revert reasons."; +- case 21 /* StackTraceEntryType.CONTRACT_TOO_LARGE_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.CONTRACT_TOO_LARGE_ERROR: + return "Transaction reverted: trying to deploy a contract whose code is too large"; +- case 23 /* StackTraceEntryType.CONTRACT_CALL_RUN_OUT_OF_GAS_ERROR */: ++ case solidity_stack_trace_1.StackTraceEntryType.CONTRACT_CALL_RUN_OUT_OF_GAS_ERROR: + return "Transaction reverted: contract call run out of gas and made the transaction revert"; + } + } +diff --git a/internal/hardhat-network/stack-traces/solidity-errors.js.map b/internal/hardhat-network/stack-traces/solidity-errors.js.map +index caff4346a72040655d5183fa08bde2727e5e2738..656eccbc4afd66cedbcb90f5b5fabd7800ac52df 100644 +--- a/internal/hardhat-network/stack-traces/solidity-errors.js.map ++++ b/internal/hardhat-network/stack-traces/solidity-errors.js.map +@@ -1 +1 @@ +-{"version":3,"file":"solidity-errors.js","sourceRoot":"","sources":["../../../src/internal/hardhat-network/stack-traces/solidity-errors.ts"],"names":[],"mappings":"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"} +\ No newline at end of file ++{"version":3,"file":"solidity-errors.js","sourceRoot":"","sources":["../../../src/internal/hardhat-network/stack-traces/solidity-errors.ts"],"names":[],"mappings":"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"} +\ No newline at end of file +diff --git a/src/internal/cli/cli.ts b/src/internal/cli/cli.ts +index c00c3a01379703f1807c18db195c7ae8f0c47692..48ed4cdf75f9ce7bd06f8e25361c86b8bd506982 100644 +--- a/src/internal/cli/cli.ts ++++ b/src/internal/cli/cli.ts +@@ -277,7 +277,7 @@ async function main() { + + let taskArguments: TaskArguments; + +- // --help is a also special case ++ // --help is an also special case + if (hardhatArguments.help && taskName !== TASK_HELP) { + // we "move" the task and scope names to the task arguments, + // and run the help task +diff --git a/src/internal/cli/is-node-version-to-warn-on.ts b/src/internal/cli/is-node-version-to-warn-on.ts +index cc954d0b3e90d924e46665725a95f4d679ac073b..4a1945aa8be40f3e35fe7c38a22f339fac88a8f5 100644 +--- a/src/internal/cli/is-node-version-to-warn-on.ts ++++ b/src/internal/cli/is-node-version-to-warn-on.ts +@@ -7,7 +7,7 @@ import { SUPPORTED_NODE_VERSIONS } from "./constants"; + * Determine if the node version should trigger an unsupported + * warning. + * +- * The current rule is that a unsupported warning will be shown if ++ * The current rule is that an unsupported warning will be shown if + * + * 1. An odd numbered version of Node.js is used - as this will never go to LTS + * 2. The version is less than the minimum supported version +diff --git a/src/internal/core/config/config-loading.ts b/src/internal/core/config/config-loading.ts +index e17967faa422a5ea68e1e2ef6d478c00bd7f57ed..2851cda6dbb91234eac673e620e5a65bf96a7a4f 100644 +--- a/src/internal/core/config/config-loading.ts ++++ b/src/internal/core/config/config-loading.ts +@@ -168,7 +168,7 @@ function deepFreezeUserConfig( + * Receives an Error and checks if it's a MODULE_NOT_FOUND and the reason that + * caused it. + * +- * If it can infer the reason, it throws an appropiate error. Otherwise it does ++ * If it can infer the reason, it throws an appropriate error. Otherwise it does + * nothing. + */ + export function analyzeModuleNotFoundError(error: any, configPath: string) { +diff --git a/src/internal/core/config/config-validation.ts b/src/internal/core/config/config-validation.ts +index 57a22321c7fa13eba7b0d3b4c23f3e48d75088db..271d88eec88fb213b36296465a74ff24e74cd217 100644 +--- a/src/internal/core/config/config-validation.ts ++++ b/src/internal/core/config/config-validation.ts +@@ -383,7 +383,7 @@ export function getValidationErrors(config: any): string[] { + if (hardhatNetwork !== undefined && typeof hardhatNetwork === "object") { + if ("url" in hardhatNetwork) { + errors.push( +- `HardhatConfig.networks.${HARDHAT_NETWORK_NAME} can't have an url` ++ `HardhatConfig.networks.${HARDHAT_NETWORK_NAME} can't have a url` + ); + } + +diff --git a/src/internal/core/typescript-support.ts b/src/internal/core/typescript-support.ts +index cfcd86eadd70f44b7818a703a8aa67f93318cd71..a10993d4ae02b2c8acc18e3b25b7bec46169b469 100644 +--- a/src/internal/core/typescript-support.ts ++++ b/src/internal/core/typescript-support.ts +@@ -17,7 +17,7 @@ export function willRunWithTypescript(configPath?: string): boolean { + } + + /** +- * Returns true if an Hardhat is already running with typescript. ++ * Returns true if a Hardhat is already running with typescript. + */ + export function isRunningWithTypescript(config: HardhatConfig): boolean { + return isNonEsmTypescriptFile(config.paths.configFile); diff --git a/src/internal/hardhat-network/provider/provider.ts b/src/internal/hardhat-network/provider/provider.ts -index b43e2565d8982f58806e0b4f182de0c8d0d4028d..822fb599c557863583754bbe98e1f2f606489eea 100644 +index b43e2565d8982f58806e0b4f182de0c8d0d4028d..270c4521d33872a879dd33a40e7850bf115716c2 100644 --- a/src/internal/hardhat-network/provider/provider.ts +++ b/src/internal/hardhat-network/provider/provider.ts -@@ -18,6 +18,7 @@ import type { +@@ -1,7 +1,5 @@ + import type { + Artifacts, +- CompilerInput, +- CompilerOutput, + EIP1193Provider, + EthSubscription, + HardhatNetworkChainsConfig, +@@ -11,19 +9,16 @@ import type { + import type { + EdrContext, + Provider as EdrProviderT, +- VmTraceDecoder as VmTraceDecoderT, +- VMTracer as VMTracerT, +- RawTrace, + Response, SubscriptionEvent, HttpHeader, } from "@nomicfoundation/edr"; @@ -324,7 +912,43 @@ index b43e2565d8982f58806e0b4f182de0c8d0d4028d..822fb599c557863583754bbe98e1f2f6 import { Common } from "@nomicfoundation/ethereumjs-common"; import picocolors from "picocolors"; import debug from "debug"; -@@ -85,14 +86,19 @@ export const DEFAULT_COINBASE = "0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e"; + import { EventEmitter } from "events"; + import fsExtra from "fs-extra"; +-import * as t from "io-ts"; + import semver from "semver"; + + import { requireNapiRsModule } from "../../../common/napi-rs"; +@@ -31,11 +26,6 @@ import { + HARDHAT_NETWORK_RESET_EVENT, + HARDHAT_NETWORK_REVERT_SNAPSHOT_EVENT, + } from "../../constants"; +-import { +- rpcCompilerInput, +- rpcCompilerOutput, +-} from "../../core/jsonrpc/types/input/solc"; +-import { validateParams } from "../../core/jsonrpc/types/input/validation"; + import { + InvalidArgumentsError, + InvalidInputError, +@@ -43,17 +33,10 @@ import { + } from "../../core/providers/errors"; + import { isErrorResponse } from "../../core/providers/http"; + import { getHardforkName } from "../../util/hardforks"; +-import { createModelsAndDecodeBytecodes } from "../stack-traces/compiler-to-model"; + import { ConsoleLogger } from "../stack-traces/consoleLogger"; +-import { +- VmTraceDecoder, +- initializeVmTraceDecoder, +-} from "../stack-traces/vm-trace-decoder"; + import { FIRST_SOLC_VERSION_SUPPORTED } from "../stack-traces/constants"; + import { encodeSolidityStackTrace } from "../stack-traces/solidity-errors"; + import { SolidityStackTrace } from "../stack-traces/solidity-stack-trace"; +-import { SolidityTracer } from "../stack-traces/solidityTracer"; +-import { VMTracer } from "../stack-traces/vm-tracer"; + + import { getPackageJson } from "../../util/packageInfo"; + import { +@@ -85,14 +68,19 @@ export const DEFAULT_COINBASE = "0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e"; let _globalEdrContext: EdrContext | undefined; // Lazy initialize the global EDR context. @@ -348,7 +972,34 @@ index b43e2565d8982f58806e0b4f182de0c8d0d4028d..822fb599c557863583754bbe98e1f2f6 } return _globalEdrContext; -@@ -194,7 +200,7 @@ export class EdrProviderWrapper +@@ -168,25 +156,16 @@ export class EdrProviderWrapper + // temporarily added to make smock work with HH+EDR + private _callOverrideCallback?: CallOverrideCallback; + +- /** Used for internal stack trace tests. */ +- private _vmTracer?: VMTracerT; +- + private constructor( + private readonly _provider: EdrProviderT, + // we add this for backwards-compatibility with plugins like solidity-coverage + private readonly _node: { + _vm: MinimalEthereumJsVm; + }, +- private readonly _vmTraceDecoder: VmTraceDecoderT, + // The common configuration for EthereumJS VM is not used by EDR, but tests expect it as part of the provider. +- private readonly _common: Common, +- tracingConfig?: TracingConfig ++ private readonly _common: Common + ) { + super(); +- +- if (tracingConfig !== undefined) { +- initializeVmTraceDecoder(this._vmTraceDecoder, tracingConfig); +- } + } + + public static async create( +@@ -194,7 +173,7 @@ export class EdrProviderWrapper loggerConfig: LoggerConfig, tracingConfig?: TracingConfig ): Promise { @@ -357,8 +1008,12 @@ index b43e2565d8982f58806e0b4f182de0c8d0d4028d..822fb599c557863583754bbe98e1f2f6 "@nomicfoundation/edr" ) as typeof import("@nomicfoundation/edr"); -@@ -242,8 +248,14 @@ export class EdrProviderWrapper +@@ -238,12 +217,18 @@ export class EdrProviderWrapper + const printLineFn = loggerConfig.printLineFn ?? printLine; + const replaceLastLineFn = loggerConfig.replaceLastLineFn ?? replaceLastLine; +- const vmTraceDecoder = new VmTraceDecoder(); +- const hardforkName = getHardforkName(config.hardfork); - const provider = await Provider.withConfig( @@ -366,7 +1021,9 @@ index b43e2565d8982f58806e0b4f182de0c8d0d4028d..822fb599c557863583754bbe98e1f2f6 + const genesisState = + fork !== undefined + ? [] -+ : l1GenesisState(l1HardforkFromString(config.hardfork)); ++ : l1GenesisState( ++ l1HardforkFromString(ethereumsjsHardforkToEdrSpecId(hardforkName)) ++ ); + + const context = await getGlobalEdrContext(); + const provider = await context.createProvider( @@ -374,7 +1031,7 @@ index b43e2565d8982f58806e0b4f182de0c8d0d4028d..822fb599c557863583754bbe98e1f2f6 { allowBlocksWithSameTimestamp: config.allowBlocksWithSameTimestamp ?? false, -@@ -272,13 +284,8 @@ export class EdrProviderWrapper +@@ -272,13 +257,8 @@ export class EdrProviderWrapper coinbase: Buffer.from(coinbase.slice(2), "hex"), enableRip7212: config.enableRip7212, fork, @@ -389,7 +1046,7 @@ index b43e2565d8982f58806e0b4f182de0c8d0d4028d..822fb599c557863583754bbe98e1f2f6 initialDate, initialBaseFeePerGas: config.initialBaseFeePerGas !== undefined -@@ -293,6 +300,12 @@ export class EdrProviderWrapper +@@ -293,19 +273,16 @@ export class EdrProviderWrapper }, }, networkId: BigInt(config.networkId), @@ -402,22 +1059,113 @@ index b43e2565d8982f58806e0b4f182de0c8d0d4028d..822fb599c557863583754bbe98e1f2f6 }, { enable: loggerConfig.enabled, -@@ -314,8 +327,10 @@ export class EdrProviderWrapper + decodeConsoleLogInputsCallback: ConsoleLogger.getDecodedLogs, +- getContractAndFunctionNameCallback: ( +- code: Buffer, +- calldata?: Buffer +- ) => { +- return vmTraceDecoder.getContractAndFunctionNamesForCall( +- code, +- calldata +- ); +- }, + printLineCallback: (message: string, replace: boolean) => { + if (replace) { + replaceLastLineFn(message); +@@ -314,9 +291,12 @@ export class EdrProviderWrapper } }, }, - (event: SubscriptionEvent) => { - eventAdapter.emit("ethEvent", event); +- } + { + subscriptionCallback: (event: SubscriptionEvent) => { + eventAdapter.emit("ethEvent", event); + }, - } ++ }, ++ tracingConfig ?? {} ); -@@ -492,18 +507,20 @@ export class EdrProviderWrapper + const minimalEthereumJsNode = { +@@ -327,9 +307,7 @@ export class EdrProviderWrapper + const wrapper = new EdrProviderWrapper( + provider, + minimalEthereumJsNode, +- vmTraceDecoder, +- common, +- tracingConfig ++ common + ); + + // Pass through all events from the provider +@@ -350,14 +328,9 @@ export class EdrProviderWrapper + + const params = args.params ?? []; + +- if (args.method === "hardhat_addCompilationResult") { +- return this._addCompilationResultAction( +- ...this._addCompilationResultParams(params) +- ); +- } else if (args.method === "hardhat_getStackTraceFailuresCount") { +- return this._getStackTraceFailuresCountAction( +- ...this._getStackTraceFailuresCountParams(params) +- ); ++ if (args.method === "hardhat_getStackTraceFailuresCount") { ++ // stubbed for backwards compatibility ++ return 0; + } + + const stringifiedArgs = JSON.stringify({ +@@ -378,14 +351,11 @@ export class EdrProviderWrapper + + const needsTraces = + this._node._vm.evm.events.eventNames().length > 0 || +- this._node._vm.events.eventNames().length > 0 || +- this._vmTracer !== undefined; ++ this._node._vm.events.eventNames().length > 0; + + if (needsTraces) { + const rawTraces = responseObject.traces; + for (const rawTrace of rawTraces) { +- this._vmTracer?.observe(rawTrace); +- + // For other consumers in JS we need to marshall the entire trace over FFI + const trace = rawTrace.trace(); + +@@ -434,13 +404,14 @@ export class EdrProviderWrapper + if (isErrorResponse(response)) { + let error; + +- const solidityTrace = responseObject.solidityTrace; +- let stackTrace: SolidityStackTrace | undefined; +- if (solidityTrace !== null) { +- stackTrace = await this._rawTraceToSolidityStackTrace(solidityTrace); ++ let stackTrace: SolidityStackTrace | null = null; ++ try { ++ stackTrace = responseObject.stackTrace(); ++ } catch (e) { ++ log("Failed to get stack trace: %O", e); + } + +- if (stackTrace !== undefined) { ++ if (stackTrace !== null) { + error = encodeSolidityStackTrace(response.error.message, stackTrace); + // Pass data and transaction hash from the original error + (error as any).data = response.error.data?.data ?? undefined; +@@ -482,28 +453,21 @@ export class EdrProviderWrapper + } } +- /** +- * Sets a `VMTracer` that observes EVM throughout requests. +- * +- * Used for internal stack traces integration tests. +- */ +- public setVmTracer(vmTracer?: VMTracerT) { +- this._vmTracer = vmTracer; +- } +- // temporarily added to make smock work with HH+EDR - private _setCallOverrideCallback(callback: CallOverrideCallback) { + private async _setCallOverrideCallback( @@ -440,6 +1188,95 @@ index b43e2565d8982f58806e0b4f182de0c8d0d4028d..822fb599c557863583754bbe98e1f2f6 } private _ethEventListener(event: SubscriptionEvent) { +@@ -533,88 +497,6 @@ export class EdrProviderWrapper + + this.emit("message", message); + } +- +- private _addCompilationResultParams( +- params: any[] +- ): [string, CompilerInput, CompilerOutput] { +- return validateParams( +- params, +- t.string, +- rpcCompilerInput, +- rpcCompilerOutput +- ); +- } +- +- private async _addCompilationResultAction( +- solcVersion: string, +- compilerInput: CompilerInput, +- compilerOutput: CompilerOutput +- ): Promise { +- let bytecodes; +- try { +- bytecodes = createModelsAndDecodeBytecodes( +- solcVersion, +- compilerInput, +- compilerOutput +- ); +- } catch (error) { +- console.warn( +- picocolors.yellow( +- "The Hardhat Network tracing engine could not be updated. Run Hardhat with --verbose to learn more." +- ) +- ); +- +- log( +- "VmTraceDecoder failed to be updated. Please report this to help us improve Hardhat.\n", +- error +- ); +- +- return false; +- } +- +- for (const bytecode of bytecodes) { +- this._vmTraceDecoder.addBytecode(bytecode); +- } +- +- return true; +- } +- +- private _getStackTraceFailuresCountParams(params: any[]): [] { +- return validateParams(params); +- } +- +- private _getStackTraceFailuresCountAction(): number { +- return this._failedStackTraces; +- } +- +- private async _rawTraceToSolidityStackTrace( +- rawTrace: RawTrace +- ): Promise { +- const vmTracer = new VMTracer(); +- vmTracer.observe(rawTrace); +- +- let vmTrace = vmTracer.getLastTopLevelMessageTrace(); +- const vmTracerError = vmTracer.getLastError(); +- +- if (vmTrace !== undefined) { +- vmTrace = this._vmTraceDecoder.tryToDecodeMessageTrace(vmTrace); +- } +- +- try { +- if (vmTrace === undefined || vmTracerError !== undefined) { +- throw vmTracerError; +- } +- +- const solidityTracer = new SolidityTracer(); +- return solidityTracer.getStackTrace(vmTrace); +- } catch (err) { +- this._failedStackTraces += 1; +- log( +- "Could not generate stack trace. Please report this to help us improve Hardhat.\n", +- err +- ); +- } +- } + } + + async function clientVersion(edrClientVersion: string): Promise { diff --git a/src/internal/hardhat-network/provider/utils/convertToEdr.ts b/src/internal/hardhat-network/provider/utils/convertToEdr.ts index a955ef12258fdd26580509feac5a22df03aae979..702b9e9ca9eba72dbc941eb8a4f6aeaa29b142ad 100644 --- a/src/internal/hardhat-network/provider/utils/convertToEdr.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index acda44de3..2022cfc82 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '9.0' +lockfileVersion: "9.0" settings: autoInstallPeers: true @@ -8,18 +8,17 @@ overrides: hardhat>@nomicfoundation/edr: workspace:* patchedDependencies: - '@defi-wonderland/smock@2.4.0': + "@defi-wonderland/smock@2.4.0": hash: zemhiof4b3pqw5bzdzeiyb46dm path: patches/@defi-wonderland__smock@2.4.0.patch hardhat@2.22.17: - hash: 5dlbms7lke6m3jszimtrwcdhcu + hash: 5kbe3szvpqwqapxops377srmkq path: patches/hardhat@2.22.17.patch importers: - .: devDependencies: - '@changesets/cli': + "@changesets/cli": specifier: ^2.27.1 version: 2.27.1 prettier: @@ -31,28 +30,28 @@ importers: crates/edr_napi: devDependencies: - '@napi-rs/cli': + "@napi-rs/cli": specifier: ^2.18.4 version: 2.18.4 - '@nomicfoundation/ethereumjs-util': + "@nomicfoundation/ethereumjs-util": specifier: ^9.0.4 version: 9.0.4 - '@types/chai': + "@types/chai": specifier: ^4.2.0 version: 4.3.12 - '@types/chai-as-promised': + "@types/chai-as-promised": specifier: ^7.1.8 version: 7.1.8 - '@types/mocha': - specifier: '>=9.1.0' + "@types/mocha": + specifier: ">=9.1.0" version: 10.0.6 - '@types/node': + "@types/node": specifier: ^20.0.0 version: 20.16.1 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 5.61.0 version: 5.61.0(eslint@8.57.0)(typescript@5.0.4) chai: @@ -94,22 +93,22 @@ importers: crates/tools/js/benchmark: devDependencies: - '@types/argparse': + "@types/argparse": specifier: ^2.0.16 version: 2.0.16 - '@types/chai': + "@types/chai": specifier: ^4.2.0 version: 4.3.12 - '@types/lodash': + "@types/lodash": specifier: ^4.14.123 version: 4.17.0 - '@types/node': + "@types/node": specifier: ^20.0.0 version: 20.16.1 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 5.61.0 version: 5.61.0(eslint@8.57.0)(typescript@5.0.4) argparse: @@ -135,7 +134,7 @@ importers: version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) hardhat: specifier: 2.22.17 - version: 2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4) + version: 2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4) lodash: specifier: ^4.17.11 version: 4.17.21 @@ -151,79 +150,79 @@ importers: hardhat-tests: devDependencies: - '@metamask/eth-sig-util': + "@metamask/eth-sig-util": specifier: ^4.0.0 version: 4.0.1 - '@nomicfoundation/edr': + "@nomicfoundation/edr": specifier: workspace:* version: link:../crates/edr_napi - '@nomicfoundation/ethereumjs-block': + "@nomicfoundation/ethereumjs-block": specifier: 5.0.4 version: 5.0.4 - '@nomicfoundation/ethereumjs-common': + "@nomicfoundation/ethereumjs-common": specifier: ^4.0.4 version: 4.0.4 - '@nomicfoundation/ethereumjs-tx': + "@nomicfoundation/ethereumjs-tx": specifier: ^5.0.4 version: 5.0.4 - '@nomicfoundation/ethereumjs-util': + "@nomicfoundation/ethereumjs-util": specifier: ^9.0.4 version: 9.0.4 - '@types/async-eventemitter': + "@types/async-eventemitter": specifier: ^0.2.1 version: 0.2.4 - '@types/chai': + "@types/chai": specifier: ^4.2.0 version: 4.3.12 - '@types/chai-as-promised': + "@types/chai-as-promised": specifier: ^7.1.8 version: 7.1.8 - '@types/ci-info': + "@types/ci-info": specifier: ^2.0.0 version: 2.0.0 - '@types/debug': + "@types/debug": specifier: ^4.1.4 version: 4.1.12 - '@types/find-up': + "@types/find-up": specifier: ^2.1.1 version: 2.1.1 - '@types/fs-extra': + "@types/fs-extra": specifier: ^5.1.0 version: 5.1.0 - '@types/glob': + "@types/glob": specifier: ^7.1.1 version: 7.2.0 - '@types/keccak': + "@types/keccak": specifier: ^3.0.1 version: 3.0.4 - '@types/lodash': + "@types/lodash": specifier: ^4.14.123 version: 4.17.0 - '@types/mocha': - specifier: '>=9.1.0' + "@types/mocha": + specifier: ">=9.1.0" version: 10.0.6 - '@types/node': + "@types/node": specifier: ^20.0.0 version: 20.16.1 - '@types/resolve': + "@types/resolve": specifier: ^1.17.1 version: 1.20.6 - '@types/semver': + "@types/semver": specifier: ^6.0.2 version: 6.2.7 - '@types/sinon': + "@types/sinon": specifier: ^9.0.8 version: 9.0.11 - '@types/uuid': + "@types/uuid": specifier: ^8.3.1 version: 8.3.4 - '@types/ws': + "@types/ws": specifier: ^7.2.1 version: 7.4.7 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 5.61.0 version: 5.61.0(eslint@8.57.0)(typescript@5.0.4) chai: @@ -261,7 +260,7 @@ importers: version: 7.0.1 hardhat: specifier: 2.22.17 - version: 2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4) + version: 2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4) mocha: specifier: ^10.0.0 version: 10.3.0 @@ -289,13 +288,13 @@ importers: hardhat-tests/integration/smock: devDependencies: - '@defi-wonderland/smock': + "@defi-wonderland/smock": specifier: ^2.4.0 - version: 2.4.0(patch_hash=zemhiof4b3pqw5bzdzeiyb46dm)(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4)))(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4)) - '@nomiclabs/hardhat-ethers': + version: 2.4.0(patch_hash=zemhiof4b3pqw5bzdzeiyb46dm)(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4)))(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4)) + "@nomiclabs/hardhat-ethers": specifier: ^2.2.3 - version: 2.2.3(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4)) - '@types/node': + version: 2.2.3(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4)) + "@types/node": specifier: ^20.0.0 version: 20.16.1 chai: @@ -306,1283 +305,2242 @@ importers: version: 5.7.2 hardhat: specifier: 2.22.17 - version: 2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4) + version: 2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4) mocha: specifier: ^10.0.0 version: 10.3.0 packages: - - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@adraffy/ens-normalize@1.10.1': - resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.24.4': - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} - engines: {node: '>=6.9.0'} - - '@changesets/apply-release-plan@7.0.0': - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} - - '@changesets/assemble-release-plan@6.0.0': - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} - - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - - '@changesets/cli@2.27.1': - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + "@aashutoshrathi/word-wrap@1.2.6": + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: ">=0.10.0" } + + "@adraffy/ens-normalize@1.10.1": + resolution: + { + integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==, + } + + "@babel/code-frame@7.24.2": + resolution: + { + integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.22.20": + resolution: + { + integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, + } + engines: { node: ">=6.9.0" } + + "@babel/highlight@7.24.2": + resolution: + { + integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==, + } + engines: { node: ">=6.9.0" } + + "@babel/runtime@7.24.4": + resolution: + { + integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==, + } + engines: { node: ">=6.9.0" } + + "@changesets/apply-release-plan@7.0.0": + resolution: + { + integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==, + } + + "@changesets/assemble-release-plan@6.0.0": + resolution: + { + integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==, + } + + "@changesets/changelog-git@0.2.0": + resolution: + { + integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==, + } + + "@changesets/cli@2.27.1": + resolution: + { + integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==, + } hasBin: true - '@changesets/config@3.0.0': - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} - - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - - '@changesets/get-dependents-graph@2.0.0': - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} - - '@changesets/get-release-plan@4.0.0': - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} - - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - - '@changesets/git@3.0.0': - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} - - '@changesets/logger@0.1.0': - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} - - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - - '@changesets/pre@2.0.0': - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} - - '@changesets/read@0.6.0': - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} - - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - - '@changesets/write@0.3.0': - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@defi-wonderland/smock@2.4.0': - resolution: {integrity: sha512-eS5fuAa9MOVDvXsT7Qa4v9Tg0Pk5ypfY3JWyW93a5sqyY2E2nCuRRBC53IikM9z0tVB2YYA8C9bWK8Lc47mATw==} + "@changesets/config@3.0.0": + resolution: + { + integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==, + } + + "@changesets/errors@0.2.0": + resolution: + { + integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==, + } + + "@changesets/get-dependents-graph@2.0.0": + resolution: + { + integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==, + } + + "@changesets/get-release-plan@4.0.0": + resolution: + { + integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==, + } + + "@changesets/get-version-range-type@0.4.0": + resolution: + { + integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==, + } + + "@changesets/git@3.0.0": + resolution: + { + integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==, + } + + "@changesets/logger@0.1.0": + resolution: + { + integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==, + } + + "@changesets/parse@0.4.0": + resolution: + { + integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==, + } + + "@changesets/pre@2.0.0": + resolution: + { + integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==, + } + + "@changesets/read@0.6.0": + resolution: + { + integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==, + } + + "@changesets/types@4.1.0": + resolution: + { + integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==, + } + + "@changesets/types@6.0.0": + resolution: + { + integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==, + } + + "@changesets/write@0.3.0": + resolution: + { + integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==, + } + + "@cspotcode/source-map-support@0.8.1": + resolution: + { + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + } + engines: { node: ">=12" } + + "@defi-wonderland/smock@2.4.0": + resolution: + { + integrity: sha512-eS5fuAa9MOVDvXsT7Qa4v9Tg0Pk5ypfY3JWyW93a5sqyY2E2nCuRRBC53IikM9z0tVB2YYA8C9bWK8Lc47mATw==, + } peerDependencies: - '@ethersproject/abi': ^5 - '@ethersproject/abstract-provider': ^5 - '@ethersproject/abstract-signer': ^5 - '@nomiclabs/hardhat-ethers': ^2 + "@ethersproject/abi": ^5 + "@ethersproject/abstract-provider": ^5 + "@ethersproject/abstract-signer": ^5 + "@nomiclabs/hardhat-ethers": ^2 ethers: ^5 hardhat: ^2.21.0 - '@effect/schema@0.69.0': - resolution: {integrity: sha512-dqVnriWqM8TT8d+5vgg1pH4ZOXfs7tQBVAY5N7PALzIOlZamsBKQCdwvMMqremjSkKITckF8/cIj1eQZHQeg7Q==} + "@effect/schema@0.69.0": + resolution: + { + integrity: sha512-dqVnriWqM8TT8d+5vgg1pH4ZOXfs7tQBVAY5N7PALzIOlZamsBKQCdwvMMqremjSkKITckF8/cIj1eQZHQeg7Q==, + } peerDependencies: effect: ^3.5.7 - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} + "@esbuild/aix-ppc64@0.19.12": + resolution: + { + integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} + "@esbuild/android-arm64@0.19.12": + resolution: + { + integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, + } + engines: { node: ">=12" } cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} + "@esbuild/android-arm@0.19.12": + resolution: + { + integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, + } + engines: { node: ">=12" } cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} + "@esbuild/android-x64@0.19.12": + resolution: + { + integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, + } + engines: { node: ">=12" } cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} + "@esbuild/darwin-arm64@0.19.12": + resolution: + { + integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, + } + engines: { node: ">=12" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} + "@esbuild/darwin-x64@0.19.12": + resolution: + { + integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, + } + engines: { node: ">=12" } cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} + "@esbuild/freebsd-arm64@0.19.12": + resolution: + { + integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, + } + engines: { node: ">=12" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} + "@esbuild/freebsd-x64@0.19.12": + resolution: + { + integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, + } + engines: { node: ">=12" } cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} + "@esbuild/linux-arm64@0.19.12": + resolution: + { + integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, + } + engines: { node: ">=12" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} + "@esbuild/linux-arm@0.19.12": + resolution: + { + integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, + } + engines: { node: ">=12" } cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} + "@esbuild/linux-ia32@0.19.12": + resolution: + { + integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, + } + engines: { node: ">=12" } cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} + "@esbuild/linux-loong64@0.19.12": + resolution: + { + integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, + } + engines: { node: ">=12" } cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} + "@esbuild/linux-mips64el@0.19.12": + resolution: + { + integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, + } + engines: { node: ">=12" } cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} + "@esbuild/linux-ppc64@0.19.12": + resolution: + { + integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} + "@esbuild/linux-riscv64@0.19.12": + resolution: + { + integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, + } + engines: { node: ">=12" } cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} + "@esbuild/linux-s390x@0.19.12": + resolution: + { + integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, + } + engines: { node: ">=12" } cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} + "@esbuild/linux-x64@0.19.12": + resolution: + { + integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, + } + engines: { node: ">=12" } cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + "@esbuild/netbsd-x64@0.19.12": + resolution: + { + integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, + } + engines: { node: ">=12" } cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} + "@esbuild/openbsd-x64@0.19.12": + resolution: + { + integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, + } + engines: { node: ">=12" } cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + "@esbuild/sunos-x64@0.19.12": + resolution: + { + integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, + } + engines: { node: ">=12" } cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + "@esbuild/win32-arm64@0.19.12": + resolution: + { + integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, + } + engines: { node: ">=12" } cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} + "@esbuild/win32-ia32@0.19.12": + resolution: + { + integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, + } + engines: { node: ">=12" } cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} + "@esbuild/win32-x64@0.19.12": + resolution: + { + integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, + } + engines: { node: ">=12" } cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@eslint-community/eslint-utils@4.4.0": + 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 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@ethersproject/abi@5.7.0': - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - - '@ethersproject/abstract-provider@5.7.0': - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - - '@ethersproject/abstract-signer@5.7.0': - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - - '@ethersproject/address@5.7.0': - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - - '@ethersproject/base64@5.7.0': - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - - '@ethersproject/basex@5.7.0': - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} - - '@ethersproject/bignumber@5.7.0': - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - - '@ethersproject/bytes@5.7.0': - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - - '@ethersproject/constants@5.7.0': - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - - '@ethersproject/contracts@5.7.0': - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - - '@ethersproject/hash@5.7.0': - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - - '@ethersproject/hdnode@5.7.0': - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} - - '@ethersproject/json-wallets@5.7.0': - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} - - '@ethersproject/keccak256@5.7.0': - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - - '@ethersproject/logger@5.7.0': - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - - '@ethersproject/networks@5.7.1': - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - - '@ethersproject/pbkdf2@5.7.0': - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} - - '@ethersproject/properties@5.7.0': - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - - '@ethersproject/providers@5.7.2': - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} - - '@ethersproject/random@5.7.0': - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - - '@ethersproject/rlp@5.7.0': - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - - '@ethersproject/sha2@5.7.0': - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - - '@ethersproject/signing-key@5.7.0': - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - - '@ethersproject/solidity@5.7.0': - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - - '@ethersproject/strings@5.7.0': - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - - '@ethersproject/transactions@5.7.0': - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - - '@ethersproject/units@5.7.0': - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} - - '@ethersproject/wallet@5.7.0': - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - - '@ethersproject/web@5.7.1': - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} - - '@ethersproject/wordlists@5.7.0': - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - - '@fastify/busboy@2.1.0': - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} - engines: {node: '>=14'} - - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + "@eslint-community/regexpp@4.10.0": + resolution: + { + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + "@eslint/eslintrc@2.1.4": + resolution: + { + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + "@eslint/js@8.57.0": + resolution: + { + integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + "@ethersproject/abi@5.7.0": + resolution: + { + integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==, + } + + "@ethersproject/abstract-provider@5.7.0": + resolution: + { + integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==, + } + + "@ethersproject/abstract-signer@5.7.0": + resolution: + { + integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==, + } + + "@ethersproject/address@5.7.0": + resolution: + { + integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==, + } + + "@ethersproject/base64@5.7.0": + resolution: + { + integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==, + } + + "@ethersproject/basex@5.7.0": + resolution: + { + integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==, + } + + "@ethersproject/bignumber@5.7.0": + resolution: + { + integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==, + } + + "@ethersproject/bytes@5.7.0": + resolution: + { + integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==, + } + + "@ethersproject/constants@5.7.0": + resolution: + { + integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==, + } + + "@ethersproject/contracts@5.7.0": + resolution: + { + integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==, + } + + "@ethersproject/hash@5.7.0": + resolution: + { + integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==, + } + + "@ethersproject/hdnode@5.7.0": + resolution: + { + integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==, + } + + "@ethersproject/json-wallets@5.7.0": + resolution: + { + integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==, + } + + "@ethersproject/keccak256@5.7.0": + resolution: + { + integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==, + } + + "@ethersproject/logger@5.7.0": + resolution: + { + integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==, + } + + "@ethersproject/networks@5.7.1": + resolution: + { + integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==, + } + + "@ethersproject/pbkdf2@5.7.0": + resolution: + { + integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==, + } + + "@ethersproject/properties@5.7.0": + resolution: + { + integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==, + } + + "@ethersproject/providers@5.7.2": + resolution: + { + integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==, + } + + "@ethersproject/random@5.7.0": + resolution: + { + integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==, + } + + "@ethersproject/rlp@5.7.0": + resolution: + { + integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==, + } + + "@ethersproject/sha2@5.7.0": + resolution: + { + integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==, + } + + "@ethersproject/signing-key@5.7.0": + resolution: + { + integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==, + } + + "@ethersproject/solidity@5.7.0": + resolution: + { + integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==, + } + + "@ethersproject/strings@5.7.0": + resolution: + { + integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==, + } + + "@ethersproject/transactions@5.7.0": + resolution: + { + integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==, + } + + "@ethersproject/units@5.7.0": + resolution: + { + integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==, + } + + "@ethersproject/wallet@5.7.0": + resolution: + { + integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==, + } + + "@ethersproject/web@5.7.1": + resolution: + { + integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==, + } + + "@ethersproject/wordlists@5.7.0": + resolution: + { + integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==, + } + + "@fastify/busboy@2.1.0": + resolution: + { + integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, + } + engines: { node: ">=14" } + + "@humanwhocodes/config-array@0.11.14": + resolution: + { + integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==, + } + engines: { node: ">=10.10.0" } deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + "@humanwhocodes/module-importer@1.0.1": + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + "@humanwhocodes/object-schema@2.0.3": + resolution: + { + integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==, + } deprecated: Use @eslint/object-schema instead - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - - '@metamask/eth-sig-util@4.0.1': - resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} - engines: {node: '>=12.0.0'} - - '@napi-rs/cli@2.18.4': - resolution: {integrity: sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==} - engines: {node: '>= 10'} + "@jridgewell/resolve-uri@3.1.2": + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/sourcemap-codec@1.4.15": + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } + + "@jridgewell/trace-mapping@0.3.9": + resolution: + { + integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, + } + + "@manypkg/find-root@1.1.0": + resolution: + { + integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==, + } + + "@manypkg/get-packages@1.1.3": + resolution: + { + integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==, + } + + "@metamask/eth-sig-util@4.0.1": + resolution: + { + integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==, + } + engines: { node: ">=12.0.0" } + + "@napi-rs/cli@2.18.4": + resolution: + { + integrity: sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==, + } + engines: { node: ">= 10" } hasBin: true - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - - '@noble/hashes@1.2.0': - resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - - '@noble/secp256k1@1.7.1': - resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@nomicfoundation/ethereumjs-block@5.0.4': - resolution: {integrity: sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==} - engines: {node: '>=18'} - - '@nomicfoundation/ethereumjs-common@4.0.4': - resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} - - '@nomicfoundation/ethereumjs-rlp@5.0.4': - resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} - engines: {node: '>=18'} + "@noble/curves@1.2.0": + resolution: + { + integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==, + } + + "@noble/hashes@1.2.0": + resolution: + { + integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==, + } + + "@noble/hashes@1.3.2": + resolution: + { + integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==, + } + engines: { node: ">= 16" } + + "@noble/secp256k1@1.7.1": + resolution: + { + integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==, + } + + "@nodelib/fs.scandir@2.1.5": + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.stat@2.0.5": + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.walk@1.2.8": + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + + "@nomicfoundation/ethereumjs-block@5.0.4": + resolution: + { + integrity: sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==, + } + engines: { node: ">=18" } + + "@nomicfoundation/ethereumjs-common@4.0.4": + resolution: + { + integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==, + } + + "@nomicfoundation/ethereumjs-rlp@5.0.4": + resolution: + { + integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==, + } + engines: { node: ">=18" } hasBin: true - '@nomicfoundation/ethereumjs-trie@6.0.4': - resolution: {integrity: sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==} - engines: {node: '>=18'} - - '@nomicfoundation/ethereumjs-tx@5.0.4': - resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} - engines: {node: '>=18'} + "@nomicfoundation/ethereumjs-trie@6.0.4": + resolution: + { + integrity: sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==, + } + engines: { node: ">=18" } + + "@nomicfoundation/ethereumjs-tx@5.0.4": + resolution: + { + integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==, + } + engines: { node: ">=18" } peerDependencies: c-kzg: ^2.1.2 peerDependenciesMeta: c-kzg: optional: true - '@nomicfoundation/ethereumjs-util@9.0.4': - resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} - engines: {node: '>=18'} + "@nomicfoundation/ethereumjs-util@9.0.4": + resolution: + { + integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==, + } + engines: { node: ">=18" } peerDependencies: c-kzg: ^2.1.2 peerDependenciesMeta: c-kzg: optional: true - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': - resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} - engines: {node: '>= 10'} + "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + resolution: + { + integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': - resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} - engines: {node: '>= 10'} + "@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + resolution: + { + integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==, + } + engines: { node: ">= 10" } cpu: [x64] os: [darwin] - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': - resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} - engines: {node: '>= 10'} + "@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + resolution: + { + integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==, + } + engines: { node: ">= 10" } cpu: [x64] os: [freebsd] - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': - resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} - engines: {node: '>= 10'} + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + resolution: + { + integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': - resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} - engines: {node: '>= 10'} + "@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + resolution: + { + integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': - resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} - engines: {node: '>= 10'} + "@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + resolution: + { + integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==, + } + engines: { node: ">= 10" } cpu: [x64] os: [linux] - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': - resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} - engines: {node: '>= 10'} + "@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + resolution: + { + integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==, + } + engines: { node: ">= 10" } cpu: [x64] os: [linux] - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': - resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} - engines: {node: '>= 10'} + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + resolution: + { + integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [win32] - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': - resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} - engines: {node: '>= 10'} + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + resolution: + { + integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==, + } + engines: { node: ">= 10" } cpu: [ia32] os: [win32] - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': - resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} - engines: {node: '>= 10'} + "@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + resolution: + { + integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==, + } + engines: { node: ">= 10" } cpu: [x64] os: [win32] - '@nomicfoundation/solidity-analyzer@0.1.1': - resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} - engines: {node: '>= 12'} - - '@nomiclabs/hardhat-ethers@2.2.3': - resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} + "@nomicfoundation/solidity-analyzer@0.1.1": + resolution: + { + integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==, + } + engines: { node: ">= 12" } + + "@nomiclabs/hardhat-ethers@2.2.3": + resolution: + { + integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==, + } peerDependencies: ethers: ^5.0.0 hardhat: ^2.0.0 - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@scure/base@1.1.5': - resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} - - '@scure/bip32@1.1.5': - resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} - - '@scure/bip39@1.1.1': - resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} - - '@sentry/core@5.30.0': - resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} - engines: {node: '>=6'} - - '@sentry/hub@5.30.0': - resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} - engines: {node: '>=6'} - - '@sentry/minimal@5.30.0': - resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} - engines: {node: '>=6'} - - '@sentry/node@5.30.0': - resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} - engines: {node: '>=6'} - - '@sentry/tracing@5.30.0': - resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} - engines: {node: '>=6'} - - '@sentry/types@5.30.0': - resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} - engines: {node: '>=6'} - - '@sentry/utils@5.30.0': - resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} - engines: {node: '>=6'} - - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - - '@sinonjs/commons@1.8.6': - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - - '@sinonjs/fake-timers@6.0.1': - resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} - - '@sinonjs/samsam@5.3.1': - resolution: {integrity: sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==} - - '@sinonjs/text-encoding@0.7.2': - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} - - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@types/argparse@2.0.16': - resolution: {integrity: sha512-aMqBra2JlqpFeCWOinCtpRpiCkPIXH8hahW2+FkGzvWjfE5sAqtOcrjN5DRcMnTQqFDe6gb1CVYuGnBH0lhXwA==} - - '@types/async-eventemitter@0.2.4': - resolution: {integrity: sha512-2Bq61VD01kgLf1XkK2xPtoBcu7fgn/km5JyEX9v0BlG5VQBzA+BlF9umFk+8gR8S4+eK7MgDY2oyVZCu6ar3Jw==} - - '@types/bn.js@4.11.6': - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai-as-promised@7.1.8': - resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - - '@types/chai@4.3.12': - resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==} - - '@types/ci-info@2.0.0': - resolution: {integrity: sha512-5R2/MHILQLDCzTuhs1j4Qqq8AaKUf7Ma4KSSkCtc12+fMs47zfa34qhto9goxpyX00tQK1zxB885VCiawZ5Qhg==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/events@3.0.3': - resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} - - '@types/find-up@2.1.1': - resolution: {integrity: sha512-60LC501bQRN9/3yfVaEEMd7IndaufffL56PBRAejPpUrY304Ps1jfnjNqPw5jmM5R8JHWiKBAe5IHzNcPV41AA==} - - '@types/fs-extra@5.1.0': - resolution: {integrity: sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==} - - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/keccak@3.0.4': - resolution: {integrity: sha512-hdnkmbie7tE0yXnQQvlIOqCyjEsoXDVEZ3ACqO+F305XgUOW4Z9ElWdogCXXRAW/khnZ7GxM0t/BGB5bORKt/g==} - - '@types/lodash@4.17.0': - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - - '@types/lru-cache@5.1.1': - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - - '@types/mocha@10.0.6': - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} - - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@18.15.13': - resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - - '@types/node@20.16.1': - resolution: {integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - - '@types/pbkdf2@3.1.2': - resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} - - '@types/readable-stream@2.3.15': - resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} - - '@types/resolve@1.20.6': - resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} - - '@types/secp256k1@4.0.6': - resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - - '@types/semver@6.2.7': - resolution: {integrity: sha512-blctEWbzUFzQx799RZjzzIdBJOXmE37YYEyDtKkx5Dg+V7o/zyyAxLPiI98A2jdTtDgxZleMdfV+7p8WbRJ1OQ==} - - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - - '@types/sinon@9.0.11': - resolution: {integrity: sha512-PwP4UY33SeeVKodNE37ZlOsR9cReypbMJOhZ7BVE0lB+Hix3efCOxiJWiE5Ia+yL9Cn2Ch72EjFTRze8RZsNtg==} - - '@types/sinonjs__fake-timers@8.1.5': - resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@typescript-eslint/eslint-plugin@5.61.0': - resolution: {integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@pkgr/core@0.1.1": + resolution: + { + integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==, + } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + + "@scure/base@1.1.5": + resolution: + { + integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==, + } + + "@scure/bip32@1.1.5": + resolution: + { + integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==, + } + + "@scure/bip39@1.1.1": + resolution: + { + integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==, + } + + "@sentry/core@5.30.0": + resolution: + { + integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==, + } + engines: { node: ">=6" } + + "@sentry/hub@5.30.0": + resolution: + { + integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==, + } + engines: { node: ">=6" } + + "@sentry/minimal@5.30.0": + resolution: + { + integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==, + } + engines: { node: ">=6" } + + "@sentry/node@5.30.0": + resolution: + { + integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==, + } + engines: { node: ">=6" } + + "@sentry/tracing@5.30.0": + resolution: + { + integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==, + } + engines: { node: ">=6" } + + "@sentry/types@5.30.0": + resolution: + { + integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==, + } + engines: { node: ">=6" } + + "@sentry/utils@5.30.0": + resolution: + { + integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==, + } + engines: { node: ">=6" } + + "@sindresorhus/merge-streams@2.3.0": + resolution: + { + integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==, + } + engines: { node: ">=18" } + + "@sinonjs/commons@1.8.6": + resolution: + { + integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==, + } + + "@sinonjs/fake-timers@6.0.1": + resolution: + { + integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==, + } + + "@sinonjs/samsam@5.3.1": + resolution: + { + integrity: sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==, + } + + "@sinonjs/text-encoding@0.7.2": + resolution: + { + integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==, + } + + "@tsconfig/node10@1.0.11": + resolution: + { + integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==, + } + + "@tsconfig/node12@1.0.11": + resolution: + { + integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, + } + + "@tsconfig/node14@1.0.3": + resolution: + { + integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, + } + + "@tsconfig/node16@1.0.4": + resolution: + { + integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, + } + + "@types/argparse@2.0.16": + resolution: + { + integrity: sha512-aMqBra2JlqpFeCWOinCtpRpiCkPIXH8hahW2+FkGzvWjfE5sAqtOcrjN5DRcMnTQqFDe6gb1CVYuGnBH0lhXwA==, + } + + "@types/async-eventemitter@0.2.4": + resolution: + { + integrity: sha512-2Bq61VD01kgLf1XkK2xPtoBcu7fgn/km5JyEX9v0BlG5VQBzA+BlF9umFk+8gR8S4+eK7MgDY2oyVZCu6ar3Jw==, + } + + "@types/bn.js@4.11.6": + resolution: + { + integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==, + } + + "@types/bn.js@5.1.5": + resolution: + { + integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==, + } + + "@types/chai-as-promised@7.1.8": + resolution: + { + integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==, + } + + "@types/chai@4.3.12": + resolution: + { + integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==, + } + + "@types/ci-info@2.0.0": + resolution: + { + integrity: sha512-5R2/MHILQLDCzTuhs1j4Qqq8AaKUf7Ma4KSSkCtc12+fMs47zfa34qhto9goxpyX00tQK1zxB885VCiawZ5Qhg==, + } + + "@types/debug@4.1.12": + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } + + "@types/events@3.0.3": + resolution: + { + integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==, + } + + "@types/find-up@2.1.1": + resolution: + { + integrity: sha512-60LC501bQRN9/3yfVaEEMd7IndaufffL56PBRAejPpUrY304Ps1jfnjNqPw5jmM5R8JHWiKBAe5IHzNcPV41AA==, + } + + "@types/fs-extra@5.1.0": + resolution: + { + integrity: sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==, + } + + "@types/glob@7.2.0": + resolution: + { + integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==, + } + + "@types/json-schema@7.0.15": + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + + "@types/json5@0.0.29": + resolution: + { + integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, + } + + "@types/keccak@3.0.4": + resolution: + { + integrity: sha512-hdnkmbie7tE0yXnQQvlIOqCyjEsoXDVEZ3ACqO+F305XgUOW4Z9ElWdogCXXRAW/khnZ7GxM0t/BGB5bORKt/g==, + } + + "@types/lodash@4.17.0": + resolution: + { + integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==, + } + + "@types/lru-cache@5.1.1": + resolution: + { + integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==, + } + + "@types/minimatch@5.1.2": + resolution: + { + integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==, + } + + "@types/minimist@1.2.5": + resolution: + { + integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==, + } + + "@types/mocha@10.0.6": + resolution: + { + integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==, + } + + "@types/ms@0.7.34": + resolution: + { + integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, + } + + "@types/node@12.20.55": + resolution: + { + integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, + } + + "@types/node@18.15.13": + resolution: + { + integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==, + } + + "@types/node@20.16.1": + resolution: + { + integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==, + } + + "@types/normalize-package-data@2.4.4": + resolution: + { + integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, + } + + "@types/pbkdf2@3.1.2": + resolution: + { + integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==, + } + + "@types/readable-stream@2.3.15": + resolution: + { + integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==, + } + + "@types/resolve@1.20.6": + resolution: + { + integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==, + } + + "@types/secp256k1@4.0.6": + resolution: + { + integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==, + } + + "@types/semver@6.2.7": + resolution: + { + integrity: sha512-blctEWbzUFzQx799RZjzzIdBJOXmE37YYEyDtKkx5Dg+V7o/zyyAxLPiI98A2jdTtDgxZleMdfV+7p8WbRJ1OQ==, + } + + "@types/semver@7.5.8": + resolution: + { + integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==, + } + + "@types/sinon@9.0.11": + resolution: + { + integrity: sha512-PwP4UY33SeeVKodNE37ZlOsR9cReypbMJOhZ7BVE0lB+Hix3efCOxiJWiE5Ia+yL9Cn2Ch72EjFTRze8RZsNtg==, + } + + "@types/sinonjs__fake-timers@8.1.5": + resolution: + { + integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==, + } + + "@types/uuid@8.3.4": + resolution: + { + integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==, + } + + "@types/ws@7.4.7": + resolution: + { + integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==, + } + + "@typescript-eslint/eslint-plugin@5.61.0": + resolution: + { + integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: - '@typescript-eslint/parser': ^5.0.0 + "@typescript-eslint/parser": ^5.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@5.61.0': - resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@typescript-eslint/parser@5.61.0": + resolution: + { + integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@5.61.0': - resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/type-utils@5.61.0': - resolution: {integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@typescript-eslint/scope-manager@5.61.0": + resolution: + { + integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + "@typescript-eslint/type-utils@5.61.0": + resolution: + { + integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: - eslint: '*' - typescript: '*' + eslint: "*" + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@5.61.0': - resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/typescript-estree@5.61.0': - resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@typescript-eslint/types@5.61.0": + resolution: + { + integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + "@typescript-eslint/typescript-estree@5.61.0": + resolution: + { + integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@5.61.0': - resolution: {integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@typescript-eslint/utils@5.61.0": + resolution: + { + integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/visitor-keys@5.61.0': - resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@typescript-eslint/visitor-keys@5.61.0": + resolution: + { + integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + "@ungap/structured-clone@1.2.0": + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + } acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, + } + engines: { node: ">=0.4.0" } acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, + } + engines: { node: ">=0.4.0" } hasBin: 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" } aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + resolution: + { + integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==, + } aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + resolution: + { + integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==, + } 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" } aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, + } + engines: { node: ">=8" } ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + resolution: + { + integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==, + } 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" } 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" } 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" } 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" } 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" } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } 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" } arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + resolution: + { + integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, + } argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==, + } + engines: { node: ">= 0.4" } array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==, + } + engines: { node: ">= 0.4" } 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" } array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==, + } + engines: { node: ">= 0.4" } array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==, + } + engines: { node: ">= 0.4" } arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==, + } + engines: { node: ">= 0.4" } arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, + } + engines: { node: ">=0.10.0" } assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + resolution: + { + integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, + } available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: ">= 0.4" } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } 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==, + } bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + resolution: + { + integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==, + } better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==, + } + engines: { node: ">=4" } binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, + } + engines: { node: ">=8" } blakejs@1.2.1: - resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + resolution: + { + integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==, + } 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==, + } boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==, + } + engines: { node: ">=10" } brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + resolution: + { + integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==, + } brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + resolution: + { + integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==, + } browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + resolution: + { + integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, + } browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + resolution: + { + integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==, + } bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + resolution: + { + integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==, + } bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + resolution: + { + integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==, + } buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + resolution: + { + integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==, + } bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: ">= 0.8" } call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, + } + engines: { node: ">= 0.4" } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, + } + engines: { node: ">=8" } 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" } chai-as-promised@7.1.1: - 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" chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==, + } + engines: { node: ">=4" } chalk-template@1.1.0: - resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==, + } + engines: { node: ">=14.16" } 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" } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + resolution: + { + integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, + } check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + resolution: + { + integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, + } chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} - engines: {node: '>= 14.16.0'} + resolution: + { + integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==, + } + engines: { node: ">= 14.16.0" } ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + resolution: + { + integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==, + } ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, + } + engines: { node: ">=8" } cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + resolution: + { + integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==, + } clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, + } + engines: { node: ">=6" } cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==, + } + engines: { node: ">=6" } cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, + } + engines: { node: ">=6" } cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + resolution: + { + integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, + } cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + resolution: + { + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, + } 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" } 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" } color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } 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" } 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==, + } command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + resolution: + { + integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==, + } commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==, + } + engines: { node: ">=18" } commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==, + } + engines: { node: ">= 12" } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } 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" } cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, + } + engines: { node: ">=14" } peerDependencies: - typescript: '>=4.9.5' + typescript: ">=4.9.5" peerDependenciesMeta: typescript: optional: true create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + resolution: + { + integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==, + } create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + resolution: + { + integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==, + } create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + resolution: + { + integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, + } cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + resolution: + { + integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==, + } cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + resolution: + { + integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==, + } csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + resolution: + { + integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==, + } csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + resolution: + { + integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==, + } csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} + resolution: + { + integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==, + } + engines: { node: ">= 0.1.90" } data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==, + } + engines: { node: ">= 0.4" } data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==, + } + engines: { node: ">= 0.4" } data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==, + } + engines: { node: ">= 0.4" } debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + resolution: + { + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true debug@4.3.4: - 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 decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, + } + engines: { node: ">=0.10.0" } 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" } 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" } deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, + } + engines: { node: ">=6" } 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==, + } defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + resolution: + { + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, + } define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: ">= 0.4" } define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: ">= 0.4" } 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" } detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, + } + engines: { node: ">=8" } 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" } 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" } dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, + } + engines: { node: ">=0.10.0" } doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } effect@3.5.7: - resolution: {integrity: sha512-PzEncc0R3ZZhqNTR+fXrSX+anF/4Ai6ftKie1ZrUUWY7WPE7d4KjB6wjpeWoGMOC7xWFPGSkBBUudyJN1mx3+g==} + resolution: + { + integrity: sha512-PzEncc0R3ZZhqNTR+fXrSX+anF/4Ai6ftKie1ZrUUWY7WPE7d4KjB6wjpeWoGMOC7xWFPGSkBBUudyJN1mx3+g==, + } elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + resolution: + { + integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==, + } emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + resolution: + { + integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==, + } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } 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" } env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, + } + engines: { node: ">=6" } error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==, + } + engines: { node: ">= 0.4" } es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, + } + engines: { node: ">= 0.4" } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==, + } + engines: { node: ">= 0.4" } es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==, + } + engines: { node: ">= 0.4" } es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + resolution: + { + integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==, + } es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, + } + engines: { node: ">= 0.4" } esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, + } + engines: { node: ">=12" } hasBin: true escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, + } + engines: { node: ">=6" } 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@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + resolution: + { + integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, + } hasBin: true peerDependencies: - eslint: '>=7.0.0' + eslint: ">=7.0.0" eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + resolution: + { + integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, + } eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==, + } + engines: { node: ">=4" } peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' + "@typescript-eslint/parser": "*" + eslint: "*" + eslint-import-resolver-node: "*" + eslint-import-resolver-typescript: "*" + eslint-import-resolver-webpack: "*" peerDependenciesMeta: - '@typescript-eslint/parser': + "@typescript-eslint/parser": optional: true eslint: optional: true @@ -1594,149 +2552,251 @@ packages: optional: true eslint-plugin-import@2.27.5: - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==, + } + engines: { node: ">=4" } peerDependencies: - '@typescript-eslint/parser': '*' + "@typescript-eslint/parser": "*" eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 peerDependenciesMeta: - '@typescript-eslint/parser': + "@typescript-eslint/parser": optional: true eslint-plugin-mocha@10.4.1: - resolution: {integrity: sha512-G85ALUgKaLzuEuHhoW3HVRgPTmia6njQC3qCG6CEvA8/Ja9PDZnRZOuzekMki+HaViEQXINuYsmhp5WR5/4MfA==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-G85ALUgKaLzuEuHhoW3HVRgPTmia6njQC3qCG6CEvA8/Ja9PDZnRZOuzekMki+HaViEQXINuYsmhp5WR5/4MfA==, + } + engines: { node: ">=14.0.0" } peerDependencies: - eslint: '>=7.0.0' + eslint: ">=7.0.0" eslint-plugin-prettier@5.2.1: - resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==, + } + engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: "*" + prettier: ">=3.0.0" peerDependenciesMeta: - '@types/eslint': + "@types/eslint": optional: true eslint-config-prettier: optional: true eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: ">=8.0.0" } eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-utils@3.0.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + resolution: + { + integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, + } + engines: { node: ^10.0.0 || ^12.0.0 || >= 14.0.0 } peerDependencies: - eslint: '>=5' + eslint: ">=5" 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" } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } 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 esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } 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" } estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: ">=4.0" } 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" } 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" } ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + resolution: + { + integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==, + } ethereum-cryptography@1.2.0: - resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + resolution: + { + integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==, + } ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + resolution: + { + integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==, + } ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + resolution: + { + integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==, + } ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + resolution: + { + integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==, + } ethers@6.12.0: - resolution: {integrity: sha512-zL5NlOTjML239gIvtVJuaSk0N9GQLi1Hom3ZWUszE5lDTQE/IVB62mrPkQ2W1bGcZwVGSLaetQbWNQSvI4rGDQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-zL5NlOTjML239gIvtVJuaSk0N9GQLi1Hom3ZWUszE5lDTQE/IVB62mrPkQ2W1bGcZwVGSLaetQbWNQSvI4rGDQ==, + } + engines: { node: ">=14.0.0" } 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" } evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + resolution: + { + integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==, + } extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + resolution: + { + integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==, + } external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, + } + engines: { node: ">=4" } fast-check@3.20.0: - resolution: {integrity: sha512-pZIjqLpOZgdSLecec4GKC3Zq5702MZ34upMKxojnNVSWA0K64V3pXOBT1Wdsrc3AphLtzRBbsi8bRWF4TUGmUg==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-pZIjqLpOZgdSLecec4GKC3Zq5702MZ34upMKxojnNVSWA0K64V3pXOBT1Wdsrc3AphLtzRBbsi8bRWF4TUGmUg==, + } + engines: { node: ">=8.0.0" } fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + resolution: + { + integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==, + } fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + resolution: + { + integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, + } fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + resolution: + { + integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==, + } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1744,153 +2804,267 @@ packages: optional: true file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } 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" } find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: ">=8" } 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" } find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + resolution: + { + integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==, + } flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + resolution: + { + integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, + } + engines: { node: ^10.12.0 || >=12.0.0 } flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + resolution: + { + integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + } hasBin: true flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + resolution: + { + integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, + } follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==, + } + engines: { node: ">=4.0" } peerDependencies: - debug: '*' + debug: "*" peerDependenciesMeta: debug: optional: true for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } fp-ts@1.19.3: - resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + resolution: + { + integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==, + } 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" } 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" } fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, + } + engines: { node: ">= 0.4" } functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==, + } + engines: { node: ">=18" } get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + resolution: + { + integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, + } get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, + } + engines: { node: ">= 0.4" } get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==, + } + engines: { node: ">= 0.4" } get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + resolution: + { + integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==, + } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } 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" } glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + resolution: + { + integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, + } deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: ">=12" } deprecated: Glob versions prior to v9 are no longer supported globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, + } + engines: { node: ">=8" } globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==, + } + engines: { node: ">= 0.4" } globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } globby@14.0.2: - resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==, + } + engines: { node: ">=18" } gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } 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==, + } grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + resolution: + { + integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, + } graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, + } + engines: { node: ">=6" } hardhat@2.22.17: - resolution: {integrity: sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg==} + resolution: + { + integrity: sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg==, + } hasBin: true peerDependencies: - ts-node: '*' - typescript: '*' + ts-node: "*" + typescript: "*" peerDependenciesMeta: ts-node: optional: true @@ -1898,1207 +3072,2173 @@ packages: optional: true has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + resolution: + { + integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, + } 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" } has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + resolution: + { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, + } + engines: { node: ">= 0.4" } has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: ">= 0.4" } has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: ">= 0.4" } has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} + resolution: + { + integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, + } + engines: { node: ">= 0.4.0" } 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" } hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + resolution: + { + integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==, + } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: ">= 0.4" } he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + resolution: + { + integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, + } hasBin: true hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + resolution: + { + integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==, + } hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + resolution: + { + integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, + } hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { + integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==, + } + engines: { node: ^16.14.0 || >=18.0.0 } 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" } 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" } human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + resolution: + { + integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==, + } 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" } ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==, + } + engines: { node: ">= 4" } immutable@4.3.5: - resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + resolution: + { + integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==, + } import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } 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" } inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==, + } + engines: { node: ">= 0.4" } io-ts@1.10.4: - resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + resolution: + { + integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==, + } is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==, + } + engines: { node: ">= 0.4" } is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + resolution: + { + integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, + } is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, + } + engines: { node: ">= 0.4" } 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" } is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + resolution: + { + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, + } is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==, + } + engines: { node: ">= 0.4" } is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, + } + engines: { node: ">= 0.4" } is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } 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-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } 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" } is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==, + } + engines: { node: ">=12" } is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, + } + engines: { node: ">= 0.4" } is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, + } + engines: { node: ">= 0.4" } 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" } 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" } is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, + } + engines: { node: ">=0.10.0" } 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" } is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, + } + engines: { node: ">= 0.4" } is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==, + } + engines: { node: ">= 0.4" } is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, + } + engines: { node: ">= 0.4" } is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==, + } + engines: { node: ">=4" } is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, + } + engines: { node: ">= 0.4" } is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==, + } + engines: { node: ">= 0.4" } is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: ">=10" } is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, + } + engines: { node: ">=12" } is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==, + } + engines: { node: ">=18" } is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + resolution: + { + integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, + } is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, + } + engines: { node: ">=0.10.0" } isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + resolution: + { + integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, + } isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + resolution: + { + integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==, + } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } hasBin: true js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } json-stream-stringify@3.1.4: - resolution: {integrity: sha512-oGoz05ft577LolnXFQHD2CjnXDxXVA5b8lHwfEZgRXQUZeCMo6sObQQRq+NXuHQ3oTeMZHHmmPY2rjVwyqR62A==} - engines: {node: '>=7.10.1'} + resolution: + { + integrity: sha512-oGoz05ft577LolnXFQHD2CjnXDxXVA5b8lHwfEZgRXQUZeCMo6sObQQRq+NXuHQ3oTeMZHHmmPY2rjVwyqR62A==, + } + engines: { node: ">=7.10.1" } json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + resolution: + { + integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, + } hasBin: true jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } just-extend@4.2.1: - resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + resolution: + { + integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==, + } 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" } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } 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" } kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: ">=6" } kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: ">=6" } 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" } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==, + } + engines: { node: ">=6" } locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: ">=8" } 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" } lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + resolution: + { + integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, + } lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + resolution: + { + integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, + } lodash.isequalwith@4.4.0: - resolution: {integrity: sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ==} + resolution: + { + integrity: sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ==, + } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + resolution: + { + integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, + } lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } 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" } log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==, + } + engines: { node: ">=18" } loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + resolution: + { + integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, + } lru-cache@10.2.1: - resolution: {integrity: sha512-tS24spDe/zXhWbNPErCHs/AGOzbKGHT+ybSBqmdLm8WZ1xXLWvH8Qn71QPAlqVhd0qUTWjy+Kl9JmISgDdEjsA==} - engines: {node: 14 || >=16.14} + resolution: + { + integrity: sha512-tS24spDe/zXhWbNPErCHs/AGOzbKGHT+ybSBqmdLm8WZ1xXLWvH8Qn71QPAlqVhd0qUTWjy+Kl9JmISgDdEjsA==, + } + engines: { node: 14 || >=16.14 } lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + resolution: + { + integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==, + } 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" } lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + resolution: + { + integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==, + } make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + resolution: + { + integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, + } map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, + } + engines: { node: ">=0.10.0" } map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, + } + engines: { node: ">=8" } md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + resolution: + { + integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==, + } 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" } meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==, + } + engines: { node: ">=8" } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } 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" } mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, + } + engines: { node: ">=4" } 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@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} + resolution: + { + integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==, + } + engines: { node: 20 || >=22 } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } 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" } minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, + } + engines: { node: ">= 6" } minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} + resolution: + { + integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==, + } + engines: { node: ">= 8.0.0" } mnemonist@0.38.5: - resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + resolution: + { + integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==, + } mocha@10.3.0: - resolution: {integrity: sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==} - engines: {node: '>= 14.0.0'} + resolution: + { + integrity: sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==, + } + engines: { node: ">= 14.0.0" } hasBin: true ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + resolution: + { + integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, + } natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } nise@4.1.0: - resolution: {integrity: sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==} + resolution: + { + integrity: sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==, + } node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + resolution: + { + integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==, + } node-gyp-build@4.8.0: - resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + resolution: + { + integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==, + } hasBin: true normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + resolution: + { + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, + } 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" } npm-package-arg@11.0.3: - resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { + integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==, + } + engines: { node: ^16.14.0 || >=18.0.0 } object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + resolution: + { + integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, + } object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: ">= 0.4" } object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, + } + engines: { node: ">= 0.4" } object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==, + } + engines: { node: ">= 0.4" } obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + resolution: + { + integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==, + } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } 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" } ora@8.0.1: - resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==, + } + engines: { node: ">=18" } 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" } outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + resolution: + { + integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==, + } p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==, + } + engines: { node: ">=8" } p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: ">=6" } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } 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" } 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" } p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==, + } + engines: { node: ">=6" } 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" } 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" } 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" } parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: ">=8" } 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" } path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + resolution: + { + integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==, + } path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: ">=8" } path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==, + } + engines: { node: ">=12" } pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + resolution: + { + integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, + } pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==, + } + engines: { node: ">=0.12" } picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, + } + engines: { node: ">=12" } pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, + } + engines: { node: ">=6" } pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + } + engines: { node: ">=8" } possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, + } + engines: { node: ">= 0.4" } preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==, + } + engines: { node: ">=10" } 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" } 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" } 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 prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, + } + engines: { node: ">=14" } hasBin: true proc-log@4.2.0: - resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: ">= 6" } pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + resolution: + { + integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==, + } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + resolution: + { + integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==, + } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, + } + engines: { node: ">=8" } rambda@7.5.0: - resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} + resolution: + { + integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==, + } randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } 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" } read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, + } + engines: { node: ">=8" } read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, + } + engines: { node: ">=8" } read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==, + } + engines: { node: ">=6" } read-yaml-file@2.1.0: - resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==} - engines: {node: '>=10.13'} + resolution: + { + integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==, + } + engines: { node: ">=10.13" } readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } readdirp@4.0.1: - resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} - engines: {node: '>= 14.16.0'} + resolution: + { + integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==, + } + engines: { node: ">= 14.16.0" } redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, + } + engines: { node: ">=8" } regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==, + } + engines: { node: ">= 0.4" } 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-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolution: + { + integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, + } 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" } resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: ">=8" } resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + resolution: + { + integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==, + } resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } hasBin: true restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 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" } rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + resolution: + { + integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==, + } rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + resolution: + { + integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==, + } hasBin: true run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + resolution: + { + integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, + } safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==, + } + engines: { node: ">=0.4" } safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==, + } + engines: { node: ">= 0.4" } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + resolution: + { + integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==, + } 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" } semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + resolution: + { + integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + } hasBin: true semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } hasBin: true semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, + } + engines: { node: ">=10" } hasBin: true semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==, + } + engines: { node: ">=10" } hasBin: true serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + resolution: + { + integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==, + } set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: ">= 0.4" } set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: ">= 0.4" } 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==, + } sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + resolution: + { + integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, + } hasBin: true shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, + } + engines: { node: ">=0.10.0" } 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" } shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, + } + engines: { node: ">=0.10.0" } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, + } + engines: { node: ">= 0.4" } signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } sinon@9.2.4: - resolution: {integrity: sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==} + resolution: + { + integrity: sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==, + } deprecated: 16.1.1 sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: ">=8" } slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==, + } + engines: { node: ">=14.16" } smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==, + } + engines: { node: ">=6" } hasBin: true solc@0.8.26: - resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==, + } + engines: { node: ">=10.0.0" } hasBin: true source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } 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" } spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + resolution: + { + integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==, + } spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + resolution: + { + integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, + } spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + resolution: + { + integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==, + } sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==, + } + engines: { node: ">=6" } 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" } stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==, + } + engines: { node: ">=18" } stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + resolution: + { + integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==, + } 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" } string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + } + engines: { node: ">=18" } string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==, + } + engines: { node: ">= 0.4" } string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + resolution: + { + integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==, + } string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: ">= 0.4" } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: ">=4" } 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" } 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" } strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, + } + engines: { node: ">=8" } 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" } supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } 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" } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: ">=10" } 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" } synckit@0.9.1: - resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==, + } + engines: { node: ^14.18.0 || >=16.0.0 } syncpack@12.4.0: - resolution: {integrity: sha512-iVDbuxW1zpjC8IuGLLgTjfgnAjr1iTd+In//RGUi49nKT8f6BWYSEAt496fj4eGNmYeajUiGngBHl15Jb++RBg==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-iVDbuxW1zpjC8IuGLLgTjfgnAjr1iTd+In//RGUi49nKT8f6BWYSEAt496fj4eGNmYeajUiGngBHl15Jb++RBg==, + } + engines: { node: ">=16" } hasBin: true term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==, + } + engines: { node: ">=8" } text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } tightrope@0.2.0: - resolution: {integrity: sha512-Kw36UHxJEELq2VUqdaSGR2/8cAsPgMtvX8uGVU6Jk26O66PhXec0A5ZnRYs47btbtwPDpXXF66+Fo3vimCM9aQ==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-Kw36UHxJEELq2VUqdaSGR2/8cAsPgMtvX8uGVU6Jk26O66PhXec0A5ZnRYs47btbtwPDpXXF66+Fo3vimCM9aQ==, + } + engines: { node: ">=16" } tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==, + } + engines: { node: ">=12.0.0" } tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: ">=0.6.0" } 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" } 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" } trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, + } + engines: { node: ">=8" } ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + resolution: + { + integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==, + } 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 ts-toolbelt@9.6.0: - resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + resolution: + { + integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==, + } tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + resolution: + { + integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, + } tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + resolution: + { + integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==, + } tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + resolution: + { + integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==, + } tsort@0.0.1: - resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + resolution: + { + integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==, + } tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, + } + engines: { node: ">= 6" } peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" tsx@4.7.1: - resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==, + } + engines: { node: ">=18.0.0" } hasBin: true tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==, + } + engines: { node: ">=8.0.0" } hasBin: true tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + resolution: + { + integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==, + } tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + resolution: + { + integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==, + } 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" } 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" } type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==, + } + engines: { node: ">=10" } 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" } 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" } type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, + } + engines: { node: ">=8" } 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" } type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, + } + engines: { node: ">=8" } typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==, + } + engines: { node: ">= 0.4" } typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==, + } + engines: { node: ">= 0.4" } typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==, + } + engines: { node: ">= 0.4" } typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==, + } + engines: { node: ">= 0.4" } typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} + resolution: + { + integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==, + } + engines: { node: ">=12.20" } hasBin: true unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + resolution: + { + integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, + } undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + resolution: + { + integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==, + } undici@5.28.3: - resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} - engines: {node: '>=14.0'} + resolution: + { + integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==, + } + engines: { node: ">=14.0" } unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==, + } + engines: { node: ">=18" } 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" } 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" } uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } hasBin: true v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + resolution: + { + integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, + } validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + } which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + resolution: + { + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, + } which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + resolution: + { + integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==, + } which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} + resolution: + { + integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==, + } + engines: { node: ">=8.15" } which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==, + } + engines: { node: ">= 0.4" } which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } hasBin: 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 widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==, + } + engines: { node: ">=8" } workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + resolution: + { + integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==, + } wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: ">=8" } 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" } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } 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 @@ -3109,8 +5249,11 @@ packages: optional: 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 @@ -3121,8 +5264,11 @@ packages: optional: true ws@8.5.0: - resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==, + } + engines: { node: ">=10.0.0" } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -3133,86 +5279,124 @@ packages: optional: true y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + resolution: + { + integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, + } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + resolution: + { + integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==, + } yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, + } + engines: { node: ">=6" } yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, + } + engines: { node: ">=10" } 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" } yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, + } + engines: { node: ">=10" } yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, + } + engines: { node: ">=8" } yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, + } + engines: { node: ">=10" } yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: ">=12" } yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, + } + engines: { node: ">=6" } 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" } snapshots: + "@aashutoshrathi/word-wrap@1.2.6": {} - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@adraffy/ens-normalize@1.10.1': {} + "@adraffy/ens-normalize@1.10.1": {} - '@babel/code-frame@7.24.2': + "@babel/code-frame@7.24.2": dependencies: - '@babel/highlight': 7.24.2 + "@babel/highlight": 7.24.2 picocolors: 1.0.0 - '@babel/helper-validator-identifier@7.22.20': {} + "@babel/helper-validator-identifier@7.22.20": {} - '@babel/highlight@7.24.2': + "@babel/highlight@7.24.2": dependencies: - '@babel/helper-validator-identifier': 7.22.20 + "@babel/helper-validator-identifier": 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - '@babel/runtime@7.24.4': + "@babel/runtime@7.24.4": dependencies: regenerator-runtime: 0.14.1 - '@changesets/apply-release-plan@7.0.0': + "@changesets/apply-release-plan@7.0.0": dependencies: - '@babel/runtime': 7.24.4 - '@changesets/config': 3.0.0 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.24.4 + "@changesets/config": 3.0.0 + "@changesets/get-version-range-type": 0.4.0 + "@changesets/git": 3.0.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 lodash.startcase: 4.4.0 @@ -3221,37 +5405,37 @@ snapshots: resolve-from: 5.0.0 semver: 7.6.0 - '@changesets/assemble-release-plan@6.0.0': + "@changesets/assemble-release-plan@6.0.0": dependencies: - '@babel/runtime': 7.24.4 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.24.4 + "@changesets/errors": 0.2.0 + "@changesets/get-dependents-graph": 2.0.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 semver: 7.6.0 - '@changesets/changelog-git@0.2.0': - dependencies: - '@changesets/types': 6.0.0 - - '@changesets/cli@2.27.1': - dependencies: - '@babel/runtime': 7.24.4 - '@changesets/apply-release-plan': 7.0.0 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.0 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/get-release-plan': 4.0.0 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.0 - '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.8 + "@changesets/changelog-git@0.2.0": + dependencies: + "@changesets/types": 6.0.0 + + "@changesets/cli@2.27.1": + dependencies: + "@babel/runtime": 7.24.4 + "@changesets/apply-release-plan": 7.0.0 + "@changesets/assemble-release-plan": 6.0.0 + "@changesets/changelog-git": 0.2.0 + "@changesets/config": 3.0.0 + "@changesets/errors": 0.2.0 + "@changesets/get-dependents-graph": 2.0.0 + "@changesets/get-release-plan": 4.0.0 + "@changesets/git": 3.0.0 + "@changesets/logger": 0.1.0 + "@changesets/pre": 2.0.0 + "@changesets/read": 0.6.0 + "@changesets/types": 6.0.0 + "@changesets/write": 0.3.0 + "@manypkg/get-packages": 1.1.3 + "@types/semver": 7.5.8 ansi-colors: 4.1.3 chalk: 2.4.2 ci-info: 3.9.0 @@ -3269,104 +5453,104 @@ snapshots: term-size: 2.2.1 tty-table: 4.2.3 - '@changesets/config@3.0.0': + "@changesets/config@3.0.0": dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/logger': 0.1.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@changesets/errors": 0.2.0 + "@changesets/get-dependents-graph": 2.0.0 + "@changesets/logger": 0.1.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.5 - '@changesets/errors@0.2.0': + "@changesets/errors@0.2.0": dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.0.0': + "@changesets/get-dependents-graph@2.0.0": dependencies: - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 semver: 7.6.0 - '@changesets/get-release-plan@4.0.0': + "@changesets/get-release-plan@4.0.0": dependencies: - '@babel/runtime': 7.24.4 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/config': 3.0.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.24.4 + "@changesets/assemble-release-plan": 6.0.0 + "@changesets/config": 3.0.0 + "@changesets/pre": 2.0.0 + "@changesets/read": 0.6.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 - '@changesets/get-version-range-type@0.4.0': {} + "@changesets/get-version-range-type@0.4.0": {} - '@changesets/git@3.0.0': + "@changesets/git@3.0.0": dependencies: - '@babel/runtime': 7.24.4 - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.24.4 + "@changesets/errors": 0.2.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 is-subdir: 1.2.0 micromatch: 4.0.5 spawndamnit: 2.0.0 - '@changesets/logger@0.1.0': + "@changesets/logger@0.1.0": dependencies: chalk: 2.4.2 - '@changesets/parse@0.4.0': + "@changesets/parse@0.4.0": dependencies: - '@changesets/types': 6.0.0 + "@changesets/types": 6.0.0 js-yaml: 3.14.1 - '@changesets/pre@2.0.0': + "@changesets/pre@2.0.0": dependencies: - '@babel/runtime': 7.24.4 - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.24.4 + "@changesets/errors": 0.2.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.0': + "@changesets/read@0.6.0": dependencies: - '@babel/runtime': 7.24.4 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 + "@babel/runtime": 7.24.4 + "@changesets/git": 3.0.0 + "@changesets/logger": 0.1.0 + "@changesets/parse": 0.4.0 + "@changesets/types": 6.0.0 chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 - '@changesets/types@4.1.0': {} + "@changesets/types@4.1.0": {} - '@changesets/types@6.0.0': {} + "@changesets/types@6.0.0": {} - '@changesets/write@0.3.0': + "@changesets/write@0.3.0": dependencies: - '@babel/runtime': 7.24.4 - '@changesets/types': 6.0.0 + "@babel/runtime": 7.24.4 + "@changesets/types": 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 prettier: 2.8.8 - '@cspotcode/source-map-support@0.8.1': + "@cspotcode/source-map-support@0.8.1": dependencies: - '@jridgewell/trace-mapping': 0.3.9 + "@jridgewell/trace-mapping": 0.3.9 - '@defi-wonderland/smock@2.4.0(patch_hash=zemhiof4b3pqw5bzdzeiyb46dm)(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4)))(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4))': + "@defi-wonderland/smock@2.4.0(patch_hash=zemhiof4b3pqw5bzdzeiyb46dm)(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4)))(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4))": dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4)) + "@ethersproject/abi": 5.7.0 + "@ethersproject/abstract-provider": 5.7.0 + "@ethersproject/abstract-signer": 5.7.0 + "@nomicfoundation/ethereumjs-util": 9.0.4 + "@nomiclabs/hardhat-ethers": 2.2.3(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4)) diff: 5.0.0 ethers: 5.7.2 - hardhat: 2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4) + hardhat: 2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4) lodash.isequal: 4.5.0 lodash.isequalwith: 4.4.0 rxjs: 7.8.1 @@ -3374,88 +5558,88 @@ snapshots: transitivePeerDependencies: - c-kzg - '@effect/schema@0.69.0(effect@3.5.7)': + "@effect/schema@0.69.0(effect@3.5.7)": dependencies: effect: 3.5.7 fast-check: 3.20.0 - '@esbuild/aix-ppc64@0.19.12': + "@esbuild/aix-ppc64@0.19.12": optional: true - '@esbuild/android-arm64@0.19.12': + "@esbuild/android-arm64@0.19.12": optional: true - '@esbuild/android-arm@0.19.12': + "@esbuild/android-arm@0.19.12": optional: true - '@esbuild/android-x64@0.19.12': + "@esbuild/android-x64@0.19.12": optional: true - '@esbuild/darwin-arm64@0.19.12': + "@esbuild/darwin-arm64@0.19.12": optional: true - '@esbuild/darwin-x64@0.19.12': + "@esbuild/darwin-x64@0.19.12": optional: true - '@esbuild/freebsd-arm64@0.19.12': + "@esbuild/freebsd-arm64@0.19.12": optional: true - '@esbuild/freebsd-x64@0.19.12': + "@esbuild/freebsd-x64@0.19.12": optional: true - '@esbuild/linux-arm64@0.19.12': + "@esbuild/linux-arm64@0.19.12": optional: true - '@esbuild/linux-arm@0.19.12': + "@esbuild/linux-arm@0.19.12": optional: true - '@esbuild/linux-ia32@0.19.12': + "@esbuild/linux-ia32@0.19.12": optional: true - '@esbuild/linux-loong64@0.19.12': + "@esbuild/linux-loong64@0.19.12": optional: true - '@esbuild/linux-mips64el@0.19.12': + "@esbuild/linux-mips64el@0.19.12": optional: true - '@esbuild/linux-ppc64@0.19.12': + "@esbuild/linux-ppc64@0.19.12": optional: true - '@esbuild/linux-riscv64@0.19.12': + "@esbuild/linux-riscv64@0.19.12": optional: true - '@esbuild/linux-s390x@0.19.12': + "@esbuild/linux-s390x@0.19.12": optional: true - '@esbuild/linux-x64@0.19.12': + "@esbuild/linux-x64@0.19.12": optional: true - '@esbuild/netbsd-x64@0.19.12': + "@esbuild/netbsd-x64@0.19.12": optional: true - '@esbuild/openbsd-x64@0.19.12': + "@esbuild/openbsd-x64@0.19.12": optional: true - '@esbuild/sunos-x64@0.19.12': + "@esbuild/sunos-x64@0.19.12": optional: true - '@esbuild/win32-arm64@0.19.12': + "@esbuild/win32-arm64@0.19.12": optional: true - '@esbuild/win32-ia32@0.19.12': + "@esbuild/win32-ia32@0.19.12": optional: true - '@esbuild/win32-x64@0.19.12': + "@esbuild/win32-x64@0.19.12": optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + "@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)": dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + "@eslint-community/regexpp@4.10.0": {} - '@eslint/eslintrc@2.1.4': + "@eslint/eslintrc@2.1.4": dependencies: ajv: 6.12.6 debug: 4.3.4(supports-color@8.1.1) @@ -3469,303 +5653,303 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + "@eslint/js@8.57.0": {} - '@ethersproject/abi@5.7.0': + "@ethersproject/abi@5.7.0": 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 - '@ethersproject/abstract-provider@5.7.0': + "@ethersproject/abstract-provider@5.7.0": 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 - '@ethersproject/abstract-signer@5.7.0': + "@ethersproject/abstract-signer@5.7.0": 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 - '@ethersproject/address@5.7.0': + "@ethersproject/address@5.7.0": 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 - '@ethersproject/base64@5.7.0': + "@ethersproject/base64@5.7.0": dependencies: - '@ethersproject/bytes': 5.7.0 + "@ethersproject/bytes": 5.7.0 - '@ethersproject/basex@5.7.0': + "@ethersproject/basex@5.7.0": dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/properties": 5.7.0 - '@ethersproject/bignumber@5.7.0': + "@ethersproject/bignumber@5.7.0": 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 - '@ethersproject/bytes@5.7.0': - dependencies: - '@ethersproject/logger': 5.7.0 - - '@ethersproject/constants@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - - '@ethersproject/contracts@5.7.0': - 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/hash@5.7.0': - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/hdnode@5.7.0': - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - - '@ethersproject/json-wallets@5.7.0': - 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 + "@ethersproject/bytes@5.7.0": + dependencies: + "@ethersproject/logger": 5.7.0 + + "@ethersproject/constants@5.7.0": + dependencies: + "@ethersproject/bignumber": 5.7.0 + + "@ethersproject/contracts@5.7.0": + 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/hash@5.7.0": + dependencies: + "@ethersproject/abstract-signer": 5.7.0 + "@ethersproject/address": 5.7.0 + "@ethersproject/base64": 5.7.0 + "@ethersproject/bignumber": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/keccak256": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/properties": 5.7.0 + "@ethersproject/strings": 5.7.0 + + "@ethersproject/hdnode@5.7.0": + dependencies: + "@ethersproject/abstract-signer": 5.7.0 + "@ethersproject/basex": 5.7.0 + "@ethersproject/bignumber": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/pbkdf2": 5.7.0 + "@ethersproject/properties": 5.7.0 + "@ethersproject/sha2": 5.7.0 + "@ethersproject/signing-key": 5.7.0 + "@ethersproject/strings": 5.7.0 + "@ethersproject/transactions": 5.7.0 + "@ethersproject/wordlists": 5.7.0 + + "@ethersproject/json-wallets@5.7.0": + dependencies: + "@ethersproject/abstract-signer": 5.7.0 + "@ethersproject/address": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/hdnode": 5.7.0 + "@ethersproject/keccak256": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/pbkdf2": 5.7.0 + "@ethersproject/properties": 5.7.0 + "@ethersproject/random": 5.7.0 + "@ethersproject/strings": 5.7.0 + "@ethersproject/transactions": 5.7.0 aes-js: 3.0.0 scrypt-js: 3.0.1 - '@ethersproject/keccak256@5.7.0': + "@ethersproject/keccak256@5.7.0": dependencies: - '@ethersproject/bytes': 5.7.0 + "@ethersproject/bytes": 5.7.0 js-sha3: 0.8.0 - '@ethersproject/logger@5.7.0': {} + "@ethersproject/logger@5.7.0": {} - '@ethersproject/networks@5.7.1': + "@ethersproject/networks@5.7.1": dependencies: - '@ethersproject/logger': 5.7.0 + "@ethersproject/logger": 5.7.0 - '@ethersproject/pbkdf2@5.7.0': + "@ethersproject/pbkdf2@5.7.0": dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/sha2": 5.7.0 - '@ethersproject/properties@5.7.0': + "@ethersproject/properties@5.7.0": dependencies: - '@ethersproject/logger': 5.7.0 + "@ethersproject/logger": 5.7.0 - '@ethersproject/providers@5.7.2': + "@ethersproject/providers@5.7.2": 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 + "@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: - bufferutil - utf-8-validate - '@ethersproject/random@5.7.0': + "@ethersproject/random@5.7.0": dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/logger": 5.7.0 - '@ethersproject/rlp@5.7.0': + "@ethersproject/rlp@5.7.0": dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/logger": 5.7.0 - '@ethersproject/sha2@5.7.0': + "@ethersproject/sha2@5.7.0": 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 - '@ethersproject/signing-key@5.7.0': + "@ethersproject/signing-key@5.7.0": 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 - '@ethersproject/solidity@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/strings@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/transactions@5.7.0': - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - - '@ethersproject/units@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/wallet@5.7.0': - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - - '@ethersproject/web@5.7.1': - dependencies: - '@ethersproject/base64': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/wordlists@5.7.0': - 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 - - '@fastify/busboy@2.1.0': {} - - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 + "@ethersproject/solidity@5.7.0": + dependencies: + "@ethersproject/bignumber": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/keccak256": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/sha2": 5.7.0 + "@ethersproject/strings": 5.7.0 + + "@ethersproject/strings@5.7.0": + dependencies: + "@ethersproject/bytes": 5.7.0 + "@ethersproject/constants": 5.7.0 + "@ethersproject/logger": 5.7.0 + + "@ethersproject/transactions@5.7.0": + dependencies: + "@ethersproject/address": 5.7.0 + "@ethersproject/bignumber": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/constants": 5.7.0 + "@ethersproject/keccak256": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/properties": 5.7.0 + "@ethersproject/rlp": 5.7.0 + "@ethersproject/signing-key": 5.7.0 + + "@ethersproject/units@5.7.0": + dependencies: + "@ethersproject/bignumber": 5.7.0 + "@ethersproject/constants": 5.7.0 + "@ethersproject/logger": 5.7.0 + + "@ethersproject/wallet@5.7.0": + dependencies: + "@ethersproject/abstract-provider": 5.7.0 + "@ethersproject/abstract-signer": 5.7.0 + "@ethersproject/address": 5.7.0 + "@ethersproject/bignumber": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/hash": 5.7.0 + "@ethersproject/hdnode": 5.7.0 + "@ethersproject/json-wallets": 5.7.0 + "@ethersproject/keccak256": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/properties": 5.7.0 + "@ethersproject/random": 5.7.0 + "@ethersproject/signing-key": 5.7.0 + "@ethersproject/transactions": 5.7.0 + "@ethersproject/wordlists": 5.7.0 + + "@ethersproject/web@5.7.1": + dependencies: + "@ethersproject/base64": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/properties": 5.7.0 + "@ethersproject/strings": 5.7.0 + + "@ethersproject/wordlists@5.7.0": + 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 + + "@fastify/busboy@2.1.0": {} + + "@humanwhocodes/config-array@0.11.14": + dependencies: + "@humanwhocodes/object-schema": 2.0.3 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@humanwhocodes/module-importer@1.0.1': {} + "@humanwhocodes/module-importer@1.0.1": {} - '@humanwhocodes/object-schema@2.0.3': {} + "@humanwhocodes/object-schema@2.0.3": {} - '@jridgewell/resolve-uri@3.1.2': {} + "@jridgewell/resolve-uri@3.1.2": {} - '@jridgewell/sourcemap-codec@1.4.15': {} + "@jridgewell/sourcemap-codec@1.4.15": {} - '@jridgewell/trace-mapping@0.3.9': + "@jridgewell/trace-mapping@0.3.9": dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.4.15 - '@manypkg/find-root@1.1.0': + "@manypkg/find-root@1.1.0": dependencies: - '@babel/runtime': 7.24.4 - '@types/node': 12.20.55 + "@babel/runtime": 7.24.4 + "@types/node": 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 - '@manypkg/get-packages@1.1.3': + "@manypkg/get-packages@1.1.3": dependencies: - '@babel/runtime': 7.24.4 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 + "@babel/runtime": 7.24.4 + "@changesets/types": 4.1.0 + "@manypkg/find-root": 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@metamask/eth-sig-util@4.0.1': + "@metamask/eth-sig-util@4.0.1": dependencies: ethereumjs-abi: 0.6.8 ethereumjs-util: 6.2.1 @@ -3773,162 +5957,162 @@ snapshots: tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 - '@napi-rs/cli@2.18.4': {} + "@napi-rs/cli@2.18.4": {} - '@noble/curves@1.2.0': + "@noble/curves@1.2.0": dependencies: - '@noble/hashes': 1.3.2 + "@noble/hashes": 1.3.2 - '@noble/hashes@1.2.0': {} + "@noble/hashes@1.2.0": {} - '@noble/hashes@1.3.2': {} + "@noble/hashes@1.3.2": {} - '@noble/secp256k1@1.7.1': {} + "@noble/secp256k1@1.7.1": {} - '@nodelib/fs.scandir@2.1.5': + "@nodelib/fs.scandir@2.1.5": dependencies: - '@nodelib/fs.stat': 2.0.5 + "@nodelib/fs.stat": 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} + "@nodelib/fs.stat@2.0.5": {} - '@nodelib/fs.walk@1.2.8': + "@nodelib/fs.walk@1.2.8": dependencies: - '@nodelib/fs.scandir': 2.1.5 + "@nodelib/fs.scandir": 2.1.5 fastq: 1.17.1 - '@nomicfoundation/ethereumjs-block@5.0.4': + "@nomicfoundation/ethereumjs-block@5.0.4": dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-trie': 6.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 + "@nomicfoundation/ethereumjs-common": 4.0.4 + "@nomicfoundation/ethereumjs-rlp": 5.0.4 + "@nomicfoundation/ethereumjs-trie": 6.0.4 + "@nomicfoundation/ethereumjs-tx": 5.0.4 + "@nomicfoundation/ethereumjs-util": 9.0.4 ethereum-cryptography: 0.1.3 transitivePeerDependencies: - c-kzg - '@nomicfoundation/ethereumjs-common@4.0.4': + "@nomicfoundation/ethereumjs-common@4.0.4": dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.4 + "@nomicfoundation/ethereumjs-util": 9.0.4 transitivePeerDependencies: - c-kzg - '@nomicfoundation/ethereumjs-rlp@5.0.4': {} + "@nomicfoundation/ethereumjs-rlp@5.0.4": {} - '@nomicfoundation/ethereumjs-trie@6.0.4': + "@nomicfoundation/ethereumjs-trie@6.0.4": dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@types/readable-stream': 2.3.15 + "@nomicfoundation/ethereumjs-rlp": 5.0.4 + "@nomicfoundation/ethereumjs-util": 9.0.4 + "@types/readable-stream": 2.3.15 ethereum-cryptography: 0.1.3 lru-cache: 10.2.1 readable-stream: 3.6.2 transitivePeerDependencies: - c-kzg - '@nomicfoundation/ethereumjs-tx@5.0.4': + "@nomicfoundation/ethereumjs-tx@5.0.4": dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 + "@nomicfoundation/ethereumjs-common": 4.0.4 + "@nomicfoundation/ethereumjs-rlp": 5.0.4 + "@nomicfoundation/ethereumjs-util": 9.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/ethereumjs-util@9.0.4': + "@nomicfoundation/ethereumjs-util@9.0.4": dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 + "@nomicfoundation/ethereumjs-rlp": 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': + "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": optional: true - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': + "@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": optional: true - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': + "@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': + "@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': + "@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': + "@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": optional: true - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": optional: true - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": optional: true - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': + "@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": optional: true - '@nomicfoundation/solidity-analyzer@0.1.1': + "@nomicfoundation/solidity-analyzer@0.1.1": 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 - - '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4))': + "@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 + + "@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4))": dependencies: ethers: 5.7.2 - hardhat: 2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4) + hardhat: 2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4) - '@pkgr/core@0.1.1': {} + "@pkgr/core@0.1.1": {} - '@scure/base@1.1.5': {} + "@scure/base@1.1.5": {} - '@scure/bip32@1.1.5': + "@scure/bip32@1.1.5": dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.5 + "@noble/hashes": 1.2.0 + "@noble/secp256k1": 1.7.1 + "@scure/base": 1.1.5 - '@scure/bip39@1.1.1': + "@scure/bip39@1.1.1": dependencies: - '@noble/hashes': 1.2.0 - '@scure/base': 1.1.5 + "@noble/hashes": 1.2.0 + "@scure/base": 1.1.5 - '@sentry/core@5.30.0': + "@sentry/core@5.30.0": dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 + "@sentry/hub": 5.30.0 + "@sentry/minimal": 5.30.0 + "@sentry/types": 5.30.0 + "@sentry/utils": 5.30.0 tslib: 1.14.1 - '@sentry/hub@5.30.0': + "@sentry/hub@5.30.0": 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 - '@sentry/minimal@5.30.0': + "@sentry/minimal@5.30.0": 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 - '@sentry/node@5.30.0': + "@sentry/node@5.30.0": 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 + "@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 @@ -3936,154 +6120,154 @@ snapshots: transitivePeerDependencies: - supports-color - '@sentry/tracing@5.30.0': + "@sentry/tracing@5.30.0": dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 + "@sentry/hub": 5.30.0 + "@sentry/minimal": 5.30.0 + "@sentry/types": 5.30.0 + "@sentry/utils": 5.30.0 tslib: 1.14.1 - '@sentry/types@5.30.0': {} + "@sentry/types@5.30.0": {} - '@sentry/utils@5.30.0': + "@sentry/utils@5.30.0": dependencies: - '@sentry/types': 5.30.0 + "@sentry/types": 5.30.0 tslib: 1.14.1 - '@sindresorhus/merge-streams@2.3.0': {} + "@sindresorhus/merge-streams@2.3.0": {} - '@sinonjs/commons@1.8.6': + "@sinonjs/commons@1.8.6": dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@6.0.1': + "@sinonjs/fake-timers@6.0.1": dependencies: - '@sinonjs/commons': 1.8.6 + "@sinonjs/commons": 1.8.6 - '@sinonjs/samsam@5.3.1': + "@sinonjs/samsam@5.3.1": dependencies: - '@sinonjs/commons': 1.8.6 + "@sinonjs/commons": 1.8.6 lodash.get: 4.4.2 type-detect: 4.0.8 - '@sinonjs/text-encoding@0.7.2': {} + "@sinonjs/text-encoding@0.7.2": {} - '@tsconfig/node10@1.0.11': {} + "@tsconfig/node10@1.0.11": {} - '@tsconfig/node12@1.0.11': {} + "@tsconfig/node12@1.0.11": {} - '@tsconfig/node14@1.0.3': {} + "@tsconfig/node14@1.0.3": {} - '@tsconfig/node16@1.0.4': {} + "@tsconfig/node16@1.0.4": {} - '@types/argparse@2.0.16': {} + "@types/argparse@2.0.16": {} - '@types/async-eventemitter@0.2.4': + "@types/async-eventemitter@0.2.4": dependencies: - '@types/events': 3.0.3 + "@types/events": 3.0.3 - '@types/bn.js@4.11.6': + "@types/bn.js@4.11.6": dependencies: - '@types/node': 20.16.1 + "@types/node": 20.16.1 - '@types/bn.js@5.1.5': + "@types/bn.js@5.1.5": dependencies: - '@types/node': 20.16.1 + "@types/node": 20.16.1 - '@types/chai-as-promised@7.1.8': + "@types/chai-as-promised@7.1.8": dependencies: - '@types/chai': 4.3.12 + "@types/chai": 4.3.12 - '@types/chai@4.3.12': {} + "@types/chai@4.3.12": {} - '@types/ci-info@2.0.0': {} + "@types/ci-info@2.0.0": {} - '@types/debug@4.1.12': + "@types/debug@4.1.12": dependencies: - '@types/ms': 0.7.34 + "@types/ms": 0.7.34 - '@types/events@3.0.3': {} + "@types/events@3.0.3": {} - '@types/find-up@2.1.1': {} + "@types/find-up@2.1.1": {} - '@types/fs-extra@5.1.0': + "@types/fs-extra@5.1.0": dependencies: - '@types/node': 20.16.1 + "@types/node": 20.16.1 - '@types/glob@7.2.0': + "@types/glob@7.2.0": dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.16.1 + "@types/minimatch": 5.1.2 + "@types/node": 20.16.1 - '@types/json-schema@7.0.15': {} + "@types/json-schema@7.0.15": {} - '@types/json5@0.0.29': {} + "@types/json5@0.0.29": {} - '@types/keccak@3.0.4': + "@types/keccak@3.0.4": dependencies: - '@types/node': 20.16.1 + "@types/node": 20.16.1 - '@types/lodash@4.17.0': {} + "@types/lodash@4.17.0": {} - '@types/lru-cache@5.1.1': {} + "@types/lru-cache@5.1.1": {} - '@types/minimatch@5.1.2': {} + "@types/minimatch@5.1.2": {} - '@types/minimist@1.2.5': {} + "@types/minimist@1.2.5": {} - '@types/mocha@10.0.6': {} + "@types/mocha@10.0.6": {} - '@types/ms@0.7.34': {} + "@types/ms@0.7.34": {} - '@types/node@12.20.55': {} + "@types/node@12.20.55": {} - '@types/node@18.15.13': {} + "@types/node@18.15.13": {} - '@types/node@20.16.1': + "@types/node@20.16.1": dependencies: undici-types: 6.19.8 - '@types/normalize-package-data@2.4.4': {} + "@types/normalize-package-data@2.4.4": {} - '@types/pbkdf2@3.1.2': + "@types/pbkdf2@3.1.2": dependencies: - '@types/node': 20.16.1 + "@types/node": 20.16.1 - '@types/readable-stream@2.3.15': + "@types/readable-stream@2.3.15": dependencies: - '@types/node': 20.16.1 + "@types/node": 20.16.1 safe-buffer: 5.1.2 - '@types/resolve@1.20.6': {} + "@types/resolve@1.20.6": {} - '@types/secp256k1@4.0.6': + "@types/secp256k1@4.0.6": dependencies: - '@types/node': 20.16.1 + "@types/node": 20.16.1 - '@types/semver@6.2.7': {} + "@types/semver@6.2.7": {} - '@types/semver@7.5.8': {} + "@types/semver@7.5.8": {} - '@types/sinon@9.0.11': + "@types/sinon@9.0.11": dependencies: - '@types/sinonjs__fake-timers': 8.1.5 + "@types/sinonjs__fake-timers": 8.1.5 - '@types/sinonjs__fake-timers@8.1.5': {} + "@types/sinonjs__fake-timers@8.1.5": {} - '@types/uuid@8.3.4': {} + "@types/uuid@8.3.4": {} - '@types/ws@7.4.7': + "@types/ws@7.4.7": dependencies: - '@types/node': 20.16.1 + "@types/node": 20.16.1 - '@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4)': + "@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4)": dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.61.0(eslint@8.57.0)(typescript@5.0.4) - '@typescript-eslint/scope-manager': 5.61.0 - '@typescript-eslint/type-utils': 5.61.0(eslint@8.57.0)(typescript@5.0.4) - '@typescript-eslint/utils': 5.61.0(eslint@8.57.0)(typescript@5.0.4) + "@eslint-community/regexpp": 4.10.0 + "@typescript-eslint/parser": 5.61.0(eslint@8.57.0)(typescript@5.0.4) + "@typescript-eslint/scope-manager": 5.61.0 + "@typescript-eslint/type-utils": 5.61.0(eslint@8.57.0)(typescript@5.0.4) + "@typescript-eslint/utils": 5.61.0(eslint@8.57.0)(typescript@5.0.4) debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 graphemer: 1.4.0 @@ -4096,11 +6280,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4)': + "@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4)": dependencies: - '@typescript-eslint/scope-manager': 5.61.0 - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.0.4) + "@typescript-eslint/scope-manager": 5.61.0 + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/typescript-estree": 5.61.0(typescript@5.0.4) debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: @@ -4108,15 +6292,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.61.0': + "@typescript-eslint/scope-manager@5.61.0": dependencies: - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/visitor-keys': 5.61.0 + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/visitor-keys": 5.61.0 - '@typescript-eslint/type-utils@5.61.0(eslint@8.57.0)(typescript@5.0.4)': + "@typescript-eslint/type-utils@5.61.0(eslint@8.57.0)(typescript@5.0.4)": dependencies: - '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.0.4) - '@typescript-eslint/utils': 5.61.0(eslint@8.57.0)(typescript@5.0.4) + "@typescript-eslint/typescript-estree": 5.61.0(typescript@5.0.4) + "@typescript-eslint/utils": 5.61.0(eslint@8.57.0)(typescript@5.0.4) debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 tsutils: 3.21.0(typescript@5.0.4) @@ -4125,12 +6309,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@5.61.0': {} + "@typescript-eslint/types@5.61.0": {} - '@typescript-eslint/typescript-estree@5.61.0(typescript@5.0.4)': + "@typescript-eslint/typescript-estree@5.61.0(typescript@5.0.4)": dependencies: - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/visitor-keys': 5.61.0 + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/visitor-keys": 5.61.0 debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -4141,14 +6325,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.61.0(eslint@8.57.0)(typescript@5.0.4)': + "@typescript-eslint/utils@5.61.0(eslint@8.57.0)(typescript@5.0.4)": dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.61.0 - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.0.4) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) + "@types/json-schema": 7.0.15 + "@types/semver": 7.5.8 + "@typescript-eslint/scope-manager": 5.61.0 + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/typescript-estree": 5.61.0(typescript@5.0.4) eslint: 8.57.0 eslint-scope: 5.1.1 semver: 7.6.3 @@ -4156,12 +6340,12 @@ snapshots: - supports-color - typescript - '@typescript-eslint/visitor-keys@5.61.0': + "@typescript-eslint/visitor-keys@5.61.0": dependencies: - '@typescript-eslint/types': 5.61.0 + "@typescript-eslint/types": 5.61.0 eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.2.0': {} + "@ungap/structured-clone@1.2.0": {} acorn-jsx@5.3.2(acorn@8.11.3): dependencies: @@ -4729,29 +6913,29 @@ snapshots: esbuild@0.19.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 + "@esbuild/aix-ppc64": 0.19.12 + "@esbuild/android-arm": 0.19.12 + "@esbuild/android-arm64": 0.19.12 + "@esbuild/android-x64": 0.19.12 + "@esbuild/darwin-arm64": 0.19.12 + "@esbuild/darwin-x64": 0.19.12 + "@esbuild/freebsd-arm64": 0.19.12 + "@esbuild/freebsd-x64": 0.19.12 + "@esbuild/linux-arm": 0.19.12 + "@esbuild/linux-arm64": 0.19.12 + "@esbuild/linux-ia32": 0.19.12 + "@esbuild/linux-loong64": 0.19.12 + "@esbuild/linux-mips64el": 0.19.12 + "@esbuild/linux-ppc64": 0.19.12 + "@esbuild/linux-riscv64": 0.19.12 + "@esbuild/linux-s390x": 0.19.12 + "@esbuild/linux-x64": 0.19.12 + "@esbuild/netbsd-x64": 0.19.12 + "@esbuild/openbsd-x64": 0.19.12 + "@esbuild/sunos-x64": 0.19.12 + "@esbuild/win32-arm64": 0.19.12 + "@esbuild/win32-ia32": 0.19.12 + "@esbuild/win32-x64": 0.19.12 escalade@3.1.2: {} @@ -4775,7 +6959,7 @@ snapshots: dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.61.0(eslint@8.57.0)(typescript@5.0.4) + "@typescript-eslint/parser": 5.61.0(eslint@8.57.0)(typescript@5.0.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -4800,7 +6984,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.61.0(eslint@8.57.0)(typescript@5.0.4) + "@typescript-eslint/parser": 5.61.0(eslint@8.57.0)(typescript@5.0.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -4843,14 +7027,14 @@ snapshots: eslint@8.57.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) + "@eslint-community/regexpp": 4.10.0 + "@eslint/eslintrc": 2.1.4 + "@eslint/js": 8.57.0 + "@humanwhocodes/config-array": 0.11.14 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + "@ungap/structured-clone": 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -4908,8 +7092,8 @@ snapshots: ethereum-cryptography@0.1.3: dependencies: - '@types/pbkdf2': 3.1.2 - '@types/secp256k1': 4.0.6 + "@types/pbkdf2": 3.1.2 + "@types/secp256k1": 4.0.6 blakejs: 1.2.1 browserify-aes: 1.2.0 bs58check: 2.1.2 @@ -4926,10 +7110,10 @@ snapshots: ethereum-cryptography@1.2.0: 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 ethereumjs-abi@0.6.8: dependencies: @@ -4938,7 +7122,7 @@ snapshots: ethereumjs-util@6.2.1: 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 @@ -4948,46 +7132,46 @@ snapshots: ethers@5.7.2: 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 + "@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 ethers@6.12.0: dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 18.15.13 + "@adraffy/ens-normalize": 1.10.1 + "@noble/curves": 1.2.0 + "@noble/hashes": 1.3.2 + "@types/node": 18.15.13 aes-js: 4.0.0-beta.5 tslib: 2.4.0 ws: 8.5.0 @@ -5023,8 +7207,8 @@ snapshots: fast-glob@3.3.2: 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 @@ -5180,7 +7364,7 @@ snapshots: globby@14.0.2: dependencies: - '@sindresorhus/merge-streams': 2.3.0 + "@sindresorhus/merge-streams": 2.3.0 fast-glob: 3.3.2 ignore: 5.3.1 path-type: 5.0.0 @@ -5199,18 +7383,18 @@ snapshots: hard-rejection@2.1.0: {} - hardhat@2.22.17(patch_hash=5dlbms7lke6m3jszimtrwcdhcu)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4): - dependencies: - '@ethersproject/abi': 5.7.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': link:crates/edr_napi - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomicfoundation/solidity-analyzer': 0.1.1 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.5 - '@types/lru-cache': 5.1.1 + hardhat@2.22.17(patch_hash=5kbe3szvpqwqapxops377srmkq)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4))(typescript@5.0.4): + dependencies: + "@ethersproject/abi": 5.7.0 + "@metamask/eth-sig-util": 4.0.1 + "@nomicfoundation/edr": link:crates/edr_napi + "@nomicfoundation/ethereumjs-common": 4.0.4 + "@nomicfoundation/ethereumjs-tx": 5.0.4 + "@nomicfoundation/ethereumjs-util": 9.0.4 + "@nomicfoundation/solidity-analyzer": 0.1.1 + "@sentry/node": 5.30.0 + "@types/bn.js": 5.1.5 + "@types/lru-cache": 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 @@ -5583,7 +7767,7 @@ snapshots: meow@6.1.1: dependencies: - '@types/minimist': 1.2.5 + "@types/minimist": 1.2.5 camelcase-keys: 6.2.2 decamelize-keys: 1.1.1 hard-rejection: 2.1.0 @@ -5669,9 +7853,9 @@ snapshots: nise@4.1.0: dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/fake-timers': 6.0.1 - '@sinonjs/text-encoding': 0.7.2 + "@sinonjs/commons": 1.8.6 + "@sinonjs/fake-timers": 6.0.1 + "@sinonjs/text-encoding": 0.7.2 just-extend: 4.2.1 path-to-regexp: 1.8.0 @@ -5724,7 +7908,7 @@ snapshots: optionator@0.9.3: 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 @@ -5781,7 +7965,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + "@babel/code-frame": 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -5883,7 +8067,7 @@ snapshots: read-pkg@5.2.0: dependencies: - '@types/normalize-package-data': 2.4.4 + "@types/normalize-package-data": 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 @@ -6065,9 +8249,9 @@ snapshots: sinon@9.2.4: dependencies: - '@sinonjs/commons': 1.8.6 - '@sinonjs/fake-timers': 6.0.1 - '@sinonjs/samsam': 5.3.1 + "@sinonjs/commons": 1.8.6 + "@sinonjs/fake-timers": 6.0.1 + "@sinonjs/samsam": 5.3.1 diff: 4.0.2 nise: 4.1.0 supports-color: 7.2.0 @@ -6212,12 +8396,12 @@ snapshots: synckit@0.9.1: dependencies: - '@pkgr/core': 0.1.1 + "@pkgr/core": 0.1.1 tslib: 2.6.3 syncpack@12.4.0(typescript@5.0.4): dependencies: - '@effect/schema': 0.69.0(effect@3.5.7) + "@effect/schema": 0.69.0(effect@3.5.7) chalk: 5.3.0 chalk-template: 1.1.0 commander: 12.1.0 @@ -6262,12 +8446,12 @@ snapshots: ts-node@10.9.2(@types/node@20.16.1)(typescript@5.0.4): dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.1 + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.11 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 20.16.1 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -6282,7 +8466,7 @@ snapshots: tsconfig-paths@3.15.0: dependencies: - '@types/json5': 0.0.29 + "@types/json5": 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 @@ -6384,7 +8568,7 @@ snapshots: undici@5.28.3: dependencies: - '@fastify/busboy': 2.1.0 + "@fastify/busboy": 2.1.0 unicorn-magic@0.1.0: {}