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/paradigmxyz/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
14/// Chain specific constants
15mod constants;
16pub use constants::*;
17
18mod api;
19/// The chain info module.
20mod info;
21/// The chain spec module.
22mod spec;
23
24pub use alloy_chains::{Chain, ChainKind, NamedChain};
25/// Re-export for convenience
26pub use reth_ethereum_forks::*;
27
28pub use api::EthChainSpec;
29pub use info::ChainInfo;
30#[cfg(any(test, feature = "test-utils"))]
31pub use spec::test_fork_ids;
32pub use spec::{
33    make_genesis_header, BaseFeeParams, BaseFeeParamsKind, ChainSpec, ChainSpecBuilder,
34    ChainSpecProvider, DepositContract, ForkBaseFeeParams, HardforkBlobParams, DEV, HOLESKY, HOODI,
35    MAINNET, SEPOLIA,
36};
37
38use reth_primitives_traits::sync::OnceLock;
39
40/// Simple utility to create a thread-safe sync cell with a value set.
41pub fn once_cell_set<T>(value: T) -> OnceLock<T> {
42    let once = OnceLock::new();
43    let _ = once.set(value);
44    once
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50    use alloy_primitives::U256;
51    use alloy_rlp::Encodable;
52    use std::str::FromStr;
53
54    #[test]
55    fn test_id() {
56        let chain = Chain::from(1234);
57        assert_eq!(chain.id(), 1234);
58    }
59
60    #[test]
61    fn test_named_id() {
62        let chain = Chain::from_named(NamedChain::Holesky);
63        assert_eq!(chain.id(), 17000);
64    }
65
66    #[test]
67    fn test_display_named_chain() {
68        let chain = Chain::from_named(NamedChain::Mainnet);
69        assert_eq!(format!("{chain}"), "mainnet");
70    }
71
72    #[test]
73    fn test_display_id_chain() {
74        let chain = Chain::from(1234);
75        assert_eq!(format!("{chain}"), "1234");
76    }
77
78    #[test]
79    fn test_from_u256() {
80        let n = U256::from(1234);
81        let chain = Chain::from(n.to::<u64>());
82        let expected = Chain::from(1234);
83
84        assert_eq!(chain, expected);
85    }
86
87    #[test]
88    fn test_into_u256() {
89        let chain = Chain::from_named(NamedChain::Holesky);
90        let n: U256 = U256::from(chain.id());
91        let expected = U256::from(17000);
92
93        assert_eq!(n, expected);
94    }
95
96    #[test]
97    fn test_from_str_named_chain() {
98        let result = Chain::from_str("mainnet");
99        let expected = Chain::from_named(NamedChain::Mainnet);
100
101        assert!(result.is_ok());
102        assert_eq!(result.unwrap(), expected);
103    }
104
105    #[test]
106    fn test_from_str_named_chain_error() {
107        let result = Chain::from_str("chain");
108
109        assert!(result.is_err());
110    }
111
112    #[test]
113    fn test_from_str_id_chain() {
114        let result = Chain::from_str("1234");
115        let expected = Chain::from(1234);
116
117        assert!(result.is_ok());
118        assert_eq!(result.unwrap(), expected);
119    }
120
121    #[test]
122    fn test_default() {
123        let default = Chain::default();
124        let expected = Chain::from_named(NamedChain::Mainnet);
125
126        assert_eq!(default, expected);
127    }
128
129    #[test]
130    fn test_id_chain_encodable_length() {
131        let chain = Chain::from(1234);
132
133        assert_eq!(chain.length(), 3);
134    }
135
136    #[test]
137    fn test_dns_main_network() {
138        let s = "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.mainnet.ethdisco.net";
139        let chain: Chain = NamedChain::Mainnet.into();
140        assert_eq!(s, chain.public_dns_network_protocol().unwrap().as_str());
141    }
142
143    #[test]
144    fn test_dns_holesky_network() {
145        let s = "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.holesky.ethdisco.net";
146        let chain: Chain = NamedChain::Holesky.into();
147        assert_eq!(s, chain.public_dns_network_protocol().unwrap().as_str());
148    }
149}