use crate::primitives::processed_types::block_proofs::ProcessedBlockProofs;
use crate::primitives::ChainId;
use std::future::Future;
use std::pin::Pin;
use super::config::ProviderConfig;
use super::error::ProviderError;
use super::evm::provider::EvmProvider;
use super::key::CategorizedFetchKeys;
use super::starknet::provider::StarknetProvider;
use super::types::FetchedDatalake;
pub type FetchProofsResult = Result<FetchedDatalake, ProviderError>;
pub type FetchProofsFromKeysResult = Result<ProcessedBlockProofs, ProviderError>;
pub type AsyncResult<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
pub trait ProofProvider: Send + Sync {
fn fetch_proofs<'a>(
&'a self,
datalake: &'a crate::primitives::task::datalake::DatalakeCompute,
) -> AsyncResult<FetchProofsResult>;
fn fetch_proofs_from_keys(
&self,
keys: CategorizedFetchKeys,
) -> AsyncResult<FetchProofsFromKeysResult>;
}
pub fn new_provider_from_config(config: &ProviderConfig) -> Box<dyn ProofProvider> {
match config.chain_id {
ChainId::EthereumMainnet | ChainId::EthereumSepolia => Box::new(EvmProvider::new(config)),
ChainId::StarknetSepolia | ChainId::StarknetMainnet => {
Box::new(StarknetProvider::new(config))
}
}
}