Skip to content

Commit b011ad0

Browse files
authored
feat(rpc): Propagate the RPC transaction request from Network and RpcTypes (#17025)
1 parent 265700c commit b011ad0

File tree

22 files changed

+304
-188
lines changed

22 files changed

+304
-188
lines changed

crates/e2e-test-utils/src/testsuite/actions/engine_api.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use alloy_primitives::B256;
55
use alloy_rpc_types_engine::{
66
ExecutionPayloadV1, ExecutionPayloadV2, ExecutionPayloadV3, PayloadStatusEnum,
77
};
8-
use alloy_rpc_types_eth::{Block, Header, Receipt, Transaction};
8+
use alloy_rpc_types_eth::{Block, Header, Receipt, Transaction, TransactionRequest};
99
use eyre::Result;
1010
use futures_util::future::BoxFuture;
1111
use reth_node_api::{EngineTypes, PayloadTypes};
@@ -85,7 +85,7 @@ where
8585
const MAX_RETRIES: u32 = 5;
8686

8787
while retries < MAX_RETRIES {
88-
match EthApiClient::<Transaction, Block, Receipt, Header>::block_by_number(
88+
match EthApiClient::<TransactionRequest, Transaction, Block, Receipt, Header>::block_by_number(
8989
source_rpc,
9090
alloy_eips::BlockNumberOrTag::Number(self.block_number),
9191
true, // include transactions

crates/e2e-test-utils/src/testsuite/actions/fork.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::testsuite::{
55
Action, BlockInfo, Environment,
66
};
77
use alloy_rpc_types_engine::{ForkchoiceState, PayloadAttributes};
8-
use alloy_rpc_types_eth::{Block, Header, Receipt, Transaction};
8+
use alloy_rpc_types_eth::{Block, Header, Receipt, Transaction, TransactionRequest};
99
use eyre::Result;
1010
use futures_util::future::BoxFuture;
1111
use reth_node_api::{EngineTypes, PayloadTypes};
@@ -130,14 +130,19 @@ where
130130

131131
// get the block at the fork base number to establish the fork point
132132
let rpc_client = &env.node_clients[0].rpc;
133-
let fork_base_block =
134-
EthApiClient::<Transaction, Block, Receipt, Header>::block_by_number(
135-
rpc_client,
136-
alloy_eips::BlockNumberOrTag::Number(self.fork_base_block),
137-
false,
138-
)
139-
.await?
140-
.ok_or_else(|| eyre::eyre!("Fork base block {} not found", self.fork_base_block))?;
133+
let fork_base_block = EthApiClient::<
134+
TransactionRequest,
135+
Transaction,
136+
Block,
137+
Receipt,
138+
Header,
139+
>::block_by_number(
140+
rpc_client,
141+
alloy_eips::BlockNumberOrTag::Number(self.fork_base_block),
142+
false,
143+
)
144+
.await?
145+
.ok_or_else(|| eyre::eyre!("Fork base block {} not found", self.fork_base_block))?;
141146

142147
// update active node state to point to the fork base block
143148
let active_node_state = env.active_node_state_mut()?;
@@ -243,7 +248,7 @@ where
243248

244249
// walk backwards through the chain until we reach the fork base
245250
while current_number > self.fork_base_number {
246-
let block = EthApiClient::<Transaction, Block, Receipt, Header>::block_by_hash(
251+
let block = EthApiClient::<TransactionRequest, Transaction, Block, Receipt, Header>::block_by_hash(
247252
rpc_client,
248253
current_hash,
249254
false,

crates/e2e-test-utils/src/testsuite/actions/node_ops.rs

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Node-specific operations for multi-node testing.
22
33
use crate::testsuite::{Action, Environment};
4-
use alloy_rpc_types_eth::{Block, Header, Receipt, Transaction};
4+
use alloy_rpc_types_eth::{Block, Header, Receipt, Transaction, TransactionRequest};
55
use eyre::Result;
66
use futures_util::future::BoxFuture;
77
use reth_node_api::EngineTypes;
@@ -74,15 +74,15 @@ where
7474
let node_b_client = &env.node_clients[self.node_b];
7575

7676
// Get latest block from each node
77-
let block_a = EthApiClient::<Transaction, Block, Receipt, Header>::block_by_number(
77+
let block_a = EthApiClient::<TransactionRequest, Transaction, Block, Receipt, Header>::block_by_number(
7878
&node_a_client.rpc,
7979
alloy_eips::BlockNumberOrTag::Latest,
8080
false,
8181
)
8282
.await?
8383
.ok_or_else(|| eyre::eyre!("Failed to get latest block from node {}", self.node_a))?;
8484

85-
let block_b = EthApiClient::<Transaction, Block, Receipt, Header>::block_by_number(
85+
let block_b = EthApiClient::<TransactionRequest, Transaction, Block, Receipt, Header>::block_by_number(
8686
&node_b_client.rpc,
8787
alloy_eips::BlockNumberOrTag::Latest,
8888
false,
@@ -272,27 +272,37 @@ where
272272
let node_b_client = &env.node_clients[self.node_b];
273273

274274
// Get latest block from each node
275-
let block_a =
276-
EthApiClient::<Transaction, Block, Receipt, Header>::block_by_number(
277-
&node_a_client.rpc,
278-
alloy_eips::BlockNumberOrTag::Latest,
279-
false,
280-
)
281-
.await?
282-
.ok_or_else(|| {
283-
eyre::eyre!("Failed to get latest block from node {}", self.node_a)
284-
})?;
285-
286-
let block_b =
287-
EthApiClient::<Transaction, Block, Receipt, Header>::block_by_number(
288-
&node_b_client.rpc,
289-
alloy_eips::BlockNumberOrTag::Latest,
290-
false,
291-
)
292-
.await?
293-
.ok_or_else(|| {
294-
eyre::eyre!("Failed to get latest block from node {}", self.node_b)
295-
})?;
275+
let block_a = EthApiClient::<
276+
TransactionRequest,
277+
Transaction,
278+
Block,
279+
Receipt,
280+
Header,
281+
>::block_by_number(
282+
&node_a_client.rpc,
283+
alloy_eips::BlockNumberOrTag::Latest,
284+
false,
285+
)
286+
.await?
287+
.ok_or_else(|| {
288+
eyre::eyre!("Failed to get latest block from node {}", self.node_a)
289+
})?;
290+
291+
let block_b = EthApiClient::<
292+
TransactionRequest,
293+
Transaction,
294+
Block,
295+
Receipt,
296+
Header,
297+
>::block_by_number(
298+
&node_b_client.rpc,
299+
alloy_eips::BlockNumberOrTag::Latest,
300+
false,
301+
)
302+
.await?
303+
.ok_or_else(|| {
304+
eyre::eyre!("Failed to get latest block from node {}", self.node_b)
305+
})?;
296306

297307
debug!(
298308
"Sync check: Node {} tip: {} (block {}), Node {} tip: {} (block {})",

crates/e2e-test-utils/src/testsuite/actions/produce_blocks.rs

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use alloy_primitives::{Bytes, B256};
88
use alloy_rpc_types_engine::{
99
payload::ExecutionPayloadEnvelopeV3, ForkchoiceState, PayloadAttributes, PayloadStatusEnum,
1010
};
11-
use alloy_rpc_types_eth::{Block, Header, Receipt, Transaction};
11+
use alloy_rpc_types_eth::{Block, Header, Receipt, Transaction, TransactionRequest};
1212
use eyre::Result;
1313
use futures_util::future::BoxFuture;
1414
use reth_node_api::{EngineTypes, PayloadTypes};
@@ -73,13 +73,16 @@ where
7373
let engine_client = node_client.engine.http_client();
7474

7575
// get the latest block to use as parent
76-
let latest_block =
77-
EthApiClient::<Transaction, Block, Receipt, Header>::block_by_number(
78-
rpc_client,
79-
alloy_eips::BlockNumberOrTag::Latest,
80-
false,
81-
)
82-
.await?;
76+
let latest_block = EthApiClient::<
77+
TransactionRequest,
78+
Transaction,
79+
Block,
80+
Receipt,
81+
Header,
82+
>::block_by_number(
83+
rpc_client, alloy_eips::BlockNumberOrTag::Latest, false
84+
)
85+
.await?;
8386

8487
let latest_block = latest_block.ok_or_else(|| eyre::eyre!("Latest block not found"))?;
8588
let parent_hash = latest_block.header.hash;
@@ -339,14 +342,17 @@ where
339342
} else {
340343
// fallback to RPC query
341344
let rpc_client = &env.node_clients[0].rpc;
342-
let current_head_block =
343-
EthApiClient::<Transaction, Block, Receipt, Header>::block_by_number(
344-
rpc_client,
345-
alloy_eips::BlockNumberOrTag::Latest,
346-
false,
347-
)
348-
.await?
349-
.ok_or_else(|| eyre::eyre!("No latest block found from RPC"))?;
345+
let current_head_block = EthApiClient::<
346+
TransactionRequest,
347+
Transaction,
348+
Block,
349+
Receipt,
350+
Header,
351+
>::block_by_number(
352+
rpc_client, alloy_eips::BlockNumberOrTag::Latest, false
353+
)
354+
.await?
355+
.ok_or_else(|| eyre::eyre!("No latest block found from RPC"))?;
350356
debug!("Using RPC latest block hash as head: {}", current_head_block.header.hash);
351357
current_head_block.header.hash
352358
};
@@ -409,14 +415,17 @@ where
409415
Box::pin(async move {
410416
// get the latest block from the first client to update environment state
411417
let rpc_client = &env.node_clients[0].rpc;
412-
let latest_block =
413-
EthApiClient::<Transaction, Block, Receipt, Header>::block_by_number(
414-
rpc_client,
415-
alloy_eips::BlockNumberOrTag::Latest,
416-
false,
417-
)
418-
.await?
419-
.ok_or_else(|| eyre::eyre!("No latest block found from RPC"))?;
418+
let latest_block = EthApiClient::<
419+
TransactionRequest,
420+
Transaction,
421+
Block,
422+
Receipt,
423+
Header,
424+
>::block_by_number(
425+
rpc_client, alloy_eips::BlockNumberOrTag::Latest, false
426+
)
427+
.await?
428+
.ok_or_else(|| eyre::eyre!("No latest block found from RPC"))?;
420429

421430
// update environment with the new block information
422431
env.set_current_block_info(BlockInfo {
@@ -516,13 +525,17 @@ where
516525
let rpc_client = &client.rpc;
517526

518527
// get the last header by number using latest_head_number
519-
let rpc_latest_header =
520-
EthApiClient::<Transaction, Block, Receipt, Header>::header_by_number(
521-
rpc_client,
522-
alloy_eips::BlockNumberOrTag::Latest,
523-
)
524-
.await?
525-
.ok_or_else(|| eyre::eyre!("No latest header found from rpc"))?;
528+
let rpc_latest_header = EthApiClient::<
529+
TransactionRequest,
530+
Transaction,
531+
Block,
532+
Receipt,
533+
Header,
534+
>::header_by_number(
535+
rpc_client, alloy_eips::BlockNumberOrTag::Latest
536+
)
537+
.await?
538+
.ok_or_else(|| eyre::eyre!("No latest header found from rpc"))?;
526539

527540
// perform several checks
528541
let next_new_payload = env

crates/e2e-test-utils/src/testsuite/setup.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
use alloy_eips::BlockNumberOrTag;
88
use alloy_primitives::B256;
99
use alloy_rpc_types_engine::{ForkchoiceState, PayloadAttributes};
10-
use alloy_rpc_types_eth::{Block as RpcBlock, Header, Receipt, Transaction};
10+
use alloy_rpc_types_eth::{Block as RpcBlock, Header, Receipt, Transaction, TransactionRequest};
1111
use eyre::{eyre, Result};
1212
use reth_chainspec::ChainSpec;
1313
use reth_engine_local::LocalPayloadAttributesBuilder;
@@ -210,7 +210,7 @@ where
210210
let mut last_error = None;
211211

212212
while retry_count < MAX_RETRIES {
213-
match EthApiClient::<Transaction, RpcBlock, Receipt, Header>::block_by_number(
213+
match EthApiClient::<TransactionRequest, Transaction, RpcBlock, Receipt, Header>::block_by_number(
214214
&client.rpc,
215215
BlockNumberOrTag::Latest,
216216
false,
@@ -244,14 +244,17 @@ where
244244
// Initialize each node's state with genesis block information
245245
let genesis_block_info = {
246246
let first_client = &env.node_clients[0];
247-
let genesis_block =
248-
EthApiClient::<Transaction, RpcBlock, Receipt, Header>::block_by_number(
249-
&first_client.rpc,
250-
BlockNumberOrTag::Number(0),
251-
false,
252-
)
253-
.await?
254-
.ok_or_else(|| eyre!("Genesis block not found"))?;
247+
let genesis_block = EthApiClient::<
248+
TransactionRequest,
249+
Transaction,
250+
RpcBlock,
251+
Receipt,
252+
Header,
253+
>::block_by_number(
254+
&first_client.rpc, BlockNumberOrTag::Number(0), false
255+
)
256+
.await?
257+
.ok_or_else(|| eyre!("Genesis block not found"))?;
255258

256259
crate::testsuite::BlockInfo {
257260
hash: genesis_block.header.hash,

crates/node/builder/src/launch/common.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -941,6 +941,7 @@ where
941941
// Verify that the healthy node is running the same chain as the current node.
942942
let chain_id = futures::executor::block_on(async {
943943
EthApiClient::<
944+
alloy_rpc_types::TransactionRequest,
944945
alloy_rpc_types::Transaction,
945946
alloy_rpc_types::Block,
946947
alloy_rpc_types::Receipt,

crates/optimism/rpc/src/eth/call.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use super::OpNodeCore;
22
use crate::{OpEthApi, OpEthApiError};
3+
use alloy_rpc_types_eth::TransactionRequest;
34
use op_revm::OpTransaction;
45
use reth_evm::{execute::BlockExecutorFactory, ConfigureEvm, EvmFactory, TxEnvFor};
56
use reth_node_api::NodePrimitives;
67
use reth_rpc_eth_api::{
78
helpers::{estimate::EstimateCall, Call, EthCall, LoadBlock, LoadState, SpawnBlocking},
8-
FromEvmError, FullEthApiTypes, RpcConvert,
9+
FromEvmError, FullEthApiTypes, RpcConvert, RpcTypes,
910
};
1011
use reth_storage_api::{errors::ProviderError, ProviderHeader, ProviderTx};
1112
use revm::context::TxEnv;
@@ -37,7 +38,8 @@ where
3738
EvmFactory: EvmFactory<Tx = OpTransaction<TxEnv>>,
3839
>,
3940
>,
40-
RpcConvert: RpcConvert<TxEnv = TxEnvFor<Self::Evm>>,
41+
RpcConvert: RpcConvert<TxEnv = TxEnvFor<Self::Evm>, Network = Self::NetworkTypes>,
42+
NetworkTypes: RpcTypes<TransactionRequest: From<TransactionRequest>>,
4143
Error: FromEvmError<Self::Evm>
4244
+ From<<Self::RpcConvert as RpcConvert>::Error>
4345
+ From<ProviderError>,

crates/rpc/rpc-builder/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ use reth_rpc_api::servers::*;
4545
use reth_rpc_eth_api::{
4646
helpers::{Call, EthApiSpec, EthTransactions, LoadPendingBlock, TraceExt},
4747
EthApiServer, EthApiTypes, FullEthApiServer, RpcBlock, RpcHeader, RpcReceipt, RpcTransaction,
48+
RpcTxReq,
4849
};
4950
use reth_rpc_eth_types::{EthConfig, EthSubscriptionIdProvider};
5051
use reth_rpc_layer::{AuthLayer, Claims, CompressionLayer, JwtAuthValidator, JwtSecret};
@@ -663,6 +664,7 @@ where
663664
+ CanonStateSubscriptions,
664665
Network: NetworkInfo + Peers + Clone + 'static,
665666
EthApi: EthApiServer<
667+
RpcTxReq<EthApi::NetworkTypes>,
666668
RpcTransaction<EthApi::NetworkTypes>,
667669
RpcBlock<EthApi::NetworkTypes>,
668670
RpcReceipt<EthApi::NetworkTypes>,

0 commit comments

Comments
 (0)