/
graphTransactionByTxHash.go
69 lines (56 loc) · 1.72 KB
/
graphTransactionByTxHash.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
package qlservices
import (
"context"
"encoding/json"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/rpc"
"github.com/graphql-go/graphql/language/ast"
"github.com/sirupsen/logrus"
"github.com/valyala/fastjson"
)
var traceMethod = "debug_writeTxTraceGraph"
type GraphTransactionByTxHashService struct {
number int
clients []*rpc.Client
}
func NewGetGraphCallByTxHashService(clients []*rpc.Client) *GraphTransactionByTxHashService {
return &GraphTransactionByTxHashService{clients: clients}
}
func (srv *GraphTransactionByTxHashService) Name() string {
return "graphTransactionByTxHash"
}
func (srv *GraphTransactionByTxHashService) params(args []*ast.Argument) (common.Hash, error) {
if len(args) == 0 {
return common.Hash{}, ErrNoArgs
}
value, ok := args[0].Value.GetValue().(string)
if !ok {
return common.Hash{}, ErrBadType
}
return common.HexToHash(value), nil
}
func (srv *GraphTransactionByTxHashService) Validate(args []*ast.Argument) error {
_, err := srv.params(args)
return err
}
func (srv *GraphTransactionByTxHashService) IsEmpty(data []byte) (bool, error) {
json, err := fastjson.ParseBytes(data)
if err != nil {
return true, err
}
header := json.Get("data", "graphTransactionByTxHash")
return header == nil || header.Type() == fastjson.TypeNull, nil
}
func (srv *GraphTransactionByTxHashService) Do(args []*ast.Argument) error {
hash, err := srv.params(args)
if err != nil {
return err
}
log := logrus.WithField("hash", hash.Hex())
log.Debug("do request to Geth")
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
defer cancel()
var data json.RawMessage
return proxyCallContext(srv.clients, log, ctx, &data, traceMethod, hash.Hex())
}