From aba49c9a5ac432a951fdd3c087bf4622a371a831 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Wed, 11 Dec 2019 16:37:02 -0800 Subject: [PATCH] rpcserver: populate features on lnrpc invoices In the process, we also move the feature serialization into the invoicesrpc package, so that it can be shared between the invoicesrpc and main rpcserver. --- lnrpc/invoicesrpc/utils.go | 18 ++++++++++++++++++ rpcserver.go | 16 +--------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/lnrpc/invoicesrpc/utils.go b/lnrpc/invoicesrpc/utils.go index e659403b4..1d9711c06 100644 --- a/lnrpc/invoicesrpc/utils.go +++ b/lnrpc/invoicesrpc/utils.go @@ -7,6 +7,7 @@ import ( "github.com/btcsuite/btcd/chaincfg" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/lnrpc" + "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/zpay32" ) @@ -116,6 +117,7 @@ func CreateRPCInvoice(invoice *channeldb.Invoice, AmtPaid: int64(invoice.AmtPaid), State: state, Htlcs: rpcHtlcs, + Features: CreateRPCFeatures(invoice.Terms.Features), } if preimage != channeldb.UnknownPreimage { @@ -125,6 +127,22 @@ func CreateRPCInvoice(invoice *channeldb.Invoice, return rpcInvoice, nil } +// CreateRPCFeatures maps a feature vector into a list of lnrpc.Features. +func CreateRPCFeatures(fv *lnwire.FeatureVector) []*lnrpc.Feature { + features := fv.Features() + rpcFeatures := make([]*lnrpc.Feature, 0, len(features)) + for bit := range features { + rpcFeatures = append(rpcFeatures, &lnrpc.Feature{ + Bit: uint32(bit), + Name: fv.Name(bit), + IsRequired: bit.IsRequired(), + IsKnown: fv.IsKnown(bit), + }) + } + + return rpcFeatures +} + // CreateRPCRouteHints takes in the decoded form of an invoice's route hints // and converts them into the lnrpc type. func CreateRPCRouteHints(routeHints [][]zpay32.HopHint) []*lnrpc.RouteHint { diff --git a/rpcserver.go b/rpcserver.go index 58d894532..ef8844bd4 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -4632,20 +4632,6 @@ func (r *rpcServer) DecodePayReq(ctx context.Context, paymentAddr = payReq.PaymentAddr[:] } - // Convert any features on the payment request into a descriptive format - // for the rpc. - invFeatures := payReq.Features.Features() - features := make([]*lnrpc.Feature, 0, len(invFeatures)) - for bit := range invFeatures { - name := payReq.Features.Name(bit) - features = append(features, &lnrpc.Feature{ - Bit: uint32(bit), - Name: name, - IsRequired: bit.IsRequired(), - IsKnown: name != "unknown", - }) - } - dest := payReq.Destination.SerializeCompressed() return &lnrpc.PayReq{ Destination: hex.EncodeToString(dest), @@ -4660,7 +4646,7 @@ func (r *rpcServer) DecodePayReq(ctx context.Context, CltvExpiry: int64(payReq.MinFinalCLTVExpiry()), RouteHints: routeHints, PaymentAddr: paymentAddr, - Features: features, + Features: invoicesrpc.CreateRPCFeatures(payReq.Features), }, nil }