@@ -241,7 +241,7 @@ where
241
241
for PhantomRouteHints { channels, phantom_scid, real_node_pubkey } in phantom_route_hints {
242
242
log_trace ! ( logger, "Generating phantom route hints for node {}" ,
243
243
log_pubkey!( real_node_pubkey) ) ;
244
- let mut route_hints = sort_and_filter_channels ( channels, amt_msat, & logger) ;
244
+ let mut route_hints: Vec < RouteHint > = sort_and_filter_channels ( channels, amt_msat, & logger) . collect ( ) ;
245
245
246
246
// If we have any public channel, the route hints from `sort_and_filter_channels` will be
247
247
// empty. In that case we create a RouteHint on which we will push a single hop with the
@@ -270,36 +270,36 @@ where
270
270
// the hints across our real nodes we add one hint from each in turn until no node has any hints
271
271
// left (if one node has more hints than any other, these will accumulate at the end of the
272
272
// vector).
273
- rotate_nested_vectors ( phantom_hints)
273
+ rotate_nested_vectors ( phantom_hints)
274
274
275
275
}
276
276
277
277
// Draw items iteratively from multiple nested vectors. The items are retrieved by index and
278
278
// rotates through the vectors - first the zero index then the first index then second index, etc.
279
279
fn rotate_nested_vectors < T : Clone > ( vecs : Vec < Vec < T > > ) -> impl Iterator < Item = T > {
280
- let max_vector_length: usize = vecs. iter ( ) . map ( |x| x. len ( ) ) . max ( ) . unwrap ( ) ;
281
- let mut hint_index = 0 ;
282
- let mut vector_index = 0 ;
283
- let number_inner_vectors: usize = vecs. len ( ) ;
284
-
285
- core:: iter:: from_fn ( move || loop {
286
- if hint_index == max_vector_length {
287
- return None ;
288
- } ;
289
- let hint_value = if vecs[ vector_index] . len ( ) != 0 && vecs[ vector_index] . len ( ) > hint_index {
290
- Some ( vecs[ vector_index] [ hint_index] . clone ( ) )
291
- } else {
292
- None // no value retrieved - continue looping
293
- } ;
294
- vector_index += 1 ;
295
- if hint_index < max_vector_length && vector_index == number_inner_vectors {
296
- vector_index = 0 ;
297
- hint_index += 1 ;
298
- } ;
299
- if !hint_value. is_none ( ) {
300
- return hint_value;
301
- } ;
302
- } )
280
+ let max_vector_length: usize = vecs. iter ( ) . map ( |x| x. len ( ) ) . max ( ) . unwrap ( ) ;
281
+ let mut hint_index = 0 ;
282
+ let mut vector_index = 0 ;
283
+ let number_inner_vectors: usize = vecs. len ( ) ;
284
+
285
+ core:: iter:: from_fn ( move || loop {
286
+ if hint_index == max_vector_length {
287
+ return None ;
288
+ } ;
289
+ let hint_value = if vecs[ vector_index] . len ( ) != 0 && vecs[ vector_index] . len ( ) > hint_index {
290
+ Some ( vecs[ vector_index] [ hint_index] . clone ( ) )
291
+ } else {
292
+ None // no value retrieved - continue looping
293
+ } ;
294
+ vector_index += 1 ;
295
+ if hint_index < max_vector_length && vector_index == number_inner_vectors {
296
+ vector_index = 0 ;
297
+ hint_index += 1 ;
298
+ } ;
299
+ if !hint_value. is_none ( ) {
300
+ return hint_value;
301
+ } ;
302
+ } )
303
303
}
304
304
305
305
#[ cfg( feature = "std" ) ]
@@ -585,15 +585,34 @@ fn _create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_has
585
585
/// * Sorted by lowest inbound capacity if an online channel with the minimum amount requested exists,
586
586
/// otherwise sort by highest inbound capacity to give the payment the best chance of succeeding.
587
587
fn sort_and_filter_channels < L : Deref > (
588
- channels : Vec < ChannelDetails > , min_inbound_capacity_msat : Option < u64 > , logger : & L
589
- ) -> Vec < RouteHint > where L :: Target : Logger {
588
+ channels : Vec < ChannelDetails > ,
589
+ min_inbound_capacity_msat : Option < u64 > ,
590
+ logger : & L ,
591
+ ) -> impl Iterator < Item = RouteHint >
592
+ where
593
+ L :: Target : Logger ,
594
+ {
590
595
let mut filtered_channels: HashMap < PublicKey , ChannelDetails > = HashMap :: new ( ) ;
591
596
let min_inbound_capacity = min_inbound_capacity_msat. unwrap_or ( 0 ) ;
592
597
let mut min_capacity_channel_exists = false ;
593
598
let mut online_channel_exists = false ;
594
599
let mut online_min_capacity_channel_exists = false ;
595
600
let mut has_pub_unconf_chan = false ;
596
601
602
+ let route_hint_from_channel = |channel : ChannelDetails | {
603
+ let forwarding_info = channel. counterparty . forwarding_info . as_ref ( ) . unwrap ( ) ;
604
+ RouteHint ( vec ! [ RouteHintHop {
605
+ src_node_id: channel. counterparty. node_id,
606
+ short_channel_id: channel. get_inbound_payment_scid( ) . unwrap( ) ,
607
+ fees: RoutingFees {
608
+ base_msat: forwarding_info. fee_base_msat,
609
+ proportional_millionths: forwarding_info. fee_proportional_millionths,
610
+ } ,
611
+ cltv_expiry_delta: forwarding_info. cltv_expiry_delta,
612
+ htlc_minimum_msat: channel. inbound_htlc_minimum_msat,
613
+ htlc_maximum_msat: channel. inbound_htlc_maximum_msat, } ] )
614
+ } ;
615
+
597
616
log_trace ! ( logger, "Considering {} channels for invoice route hints" , channels. len( ) ) ;
598
617
for channel in channels. into_iter ( ) . filter ( |chan| chan. is_channel_ready ) {
599
618
if channel. get_inbound_payment_scid ( ) . is_none ( ) || channel. counterparty . forwarding_info . is_none ( ) {
@@ -612,7 +631,7 @@ fn sort_and_filter_channels<L: Deref>(
612
631
// look at the public channels instead.
613
632
log_trace ! ( logger, "Not including channels in invoice route hints on account of public channel {}" ,
614
633
log_bytes!( channel. channel_id) ) ;
615
- return vec ! [ ]
634
+ return vec ! [ ] . into_iter ( ) . take ( 3 ) . map ( route_hint_from_channel ) ;
616
635
}
617
636
}
618
637
@@ -672,19 +691,6 @@ fn sort_and_filter_channels<L: Deref>(
672
691
}
673
692
}
674
693
675
- let route_hint_from_channel = |channel : ChannelDetails | {
676
- let forwarding_info = channel. counterparty . forwarding_info . as_ref ( ) . unwrap ( ) ;
677
- RouteHint ( vec ! [ RouteHintHop {
678
- src_node_id: channel. counterparty. node_id,
679
- short_channel_id: channel. get_inbound_payment_scid( ) . unwrap( ) ,
680
- fees: RoutingFees {
681
- base_msat: forwarding_info. fee_base_msat,
682
- proportional_millionths: forwarding_info. fee_proportional_millionths,
683
- } ,
684
- cltv_expiry_delta: forwarding_info. cltv_expiry_delta,
685
- htlc_minimum_msat: channel. inbound_htlc_minimum_msat,
686
- htlc_maximum_msat: channel. inbound_htlc_maximum_msat, } ] )
687
- } ;
688
694
// If all channels are private, prefer to return route hints which have a higher capacity than
689
695
// the payment value and where we're currently connected to the channel counterparty.
690
696
// Even if we cannot satisfy both goals, always ensure we include *some* hints, preferring
@@ -734,7 +740,8 @@ fn sort_and_filter_channels<L: Deref>(
734
740
} else {
735
741
b. inbound_capacity_msat . cmp ( & a. inbound_capacity_msat )
736
742
} } ) ;
737
- eligible_channels. into_iter ( ) . take ( 3 ) . map ( route_hint_from_channel) . collect :: < Vec < RouteHint > > ( )
743
+
744
+ eligible_channels. into_iter ( ) . take ( 3 ) . map ( route_hint_from_channel)
738
745
}
739
746
740
747
/// prefer_current_channel chooses a channel to use for route hints between a currently selected and candidate
@@ -1898,110 +1905,110 @@ mod test {
1898
1905
}
1899
1906
1900
1907
1901
- #[ test]
1902
- fn test_zip_nested_vectors ( ) {
1908
+ #[ test]
1909
+ fn test_zip_nested_vectors ( ) {
1903
1910
// two nested vectors
1904
- let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" , "b1" ] ] ;
1905
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1911
+ let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" , "b1" ] ] ;
1912
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1906
1913
1907
- let expected = vec ! [ "a0" , "a1" , "b0" , "b1" , "c0" ] ;
1908
- assert_eq ! ( expected, result) ;
1914
+ let expected = vec ! [ "a0" , "a1" , "b0" , "b1" , "c0" ] ;
1915
+ assert_eq ! ( expected, result) ;
1909
1916
1910
- // test single nested vector
1911
- let a = vec ! [ vec![ "a0" , "b0" , "c0" ] ] ;
1912
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1917
+ // test single nested vector
1918
+ let a = vec ! [ vec![ "a0" , "b0" , "c0" ] ] ;
1919
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1913
1920
1914
- let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1915
- assert_eq ! ( expected, result) ;
1921
+ let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1922
+ assert_eq ! ( expected, result) ;
1916
1923
1917
- // test second vector with only one element
1918
- let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" ] ] ;
1919
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1924
+ // test second vector with only one element
1925
+ let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" ] ] ;
1926
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1920
1927
1921
- let expected = vec ! [ "a0" , "a1" , "b0" , "c0" ] ;
1922
- assert_eq ! ( expected, result) ;
1928
+ let expected = vec ! [ "a0" , "a1" , "b0" , "c0" ] ;
1929
+ assert_eq ! ( expected, result) ;
1923
1930
1924
- // test three nestend vectors
1925
- let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" , "c1" ] , vec![ "a2" ] ] ;
1926
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1931
+ // test three nestend vectors
1932
+ let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" , "c1" ] , vec![ "a2" ] ] ;
1933
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1927
1934
1928
- let expected = vec ! [ "a0" , "a1" , "a2" , "b1" , "c1" ] ;
1929
- assert_eq ! ( expected, result) ;
1935
+ let expected = vec ! [ "a0" , "a1" , "a2" , "b1" , "c1" ] ;
1936
+ assert_eq ! ( expected, result) ;
1930
1937
1931
- // test single nested vector with a single value
1932
- let a = vec ! [ vec![ "a0" ] ] ;
1933
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1938
+ // test single nested vector with a single value
1939
+ let a = vec ! [ vec![ "a0" ] ] ;
1940
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1934
1941
1935
- let expected = vec ! [ "a0" ] ;
1936
- assert_eq ! ( expected, result) ;
1942
+ let expected = vec ! [ "a0" ] ;
1943
+ assert_eq ! ( expected, result) ;
1937
1944
1938
- // test single empty nested vector
1939
- let a: Vec < Vec < & str > > = vec ! [ vec![ ] ] ;
1940
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1941
- let expected: Vec < & str > = vec ! [ ] ;
1945
+ // test single empty nested vector
1946
+ let a: Vec < Vec < & str > > = vec ! [ vec![ ] ] ;
1947
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1948
+ let expected: Vec < & str > = vec ! [ ] ;
1942
1949
1943
- assert_eq ! ( expected, result) ;
1950
+ assert_eq ! ( expected, result) ;
1944
1951
1945
- // test first nested vector is empty
1946
- let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] ] ;
1947
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1952
+ // test first nested vector is empty
1953
+ let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] ] ;
1954
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1948
1955
1949
- let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1950
- assert_eq ! ( expected, result) ;
1956
+ let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1957
+ assert_eq ! ( expected, result) ;
1951
1958
1952
- // test two empty vectors
1953
- let a: Vec < Vec < & str > > = vec ! [ vec![ ] , vec![ ] ] ;
1954
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1959
+ // test two empty vectors
1960
+ let a: Vec < Vec < & str > > = vec ! [ vec![ ] , vec![ ] ] ;
1961
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1955
1962
1956
- let expected: Vec < & str > = vec ! [ ] ;
1957
- assert_eq ! ( expected, result) ;
1963
+ let expected: Vec < & str > = vec ! [ ] ;
1964
+ assert_eq ! ( expected, result) ;
1958
1965
1959
- // test an empty vector amongst other filled vectors
1960
- let a = vec ! [
1961
- vec![ "a0" , "b0" , "c0" ] ,
1962
- vec![ ] ,
1963
- vec![ "a1" , "b1" , "c1" ] ,
1964
- vec![ "a2" , "b2" , "c2" ] ,
1965
- ] ;
1966
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1966
+ // test an empty vector amongst other filled vectors
1967
+ let a = vec ! [
1968
+ vec![ "a0" , "b0" , "c0" ] ,
1969
+ vec![ ] ,
1970
+ vec![ "a1" , "b1" , "c1" ] ,
1971
+ vec![ "a2" , "b2" , "c2" ] ,
1972
+ ] ;
1973
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1967
1974
1968
- let expected = vec ! [ "a0" , "a1" , "a2" , "b0" , "b1" , "b2" , "c0" , "c1" , "c2" ] ;
1969
- assert_eq ! ( expected, result) ;
1975
+ let expected = vec ! [ "a0" , "a1" , "a2" , "b0" , "b1" , "b2" , "c0" , "c1" , "c2" ] ;
1976
+ assert_eq ! ( expected, result) ;
1970
1977
1971
- // test a filled vector between two empty vectors
1972
- let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] , vec![ ] ] ;
1973
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1978
+ // test a filled vector between two empty vectors
1979
+ let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] , vec![ ] ] ;
1980
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1974
1981
1975
- let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1976
- assert_eq ! ( expected, result) ;
1982
+ let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1983
+ assert_eq ! ( expected, result) ;
1977
1984
1978
- // test an empty vector at the end of the vectors
1979
- let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ ] ] ;
1980
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1985
+ // test an empty vector at the end of the vectors
1986
+ let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ ] ] ;
1987
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1981
1988
1982
- let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1983
- assert_eq ! ( expected, result) ;
1989
+ let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1990
+ assert_eq ! ( expected, result) ;
1984
1991
1985
- // test multiple empty vectors amongst multiple filled vectors
1986
- let a = vec ! [
1987
- vec![ ] ,
1988
- vec![ "a1" , "b1" , "c1" ] ,
1989
- vec![ ] ,
1990
- vec![ "a3" , "b3" ] ,
1991
- vec![ ] ,
1992
- ] ;
1992
+ // test multiple empty vectors amongst multiple filled vectors
1993
+ let a = vec ! [
1994
+ vec![ ] ,
1995
+ vec![ "a1" , "b1" , "c1" ] ,
1996
+ vec![ ] ,
1997
+ vec![ "a3" , "b3" ] ,
1998
+ vec![ ] ,
1999
+ ] ;
1993
2000
1994
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
2001
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1995
2002
1996
- let expected = vec ! [ "a1" , "a3" , "b1" , "b3" , "c1" ] ;
1997
- assert_eq ! ( expected, result) ;
2003
+ let expected = vec ! [ "a1" , "a3" , "b1" , "b3" , "c1" ] ;
2004
+ assert_eq ! ( expected, result) ;
1998
2005
1999
- // test one element in the first nested vectore and two elements in the second nested
2000
- // vector
2001
- let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" ] ] ;
2002
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
2006
+ // test one element in the first nested vectore and two elements in the second nested
2007
+ // vector
2008
+ let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" ] ] ;
2009
+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
2003
2010
2004
- let expected = vec ! [ "a0" , "a1" , "b1" ] ;
2005
- assert_eq ! ( expected, result) ;
2006
- }
2011
+ let expected = vec ! [ "a0" , "a1" , "b1" ] ;
2012
+ assert_eq ! ( expected, result) ;
2013
+ }
2007
2014
}
0 commit comments