diff --git a/rpcserver.go b/rpcserver.go index 7236a5dad..65c9a41c1 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -6055,6 +6055,7 @@ func (r *rpcServer) AddInvoice(ctx context.Context, NumHops: globalBlindCfg.NumHops, MaxNumPaths: globalBlindCfg.MaxNumPaths, NodeOmissionSet: fn.NewSet[route.Vertex](), + IncomingChainedChannels: make([]uint64, 0), } if blindCfg != nil && !blind { @@ -6074,6 +6075,10 @@ func (r *rpcServer) AddInvoice(ctx context.Context, blindingRestrictions.MaxNumPaths = uint8(*blindCfg.MaxNumPaths) } + if blindingRestrictions.MaxNumPaths == 0 { + return nil, fmt.Errorf("blinded max num paths cannot " + + "be 0") + } for _, nodeIDBytes := range blindCfg.NodeOmissionList { vertex, err := route.NewVertexFromBytes(nodeIDBytes) @@ -6083,6 +6088,38 @@ func (r *rpcServer) AddInvoice(ctx context.Context, blindingRestrictions.NodeOmissionSet.Add(vertex) } + + blindingRestrictions.IncomingChainedChannels = append( + blindingRestrictions.IncomingChainedChannels, + blindCfg.IncomingChannelList..., + ) + + numChainedChannels := + uint8(len(blindingRestrictions.IncomingChainedChannels)) + + // When selecting the blinded incoming channel list parameter + // the maximum number of hops is implictitly set. + if numChainedChannels > blindingRestrictions.NumHops { + rpcsLog.Warnf("Changing the num_blinded_hops "+ + "from (%d) to (%d)", + blindingRestrictions.NumHops, + numChainedChannels) + + blindingRestrictions.NumHops = + numChainedChannels + } + + // The MinDistanceFromIntroNode must be greater than or equal to + // the number of hops specified on the chained channels. + minNumHops := blindingRestrictions.MinDistanceFromIntroNode + if minNumHops < numChainedChannels { + return nil, fmt.Errorf("minimum number of blinded "+ + "path hops (%d) must be greater than or equal "+ + "to the number of hops specified on the "+ + "chained channels (%d)", minNumHops, + numChainedChannels) + } + } if blindingRestrictions.MinDistanceFromIntroNode >