@@ -602,6 +602,17 @@ fn compute_fees(amount_msat: u64, channel_fees: RoutingFees) -> Option<u64> {
602
602
}
603
603
}
604
604
605
+ /// The default `features` we assume for a node in a route, when no `features` are known about that
606
+ /// specific node.
607
+ ///
608
+ /// Default features are:
609
+ /// * variable_length_onion_optional
610
+ fn default_node_features ( ) -> NodeFeatures {
611
+ let mut features = NodeFeatures :: empty ( ) ;
612
+ features. set_variable_length_onion_optional ( ) ;
613
+ features
614
+ }
615
+
605
616
/// Finds a route from us (payer) to the given target node (payee).
606
617
///
607
618
/// If the payee provided features in their invoice, they should be provided via `params.payee`.
@@ -1101,7 +1112,8 @@ where L::Target: Logger {
1101
1112
} }
1102
1113
}
1103
1114
1104
- let empty_node_features = NodeFeatures :: empty ( ) ;
1115
+ let default_node_features = default_node_features ( ) ;
1116
+
1105
1117
// Find ways (channels with destination) to reach a given node and store them
1106
1118
// in the corresponding data structures (routing graph etc).
1107
1119
// $fee_to_target_msat represents how much it costs to reach to this node from the payee,
@@ -1132,7 +1144,7 @@ where L::Target: Logger {
1132
1144
let features = if let Some ( node_info) = $node. announcement_info. as_ref( ) {
1133
1145
& node_info. features
1134
1146
} else {
1135
- & empty_node_features
1147
+ & default_node_features
1136
1148
} ;
1137
1149
1138
1150
if !features. requires_unknown_bits( ) {
@@ -1312,7 +1324,7 @@ where L::Target: Logger {
1312
1324
// traversing the graph and arrange the path out of what we found.
1313
1325
if node_id == our_node_id {
1314
1326
let mut new_entry = dist. remove ( & our_node_id) . unwrap ( ) ;
1315
- let mut ordered_hops = vec ! ( ( new_entry. clone( ) , NodeFeatures :: empty ( ) ) ) ;
1327
+ let mut ordered_hops = vec ! ( ( new_entry. clone( ) , default_node_features . clone ( ) ) ) ;
1316
1328
1317
1329
' path_walk: loop {
1318
1330
let mut features_set = false ;
@@ -1330,7 +1342,7 @@ where L::Target: Logger {
1330
1342
if let Some ( node_info) = node. announcement_info . as_ref ( ) {
1331
1343
ordered_hops. last_mut ( ) . unwrap ( ) . 1 = node_info. features . clone ( ) ;
1332
1344
} else {
1333
- ordered_hops. last_mut ( ) . unwrap ( ) . 1 = NodeFeatures :: empty ( ) ;
1345
+ ordered_hops. last_mut ( ) . unwrap ( ) . 1 = default_node_features . clone ( ) ;
1334
1346
}
1335
1347
} else {
1336
1348
// We can fill in features for everything except hops which were
@@ -1357,7 +1369,7 @@ where L::Target: Logger {
1357
1369
// so that fees paid for a HTLC forwarding on the current channel are
1358
1370
// associated with the previous channel (where they will be subtracted).
1359
1371
ordered_hops. last_mut ( ) . unwrap ( ) . 0 . fee_msat = new_entry. hop_use_fee_msat ;
1360
- ordered_hops. push ( ( new_entry. clone ( ) , NodeFeatures :: empty ( ) ) ) ;
1372
+ ordered_hops. push ( ( new_entry. clone ( ) , default_node_features . clone ( ) ) ) ;
1361
1373
}
1362
1374
ordered_hops. last_mut ( ) . unwrap ( ) . 0 . fee_msat = value_contribution_msat;
1363
1375
ordered_hops. last_mut ( ) . unwrap ( ) . 0 . hop_use_fee_msat = 0 ;
@@ -1684,7 +1696,7 @@ fn add_random_cltv_offset(route: &mut Route, payment_params: &PaymentParameters,
1684
1696
#[ cfg( test) ]
1685
1697
mod tests {
1686
1698
use routing:: network_graph:: { NetworkGraph , NetGraphMsgHandler , NodeId } ;
1687
- use routing:: router:: { get_route, add_random_cltv_offset, PaymentParameters , Route , RouteHint , RouteHintHop , RouteHop , RoutingFees , DEFAULT_MAX_TOTAL_CLTV_EXPIRY_DELTA } ;
1699
+ use routing:: router:: { get_route, add_random_cltv_offset, default_node_features , PaymentParameters , Route , RouteHint , RouteHintHop , RouteHop , RoutingFees , DEFAULT_MAX_TOTAL_CLTV_EXPIRY_DELTA } ;
1688
1700
use routing:: scoring:: Score ;
1689
1701
use chain:: transaction:: OutPoint ;
1690
1702
use chain:: keysinterface:: KeysInterface ;
@@ -2785,7 +2797,7 @@ mod tests {
2785
2797
assert_eq ! ( route. paths[ 0 ] [ 4 ] . short_channel_id, 8 ) ;
2786
2798
assert_eq ! ( route. paths[ 0 ] [ 4 ] . fee_msat, 100 ) ;
2787
2799
assert_eq ! ( route. paths[ 0 ] [ 4 ] . cltv_expiry_delta, 42 ) ;
2788
- assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
2800
+ assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , default_node_features ( ) . le_flags ( ) ) ; // We dont pass flags in from invoices yet
2789
2801
assert_eq ! ( route. paths[ 0 ] [ 4 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
2790
2802
}
2791
2803
@@ -2861,7 +2873,7 @@ mod tests {
2861
2873
assert_eq ! ( route. paths[ 0 ] [ 4 ] . short_channel_id, 8 ) ;
2862
2874
assert_eq ! ( route. paths[ 0 ] [ 4 ] . fee_msat, 100 ) ;
2863
2875
assert_eq ! ( route. paths[ 0 ] [ 4 ] . cltv_expiry_delta, 42 ) ;
2864
- assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
2876
+ assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , default_node_features ( ) . le_flags ( ) ) ; // We dont pass flags in from invoices yet
2865
2877
assert_eq ! ( route. paths[ 0 ] [ 4 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
2866
2878
}
2867
2879
@@ -2958,7 +2970,7 @@ mod tests {
2958
2970
assert_eq ! ( route. paths[ 0 ] [ 3 ] . short_channel_id, last_hops[ 0 ] . 0 [ 1 ] . short_channel_id) ;
2959
2971
assert_eq ! ( route. paths[ 0 ] [ 3 ] . fee_msat, 100 ) ;
2960
2972
assert_eq ! ( route. paths[ 0 ] [ 3 ] . cltv_expiry_delta, 42 ) ;
2961
- assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
2973
+ assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , default_node_features ( ) . le_flags ( ) ) ; // We dont pass flags in from invoices yet
2962
2974
assert_eq ! ( route. paths[ 0 ] [ 3 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
2963
2975
}
2964
2976
@@ -3023,14 +3035,14 @@ mod tests {
3023
3035
assert_eq ! ( route. paths[ 0 ] [ 2 ] . short_channel_id, last_hops[ 0 ] . 0 [ 0 ] . short_channel_id) ;
3024
3036
assert_eq ! ( route. paths[ 0 ] [ 2 ] . fee_msat, 0 ) ;
3025
3037
assert_eq ! ( route. paths[ 0 ] [ 2 ] . cltv_expiry_delta, 129 ) ;
3026
- assert_eq ! ( route. paths[ 0 ] [ 2 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3038
+ assert_eq ! ( route. paths[ 0 ] [ 2 ] . node_features. le_flags( ) , default_node_features ( ) . le_flags ( ) ) ; // We dont pass flags in from invoices yet
3027
3039
assert_eq ! ( route. paths[ 0 ] [ 2 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3028
3040
3029
3041
assert_eq ! ( route. paths[ 0 ] [ 3 ] . pubkey, nodes[ 6 ] ) ;
3030
3042
assert_eq ! ( route. paths[ 0 ] [ 3 ] . short_channel_id, last_hops[ 0 ] . 0 [ 1 ] . short_channel_id) ;
3031
3043
assert_eq ! ( route. paths[ 0 ] [ 3 ] . fee_msat, 100 ) ;
3032
3044
assert_eq ! ( route. paths[ 0 ] [ 3 ] . cltv_expiry_delta, 42 ) ;
3033
- assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3045
+ assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , default_node_features ( ) . le_flags ( ) ) ; // We dont pass flags in from invoices yet
3034
3046
assert_eq ! ( route. paths[ 0 ] [ 3 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3035
3047
}
3036
3048
@@ -3121,7 +3133,7 @@ mod tests {
3121
3133
assert_eq ! ( route. paths[ 0 ] [ 4 ] . short_channel_id, 8 ) ;
3122
3134
assert_eq ! ( route. paths[ 0 ] [ 4 ] . fee_msat, 100 ) ;
3123
3135
assert_eq ! ( route. paths[ 0 ] [ 4 ] . cltv_expiry_delta, 42 ) ;
3124
- assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3136
+ assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , default_node_features ( ) . le_flags ( ) ) ; // We dont pass flags in from invoices yet
3125
3137
assert_eq ! ( route. paths[ 0 ] [ 4 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3126
3138
}
3127
3139
@@ -3151,7 +3163,7 @@ mod tests {
3151
3163
assert_eq ! ( route. paths[ 0 ] [ 1 ] . short_channel_id, 8 ) ;
3152
3164
assert_eq ! ( route. paths[ 0 ] [ 1 ] . fee_msat, 100 ) ;
3153
3165
assert_eq ! ( route. paths[ 0 ] [ 1 ] . cltv_expiry_delta, 42 ) ;
3154
- assert_eq ! ( route. paths[ 0 ] [ 1 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3166
+ assert_eq ! ( route. paths[ 0 ] [ 1 ] . node_features. le_flags( ) , default_node_features ( ) . le_flags ( ) ) ; // We dont pass flags in from invoices yet
3155
3167
assert_eq ! ( route. paths[ 0 ] [ 1 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3156
3168
3157
3169
last_hops[ 0 ] . 0 [ 0 ] . fees . base_msat = 1000 ;
@@ -3188,7 +3200,7 @@ mod tests {
3188
3200
assert_eq ! ( route. paths[ 0 ] [ 3 ] . short_channel_id, 10 ) ;
3189
3201
assert_eq ! ( route. paths[ 0 ] [ 3 ] . fee_msat, 100 ) ;
3190
3202
assert_eq ! ( route. paths[ 0 ] [ 3 ] . cltv_expiry_delta, 42 ) ;
3191
- assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3203
+ assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , default_node_features ( ) . le_flags ( ) ) ; // We dont pass flags in from invoices yet
3192
3204
assert_eq ! ( route. paths[ 0 ] [ 3 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3193
3205
3194
3206
// ...but still use 8 for larger payments as 6 has a variable feerate
@@ -3229,7 +3241,7 @@ mod tests {
3229
3241
assert_eq ! ( route. paths[ 0 ] [ 4 ] . short_channel_id, 8 ) ;
3230
3242
assert_eq ! ( route. paths[ 0 ] [ 4 ] . fee_msat, 2000 ) ;
3231
3243
assert_eq ! ( route. paths[ 0 ] [ 4 ] . cltv_expiry_delta, 42 ) ;
3232
- assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3244
+ assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , default_node_features ( ) . le_flags ( ) ) ; // We dont pass flags in from invoices yet
3233
3245
assert_eq ! ( route. paths[ 0 ] [ 4 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3234
3246
}
3235
3247
@@ -3281,7 +3293,7 @@ mod tests {
3281
3293
assert_eq ! ( route. paths[ 0 ] [ 1 ] . short_channel_id, 8 ) ;
3282
3294
assert_eq ! ( route. paths[ 0 ] [ 1 ] . fee_msat, 1000000 ) ;
3283
3295
assert_eq ! ( route. paths[ 0 ] [ 1 ] . cltv_expiry_delta, 42 ) ;
3284
- assert_eq ! ( route. paths[ 0 ] [ 1 ] . node_features. le_flags( ) , & [ 0 ; 0 ] ) ; // We dont pass flags in from invoices yet
3296
+ assert_eq ! ( route. paths[ 0 ] [ 1 ] . node_features. le_flags( ) , default_node_features ( ) . le_flags ( ) ) ; // We dont pass flags in from invoices yet
3285
3297
assert_eq ! ( route. paths[ 0 ] [ 1 ] . channel_features. le_flags( ) , & [ 0 ; 0 ] ) ; // We can't learn any flags from invoices, sadly
3286
3298
}
3287
3299
0 commit comments