feat: Add testnet chainspec

This commit is contained in:
sprites0
2025-08-22 05:54:33 -04:00
parent 26c1973503
commit 6543fac314
4 changed files with 28 additions and 7 deletions

View File

@ -34,12 +34,10 @@ pub static HL_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
]) ])
}); });
/// The Hyperliqiud Mainnet spec pub fn hl_chainspec(chain: Chain, genesis: &'static str) -> ChainSpec {
pub fn hl_mainnet() -> ChainSpec {
ChainSpec { ChainSpec {
chain: Chain::from_named(NamedChain::Hyperliquid), chain,
genesis: serde_json::from_str(include_str!("genesis.json")) genesis: serde_json::from_str(genesis).expect("Can't deserialize Hyperliquid genesis json"),
.expect("Can't deserialize Hyperliquid Mainnet genesis json"),
genesis_header: empty_genesis_header(), genesis_header: empty_genesis_header(),
paris_block_and_final_difficulty: Some((0, U256::from(0))), paris_block_and_final_difficulty: Some((0, U256::from(0))),
hardforks: HL_HARDFORKS.clone(), hardforks: HL_HARDFORKS.clone(),
@ -48,6 +46,18 @@ pub fn hl_mainnet() -> ChainSpec {
} }
} }
/// The Hyperliqiud Mainnet spec
pub fn hl_mainnet() -> ChainSpec {
hl_chainspec(Chain::from_named(NamedChain::Hyperliquid), include_str!("genesis.json"))
}
/// The Hyperliqiud Testnet spec
pub fn hl_testnet() -> ChainSpec {
// Note: Testnet sync starts from snapshotted state [1] instead of genesis block.
// So the `alloc` field is not used, which makes it fine to reuse mainnet genesis file.
hl_chainspec(Chain::from_id_unchecked(998), include_str!("genesis.json"))
}
/// Empty genesis header for Hyperliquid Mainnet. /// Empty genesis header for Hyperliquid Mainnet.
/// ///
/// The exact value is not known per se, but the parent hash of block 1 is known to be /// The exact value is not known per se, but the parent hash of block 1 is known to be

View File

@ -1,11 +1,11 @@
use crate::chainspec::HlChainSpec; use crate::chainspec::{hl::hl_testnet, HlChainSpec};
use super::hl::hl_mainnet; use super::hl::hl_mainnet;
use reth_cli::chainspec::ChainSpecParser; use reth_cli::chainspec::ChainSpecParser;
use std::sync::Arc; use std::sync::Arc;
/// Chains supported by HyperEVM. First value should be used as the default. /// Chains supported by HyperEVM. First value should be used as the default.
pub const SUPPORTED_CHAINS: &[&str] = &["mainnet"]; pub const SUPPORTED_CHAINS: &[&str] = &["mainnet", "testnet"];
/// Hyperliquid chain specification parser. /// Hyperliquid chain specification parser.
#[derive(Debug, Clone, Default)] #[derive(Debug, Clone, Default)]
@ -27,6 +27,7 @@ impl ChainSpecParser for HlChainSpecParser {
pub fn chain_value_parser(s: &str) -> eyre::Result<Arc<HlChainSpec>> { pub fn chain_value_parser(s: &str) -> eyre::Result<Arc<HlChainSpec>> {
match s { match s {
"mainnet" => Ok(Arc::new(HlChainSpec { inner: hl_mainnet() })), "mainnet" => Ok(Arc::new(HlChainSpec { inner: hl_mainnet() })),
"testnet" => Ok(Arc::new(HlChainSpec { inner: hl_testnet() })),
_ => Err(eyre::eyre!("Unsupported chain: {}", s)), _ => Err(eyre::eyre!("Unsupported chain: {}", s)),
} }
} }

View File

@ -50,6 +50,7 @@ pub async fn start_pseudo_peer(
// Create network manager // Create network manager
let (mut network, start_tx) = create_network_manager::<BlockSourceBoxed>( let (mut network, start_tx) = create_network_manager::<BlockSourceBoxed>(
(*chain_spec).clone(),
destination_peer, destination_peer,
block_source.clone(), block_source.clone(),
blockhash_cache.clone(), blockhash_cache.clone(),

View File

@ -19,6 +19,7 @@ pub struct NetworkBuilder {
boot_nodes: Vec<TrustedPeer>, boot_nodes: Vec<TrustedPeer>,
discovery_port: u16, discovery_port: u16,
listener_port: u16, listener_port: u16,
chain_spec: HlChainSpec,
} }
impl Default for NetworkBuilder { impl Default for NetworkBuilder {
@ -29,6 +30,7 @@ impl Default for NetworkBuilder {
boot_nodes: vec![], boot_nodes: vec![],
discovery_port: 0, discovery_port: 0,
listener_port: 0, listener_port: 0,
chain_spec: HlChainSpec::default(),
} }
} }
} }
@ -55,6 +57,11 @@ impl NetworkBuilder {
self self
} }
pub fn with_chain_spec(mut self, chain_spec: HlChainSpec) -> Self {
self.chain_spec = chain_spec;
self
}
pub async fn build<BS>( pub async fn build<BS>(
self, self,
block_source: Arc<Box<dyn super::sources::BlockSource>>, block_source: Arc<Box<dyn super::sources::BlockSource>>,
@ -80,12 +87,14 @@ impl NetworkBuilder {
} }
pub async fn create_network_manager<BS>( pub async fn create_network_manager<BS>(
chain_spec: HlChainSpec,
destination_peer: String, destination_peer: String,
block_source: Arc<Box<dyn super::sources::BlockSource>>, block_source: Arc<Box<dyn super::sources::BlockSource>>,
blockhash_cache: BlockHashCache, blockhash_cache: BlockHashCache,
) -> eyre::Result<(NetworkManager<HlNetworkPrimitives>, mpsc::Sender<()>)> { ) -> eyre::Result<(NetworkManager<HlNetworkPrimitives>, mpsc::Sender<()>)> {
NetworkBuilder::default() NetworkBuilder::default()
.with_boot_nodes(vec![TrustedPeer::from_str(&destination_peer).unwrap()]) .with_boot_nodes(vec![TrustedPeer::from_str(&destination_peer).unwrap()])
.with_chain_spec(chain_spec)
.build::<BS>(block_source, blockhash_cache) .build::<BS>(block_source, blockhash_cache)
.await .await
} }