Skip to content

Commit

Permalink
Fix trace field types
Browse files Browse the repository at this point in the history
  • Loading branch information
vitaliy committed Sep 17, 2024
1 parent 5b371c7 commit 6125e44
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 36 deletions.
36 changes: 18 additions & 18 deletions packages/evm/jsonrpc/jsonrpctest/jsonrpc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -586,25 +586,25 @@ func TestRPCTraceTx(t *testing.T) {

require.Equal(t, creatorAddress, trace1.From)
require.Equal(t, contractAddress, *trace1.To)
require.Equal(t, "0x7b", trace1.Value)
require.Equal(t, "0x7b", trace1.Value.String())
expectedInput, err := contractABI.Pack("sendTo", common.Address{0x1}, big.NewInt(1))
require.NoError(t, err)
require.Equal(t, expectedInput, trace1.Input)
require.Empty(t, trace1.Error)
require.Empty(t, trace1.RevertReason)
require.Equal(t, "0x0", trace1.Gas)
require.Equal(t, "0x0", trace1.GasUsed)
require.Equal(t, "0x0", trace1.Gas.String())
require.Equal(t, "0x0", trace1.GasUsed.String())

require.Len(t, trace1.Calls, 1)
trace2 := trace1.Calls[0]
require.Equal(t, contractAddress, trace2.From)
require.Equal(t, common.Address{0x1}, *trace2.To)
require.Equal(t, "0x1", trace2.Value)
require.Equal(t, "0x1", trace2.Value.String())
require.Empty(t, trace2.Input)
require.Empty(t, trace2.Error)
require.Empty(t, trace2.RevertReason)
require.Contains(t, trace2.Gas, "0x")
require.Contains(t, trace2.GasUsed, "0x")
require.Contains(t, trace2.Gas.String(), "0x")
require.Contains(t, trace2.GasUsed.String(), "0x")
}

func TestRPCTraceEvmDeposit(t *testing.T) {
Expand Down Expand Up @@ -722,47 +722,47 @@ func TestRPCTraceBlock(t *testing.T) {

require.Equal(t, creatorAddress, trace1.From)
require.Equal(t, contractAddress, *trace1.To)
require.Equal(t, "0x7b", trace1.Value)
require.Equal(t, "0x7b", trace1.Value.String())
expectedInput, err := contractABI.Pack("sendTo", common.Address{0x1}, big.NewInt(2))
require.NoError(t, err)
require.Equal(t, expectedInput, trace1.Input)
require.Empty(t, trace1.Error)
require.Empty(t, trace1.RevertReason)
require.Equal(t, "0x0", trace1.Gas)
require.Equal(t, "0x0", trace1.GasUsed)
require.Equal(t, "0x0", trace1.Gas.String())
require.Equal(t, "0x0", trace1.GasUsed.String())

require.Len(t, trace1.Calls, 1)
innerCall1 := trace1.Calls[0]
require.Equal(t, contractAddress, innerCall1.From)
require.Equal(t, common.Address{0x1}, *innerCall1.To)
require.Equal(t, "0x2", innerCall1.Value)
require.Equal(t, "0x2", innerCall1.Value.String())
require.Empty(t, innerCall1.Input)
require.Empty(t, innerCall1.Error)
require.Empty(t, innerCall1.RevertReason)
require.Contains(t, innerCall1.Gas, "0x")
require.Contains(t, innerCall1.GasUsed, "0x")
require.Contains(t, innerCall1.Gas.String(), "0x")
require.Contains(t, innerCall1.GasUsed.String(), "0x")

require.Equal(t, creatorAddress2, trace2.From)
require.Equal(t, contractAddress, *trace2.To)
require.Equal(t, "0x141", trace2.Value)
require.Equal(t, "0x141", trace2.Value.String())
expectedInput, err = contractABI.Pack("sendTo", common.Address{0x2}, big.NewInt(3))
require.NoError(t, err)
require.Equal(t, expectedInput, trace2.Input)
require.Empty(t, trace2.Error)
require.Empty(t, trace2.RevertReason)
require.Equal(t, "0x0", trace2.Gas)
require.Equal(t, "0x0", trace2.GasUsed)
require.Equal(t, "0x0", trace2.Gas.String())
require.Equal(t, "0x0", trace2.GasUsed.String())

require.Len(t, trace2.Calls, 1)
innerCall2 := trace2.Calls[0]
require.Equal(t, contractAddress, innerCall2.From)
require.Equal(t, common.Address{0x2}, *innerCall2.To)
require.Equal(t, "0x3", innerCall2.Value)
require.Equal(t, "0x3", innerCall2.Value.String())
require.Empty(t, innerCall2.Input)
require.Empty(t, innerCall2.Error)
require.Empty(t, innerCall2.RevertReason)
require.Contains(t, innerCall2.Gas, "0x")
require.Contains(t, innerCall2.GasUsed, "0x")
require.Contains(t, innerCall2.Gas.String(), "0x")
require.Contains(t, innerCall2.GasUsed.String(), "0x")
}

func TestRPCBlockReceipt(t *testing.T) {
Expand Down
30 changes: 12 additions & 18 deletions packages/evm/jsonrpc/tracer_call.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"errors"
"fmt"
"math/big"
"strconv"
"sync/atomic"

"github.com/ethereum/go-ethereum/accounts/abi"
Expand Down Expand Up @@ -36,8 +35,8 @@ type callLog struct {
type CallFrame struct {
Type vm.OpCode `json:"-"`
From common.Address `json:"from"`
Gas string `json:"gas"`
GasUsed string `json:"gasUsed"`
Gas hexutil.Uint64 `json:"gas"`
GasUsed hexutil.Uint64 `json:"gasUsed"`
To *common.Address `json:"to,omitempty" rlp:"optional"`
Input []byte `json:"input" rlp:"optional"`
Output []byte `json:"output,omitempty" rlp:"optional"`
Expand All @@ -47,7 +46,7 @@ type CallFrame struct {
Logs []callLog `json:"logs,omitempty" rlp:"optional"`
// Placed at end on purpose. The RLP will be decoded to 0 instead of
// nil if there are non-empty elements after in the struct.
Value string `json:"value,omitempty" rlp:"optional"`
Value hexutil.Big `json:"value,omitempty" rlp:"optional"`
revertedSnapshot bool
}

Expand Down Expand Up @@ -162,24 +161,19 @@ func (t *callTracer) OnEnter(depth int, typ byte, from common.Address, to common

toCopy := to
call := CallFrame{
Type: vm.OpCode(typ),
From: from,
To: &toCopy,
Input: common.CopyBytes(input),
Gas: intToHex(int64(gas)),
Value: intToHex(value.Int64()),
GasUsed: "0x0",
Type: vm.OpCode(typ),
From: from,
To: &toCopy,
Input: common.CopyBytes(input),
Gas: hexutil.Uint64(gas),
Value: hexutil.Big(*value),
}
if depth == 0 {
call.Gas = intToHex(int64(t.gasLimit))
call.Gas = hexutil.Uint64(t.gasLimit)
}
t.callstack = append(t.callstack, call)
}

func intToHex(i int64) string {
return "0x" + strconv.FormatInt(i, 16)
}

// OnExit is called when EVM exits a scope, even if the scope didn't
// execute any code.
func (t *callTracer) OnExit(depth int, output []byte, gasUsed uint64, err error, reverted bool) {
Expand All @@ -202,7 +196,7 @@ func (t *callTracer) OnExit(depth int, output []byte, gasUsed uint64, err error,
t.callstack = t.callstack[:size-1]
size--

call.GasUsed = intToHex(int64(gasUsed))
call.GasUsed = hexutil.Uint64(gasUsed)
call.processOutput(output, err, reverted)
// Nest call into parent.
t.callstack[size-1].Calls = append(t.callstack[size-1].Calls, call)
Expand All @@ -224,7 +218,7 @@ func (t *callTracer) OnTxEnd(receipt *types.Receipt, err error) {
if err != nil {
return
}
t.callstack[0].GasUsed = intToHex(int64(receipt.GasUsed))
t.callstack[0].GasUsed = hexutil.Uint64(receipt.GasUsed)
if t.config.WithLog {
// Logs are not emitted when the call fails
clearFailedLogs(&t.callstack[0], false)
Expand Down

0 comments on commit 6125e44

Please sign in to comment.