aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTaylor Gerring <taylor.gerring@gmail.com>2015-03-16 22:38:57 +0800
committerTaylor Gerring <taylor.gerring@gmail.com>2015-03-16 22:38:57 +0800
commit5757f547a6339c770a6d85ad067107d34878858f (patch)
treebfac5a1e4d08e65bee85a55dc7a6a43d5ef2b2eb
parent3cf51d5479ab91cee100c4ca04d9db3a848ff8d2 (diff)
downloaddexon-5757f547a6339c770a6d85ad067107d34878858f.tar.gz
dexon-5757f547a6339c770a6d85ad067107d34878858f.tar.zst
dexon-5757f547a6339c770a6d85ad067107d34878858f.zip
Allow latest/pending in filter options
-rw-r--r--rpc/args.go62
-rw-r--r--rpc/args_test.go23
2 files changed, 45 insertions, 40 deletions
diff --git a/rpc/args.go b/rpc/args.go
index 7ed482c30..9ec2ed8a4 100644
--- a/rpc/args.go
+++ b/rpc/args.go
@@ -331,42 +331,6 @@ func (args *Sha3Args) UnmarshalJSON(b []byte) (err error) {
return nil
}
-// type FilterArgs struct {
-// FromBlock uint64
-// ToBlock uint64
-// Limit uint64
-// Offset uint64
-// Address string
-// Topics []string
-// }
-
-// func (args *FilterArgs) UnmarshalJSON(b []byte) (err error) {
-// var obj []struct {
-// FromBlock string `json:"fromBlock"`
-// ToBlock string `json:"toBlock"`
-// Limit string `json:"limit"`
-// Offset string `json:"offset"`
-// Address string `json:"address"`
-// Topics []string `json:"topics"`
-// }
-
-// if err = json.Unmarshal(b, &obj); err != nil {
-// return errDecodeArgs
-// }
-
-// if len(obj) < 1 {
-// return errArguments
-// }
-// args.FromBlock = uint64(common.Big(obj[0].FromBlock).Int64())
-// args.ToBlock = uint64(common.Big(obj[0].ToBlock).Int64())
-// args.Limit = uint64(common.Big(obj[0].Limit).Int64())
-// args.Offset = uint64(common.Big(obj[0].Offset).Int64())
-// args.Address = obj[0].Address
-// args.Topics = obj[0].Topics
-
-// return nil
-// }
-
type FilterOptions struct {
Earliest int64
Latest int64
@@ -378,8 +342,8 @@ type FilterOptions struct {
func (args *FilterOptions) UnmarshalJSON(b []byte) (err error) {
var obj []struct {
- FromBlock string `json:"fromBlock"`
- ToBlock string `json:"toBlock"`
+ FromBlock interface{} `json:"fromBlock"`
+ ToBlock interface{} `json:"toBlock"`
Limit string `json:"limit"`
Offset string `json:"offset"`
Address string `json:"address"`
@@ -394,8 +358,26 @@ func (args *FilterOptions) UnmarshalJSON(b []byte) (err error) {
return NewInsufficientParamsError(len(obj), 1)
}
- args.Earliest = int64(common.Big(obj[0].FromBlock).Int64())
- args.Latest = int64(common.Big(obj[0].ToBlock).Int64())
+ fromstr, ok := obj[0].FromBlock.(string)
+ if ok {
+ if fromstr == "latest" {
+ args.Earliest = 0
+ } else {
+ args.Earliest = int64(common.Big(obj[0].FromBlock.(string)).Int64())
+ }
+ }
+
+ tostr, ok := obj[0].ToBlock.(string)
+ if ok {
+ if tostr == "latest" {
+ args.Latest = 0
+ } else if tostr == "pending" {
+ args.Latest = -1
+ } else {
+ args.Latest = int64(common.Big(obj[0].ToBlock.(string)).Int64())
+ }
+ }
+
args.Max = int(common.Big(obj[0].Limit).Int64())
args.Skip = int(common.Big(obj[0].Offset).Int64())
args.Address = obj[0].Address
diff --git a/rpc/args_test.go b/rpc/args_test.go
index 47d79cc32..d6e4bee62 100644
--- a/rpc/args_test.go
+++ b/rpc/args_test.go
@@ -286,6 +286,29 @@ func TestFilterOptions(t *testing.T) {
// }
}
+func TestFilterOptionsWords(t *testing.T) {
+ input := `[{
+ "fromBlock": "latest",
+ "toBlock": "pending"
+ }]`
+ expected := new(FilterOptions)
+ expected.Earliest = 0
+ expected.Latest = -1
+
+ args := new(FilterOptions)
+ if err := json.Unmarshal([]byte(input), &args); err != nil {
+ t.Error(err)
+ }
+
+ if expected.Earliest != args.Earliest {
+ t.Errorf("Earliest shoud be %#v but is %#v", expected.Earliest, args.Earliest)
+ }
+
+ if expected.Latest != args.Latest {
+ t.Errorf("Latest shoud be %#v but is %#v", expected.Latest, args.Latest)
+ }
+}
+
func TestDbArgs(t *testing.T) {
input := `["0x74657374","0x6b6579","0x6d79537472696e67"]`
expected := new(DbArgs)