@@ -2580,7 +2580,7 @@ fn no_double_pay_with_stale_channelmanager() {
25802580
25812581#[ test]
25822582fn creates_and_pays_for_phantom_offer ( ) {
2583- // XXX: share expanded key
2583+ // Tests that we can pay a "phantom offer" to any participating node.
25842584 let mut chanmon_cfgs = create_chanmon_cfgs ( 1 ) ;
25852585 chanmon_cfgs. append ( & mut create_phantom_chanmon_cfgs ( 2 ) ) ;
25862586 let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
@@ -2618,70 +2618,51 @@ fn creates_and_pays_for_phantom_offer() {
26182618 assert_eq ! ( b_path_count, 1 ) ;
26192619 assert_eq ! ( c_path_count, 1 ) ;
26202620
2621- // First, pay via node B
2622- let payment_id = PaymentId ( [ 1 ; 32 ] ) ;
2623- nodes[ 0 ] . node . pay_for_offer ( & offer, None , payment_id, Default :: default ( ) ) . unwrap ( ) ;
2624- expect_recent_payment ! ( nodes[ 0 ] , RecentPaymentDetails :: AwaitingInvoice , payment_id) ;
2625-
2626- let onion_message = nodes[ 0 ] . onion_messenger . next_onion_message_for_peer ( node_b_id) . unwrap ( ) ;
2627- let _discard = nodes[ 0 ] . onion_messenger . next_onion_message_for_peer ( node_c_id) . unwrap ( ) ;
2628- nodes[ 1 ] . onion_messenger . handle_onion_message ( node_a_id, & onion_message) ;
2629-
2630- let ( invoice_request, _) = extract_invoice_request ( & nodes[ 1 ] , & onion_message) ;
2631- let payment_context = PaymentContext :: Bolt12Offer ( Bolt12OfferContext {
2632- offer_id : offer. id ( ) ,
2633- invoice_request : InvoiceRequestFields {
2634- payer_signing_pubkey : invoice_request. payer_signing_pubkey ( ) ,
2635- quantity : None ,
2636- payer_note_truncated : None ,
2637- human_readable_name : None ,
2638- } ,
2639- } ) ;
2640-
2641- let onion_message = nodes[ 1 ] . onion_messenger . next_onion_message_for_peer ( node_a_id) . unwrap ( ) ;
2642- nodes[ 0 ] . onion_messenger . handle_onion_message ( node_b_id, & onion_message) ;
2643-
2644- let ( invoice, _) = extract_invoice ( & nodes[ 0 ] , & onion_message) ;
2645- assert_eq ! ( invoice. amount_msats( ) , 10_000_000 ) ;
2646-
2647- route_bolt12_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , & invoice) ;
2648- expect_recent_payment ! ( & nodes[ 0 ] , RecentPaymentDetails :: Pending , payment_id) ;
2649-
2650- claim_bolt12_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_context, & invoice) ;
2651- expect_recent_payment ! ( & nodes[ 0 ] , RecentPaymentDetails :: Fulfilled , payment_id) ;
2652-
2653- // Then pay again via node C
2654- assert ! ( nodes[ 0 ] . onion_messenger. next_onion_message_for_peer( node_b_id) . is_none( ) ) ;
2655- assert ! ( nodes[ 0 ] . onion_messenger. next_onion_message_for_peer( node_c_id) . is_none( ) ) ;
2656-
2657- let payment_id = PaymentId ( [ 2 ; 32 ] ) ;
2658- nodes[ 0 ] . node . pay_for_offer ( & offer, None , payment_id, Default :: default ( ) ) . unwrap ( ) ;
2659- expect_recent_payment ! ( nodes[ 0 ] , RecentPaymentDetails :: AwaitingInvoice , payment_id) ;
2660-
2661- let onion_message = nodes[ 0 ] . onion_messenger . next_onion_message_for_peer ( node_c_id) . unwrap ( ) ;
2662- let _discard = nodes[ 0 ] . onion_messenger . next_onion_message_for_peer ( node_b_id) . unwrap ( ) ;
2663- nodes[ 2 ] . onion_messenger . handle_onion_message ( node_a_id, & onion_message) ;
2664-
2665- let ( invoice_request, _) = extract_invoice_request ( & nodes[ 2 ] , & onion_message) ;
2666- let payment_context = PaymentContext :: Bolt12Offer ( Bolt12OfferContext {
2667- offer_id : offer. id ( ) ,
2668- invoice_request : InvoiceRequestFields {
2669- payer_signing_pubkey : invoice_request. payer_signing_pubkey ( ) ,
2670- quantity : None ,
2671- payer_note_truncated : None ,
2672- human_readable_name : None ,
2673- } ,
2674- } ) ;
2675-
2676- let onion_message = nodes[ 2 ] . onion_messenger . next_onion_message_for_peer ( node_a_id) . unwrap ( ) ;
2677- nodes[ 0 ] . onion_messenger . handle_onion_message ( node_c_id, & onion_message) ;
2678-
2679- let ( invoice, _) = extract_invoice ( & nodes[ 0 ] , & onion_message) ;
2680- assert_eq ! ( invoice. amount_msats( ) , 10_000_000 ) ;
2681-
2682- route_bolt12_payment ( & nodes[ 0 ] , & [ & nodes[ 2 ] ] , & invoice) ;
2683- expect_recent_payment ! ( & nodes[ 0 ] , RecentPaymentDetails :: Pending , payment_id) ;
2684-
2685- claim_bolt12_payment ( & nodes[ 0 ] , & [ & nodes[ 2 ] ] , payment_context, & invoice) ;
2686- expect_recent_payment ! ( & nodes[ 0 ] , RecentPaymentDetails :: Fulfilled , payment_id) ;
2621+ // Pay twice, first via node B (the node that actually built the offer) then pay via node C
2622+ // (which won't have seen the offer until it receives the invoice_request).
2623+ for ( payment_id, recipient) in [ ( [ 1 ; 32 ] , & nodes[ 1 ] ) , ( [ 2 ; 32 ] , & nodes[ 2 ] ) ] {
2624+ let payment_id = PaymentId ( payment_id) ;
2625+ nodes[ 0 ] . node . pay_for_offer ( & offer, None , payment_id, Default :: default ( ) ) . unwrap ( ) ;
2626+ expect_recent_payment ! ( nodes[ 0 ] , RecentPaymentDetails :: AwaitingInvoice , payment_id) ;
2627+
2628+ let recipient_id = recipient. node . get_our_node_id ( ) ;
2629+ let non_recipient_id = if node_b_id == recipient_id {
2630+ node_c_id
2631+ } else {
2632+ node_b_id
2633+ } ;
2634+
2635+ let onion_message =
2636+ nodes[ 0 ] . onion_messenger . next_onion_message_for_peer ( recipient_id) . unwrap ( ) ;
2637+ let _discard =
2638+ nodes[ 0 ] . onion_messenger . next_onion_message_for_peer ( non_recipient_id) . unwrap ( ) ;
2639+ recipient. onion_messenger . handle_onion_message ( node_a_id, & onion_message) ;
2640+
2641+ let ( invoice_request, _) = extract_invoice_request ( & recipient, & onion_message) ;
2642+ let payment_context = PaymentContext :: Bolt12Offer ( Bolt12OfferContext {
2643+ offer_id : offer. id ( ) ,
2644+ invoice_request : InvoiceRequestFields {
2645+ payer_signing_pubkey : invoice_request. payer_signing_pubkey ( ) ,
2646+ quantity : None ,
2647+ payer_note_truncated : None ,
2648+ human_readable_name : None ,
2649+ } ,
2650+ } ) ;
2651+
2652+ let onion_message =
2653+ recipient. onion_messenger . next_onion_message_for_peer ( node_a_id) . unwrap ( ) ;
2654+ nodes[ 0 ] . onion_messenger . handle_onion_message ( recipient_id, & onion_message) ;
2655+
2656+ let ( invoice, _) = extract_invoice ( & nodes[ 0 ] , & onion_message) ;
2657+ assert_eq ! ( invoice. amount_msats( ) , 10_000_000 ) ;
2658+
2659+ route_bolt12_payment ( & nodes[ 0 ] , & [ recipient] , & invoice) ;
2660+ expect_recent_payment ! ( & nodes[ 0 ] , RecentPaymentDetails :: Pending , payment_id) ;
2661+
2662+ claim_bolt12_payment ( & nodes[ 0 ] , & [ recipient] , payment_context, & invoice) ;
2663+ expect_recent_payment ! ( & nodes[ 0 ] , RecentPaymentDetails :: Fulfilled , payment_id) ;
2664+
2665+ assert ! ( nodes[ 0 ] . onion_messenger. next_onion_message_for_peer( node_b_id) . is_none( ) ) ;
2666+ assert ! ( nodes[ 0 ] . onion_messenger. next_onion_message_for_peer( node_c_id) . is_none( ) ) ;
2667+ }
26872668}
0 commit comments