From c2bd9f287c07f143850f4eee873ddfe0fde1e139 Mon Sep 17 00:00:00 2001 From: Pierre-Marie Padiou Date: Tue, 2 Jul 2024 14:56:34 +0200 Subject: [PATCH] Add support for optional payer note (#63) Usage: ```shell ./phoenix-cli payoffer --offer lnoxxxxxx --amountSat 2100 --message "Hello from phoenixd!" ``` --- src/commonMain/kotlin/fr/acinq/lightning/bin/Api.kt | 5 +++-- src/commonMain/kotlin/fr/acinq/lightning/bin/Main.kt | 2 +- src/commonMain/kotlin/fr/acinq/lightning/cli/PhoenixCli.kt | 6 ++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/commonMain/kotlin/fr/acinq/lightning/bin/Api.kt b/src/commonMain/kotlin/fr/acinq/lightning/bin/Api.kt index a05062d..2f9c9d0 100644 --- a/src/commonMain/kotlin/fr/acinq/lightning/bin/Api.kt +++ b/src/commonMain/kotlin/fr/acinq/lightning/bin/Api.kt @@ -138,7 +138,7 @@ class Api(private val nodeParams: NodeParams, private val peer: Peer, private va call.respond(GeneratedInvoice(invoice.amount?.truncateToSatoshi(), invoice.paymentHash, serialized = invoice.write())) } get("getoffer") { - call.respond(nodeParams.defaultOffer(peer.walletParams.trampolineNode.id).encode()) + call.respond(nodeParams.defaultOffer(peer.walletParams.trampolineNode.id).first.encode()) } get("payments/incoming") { val listAll = call.parameters["all"]?.toBoolean() ?: false // by default, only list incoming payments that have been received @@ -197,7 +197,8 @@ 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 offer = formParameters.getOffer("offer") val amount = (overrideAmount ?: offer.amount) ?: missing("amountSat") - when (val event = peer.payOffer(amount, offer, randomKey(), fetchInvoiceTimeout = 30.seconds)) { + val note = formParameters["message"] + when (val event = peer.payOffer(amount, offer, payerKey = nodeParams.defaultOffer(peer.walletParams.trampolineNode.id).second, payerNote = note, fetchInvoiceTimeout = 30.seconds)) { 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 -> call.respond(PaymentFailed(event)) diff --git a/src/commonMain/kotlin/fr/acinq/lightning/bin/Main.kt b/src/commonMain/kotlin/fr/acinq/lightning/bin/Main.kt index 0bbc9e7..5353dd0 100644 --- a/src/commonMain/kotlin/fr/acinq/lightning/bin/Main.kt +++ b/src/commonMain/kotlin/fr/acinq/lightning/bin/Main.kt @@ -242,7 +242,7 @@ class Phoenixd : CliktCommand() { liquidityPolicy = MutableStateFlow(liquidityPolicy), ) consoleLog(cyan("nodeid: ${nodeParams.nodeId}")) - consoleLog(cyan("offer: ${nodeParams.defaultOffer(lsp.walletParams.trampolineNode.id)}")) + consoleLog(cyan("offer: ${nodeParams.defaultOffer(lsp.walletParams.trampolineNode.id).first}")) val driver = createAppDbDriver(datadir, chain, nodeParams.nodeId) val database = PhoenixDatabase( diff --git a/src/commonMain/kotlin/fr/acinq/lightning/cli/PhoenixCli.kt b/src/commonMain/kotlin/fr/acinq/lightning/cli/PhoenixCli.kt index c0e38dc..39c1c09 100644 --- a/src/commonMain/kotlin/fr/acinq/lightning/cli/PhoenixCli.kt +++ b/src/commonMain/kotlin/fr/acinq/lightning/cli/PhoenixCli.kt @@ -235,13 +235,15 @@ class PayInvoice : PhoenixCliCommand(name = "payinvoice", help = "Pay a Lightnin class PayOffer : PhoenixCliCommand(name = "payoffer", help = "Pay a Lightning offer", printHelpOnEmptyArgs = true) { private val amountSat by option("--amountSat").long() - private val invoice by option("--offer").required().check { OfferTypes.Offer.decode(it).isSuccess } + private val offer by option("--offer").required().check { OfferTypes.Offer.decode(it).isSuccess } + private val message by option("--message").help { "Optional payer note" } override suspend fun httpRequest() = commonOptions.httpClient.use { it.submitForm( url = (commonOptions.baseUrl / "payoffer").toString(), formParameters = parameters { amountSat?.let { append("amountSat", amountSat.toString()) } - append("offer", invoice) + append("offer", offer) + message?.let { append("message", message.toString()) } } ) }