use std::collections::HashMap;
use alloy::{primitives::BlockNumber, providers::Provider};
use crate::{
EthPricesError,
network::{Network, NetworkId, NetworkTime},
provider::RpcProvider,
};
#[derive(Default, Debug, Clone)]
pub struct NetworkInstant(pub HashMap<Network, NetworkTime>);
impl NetworkInstant {
pub fn get(&self, network_id: &Network) -> Option<&NetworkTime> {
self.0.get(network_id)
}
pub fn get_evm_block(
&self,
network_id: Network,
) -> Option<(&NetworkId, &BlockNumber, &RpcProvider)> {
self.0
.get(&network_id)
.and_then(|network_time| network_time.as_evm())
}
pub fn get_fiat_timestamp(&self) -> Option<&u64> {
self.0
.get(&Network::Fiat)
.and_then(|network_time| network_time.as_fiat())
}
pub fn with_fiat_timestamp(mut self, timestamp: u64) -> Self {
self.0.insert(Network::Fiat, NetworkTime::Fiat(timestamp));
self
}
#[cfg(feature = "time")]
pub fn with_now(mut self) -> Result<Self, EthPricesError> {
self.0.insert(Network::Fiat, NetworkTime::with_fiat_now());
Ok(self)
}
pub fn with_evm_block(
mut self,
network_id: NetworkId,
block_number: BlockNumber,
provider: RpcProvider,
) -> Self {
self.0.insert(
network_id.clone().into(),
NetworkTime::EVM(network_id, block_number, provider),
);
self
}
pub async fn with_evm_latest(
mut self,
network_id: NetworkId,
provider: RpcProvider,
) -> Result<Self, EthPricesError> {
self.0.insert(
network_id.clone().into(),
NetworkTime::from_provider_latest(provider, network_id).await?,
);
Ok(self)
}
pub async fn with_evm_provider(
mut self,
provider: RpcProvider,
) -> Result<Self, EthPricesError> {
let network_id = NetworkId::from_provider(&provider).await?;
let block_number = provider.get_block_number().await?;
let time = NetworkTime::from_provider(provider, network_id.clone(), block_number);
self.0.insert(network_id.into(), time);
Ok(self)
}
}