reth_chainspec/
lib.rs
1#![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
14mod constants;
16pub use constants::*;
17
18mod api;
19mod info;
21mod spec;
23
24pub use alloy_chains::{Chain, ChainKind, NamedChain};
25pub 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
40pub 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}