op_alloy_registry/
chain_list.rs

1//! List of OP Stack chains.
2
3use alloc::{string::String, vec::Vec};
4
5/// List of Chains.
6#[derive(Debug, Clone, Default, Hash, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
7pub struct ChainList {
8    /// List of Chains.
9    pub chains: Vec<Chain>,
10}
11
12/// A Chain Definition.
13#[derive(Debug, Clone, Default, Hash, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
14#[serde(rename_all = "camelCase")]
15pub struct Chain {
16    /// The name of the chain.
17    pub name: String,
18    /// Chain identifier.
19    pub identifier: String,
20    /// Chain ID.
21    pub chain_id: u64,
22    /// List of RPC Endpoints.
23    pub rpc: Vec<String>,
24    /// List of Explorer Endpoints.
25    pub explorers: Vec<String>,
26    /// The Superchain Level.
27    pub superchain_level: u64,
28    /// The data avilability type.
29    pub data_availability_type: String,
30    /// The Superchain Parent.
31    pub parent: SuperchainParent,
32}
33
34/// A Chain Parent
35#[derive(Debug, Clone, Default, Hash, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
36#[serde(rename_all = "camelCase")]
37pub struct SuperchainParent {
38    /// The parent type.
39    pub r#type: String,
40    /// The chain identifier.
41    pub chain: String,
42}
43
44impl SuperchainParent {
45    /// Returns the chain id for the parent.
46    pub fn chain_id(&self) -> u64 {
47        match self.chain.as_ref() {
48            "mainnet" => 1,
49            "sepolia" => 11155111,
50            "sepolia-dev-0" => 11155421,
51            _ => 10,
52        }
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59
60    #[test]
61    fn read_chain_list_file() {
62        let chain_list = include_str!("../etc/chainList.json");
63        let chains: Vec<Chain> = serde_json::from_str(chain_list).unwrap();
64        let base_chain = chains.iter().find(|c| c.name == "Base").unwrap();
65        assert_eq!(base_chain.chain_id, 8453);
66    }
67}