Skip to content

Commit 95af341

Browse files
committed
refactor: Prefer injection over arg at construct time
This gives a more granular access and doesn't require the callers to necessarily be concerned with details they might not be interested in.
1 parent 18f8e9b commit 95af341

File tree

3 files changed

+15
-20
lines changed

3 files changed

+15
-20
lines changed

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

+11-7
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,9 @@ export class EdrProviderWrapper
167167
// temporarily added to make smock work with HH+EDR
168168
private _callOverrideCallback?: CallOverrideCallback;
169169

170+
/** Used for internal stack trace tests. */
171+
private _vmTracer?: VMTracer;
172+
170173
private constructor(
171174
private readonly _provider: EdrProviderT,
172175
// we add this for backwards-compatibility with plugins like solidity-coverage
@@ -175,7 +178,6 @@ export class EdrProviderWrapper
175178
},
176179
private readonly _eventAdapter: EdrProviderEventAdapter,
177180
private readonly _vmTraceDecoder: VmTraceDecoder,
178-
private readonly _vmTracer: VMTracer | undefined,
179181
// The common configuration for EthereumJS VM is not used by EDR, but tests expect it as part of the provider.
180182
private readonly _common: Common,
181183
tracingConfig?: TracingConfig
@@ -190,8 +192,7 @@ export class EdrProviderWrapper
190192
public static async create(
191193
config: HardhatNetworkProviderConfig,
192194
loggerConfig: LoggerConfig,
193-
tracingConfig?: TracingConfig,
194-
vmTracer?: VMTracer
195+
tracingConfig?: TracingConfig
195196
): Promise<EdrProviderWrapper> {
196197
const { Provider } = requireNapiRsModule(
197198
"@nomicfoundation/edr"
@@ -316,7 +317,6 @@ export class EdrProviderWrapper
316317
minimalEthereumJsNode,
317318
eventAdapter,
318319
vmTraceDecoder,
319-
vmTracer,
320320
common,
321321
tracingConfig
322322
);
@@ -468,9 +468,13 @@ export class EdrProviderWrapper
468468
}
469469
}
470470

471-
/** Used for internal stack traces integration tests. Only defined there. */
472-
public vmTracer(): VMTracer | undefined {
473-
return this._vmTracer;
471+
/**
472+
* Injects a `VMTracer` that observes EVM throughout requests.
473+
*
474+
* Used for internal stack traces integration tests.
475+
*/
476+
public injectVmTracer(vmTracer?: VMTracer) {
477+
this._vmTracer = vmTracer;
474478
}
475479

476480
// temporarily added to make smock work with HH+EDR

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

-4
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,6 @@ export class VMTracer {
4646
return this._lastError;
4747
}
4848

49-
public clearLastError() {
50-
this._lastError = undefined;
51-
}
52-
5349
private _shouldKeepTracing() {
5450
return this._throwErrors || this._lastError === undefined;
5551
}

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

+4-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { assert } from "chai";
2-
31
import {
42
bigIntToHex,
53
bytesToHex,
@@ -60,8 +58,7 @@ export async function instantiateProvider(
6058
const provider = await EdrProviderWrapper.create(
6159
config,
6260
loggerConfig,
63-
tracingConfig,
64-
new VMTracer(false)
61+
tracingConfig
6562
);
6663

6764
return provider;
@@ -108,10 +105,8 @@ export async function traceTransaction(
108105
provider: EdrProviderWrapper,
109106
txData: TxData
110107
): Promise<MessageTrace> {
111-
const vmTracer = provider.vmTracer();
112-
if (vmTracer === undefined) {
113-
assert.fail("VMTracer should always be initialized in stack-traces");
114-
}
108+
const vmTracer = new VMTracer(false);
109+
provider.injectVmTracer(vmTracer);
115110

116111
try {
117112
await provider.request({
@@ -136,6 +131,6 @@ export async function traceTransaction(
136131
}
137132
return trace;
138133
} finally {
139-
vmTracer.clearLastError();
134+
provider.injectVmTracer(undefined);
140135
}
141136
}

0 commit comments

Comments
 (0)