From ed0a185daecd1459d5da886808c97bac6d12cc4f Mon Sep 17 00:00:00 2001 From: anon Date: Fri, 13 Mar 2026 13:30:35 +0100 Subject: [PATCH 1/7] feat: add minCltvExpiryDelta for LND --- lnclient/cashu/cashu.go | 3 +- lnclient/ldk/ldk.go | 3 +- lnclient/lnd/lnd.go | 5 +- lnclient/models.go | 2 +- lnclient/phoenixd/phoenixd.go | 3 +- .../make_hold_invoice_controller.go | 46 ++++++++++--------- .../make_hold_invoice_controller_test.go | 1 + tests/mock_ln_client.go | 3 +- tests/mocks/LNClient.go | 31 +++++++------ transactions/self_hold_payments_test.go | 4 +- transactions/transactions_service.go | 6 +-- 11 files changed, 62 insertions(+), 45 deletions(-) diff --git a/lnclient/cashu/cashu.go b/lnclient/cashu/cashu.go index 8636e9462..f6e924a01 100644 --- a/lnclient/cashu/cashu.go +++ b/lnclient/cashu/cashu.go @@ -120,7 +120,8 @@ func (cs *CashuService) MakeInvoice(ctx context.Context, amount int64, descripti return cs.cashuMintQuoteToTransaction(mintQuote), nil } -func (cs *CashuService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string) (transaction *lnclient.Transaction, err error) { +func (cs *CashuService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (transaction *lnclient.Transaction, err error) { + _ = minCltvExpiryDelta return nil, errors.New("not implemented") } diff --git a/lnclient/ldk/ldk.go b/lnclient/ldk/ldk.go index 2aeeb4e91..9db9988e4 100644 --- a/lnclient/ldk/ldk.go +++ b/lnclient/ldk/ldk.go @@ -2328,7 +2328,8 @@ func (ls *LDKService) ExecuteCustomNodeCommand(ctx context.Context, command *lnc return nil, lnclient.ErrUnknownCustomNodeCommand } -func (ls *LDKService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string) (*lnclient.Transaction, error) { +func (ls *LDKService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (*lnclient.Transaction, error) { + _ = minCltvExpiryDelta if time.Duration(expiry)*time.Second > maxInvoiceExpiry { return nil, errors.New("expiry is too long") } diff --git a/lnclient/lnd/lnd.go b/lnclient/lnd/lnd.go index 884f0b941..773336edc 100644 --- a/lnclient/lnd/lnd.go +++ b/lnclient/lnd/lnd.go @@ -725,7 +725,7 @@ func (svc *LNDService) MakeInvoice(ctx context.Context, amount int64, descriptio return transaction, nil } -func (svc *LNDService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string) (transaction *lnclient.Transaction, err error) { +func (svc *LNDService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (transaction *lnclient.Transaction, err error) { var descriptionHashBytes []byte var paymentHashBytes []byte @@ -777,6 +777,9 @@ func (svc *LNDService) MakeHoldInvoice(ctx context.Context, amount int64, descri Private: !hasPublicChannels, Hash: paymentHashBytes, } + if minCltvExpiryDelta != nil { + addInvoiceRequest.CltvExpiry = *minCltvExpiryDelta + } _, err = svc.client.AddHoldInvoice(ctx, addInvoiceRequest) if err != nil { diff --git a/lnclient/models.go b/lnclient/models.go index fd22f4313..06f629ba5 100644 --- a/lnclient/models.go +++ b/lnclient/models.go @@ -62,7 +62,7 @@ type LNClient interface { GetPubkey() string GetInfo(ctx context.Context) (info *NodeInfo, err error) MakeInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, throughNodePubkey *string) (transaction *Transaction, err error) - MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string) (transaction *Transaction, err error) + MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (transaction *Transaction, err error) SettleHoldInvoice(ctx context.Context, preimage string) (err error) CancelHoldInvoice(ctx context.Context, paymentHash string) (err error) LookupInvoice(ctx context.Context, paymentHash string) (transaction *Transaction, err error) diff --git a/lnclient/phoenixd/phoenixd.go b/lnclient/phoenixd/phoenixd.go index a5b5fb5d3..b8ffe94d3 100644 --- a/lnclient/phoenixd/phoenixd.go +++ b/lnclient/phoenixd/phoenixd.go @@ -325,7 +325,8 @@ func (svc *PhoenixService) MakeInvoice(ctx context.Context, amount int64, descri return tx, nil } -func (svc *PhoenixService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string) (transaction *lnclient.Transaction, err error) { +func (svc *PhoenixService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (transaction *lnclient.Transaction, err error) { + _ = minCltvExpiryDelta return nil, errors.New("not implemented") } diff --git a/nip47/controllers/make_hold_invoice_controller.go b/nip47/controllers/make_hold_invoice_controller.go index 6c5fb4556..01493e6b9 100644 --- a/nip47/controllers/make_hold_invoice_controller.go +++ b/nip47/controllers/make_hold_invoice_controller.go @@ -11,12 +11,13 @@ import ( ) type makeHoldInvoiceParams struct { - Amount uint64 `json:"amount"` - PaymentHash string `json:"payment_hash"` - Description string `json:"description"` - DescriptionHash string `json:"description_hash"` - Expiry uint64 `json:"expiry"` - Metadata map[string]interface{} `json:"metadata,omitempty"` + Amount uint64 `json:"amount"` + PaymentHash string `json:"payment_hash"` + Description string `json:"description"` + DescriptionHash string `json:"description_hash"` + Expiry uint64 `json:"expiry"` + MinCltvExpiryDelta *uint64 `json:"min_cltv_expiry_delta"` + Metadata map[string]interface{} `json:"metadata,omitempty"` } type makeHoldInvoiceResponse struct { models.Transaction @@ -46,14 +47,15 @@ func (controller *nip47Controller) HandleMakeHoldInvoiceEvent(ctx context.Contex } logger.Logger.WithFields(logrus.Fields{ - "requestEventId": requestEventId, - "appId": appId, - "amount": makeHoldInvoiceParams.Amount, - "description": makeHoldInvoiceParams.Description, - "descriptionHash": makeHoldInvoiceParams.DescriptionHash, - "expiry": makeHoldInvoiceParams.Expiry, - "paymentHash": makeHoldInvoiceParams.PaymentHash, - "metadata": makeHoldInvoiceParams.Metadata, + "requestEventId": requestEventId, + "appId": appId, + "amount": makeHoldInvoiceParams.Amount, + "description": makeHoldInvoiceParams.Description, + "descriptionHash": makeHoldInvoiceParams.DescriptionHash, + "expiry": makeHoldInvoiceParams.Expiry, + "minCltvExpiryDelta": makeHoldInvoiceParams.MinCltvExpiryDelta, + "paymentHash": makeHoldInvoiceParams.PaymentHash, + "metadata": makeHoldInvoiceParams.Metadata, }).Info("Making hold invoice") requestEventIdUint := uint(requestEventId) @@ -64,6 +66,7 @@ func (controller *nip47Controller) HandleMakeHoldInvoiceEvent(ctx context.Contex makeHoldInvoiceParams.DescriptionHash, makeHoldInvoiceParams.Expiry, makeHoldInvoiceParams.PaymentHash, + makeHoldInvoiceParams.MinCltvExpiryDelta, makeHoldInvoiceParams.Metadata, controller.lnClient, &appId, @@ -72,13 +75,14 @@ func (controller *nip47Controller) HandleMakeHoldInvoiceEvent(ctx context.Contex if err != nil { logger.Logger.WithFields(logrus.Fields{ - "request_event_id": requestEventId, - "appId": appId, - "amount": makeHoldInvoiceParams.Amount, - "description": makeHoldInvoiceParams.Description, - "descriptionHash": makeHoldInvoiceParams.DescriptionHash, - "expiry": makeHoldInvoiceParams.Expiry, - "paymentHash": makeHoldInvoiceParams.PaymentHash, + "request_event_id": requestEventId, + "appId": appId, + "amount": makeHoldInvoiceParams.Amount, + "description": makeHoldInvoiceParams.Description, + "descriptionHash": makeHoldInvoiceParams.DescriptionHash, + "expiry": makeHoldInvoiceParams.Expiry, + "minCltvExpiryDelta": makeHoldInvoiceParams.MinCltvExpiryDelta, + "paymentHash": makeHoldInvoiceParams.PaymentHash, }).WithError(err).Error("Failed to make invoice") publishResponse(&models.Response{ diff --git a/nip47/controllers/make_hold_invoice_controller_test.go b/nip47/controllers/make_hold_invoice_controller_test.go index 1a1aea838..211484c0b 100644 --- a/nip47/controllers/make_hold_invoice_controller_test.go +++ b/nip47/controllers/make_hold_invoice_controller_test.go @@ -23,6 +23,7 @@ const nip47MakeHoldInvoiceJson = ` "description": "Hello, world", "payment_hash": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "expiry": 3600, + "min_cltv_expiry_delta": 144, "metadata": { "a": 1, "b": "2", diff --git a/tests/mock_ln_client.go b/tests/mock_ln_client.go index ea211f6c1..2b298db6d 100644 --- a/tests/mock_ln_client.go +++ b/tests/mock_ln_client.go @@ -120,7 +120,8 @@ func (mln *MockLn) MakeInvoice(ctx context.Context, amount int64, description st return MockLNClientTransaction, nil } -func (mln *MockLn) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string) (transaction *lnclient.Transaction, err error) { +func (mln *MockLn) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (transaction *lnclient.Transaction, err error) { + _ = minCltvExpiryDelta return MockLNClientHoldTransaction, nil } diff --git a/tests/mocks/LNClient.go b/tests/mocks/LNClient.go index 3eb61fbda..55471405b 100644 --- a/tests/mocks/LNClient.go +++ b/tests/mocks/LNClient.go @@ -1262,8 +1262,8 @@ func (_c *MockLNClient_LookupInvoice_Call) RunAndReturn(run func(ctx context.Con } // MakeHoldInvoice provides a mock function for the type MockLNClient -func (_mock *MockLNClient) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string) (*lnclient.Transaction, error) { - ret := _mock.Called(ctx, amount, description, descriptionHash, expiry, paymentHash) +func (_mock *MockLNClient) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (*lnclient.Transaction, error) { + ret := _mock.Called(ctx, amount, description, descriptionHash, expiry, paymentHash, minCltvExpiryDelta) if len(ret) == 0 { panic("no return value specified for MakeHoldInvoice") @@ -1271,18 +1271,18 @@ func (_mock *MockLNClient) MakeHoldInvoice(ctx context.Context, amount int64, de var r0 *lnclient.Transaction var r1 error - if returnFunc, ok := ret.Get(0).(func(context.Context, int64, string, string, int64, string) (*lnclient.Transaction, error)); ok { - return returnFunc(ctx, amount, description, descriptionHash, expiry, paymentHash) + if returnFunc, ok := ret.Get(0).(func(context.Context, int64, string, string, int64, string, *uint64) (*lnclient.Transaction, error)); ok { + return returnFunc(ctx, amount, description, descriptionHash, expiry, paymentHash, minCltvExpiryDelta) } - if returnFunc, ok := ret.Get(0).(func(context.Context, int64, string, string, int64, string) *lnclient.Transaction); ok { - r0 = returnFunc(ctx, amount, description, descriptionHash, expiry, paymentHash) + if returnFunc, ok := ret.Get(0).(func(context.Context, int64, string, string, int64, string, *uint64) *lnclient.Transaction); ok { + r0 = returnFunc(ctx, amount, description, descriptionHash, expiry, paymentHash, minCltvExpiryDelta) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*lnclient.Transaction) } } - if returnFunc, ok := ret.Get(1).(func(context.Context, int64, string, string, int64, string) error); ok { - r1 = returnFunc(ctx, amount, description, descriptionHash, expiry, paymentHash) + if returnFunc, ok := ret.Get(1).(func(context.Context, int64, string, string, int64, string, *uint64) error); ok { + r1 = returnFunc(ctx, amount, description, descriptionHash, expiry, paymentHash, minCltvExpiryDelta) } else { r1 = ret.Error(1) } @@ -1301,13 +1301,18 @@ type MockLNClient_MakeHoldInvoice_Call struct { // - descriptionHash // - expiry // - paymentHash -func (_e *MockLNClient_Expecter) MakeHoldInvoice(ctx interface{}, amount interface{}, description interface{}, descriptionHash interface{}, expiry interface{}, paymentHash interface{}) *MockLNClient_MakeHoldInvoice_Call { - return &MockLNClient_MakeHoldInvoice_Call{Call: _e.mock.On("MakeHoldInvoice", ctx, amount, description, descriptionHash, expiry, paymentHash)} +// - minCltvExpiryDelta +func (_e *MockLNClient_Expecter) MakeHoldInvoice(ctx interface{}, amount interface{}, description interface{}, descriptionHash interface{}, expiry interface{}, paymentHash interface{}, minCltvExpiryDelta interface{}) *MockLNClient_MakeHoldInvoice_Call { + return &MockLNClient_MakeHoldInvoice_Call{Call: _e.mock.On("MakeHoldInvoice", ctx, amount, description, descriptionHash, expiry, paymentHash, minCltvExpiryDelta)} } -func (_c *MockLNClient_MakeHoldInvoice_Call) Run(run func(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string)) *MockLNClient_MakeHoldInvoice_Call { +func (_c *MockLNClient_MakeHoldInvoice_Call) Run(run func(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64)) *MockLNClient_MakeHoldInvoice_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(int64), args[2].(string), args[3].(string), args[4].(int64), args[5].(string)) + var minCltvExpiryDelta *uint64 + if args[6] != nil { + minCltvExpiryDelta = args[6].(*uint64) + } + run(args[0].(context.Context), args[1].(int64), args[2].(string), args[3].(string), args[4].(int64), args[5].(string), minCltvExpiryDelta) }) return _c } @@ -1317,7 +1322,7 @@ func (_c *MockLNClient_MakeHoldInvoice_Call) Return(transaction *lnclient.Transa return _c } -func (_c *MockLNClient_MakeHoldInvoice_Call) RunAndReturn(run func(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string) (*lnclient.Transaction, error)) *MockLNClient_MakeHoldInvoice_Call { +func (_c *MockLNClient_MakeHoldInvoice_Call) RunAndReturn(run func(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (*lnclient.Transaction, error)) *MockLNClient_MakeHoldInvoice_Call { _c.Call.Return(run) return _c } diff --git a/transactions/self_hold_payments_test.go b/transactions/self_hold_payments_test.go index c3041b8d4..ab8c33e96 100644 --- a/transactions/self_hold_payments_test.go +++ b/transactions/self_hold_payments_test.go @@ -25,7 +25,7 @@ func TestSelfHoldPaymentSettled(t *testing.T) { paymentHash := tests.MockLNClientHoldTransaction.PaymentHash transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher) - transaction, err := transactionsService.MakeHoldInvoice(ctx, 1000, "Hold payment test", "", 0, paymentHash, nil, svc.LNClient, nil, nil) + transaction, err := transactionsService.MakeHoldInvoice(ctx, 1000, "Hold payment test", "", 0, paymentHash, nil, nil, svc.LNClient, nil, nil) require.NoError(t, err) assert.True(t, transaction.Hold) // use the pubkey from the decoded tests.MockLNClientHoldTransaction invoice @@ -63,7 +63,7 @@ func TestSelfHoldPaymentCanceled(t *testing.T) { paymentHash := tests.MockLNClientHoldTransaction.PaymentHash transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher) - transaction, err := transactionsService.MakeHoldInvoice(ctx, 1000, "Hold payment test", "", 0, paymentHash, nil, svc.LNClient, nil, nil) + transaction, err := transactionsService.MakeHoldInvoice(ctx, 1000, "Hold payment test", "", 0, paymentHash, nil, nil, svc.LNClient, nil, nil) require.NoError(t, err) assert.True(t, transaction.Hold) // use the pubkey from the decoded tests.MockLNClientHoldTransaction invoice diff --git a/transactions/transactions_service.go b/transactions/transactions_service.go index 6daef4145..a0257d0d2 100644 --- a/transactions/transactions_service.go +++ b/transactions/transactions_service.go @@ -41,7 +41,7 @@ type TransactionsService interface { ListTransactions(ctx context.Context, from, until, limit, offset uint64, unpaidOutgoing bool, unpaidIncoming bool, transactionType *string, lnClient lnclient.LNClient, appId *uint, forceFilterByAppId bool) (transactions []Transaction, totalCount uint64, err error) SendPaymentSync(payReq string, amountMsat *uint64, metadata map[string]interface{}, lnClient lnclient.LNClient, appId *uint, requestEventId *uint) (*Transaction, error) SendKeysend(amount uint64, destination string, customRecords []lnclient.TLVRecord, preimage string, lnClient lnclient.LNClient, appId *uint, requestEventId *uint) (*Transaction, error) - MakeHoldInvoice(ctx context.Context, amount uint64, description string, descriptionHash string, expiry uint64, paymentHash string, metadata map[string]interface{}, lnClient lnclient.LNClient, appId *uint, requestEventId *uint) (*Transaction, error) + MakeHoldInvoice(ctx context.Context, amount uint64, description string, descriptionHash string, expiry uint64, paymentHash string, minCltvExpiryDelta *uint64, metadata map[string]interface{}, lnClient lnclient.LNClient, appId *uint, requestEventId *uint) (*Transaction, error) SettleHoldInvoice(ctx context.Context, preimage string, lnClient lnclient.LNClient) (*Transaction, error) CancelHoldInvoice(ctx context.Context, paymentHash string, lnClient lnclient.LNClient) error SetTransactionMetadata(ctx context.Context, id uint, metadata map[string]interface{}) error @@ -213,7 +213,7 @@ func (svc *transactionsService) MakeInvoice(ctx context.Context, amount uint64, return &dbTransaction, nil } -func (svc *transactionsService) MakeHoldInvoice(ctx context.Context, amount uint64, description string, descriptionHash string, expiry uint64, paymentHash string, metadata map[string]interface{}, lnClient lnclient.LNClient, appId *uint, requestEventId *uint) (*Transaction, error) { +func (svc *transactionsService) MakeHoldInvoice(ctx context.Context, amount uint64, description string, descriptionHash string, expiry uint64, paymentHash string, minCltvExpiryDelta *uint64, metadata map[string]interface{}, lnClient lnclient.LNClient, appId *uint, requestEventId *uint) (*Transaction, error) { var err error var metadataBytes []byte if metadata != nil { @@ -227,7 +227,7 @@ func (svc *transactionsService) MakeHoldInvoice(ctx context.Context, amount uint } } - lnClientTransaction, err := lnClient.MakeHoldInvoice(ctx, int64(amount), description, descriptionHash, int64(expiry), paymentHash) + lnClientTransaction, err := lnClient.MakeHoldInvoice(ctx, int64(amount), description, descriptionHash, int64(expiry), paymentHash, minCltvExpiryDelta) if err != nil { logger.Logger.WithError(err).Error("Failed to create hold invoice via LN client") return nil, err From 0fce7626ab47b0ff62caceee95f6e73fe4e43b09 Mon Sep 17 00:00:00 2001 From: anon Date: Fri, 13 Mar 2026 13:46:19 +0100 Subject: [PATCH 2/7] feat: improve --- lnclient/phoenixd/phoenixd.go | 3 +-- tests/mock_ln_client.go | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lnclient/phoenixd/phoenixd.go b/lnclient/phoenixd/phoenixd.go index 7f488f309..3b30af147 100644 --- a/lnclient/phoenixd/phoenixd.go +++ b/lnclient/phoenixd/phoenixd.go @@ -213,8 +213,7 @@ func (svc *PhoenixService) MakeInvoice(ctx context.Context, amount int64, descri return tx, nil } -func (svc *PhoenixService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (transaction *lnclient.Transaction, err error) { - _ = minCltvExpiryDelta +func (svc *PhoenixService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, _ *uint64) (transaction *lnclient.Transaction, err error) { return nil, errors.New("not implemented") } diff --git a/tests/mock_ln_client.go b/tests/mock_ln_client.go index 979ce9377..5cef7694f 100644 --- a/tests/mock_ln_client.go +++ b/tests/mock_ln_client.go @@ -84,6 +84,7 @@ type MockLn struct { PaymentDelay *time.Duration Pubkey string MockTransaction *lnclient.Transaction + LastMinCltvExpiryDelta *uint64 SupportedNotificationTypes *[]string } From 4349cb77aa8146c320f44942a9e2d3bf47432b1c Mon Sep 17 00:00:00 2001 From: anon Date: Fri, 13 Mar 2026 13:49:19 +0100 Subject: [PATCH 3/7] feat: test LastMinCltvExpiryDelta --- nip47/controllers/make_hold_invoice_controller_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nip47/controllers/make_hold_invoice_controller_test.go b/nip47/controllers/make_hold_invoice_controller_test.go index 211484c0b..bac492d39 100644 --- a/nip47/controllers/make_hold_invoice_controller_test.go +++ b/nip47/controllers/make_hold_invoice_controller_test.go @@ -68,6 +68,11 @@ func TestHandleMakeHoldInvoiceEvent(t *testing.T) { NewTestNip47Controller(svc). HandleMakeHoldInvoiceEvent(ctx, nip47Request, dbRequestEvent.ID, *dbRequestEvent.AppId, publishResponse) + mockLn, ok := svc.LNClient.(*tests.MockLn) + require.True(t, ok) + require.NotNil(t, mockLn.LastMinCltvExpiryDelta) + assert.EqualValues(t, 144, *mockLn.LastMinCltvExpiryDelta) + expectedMetadata := map[string]interface{}{ "a": float64(1), "b": "2", From 93f4a26b74bdc6f942835e1898cc6e983ce3f491 Mon Sep 17 00:00:00 2001 From: anon Date: Fri, 13 Mar 2026 13:51:28 +0100 Subject: [PATCH 4/7] feat: fixes --- tests/mock_ln_client.go | 8 +++++++- tests/mocks/LNClient.go | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/mock_ln_client.go b/tests/mock_ln_client.go index 5cef7694f..a2155b16d 100644 --- a/tests/mock_ln_client.go +++ b/tests/mock_ln_client.go @@ -131,7 +131,13 @@ func (mln *MockLn) MakeInvoice(ctx context.Context, amount int64, description st } func (mln *MockLn) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (transaction *lnclient.Transaction, err error) { - _ = minCltvExpiryDelta + if minCltvExpiryDelta == nil { + mln.LastMinCltvExpiryDelta = nil + } else { + value := *minCltvExpiryDelta + mln.LastMinCltvExpiryDelta = &value + } + if len(mln.MakeInvoiceResponses) > 0 { response := mln.MakeInvoiceResponses[0] err := mln.MakeInvoiceErrors[0] diff --git a/tests/mocks/LNClient.go b/tests/mocks/LNClient.go index 8e3e96f08..10328d64a 100644 --- a/tests/mocks/LNClient.go +++ b/tests/mocks/LNClient.go @@ -1428,7 +1428,7 @@ func (_c *MockLNClient_MakeHoldInvoice_Call) Run(run func(ctx context.Context, a arg3, arg4, arg5, - minCltvExpiryDelta + minCltvExpiryDelta, ) }) return _c From c53be4e646c8f58b57c880e9cdd4878184f1fd1f Mon Sep 17 00:00:00 2001 From: anon Date: Fri, 13 Mar 2026 13:55:20 +0100 Subject: [PATCH 5/7] feat: fixes --- transactions/self_hold_payments_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transactions/self_hold_payments_test.go b/transactions/self_hold_payments_test.go index 78dbc427a..394b91449 100644 --- a/transactions/self_hold_payments_test.go +++ b/transactions/self_hold_payments_test.go @@ -207,7 +207,7 @@ func TestWrappedInvoice(t *testing.T) { // Bob creates a wrapped invoice with the same payment hash but higher amount (1100 sats) // Bob acts as an intermediary, adding a fee of 100 sats - bobWrappedInvoice, err := transactionsService.MakeHoldInvoice(ctx, 1100, "Bob wrapped invoice", "", 0, charlieInvoice.PaymentHash, nil, svc.LNClient, &bobApp.ID, nil) + bobWrappedInvoice, err := transactionsService.MakeHoldInvoice(ctx, 1100, "Bob wrapped invoice", "", 0, charlieInvoice.PaymentHash, nil, nil, svc.LNClient, &bobApp.ID, nil) require.NoError(t, err) require.True(t, bobWrappedInvoice.Hold) require.Equal(t, mockBobHoldInvoice.Invoice, bobWrappedInvoice.PaymentRequest) From 34a96980733c169310fd5e8f398df1ab5846666e Mon Sep 17 00:00:00 2001 From: im-adithya Date: Wed, 25 Mar 2026 23:04:53 +0530 Subject: [PATCH 6/7] chore: address minor naming issue --- lnclient/ldk/ldk.go | 2 +- lnclient/phoenixd/phoenixd.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lnclient/ldk/ldk.go b/lnclient/ldk/ldk.go index 401c3587d..3593e7927 100644 --- a/lnclient/ldk/ldk.go +++ b/lnclient/ldk/ldk.go @@ -2283,7 +2283,7 @@ func (ls *LDKService) ExecuteCustomNodeCommand(ctx context.Context, command *lnc } func (ls *LDKService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (*lnclient.Transaction, error) { - _ = minCltvExpiryDelta + // TODO: Support minCltvExpiryDelta if time.Duration(expiry)*time.Second > maxInvoiceExpiry { return nil, errors.New("expiry is too long") } diff --git a/lnclient/phoenixd/phoenixd.go b/lnclient/phoenixd/phoenixd.go index 3b30af147..0b8c211a9 100644 --- a/lnclient/phoenixd/phoenixd.go +++ b/lnclient/phoenixd/phoenixd.go @@ -213,7 +213,7 @@ func (svc *PhoenixService) MakeInvoice(ctx context.Context, amount int64, descri return tx, nil } -func (svc *PhoenixService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, _ *uint64) (transaction *lnclient.Transaction, err error) { +func (svc *PhoenixService) MakeHoldInvoice(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64) (transaction *lnclient.Transaction, err error) { return nil, errors.New("not implemented") } From 601c092e1c41c737e182ae4e874289a7ba53e462 Mon Sep 17 00:00:00 2001 From: im-adithya Date: Wed, 25 Mar 2026 23:05:13 +0530 Subject: [PATCH 7/7] chore: run mockery --- tests/mocks/LNClient.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/mocks/LNClient.go b/tests/mocks/LNClient.go index 10328d64a..4fb9be952 100644 --- a/tests/mocks/LNClient.go +++ b/tests/mocks/LNClient.go @@ -1386,7 +1386,7 @@ type MockLNClient_MakeHoldInvoice_Call struct { // - descriptionHash string // - expiry int64 // - paymentHash string -// - minCltvExpiryDelta +// - minCltvExpiryDelta *uint64 func (_e *MockLNClient_Expecter) MakeHoldInvoice(ctx interface{}, amount interface{}, description interface{}, descriptionHash interface{}, expiry interface{}, paymentHash interface{}, minCltvExpiryDelta interface{}) *MockLNClient_MakeHoldInvoice_Call { return &MockLNClient_MakeHoldInvoice_Call{Call: _e.mock.On("MakeHoldInvoice", ctx, amount, description, descriptionHash, expiry, paymentHash, minCltvExpiryDelta)} } @@ -1394,7 +1394,6 @@ func (_e *MockLNClient_Expecter) MakeHoldInvoice(ctx interface{}, amount interfa func (_c *MockLNClient_MakeHoldInvoice_Call) Run(run func(ctx context.Context, amount int64, description string, descriptionHash string, expiry int64, paymentHash string, minCltvExpiryDelta *uint64)) *MockLNClient_MakeHoldInvoice_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 context.Context - var minCltvExpiryDelta *uint64 if args[0] != nil { arg0 = args[0].(context.Context) } @@ -1418,8 +1417,9 @@ func (_c *MockLNClient_MakeHoldInvoice_Call) Run(run func(ctx context.Context, a if args[5] != nil { arg5 = args[5].(string) } + var arg6 *uint64 if args[6] != nil { - minCltvExpiryDelta = args[6].(*uint64) + arg6 = args[6].(*uint64) } run( arg0, @@ -1428,7 +1428,7 @@ func (_c *MockLNClient_MakeHoldInvoice_Call) Run(run func(ctx context.Context, a arg3, arg4, arg5, - minCltvExpiryDelta, + arg6, ) }) return _c