mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-01-18 21:35:24 +01:00
lnrpc: provide hop hints when adding an invoice with no amount
With this change we allow adding hop hints when adding an invoice, even if its amount is zero. A couple of new unit test case have been added, and the `testInvoiceRoutingHints` itest was expanded to account for this scenario.
This commit is contained in:
parent
e68ae33c9a
commit
0cae501009
@ -655,9 +655,9 @@ func newSelectHopHintsCfg(invoicesCfg *AddInvoiceConfig,
|
|||||||
// sufficientHints checks whether we have sufficient hop hints, based on the
|
// sufficientHints checks whether we have sufficient hop hints, based on the
|
||||||
// any of the following criteria:
|
// any of the following criteria:
|
||||||
// - Hop hint count: the number of hints have reach our max target.
|
// - Hop hint count: the number of hints have reach our max target.
|
||||||
// - Total incoming capacity: the sum of the remote balance amount in the
|
// - Total incoming capacity (for non-zero invoice amounts): the sum of the
|
||||||
// hints is bigger of equal than our target (currently twice the invoice
|
// remote balance amount in the hints is bigger of equal than our target
|
||||||
// amount)
|
// (currently twice the invoice amount)
|
||||||
//
|
//
|
||||||
// We limit our number of hop hints like this to keep our invoice size down,
|
// We limit our number of hop hints like this to keep our invoice size down,
|
||||||
// and to avoid leaking all our private channels when we don't need to.
|
// and to avoid leaking all our private channels when we don't need to.
|
||||||
@ -669,7 +669,7 @@ func sufficientHints(nHintsLeft int, currentAmount,
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if currentAmount >= targetAmount {
|
if targetAmount != 0 && currentAmount >= targetAmount {
|
||||||
log.Debugf("Total hint amount: %v has reached target hint "+
|
log.Debugf("Total hint amount: %v has reached target hint "+
|
||||||
"bandwidth: %v", currentAmount, targetAmount)
|
"bandwidth: %v", currentAmount, targetAmount)
|
||||||
return true
|
return true
|
||||||
|
@ -478,6 +478,12 @@ var sufficientHintsTestCases = []struct {
|
|||||||
currentAmount: 200,
|
currentAmount: 200,
|
||||||
targetAmount: 200,
|
targetAmount: 200,
|
||||||
done: true,
|
done: true,
|
||||||
|
}, {
|
||||||
|
name: "no amount provided",
|
||||||
|
nHintsLeft: 1,
|
||||||
|
currentAmount: 100,
|
||||||
|
targetAmount: 0,
|
||||||
|
done: false,
|
||||||
}}
|
}}
|
||||||
|
|
||||||
func TestSufficientHints(t *testing.T) {
|
func TestSufficientHints(t *testing.T) {
|
||||||
@ -719,6 +725,93 @@ var populateHopHintsTestCases = []struct {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
}, {
|
||||||
|
name: "consider all the open channels when amount is zero",
|
||||||
|
setupMock: func(h *hopHintsConfigMock) {
|
||||||
|
chanID1, chanID2 := setupMockTwoChannels(h)
|
||||||
|
|
||||||
|
// Prepare the mock for the first channel.
|
||||||
|
h.Mock.On(
|
||||||
|
"IsChannelActive", chanID1,
|
||||||
|
).Once().Return(true)
|
||||||
|
|
||||||
|
h.Mock.On(
|
||||||
|
"IsPublicNode", mock.Anything,
|
||||||
|
).Once().Return(true, nil)
|
||||||
|
|
||||||
|
h.Mock.On(
|
||||||
|
"FetchChannelEdgesByID", mock.Anything,
|
||||||
|
).Once().Return(
|
||||||
|
&channeldb.ChannelEdgeInfo{},
|
||||||
|
&channeldb.ChannelEdgePolicy{},
|
||||||
|
&channeldb.ChannelEdgePolicy{}, nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
// Prepare the mock for the second channel.
|
||||||
|
h.Mock.On(
|
||||||
|
"IsChannelActive", chanID2,
|
||||||
|
).Once().Return(true)
|
||||||
|
|
||||||
|
h.Mock.On(
|
||||||
|
"IsPublicNode", mock.Anything,
|
||||||
|
).Once().Return(true, nil)
|
||||||
|
|
||||||
|
h.Mock.On(
|
||||||
|
"FetchChannelEdgesByID", mock.Anything,
|
||||||
|
).Once().Return(
|
||||||
|
&channeldb.ChannelEdgeInfo{},
|
||||||
|
&channeldb.ChannelEdgePolicy{},
|
||||||
|
&channeldb.ChannelEdgePolicy{}, nil,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
maxHopHints: 10,
|
||||||
|
amount: 0,
|
||||||
|
expectedHopHints: [][]zpay32.HopHint{
|
||||||
|
{
|
||||||
|
{
|
||||||
|
NodeID: getTestPubKey(),
|
||||||
|
ChannelID: 9,
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
{
|
||||||
|
NodeID: getTestPubKey(),
|
||||||
|
ChannelID: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
name: "consider all the open channels when amount is zero" +
|
||||||
|
" up to maxHopHints",
|
||||||
|
setupMock: func(h *hopHintsConfigMock) {
|
||||||
|
chanID1, _ := setupMockTwoChannels(h)
|
||||||
|
|
||||||
|
// Prepare the mock for the first channel.
|
||||||
|
h.Mock.On(
|
||||||
|
"IsChannelActive", chanID1,
|
||||||
|
).Once().Return(true)
|
||||||
|
|
||||||
|
h.Mock.On(
|
||||||
|
"IsPublicNode", mock.Anything,
|
||||||
|
).Once().Return(true, nil)
|
||||||
|
|
||||||
|
h.Mock.On(
|
||||||
|
"FetchChannelEdgesByID", mock.Anything,
|
||||||
|
).Once().Return(
|
||||||
|
&channeldb.ChannelEdgeInfo{},
|
||||||
|
&channeldb.ChannelEdgePolicy{},
|
||||||
|
&channeldb.ChannelEdgePolicy{}, nil,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
maxHopHints: 1,
|
||||||
|
amount: 0,
|
||||||
|
expectedHopHints: [][]zpay32.HopHint{
|
||||||
|
{
|
||||||
|
{
|
||||||
|
NodeID: getTestPubKey(),
|
||||||
|
ChannelID: 9,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
func setupMockTwoChannels(h *hopHintsConfigMock) (lnwire.ChannelID,
|
func setupMockTwoChannels(h *hopHintsConfigMock) (lnwire.ChannelID,
|
||||||
|
@ -1233,6 +1233,15 @@ func testInvoiceRoutingHints(net *lntest.NetworkHarness, t *harnessTest) {
|
|||||||
}
|
}
|
||||||
checkInvoiceHints(invoice)
|
checkInvoiceHints(invoice)
|
||||||
|
|
||||||
|
// Create another invoice for Alice with no value and ensure it still
|
||||||
|
// populates routing hints.
|
||||||
|
invoice = &lnrpc.Invoice{
|
||||||
|
Memo: "routing hints with no amount",
|
||||||
|
Value: 0,
|
||||||
|
Private: true,
|
||||||
|
}
|
||||||
|
checkInvoiceHints(invoice)
|
||||||
|
|
||||||
// Now that we've confirmed the routing hints were added correctly, we
|
// Now that we've confirmed the routing hints were added correctly, we
|
||||||
// can close all the channels and shut down all the nodes created.
|
// can close all the channels and shut down all the nodes created.
|
||||||
closeChannelAndAssert(t, net, net.Alice, chanPointBob, false)
|
closeChannelAndAssert(t, net, net.Alice, chanPointBob, false)
|
||||||
|
Loading…
Reference in New Issue
Block a user