ethers_utils/
chain.rs

1use ethers::prelude::*;
2
3#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
4pub enum ChainVariant {
5    Chain(Chain),
6    UnknownChain(U256),
7}
8
9impl ChainVariant {
10    /// # Panics
11    /// Panics if the `Chain::UnknownChain` id is larger than u64::max_value().
12    pub fn as_u64(&self) -> u64 {
13        match self {
14            ChainVariant::Chain(chain) => *chain as u64,
15            ChainVariant::UnknownChain(id) => id.as_u64(),
16        }
17    }
18}
19
20impl From<u64> for ChainVariant {
21    fn from(chain_id: u64) -> Self {
22        match Chain::try_from(chain_id) {
23            Ok(chain) => Self::Chain(chain),
24            Err(_) => Self::UnknownChain(U256::from(chain_id)),
25        }
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    const UNKNOWN_CHAIN_ID: u64 = 99999999;
34
35    #[test]
36    fn chain_variant() {
37        let mainnet = ChainVariant::from(1);
38        assert_eq!(mainnet, ChainVariant::Chain(Chain::Mainnet));
39        assert_eq!(mainnet.as_u64(), 1);
40
41        let unknown = ChainVariant::from(UNKNOWN_CHAIN_ID);
42        assert_eq!(
43            unknown,
44            ChainVariant::UnknownChain(U256::from(UNKNOWN_CHAIN_ID))
45        );
46        assert_eq!(unknown.as_u64(), UNKNOWN_CHAIN_ID);
47    }
48}