Skip to content

Commit 3aeeb56

Browse files
committed
refactor: Re-use MessageTrace and VmTracer from EDR now
1 parent 49c66b6 commit 3aeeb56

File tree

4 files changed

+13
-353
lines changed

4 files changed

+13
-353
lines changed

packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts

+4-17
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,9 @@ export class EdrProviderWrapper
364364
if (needsTraces) {
365365
const rawTraces = responseObject.traces;
366366
for (const rawTrace of rawTraces) {
367+
this._vmTracer?.observe(rawTrace);
368+
369+
// For other consumers in JS we need to marshall the entire trace over FFI
367370
const trace = rawTrace.trace();
368371

369372
// beforeTx event
@@ -380,8 +383,6 @@ export class EdrProviderWrapper
380383
edrTracingStepToMinimalInterpreterStep(traceItem)
381384
);
382385
}
383-
384-
this._vmTracer?.addStep(traceItem);
385386
}
386387
// afterMessage event
387388
else if ("executionResult" in traceItem) {
@@ -391,8 +392,6 @@ export class EdrProviderWrapper
391392
edrTracingMessageResultToMinimalEVMResult(traceItem)
392393
);
393394
}
394-
395-
this._vmTracer?.addAfterMessage(traceItem.executionResult);
396395
}
397396
// beforeMessage event
398397
else {
@@ -402,8 +401,6 @@ export class EdrProviderWrapper
402401
edrTracingMessageToMinimalMessage(traceItem)
403402
);
404403
}
405-
406-
this._vmTracer?.addBeforeMessage(traceItem);
407404
}
408405
}
409406

@@ -574,17 +571,7 @@ export class EdrProviderWrapper
574571
rawTrace: RawTrace
575572
): Promise<SolidityStackTrace | undefined> {
576573
const vmTracer = new VMTracer();
577-
578-
const trace = rawTrace.trace();
579-
for (const traceItem of trace) {
580-
if ("pc" in traceItem) {
581-
vmTracer.addStep(traceItem);
582-
} else if ("executionResult" in traceItem) {
583-
vmTracer.addAfterMessage(traceItem.executionResult);
584-
} else {
585-
vmTracer.addBeforeMessage(traceItem);
586-
}
587-
}
574+
vmTracer.observe(rawTrace);
588575

589576
let vmTrace = vmTracer.getLastTopLevelMessageTrace();
590577
const vmTracerError = vmTracer.getLastError();
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,2 @@
1-
import type { ExceptionalHalt, SuccessReason } from "@nomicfoundation/edr";
2-
3-
import { requireNapiRsModule } from "../../../../common/napi-rs";
4-
5-
export enum ExitCode {
6-
SUCCESS,
7-
REVERT,
8-
OUT_OF_GAS,
9-
INTERNAL_ERROR,
10-
INVALID_OPCODE,
11-
STACK_UNDERFLOW,
12-
CODESIZE_EXCEEDS_MAXIMUM,
13-
CREATE_COLLISION,
14-
STATIC_STATE_CHANGE,
15-
}
16-
17-
export class Exit {
18-
public static fromEdrSuccessReason(reason: SuccessReason): Exit {
19-
const { SuccessReason } = requireNapiRsModule(
20-
"@nomicfoundation/edr"
21-
) as typeof import("@nomicfoundation/edr");
22-
23-
switch (reason) {
24-
case SuccessReason.Stop:
25-
case SuccessReason.Return:
26-
case SuccessReason.SelfDestruct:
27-
case SuccessReason.EofReturnContract:
28-
return new Exit(ExitCode.SUCCESS);
29-
}
30-
31-
const _exhaustiveCheck: never = reason;
32-
}
33-
34-
public static fromEdrExceptionalHalt(halt: ExceptionalHalt): Exit {
35-
const { ExceptionalHalt } = requireNapiRsModule(
36-
"@nomicfoundation/edr"
37-
) as typeof import("@nomicfoundation/edr");
38-
39-
switch (halt) {
40-
case ExceptionalHalt.OutOfGas:
41-
return new Exit(ExitCode.OUT_OF_GAS);
42-
43-
case ExceptionalHalt.OpcodeNotFound:
44-
case ExceptionalHalt.InvalidFEOpcode:
45-
// Returned when an opcode is not implemented for the hardfork
46-
case ExceptionalHalt.NotActivated:
47-
return new Exit(ExitCode.INVALID_OPCODE);
48-
49-
case ExceptionalHalt.StackUnderflow:
50-
return new Exit(ExitCode.STACK_UNDERFLOW);
51-
52-
case ExceptionalHalt.CreateCollision:
53-
return new Exit(ExitCode.CREATE_COLLISION);
54-
55-
case ExceptionalHalt.CreateContractSizeLimit:
56-
return new Exit(ExitCode.CODESIZE_EXCEEDS_MAXIMUM);
57-
58-
default: {
59-
// eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
60-
throw new Error(`Unmatched EDR exceptional halt: ${halt}`);
61-
}
62-
}
63-
}
64-
65-
constructor(public kind: ExitCode) {}
66-
67-
public isError(): boolean {
68-
return this.kind !== ExitCode.SUCCESS;
69-
}
70-
71-
public getReason(): string {
72-
switch (this.kind) {
73-
case ExitCode.SUCCESS:
74-
return "Success";
75-
case ExitCode.REVERT:
76-
return "Reverted";
77-
case ExitCode.OUT_OF_GAS:
78-
return "Out of gas";
79-
case ExitCode.INTERNAL_ERROR:
80-
return "Internal error";
81-
case ExitCode.INVALID_OPCODE:
82-
return "Invalid opcode";
83-
case ExitCode.STACK_UNDERFLOW:
84-
return "Stack underflow";
85-
case ExitCode.CODESIZE_EXCEEDS_MAXIMUM:
86-
return "Codesize exceeds maximum";
87-
case ExitCode.CREATE_COLLISION:
88-
return "Create collision";
89-
case ExitCode.STATIC_STATE_CHANGE:
90-
return "Static state change";
91-
}
92-
93-
const _exhaustiveCheck: never = this.kind;
94-
}
95-
}
1+
import { ExitCode } from "@nomicfoundation/edr";
2+
export { ExitCode };

packages/hardhat-core/src/internal/hardhat-network/stack-traces/message-trace.ts

+5-33
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import type { Bytecode } from "./model";
2-
import type { Exit } from "../provider/vm/exit";
32
import type {
43
CallOutput,
54
CreateOutput,
65
HaltResult,
76
RevertResult,
87
SuccessResult,
8+
PrecompileMessageTrace,
9+
CreateMessageTrace,
10+
CallMessageTrace,
911
} from "@nomicfoundation/edr";
1012

13+
export { PrecompileMessageTrace, CreateMessageTrace, CallMessageTrace };
14+
1115
export type MessageTrace =
1216
| CreateMessageTrace
1317
| CallMessageTrace
@@ -19,38 +23,6 @@ export type DecodedEvmMessageTrace =
1923
| DecodedCreateMessageTrace
2024
| DecodedCallMessageTrace;
2125

22-
export interface BaseMessageTrace {
23-
value: bigint;
24-
returnData: Uint8Array;
25-
exit: Exit;
26-
gasUsed: bigint;
27-
depth: number;
28-
}
29-
30-
export interface PrecompileMessageTrace extends BaseMessageTrace {
31-
precompile: number;
32-
calldata: Uint8Array;
33-
}
34-
35-
export interface BaseEvmMessageTrace extends BaseMessageTrace {
36-
code: Uint8Array;
37-
steps: MessageTraceStep[];
38-
bytecode?: Bytecode;
39-
// The following is just an optimization: When processing this traces it's useful to know ahead of
40-
// time how many subtraces there are.
41-
numberOfSubtraces: number;
42-
}
43-
44-
export interface CreateMessageTrace extends BaseEvmMessageTrace {
45-
deployedContract: Uint8Array | undefined;
46-
}
47-
48-
export interface CallMessageTrace extends BaseEvmMessageTrace {
49-
calldata: Uint8Array;
50-
address: Uint8Array;
51-
codeAddress: Uint8Array;
52-
}
53-
5426
export interface DecodedCreateMessageTrace extends CreateMessageTrace {
5527
bytecode: Bytecode;
5628
}

0 commit comments

Comments
 (0)