Merge pull request #8758 from feelancer21/preserve-inbound-fees

multi: Inbound fees are retained when not provided
This commit is contained in:
Olaoluwa Osuntokun
2024-05-23 13:58:52 -07:00
committed by GitHub
10 changed files with 1508 additions and 1333 deletions

View File

@@ -45,7 +45,9 @@ func testUpdateChannelPolicy(ht *lntest.HarnessTest) {
nodes := []*node.HarnessNode{alice, bob}
// Alice and Bob should see each other's ChannelUpdates, advertising the
// default routing policies.
// default routing policies. We do not currently set any inbound fees.
// The inbound base and inbound fee rate are advertised with a default
// of 0.
expectedPolicy := &lnrpc.RoutingPolicy{
FeeBaseMsat: defaultFeeBase,
FeeRateMilliMsat: defaultFeeRate,
@@ -227,9 +229,9 @@ func testUpdateChannelPolicy(ht *lntest.HarnessTest) {
require.NoError(ht, err, "unable to receive payment stream")
require.Empty(ht, sendResp.PaymentError, "expected payment to succeed")
// With our little cluster set up, we'll update the fees and the max
// htlc size for the Bob side of the Alice->Bob channel, and make sure
// all nodes learn about it.
// With our little cluster set up, we'll update the outbound fees and
// the max htlc size for the Bob side of the Alice->Bob channel, and
// make sure all nodes learn about it. Inbound fees remain at 0.
baseFee := int64(1500)
feeRate := int64(12)
timeLockDelta := uint32(66)
@@ -298,17 +300,25 @@ func testUpdateChannelPolicy(ht *lntest.HarnessTest) {
feeRate = int64(123)
timeLockDelta = uint32(22)
maxHtlc *= 2
inboundBaseFee := int32(-400)
inboundFeeRatePpm := int32(-60)
expectedPolicy.FeeBaseMsat = baseFee
expectedPolicy.FeeRateMilliMsat = testFeeBase * feeRate
expectedPolicy.TimeLockDelta = timeLockDelta
expectedPolicy.MaxHtlcMsat = maxHtlc
expectedPolicy.InboundFeeBaseMsat = inboundBaseFee
expectedPolicy.InboundFeeRateMilliMsat = inboundFeeRatePpm
req = &lnrpc.PolicyUpdateRequest{
BaseFeeMsat: baseFee,
FeeRate: float64(feeRate),
TimeLockDelta: timeLockDelta,
MaxHtlcMsat: maxHtlc,
InboundFee: &lnrpc.InboundFee{
BaseFeeMsat: inboundBaseFee,
FeeRatePpm: inboundFeeRatePpm,
},
}
req.Scope = &lnrpc.PolicyUpdateRequest_Global{}
alice.RPC.UpdateChannelPolicy(req)
@@ -370,10 +380,13 @@ func testUpdateChannelPolicy(ht *lntest.HarnessTest) {
)
}
// Double the base fee and attach to the policy.
// Double the base fee and attach to the policy. Moreover, we set the
// inbound fee to nil and test that it does not change the propagated
// inbound fee.
baseFee1 := baseFee * 2
expectedPolicy.FeeBaseMsat = baseFee1
req.BaseFeeMsat = baseFee1
req.InboundFee = nil
assertAliceAndBob(req, expectedPolicy)
// Check that Carol has both heard the policy and updated it in her

View File

@@ -74,8 +74,8 @@ func testMultiHopPayments(ht *lntest.HarnessTest) {
const aliceFeeRatePPM = 100000
updateChannelPolicy(
ht, alice, chanPointAlice, aliceBaseFeeSat*1000,
aliceFeeRatePPM, 0, 0, chainreg.DefaultBitcoinTimeLockDelta,
maxHtlc, carol,
aliceFeeRatePPM, 0, 0, false,
chainreg.DefaultBitcoinTimeLockDelta, maxHtlc, carol,
)
// Define a negative inbound fee for Alice, to verify that this is
@@ -85,9 +85,19 @@ func testMultiHopPayments(ht *lntest.HarnessTest) {
aliceInboundFeeRate = -50000 // 5%
)
// We update the channel twice. The first time we set the inbound fee,
// the second time we don't. This is done to test whether the switch is
// still aware of the inbound fees.
updateChannelPolicy(
ht, alice, chanPointDave, 0, 0,
aliceInboundBaseFeeMsat, aliceInboundFeeRate,
aliceInboundBaseFeeMsat, aliceInboundFeeRate, true,
chainreg.DefaultBitcoinTimeLockDelta, maxHtlc,
dave,
)
updateChannelPolicy(
ht, alice, chanPointDave, 0, 0,
aliceInboundBaseFeeMsat, aliceInboundFeeRate, false,
chainreg.DefaultBitcoinTimeLockDelta, maxHtlc,
dave,
)
@@ -96,7 +106,7 @@ func testMultiHopPayments(ht *lntest.HarnessTest) {
const daveFeeRatePPM = 150000
updateChannelPolicy(
ht, dave, chanPointDave, daveBaseFeeSat*1000, daveFeeRatePPM,
0, 0,
0, 0, true,
chainreg.DefaultBitcoinTimeLockDelta, maxHtlc, carol,
)
@@ -236,8 +246,8 @@ func testMultiHopPayments(ht *lntest.HarnessTest) {
//
// NOTE: only used in current test.
func updateChannelPolicy(ht *lntest.HarnessTest, hn *node.HarnessNode,
chanPoint *lnrpc.ChannelPoint, baseFee int64,
feeRate int64, inboundBaseFee, inboundFeeRate int32,
chanPoint *lnrpc.ChannelPoint, baseFee int64, feeRate int64,
inboundBaseFee, inboundFeeRate int32, updateInboundFee bool,
timeLockDelta uint32, maxHtlc uint64, listenerNode *node.HarnessNode) {
expectedPolicy := &lnrpc.RoutingPolicy{
@@ -250,6 +260,14 @@ func updateChannelPolicy(ht *lntest.HarnessTest, hn *node.HarnessNode,
InboundFeeRateMilliMsat: inboundFeeRate,
}
var inboundFee *lnrpc.InboundFee
if updateInboundFee {
inboundFee = &lnrpc.InboundFee{
BaseFeeMsat: inboundBaseFee,
FeeRatePpm: inboundFeeRate,
}
}
updateFeeReq := &lnrpc.PolicyUpdateRequest{
BaseFeeMsat: baseFee,
FeeRate: float64(feeRate) / testFeeBase,
@@ -257,9 +275,8 @@ func updateChannelPolicy(ht *lntest.HarnessTest, hn *node.HarnessNode,
Scope: &lnrpc.PolicyUpdateRequest_ChanPoint{
ChanPoint: chanPoint,
},
MaxHtlcMsat: maxHtlc,
InboundBaseFeeMsat: inboundBaseFee,
InboundFeeRatePpm: inboundFeeRate,
MaxHtlcMsat: maxHtlc,
InboundFee: inboundFee,
}
hn.RPC.UpdateChannelPolicy(updateFeeReq)