Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make impls for MockEthProvider more generic #14055

Merged
merged 3 commits into from
Jan 29, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 57 additions & 50 deletions crates/storage/provider/src/test_utils/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ use crate::{
ReceiptProviderIdExt, StateProvider, StateProviderBox, StateProviderFactory, StateReader,
StateRootProvider, TransactionVariant, TransactionsProvider, WithdrawalsProvider,
};
use alloy_consensus::{constants::EMPTY_ROOT_HASH, transaction::TransactionMeta, Header};
use alloy_consensus::{
constants::EMPTY_ROOT_HASH, transaction::TransactionMeta, Header, Transaction,
};
use alloy_eips::{eip4895::Withdrawals, BlockHashOrNumber, BlockId, BlockNumberOrTag};
use alloy_primitives::{
keccak256,
Expand Down Expand Up @@ -56,6 +58,17 @@ pub struct MockEthProvider<T = TransactionSigned> {
}

impl<T> MockEthProvider<T> {
/// Create a new, empty instance
pub fn new() -> Self {
Self {
blocks: Default::default(),
headers: Default::default(),
accounts: Default::default(),
chain_spec: Arc::new(reth_chainspec::ChainSpecBuilder::mainnet().build()),
state_roots: Default::default(),
}
}

/// Add block to local block store
pub fn add_block(&self, hash: B256, block: Block<T>) {
self.add_header(hash, block.header.clone());
Expand Down Expand Up @@ -100,15 +113,9 @@ impl<T> MockEthProvider<T> {
}
}

impl<T> Default for MockEthProvider<T> {
impl Default for MockEthProvider {
fn default() -> Self {
Self {
blocks: Default::default(),
headers: Default::default(),
accounts: Default::default(),
chain_spec: Arc::new(reth_chainspec::ChainSpecBuilder::mainnet().build()),
state_roots: Default::default(),
}
Self::new()
}
}

Expand Down Expand Up @@ -160,11 +167,11 @@ impl NodeTypes for MockNode {
type Storage = EthStorage;
}

impl StateCommitmentProvider for MockEthProvider {
impl<T: Transaction> StateCommitmentProvider for MockEthProvider<T> {
type StateCommitment = <MockNode as NodeTypes>::StateCommitment;
}

impl DatabaseProviderFactory for MockEthProvider {
impl<T: Transaction> DatabaseProviderFactory for MockEthProvider<T> {
type DB = DatabaseMock;
type Provider = DatabaseProvider<TxMock, MockNode>;
type ProviderRW = DatabaseProvider<TxMock, MockNode>;
Expand All @@ -178,7 +185,7 @@ impl DatabaseProviderFactory for MockEthProvider {
}
}

impl HeaderProvider for MockEthProvider {
impl<T: Transaction> HeaderProvider for MockEthProvider<T> {
type Header = Header;

fn header(&self, block_hash: &BlockHash) -> ProviderResult<Option<Header>> {
Expand Down Expand Up @@ -237,16 +244,16 @@ impl HeaderProvider for MockEthProvider {
}
}

impl ChainSpecProvider for MockEthProvider {
impl<T: Transaction> ChainSpecProvider for MockEthProvider<T> {
type ChainSpec = ChainSpec;

fn chain_spec(&self) -> Arc<ChainSpec> {
self.chain_spec.clone()
}
}

impl TransactionsProvider for MockEthProvider {
type Transaction = TransactionSigned;
impl<T: SignedTransaction> TransactionsProvider for MockEthProvider<T> {
type Transaction = T;

fn transaction_id(&self, tx_hash: TxHash) -> ProviderResult<Option<TxNumber>> {
let lock = self.blocks.lock();
Expand Down Expand Up @@ -278,7 +285,7 @@ impl TransactionsProvider for MockEthProvider {
Ok(transaction)
}

fn transaction_by_hash(&self, hash: TxHash) -> ProviderResult<Option<TransactionSigned>> {
fn transaction_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Self::Transaction>> {
Ok(self.blocks.lock().iter().find_map(|(_, block)| {
block.body.transactions.iter().find(|tx| *tx.tx_hash() == hash).cloned()
}))
Expand Down Expand Up @@ -384,7 +391,7 @@ impl TransactionsProvider for MockEthProvider {
}
}

impl ReceiptProvider for MockEthProvider {
impl<T: Transaction> ReceiptProvider for MockEthProvider<T> {
type Receipt = Receipt;

fn receipt(&self, _id: TxNumber) -> ProviderResult<Option<Receipt>> {
Expand All @@ -407,9 +414,9 @@ impl ReceiptProvider for MockEthProvider {
}
}

impl ReceiptProviderIdExt for MockEthProvider {}
impl<T: Transaction> ReceiptProviderIdExt for MockEthProvider<T> {}

impl BlockHashReader for MockEthProvider {
impl<T: Transaction> BlockHashReader for MockEthProvider<T> {
fn block_hash(&self, number: u64) -> ProviderResult<Option<B256>> {
let lock = self.blocks.lock();

Expand All @@ -433,7 +440,7 @@ impl BlockHashReader for MockEthProvider {
}
}

impl BlockNumReader for MockEthProvider {
impl<T: Transaction> BlockNumReader for MockEthProvider<T> {
fn chain_info(&self) -> ProviderResult<ChainInfo> {
let best_block_number = self.best_block_number()?;
let lock = self.headers.lock();
Expand Down Expand Up @@ -464,7 +471,7 @@ impl BlockNumReader for MockEthProvider {
}
}

impl BlockIdReader for MockEthProvider {
impl<T: Transaction> BlockIdReader for MockEthProvider<T> {
fn pending_block_num_hash(&self) -> ProviderResult<Option<alloy_eips::BlockNumHash>> {
Ok(None)
}
Expand All @@ -478,56 +485,56 @@ impl BlockIdReader for MockEthProvider {
}
}

impl BlockReader for MockEthProvider {
type Block = Block;
impl<T: SignedTransaction> BlockReader for MockEthProvider<T> {
type Block = Block<T>;

fn find_block_by_hash(
&self,
hash: B256,
_source: BlockSource,
) -> ProviderResult<Option<Block>> {
) -> ProviderResult<Option<Self::Block>> {
self.block(hash.into())
}

fn block(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Block>> {
fn block(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Self::Block>> {
let lock = self.blocks.lock();
match id {
BlockHashOrNumber::Hash(hash) => Ok(lock.get(&hash).cloned()),
BlockHashOrNumber::Number(num) => Ok(lock.values().find(|b| b.number == num).cloned()),
}
}

fn pending_block(&self) -> ProviderResult<Option<SealedBlock>> {
fn pending_block(&self) -> ProviderResult<Option<SealedBlock<Self::Block>>> {
Ok(None)
}

fn pending_block_with_senders(
&self,
) -> ProviderResult<Option<RecoveredBlock<reth_primitives::Block>>> {
fn pending_block_with_senders(&self) -> ProviderResult<Option<RecoveredBlock<Self::Block>>> {
Ok(None)
}

fn pending_block_and_receipts(&self) -> ProviderResult<Option<(SealedBlock, Vec<Receipt>)>> {
fn pending_block_and_receipts(
&self,
) -> ProviderResult<Option<(SealedBlock<Self::Block>, Vec<Receipt>)>> {
Ok(None)
}

fn block_with_senders(
&self,
_id: BlockHashOrNumber,
_transaction_kind: TransactionVariant,
) -> ProviderResult<Option<RecoveredBlock<reth_primitives::Block>>> {
) -> ProviderResult<Option<RecoveredBlock<Self::Block>>> {
Ok(None)
}

fn sealed_block_with_senders(
&self,
_id: BlockHashOrNumber,
_transaction_kind: TransactionVariant,
) -> ProviderResult<Option<RecoveredBlock<reth_primitives::Block>>> {
) -> ProviderResult<Option<RecoveredBlock<Self::Block>>> {
Ok(None)
}

fn block_range(&self, range: RangeInclusive<BlockNumber>) -> ProviderResult<Vec<Block>> {
fn block_range(&self, range: RangeInclusive<BlockNumber>) -> ProviderResult<Vec<Self::Block>> {
let lock = self.blocks.lock();

let mut blocks: Vec<_> =
Expand All @@ -540,20 +547,20 @@ impl BlockReader for MockEthProvider {
fn block_with_senders_range(
&self,
_range: RangeInclusive<BlockNumber>,
) -> ProviderResult<Vec<RecoveredBlock<reth_primitives::Block>>> {
) -> ProviderResult<Vec<RecoveredBlock<Self::Block>>> {
Ok(vec![])
}

fn sealed_block_with_senders_range(
&self,
_range: RangeInclusive<BlockNumber>,
) -> ProviderResult<Vec<RecoveredBlock<reth_primitives::Block>>> {
) -> ProviderResult<Vec<RecoveredBlock<Self::Block>>> {
Ok(vec![])
}
}

impl BlockReaderIdExt for MockEthProvider {
fn block_by_id(&self, id: BlockId) -> ProviderResult<Option<Block>> {
impl<T: SignedTransaction> BlockReaderIdExt for MockEthProvider<T> {
fn block_by_id(&self, id: BlockId) -> ProviderResult<Option<Block<T>>> {
match id {
BlockId::Number(num) => self.block_by_number_or_tag(num),
BlockId::Hash(hash) => self.block_by_hash(hash.block_hash),
Expand All @@ -579,13 +586,13 @@ impl BlockReaderIdExt for MockEthProvider {
}
}

impl AccountReader for MockEthProvider {
impl<T: Transaction> AccountReader for MockEthProvider<T> {
fn basic_account(&self, address: &Address) -> ProviderResult<Option<Account>> {
Ok(self.accounts.lock().get(address).cloned().map(|a| a.account))
}
}

impl StageCheckpointReader for MockEthProvider {
impl<T: Transaction> StageCheckpointReader for MockEthProvider<T> {
fn get_stage_checkpoint(&self, _id: StageId) -> ProviderResult<Option<StageCheckpoint>> {
Ok(None)
}
Expand All @@ -599,7 +606,7 @@ impl StageCheckpointReader for MockEthProvider {
}
}

impl StateRootProvider for MockEthProvider {
impl<T: Transaction> StateRootProvider for MockEthProvider<T> {
fn state_root(&self, _state: HashedPostState) -> ProviderResult<B256> {
Ok(self.state_roots.lock().pop().unwrap_or_default())
}
Expand All @@ -625,7 +632,7 @@ impl StateRootProvider for MockEthProvider {
}
}

impl StorageRootProvider for MockEthProvider {
impl<T: Transaction> StorageRootProvider for MockEthProvider<T> {
fn storage_root(
&self,
_address: Address,
Expand Down Expand Up @@ -653,7 +660,7 @@ impl StorageRootProvider for MockEthProvider {
}
}

impl StateProofProvider for MockEthProvider {
impl<T: Transaction> StateProofProvider for MockEthProvider<T> {
fn proof(
&self,
_input: TrieInput,
Expand All @@ -680,13 +687,13 @@ impl StateProofProvider for MockEthProvider {
}
}

impl HashedPostStateProvider for MockEthProvider {
impl<T: Transaction> HashedPostStateProvider for MockEthProvider<T> {
fn hashed_post_state(&self, _state: &revm::db::BundleState) -> HashedPostState {
HashedPostState::default()
}
}

impl StateProvider for MockEthProvider {
impl<T: Transaction> StateProvider for MockEthProvider<T> {
fn storage(
&self,
account: Address,
Expand All @@ -709,7 +716,7 @@ impl StateProvider for MockEthProvider {
}
}

impl StateProviderFactory for MockEthProvider {
impl<T: SignedTransaction> StateProviderFactory for MockEthProvider<T> {
fn latest(&self) -> ProviderResult<StateProviderBox> {
Ok(Box::new(self.clone()))
}
Expand Down Expand Up @@ -761,7 +768,7 @@ impl StateProviderFactory for MockEthProvider {
}
}

impl WithdrawalsProvider for MockEthProvider {
impl<T: Transaction> WithdrawalsProvider for MockEthProvider<T> {
fn withdrawals_by_block(
&self,
_id: BlockHashOrNumber,
Expand All @@ -771,13 +778,13 @@ impl WithdrawalsProvider for MockEthProvider {
}
}

impl OmmersProvider for MockEthProvider {
impl<T: Transaction> OmmersProvider for MockEthProvider<T> {
fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Header>>> {
Ok(None)
}
}

impl BlockBodyIndicesProvider for MockEthProvider {
impl<T: Transaction> BlockBodyIndicesProvider for MockEthProvider<T> {
fn block_body_indices(&self, _num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> {
Ok(None)
}
Expand All @@ -789,7 +796,7 @@ impl BlockBodyIndicesProvider for MockEthProvider {
}
}

impl ChangeSetReader for MockEthProvider {
impl<T: Transaction> ChangeSetReader for MockEthProvider<T> {
fn account_block_changeset(
&self,
_block_number: BlockNumber,
Expand All @@ -798,7 +805,7 @@ impl ChangeSetReader for MockEthProvider {
}
}

impl StateReader for MockEthProvider {
impl<T: Transaction> StateReader for MockEthProvider<T> {
type Receipt = Receipt;

fn get_state(&self, _block: BlockNumber) -> ProviderResult<Option<ExecutionOutcome>> {
Expand Down
Loading