@@ -165,6 +165,12 @@ struct DummyDirectionalChannelInfo {
165
165
fees : RoutingFees ,
166
166
}
167
167
168
+ struct RouteHopInGraph {
169
+ route_hop : RouteHop ,
170
+ total_fee : u64 ,
171
+ available_msat : Option < u64 > ,
172
+ node_lowest_inbound_fees : RoutingFees ,
173
+ }
168
174
169
175
/// Gets a route from us to the given target node.
170
176
///
@@ -267,26 +273,29 @@ pub fn get_route<L: Deref>(our_node_id: &PublicKey, network: &NetworkGraph, targ
267
273
fee_base_msat = fees. base_msat;
268
274
fee_proportional_millionths = fees. proportional_millionths;
269
275
} ;
270
- ( u64 :: max_value( ) ,
271
- fee_base_msat,
272
- fee_proportional_millionths,
273
- RouteHop {
276
+ RouteHopInGraph {
277
+ route_hop: RouteHop {
274
278
pubkey: $dest_node_id. clone( ) ,
275
279
node_features: NodeFeatures :: empty( ) ,
276
280
short_channel_id: 0 ,
277
281
channel_features: $chan_features. clone( ) ,
278
282
fee_msat: 0 ,
279
283
cltv_expiry_delta: 0 ,
280
284
} ,
281
- None ,
282
- )
285
+ total_fee: u64 :: max_value( ) ,
286
+ node_lowest_inbound_fees: RoutingFees {
287
+ base_msat: fee_base_msat,
288
+ proportional_millionths: fee_proportional_millionths,
289
+ } ,
290
+ available_msat: None ,
291
+ }
283
292
} ) ;
284
293
if $src_node_id != * our_node_id {
285
294
// Ignore new_fee for channel-from-us as we assume all channels-from-us
286
295
// will have the same effective-fee
287
296
total_fee += new_fee;
288
- if let Some ( fee_inc) = final_value_msat. checked_add( total_fee) . and_then( |inc| { ( old_entry. 2 as u64 ) . checked_mul( inc) } ) {
289
- total_fee += fee_inc / 1000000 + ( old_entry. 1 as u64 ) ;
297
+ if let Some ( fee_inc) = final_value_msat. checked_add( total_fee) . and_then( |inc| { ( old_entry. node_lowest_inbound_fees . proportional_millionths as u64 ) . checked_mul( inc) } ) {
298
+ total_fee += fee_inc / 1000000 + ( old_entry. node_lowest_inbound_fees . base_msat as u64 ) ;
290
299
} else {
291
300
// max_value means we'll always fail the old_entry.0 > total_fee check
292
301
total_fee = u64 :: max_value( ) ;
@@ -297,18 +306,18 @@ pub fn get_route<L: Deref>(our_node_id: &PublicKey, network: &NetworkGraph, targ
297
306
lowest_fee_to_peer_through_node: total_fee,
298
307
lowest_fee_to_node: $starting_fee_msat as u64 + new_fee,
299
308
} ;
300
- if old_entry. 0 > total_fee {
309
+ if old_entry. total_fee > total_fee {
301
310
targets. push( new_graph_node) ;
302
- old_entry. 0 = total_fee;
303
- old_entry. 3 = RouteHop {
311
+ old_entry. total_fee = total_fee;
312
+ old_entry. route_hop = RouteHop {
304
313
pubkey: $dest_node_id. clone( ) ,
305
314
node_features: NodeFeatures :: empty( ) ,
306
315
short_channel_id: $chan_id. clone( ) ,
307
316
channel_features: $chan_features. clone( ) ,
308
317
fee_msat: new_fee, // This field is ignored on the last-hop anyway
309
318
cltv_expiry_delta: $directional_info. cltv_expiry_delta as u32 ,
310
319
} ;
311
- old_entry. 4 = available_msat;
320
+ old_entry. available_msat = available_msat;
312
321
}
313
322
}
314
323
}
@@ -387,7 +396,7 @@ pub fn get_route<L: Deref>(our_node_id: &PublicKey, network: &NetworkGraph, targ
387
396
388
397
while let Some ( RouteGraphNode { pubkey, lowest_fee_to_node, .. } ) = targets. pop ( ) {
389
398
if pubkey == * our_node_id {
390
- let mut res = vec ! ( dist. remove( & our_node_id) . unwrap( ) . 3 ) ;
399
+ let mut res = vec ! ( dist. remove( & our_node_id) . unwrap( ) . route_hop ) ;
391
400
loop {
392
401
if let Some ( & ( _, ref features) ) = first_hop_targets. get ( & res. last ( ) . unwrap ( ) . pubkey ) {
393
402
res. last_mut ( ) . unwrap ( ) . node_features = features. to_context ( ) ;
@@ -409,7 +418,7 @@ pub fn get_route<L: Deref>(our_node_id: &PublicKey, network: &NetworkGraph, targ
409
418
}
410
419
411
420
let new_entry = match dist. remove ( & res. last ( ) . unwrap ( ) . pubkey ) {
412
- Some ( hop) => hop. 3 ,
421
+ Some ( hop) => hop. route_hop ,
413
422
None => return Err ( LightningError { err : "Failed to find a non-fee-overflowing path to the given destination" . to_owned ( ) , action : ErrorAction :: IgnoreError } ) ,
414
423
} ;
415
424
res. last_mut ( ) . unwrap ( ) . fee_msat = new_entry. fee_msat ;
0 commit comments