Skip to content

Commit 2978f3a

Browse files
authored
Merge pull request #502 from synonymdev/fix/stale-monitor-recovery-release
feat: stale channel monitors recovery
2 parents 70c768d + ab797aa commit 2978f3a

5 files changed

Lines changed: 47 additions & 16 deletions

File tree

Bitkit.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,7 @@
928928
repositoryURL = "https://github.com/synonymdev/ldk-node";
929929
requirement = {
930930
kind = revision;
931-
revision = c5698d00066e0e50f33696afc562d71023da2373;
931+
revision = ae38eadab70fceb5dbe242bc02bf895581cb7c3f;
932932
};
933933
};
934934
96DEA0382DE8BBA1009932BF /* XCRemoteSwiftPackageReference "bitkit-core" */ = {

Bitkit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Bitkit/Services/LightningService.swift

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ class LightningService {
9595
onchainWalletSyncIntervalSecs: Env.walletSyncIntervalSecs,
9696
lightningWalletSyncIntervalSecs: Env.walletSyncIntervalSecs,
9797
feeRateCacheUpdateIntervalSecs: Env.walletSyncIntervalSecs
98-
)
98+
),
99+
connectionTimeoutSecs: 10
99100
)
100101
builder.setChainSourceElectrum(serverUrl: resolvedElectrumServerUrl, config: electrumConfig)
101102

@@ -124,19 +125,46 @@ class LightningService {
124125
builder.setEntropyBip39Mnemonic(mnemonic: mnemonic, passphrase: passphrase)
125126

126127
try await ServiceQueue.background(.ldk) {
127-
if !lnurlAuthServerUrl.isEmpty {
128-
self.node = try builder.buildWithVssStore(
129-
vssUrl: vssUrl,
130-
storeId: storeId,
131-
lnurlAuthServerUrl: lnurlAuthServerUrl,
132-
fixedHeaders: [:]
133-
)
134-
} else {
135-
self.node = try builder.buildWithVssStoreAndFixedHeaders(
136-
vssUrl: vssUrl,
137-
storeId: storeId,
138-
fixedHeaders: [:]
128+
do {
129+
if !lnurlAuthServerUrl.isEmpty {
130+
self.node = try builder.buildWithVssStore(
131+
vssUrl: vssUrl,
132+
storeId: storeId,
133+
lnurlAuthServerUrl: lnurlAuthServerUrl,
134+
fixedHeaders: [:]
135+
)
136+
} else {
137+
self.node = try builder.buildWithVssStoreAndFixedHeaders(
138+
vssUrl: vssUrl,
139+
storeId: storeId,
140+
fixedHeaders: [:]
141+
)
142+
}
143+
} catch let error as BuildError {
144+
guard case .DangerousValue = error else { throw error }
145+
146+
// Stale ChannelMonitor vs ChannelManager — retry with accept_stale to recover.
147+
Logger.warn(
148+
"Build failed with DangerousValue. Retrying with accept_stale_channel_monitors for recovery.",
149+
context: "Recovery"
139150
)
151+
builder.setAcceptStaleChannelMonitors(accept: true)
152+
153+
if !lnurlAuthServerUrl.isEmpty {
154+
self.node = try builder.buildWithVssStore(
155+
vssUrl: vssUrl,
156+
storeId: storeId,
157+
lnurlAuthServerUrl: lnurlAuthServerUrl,
158+
fixedHeaders: [:]
159+
)
160+
} else {
161+
self.node = try builder.buildWithVssStoreAndFixedHeaders(
162+
vssUrl: vssUrl,
163+
storeId: storeId,
164+
fixedHeaders: [:]
165+
)
166+
}
167+
Logger.info("Stale monitor recovery: build succeeded with accept_stale", context: "Recovery")
140168
}
141169
}
142170

Bitkit/Utilities/Errors.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,9 @@ struct AppError: LocalizedError {
185185
case let .ReadFailed(message: ldkMessage):
186186
message = "Read failed"
187187
debugMessage = ldkMessage
188+
case let .DangerousValue(message: ldkMessage):
189+
message = "Dangerous value"
190+
debugMessage = ldkMessage
188191
case let .WriteFailed(message: ldkMessage):
189192
message = "Write failed"
190193
debugMessage = ldkMessage

Bitkit/ViewModels/WalletViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ class WalletViewModel: ObservableObject {
137137
MigrationsService.shared.pendingChannelMigration = nil
138138
}
139139

140-
// If no local migration data, try fetching from RN remote backup (one-time)
140+
// // If no local migration data, try fetching from RN remote backup (one-time)
141141
// if channelMigration == nil {
142142
// let (remoteMigration, allRetrieved) = await fetchOrphanedChannelMonitorsIfNeeded(walletIndex: walletIndex)
143143
// if let remoteMigration {

0 commit comments

Comments
 (0)