reth_chainspec/
lib.rs

1//! The spec of an Ethereum network
2
3#![doc(
4    html_logo_url = "https://raw.githubusercontent.com/paradigmxyz/reth/main/assets/reth-docs.png",
5    html_favicon_url = "https://avatars0.githubusercontent.com/u/97369466?s=256",
6    issue_tracker_base_url = "https://github.com/SeismicSystems/seismic-reth/issues/"
7)]
8#![cfg_attr(not(test), warn(unused_crate_dependencies))]
9#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
10#![cfg_attr(not(feature = "std"), no_std)]
11
12extern crate alloc;
13
14use once_cell as _;
15#[cfg(not(feature = "std"))]
16pub(crate) use once_cell::sync::{Lazy as LazyLock, OnceCell as OnceLock};
17#[cfg(feature = "std")]
18pub(crate) use std::sync::{LazyLock, OnceLock};
19
20/// Chain specific constants
21pub(crate) mod constants;
22pub use constants::MIN_TRANSACTION_GAS;
23
24mod api;
25/// The chain info module.
26mod info;
27/// The chain spec module.
28mod spec;
29
30pub use alloy_chains::{Chain, ChainKind, NamedChain};
31/// Re-export for convenience
32pub use reth_ethereum_forks::*;
33
34pub use api::EthChainSpec;
35pub use info::ChainInfo;
36#[cfg(any(test, feature = "test-utils"))]
37pub use spec::test_fork_ids;
38pub use spec::{
39    BaseFeeParams, BaseFeeParamsKind, ChainSpec, ChainSpecBuilder, ChainSpecProvider,
40    DepositContract, ForkBaseFeeParams, DEV, HOLESKY, MAINNET, SEISMIC_DEV, SEISMIC_MAINNET,
41    SEPOLIA,
42};
43
44/// Simple utility to create a thread-safe sync cell with a value set.
45pub fn once_cell_set<T>(value: T) -> OnceLock<T> {
46    let once = OnceLock::new();
47    let _ = once.set(value);
48    once
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54    use alloy_primitives::U256;
55    use alloy_rlp::Encodable;
56    use std::str::FromStr;
57
58    #[test]
59    fn test_id() {
60        let chain = Chain::from(1234);
61        assert_eq!(chain.id(), 1234);
62    }
63
64    #[test]
65    fn test_named_id() {
66        let chain = Chain::from_named(NamedChain::Holesky);
67        assert_eq!(chain.id(), 17000);
68    }
69
70    #[test]
71    fn test_display_named_chain() {
72        let chain = Chain::from_named(NamedChain::Mainnet);
73        assert_eq!(format!("{chain}"), "mainnet");
74    }
75
76    #[test]
77    fn test_display_id_chain() {
78        let chain = Chain::from(1234);
79        assert_eq!(format!("{chain}"), "1234");
80    }
81
82    #[test]
83    fn test_from_u256() {
84        let n = U256::from(1234);
85        let chain = Chain::from(n.to::<u64>());
86        let expected = Chain::from(1234);
87
88        assert_eq!(chain, expected);
89    }
90
91    #[test]
92    fn test_into_u256() {
93        let chain = Chain::from_named(NamedChain::Holesky);
94        let n: U256 = U256::from(chain.id());
95        let expected = U256::from(17000);
96
97        assert_eq!(n, expected);
98    }
99
100    #[test]
101    fn test_from_str_named_chain() {
102        let result = Chain::from_str("mainnet");
103        let expected = Chain::from_named(NamedChain::Mainnet);
104
105        assert!(result.is_ok());
106        assert_eq!(result.unwrap(), expected);
107    }
108
109    #[test]
110    fn test_from_str_named_chain_error() {
111        let result = Chain::from_str("chain");
112
113        assert!(result.is_err());
114    }
115
116    #[test]
117    fn test_from_str_id_chain() {
118        let result = Chain::from_str("1234");
119        let expected = Chain::from(1234);
120
121        assert!(result.is_ok());
122        assert_eq!(result.unwrap(), expected);
123    }
124
125    #[test]
126    fn test_default() {
127        let default = Chain::default();
128        let expected = Chain::from_named(NamedChain::Mainnet);
129
130        assert_eq!(default, expected);
131    }
132
133    #[test]
134    fn test_id_chain_encodable_length() {
135        let chain = Chain::from(1234);
136
137        assert_eq!(chain.length(), 3);
138    }
139
140    #[test]
141    fn test_dns_main_network() {
142        let s = "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.mainnet.ethdisco.net";
143        let chain: Chain = NamedChain::Mainnet.into();
144        assert_eq!(s, chain.public_dns_network_protocol().unwrap().as_str());
145    }
146
147    #[test]
148    fn test_dns_holesky_network() {
149        let s = "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.holesky.ethdisco.net";
150        let chain: Chain = NamedChain::Holesky.into();
151        assert_eq!(s, chain.public_dns_network_protocol().unwrap().as_str());
152    }
153}