|
|
|
@ -1333,15 +1333,18 @@ func RPCMarshalHeader(head *types.Header) map[string]interface{} { |
|
|
|
|
"transactionsRoot": head.TxHash, |
|
|
|
|
"receiptsRoot": head.ReceiptHash, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if head.BaseFee != nil { |
|
|
|
|
result["baseFeePerGas"] = (*hexutil.Big)(head.BaseFee) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if head.WithdrawalsHash != nil { |
|
|
|
|
result["withdrawalsRoot"] = head.WithdrawalsHash |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if head.BlobGasUsed != nil { |
|
|
|
|
result["blobGasUsed"] = hexutil.Uint64(*head.BlobGasUsed) |
|
|
|
|
} |
|
|
|
|
if head.ExcessBlobGas != nil { |
|
|
|
|
result["excessBlobGas"] = hexutil.Uint64(*head.ExcessBlobGas) |
|
|
|
|
} |
|
|
|
|
return result |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1400,26 +1403,28 @@ func (s *BlockChainAPI) rpcMarshalBlock(ctx context.Context, b *types.Block, inc |
|
|
|
|
|
|
|
|
|
// RPCTransaction represents a transaction that will serialize to the RPC representation of a transaction
|
|
|
|
|
type RPCTransaction struct { |
|
|
|
|
BlockHash *common.Hash `json:"blockHash"` |
|
|
|
|
BlockNumber *hexutil.Big `json:"blockNumber"` |
|
|
|
|
From common.Address `json:"from"` |
|
|
|
|
Gas hexutil.Uint64 `json:"gas"` |
|
|
|
|
GasPrice *hexutil.Big `json:"gasPrice"` |
|
|
|
|
GasFeeCap *hexutil.Big `json:"maxFeePerGas,omitempty"` |
|
|
|
|
GasTipCap *hexutil.Big `json:"maxPriorityFeePerGas,omitempty"` |
|
|
|
|
Hash common.Hash `json:"hash"` |
|
|
|
|
Input hexutil.Bytes `json:"input"` |
|
|
|
|
Nonce hexutil.Uint64 `json:"nonce"` |
|
|
|
|
To *common.Address `json:"to"` |
|
|
|
|
TransactionIndex *hexutil.Uint64 `json:"transactionIndex"` |
|
|
|
|
Value *hexutil.Big `json:"value"` |
|
|
|
|
Type hexutil.Uint64 `json:"type"` |
|
|
|
|
Accesses *types.AccessList `json:"accessList,omitempty"` |
|
|
|
|
ChainID *hexutil.Big `json:"chainId,omitempty"` |
|
|
|
|
V *hexutil.Big `json:"v"` |
|
|
|
|
R *hexutil.Big `json:"r"` |
|
|
|
|
S *hexutil.Big `json:"s"` |
|
|
|
|
YParity *hexutil.Uint64 `json:"yParity,omitempty"` |
|
|
|
|
BlockHash *common.Hash `json:"blockHash"` |
|
|
|
|
BlockNumber *hexutil.Big `json:"blockNumber"` |
|
|
|
|
From common.Address `json:"from"` |
|
|
|
|
Gas hexutil.Uint64 `json:"gas"` |
|
|
|
|
GasPrice *hexutil.Big `json:"gasPrice"` |
|
|
|
|
GasFeeCap *hexutil.Big `json:"maxFeePerGas,omitempty"` |
|
|
|
|
GasTipCap *hexutil.Big `json:"maxPriorityFeePerGas,omitempty"` |
|
|
|
|
MaxFeePerBlobGas *hexutil.Big `json:"maxFeePerBlobGas,omitempty"` |
|
|
|
|
Hash common.Hash `json:"hash"` |
|
|
|
|
Input hexutil.Bytes `json:"input"` |
|
|
|
|
Nonce hexutil.Uint64 `json:"nonce"` |
|
|
|
|
To *common.Address `json:"to"` |
|
|
|
|
TransactionIndex *hexutil.Uint64 `json:"transactionIndex"` |
|
|
|
|
Value *hexutil.Big `json:"value"` |
|
|
|
|
Type hexutil.Uint64 `json:"type"` |
|
|
|
|
Accesses *types.AccessList `json:"accessList,omitempty"` |
|
|
|
|
ChainID *hexutil.Big `json:"chainId,omitempty"` |
|
|
|
|
BlobVersionedHashes []common.Hash `json:"blobVersionedHashes,omitempty"` |
|
|
|
|
V *hexutil.Big `json:"v"` |
|
|
|
|
R *hexutil.Big `json:"r"` |
|
|
|
|
S *hexutil.Big `json:"s"` |
|
|
|
|
YParity *hexutil.Uint64 `json:"yParity,omitempty"` |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// newRPCTransaction returns a transaction that will serialize to the RPC
|
|
|
|
@ -1473,15 +1478,43 @@ func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber |
|
|
|
|
// if the transaction has been mined, compute the effective gas price
|
|
|
|
|
if baseFee != nil && blockHash != (common.Hash{}) { |
|
|
|
|
// price = min(gasTipCap + baseFee, gasFeeCap)
|
|
|
|
|
price := math.BigMin(new(big.Int).Add(tx.GasTipCap(), baseFee), tx.GasFeeCap()) |
|
|
|
|
result.GasPrice = (*hexutil.Big)(price) |
|
|
|
|
result.GasPrice = (*hexutil.Big)(effectiveGasPrice(tx, baseFee)) |
|
|
|
|
} else { |
|
|
|
|
result.GasPrice = (*hexutil.Big)(tx.GasFeeCap()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
case types.BlobTxType: |
|
|
|
|
al := tx.AccessList() |
|
|
|
|
yparity := hexutil.Uint64(v.Sign()) |
|
|
|
|
result.Accesses = &al |
|
|
|
|
result.ChainID = (*hexutil.Big)(tx.ChainId()) |
|
|
|
|
result.YParity = &yparity |
|
|
|
|
result.GasFeeCap = (*hexutil.Big)(tx.GasFeeCap()) |
|
|
|
|
result.GasTipCap = (*hexutil.Big)(tx.GasTipCap()) |
|
|
|
|
// if the transaction has been mined, compute the effective gas price
|
|
|
|
|
if baseFee != nil && blockHash != (common.Hash{}) { |
|
|
|
|
result.GasPrice = (*hexutil.Big)(effectiveGasPrice(tx, baseFee)) |
|
|
|
|
} else { |
|
|
|
|
result.GasPrice = (*hexutil.Big)(tx.GasFeeCap()) |
|
|
|
|
} |
|
|
|
|
result.MaxFeePerBlobGas = (*hexutil.Big)(tx.BlobGasFeeCap()) |
|
|
|
|
result.BlobVersionedHashes = tx.BlobHashes() |
|
|
|
|
} |
|
|
|
|
return result |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// effectiveGasPrice computes the transaction gas fee, based on the given basefee value.
|
|
|
|
|
//
|
|
|
|
|
// price = min(gasTipCap + baseFee, gasFeeCap)
|
|
|
|
|
func effectiveGasPrice(tx *types.Transaction, baseFee *big.Int) *big.Int { |
|
|
|
|
fee := tx.GasTipCap() |
|
|
|
|
fee = fee.Add(fee, baseFee) |
|
|
|
|
if tx.GasTipCapIntCmp(fee) < 0 { |
|
|
|
|
return tx.GasTipCap() |
|
|
|
|
} |
|
|
|
|
return fee |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// NewRPCPendingTransaction returns a pending transaction that will serialize to the RPC representation
|
|
|
|
|
func NewRPCPendingTransaction(tx *types.Transaction, current *types.Header, config *params.ChainConfig) *RPCTransaction { |
|
|
|
|
var ( |
|
|
|
@ -1786,6 +1819,11 @@ func marshalReceipt(receipt *types.Receipt, blockHash common.Hash, blockNumber u |
|
|
|
|
fields["logs"] = []*types.Log{} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if tx.Type() == types.BlobTxType { |
|
|
|
|
fields["blobGasUsed"] = hexutil.Uint64(receipt.BlobGasUsed) |
|
|
|
|
fields["blobGasPrice"] = (*hexutil.Big)(receipt.BlobGasPrice) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If the ContractAddress is 20 0x0 bytes, assume it is not a contract creation
|
|
|
|
|
if receipt.ContractAddress != (common.Address{}) { |
|
|
|
|
fields["contractAddress"] = receipt.ContractAddress |
|
|
|
|