1
1
package transformer
2
2
3
3
import (
4
+ "encoding/json"
4
5
"math/big"
5
6
7
+ "github.com/pkg/errors"
8
+
6
9
"github.com/dcb9/janus/pkg/eth"
7
10
"github.com/dcb9/janus/pkg/qtum"
8
11
"github.com/dcb9/janus/pkg/utils"
@@ -12,7 +15,7 @@ import (
12
15
// ProxyETHGetFilterChanges implements ETHProxy
13
16
type ProxyETHGetFilterChanges struct {
14
17
* qtum.Qtum
15
- blockFilter * BlockFilterSimulator
18
+ filter * eth. FilterSimulator
16
19
}
17
20
18
21
func (p * ProxyETHGetFilterChanges ) Method () string {
@@ -25,20 +28,38 @@ func (p *ProxyETHGetFilterChanges) Request(rawreq *eth.JSONRPCRequest) (interfac
25
28
return nil , err
26
29
}
27
30
28
- return p .request (& req )
31
+ filterID , err := hexutil .DecodeUint64 (string (req ))
32
+ if err != nil {
33
+ return nil , err
34
+ }
35
+
36
+ _filter , ok := p .filter .Filter (filterID )
37
+ if ! ok {
38
+ return nil , errors .New ("Invalid filter id" )
39
+ }
40
+ filter := _filter .(* eth.Filter )
41
+
42
+ switch filter .Type {
43
+ case eth .NewFilterTy :
44
+ return p .requestFilter (filter )
45
+ case eth .NewBlockFilterTy :
46
+ return p .requestBlockFilter (filter )
47
+ case eth .NewPendingTransactionFilterTy :
48
+ fallthrough
49
+ default :
50
+
51
+ return nil , errors .New ("Unknown filter type" )
52
+ }
29
53
}
30
54
31
- func (p * ProxyETHGetFilterChanges ) request ( ethreq * eth.GetFilterChangesRequest ) (qtumresp eth.GetFilterChangesResponse , err error ) {
55
+ func (p * ProxyETHGetFilterChanges ) requestBlockFilter ( filter * eth.Filter ) (qtumresp eth.GetFilterChangesResponse , err error ) {
32
56
qtumresp = make (eth.GetFilterChangesResponse , 0 )
33
- filterID , err := hexutil .DecodeUint64 (string (* ethreq ))
34
- if err != nil {
35
- return qtumresp , err
36
- }
37
57
38
- lastBlockNumber , err := p . blockFilter . GetBlockNumber ( filterID )
39
- if err != nil {
40
- return qtumresp , err
58
+ _lastBlockNumber , ok := filter . Data . Load ( "lastBlockNumber" )
59
+ if ! ok {
60
+ return qtumresp , errors . New ( "Could not get lastBlockNumber" )
41
61
}
62
+ lastBlockNumber := _lastBlockNumber .(uint64 )
42
63
43
64
blockCountBigInt , err := p .GetBlockCount ()
44
65
if err != nil {
@@ -61,5 +82,92 @@ func (p *ProxyETHGetFilterChanges) request(ethreq *eth.GetFilterChangesRequest)
61
82
}
62
83
63
84
qtumresp = hashes
85
+ filter .Data .Store ("lastBlockNumber" , blockCount )
64
86
return
65
87
}
88
+ func (p * ProxyETHGetFilterChanges ) requestFilter (filter * eth.Filter ) (qtumresp eth.GetFilterChangesResponse , err error ) {
89
+ qtumresp = make (eth.GetFilterChangesResponse , 0 )
90
+
91
+ _lastBlockNumber , ok := filter .Data .Load ("lastBlockNumber" )
92
+ if ! ok {
93
+ return qtumresp , errors .New ("Could not get lastBlockNumber" )
94
+ }
95
+ lastBlockNumber := _lastBlockNumber .(uint64 )
96
+
97
+ blockCountBigInt , err := p .GetBlockCount ()
98
+ if err != nil {
99
+ return qtumresp , err
100
+ }
101
+ blockCount := blockCountBigInt .Uint64 ()
102
+
103
+ differ := blockCount - lastBlockNumber
104
+
105
+ if differ == 0 {
106
+ return eth.GetFilterChangesResponse {}, nil
107
+ }
108
+
109
+ searchLogsReq , err := p .toSearchLogsReq (filter , big .NewInt (int64 (lastBlockNumber + 1 )), big .NewInt (int64 (blockCount )))
110
+ if err != nil {
111
+ return nil , err
112
+ }
113
+
114
+ return p .doSearchLogs (searchLogsReq )
115
+ }
116
+
117
+ func (p * ProxyETHGetFilterChanges ) doSearchLogs (req * qtum.SearchLogsRequest ) (eth.GetFilterChangesResponse , error ) {
118
+ resp , err := p .SearchLogs (req )
119
+ if err != nil {
120
+ return nil , err
121
+ }
122
+
123
+ receiptToResult := func (receipt * qtum.TransactionReceiptStruct ) []interface {} {
124
+ logs := getEthLogs (receipt )
125
+ res := make ([]interface {}, len (logs ))
126
+ for i , _ := range res {
127
+ res [i ] = logs [i ]
128
+ }
129
+ return res
130
+ }
131
+ results := make (eth.GetFilterChangesResponse , 0 )
132
+ for _ , receipt := range resp {
133
+ r := qtum .TransactionReceiptStruct (receipt )
134
+ results = append (results , receiptToResult (& r )... )
135
+ }
136
+
137
+ return results , nil
138
+ }
139
+
140
+ func (p * ProxyETHGetFilterChanges ) toSearchLogsReq (filter * eth.Filter , from , to * big.Int ) (* qtum.SearchLogsRequest , error ) {
141
+ ethreq := filter .Request .(* eth.NewFilterRequest )
142
+ var err error
143
+ var addresses []string
144
+ if ethreq .Address != nil {
145
+ if isString (ethreq .Address ) {
146
+ var addr string
147
+ if err = json .Unmarshal (ethreq .Address , & addr ); err != nil {
148
+ return nil , err
149
+ }
150
+ addresses = append (addresses , addr )
151
+ } else {
152
+ if err = json .Unmarshal (ethreq .Address , & addresses ); err != nil {
153
+ return nil , err
154
+ }
155
+ }
156
+ for i , _ := range addresses {
157
+ addresses [i ] = utils .RemoveHexPrefix (addresses [i ])
158
+ }
159
+ }
160
+
161
+ qtumreq := & qtum.SearchLogsRequest {
162
+ Addresses : addresses ,
163
+ FromBlock : from ,
164
+ ToBlock : to ,
165
+ }
166
+
167
+ topics , ok := filter .Data .Load ("topics" )
168
+ if ok {
169
+ qtumreq .Topics = topics .([]interface {})
170
+ }
171
+
172
+ return qtumreq , nil
173
+ }
0 commit comments