From 2146460455c0a7a95da56b95238378efbd211116 Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 14 Jul 2025 12:22:29 -0500 Subject: [PATCH] Complete onchain balance sync improvements - Added faster sync intervals (20s onchain, 10s lightning) - Added syncWallets() method to LightningNodeService and client interface - Added manual wallet sync after onchain transactions (send payments) - Added manual wallet sync after channel opening - Implemented Option C: faster intervals + manual sync after onchain operations This should significantly improve onchain balance update responsiveness by: 1. Syncing every 20 seconds instead of 80 seconds (4x faster) 2. Immediately syncing after any onchain transaction 3. Syncing after channel operations that affect onchain balance --- .../Lightning Service/LightningNodeService.swift | 15 +++++++++++++-- .../View Model/Home/Send/SendViewModel.swift | 15 ++++++++++++--- .../Profile/Channel/ChannelAddViewModel.swift | 1 + 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/LDKNodeMonday/Service/Lightning Service/LightningNodeService.swift b/LDKNodeMonday/Service/Lightning Service/LightningNodeService.swift index a9a8d7d..ee7dc37 100644 --- a/LDKNodeMonday/Service/Lightning Service/LightningNodeService.swift +++ b/LDKNodeMonday/Service/Lightning Service/LightningNodeService.swift @@ -96,6 +96,10 @@ class LightningNodeService { config.network = self.network config.trustedPeers0conf = [self.lsp.nodeId] // config.logLevel = .trace + + // Faster sync intervals for better balance updates + config.onchainWalletSyncIntervalSecs = 20 // Default: 80 seconds + config.lightningWalletSyncIntervalSecs = 10 // Default: 30 seconds let anchor_cfg = AnchorChannelsConfig( trustedPeersNoReserve: [self.lsp.nodeId], @@ -390,6 +394,10 @@ extension LightningNodeService { } } } + + func syncWallets() throws { + try self.ldkNode.syncWallets() + } } extension LightningNodeService { @@ -443,6 +451,7 @@ public struct LightningNodeClient { let getServer: () -> EsploraServer let getNetworkColor: () -> Color let listenForEvents: () -> Void + let syncWallets: () throws -> Void } extension LightningNodeClient { @@ -522,7 +531,8 @@ extension LightningNodeClient { getNetwork: { LightningNodeService.shared.network }, getServer: { LightningNodeService.shared.server }, getNetworkColor: { LightningNodeService.shared.networkColor }, - listenForEvents: { LightningNodeService.shared.listenForEvents() } + listenForEvents: { LightningNodeService.shared.listenForEvents() }, + syncWallets: { try LightningNodeService.shared.syncWallets() } ) } @@ -590,7 +600,8 @@ extension LightningNodeClient { getNetwork: { .signet }, getServer: { .mutiny_signet }, getNetworkColor: { .orange }, - listenForEvents: {} + listenForEvents: {}, + syncWallets: {} ) } diff --git a/LDKNodeMonday/View Model/Home/Send/SendViewModel.swift b/LDKNodeMonday/View Model/Home/Send/SendViewModel.swift index e41c731..0a78340 100644 --- a/LDKNodeMonday/View Model/Home/Send/SendViewModel.swift +++ b/LDKNodeMonday/View Model/Home/Send/SendViewModel.swift @@ -38,9 +38,15 @@ class SendViewModel: ObservableObject { switch paymentAddress?.type { case .bip21: let uriString = paymentAddress?.address ?? "" - _ = try await lightningClient.send(uriString) + let result = try await lightningClient.send(uriString) + if case .onchain = result { + try? lightningClient.syncWallets() + } case .bolt12: - _ = try await lightningClient.send(paymentAddress?.address ?? "") + let result = try await lightningClient.send(paymentAddress?.address ?? "") + if case .onchain = result { + try? lightningClient.syncWallets() + } case .onchain: let uriString = unifiedQRString( onchainAddress: paymentAddress?.address ?? "", @@ -49,7 +55,10 @@ class SendViewModel: ObservableObject { bolt11: nil, bolt12: nil ) - _ = try await lightningClient.send(uriString) + let result = try await lightningClient.send(uriString) + if case .onchain = result { + try? lightningClient.syncWallets() + } case .bolt11: _ = try await lightningClient.sendBolt11Payment( Bolt11Invoice.fromStr(invoiceStr: paymentAddress?.address ?? ""), diff --git a/LDKNodeMonday/View Model/Profile/Channel/ChannelAddViewModel.swift b/LDKNodeMonday/View Model/Profile/Channel/ChannelAddViewModel.swift index d0e0ed0..a4d75f0 100644 --- a/LDKNodeMonday/View Model/Profile/Channel/ChannelAddViewModel.swift +++ b/LDKNodeMonday/View Model/Profile/Channel/ChannelAddViewModel.swift @@ -48,6 +48,7 @@ class ChannelAddViewModel: ObservableObject { channelConfig, false ) + try? lightningClient.syncWallets() DispatchQueue.main.async { self.channelAddViewError = nil self.isOpenChannelFinished = true