@@ -3030,7 +3030,11 @@ pub struct ReconnectArgs<'a, 'b, 'c, 'd> {
3030
3030
pub node_a : & ' a Node < ' b , ' c , ' d > ,
3031
3031
pub node_b : & ' a Node < ' b , ' c , ' d > ,
3032
3032
pub send_channel_ready : ( bool , bool ) ,
3033
- pub pending_htlc_adds : ( i64 , i64 ) ,
3033
+ pub pending_responding_commitment_signed : ( bool , bool ) ,
3034
+ /// Indicates that the pending responding commitment signed will be a dup for the recipient,
3035
+ /// and no monitor update is expected
3036
+ pub pending_responding_commitment_signed_dup_monitor : ( bool , bool ) ,
3037
+ pub pending_htlc_adds : ( usize , usize ) ,
3034
3038
pub pending_htlc_claims : ( usize , usize ) ,
3035
3039
pub pending_htlc_fails : ( usize , usize ) ,
3036
3040
pub pending_cell_htlc_claims : ( usize , usize ) ,
@@ -3044,6 +3048,8 @@ impl<'a, 'b, 'c, 'd> ReconnectArgs<'a, 'b, 'c, 'd> {
3044
3048
node_a,
3045
3049
node_b,
3046
3050
send_channel_ready : ( false , false ) ,
3051
+ pending_responding_commitment_signed : ( false , false ) ,
3052
+ pending_responding_commitment_signed_dup_monitor : ( false , false ) ,
3047
3053
pending_htlc_adds : ( 0 , 0 ) ,
3048
3054
pending_htlc_claims : ( 0 , 0 ) ,
3049
3055
pending_htlc_fails : ( 0 , 0 ) ,
@@ -3059,7 +3065,8 @@ impl<'a, 'b, 'c, 'd> ReconnectArgs<'a, 'b, 'c, 'd> {
3059
3065
pub fn reconnect_nodes < ' a , ' b , ' c , ' d > ( args : ReconnectArgs < ' a , ' b , ' c , ' d > ) {
3060
3066
let ReconnectArgs {
3061
3067
node_a, node_b, send_channel_ready, pending_htlc_adds, pending_htlc_claims, pending_htlc_fails,
3062
- pending_cell_htlc_claims, pending_cell_htlc_fails, pending_raa
3068
+ pending_cell_htlc_claims, pending_cell_htlc_fails, pending_raa,
3069
+ pending_responding_commitment_signed, pending_responding_commitment_signed_dup_monitor,
3063
3070
} = args;
3064
3071
node_a. node . peer_connected ( & node_b. node . get_our_node_id ( ) , & msgs:: Init {
3065
3072
features : node_b. node . init_features ( ) , networks : None , remote_network_address : None
@@ -3144,13 +3151,12 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3144
3151
} else {
3145
3152
assert ! ( chan_msgs. 1 . is_none( ) ) ;
3146
3153
}
3147
- 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 {
3154
+ if pending_htlc_adds. 0 != 0 || pending_htlc_claims. 0 != 0 || pending_htlc_fails. 0 != 0 ||
3155
+ pending_cell_htlc_claims. 0 != 0 || pending_cell_htlc_fails. 0 != 0 ||
3156
+ pending_responding_commitment_signed. 0
3157
+ {
3148
3158
let commitment_update = chan_msgs. 2 . unwrap ( ) ;
3149
- if pending_htlc_adds. 0 != -1 { // We use -1 to denote a response commitment_signed
3150
- assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 0 as usize ) ;
3151
- } else {
3152
- assert ! ( commitment_update. update_add_htlcs. is_empty( ) ) ;
3153
- }
3159
+ assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 0 ) ;
3154
3160
assert_eq ! ( commitment_update. update_fulfill_htlcs. len( ) , pending_htlc_claims. 0 + pending_cell_htlc_claims. 0 ) ;
3155
3161
assert_eq ! ( commitment_update. update_fail_htlcs. len( ) , pending_htlc_fails. 0 + pending_cell_htlc_fails. 0 ) ;
3156
3162
assert ! ( commitment_update. update_fail_malformed_htlcs. is_empty( ) ) ;
@@ -3164,7 +3170,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3164
3170
node_a. node . handle_update_fail_htlc ( & node_b. node . get_our_node_id ( ) , & update_fail) ;
3165
3171
}
3166
3172
3167
- if pending_htlc_adds . 0 != - 1 { // We use -1 to denote a response commitment_signed
3173
+ if !pending_responding_commitment_signed . 0 {
3168
3174
commitment_signed_dance ! ( node_a, node_b, commitment_update. commitment_signed, false ) ;
3169
3175
} else {
3170
3176
node_a. node . handle_commitment_signed ( & node_b. node . get_our_node_id ( ) , & commitment_update. commitment_signed ) ;
@@ -3173,7 +3179,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3173
3179
// No commitment_signed so get_event_msg's assert(len == 1) passes
3174
3180
node_b. node . handle_revoke_and_ack ( & node_a. node . get_our_node_id ( ) , & as_revoke_and_ack) ;
3175
3181
assert ! ( node_b. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3176
- check_added_monitors ! ( node_b, 1 ) ;
3182
+ check_added_monitors ! ( node_b, if pending_responding_commitment_signed_dup_monitor . 0 { 0 } else { 1 } ) ;
3177
3183
}
3178
3184
} else {
3179
3185
assert ! ( chan_msgs. 2 . is_none( ) ) ;
@@ -3203,11 +3209,12 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3203
3209
} else {
3204
3210
assert ! ( chan_msgs. 1 . is_none( ) ) ;
3205
3211
}
3206
- 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 {
3212
+ if pending_htlc_adds. 1 != 0 || pending_htlc_claims. 1 != 0 || pending_htlc_fails. 1 != 0 ||
3213
+ pending_cell_htlc_claims. 1 != 0 || pending_cell_htlc_fails. 1 != 0 ||
3214
+ pending_responding_commitment_signed. 1
3215
+ {
3207
3216
let commitment_update = chan_msgs. 2 . unwrap ( ) ;
3208
- if pending_htlc_adds. 1 != -1 { // We use -1 to denote a response commitment_signed
3209
- assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 1 as usize ) ;
3210
- }
3217
+ assert_eq ! ( commitment_update. update_add_htlcs. len( ) , pending_htlc_adds. 1 ) ;
3211
3218
assert_eq ! ( commitment_update. update_fulfill_htlcs. len( ) , pending_htlc_claims. 1 + pending_cell_htlc_claims. 1 ) ;
3212
3219
assert_eq ! ( commitment_update. update_fail_htlcs. len( ) , pending_htlc_fails. 1 + pending_cell_htlc_fails. 1 ) ;
3213
3220
assert ! ( commitment_update. update_fail_malformed_htlcs. is_empty( ) ) ;
@@ -3221,7 +3228,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3221
3228
node_b. node . handle_update_fail_htlc ( & node_a. node . get_our_node_id ( ) , & update_fail) ;
3222
3229
}
3223
3230
3224
- if pending_htlc_adds . 1 != - 1 { // We use -1 to denote a response commitment_signed
3231
+ if !pending_responding_commitment_signed . 1 {
3225
3232
commitment_signed_dance ! ( node_b, node_a, commitment_update. commitment_signed, false ) ;
3226
3233
} else {
3227
3234
node_b. node . handle_commitment_signed ( & node_a. node . get_our_node_id ( ) , & commitment_update. commitment_signed ) ;
@@ -3230,7 +3237,7 @@ pub fn reconnect_nodes<'a, 'b, 'c, 'd>(args: ReconnectArgs<'a, 'b, 'c, 'd>) {
3230
3237
// No commitment_signed so get_event_msg's assert(len == 1) passes
3231
3238
node_a. node . handle_revoke_and_ack ( & node_b. node . get_our_node_id ( ) , & bs_revoke_and_ack) ;
3232
3239
assert ! ( node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3233
- check_added_monitors ! ( node_a, 1 ) ;
3240
+ check_added_monitors ! ( node_a, if pending_responding_commitment_signed_dup_monitor . 1 { 0 } else { 1 } ) ;
3234
3241
}
3235
3242
} else {
3236
3243
assert ! ( chan_msgs. 2 . is_none( ) ) ;
0 commit comments