@@ -11,6 +11,8 @@ import type {
11
11
import type {
12
12
EdrContext ,
13
13
Provider as EdrProviderT ,
14
+ VmTraceDecoder as VmTraceDecoderT ,
15
+ VMTracer as VMTracerT ,
14
16
RawTrace ,
15
17
Response ,
16
18
SubscriptionEvent ,
@@ -42,7 +44,6 @@ import { isErrorResponse } from "../../core/providers/http";
42
44
import { getHardforkName } from "../../util/hardforks" ;
43
45
import { createModelsAndDecodeBytecodes } from "../stack-traces/compiler-to-model" ;
44
46
import { ConsoleLogger } from "../stack-traces/consoleLogger" ;
45
- import { ContractsIdentifier } from "../stack-traces/contracts-identifier" ;
46
47
import {
47
48
VmTraceDecoder ,
48
49
initializeVmTraceDecoder ,
@@ -167,15 +168,15 @@ export class EdrProviderWrapper
167
168
private _callOverrideCallback ?: CallOverrideCallback ;
168
169
169
170
/** Used for internal stack trace tests. */
170
- private _vmTracer ?: VMTracer ;
171
+ private _vmTracer ?: VMTracerT ;
171
172
172
173
private constructor (
173
174
private readonly _provider : EdrProviderT ,
174
175
// we add this for backwards-compatibility with plugins like solidity-coverage
175
176
private readonly _node : {
176
177
_vm : MinimalEthereumJsVm ;
177
178
} ,
178
- private readonly _vmTraceDecoder : VmTraceDecoder ,
179
+ private readonly _vmTraceDecoder : VmTraceDecoderT ,
179
180
// The common configuration for EthereumJS VM is not used by EDR, but tests expect it as part of the provider.
180
181
private readonly _common : Common ,
181
182
tracingConfig ?: TracingConfig
@@ -221,8 +222,7 @@ export class EdrProviderWrapper
221
222
const printLineFn = loggerConfig . printLineFn ?? printLine ;
222
223
const replaceLastLineFn = loggerConfig . replaceLastLineFn ?? replaceLastLine ;
223
224
224
- const contractsIdentifier = new ContractsIdentifier ( ) ;
225
- const vmTraceDecoder = new VmTraceDecoder ( contractsIdentifier ) ;
225
+ const vmTraceDecoder = new VmTraceDecoder ( ) ;
226
226
227
227
const hardforkName = getHardforkName ( config . hardfork ) ;
228
228
@@ -368,6 +368,9 @@ export class EdrProviderWrapper
368
368
if ( needsTraces ) {
369
369
const rawTraces = responseObject . traces ;
370
370
for ( const rawTrace of rawTraces ) {
371
+ this . _vmTracer ?. observe ( rawTrace ) ;
372
+
373
+ // For other consumers in JS we need to marshall the entire trace over FFI
371
374
const trace = rawTrace . trace ( ) ;
372
375
373
376
// beforeTx event
@@ -384,8 +387,6 @@ export class EdrProviderWrapper
384
387
edrTracingStepToMinimalInterpreterStep ( traceItem )
385
388
) ;
386
389
}
387
-
388
- this . _vmTracer ?. addStep ( traceItem ) ;
389
390
}
390
391
// afterMessage event
391
392
else if ( "executionResult" in traceItem ) {
@@ -395,8 +396,6 @@ export class EdrProviderWrapper
395
396
edrTracingMessageResultToMinimalEVMResult ( traceItem )
396
397
) ;
397
398
}
398
-
399
- this . _vmTracer ?. addAfterMessage ( traceItem . executionResult ) ;
400
399
}
401
400
// beforeMessage event
402
401
else {
@@ -406,8 +405,6 @@ export class EdrProviderWrapper
406
405
edrTracingMessageToMinimalMessage ( traceItem )
407
406
) ;
408
407
}
409
-
410
- this . _vmTracer ?. addBeforeMessage ( traceItem ) ;
411
408
}
412
409
}
413
410
@@ -474,7 +471,7 @@ export class EdrProviderWrapper
474
471
*
475
472
* Used for internal stack traces integration tests.
476
473
*/
477
- public setVmTracer ( vmTracer ?: VMTracer ) {
474
+ public setVmTracer ( vmTracer ?: VMTracerT ) {
478
475
this . _vmTracer = vmTracer ;
479
476
}
480
477
@@ -552,7 +549,7 @@ export class EdrProviderWrapper
552
549
) ;
553
550
554
551
log (
555
- "ContractsIdentifier failed to be updated. Please report this to help us improve Hardhat.\n" ,
552
+ "VmTraceDecoder failed to be updated. Please report this to help us improve Hardhat.\n" ,
556
553
error
557
554
) ;
558
555
@@ -578,17 +575,7 @@ export class EdrProviderWrapper
578
575
rawTrace : RawTrace
579
576
) : Promise < SolidityStackTrace | undefined > {
580
577
const vmTracer = new VMTracer ( ) ;
581
-
582
- const trace = rawTrace . trace ( ) ;
583
- for ( const traceItem of trace ) {
584
- if ( "pc" in traceItem ) {
585
- vmTracer . addStep ( traceItem ) ;
586
- } else if ( "executionResult" in traceItem ) {
587
- vmTracer . addAfterMessage ( traceItem . executionResult ) ;
588
- } else {
589
- vmTracer . addBeforeMessage ( traceItem ) ;
590
- }
591
- }
578
+ vmTracer . observe ( rawTrace ) ;
592
579
593
580
let vmTrace = vmTracer . getLastTopLevelMessageTrace ( ) ;
594
581
const vmTracerError = vmTracer . getLastError ( ) ;
0 commit comments