diff --git a/.changeset/slimy-ties-remain.md b/.changeset/slimy-ties-remain.md new file mode 100644 index 00000000000..02e6cdd29ef --- /dev/null +++ b/.changeset/slimy-ties-remain.md @@ -0,0 +1,6 @@ +--- +"hardhat": minor +--- + +Upgraded EDR to [v0.12.0-next.7](https://github.com/NomicFoundation/edr/releases/tag/%40nomicfoundation%2Fedr%400.12.0-next.7): +- Removed support for pre-Byzantium root field from RPC receipts diff --git a/packages/hardhat-core/package.json b/packages/hardhat-core/package.json index 5d655120578..5560727616e 100644 --- a/packages/hardhat-core/package.json +++ b/packages/hardhat-core/package.json @@ -99,7 +99,7 @@ "dependencies": { "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", - "@nomicfoundation/edr": "^0.11.3", + "@nomicfoundation/edr": "^0.12.0-next.7", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "adm-zip": "^0.4.16", diff --git a/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts b/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts index d895688d7b6..21412ab9640 100644 --- a/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts +++ b/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts @@ -1,5 +1,7 @@ import type { Artifacts, + CompilerInput, + CompilerOutput, EIP1193Provider, EthSubscription, HardhatNetworkChainsConfig, @@ -8,23 +10,39 @@ import type { import type { EdrContext, + LoggerConfig as EdrLoggerConfig, Provider as EdrProviderT, Response, SubscriptionEvent, - HttpHeader, TracingConfigWithBuffers, + ProviderConfig, + SubscriptionConfig, } from "@nomicfoundation/edr"; +import { privateToAddress } from "@ethereumjs/util"; +import { ContractDecoder, precompileP256Verify } from "@nomicfoundation/edr"; import picocolors from "picocolors"; import debug from "debug"; import { EventEmitter } from "events"; import fsExtra from "fs-extra"; +import * as t from "io-ts"; import { requireNapiRsModule } from "../../../common/napi-rs"; import { HARDHAT_NETWORK_RESET_EVENT, HARDHAT_NETWORK_REVERT_SNAPSHOT_EVENT, } from "../../constants"; +import { numberToRpcQuantity } from "../../core/jsonrpc/types/base-types"; import { + optionalRpcHardhatNetworkConfig, + RpcHardhatNetworkConfig, +} from "../../core/jsonrpc/types/input/hardhat-network"; +import { + rpcCompilerInput, + rpcCompilerOutput, +} from "../../core/jsonrpc/types/input/solc"; +import { validateParams } from "../../core/jsonrpc/types/input/validation"; +import { + InternalError, InvalidArgumentsError, InvalidInputError, ProviderError, @@ -50,6 +68,7 @@ import { ethereumjsIntervalMiningConfigToEdr, ethereumjsMempoolOrderToEdrMineOrdering, ethereumsjsHardforkToEdrSpecId, + httpHeadersToEdr, } from "./utils/convertToEdr"; import { LoggerConfig, printLine, replaceLastLine } from "./modules/logger"; import { MinimalEthereumJsVm, getMinimalEthereumJsVm } from "./vm/minimal-vm"; @@ -62,14 +81,19 @@ export const DEFAULT_COINBASE = "0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e"; let _globalEdrContext: EdrContext | undefined; // Lazy initialize the global EDR context. -export function getGlobalEdrContext(): EdrContext { - const { EdrContext } = requireNapiRsModule( - "@nomicfoundation/edr" - ) as typeof import("@nomicfoundation/edr"); +export async function getGlobalEdrContext(): Promise { + const { EdrContext, GENERIC_CHAIN_TYPE, genericChainProviderFactory } = + requireNapiRsModule( + "@nomicfoundation/edr" + ) as typeof import("@nomicfoundation/edr"); if (_globalEdrContext === undefined) { // Only one is allowed to exist _globalEdrContext = new EdrContext(); + await _globalEdrContext.registerProviderFactory( + GENERIC_CHAIN_TYPE, + genericChainProviderFactory() + ); } return _globalEdrContext; @@ -119,11 +143,14 @@ export class EdrProviderWrapper private _callOverrideCallback?: CallOverrideCallback; private constructor( - private readonly _provider: EdrProviderT, + private _provider: EdrProviderT, + private readonly _providerConfig: ProviderConfig, + private readonly _loggerConfig: EdrLoggerConfig, // we add this for backwards-compatibility with plugins like solidity-coverage - private readonly _node: { + private _node: { _vm: MinimalEthereumJsVm; - } + }, + private readonly _subscriptionConfig: SubscriptionConfig ) { super(); } @@ -133,35 +160,43 @@ export class EdrProviderWrapper loggerConfig: LoggerConfig, tracingConfig?: TracingConfigWithBuffers ): Promise { - const { Provider } = requireNapiRsModule( - "@nomicfoundation/edr" - ) as typeof import("@nomicfoundation/edr"); + const { GENERIC_CHAIN_TYPE, l1GenesisState, l1HardforkFromString } = + requireNapiRsModule( + "@nomicfoundation/edr" + ) as typeof import("@nomicfoundation/edr"); const coinbase = config.coinbase ?? DEFAULT_COINBASE; let fork; if (config.forkConfig !== undefined) { - let httpHeaders: HttpHeader[] | undefined; - if (config.forkConfig.httpHeaders !== undefined) { - httpHeaders = []; - - for (const [name, value] of Object.entries( - config.forkConfig.httpHeaders - )) { - httpHeaders.push({ - name, - value, - }); - } - } - fork = { - jsonRpcUrl: config.forkConfig.jsonRpcUrl, blockNumber: config.forkConfig.blockNumber !== undefined ? BigInt(config.forkConfig.blockNumber) : undefined, - httpHeaders, + cacheDir: config.forkCachePath, + chainOverrides: Array.from( + config.chains, + ([chainId, hardforkConfig]) => { + return { + chainId: BigInt(chainId), + name: "Unknown", + hardforks: Array.from( + hardforkConfig.hardforkHistory, + ([hardfork, blockNumber]) => { + return { + condition: { blockNumber: BigInt(blockNumber) }, + hardfork: ethereumsjsHardforkToEdrSpecId( + getHardforkName(hardfork) + ), + }; + } + ), + }; + } + ), + httpHeaders: httpHeadersToEdr(config.forkConfig.httpHeaders), + url: config.forkConfig.jsonRpcUrl, }; } @@ -179,80 +214,107 @@ export class EdrProviderWrapper const hardforkName = getHardforkName(config.hardfork); - const provider = await Provider.withConfig( - getGlobalEdrContext(), - { - allowBlocksWithSameTimestamp: - config.allowBlocksWithSameTimestamp ?? false, - allowUnlimitedContractSize: config.allowUnlimitedContractSize, - bailOnCallFailure: config.throwOnCallFailures, - bailOnTransactionFailure: config.throwOnTransactionFailures, - blockGasLimit: BigInt(config.blockGasLimit), - chainId: BigInt(config.chainId), - chains: Array.from(config.chains, ([chainId, hardforkConfig]) => { - return { - chainId: BigInt(chainId), - hardforks: Array.from( - hardforkConfig.hardforkHistory, - ([hardfork, blockNumber]) => { - return { - blockNumber: BigInt(blockNumber), - specId: ethereumsjsHardforkToEdrSpecId( - getHardforkName(hardfork) - ), - }; - } - ), - }; - }), - cacheDir: config.forkCachePath, - coinbase: Buffer.from(coinbase.slice(2), "hex"), - enableRip7212: config.enableRip7212, - fork, - hardfork: ethereumsjsHardforkToEdrSpecId(hardforkName), - genesisAccounts: config.genesisAccounts.map((account) => { - return { - secretKey: account.privateKey, - balance: BigInt(account.balance), - }; - }), - initialDate, - initialBaseFeePerGas: - config.initialBaseFeePerGas !== undefined - ? BigInt(config.initialBaseFeePerGas!) - : undefined, - minGasPrice: config.minGasPrice, - mining: { - autoMine: config.automine, - interval: ethereumjsIntervalMiningConfigToEdr(config.intervalMining), - memPool: { - order: ethereumjsMempoolOrderToEdrMineOrdering(config.mempoolOrder), - }, + const genesisState = + fork !== undefined + ? [] // TODO: Add support for overriding remote fork state when the local fork is different + : l1GenesisState( + l1HardforkFromString(ethereumsjsHardforkToEdrSpecId(hardforkName)) + ); + + const ownedAccounts = config.genesisAccounts.map((account) => { + const privateKey = Uint8Array.from( + // Strip the `0x` prefix + Buffer.from(account.privateKey.slice(2), "hex") + ); + + genesisState.push({ + address: privateToAddress(privateKey), + balance: BigInt(account.balance), + code: new Uint8Array(), // Empty account code, removing potential delegation code when forking + }); + + return account.privateKey; + }); + + const edrProviderConfig = { + allowBlocksWithSameTimestamp: + config.allowBlocksWithSameTimestamp ?? false, + allowUnlimitedContractSize: config.allowUnlimitedContractSize, + bailOnCallFailure: config.throwOnCallFailures, + bailOnTransactionFailure: config.throwOnTransactionFailures, + blockGasLimit: BigInt(config.blockGasLimit), + chainId: BigInt(config.chainId), + coinbase: Buffer.from(coinbase.slice(2), "hex"), + precompileOverrides: config.enableRip7212 ? [precompileP256Verify()] : [], + fork, + genesisState, + hardfork: ethereumsjsHardforkToEdrSpecId(hardforkName), + initialDate, + initialBaseFeePerGas: + config.initialBaseFeePerGas !== undefined + ? BigInt(config.initialBaseFeePerGas!) + : undefined, + minGasPrice: config.minGasPrice, + mining: { + autoMine: config.automine, + interval: ethereumjsIntervalMiningConfigToEdr(config.intervalMining), + memPool: { + order: ethereumjsMempoolOrderToEdrMineOrdering(config.mempoolOrder), }, - networkId: BigInt(config.networkId), }, - { - enable: loggerConfig.enabled, - decodeConsoleLogInputsCallback: ConsoleLogger.getDecodedLogs, - printLineCallback: (message: string, replace: boolean) => { - if (replace) { - replaceLastLineFn(message); - } else { - printLineFn(message); - } - }, + networkId: BigInt(config.networkId), + observability: {}, + ownedAccounts, + }; + + const edrLoggerConfig = { + enable: loggerConfig.enabled, + decodeConsoleLogInputsCallback: (inputs: ArrayBuffer[]) => { + return ConsoleLogger.getDecodedLogs( + inputs.map((input) => { + return Buffer.from(input); + }) + ); }, - tracingConfig ?? {}, - (event: SubscriptionEvent) => { + printLineCallback: (message: string, replace: boolean) => { + if (replace) { + replaceLastLineFn(message); + } else { + printLineFn(message); + } + }, + }; + + const edrSubscriptionConfig = { + subscriptionCallback: (event: SubscriptionEvent) => { eventAdapter.emit("ethEvent", event); - } + }, + }; + + const edrTracingConfig = tracingConfig ?? {}; + + const contractDecoder = ContractDecoder.withContracts(edrTracingConfig); + + const context = await getGlobalEdrContext(); + const provider = await context.createProvider( + GENERIC_CHAIN_TYPE, + edrProviderConfig, + edrLoggerConfig, + edrSubscriptionConfig, + contractDecoder ); const minimalEthereumJsNode = { _vm: getMinimalEthereumJsVm(provider), }; - const wrapper = new EdrProviderWrapper(provider, minimalEthereumJsNode); + const wrapper = new EdrProviderWrapper( + provider, + edrProviderConfig, + edrLoggerConfig, + minimalEthereumJsNode, + edrSubscriptionConfig + ); // Pass through all events from the provider eventAdapter.addListener( @@ -272,9 +334,22 @@ export class EdrProviderWrapper const params = args.params ?? []; - if (args.method === "hardhat_getStackTraceFailuresCount") { - // stubbed for backwards compatibility - return 0; + // stubbed for backwards compatibility + switch (args.method) { + case "hardhat_getStackTraceFailuresCount": + return 0; + case "eth_mining": + return false; + case "net_listening": + return true; + case "net_peerCount": + return numberToRpcQuantity(0); + case "hardhat_reset": + return this._reset(..._resetParams(params)); + case "hardhat_addCompilationResult": + return this._addCompilationResult( + ..._addCompilationResultParams(params) + ); } const stringifiedArgs = JSON.stringify({ @@ -301,7 +376,7 @@ export class EdrProviderWrapper const rawTraces = responseObject.traces; for (const rawTrace of rawTraces) { // For other consumers in JS we need to marshall the entire trace over FFI - const trace = rawTrace.trace(); + const trace = rawTrace.trace; // beforeTx event if (this._node._vm.events.listenerCount("beforeTx") > 0) { @@ -377,9 +452,7 @@ export class EdrProviderWrapper throw error; } - if (args.method === "hardhat_reset") { - this.emit(HARDHAT_NETWORK_RESET_EVENT); - } else if (args.method === "evm_revert") { + if (args.method === "evm_revert") { this.emit(HARDHAT_NETWORK_REVERT_SNAPSHOT_EVENT); } @@ -397,19 +470,81 @@ export class EdrProviderWrapper } } + private async _addCompilationResult( + solcVersion: string, + input: CompilerInput, + output: CompilerOutput + ): Promise { + try { + await this._provider.addCompilationResult(solcVersion, input, output); + + return true; + } catch (error: any) { + // eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error + throw new InternalError(error); + } + } + + private async _reset(networkConfig?: RpcHardhatNetworkConfig) { + const { GENERIC_CHAIN_TYPE } = requireNapiRsModule( + "@nomicfoundation/edr" + ) as typeof import("@nomicfoundation/edr"); + const forkConfig = networkConfig?.forking; + + if (forkConfig !== undefined) { + this._providerConfig.fork = { + blockNumber: + forkConfig.blockNumber !== undefined + ? BigInt(forkConfig.blockNumber) + : undefined, + cacheDir: this._providerConfig.fork?.cacheDir, + chainOverrides: this._providerConfig.fork?.chainOverrides, + httpHeaders: httpHeadersToEdr(forkConfig.httpHeaders), + url: forkConfig.jsonRpcUrl, + }; + } else { + this._providerConfig.fork = undefined; + } + + const context = await getGlobalEdrContext(); + const provider = await context.createProvider( + GENERIC_CHAIN_TYPE, + this._providerConfig, + this._loggerConfig, + this._subscriptionConfig, + this._provider.contractDecoder() + ); + + const minimalEthereumJsNode = { + _vm: getMinimalEthereumJsVm(provider), + }; + + this._provider = provider; + this._node = minimalEthereumJsNode; + + this.emit(HARDHAT_NETWORK_RESET_EVENT); + + return true; + } + // temporarily added to make smock work with HH+EDR - private _setCallOverrideCallback(callback: CallOverrideCallback) { + private async _setCallOverrideCallback( + callback: CallOverrideCallback + ): Promise { this._callOverrideCallback = callback; - this._provider.setCallOverrideCallback( - async (address: Buffer, data: Buffer) => { - return this._callOverrideCallback?.(address, data); + await this._provider.setCallOverrideCallback( + async (address: ArrayBuffer, data: ArrayBuffer) => { + return this._callOverrideCallback?.( + Buffer.from(address), + Buffer.from(data) + ); } ); } - private _setVerboseTracing(enabled: boolean) { - this._provider.setVerboseTracing(enabled); + private async _setVerboseTracing(enabled: boolean): Promise { + await this._provider.setVerboseTracing(enabled); } private _ethEventListener(event: SubscriptionEvent) { @@ -493,3 +628,13 @@ async function makeTracingConfig( } } } + +function _addCompilationResultParams( + params: any[] +): [string, CompilerInput, CompilerOutput] { + return validateParams(params, t.string, rpcCompilerInput, rpcCompilerOutput); +} + +function _resetParams(params: any[]): [RpcHardhatNetworkConfig | undefined] { + return validateParams(params, optionalRpcHardhatNetworkConfig); +} diff --git a/packages/hardhat-core/src/internal/hardhat-network/provider/utils/convertToEdr.ts b/packages/hardhat-core/src/internal/hardhat-network/provider/utils/convertToEdr.ts index c5e9bd797f6..a3be30a758f 100644 --- a/packages/hardhat-core/src/internal/hardhat-network/provider/utils/convertToEdr.ts +++ b/packages/hardhat-core/src/internal/hardhat-network/provider/utils/convertToEdr.ts @@ -6,6 +6,27 @@ import type { TracingMessage, TracingMessageResult, TracingStep, + HttpHeader, +} from "@nomicfoundation/edr"; +import { + FRONTIER, + HOMESTEAD, + DAO_FORK, + TANGERINE, + SPURIOUS_DRAGON, + BYZANTIUM, + CONSTANTINOPLE, + PETERSBURG, + ISTANBUL, + MUIR_GLACIER, + BERLIN, + LONDON, + ARROW_GLACIER, + GRAY_GLACIER, + MERGE, + SHANGHAI, + CANCUN, + PRAGUE, } from "@nomicfoundation/edr"; import { Address } from "@ethereumjs/util"; @@ -21,48 +42,44 @@ import { /* eslint-disable @nomicfoundation/hardhat-internal-rules/only-hardhat-error */ -export function ethereumsjsHardforkToEdrSpecId(hardfork: HardforkName): SpecId { - const { SpecId } = requireNapiRsModule( - "@nomicfoundation/edr" - ) as typeof import("@nomicfoundation/edr"); - +export function ethereumsjsHardforkToEdrSpecId(hardfork: HardforkName): string { switch (hardfork) { case HardforkName.FRONTIER: - return SpecId.Frontier; + return FRONTIER; case HardforkName.HOMESTEAD: - return SpecId.Homestead; + return HOMESTEAD; case HardforkName.DAO: - return SpecId.DaoFork; + return DAO_FORK; case HardforkName.TANGERINE_WHISTLE: - return SpecId.Tangerine; + return TANGERINE; case HardforkName.SPURIOUS_DRAGON: - return SpecId.SpuriousDragon; + return SPURIOUS_DRAGON; case HardforkName.BYZANTIUM: - return SpecId.Byzantium; + return BYZANTIUM; case HardforkName.CONSTANTINOPLE: - return SpecId.Constantinople; + return CONSTANTINOPLE; case HardforkName.PETERSBURG: - return SpecId.Petersburg; + return PETERSBURG; case HardforkName.ISTANBUL: - return SpecId.Istanbul; + return ISTANBUL; case HardforkName.MUIR_GLACIER: - return SpecId.MuirGlacier; + return MUIR_GLACIER; case HardforkName.BERLIN: - return SpecId.Berlin; + return BERLIN; case HardforkName.LONDON: - return SpecId.London; + return LONDON; case HardforkName.ARROW_GLACIER: - return SpecId.ArrowGlacier; + return ARROW_GLACIER; case HardforkName.GRAY_GLACIER: - return SpecId.GrayGlacier; + return GRAY_GLACIER; case HardforkName.MERGE: - return SpecId.Merge; + return MERGE; case HardforkName.SHANGHAI: - return SpecId.Shanghai; + return SHANGHAI; case HardforkName.CANCUN: - return SpecId.Cancun; + return CANCUN; case HardforkName.PRAGUE: - return SpecId.Prague; + return PRAGUE; default: const _exhaustiveCheck: never = hardfork; throw new Error( @@ -195,7 +212,7 @@ export function edrRpcDebugTraceToHardhat( structLogs.shift(); } - let returnValue = rpcDebugTrace.output?.toString("hex") ?? ""; + let returnValue = rpcDebugTrace.output?.toString() ?? ""; if (returnValue === "0x") { returnValue = ""; } @@ -248,10 +265,10 @@ export function edrTracingMessageResultToMinimalEVMResult( } if ("output" in result) { const { output } = result; - if (Buffer.isBuffer(output)) { - minimalEVMResult.execResult.output = output; + if (output instanceof Uint8Array) { + minimalEVMResult.execResult.output = Buffer.from(output); } else { - minimalEVMResult.execResult.output = output.returnValue; + minimalEVMResult.execResult.output = Buffer.from(output.returnValue); } } @@ -278,3 +295,21 @@ export function edrTracingMessageToMinimalMessage( isStaticCall: message.isStaticCall, }; } + +export function httpHeadersToEdr(input?: { + [name: string]: string; +}): HttpHeader[] | undefined { + let httpHeaders: HttpHeader[] | undefined; + if (input !== undefined) { + httpHeaders = []; + + for (const [name, value] of Object.entries(input)) { + httpHeaders.push({ + name, + value, + }); + } + } + + return httpHeaders; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1aab98649c3..b019dd39ae3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -201,8 +201,8 @@ importers: specifier: ^5.1.2 version: 5.8.0 '@nomicfoundation/edr': - specifier: ^0.11.3 - version: 0.11.3 + specifier: ^0.12.0-next.7 + version: 0.12.0-next.7 '@nomicfoundation/solidity-analyzer': specifier: ^0.1.0 version: 0.1.2 @@ -3067,37 +3067,37 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@nomicfoundation/edr-darwin-arm64@0.11.3': - resolution: {integrity: sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==} + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.7': + resolution: {integrity: sha512-i3TVHIqZJAXqUh3nR9rlAx/fUrWQDXRtJhEtM9ZwgmKQMYO5+QmcmcA58qo/Yw3xb44hOk1TX9JgSkpjCIhgaQ==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.11.3': - resolution: {integrity: sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==} + '@nomicfoundation/edr-darwin-x64@0.12.0-next.7': + resolution: {integrity: sha512-vvoBA5nowhd56iPbDtDsIq+ZBHHWP4pwUC34zi0Eq7SSofll7MVm6KKYcEPrUsrjPtCWqswv6dnuuVJYS8U+kg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.3': - resolution: {integrity: sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==} + '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.7': + resolution: {integrity: sha512-pXzAYhcVR+3udnylfNk4q/YUOMthhozUB/KxMV6V2oXX3X/SujB03m8JnoeUKsqVIVILbN9PVYz3V6rCjZg84g==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.11.3': - resolution: {integrity: sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==} + '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.7': + resolution: {integrity: sha512-Ny463r0bZ97hfvCBpPZieDpPCuq9RXk3vrCTjCa8uHg+Tu8Prx3MvutbP1lJi5klO5qPVot+aikBgVZ+D0dG2g==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.11.3': - resolution: {integrity: sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==} + '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.7': + resolution: {integrity: sha512-ST676U0TDc1Jh6U237a/NgcoxOh828T5+zrVNz7IENdMw6liZ4F/ubBZc+3MVtOqPFzPpIItz02DDjr+KhEISw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.11.3': - resolution: {integrity: sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==} + '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.7': + resolution: {integrity: sha512-wCPFuf6bHH34fM0lClHuUoH57hJW/Rwh1TB0MqlZaiMhxPxdwVws28bAm4Rxr3OO7qNFn89pvG4yOhBcEqPdDg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.11.3': - resolution: {integrity: sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==} + '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.7': + resolution: {integrity: sha512-nhyPbpnKoZcKRsAciE4DNF0IDltBh7cuAgWGdtJt/TTwQcWTYdEeb6iYRlXGI9eUsFdhrnvwIRN7bKfkOBDbCQ==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.11.3': - resolution: {integrity: sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==} - engines: {node: '>= 18'} + '@nomicfoundation/edr@0.12.0-next.7': + resolution: {integrity: sha512-w8blgst1EHXuvjYNSEkTYRFNiqYWi7T2+OurJasQI8W+uOYKeIFY5m9GPTwbMgeS+5Q/8QW1vLyxiR8RDHEvqA==} + engines: {node: '>= 20'} '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} @@ -9878,29 +9878,36 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@nomicfoundation/edr-darwin-arm64@0.11.3': {} + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.7': + optional: true - '@nomicfoundation/edr-darwin-x64@0.11.3': {} + '@nomicfoundation/edr-darwin-x64@0.12.0-next.7': + optional: true - '@nomicfoundation/edr-linux-arm64-gnu@0.11.3': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.7': + optional: true - '@nomicfoundation/edr-linux-arm64-musl@0.11.3': {} + '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.7': + optional: true - '@nomicfoundation/edr-linux-x64-gnu@0.11.3': {} + '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.7': + optional: true - '@nomicfoundation/edr-linux-x64-musl@0.11.3': {} + '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.7': + optional: true - '@nomicfoundation/edr-win32-x64-msvc@0.11.3': {} + '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.7': + optional: true - '@nomicfoundation/edr@0.11.3': - dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.11.3 - '@nomicfoundation/edr-darwin-x64': 0.11.3 - '@nomicfoundation/edr-linux-arm64-gnu': 0.11.3 - '@nomicfoundation/edr-linux-arm64-musl': 0.11.3 - '@nomicfoundation/edr-linux-x64-gnu': 0.11.3 - '@nomicfoundation/edr-linux-x64-musl': 0.11.3 - '@nomicfoundation/edr-win32-x64-msvc': 0.11.3 + '@nomicfoundation/edr@0.12.0-next.7': + optionalDependencies: + '@nomicfoundation/edr-darwin-arm64': 0.12.0-next.7 + '@nomicfoundation/edr-darwin-x64': 0.12.0-next.7 + '@nomicfoundation/edr-linux-arm64-gnu': 0.12.0-next.7 + '@nomicfoundation/edr-linux-arm64-musl': 0.12.0-next.7 + '@nomicfoundation/edr-linux-x64-gnu': 0.12.0-next.7 + '@nomicfoundation/edr-linux-x64-musl': 0.12.0-next.7 + '@nomicfoundation/edr-win32-x64-msvc': 0.12.0-next.7 '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': optional: true