/
eth.go
85 lines (67 loc) · 1.92 KB
/
eth.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package client
import (
"context"
"github.com/ava-labs/coreth/eth/tracers"
"github.com/ava-labs/coreth/ethclient"
"github.com/ava-labs/coreth/rpc"
)
var (
tracer = "callTracer"
tracerTimeout = "180s"
prefixEth = "/ext/bc/C/rpc"
)
// EthClient provides access to Coreth API
type EthClient struct {
ethclient.Client
rpc *rpc.Client
traceConfig *tracers.TraceConfig
}
// NewEthClient returns a new EVM client
func NewEthClient(ctx context.Context, endpoint string) (*EthClient, error) {
endpointURL := endpoint + prefixEth
c, err := rpc.DialContext(ctx, endpointURL)
if err != nil {
return nil, err
}
return &EthClient{
Client: ethclient.NewClient(c),
rpc: c,
traceConfig: &tracers.TraceConfig{
Timeout: &tracerTimeout,
Tracer: &tracer,
},
}, nil
}
// TxPoolContent returns the tx pool content
func (c *EthClient) TxPoolContent(ctx context.Context) (*TxPoolContent, error) {
var content TxPoolContent
err := c.rpc.CallContext(ctx, &content, "txpool_inspect")
return &content, err
}
// TraceTransaction returns a transaction trace
func (c *EthClient) TraceTransaction(ctx context.Context, hash string) (*Call, []*FlatCall, error) {
var result Call
err := c.rpc.CallContext(ctx, &result, "debug_traceTransaction", hash, c.traceConfig)
if err != nil {
return nil, nil, err
}
flattened := result.init()
return &result, flattened, nil
}
// TraceBlockByHash returns the transaction traces of all transactions in the block
func (c *EthClient) TraceBlockByHash(ctx context.Context, hash string) ([]*Call, [][]*FlatCall, error) {
var raw []struct {
*Call `json:"result"`
}
err := c.rpc.CallContext(ctx, &raw, "debug_traceBlockByHash", hash, c.traceConfig)
if err != nil {
return nil, nil, err
}
result := make([]*Call, len(raw))
flattened := make([][]*FlatCall, len(raw))
for i, tx := range raw {
result[i] = tx.Call
flattened[i] = tx.Call.init()
}
return result, flattened, nil
}