Skip to content

Commit

Permalink
feat: use alloy_network::Network::ReceiptResponse instead of AnyTrans…
Browse files Browse the repository at this point in the history
…actionReceipt in RPC (paradigmxyz#10621)
  • Loading branch information
nkysg authored Aug 30, 2024
1 parent b4a18cc commit 24f0471
Show file tree
Hide file tree
Showing 11 changed files with 139 additions and 74 deletions.
8 changes: 7 additions & 1 deletion crates/rpc/rpc-builder/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -791,7 +791,11 @@ where
/// If called outside of the tokio runtime. See also [`Self::eth_api`]
pub fn register_eth(&mut self) -> &mut Self
where
EthApi: EthApiServer<reth_rpc_types::Transaction, reth_rpc_types::Block>,
EthApi: EthApiServer<
reth_rpc_types::Transaction,
reth_rpc_types::Block,
reth_rpc_types::AnyTransactionReceipt,
>,
{
let eth_api = self.eth_api().clone();
self.modules.insert(RethRpcModule::Eth, eth_api.into_rpc().into());
Expand All @@ -808,6 +812,7 @@ where
EthApi: EthApiServer<
WithOtherFields<reth_rpc_types::Transaction>,
reth_rpc_types::Block<WithOtherFields<reth_rpc_types::Transaction>>,
reth_rpc_types::AnyTransactionReceipt,
> + TraceExt,
{
let otterscan_api = self.otterscan_api();
Expand Down Expand Up @@ -911,6 +916,7 @@ where
EthApi: EthApiServer<
WithOtherFields<reth_rpc_types::Transaction>,
reth_rpc_types::Block<WithOtherFields<reth_rpc_types::Transaction>>,
reth_rpc_types::AnyTransactionReceipt,
> + TraceExt,
{
let eth_api = self.eth_api().clone();
Expand Down
114 changes: 74 additions & 40 deletions crates/rpc/rpc-builder/tests/it/http.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ use jsonrpsee::{
};
use reth_network_peers::NodeRecord;
use reth_primitives::{
hex_literal::hex, Address, BlockId, BlockNumberOrTag, Bytes, TxHash, B256, B64, U256, U64,
hex_literal::hex, Address, BlockId, BlockNumberOrTag, Bytes, Receipt, TxHash, B256, B64, U256,
U64,
};
use reth_rpc_api::{
clients::{AdminApiClient, EthApiClient},
Expand Down Expand Up @@ -173,76 +174,101 @@ where
.unwrap();

// Implemented
EthApiClient::<Transaction, Block>::protocol_version(client).await.unwrap();
EthApiClient::<Transaction, Block>::chain_id(client).await.unwrap();
EthApiClient::<Transaction, Block>::accounts(client).await.unwrap();
EthApiClient::<Transaction, Block>::get_account(client, address, block_number.into())
EthApiClient::<Transaction, Block, Receipt>::protocol_version(client).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::chain_id(client).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::accounts(client).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::get_account(client, address, block_number.into())
.await
.unwrap();
EthApiClient::<Transaction, Block>::block_number(client).await.unwrap();
EthApiClient::<Transaction, Block>::get_code(client, address, None).await.unwrap();
EthApiClient::<Transaction, Block>::send_raw_transaction(client, tx).await.unwrap();
EthApiClient::<Transaction, Block>::fee_history(client, U64::from(0), block_number, None)
EthApiClient::<Transaction, Block, Receipt>::block_number(client).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::get_code(client, address, None).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::send_raw_transaction(client, tx).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::fee_history(
client,
U64::from(0),
block_number,
None,
)
.await
.unwrap();
EthApiClient::<Transaction, Block, Receipt>::balance(client, address, None).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::transaction_count(client, address, None)
.await
.unwrap();
EthApiClient::<Transaction, Block>::balance(client, address, None).await.unwrap();
EthApiClient::<Transaction, Block>::transaction_count(client, address, None).await.unwrap();
EthApiClient::<Transaction, Block>::storage_at(client, address, U256::default().into(), None)
EthApiClient::<Transaction, Block, Receipt>::storage_at(
client,
address,
U256::default().into(),
None,
)
.await
.unwrap();
EthApiClient::<Transaction, Block, Receipt>::block_by_hash(client, hash, false).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::block_by_number(client, block_number, false)
.await
.unwrap();
EthApiClient::<Transaction, Block>::block_by_hash(client, hash, false).await.unwrap();
EthApiClient::<Transaction, Block>::block_by_number(client, block_number, false).await.unwrap();
EthApiClient::<Transaction, Block>::block_transaction_count_by_number(client, block_number)
EthApiClient::<Transaction, Block, Receipt>::block_transaction_count_by_number(
client,
block_number,
)
.await
.unwrap();
EthApiClient::<Transaction, Block, Receipt>::block_transaction_count_by_hash(client, hash)
.await
.unwrap();
EthApiClient::<Transaction, Block>::block_transaction_count_by_hash(client, hash)
EthApiClient::<Transaction, Block, Receipt>::block_uncles_count_by_hash(client, hash)
.await
.unwrap();
EthApiClient::<Transaction, Block>::block_uncles_count_by_hash(client, hash).await.unwrap();
EthApiClient::<Transaction, Block>::block_uncles_count_by_number(client, block_number)
EthApiClient::<Transaction, Block, Receipt>::block_uncles_count_by_number(client, block_number)
.await
.unwrap();
EthApiClient::<Transaction, Block>::uncle_by_block_hash_and_index(client, hash, index)
EthApiClient::<Transaction, Block, Receipt>::uncle_by_block_hash_and_index(client, hash, index)
.await
.unwrap();
EthApiClient::<Transaction, Block>::uncle_by_block_number_and_index(
EthApiClient::<Transaction, Block, Receipt>::uncle_by_block_number_and_index(
client,
block_number,
index,
)
.await
.unwrap();
EthApiClient::<Transaction, Block>::sign(client, address, bytes.clone()).await.unwrap_err();
EthApiClient::<Transaction, Block>::sign_typed_data(client, address, typed_data)
EthApiClient::<Transaction, Block, Receipt>::sign(client, address, bytes.clone())
.await
.unwrap_err();
EthApiClient::<Transaction, Block, Receipt>::sign_typed_data(client, address, typed_data)
.await
.unwrap_err();
EthApiClient::<Transaction, Block>::transaction_by_hash(client, tx_hash).await.unwrap();
EthApiClient::<Transaction, Block>::transaction_by_block_hash_and_index(client, hash, index)
EthApiClient::<Transaction, Block, Receipt>::transaction_by_hash(client, tx_hash)
.await
.unwrap();
EthApiClient::<Transaction, Block>::transaction_by_block_number_and_index(
EthApiClient::<Transaction, Block, Receipt>::transaction_by_block_hash_and_index(
client, hash, index,
)
.await
.unwrap();
EthApiClient::<Transaction, Block, Receipt>::transaction_by_block_number_and_index(
client,
block_number,
index,
)
.await
.unwrap();
EthApiClient::<Transaction, Block>::create_access_list(
EthApiClient::<Transaction, Block, Receipt>::create_access_list(
client,
call_request.clone(),
Some(block_number.into()),
)
.await
.unwrap();
EthApiClient::<Transaction, Block>::estimate_gas(
EthApiClient::<Transaction, Block, Receipt>::estimate_gas(
client,
call_request.clone(),
Some(block_number.into()),
None,
)
.await
.unwrap();
EthApiClient::<Transaction, Block>::call(
EthApiClient::<Transaction, Block, Receipt>::call(
client,
call_request.clone(),
Some(block_number.into()),
Expand All @@ -251,30 +277,38 @@ where
)
.await
.unwrap();
EthApiClient::<Transaction, Block>::syncing(client).await.unwrap();
EthApiClient::<Transaction, Block>::send_transaction(client, transaction_request)
EthApiClient::<Transaction, Block, Receipt>::syncing(client).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::send_transaction(client, transaction_request)
.await
.unwrap_err();
EthApiClient::<Transaction, Block, Receipt>::hashrate(client).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::submit_hashrate(
client,
U256::default(),
B256::default(),
)
.await
.unwrap();
EthApiClient::<Transaction, Block, Receipt>::gas_price(client).await.unwrap_err();
EthApiClient::<Transaction, Block, Receipt>::max_priority_fee_per_gas(client)
.await
.unwrap_err();
EthApiClient::<Transaction, Block>::hashrate(client).await.unwrap();
EthApiClient::<Transaction, Block>::submit_hashrate(client, U256::default(), B256::default())
EthApiClient::<Transaction, Block, Receipt>::get_proof(client, address, vec![], None)
.await
.unwrap();
EthApiClient::<Transaction, Block>::gas_price(client).await.unwrap_err();
EthApiClient::<Transaction, Block>::max_priority_fee_per_gas(client).await.unwrap_err();
EthApiClient::<Transaction, Block>::get_proof(client, address, vec![], None).await.unwrap();

// Unimplemented
assert!(is_unimplemented(
EthApiClient::<Transaction, Block>::author(client).await.err().unwrap()
EthApiClient::<Transaction, Block, Receipt>::author(client).await.err().unwrap()
));
assert!(is_unimplemented(
EthApiClient::<Transaction, Block>::is_mining(client).await.err().unwrap()
EthApiClient::<Transaction, Block, Receipt>::is_mining(client).await.err().unwrap()
));
assert!(is_unimplemented(
EthApiClient::<Transaction, Block>::get_work(client).await.err().unwrap()
EthApiClient::<Transaction, Block, Receipt>::get_work(client).await.err().unwrap()
));
assert!(is_unimplemented(
EthApiClient::<Transaction, Block>::submit_work(
EthApiClient::<Transaction, Block, Receipt>::submit_work(
client,
B64::default(),
B256::default(),
Expand All @@ -285,7 +319,7 @@ where
.unwrap()
));
assert!(is_unimplemented(
EthApiClient::<Transaction, Block>::sign_transaction(client, call_request.clone())
EthApiClient::<Transaction, Block, Receipt>::sign_transaction(client, call_request.clone())
.await
.err()
.unwrap()
Expand Down
4 changes: 2 additions & 2 deletions crates/rpc/rpc-builder/tests/it/middleware.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use reth_rpc::EthApi;
use reth_rpc_builder::{RpcServerConfig, TransportRpcModuleConfig};
use reth_rpc_eth_api::EthApiClient;
use reth_rpc_server_types::RpcModuleSelection;
use reth_rpc_types::{Block, Transaction};
use reth_rpc_types::{Block, Receipt, Transaction};
use std::{
future::Future,
pin::Pin,
Expand Down Expand Up @@ -75,7 +75,7 @@ async fn test_rpc_middleware() {
.unwrap();

let client = handle.http_client().unwrap();
EthApiClient::<Transaction, Block>::protocol_version(&client).await.unwrap();
EthApiClient::<Transaction, Block, Receipt>::protocol_version(&client).await.unwrap();
let count = mylayer.count.load(Ordering::Relaxed);
assert_eq!(count, 1);
}
43 changes: 28 additions & 15 deletions crates/rpc/rpc-eth-api/src/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ use reth_rpc_types::{
serde_helpers::JsonStorageKey,
simulate::{SimBlock, SimulatedBlock},
state::{EvmOverrides, StateOverride},
AnyTransactionReceipt, BlockOverrides, BlockTransactions, Bundle, EIP1186AccountProofResponse,
EthCallResponse, FeeHistory, Header, Index, StateContext, SyncStatus, TransactionRequest, Work,
BlockOverrides, BlockTransactions, Bundle, EIP1186AccountProofResponse, EthCallResponse,
FeeHistory, Header, Index, StateContext, SyncStatus, TransactionRequest, Work,
};
use reth_transaction_pool::{PoolTransaction, TransactionPool};
use tracing::trace;
Expand All @@ -23,27 +23,35 @@ use crate::{
helpers::{
EthApiSpec, EthBlocks, EthCall, EthFees, EthState, EthTransactions, FullEthApi, LoadState,
},
RpcBlock, RpcTransaction,
RpcBlock, RpcReceipt, RpcTransaction,
};

/// Helper trait, unifies functionality that must be supported to implement all RPC methods for
/// server.
pub trait FullEthApiServer:
EthApiServer<RpcTransaction<Self::NetworkTypes>, RpcBlock<Self::NetworkTypes>> + FullEthApi + Clone
EthApiServer<
RpcTransaction<Self::NetworkTypes>,
RpcBlock<Self::NetworkTypes>,
RpcReceipt<Self::NetworkTypes>,
> + FullEthApi
+ Clone
{
}

impl<T> FullEthApiServer for T where
T: EthApiServer<RpcTransaction<T::NetworkTypes>, RpcBlock<T::NetworkTypes>>
+ FullEthApi
T: EthApiServer<
RpcTransaction<T::NetworkTypes>,
RpcBlock<T::NetworkTypes>,
RpcReceipt<T::NetworkTypes>,
> + FullEthApi
+ Clone
{
}

/// Eth rpc interface: <https://ethereum.github.io/execution-apis/api-documentation/>
#[cfg_attr(not(feature = "client"), rpc(server, namespace = "eth"))]
#[cfg_attr(feature = "client", rpc(server, client, namespace = "eth"))]
pub trait EthApi<T: RpcObject, B: RpcObject> {
pub trait EthApi<T: RpcObject, B: RpcObject, R: RpcObject> {
/// Returns the protocol version encoded as a string.
#[method(name = "protocolVersion")]
async fn protocol_version(&self) -> RpcResult<U64>;
Expand Down Expand Up @@ -100,10 +108,7 @@ pub trait EthApi<T: RpcObject, B: RpcObject> {

/// Returns all transaction receipts for a given block.
#[method(name = "getBlockReceipts")]
async fn block_receipts(
&self,
block_id: BlockId,
) -> RpcResult<Option<Vec<AnyTransactionReceipt>>>;
async fn block_receipts(&self, block_id: BlockId) -> RpcResult<Option<Vec<R>>>;

/// Returns an uncle block of the given block and index.
#[method(name = "getUncleByBlockHashAndIndex")]
Expand Down Expand Up @@ -171,7 +176,7 @@ pub trait EthApi<T: RpcObject, B: RpcObject> {

/// Returns the receipt of a transaction by transaction hash.
#[method(name = "getTransactionReceipt")]
async fn transaction_receipt(&self, hash: B256) -> RpcResult<Option<AnyTransactionReceipt>>;
async fn transaction_receipt(&self, hash: B256) -> RpcResult<Option<R>>;

/// Returns the balance of the account of given address.
#[method(name = "getBalance")]
Expand Down Expand Up @@ -361,7 +366,12 @@ pub trait EthApi<T: RpcObject, B: RpcObject> {
}

#[async_trait::async_trait]
impl<T> EthApiServer<RpcTransaction<T::NetworkTypes>, RpcBlock<T::NetworkTypes>> for T
impl<T>
EthApiServer<
RpcTransaction<T::NetworkTypes>,
RpcBlock<T::NetworkTypes>,
RpcReceipt<T::NetworkTypes>,
> for T
where
T: FullEthApi,
jsonrpsee_types::error::ErrorObject<'static>: From<T::Error>,
Expand Down Expand Up @@ -457,7 +467,7 @@ where
async fn block_receipts(
&self,
block_id: BlockId,
) -> RpcResult<Option<Vec<AnyTransactionReceipt>>> {
) -> RpcResult<Option<Vec<RpcReceipt<T::NetworkTypes>>>> {
trace!(target: "rpc::eth", ?block_id, "Serving eth_getBlockReceipts");
Ok(EthBlocks::block_receipts(self, block_id).await?)
}
Expand Down Expand Up @@ -604,7 +614,10 @@ where
}

/// Handler for: `eth_getTransactionReceipt`
async fn transaction_receipt(&self, hash: B256) -> RpcResult<Option<AnyTransactionReceipt>> {
async fn transaction_receipt(
&self,
hash: B256,
) -> RpcResult<Option<RpcReceipt<T::NetworkTypes>>> {
trace!(target: "rpc::eth", ?hash, "Serving eth_getTransactionReceipt");
Ok(EthTransactions::transaction_receipt(self, hash).await?)
}
Expand Down
2 changes: 1 addition & 1 deletion crates/rpc/rpc-eth-api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ pub use core::{EthApiServer, FullEthApiServer};
pub use filter::EthFilterApiServer;
pub use helpers::error::{AsEthApiError, FromEthApiError, FromEvmError, IntoEthApiError};
pub use pubsub::EthPubSubApiServer;
pub use types::{EthApiTypes, RpcBlock, RpcTransaction};
pub use types::{EthApiTypes, RpcBlock, RpcReceipt, RpcTransaction};

#[cfg(feature = "client")]
pub use bundle::{EthBundleApiClient, EthCallBundleApiClient};
Expand Down
9 changes: 7 additions & 2 deletions crates/rpc/rpc-eth-api/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use std::error::Error;

use alloy_network::{AnyNetwork, Network};
use reth_rpc_eth_types::EthApiError;
use reth_rpc_types::{Block, Transaction, WithOtherFields};
use reth_rpc_types::{AnyTransactionReceipt, Block, Transaction, WithOtherFields};

use crate::{AsEthApiError, FromEthApiError, FromEvmError};

Expand All @@ -19,10 +19,12 @@ pub trait EthApiTypes: Send + Sync + Clone {
+ Send
+ Sync;
/// Blockchain primitive types, specific to network, e.g. block and transaction.
// todo: remove restriction `reth_rpc_types::Transaction`
// todo: remove restriction [`reth_rpc_types::Transaction`]
// todo: remove restriction [`reth_rpc_types::AnyTransactionReceipt`]
type NetworkTypes: Network<
TransactionResponse = WithOtherFields<Transaction>,
HeaderResponse = reth_rpc_types::Header,
ReceiptResponse = AnyTransactionReceipt,
>;
}

Expand All @@ -36,3 +38,6 @@ pub type RpcTransaction<T> = <T as Network>::TransactionResponse;

/// Adapter for network specific block type.
pub type RpcBlock<T> = Block<RpcTransaction<T>, <T as Network>::HeaderResponse>;

/// Adapter for network specific receipt type.
pub type RpcReceipt<T> = <T as Network>::ReceiptResponse;
Loading

0 comments on commit 24f0471

Please sign in to comment.