ethers-utils 0.2.0

Extensions for ethers
Documentation
use crate::chain::*;
use async_trait::async_trait;
use ethers::{providers::Middleware, types::Chain};

#[async_trait]
pub trait MiddlewareExt: Middleware {
    async fn get_chain_variant(&self) -> Result<ChainVariant, Self::Error> {
        let chain_id = self.get_chainid().await?;

        match Chain::try_from(chain_id) {
            Ok(chain) => Ok(ChainVariant::Chain(chain)),
            Err(_) => Ok(ChainVariant::UnknownChain(chain_id)),
        }
    }
}

impl<M: Middleware> MiddlewareExt for M {}

#[cfg(test)]
mod tests {
    use super::*;
    use ethers::types::Chain;
    use ethers::{providers::Provider, utils::Anvil};
    use url::Url;

    const ETHEREUM_URL: &'static str = "https://ethereum-mainnet-rpc.allthatnode.com";

    const FAKE_CHAIN_ID: u64 = 9999999999;

    #[tokio::test]
    async fn test_get_chain_variant() {
        let provider = ethers::providers::Http::new(Url::parse(ETHEREUM_URL).unwrap());
        let provider = Provider::new(provider);
        let chain = provider.get_chain_variant().await.unwrap();
        assert_eq!(chain, ChainVariant::Chain(Chain::Mainnet));

        let anvil = Anvil::new().chain_id(FAKE_CHAIN_ID).spawn();
        let provider = ethers::providers::Http::new(Url::parse(&anvil.endpoint()).unwrap());
        let provider = Provider::new(provider);
        let chain = provider.get_chain_variant().await.unwrap();
        assert_eq!(chain, ChainVariant::UnknownChain(FAKE_CHAIN_ID.into()));
    }
}