diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e5f7b7954..26c052015 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -55,8 +55,8 @@ android { applicationId = "to.bitkit" minSdk = 28 targetSdk = 36 - versionCode = 179 - versionName = "2.1.1" + versionCode = 180 + versionName = "2.1.2" testInstrumentationRunner = "to.bitkit.test.HiltTestRunner" vectorDrawables { useSupportLibrary = true diff --git a/app/src/main/java/to/bitkit/env/Env.kt b/app/src/main/java/to/bitkit/env/Env.kt index 319a4051a..ffce124b1 100644 --- a/app/src/main/java/to/bitkit/env/Env.kt +++ b/app/src/main/java/to/bitkit/env/Env.kt @@ -23,6 +23,7 @@ internal object Env { val network = Network.valueOf(BuildConfig.NETWORK) val locales = BuildConfig.LOCALES.split(",") const val walletSyncIntervalSecs = 10_uL + const val walletSyncTimeoutSecs = 10_uL val platform = "Android ${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT})" const val version = "$VERSION_NAME (${BuildConfig.VERSION_CODE})" diff --git a/app/src/main/java/to/bitkit/services/LightningService.kt b/app/src/main/java/to/bitkit/services/LightningService.kt index d50332daa..e57505d64 100644 --- a/app/src/main/java/to/bitkit/services/LightningService.kt +++ b/app/src/main/java/to/bitkit/services/LightningService.kt @@ -138,7 +138,7 @@ class LightningService @Inject constructor( ) } - @Suppress("ForbiddenComment") + @Suppress("ForbiddenComment", "LongMethod") private suspend fun build( walletIndex: Int, customServerUrl: String?, @@ -186,11 +186,29 @@ class LightningService @Inject constructor( "Building node with \n\t vssUrl: '$vssUrl'\n\t lnurlAuthServerUrl: '$lnurlAuthServerUrl'", context = TAG, ) - if (lnurlAuthServerUrl.isNotEmpty()) { - builder.buildWithVssStore(vssUrl, vssStoreId, lnurlAuthServerUrl, fixedHeaders) - } else { - builder.buildWithVssStoreAndFixedHeaders(vssUrl, vssStoreId, fixedHeaders) + + fun buildNode() = runCatching { + if (lnurlAuthServerUrl.isNotEmpty()) { + builder.buildWithVssStore(vssUrl, vssStoreId, lnurlAuthServerUrl, fixedHeaders) + } else { + builder.buildWithVssStoreAndFixedHeaders(vssUrl, vssStoreId, fixedHeaders) + } } + + buildNode().recoverCatching { error -> + if (error !is BuildException.DangerousValue) throw error + Logger.warn( + "Retrying build failed with 'DangerousValue' using 'setAcceptStaleChannelMonitors' for recovery.", + error, + context = TAG, + ) + builder.setAcceptStaleChannelMonitors(true) + buildNode() + .onFailure { + Logger.error("Failed recovery retry using 'setAcceptStaleChannelMonitors'.", it, context = TAG) + } + .getOrThrow() + }.getOrThrow() } catch (e: BuildException) { throw LdkError(e) } finally { @@ -226,6 +244,7 @@ class LightningService @Inject constructor( lightningWalletSyncIntervalSecs = Env.walletSyncIntervalSecs, feeRateCacheUpdateIntervalSecs = Env.walletSyncIntervalSecs, ), + connectionTimeoutSecs = Env.walletSyncTimeoutSecs, ), ) } diff --git a/app/src/main/java/to/bitkit/utils/Errors.kt b/app/src/main/java/to/bitkit/utils/Errors.kt index b831c3439..5dd62ed95 100644 --- a/app/src/main/java/to/bitkit/utils/Errors.kt +++ b/app/src/main/java/to/bitkit/utils/Errors.kt @@ -49,6 +49,7 @@ class LdkError(private val inner: LdkException) : AppError("Unknown LDK error.") is BuildException.InvalidAnnouncementAddresses -> "Invalid announcement addresses" is BuildException.InvalidNodeAlias -> "Invalid node alias" is BuildException.NetworkMismatch -> "Network mismatch" + is BuildException.DangerousValue -> "Dangerous value" else -> exception.message }?.let { "LDK Build error: $it" } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f78fafcf0..afe1d381a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -58,7 +58,7 @@ ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" } ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } -ldk-node-android = { module = "com.synonym:ldk-node-android", version = "0.7.0-rc.32" } +ldk-node-android = { module = "com.synonym:ldk-node-android", version = "0.7.0-rc.36" } lifecycle-process = { group = "androidx.lifecycle", name = "lifecycle-process", version.ref = "lifecycle" } lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "lifecycle" } lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" }