rpc: support returning nil pointer big.Ints (null)
This commit is contained in:
parent
1d666cf27e
commit
99483e85b9
@ -62,8 +62,9 @@ func NewPublicEthereumAPI(b Backend) *PublicEthereumAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GasPrice returns a suggestion for a gas price.
|
// GasPrice returns a suggestion for a gas price.
|
||||||
func (s *PublicEthereumAPI) GasPrice(ctx context.Context) (*big.Int, error) {
|
func (s *PublicEthereumAPI) GasPrice(ctx context.Context) (*hexutil.Big, error) {
|
||||||
return s.b.SuggestPrice(ctx)
|
price, err := s.b.SuggestPrice(ctx)
|
||||||
|
return (*hexutil.Big)(price), err
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProtocolVersion returns the current Ethereum protocol version this node supports
|
// ProtocolVersion returns the current Ethereum protocol version this node supports
|
||||||
@ -487,21 +488,20 @@ func NewPublicBlockChainAPI(b Backend) *PublicBlockChainAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BlockNumber returns the block number of the chain head.
|
// BlockNumber returns the block number of the chain head.
|
||||||
func (s *PublicBlockChainAPI) BlockNumber() *big.Int {
|
func (s *PublicBlockChainAPI) BlockNumber() hexutil.Uint64 {
|
||||||
header, _ := s.b.HeaderByNumber(context.Background(), rpc.LatestBlockNumber) // latest header should always be available
|
header, _ := s.b.HeaderByNumber(context.Background(), rpc.LatestBlockNumber) // latest header should always be available
|
||||||
return header.Number
|
return hexutil.Uint64(header.Number.Uint64())
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetBalance returns the amount of wei for the given address in the state of the
|
// GetBalance returns the amount of wei for the given address in the state of the
|
||||||
// given block number. The rpc.LatestBlockNumber and rpc.PendingBlockNumber meta
|
// given block number. The rpc.LatestBlockNumber and rpc.PendingBlockNumber meta
|
||||||
// block numbers are also allowed.
|
// block numbers are also allowed.
|
||||||
func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (*big.Int, error) {
|
func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (*hexutil.Big, error) {
|
||||||
state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr)
|
state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr)
|
||||||
if state == nil || err != nil {
|
if state == nil || err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
b := state.GetBalance(address)
|
return (*hexutil.Big)(state.GetBalance(address)), state.Error()
|
||||||
return b, state.Error()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetBlockByNumber returns the requested block. When blockNr is -1 the chain head is returned. When fullTx is true all
|
// GetBlockByNumber returns the requested block. When blockNr is -1 the chain head is returned. When fullTx is true all
|
||||||
|
@ -320,9 +320,6 @@ func parsePositionalArguments(rawArgs json.RawMessage, types []reflect.Type) ([]
|
|||||||
|
|
||||||
// CreateResponse will create a JSON-RPC success response with the given id and reply as result.
|
// CreateResponse will create a JSON-RPC success response with the given id and reply as result.
|
||||||
func (c *jsonCodec) CreateResponse(id interface{}, reply interface{}) interface{} {
|
func (c *jsonCodec) CreateResponse(id interface{}, reply interface{}) interface{} {
|
||||||
if isHexNum(reflect.TypeOf(reply)) {
|
|
||||||
return &jsonSuccessResponse{Version: jsonrpcVersion, Id: id, Result: fmt.Sprintf(`%#x`, reply)}
|
|
||||||
}
|
|
||||||
return &jsonSuccessResponse{Version: jsonrpcVersion, Id: id, Result: reply}
|
return &jsonSuccessResponse{Version: jsonrpcVersion, Id: id, Result: reply}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,11 +337,6 @@ func (c *jsonCodec) CreateErrorResponseWithInfo(id interface{}, err Error, info
|
|||||||
|
|
||||||
// CreateNotification will create a JSON-RPC notification with the given subscription id and event as params.
|
// CreateNotification will create a JSON-RPC notification with the given subscription id and event as params.
|
||||||
func (c *jsonCodec) CreateNotification(subid, namespace string, event interface{}) interface{} {
|
func (c *jsonCodec) CreateNotification(subid, namespace string, event interface{}) interface{} {
|
||||||
if isHexNum(reflect.TypeOf(event)) {
|
|
||||||
return &jsonNotification{Version: jsonrpcVersion, Method: namespace + notificationMethodSuffix,
|
|
||||||
Params: jsonSubscription{Subscription: subid, Result: fmt.Sprintf(`%#x`, event)}}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &jsonNotification{Version: jsonrpcVersion, Method: namespace + notificationMethodSuffix,
|
return &jsonNotification{Version: jsonrpcVersion, Method: namespace + notificationMethodSuffix,
|
||||||
Params: jsonSubscription{Subscription: subid, Result: event}}
|
Params: jsonSubscription{Subscription: subid, Result: event}}
|
||||||
}
|
}
|
||||||
|
@ -313,7 +313,6 @@ func (s *Server) handle(ctx context.Context, codec ServerCodec, req *serverReque
|
|||||||
if len(reply) == 0 {
|
if len(reply) == 0 {
|
||||||
return codec.CreateResponse(req.id, nil), nil
|
return codec.CreateResponse(req.id, nil), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if req.callb.errPos >= 0 { // test if method returned an error
|
if req.callb.errPos >= 0 { // test if method returned an error
|
||||||
if !reply[req.callb.errPos].IsNil() {
|
if !reply[req.callb.errPos].IsNil() {
|
||||||
e := reply[req.callb.errPos].Interface().(error)
|
e := reply[req.callb.errPos].Interface().(error)
|
||||||
|
15
rpc/utils.go
15
rpc/utils.go
@ -22,7 +22,6 @@ import (
|
|||||||
crand "crypto/rand"
|
crand "crypto/rand"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"math/big"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
@ -105,20 +104,6 @@ func formatName(name string) string {
|
|||||||
return string(ret)
|
return string(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
var bigIntType = reflect.TypeOf((*big.Int)(nil)).Elem()
|
|
||||||
|
|
||||||
// Indication if this type should be serialized in hex
|
|
||||||
func isHexNum(t reflect.Type) bool {
|
|
||||||
if t == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for t.Kind() == reflect.Ptr {
|
|
||||||
t = t.Elem()
|
|
||||||
}
|
|
||||||
|
|
||||||
return t == bigIntType
|
|
||||||
}
|
|
||||||
|
|
||||||
// suitableCallbacks iterates over the methods of the given type. It will determine if a method satisfies the criteria
|
// suitableCallbacks iterates over the methods of the given type. It will determine if a method satisfies the criteria
|
||||||
// for a RPC callback or a subscription callback and adds it to the collection of callbacks or subscriptions. See server
|
// for a RPC callback or a subscription callback and adds it to the collection of callbacks or subscriptions. See server
|
||||||
// documentation for a summary of these criteria.
|
// documentation for a summary of these criteria.
|
||||||
|
Loading…
Reference in New Issue
Block a user