diff --git a/rpc/args.go b/rpc/args.go index d4d807060804b19f0094fffb4dc5d3386ab66b94..2e4e2c7a9520f7136ccac49729b7c105c4f3e448 100644 --- a/rpc/args.go +++ b/rpc/args.go @@ -227,11 +227,67 @@ type BlockNumIndexArgs struct { Index int64 } +func (args *BlockNumIndexArgs) UnmarshalJSON(b []byte) (err error) { + var obj []interface{} + r := bytes.NewReader(b) + if err := json.NewDecoder(r).Decode(&obj); err != nil { + return errDecodeArgs + } + + if len(obj) < 1 { + return errArguments + } + + arg0, ok := obj[0].(string) + if !ok { + return errDecodeArgs + } + args.BlockNumber = ethutil.Big(arg0).Int64() + + if len(obj) > 1 { + arg1, ok := obj[1].(string) + if !ok { + return errDecodeArgs + } + args.Index = ethutil.Big(arg1).Int64() + } + + return nil +} + type HashIndexArgs struct { BlockHash string Index int64 } +func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) { + var obj []interface{} + r := bytes.NewReader(b) + if err := json.NewDecoder(r).Decode(&obj); err != nil { + return errDecodeArgs + } + + if len(obj) < 1 { + return errArguments + } + + arg0, ok := obj[0].(string) + if !ok { + return errDecodeArgs + } + args.BlockHash = arg0 + + if len(obj) > 1 { + arg1, ok := obj[1].(string) + if !ok { + return errDecodeArgs + } + args.Index = ethutil.Big(arg1).Int64() + } + + return nil +} + type Sha3Args struct { Data string } diff --git a/rpc/args_test.go b/rpc/args_test.go index 0276245001425da1e138f0532b91b38d78c9dff9..6650d8d61f993181fe97a7ba89d3b7f0994a6e9c 100644 --- a/rpc/args_test.go +++ b/rpc/args_test.go @@ -432,3 +432,43 @@ func TestWhisperIdentityArgs(t *testing.T) { t.Errorf("Identity shoud be %#v but is %#v", expected.Identity, args.Identity) } } + +func TestBlockNumIndexArgs(t *testing.T) { + input := `["0x29a", "0x0"]` + expected := new(BlockNumIndexArgs) + expected.BlockNumber = 666 + expected.Index = 0 + + args := new(BlockNumIndexArgs) + if err := json.Unmarshal([]byte(input), &args); err != nil { + t.Error(err) + } + + if expected.BlockNumber != args.BlockNumber { + t.Errorf("BlockNumber shoud be %#v but is %#v", expected.BlockNumber, args.BlockNumber) + } + + if expected.Index != args.Index { + t.Errorf("Index shoud be %#v but is %#v", expected.Index, args.Index) + } +} + +func TestHashIndexArgs(t *testing.T) { + input := `["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "0x1"]` + expected := new(HashIndexArgs) + expected.BlockHash = "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b" + expected.Index = 1 + + args := new(HashIndexArgs) + if err := json.Unmarshal([]byte(input), &args); err != nil { + t.Error(err) + } + + if expected.BlockHash != args.BlockHash { + t.Errorf("BlockHash shoud be %#v but is %#v", expected.BlockHash, args.BlockHash) + } + + if expected.Index != args.Index { + t.Errorf("Index shoud be %#v but is %#v", expected.Index, args.Index) + } +}