Fixed filter and refactored code

This commit is contained in:
obscuren 2015-03-26 12:06:14 +01:00
parent 98f970ba59
commit eb433731aa
2 changed files with 29 additions and 24 deletions

View File

@ -4,8 +4,8 @@ import (
"math" "math"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
) )
type AccountChange struct { type AccountChange struct {

View File

@ -3,6 +3,8 @@ package rpc
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"errors"
"fmt"
"math/big" "math/big"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
@ -442,6 +444,26 @@ type BlockFilterArgs struct {
Max int Max int
} }
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 (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) { func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) {
var obj []struct { var obj []struct {
FromBlock interface{} `json:"fromBlock"` FromBlock interface{} `json:"fromBlock"`
@ -460,30 +482,13 @@ func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) {
return NewInsufficientParamsError(len(obj), 1) return NewInsufficientParamsError(len(obj), 1)
} }
fromstr, ok := obj[0].FromBlock.(string) args.Earliest, err = toNumber(obj[0].FromBlock)
if !ok { if err != nil {
return NewDecodeParamError("FromBlock is not a string") return NewDecodeParamError(fmt.Sprintf("FromBlock %v", err))
} }
args.Latest, err = toNumber(obj[0].FromBlock)
switch fromstr { if err != nil {
case "latest": return NewDecodeParamError(fmt.Sprintf("ToBlock %v", err))
args.Earliest = -1
default:
args.Earliest = int64(common.Big(obj[0].FromBlock.(string)).Int64())
}
tostr, ok := obj[0].ToBlock.(string)
if !ok {
return NewDecodeParamError("ToBlock is not a string")
}
switch tostr {
case "latest":
args.Latest = -1
case "pending":
args.Latest = -2
default:
args.Latest = int64(common.Big(obj[0].ToBlock.(string)).Int64())
} }
args.Max = int(common.Big(obj[0].Limit).Int64()) args.Max = int(common.Big(obj[0].Limit).Int64())