@@ -29,7 +29,8 @@ use std::sync::OnceLock;
29
29
30
30
use crate :: common:: {
31
31
distribute_funds_unconfirmed, expect_channel_pending_event, expect_channel_ready_event,
32
- expect_event, generate_blocks_and_wait, premine_blocks, random_config, wait_for_tx,
32
+ expect_event, expect_payment_successful_event, generate_blocks_and_wait, premine_blocks,
33
+ random_config, wait_for_tx,
33
34
} ;
34
35
35
36
pub trait ExternalLightningNode {
@@ -46,6 +47,14 @@ pub trait ExternalLightningNode {
46
47
fn create_new_address ( & mut self ) -> String ;
47
48
48
49
fn open_channel ( & mut self , node_id : PublicKey , funding_amount_sat : u64 ) ;
50
+
51
+ fn generate_offer ( & mut self , _amount_msat : Option < u64 > , _description : & str ) -> String {
52
+ panic ! ( "Not implemented" )
53
+ }
54
+
55
+ fn pay_offer ( & mut self , _offer : & str , _amount_msat : Option < u64 > ) -> String {
56
+ panic ! ( "Not implemented" )
57
+ }
49
58
}
50
59
51
60
static BITCOIND_CLIENT : OnceLock < BitcoindClient > = OnceLock :: new ( ) ;
@@ -309,3 +318,72 @@ pub(crate) fn do_external_node_opens_channel_simple_transactions_with_ldk<
309
318
310
319
node. stop ( ) . unwrap ( ) ;
311
320
}
321
+
322
+ pub ( crate ) fn do_bolt12_cycle_with_external_node < E : ExternalLightningNode > ( external_node : & mut E ) {
323
+ // Initialize LDK node and clients
324
+ let ( node, bitcoind_client, electrs_client) = setup_test_node ( true ) ;
325
+
326
+ // setup external node info
327
+ let ( external_node_id, external_node_address) = external_node. get_node_info ( ) ;
328
+
329
+ // Open the channel
330
+ add_onchain_funds ( & bitcoind_client, & electrs_client, & node) ;
331
+ let funding_amount_sat = 2_000_000 ;
332
+ let push_msat = Some ( 500_000_000 ) ;
333
+ let ( user_channel_id, funding_txo) = open_channel (
334
+ & bitcoind_client,
335
+ & electrs_client,
336
+ & node,
337
+ external_node_id,
338
+ external_node_address,
339
+ funding_amount_sat,
340
+ push_msat,
341
+ ) ;
342
+
343
+ // Send a payment to the external node, without specifying an amount
344
+ let mut payer_note = "without specifying an amount" ;
345
+ let offer_string = external_node. generate_offer ( None , payer_note) ;
346
+ let offer = offer:: Offer :: from_str ( & offer_string) . unwrap ( ) ;
347
+ let mut amount_msat = 100_000_000 ;
348
+ let payment_id = node
349
+ . bolt12_payment ( )
350
+ . send_using_amount ( & offer, amount_msat, None , Some ( payer_note. to_string ( ) ) )
351
+ . unwrap ( ) ;
352
+ expect_payment_successful_event ! ( node, Some ( payment_id) , None ) ;
353
+
354
+ // Send a payment to the external node, specifying an amount
355
+ amount_msat = 100_000_000 ;
356
+ payer_note = "specifying an amount" ;
357
+ let offer_string = external_node. generate_offer ( Some ( amount_msat) , payer_note) ;
358
+ let offer = offer:: Offer :: from_str ( & offer_string) . unwrap ( ) ;
359
+ let payment_id =
360
+ node. bolt12_payment ( ) . send ( & offer, None , Some ( payer_note. to_string ( ) ) ) . unwrap ( ) ;
361
+ expect_payment_successful_event ! ( node, Some ( payment_id) , None ) ;
362
+
363
+ // Send a payment to LDK, without specifying an amount
364
+ let offer = node. bolt12_payment ( ) . receive ( 0 , "" , None , None ) . unwrap ( ) ;
365
+ let offer_string: String = offer. to_string ( ) ;
366
+ let amount_msat = 9_000_000 ;
367
+ external_node. pay_offer ( & offer_string, Some ( amount_msat) ) ;
368
+ expect_event ! ( node, PaymentReceived ) ;
369
+
370
+ // Send a payment to LDK, specifying an amount
371
+ let offer = node. bolt12_payment ( ) . receive ( 0 , "" , None , None ) . unwrap ( ) ;
372
+ let offer_string: String = offer. to_string ( ) ;
373
+ let amount_msat = 9_000_000 ;
374
+ external_node. pay_offer ( & offer_string, Some ( amount_msat) ) ;
375
+ expect_event ! ( node, PaymentReceived ) ;
376
+
377
+ // Close the channel
378
+ close_channel (
379
+ & bitcoind_client,
380
+ & electrs_client,
381
+ external_node,
382
+ & node,
383
+ funding_txo,
384
+ external_node_id,
385
+ & user_channel_id,
386
+ None ,
387
+ ) ;
388
+ node. stop ( ) . unwrap ( ) ;
389
+ }
0 commit comments