|
|
@@ -16,7 +16,15 @@
|
|
|
|
|
|
package ethclient
|
|
|
|
|
|
-import "github.com/ethereum/go-ethereum"
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "math/big"
|
|
|
+ "reflect"
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ "github.com/ethereum/go-ethereum"
|
|
|
+ "github.com/ethereum/go-ethereum/common"
|
|
|
+)
|
|
|
|
|
|
// Verify that Client implements the ethereum interfaces.
|
|
|
var (
|
|
|
@@ -32,3 +40,113 @@ var (
|
|
|
// _ = ethereum.PendingStateEventer(&Client{})
|
|
|
_ = ethereum.PendingContractCaller(&Client{})
|
|
|
)
|
|
|
+
|
|
|
+func TestToFilterArg(t *testing.T) {
|
|
|
+ blockHashErr := fmt.Errorf("cannot specify both BlockHash and FromBlock/ToBlock")
|
|
|
+ addresses := []common.Address{
|
|
|
+ common.HexToAddress("0xD36722ADeC3EdCB29c8e7b5a47f352D701393462"),
|
|
|
+ }
|
|
|
+ blockHash := common.HexToHash(
|
|
|
+ "0xeb94bb7d78b73657a9d7a99792413f50c0a45c51fc62bdcb08a53f18e9a2b4eb",
|
|
|
+ )
|
|
|
+
|
|
|
+ for _, testCase := range []struct {
|
|
|
+ name string
|
|
|
+ input ethereum.FilterQuery
|
|
|
+ output interface{}
|
|
|
+ err error
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ "without BlockHash",
|
|
|
+ ethereum.FilterQuery{
|
|
|
+ Addresses: addresses,
|
|
|
+ FromBlock: big.NewInt(1),
|
|
|
+ ToBlock: big.NewInt(2),
|
|
|
+ Topics: [][]common.Hash{},
|
|
|
+ },
|
|
|
+ map[string]interface{}{
|
|
|
+ "address": addresses,
|
|
|
+ "fromBlock": "0x1",
|
|
|
+ "toBlock": "0x2",
|
|
|
+ "topics": [][]common.Hash{},
|
|
|
+ },
|
|
|
+ nil,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "with nil fromBlock and nil toBlock",
|
|
|
+ ethereum.FilterQuery{
|
|
|
+ Addresses: addresses,
|
|
|
+ Topics: [][]common.Hash{},
|
|
|
+ },
|
|
|
+ map[string]interface{}{
|
|
|
+ "address": addresses,
|
|
|
+ "fromBlock": "0x0",
|
|
|
+ "toBlock": "latest",
|
|
|
+ "topics": [][]common.Hash{},
|
|
|
+ },
|
|
|
+ nil,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "with blockhash",
|
|
|
+ ethereum.FilterQuery{
|
|
|
+ Addresses: addresses,
|
|
|
+ BlockHash: &blockHash,
|
|
|
+ Topics: [][]common.Hash{},
|
|
|
+ },
|
|
|
+ map[string]interface{}{
|
|
|
+ "address": addresses,
|
|
|
+ "blockHash": blockHash,
|
|
|
+ "topics": [][]common.Hash{},
|
|
|
+ },
|
|
|
+ nil,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "with blockhash and from block",
|
|
|
+ ethereum.FilterQuery{
|
|
|
+ Addresses: addresses,
|
|
|
+ BlockHash: &blockHash,
|
|
|
+ FromBlock: big.NewInt(1),
|
|
|
+ Topics: [][]common.Hash{},
|
|
|
+ },
|
|
|
+ nil,
|
|
|
+ blockHashErr,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "with blockhash and to block",
|
|
|
+ ethereum.FilterQuery{
|
|
|
+ Addresses: addresses,
|
|
|
+ BlockHash: &blockHash,
|
|
|
+ ToBlock: big.NewInt(1),
|
|
|
+ Topics: [][]common.Hash{},
|
|
|
+ },
|
|
|
+ nil,
|
|
|
+ blockHashErr,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "with blockhash and both from / to block",
|
|
|
+ ethereum.FilterQuery{
|
|
|
+ Addresses: addresses,
|
|
|
+ BlockHash: &blockHash,
|
|
|
+ FromBlock: big.NewInt(1),
|
|
|
+ ToBlock: big.NewInt(2),
|
|
|
+ Topics: [][]common.Hash{},
|
|
|
+ },
|
|
|
+ nil,
|
|
|
+ blockHashErr,
|
|
|
+ },
|
|
|
+ } {
|
|
|
+ t.Run(testCase.name, func(t *testing.T) {
|
|
|
+ output, err := toFilterArg(testCase.input)
|
|
|
+ if (testCase.err == nil) != (err == nil) {
|
|
|
+ t.Fatalf("expected error %v but got %v", testCase.err, err)
|
|
|
+ }
|
|
|
+ if testCase.err != nil {
|
|
|
+ if testCase.err.Error() != err.Error() {
|
|
|
+ t.Fatalf("expected error %v but got %v", testCase.err, err)
|
|
|
+ }
|
|
|
+ } else if !reflect.DeepEqual(testCase.output, output) {
|
|
|
+ t.Fatalf("expected filter arg %v but got %v", testCase.output, output)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|