ghost-crab 0.4.0

ethereum indexer SDK 👻🦀
Documentation
use alloy::providers::Provider;
use alloy::transports::TransportError;
use std::time::{Duration, Instant};

use crate::cache::manager::CacheProvider;

pub struct LatestBlockManager {
    provider: CacheProvider,
    cache_duration: Duration,
    block_number: Option<u64>,
    last_fetch: Instant,
}

impl LatestBlockManager {
    pub fn new(provider: CacheProvider, cache_duration: Duration) -> Self {
        Self { provider, cache_duration, block_number: None, last_fetch: Instant::now() }
    }

    pub async fn get(&mut self) -> Result<u64, TransportError> {
        if let Some(block_number) = self.block_number {
            if self.last_fetch.elapsed() < self.cache_duration {
                return Ok(block_number);
            }
        }

        let block_number = self.provider.get_block_number().await?;

        self.block_number = Some(block_number);
        self.last_fetch = Instant::now();

        Ok(block_number)
    }
}