@@ -363,6 +363,17 @@ pub(super) struct MonitorRestoreUpdates {
363
363
pub funding_locked : Option < msgs:: FundingLocked > ,
364
364
}
365
365
366
+ /// The return value of `channel_reestablish`
367
+ pub ( super ) struct ReestablishResponses {
368
+ pub funding_locked : Option < msgs:: FundingLocked > ,
369
+ pub raa : Option < msgs:: RevokeAndACK > ,
370
+ pub commitment_update : Option < msgs:: CommitmentUpdate > ,
371
+ pub order : RAACommitmentOrder ,
372
+ pub mon_update : Option < ChannelMonitorUpdate > ,
373
+ pub holding_cell_failed_htlcs : Vec < ( HTLCSource , PaymentHash ) > ,
374
+ pub shutdown : Option < msgs:: Shutdown > ,
375
+ }
376
+
366
377
/// If the majority of the channels funds are to the fundee and the initiator holds only just
367
378
/// enough funds to cover their reserve value, channels are at risk of getting "stuck". Because the
368
379
/// initiator controls the feerate, if they then go to increase the channel fee, they may have no
@@ -3337,7 +3348,7 @@ impl<Signer: Sign> Channel<Signer> {
3337
3348
3338
3349
/// May panic if some calls other than message-handling calls (which will all Err immediately)
3339
3350
/// have been called between remove_uncommitted_htlcs_and_mark_paused and this call.
3340
- pub fn channel_reestablish < L : Deref > ( & mut self , msg : & msgs:: ChannelReestablish , logger : & L ) -> Result < ( Option < msgs :: FundingLocked > , Option < msgs :: RevokeAndACK > , Option < msgs :: CommitmentUpdate > , Option < ChannelMonitorUpdate > , RAACommitmentOrder , Vec < ( HTLCSource , PaymentHash ) > , Option < msgs :: Shutdown > ) , ChannelError > where L :: Target : Logger {
3351
+ pub fn channel_reestablish < L : Deref > ( & mut self , msg : & msgs:: ChannelReestablish , logger : & L ) -> Result < ReestablishResponses , ChannelError > where L :: Target : Logger {
3341
3352
if self . channel_state & ( ChannelState :: PeerDisconnected as u32 ) == 0 {
3342
3353
// While BOLT 2 doesn't indicate explicitly we should error this channel here, it
3343
3354
// almost certainly indicates we are going to end up out-of-sync in some way, so we
@@ -3373,7 +3384,7 @@ impl<Signer: Sign> Channel<Signer> {
3373
3384
// remaining cases either succeed or ErrorMessage-fail).
3374
3385
self . channel_state &= !( ChannelState :: PeerDisconnected as u32 ) ;
3375
3386
3376
- let shutdown_msg = if self . channel_state & ( ChannelState :: LocalShutdownSent as u32 ) != 0 {
3387
+ let shutdown = if self . channel_state & ( ChannelState :: LocalShutdownSent as u32 ) != 0 {
3377
3388
assert ! ( self . shutdown_scriptpubkey. is_some( ) ) ;
3378
3389
Some ( msgs:: Shutdown {
3379
3390
channel_id : self . channel_id ,
@@ -3389,15 +3400,27 @@ impl<Signer: Sign> Channel<Signer> {
3389
3400
return Err ( ChannelError :: Close ( "Peer claimed they saw a revoke_and_ack but we haven't sent funding_locked yet" . to_owned ( ) ) ) ;
3390
3401
}
3391
3402
// Short circuit the whole handler as there is nothing we can resend them
3392
- return Ok ( ( None , None , None , None , RAACommitmentOrder :: CommitmentFirst , Vec :: new ( ) , shutdown_msg) ) ;
3403
+ return Ok ( ReestablishResponses {
3404
+ funding_locked : None ,
3405
+ raa : None , commitment_update : None , mon_update : None ,
3406
+ order : RAACommitmentOrder :: CommitmentFirst ,
3407
+ holding_cell_failed_htlcs : Vec :: new ( ) ,
3408
+ shutdown
3409
+ } ) ;
3393
3410
}
3394
3411
3395
3412
// We have OurFundingLocked set!
3396
3413
let next_per_commitment_point = self . holder_signer . get_per_commitment_point ( self . cur_holder_commitment_transaction_number , & self . secp_ctx ) ;
3397
- return Ok ( ( Some ( msgs:: FundingLocked {
3398
- channel_id : self . channel_id ( ) ,
3399
- next_per_commitment_point,
3400
- } ) , None , None , None , RAACommitmentOrder :: CommitmentFirst , Vec :: new ( ) , shutdown_msg) ) ;
3414
+ return Ok ( ReestablishResponses {
3415
+ funding_locked : Some ( msgs:: FundingLocked {
3416
+ channel_id : self . channel_id ( ) ,
3417
+ next_per_commitment_point,
3418
+ } ) ,
3419
+ raa : None , commitment_update : None , mon_update : None ,
3420
+ order : RAACommitmentOrder :: CommitmentFirst ,
3421
+ holding_cell_failed_htlcs : Vec :: new ( ) ,
3422
+ shutdown
3423
+ } ) ;
3401
3424
}
3402
3425
3403
3426
let required_revoke = if msg. next_remote_commitment_number + 1 == INITIAL_COMMITMENT_NUMBER - self . cur_holder_commitment_transaction_number {
@@ -3421,7 +3444,7 @@ impl<Signer: Sign> Channel<Signer> {
3421
3444
// the corresponding revoke_and_ack back yet.
3422
3445
let next_counterparty_commitment_number = INITIAL_COMMITMENT_NUMBER - self . cur_counterparty_commitment_transaction_number + if ( self . channel_state & ChannelState :: AwaitingRemoteRevoke as u32 ) != 0 { 1 } else { 0 } ;
3423
3446
3424
- let resend_funding_locked = if msg. next_local_commitment_number == 1 && INITIAL_COMMITMENT_NUMBER - self . cur_holder_commitment_transaction_number == 1 {
3447
+ let funding_locked = if msg. next_local_commitment_number == 1 && INITIAL_COMMITMENT_NUMBER - self . cur_holder_commitment_transaction_number == 1 {
3425
3448
// We should never have to worry about MonitorUpdateFailed resending FundingLocked
3426
3449
let next_per_commitment_point = self . holder_signer . get_per_commitment_point ( self . cur_holder_commitment_transaction_number , & self . secp_ctx ) ;
3427
3450
Some ( msgs:: FundingLocked {
@@ -3443,18 +3466,39 @@ impl<Signer: Sign> Channel<Signer> {
3443
3466
// have received some updates while we were disconnected. Free the holding cell
3444
3467
// now!
3445
3468
match self . free_holding_cell_htlcs ( logger) {
3446
- Err ( ChannelError :: Close ( msg) ) => return Err ( ChannelError :: Close ( msg) ) ,
3469
+ Err ( ChannelError :: Close ( msg) ) => Err ( ChannelError :: Close ( msg) ) ,
3447
3470
Err ( ChannelError :: Warn ( _) ) | Err ( ChannelError :: Ignore ( _) ) | Err ( ChannelError :: CloseDelayBroadcast ( _) ) =>
3448
3471
panic ! ( "Got non-channel-failing result from free_holding_cell_htlcs" ) ,
3449
- Ok ( ( Some ( ( commitment_update, monitor_update) ) , htlcs_to_fail) ) => {
3450
- return Ok ( ( resend_funding_locked, required_revoke, Some ( commitment_update) , Some ( monitor_update) , self . resend_order . clone ( ) , htlcs_to_fail, shutdown_msg) ) ;
3472
+ Ok ( ( Some ( ( commitment_update, monitor_update) ) , holding_cell_failed_htlcs) ) => {
3473
+ Ok ( ReestablishResponses {
3474
+ funding_locked, shutdown,
3475
+ raa : required_revoke,
3476
+ commitment_update : Some ( commitment_update) ,
3477
+ order : self . resend_order . clone ( ) ,
3478
+ mon_update : Some ( monitor_update) ,
3479
+ holding_cell_failed_htlcs,
3480
+ } )
3451
3481
} ,
3452
- Ok ( ( None , htlcs_to_fail) ) => {
3453
- return Ok ( ( resend_funding_locked, required_revoke, None , None , self . resend_order . clone ( ) , htlcs_to_fail, shutdown_msg) ) ;
3482
+ Ok ( ( None , holding_cell_failed_htlcs) ) => {
3483
+ Ok ( ReestablishResponses {
3484
+ funding_locked, shutdown,
3485
+ raa : required_revoke,
3486
+ commitment_update : None ,
3487
+ order : self . resend_order . clone ( ) ,
3488
+ mon_update : None ,
3489
+ holding_cell_failed_htlcs,
3490
+ } )
3454
3491
} ,
3455
3492
}
3456
3493
} else {
3457
- return Ok ( ( resend_funding_locked, required_revoke, None , None , self . resend_order . clone ( ) , Vec :: new ( ) , shutdown_msg) ) ;
3494
+ Ok ( ReestablishResponses {
3495
+ funding_locked, shutdown,
3496
+ raa : required_revoke,
3497
+ commitment_update : None ,
3498
+ order : self . resend_order . clone ( ) ,
3499
+ mon_update : None ,
3500
+ holding_cell_failed_htlcs : Vec :: new ( ) ,
3501
+ } )
3458
3502
}
3459
3503
} else if msg. next_local_commitment_number == next_counterparty_commitment_number - 1 {
3460
3504
if required_revoke. is_some ( ) {
@@ -3465,12 +3509,24 @@ impl<Signer: Sign> Channel<Signer> {
3465
3509
3466
3510
if self . channel_state & ( ChannelState :: MonitorUpdateFailed as u32 ) != 0 {
3467
3511
self . monitor_pending_commitment_signed = true ;
3468
- return Ok ( ( resend_funding_locked, None , None , None , self . resend_order . clone ( ) , Vec :: new ( ) , shutdown_msg) ) ;
3512
+ Ok ( ReestablishResponses {
3513
+ funding_locked, shutdown,
3514
+ commitment_update : None , raa : None , mon_update : None ,
3515
+ order : self . resend_order . clone ( ) ,
3516
+ holding_cell_failed_htlcs : Vec :: new ( ) ,
3517
+ } )
3518
+ } else {
3519
+ Ok ( ReestablishResponses {
3520
+ funding_locked, shutdown,
3521
+ raa : required_revoke,
3522
+ commitment_update : Some ( self . get_last_commitment_update ( logger) ) ,
3523
+ order : self . resend_order . clone ( ) ,
3524
+ mon_update : None ,
3525
+ holding_cell_failed_htlcs : Vec :: new ( ) ,
3526
+ } )
3469
3527
}
3470
-
3471
- return Ok ( ( resend_funding_locked, required_revoke, Some ( self . get_last_commitment_update ( logger) ) , None , self . resend_order . clone ( ) , Vec :: new ( ) , shutdown_msg) ) ;
3472
3528
} else {
3473
- return Err ( ChannelError :: Close ( "Peer attempted to reestablish channel with a very old remote commitment transaction" . to_owned ( ) ) ) ;
3529
+ Err ( ChannelError :: Close ( "Peer attempted to reestablish channel with a very old remote commitment transaction" . to_owned ( ) ) )
3474
3530
}
3475
3531
}
3476
3532
0 commit comments