op-geth/rpc/args.go

753 lines
15 KiB
Go
Raw Normal View History

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