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/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
20pub(crate) mod constants;
22pub use constants::MIN_TRANSACTION_GAS;
23
24mod api;
25mod info;
27mod spec;
29
30pub use alloy_chains::{Chain, ChainKind, NamedChain};
31pub 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
44pub 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}