@@ -3050,7 +3050,11 @@ pub struct ReconnectArgs<'a, 'b, 'c, 'd> {
3050
3050
pub node_a : & ' a Node < ' b , ' c , ' d > ,
3051
3051
pub node_b : & ' a Node < ' b , ' c , ' d > ,
3052
3052
pub send_channel_ready : ( bool , bool ) ,
3053
- pub pending_htlc_adds : ( i64 , i64 ) ,
3053
+ pub pending_responding_commitment_signed : ( bool , bool ) ,
3054
+ /// Indicates that the pending responding commitment signed will be a dup for the recipient,
3055
+ /// and no monitor update is expected
3056
+ pub pending_responding_commitment_signed_dup_monitor : ( bool , bool ) ,
3057
+ pub pending_htlc_adds : ( usize , usize ) ,
3054
3058
pub pending_htlc_claims : ( usize , usize ) ,
3055
3059
pub pending_htlc_fails : ( usize , usize ) ,
3056
3060
pub pending_cell_htlc_claims : ( usize , usize ) ,
@@ -3064,6 +3068,8 @@ impl<'a, 'b, 'c, 'd> ReconnectArgs<'a, 'b, 'c, 'd> {
3064
3068
node_a,
3065
3069
node_b,
3066
3070
send_channel_ready : ( false , false ) ,
3071
+ pending_responding_commitment_signed : ( false , false ) ,
3072
+ pending_responding_commitment_signed_dup_monitor : ( false , false ) ,
3067
3073
pending_htlc_adds : ( 0 , 0 ) ,
3068
3074
pending_htlc_claims : ( 0 , 0 ) ,
3069
3075
pending_htlc_fails : ( 0 , 0 ) ,
@@ -3079,7 +3085,8 @@ impl<'a, 'b, 'c, 'd> ReconnectArgs<'a, 'b, 'c, 'd> {
3079
3085
pub fn reconnect_nodes < ' a , ' b , ' c , ' d > ( args : ReconnectArgs < ' a , ' b , ' c , ' d > ) {
3080
3086
let ReconnectArgs {
3081
3087
node_a, node_b, send_channel_ready, pending_htlc_adds, pending_htlc_claims, pending_htlc_fails,
3082
- pending_cell_htlc_claims, pending_cell_htlc_fails, pending_raa
3088
+ pending_cell_htlc_claims, pending_cell_htlc_fails, pending_raa,
3089
+ pending_responding_commitment_signed, pending_responding_commitment_signed_dup_monitor,
3083
3090
} = args;
3084
3091
node_a. node . peer_connected ( & node_b. node . get_our_node_id ( ) , & msgs:: Init {
3085
3092
features : node_b. node . init_features ( ) , networks : None , remote_network_address : None
@@ -3164,13 +3171,12 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3164
3171
} else {
3165
3172
assert ! ( chan_msgs. 1 . is_none( ) ) ;
3166
3173
}
3167
- 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 {
3174
+ if pending_htlc_adds. 0 != 0 || pending_htlc_claims. 0 != 0 || pending_htlc_fails. 0 != 0 ||
3175
+ pending_cell_htlc_claims. 0 != 0 || pending_cell_htlc_fails. 0 != 0 ||
3176
+ pending_responding_commitment_signed. 0
3177
+ {
3168
3178
let commitment_update = chan_msgs. 2 . unwrap ( ) ;
3169
- if pending_htlc_adds. 0 != -1 { // We use -1 to denote a response commitment_signed
3170
- assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 0 as usize ) ;
3171
- } else {
3172
- assert ! ( commitment_update. update_add_htlcs. is_empty( ) ) ;
3173
- }
3179
+ assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 0 ) ;
3174
3180
assert_eq ! ( commitment_update. update_fulfill_htlcs. len( ) , pending_htlc_claims. 0 + pending_cell_htlc_claims. 0 ) ;
3175
3181
assert_eq ! ( commitment_update. update_fail_htlcs. len( ) , pending_htlc_fails. 0 + pending_cell_htlc_fails. 0 ) ;
3176
3182
assert ! ( commitment_update. update_fail_malformed_htlcs. is_empty( ) ) ;
@@ -3184,7 +3190,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3184
3190
node_a. node . handle_update_fail_htlc ( & node_b. node . get_our_node_id ( ) , & update_fail) ;
3185
3191
}
3186
3192
3187
- if pending_htlc_adds . 0 != - 1 { // We use -1 to denote a response commitment_signed
3193
+ if !pending_responding_commitment_signed . 0 {
3188
3194
commitment_signed_dance ! ( node_a, node_b, commitment_update. commitment_signed, false ) ;
3189
3195
} else {
3190
3196
node_a. node . handle_commitment_signed ( & node_b. node . get_our_node_id ( ) , & commitment_update. commitment_signed ) ;
@@ -3193,7 +3199,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3193
3199
// No commitment_signed so get_event_msg's assert(len == 1) passes
3194
3200
node_b. node . handle_revoke_and_ack ( & node_a. node . get_our_node_id ( ) , & as_revoke_and_ack) ;
3195
3201
assert ! ( node_b. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3196
- check_added_monitors ! ( node_b, 1 ) ;
3202
+ check_added_monitors ! ( node_b, if pending_responding_commitment_signed_dup_monitor . 0 { 0 } else { 1 } ) ;
3197
3203
}
3198
3204
} else {
3199
3205
assert ! ( chan_msgs. 2 . is_none( ) ) ;
@@ -3223,11 +3229,12 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3223
3229
} else {
3224
3230
assert ! ( chan_msgs. 1 . is_none( ) ) ;
3225
3231
}
3226
- 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 {
3232
+ if pending_htlc_adds. 1 != 0 || pending_htlc_claims. 1 != 0 || pending_htlc_fails. 1 != 0 ||
3233
+ pending_cell_htlc_claims. 1 != 0 || pending_cell_htlc_fails. 1 != 0 ||
3234
+ pending_responding_commitment_signed. 1
3235
+ {
3227
3236
let commitment_update = chan_msgs. 2 . unwrap ( ) ;
3228
- if pending_htlc_adds. 1 != -1 { // We use -1 to denote a response commitment_signed
3229
- assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 1 as usize ) ;
3230
- }
3237
+ assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 1 ) ;
3231
3238
assert_eq ! ( commitment_update. update_fulfill_htlcs. len( ) , pending_htlc_claims. 1 + pending_cell_htlc_claims. 1 ) ;
3232
3239
assert_eq ! ( commitment_update. update_fail_htlcs. len( ) , pending_htlc_fails. 1 + pending_cell_htlc_fails. 1 ) ;
3233
3240
assert ! ( commitment_update. update_fail_malformed_htlcs. is_empty( ) ) ;
@@ -3241,7 +3248,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3241
3248
node_b. node . handle_update_fail_htlc ( & node_a. node . get_our_node_id ( ) , & update_fail) ;
3242
3249
}
3243
3250
3244
- if pending_htlc_adds . 1 != - 1 { // We use -1 to denote a response commitment_signed
3251
+ if !pending_responding_commitment_signed . 1 {
3245
3252
commitment_signed_dance ! ( node_b, node_a, commitment_update. commitment_signed, false ) ;
3246
3253
} else {
3247
3254
node_b. node . handle_commitment_signed ( & node_a. node . get_our_node_id ( ) , & commitment_update. commitment_signed ) ;
@@ -3250,7 +3257,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3250
3257
// No commitment_signed so get_event_msg's assert(len == 1) passes
3251
3258
node_a. node . handle_revoke_and_ack ( & node_b. node . get_our_node_id ( ) , & bs_revoke_and_ack) ;
3252
3259
assert ! ( node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3253
- check_added_monitors ! ( node_a, 1 ) ;
3260
+ check_added_monitors ! ( node_a, if pending_responding_commitment_signed_dup_monitor . 1 { 0 } else { 1 } ) ;
3254
3261
}
3255
3262
} else {
3256
3263
assert ! ( chan_msgs. 2 . is_none( ) ) ;
0 commit comments