diff --git a/liana-gui/src/installer/step/descriptor/editor/mod.rs b/liana-gui/src/installer/step/descriptor/editor/mod.rs index b4dfa94c..c6157d9e 100644 --- a/liana-gui/src/installer/step/descriptor/editor/mod.rs +++ b/liana-gui/src/installer/step/descriptor/editor/mod.rs @@ -508,6 +508,7 @@ impl Step for DefineDescriptor { threshold: p.threshold, keys: self.path_keys(p), }), + self.paths.len().saturating_sub(1), // subtract 1 for primary path self.valid(), ), }; diff --git a/liana-gui/src/installer/view/editor/template/custom.rs b/liana-gui/src/installer/view/editor/template/custom.rs index e6eb0782..24cc011d 100644 --- a/liana-gui/src/installer/view/editor/template/custom.rs +++ b/liana-gui/src/installer/view/editor/template/custom.rs @@ -59,8 +59,10 @@ pub fn custom_template<'a>( use_taproot: bool, primary_path: Path<'a>, recovery_paths: &mut dyn Iterator>, + num_recovery_paths: usize, valid: bool, ) -> Element<'a, Message> { + let prim_keys_fixed = primary_path.keys.len() < 2; // can only delete a primary key if there are 2 or more layout( progress, None, @@ -113,14 +115,14 @@ pub fn custom_template<'a>( } else { None }, - i == 0, + prim_keys_fixed, ) } else { undefined_key( color::GREEN, "Primary key", !primary_path.keys[0..i].iter().any(|k| k.is_none()), - i == 0, + prim_keys_fixed, ) } .map(move |msg| message::DefinePath::Key(i, msg)) @@ -144,6 +146,9 @@ pub fn custom_template<'a>( .iter() .enumerate() .map(|(j, recovery_key)| { + // We cannot delete a key if doing so would remove all recovery paths, + // i.e. if there is only 1 recovery path and it contains only 1 key. + let fixed = num_recovery_paths < 2 && p.keys.len() < 2; if let Some(key) = recovery_key { defined_key( &key.name, @@ -154,14 +159,14 @@ pub fn custom_template<'a>( } else { None }, - false, + fixed, ) } else { undefined_key( color::ORANGE, "Recovery key", !p.keys[0..j].iter().any(|k| k.is_none()), - false, + fixed, ) } .map(move |msg| message::DefinePath::Key(j, msg))