@@ -5488,26 +5488,35 @@ impl<SP: Deref> Channel<SP> where
5488
5488
5489
5489
fn get_last_revoke_and_ack<L: Deref>(&mut self, logger: &L) -> Option<msgs::RevokeAndACK> where L::Target: Logger {
5490
5490
debug_assert!(self.context.holder_commitment_point.transaction_number() <= INITIAL_COMMITMENT_NUMBER - 2);
5491
- let per_commitment_secret = self.context.holder_signer.as_ref().release_commitment_secret(self.context.holder_commitment_point.transaction_number() + 2);
5492
- if let HolderCommitmentPoint::Available { transaction_number: _, current, next: _ } = self.context.holder_commitment_point {
5491
+ let per_commitment_secret = self.context.holder_signer.as_ref()
5492
+ .release_commitment_secret(self.context.holder_commitment_point.transaction_number() + 2).ok();
5493
+ if let (HolderCommitmentPoint::Available { current, .. }, Some(per_commitment_secret)) =
5494
+ (self.context.holder_commitment_point, per_commitment_secret) {
5493
5495
self.context.signer_pending_revoke_and_ack = false;
5494
- Some(msgs::RevokeAndACK {
5496
+ return Some(msgs::RevokeAndACK {
5495
5497
channel_id: self.context.channel_id,
5496
5498
per_commitment_secret,
5497
5499
next_per_commitment_point: current,
5498
5500
#[cfg(taproot)]
5499
5501
next_local_nonce: None,
5500
5502
})
5501
- } else {
5502
- #[cfg(not(async_signing))] {
5503
- panic!("Holder commitment point must be Available when generating revoke_and_ack");
5504
- }
5505
- #[cfg(async_signing)] {
5506
- log_trace!(logger, "Last revoke-and-ack pending in channel {} for sequence {} because the next per-commitment point is not available",
5507
- &self.context.channel_id(), self.context.holder_commitment_point.transaction_number());
5508
- self.context.signer_pending_revoke_and_ack = true;
5509
- None
5510
- }
5503
+ }
5504
+
5505
+ if !self.context.holder_commitment_point.is_available() {
5506
+ log_trace!(logger, "Last revoke-and-ack pending in channel {} for sequence {} because the next per-commitment point is not available",
5507
+ &self.context.channel_id(), self.context.holder_commitment_point.transaction_number());
5508
+ }
5509
+ if per_commitment_secret.is_none() {
5510
+ log_trace!(logger, "Last revoke-and-ack pending in channel {} for sequence {} because the next per-commitment secret for {} is not available",
5511
+ &self.context.channel_id(), self.context.holder_commitment_point.transaction_number(),
5512
+ self.context.holder_commitment_point.transaction_number() + 2);
5513
+ }
5514
+ #[cfg(not(async_signing))] {
5515
+ panic!("Holder commitment point and per commitment secret must be available when generating revoke_and_ack");
5516
+ }
5517
+ #[cfg(async_signing)] {
5518
+ self.context.signer_pending_revoke_and_ack = true;
5519
+ None
5511
5520
}
5512
5521
}
5513
5522
0 commit comments