From b9eea05c67fb922675e36b7c05c5b47fe2a27189 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Mon, 19 Jan 2026 14:56:26 -0300 Subject: [PATCH] fix: insufficient savings error returned to unified invoice even with spending balance --- .../java/to/bitkit/viewmodels/AppViewModel.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt index c9be82b68..882adbc3b 100644 --- a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt @@ -758,7 +758,7 @@ class AppViewModel @Inject constructor( _sendUiState.update { it.copy(isAddressInputValid = true) } } - private fun validateOnChainAddress(invoice: OnChainInvoice) { + private suspend fun validateOnChainAddress(invoice: OnChainInvoice) { val validatedAddress = runCatching { validateBitcoinAddress(invoice.address) } .getOrElse { showAddressValidationError( @@ -778,6 +778,22 @@ class AppViewModel @Inject constructor( return } + // Check if this is a unified invoice with Lightning available + val lnInvoice: LightningInvoice? = invoice.params?.get("lightning")?.let { bolt11 -> + runCatching { decode(bolt11) }.getOrNull() + ?.let { it as? Scanner.Lightning } + ?.invoice + ?.takeIf { lnInv -> + !lnInv.isExpired && lightningRepo.canSend(lnInv.amountSatoshis.coerceAtLeast(1u)) + } + } + + // If Lightning path is available, accept the unified invoice + if (lnInvoice != null) { + _sendUiState.update { it.copy(isAddressInputValid = true) } + return + } + val maxSendOnchain = walletRepo.balanceState.value.maxSendOnchainSats if (maxSendOnchain == 0uL) {