Skip to content

Commit 76f9973

Browse files
committed
eth/tracers: add onlyTopCall option to callTracer ethereum#25430
1 parent bfc00e7 commit 76f9973

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

eth/tracers/js/goja.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ type jsTracer struct {
124124
// The methods `result` and `fault` are required to be present.
125125
// The methods `step`, `enter`, and `exit` are optional, but note that
126126
// `enter` and `exit` always go together.
127-
func newJsTracer(code string, ctx *tracers.Context, _ json.RawMessage) (tracers.Tracer, error) {
127+
func newJsTracer(code string, ctx *tracers.Context, cfg json.RawMessage) (tracers.Tracer, error) {
128128
if c, ok := assetTracers[code]; ok {
129129
code = c
130130
}
@@ -176,6 +176,17 @@ func newJsTracer(code string, ctx *tracers.Context, _ json.RawMessage) (tracers.
176176
t.exit = exit
177177
t.result = result
178178
t.fault = fault
179+
180+
// Pass in config
181+
if setup, ok := goja.AssertFunction(obj.Get("setup")); ok {
182+
cfgStr := "{}"
183+
if cfg != nil {
184+
cfgStr = string(cfg)
185+
}
186+
if _, err := setup(obj, vm.ToValue(cfgStr)); err != nil {
187+
return nil, err
188+
}
189+
}
179190
// Setup objects carrying data to JS. These are created once and re-used.
180191
t.log = &steplog{
181192
vm: vm,

eth/tracers/js/tracer_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,3 +292,33 @@ func TestEnterExit(t *testing.T) {
292292
t.Errorf("Number of invocations of enter() and exit() is wrong. Have %s, want %s\n", have, want)
293293
}
294294
}
295+
296+
func TestSetup(t *testing.T) {
297+
// Test empty config
298+
_, err := newJsTracer(`{setup: function(cfg) { if (cfg !== "{}") { throw("invalid empty config") } }, fault: function() {}, result: function() {}}`, new(tracers.Context), nil)
299+
if err != nil {
300+
t.Error(err)
301+
}
302+
303+
cfg, err := json.Marshal(map[string]string{"foo": "bar"})
304+
if err != nil {
305+
t.Fatal(err)
306+
}
307+
// Test no setup func
308+
_, err = newJsTracer(`{fault: function() {}, result: function() {}}`, new(tracers.Context), cfg)
309+
if err != nil {
310+
t.Fatal(err)
311+
}
312+
// Test config value
313+
tracer, err := newJsTracer("{config: null, setup: function(cfg) { this.config = JSON.parse(cfg) }, step: function() {}, fault: function() {}, result: function() { return this.config.foo }}", new(tracers.Context), cfg)
314+
if err != nil {
315+
t.Fatal(err)
316+
}
317+
have, err := tracer.GetResult()
318+
if err != nil {
319+
t.Fatal(err)
320+
}
321+
if string(have) != `"bar"` {
322+
t.Errorf("tracer returned wrong result. have: %s, want: \"bar\"\n", string(have))
323+
}
324+
}

0 commit comments

Comments
 (0)