diff options
Diffstat (limited to 'eth/tracers/tracer.go')
-rw-r--r-- | eth/tracers/tracer.go | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/eth/tracers/tracer.go b/eth/tracers/tracer.go index 3533a831f..9d6701868 100644 --- a/eth/tracers/tracer.go +++ b/eth/tracers/tracer.go @@ -367,6 +367,28 @@ func New(code string) (*Tracer, error) { copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:]) return 1 }) + tracer.vm.PushGlobalGoFunction("toContract2", func(ctx *duktape.Context) int { + var from common.Address + if ptr, size := ctx.GetBuffer(-3); ptr != nil { + from = common.BytesToAddress(makeSlice(ptr, size)) + } else { + from = common.HexToAddress(ctx.GetString(-3)) + } + // Retrieve salt hex string from js stack + salt := common.HexToHash(ctx.GetString(-2)) + // Retrieve code slice from js stack + var code []byte + if ptr, size := ctx.GetBuffer(-1); ptr != nil { + code = common.CopyBytes(makeSlice(ptr, size)) + } else { + code = common.FromHex(ctx.GetString(-1)) + } + codeHash := crypto.Keccak256(code) + ctx.Pop3() + contract := crypto.CreateAddress2(from, salt, codeHash) + copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:]) + return 1 + }) tracer.vm.PushGlobalGoFunction("isPrecompiled", func(ctx *duktape.Context) int { _, ok := vm.PrecompiledContractsByzantium[common.BytesToAddress(popSlice(ctx))] ctx.PushBoolean(ok) |