2.0.0: the network move to the Igneum 2.0 devnet (igneum-devnet-4): the package's suffix 4 and its seeds (build-1's seed and hand, dn4-seed 64.119.209.250:21703, lp-4090-01 69.145.85.93:17873), the hive's node on --devnet-suffix (DEVNET_SUFFIX, default 4) with the same seeds, network_name reads igneum-devnet-4, the test network no longer offered, the chain label Igneum 2.0 devnet; the tests rewritten known-failed first

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
igneum-labs 2026-10-08 15:41:09 +00:00
parent f8d3c4b505
commit 9dd263a52e
4 changed files with 20 additions and 28 deletions

View file

@ -201,11 +201,12 @@ fn nineteen() -> f64 {
/// The network step's rule (0.3.23): a switch is refused when the network is unknown, when it names the testnet while the
/// manifest has not opened it, and when the engine runs another network and the user has not confirmed what resets.
pub fn network_switch(want: &str, running: &str, testnet_open: bool, confirmed: bool) -> Result<(), String> {
if !["devnet-3", "testnet-1"].contains(&want) {
if !["devnet-4", "devnet-3", "testnet-1"].contains(&want) {
return Err(format!("'{want}' is not a network this app knows"));
}
if want == "testnet-1" && !testnet_open {
return Err("igneum-testnet-1 is not yet open: the choice waits for the manifest to open it".into());
if want == "testnet-1" {
let _ = testnet_open;
return Err("the test network is no longer offered: Igneum 2.0 runs one devnet".into());
}
if network_name(want) != running && !confirmed {
return Err("switching the network needs the confirm: the node's data and the mining state reset at the next start".into());
@ -216,7 +217,8 @@ pub fn network_switch(want: &str, running: &str, testnet_open: bool, confirmed:
pub fn network_name(choice: &str) -> &'static str {
match choice {
"testnet-1" => "igneum-testnet-1",
_ => "igneum-devnet-3",
"devnet-3" => "igneum-devnet-3",
_ => "igneum-devnet-4",
}
}
/// The seeds of igneum-testnet-1 (docs/plans/testnet-go.md: p2p 26811, chain id 4462). The node compiles no DNS seeders for
@ -518,23 +520,13 @@ mod tests {
#[test]
fn network_switch_rules() {
// the network step: unknown refused; the testnet refused until open; another network needs the confirm; the same network is fine
assert!(super::network_switch("mainnet", "igneum-devnet-3", true, true).is_err());
assert!(super::network_switch("testnet-1", "igneum-devnet-3", false, true).unwrap_err().contains("not yet open"));
assert!(super::network_switch("testnet-1", "igneum-devnet-3", true, false).unwrap_err().contains("needs the confirm"));
assert!(super::network_switch("testnet-1", "igneum-devnet-3", true, true).is_ok());
assert!(super::network_switch("devnet-3", "igneum-devnet-3", false, false).is_ok(), "the network already running needs no confirm");
assert_eq!(super::network_name(""), "igneum-devnet-3");
assert_eq!(super::network_name("testnet-1"), "igneum-testnet-1");
// a fresh settings file carries no choice; an old file without the field reads none too, so it keeps the package's network
assert_eq!(super::Settings::default().network, "");
let old: super::Settings = serde_json::from_str(r#"{"region":"gb"}"#).unwrap();
assert_eq!(old.network, "");
let chosen: super::Settings = serde_json::from_str(r#"{"network":"testnet-1"}"#).unwrap();
assert_eq!(chosen.network, "testnet-1");
let r = super::Runtime::from_env_with_choice(Some(3), None, "testnet-1");
assert_eq!(r.network, "testnet");
assert_eq!(r.devnet_suffix, None);
assert!(r.peers.iter().any(|p| p.starts_with("seed1.testnet.igneum.network")));
// Igneum 2.0 (8 October 2026): one devnet; the test network is no longer offered whatever the manifest says
assert!(super::network_switch("mainnet", "igneum-devnet-4", true, true).is_err());
assert!(super::network_switch("testnet-1", "igneum-devnet-4", true, true).unwrap_err().contains("no longer offered"));
assert!(super::network_switch("devnet-4", "igneum-devnet-4", false, false).is_ok(), "the network already running needs no confirm");
assert!(super::network_switch("devnet-3", "igneum-devnet-4", false, false).unwrap_err().contains("needs the confirm"), "a Devnet 3 choice on the 2.0 devnet is a switch");
assert_eq!(super::network_name(""), "igneum-devnet-4");
assert_eq!(super::network_name("devnet-4"), "igneum-devnet-4");
}
#[test]

View file

@ -182,9 +182,9 @@ impl Shared {
}
let mut st = State { version: VERSION.into(), preview: PREVIEW.unwrap_or("").into(), ..Default::default() };
st.network = runtime.network.clone();
st.network_name = if runtime.network == "testnet" { "igneum-testnet-1".into() } else if runtime.devnet_suffix == Some(3) { "igneum-devnet-3".into() } else if runtime.network == "devnet" && runtime.devnet_suffix.is_none() { "igneum-devnet-v4".into() } else { format!("igneum-{}-{}", runtime.network, runtime.devnet_suffix.unwrap_or(0)) };
st.network_name = if runtime.network == "testnet" { "igneum-testnet-1".into() } else if let Some(n) = runtime.devnet_suffix { format!("igneum-devnet-{n}") } else if runtime.network == "devnet" && runtime.devnet_suffix.is_none() { "igneum-devnet-v4".into() } else { format!("igneum-{}-{}", runtime.network, runtime.devnet_suffix.unwrap_or(0)) };
st.network_pending = if !settings.network.is_empty() && crate::config::network_name(&settings.network) != st.network_name { settings.network.clone() } else { String::new() };
st.chain = if runtime.network == "devnet" { "devnet v4".into() } else { format!("{} (private)", runtime.network) };
st.chain = if runtime.network == "devnet" { "Igneum 2.0 devnet".into() } else { format!("{} (private)", runtime.network) };
st.host = runtime.host.clone();
st.display_name = if settings.display_name.is_empty() { runtime.host.clone() } else { settings.display_name.clone() };
st.machine_id = runtime.machine_id.clone();

View file

@ -29,7 +29,7 @@ if [[ "$NODE_URL" == "local" ]]; then
NODE_URL="grpc://127.0.0.1:26610"
peers=()
if [[ -n "$PEERS" ]]; then IFS=',' read -r -a plist <<< "$PEERS"; for p in "${plist[@]}"; do peers+=("--addpeer=$p"); done
else peers+=("--addpeer=188.245.5.161:26611"); fi # the public devnet seed (app/igneum-app/src/config.rs)
else peers+=("--addpeer=188.40.146.49:26631" "--addpeer=64.119.209.250:21703" "--addpeer=69.145.85.93:17873"); fi # the Igneum 2.0 devnet seeds (packaging/mac/packaged-config.sh NODE_PEERS)
# the consensus override (OVERRIDE in the Flight Sheet's extra config, written to igneum.conf by h-config.sh): the
# devnet's activation heights. A node without it runs on genesis parameters, prints another digest in the p2p
# handshake and is refused by every devnet peer (release 0.3.11, section 5, C41).
@ -41,8 +41,8 @@ if [[ "$NODE_URL" == "local" ]]; then
else
say "WARNING: no OVERRIDE in the Flight Sheet; the node runs on genesis parameters and every devnet peer will refuse it. Set OVERRIDE from the downloads page."
fi
say "starting the bundled node (devnet, data $HERE/data, peers ${peers[*]#--addpeer=})"
"$BIN/igneumd" --devnet "--appdir=$HERE/data" --rpclisten=127.0.0.1:26610 --listen=0.0.0.0:26611 "${peers[@]}" \
say "starting the bundled node (the Igneum 2.0 devnet, suffix ${DEVNET_SUFFIX:-4}, data $HERE/data, peers ${peers[*]#--addpeer=})"
"$BIN/igneumd" --devnet "--devnet-suffix=${DEVNET_SUFFIX:-4}" "--appdir=$HERE/data" --rpclisten=127.0.0.1:26610 --listen=0.0.0.0:26611 "${peers[@]}" \
${override[@]+"${override[@]}"} --nodnsseed --disable-upnp --nologfiles --yes >> "$CUSTOM_LOG_BASENAME.node.log" 2>&1 &
pids+=($!)
fi

View file

@ -36,8 +36,8 @@ DL_HOST="https://dl.igneum.network"
# node1-dn3; the fleet's genesis boxes have no stable public port and stay the fleet's seeds). The shared devnet's
# sixteen-field object of 0.3.20 is kept below for the record; a 0.3.2x package for the shared devnet would set it again.
NODE_OVERRIDE_PARAMS=''
NODE_DEVNET_SUFFIX='3'
NODE_PEERS='["188.40.146.49:26631","188.40.146.49:26671","64.119.209.250:21703","154.64.230.67:27017"]'
NODE_DEVNET_SUFFIX='4'
NODE_PEERS='["188.40.146.49:26631","188.40.146.49:26671","64.119.209.250:21703","69.145.85.93:17873"]'
# the shared devnet's object as 0.3.20 shipped it (digest 4bbbe816 on the pin): '{"difficulty_v2_activation_daa":33000,"exec_restart_hash":"bb45cf0dd2d7cc97ebfa5a2701527c09a8ede5d32de74efead9caa293b15688a","exec_restart_number":27276,"exec_restart_state_root":"0xed27bb2d6128daf50493ed5539a73bb93f9d7c63ad7f70a7cbb46ba81c9e164e","exec_restart_trust_daa":200000,"fees_v1_activation_daa":210000,"finality_v3_activation_daa":135200,"program_class_v3_activation_daa":154800,"program_class_v4_activation_daa":831600,"program_class_v4_signal_window_daa":86400,"proving_v0_activation_daa":84100,"proving_v1_activation_daa":154800,"proving_v1_aggregator_share_bps":1000,"proving_v1_fresh_rule_daa":198000,"proving_v1_segment_blocks":8,"proving_v1_unproven_daa":600}'
# igneum_secret_file <env var name> <base name> -> the file to read: the variable when set, else <base>.next when it
# exists, else <base>; IGNEUM_CONFIG_DIR (tests) replaces ~/.config/igneum