feat: add inbound fees to channel notifications

This commit is contained in:
Bufo 2024-05-07 18:58:25 +02:00
parent 399ea864da
commit af9858c3ed
No known key found for this signature in database
GPG key ID: 108BA08192C3CE55
4 changed files with 59 additions and 10 deletions

View file

@ -301,6 +301,9 @@
maintain a healthy connection to the network by checking the number of maintain a healthy connection to the network by checking the number of
outbound peers if they are below 6. outbound peers if they are below 6.
* [Add inbound fees](https://github.com/lightningnetwork/lnd/pull/8723) to
`subscribeChannelGraph`.
### Logging ### Logging
* [Add the htlc amount](https://github.com/lightningnetwork/lnd/pull/8156) to * [Add the htlc amount](https://github.com/lightningnetwork/lnd/pull/8156) to
contract court logs in case of timed-out HTLCs in order to easily spot dust contract court logs in case of timed-out HTLCs in order to easily spot dust
@ -533,6 +536,7 @@
* BitcoinerCoderBob * BitcoinerCoderBob
* bitromortac * bitromortac
* bota87 * bota87
* Bufo
* Calvin Zachman * Calvin Zachman
* Carla Kirk-Cohen * Carla Kirk-Cohen
* cristiantroy * cristiantroy

View file

@ -301,6 +301,11 @@ type ChannelEdgeUpdate struct {
// Disabled, if true, signals that the channel is unavailable to relay // Disabled, if true, signals that the channel is unavailable to relay
// payments. // payments.
Disabled bool Disabled bool
// ExtraOpaqueData is the set of data that was appended to this message
// to fill out the full maximum transport message size. These fields can
// be used to specify optional data such as custom TLV fields.
ExtraOpaqueData lnwire.ExtraOpaqueData
} }
// appendTopologyChange appends the passed update message to the passed // appendTopologyChange appends the passed update message to the passed
@ -379,6 +384,7 @@ func addToTopologyChange(graph *channeldb.ChannelGraph, update *TopologyChange,
AdvertisingNode: aNode, AdvertisingNode: aNode,
ConnectingNode: cNode, ConnectingNode: cNode,
Disabled: m.ChannelFlags&lnwire.ChanUpdateDisabled != 0, Disabled: m.ChannelFlags&lnwire.ChanUpdateDisabled != 0,
ExtraOpaqueData: m.ExtraOpaqueData,
} }
// TODO(roasbeef): add bit to toggle // TODO(roasbeef): add bit to toggle

View file

@ -75,7 +75,18 @@ func createTestNode() (*channeldb.LightningNode, error) {
} }
func randEdgePolicy(chanID *lnwire.ShortChannelID, func randEdgePolicy(chanID *lnwire.ShortChannelID,
node *channeldb.LightningNode) *models.ChannelEdgePolicy { node *channeldb.LightningNode) (*models.ChannelEdgePolicy, error) {
InboundFee := models.InboundFee{
Base: prand.Int31() * -1,
Rate: prand.Int31() * -1,
}
inboundFee := InboundFee.ToWire()
var extraOpaqueData lnwire.ExtraOpaqueData
if err := extraOpaqueData.PackRecords(&inboundFee); err != nil {
return nil, err
}
return &models.ChannelEdgePolicy{ return &models.ChannelEdgePolicy{
SigBytes: testSig.Serialize(), SigBytes: testSig.Serialize(),
@ -87,7 +98,8 @@ func randEdgePolicy(chanID *lnwire.ShortChannelID,
FeeBaseMSat: lnwire.MilliSatoshi(prand.Int31()), FeeBaseMSat: lnwire.MilliSatoshi(prand.Int31()),
FeeProportionalMillionths: lnwire.MilliSatoshi(prand.Int31()), FeeProportionalMillionths: lnwire.MilliSatoshi(prand.Int31()),
ToNode: node.PubKeyBytes, ToNode: node.PubKeyBytes,
} ExtraOpaqueData: extraOpaqueData,
}, nil
} }
func createChannelEdge(ctx *testCtx, bitcoinKey1, bitcoinKey2 []byte, func createChannelEdge(ctx *testCtx, bitcoinKey1, bitcoinKey2 []byte,
@ -457,9 +469,12 @@ func TestEdgeUpdateNotification(t *testing.T) {
// Create random policy edges that are stemmed to the channel id // Create random policy edges that are stemmed to the channel id
// created above. // created above.
edge1 := randEdgePolicy(chanID, node1) edge1, err := randEdgePolicy(chanID, node1)
require.NoError(t, err, "unable to create a random chan policy")
edge1.ChannelFlags = 0 edge1.ChannelFlags = 0
edge2 := randEdgePolicy(chanID, node2)
edge2, err := randEdgePolicy(chanID, node2)
require.NoError(t, err, "unable to create a random chan policy")
edge2.ChannelFlags = 1 edge2.ChannelFlags = 1
if err := ctx.router.UpdateEdge(edge1); err != nil { if err := ctx.router.UpdateEdge(edge1); err != nil {
@ -511,6 +526,9 @@ func TestEdgeUpdateNotification(t *testing.T) {
"expected %v, got %v", edgeAnn.TimeLockDelta, "expected %v, got %v", edgeAnn.TimeLockDelta,
edgeUpdate.TimeLockDelta) edgeUpdate.TimeLockDelta)
} }
require.Equal(
t, edgeAnn.ExtraOpaqueData, edgeUpdate.ExtraOpaqueData,
)
} }
// Create lookup map for notifications we are intending to receive. Entries // Create lookup map for notifications we are intending to receive. Entries

View file

@ -6691,6 +6691,14 @@ func marshallTopologyChange(topChange *routing.TopologyChange) *lnrpc.GraphTopol
channelUpdates := make([]*lnrpc.ChannelEdgeUpdate, len(topChange.ChannelEdgeUpdates)) channelUpdates := make([]*lnrpc.ChannelEdgeUpdate, len(topChange.ChannelEdgeUpdates))
for i, channelUpdate := range topChange.ChannelEdgeUpdates { for i, channelUpdate := range topChange.ChannelEdgeUpdates {
customRecords := marshalExtraOpaqueData(
channelUpdate.ExtraOpaqueData,
)
inboundFee := extractInboundFeeSafe(
channelUpdate.ExtraOpaqueData,
)
channelUpdates[i] = &lnrpc.ChannelEdgeUpdate{ channelUpdates[i] = &lnrpc.ChannelEdgeUpdate{
ChanId: channelUpdate.ChanID, ChanId: channelUpdate.ChanID,
ChanPoint: &lnrpc.ChannelPoint{ ChanPoint: &lnrpc.ChannelPoint{
@ -6701,12 +6709,25 @@ func marshallTopologyChange(topChange *routing.TopologyChange) *lnrpc.GraphTopol
}, },
Capacity: int64(channelUpdate.Capacity), Capacity: int64(channelUpdate.Capacity),
RoutingPolicy: &lnrpc.RoutingPolicy{ RoutingPolicy: &lnrpc.RoutingPolicy{
TimeLockDelta: uint32(channelUpdate.TimeLockDelta), TimeLockDelta: uint32(
MinHtlc: int64(channelUpdate.MinHTLC), channelUpdate.TimeLockDelta,
MaxHtlcMsat: uint64(channelUpdate.MaxHTLC), ),
FeeBaseMsat: int64(channelUpdate.BaseFee), MinHtlc: int64(
FeeRateMilliMsat: int64(channelUpdate.FeeRate), channelUpdate.MinHTLC,
),
MaxHtlcMsat: uint64(
channelUpdate.MaxHTLC,
),
FeeBaseMsat: int64(
channelUpdate.BaseFee,
),
FeeRateMilliMsat: int64(
channelUpdate.FeeRate,
),
Disabled: channelUpdate.Disabled, Disabled: channelUpdate.Disabled,
InboundFeeBaseMsat: inboundFee.BaseFee,
InboundFeeRateMilliMsat: inboundFee.FeeRate,
CustomRecords: customRecords,
}, },
AdvertisingNode: encodeKey(channelUpdate.AdvertisingNode), AdvertisingNode: encodeKey(channelUpdate.AdvertisingNode),
ConnectingNode: encodeKey(channelUpdate.ConnectingNode), ConnectingNode: encodeKey(channelUpdate.ConnectingNode),