github.com/status-im/status-go@v1.1.0/services/subscriptions/filters_eth.go (about) 1 package subscriptions 2 3 import ( 4 "fmt" 5 6 "github.com/status-im/status-go/rpc" 7 ) 8 9 type ethFilter struct { 10 id string 11 rpcClient *rpc.Client 12 } 13 14 func installEthFilter(rpcClient *rpc.Client, method string, args []interface{}) (*ethFilter, error) { 15 16 if err := validateEthMethod(method); err != nil { 17 return nil, err 18 } 19 20 var result string 21 22 err := rpcClient.Call(&result, rpcClient.UpstreamChainID, method, args...) 23 24 if err != nil { 25 return nil, err 26 } 27 28 filter := ðFilter{ 29 id: result, 30 rpcClient: rpcClient, 31 } 32 33 return filter, nil 34 35 } 36 37 func (ef *ethFilter) getID() string { 38 return ef.id 39 } 40 41 func (ef *ethFilter) getChanges() ([]interface{}, error) { 42 var result []interface{} 43 44 err := ef.rpcClient.Call(&result, ef.rpcClient.UpstreamChainID, "eth_getFilterChanges", ef.getID()) 45 46 return result, err 47 } 48 49 func (ef *ethFilter) uninstall() error { 50 return ef.rpcClient.Call(nil, ef.rpcClient.UpstreamChainID, "eth_uninstallFilter", ef.getID()) 51 } 52 53 func validateEthMethod(method string) error { 54 for _, allowedMethod := range []string{ 55 "eth_newFilter", 56 "eth_newBlockFilter", 57 "eth_newPendingTransactionFilter", 58 } { 59 if method == allowedMethod { 60 return nil 61 } 62 } 63 64 return fmt.Errorf("unexpected filter method: %s", method) 65 }