@@ -77,6 +77,9 @@ import to.bitkit.ext.channelId
7777import to.bitkit.ext.claimableAtHeight
7878import to.bitkit.ext.getClipboardText
7979import to.bitkit.ext.getSatsPerVByteFor
80+ import to.bitkit.ext.callbackAmountMsats
81+ import to.bitkit.ext.fixedWithdrawAmountSat
82+ import to.bitkit.ext.isFixedAmount
8083import to.bitkit.ext.maxSendableSat
8184import to.bitkit.ext.maxWithdrawableSat
8285import to.bitkit.ext.minSendableSat
@@ -1161,7 +1164,7 @@ class AppViewModel @Inject constructor(
11611164 val maxSendable = maxSendableLightningSats()
11621165 when (val lnurl = _sendUiState .value.lnurl) {
11631166 null -> amount <= maxSendable && lightningRepo.canSend(amount)
1164- is LnurlParams .LnurlWithdraw -> amount < lnurl.data.maxWithdrawableSat()
1167+ is LnurlParams .LnurlWithdraw -> amount <= lnurl.data.maxWithdrawableSat()
11651168 is LnurlParams .LnurlPay -> {
11661169 val maxSat = lnurl.data.maxSendableSat()
11671170 amount <= maxSat && amount <= maxSendable && lightningRepo.canSend(amount)
@@ -1405,10 +1408,10 @@ class AppViewModel @Inject constructor(
14051408 private suspend fun onScanLnurlPay (data : LnurlPayData ) {
14061409 Logger .debug(" LNURL: $data " , context = TAG )
14071410
1408- val minSendable = data.minSendableSat ()
1409- val maxSendable = data.maxSendableSat()
1411+ val isFixed = data.isFixedAmount ()
1412+ val displaySats = if (isFixed) data.maxSendableSat() else data.minSendableSat ()
14101413
1411- if (! lightningRepo.canSend(minSendable )) {
1414+ if (! lightningRepo.canSend(displaySats.coerceAtLeast( 1u ) )) {
14121415 toast(
14131416 type = Toast .ToastType .WARNING ,
14141417 title = context.getString(R .string.other__lnurl_pay_error),
@@ -1417,8 +1420,7 @@ class AppViewModel @Inject constructor(
14171420 return
14181421 }
14191422
1420- val hasAmount = minSendable == maxSendable && minSendable > 0u
1421- val initialAmount = if (hasAmount) minSendable else 0u
1423+ val initialAmount = if (isFixed) displaySats else 0u
14221424
14231425 _sendUiState .update {
14241426 it.copy(
@@ -1428,10 +1430,10 @@ class AppViewModel @Inject constructor(
14281430 )
14291431 }
14301432
1431- if (hasAmount ) {
1432- Logger .info(" Found amount $$minSendable in lnurlPay, proceeding with payment" , context = TAG )
1433+ if (isFixed ) {
1434+ Logger .info(" Found fixed amount $displaySats sats in lnurlPay, proceeding with payment" , context = TAG )
14331435
1434- val quickPayHandled = handleQuickPayIfApplicable(amountSats = minSendable , lnurlPay = data)
1436+ val quickPayHandled = handleQuickPayIfApplicable(amountSats = displaySats , lnurlPay = data)
14351437 if (quickPayHandled) return
14361438
14371439 if (isMainScanner) {
@@ -1453,10 +1455,11 @@ class AppViewModel @Inject constructor(
14531455 private suspend fun onScanLnurlWithdraw (data : LnurlWithdrawData ) {
14541456 Logger .debug(" LNURL: $data " , context = TAG )
14551457
1458+ val isFixed = data.isFixedAmount()
14561459 val minWithdrawable = data.minWithdrawableSat()
14571460 val maxWithdrawable = data.maxWithdrawableSat()
14581461
1459- if (minWithdrawable > maxWithdrawable) {
1462+ if (! isFixed && minWithdrawable > maxWithdrawable) {
14601463 toast(
14611464 type = Toast .ToastType .WARNING ,
14621465 title = context.getString(R .string.other__lnurl_withdr_error),
@@ -1465,15 +1468,17 @@ class AppViewModel @Inject constructor(
14651468 return
14661469 }
14671470
1471+ val displayAmount = if (isFixed) data.fixedWithdrawAmountSat() else minWithdrawable
1472+
14681473 _sendUiState .update {
14691474 it.copy(
14701475 payMethod = SendMethod .LIGHTNING ,
1471- amount = minWithdrawable ,
1476+ amount = displayAmount ,
14721477 lnurl = LnurlParams .LnurlWithdraw (data = data)
14731478 )
14741479 }
14751480
1476- if (minWithdrawable == maxWithdrawable) {
1481+ if (isFixed || minWithdrawable == maxWithdrawable) {
14771482 delay(TRANSITION_SCREEN_MS )
14781483 if (isMainScanner) {
14791484 showSheet(Sheet .Send (SendRoute .WithdrawConfirm ))
@@ -1582,7 +1587,11 @@ class AppViewModel @Inject constructor(
15821587
15831588 val quickPayData: QuickPayData = when {
15841589 lnurlPay != null -> {
1585- QuickPayData .LnurlPay (sats = amountSats, callback = lnurlPay.callback)
1590+ QuickPayData .LnurlPay (
1591+ sats = amountSats,
1592+ callback = lnurlPay.callback,
1593+ amountMsats = lnurlPay.callbackAmountMsats(amountSats),
1594+ )
15861595 }
15871596
15881597 else -> {
@@ -1706,9 +1715,10 @@ class AppViewModel @Inject constructor(
17061715 val isLnurlPay = lnurl is LnurlParams .LnurlPay
17071716
17081717 if (isLnurlPay) {
1718+ val amountMsats = lnurl.data.callbackAmountMsats(amount)
17091719 lightningRepo.fetchLnurlInvoice(
17101720 callbackUrl = lnurl.data.callback,
1711- amountSats = amount ,
1721+ amountMsats = amountMsats ,
17121722 comment = _sendUiState .value.comment.takeIf { it.isNotEmpty() },
17131723 ).onSuccess { invoice ->
17141724 _sendUiState .update {
@@ -1817,16 +1827,20 @@ class AppViewModel @Inject constructor(
18171827 return @launch
18181828 }
18191829
1820- _sendUiState .update {
1821- it.copy(
1822- amount = it.amount.coerceAtLeast(
1823- (lnurl.data.minWithdrawable ? : 0u ) / 1000u
1824- )
1830+ val withdrawAmountSats = if (lnurl.data.isFixedAmount()) {
1831+ lnurl.data.fixedWithdrawAmountSat()
1832+ } else {
1833+ _sendUiState .value.amount.coerceAtLeast(
1834+ (lnurl.data.minWithdrawable ? : 0u ) / 1000u
18251835 )
18261836 }
18271837
1838+ _sendUiState .update {
1839+ it.copy(amount = withdrawAmountSats)
1840+ }
1841+
18281842 val invoice = lightningRepo.createInvoice(
1829- amountSats = _sendUiState .value.amount ,
1843+ amountSats = withdrawAmountSats ,
18301844 description = lnurl.data.defaultDescription,
18311845 expirySeconds = 3600u ,
18321846 ).getOrNull()
@@ -2567,6 +2581,6 @@ sealed interface QuickPayData {
25672581 data class Bolt11 (override val sats : ULong , val bolt11 : String ) : QuickPayData
25682582
25692583 @Stable
2570- data class LnurlPay (override val sats : ULong , val callback : String ) : QuickPayData
2584+ data class LnurlPay (override val sats : ULong , val callback : String , val amountMsats : ULong ) : QuickPayData
25712585}
25722586// endregion
0 commit comments