aboutsummaryrefslogtreecommitdiffstats
path: root/ethclient/ethclient.go
diff options
context:
space:
mode:
Diffstat (limited to 'ethclient/ethclient.go')
-rw-r--r--ethclient/ethclient.go36
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