Skip to main content

reth_storage_rpc_provider/
rpc_response.rs

1//! Unified converter for RPC network responses to primitive types.
2
3use alloy_network::Network;
4use alloy_rpc_types::eth::{Block, Transaction, TransactionReceipt};
5use core::fmt::Debug;
6use reth_ethereum_primitives::{Receipt, TransactionSigned};
7
8/// Error type used by [`RpcResponseConverter`].
9#[derive(Debug)]
10pub struct RpcResponseConverterError(pub Box<dyn core::error::Error + Send + Sync>);
11
12impl core::fmt::Display for RpcResponseConverterError {
13    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
14        core::fmt::Display::fmt(&self.0, f)
15    }
16}
17
18impl core::error::Error for RpcResponseConverterError {
19    fn source(&self) -> Option<&(dyn core::error::Error + 'static)> {
20        self.0.source()
21    }
22}
23
24/// Converts RPC network responses (blocks, transactions, receipts) into primitive types.
25pub trait RpcResponseConverter<N: Network>: Send + Sync + Debug + 'static {
26    /// Primitive block type.
27    type Block;
28    /// Primitive transaction type.
29    type Transaction;
30    /// Primitive receipt type.
31    type Receipt;
32
33    /// Converts a network block response to a primitive block.
34    fn block(&self, response: N::BlockResponse) -> Result<Self::Block, RpcResponseConverterError>;
35
36    /// Converts a network transaction response to a primitive transaction.
37    fn transaction(
38        &self,
39        response: N::TransactionResponse,
40    ) -> Result<Self::Transaction, RpcResponseConverterError>;
41
42    /// Converts a network receipt response to a primitive receipt.
43    fn receipt(
44        &self,
45        response: N::ReceiptResponse,
46    ) -> Result<Self::Receipt, RpcResponseConverterError>;
47}
48
49/// Default Ethereum converter using upstream `From` impls.
50#[derive(Debug, Clone, Copy, Default)]
51pub struct EthRpcConverter;
52
53impl RpcResponseConverter<alloy_network::Ethereum> for EthRpcConverter {
54    type Block = alloy_consensus::Block<TransactionSigned>;
55    type Transaction = TransactionSigned;
56    type Receipt = Receipt;
57
58    fn block(&self, response: Block) -> Result<Self::Block, RpcResponseConverterError> {
59        Ok(response.into())
60    }
61
62    fn transaction(
63        &self,
64        response: Transaction,
65    ) -> Result<Self::Transaction, RpcResponseConverterError> {
66        Ok(response.into_inner().into())
67    }
68
69    fn receipt(
70        &self,
71        response: TransactionReceipt,
72    ) -> Result<Self::Receipt, RpcResponseConverterError> {
73        Ok(response.into_inner().into())
74    }
75}