@@ -8490,3 +8490,108 @@ fn test_htlc_no_detection() {
8490
8490
connect_blocks ( & nodes[ 0 ] , ANTI_REORG_DELAY - 1 , 201 , true , header_201. block_hash ( ) ) ;
8491
8491
expect_payment_failed ! ( nodes[ 0 ] , our_payment_hash, true ) ;
8492
8492
}
8493
+
8494
+ #[ test]
8495
+ fn test_unorderded_onchain_htlc_settlement ( ) {
8496
+ // A routing node must correctly claim an incoming HTLC for which the preimage has
8497
+ // been learnt on the offchain upstream channel after the downstream one has reached
8498
+ // the chain. HTLC settlement is ordered but not the underlying channel supporting
8499
+ // the payment path.
8500
+ //
8501
+ // 1) Alice send a HTLC to Caroll through Bob.
8502
+ // 2) Caroll doesn't settle the HTLC.
8503
+ // 3) Alice close her channel with Bob.
8504
+ // 4) Bob sees the Alice's commitment on his chain. An offered output is present but can't
8505
+ // be claimed as Bob doesn't have yet knowledge of the preimage.
8506
+ // 5) Caroll release offchain the preimage to Bob.
8507
+ // 6) Bob claims the offered output on Alice's commitment.
8508
+ // TODO: reverse the test with Bob's commitment reaching the chain instead of Alice's one.
8509
+
8510
+ let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
8511
+ let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
8512
+ let node_chanmgrs = create_node_chanmgrs ( 3 , & node_cfgs, & [ None , None , None ] ) ;
8513
+ let nodes = create_network ( 3 , & node_cfgs, & node_chanmgrs) ;
8514
+
8515
+ // Create some initial channels
8516
+ let chan_ab = create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 100000 , 10001 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
8517
+ create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 100000 , 10001 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
8518
+
8519
+ // Step 1) and Step 2), `route_payment` implicitly verify Caroll receives the HTLC
8520
+ let ( payment_preimage, _payment_hash) = route_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] , & nodes[ 2 ] ) , 3_000_000 ) ;
8521
+
8522
+ let alice_txn = get_local_commitment_txn ! ( nodes[ 0 ] , chan_ab. 2 ) ;
8523
+ check_spends ! ( alice_txn[ 0 ] , chan_ab. 3 ) ;
8524
+ assert_eq ! ( alice_txn[ 0 ] . output. len( ) , 2 ) ;
8525
+ check_spends ! ( alice_txn[ 1 ] , alice_txn[ 0 ] ) ; // 2nd transaction is a non-final HTLC-timeout
8526
+ assert_eq ! ( alice_txn[ 1 ] . input[ 0 ] . witness. last( ) . unwrap( ) . len( ) , OFFERED_HTLC_SCRIPT_WEIGHT ) ;
8527
+ assert_eq ! ( alice_txn. len( ) , 2 ) ;
8528
+
8529
+ // Step 3) and Step 4), verify that Bob updates his monitor, broadcast a close and didn't broadcast
8530
+ // yet transaction on Alice's commitment
8531
+ let header = BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
8532
+ connect_block ( & nodes[ 1 ] , & Block { header, txdata : vec ! [ alice_txn[ 0 ] . clone( ) ] } , 1 ) ;
8533
+ check_closed_broadcast ! ( nodes[ 1 ] , false ) ;
8534
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
8535
+ {
8536
+ let mut bob_txn = nodes[ 1 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ; // ChannelManager : 1 (commitment tx)
8537
+ assert_eq ! ( bob_txn. len( ) , 1 ) ;
8538
+ check_spends ! ( bob_txn[ 0 ] , chan_ab. 3 ) ;
8539
+ bob_txn. clear ( ) ;
8540
+ }
8541
+
8542
+ // Step 5)
8543
+ assert ! ( nodes[ 2 ] . node. claim_funds( payment_preimage, & None , 3_000_000 ) ) ;
8544
+ check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
8545
+ let caroll_updates = get_htlc_update_msgs ! ( nodes[ 2 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
8546
+ assert ! ( caroll_updates. update_add_htlcs. is_empty( ) ) ;
8547
+ assert ! ( caroll_updates. update_fail_htlcs. is_empty( ) ) ;
8548
+ assert ! ( caroll_updates. update_fail_malformed_htlcs. is_empty( ) ) ;
8549
+ assert ! ( caroll_updates. update_fee. is_none( ) ) ;
8550
+ assert_eq ! ( caroll_updates. update_fulfill_htlcs. len( ) , 1 ) ;
8551
+
8552
+ nodes[ 1 ] . node . handle_update_fulfill_htlc ( & nodes[ 2 ] . node . get_our_node_id ( ) , & caroll_updates. update_fulfill_htlcs [ 0 ] ) ;
8553
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 2 ] . node . get_our_node_id ( ) , & caroll_updates. commitment_signed ) ;
8554
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
8555
+
8556
+ let events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
8557
+ assert_eq ! ( events. len( ) , 2 ) ;
8558
+ let bob_revocation = match events[ 0 ] {
8559
+ MessageSendEvent :: SendRevokeAndACK { ref node_id, ref msg } => {
8560
+ assert_eq ! ( * node_id, nodes[ 2 ] . node. get_our_node_id( ) ) ;
8561
+ ( * msg) . clone ( )
8562
+ } ,
8563
+ _ => panic ! ( "Unexpected event" ) ,
8564
+ } ;
8565
+ let bob_updates = match events[ 1 ] {
8566
+ MessageSendEvent :: UpdateHTLCs { ref node_id, ref updates } => {
8567
+ assert_eq ! ( * node_id, nodes[ 2 ] . node. get_our_node_id( ) ) ;
8568
+ ( * updates) . clone ( )
8569
+ } ,
8570
+ _ => panic ! ( "Unexpected event" ) ,
8571
+ } ;
8572
+
8573
+ nodes[ 2 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bob_revocation) ;
8574
+ check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
8575
+ nodes[ 2 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bob_updates. commitment_signed ) ;
8576
+ check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
8577
+
8578
+ let events = nodes[ 2 ] . node . get_and_clear_pending_msg_events ( ) ;
8579
+ assert_eq ! ( events. len( ) , 1 ) ;
8580
+ let caroll_revocation = match events[ 0 ] {
8581
+ MessageSendEvent :: SendRevokeAndACK { ref node_id, ref msg } => {
8582
+ assert_eq ! ( * node_id, nodes[ 1 ] . node. get_our_node_id( ) ) ;
8583
+ ( * msg) . clone ( )
8584
+ } ,
8585
+ _ => panic ! ( "Unexpected event" ) ,
8586
+ } ;
8587
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 2 ] . node . get_our_node_id ( ) , & caroll_revocation) ;
8588
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
8589
+
8590
+ // Step 6), verify Bob broadcast a preimage transaction on Alice's commitment
8591
+ {
8592
+ let bob_txn = nodes[ 1 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) . clone ( ) ; // ChannelMonitor : 1 (htlc-preimage tx)
8593
+ assert_eq ! ( bob_txn. len( ) , 1 ) ;
8594
+ check_spends ! ( bob_txn[ 0 ] , alice_txn[ 0 ] ) ;
8595
+ assert_eq ! ( bob_txn[ 0 ] . input[ 0 ] . witness. last( ) . unwrap( ) . len( ) , OFFERED_HTLC_SCRIPT_WEIGHT ) ;
8596
+ }
8597
+ }
0 commit comments