@ -81,6 +81,8 @@ func (ec *Client) getBlock(ctx context.Context, method string, args ...interface
err := ec . c . CallContext ( ctx , & raw , method , args ... )
err := ec . c . CallContext ( ctx , & raw , method , args ... )
if err != nil {
if err != nil {
return nil , err
return nil , err
} else if len ( raw ) == 0 {
return nil , ethereum . NotFound
}
}
// Decode header and transactions.
// Decode header and transactions.
var head * types . Header
var head * types . Header
@ -135,6 +137,9 @@ func (ec *Client) getBlock(ctx context.Context, method string, args ...interface
func ( ec * Client ) HeaderByHash ( ctx context . Context , hash common . Hash ) ( * types . Header , error ) {
func ( ec * Client ) HeaderByHash ( ctx context . Context , hash common . Hash ) ( * types . Header , error ) {
var head * types . Header
var head * types . Header
err := ec . c . CallContext ( ctx , & head , "eth_getBlockByHash" , hash , false )
err := ec . c . CallContext ( ctx , & head , "eth_getBlockByHash" , hash , false )
if err == nil && head == nil {
err = ethereum . NotFound
}
return head , err
return head , err
}
}
@ -143,19 +148,31 @@ func (ec *Client) HeaderByHash(ctx context.Context, hash common.Hash) (*types.He
func ( ec * Client ) HeaderByNumber ( ctx context . Context , number * big . Int ) ( * types . Header , error ) {
func ( ec * Client ) HeaderByNumber ( ctx context . Context , number * big . Int ) ( * types . Header , error ) {
var head * types . Header
var head * types . Header
err := ec . c . CallContext ( ctx , & head , "eth_getBlockByNumber" , toBlockNumArg ( number ) , false )
err := ec . c . CallContext ( ctx , & head , "eth_getBlockByNumber" , toBlockNumArg ( number ) , false )
if err == nil && head == nil {
err = ethereum . NotFound
}
return head , err
return head , err
}
}
// TransactionByHash returns the transaction with the given hash.
// TransactionByHash returns the transaction with the given hash.
func ( ec * Client ) TransactionByHash ( ctx context . Context , hash common . Hash ) ( * types . Transaction , error ) {
func ( ec * Client ) TransactionByHash ( ctx context . Context , hash common . Hash ) ( tx * types . Transaction , isPending bool , err error ) {
var tx * types . Transaction
var raw json . RawMessage
err : = ec . c . CallContext ( ctx , & tx , "eth_getTransactionByHash" , hash )
err = ec . c . CallContext ( ctx , & raw , "eth_getTransactionByHash" , hash )
if err = = nil {
if err ! = nil {
if _ , r , _ := tx . RawSignatureValues ( ) ; r == nil {
return nil , false , err
return nil , fmt . Errorf ( "server returned transaction without signature" )
} else if len ( raw ) == 0 {
}
return nil , false , ethereum . NotFound
}
}
return tx , err
if err := json . Unmarshal ( raw , tx ) ; err != nil {
return nil , false , err
} else if _ , r , _ := tx . RawSignatureValues ( ) ; r == nil {
return nil , false , fmt . Errorf ( "server returned transaction without signature" )
}
var block struct { BlockHash * common . Hash }
if err := json . Unmarshal ( raw , & block ) ; err != nil {
return nil , false , err
}
return tx , block . BlockHash == nil , nil
}
}
// TransactionCount returns the total number of transactions in the given block.
// TransactionCount returns the total number of transactions in the given block.
@ -170,11 +187,9 @@ func (ec *Client) TransactionInBlock(ctx context.Context, blockHash common.Hash,
var tx * types . Transaction
var tx * types . Transaction
err := ec . c . CallContext ( ctx , & tx , "eth_getTransactionByBlockHashAndIndex" , blockHash , index )
err := ec . c . CallContext ( ctx , & tx , "eth_getTransactionByBlockHashAndIndex" , blockHash , index )
if err == nil {
if err == nil {
var signer types . Signer = types . HomesteadSigner { }
if tx == nil {
if tx . Protected ( ) {
return nil , ethereum . NotFound
signer = types . NewEIP155Signer ( tx . ChainId ( ) )
} else if _ , r , _ := tx . RawSignatureValues ( ) ; r == nil {
}
if _ , r , _ := types . SignatureValues ( signer , tx ) ; r == nil {
return nil , fmt . Errorf ( "server returned transaction without signature" )
return nil , fmt . Errorf ( "server returned transaction without signature" )
}
}
}
}
@ -186,8 +201,12 @@ func (ec *Client) TransactionInBlock(ctx context.Context, blockHash common.Hash,
func ( ec * Client ) TransactionReceipt ( ctx context . Context , txHash common . Hash ) ( * types . Receipt , error ) {
func ( ec * Client ) TransactionReceipt ( ctx context . Context , txHash common . Hash ) ( * types . Receipt , error ) {
var r * types . Receipt
var r * types . Receipt
err := ec . c . CallContext ( ctx , & r , "eth_getTransactionReceipt" , txHash )
err := ec . c . CallContext ( ctx , & r , "eth_getTransactionReceipt" , txHash )
if err == nil && r != nil && len ( r . PostState ) == 0 {
if err == nil {
return nil , fmt . Errorf ( "server returned receipt without post state" )
if r == nil {
return nil , ethereum . NotFound
} else if len ( r . PostState ) == 0 {
return nil , fmt . Errorf ( "server returned receipt without post state" )
}
}
}
return r , err
return r , err
}
}