Update lightning-kmp to 1.6.2-FEECREDIT-7 (#51)
This commit is contained in:
		
							parent
							
								
									dec1c59c80
								
							
						
					
					
						commit
						a97e5776b1
					
				@ -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"
 | 
			
		||||
 | 
			
		||||
@ -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") {
 | 
			
		||||
 | 
			
		||||
@ -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) {
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
}
 | 
			
		||||
@ -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(),
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user