Skip to content

Commit 243b2a7

Browse files
committed
refactor: Prune StackTraceEntry.message to make it clonable
1 parent c9ec023 commit 243b2a7

File tree

4 files changed

+27
-34
lines changed

4 files changed

+27
-34
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { bytesToHex as bufferToHex } from "@nomicfoundation/ethereumjs-util";
22
import chalk from "chalk";
33

4-
import { stackTraceEntryTypeToString } from "@nomicfoundation/edr";
4+
import { ReturnData, stackTraceEntryTypeToString } from "@nomicfoundation/edr";
55
import {
66
CallMessageTrace,
77
CreateMessageTrace,
@@ -191,7 +191,7 @@ function flattenSourceReference(sourceReference?: SourceReference) {
191191
export function printStackTrace(trace: SolidityStackTrace) {
192192
const withDecodedMessages = trace.map((entry) =>
193193
entry.type === StackTraceEntryType.REVERT_ERROR
194-
? { ...entry, message: entry.message.decodeError() }
194+
? { ...entry, message: new ReturnData(entry.returnData).decodeError() }
195195
: entry
196196
);
197197

packages/hardhat-core/src/internal/hardhat-network/stack-traces/solidity-errors.ts

+14-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { bytesToHex as bufferToHex } from "@nomicfoundation/ethereumjs-util";
22

3+
import { ReturnData } from "../provider/return-data";
34
import { panicErrorCodeToMessage } from "./panic-errors";
45
import {
56
CONSTRUCTOR_FUNCTION_NAME,
@@ -259,23 +260,22 @@ function getMessageFromLastStackTraceEntry(
259260

260261
case StackTraceEntryType.UNRECOGNIZED_CREATE_ERROR:
261262
case StackTraceEntryType.UNRECOGNIZED_CONTRACT_ERROR:
262-
if (stackTraceEntry.message.isErrorReturnData()) {
263-
return `VM Exception while processing transaction: reverted with reason string '${stackTraceEntry.message.decodeError()}'`;
263+
let returnData = new ReturnData(stackTraceEntry.returnData);
264+
if (returnData.isErrorReturnData()) {
265+
return `VM Exception while processing transaction: reverted with reason string '${new ReturnData(
266+
stackTraceEntry.returnData
267+
).decodeError()}'`;
264268
}
265269

266-
if (stackTraceEntry.message.isPanicReturnData()) {
267-
const message = panicErrorCodeToMessage(
268-
stackTraceEntry.message.decodePanic()
269-
);
270+
if (returnData.isPanicReturnData()) {
271+
const message = panicErrorCodeToMessage(returnData.decodePanic());
270272
return `VM Exception while processing transaction: ${message}`;
271273
}
272274

273-
if (!stackTraceEntry.message.isEmpty()) {
274-
const returnData = Buffer.from(stackTraceEntry.message.value).toString(
275-
"hex"
276-
);
275+
if (!returnData.isEmpty()) {
276+
const buffer = Buffer.from(returnData.value).toString("hex");
277277

278-
return `VM Exception while processing transaction: reverted with an unrecognized custom error (return data: 0x${returnData})`;
278+
return `VM Exception while processing transaction: reverted with an unrecognized custom error (return data: 0x${buffer})`;
279279
}
280280

281281
if (stackTraceEntry.isInvalidOpcodeError) {
@@ -285,8 +285,9 @@ function getMessageFromLastStackTraceEntry(
285285
return "Transaction reverted without a reason string";
286286

287287
case StackTraceEntryType.REVERT_ERROR:
288-
if (stackTraceEntry.message.isErrorReturnData()) {
289-
return `VM Exception while processing transaction: reverted with reason string '${stackTraceEntry.message.decodeError()}'`;
288+
returnData = new ReturnData(stackTraceEntry.returnData);
289+
if (returnData.isErrorReturnData()) {
290+
return `VM Exception while processing transaction: reverted with reason string '${returnData.decodeError()}'`;
290291
}
291292

292293
if (stackTraceEntry.isInvalidOpcodeError) {

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { equalsBytes } from "@nomicfoundation/ethereumjs-util";
22

33
import { SolidityTracer as SolidityTracerRs } from "@nomicfoundation/edr";
4-
import { ReturnData } from "../provider/return-data";
54
import { ExitCode } from "../provider/vm/exit";
65

76
import {
@@ -117,7 +116,7 @@ export class SolidityTracer {
117116
return [
118117
{
119118
type: StackTraceEntryType.UNRECOGNIZED_CREATE_ERROR,
120-
message: new ReturnData(trace.returnData),
119+
returnData: trace.returnData,
121120
isInvalidOpcodeError,
122121
},
123122
];
@@ -127,7 +126,7 @@ export class SolidityTracer {
127126
{
128127
type: StackTraceEntryType.UNRECOGNIZED_CONTRACT_ERROR,
129128
address: trace.address,
130-
message: new ReturnData(trace.returnData),
129+
returnData: trace.returnData,
131130
isInvalidOpcodeError,
132131
},
133132
];

packages/hardhat-core/test/internal/hardhat-network/stack-traces/test.ts

+9-16
Original file line numberDiff line numberDiff line change
@@ -336,22 +336,15 @@ function compareStackTraces(
336336
`Stack trace of tx ${txIndex} entry ${i} type is incorrect: expected ${expectedErrorType}, got ${actualErrorType}`
337337
);
338338

339-
const actualMessage = (actual as any).message as
340-
| ReturnData
341-
| string
342-
| undefined;
343-
344-
// actual.message is a ReturnData in revert errors, but a string
345-
// in custom errors
346-
let decodedMessage = "";
347-
if (typeof actualMessage === "string") {
348-
decodedMessage = actualMessage;
349-
} else if (
350-
actualMessage instanceof ReturnData &&
351-
actualMessage.isErrorReturnData()
352-
) {
353-
decodedMessage = actualMessage.decodeError();
354-
}
339+
// actual.message is a ReturnData in revert errors but in custom errors
340+
// we need to decode it
341+
const decodedMessage =
342+
"message" in actual
343+
? actual.message
344+
: "returnData" in actual &&
345+
new ReturnData(actual.returnData).isErrorReturnData()
346+
? new ReturnData(actual.returnData).decodeError()
347+
: "";
355348

356349
if (expected.message !== undefined) {
357350
assert.equal(

0 commit comments

Comments
 (0)