From ba3f35947b20e78c1f51e1251e98d805e0d3771c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kyle=20=F0=9F=90=86?= Date: Thu, 26 Feb 2026 21:27:09 -0500 Subject: [PATCH 1/2] Add XpubAnnounce and on_xpub_announced to UDL bindings --- keep-mobile/src/keep_mobile.udl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/keep-mobile/src/keep_mobile.udl b/keep-mobile/src/keep_mobile.udl index 591b153a..37c9c813 100644 --- a/keep-mobile/src/keep_mobile.udl +++ b/keep-mobile/src/keep_mobile.udl @@ -163,6 +163,12 @@ dictionary DescriptorProposal { sequence tiers; }; +dictionary AnnouncedXpubInfo { + string xpub; + string fingerprint; + string? label; +}; + [Trait, WithForeign] interface DescriptorCallbacks { [Throws=KeepMobileError] @@ -175,6 +181,8 @@ interface DescriptorCallbacks { void on_complete(string session_id, string external_descriptor, string internal_descriptor); [Throws=KeepMobileError] void on_failed(string session_id, string error); + [Throws=KeepMobileError] + void on_xpub_announced(u16 share_index, sequence xpubs); }; [Trait, WithForeign] @@ -275,6 +283,9 @@ interface KeepMobile { [Throws=KeepMobileError] void wallet_descriptor_approve_contribution(string session_id); + + [Throws=KeepMobileError] + void wallet_announce_xpubs(sequence xpubs); }; dictionary ParsedBunkerUrl { From 16c11650e14f41ea5bcc0f86eb6916505c41ca40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kyle=20=F0=9F=90=86?= Date: Thu, 26 Feb 2026 21:32:23 -0500 Subject: [PATCH 2/2] Wire HealthCheckComplete event to desktop UI --- keep-desktop/src/frost.rs | 32 ++++++++++++++++++++++++++++++++ keep-desktop/src/message.rs | 12 ++++++++++++ 2 files changed, 44 insertions(+) diff --git a/keep-desktop/src/frost.rs b/keep-desktop/src/frost.rs index e830d889..855283ab 100644 --- a/keep-desktop/src/frost.rs +++ b/keep-desktop/src/frost.rs @@ -565,6 +565,19 @@ pub(crate) async fn frost_event_listener( }, ); } + Ok(KfpNodeEvent::HealthCheckComplete { + responsive, + unresponsive, + .. + }) => { + push_frost_event( + &frost_events, + FrostNodeMsg::HealthCheckComplete { + responsive, + unresponsive, + }, + ); + } Ok(_) => {} Err(tokio::sync::broadcast::error::RecvError::Lagged(_)) => {} Err(tokio::sync::broadcast::error::RecvError::Closed) => break, @@ -807,6 +820,25 @@ impl App { "Received recovery xpub announcement" ); } + FrostNodeMsg::HealthCheckComplete { + responsive, + unresponsive, + } => { + tracing::info!( + responsive = responsive.len(), + unresponsive = unresponsive.len(), + "Health check complete" + ); + if let Some(s) = self.relay_screen_mut() { + for peer in &mut s.peers { + if responsive.contains(&peer.share_index) { + peer.online = true; + } else if unresponsive.contains(&peer.share_index) { + peer.online = false; + } + } + } + } } iced::Task::none() } diff --git a/keep-desktop/src/message.rs b/keep-desktop/src/message.rs index efea3e29..478af9b1 100644 --- a/keep-desktop/src/message.rs +++ b/keep-desktop/src/message.rs @@ -324,6 +324,10 @@ pub enum FrostNodeMsg { share_index: u16, recovery_xpubs: Vec, }, + HealthCheckComplete { + responsive: Vec, + unresponsive: Vec, + }, } impl fmt::Debug for FrostNodeMsg { @@ -390,6 +394,14 @@ impl fmt::Debug for FrostNodeMsg { .field("share_index", share_index) .field("xpub_count", &recovery_xpubs.len()) .finish(), + Self::HealthCheckComplete { + responsive, + unresponsive, + } => f + .debug_struct("HealthCheckComplete") + .field("responsive", &responsive.len()) + .field("unresponsive", &unresponsive.len()) + .finish(), } } }