@ -1206,7 +1206,7 @@ func RPCMarshalHeader(head *types.Header) map[string]interface{} {
// RPCMarshalBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are
// returned. When fullTx is true the returned block contains full transaction details, otherwise it will only contain
// transaction hashes.
func RPCMarshalBlock ( block * types . Block , inclTx bool , fullTx bool ) ( map [ string ] interface { } , error ) {
func RPCMarshalBlock ( block * types . Block , inclTx bool , fullTx bool , config * params . ChainConfig ) ( map [ string ] interface { } , error ) {
fields := RPCMarshalHeader ( block . Header ( ) )
fields [ "size" ] = hexutil . Uint64 ( block . Size ( ) )
@ -1216,7 +1216,7 @@ func RPCMarshalBlock(block *types.Block, inclTx bool, fullTx bool) (map[string]i
}
if fullTx {
formatTx = func ( tx * types . Transaction ) ( interface { } , error ) {
return newRPCTransactionFromBlockHash ( block , tx . Hash ( ) ) , nil
return newRPCTransactionFromBlockHash ( block , tx . Hash ( ) , config ) , nil
}
}
txs := block . Transactions ( )
@ -1250,7 +1250,7 @@ func (s *PublicBlockChainAPI) rpcMarshalHeader(ctx context.Context, header *type
// rpcMarshalBlock uses the generalized output filler, then adds the total difficulty field, which requires
// a `PublicBlockchainAPI`.
func ( s * PublicBlockChainAPI ) rpcMarshalBlock ( ctx context . Context , b * types . Block , inclTx bool , fullTx bool ) ( map [ string ] interface { } , error ) {
fields , err := RPCMarshalBlock ( b , inclTx , fullTx )
fields , err := RPCMarshalBlock ( b , inclTx , fullTx , s . b . ChainConfig ( ) )
if err != nil {
return nil , err
}
@ -1285,17 +1285,8 @@ type RPCTransaction struct {
// newRPCTransaction returns a transaction that will serialize to the RPC
// representation, with the given location metadata set (if available).
func newRPCTransaction ( tx * types . Transaction , blockHash common . Hash , blockNumber uint64 , index uint64 , baseFee * big . Int ) * RPCTransaction {
// Determine the signer. For replay-protected transactions, use the most permissive
// signer, because we assume that signers are backwards-compatible with old
// transactions. For non-protected transactions, the homestead signer signer is used
// because the return value of ChainId is zero for those transactions.
var signer types . Signer
if tx . Protected ( ) {
signer = types . LatestSignerForChainID ( tx . ChainId ( ) )
} else {
signer = types . HomesteadSigner { }
}
func newRPCTransaction ( tx * types . Transaction , blockHash common . Hash , blockNumber uint64 , index uint64 , baseFee * big . Int , config * params . ChainConfig ) * RPCTransaction {
signer := types . MakeSigner ( config , big . NewInt ( 0 ) . SetUint64 ( blockNumber ) )
from , _ := types . Sender ( signer , tx )
v , r , s := tx . RawSignatureValues ( )
result := & RPCTransaction {
@ -1346,16 +1337,16 @@ func newRPCPendingTransaction(tx *types.Transaction, current *types.Header, conf
if current != nil {
baseFee = misc . CalcBaseFee ( config , current )
}
return newRPCTransaction ( tx , common . Hash { } , 0 , 0 , baseFee )
return newRPCTransaction ( tx , common . Hash { } , 0 , 0 , baseFee , config )
}
// newRPCTransactionFromBlockIndex returns a transaction that will serialize to the RPC representation.
func newRPCTransactionFromBlockIndex ( b * types . Block , index uint64 ) * RPCTransaction {
func newRPCTransactionFromBlockIndex ( b * types . Block , index uint64 , config * params . ChainConfig ) * RPCTransaction {
txs := b . Transactions ( )
if index >= uint64 ( len ( txs ) ) {
return nil
}
return newRPCTransaction ( txs [ index ] , b . Hash ( ) , b . NumberU64 ( ) , index , b . BaseFee ( ) )
return newRPCTransaction ( txs [ index ] , b . Hash ( ) , b . NumberU64 ( ) , index , b . BaseFee ( ) , config )
}
// newRPCRawTransactionFromBlockIndex returns the bytes of a transaction given a block and a transaction index.
@ -1369,10 +1360,10 @@ func newRPCRawTransactionFromBlockIndex(b *types.Block, index uint64) hexutil.By
}
// newRPCTransactionFromBlockHash returns a transaction that will serialize to the RPC representation.
func newRPCTransactionFromBlockHash ( b * types . Block , hash common . Hash ) * RPCTransaction {
func newRPCTransactionFromBlockHash ( b * types . Block , hash common . Hash , config * params . ChainConfig ) * RPCTransaction {
for idx , tx := range b . Transactions ( ) {
if tx . Hash ( ) == hash {
return newRPCTransactionFromBlockIndex ( b , uint64 ( idx ) )
return newRPCTransactionFromBlockIndex ( b , uint64 ( idx ) , config )
}
}
return nil
@ -1513,7 +1504,7 @@ func (s *PublicTransactionPoolAPI) GetBlockTransactionCountByHash(ctx context.Co
// GetTransactionByBlockNumberAndIndex returns the transaction for the given block number and index.
func ( s * PublicTransactionPoolAPI ) GetTransactionByBlockNumberAndIndex ( ctx context . Context , blockNr rpc . BlockNumber , index hexutil . Uint ) * RPCTransaction {
if block , _ := s . b . BlockByNumber ( ctx , blockNr ) ; block != nil {
return newRPCTransactionFromBlockIndex ( block , uint64 ( index ) )
return newRPCTransactionFromBlockIndex ( block , uint64 ( index ) , s . b . ChainConfig ( ) )
}
return nil
}
@ -1521,7 +1512,7 @@ func (s *PublicTransactionPoolAPI) GetTransactionByBlockNumberAndIndex(ctx conte
// GetTransactionByBlockHashAndIndex returns the transaction for the given block hash and index.
func ( s * PublicTransactionPoolAPI ) GetTransactionByBlockHashAndIndex ( ctx context . Context , blockHash common . Hash , index hexutil . Uint ) * RPCTransaction {
if block , _ := s . b . BlockByHash ( ctx , blockHash ) ; block != nil {
return newRPCTransactionFromBlockIndex ( block , uint64 ( index ) )
return newRPCTransactionFromBlockIndex ( block , uint64 ( index ) , s . b . ChainConfig ( ) )
}
return nil
}
@ -1573,7 +1564,7 @@ func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, has
if err != nil {
return nil , err
}
return newRPCTransaction ( tx , blockHash , blockNumber , index , header . BaseFee ) , nil
return newRPCTransaction ( tx , blockHash , blockNumber , index , header . BaseFee , s . b . ChainConfig ( ) ) , nil
}
// No finalized transaction, try to retrieve it from the pool
if tx := s . b . GetPoolTransaction ( hash ) ; tx != nil {