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 {
|
object Versions {
|
||||||
val kotlin = "1.9.23"
|
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 sqlDelight = "2.0.1"
|
||||||
val okio = "3.8.0"
|
val okio = "3.8.0"
|
||||||
val clikt = "4.2.2"
|
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 overrideAmount = formParameters["amountSat"]?.let { it.toLongOrNull() ?: invalidType("amountSat", "integer") }?.sat?.toMilliSatoshi()
|
||||||
val invoice = formParameters.getInvoice("invoice")
|
val invoice = formParameters.getInvoice("invoice")
|
||||||
val amount = (overrideAmount ?: invoice.amount) ?: missing("amountSat")
|
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.PaymentSent -> call.respond(PaymentSent(event))
|
||||||
is fr.acinq.lightning.io.PaymentNotSent -> call.respond(PaymentFailed(event))
|
is fr.acinq.lightning.io.PaymentNotSent -> call.respond(PaymentFailed(event))
|
||||||
|
is fr.acinq.lightning.io.OfferNotPaid -> TODO()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post("sendtoaddress") {
|
post("sendtoaddress") {
|
||||||
|
@ -120,7 +120,7 @@ class SqlitePaymentsDb(val database: PhoenixDatabase) : PaymentsDb {
|
|||||||
|
|
||||||
override suspend fun completeOutgoingLightningPart(
|
override suspend fun completeOutgoingLightningPart(
|
||||||
partId: UUID,
|
partId: UUID,
|
||||||
failure: Either<ChannelException, FailureMessage>,
|
failure: LightningOutgoingPayment.Part.Status.Failure,
|
||||||
completedAt: Long
|
completedAt: Long
|
||||||
) {
|
) {
|
||||||
withContext(Dispatchers.Default) {
|
withContext(Dispatchers.Default) {
|
||||||
|
@ -88,4 +88,5 @@ fun IncomingPayment.Origin.mapToDb(): Pair<IncomingOriginTypeVersion, ByteArray>
|
|||||||
Json.encodeToString(IncomingOriginData.SwapIn.V0(address)).toByteArray(Charsets.UTF_8)
|
Json.encodeToString(IncomingOriginData.SwapIn.V0(address)).toByteArray(Charsets.UTF_8)
|
||||||
is IncomingPayment.Origin.OnChain -> IncomingOriginTypeVersion.ONCHAIN_V0 to
|
is IncomingPayment.Origin.OnChain -> IncomingOriginTypeVersion.ONCHAIN_V0 to
|
||||||
Json.encodeToString(IncomingOriginData.OnChain.V0(txId.value, localInputs.toList())).toByteArray(Charsets.UTF_8)
|
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 {
|
enum class LightningOutgoingDetailsTypeVersion {
|
||||||
NORMAL_V0,
|
NORMAL_V0,
|
||||||
KEYSEND_V0,
|
|
||||||
SWAPOUT_V0,
|
SWAPOUT_V0,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,11 +47,6 @@ sealed class LightningOutgoingDetailsData {
|
|||||||
data class V0(val paymentRequest: String) : Normal()
|
data class V0(val paymentRequest: String) : Normal()
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class KeySend : LightningOutgoingDetailsData() {
|
|
||||||
@Serializable
|
|
||||||
data class V0(@Serializable val preimage: ByteVector32) : KeySend()
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed class SwapOut : LightningOutgoingDetailsData() {
|
sealed class SwapOut : LightningOutgoingDetailsData() {
|
||||||
@Serializable
|
@Serializable
|
||||||
data class V0(val address: String, val paymentRequest: String, @Serializable val swapOutFee: Satoshi) : SwapOut()
|
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 ->
|
fun deserialize(typeVersion: LightningOutgoingDetailsTypeVersion, blob: ByteArray): LightningOutgoingPayment.Details = DbTypesHelper.decodeBlob(blob) { json, format ->
|
||||||
when (typeVersion) {
|
when (typeVersion) {
|
||||||
LightningOutgoingDetailsTypeVersion.NORMAL_V0 -> format.decodeFromString<Normal.V0>(json).let { LightningOutgoingPayment.Details.Normal(Bolt11Invoice.read(it.paymentRequest).get()) }
|
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) }
|
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) {
|
fun LightningOutgoingPayment.Details.mapToDb(): Pair<LightningOutgoingDetailsTypeVersion, ByteArray> = when (this) {
|
||||||
is LightningOutgoingPayment.Details.Normal -> LightningOutgoingDetailsTypeVersion.NORMAL_V0 to
|
is LightningOutgoingPayment.Details.Normal -> LightningOutgoingDetailsTypeVersion.NORMAL_V0 to
|
||||||
Json.encodeToString(LightningOutgoingDetailsData.Normal.V0(paymentRequest.write())).toByteArray(Charsets.UTF_8)
|
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
|
is LightningOutgoingPayment.Details.SwapOut -> LightningOutgoingDetailsTypeVersion.SWAPOUT_V0 to
|
||||||
Json.encodeToString(LightningOutgoingDetailsData.SwapOut.V0(address, paymentRequest.write(), swapOutFee)).toByteArray(Charsets.UTF_8)
|
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 {
|
enum class LightningOutgoingPartStatusTypeVersion {
|
||||||
SUCCEEDED_V0,
|
SUCCEEDED_V0,
|
||||||
|
/* Obsolete, do not use anymore. Failed parts are now typed, with a code and an option string message. */
|
||||||
FAILED_V0,
|
FAILED_V0,
|
||||||
|
FAILED_V1,
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class LightningOutgoingPartStatusData {
|
sealed class LightningOutgoingPartStatusData {
|
||||||
@ -46,6 +48,9 @@ sealed class LightningOutgoingPartStatusData {
|
|||||||
sealed class Failed : LightningOutgoingPartStatusData() {
|
sealed class Failed : LightningOutgoingPartStatusData() {
|
||||||
@Serializable
|
@Serializable
|
||||||
data class V0(val remoteFailureCode: Int?, val details: String) : Failed()
|
data class V0(val remoteFailureCode: Int?, val details: String) : Failed()
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class V1(val code: Int, val details: String?) : Failed()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@ -58,7 +63,31 @@ sealed class LightningOutgoingPartStatusData {
|
|||||||
LightningOutgoingPayment.Part.Status.Succeeded(it.preimage, completedAt)
|
LightningOutgoingPayment.Part.Status.Succeeded(it.preimage, completedAt)
|
||||||
}
|
}
|
||||||
LightningOutgoingPartStatusTypeVersion.FAILED_V0 -> format.decodeFromString<Failed.V0>(json).let {
|
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
|
fun LightningOutgoingPayment.Part.Status.Succeeded.mapToDb() = LightningOutgoingPartStatusTypeVersion.SUCCEEDED_V0 to
|
||||||
Json.encodeToString(LightningOutgoingPartStatusData.Succeeded.V0(preimage)).toByteArray(Charsets.UTF_8)
|
Json.encodeToString(LightningOutgoingPartStatusData.Succeeded.V0(preimage)).toByteArray(Charsets.UTF_8)
|
||||||
|
|
||||||
fun LightningOutgoingPayment.Part.Status.Failed.mapToDb() = LightningOutgoingPartStatusTypeVersion.FAILED_V0 to
|
fun LightningOutgoingPayment.Part.Status.Failure.mapToDb(): Pair<LightningOutgoingPartStatusTypeVersion, ByteArray> {
|
||||||
Json.encodeToString(LightningOutgoingPartStatusData.Failed.V0(remoteFailureCode, details)).toByteArray(Charsets.UTF_8)
|
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(
|
fun updateLightningPart(
|
||||||
partId: UUID,
|
partId: UUID,
|
||||||
failure: Either<ChannelException, FailureMessage>,
|
failure: LightningOutgoingPayment.Part.Status.Failure,
|
||||||
completedAt: Long
|
completedAt: Long
|
||||||
): Boolean {
|
): Boolean {
|
||||||
var result = true
|
var result = true
|
||||||
val (statusTypeVersion, statusData) = OutgoingPaymentFailure.convertFailure(failure).mapToDb()
|
val (statusTypeVersion, statusData) = failure.mapToDb()
|
||||||
database.transaction {
|
database.transaction {
|
||||||
queries.updateLightningPart(
|
queries.updateLightningPart(
|
||||||
part_id = partId.toString(),
|
part_id = partId.toString(),
|
||||||
|
@ -72,10 +72,14 @@ sealed class LightningOutgoingStatusData {
|
|||||||
FinalFailure.InvalidPaymentId::class.simpleName -> FinalFailure.InvalidPaymentId
|
FinalFailure.InvalidPaymentId::class.simpleName -> FinalFailure.InvalidPaymentId
|
||||||
FinalFailure.NoAvailableChannels::class.simpleName -> FinalFailure.NoAvailableChannels
|
FinalFailure.NoAvailableChannels::class.simpleName -> FinalFailure.NoAvailableChannels
|
||||||
FinalFailure.InsufficientBalance::class.simpleName -> FinalFailure.InsufficientBalance
|
FinalFailure.InsufficientBalance::class.simpleName -> FinalFailure.InsufficientBalance
|
||||||
FinalFailure.NoRouteToRecipient::class.simpleName -> FinalFailure.NoRouteToRecipient
|
|
||||||
FinalFailure.RecipientUnreachable::class.simpleName -> FinalFailure.RecipientUnreachable
|
FinalFailure.RecipientUnreachable::class.simpleName -> FinalFailure.RecipientUnreachable
|
||||||
FinalFailure.RetryExhausted::class.simpleName -> FinalFailure.RetryExhausted
|
FinalFailure.RetryExhausted::class.simpleName -> FinalFailure.RetryExhausted
|
||||||
FinalFailure.WalletRestarted::class.simpleName -> FinalFailure.WalletRestarted
|
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
|
else -> FinalFailure.UnknownError
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,7 +96,7 @@ sealed class ApiType {
|
|||||||
@Serializable
|
@Serializable
|
||||||
@SerialName("payment_failed")
|
@SerialName("payment_failed")
|
||||||
data class PaymentFailed(val paymentHash: ByteVector32, val reason: String) : ApiType() {
|
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
|
@Serializable
|
||||||
|
Loading…
x
Reference in New Issue
Block a user