diff options
author | tamirms <tamir@trello.com> | 2018-11-08 20:26:47 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2018-11-08 20:26:47 +0800 |
commit | b16cc501a88eb7c36cfd8ee9be1c0c985ef4a7d9 (patch) | |
tree | 02a92c1f7669d11c66337e32abf5f7d0ad1d178b /ethclient/ethclient.go | |
parent | 9313fa63f959f8a5c3609c187120711a484a4c57 (diff) | |
download | dexon-b16cc501a88eb7c36cfd8ee9be1c0c985ef4a7d9.tar dexon-b16cc501a88eb7c36cfd8ee9be1c0c985ef4a7d9.tar.gz dexon-b16cc501a88eb7c36cfd8ee9be1c0c985ef4a7d9.tar.bz2 dexon-b16cc501a88eb7c36cfd8ee9be1c0c985ef4a7d9.tar.lz dexon-b16cc501a88eb7c36cfd8ee9be1c0c985ef4a7d9.tar.xz dexon-b16cc501a88eb7c36cfd8ee9be1c0c985ef4a7d9.tar.zst dexon-b16cc501a88eb7c36cfd8ee9be1c0c985ef4a7d9.zip |
ethclient: include block hash from FilterQuery (#17996)
ethereum/go-ethereum#16734 introduced BlockHash to the FilterQuery
struct. However, ethclient was not updated to include BlockHash in the actual
RPC request.
Diffstat (limited to 'ethclient/ethclient.go')
-rw-r--r-- | ethclient/ethclient.go | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index b40837c8c..f3163e19b 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -365,26 +365,42 @@ func (ec *Client) NonceAt(ctx context.Context, account common.Address, blockNumb // FilterLogs executes a filter query. func (ec *Client) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error) { var result []types.Log - err := ec.c.CallContext(ctx, &result, "eth_getLogs", toFilterArg(q)) + arg, err := toFilterArg(q) + if err != nil { + return nil, err + } + err = ec.c.CallContext(ctx, &result, "eth_getLogs", arg) return result, err } // SubscribeFilterLogs subscribes to the results of a streaming filter query. func (ec *Client) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { - return ec.c.EthSubscribe(ctx, ch, "logs", toFilterArg(q)) + arg, err := toFilterArg(q) + if err != nil { + return nil, err + } + return ec.c.EthSubscribe(ctx, ch, "logs", arg) } -func toFilterArg(q ethereum.FilterQuery) interface{} { +func toFilterArg(q ethereum.FilterQuery) (interface{}, error) { arg := map[string]interface{}{ - "fromBlock": toBlockNumArg(q.FromBlock), - "toBlock": toBlockNumArg(q.ToBlock), - "address": q.Addresses, - "topics": q.Topics, + "address": q.Addresses, + "topics": q.Topics, } - if q.FromBlock == nil { - arg["fromBlock"] = "0x0" + if q.BlockHash != nil { + arg["blockHash"] = *q.BlockHash + if q.FromBlock != nil || q.ToBlock != nil { + return nil, fmt.Errorf("cannot specify both BlockHash and FromBlock/ToBlock") + } + } else { + if q.FromBlock == nil { + arg["fromBlock"] = "0x0" + } else { + arg["fromBlock"] = toBlockNumArg(q.FromBlock) + } + arg["toBlock"] = toBlockNumArg(q.ToBlock) } - return arg + return arg, nil } // Pending State |