Skip to content

Commit 31c58b8

Browse files
committed
Add beforeTx and afterTx VM events
1 parent b254e19 commit 31c58b8

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

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

+23-2
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ export class EdrProviderWrapper
370370

371371
const needsTraces =
372372
this._node._vm.evm.events.eventNames().length > 0 ||
373+
this._node._vm.events.eventNames().length > 0 ||
373374
this._rawTraceCallbacks.onStep !== undefined ||
374375
this._rawTraceCallbacks.onAfterMessage !== undefined ||
375376
this._rawTraceCallbacks.onBeforeMessage !== undefined;
@@ -378,7 +379,14 @@ export class EdrProviderWrapper
378379
const rawTraces = responseObject.traces;
379380
for (const rawTrace of rawTraces) {
380381
const trace = rawTrace.trace();
382+
383+
// beforeTx event
384+
if (this._node._vm.events.listenerCount("beforeTx") > 0) {
385+
this._node._vm.events.emit("beforeTx");
386+
}
387+
381388
for (const traceItem of trace) {
389+
// step event
382390
if ("pc" in traceItem) {
383391
if (this._node._vm.evm.events.listenerCount("step") > 0) {
384392
this._node._vm.evm.events.emit(
@@ -389,7 +397,9 @@ export class EdrProviderWrapper
389397
if (this._rawTraceCallbacks.onStep !== undefined) {
390398
await this._rawTraceCallbacks.onStep(traceItem);
391399
}
392-
} else if ("executionResult" in traceItem) {
400+
}
401+
// afterMessage event
402+
else if ("executionResult" in traceItem) {
393403
if (this._node._vm.evm.events.listenerCount("afterMessage") > 0) {
394404
this._node._vm.evm.events.emit(
395405
"afterMessage",
@@ -401,7 +411,9 @@ export class EdrProviderWrapper
401411
traceItem.executionResult
402412
);
403413
}
404-
} else {
414+
}
415+
// beforeMessage event
416+
else {
405417
if (this._node._vm.evm.events.listenerCount("beforeMessage") > 0) {
406418
this._node._vm.evm.events.emit(
407419
"beforeMessage",
@@ -413,6 +425,11 @@ export class EdrProviderWrapper
413425
}
414426
}
415427
}
428+
429+
// afterTx event
430+
if (this._node._vm.events.listenerCount("afterTx") > 0) {
431+
this._node._vm.events.emit("afterTx");
432+
}
416433
}
417434
}
418435

@@ -478,6 +495,10 @@ export class EdrProviderWrapper
478495
);
479496
}
480497

498+
private _setVerboseTracing(enabled: boolean) {
499+
this._provider.setVerboseTracing(enabled);
500+
}
501+
481502
private _ethEventListener(event: SubscriptionEvent) {
482503
const subscription = `0x${event.filterId.toString(16)}`;
483504
const results = Array.isArray(event.result) ? event.result : [event.result];

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

+14-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ import { AsyncEventEmitter } from "@nomicfoundation/ethereumjs-util";
1313
* interface only has the things used by those plugins.
1414
*/
1515
export interface MinimalEthereumJsVm {
16+
events: AsyncEventEmitter<MinimalEthereumJsVmEvents>;
1617
evm: {
17-
events: AsyncEventEmitter<MinimalEthereumJsVmEvents>;
18+
events: AsyncEventEmitter<MinimalEthereumJsEvmEvents>;
1819
};
1920
stateManager: {
2021
putContractCode: (address: Address, code: Buffer) => Promise<void>;
@@ -27,10 +28,18 @@ export interface MinimalEthereumJsVm {
2728
};
2829
}
2930

30-
// we need to use a type instead of an interface to satisfy the type constarint
31+
// we need to use a type instead of an interface to satisfy the type constraint
3132
// of the AsyncEventEmitter type param
3233
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
3334
type MinimalEthereumJsVmEvents = {
35+
beforeTx: () => void;
36+
afterTx: () => void;
37+
};
38+
39+
// we need to use a type instead of an interface to satisfy the type constraint
40+
// of the AsyncEventEmitter type param
41+
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
42+
type MinimalEthereumJsEvmEvents = {
3443
beforeMessage: (
3544
data: MinimalMessage,
3645
resolve?: (result?: any) => void
@@ -46,13 +55,15 @@ type MinimalEthereumJsVmEvents = {
4655
};
4756

4857
export class MinimalEthereumJsVmEventEmitter extends AsyncEventEmitter<MinimalEthereumJsVmEvents> {}
58+
export class MinimalEthereumJsEvmEventEmitter extends AsyncEventEmitter<MinimalEthereumJsEvmEvents> {}
4959

5060
export function getMinimalEthereumJsVm(
5161
provider: EdrProviderT
5262
): MinimalEthereumJsVm {
5363
const minimalEthereumJsVm: MinimalEthereumJsVm = {
64+
events: new MinimalEthereumJsVmEventEmitter(),
5465
evm: {
55-
events: new MinimalEthereumJsVmEventEmitter(),
66+
events: new MinimalEthereumJsEvmEventEmitter(),
5667
},
5768
stateManager: {
5869
putContractCode: async (address: Address, code: Buffer) => {

0 commit comments

Comments
 (0)