@@ -82,6 +82,8 @@ pub use crate::ln::outbound_payment::{PaymentSendFailure, Retry, RetryableSendFa
82
82
use crate::ln::script::ShutdownScript;
83
83
use super::msgs::{CommitmentSigned, RevokeAndACK};
84
84
85
+ pub type NumberedCommitmentSigned = (CommitmentSigned, u64);
86
+
85
87
// We hold various information about HTLC relay in the HTLC objects in Channel itself:
86
88
//
87
89
// Upon receipt of an HTLC from a peer, we'll give it a PendingHTLCStatus indicating if it should
@@ -2410,12 +2412,14 @@ where
2410
2412
}, None));
2411
2413
}
2412
2414
2413
- /// Executes the given callback prividing it with a [`ChannelLock`], ensuring that no other
2415
+ /// Executes the given callback providing it with a [`ChannelLock`], ensuring that no other
2414
2416
/// operation will be executed on the referenced channel at the same time. Errors if the
2415
2417
/// channel peer is disconnected or the channel is not in a useable state. If the callback
2416
2418
/// returns an error, the channel value and funding outpoint are reset to the values they had
2417
- /// prior to the callback call.
2418
- pub fn with_useable_channel_lock<C, RV>(&self, channel_id: &[u8; 32], counter_party_node_id: &PublicKey, callback: C) -> Result<RV, APIError>
2419
+ /// prior to the callback call. If `commit_tx_number` is `Some`, it will be checked against the
2420
+ /// next commitment number for the requested channel, and will return an error if the two
2421
+ /// values differ.
2422
+ pub fn with_useable_channel_lock<C, RV>(&self, channel_id: &[u8; 32], counter_party_node_id: &PublicKey, commit_tx_number: Option<u64>, callback: C) -> Result<RV, APIError>
2419
2423
where
2420
2424
C: FnOnce(&mut ChannelLock<<SP::Target as SignerProvider>::Signer>) -> Result<RV, APIError>
2421
2425
{
@@ -2436,6 +2440,12 @@ where
2436
2440
return Err(APIError::ChannelUnavailable { err: "Channel is not useable.".to_string() });
2437
2441
}
2438
2442
2443
+ if let Some(commit_tx_number) = commit_tx_number {
2444
+ if commit_tx_number != chan.get_cur_holder_commitment_transaction_number() - 1 {
2445
+ return Err(APIError::ExternalError { err: format!("Invalid commitment transaction number, expected {} but got {}", chan.get_cur_holder_commitment_transaction_number(), commit_tx_number) });
2446
+ }
2447
+ }
2448
+
2439
2449
let channel_value = chan.context.get_value_satoshis();
2440
2450
let own_balance = chan.context.get_available_balances(&self.fee_estimator).balance_msat;
2441
2451
let funding_outpoint = chan.context.channel_transaction_parameters.funding_outpoint.unwrap();
@@ -2484,7 +2494,7 @@ where
2484
2494
}
2485
2495
}
2486
2496
2487
- fn get_updated_funding_outpoint_commitment_signed_internal(&self, channel_lock: &mut ChannelLock<<SP::Target as SignerProvider>::Signer>, funding_outpoint: &OutPoint, channel_value_satoshis: u64, own_balance: u64) -> Result<CommitmentSigned, APIError> {
2497
+ fn get_updated_funding_outpoint_commitment_signed_internal(&self, channel_lock: &mut ChannelLock<<SP::Target as SignerProvider>::Signer>, funding_outpoint: &OutPoint, channel_value_satoshis: u64, own_balance: u64) -> Result<( CommitmentSigned, u64) , APIError> {
2488
2498
if own_balance > channel_value_satoshis * 1000 {
2489
2499
return Err(APIError::APIMisuseError { err: "value_to_self must be smaller than channel_value".to_string() });
2490
2500
}
@@ -2506,8 +2516,9 @@ where
2506
2516
2507
2517
let res = chan.monitor_updating_restored(&self.logger, &self.node_signer, self.genesis_hash, &self.default_configuration, self.best_block.read().unwrap().height());
2508
2518
2519
+ let commit_tx_number = chan.get_cur_counterparty_commitment_transaction_number();
2509
2520
2510
- return Ok(res.commitment_update.unwrap().commitment_signed)
2521
+ return Ok(( res.commitment_update.unwrap().commitment_signed, commit_tx_number) )
2511
2522
}
2512
2523
2513
2524
fn on_commitment_signed_get_raa_internal(&self, channel_lock: &mut ChannelLock<<SP::Target as SignerProvider>::Signer>, commitment_signature: &secp256k1::ecdsa::Signature, htlc_signatures: &[secp256k1::ecdsa::Signature]) -> Result<msgs::RevokeAndACK, APIError> {
@@ -2694,22 +2705,24 @@ where
2694
2705
self.close_channel_internal(channel_id, counterparty_node_id, target_feerate_sats_per_1000_weight, shutdown_script)
2695
2706
}
2696
2707
2697
- ///
2698
- pub fn get_updated_funding_outpoint_commitment_signed(&self, channel_lock: &mut ChannelLock<<SP::Target as SignerProvider>::Signer>, funding_outpoint: &OutPoint, channel_value_satoshis: u64, value_to_self_msat: u64) -> Result<CommitmentSigned, APIError> {
2708
+ /// Updates the funding output and returns the `CommitmentSigned` message for the updated
2709
+ /// commitment transaction, as well as the commitment transaction number.
2710
+ pub fn get_updated_funding_outpoint_commitment_signed(&self, channel_lock: &mut ChannelLock<<SP::Target as SignerProvider>::Signer>, funding_outpoint: &OutPoint, channel_value_satoshis: u64, value_to_self_msat: u64) -> Result<NumberedCommitmentSigned, APIError> {
2699
2711
self.get_updated_funding_outpoint_commitment_signed_internal(channel_lock, funding_outpoint, channel_value_satoshis, value_to_self_msat)
2700
2712
}
2701
2713
2702
- ///
2714
+ /// Process and validates the given commitment signature and returns the RAA to be given to the
2715
+ /// counterparty on success.
2703
2716
pub fn on_commitment_signed_get_raa(&self, channel_lock: &mut ChannelLock<<SP::Target as SignerProvider>::Signer>, commitment_signature: &secp256k1::ecdsa::Signature, htlc_signatures: &[secp256k1::ecdsa::Signature]) -> Result<RevokeAndACK, APIError> {
2704
2717
self.on_commitment_signed_get_raa_internal(channel_lock, commitment_signature, htlc_signatures)
2705
2718
}
2706
2719
2707
- ///
2720
+ /// Process the given RAA message.
2708
2721
pub fn revoke_and_ack_commitment(&self, channel_lock: &mut ChannelLock<<SP::Target as SignerProvider>::Signer>, revoke_and_ack: &RevokeAndACK) -> Result<(), APIError> {
2709
2722
self.revoke_and_ack_commitment_internal(channel_lock, revoke_and_ack)
2710
2723
}
2711
2724
2712
- ///
2725
+ /// Set the funding outpoint for the channel to the given values.
2713
2726
pub fn set_funding_outpoint(&self, channel_lock: &mut ChannelLock<<SP::Target as SignerProvider>::Signer>, funding_output: &OutPoint, channel_value_satoshis: u64, value_to_self_msat: u64) {
2714
2727
self.set_funding_outpoint_internal(channel_lock, funding_output, channel_value_satoshis, value_to_self_msat);
2715
2728
}
0 commit comments