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 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}