Skip to content

Commit 774f154

Browse files
committed
fix: align bolt11 expiry
1 parent b54ba49 commit 774f154

8 files changed

Lines changed: 35 additions & 18 deletions

File tree

app/src/main/java/to/bitkit/env/Env.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,9 @@ internal object Env {
245245

246246
@Suppress("ConstPropertyName")
247247
object Defaults {
248+
/** Default Bolt11 invoice expiry in seconds. */
249+
const val bolt11InvoiceExpirySeconds = 3_600u
250+
248251
/** Recommended transaction base fee in sats */
249252
const val recommendedBaseFee = 256u
250253

app/src/main/java/to/bitkit/repositories/BlocktankRepo.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import org.lightningdevkit.ldknode.ChannelDetails
4141
import to.bitkit.async.ServiceQueue
4242
import to.bitkit.data.CacheStore
4343
import to.bitkit.di.BgDispatcher
44+
import to.bitkit.env.Defaults
4445
import to.bitkit.env.Env
4546
import to.bitkit.ext.calculateRemoteBalance
4647
import to.bitkit.ext.nowTimestamp
@@ -462,7 +463,7 @@ class BlocktankRepo @Inject constructor(
462463
val invoice = lightningRepo.createInvoice(
463464
amountSats = null,
464465
description = "blocktank-gift-code:$code",
465-
expirySeconds = 3600u,
466+
expirySeconds = Defaults.bolt11InvoiceExpirySeconds,
466467
).getOrThrow()
467468

468469
Logger.debug("Created invoice for gift code, requesting payment from LSP", context = TAG)

app/src/main/java/to/bitkit/repositories/LightningRepo.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import to.bitkit.data.SettingsStore
5858
import to.bitkit.data.backup.VssBackupClientLdk
5959
import to.bitkit.data.keychain.Keychain
6060
import to.bitkit.di.BgDispatcher
61+
import to.bitkit.env.Defaults
6162
import to.bitkit.env.Env
6263
import to.bitkit.ext.getSatsPerVByteFor
6364
import to.bitkit.ext.nowTimestamp
@@ -917,7 +918,7 @@ class LightningRepo @Inject constructor(
917918
suspend fun createInvoice(
918919
amountSats: ULong? = null,
919920
description: String,
920-
expirySeconds: UInt = 86_400u,
921+
expirySeconds: UInt = Defaults.bolt11InvoiceExpirySeconds,
921922
): Result<String> = executeWhenNodeRunning("createInvoice") {
922923
updateGeoBlockState()
923924
runCatching { lightningService.receive(amountSats, description, expirySeconds) }
@@ -926,7 +927,7 @@ class LightningRepo @Inject constructor(
926927
suspend fun createInvoiceMsats(
927928
amountMsats: ULong,
928929
description: String,
929-
expirySeconds: UInt = 86_400u,
930+
expirySeconds: UInt = Defaults.bolt11InvoiceExpirySeconds,
930931
): Result<String> = executeWhenNodeRunning("createInvoiceMsats") {
931932
updateGeoBlockState()
932933
runCatching { lightningService.receiveMsats(amountMsats, description, expirySeconds) }

app/src/main/java/to/bitkit/repositories/PublicPaykitRepo.kt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import kotlinx.serialization.json.Json
1414
import to.bitkit.data.SettingsData
1515
import to.bitkit.data.SettingsStore
1616
import to.bitkit.di.IoDispatcher
17+
import to.bitkit.env.Defaults
1718
import to.bitkit.env.Env
1819
import to.bitkit.ext.toHex
1920
import to.bitkit.models.PubkyPublicKeyFormat
@@ -27,6 +28,7 @@ import javax.inject.Inject
2728
import javax.inject.Singleton
2829
import kotlin.time.Clock
2930
import kotlin.time.Duration.Companion.minutes
31+
import kotlin.time.Duration.Companion.seconds
3032
import kotlin.time.ExperimentalTime
3133
import to.bitkit.di.json as appJson
3234

@@ -68,7 +70,7 @@ class PublicPaykitRepo @Inject constructor(
6870
)
6971

7072
private val managedMethodIds = MethodId.entries.filter { it.isBitkitManaged }
71-
private val publicBolt11Expiry = 60.minutes
73+
private val publicBolt11Expiry = Defaults.bolt11InvoiceExpirySeconds.toInt().seconds
7274
private val publicBolt11RefreshWindow = 30.minutes
7375

7476
fun parseEndpoint(methodId: String, endpointData: String): Endpoint? {
@@ -93,7 +95,7 @@ class PublicPaykitRepo @Inject constructor(
9395
fun serializePayload(value: String): String {
9496
val trimmedValue = value.trim()
9597
if (trimmedValue.isEmpty()) throw PublicPaykitError.InvalidPayload
96-
return Json.encodeToString(PublishedPaymentEndpointPayload(value = trimmedValue))
98+
return Json.encodeToString(PaymentEndpointPayload(value = trimmedValue))
9799
}
98100

99101
fun paymentRequest(endpoints: List<Endpoint>): String {
@@ -274,7 +276,7 @@ class PublicPaykitRepo @Inject constructor(
274276
val bolt11 = lightningRepo.createInvoice(
275277
amountSats = null,
276278
description = "",
277-
expirySeconds = publicBolt11Expiry.inWholeSeconds.toUInt(),
279+
expirySeconds = Defaults.bolt11InvoiceExpirySeconds,
278280
).getOrThrow()
279281
val invoice = (coreService.decode(bolt11) as Scanner.Lightning).invoice
280282
val expiresAtMillis = clock.now().plus(publicBolt11Expiry).toEpochMilliseconds()
@@ -368,8 +370,3 @@ private data class PaymentEndpointPayload(
368370
val min: String? = null,
369371
val max: String? = null,
370372
)
371-
372-
@Serializable
373-
private data class PublishedPaymentEndpointPayload(
374-
val value: String,
375-
)

app/src/main/java/to/bitkit/services/LightningService.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import to.bitkit.data.SettingsStore
4646
import to.bitkit.data.backup.VssStoreIdProvider
4747
import to.bitkit.data.keychain.Keychain
4848
import to.bitkit.di.BgDispatcher
49+
import to.bitkit.env.Defaults
4950
import to.bitkit.env.Env
5051
import to.bitkit.ext.totalNextOutboundHtlcLimitSats
5152
import to.bitkit.ext.uByteList
@@ -592,11 +593,19 @@ class LightningService @Inject constructor(
592593
return true
593594
}
594595

595-
suspend fun receive(sat: ULong? = null, description: String, expirySecs: UInt = 3600u): String {
596+
suspend fun receive(
597+
sat: ULong? = null,
598+
description: String,
599+
expirySecs: UInt = Defaults.bolt11InvoiceExpirySeconds,
600+
): String {
596601
return receiveMsats(amountMsat = sat?.let { it * 1000u }, description = description, expirySecs = expirySecs)
597602
}
598603

599-
suspend fun receiveMsats(amountMsat: ULong? = null, description: String, expirySecs: UInt = 3600u): String {
604+
suspend fun receiveMsats(
605+
amountMsat: ULong? = null,
606+
description: String,
607+
expirySecs: UInt = Defaults.bolt11InvoiceExpirySeconds,
608+
): String {
600609
val node = this.node ?: throw ServiceError.NodeNotSetup()
601610

602611
val message = description

app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,7 +2071,7 @@ class AppViewModel @Inject constructor(
20712071
lightningRepo.createInvoiceMsats(
20722072
amountMsats = lnurl.data.maxWithdrawable,
20732073
description = lnurl.data.defaultDescription,
2074-
expirySeconds = 3600u,
2074+
expirySeconds = Defaults.bolt11InvoiceExpirySeconds,
20752075
)
20762076
} else {
20772077
val withdrawAmountSats = _sendUiState.value.amount.coerceAtLeast(
@@ -2081,7 +2081,7 @@ class AppViewModel @Inject constructor(
20812081
lightningRepo.createInvoice(
20822082
amountSats = withdrawAmountSats,
20832083
description = lnurl.data.defaultDescription,
2084-
expirySeconds = 3600u,
2084+
expirySeconds = Defaults.bolt11InvoiceExpirySeconds,
20852085
)
20862086
}.getOrNull()
20872087

app/src/test/java/to/bitkit/repositories/LightningRepoTest.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import to.bitkit.data.SettingsData
4040
import to.bitkit.data.SettingsStore
4141
import to.bitkit.data.backup.VssBackupClientLdk
4242
import to.bitkit.data.keychain.Keychain
43+
import to.bitkit.env.Defaults
4344
import to.bitkit.ext.createChannelDetails
4445
import to.bitkit.ext.of
4546
import to.bitkit.models.CoinSelectionPreference
@@ -200,11 +201,15 @@ class LightningRepoTest : BaseUnitTest() {
200201
lightningService.receive(
201202
sat = 100uL,
202203
description = "test",
203-
expirySecs = 3600u
204+
expirySecs = Defaults.bolt11InvoiceExpirySeconds,
204205
)
205206
).thenReturn(testInvoice)
206207

207-
val result = sut.createInvoice(amountSats = 100uL, description = "test", expirySeconds = 3600u)
208+
val result = sut.createInvoice(
209+
amountSats = 100uL,
210+
description = "test",
211+
expirySeconds = Defaults.bolt11InvoiceExpirySeconds,
212+
)
208213
assertTrue(result.isSuccess)
209214
assertEquals(testInvoice, result.getOrNull())
210215
}

app/src/test/java/to/bitkit/repositories/PublicPaykitRepoTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.mockito.kotlin.verify
1515
import org.mockito.kotlin.whenever
1616
import to.bitkit.data.SettingsData
1717
import to.bitkit.data.SettingsStore
18+
import to.bitkit.env.Defaults
1819
import to.bitkit.services.CoreService
1920
import to.bitkit.test.BaseUnitTest
2021
import kotlin.test.assertEquals
@@ -30,7 +31,7 @@ import kotlin.time.Instant
3031
class PublicPaykitRepoTest : BaseUnitTest() {
3132
companion object {
3233
private const val NOW_MILLIS = 1_000L
33-
private const val PUBLIC_BOLT11_EXPIRY_SECONDS = 3_600u
34+
private const val PUBLIC_BOLT11_EXPIRY_SECONDS = Defaults.bolt11InvoiceExpirySeconds
3435
}
3536

3637
private val pubkyRepo = mock<PubkyRepo>()

0 commit comments

Comments
 (0)