Update lightning-kmp to 1.6.2-FEECREDIT-7 (#51)

This commit is contained in:
Pierre-Marie Padiou 2024-05-16 18:07:36 +02:00 committed by GitHub
parent dec1c59c80
commit a97e5776b1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 63 additions and 19 deletions

View File

@ -1,6 +1,6 @@
object Versions {
val kotlin = "1.9.23"
val lightningKmp = "1.6.2-FEECREDIT-6"
val lightningKmp = "1.6.2-FEECREDIT-7"
val sqlDelight = "2.0.1"
val okio = "3.8.0"
val clikt = "4.2.2"

View File

@ -160,9 +160,10 @@ class Api(private val nodeParams: NodeParams, private val peer: Peer, private va
val overrideAmount = formParameters["amountSat"]?.let { it.toLongOrNull() ?: invalidType("amountSat", "integer") }?.sat?.toMilliSatoshi()
val invoice = formParameters.getInvoice("invoice")
val amount = (overrideAmount ?: invoice.amount) ?: missing("amountSat")
when (val event = peer.sendLightning(amount, invoice)) {
when (val event = peer.payInvoice(amount, invoice)) {
is fr.acinq.lightning.io.PaymentSent -> call.respond(PaymentSent(event))
is fr.acinq.lightning.io.PaymentNotSent -> call.respond(PaymentFailed(event))
is fr.acinq.lightning.io.OfferNotPaid -> TODO()
}
}
post("sendtoaddress") {

View File

@ -120,7 +120,7 @@ class SqlitePaymentsDb(val database: PhoenixDatabase) : PaymentsDb {
override suspend fun completeOutgoingLightningPart(
partId: UUID,
failure: Either<ChannelException, FailureMessage>,
failure: LightningOutgoingPayment.Part.Status.Failure,
completedAt: Long
) {
withContext(Dispatchers.Default) {

View File

@ -88,4 +88,5 @@ fun IncomingPayment.Origin.mapToDb(): Pair<IncomingOriginTypeVersion, ByteArray>
Json.encodeToString(IncomingOriginData.SwapIn.V0(address)).toByteArray(Charsets.UTF_8)
is IncomingPayment.Origin.OnChain -> IncomingOriginTypeVersion.ONCHAIN_V0 to
Json.encodeToString(IncomingOriginData.OnChain.V0(txId.value, localInputs.toList())).toByteArray(Charsets.UTF_8)
is IncomingPayment.Origin.Offer -> TODO()
}

View File

@ -37,7 +37,6 @@ import kotlinx.serialization.json.Json
enum class LightningOutgoingDetailsTypeVersion {
NORMAL_V0,
KEYSEND_V0,
SWAPOUT_V0,
}
@ -48,11 +47,6 @@ sealed class LightningOutgoingDetailsData {
data class V0(val paymentRequest: String) : Normal()
}
sealed class KeySend : LightningOutgoingDetailsData() {
@Serializable
data class V0(@Serializable val preimage: ByteVector32) : KeySend()
}
sealed class SwapOut : LightningOutgoingDetailsData() {
@Serializable
data class V0(val address: String, val paymentRequest: String, @Serializable val swapOutFee: Satoshi) : SwapOut()
@ -63,7 +57,6 @@ sealed class LightningOutgoingDetailsData {
fun deserialize(typeVersion: LightningOutgoingDetailsTypeVersion, blob: ByteArray): LightningOutgoingPayment.Details = DbTypesHelper.decodeBlob(blob) { json, format ->
when (typeVersion) {
LightningOutgoingDetailsTypeVersion.NORMAL_V0 -> format.decodeFromString<Normal.V0>(json).let { LightningOutgoingPayment.Details.Normal(Bolt11Invoice.read(it.paymentRequest).get()) }
LightningOutgoingDetailsTypeVersion.KEYSEND_V0 -> format.decodeFromString<KeySend.V0>(json).let { LightningOutgoingPayment.Details.KeySend(it.preimage) }
LightningOutgoingDetailsTypeVersion.SWAPOUT_V0 -> format.decodeFromString<SwapOut.V0>(json).let { LightningOutgoingPayment.Details.SwapOut(it.address, Bolt11Invoice.read(it.paymentRequest).get(), it.swapOutFee) }
}
}
@ -73,8 +66,7 @@ sealed class LightningOutgoingDetailsData {
fun LightningOutgoingPayment.Details.mapToDb(): Pair<LightningOutgoingDetailsTypeVersion, ByteArray> = when (this) {
is LightningOutgoingPayment.Details.Normal -> LightningOutgoingDetailsTypeVersion.NORMAL_V0 to
Json.encodeToString(LightningOutgoingDetailsData.Normal.V0(paymentRequest.write())).toByteArray(Charsets.UTF_8)
is LightningOutgoingPayment.Details.KeySend -> LightningOutgoingDetailsTypeVersion.KEYSEND_V0 to
Json.encodeToString(LightningOutgoingDetailsData.KeySend.V0(preimage)).toByteArray(Charsets.UTF_8)
is LightningOutgoingPayment.Details.SwapOut -> LightningOutgoingDetailsTypeVersion.SWAPOUT_V0 to
Json.encodeToString(LightningOutgoingDetailsData.SwapOut.V0(address, paymentRequest.write(), swapOutFee)).toByteArray(Charsets.UTF_8)
is LightningOutgoingPayment.Details.Blinded -> TODO()
}

View File

@ -33,7 +33,9 @@ import kotlinx.serialization.json.Json
enum class LightningOutgoingPartStatusTypeVersion {
SUCCEEDED_V0,
/* Obsolete, do not use anymore. Failed parts are now typed, with a code and an option string message. */
FAILED_V0,
FAILED_V1,
}
sealed class LightningOutgoingPartStatusData {
@ -46,6 +48,9 @@ sealed class LightningOutgoingPartStatusData {
sealed class Failed : LightningOutgoingPartStatusData() {
@Serializable
data class V0(val remoteFailureCode: Int?, val details: String) : Failed()
@Serializable
data class V1(val code: Int, val details: String?) : Failed()
}
companion object {
@ -58,7 +63,31 @@ sealed class LightningOutgoingPartStatusData {
LightningOutgoingPayment.Part.Status.Succeeded(it.preimage, completedAt)
}
LightningOutgoingPartStatusTypeVersion.FAILED_V0 -> format.decodeFromString<Failed.V0>(json).let {
LightningOutgoingPayment.Part.Status.Failed(it.remoteFailureCode, it.details, completedAt)
LightningOutgoingPayment.Part.Status.Failed(
failure = LightningOutgoingPayment.Part.Status.Failure.Uninterpretable(message = it.details),
completedAt = completedAt,
)
}
LightningOutgoingPartStatusTypeVersion.FAILED_V1 -> format.decodeFromString<Failed.V1>(json).let {
LightningOutgoingPayment.Part.Status.Failed(
failure = when (it.code) {
0 -> LightningOutgoingPayment.Part.Status.Failure.Uninterpretable(it.details ?: "n/a")
1 -> LightningOutgoingPayment.Part.Status.Failure.PaymentAmountTooSmall
2 -> LightningOutgoingPayment.Part.Status.Failure.PaymentAmountTooBig
3 -> LightningOutgoingPayment.Part.Status.Failure.NotEnoughFunds
4 -> LightningOutgoingPayment.Part.Status.Failure.NotEnoughFees
5 -> LightningOutgoingPayment.Part.Status.Failure.PaymentExpiryTooBig
6 -> LightningOutgoingPayment.Part.Status.Failure.TooManyPendingPayments
7 -> LightningOutgoingPayment.Part.Status.Failure.ChannelIsSplicing
8 -> LightningOutgoingPayment.Part.Status.Failure.ChannelIsClosing
9 -> LightningOutgoingPayment.Part.Status.Failure.TemporaryRemoteFailure
10 -> LightningOutgoingPayment.Part.Status.Failure.RecipientLiquidityIssue
11 -> LightningOutgoingPayment.Part.Status.Failure.RecipientIsOffline
12 -> LightningOutgoingPayment.Part.Status.Failure.RecipientRejectedPayment
else -> LightningOutgoingPayment.Part.Status.Failure.Uninterpretable(it.details ?: "n/a")
},
completedAt = completedAt,
)
}
}
}
@ -68,5 +97,22 @@ sealed class LightningOutgoingPartStatusData {
fun LightningOutgoingPayment.Part.Status.Succeeded.mapToDb() = LightningOutgoingPartStatusTypeVersion.SUCCEEDED_V0 to
Json.encodeToString(LightningOutgoingPartStatusData.Succeeded.V0(preimage)).toByteArray(Charsets.UTF_8)
fun LightningOutgoingPayment.Part.Status.Failed.mapToDb() = LightningOutgoingPartStatusTypeVersion.FAILED_V0 to
Json.encodeToString(LightningOutgoingPartStatusData.Failed.V0(remoteFailureCode, details)).toByteArray(Charsets.UTF_8)
fun LightningOutgoingPayment.Part.Status.Failure.mapToDb(): Pair<LightningOutgoingPartStatusTypeVersion, ByteArray> {
val (code, details) = when (this) {
is LightningOutgoingPayment.Part.Status.Failure.Uninterpretable -> 0 to message
is LightningOutgoingPayment.Part.Status.Failure.PaymentAmountTooSmall -> 1 to null
is LightningOutgoingPayment.Part.Status.Failure.PaymentAmountTooBig -> 2 to null
is LightningOutgoingPayment.Part.Status.Failure.NotEnoughFunds -> 3 to null
is LightningOutgoingPayment.Part.Status.Failure.NotEnoughFees -> 4 to null
is LightningOutgoingPayment.Part.Status.Failure.PaymentExpiryTooBig -> 5 to null
is LightningOutgoingPayment.Part.Status.Failure.TooManyPendingPayments -> 6 to null
is LightningOutgoingPayment.Part.Status.Failure.ChannelIsSplicing -> 7 to null
is LightningOutgoingPayment.Part.Status.Failure.ChannelIsClosing -> 8 to null
is LightningOutgoingPayment.Part.Status.Failure.TemporaryRemoteFailure -> 9 to null
is LightningOutgoingPayment.Part.Status.Failure.RecipientLiquidityIssue -> 10 to null
is LightningOutgoingPayment.Part.Status.Failure.RecipientIsOffline -> 11 to null
is LightningOutgoingPayment.Part.Status.Failure.RecipientRejectedPayment -> 12 to null
}
return LightningOutgoingPartStatusTypeVersion.FAILED_V1 to
Json.encodeToString(LightningOutgoingPartStatusData.Failed.V1(code, details)).toByteArray(Charsets.UTF_8)
}

View File

@ -115,11 +115,11 @@ class LightningOutgoingQueries(val database: PhoenixDatabase) {
fun updateLightningPart(
partId: UUID,
failure: Either<ChannelException, FailureMessage>,
failure: LightningOutgoingPayment.Part.Status.Failure,
completedAt: Long
): Boolean {
var result = true
val (statusTypeVersion, statusData) = OutgoingPaymentFailure.convertFailure(failure).mapToDb()
val (statusTypeVersion, statusData) = failure.mapToDb()
database.transaction {
queries.updateLightningPart(
part_id = partId.toString(),

View File

@ -72,10 +72,14 @@ sealed class LightningOutgoingStatusData {
FinalFailure.InvalidPaymentId::class.simpleName -> FinalFailure.InvalidPaymentId
FinalFailure.NoAvailableChannels::class.simpleName -> FinalFailure.NoAvailableChannels
FinalFailure.InsufficientBalance::class.simpleName -> FinalFailure.InsufficientBalance
FinalFailure.NoRouteToRecipient::class.simpleName -> FinalFailure.NoRouteToRecipient
FinalFailure.RecipientUnreachable::class.simpleName -> FinalFailure.RecipientUnreachable
FinalFailure.RetryExhausted::class.simpleName -> FinalFailure.RetryExhausted
FinalFailure.WalletRestarted::class.simpleName -> FinalFailure.WalletRestarted
FinalFailure.AlreadyPaid::class.simpleName -> FinalFailure.AlreadyPaid
FinalFailure.ChannelClosing::class.simpleName -> FinalFailure.ChannelClosing
FinalFailure.ChannelOpening::class.simpleName -> FinalFailure.ChannelOpening
FinalFailure.ChannelNotConnected::class.simpleName -> FinalFailure.ChannelNotConnected
FinalFailure.FeaturesNotSupported::class.simpleName -> FinalFailure.FeaturesNotSupported
else -> FinalFailure.UnknownError
}
}

View File

@ -96,7 +96,7 @@ sealed class ApiType {
@Serializable
@SerialName("payment_failed")
data class PaymentFailed(val paymentHash: ByteVector32, val reason: String) : ApiType() {
constructor(event: fr.acinq.lightning.io.PaymentNotSent) : this(event.request.paymentHash, event.reason.reason.toString())
constructor(event: fr.acinq.lightning.io.PaymentNotSent) : this(event.request.paymentHash, event.reason.explain().fold({ it.toString() }, { it.toString() }))
}
@Serializable