From b00bf732677abda2056a40c28909f843bc939aba Mon Sep 17 00:00:00 2001 From: Krisna Pranav <68631244+krishpranav@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:30:16 +0530 Subject: [PATCH 1/5] client: TraceCall --- ethclient/ethclient.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index f10626c01f..d07fd1ac5b 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -50,11 +50,23 @@ func DialContext(ctx context.Context, rawurl string) (*Client, error) { return NewClient(c), nil } +type Client struct { + rpcClient *rpc.Client +} + // NewClient creates a client that uses the given RPC client. func NewClient(c *rpc.Client) *Client { return &Client{c} } +// TraceCall: for call operation +func (c *Client) TraceCall(ctx context.Context, callArgs interface{}) (*tracers.TraceResult, error) { + var result tracers.TraceResult + err := c.rpcClient.CallContext(ctx, &result, "debug_traceCall", callArgs) + return &result, err +} + + // Close closes the underlying RPC connection. func (ec *Client) Close() { ec.c.Close() From d26b46434af02f4f4938d0a0f19122b3a0212fd3 Mon Sep 17 00:00:00 2001 From: Krisna Pranav <68631244+krishpranav@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:30:51 +0530 Subject: [PATCH 2/5] client: TraceTransaction --- ethclient/ethclient.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index d07fd1ac5b..1e0a2044c2 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -66,6 +66,13 @@ func (c *Client) TraceCall(ctx context.Context, callArgs interface{}) (*tracers. return &result, err } +// TraceTransaction: fetches a specific transaction +func (c *Client) TraceTransaction(ctx context.Context, txHash string) (*tracers.TraceResult, error) { + var result tracers.TraceResult + err := c.rpcClient.CallContext(ctx, &result, "debug_traceTransaction", txHash, nil) + return &result, err +} + // Close closes the underlying RPC connection. func (ec *Client) Close() { From 021e709e2981904085e47d9cd86e369018d9fe2b Mon Sep 17 00:00:00 2001 From: Krisna Pranav <68631244+krishpranav@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:31:15 +0530 Subject: [PATCH 3/5] client: TraceBlock + TraceChain --- ethclient/ethclient.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index 1e0a2044c2..ffb1c6f504 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -73,6 +73,20 @@ func (c *Client) TraceTransaction(ctx context.Context, txHash string) (*tracers. return &result, err } +// TraceBlock: fetches the trace for a specific block +func (c *Client) TraceBlock(ctx context.Context, blockHash string) (*tracers.TraceResult, error) { + var result tracers.TraceResult + err := c.rpcClient.CallContext(ctx, &result, "debug_traceBlock", blockHash) + return &result, err +} + +// TraceChain: fetches the trace for a chain +func (c *Client) TraceChain(ctx context.Context, blockHash string, count int) ([]*tracers.TraceResult, error) { + var result []*tracers.TraceResult + err := c.rpcClient.CallContext(ctx, &result, "debug_traceChain", blockHash, count) + return result, err +} + // Close closes the underlying RPC connection. func (ec *Client) Close() { From 8ee73c749f0a68f558df9744fd8d54d7da7aa26b Mon Sep 17 00:00:00 2001 From: Krisna Pranav <68631244+krishpranav@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:36:07 +0530 Subject: [PATCH 4/5] client: add package --- ethclient/ethclient.go | 1 + 1 file changed, 1 insertion(+) diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index ffb1c6f504..9edca8ebe3 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/eth/tracers" ) // Client defines typed wrappers for the Ethereum RPC API. From c3477e8e74b350ee3f56b4d32a367d0d9401cde0 Mon Sep 17 00:00:00 2001 From: Krisna Pranav <68631244+krishpranav@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:37:07 +0530 Subject: [PATCH 5/5] client: ethclient_test.go test case for checking the features which i've implemented. --- ethclient/ethclient_test.go | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/ethclient/ethclient_test.go b/ethclient/ethclient_test.go index 4ad8a552d2..cdfbd2b466 100644 --- a/ethclient/ethclient_test.go +++ b/ethclient/ethclient_test.go @@ -39,6 +39,7 @@ import ( "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/eth/tracers" ) // Verify that Client implements the ethereum interfaces. @@ -685,3 +686,61 @@ func ExampleRevertErrorData() { // revert: 08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a75736572206572726f72 // message: user error } + +func TestTracing(t *testing.T) { + rpcClient := getRPCClient(t) + client := NewClient(rpcClient) + + t.Run("TraceTransaction", func(t *testing.T) { + txHash := testTx1.Hash() + + result, err := client.TraceTransaction(context.Background(), txHash.Hex()) + if err != nil { + t.Fatalf("Failed to trace transaction: %v", err) + } + + assert.NotNil(t, result, "Trace result should not be nil") + t.Logf("Trace Transaction Result: %+v", result) + }) + + t.Run("TraceCall", func(t *testing.T) { + callArgs := map[string]interface{}{ + "from": testAddr, + "to": revertContractAddr, + "data": revertCode, + } + + result, err := client.TraceCall(context.Background(), callArgs) + if err != nil { + t.Fatalf("Failed to trace call: %v", err) + } + + assert.NotNil(t, result, "Trace result should not be nil") + t.Logf("Trace Call Result: %+v", result) + }) + + t.Run("TraceBlock", func(t *testing.T) { + blockHash := common.HexToHash(testKey) + + result, err := client.TraceBlock(context.Background(), blockHash.Hex()) + if err != nil { + t.Fatalf("Failed to trace block: %v", err) + } + + assert.NotNil(t, result, "Trace result should not be nil") + t.Logf("Trace Block Result: %+v", result) + }) + + t.Run("TraceChain", func(t *testing.T) { + blockHash := common.HexToHash(testKey) + count := 10 + + result, err := client.TraceChain(context.Background(), blockHash.Hex(), count) + if err != nil { + t.Fatalf("Failed to trace chain: %v", err) + } + + assert.NotNil(t, result, "Trace result should not be nil") + t.Logf("Trace Chain Result: %+v", result) + }) +} \ No newline at end of file