Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion lnclient/cashu/cashu.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,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")
}

Expand Down
3 changes: 2 additions & 1 deletion lnclient/ldk/ldk.go
Original file line number Diff line number Diff line change
Expand Up @@ -2282,7 +2282,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) {
// TODO: Support minCltvExpiryDelta
if time.Duration(expiry)*time.Second > maxInvoiceExpiry {
return nil, errors.New("expiry is too long")
}
Expand Down
5 changes: 4 additions & 1 deletion lnclient/lnd/lnd.go
Original file line number Diff line number Diff line change
Expand Up @@ -727,7 +727,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

Expand Down Expand Up @@ -779,6 +779,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 {
Expand Down
2 changes: 1 addition & 1 deletion lnclient/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion lnclient/phoenixd/phoenixd.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) (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")
}

Expand Down
46 changes: 25 additions & 21 deletions nip47/controllers/make_hold_invoice_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -64,6 +66,7 @@ func (controller *nip47Controller) HandleMakeHoldInvoiceEvent(ctx context.Contex
makeHoldInvoiceParams.DescriptionHash,
makeHoldInvoiceParams.Expiry,
makeHoldInvoiceParams.PaymentHash,
makeHoldInvoiceParams.MinCltvExpiryDelta,
makeHoldInvoiceParams.Metadata,
controller.lnClient,
&appId,
Expand All @@ -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{
Expand Down
6 changes: 6 additions & 0 deletions nip47/controllers/make_hold_invoice_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const nip47MakeHoldInvoiceJson = `
"description": "Hello, world",
"payment_hash": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"expiry": 3600,
"min_cltv_expiry_delta": 144,
"metadata": {
"a": 1,
"b": "2",
Expand Down Expand Up @@ -67,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",
Expand Down
10 changes: 9 additions & 1 deletion tests/mock_ln_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ type MockLn struct {
PaymentDelay *time.Duration
Pubkey string
MockTransaction *lnclient.Transaction
LastMinCltvExpiryDelta *uint64
SupportedNotificationTypes *[]string
}

Expand Down Expand Up @@ -129,7 +130,14 @@ 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) {
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]
Expand Down
30 changes: 18 additions & 12 deletions tests/mocks/LNClient.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions transactions/self_hold_payments_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,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
Expand Down Expand Up @@ -65,7 +65,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
Expand Down Expand Up @@ -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)
Expand Down
6 changes: 3 additions & 3 deletions transactions/transactions_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand All @@ -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
Expand Down
Loading