|
|
|
@ -3,14 +3,27 @@ package rpc |
|
|
|
|
import ( |
|
|
|
|
"bytes" |
|
|
|
|
"encoding/json" |
|
|
|
|
"errors" |
|
|
|
|
// "errors"
|
|
|
|
|
"fmt" |
|
|
|
|
"math/big" |
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func blockHeight(raw interface{}, number *int64) (err error) { |
|
|
|
|
const ( |
|
|
|
|
defaultLogLimit = 100 |
|
|
|
|
defaultLogOffset = 0 |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func blockHeightFromJson(msg json.RawMessage, number *int64) error { |
|
|
|
|
var raw interface{} |
|
|
|
|
if err := json.Unmarshal(msg, &raw); err != nil { |
|
|
|
|
return NewDecodeParamError(err.Error()) |
|
|
|
|
} |
|
|
|
|
return blockHeight(raw, number) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func blockHeight(raw interface{}, number *int64) error { |
|
|
|
|
// Parse as integer
|
|
|
|
|
num, ok := raw.(float64) |
|
|
|
|
if ok { |
|
|
|
@ -21,7 +34,7 @@ func blockHeight(raw interface{}, number *int64) (err error) { |
|
|
|
|
// Parse as string/hexstring
|
|
|
|
|
str, ok := raw.(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("BlockNumber is not a string") |
|
|
|
|
return NewInvalidTypeError("", "not a number or string") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch str { |
|
|
|
@ -36,26 +49,55 @@ func blockHeight(raw interface{}, number *int64) (err error) { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func toNumber(v interface{}) (int64, error) { |
|
|
|
|
var str string |
|
|
|
|
if v != nil { |
|
|
|
|
var ok bool |
|
|
|
|
str, ok = v.(string) |
|
|
|
|
if !ok { |
|
|
|
|
return 0, errors.New("is not a string or undefined") |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
str = "latest" |
|
|
|
|
func numString(raw interface{}, number *int64) error { |
|
|
|
|
// Parse as integer
|
|
|
|
|
num, ok := raw.(float64) |
|
|
|
|
if ok { |
|
|
|
|
*number = int64(num) |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch str { |
|
|
|
|
case "latest": |
|
|
|
|
return -1, nil |
|
|
|
|
default: |
|
|
|
|
return int64(common.Big(v.(string)).Int64()), nil |
|
|
|
|
// Parse as string/hexstring
|
|
|
|
|
str, ok := raw.(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewInvalidTypeError("", "not a number or string") |
|
|
|
|
} |
|
|
|
|
*number = common.String2Big(str).Int64() |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// func toNumber(v interface{}) (int64, error) {
|
|
|
|
|
// var str string
|
|
|
|
|
// if v != nil {
|
|
|
|
|
// var ok bool
|
|
|
|
|
// str, ok = v.(string)
|
|
|
|
|
// if !ok {
|
|
|
|
|
// return 0, errors.New("is not a string or undefined")
|
|
|
|
|
// }
|
|
|
|
|
// } else {
|
|
|
|
|
// str = "latest"
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// switch str {
|
|
|
|
|
// case "latest":
|
|
|
|
|
// return -1, nil
|
|
|
|
|
// default:
|
|
|
|
|
// return int64(common.Big(v.(string)).Int64()), nil
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// func hashString(raw interface{}, hash *string) error {
|
|
|
|
|
// argstr, ok := raw.(string)
|
|
|
|
|
// if !ok {
|
|
|
|
|
// return NewInvalidTypeError("", "not a string")
|
|
|
|
|
// }
|
|
|
|
|
// v := common.IsHex(argstr)
|
|
|
|
|
// hash = &argstr
|
|
|
|
|
|
|
|
|
|
// return nil
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
type GetBlockByHashArgs struct { |
|
|
|
|
BlockHash string |
|
|
|
|
IncludeTxs bool |
|
|
|
@ -74,7 +116,7 @@ func (args *GetBlockByHashArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
|
|
|
|
|
argstr, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("BlockHash not a string") |
|
|
|
|
return NewInvalidTypeError("blockHash", "not a string") |
|
|
|
|
} |
|
|
|
|
args.BlockHash = argstr |
|
|
|
|
|
|
|
|
@ -103,8 +145,10 @@ func (args *GetBlockByNumberArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
|
|
|
|
|
if v, ok := obj[0].(float64); ok { |
|
|
|
|
args.BlockNumber = int64(v) |
|
|
|
|
} else if v, ok := obj[0].(string); ok { |
|
|
|
|
args.BlockNumber = common.Big(v).Int64() |
|
|
|
|
} else { |
|
|
|
|
args.BlockNumber = common.Big(obj[0].(string)).Int64() |
|
|
|
|
return NewInvalidTypeError("blockNumber", "not a number or string") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if len(obj) > 1 { |
|
|
|
@ -127,7 +171,14 @@ type NewTxArgs struct { |
|
|
|
|
|
|
|
|
|
func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
var obj []json.RawMessage |
|
|
|
|
var ext struct{ From, To, Value, Gas, GasPrice, Data string } |
|
|
|
|
var ext struct { |
|
|
|
|
From string |
|
|
|
|
To string |
|
|
|
|
Value interface{} |
|
|
|
|
Gas interface{} |
|
|
|
|
GasPrice interface{} |
|
|
|
|
Data string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Decode byte slice to array of RawMessages
|
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil { |
|
|
|
@ -144,33 +195,49 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return NewDecodeParamError(err.Error()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// var ok bool
|
|
|
|
|
if len(ext.From) == 0 { |
|
|
|
|
return NewValidationError("from", "is required") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.From = ext.From |
|
|
|
|
args.To = ext.To |
|
|
|
|
args.Value = common.String2Big(ext.Value) |
|
|
|
|
args.Gas = common.String2Big(ext.Gas) |
|
|
|
|
args.GasPrice = common.String2Big(ext.GasPrice) |
|
|
|
|
args.Data = ext.Data |
|
|
|
|
|
|
|
|
|
// Check for optional BlockNumber param
|
|
|
|
|
if len(obj) > 1 { |
|
|
|
|
var raw interface{} |
|
|
|
|
if err = json.Unmarshal(obj[1], &raw); err != nil { |
|
|
|
|
return NewDecodeParamError(err.Error()) |
|
|
|
|
var num int64 |
|
|
|
|
if ext.Value == nil { |
|
|
|
|
return NewValidationError("value", "is required") |
|
|
|
|
} else { |
|
|
|
|
if err := numString(ext.Value, &num); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
args.Value = big.NewInt(num) |
|
|
|
|
|
|
|
|
|
if err := blockHeight(raw, &args.BlockNumber); err != nil { |
|
|
|
|
if ext.Gas == nil { |
|
|
|
|
return NewValidationError("gas", "is required") |
|
|
|
|
} else { |
|
|
|
|
if err := numString(ext.Gas, &num); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
args.Gas = big.NewInt(num) |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
if ext.GasPrice == nil { |
|
|
|
|
return NewValidationError("gasprice", "is required") |
|
|
|
|
} else { |
|
|
|
|
if err := numString(ext.GasPrice, &num); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
args.GasPrice = big.NewInt(num) |
|
|
|
|
|
|
|
|
|
func (args *NewTxArgs) requirements() error { |
|
|
|
|
if len(args.From) == 0 { |
|
|
|
|
return NewValidationError("From", "Is required") |
|
|
|
|
// Check for optional BlockNumber param
|
|
|
|
|
if len(obj) > 1 { |
|
|
|
|
if err := blockHeightFromJson(obj[1], &args.BlockNumber); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -191,7 +258,7 @@ func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
|
|
|
|
|
addstr, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Address is not a string") |
|
|
|
|
return NewInvalidTypeError("address", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Address = addstr |
|
|
|
|
|
|
|
|
@ -204,13 +271,6 @@ func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (args *GetStorageArgs) requirements() error { |
|
|
|
|
if len(args.Address) == 0 { |
|
|
|
|
return NewValidationError("Address", "cannot be blank") |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type GetStorageAtArgs struct { |
|
|
|
|
Address string |
|
|
|
|
Key string |
|
|
|
@ -229,13 +289,13 @@ func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
|
|
|
|
|
addstr, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Address is not a string") |
|
|
|
|
return NewInvalidTypeError("address", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Address = addstr |
|
|
|
|
|
|
|
|
|
keystr, ok := obj[1].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Key is not a string") |
|
|
|
|
return NewInvalidTypeError("key", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Key = keystr |
|
|
|
|
|
|
|
|
@ -248,17 +308,6 @@ func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (args *GetStorageAtArgs) requirements() error { |
|
|
|
|
if len(args.Address) == 0 { |
|
|
|
|
return NewValidationError("Address", "cannot be blank") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if len(args.Key) == 0 { |
|
|
|
|
return NewValidationError("Key", "cannot be blank") |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type GetTxCountArgs struct { |
|
|
|
|
Address string |
|
|
|
|
BlockNumber int64 |
|
|
|
@ -276,7 +325,7 @@ func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
|
|
|
|
|
addstr, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Address is not a string") |
|
|
|
|
return NewInvalidTypeError("address", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Address = addstr |
|
|
|
|
|
|
|
|
@ -289,13 +338,6 @@ func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (args *GetTxCountArgs) requirements() error { |
|
|
|
|
if len(args.Address) == 0 { |
|
|
|
|
return NewValidationError("Address", "cannot be blank") |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type GetBalanceArgs struct { |
|
|
|
|
Address string |
|
|
|
|
BlockNumber int64 |
|
|
|
@ -313,7 +355,7 @@ func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
|
|
|
|
|
addstr, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Address is not a string") |
|
|
|
|
return NewInvalidTypeError("address", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Address = addstr |
|
|
|
|
|
|
|
|
@ -326,13 +368,6 @@ func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (args *GetBalanceArgs) requirements() error { |
|
|
|
|
if len(args.Address) == 0 { |
|
|
|
|
return NewValidationError("Address", "cannot be blank") |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type GetDataArgs struct { |
|
|
|
|
Address string |
|
|
|
|
BlockNumber int64 |
|
|
|
@ -350,7 +385,7 @@ func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
|
|
|
|
|
addstr, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Address is not a string") |
|
|
|
|
return NewInvalidTypeError("address", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Address = addstr |
|
|
|
|
|
|
|
|
@ -363,13 +398,6 @@ func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (args *GetDataArgs) requirements() error { |
|
|
|
|
if len(args.Address) == 0 { |
|
|
|
|
return NewValidationError("Address", "cannot be blank") |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type BlockNumIndexArgs struct { |
|
|
|
|
BlockNumber int64 |
|
|
|
|
Index int64 |
|
|
|
@ -386,16 +414,14 @@ func (args *BlockNumIndexArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return NewInsufficientParamsError(len(obj), 1) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
arg0, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("BlockNumber is not string") |
|
|
|
|
if err := blockHeight(obj[0], &args.BlockNumber); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
args.BlockNumber = common.Big(arg0).Int64() |
|
|
|
|
|
|
|
|
|
if len(obj) > 1 { |
|
|
|
|
arg1, ok := obj[1].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Index not a string") |
|
|
|
|
return NewInvalidTypeError("index", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Index = common.Big(arg1).Int64() |
|
|
|
|
} |
|
|
|
@ -421,14 +447,14 @@ func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
|
|
|
|
|
arg0, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Hash not a string") |
|
|
|
|
return NewInvalidTypeError("hash", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Hash = arg0 |
|
|
|
|
|
|
|
|
|
if len(obj) > 1 { |
|
|
|
|
arg1, ok := obj[1].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Index not a string") |
|
|
|
|
return NewInvalidTypeError("index", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Index = common.Big(arg1).Int64() |
|
|
|
|
} |
|
|
|
@ -450,28 +476,32 @@ func (args *Sha3Args) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
if len(obj) < 1 { |
|
|
|
|
return NewInsufficientParamsError(len(obj), 1) |
|
|
|
|
} |
|
|
|
|
args.Data = obj[0].(string) |
|
|
|
|
|
|
|
|
|
argstr, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewInvalidTypeError("data", "is not a string") |
|
|
|
|
} |
|
|
|
|
args.Data = argstr |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type BlockFilterArgs struct { |
|
|
|
|
Earliest int64 |
|
|
|
|
Latest int64 |
|
|
|
|
Address interface{} |
|
|
|
|
Topics []interface{} |
|
|
|
|
Address []string |
|
|
|
|
Topics [][]string |
|
|
|
|
Skip int |
|
|
|
|
Max int |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
var obj []struct { |
|
|
|
|
FromBlock interface{} `json:"fromBlock"` |
|
|
|
|
ToBlock interface{} `json:"toBlock"` |
|
|
|
|
Limit string `json:"limit"` |
|
|
|
|
Offset string `json:"offset"` |
|
|
|
|
Address string `json:"address"` |
|
|
|
|
Topics []interface{} `json:"topics"` |
|
|
|
|
FromBlock interface{} `json:"fromBlock"` |
|
|
|
|
ToBlock interface{} `json:"toBlock"` |
|
|
|
|
Limit interface{} `json:"limit"` |
|
|
|
|
Offset interface{} `json:"offset"` |
|
|
|
|
Address interface{} `json:"address"` |
|
|
|
|
Topics interface{} `json:"topics"` |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err = json.Unmarshal(b, &obj); err != nil { |
|
|
|
@ -482,19 +512,113 @@ func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return NewInsufficientParamsError(len(obj), 1) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.Earliest, err = toNumber(obj[0].ToBlock) |
|
|
|
|
if err != nil { |
|
|
|
|
return NewDecodeParamError(fmt.Sprintf("FromBlock %v", err)) |
|
|
|
|
// args.Earliest, err = toNumber(obj[0].ToBlock)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// return NewDecodeParamError(fmt.Sprintf("FromBlock %v", err))
|
|
|
|
|
// }
|
|
|
|
|
// args.Latest, err = toNumber(obj[0].FromBlock)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// return NewDecodeParamError(fmt.Sprintf("ToBlock %v", err))
|
|
|
|
|
|
|
|
|
|
var num int64 |
|
|
|
|
|
|
|
|
|
// if blank then latest
|
|
|
|
|
if obj[0].FromBlock == nil { |
|
|
|
|
num = -1 |
|
|
|
|
} else { |
|
|
|
|
if err := blockHeight(obj[0].FromBlock, &num); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
args.Latest, err = toNumber(obj[0].FromBlock) |
|
|
|
|
if err != nil { |
|
|
|
|
return NewDecodeParamError(fmt.Sprintf("ToBlock %v", err)) |
|
|
|
|
// if -2 or other "silly" number, use latest
|
|
|
|
|
if num < 0 { |
|
|
|
|
args.Earliest = -1 //latest block
|
|
|
|
|
} else { |
|
|
|
|
args.Earliest = num |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.Max = int(common.Big(obj[0].Limit).Int64()) |
|
|
|
|
args.Skip = int(common.Big(obj[0].Offset).Int64()) |
|
|
|
|
args.Address = obj[0].Address |
|
|
|
|
args.Topics = obj[0].Topics |
|
|
|
|
// if blank than latest
|
|
|
|
|
if obj[0].ToBlock == nil { |
|
|
|
|
num = -1 |
|
|
|
|
} else { |
|
|
|
|
if err := blockHeight(obj[0].ToBlock, &num); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
args.Latest = num |
|
|
|
|
|
|
|
|
|
if obj[0].Limit == nil { |
|
|
|
|
num = defaultLogLimit |
|
|
|
|
} else { |
|
|
|
|
if err := numString(obj[0].Limit, &num); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
args.Max = int(num) |
|
|
|
|
|
|
|
|
|
if obj[0].Offset == nil { |
|
|
|
|
num = defaultLogOffset |
|
|
|
|
} else { |
|
|
|
|
if err := numString(obj[0].Offset, &num); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
args.Skip = int(num) |
|
|
|
|
|
|
|
|
|
if obj[0].Address != nil { |
|
|
|
|
marg, ok := obj[0].Address.([]interface{}) |
|
|
|
|
if ok { |
|
|
|
|
v := make([]string, len(marg)) |
|
|
|
|
for i, arg := range marg { |
|
|
|
|
argstr, ok := arg.(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewInvalidTypeError(fmt.Sprintf("address[%d]", i), "is not a string") |
|
|
|
|
} |
|
|
|
|
v[i] = argstr |
|
|
|
|
} |
|
|
|
|
args.Address = v |
|
|
|
|
} else { |
|
|
|
|
argstr, ok := obj[0].Address.(string) |
|
|
|
|
if ok { |
|
|
|
|
v := make([]string, 1) |
|
|
|
|
v[0] = argstr |
|
|
|
|
args.Address = v |
|
|
|
|
} else { |
|
|
|
|
return NewInvalidTypeError("address", "is not a string or array") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if obj[0].Topics != nil { |
|
|
|
|
other, ok := obj[0].Topics.([]interface{}) |
|
|
|
|
if ok { |
|
|
|
|
topicdbl := make([][]string, len(other)) |
|
|
|
|
for i, iv := range other { |
|
|
|
|
if argstr, ok := iv.(string); ok { |
|
|
|
|
// Found a string, push into first element of array
|
|
|
|
|
topicsgl := make([]string, 1) |
|
|
|
|
topicsgl[0] = argstr |
|
|
|
|
topicdbl[i] = topicsgl |
|
|
|
|
} else if argarray, ok := iv.([]interface{}); ok { |
|
|
|
|
// Found an array of other
|
|
|
|
|
topicdbl[i] = make([]string, len(argarray)) |
|
|
|
|
for j, jv := range argarray { |
|
|
|
|
if v, ok := jv.(string); ok { |
|
|
|
|
topicdbl[i][j] = v |
|
|
|
|
} else { |
|
|
|
|
return NewInvalidTypeError(fmt.Sprintf("topic[%d][%d]", i, j), "is not a string") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
return NewInvalidTypeError(fmt.Sprintf("topic[%d]", i), "not a string or array") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
args.Topics = topicdbl |
|
|
|
|
return nil |
|
|
|
|
} else { |
|
|
|
|
return NewInvalidTypeError("topic", "is not a string or array") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
@ -519,19 +643,19 @@ func (args *DbArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
var ok bool |
|
|
|
|
|
|
|
|
|
if objstr, ok = obj[0].(string); !ok { |
|
|
|
|
return NewDecodeParamError("Database is not a string") |
|
|
|
|
return NewInvalidTypeError("database", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Database = objstr |
|
|
|
|
|
|
|
|
|
if objstr, ok = obj[1].(string); !ok { |
|
|
|
|
return NewDecodeParamError("Key is not a string") |
|
|
|
|
return NewInvalidTypeError("key", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Key = objstr |
|
|
|
|
|
|
|
|
|
if len(obj) > 2 { |
|
|
|
|
objstr, ok = obj[2].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Value is not a string") |
|
|
|
|
return NewInvalidTypeError("value", "not a string") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.Value = []byte(objstr) |
|
|
|
@ -570,19 +694,19 @@ func (args *DbHexArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
var ok bool |
|
|
|
|
|
|
|
|
|
if objstr, ok = obj[0].(string); !ok { |
|
|
|
|
return NewDecodeParamError("Database is not a string") |
|
|
|
|
return NewInvalidTypeError("database", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Database = objstr |
|
|
|
|
|
|
|
|
|
if objstr, ok = obj[1].(string); !ok { |
|
|
|
|
return NewDecodeParamError("Key is not a string") |
|
|
|
|
return NewInvalidTypeError("key", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Key = objstr |
|
|
|
|
|
|
|
|
|
if len(obj) > 2 { |
|
|
|
|
objstr, ok = obj[2].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Value is not a string") |
|
|
|
|
return NewInvalidTypeError("value", "not a string") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.Value = common.FromHex(objstr) |
|
|
|
@ -616,8 +740,8 @@ func (args *WhisperMessageArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
To string |
|
|
|
|
From string |
|
|
|
|
Topics []string |
|
|
|
|
Priority string |
|
|
|
|
Ttl string |
|
|
|
|
Priority interface{} |
|
|
|
|
Ttl interface{} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err = json.Unmarshal(b, &obj); err != nil { |
|
|
|
@ -631,8 +755,17 @@ func (args *WhisperMessageArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
args.To = obj[0].To |
|
|
|
|
args.From = obj[0].From |
|
|
|
|
args.Topics = obj[0].Topics |
|
|
|
|
args.Priority = uint32(common.Big(obj[0].Priority).Int64()) |
|
|
|
|
args.Ttl = uint32(common.Big(obj[0].Ttl).Int64()) |
|
|
|
|
|
|
|
|
|
var num int64 |
|
|
|
|
if err := numString(obj[0].Priority, &num); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
args.Priority = uint32(num) |
|
|
|
|
|
|
|
|
|
if err := numString(obj[0].Ttl, &num); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
args.Ttl = uint32(num) |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
@ -643,14 +776,18 @@ type CompileArgs struct { |
|
|
|
|
|
|
|
|
|
func (args *CompileArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
var obj []interface{} |
|
|
|
|
r := bytes.NewReader(b) |
|
|
|
|
if err := json.NewDecoder(r).Decode(&obj); err != nil { |
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil { |
|
|
|
|
return NewDecodeParamError(err.Error()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if len(obj) > 0 { |
|
|
|
|
args.Source = obj[0].(string) |
|
|
|
|
if len(obj) < 1 { |
|
|
|
|
return NewInsufficientParamsError(len(obj), 1) |
|
|
|
|
} |
|
|
|
|
argstr, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewInvalidTypeError("arg0", "is not a string") |
|
|
|
|
} |
|
|
|
|
args.Source = argstr |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
@ -673,20 +810,15 @@ func (args *FilterStringArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
var argstr string |
|
|
|
|
argstr, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewDecodeParamError("Filter is not a string") |
|
|
|
|
return NewInvalidTypeError("filter", "not a string") |
|
|
|
|
} |
|
|
|
|
args.Word = argstr |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (args *FilterStringArgs) requirements() error { |
|
|
|
|
switch args.Word { |
|
|
|
|
switch argstr { |
|
|
|
|
case "latest", "pending": |
|
|
|
|
break |
|
|
|
|
default: |
|
|
|
|
return NewValidationError("Word", "Must be `latest` or `pending`") |
|
|
|
|
} |
|
|
|
|
args.Word = argstr |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -695,9 +827,8 @@ type FilterIdArgs struct { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (args *FilterIdArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
var obj []string |
|
|
|
|
r := bytes.NewReader(b) |
|
|
|
|
if err := json.NewDecoder(r).Decode(&obj); err != nil { |
|
|
|
|
var obj []interface{} |
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil { |
|
|
|
|
return NewDecodeParamError(err.Error()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -705,7 +836,11 @@ func (args *FilterIdArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return NewInsufficientParamsError(len(obj), 1) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.Id = int(common.Big(obj[0]).Int64()) |
|
|
|
|
var num int64 |
|
|
|
|
if err := numString(obj[0], &num); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
args.Id = int(num) |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
@ -715,9 +850,8 @@ type WhisperIdentityArgs struct { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
var obj []string |
|
|
|
|
r := bytes.NewReader(b) |
|
|
|
|
if err := json.NewDecoder(r).Decode(&obj); err != nil { |
|
|
|
|
var obj []interface{} |
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil { |
|
|
|
|
return NewDecodeParamError(err.Error()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -725,7 +859,14 @@ func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return NewInsufficientParamsError(len(obj), 1) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.Identity = obj[0] |
|
|
|
|
argstr, ok := obj[0].(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewInvalidTypeError("arg0", "not a string") |
|
|
|
|
} |
|
|
|
|
// if !common.IsHex(argstr) {
|
|
|
|
|
// return NewValidationError("arg0", "not a hexstring")
|
|
|
|
|
// }
|
|
|
|
|
args.Identity = argstr |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
@ -738,9 +879,8 @@ type WhisperFilterArgs struct { |
|
|
|
|
|
|
|
|
|
func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
var obj []struct { |
|
|
|
|
To string |
|
|
|
|
From string |
|
|
|
|
Topics []string |
|
|
|
|
To interface{} |
|
|
|
|
Topics []interface{} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err = json.Unmarshal(b, &obj); err != nil { |
|
|
|
@ -751,17 +891,30 @@ func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
return NewInsufficientParamsError(len(obj), 1) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.To = obj[0].To |
|
|
|
|
args.From = obj[0].From |
|
|
|
|
args.Topics = obj[0].Topics |
|
|
|
|
var argstr string |
|
|
|
|
argstr, ok := obj[0].To.(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewInvalidTypeError("to", "is not a string") |
|
|
|
|
} |
|
|
|
|
args.To = argstr |
|
|
|
|
|
|
|
|
|
t := make([]string, len(obj[0].Topics)) |
|
|
|
|
for i, j := range obj[0].Topics { |
|
|
|
|
argstr, ok := j.(string) |
|
|
|
|
if !ok { |
|
|
|
|
return NewInvalidTypeError("topics["+string(i)+"]", "is not a string") |
|
|
|
|
} |
|
|
|
|
t[i] = argstr |
|
|
|
|
} |
|
|
|
|
args.Topics = t |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type SubmitWorkArgs struct { |
|
|
|
|
Nonce uint64 |
|
|
|
|
Header common.Hash |
|
|
|
|
Digest common.Hash |
|
|
|
|
Header string |
|
|
|
|
Digest string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (args *SubmitWorkArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
@ -777,21 +930,21 @@ func (args *SubmitWorkArgs) UnmarshalJSON(b []byte) (err error) { |
|
|
|
|
var objstr string |
|
|
|
|
var ok bool |
|
|
|
|
if objstr, ok = obj[0].(string); !ok { |
|
|
|
|
return NewDecodeParamError("Nonce is not a string") |
|
|
|
|
return NewInvalidTypeError("nonce", "not a string") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.Nonce = common.String2Big(objstr).Uint64() |
|
|
|
|
if objstr, ok = obj[1].(string); !ok { |
|
|
|
|
return NewDecodeParamError("Header is not a string") |
|
|
|
|
return NewInvalidTypeError("header", "not a string") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.Header = common.HexToHash(objstr) |
|
|
|
|
args.Header = objstr |
|
|
|
|
|
|
|
|
|
if objstr, ok = obj[2].(string); !ok { |
|
|
|
|
return NewDecodeParamError("Digest is not a string") |
|
|
|
|
return NewInvalidTypeError("digest", "not a string") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
args.Digest = common.HexToHash(objstr) |
|
|
|
|
args.Digest = objstr |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|