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 := &ethFilter{
    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  }