Skip to content

Commit dcaa06a

Browse files
authored
feat: make more block types generic (paradigmxyz#12812)
1 parent 02824da commit dcaa06a

File tree

62 files changed

+490
-289
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+490
-289
lines changed

bin/reth-bench/src/bench/new_payload_fcu.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use clap::Parser;
1818
use csv::Writer;
1919
use reth_cli_runner::CliContext;
2020
use reth_node_core::args::BenchmarkArgs;
21-
use reth_primitives::Block;
21+
use reth_primitives::{Block, BlockExt};
2222
use reth_rpc_types_compat::engine::payload::block_to_payload;
2323
use std::time::Instant;
2424
use tracing::{debug, info};
@@ -75,11 +75,11 @@ impl Command {
7575

7676
while let Some((block, head, safe, finalized)) = receiver.recv().await {
7777
// just put gas used here
78-
let gas_used = block.header.gas_used;
78+
let gas_used = block.gas_used;
7979
let block_number = block.header.number;
8080

8181
let versioned_hashes: Vec<B256> =
82-
block.blob_versioned_hashes().into_iter().copied().collect();
82+
block.body.blob_versioned_hashes().into_iter().copied().collect();
8383
let parent_beacon_block_root = block.parent_beacon_block_root;
8484
let payload = block_to_payload(block);
8585

bin/reth-bench/src/bench/new_payload_only.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use clap::Parser;
1616
use csv::Writer;
1717
use reth_cli_runner::CliContext;
1818
use reth_node_core::args::BenchmarkArgs;
19-
use reth_primitives::Block;
19+
use reth_primitives::{Block, BlockExt};
2020
use reth_rpc_types_compat::engine::payload::block_to_payload;
2121
use std::time::Instant;
2222
use tracing::{debug, info};
@@ -60,10 +60,10 @@ impl Command {
6060

6161
while let Some(block) = receiver.recv().await {
6262
// just put gas used here
63-
let gas_used = block.header.gas_used;
63+
let gas_used = block.gas_used;
6464

6565
let versioned_hashes: Vec<B256> =
66-
block.blob_versioned_hashes().into_iter().copied().collect();
66+
block.body.blob_versioned_hashes().into_iter().copied().collect();
6767
let parent_beacon_block_root = block.parent_beacon_block_root;
6868
let payload = block_to_payload(block);
6969

bin/reth/src/commands/debug_cmd/build_block.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ use reth_errors::RethResult;
2222
use reth_evm::execute::{BlockExecutorProvider, Executor};
2323
use reth_execution_types::ExecutionOutcome;
2424
use reth_fs_util as fs;
25-
use reth_node_api::{EngineApiMessageVersion, PayloadBuilderAttributes};
25+
use reth_node_api::{BlockTy, EngineApiMessageVersion, PayloadBuilderAttributes};
2626
use reth_node_ethereum::{EthEvmConfig, EthExecutorProvider};
2727
use reth_primitives::{
28-
BlobTransaction, PooledTransactionsElement, SealedBlock, SealedBlockWithSenders, SealedHeader,
29-
Transaction, TransactionSigned,
28+
BlobTransaction, BlockExt, PooledTransactionsElement, SealedBlock, SealedBlockWithSenders,
29+
SealedHeader, Transaction, TransactionSigned,
3030
};
3131
use reth_provider::{
3232
providers::{BlockchainProvider, ProviderNodeTypes},
@@ -259,7 +259,7 @@ impl<C: ChainSpecParser<ChainSpec = ChainSpec>> Command<C> {
259259

260260
let senders = block.senders().expect("sender recovery failed");
261261
let block_with_senders =
262-
SealedBlockWithSenders::new(block.clone(), senders).unwrap();
262+
SealedBlockWithSenders::<BlockTy<N>>::new(block.clone(), senders).unwrap();
263263

264264
let db = StateProviderDatabase::new(blockchain_db.latest()?);
265265
let executor =

bin/reth/src/commands/debug_cmd/in_memory_merkle.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use reth_execution_types::ExecutionOutcome;
2020
use reth_network::{BlockDownloaderProvider, NetworkHandle};
2121
use reth_network_api::NetworkInfo;
2222
use reth_node_ethereum::EthExecutorProvider;
23+
use reth_primitives::BlockExt;
2324
use reth_provider::{
2425
providers::ProviderNodeTypes, writer::UnifiedStorageWriter, AccountExtReader,
2526
ChainSpecProvider, HashingWriter, HeaderProvider, LatestStateProviderRef, OriginalValuesKnown,

bin/reth/src/commands/debug_cmd/merkle.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use reth_evm::execute::{BatchExecutor, BlockExecutorProvider};
1717
use reth_network::{BlockDownloaderProvider, NetworkHandle};
1818
use reth_network_api::NetworkInfo;
1919
use reth_network_p2p::full_block::FullBlockClient;
20+
use reth_node_api::BlockTy;
2021
use reth_node_ethereum::EthExecutorProvider;
2122
use reth_provider::{
2223
providers::ProviderNodeTypes, writer::UnifiedStorageWriter, BlockNumReader, BlockWriter,
@@ -144,7 +145,7 @@ impl<C: ChainSpecParser<ChainSpec = ChainSpec>> Command<C> {
144145
for block in blocks.into_iter().rev() {
145146
let block_number = block.number;
146147
let sealed_block = block
147-
.try_seal_with_senders()
148+
.try_seal_with_senders::<BlockTy<N>>()
148149
.map_err(|block| eyre::eyre!("Error sealing block with senders: {block:?}"))?;
149150
trace!(target: "reth::cli", block_number, "Executing block");
150151

crates/blockchain-tree/src/blockchain_tree.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1589,7 +1589,9 @@ mod tests {
15891589
body: Vec<TransactionSignedEcRecovered>,
15901590
num_of_signer_txs: u64|
15911591
-> SealedBlockWithSenders {
1592-
let transactions_root = calculate_transaction_root(&body);
1592+
let signed_body =
1593+
body.clone().into_iter().map(|tx| tx.into_signed()).collect::<Vec<_>>();
1594+
let transactions_root = calculate_transaction_root(&signed_body);
15931595
let receipts = body
15941596
.iter()
15951597
.enumerate()
@@ -1635,7 +1637,7 @@ mod tests {
16351637
SealedBlock {
16361638
header: SealedHeader::seal(header),
16371639
body: BlockBody {
1638-
transactions: body.clone().into_iter().map(|tx| tx.into_signed()).collect(),
1640+
transactions: signed_body,
16391641
ommers: Vec::new(),
16401642
withdrawals: Some(Withdrawals::default()),
16411643
},

crates/blockchain-tree/src/externals.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,40 @@ use reth_consensus::Consensus;
55
use reth_db::{static_file::BlockHashMask, tables};
66
use reth_db_api::{cursor::DbCursorRO, transaction::DbTx};
77
use reth_node_types::{FullNodePrimitives, NodeTypesWithDB};
8-
use reth_primitives::{BlockBody, StaticFileSegment};
8+
use reth_primitives::StaticFileSegment;
99
use reth_provider::{
10-
providers::ProviderNodeTypes, ChainStateBlockReader, ChainStateBlockWriter, ProviderFactory,
11-
StaticFileProviderFactory, StatsReader,
10+
providers::{NodeTypesForProvider, ProviderNodeTypes},
11+
ChainStateBlockReader, ChainStateBlockWriter, ProviderFactory, StaticFileProviderFactory,
12+
StatsReader,
1213
};
1314
use reth_storage_errors::provider::ProviderResult;
1415
use std::{collections::BTreeMap, sync::Arc};
1516

1617
/// A helper trait with requirements for [`ProviderNodeTypes`] to be used within [`TreeExternals`].
17-
pub trait TreeNodeTypes:
18-
ProviderNodeTypes<Primitives: FullNodePrimitives<BlockBody = BlockBody>>
18+
pub trait NodeTypesForTree:
19+
NodeTypesForProvider<
20+
Primitives: FullNodePrimitives<
21+
Block = reth_primitives::Block,
22+
BlockBody = reth_primitives::BlockBody,
23+
>,
24+
>
1925
{
2026
}
21-
impl<T> TreeNodeTypes for T where
22-
T: ProviderNodeTypes<Primitives: FullNodePrimitives<BlockBody = BlockBody>>
27+
28+
impl<T> NodeTypesForTree for T where
29+
T: NodeTypesForProvider<
30+
Primitives: FullNodePrimitives<
31+
Block = reth_primitives::Block,
32+
BlockBody = reth_primitives::BlockBody,
33+
>,
34+
>
2335
{
2436
}
2537

38+
/// A helper trait with requirements for [`ProviderNodeTypes`] to be used within [`TreeExternals`].
39+
pub trait TreeNodeTypes: ProviderNodeTypes + NodeTypesForTree {}
40+
impl<T> TreeNodeTypes for T where T: ProviderNodeTypes + NodeTypesForTree {}
41+
2642
/// A container for external components.
2743
///
2844
/// This is a simple container for external components used throughout the blockchain tree

crates/chain-state/src/test_utils.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,9 @@ impl TestBlockBuilder {
139139
gas_limit: self.chain_spec.max_gas_limit,
140140
mix_hash: B256::random(),
141141
base_fee_per_gas: Some(INITIAL_BASE_FEE),
142-
transactions_root: calculate_transaction_root(&transactions),
142+
transactions_root: calculate_transaction_root(
143+
&transactions.clone().into_iter().map(|tx| tx.into_signed()).collect::<Vec<_>>(),
144+
),
143145
receipts_root: calculate_receipt_root(&receipts),
144146
beneficiary: Address::random(),
145147
state_root: state_root_unhashed(HashMap::from([(

crates/cli/commands/src/common.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,21 @@ impl AccessRights {
197197
/// [`NodeTypes`](reth_node_builder::NodeTypes) in CLI.
198198
pub trait CliNodeTypes:
199199
NodeTypesWithEngine
200-
+ NodeTypesForProvider<Primitives: FullNodePrimitives<BlockBody = reth_primitives::BlockBody>>
200+
+ NodeTypesForProvider<
201+
Primitives: FullNodePrimitives<
202+
Block = reth_primitives::Block,
203+
BlockBody = reth_primitives::BlockBody,
204+
>,
205+
>
201206
{
202207
}
203208
impl<N> CliNodeTypes for N where
204209
N: NodeTypesWithEngine
205-
+ NodeTypesForProvider<Primitives: FullNodePrimitives<BlockBody = reth_primitives::BlockBody>>
210+
+ NodeTypesForProvider<
211+
Primitives: FullNodePrimitives<
212+
Block = reth_primitives::Block,
213+
BlockBody = reth_primitives::BlockBody,
214+
>,
215+
>
206216
{
207217
}

crates/cli/commands/src/init_state/without_evm.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub fn setup_without_evm<Provider>(
3333
where
3434
Provider: StaticFileProviderFactory
3535
+ StageCheckpointWriter
36-
+ BlockWriter<Body: reth_node_api::BlockBody>,
36+
+ BlockWriter<Block: reth_node_api::Block<Header = reth_primitives::Header>>,
3737
{
3838
info!(target: "reth::cli", "Setting up dummy EVM chain before importing state.");
3939

@@ -64,7 +64,8 @@ fn append_first_block<Provider>(
6464
total_difficulty: U256,
6565
) -> Result<(), eyre::Error>
6666
where
67-
Provider: BlockWriter<Body: reth_node_api::BlockBody> + StaticFileProviderFactory,
67+
Provider: BlockWriter<Block: reth_node_api::Block<Header = reth_primitives::Header>>
68+
+ StaticFileProviderFactory,
6869
{
6970
provider_rw.insert_block(
7071
SealedBlockWithSenders::new(SealedBlock::new(header.clone(), Default::default()), vec![])

crates/consensus/beacon/src/engine/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1992,6 +1992,7 @@ mod tests {
19921992
use assert_matches::assert_matches;
19931993
use reth_chainspec::{ChainSpecBuilder, MAINNET};
19941994
use reth_node_types::FullNodePrimitives;
1995+
use reth_primitives::BlockExt;
19951996
use reth_provider::{BlockWriter, ProviderFactory, StorageLocation};
19961997
use reth_rpc_types_compat::engine::payload::block_to_payload_v1;
19971998
use reth_stages::{ExecOutput, PipelineError, StageError};

crates/consensus/common/src/validation.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use alloy_consensus::{constants::MAXIMUM_EXTRA_DATA_SIZE, Header};
44
use alloy_eips::eip4844::{DATA_GAS_PER_BLOB, MAX_DATA_GAS_PER_BLOCK};
55
use reth_chainspec::{EthChainSpec, EthereumHardforks};
66
use reth_consensus::ConsensusError;
7-
use reth_primitives::{BlockBody, EthereumHardfork, GotExpected, SealedBlock, SealedHeader};
7+
use reth_primitives::{
8+
BlockBody, BlockBodyTxExt, EthereumHardfork, GotExpected, SealedBlock, SealedHeader,
9+
};
810
use revm_primitives::calc_excess_blob_gas;
911

1012
/// Gas used needs to be less than gas limit. Gas used is going to be checked after execution.

crates/e2e-test-utils/src/lib.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::sync::Arc;
55
use node::NodeTestContext;
66
use reth::{
77
args::{DiscoveryArgs, NetworkArgs, RpcServerArgs},
8+
blockchain_tree::externals::NodeTypesForTree,
89
builder::{FullNodePrimitives, NodeBuilder, NodeConfig, NodeHandle},
910
network::PeersHandleProvider,
1011
rpc::server_types::RpcModuleSelection,
@@ -53,13 +54,12 @@ pub async fn setup<N>(
5354
attributes_generator: impl Fn(u64) -> <<N as NodeTypesWithEngine>::Engine as PayloadTypes>::PayloadBuilderAttributes + Copy + 'static,
5455
) -> eyre::Result<(Vec<NodeHelperType<N, N::AddOns>>, TaskManager, Wallet)>
5556
where
56-
N: Default + Node<TmpNodeAdapter<N>> + NodeTypesForProvider + NodeTypesWithEngine,
57+
N: Default + Node<TmpNodeAdapter<N>> + NodeTypesForTree + NodeTypesWithEngine,
5758
N::ComponentsBuilder: NodeComponentsBuilder<
5859
TmpNodeAdapter<N>,
5960
Components: NodeComponents<TmpNodeAdapter<N>, Network: PeersHandleProvider>,
6061
>,
6162
N::AddOns: RethRpcAddOns<Adapter<N>>,
62-
N::Primitives: FullNodePrimitives<BlockBody = reth_primitives::BlockBody>,
6363
{
6464
let tasks = TaskManager::current();
6565
let exec = tasks.executor();
@@ -134,7 +134,8 @@ where
134134
LocalPayloadAttributesBuilder<N::ChainSpec>: PayloadAttributesBuilder<
135135
<<N as NodeTypesWithEngine>::Engine as PayloadTypes>::PayloadAttributes,
136136
>,
137-
N::Primitives: FullNodePrimitives<BlockBody = reth_primitives::BlockBody>,
137+
N::Primitives:
138+
FullNodePrimitives<Block = reth_primitives::Block, BlockBody = reth_primitives::BlockBody>,
138139
{
139140
let tasks = TaskManager::current();
140141
let exec = tasks.executor();

crates/e2e-test-utils/src/node.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ where
216216
// get head block from notifications stream and verify the tx has been pushed to the
217217
// pool is actually present in the canonical block
218218
let head = self.engine_api.canonical_stream.next().await.unwrap();
219-
let tx = head.tip().transactions().next();
219+
let tx = head.tip().transactions().first();
220220
assert_eq!(tx.unwrap().hash().as_slice(), tip_tx_hash.as_slice());
221221

222222
loop {

crates/engine/local/src/miner.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,13 @@ where
210210

211211
let block = payload.block();
212212

213-
let cancun_fields =
214-
self.provider.chain_spec().is_cancun_active_at_timestamp(block.timestamp).then(|| {
215-
CancunPayloadFields {
216-
parent_beacon_block_root: block.parent_beacon_block_root.unwrap(),
217-
versioned_hashes: block.blob_versioned_hashes().into_iter().copied().collect(),
218-
}
213+
let cancun_fields = self
214+
.provider
215+
.chain_spec()
216+
.is_cancun_active_at_timestamp(block.timestamp)
217+
.then(|| CancunPayloadFields {
218+
parent_beacon_block_root: block.parent_beacon_block_root.unwrap(),
219+
versioned_hashes: block.body.blob_versioned_hashes().into_iter().copied().collect(),
219220
});
220221

221222
let (tx, rx) = oneshot::channel();

crates/engine/tree/src/persistence.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,15 @@ use tracing::{debug, error};
2121
/// A helper trait with requirements for [`ProviderNodeTypes`] to be used within
2222
/// [`PersistenceService`].
2323
pub trait PersistenceNodeTypes:
24-
ProviderNodeTypes<Primitives: FullNodePrimitives<BlockBody = BlockBody>>
24+
ProviderNodeTypes<
25+
Primitives: FullNodePrimitives<Block = reth_primitives::Block, BlockBody = BlockBody>,
26+
>
2527
{
2628
}
2729
impl<T> PersistenceNodeTypes for T where
28-
T: ProviderNodeTypes<Primitives: FullNodePrimitives<BlockBody = BlockBody>>
30+
T: ProviderNodeTypes<
31+
Primitives: FullNodePrimitives<Block = reth_primitives::Block, BlockBody = BlockBody>,
32+
>
2933
{
3034
}
3135
/// Writes parts of reth's in memory tree state to the database and static files.

crates/engine/tree/src/tree/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2609,6 +2609,7 @@ mod tests {
26092609
use reth_engine_primitives::ForkchoiceStatus;
26102610
use reth_ethereum_engine_primitives::EthEngineTypes;
26112611
use reth_evm::test_utils::MockExecutorProvider;
2612+
use reth_primitives::BlockExt;
26122613
use reth_provider::test_utils::MockEthProvider;
26132614
use reth_rpc_types_compat::engine::{block_to_payload_v1, payload::block_to_payload_v3};
26142615
use reth_trie::updates::TrieUpdates;

crates/engine/util/src/reorg.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use reth_evm::{
1818
ConfigureEvm,
1919
};
2020
use reth_payload_validator::ExecutionPayloadValidator;
21-
use reth_primitives::{proofs, Block, BlockBody, Receipt, Receipts};
21+
use reth_primitives::{proofs, Block, BlockBody, BlockExt, Receipt, Receipts};
2222
use reth_provider::{BlockReader, ExecutionOutcome, ProviderError, StateProviderFactory};
2323
use reth_revm::{
2424
database::StateProviderDatabase,

crates/ethereum/evm/src/execute.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,9 @@ mod tests {
319319
BasicBlockExecutorProvider, BatchExecutor, BlockExecutorProvider, Executor,
320320
};
321321
use reth_execution_types::BlockExecutionOutput;
322-
use reth_primitives::{public_key_to_address, Account, Block, BlockBody, Transaction};
322+
use reth_primitives::{
323+
public_key_to_address, Account, Block, BlockBody, BlockExt, Transaction,
324+
};
323325
use reth_revm::{
324326
database::StateProviderDatabase, test_utils::StateProviderTest, TransitionState,
325327
};

crates/ethereum/node/tests/e2e/dev.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ where
6363

6464
let head = notifications.next().await.unwrap();
6565

66-
let tx = head.tip().transactions().next().unwrap();
66+
let tx = &head.tip().transactions()[0];
6767
assert_eq!(tx.hash(), hash);
6868
println!("mined transaction: {hash}");
6969
}

crates/ethereum/payload/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use reth_payload_builder_primitives::PayloadBuilderError;
2727
use reth_payload_primitives::PayloadBuilderAttributes;
2828
use reth_primitives::{
2929
proofs::{self},
30-
Block, BlockBody, EthereumHardforks, Receipt,
30+
Block, BlockBody, BlockExt, EthereumHardforks, Receipt,
3131
};
3232
use reth_provider::{ChainSpecProvider, StateProviderFactory};
3333
use reth_revm::database::StateProviderDatabase;

crates/evm/execution-types/src/chain.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ impl<N: NodePrimitives> Chain<N> {
236236
self.blocks().iter().zip(self.execution_outcome.receipts().iter())
237237
{
238238
let mut tx_receipts = Vec::with_capacity(receipts.len());
239-
for (tx, receipt) in block.body.transactions().zip(receipts.iter()) {
239+
for (tx, receipt) in block.body.transactions.iter().zip(receipts.iter()) {
240240
tx_receipts.push((
241241
tx.hash(),
242242
receipt.as_ref().expect("receipts have not been pruned").clone(),
@@ -417,7 +417,7 @@ impl ChainBlocks<'_> {
417417
/// Returns an iterator over all transactions in the chain.
418418
#[inline]
419419
pub fn transactions(&self) -> impl Iterator<Item = &TransactionSigned> + '_ {
420-
self.blocks.values().flat_map(|block| block.body.transactions())
420+
self.blocks.values().flat_map(|block| block.body.transactions.iter())
421421
}
422422

423423
/// Returns an iterator over all transactions and their senders.
@@ -441,7 +441,7 @@ impl ChainBlocks<'_> {
441441
/// Returns an iterator over all transaction hashes in the block
442442
#[inline]
443443
pub fn transaction_hashes(&self) -> impl Iterator<Item = TxHash> + '_ {
444-
self.blocks.values().flat_map(|block| block.transactions().map(|tx| tx.hash()))
444+
self.blocks.values().flat_map(|block| block.transactions().iter().map(|tx| tx.hash()))
445445
}
446446
}
447447

crates/exex/exex/src/backfill/job.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use alloy_primitives::BlockNumber;
88
use reth_evm::execute::{
99
BatchExecutor, BlockExecutionError, BlockExecutionOutput, BlockExecutorProvider, Executor,
1010
};
11-
use reth_primitives::{Block, BlockWithSenders, Receipt};
11+
use reth_primitives::{Block, BlockExt, BlockWithSenders, Receipt};
1212
use reth_primitives_traits::format_gas_throughput;
1313
use reth_provider::{
1414
BlockReader, Chain, HeaderProvider, ProviderError, StateProviderFactory, TransactionVariant,

0 commit comments

Comments
 (0)