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