#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ChainKind {
Evm,
Solana,
Bitcoin,
Other(&'static str),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ChainInfo {
pub key: String,
pub name: String,
pub kind: ChainKind,
pub evm_chain_id: Option<u64>,
pub native_symbol: String,
pub native_decimals: u8,
}
impl ChainInfo {
pub fn new(key: &str, name: &str, kind: ChainKind, symbol: &str, decimals: u8) -> Self {
Self {
key: key.into(),
name: name.into(),
kind,
evm_chain_id: None,
native_symbol: symbol.into(),
native_decimals: decimals,
}
}
pub fn with_evm_chain_id(mut self, id: u64) -> Self {
self.evm_chain_id = Some(id);
self
}
pub fn evm_unknown(chain_id: u64) -> Self {
Self::new(
&format!("evm-{chain_id}"),
&format!("EVM chain {chain_id}"),
ChainKind::Evm,
"ETH",
18,
)
.with_evm_chain_id(chain_id)
}
pub fn solana_mainnet() -> Self {
Self::new("solana-mainnet", "Solana", ChainKind::Solana, "SOL", 9)
}
pub fn solana_devnet() -> Self {
Self::new(
"solana-devnet",
"Solana Devnet",
ChainKind::Solana,
"SOL",
9,
)
}
pub fn bitcoin_mainnet() -> Self {
Self::new("bitcoin", "Bitcoin", ChainKind::Bitcoin, "BTC", 8)
}
pub fn bitcoin_testnet() -> Self {
Self::new(
"bitcoin-testnet",
"Bitcoin Testnet",
ChainKind::Bitcoin,
"tBTC",
8,
)
}
}
pub const KNOWN_EVM_CHAINS: &[(u64, &str, &str, &str)] = &[
(1, "ethereum", "Ethereum", "ETH"),
(10, "optimism", "OP Mainnet", "ETH"),
(56, "bsc", "BNB Smart Chain", "BNB"),
(100, "gnosis", "Gnosis", "xDAI"),
(137, "polygon", "Polygon PoS", "POL"),
(324, "zksync", "zkSync Era", "ETH"),
(2020, "ronin", "Ronin", "RON"),
(2021, "ronin-saigon", "Ronin Saigon", "RON"), (5000, "mantle", "Mantle", "MNT"),
(8453, "base", "Base", "ETH"),
(42161, "arbitrum", "Arbitrum One", "ETH"),
(42220, "celo", "Celo", "CELO"),
(43114, "avalanche", "Avalanche C-Chain", "AVAX"),
(59144, "linea", "Linea", "ETH"),
(81457, "blast", "Blast", "ETH"),
(534352, "scroll", "Scroll", "ETH"),
(11155111, "sepolia", "Sepolia", "ETH"),
(84532, "base-sepolia", "Base Sepolia", "ETH"),
];
pub fn by_id(chain_id: u64) -> Option<ChainInfo> {
KNOWN_EVM_CHAINS
.iter()
.find(|(id, ..)| *id == chain_id)
.map(|(id, key, name, sym)| {
ChainInfo::new(key, name, ChainKind::Evm, sym, 18).with_evm_chain_id(*id)
})
}
pub fn by_key(key: &str) -> Option<ChainInfo> {
KNOWN_EVM_CHAINS
.iter()
.find(|(_, k, ..)| *k == key)
.and_then(|(id, ..)| by_id(*id))
}