use alloy::{primitives::BlockNumber, providers::Provider};
use crate::{
EthPricesError,
network::{NetworkId, NetworkInstant},
provider::RpcProvider,
};
#[derive(Debug, Clone)]
pub enum NetworkTime {
EVM(NetworkId, BlockNumber, RpcProvider),
Fiat(u64),
}
impl NetworkTime {
pub fn as_evm(&self) -> Option<(&NetworkId, &BlockNumber, &RpcProvider)> {
match self {
NetworkTime::EVM(chain_id, block_number, provider) => {
Some((chain_id, block_number, provider))
}
_ => None,
}
}
pub fn as_fiat(&self) -> Option<&u64> {
match self {
NetworkTime::Fiat(date_time) => Some(date_time),
_ => None,
}
}
pub fn instant(self) -> NetworkInstant {
match self {
NetworkTime::EVM(network_id, block_number, provider) => {
NetworkInstant::default().with_evm_block(network_id, block_number, provider)
}
NetworkTime::Fiat(date_time) => {
NetworkInstant::default().with_fiat_timestamp(date_time)
}
}
}
pub async fn from_provider_latest(
provider: RpcProvider,
network_id: NetworkId,
) -> Result<Self, EthPricesError> {
provider
.get_block_number()
.await
.map(|block_number| NetworkTime::EVM(network_id, block_number, provider))
.map_err(EthPricesError::from)
}
pub fn from_provider(
provider: RpcProvider,
network_id: NetworkId,
block_number: BlockNumber,
) -> Self {
NetworkTime::EVM(network_id, block_number, provider)
}
#[cfg(feature = "time")]
pub fn with_fiat_now() -> Self {
use std::time::{SystemTime, UNIX_EPOCH};
let time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs();
NetworkTime::Fiat(time)
}
}