diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad6f05d4901..de3cda9d7ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -147,8 +147,8 @@ importers: v-next/hardhat: dependencies: '@nomicfoundation/edr': - specifier: 0.12.0-next.24 - version: 0.12.0-next.24 + specifier: 0.12.0-next.25 + version: 0.12.0-next.25 '@nomicfoundation/hardhat-errors': specifier: workspace:^3.0.6 version: link:../hardhat-errors @@ -2680,36 +2680,36 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/edr-darwin-arm64@0.12.0-next.24': - resolution: {integrity: sha512-lYcD9IM52G0hk/3Sso2Rpdpyfafy3aHH0GsSy/FVog9UrEkmmU14AmccE18/zTL+UyV0yzYMDOmh6y83SD/lbg==} + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.25': + resolution: {integrity: sha512-tn7VeD6JPkNfB1QuygD1q1UcOySwI5RJf/br/egq3q4FI+tzKgeAubSDAJkmXL/JMe91+FacQ2l4B2ZdHgPs8A==} engines: {node: '>= 20'} - '@nomicfoundation/edr-darwin-x64@0.12.0-next.24': - resolution: {integrity: sha512-cHDJZlPDpDXJXxQDVM0TGzEuNvV3wW94gipEdjNxZHeC9T2/NU/5GUoQajMJgvCZ6PWDlRMwIBRtM1jC/ny5DA==} + '@nomicfoundation/edr-darwin-x64@0.12.0-next.25': + resolution: {integrity: sha512-6z6n6a1spE/LEMayamhHYMC8th6++XRDanuktLbECcgpmYQgNZR0ZK7E6PPe68DpdOOfrB9ZFG/EdG63Y/k/Hw==} engines: {node: '>= 20'} - '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.24': - resolution: {integrity: sha512-G/iln4W79CR9f68+crBZM1kBdmmK3IbQCD4b5u+iqby+H5BOLSPQmjeW9UREK5WSecnv7Oxr/ZTHHRq/w9pUPA==} + '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.25': + resolution: {integrity: sha512-/dwp5YpAZqyqPryYxPEqdL3aP6amjwrKuj89VFYsfMXllPm/+sutmWK1EgXCCHRwNnK/hj72DHrS3O3Lr0/2rQ==} engines: {node: '>= 20'} - '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.24': - resolution: {integrity: sha512-wt6UuOutufL3UTSyMiwPOyfRly3uQEFHASXqLsNjgp4qBrm0s+kkyaYpAe8h53lGzZmXIDOAbO0P/fwxnLCnWw==} + '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.25': + resolution: {integrity: sha512-cBk0810nNmx/3lbl49lrF5e1V3mGr0WkIf/4z63sYJIpyPKUTRqlnV+AICq+k29yQ7wLvRUamqxG4diKZxmzCQ==} engines: {node: '>= 20'} - '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.24': - resolution: {integrity: sha512-mHgkUSynINTnnIvZuZymJ4dMqjemGjdrzQ87rP5/SQQGRQVV82uDomSEglp9btSmbBWfPj4r4tWsV+a3844W0w==} + '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.25': + resolution: {integrity: sha512-K2G5w+cEeYbWoxjPgqluhaHmPGIgIVgNVNZyTFychiY0nSGap5/+xLFFOb3vi+r30OCe2svFSJPR/4YO+HF4bA==} engines: {node: '>= 20'} - '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.24': - resolution: {integrity: sha512-E0XNSlPc8Hx5Nhowe5VIvAqVeT+1VUWSRqG0cZtYcpUgJZxTp8p03ojPtbyfjL4T+78GfnpmzkkLhB6S2jZ1FQ==} + '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.25': + resolution: {integrity: sha512-3rnYsyR32OV5OsBtayMBXsCUCYQnP+aofM7gDsUEnIXDxxNOAWVYlbTeVxSAEq6Hc9hrOaiFJ40wF962QsnJEA==} engines: {node: '>= 20'} - '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.24': - resolution: {integrity: sha512-PbtY2zWc4k8HK4gVnVbPohJnfrICboo6J91vxTlhnPKCWGvfGbsqLfDUAp91ExHHY+80qRfQnwaLbhJiIqLFGw==} + '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.25': + resolution: {integrity: sha512-+fReSQsR8DOdAvNVw3Y6GjWPGN0zjifOEy/oKPnMBdQUUvwwbyr+l25hgApKdzAc1sByUvBulOcHxr4Pfdaz9g==} engines: {node: '>= 20'} - '@nomicfoundation/edr@0.12.0-next.24': - resolution: {integrity: sha512-/NwB9yX7uBs/FIJKHBZo2hVhP7g3v6LbE21JvTLvshgb+XscyaRRUmzB//ankxLGJ1TehtXAf/Qh/a19vgpiig==} + '@nomicfoundation/edr@0.12.0-next.25': + resolution: {integrity: sha512-s8JrA7cp8qu7zktfOdv3wvWdAgvFe2STynpIjfqcdVigA+pZrExeaIsq/C63qmJwYMPgQ//xYQ26roUVcTqQKg==} engines: {node: '>= 20'} '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': @@ -7096,29 +7096,29 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nomicfoundation/edr-darwin-arm64@0.12.0-next.24': {} + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.25': {} - '@nomicfoundation/edr-darwin-x64@0.12.0-next.24': {} + '@nomicfoundation/edr-darwin-x64@0.12.0-next.25': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.24': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.25': {} - '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.24': {} + '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.25': {} - '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.24': {} + '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.25': {} - '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.24': {} + '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.25': {} - '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.24': {} + '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.25': {} - '@nomicfoundation/edr@0.12.0-next.24': + '@nomicfoundation/edr@0.12.0-next.25': dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.12.0-next.24 - '@nomicfoundation/edr-darwin-x64': 0.12.0-next.24 - '@nomicfoundation/edr-linux-arm64-gnu': 0.12.0-next.24 - '@nomicfoundation/edr-linux-arm64-musl': 0.12.0-next.24 - '@nomicfoundation/edr-linux-x64-gnu': 0.12.0-next.24 - '@nomicfoundation/edr-linux-x64-musl': 0.12.0-next.24 - '@nomicfoundation/edr-win32-x64-msvc': 0.12.0-next.24 + '@nomicfoundation/edr-darwin-arm64': 0.12.0-next.25 + '@nomicfoundation/edr-darwin-x64': 0.12.0-next.25 + '@nomicfoundation/edr-linux-arm64-gnu': 0.12.0-next.25 + '@nomicfoundation/edr-linux-arm64-musl': 0.12.0-next.25 + '@nomicfoundation/edr-linux-x64-gnu': 0.12.0-next.25 + '@nomicfoundation/edr-linux-x64-musl': 0.12.0-next.25 + '@nomicfoundation/edr-win32-x64-msvc': 0.12.0-next.25 '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': optional: true diff --git a/v-next/hardhat/package.json b/v-next/hardhat/package.json index 6d0ba7dfb4a..786f2318009 100644 --- a/v-next/hardhat/package.json +++ b/v-next/hardhat/package.json @@ -87,7 +87,7 @@ "typescript": "~5.8.0" }, "dependencies": { - "@nomicfoundation/edr": "0.12.0-next.24", + "@nomicfoundation/edr": "0.12.0-next.25", "@nomicfoundation/hardhat-errors": "workspace:^3.0.6", "@nomicfoundation/hardhat-utils": "workspace:^3.0.6", "@nomicfoundation/hardhat-vendored": "workspace:^3.0.1", diff --git a/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/edr-provider.ts b/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/edr-provider.ts index d39864cabc7..80ca78231e6 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/edr-provider.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/edr-provider.ts @@ -63,14 +63,10 @@ import { import { EdrProviderStackTraceGenerationError } from "./stack-traces/stack-trace-generation-errors.js"; import { createSolidityErrorWithStackTrace } from "./stack-traces/stack-trace-solidity-errors.js"; -import { - isDebugTraceResult, - isEdrProviderErrorData, -} from "./type-validation.js"; +import { isEdrProviderErrorData } from "./type-validation.js"; import { clientVersion } from "./utils/client-version.js"; import { ConsoleLogger } from "./utils/console-logger.js"; import { - edrRpcDebugTraceToHardhat, hardhatMiningIntervalToEdrMiningInterval, hardhatMempoolOrderToEdrMineOrdering, hardhatHardforkToEdrSpecId, @@ -289,15 +285,6 @@ export class EdrProvider extends BaseProvider { "Invalid client version response", ); return clientVersion(jsonRpcResponse.result); - } else if ( - jsonRpcRequest.method === "debug_traceTransaction" || - jsonRpcRequest.method === "debug_traceCall" - ) { - assertHardhatInvariant( - isDebugTraceResult(jsonRpcResponse.result), - "Invalid debug trace response", - ); - return edrRpcDebugTraceToHardhat(jsonRpcResponse.result); } else { return jsonRpcResponse.result; } @@ -339,18 +326,8 @@ export class EdrProvider extends BaseProvider { const responseError = jsonRpcResponse.error; let error; - let stackTrace: SolidityStackTrace | null = null; - try { - stackTrace = edrResponse.stackTrace(); - } catch (e) { - if (e instanceof Error) { - await sendErrorTelemetry(new EdrProviderStackTraceGenerationError(e)); - } - - log("Failed to get stack trace: %O", e); - } - - if (stackTrace !== null) { + const stackTrace = edrResponse.stackTrace(); + if (stackTrace?.kind === "StackTrace") { // If we have a stack trace, we know that the json rpc response data // is an object with the data and transactionHash fields assertHardhatInvariant( @@ -360,11 +337,26 @@ export class EdrProvider extends BaseProvider { error = createSolidityErrorWithStackTrace( responseError.message, - stackTrace, + stackTrace.entries, responseError.data.data, responseError.data.transactionHash, ); } else { + if (stackTrace !== null) { + switch (stackTrace.kind) { + case "UnexpectedError": + await sendErrorTelemetry( + new EdrProviderStackTraceGenerationError( + stackTrace.errorMessage, + ), + ); + log("Failed to get stack trace: %O", stackTrace.errorMessage); + break; + case "HeuristicFailed": + break; + } + } + error = responseError.code === InvalidArgumentsError.CODE ? new InvalidArgumentsError(responseError.message) diff --git a/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-generation-errors.ts b/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-generation-errors.ts index 29a08e81c5e..97d895adbfb 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-generation-errors.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-generation-errors.ts @@ -3,8 +3,11 @@ import { CustomError } from "@nomicfoundation/hardhat-utils/error"; abstract class StackTraceGenerationError extends CustomError {} export class EdrProviderStackTraceGenerationError extends StackTraceGenerationError { - constructor(error: Error) { - super("Failed to generate stack trace for the EDR provider", error); + constructor(message: string) { + super( + "Failed to generate stack trace for the EDR provider", + new Error(message), + ); } } diff --git a/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/type-validation.ts b/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/type-validation.ts index 8062f5a3d7b..1946737581f 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/type-validation.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/type-validation.ts @@ -1,18 +1,5 @@ -import type { DebugTraceResult } from "@nomicfoundation/edr"; - import { isObject } from "@nomicfoundation/hardhat-utils/lang"; -export function isDebugTraceResult( - result: unknown, -): result is DebugTraceResult { - return ( - isObject(result) && - "pass" in result && - "gasUsed" in result && - "structLogs" in result - ); -} - interface EdrProviderErrorData { data: string; transactionHash?: string; diff --git a/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/types/output.ts b/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/types/output.ts deleted file mode 100644 index 2d083e825dc..00000000000 --- a/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/types/output.ts +++ /dev/null @@ -1,19 +0,0 @@ -export interface RpcStructLog { - depth: number; - gas: number; - gasCost: number; - op: string; - pc: number; - memory?: string[]; - stack?: string[]; - storage?: Record; - memSize?: number; - error?: Record; -} - -export interface RpcDebugTraceOutput { - failed: boolean; - gas: number; - returnValue: string; - structLogs: RpcStructLog[]; -} diff --git a/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.ts b/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.ts index 1525f77c78c..79431a30694 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.ts @@ -9,10 +9,8 @@ import type { } from "../../../../../types/config.js"; import type { ChainType } from "../../../../../types/network.js"; import type { GasMeasurement } from "../../../gas-analytics/types.js"; -import type { RpcDebugTraceOutput, RpcStructLog } from "../types/output.js"; import type { IntervalRange, - DebugTraceResult, ChainOverride, ForkConfig, GasReport, @@ -274,67 +272,6 @@ export function hardhatMempoolOrderToEdrMineOrdering( } } -// TODO: EDR should handle this conversion. This is a temporary solution. -export function edrRpcDebugTraceToHardhat( - debugTraceResult: DebugTraceResult, -): RpcDebugTraceOutput { - const structLogs = debugTraceResult.structLogs.map((log) => { - const result: RpcStructLog = { - depth: Number(log.depth), - gas: Number(log.gas), - gasCost: Number(log.gasCost), - op: log.opName, - pc: Number(log.pc), - }; - - if (log.memory !== undefined) { - result.memory = log.memory; - } - - if (log.stack !== undefined) { - // Remove 0x prefix which is required by EIP-3155, but not expected by Hardhat. - result.stack = log.stack.map(getUnprefixedHexString); - } - - if (log.storage !== undefined) { - result.storage = Object.fromEntries( - Object.entries(log.storage).map(([key, value]) => [ - getUnprefixedHexString(key), - getUnprefixedHexString(value), - ]), - ); - } - - if (log.error !== undefined) { - result.error = { - message: log.error, - }; - } - - return result; - }); - - // REVM trace adds initial STOP that Hardhat doesn't expect - // TODO: double check with EDR team that this is still the case - if (structLogs.length > 0 && structLogs[0].op === "STOP") { - structLogs.shift(); - } - - /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- - debugTraceResult.output is a string, but it's typed as Buffer in Edr */ - let returnValue = (debugTraceResult.output as unknown as string) ?? "0x"; - if (returnValue === "0x") { - returnValue = ""; - } - - return { - failed: !debugTraceResult.pass, - gas: Number(debugTraceResult.gasUsed), - returnValue, - structLogs, - }; -} - export async function hardhatAccountsToEdrOwnedAccounts( accounts: EdrNetworkAccountsConfig, ): Promise> {