aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/args.go
diff options
context:
space:
mode:
Diffstat (limited to 'rpc/args.go')
-rw-r--r--rpc/args.go539
1 files changed, 388 insertions, 151 deletions
diff --git a/rpc/args.go b/rpc/args.go
index ec3359a4a..d4d807060 100644
--- a/rpc/args.go
+++ b/rpc/args.go
@@ -1,247 +1,331 @@
package rpc
-import "encoding/json"
+import (
+ "bytes"
+ "encoding/json"
+ "math/big"
-import "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/ethutil"
+)
-type GetBlockArgs struct {
- BlockNumber int32
- Hash string
-}
-
-func (obj *GetBlockArgs) UnmarshalJSON(b []byte) (err error) {
- argint, argstr := int32(0), ""
- if err = json.Unmarshal(b, &argint); err == nil {
- obj.BlockNumber = argint
- return
+func blockNumber(raw json.RawMessage, number *int64) (err error) {
+ var str string
+ if err = json.Unmarshal(raw, &str); err != nil {
+ return errDecodeArgs
}
- if err = json.Unmarshal(b, &argstr); err == nil {
- obj.Hash = argstr
- return
+
+ switch str {
+ case "latest":
+ *number = -1
+ case "pending":
+ *number = 0
+ default:
+ *number = ethutil.String2Big(str).Int64()
}
- return errDecodeArgs
+ return nil
}
-type NewTxArgs struct {
- From string `json:"from"`
- Pass string `json:"pass"`
- To string `json:"to"`
- Value string `json:"value"`
- Gas string `json:"gas"`
- GasPrice string `json:"gasPrice"`
- Data string `json:"data"`
-}
-
-func (obj *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
- // Data can be either specified as "data" or "code" :-/
- var ext struct {
- From string
- To string
- Value string
- Gas string
- GasPrice string
- Data string
- Code string
+type GetBlockByHashArgs struct {
+ BlockHash string
+ Transactions bool
+}
+
+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 errDecodeArgs
+ }
+
+ if len(obj) < 1 {
+ return errArguments
}
- if err = json.Unmarshal(b, &ext); err == nil {
- if len(ext.Data) == 0 {
- ext.Data = ext.Code
- }
- obj.From = ext.From
- obj.To = ext.To
- obj.Value = ext.Value
- obj.Gas = ext.Gas
- obj.GasPrice = ext.GasPrice
- obj.Data = ext.Data
+ argstr, ok := obj[0].(string)
+ if !ok {
+ return errDecodeArgs
+ }
+ args.BlockHash = argstr
- return
+ if len(obj) > 1 {
+ args.Transactions = obj[1].(bool)
}
- return errDecodeArgs
+ return nil
}
-type PushTxArgs struct {
- Tx string `json:"tx"`
+type GetBlockByNumberArgs struct {
+ BlockNumber int64
+ Transactions bool
}
-func (obj *PushTxArgs) UnmarshalJSON(b []byte) (err error) {
- arg0 := ""
- if err = json.Unmarshal(b, &arg0); err == nil {
- obj.Tx = arg0
- return
+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 errDecodeArgs
+ }
+
+ if len(obj) < 1 {
+ return errArguments
}
- return errDecodeArgs
+
+ if v, ok := obj[0].(float64); ok {
+ args.BlockNumber = int64(v)
+ } else {
+ args.BlockNumber = ethutil.Big(obj[0].(string)).Int64()
+ }
+
+ if len(obj) > 1 {
+ args.Transactions = obj[1].(bool)
+ }
+
+ return nil
+}
+
+type NewTxArgs struct {
+ From string
+ To string
+ Value *big.Int
+ Gas *big.Int
+ GasPrice *big.Int
+ Data string
+
+ BlockNumber int64
}
-func (a *PushTxArgs) requirementsPushTx() error {
- if a.Tx == "" {
- return NewErrorWithMessage(errArguments, "PushTx requires a 'tx' as argument")
+func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
+ var obj struct{ From, To, Value, Gas, GasPrice, Data string }
+ if err = UnmarshalRawMessages(b, &obj, &args.BlockNumber); err != nil {
+ return err
}
+
+ args.From = obj.From
+ args.To = obj.To
+ args.Value = ethutil.Big(obj.Value)
+ args.Gas = ethutil.Big(obj.Gas)
+ args.GasPrice = ethutil.Big(obj.GasPrice)
+ args.Data = obj.Data
+
return nil
}
type GetStorageArgs struct {
- Address string
+ Address string
+ BlockNumber int64
}
-func (obj *GetStorageArgs) UnmarshalJSON(b []byte) (err error) {
- if err = json.Unmarshal(b, &obj.Address); err != nil {
+func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) {
+ if err = UnmarshalRawMessages(b, &args.Address, &args.BlockNumber); err != nil {
return errDecodeArgs
}
- return
+
+ return nil
}
-func (a *GetStorageArgs) requirements() error {
- if len(a.Address) == 0 {
- return NewErrorWithMessage(errArguments, "GetStorageAt requires an 'address' value as argument")
+func (args *GetStorageArgs) requirements() error {
+ if len(args.Address) == 0 {
+ return NewErrorWithMessage(errArguments, "Address cannot be blank")
}
return nil
}
-type GetStateArgs struct {
- Address string
- Key string
+type GetStorageAtArgs struct {
+ Address string
+ Key string
+ BlockNumber int64
}
-func (obj *GetStateArgs) UnmarshalJSON(b []byte) (err error) {
- arg0 := ""
- if err = json.Unmarshal(b, &arg0); err == nil {
- obj.Address = arg0
- return
+func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) {
+ var obj []string
+ if err = UnmarshalRawMessages(b, &obj, &args.BlockNumber); err != nil {
+ return errDecodeArgs
+ }
+ if len(obj) < 2 {
+ return errDecodeArgs
}
- return errDecodeArgs
+
+ args.Address = obj[0]
+ args.Key = obj[1]
+
+ return nil
}
-func (a *GetStateArgs) requirements() error {
- if a.Address == "" {
- return NewErrorWithMessage(errArguments, "GetStorageAt requires an 'address' value as argument")
+func (args *GetStorageAtArgs) requirements() error {
+ if len(args.Address) == 0 {
+ return NewErrorWithMessage(errArguments, "Address cannot be blank")
}
- if a.Key == "" {
- return NewErrorWithMessage(errArguments, "GetStorageAt requires an 'key' value as argument")
+
+ if len(args.Key) == 0 {
+ return NewErrorWithMessage(errArguments, "Key cannot be blank")
}
return nil
}
type GetTxCountArgs struct {
- Address string `json:"address"`
+ Address string
+ BlockNumber int64
}
-func (obj *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) {
- arg0 := ""
- if err = json.Unmarshal(b, &arg0); err == nil {
- obj.Address = arg0
- return
+func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) {
+ if err = UnmarshalRawMessages(b, &args.Address, &args.BlockNumber); err != nil {
+ return errDecodeArgs
}
- return errDecodeArgs
+
+ return nil
}
-func (a *GetTxCountArgs) requirements() error {
- if a.Address == "" {
- return NewErrorWithMessage(errArguments, "GetTxCountAt requires an 'address' value as argument")
+func (args *GetTxCountArgs) requirements() error {
+ if len(args.Address) == 0 {
+ return NewErrorWithMessage(errArguments, "Address cannot be blank")
}
return nil
}
type GetBalanceArgs struct {
- Address string
+ Address string
+ BlockNumber int64
}
-func (obj *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) {
- arg0 := ""
- if err = json.Unmarshal(b, &arg0); err == nil {
- obj.Address = arg0
- return
+func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) {
+ if err = UnmarshalRawMessages(b, &args.Address, &args.BlockNumber); err != nil {
+ return errDecodeArgs
}
- return errDecodeArgs
+
+ return nil
}
-func (a *GetBalanceArgs) requirements() error {
- if a.Address == "" {
- return NewErrorWithMessage(errArguments, "GetBalanceAt requires an 'address' value as argument")
+func (args *GetBalanceArgs) requirements() error {
+ if len(args.Address) == 0 {
+ return NewErrorWithMessage(errArguments, "Address cannot be blank")
}
return nil
}
-type GetCodeAtArgs struct {
- Address string
+type GetDataArgs struct {
+ Address string
+ BlockNumber int64
}
-func (obj *GetCodeAtArgs) UnmarshalJSON(b []byte) (err error) {
- arg0 := ""
- if err = json.Unmarshal(b, &arg0); err == nil {
- obj.Address = arg0
- return
+func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) {
+ if err = UnmarshalRawMessages(b, &args.Address, &args.BlockNumber); err != nil {
+ return errDecodeArgs
}
- return errDecodeArgs
+
+ return nil
}
-func (a *GetCodeAtArgs) requirements() error {
- if a.Address == "" {
- return NewErrorWithMessage(errArguments, "GetCodeAt requires an 'address' value as argument")
+func (args *GetDataArgs) requirements() error {
+ if len(args.Address) == 0 {
+ return NewErrorWithMessage(errArguments, "Address cannot be blank")
}
return nil
}
+type BlockNumIndexArgs struct {
+ BlockNumber int64
+ Index int64
+}
+
+type HashIndexArgs struct {
+ BlockHash string
+ Index int64
+}
+
type Sha3Args struct {
Data string
}
-func (obj *Sha3Args) UnmarshalJSON(b []byte) (err error) {
- if err = json.Unmarshal(b, &obj.Data); err != nil {
- return errDecodeArgs
+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 NewErrorWithMessage(errDecodeArgs, err.Error())
}
- return
+
+ if len(obj) < 1 {
+ return errArguments
+ }
+ args.Data = obj[0].(string)
+
+ 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(ethutil.Big(obj[0].FromBlock).Int64())
+// args.ToBlock = uint64(ethutil.Big(obj[0].ToBlock).Int64())
+// args.Limit = uint64(ethutil.Big(obj[0].Limit).Int64())
+// args.Offset = uint64(ethutil.Big(obj[0].Offset).Int64())
+// args.Address = obj[0].Address
+// args.Topics = obj[0].Topics
+
+// return nil
+// }
+
type FilterOptions struct {
Earliest int64
Latest int64
Address interface{}
- Topic []interface{}
+ Topics []interface{}
Skip int
Max int
}
-func toFilterOptions(options *FilterOptions) core.FilterOptions {
- var opts core.FilterOptions
-
- // Convert optional address slice/string to byte slice
- if str, ok := options.Address.(string); ok {
- opts.Address = [][]byte{fromHex(str)}
- } else if slice, ok := options.Address.([]interface{}); ok {
- bslice := make([][]byte, len(slice))
- for i, addr := range slice {
- if saddr, ok := addr.(string); ok {
- bslice[i] = fromHex(saddr)
- }
- }
- opts.Address = bslice
+func (args *FilterOptions) 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 []interface{} `json:"topics"`
}
- opts.Earliest = options.Earliest
- opts.Latest = options.Latest
+ if err = json.Unmarshal(b, &obj); err != nil {
+ return errDecodeArgs
+ }
- topics := make([][][]byte, len(options.Topic))
- for i, topicDat := range options.Topic {
- if slice, ok := topicDat.([]interface{}); ok {
- topics[i] = make([][]byte, len(slice))
- for j, topic := range slice {
- topics[i][j] = fromHex(topic.(string))
- }
- } else if str, ok := topicDat.(string); ok {
- topics[i] = make([][]byte, 1)
- topics[i][0] = fromHex(str)
- }
+ if len(obj) < 1 {
+ return errArguments
}
- opts.Topics = topics
+ args.Earliest = int64(ethutil.Big(obj[0].FromBlock).Int64())
+ args.Latest = int64(ethutil.Big(obj[0].ToBlock).Int64())
+ args.Max = int(ethutil.Big(obj[0].Limit).Int64())
+ args.Skip = int(ethutil.Big(obj[0].Offset).Int64())
+ args.Address = obj[0].Address
+ args.Topics = obj[0].Topics
- return opts
+ return nil
}
-type FilterChangedArgs struct {
- n int
-}
+// type FilterChangedArgs struct {
+// n int
+// }
type DbArgs struct {
Database string
@@ -249,12 +333,32 @@ type DbArgs struct {
Value string
}
+func (args *DbArgs) 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) < 2 {
+ return errArguments
+ }
+ args.Database = obj[0].(string)
+ args.Key = obj[1].(string)
+
+ if len(obj) > 2 {
+ args.Value = obj[2].(string)
+ }
+
+ return nil
+}
+
func (a *DbArgs) requirements() error {
if len(a.Database) == 0 {
- return NewErrorWithMessage(errArguments, "DbPutArgs requires an 'Database' value as argument")
+ return NewErrorWithMessage(errArguments, "Database cannot be blank")
}
if len(a.Key) == 0 {
- return NewErrorWithMessage(errArguments, "DbPutArgs requires an 'Key' value as argument")
+ return NewErrorWithMessage(errArguments, "Key cannot be blank")
}
return nil
}
@@ -263,7 +367,140 @@ type WhisperMessageArgs struct {
Payload string
To string
From string
- Topic []string
+ Topics []string
Priority uint32
Ttl uint32
}
+
+func (args *WhisperMessageArgs) UnmarshalJSON(b []byte) (err error) {
+ var obj []struct {
+ Payload string
+ To string
+ From string
+ Topics []string
+ Priority string
+ Ttl string
+ }
+
+ if err = json.Unmarshal(b, &obj); err != nil {
+ return errDecodeArgs
+ }
+
+ if len(obj) < 1 {
+ return errArguments
+ }
+ args.Payload = obj[0].Payload
+ args.To = obj[0].To
+ args.From = obj[0].From
+ args.Topics = obj[0].Topics
+ args.Priority = uint32(ethutil.Big(obj[0].Priority).Int64())
+ args.Ttl = uint32(ethutil.Big(obj[0].Ttl).Int64())
+
+ 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 errDecodeArgs
+ }
+
+ if len(obj) > 0 {
+ args.Source = obj[0].(string)
+ }
+
+ return nil
+}
+
+type FilterStringArgs struct {
+ Word string
+}
+
+func (args *FilterStringArgs) UnmarshalJSON(b []byte) (err error) {
+ var obj []string
+ r := bytes.NewReader(b)
+ if err := json.NewDecoder(r).Decode(&obj); err != nil {
+ return errDecodeArgs
+ }
+
+ if len(obj) < 1 {
+ return errDecodeArgs
+ }
+
+ args.Word = obj[0]
+
+ return nil
+}
+
+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 errDecodeArgs
+ }
+
+ if len(obj) < 1 {
+ return errDecodeArgs
+ }
+
+ args.Id = int(ethutil.Big(obj[0]).Int64())
+
+ 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 errDecodeArgs
+ }
+
+ if len(obj) < 1 {
+ return errDecodeArgs
+ }
+
+ args.Identity = obj[0]
+
+ return nil
+}
+
+type WhisperFilterArgs struct {
+ To string `json:"to"`
+ From string
+ Topics []string
+}
+
+func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) {
+ var obj []struct {
+ To string
+ From string
+ Topics []string
+ }
+
+ if err = json.Unmarshal(b, &obj); err != nil {
+ return errDecodeArgs
+ }
+
+ if len(obj) < 1 {
+ return errArguments
+ }
+
+ args.To = obj[0].To
+ args.From = obj[0].From
+ args.Topics = obj[0].Topics
+
+ return nil
+}