reth_storage_rpc_provider/
rpc_response.rs1use alloy_network::Network;
4use alloy_rpc_types::eth::{Block, Transaction, TransactionReceipt};
5use core::fmt::Debug;
6use reth_ethereum_primitives::{Receipt, TransactionSigned};
7
8#[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
24pub trait RpcResponseConverter<N: Network>: Send + Sync + Debug + 'static {
26 type Block;
28 type Transaction;
30 type Receipt;
32
33 fn block(&self, response: N::BlockResponse) -> Result<Self::Block, RpcResponseConverterError>;
35
36 fn transaction(
38 &self,
39 response: N::TransactionResponse,
40 ) -> Result<Self::Transaction, RpcResponseConverterError>;
41
42 fn receipt(
44 &self,
45 response: N::ReceiptResponse,
46 ) -> Result<Self::Receipt, RpcResponseConverterError>;
47}
48
49#[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}