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