Skip to content

Commit 3e7ec65

Browse files
committed
Squash previous commits
1 parent 4210416 commit 3e7ec65

20 files changed

+157
-5190
lines changed

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

+4-17
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,9 @@ export class EdrProviderWrapper
370370
if (needsTraces) {
371371
const rawTraces = responseObject.traces;
372372
for (const rawTrace of rawTraces) {
373+
this._vmTracer?.observe(rawTrace);
374+
375+
// For other consumers in JS we need to marshall the entire trace over FFI
373376
const trace = rawTrace.trace();
374377

375378
// beforeTx event
@@ -386,8 +389,6 @@ export class EdrProviderWrapper
386389
edrTracingStepToMinimalInterpreterStep(traceItem)
387390
);
388391
}
389-
390-
this._vmTracer?.addStep(traceItem);
391392
}
392393
// afterMessage event
393394
else if ("executionResult" in traceItem) {
@@ -397,8 +398,6 @@ export class EdrProviderWrapper
397398
edrTracingMessageResultToMinimalEVMResult(traceItem)
398399
);
399400
}
400-
401-
this._vmTracer?.addAfterMessage(traceItem.executionResult);
402401
}
403402
// beforeMessage event
404403
else {
@@ -408,8 +407,6 @@ export class EdrProviderWrapper
408407
edrTracingMessageToMinimalMessage(traceItem)
409408
);
410409
}
411-
412-
this._vmTracer?.addBeforeMessage(traceItem);
413410
}
414411
}
415412

@@ -580,17 +577,7 @@ export class EdrProviderWrapper
580577
rawTrace: RawTrace
581578
): Promise<SolidityStackTrace | undefined> {
582579
const vmTracer = new VMTracer();
583-
584-
const trace = rawTrace.trace();
585-
for (const traceItem of trace) {
586-
if ("pc" in traceItem) {
587-
vmTracer.addStep(traceItem);
588-
} else if ("executionResult" in traceItem) {
589-
vmTracer.addAfterMessage(traceItem.executionResult);
590-
} else {
591-
vmTracer.addBeforeMessage(traceItem);
592-
}
593-
}
580+
vmTracer.observe(rawTrace);
594581

595582
let vmTrace = vmTracer.getLastTopLevelMessageTrace();
596583
const vmTracerError = vmTracer.getLastError();
Original file line numberDiff line numberDiff line change
@@ -1,75 +1 @@
1-
import { bytesToBigInt } from "@nomicfoundation/ethereumjs-util";
2-
import { assertHardhatInvariant } from "../../core/errors";
3-
4-
const { rawDecode } = require("ethereumjs-abi");
5-
6-
// selector of Error(string)
7-
const ERROR_SELECTOR = "08c379a0";
8-
// selector of Panic(uint256)
9-
const PANIC_SELECTOR = "4e487b71";
10-
11-
/**
12-
* Represents the returnData of a transaction, whose contents are unknown.
13-
*/
14-
export class ReturnData {
15-
private _selector: string | undefined;
16-
17-
constructor(public value: Uint8Array) {
18-
if (value.length >= 4) {
19-
this._selector = Buffer.from(value.slice(0, 4)).toString("hex");
20-
}
21-
}
22-
23-
public isEmpty(): boolean {
24-
return this.value.length === 0;
25-
}
26-
27-
public matchesSelector(selector: Uint8Array): boolean {
28-
if (this._selector === undefined) {
29-
return false;
30-
}
31-
32-
return this._selector === Buffer.from(selector).toString("hex");
33-
}
34-
35-
public isErrorReturnData(): boolean {
36-
return this._selector === ERROR_SELECTOR;
37-
}
38-
39-
public isPanicReturnData(): boolean {
40-
return this._selector === PANIC_SELECTOR;
41-
}
42-
43-
public decodeError(): string {
44-
if (this.isEmpty()) {
45-
return "";
46-
}
47-
48-
assertHardhatInvariant(
49-
this._selector === ERROR_SELECTOR,
50-
"Expected return data to be a Error(string)"
51-
);
52-
53-
const [decodedError] = rawDecode(["string"], this.value.slice(4)) as [
54-
string
55-
];
56-
57-
return decodedError;
58-
}
59-
60-
public decodePanic(): bigint {
61-
assertHardhatInvariant(
62-
this._selector === PANIC_SELECTOR,
63-
"Expected return data to be a Panic(uint256)"
64-
);
65-
66-
// we are assuming that panic codes are smaller than Number.MAX_SAFE_INTEGER
67-
const errorCode = bytesToBigInt(this.value.slice(4));
68-
69-
return errorCode;
70-
}
71-
72-
public getSelector(): string | undefined {
73-
return this._selector;
74-
}
75-
}
1+
export { ReturnData } from "@nomicfoundation/edr";
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 };

0 commit comments

Comments
 (0)