@@ -219,12 +219,12 @@ fn extract_invoice_request<'a, 'b, 'c>(
219219	} 
220220} 
221221
222- fn  extract_invoice < ' a ,  ' b ,  ' c > ( node :  & Node < ' a ,  ' b ,  ' c > ,  message :  & OnionMessage )  -> ( Bolt12Invoice ,  Option < BlindedMessagePath > )  { 
222+ fn  extract_invoice < ' a ,  ' b ,  ' c > ( node :  & Node < ' a ,  ' b ,  ' c > ,  message :  & OnionMessage )  -> ( Bolt12Invoice ,  BlindedMessagePath )  { 
223223	match  node. onion_messenger . peel_onion_message ( message)  { 
224224		Ok ( PeeledOnion :: Receive ( message,  _,  reply_path) )  => match  message { 
225225			ParsedOnionMessageContents :: Offers ( offers_message)  => match  offers_message { 
226226				OffersMessage :: InvoiceRequest ( invoice_request)  => panic ! ( "Unexpected invoice_request: {:?}" ,  invoice_request) , 
227- 				OffersMessage :: Invoice ( invoice)  => ( invoice,  reply_path) , 
227+ 				OffersMessage :: Invoice ( invoice)  => ( invoice,  reply_path. unwrap ( ) ) , 
228228				#[ cfg( async_payments) ]  
229229				OffersMessage :: StaticInvoice ( invoice)  => panic ! ( "Unexpected static invoice: {:?}" ,  invoice) , 
230230				OffersMessage :: InvoiceError ( error)  => panic ! ( "Unexpected invoice_error: {:?}" ,  error) , 
@@ -508,15 +508,15 @@ fn creates_and_pays_for_offer_using_two_hop_blinded_path() {
508508	features. set_onion_messages_optional ( ) ; 
509509	features. set_route_blinding_optional ( ) ; 
510510
511- 	let  chanmon_cfgs = create_chanmon_cfgs ( 6 ) ; 
512- 	let  node_cfgs = create_node_cfgs ( 6 ,  & chanmon_cfgs) ; 
511+ 	let  chanmon_cfgs = create_chanmon_cfgs ( 7 ) ; 
512+ 	let  node_cfgs = create_node_cfgs ( 7 ,  & chanmon_cfgs) ; 
513513
514514	* node_cfgs[ 1 ] . override_init_features . borrow_mut ( )  = Some ( features) ; 
515515
516516	let  node_chanmgrs = create_node_chanmgrs ( 
517- 		6 ,  & node_cfgs,  & [ None ,  Some ( accept_forward_cfg) ,  None ,  None ,  None ,  None ] 
517+ 		7 ,  & node_cfgs,  & [ None ,  Some ( accept_forward_cfg) ,   None ,  None ,  None ,  None ,  None ] 
518518	) ; 
519- 	let  nodes = create_network ( 6 ,  & node_cfgs,  & node_chanmgrs) ; 
519+ 	let  nodes = create_network ( 7 ,  & node_cfgs,  & node_chanmgrs) ; 
520520
521521	create_unannounced_chan_between_nodes_with_value ( & nodes,  0 ,  1 ,  10_000_000 ,  1_000_000_000 ) ; 
522522	create_unannounced_chan_between_nodes_with_value ( & nodes,  2 ,  3 ,  10_000_000 ,  1_000_000_000 ) ; 
@@ -580,13 +580,22 @@ fn creates_and_pays_for_offer_using_two_hop_blinded_path() {
580580	let  onion_message = charlie. onion_messenger . next_onion_message_for_peer ( david_id) . unwrap ( ) ; 
581581	david. onion_messenger . handle_onion_message ( & charlie_id,  & onion_message) ; 
582582
583- 	let  ( invoice,  _ )  = extract_invoice ( david,  & onion_message) ; 
583+ 	let  ( invoice,  reply_path )  = extract_invoice ( david,  & onion_message) ; 
584584	assert_eq ! ( invoice. amount_msats( ) ,  10_000_000 ) ; 
585585	assert_ne ! ( invoice. signing_pubkey( ) ,  alice_id) ; 
586586	assert ! ( !invoice. payment_paths( ) . is_empty( ) ) ; 
587587	for  path in  invoice. payment_paths ( )  { 
588588		assert_eq ! ( path. introduction_node( ) ,  & IntroductionNode :: NodeId ( bob_id) ) ; 
589589	} 
590+ 	// Both Bob and Charlie have an equal number of channels and need to be connected 
591+ 	// to Alice when she's handling the message. Therefore, either Bob or Charlie could 
592+ 	// serve as the introduction node for the reply path back to Alice. 
593+ 	assert ! ( 
594+ 		matches!( 
595+ 			reply_path. introduction_node( ) , 
596+ 			& IntroductionNode :: NodeId ( node_id)  if  node_id == bob_id || node_id == charlie_id, 
597+ 		) 
598+ 	) ; 
590599
591600	route_bolt12_payment ( david,  & [ charlie,  bob,  alice] ,  & invoice) ; 
592601	expect_recent_payment ! ( david,  RecentPaymentDetails :: Pending ,  payment_id) ; 
@@ -659,7 +668,7 @@ fn creates_and_pays_for_refund_using_two_hop_blinded_path() {
659668	let  onion_message = charlie. onion_messenger . next_onion_message_for_peer ( david_id) . unwrap ( ) ; 
660669	david. onion_messenger . handle_onion_message ( & charlie_id,  & onion_message) ; 
661670
662- 	let  ( invoice,  _ )  = extract_invoice ( david,  & onion_message) ; 
671+ 	let  ( invoice,  reply_path )  = extract_invoice ( david,  & onion_message) ; 
663672	assert_eq ! ( invoice,  expected_invoice) ; 
664673
665674	assert_eq ! ( invoice. amount_msats( ) ,  10_000_000 ) ; 
@@ -668,6 +677,8 @@ fn creates_and_pays_for_refund_using_two_hop_blinded_path() {
668677	for  path in  invoice. payment_paths ( )  { 
669678		assert_eq ! ( path. introduction_node( ) ,  & IntroductionNode :: NodeId ( bob_id) ) ; 
670679	} 
680+ 	assert_eq ! ( reply_path. introduction_node( ) ,  & IntroductionNode :: NodeId ( bob_id) ) ; 
681+ 
671682
672683	route_bolt12_payment ( david,  & [ charlie,  bob,  alice] ,  & invoice) ; 
673684	expect_recent_payment ! ( david,  RecentPaymentDetails :: Pending ,  payment_id) ; 
@@ -726,13 +737,14 @@ fn creates_and_pays_for_offer_using_one_hop_blinded_path() {
726737	let  onion_message = alice. onion_messenger . next_onion_message_for_peer ( bob_id) . unwrap ( ) ; 
727738	bob. onion_messenger . handle_onion_message ( & alice_id,  & onion_message) ; 
728739
729- 	let  ( invoice,  _ )  = extract_invoice ( bob,  & onion_message) ; 
740+ 	let  ( invoice,  reply_path )  = extract_invoice ( bob,  & onion_message) ; 
730741	assert_eq ! ( invoice. amount_msats( ) ,  10_000_000 ) ; 
731742	assert_ne ! ( invoice. signing_pubkey( ) ,  alice_id) ; 
732743	assert ! ( !invoice. payment_paths( ) . is_empty( ) ) ; 
733744	for  path in  invoice. payment_paths ( )  { 
734745		assert_eq ! ( path. introduction_node( ) ,  & IntroductionNode :: NodeId ( alice_id) ) ; 
735746	} 
747+ 	assert_eq ! ( reply_path. introduction_node( ) ,  & IntroductionNode :: NodeId ( alice_id) ) ; 
736748
737749	route_bolt12_payment ( bob,  & [ alice] ,  & invoice) ; 
738750	expect_recent_payment ! ( bob,  RecentPaymentDetails :: Pending ,  payment_id) ; 
@@ -779,7 +791,7 @@ fn creates_and_pays_for_refund_using_one_hop_blinded_path() {
779791	let  onion_message = alice. onion_messenger . next_onion_message_for_peer ( bob_id) . unwrap ( ) ; 
780792	bob. onion_messenger . handle_onion_message ( & alice_id,  & onion_message) ; 
781793
782- 	let  ( invoice,  _ )  = extract_invoice ( bob,  & onion_message) ; 
794+ 	let  ( invoice,  reply_path )  = extract_invoice ( bob,  & onion_message) ; 
783795	assert_eq ! ( invoice,  expected_invoice) ; 
784796
785797	assert_eq ! ( invoice. amount_msats( ) ,  10_000_000 ) ; 
@@ -788,6 +800,7 @@ fn creates_and_pays_for_refund_using_one_hop_blinded_path() {
788800	for  path in  invoice. payment_paths ( )  { 
789801		assert_eq ! ( path. introduction_node( ) ,  & IntroductionNode :: NodeId ( alice_id) ) ; 
790802	} 
803+ 	assert_eq ! ( reply_path. introduction_node( ) ,  & IntroductionNode :: NodeId ( alice_id) ) ; 
791804
792805	route_bolt12_payment ( bob,  & [ alice] ,  & invoice) ; 
793806	expect_recent_payment ! ( bob,  RecentPaymentDetails :: Pending ,  payment_id) ; 
@@ -1044,7 +1057,7 @@ fn send_invoice_for_refund_with_distinct_reply_path() {
10441057	let  onion_message = bob. onion_messenger . next_onion_message_for_peer ( alice_id) . unwrap ( ) ; 
10451058
10461059	let  ( _,  reply_path)  = extract_invoice ( alice,  & onion_message) ; 
1047- 	assert_eq ! ( reply_path. unwrap ( ) . introduction_node( ) ,  & IntroductionNode :: NodeId ( charlie_id) ) ; 
1060+ 	assert_eq ! ( reply_path. introduction_node( ) ,  & IntroductionNode :: NodeId ( charlie_id) ) ; 
10481061
10491062	// Send, extract and verify the second Invoice Request message 
10501063	let  onion_message = david. onion_messenger . next_onion_message_for_peer ( bob_id) . unwrap ( ) ; 
@@ -1053,7 +1066,7 @@ fn send_invoice_for_refund_with_distinct_reply_path() {
10531066	let  onion_message = bob. onion_messenger . next_onion_message_for_peer ( alice_id) . unwrap ( ) ; 
10541067
10551068	let  ( _,  reply_path)  = extract_invoice ( alice,  & onion_message) ; 
1056- 	assert_eq ! ( reply_path. unwrap ( ) . introduction_node( ) ,  & IntroductionNode :: NodeId ( nodes[ 6 ] . node. get_our_node_id( ) ) ) ; 
1069+ 	assert_eq ! ( reply_path. introduction_node( ) ,  & IntroductionNode :: NodeId ( nodes[ 6 ] . node. get_our_node_id( ) ) ) ; 
10571070} 
10581071
10591072/// Checks that a deferred invoice can be paid asynchronously from an Event::InvoiceReceived. 
@@ -1190,12 +1203,13 @@ fn creates_offer_with_blinded_path_using_unannounced_introduction_node() {
11901203	let  onion_message = alice. onion_messenger . next_onion_message_for_peer ( bob_id) . unwrap ( ) ; 
11911204	bob. onion_messenger . handle_onion_message ( & alice_id,  & onion_message) ; 
11921205
1193- 	let  ( invoice,  _ )  = extract_invoice ( bob,  & onion_message) ; 
1206+ 	let  ( invoice,  reply_path )  = extract_invoice ( bob,  & onion_message) ; 
11941207	assert_ne ! ( invoice. signing_pubkey( ) ,  alice_id) ; 
11951208	assert ! ( !invoice. payment_paths( ) . is_empty( ) ) ; 
11961209	for  path in  invoice. payment_paths ( )  { 
11971210		assert_eq ! ( path. introduction_node( ) ,  & IntroductionNode :: NodeId ( bob_id) ) ; 
11981211	} 
1212+ 	assert_eq ! ( reply_path. introduction_node( ) ,  & IntroductionNode :: NodeId ( bob_id) ) ; 
11991213
12001214	route_bolt12_payment ( bob,  & [ alice] ,  & invoice) ; 
12011215	expect_recent_payment ! ( bob,  RecentPaymentDetails :: Pending ,  payment_id) ; 
@@ -1239,7 +1253,7 @@ fn creates_refund_with_blinded_path_using_unannounced_introduction_node() {
12391253
12401254	let  onion_message = alice. onion_messenger . next_onion_message_for_peer ( bob_id) . unwrap ( ) ; 
12411255
1242- 	let  ( invoice,  _ )  = extract_invoice ( bob,  & onion_message) ; 
1256+ 	let  ( invoice,  _reply_path )  = extract_invoice ( bob,  & onion_message) ; 
12431257	assert_eq ! ( invoice,  expected_invoice) ; 
12441258	assert_ne ! ( invoice. signing_pubkey( ) ,  alice_id) ; 
12451259	assert ! ( !invoice. payment_paths( ) . is_empty( ) ) ; 
0 commit comments