@@ -3021,7 +3021,11 @@ pub struct ReconnectArgs<'a, 'b, 'c, 'd> {
3021
3021
pub node_a : & ' a Node < ' b , ' c , ' d > ,
3022
3022
pub node_b : & ' a Node < ' b , ' c , ' d > ,
3023
3023
pub send_channel_ready : ( bool , bool ) ,
3024
- pub pending_htlc_adds : ( i64 , i64 ) ,
3024
+ pub pending_responding_commitment_signed : ( bool , bool ) ,
3025
+ /// Indicates that the pending responding commitment signed will be a dup for the recipient,
3026
+ /// and no monitor update is expected
3027
+ pub pending_responding_commitment_signed_dup_monitor : ( bool , bool ) ,
3028
+ pub pending_htlc_adds : ( usize , usize ) ,
3025
3029
pub pending_htlc_claims : ( usize , usize ) ,
3026
3030
pub pending_htlc_fails : ( usize , usize ) ,
3027
3031
pub pending_cell_htlc_claims : ( usize , usize ) ,
@@ -3035,6 +3039,8 @@ impl<'a, 'b, 'c, 'd> ReconnectArgs<'a, 'b, 'c, 'd> {
3035
3039
node_a,
3036
3040
node_b,
3037
3041
send_channel_ready : ( false , false ) ,
3042
+ pending_responding_commitment_signed : ( false , false ) ,
3043
+ pending_responding_commitment_signed_dup_monitor : ( false , false ) ,
3038
3044
pending_htlc_adds : ( 0 , 0 ) ,
3039
3045
pending_htlc_claims : ( 0 , 0 ) ,
3040
3046
pending_htlc_fails : ( 0 , 0 ) ,
@@ -3050,7 +3056,8 @@ impl<'a, 'b, 'c, 'd> ReconnectArgs<'a, 'b, 'c, 'd> {
3050
3056
pub fn reconnect_nodes < ' a , ' b , ' c , ' d > ( args : ReconnectArgs < ' a , ' b , ' c , ' d > ) {
3051
3057
let ReconnectArgs {
3052
3058
node_a, node_b, send_channel_ready, pending_htlc_adds, pending_htlc_claims, pending_htlc_fails,
3053
- pending_cell_htlc_claims, pending_cell_htlc_fails, pending_raa
3059
+ pending_cell_htlc_claims, pending_cell_htlc_fails, pending_raa,
3060
+ pending_responding_commitment_signed, pending_responding_commitment_signed_dup_monitor,
3054
3061
} = args;
3055
3062
node_a. node . peer_connected ( & node_b. node . get_our_node_id ( ) , & msgs:: Init {
3056
3063
features : node_b. node . init_features ( ) , networks : None , remote_network_address : None
@@ -3135,13 +3142,12 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3135
3142
} else {
3136
3143
assert ! ( chan_msgs. 1 . is_none( ) ) ;
3137
3144
}
3138
- if pending_htlc_adds. 0 != 0 || pending_htlc_claims. 0 != 0 || pending_htlc_fails. 0 != 0 || pending_cell_htlc_claims. 0 != 0 || pending_cell_htlc_fails. 0 != 0 {
3145
+ if pending_htlc_adds. 0 != 0 || pending_htlc_claims. 0 != 0 || pending_htlc_fails. 0 != 0 ||
3146
+ pending_cell_htlc_claims. 0 != 0 || pending_cell_htlc_fails. 0 != 0 ||
3147
+ pending_responding_commitment_signed. 0
3148
+ {
3139
3149
let commitment_update = chan_msgs. 2 . unwrap ( ) ;
3140
- if pending_htlc_adds. 0 != -1 { // We use -1 to denote a response commitment_signed
3141
- assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 0 as usize ) ;
3142
- } else {
3143
- assert ! ( commitment_update. update_add_htlcs. is_empty( ) ) ;
3144
- }
3150
+ assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 0 ) ;
3145
3151
assert_eq ! ( commitment_update. update_fulfill_htlcs. len( ) , pending_htlc_claims. 0 + pending_cell_htlc_claims. 0 ) ;
3146
3152
assert_eq ! ( commitment_update. update_fail_htlcs. len( ) , pending_htlc_fails. 0 + pending_cell_htlc_fails. 0 ) ;
3147
3153
assert ! ( commitment_update. update_fail_malformed_htlcs. is_empty( ) ) ;
@@ -3155,7 +3161,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3155
3161
node_a. node . handle_update_fail_htlc ( & node_b. node . get_our_node_id ( ) , & update_fail) ;
3156
3162
}
3157
3163
3158
- if pending_htlc_adds . 0 != - 1 { // We use -1 to denote a response commitment_signed
3164
+ if !pending_responding_commitment_signed . 0 {
3159
3165
commitment_signed_dance ! ( node_a, node_b, commitment_update. commitment_signed, false ) ;
3160
3166
} else {
3161
3167
node_a. node . handle_commitment_signed ( & node_b. node . get_our_node_id ( ) , & commitment_update. commitment_signed ) ;
@@ -3164,7 +3170,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3164
3170
// No commitment_signed so get_event_msg's assert(len == 1) passes
3165
3171
node_b. node . handle_revoke_and_ack ( & node_a. node . get_our_node_id ( ) , & as_revoke_and_ack) ;
3166
3172
assert ! ( node_b. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3167
- check_added_monitors ! ( node_b, 1 ) ;
3173
+ check_added_monitors ! ( node_b, if pending_responding_commitment_signed_dup_monitor . 0 { 0 } else { 1 } ) ;
3168
3174
}
3169
3175
} else {
3170
3176
assert ! ( chan_msgs. 2 . is_none( ) ) ;
@@ -3194,11 +3200,12 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3194
3200
} else {
3195
3201
assert ! ( chan_msgs. 1 . is_none( ) ) ;
3196
3202
}
3197
- if pending_htlc_adds. 1 != 0 || pending_htlc_claims. 1 != 0 || pending_htlc_fails. 1 != 0 || pending_cell_htlc_claims. 1 != 0 || pending_cell_htlc_fails. 1 != 0 {
3203
+ if pending_htlc_adds. 1 != 0 || pending_htlc_claims. 1 != 0 || pending_htlc_fails. 1 != 0 ||
3204
+ pending_cell_htlc_claims. 1 != 0 || pending_cell_htlc_fails. 1 != 0 ||
3205
+ pending_responding_commitment_signed. 1
3206
+ {
3198
3207
let commitment_update = chan_msgs. 2 . unwrap ( ) ;
3199
- if pending_htlc_adds. 1 != -1 { // We use -1 to denote a response commitment_signed
3200
- assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 1 as usize ) ;
3201
- }
3208
+ assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 1 ) ;
3202
3209
assert_eq ! ( commitment_update. update_fulfill_htlcs. len( ) , pending_htlc_claims. 1 + pending_cell_htlc_claims. 1 ) ;
3203
3210
assert_eq ! ( commitment_update. update_fail_htlcs. len( ) , pending_htlc_fails. 1 + pending_cell_htlc_fails. 1 ) ;
3204
3211
assert ! ( commitment_update. update_fail_malformed_htlcs. is_empty( ) ) ;
@@ -3212,7 +3219,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3212
3219
node_b. node . handle_update_fail_htlc ( & node_a. node . get_our_node_id ( ) , & update_fail) ;
3213
3220
}
3214
3221
3215
- if pending_htlc_adds . 1 != - 1 { // We use -1 to denote a response commitment_signed
3222
+ if !pending_responding_commitment_signed . 1 {
3216
3223
commitment_signed_dance ! ( node_b, node_a, commitment_update. commitment_signed, false ) ;
3217
3224
} else {
3218
3225
node_b. node . handle_commitment_signed ( & node_a. node . get_our_node_id ( ) , & commitment_update. commitment_signed ) ;
@@ -3221,7 +3228,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3221
3228
// No commitment_signed so get_event_msg's assert(len == 1) passes
3222
3229
node_a. node . handle_revoke_and_ack ( & node_b. node . get_our_node_id ( ) , & bs_revoke_and_ack) ;
3223
3230
assert ! ( node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3224
- check_added_monitors ! ( node_a, 1 ) ;
3231
+ check_added_monitors ! ( node_a, if pending_responding_commitment_signed_dup_monitor . 1 { 0 } else { 1 } ) ;
3225
3232
}
3226
3233
} else {
3227
3234
assert ! ( chan_msgs. 2 . is_none( ) ) ;
0 commit comments