2015-01-20 13:57:51 -06:00
|
|
|
package rpc
|
|
|
|
|
2015-03-04 08:22:59 -06:00
|
|
|
import (
|
2015-03-05 21:37:45 -06:00
|
|
|
"bytes"
|
2015-03-04 08:22:59 -06:00
|
|
|
"encoding/json"
|
2015-03-26 16:42:46 -05:00
|
|
|
// "errors"
|
2015-03-27 09:54:54 -05:00
|
|
|
"fmt"
|
2015-03-04 08:22:59 -06:00
|
|
|
"math/big"
|
2015-02-17 07:19:05 -06:00
|
|
|
|
2015-03-16 05:27:38 -05:00
|
|
|
"github.com/ethereum/go-ethereum/common"
|
2015-03-04 08:22:59 -06:00
|
|
|
)
|
2015-01-20 13:57:51 -06:00
|
|
|
|
2015-03-27 09:54:54 -05:00
|
|
|
const (
|
|
|
|
defaultLogLimit = 100
|
|
|
|
defaultLogOffset = 0
|
|
|
|
)
|
|
|
|
|
2015-03-26 05:59:16 -05:00
|
|
|
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 {
|
2015-03-18 14:42:57 -05:00
|
|
|
// Parse as integer
|
2015-03-18 14:48:34 -05:00
|
|
|
num, ok := raw.(float64)
|
2015-03-18 14:42:57 -05:00
|
|
|
if ok {
|
2015-03-18 14:48:34 -05:00
|
|
|
*number = int64(num)
|
2015-03-18 14:42:57 -05:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Parse as string/hexstring
|
|
|
|
str, ok := raw.(string)
|
|
|
|
if !ok {
|
2015-03-26 16:58:12 -05:00
|
|
|
return NewInvalidTypeError("", "not a number or string")
|
2015-03-10 07:40:49 -05:00
|
|
|
}
|
|
|
|
|
2015-03-10 14:14:38 -05:00
|
|
|
switch str {
|
|
|
|
case "latest":
|
|
|
|
*number = -1
|
|
|
|
case "pending":
|
2015-03-23 10:36:12 -05:00
|
|
|
*number = -2
|
2015-03-10 14:14:38 -05:00
|
|
|
default:
|
2015-03-16 05:27:38 -05:00
|
|
|
*number = common.String2Big(str).Int64()
|
2015-03-10 07:40:49 -05:00
|
|
|
}
|
2015-03-18 14:42:57 -05:00
|
|
|
|
2015-03-10 07:40:49 -05:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-03-26 13:17:25 -05:00
|
|
|
func numString(raw interface{}, number *int64) error {
|
|
|
|
// Parse as integer
|
|
|
|
num, ok := raw.(float64)
|
|
|
|
if ok {
|
|
|
|
*number = int64(num)
|
|
|
|
return 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
|
|
|
|
}
|
|
|
|
|
2015-03-26 16:42:46 -05:00
|
|
|
// 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
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
2015-03-26 16:58:12 -05:00
|
|
|
// 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
|
|
|
|
// }
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
type GetBlockByHashArgs struct {
|
2015-03-26 16:14:31 -05:00
|
|
|
BlockHash string
|
2015-03-19 22:20:54 -05:00
|
|
|
IncludeTxs bool
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
func (args *GetBlockByHashArgs) UnmarshalJSON(b []byte) (err error) {
|
|
|
|
var obj []interface{}
|
|
|
|
r := bytes.NewReader(b)
|
|
|
|
if err := json.NewDecoder(r).Decode(&obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
2015-03-11 10:27:24 -05:00
|
|
|
|
|
|
|
argstr, ok := obj[0].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("blockHash", "not a string")
|
2015-03-11 10:27:24 -05:00
|
|
|
}
|
2015-03-26 16:14:31 -05:00
|
|
|
args.BlockHash = argstr
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
if len(obj) > 1 {
|
2015-03-19 22:20:54 -05:00
|
|
|
args.IncludeTxs = obj[1].(bool)
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
return nil
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
type GetBlockByNumberArgs struct {
|
2015-03-19 22:20:54 -05:00
|
|
|
BlockNumber int64
|
|
|
|
IncludeTxs bool
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
func (args *GetBlockByNumberArgs) UnmarshalJSON(b []byte) (err error) {
|
|
|
|
var obj []interface{}
|
|
|
|
r := bytes.NewReader(b)
|
|
|
|
if err := json.NewDecoder(r).Decode(&obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-02-17 15:20:47 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
2015-03-09 20:38:37 -05:00
|
|
|
|
|
|
|
if v, ok := obj[0].(float64); ok {
|
|
|
|
args.BlockNumber = int64(v)
|
2015-03-26 05:07:14 -05:00
|
|
|
} else if v, ok := obj[0].(string); ok {
|
|
|
|
args.BlockNumber = common.Big(v).Int64()
|
2015-03-09 20:38:37 -05:00
|
|
|
} else {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("blockNumber", "not a number or string")
|
2015-03-09 20:38:37 -05:00
|
|
|
}
|
2015-02-17 15:20:47 -06:00
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
if len(obj) > 1 {
|
2015-03-19 22:20:54 -05:00
|
|
|
args.IncludeTxs = obj[1].(bool)
|
2015-02-17 15:20:47 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
return nil
|
2015-02-17 15:20:47 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
type NewTxArgs struct {
|
2015-03-26 16:35:42 -05:00
|
|
|
From string
|
|
|
|
To string
|
2015-03-05 21:37:45 -06:00
|
|
|
Value *big.Int
|
|
|
|
Gas *big.Int
|
|
|
|
GasPrice *big.Int
|
|
|
|
Data string
|
2015-03-10 07:40:49 -05:00
|
|
|
|
2015-03-10 14:14:38 -05:00
|
|
|
BlockNumber int64
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-18 14:42:57 -05:00
|
|
|
var obj []json.RawMessage
|
2015-03-26 18:07:28 -05:00
|
|
|
var ext struct {
|
|
|
|
From string
|
|
|
|
To string
|
|
|
|
Value interface{}
|
|
|
|
Gas interface{}
|
|
|
|
GasPrice interface{}
|
|
|
|
Data string
|
|
|
|
}
|
2015-03-18 14:42:57 -05:00
|
|
|
|
|
|
|
// Decode byte slice to array of RawMessages
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
2015-03-18 14:42:57 -05:00
|
|
|
// Check for sufficient params
|
|
|
|
if len(obj) < 1 {
|
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Decode 0th RawMessage to temporary struct
|
|
|
|
if err := json.Unmarshal(obj[0], &ext); err != nil {
|
|
|
|
return NewDecodeParamError(err.Error())
|
|
|
|
}
|
|
|
|
|
2015-03-26 04:34:21 -05:00
|
|
|
if len(ext.From) == 0 {
|
|
|
|
return NewValidationError("from", "is required")
|
|
|
|
}
|
|
|
|
|
2015-03-26 16:35:42 -05:00
|
|
|
args.From = ext.From
|
|
|
|
args.To = ext.To
|
2015-03-18 14:42:57 -05:00
|
|
|
args.Data = ext.Data
|
|
|
|
|
2015-03-26 18:07:28 -05:00
|
|
|
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 ext.Gas == nil {
|
|
|
|
return NewValidationError("gas", "is required")
|
|
|
|
} else {
|
|
|
|
if err := numString(ext.Gas, &num); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
args.Gas = big.NewInt(num)
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
2015-03-18 14:42:57 -05:00
|
|
|
// Check for optional BlockNumber param
|
|
|
|
if len(obj) > 1 {
|
2015-03-26 05:59:35 -05:00
|
|
|
if err := blockHeightFromJson(obj[1], &args.BlockNumber); err != nil {
|
2015-03-18 14:42:57 -05:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
2015-03-05 21:37:45 -06:00
|
|
|
|
2015-01-20 13:57:51 -06:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type GetStorageArgs struct {
|
2015-03-26 16:35:42 -05:00
|
|
|
Address string
|
2015-03-06 09:54:08 -06:00
|
|
|
BlockNumber int64
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-18 14:42:57 -05:00
|
|
|
var obj []interface{}
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-01-29 13:39:26 -06:00
|
|
|
}
|
2015-03-05 21:37:45 -06:00
|
|
|
|
2015-03-18 14:42:57 -05:00
|
|
|
if len(obj) < 1 {
|
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
addstr, ok := obj[0].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("address", "not a string")
|
2015-03-18 14:42:57 -05:00
|
|
|
}
|
2015-03-26 16:35:42 -05:00
|
|
|
args.Address = addstr
|
2015-03-18 14:42:57 -05:00
|
|
|
|
|
|
|
if len(obj) > 1 {
|
2015-03-23 10:34:50 -05:00
|
|
|
if err := blockHeight(obj[1], &args.BlockNumber); err != nil {
|
2015-03-18 14:42:57 -05:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
return nil
|
2015-01-29 13:39:26 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 12:26:21 -06:00
|
|
|
type GetStorageAtArgs struct {
|
2015-03-26 16:35:42 -05:00
|
|
|
Address string
|
|
|
|
Key string
|
2015-03-06 09:54:08 -06:00
|
|
|
BlockNumber int64
|
2015-01-29 13:39:26 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-18 14:42:57 -05:00
|
|
|
var obj []interface{}
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
2015-03-18 14:42:57 -05:00
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
if len(obj) < 2 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 2)
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
2015-03-05 21:37:45 -06:00
|
|
|
|
2015-03-18 14:42:57 -05:00
|
|
|
addstr, ok := obj[0].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("address", "not a string")
|
2015-03-18 14:42:57 -05:00
|
|
|
}
|
2015-03-26 16:35:42 -05:00
|
|
|
args.Address = addstr
|
2015-03-18 14:42:57 -05:00
|
|
|
|
|
|
|
keystr, ok := obj[1].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("key", "not a string")
|
2015-03-18 14:42:57 -05:00
|
|
|
}
|
2015-03-26 16:35:42 -05:00
|
|
|
args.Key = keystr
|
2015-03-18 14:42:57 -05:00
|
|
|
|
|
|
|
if len(obj) > 2 {
|
2015-03-23 10:34:50 -05:00
|
|
|
if err := blockHeight(obj[2], &args.BlockNumber); err != nil {
|
2015-03-18 14:42:57 -05:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
2015-03-10 14:14:38 -05:00
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
return nil
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
type GetTxCountArgs struct {
|
2015-03-26 16:35:42 -05:00
|
|
|
Address string
|
2015-03-06 09:54:08 -06:00
|
|
|
BlockNumber int64
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-18 14:42:57 -05:00
|
|
|
var obj []interface{}
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
2015-03-18 14:42:57 -05:00
|
|
|
if len(obj) < 1 {
|
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
addstr, ok := obj[0].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("address", "not a string")
|
2015-03-18 14:42:57 -05:00
|
|
|
}
|
2015-03-26 16:35:42 -05:00
|
|
|
args.Address = addstr
|
2015-03-18 14:42:57 -05:00
|
|
|
|
|
|
|
if len(obj) > 1 {
|
2015-03-23 10:34:50 -05:00
|
|
|
if err := blockHeight(obj[1], &args.BlockNumber); err != nil {
|
2015-03-18 14:42:57 -05:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
return nil
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
type GetBalanceArgs struct {
|
2015-03-26 16:35:42 -05:00
|
|
|
Address string
|
2015-03-06 09:54:08 -06:00
|
|
|
BlockNumber int64
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-12 08:42:31 -05:00
|
|
|
var obj []interface{}
|
2015-03-18 14:42:57 -05:00
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-12 08:42:31 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-12 08:42:31 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
addstr, ok := obj[0].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("address", "not a string")
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
2015-03-26 16:35:42 -05:00
|
|
|
args.Address = addstr
|
2015-03-12 08:42:31 -05:00
|
|
|
|
|
|
|
if len(obj) > 1 {
|
2015-03-23 10:34:50 -05:00
|
|
|
if err := blockHeight(obj[1], &args.BlockNumber); err != nil {
|
2015-03-18 14:42:57 -05:00
|
|
|
return err
|
2015-03-12 08:42:31 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
return nil
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
type GetDataArgs struct {
|
2015-03-26 16:35:42 -05:00
|
|
|
Address string
|
2015-03-06 09:54:08 -06:00
|
|
|
BlockNumber int64
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-18 14:42:57 -05:00
|
|
|
var obj []interface{}
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
2015-03-18 14:42:57 -05:00
|
|
|
if len(obj) < 1 {
|
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
addstr, ok := obj[0].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("address", "not a string")
|
2015-03-18 14:42:57 -05:00
|
|
|
}
|
2015-03-26 16:35:42 -05:00
|
|
|
args.Address = addstr
|
2015-03-18 14:42:57 -05:00
|
|
|
|
|
|
|
if len(obj) > 1 {
|
2015-03-23 10:34:50 -05:00
|
|
|
if err := blockHeight(obj[1], &args.BlockNumber); err != nil {
|
2015-03-18 14:42:57 -05:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
return nil
|
2015-01-20 13:57:51 -06:00
|
|
|
}
|
|
|
|
|
2015-03-10 22:25:07 -05:00
|
|
|
type BlockNumIndexArgs struct {
|
|
|
|
BlockNumber int64
|
2015-03-11 10:25:15 -05:00
|
|
|
Index int64
|
2015-03-10 22:25:07 -05:00
|
|
|
}
|
|
|
|
|
2015-03-11 15:26:28 -05:00
|
|
|
func (args *BlockNumIndexArgs) UnmarshalJSON(b []byte) (err error) {
|
|
|
|
var obj []interface{}
|
|
|
|
r := bytes.NewReader(b)
|
|
|
|
if err := json.NewDecoder(r).Decode(&obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-11 15:26:28 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-11 15:26:28 -05:00
|
|
|
}
|
|
|
|
|
2015-03-26 07:57:41 -05:00
|
|
|
if err := blockHeight(obj[0], &args.BlockNumber); err != nil {
|
|
|
|
return err
|
2015-03-11 15:26:28 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) > 1 {
|
|
|
|
arg1, ok := obj[1].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("index", "not a string")
|
2015-03-11 15:26:28 -05:00
|
|
|
}
|
2015-03-16 05:27:38 -05:00
|
|
|
args.Index = common.Big(arg1).Int64()
|
2015-03-11 15:26:28 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-03-10 22:25:07 -05:00
|
|
|
type HashIndexArgs struct {
|
2015-03-26 16:14:31 -05:00
|
|
|
Hash string
|
2015-03-12 09:59:07 -05:00
|
|
|
Index int64
|
2015-03-10 22:25:07 -05:00
|
|
|
}
|
|
|
|
|
2015-03-11 15:26:28 -05:00
|
|
|
func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) {
|
|
|
|
var obj []interface{}
|
|
|
|
r := bytes.NewReader(b)
|
|
|
|
if err := json.NewDecoder(r).Decode(&obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-11 15:26:28 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-11 15:26:28 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
arg0, ok := obj[0].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("hash", "not a string")
|
2015-03-11 15:26:28 -05:00
|
|
|
}
|
2015-03-26 16:14:31 -05:00
|
|
|
args.Hash = arg0
|
2015-03-11 15:26:28 -05:00
|
|
|
|
|
|
|
if len(obj) > 1 {
|
|
|
|
arg1, ok := obj[1].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("index", "not a string")
|
2015-03-11 15:26:28 -05:00
|
|
|
}
|
2015-03-16 05:27:38 -05:00
|
|
|
args.Index = common.Big(arg1).Int64()
|
2015-03-11 15:26:28 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-01-28 17:24:00 -06:00
|
|
|
type Sha3Args struct {
|
|
|
|
Data string
|
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
func (args *Sha3Args) UnmarshalJSON(b []byte) (err error) {
|
|
|
|
var obj []interface{}
|
|
|
|
r := bytes.NewReader(b)
|
|
|
|
if err := json.NewDecoder(r).Decode(&obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
2015-03-26 10:19:33 -05:00
|
|
|
argstr, ok := obj[0].(string)
|
|
|
|
if !ok {
|
|
|
|
return NewInvalidTypeError("data", "is not a string")
|
|
|
|
}
|
|
|
|
args.Data = argstr
|
2015-03-05 21:37:45 -06:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-03-19 22:55:17 -05:00
|
|
|
type BlockFilterArgs struct {
|
2015-01-29 09:52:00 -06:00
|
|
|
Earliest int64
|
|
|
|
Latest int64
|
2015-03-27 09:54:54 -05:00
|
|
|
Address []string
|
|
|
|
Topics [][]string
|
2015-01-29 09:52:00 -06:00
|
|
|
Skip int
|
|
|
|
Max int
|
|
|
|
}
|
|
|
|
|
2015-03-19 22:55:17 -05:00
|
|
|
func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-05 21:37:45 -06:00
|
|
|
var obj []struct {
|
2015-03-27 09:54:54 -05:00
|
|
|
FromBlock interface{} `json:"fromBlock"`
|
|
|
|
ToBlock interface{} `json:"toBlock"`
|
|
|
|
Limit interface{} `json:"limit"`
|
|
|
|
Offset interface{} `json:"offset"`
|
|
|
|
Address interface{} `json:"address"`
|
|
|
|
Topics interface{} `json:"topics"`
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if err = json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
2015-03-12 19:07:03 -05:00
|
|
|
|
2015-03-26 16:42:46 -05:00
|
|
|
// 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))
|
|
|
|
|
2015-03-26 11:27:29 -05:00
|
|
|
var num int64
|
2015-03-27 09:54:54 -05:00
|
|
|
|
|
|
|
// if blank then latest
|
|
|
|
if obj[0].FromBlock == nil {
|
|
|
|
num = -1
|
|
|
|
} else {
|
|
|
|
if err := blockHeight(obj[0].FromBlock, &num); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2015-03-26 11:27:29 -05:00
|
|
|
}
|
2015-03-27 09:54:54 -05:00
|
|
|
// if -2 or other "silly" number, use latest
|
2015-03-26 11:27:29 -05:00
|
|
|
if num < 0 {
|
|
|
|
args.Earliest = -1 //latest block
|
|
|
|
} else {
|
|
|
|
args.Earliest = num
|
2015-03-16 14:30:31 -05:00
|
|
|
}
|
|
|
|
|
2015-03-27 09:54:54 -05:00
|
|
|
// if blank than latest
|
|
|
|
if obj[0].ToBlock == nil {
|
|
|
|
num = -1
|
|
|
|
} else {
|
|
|
|
if err := blockHeight(obj[0].ToBlock, &num); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2015-03-16 09:38:57 -05:00
|
|
|
}
|
2015-03-26 11:27:29 -05:00
|
|
|
args.Latest = num
|
2015-03-16 09:38:57 -05:00
|
|
|
|
2015-03-27 09:54:54 -05:00
|
|
|
if obj[0].Limit == nil {
|
|
|
|
num = defaultLogLimit
|
|
|
|
} else {
|
|
|
|
if err := numString(obj[0].Limit, &num); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2015-03-16 14:30:31 -05:00
|
|
|
}
|
2015-03-26 13:17:25 -05:00
|
|
|
args.Max = int(num)
|
2015-03-16 14:30:31 -05:00
|
|
|
|
2015-03-27 09:54:54 -05:00
|
|
|
if obj[0].Offset == nil {
|
|
|
|
num = defaultLogOffset
|
|
|
|
} else {
|
|
|
|
if err := numString(obj[0].Offset, &num); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2015-03-16 09:38:57 -05:00
|
|
|
}
|
2015-03-26 13:17:25 -05:00
|
|
|
args.Skip = int(num)
|
2015-03-16 09:38:57 -05:00
|
|
|
|
2015-03-27 09:54:54 -05:00
|
|
|
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")
|
|
|
|
}
|
|
|
|
}
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-01-29 13:39:26 -06:00
|
|
|
type DbArgs struct {
|
|
|
|
Database string
|
|
|
|
Key string
|
2015-03-23 10:04:21 -05:00
|
|
|
Value []byte
|
2015-01-29 13:39:26 -06:00
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
func (args *DbArgs) UnmarshalJSON(b []byte) (err error) {
|
|
|
|
var obj []interface{}
|
2015-03-23 10:04:21 -05:00
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 2 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 2)
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
2015-03-23 10:04:21 -05:00
|
|
|
|
|
|
|
var objstr string
|
|
|
|
var ok bool
|
|
|
|
|
|
|
|
if objstr, ok = obj[0].(string); !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("database", "not a string")
|
2015-03-23 10:04:21 -05:00
|
|
|
}
|
|
|
|
args.Database = objstr
|
|
|
|
|
|
|
|
if objstr, ok = obj[1].(string); !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("key", "not a string")
|
2015-03-23 10:04:21 -05:00
|
|
|
}
|
|
|
|
args.Key = objstr
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
if len(obj) > 2 {
|
2015-03-23 10:04:21 -05:00
|
|
|
objstr, ok = obj[2].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("value", "not a string")
|
2015-03-23 10:04:21 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
args.Value = []byte(objstr)
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-01-29 13:39:26 -06:00
|
|
|
func (a *DbArgs) requirements() error {
|
|
|
|
if len(a.Database) == 0 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewValidationError("Database", "cannot be blank")
|
2015-01-29 13:39:26 -06:00
|
|
|
}
|
|
|
|
if len(a.Key) == 0 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewValidationError("Key", "cannot be blank")
|
2015-01-29 13:39:26 -06:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
2015-01-30 06:25:12 -06:00
|
|
|
|
2015-03-23 10:04:21 -05:00
|
|
|
type DbHexArgs struct {
|
|
|
|
Database string
|
|
|
|
Key string
|
|
|
|
Value []byte
|
|
|
|
}
|
|
|
|
|
|
|
|
func (args *DbHexArgs) UnmarshalJSON(b []byte) (err error) {
|
|
|
|
var obj []interface{}
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
|
|
|
return NewDecodeParamError(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 2 {
|
|
|
|
return NewInsufficientParamsError(len(obj), 2)
|
|
|
|
}
|
|
|
|
|
|
|
|
var objstr string
|
|
|
|
var ok bool
|
|
|
|
|
|
|
|
if objstr, ok = obj[0].(string); !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("database", "not a string")
|
2015-03-23 10:04:21 -05:00
|
|
|
}
|
|
|
|
args.Database = objstr
|
|
|
|
|
|
|
|
if objstr, ok = obj[1].(string); !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("key", "not a string")
|
2015-03-23 10:04:21 -05:00
|
|
|
}
|
|
|
|
args.Key = objstr
|
|
|
|
|
|
|
|
if len(obj) > 2 {
|
|
|
|
objstr, ok = obj[2].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("value", "not a string")
|
2015-03-23 10:04:21 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
args.Value = common.FromHex(objstr)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *DbHexArgs) requirements() error {
|
|
|
|
if len(a.Database) == 0 {
|
2015-03-26 13:39:40 -05:00
|
|
|
return NewValidationError("Database", "cannot be blank")
|
2015-03-23 10:04:21 -05:00
|
|
|
}
|
|
|
|
if len(a.Key) == 0 {
|
2015-03-26 13:39:40 -05:00
|
|
|
return NewValidationError("Key", "cannot be blank")
|
2015-03-23 10:04:21 -05:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-01-30 06:25:12 -06:00
|
|
|
type WhisperMessageArgs struct {
|
|
|
|
Payload string
|
|
|
|
To string
|
|
|
|
From string
|
2015-03-11 10:56:44 -05:00
|
|
|
Topics []string
|
2015-01-30 06:25:12 -06:00
|
|
|
Priority uint32
|
|
|
|
Ttl uint32
|
|
|
|
}
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
func (args *WhisperMessageArgs) UnmarshalJSON(b []byte) (err error) {
|
|
|
|
var obj []struct {
|
|
|
|
Payload string
|
|
|
|
To string
|
|
|
|
From string
|
2015-03-11 10:56:44 -05:00
|
|
|
Topics []string
|
2015-03-26 15:07:50 -05:00
|
|
|
Priority interface{}
|
|
|
|
Ttl interface{}
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if err = json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
args.Payload = obj[0].Payload
|
|
|
|
args.To = obj[0].To
|
|
|
|
args.From = obj[0].From
|
2015-03-11 10:56:44 -05:00
|
|
|
args.Topics = obj[0].Topics
|
2015-03-26 15:07:50 -05:00
|
|
|
|
|
|
|
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)
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type CompileArgs struct {
|
|
|
|
Source string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (args *CompileArgs) UnmarshalJSON(b []byte) (err error) {
|
|
|
|
var obj []interface{}
|
2015-03-26 14:31:00 -05:00
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
2015-03-26 14:31:00 -05:00
|
|
|
if len(obj) < 1 {
|
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
|
|
|
}
|
|
|
|
argstr, ok := obj[0].(string)
|
|
|
|
if !ok {
|
|
|
|
return NewInvalidTypeError("arg0", "is not a string")
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
2015-03-26 14:31:00 -05:00
|
|
|
args.Source = argstr
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type FilterStringArgs struct {
|
|
|
|
Word string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (args *FilterStringArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-13 09:03:19 -05:00
|
|
|
var obj []interface{}
|
2015-03-05 21:37:45 -06:00
|
|
|
r := bytes.NewReader(b)
|
|
|
|
if err := json.NewDecoder(r).Decode(&obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
2015-03-13 09:03:19 -05:00
|
|
|
var argstr string
|
|
|
|
argstr, ok := obj[0].(string)
|
|
|
|
if !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("filter", "not a string")
|
2015-03-13 09:03:19 -05:00
|
|
|
}
|
2015-03-26 14:04:03 -05:00
|
|
|
switch argstr {
|
2015-03-19 21:58:07 -05:00
|
|
|
case "latest", "pending":
|
|
|
|
break
|
|
|
|
default:
|
|
|
|
return NewValidationError("Word", "Must be `latest` or `pending`")
|
|
|
|
}
|
2015-03-26 14:04:03 -05:00
|
|
|
args.Word = argstr
|
2015-03-19 21:58:07 -05:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-03-05 21:37:45 -06:00
|
|
|
type FilterIdArgs struct {
|
|
|
|
Id int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (args *FilterIdArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-26 14:10:31 -05:00
|
|
|
var obj []interface{}
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
2015-03-26 14:10:31 -05:00
|
|
|
var num int64
|
|
|
|
if err := numString(obj[0], &num); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
args.Id = int(num)
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type WhisperIdentityArgs struct {
|
|
|
|
Identity string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-26 14:20:43 -05:00
|
|
|
var obj []interface{}
|
|
|
|
if err := json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
2015-03-26 14:20:43 -05:00
|
|
|
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
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type WhisperFilterArgs struct {
|
2015-03-06 09:54:08 -06:00
|
|
|
To string `json:"to"`
|
2015-03-05 21:37:45 -06:00
|
|
|
From string
|
|
|
|
Topics []string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) {
|
2015-03-06 09:54:08 -06:00
|
|
|
var obj []struct {
|
2015-03-26 14:52:09 -05:00
|
|
|
To interface{}
|
|
|
|
Topics []interface{}
|
2015-03-06 09:54:08 -06:00
|
|
|
}
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
if err = json.Unmarshal(b, &obj); err != nil {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewDecodeParamError(err.Error())
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 1 {
|
2015-03-12 19:07:03 -05:00
|
|
|
return NewInsufficientParamsError(len(obj), 1)
|
2015-03-05 21:37:45 -06:00
|
|
|
}
|
|
|
|
|
2015-03-26 14:52:09 -05:00
|
|
|
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
|
2015-03-05 21:37:45 -06:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
2015-03-23 02:28:54 -05:00
|
|
|
|
|
|
|
type SubmitWorkArgs struct {
|
|
|
|
Nonce uint64
|
2015-03-26 16:35:42 -05:00
|
|
|
Header string
|
|
|
|
Digest string
|
2015-03-23 02:28:54 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func (args *SubmitWorkArgs) UnmarshalJSON(b []byte) (err error) {
|
|
|
|
var obj []interface{}
|
|
|
|
if err = json.Unmarshal(b, &obj); err != nil {
|
|
|
|
return NewDecodeParamError(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(obj) < 3 {
|
|
|
|
return NewInsufficientParamsError(len(obj), 3)
|
|
|
|
}
|
|
|
|
|
|
|
|
var objstr string
|
|
|
|
var ok bool
|
|
|
|
if objstr, ok = obj[0].(string); !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("nonce", "not a string")
|
2015-03-23 02:28:54 -05:00
|
|
|
}
|
|
|
|
|
2015-03-23 11:33:01 -05:00
|
|
|
args.Nonce = common.String2Big(objstr).Uint64()
|
2015-03-23 02:28:54 -05:00
|
|
|
if objstr, ok = obj[1].(string); !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("header", "not a string")
|
2015-03-23 02:28:54 -05:00
|
|
|
}
|
|
|
|
|
2015-03-26 16:35:42 -05:00
|
|
|
args.Header = objstr
|
2015-03-23 02:28:54 -05:00
|
|
|
|
|
|
|
if objstr, ok = obj[2].(string); !ok {
|
2015-03-26 07:45:06 -05:00
|
|
|
return NewInvalidTypeError("digest", "not a string")
|
2015-03-23 02:28:54 -05:00
|
|
|
}
|
|
|
|
|
2015-03-26 16:35:42 -05:00
|
|
|
args.Digest = objstr
|
2015-03-23 02:28:54 -05:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|