From ac5f37eb5be1999142184fe7800f316152b0b7bb Mon Sep 17 00:00:00 2001 From: jackstar12 <62219658+jackstar12@users.noreply.github.com> Date: Wed, 22 Jan 2025 19:06:18 +0100 Subject: [PATCH] fix: lightning get payment implementation (#50) * chore: bump client to v2.3.6 * fix(lightning): get swap by payment hash instead of calling `ListSwaps` * refactor: use `TrimStart` for removing v prefix of version --- BTCPayServer.Plugins.Boltz/BoltzClient.cs | 10 ++++++++-- BTCPayServer.Plugins.Boltz/BoltzDaemon.cs | 4 ++-- .../BoltzLightningClient.cs | 17 +++++++++++++++-- .../Protos/boltzrpc/boltzrpc.proto | 9 +++++++-- .../Protos/boltzrpc/cp.sh | 4 ++-- 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/BTCPayServer.Plugins.Boltz/BoltzClient.cs b/BTCPayServer.Plugins.Boltz/BoltzClient.cs index 9e667ba..b4fe76a 100644 --- a/BTCPayServer.Plugins.Boltz/BoltzClient.cs +++ b/BTCPayServer.Plugins.Boltz/BoltzClient.cs @@ -10,6 +10,7 @@ using Autoswaprpc; using Boltzrpc; using BTCPayServer.Plugins.Boltz.Models; +using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using Grpc.Core; using Grpc.Net.Client; @@ -97,13 +98,18 @@ public async Task ListSwaps(ListSwapsRequest request) public async Task GetSwapInfo(string id) { - return await _client.GetSwapInfoAsync(new GetSwapInfoRequest { Id = id }, _metadata); + return await _client.GetSwapInfoAsync(new GetSwapInfoRequest { SwapId = id }, _metadata); + } + + public async Task GetSwapInfo(byte[] paymentHash) + { + return await _client.GetSwapInfoAsync(new GetSwapInfoRequest { PaymentHash = ByteString.CopyFrom(paymentHash) }, _metadata); } public AsyncServerStreamingCall GetSwapInfoStream(string id, CancellationToken cancellationToken = default) { - return _client.GetSwapInfoStream(new GetSwapInfoRequest { Id = id }, _metadata, + return _client.GetSwapInfoStream(new GetSwapInfoRequest { SwapId = id }, _metadata, cancellationToken: cancellationToken); } diff --git a/BTCPayServer.Plugins.Boltz/BoltzDaemon.cs b/BTCPayServer.Plugins.Boltz/BoltzDaemon.cs index 8f8da8f..8a6a2cb 100644 --- a/BTCPayServer.Plugins.Boltz/BoltzDaemon.cs +++ b/BTCPayServer.Plugins.Boltz/BoltzDaemon.cs @@ -55,7 +55,7 @@ public class BoltzDaemon( BTCPayNetworkProvider btcPayNetworkProvider ) { - private static readonly Version ClientVersion = new("2.3.4"); + private static readonly Version ClientVersion = new("2.3.7"); private Stream? _downloadStream; private Task? _startTask; @@ -457,7 +457,7 @@ public async Task Init() } else { - currentVersion = stdout.Split("\n").First().Split("-").First().Remove(0, 1); + currentVersion = stdout.Split("\n").First().Split("-").First().TrimStart('v'); } } diff --git a/BTCPayServer.Plugins.Boltz/BoltzLightningClient.cs b/BTCPayServer.Plugins.Boltz/BoltzLightningClient.cs index bdc7682..f69f919 100644 --- a/BTCPayServer.Plugins.Boltz/BoltzLightningClient.cs +++ b/BTCPayServer.Plugins.Boltz/BoltzLightningClient.cs @@ -130,8 +130,21 @@ public async Task ListInvoices(ListInvoicesParams request, public async Task GetPayment(string paymentHash, CancellationToken cancellation = new CancellationToken()) { - var payments = await ListPayments(cancellation); - return payments.ToList().Find(payment => payment.PaymentHash == paymentHash)!; + var client = await GetClient(); + try + { + var info = await client.GetSwapInfo(Convert.FromHexString(paymentHash)); + return PaymentFromSwapInfo(info.Swap); + } + catch (RpcException e) when (e.StatusCode == StatusCode.NotFound) + { + return new LightningPayment + { + Id = paymentHash, + // this will be the case when the initial pay call failed, yet btcpay still tries to check if there was a payment + Status = LightningPaymentStatus.Failed + }; + } } public async Task ListPayments(CancellationToken cancellation = new CancellationToken()) diff --git a/BTCPayServer.Plugins.Boltz/Protos/boltzrpc/boltzrpc.proto b/BTCPayServer.Plugins.Boltz/Protos/boltzrpc/boltzrpc.proto index 5c43d53..00f5e53 100644 --- a/BTCPayServer.Plugins.Boltz/Protos/boltzrpc/boltzrpc.proto +++ b/BTCPayServer.Plugins.Boltz/Protos/boltzrpc/boltzrpc.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package boltzrpc; -option go_package = "github.com/BoltzExchange/boltz-client/boltzrpc"; +option go_package = "github.com/BoltzExchange/boltz-client/v2/pkg/boltzrpc"; import "google/protobuf/empty.proto"; service Boltz { @@ -499,7 +499,12 @@ message ClaimSwapsResponse { } message GetSwapInfoRequest { - string id = 1; + string id = 1 [deprecated = true]; + oneof identifier { + string swap_id = 2; + // Only implemented for submarine swaps + bytes payment_hash = 3; + } } message GetSwapInfoResponse { SwapInfo swap = 1; diff --git a/BTCPayServer.Plugins.Boltz/Protos/boltzrpc/cp.sh b/BTCPayServer.Plugins.Boltz/Protos/boltzrpc/cp.sh index 7d0f98f..36131c4 100755 --- a/BTCPayServer.Plugins.Boltz/Protos/boltzrpc/cp.sh +++ b/BTCPayServer.Plugins.Boltz/Protos/boltzrpc/cp.sh @@ -1,2 +1,2 @@ -cp ~/dev/boltz-client/boltzrpc/autoswaprpc/autoswaprpc.proto ./autoswaprpc/ -cp ~/dev/boltz-client/boltzrpc/boltzrpc.proto . +cp ~/dev/boltz-client/pkg/boltzrpc/autoswaprpc/autoswaprpc.proto ./autoswaprpc/ +cp ~/dev/boltz-client/pkg/boltzrpc/boltzrpc.proto .