From d93a6a54b108dae5427b1e09abbf2f3e0e6128e7 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Thu, 22 Jan 2026 11:36:38 -0500 Subject: [PATCH 01/10] lndclient: silence expected error on shutdown During planned termination, conn.Close() can return ErrClientConnClosing from gRPC package. This is expected and should not be logged as an error. Downgrade that case to debug so logs stay clean during shutdown. Original log line: [ERR] LNDC: Error closing lnd connection: rpc error: code = Canceled desc = grpc: the client connection is closing --- lnd_services.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lnd_services.go b/lnd_services.go index ecb5268..c8558fb 100644 --- a/lnd_services.go +++ b/lnd_services.go @@ -332,7 +332,15 @@ func NewLndServices(cfg *LndServicesConfig) (*GrpcLndServices, error) { cleanupConn := func() { closeErr := conn.Close() - if closeErr != nil { + switch { + case closeErr == nil: + // No error. + + case errors.Is(closeErr, grpc.ErrClientConnClosing): + log.Debugf("LND connection is already closing: %v", + closeErr) + + default: log.Errorf("Error closing lnd connection: %v", closeErr) } } From 067829821d035f38fc36954b1da676825de050a0 Mon Sep 17 00:00:00 2001 From: Slyghtning Date: Thu, 12 Feb 2026 17:08:51 +0100 Subject: [PATCH 02/10] go.mod: bump lnd to v0.20.1-beta, go to 1.25.5 --- go.mod | 6 +++--- go.sum | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index a07e762..986ab1c 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/btcsuite/btclog/v2 v2.0.1-0.20250728225537-6090e87c6c5b github.com/btcsuite/btcwallet v0.16.17 github.com/btcsuite/btcwallet/wtxmgr v1.5.6 - github.com/lightningnetwork/lnd v0.20.0-beta + github.com/lightningnetwork/lnd v0.20.1-beta github.com/lightningnetwork/lnd/kvdb v1.4.16 github.com/stretchr/testify v1.10.0 google.golang.org/grpc v1.59.0 @@ -103,7 +103,7 @@ require ( github.com/lightningnetwork/lnd/fn/v2 v2.0.9 // indirect github.com/lightningnetwork/lnd/healthcheck v1.2.6 // indirect github.com/lightningnetwork/lnd/queue v1.1.1 // indirect - github.com/lightningnetwork/lnd/sqldb v1.0.11 // indirect + github.com/lightningnetwork/lnd/sqldb v1.0.12-0.20260113193010-8565d12e40b1 // indirect github.com/lightningnetwork/lnd/ticker v1.1.1 // indirect github.com/lightningnetwork/lnd/tlv v1.3.2 // indirect github.com/lightningnetwork/lnd/tor v1.1.6 // indirect @@ -193,4 +193,4 @@ require ( // allows us to specify that as an option. replace google.golang.org/protobuf => github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display -go 1.24.9 +go 1.25.5 diff --git a/go.sum b/go.sum index 400b036..45c3c7c 100644 --- a/go.sum +++ b/go.sum @@ -356,8 +356,8 @@ github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display h1:Y2WiPkBS github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= github.com/lightningnetwork/lightning-onion v1.2.1-0.20240815225420-8b40adf04ab9 h1:6D3LrdagJweLLdFm1JNodZsBk6iU4TTsBBFLQ4yiXfI= github.com/lightningnetwork/lightning-onion v1.2.1-0.20240815225420-8b40adf04ab9/go.mod h1:EDqJ3MuZIbMq0QI1czTIKDJ/GS8S14RXPwapHw8cw6w= -github.com/lightningnetwork/lnd v0.20.0-beta h1:ML+jgJ3UKDGJdUf0m73ZeR/szJKWVtHxpQP+yFC79b8= -github.com/lightningnetwork/lnd v0.20.0-beta/go.mod h1:8hc55AnE3mMSJ/UAEJZgmhgNCcH0yWaPg0olpxhhp4M= +github.com/lightningnetwork/lnd v0.20.1-beta h1:wDMNgks5uST1CY+WwjIZ4+McPMMFpr2pIIGJp7ytDI4= +github.com/lightningnetwork/lnd v0.20.1-beta/go.mod h1:oIKh9EqE1sJJpQPq9ZCMFc4Ot287NrotZ1oZn0zUI+M= github.com/lightningnetwork/lnd/clock v1.1.1 h1:OfR3/zcJd2RhH0RU+zX/77c0ZiOnIMsDIBjgjWdZgA0= github.com/lightningnetwork/lnd/clock v1.1.1/go.mod h1:mGnAhPyjYZQJmebS7aevElXKTFDuO+uNFFfMXK1W8xQ= github.com/lightningnetwork/lnd/fn/v2 v2.0.9 h1:ZytG4ltPac/sCyg1EJDn10RGzPIDJeyennUMRdOw7Y8= @@ -368,8 +368,8 @@ github.com/lightningnetwork/lnd/kvdb v1.4.16 h1:9BZgWdDfjmHRHLS97cz39bVuBAqMc4/p github.com/lightningnetwork/lnd/kvdb v1.4.16/go.mod h1:HW+bvwkxNaopkz3oIgBV6NEnV4jCEZCACFUcNg4xSjM= github.com/lightningnetwork/lnd/queue v1.1.1 h1:99ovBlpM9B0FRCGYJo6RSFDlt8/vOkQQZznVb18iNMI= github.com/lightningnetwork/lnd/queue v1.1.1/go.mod h1:7A6nC1Qrm32FHuhx/mi1cieAiBZo5O6l8IBIoQxvkz4= -github.com/lightningnetwork/lnd/sqldb v1.0.11 h1:X8J3OvdIhJVniQG78Qsp3niErl1zdGMTPvzgiLMWOOo= -github.com/lightningnetwork/lnd/sqldb v1.0.11/go.mod h1:oOdZ7vjmAUmI9He+aFHTunnxKVefHZAfJttZdz16hSg= +github.com/lightningnetwork/lnd/sqldb v1.0.12-0.20260113193010-8565d12e40b1 h1:PkEppKL17cZh0Dr9h/T9BEVJUbd/p2tjJ/x8ffG3R0M= +github.com/lightningnetwork/lnd/sqldb v1.0.12-0.20260113193010-8565d12e40b1/go.mod h1:tB2jlqu79TIOR9uhAZOmPxpVFUhB2s+oxKnqRRL1oc0= github.com/lightningnetwork/lnd/ticker v1.1.1 h1:J/b6N2hibFtC7JLV77ULQp++QLtCwT6ijJlbdiZFbSM= github.com/lightningnetwork/lnd/ticker v1.1.1/go.mod h1:waPTRAAcwtu7Ji3+3k+u/xH5GHovTsCoSVpho0KDvdA= github.com/lightningnetwork/lnd/tlv v1.3.2 h1:MO4FCk7F4k5xPMqVZF6Nb/kOpxlwPrUQpYjmyKny5s0= From 8961eb587974e7c2ee4988ec6a036ea89ecf26e3 Mon Sep 17 00:00:00 2001 From: Slyghtning Date: Fri, 13 Feb 2026 09:00:02 +0100 Subject: [PATCH 03/10] tools: update go version --- .github/workflows/main.yml | 2 +- tools/Dockerfile | 2 +- tools/go.mod | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bdc8280..2cdfa2b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,7 +13,7 @@ defaults: shell: bash env: - GO_VERSION: 1.24.6 + GO_VERSION: 1.26 jobs: build: diff --git a/tools/Dockerfile b/tools/Dockerfile index 82cdc11..00d43d5 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.9-bookworm +FROM golang:1.26.0-bookworm RUN apt-get update && apt-get install -y git ENV GOCACHE=/tmp/build/.cache diff --git a/tools/go.mod b/tools/go.mod index 02a0080..ed85df7 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -1,6 +1,6 @@ module github.com/lightninglabs/lndclient/tools -go 1.24.6 +go 1.25.5 require ( // Once golangci-lint v2.4.1 update it here. From 6f15e2c56372bea665d0ce7d12853d0c6f003178 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 14 Apr 2026 16:31:20 -0500 Subject: [PATCH 04/10] lndclient: preserve addinvoice route hints Marshal explicit route hints in lightningClient.AddInvoice so the standard invoice path matches AddHoldInvoice. Add regression coverage for direct AddInvoice route hint encoding and for route hint parity between AddInvoice and AddHoldInvoice. --- invoices_client_test.go | 157 +++++++++++++++++++++++++++++++++++++++ lightning_client.go | 8 ++ lightning_client_test.go | 70 ++++++++++++++++- 3 files changed, 231 insertions(+), 4 deletions(-) create mode 100644 invoices_client_test.go diff --git a/invoices_client_test.go b/invoices_client_test.go new file mode 100644 index 0000000..6d48b05 --- /dev/null +++ b/invoices_client_test.go @@ -0,0 +1,157 @@ +package lndclient + +import ( + "bytes" + "context" + "testing" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/lightningnetwork/lnd/lnrpc" + "github.com/lightningnetwork/lnd/lnrpc/invoicesrpc" + "github.com/lightningnetwork/lnd/lntypes" + "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/zpay32" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" +) + +// testInvoiceRouteHints returns deterministic route hints for invoice tests. +func testInvoiceRouteHints() [][]zpay32.HopHint { + _, pubKey1 := btcec.PrivKeyFromBytes(bytes.Repeat([]byte{1}, 32)) + _, pubKey2 := btcec.PrivKeyFromBytes(bytes.Repeat([]byte{2}, 32)) + _, pubKey3 := btcec.PrivKeyFromBytes(bytes.Repeat([]byte{3}, 32)) + + return [][]zpay32.HopHint{ + { + { + NodeID: pubKey1, + ChannelID: 101, + FeeBaseMSat: 1001, + FeeProportionalMillionths: 2001, + CLTVExpiryDelta: 40, + }, + { + NodeID: pubKey2, + ChannelID: 102, + FeeBaseMSat: 1002, + FeeProportionalMillionths: 2002, + CLTVExpiryDelta: 41, + }, + }, + { + { + NodeID: pubKey3, + ChannelID: 103, + FeeBaseMSat: 1003, + FeeProportionalMillionths: 2003, + CLTVExpiryDelta: 42, + }, + }, + } +} + +// testRPCRouteHints returns the RPC form of the deterministic route hints. +func testRPCRouteHints(t *testing.T) []*lnrpc.RouteHint { + t.Helper() + + rpcRouteHints, err := marshallRouteHints(testInvoiceRouteHints()) + require.NoError(t, err) + + return rpcRouteHints +} + +// addHoldInvoiceArg records the args used in +// mockInvoicesRPCClient.AddHoldInvoice. +type addHoldInvoiceArg struct { + in *invoicesrpc.AddHoldInvoiceRequest + opts []grpc.CallOption +} + +// mockInvoicesRPCClient implements invoicesrpc.InvoicesClient with a dynamic +// AddHoldInvoice implementation and call spying. +type mockInvoicesRPCClient struct { + invoicesrpc.InvoicesClient + + addHoldInvoice func(in *invoicesrpc.AddHoldInvoiceRequest, + opts ...grpc.CallOption) (*invoicesrpc.AddHoldInvoiceResp, + error) + + addHoldInvoiceArgs []addHoldInvoiceArg +} + +// AddHoldInvoice records the call and forwards it to the test hook. +func (m *mockInvoicesRPCClient) AddHoldInvoice(ctx context.Context, + in *invoicesrpc.AddHoldInvoiceRequest, + opts ...grpc.CallOption) (*invoicesrpc.AddHoldInvoiceResp, error) { + + m.addHoldInvoiceArgs = append(m.addHoldInvoiceArgs, addHoldInvoiceArg{ + in: in, + opts: opts, + }) + + return m.addHoldInvoice(in, opts...) +} + +// TestInvoiceClientAddInvoiceRouteHintParity ensures AddInvoice and +// AddHoldInvoice encode the same route hints for the same invoice input. +func TestInvoiceClientAddInvoiceRouteHintParity(t *testing.T) { + var validPreimage lntypes.Preimage + copy(validPreimage[:], "valid preimage") + + var validRHash lntypes.Hash + copy(validRHash[:], "valid hash") + + invoice := &invoicesrpc.AddInvoiceData{ + Memo: "fake memo", + Preimage: &validPreimage, + Hash: &validRHash, + Value: lnwire.MilliSatoshi(500000), + DescriptionHash: []byte("fake 32 byte hash"), + Expiry: 123, + CltvExpiry: 456, + RouteHints: testInvoiceRouteHints(), + } + + lightningRPC := &mockRPCClient{ + addInvoice: func(_ *lnrpc.Invoice, + _ ...grpc.CallOption) (*lnrpc.AddInvoiceResponse, + error) { + + return &lnrpc.AddInvoiceResponse{ + RHash: validRHash[:], + PaymentRequest: "swap invoice", + }, nil + }, + } + holdRPC := &mockInvoicesRPCClient{ + addHoldInvoice: func(_ *invoicesrpc.AddHoldInvoiceRequest, + _ ...grpc.CallOption) (*invoicesrpc.AddHoldInvoiceResp, + error) { + + return &invoicesrpc.AddHoldInvoiceResp{ + PaymentRequest: "probe invoice", + }, nil + }, + } + + lightning := &lightningClient{ + client: lightningRPC, + } + invoices := &invoicesClient{ + client: holdRPC, + } + + _, _, err := lightning.AddInvoice(t.Context(), invoice) + require.NoError(t, err) + + _, err = invoices.AddHoldInvoice(t.Context(), invoice) + require.NoError(t, err) + + require.Len(t, lightningRPC.addInvoiceArgs, 1) + require.Len(t, holdRPC.addHoldInvoiceArgs, 1) + + require.Equal( + t, holdRPC.addHoldInvoiceArgs[0].in.RouteHints, + lightningRPC.addInvoiceArgs[0].in.RouteHints, + ) +} diff --git a/lightning_client.go b/lightning_client.go index 35a70cb..f63b6e8 100644 --- a/lightning_client.go +++ b/lightning_client.go @@ -1665,6 +1665,13 @@ func (s *lightningClient) AddInvoice(ctx context.Context, rpcCtx, cancel := context.WithTimeout(ctx, s.timeout) defer cancel() + routeHints, err := marshallRouteHints(in.RouteHints) + if err != nil { + return lntypes.Hash{}, "", fmt.Errorf( + "failed to marshal route hints: %v", err, + ) + } + rpcIn := &lnrpc.Invoice{ Memo: in.Memo, ValueMsat: int64(in.Value), @@ -1672,6 +1679,7 @@ func (s *lightningClient) AddInvoice(ctx context.Context, Expiry: in.Expiry, CltvExpiry: in.CltvExpiry, Private: in.Private, + RouteHints: routeHints, } if in.Preimage != nil { diff --git a/lightning_client_test.go b/lightning_client_test.go index 44ec327..f5df568 100644 --- a/lightning_client_test.go +++ b/lightning_client_test.go @@ -40,6 +40,37 @@ func (m *mockRPCClient) AddInvoice(ctx context.Context, in *lnrpc.Invoice, return m.addInvoice(in, opts...) } +// assertAddInvoiceArgs verifies the recorded AddInvoice RPC calls. +func assertAddInvoiceArgs(t *testing.T, want, got []addInvoiceArg) { + t.Helper() + + require.Len(t, got, len(want)) + + for i := range want { + require.Equal(t, want[i].opts, got[i].opts) + require.Equal(t, want[i].in.Memo, got[i].in.Memo) + require.Equal(t, want[i].in.RPreimage, got[i].in.RPreimage) + require.Equal(t, want[i].in.RHash, got[i].in.RHash) + require.Equal(t, want[i].in.ValueMsat, got[i].in.ValueMsat) + require.Equal( + t, want[i].in.DescriptionHash, + got[i].in.DescriptionHash, + ) + require.Equal(t, want[i].in.Expiry, got[i].in.Expiry) + require.Equal( + t, want[i].in.CltvExpiry, got[i].in.CltvExpiry, + ) + require.Equal(t, want[i].in.Private, got[i].in.Private) + + if len(want[i].in.RouteHints) == 0 { + require.Empty(t, got[i].in.RouteHints) + continue + } + + require.Equal(t, want[i].in.RouteHints, got[i].in.RouteHints) + } +} + // TestLightningClientAddInvoice ensures that adding an invoice via // lightningClient is completed as expected. func TestLightningClientAddInvoice(t *testing.T) { @@ -48,6 +79,9 @@ func TestLightningClientAddInvoice(t *testing.T) { copy(validPreimage[:], "valid preimage") var validRHash lntypes.Hash copy(validRHash[:], "valid hash") + validRouteHints := testInvoiceRouteHints() + validRPCRouteHints := testRPCRouteHints(t) + validAddInvoiceData := &invoicesrpc.AddInvoiceData{ Memo: "fake memo", Preimage: &validPreimage, @@ -100,6 +134,22 @@ func TestLightningClientAddInvoice(t *testing.T) { {in: privateInvoice}, } + routeHintAddInvoiceData := *validAddInvoiceData + routeHintAddInvoiceData.RouteHints = validRouteHints + routeHintInvoice := &lnrpc.Invoice{ + Memo: validAddInvoiceData.Memo, + RPreimage: validAddInvoiceData.Preimage[:], + RHash: validAddInvoiceData.Hash[:], + ValueMsat: int64(validAddInvoiceData.Value), + DescriptionHash: validAddInvoiceData.DescriptionHash, + Expiry: validAddInvoiceData.Expiry, + CltvExpiry: validAddInvoiceData.CltvExpiry, + RouteHints: validRPCRouteHints, + } + routeHintAddInvoiceArgs := []addInvoiceArg{ + {in: routeHintInvoice}, + } + errorAddInvoice := func(in *lnrpc.Invoice, opts ...grpc.CallOption) ( *lnrpc.AddInvoiceResponse, error) { @@ -147,6 +197,18 @@ func TestLightningClientAddInvoice(t *testing.T) { payRequest: validPayReq, }, }, + { + name: "invoice with route hints", + client: mockRPCClient{ + addInvoice: validAddInvoice, + }, + invoice: &routeHintAddInvoiceData, + expect: expect{ + addInvoiceArgs: routeHintAddInvoiceArgs, + hash: validRHash, + payRequest: validPayReq, + }, + }, { name: "rpc client error", client: mockRPCClient{ @@ -167,7 +229,7 @@ func TestLightningClientAddInvoice(t *testing.T) { } hash, payRequest, err := ln.AddInvoice( - context.Background(), test.invoice, + t.Context(), test.invoice, ) // Check if an error (or no error) was received as @@ -192,9 +254,9 @@ func TestLightningClientAddInvoice(t *testing.T) { // Check if the expected args were passed to the RPC // client call. - require.Equal(t, test.client.addInvoiceArgs, - test.expect.addInvoiceArgs, - "rpc client call was not made as expected", + assertAddInvoiceArgs( + t, test.expect.addInvoiceArgs, + test.client.addInvoiceArgs, ) }) } From 157b89e68ac4d26e82aee52e6e704f51acaacced Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 14 Apr 2026 17:21:36 -0500 Subject: [PATCH 05/10] lndclient: preserve addinvoice fallback address Set FallbackAddr on the standard AddInvoice RPC request so the lightning client preserves explicit on-chain fallback addresses. Extend the existing invoice tests with direct AddInvoice coverage and parity checks against AddHoldInvoice. --- invoices_client_test.go | 50 +++++++++++++++++++++++++++++++--------- lightning_client.go | 1 + lightning_client_test.go | 31 +++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 11 deletions(-) diff --git a/invoices_client_test.go b/invoices_client_test.go index 6d48b05..93706ed 100644 --- a/invoices_client_test.go +++ b/invoices_client_test.go @@ -50,6 +50,9 @@ func testInvoiceRouteHints() [][]zpay32.HopHint { } } +// fallbackAddr is just a Bitcoin address used for tests of FallbackAddr field. +const fallbackAddr = "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kygt080" + // testRPCRouteHints returns the RPC form of the deterministic route hints. func testRPCRouteHints(t *testing.T) []*lnrpc.RouteHint { t.Helper() @@ -92,26 +95,51 @@ func (m *mockInvoicesRPCClient) AddHoldInvoice(ctx context.Context, return m.addHoldInvoice(in, opts...) } -// TestInvoiceClientAddInvoiceRouteHintParity ensures AddInvoice and -// AddHoldInvoice encode the same route hints for the same invoice input. -func TestInvoiceClientAddInvoiceRouteHintParity(t *testing.T) { +// assertInvoiceRequestParity verifies the shared fields that should be encoded +// identically by AddInvoice and AddHoldInvoice. +func assertInvoiceRequestParity(t *testing.T, add *lnrpc.Invoice, + hold *invoicesrpc.AddHoldInvoiceRequest) { + + t.Helper() + + require.Equal(t, add.Memo, hold.Memo) + require.Equal(t, add.ValueMsat, hold.ValueMsat) + require.Equal(t, add.DescriptionHash, hold.DescriptionHash) + require.Equal(t, add.Expiry, hold.Expiry) + require.Equal(t, add.FallbackAddr, hold.FallbackAddr) + require.Equal(t, add.CltvExpiry, hold.CltvExpiry) + require.Equal(t, add.Private, hold.Private) + require.Equal(t, add.RouteHints, hold.RouteHints) +} + +// TestInvoiceClientAddInvoiceParity ensures AddInvoice and AddHoldInvoice +// encode the same explicit invoice fields for the same invoice input. +func TestInvoiceClientAddInvoiceParity(t *testing.T) { var validPreimage lntypes.Preimage copy(validPreimage[:], "valid preimage") var validRHash lntypes.Hash copy(validRHash[:], "valid hash") - invoice := &invoicesrpc.AddInvoiceData{ + sharedInvoice := invoicesrpc.AddInvoiceData{ Memo: "fake memo", - Preimage: &validPreimage, - Hash: &validRHash, Value: lnwire.MilliSatoshi(500000), DescriptionHash: []byte("fake 32 byte hash"), Expiry: 123, + FallbackAddr: fallbackAddr, CltvExpiry: 456, + Private: true, RouteHints: testInvoiceRouteHints(), } + // The two wrappers use different invoice creation RPCs, so we provide + // path-specific fixtures for their mutually exclusive fields. + lightningInvoice := sharedInvoice + lightningInvoice.Preimage = &validPreimage + + holdInvoice := sharedInvoice + holdInvoice.Hash = &validRHash + lightningRPC := &mockRPCClient{ addInvoice: func(_ *lnrpc.Invoice, _ ...grpc.CallOption) (*lnrpc.AddInvoiceResponse, @@ -141,17 +169,17 @@ func TestInvoiceClientAddInvoiceRouteHintParity(t *testing.T) { client: holdRPC, } - _, _, err := lightning.AddInvoice(t.Context(), invoice) + _, _, err := lightning.AddInvoice(t.Context(), &lightningInvoice) require.NoError(t, err) - _, err = invoices.AddHoldInvoice(t.Context(), invoice) + _, err = invoices.AddHoldInvoice(t.Context(), &holdInvoice) require.NoError(t, err) require.Len(t, lightningRPC.addInvoiceArgs, 1) require.Len(t, holdRPC.addHoldInvoiceArgs, 1) - require.Equal( - t, holdRPC.addHoldInvoiceArgs[0].in.RouteHints, - lightningRPC.addInvoiceArgs[0].in.RouteHints, + assertInvoiceRequestParity( + t, lightningRPC.addInvoiceArgs[0].in, + holdRPC.addHoldInvoiceArgs[0].in, ) } diff --git a/lightning_client.go b/lightning_client.go index f63b6e8..4405837 100644 --- a/lightning_client.go +++ b/lightning_client.go @@ -1677,6 +1677,7 @@ func (s *lightningClient) AddInvoice(ctx context.Context, ValueMsat: int64(in.Value), DescriptionHash: in.DescriptionHash, Expiry: in.Expiry, + FallbackAddr: in.FallbackAddr, CltvExpiry: in.CltvExpiry, Private: in.Private, RouteHints: routeHints, diff --git a/lightning_client_test.go b/lightning_client_test.go index f5df568..9704b8b 100644 --- a/lightning_client_test.go +++ b/lightning_client_test.go @@ -57,6 +57,9 @@ func assertAddInvoiceArgs(t *testing.T, want, got []addInvoiceArg) { got[i].in.DescriptionHash, ) require.Equal(t, want[i].in.Expiry, got[i].in.Expiry) + require.Equal( + t, want[i].in.FallbackAddr, got[i].in.FallbackAddr, + ) require.Equal( t, want[i].in.CltvExpiry, got[i].in.CltvExpiry, ) @@ -134,6 +137,22 @@ func TestLightningClientAddInvoice(t *testing.T) { {in: privateInvoice}, } + fallbackAddrAddInvoiceData := *validAddInvoiceData + fallbackAddrAddInvoiceData.FallbackAddr = fallbackAddr + fallbackAddrInvoice := &lnrpc.Invoice{ + Memo: validAddInvoiceData.Memo, + RPreimage: validAddInvoiceData.Preimage[:], + RHash: validAddInvoiceData.Hash[:], + ValueMsat: int64(validAddInvoiceData.Value), + DescriptionHash: validAddInvoiceData.DescriptionHash, + Expiry: validAddInvoiceData.Expiry, + FallbackAddr: fallbackAddrAddInvoiceData.FallbackAddr, + CltvExpiry: validAddInvoiceData.CltvExpiry, + } + fallbackAddrAddInvoiceArgs := []addInvoiceArg{ + {in: fallbackAddrInvoice}, + } + routeHintAddInvoiceData := *validAddInvoiceData routeHintAddInvoiceData.RouteHints = validRouteHints routeHintInvoice := &lnrpc.Invoice{ @@ -197,6 +216,18 @@ func TestLightningClientAddInvoice(t *testing.T) { payRequest: validPayReq, }, }, + { + name: "invoice with fallback address", + client: mockRPCClient{ + addInvoice: validAddInvoice, + }, + invoice: &fallbackAddrAddInvoiceData, + expect: expect{ + addInvoiceArgs: fallbackAddrAddInvoiceArgs, + hash: validRHash, + payRequest: validPayReq, + }, + }, { name: "invoice with route hints", client: mockRPCClient{ From 9c1b4f432b7f3438e770d1015dec3f210d047b3e Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 14 Apr 2026 17:22:17 -0500 Subject: [PATCH 06/10] lndclient: preserve addinvoice amp flag Set IsAmp on the standard AddInvoice RPC request so callers can request AMP invoices through lightningClient.AddInvoice. Extend the existing AddInvoice unit test to assert AMP invoice requests preserve the flag on the outgoing RPC payload. --- lightning_client.go | 1 + lightning_client_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lightning_client.go b/lightning_client.go index 4405837..85f8c64 100644 --- a/lightning_client.go +++ b/lightning_client.go @@ -1680,6 +1680,7 @@ func (s *lightningClient) AddInvoice(ctx context.Context, FallbackAddr: in.FallbackAddr, CltvExpiry: in.CltvExpiry, Private: in.Private, + IsAmp: in.Amp, RouteHints: routeHints, } diff --git a/lightning_client_test.go b/lightning_client_test.go index 9704b8b..0e63f49 100644 --- a/lightning_client_test.go +++ b/lightning_client_test.go @@ -64,6 +64,7 @@ func assertAddInvoiceArgs(t *testing.T, want, got []addInvoiceArg) { t, want[i].in.CltvExpiry, got[i].in.CltvExpiry, ) require.Equal(t, want[i].in.Private, got[i].in.Private) + require.Equal(t, want[i].in.IsAmp, got[i].in.IsAmp) if len(want[i].in.RouteHints) == 0 { require.Empty(t, got[i].in.RouteHints) @@ -153,6 +154,26 @@ func TestLightningClientAddInvoice(t *testing.T) { {in: fallbackAddrInvoice}, } + ampAddInvoiceData := &invoicesrpc.AddInvoiceData{ + Memo: validAddInvoiceData.Memo, + Value: validAddInvoiceData.Value, + DescriptionHash: validAddInvoiceData.DescriptionHash, + Expiry: validAddInvoiceData.Expiry, + CltvExpiry: validAddInvoiceData.CltvExpiry, + Amp: true, + } + ampInvoice := &lnrpc.Invoice{ + Memo: ampAddInvoiceData.Memo, + ValueMsat: int64(ampAddInvoiceData.Value), + DescriptionHash: ampAddInvoiceData.DescriptionHash, + Expiry: ampAddInvoiceData.Expiry, + CltvExpiry: ampAddInvoiceData.CltvExpiry, + IsAmp: true, + } + ampAddInvoiceArgs := []addInvoiceArg{ + {in: ampInvoice}, + } + routeHintAddInvoiceData := *validAddInvoiceData routeHintAddInvoiceData.RouteHints = validRouteHints routeHintInvoice := &lnrpc.Invoice{ @@ -228,6 +249,18 @@ func TestLightningClientAddInvoice(t *testing.T) { payRequest: validPayReq, }, }, + { + name: "amp invoice", + client: mockRPCClient{ + addInvoice: validAddInvoice, + }, + invoice: ampAddInvoiceData, + expect: expect{ + addInvoiceArgs: ampAddInvoiceArgs, + hash: validRHash, + payRequest: validPayReq, + }, + }, { name: "invoice with route hints", client: mockRPCClient{ From db55732973fff6064691c3d6630564e47d726501 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 14 Apr 2026 17:49:13 -0500 Subject: [PATCH 07/10] lndclient: ignore hold invoice args in addinvoice Stop forwarding Hash on the standard AddInvoice path and warn when Hash or HodlInvoice are provided, since callers should use InvoicesClient.AddHoldInvoice for hold invoices. Extend the existing AddInvoice test to assert the standard invoice request omits hold-invoice-only arguments. --- lightning_client.go | 9 ++++++--- lightning_client_test.go | 32 +++++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lightning_client.go b/lightning_client.go index 85f8c64..36b705f 100644 --- a/lightning_client.go +++ b/lightning_client.go @@ -1665,6 +1665,12 @@ func (s *lightningClient) AddInvoice(ctx context.Context, rpcCtx, cancel := context.WithTimeout(ctx, s.timeout) defer cancel() + if in.Hash != nil || in.HodlInvoice { + log.Warnf("lightningClient.AddInvoice ignores " + + "Hash/HodlInvoice; use InvoicesClient.AddHoldInvoice " + + "for hold invoices") + } + routeHints, err := marshallRouteHints(in.RouteHints) if err != nil { return lntypes.Hash{}, "", fmt.Errorf( @@ -1687,9 +1693,6 @@ func (s *lightningClient) AddInvoice(ctx context.Context, if in.Preimage != nil { rpcIn.RPreimage = in.Preimage[:] } - if in.Hash != nil { - rpcIn.RHash = in.Hash[:] - } rpcCtx = s.adminMac.WithMacaroonAuth(rpcCtx) resp, err := s.client.AddInvoice(rpcCtx, rpcIn) diff --git a/lightning_client_test.go b/lightning_client_test.go index 0e63f49..87b8a3d 100644 --- a/lightning_client_test.go +++ b/lightning_client_test.go @@ -89,7 +89,6 @@ func TestLightningClientAddInvoice(t *testing.T) { validAddInvoiceData := &invoicesrpc.AddInvoiceData{ Memo: "fake memo", Preimage: &validPreimage, - Hash: &validRHash, Value: lnwire.MilliSatoshi(500000), DescriptionHash: []byte("fake 32 byte hash"), Expiry: 123, @@ -99,7 +98,6 @@ func TestLightningClientAddInvoice(t *testing.T) { validInvoice := &lnrpc.Invoice{ Memo: validAddInvoiceData.Memo, RPreimage: validAddInvoiceData.Preimage[:], - RHash: validAddInvoiceData.Hash[:], ValueMsat: int64(validAddInvoiceData.Value), DescriptionHash: validAddInvoiceData.DescriptionHash, Expiry: validAddInvoiceData.Expiry, @@ -127,7 +125,6 @@ func TestLightningClientAddInvoice(t *testing.T) { privateInvoice := &lnrpc.Invoice{ Memo: validAddInvoiceData.Memo, RPreimage: validAddInvoiceData.Preimage[:], - RHash: validAddInvoiceData.Hash[:], ValueMsat: int64(validAddInvoiceData.Value), DescriptionHash: validAddInvoiceData.DescriptionHash, Expiry: validAddInvoiceData.Expiry, @@ -143,7 +140,6 @@ func TestLightningClientAddInvoice(t *testing.T) { fallbackAddrInvoice := &lnrpc.Invoice{ Memo: validAddInvoiceData.Memo, RPreimage: validAddInvoiceData.Preimage[:], - RHash: validAddInvoiceData.Hash[:], ValueMsat: int64(validAddInvoiceData.Value), DescriptionHash: validAddInvoiceData.DescriptionHash, Expiry: validAddInvoiceData.Expiry, @@ -174,12 +170,26 @@ func TestLightningClientAddInvoice(t *testing.T) { {in: ampInvoice}, } + hashAddInvoiceData := *validAddInvoiceData + hashAddInvoiceData.Preimage = nil + hashAddInvoiceData.Hash = &validRHash + hashAddInvoiceData.HodlInvoice = true + hashInvoice := &lnrpc.Invoice{ + Memo: validAddInvoiceData.Memo, + ValueMsat: int64(validAddInvoiceData.Value), + DescriptionHash: validAddInvoiceData.DescriptionHash, + Expiry: validAddInvoiceData.Expiry, + CltvExpiry: validAddInvoiceData.CltvExpiry, + } + hashAddInvoiceArgs := []addInvoiceArg{ + {in: hashInvoice}, + } + routeHintAddInvoiceData := *validAddInvoiceData routeHintAddInvoiceData.RouteHints = validRouteHints routeHintInvoice := &lnrpc.Invoice{ Memo: validAddInvoiceData.Memo, RPreimage: validAddInvoiceData.Preimage[:], - RHash: validAddInvoiceData.Hash[:], ValueMsat: int64(validAddInvoiceData.Value), DescriptionHash: validAddInvoiceData.DescriptionHash, Expiry: validAddInvoiceData.Expiry, @@ -261,6 +271,18 @@ func TestLightningClientAddInvoice(t *testing.T) { payRequest: validPayReq, }, }, + { + name: "invoice with hash uses standard invoice path", + client: mockRPCClient{ + addInvoice: validAddInvoice, + }, + invoice: &hashAddInvoiceData, + expect: expect{ + addInvoiceArgs: hashAddInvoiceArgs, + hash: validRHash, + payRequest: validPayReq, + }, + }, { name: "invoice with route hints", client: mockRPCClient{ From ec7246e9f21d83c4199f1c561b5e762666496491 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 14 Apr 2026 17:50:04 -0500 Subject: [PATCH 08/10] lndclient: map addinvoice blinded path config Translate BlindedPathCfg into the standard AddInvoice RPC by setting IsBlinded and forwarding MinNumPathHops as the compatible NumHops override. Warn when non-overlapping blinded path settings are provided, and extend the AddInvoice unit test to assert blinded invoice requests preserve the translated RPC fields. --- lightning_client.go | 19 +++++++++++ lightning_client_test.go | 70 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/lightning_client.go b/lightning_client.go index 36b705f..03cab16 100644 --- a/lightning_client.go +++ b/lightning_client.go @@ -1693,6 +1693,25 @@ func (s *lightningClient) AddInvoice(ctx context.Context, if in.Preimage != nil { rpcIn.RPreimage = in.Preimage[:] } + if in.BlindedPathCfg != nil { + rpcIn.IsBlinded = true + + if in.BlindedPathCfg.MinNumPathHops != 0 { + numHops := uint32(in.BlindedPathCfg.MinNumPathHops) + rpcIn.BlindedPathConfig = &lnrpc.BlindedPathConfig{ + NumHops: &numHops, + } + } + + if in.BlindedPathCfg.RoutePolicyIncrMultiplier != 0 || + in.BlindedPathCfg.RoutePolicyDecrMultiplier != 0 || + in.BlindedPathCfg.DefaultDummyHopPolicy != nil { + + log.Warnf("lightningClient.AddInvoice only forwards " + + "MinNumPathHops from BlindedPathCfg; other " + + "blinded path settings use lnd defaults") + } + } rpcCtx = s.adminMac.WithMacaroonAuth(rpcCtx) resp, err := s.client.AddInvoice(rpcCtx, rpcIn) diff --git a/lightning_client_test.go b/lightning_client_test.go index 87b8a3d..b2451ef 100644 --- a/lightning_client_test.go +++ b/lightning_client_test.go @@ -65,6 +65,16 @@ func assertAddInvoiceArgs(t *testing.T, want, got []addInvoiceArg) { ) require.Equal(t, want[i].in.Private, got[i].in.Private) require.Equal(t, want[i].in.IsAmp, got[i].in.IsAmp) + require.Equal(t, want[i].in.IsBlinded, got[i].in.IsBlinded) + + if want[i].in.BlindedPathConfig == nil { + require.Nil(t, got[i].in.BlindedPathConfig) + } else { + require.Equal( + t, want[i].in.BlindedPathConfig, + got[i].in.BlindedPathConfig, + ) + } if len(want[i].in.RouteHints) == 0 { require.Empty(t, got[i].in.RouteHints) @@ -185,6 +195,42 @@ func TestLightningClientAddInvoice(t *testing.T) { {in: hashInvoice}, } + blindedAddInvoiceData := *validAddInvoiceData + blindedAddInvoiceData.BlindedPathCfg = &invoicesrpc.BlindedPathConfig{ + MinNumPathHops: 5, + } + numHops := uint32(blindedAddInvoiceData.BlindedPathCfg.MinNumPathHops) + blindedInvoice := &lnrpc.Invoice{ + Memo: validAddInvoiceData.Memo, + RPreimage: validAddInvoiceData.Preimage[:], + ValueMsat: int64(validAddInvoiceData.Value), + DescriptionHash: validAddInvoiceData.DescriptionHash, + Expiry: validAddInvoiceData.Expiry, + CltvExpiry: validAddInvoiceData.CltvExpiry, + IsBlinded: true, + BlindedPathConfig: &lnrpc.BlindedPathConfig{ + NumHops: &numHops, + }, + } + blindedAddInvoiceArgs := []addInvoiceArg{ + {in: blindedInvoice}, + } + + blindedZeroHopAddInvoiceData := *validAddInvoiceData + blindedZeroHopAddInvoiceData.BlindedPathCfg = &invoicesrpc.BlindedPathConfig{} + blindedZeroHopInvoice := &lnrpc.Invoice{ + Memo: validAddInvoiceData.Memo, + RPreimage: validAddInvoiceData.Preimage[:], + ValueMsat: int64(validAddInvoiceData.Value), + DescriptionHash: validAddInvoiceData.DescriptionHash, + Expiry: validAddInvoiceData.Expiry, + CltvExpiry: validAddInvoiceData.CltvExpiry, + IsBlinded: true, + } + blindedZeroHopAddInvoiceArgs := []addInvoiceArg{ + {in: blindedZeroHopInvoice}, + } + routeHintAddInvoiceData := *validAddInvoiceData routeHintAddInvoiceData.RouteHints = validRouteHints routeHintInvoice := &lnrpc.Invoice{ @@ -283,6 +329,30 @@ func TestLightningClientAddInvoice(t *testing.T) { payRequest: validPayReq, }, }, + { + name: "blinded invoice", + client: mockRPCClient{ + addInvoice: validAddInvoice, + }, + invoice: &blindedAddInvoiceData, + expect: expect{ + addInvoiceArgs: blindedAddInvoiceArgs, + hash: validRHash, + payRequest: validPayReq, + }, + }, + { + name: "blinded invoice with zero min path hops", + client: mockRPCClient{ + addInvoice: validAddInvoice, + }, + invoice: &blindedZeroHopAddInvoiceData, + expect: expect{ + addInvoiceArgs: blindedZeroHopAddInvoiceArgs, + hash: validRHash, + payRequest: validPayReq, + }, + }, { name: "invoice with route hints", client: mockRPCClient{ From e3748c1a23dab82e8df2be5eae1da50731456740 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 14 Apr 2026 18:33:43 -0500 Subject: [PATCH 09/10] lndclient: warn on unsupported hold invoice fields Warn when AddHoldInvoice is called with Amp or BlindedPathCfg, since the hold-invoice RPC cannot represent those inputs. Add coverage to document that the wrapper still forwards the supported request fields unchanged when those unsupported inputs are present. --- invoices_client.go | 6 +++++ invoices_client_test.go | 58 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/invoices_client.go b/invoices_client.go index 5946419..a1a2501 100644 --- a/invoices_client.go +++ b/invoices_client.go @@ -239,6 +239,12 @@ func (s *invoicesClient) AddHoldInvoice(ctx context.Context, rpcCtx, cancel := context.WithTimeout(ctx, s.timeout) defer cancel() + if in.Amp || in.BlindedPathCfg != nil { + log.Warnf("invoicesClient.AddHoldInvoice ignores Amp/" + + "BlindedPathCfg; hold invoice RPC does not support " + + "those fields") + } + routeHints, err := marshallRouteHints(in.RouteHints) if err != nil { return "", fmt.Errorf("failed to marshal route hints: %v", err) diff --git a/invoices_client_test.go b/invoices_client_test.go index 93706ed..ee5bef6 100644 --- a/invoices_client_test.go +++ b/invoices_client_test.go @@ -183,3 +183,61 @@ func TestInvoiceClientAddInvoiceParity(t *testing.T) { holdRPC.addHoldInvoiceArgs[0].in, ) } + +// TestInvoicesClientAddHoldInvoiceIgnoresUnsupportedFields ensures the +// AddHoldInvoice wrapper still forwards the supported request fields when AMP +// or blinded-path-only inputs are provided. +func TestInvoicesClientAddHoldInvoiceIgnoresUnsupportedFields(t *testing.T) { + var validRHash lntypes.Hash + copy(validRHash[:], "valid hash") + + invoice := &invoicesrpc.AddInvoiceData{ + Memo: "fake memo", + Hash: &validRHash, + Value: lnwire.MilliSatoshi(500000), + DescriptionHash: []byte("fake 32 byte hash"), + Expiry: 123, + FallbackAddr: fallbackAddr, + CltvExpiry: 456, + Private: true, + Amp: true, + BlindedPathCfg: &invoicesrpc.BlindedPathConfig{ + MinNumPathHops: 5, + }, + RouteHints: testInvoiceRouteHints(), + } + + rpcRouteHints := testRPCRouteHints(t) + expectedRequest := &invoicesrpc.AddHoldInvoiceRequest{ + Memo: invoice.Memo, + Hash: invoice.Hash[:], + ValueMsat: int64(invoice.Value), + DescriptionHash: invoice.DescriptionHash, + Expiry: invoice.Expiry, + FallbackAddr: invoice.FallbackAddr, + CltvExpiry: invoice.CltvExpiry, + Private: invoice.Private, + RouteHints: rpcRouteHints, + } + + holdRPC := &mockInvoicesRPCClient{ + addHoldInvoice: func(_ *invoicesrpc.AddHoldInvoiceRequest, + _ ...grpc.CallOption) (*invoicesrpc.AddHoldInvoiceResp, + error) { + + return &invoicesrpc.AddHoldInvoiceResp{ + PaymentRequest: "probe invoice", + }, nil + }, + } + + invoices := &invoicesClient{ + client: holdRPC, + } + + _, err := invoices.AddHoldInvoice(t.Context(), invoice) + require.NoError(t, err) + + require.Len(t, holdRPC.addHoldInvoiceArgs, 1) + require.Equal(t, expectedRequest, holdRPC.addHoldInvoiceArgs[0].in) +} From 8f272788b758790fa09cd0a755ec7a97886a072b Mon Sep 17 00:00:00 2001 From: Slyghtning Date: Thu, 23 Apr 2026 14:50:50 +0200 Subject: [PATCH 10/10] go.mod: update lnd to v0.21.0-beta.rc1 --- go.mod | 74 ++++++++++++------------ go.sum | 175 ++++++++++++++++++++++++++++++--------------------------- 2 files changed, 130 insertions(+), 119 deletions(-) diff --git a/go.mod b/go.mod index 986ab1c..14a6e1d 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,18 @@ module github.com/lightninglabs/lndclient require ( - github.com/btcsuite/btcd v0.24.3-0.20250318170759-4f4ea81776d6 - github.com/btcsuite/btcd/btcec/v2 v2.3.4 - github.com/btcsuite/btcd/btcutil v1.1.5 - github.com/btcsuite/btcd/btcutil/psbt v1.1.8 + github.com/btcsuite/btcd v0.25.1-0.20260310163610-1c55c7c18179 + github.com/btcsuite/btcd/btcec/v2 v2.3.6 + github.com/btcsuite/btcd/btcutil v1.1.6 + github.com/btcsuite/btcd/btcutil/psbt v1.1.10 github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 github.com/btcsuite/btclog/v2 v2.0.1-0.20250728225537-6090e87c6c5b - github.com/btcsuite/btcwallet v0.16.17 + github.com/btcsuite/btcwallet v0.16.17-0.20260213031108-70a94ea39e9c github.com/btcsuite/btcwallet/wtxmgr v1.5.6 - github.com/lightningnetwork/lnd v0.20.1-beta + github.com/lightningnetwork/lnd v0.21.0-beta.rc1 github.com/lightningnetwork/lnd/kvdb v1.4.16 - github.com/stretchr/testify v1.10.0 - google.golang.org/grpc v1.59.0 + github.com/stretchr/testify v1.11.1 + google.golang.org/grpc v1.79.1 gopkg.in/macaroon-bakery.v2 v2.0.1 gopkg.in/macaroon.v2 v2.1.0 ) @@ -26,7 +26,8 @@ require ( github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect github.com/aead/siphash v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c // indirect + github.com/btcsuite/btcd/v2transport v1.0.1 // indirect + github.com/btcsuite/btclog v1.0.0 // indirect github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 // indirect github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 // indirect github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 // indirect @@ -35,13 +36,13 @@ require ( github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect github.com/btcsuite/winsvc v1.0.0 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/decred/dcrd/crypto/blake256 v1.1.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect github.com/decred/dcrd/lru v1.1.2 // indirect github.com/docker/cli v28.1.1+incompatible // indirect github.com/docker/docker v28.1.1+incompatible // indirect @@ -49,7 +50,7 @@ require ( github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/fergusstrange/embedded-postgres v1.25.0 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gofrs/uuid v4.2.0+incompatible // indirect @@ -80,7 +81,7 @@ require ( github.com/jackc/pgx/v4 v4.18.3 // indirect github.com/jackc/pgx/v5 v5.7.4 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect - github.com/jessevdk/go-flags v1.4.0 // indirect + github.com/jessevdk/go-flags v1.6.1 // indirect github.com/jonboulle/clockwork v0.2.2 // indirect github.com/jrick/logrotate v1.1.2 // indirect github.com/json-iterator/go v1.1.11 // indirect @@ -96,14 +97,15 @@ require ( github.com/klauspost/compress v1.17.9 // indirect github.com/lib/pq v1.10.9 // indirect github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf // indirect - github.com/lightninglabs/neutrino v0.16.1 // indirect - github.com/lightninglabs/neutrino/cache v1.1.2 // indirect - github.com/lightningnetwork/lightning-onion v1.2.1-0.20240815225420-8b40adf04ab9 // indirect + github.com/lightninglabs/neutrino v0.16.2 // indirect + github.com/lightninglabs/neutrino/cache v1.1.3 // indirect + github.com/lightningnetwork/lightning-onion v1.3.0 // indirect + github.com/lightningnetwork/lnd/actor v0.0.6 // indirect github.com/lightningnetwork/lnd/clock v1.1.1 // indirect github.com/lightningnetwork/lnd/fn/v2 v2.0.9 // indirect github.com/lightningnetwork/lnd/healthcheck v1.2.6 // indirect - github.com/lightningnetwork/lnd/queue v1.1.1 // indirect - github.com/lightningnetwork/lnd/sqldb v1.0.12-0.20260113193010-8565d12e40b1 // indirect + github.com/lightningnetwork/lnd/queue v1.1.2-0.20260417172355-dfb7d57826c7 // indirect + github.com/lightningnetwork/lnd/sqldb v1.0.13-0.20260417172355-dfb7d57826c7 // indirect github.com/lightningnetwork/lnd/ticker v1.1.1 // indirect github.com/lightningnetwork/lnd/tlv v1.3.2 // indirect github.com/lightningnetwork/lnd/tor v1.1.6 // indirect @@ -148,32 +150,32 @@ require ( go.etcd.io/etcd/pkg/v3 v3.5.12 // indirect go.etcd.io/etcd/raft/v3 v3.5.12 // indirect go.etcd.io/etcd/server/v3 v3.5.12 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0 // indirect - go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/otel v1.39.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/sdk v1.35.0 // indirect - go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.opentelemetry.io/otel/metric v1.39.0 // indirect + go.opentelemetry.io/otel/sdk v1.39.0 // indirect + go.opentelemetry.io/otel/trace v1.39.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.17.0 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/sync v0.13.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/term v0.31.0 // indirect - golang.org/x/text v0.24.0 // indirect + golang.org/x/crypto v0.46.0 // indirect + golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect + golang.org/x/mod v0.30.0 // indirect + golang.org/x/net v0.48.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/term v0.38.0 // indirect + golang.org/x/text v0.32.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + golang.org/x/tools v0.39.0 // indirect google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/errgo.v1 v1.0.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 45c3c7c..cf8408e 100644 --- a/go.sum +++ b/go.sum @@ -2,9 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= @@ -35,30 +34,34 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= -github.com/btcsuite/btcd v0.24.3-0.20250318170759-4f4ea81776d6 h1:8n9k3I7e8DkpdQ5YAP4j8ly/LSsbe6qX9vmVbrUGvVw= -github.com/btcsuite/btcd v0.24.3-0.20250318170759-4f4ea81776d6/go.mod h1:OmM4kFtB0klaG/ZqT86rQiyw/1iyXlJgc3UHClPhhbs= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= +github.com/btcsuite/btcd v0.25.1-0.20260310163610-1c55c7c18179 h1:yJOTxkbxxtuSFrErMqYRvqZLfWggHssioBiWebkV9yo= +github.com/btcsuite/btcd v0.25.1-0.20260310163610-1c55c7c18179/go.mod h1:qbPE+pEiR9643E1s1xu57awsRhlCIm1ZIi6FfeRA4KE= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= -github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcec/v2 v2.3.6 h1:IzlsEr9olcSRKB/n7c4351F3xHKxS2lma+1UFGCYd4E= +github.com/btcsuite/btcd/btcec/v2 v2.3.6/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= -github.com/btcsuite/btcd/btcutil/psbt v1.1.8 h1:4voqtT8UppT7nmKQkXV+T9K8UyQjKOn2z/ycpmJK8wg= -github.com/btcsuite/btcd/btcutil/psbt v1.1.8/go.mod h1:kA6FLH/JfUx++j9pYU0pyu+Z8XGBQuuTmuKYUf6q7/U= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= +github.com/btcsuite/btcd/btcutil/psbt v1.1.10 h1:TC1zhxhFfhnGqoPjsrlEpoqzh+9TPOHrCgnPR47Mj9I= +github.com/btcsuite/btcd/btcutil/psbt v1.1.10/go.mod h1:ehBEvU91lxSlXtA+zZz3iFYx7Yq9eqnKx4/kSrnsvMY= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/v2transport v1.0.1 h1:pIyyyBCPwd087K3Wdb/9tIvUubAQdzTJghjPgzTQVsE= +github.com/btcsuite/btcd/v2transport v1.0.1/go.mod h1:N6H0HGSElVVJKntzaYHYVbW71DtWDLMw2yhwVRO3ZOE= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c h1:4HxD1lBUGUddhzgaNgrCPsFWd7cGYNpeFUgd9ZIgyM0= -github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ= +github.com/btcsuite/btclog v1.0.0 h1:sEkpKJMmfGiyZjADwEIgB1NSwMyfdD1FB8v6+w1T0Ns= +github.com/btcsuite/btclog v1.0.0/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ= github.com/btcsuite/btclog/v2 v2.0.1-0.20250728225537-6090e87c6c5b h1:MQ+Q6sDy37V1wP1Yu79A5KqJutolqUGwA99UZWQDWZM= github.com/btcsuite/btclog/v2 v2.0.1-0.20250728225537-6090e87c6c5b/go.mod h1:XItGUfVOxotJL8kkuk2Hj3EVow5KCugXl3wWfQ6K0AE= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcwallet v0.16.17 h1:1N6lHznRdcjDopBvcofxaIHknArkJ/EcVKgLKfGL4Dg= -github.com/btcsuite/btcwallet v0.16.17/go.mod h1:YO+W745BAH8n/Rpgj68QsLR6eLlgM4W2do4RejT0buo= +github.com/btcsuite/btcwallet v0.16.17-0.20260213031108-70a94ea39e9c h1:XJN7vcvFiclslw5Zixe9t4YRprTpADcQlBf2IN3nbW8= +github.com/btcsuite/btcwallet v0.16.17-0.20260213031108-70a94ea39e9c/go.mod h1:4TTru0cgIPbCZpY4aRfAVwX87zrQw4GXM8MH6+A5xZw= github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 h1:Rr0njWI3r341nhSPesKQ2JF+ugDSzdPoeckS75SeDZk= github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5/go.mod h1:+tXJ3Ym0nlQc/iHSwW1qzjmPs3ev+UVWMbGgfV1OZqU= github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 h1:YEO+Lx1ZJJAtdRrjuhXjWrYsmAk26wLTlNzxt2q0lhk= @@ -84,12 +87,12 @@ github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqy github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= @@ -110,11 +113,11 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/decred/dcrd/lru v1.1.2 h1:KdCzlkxppuoIDGEvCGah1fZRicrDH36IipvlB1ROkFY= github.com/decred/dcrd/lru v1.1.2/go.mod h1:gEdCVgXs1/YoBvFWt7Scgknbhwik3FgVSzlnCcXL2N8= @@ -136,8 +139,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fergusstrange/embedded-postgres v1.25.0 h1:sa+k2Ycrtz40eCRPOzI7Ry7TtkWXXJ+YRsxpKMDhxK0= @@ -157,8 +160,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= @@ -178,8 +181,8 @@ github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-migrate/migrate/v4 v4.17.0 h1:rd40H3QXU0AA4IoLllFcEAEo9dYKRHYND2gB4p7xcaU= github.com/golang-migrate/migrate/v4 v4.17.0/go.mod h1:+Cp2mtLP4/aXDTKb9wmXYitdrNx2HGs45rbWAo6OsKM= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I= +github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -287,8 +290,9 @@ github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4= +github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -348,16 +352,18 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf h1:HZKvJUHlcXI/f/O0Avg7t8sqkPo78HFzjmeYFl6DPnc= github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf/go.mod h1:vxmQPeIQxPf6Jf9rM8R+B4rKBqLA2AjttNxkFBL2Plk= -github.com/lightninglabs/neutrino v0.16.1 h1:5Kz4ToxncEVkpKC6fwUjXKtFKJhuxlG3sBB3MdJTJjs= -github.com/lightninglabs/neutrino v0.16.1/go.mod h1:L+5UAccpUdyM7yDgmQySgixf7xmwBgJtOfs/IP26jCs= -github.com/lightninglabs/neutrino/cache v1.1.2 h1:C9DY/DAPaPxbFC+xNNEI/z1SJY9GS3shmlu5hIQ798g= -github.com/lightninglabs/neutrino/cache v1.1.2/go.mod h1:XJNcgdOw1LQnanGjw8Vj44CvguYA25IMKjWFZczwZuo= +github.com/lightninglabs/neutrino v0.16.2 h1:jHMMDLPX8asfwgN0/C4BY8uVaYupFzZYuWQkX8Go3fk= +github.com/lightninglabs/neutrino v0.16.2/go.mod h1:fNjnbuSPw4lRsVAzvjC1JG7IE7rqae/mbek2tNkN/Dw= +github.com/lightninglabs/neutrino/cache v1.1.3 h1:rgnabC41W+XaPuBTQrdeFjFCCAVKh1yctAgmb3Se9zA= +github.com/lightninglabs/neutrino/cache v1.1.3/go.mod h1:qxkJb+pUxR5p84jl5uIGFCR4dGdFkhNUwMSxw3EUWls= github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display h1:Y2WiPkBS/00EiEg0qp0FhehxnQfk3vv8U6Xt3nN+rTY= github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -github.com/lightningnetwork/lightning-onion v1.2.1-0.20240815225420-8b40adf04ab9 h1:6D3LrdagJweLLdFm1JNodZsBk6iU4TTsBBFLQ4yiXfI= -github.com/lightningnetwork/lightning-onion v1.2.1-0.20240815225420-8b40adf04ab9/go.mod h1:EDqJ3MuZIbMq0QI1czTIKDJ/GS8S14RXPwapHw8cw6w= -github.com/lightningnetwork/lnd v0.20.1-beta h1:wDMNgks5uST1CY+WwjIZ4+McPMMFpr2pIIGJp7ytDI4= -github.com/lightningnetwork/lnd v0.20.1-beta/go.mod h1:oIKh9EqE1sJJpQPq9ZCMFc4Ot287NrotZ1oZn0zUI+M= +github.com/lightningnetwork/lightning-onion v1.3.0 h1:FqILgHjD6euc/Muo1VOzZ4+XDPuFnw6EYROBq0rR/5c= +github.com/lightningnetwork/lightning-onion v1.3.0/go.mod h1:nP85zMHG7c0si/eHBbSQpuDCtnIXfSvFrK3tW6YWzmU= +github.com/lightningnetwork/lnd v0.21.0-beta.rc1 h1:Jz6GBfwBLnLXsCRM3jvZhSfA0gtkH7L2rPwALB61+JI= +github.com/lightningnetwork/lnd v0.21.0-beta.rc1/go.mod h1:hrJPOxkleTu3y3K32ehBziq8y/zqQqCPQKfwktS35aw= +github.com/lightningnetwork/lnd/actor v0.0.6 h1:Ge8N2wivARG+27qJBwTlB0vwsypStZYZy8vk4Zl38sU= +github.com/lightningnetwork/lnd/actor v0.0.6/go.mod h1:YAsoniSbY/cAM9HTVNfZLvt7RI6swDxy6wzPspTcMZg= github.com/lightningnetwork/lnd/clock v1.1.1 h1:OfR3/zcJd2RhH0RU+zX/77c0ZiOnIMsDIBjgjWdZgA0= github.com/lightningnetwork/lnd/clock v1.1.1/go.mod h1:mGnAhPyjYZQJmebS7aevElXKTFDuO+uNFFfMXK1W8xQ= github.com/lightningnetwork/lnd/fn/v2 v2.0.9 h1:ZytG4ltPac/sCyg1EJDn10RGzPIDJeyennUMRdOw7Y8= @@ -366,10 +372,10 @@ github.com/lightningnetwork/lnd/healthcheck v1.2.6 h1:1sWhqr93GdkWy4+6U7JxBfcyZI github.com/lightningnetwork/lnd/healthcheck v1.2.6/go.mod h1:Mu02um4CWY/zdTOvFje7WJgJcHyX2zq/FG3MhOAiGaQ= github.com/lightningnetwork/lnd/kvdb v1.4.16 h1:9BZgWdDfjmHRHLS97cz39bVuBAqMc4/p3HX1xtUdbDI= github.com/lightningnetwork/lnd/kvdb v1.4.16/go.mod h1:HW+bvwkxNaopkz3oIgBV6NEnV4jCEZCACFUcNg4xSjM= -github.com/lightningnetwork/lnd/queue v1.1.1 h1:99ovBlpM9B0FRCGYJo6RSFDlt8/vOkQQZznVb18iNMI= -github.com/lightningnetwork/lnd/queue v1.1.1/go.mod h1:7A6nC1Qrm32FHuhx/mi1cieAiBZo5O6l8IBIoQxvkz4= -github.com/lightningnetwork/lnd/sqldb v1.0.12-0.20260113193010-8565d12e40b1 h1:PkEppKL17cZh0Dr9h/T9BEVJUbd/p2tjJ/x8ffG3R0M= -github.com/lightningnetwork/lnd/sqldb v1.0.12-0.20260113193010-8565d12e40b1/go.mod h1:tB2jlqu79TIOR9uhAZOmPxpVFUhB2s+oxKnqRRL1oc0= +github.com/lightningnetwork/lnd/queue v1.1.2-0.20260417172355-dfb7d57826c7 h1:qNO9UsfdoCPiAOtbjLg9K+opkKQRVPQcqCyE+Mheanc= +github.com/lightningnetwork/lnd/queue v1.1.2-0.20260417172355-dfb7d57826c7/go.mod h1:WGDUw3XZ+ttVtcrkaEYq+hSTfKna9if/vTdgyTkA+QE= +github.com/lightningnetwork/lnd/sqldb v1.0.13-0.20260417172355-dfb7d57826c7 h1:8s813rqO3pUb5VeD526+CYOaFsKKcx1ctbDr++HdtjY= +github.com/lightningnetwork/lnd/sqldb v1.0.13-0.20260417172355-dfb7d57826c7/go.mod h1:XaG3d8AR7/e6+HUw5jvNvm+gs6MowB+iE9myFH8Rc14= github.com/lightningnetwork/lnd/ticker v1.1.1 h1:J/b6N2hibFtC7JLV77ULQp++QLtCwT6ijJlbdiZFbSM= github.com/lightningnetwork/lnd/ticker v1.1.1/go.mod h1:waPTRAAcwtu7Ji3+3k+u/xH5GHovTsCoSVpho0KDvdA= github.com/lightningnetwork/lnd/tlv v1.3.2 h1:MO4FCk7F4k5xPMqVZF6Nb/kOpxlwPrUQpYjmyKny5s0= @@ -465,8 +471,8 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qq github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= @@ -499,8 +505,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= @@ -538,24 +545,26 @@ go.etcd.io/etcd/raft/v3 v3.5.12 h1:7r22RufdDsq2z3STjoR7Msz6fYH8tmbkdheGfwJNRmU= go.etcd.io/etcd/raft/v3 v3.5.12/go.mod h1:ERQuZVe79PI6vcC3DlKBukDCLja/L7YMu29B74Iwj4U= go.etcd.io/etcd/server/v3 v3.5.12 h1:EtMjsbfyfkwZuA2JlKOiBfuGkFCekv5H178qjXypbG8= go.etcd.io/etcd/server/v3 v3.5.12/go.mod h1:axB0oCjMy+cemo5290/CutIjoxlfA6KVYKD1w0uue10= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0 h1:PzIubN4/sjByhDRHLviCjJuweBXWFZWhghjg7cS28+M= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0/go.mod h1:Ct6zzQEuGK3WpJs2n4dn+wfJYzd/+hNnxMRTWjGn30M= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= +go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= +go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -592,11 +601,11 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= +golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4= +golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -607,8 +616,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= +golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -633,13 +642,13 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= +golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -650,8 +659,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -688,16 +697,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= +golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= +golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -708,8 +717,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -728,36 +737,36 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= +google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20160105164936-4f90aeace3a2/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=