Inform ChannelManager when fulfilled HTLCs are finalized
[rust-lightning] / lightning / src / ln / channel.rs
index 4cd19c6ac06e5b5833dca292d7316ef06d053538..16e6576b87e5944508674b615dcdc935bb1c9367 100644 (file)
@@ -345,6 +345,7 @@ pub(super) struct RAAUpdates {
        pub commitment_update: Option<msgs::CommitmentUpdate>,
        pub accepted_htlcs: Vec<(PendingHTLCInfo, u64)>,
        pub failed_htlcs: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>,
+       pub finalized_claimed_htlcs: Vec<HTLCSource>,
        pub monitor_update: ChannelMonitorUpdate,
        pub holding_cell_failed_htlcs: Vec<(HTLCSource, PaymentHash)>,
 }
@@ -356,6 +357,7 @@ pub(super) struct MonitorRestoreUpdates {
        pub order: RAACommitmentOrder,
        pub accepted_htlcs: Vec<(PendingHTLCInfo, u64)>,
        pub failed_htlcs: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>,
+       pub finalized_claimed_htlcs: Vec<HTLCSource>,
        pub funding_broadcastable: Option<Transaction>,
        pub funding_locked: Option<msgs::FundingLocked>,
 }
@@ -427,6 +429,7 @@ pub(super) struct Channel<Signer: Sign> {
        monitor_pending_commitment_signed: bool,
        monitor_pending_forwards: Vec<(PendingHTLCInfo, u64)>,
        monitor_pending_failures: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>,
+       monitor_pending_finalized_fulfills: Vec<HTLCSource>,
 
        // pending_update_fee is filled when sending and receiving update_fee.
        //
@@ -713,6 +716,7 @@ impl<Signer: Sign> Channel<Signer> {
                        monitor_pending_commitment_signed: false,
                        monitor_pending_forwards: Vec::new(),
                        monitor_pending_failures: Vec::new(),
+                       monitor_pending_finalized_fulfills: Vec::new(),
 
                        #[cfg(debug_assertions)]
                        holder_max_commitment_tx_output: Mutex::new((channel_value_satoshis * 1000 - push_msat, push_msat)),
@@ -976,6 +980,7 @@ impl<Signer: Sign> Channel<Signer> {
                        monitor_pending_commitment_signed: false,
                        monitor_pending_forwards: Vec::new(),
                        monitor_pending_failures: Vec::new(),
+                       monitor_pending_finalized_fulfills: Vec::new(),
 
                        #[cfg(debug_assertions)]
                        holder_max_commitment_tx_output: Mutex::new((msg.push_msat, msg.funding_satoshis * 1000 - msg.push_msat)),
@@ -2798,6 +2803,7 @@ impl<Signer: Sign> Channel<Signer> {
                log_trace!(logger, "Updating HTLCs on receipt of RAA in channel {}...", log_bytes!(self.channel_id()));
                let mut to_forward_infos = Vec::new();
                let mut revoked_htlcs = Vec::new();
+               let mut finalized_claimed_htlcs = Vec::new();
                let mut update_fail_htlcs = Vec::new();
                let mut update_fail_malformed_htlcs = Vec::new();
                let mut require_commitment = false;
@@ -2824,6 +2830,7 @@ impl<Signer: Sign> Channel<Signer> {
                                        if let Some(reason) = fail_reason.clone() { // We really want take() here, but, again, non-mut ref :(
                                                revoked_htlcs.push((htlc.source.clone(), htlc.payment_hash, reason));
                                        } else {
+                                               finalized_claimed_htlcs.push(htlc.source.clone());
                                                // They fulfilled, so we sent them money
                                                value_to_self_msat_diff -= htlc.amount_msat as i64;
                                        }
@@ -2920,9 +2927,10 @@ impl<Signer: Sign> Channel<Signer> {
                        }
                        self.monitor_pending_forwards.append(&mut to_forward_infos);
                        self.monitor_pending_failures.append(&mut revoked_htlcs);
+                       self.monitor_pending_finalized_fulfills.append(&mut finalized_claimed_htlcs);
                        log_debug!(logger, "Received a valid revoke_and_ack for channel {} but awaiting a monitor update resolution to reply.", log_bytes!(self.channel_id()));
                        return Ok(RAAUpdates {
-                               commitment_update: None,
+                               commitment_update: None, finalized_claimed_htlcs: Vec::new(),
                                accepted_htlcs: Vec::new(), failed_htlcs: Vec::new(),
                                monitor_update,
                                holding_cell_failed_htlcs: Vec::new()
@@ -2947,6 +2955,7 @@ impl<Signer: Sign> Channel<Signer> {
 
                                Ok(RAAUpdates {
                                        commitment_update: Some(commitment_update),
+                                       finalized_claimed_htlcs,
                                        accepted_htlcs: to_forward_infos,
                                        failed_htlcs: revoked_htlcs,
                                        monitor_update,
@@ -2973,6 +2982,7 @@ impl<Signer: Sign> Channel<Signer> {
                                                        update_fee: None,
                                                        commitment_signed
                                                }),
+                                               finalized_claimed_htlcs,
                                                accepted_htlcs: to_forward_infos, failed_htlcs: revoked_htlcs,
                                                monitor_update, holding_cell_failed_htlcs: htlcs_to_fail
                                        })
@@ -2980,6 +2990,7 @@ impl<Signer: Sign> Channel<Signer> {
                                        log_debug!(logger, "Received a valid revoke_and_ack for channel {} with no reply necessary.", log_bytes!(self.channel_id()));
                                        Ok(RAAUpdates {
                                                commitment_update: None,
+                                               finalized_claimed_htlcs,
                                                accepted_htlcs: to_forward_infos, failed_htlcs: revoked_htlcs,
                                                monitor_update, holding_cell_failed_htlcs: htlcs_to_fail
                                        })
@@ -3097,11 +3108,16 @@ impl<Signer: Sign> Channel<Signer> {
        /// which failed. The messages which were generated from that call which generated the
        /// monitor update failure must *not* have been sent to the remote end, and must instead
        /// have been dropped. They will be regenerated when monitor_updating_restored is called.
-       pub fn monitor_update_failed(&mut self, resend_raa: bool, resend_commitment: bool, mut pending_forwards: Vec<(PendingHTLCInfo, u64)>, mut pending_fails: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>) {
+       pub fn monitor_update_failed(&mut self, resend_raa: bool, resend_commitment: bool,
+               mut pending_forwards: Vec<(PendingHTLCInfo, u64)>,
+               mut pending_fails: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>,
+               mut pending_finalized_claimed_htlcs: Vec<HTLCSource>
+       ) {
                self.monitor_pending_revoke_and_ack |= resend_raa;
                self.monitor_pending_commitment_signed |= resend_commitment;
                self.monitor_pending_forwards.append(&mut pending_forwards);
                self.monitor_pending_failures.append(&mut pending_fails);
+               self.monitor_pending_finalized_fulfills.append(&mut pending_finalized_claimed_htlcs);
                self.channel_state |= ChannelState::MonitorUpdateFailed as u32;
        }
 
@@ -3135,13 +3151,15 @@ impl<Signer: Sign> Channel<Signer> {
                mem::swap(&mut accepted_htlcs, &mut self.monitor_pending_forwards);
                let mut failed_htlcs = Vec::new();
                mem::swap(&mut failed_htlcs, &mut self.monitor_pending_failures);
+               let mut finalized_claimed_htlcs = Vec::new();
+               mem::swap(&mut finalized_claimed_htlcs, &mut self.monitor_pending_finalized_fulfills);
 
                if self.channel_state & (ChannelState::PeerDisconnected as u32) != 0 {
                        self.monitor_pending_revoke_and_ack = false;
                        self.monitor_pending_commitment_signed = false;
                        return MonitorRestoreUpdates {
                                raa: None, commitment_update: None, order: RAACommitmentOrder::RevokeAndACKFirst,
-                               accepted_htlcs, failed_htlcs, funding_broadcastable, funding_locked
+                               accepted_htlcs, failed_htlcs, finalized_claimed_htlcs, funding_broadcastable, funding_locked
                        };
                }
 
@@ -3160,7 +3178,7 @@ impl<Signer: Sign> Channel<Signer> {
                        if commitment_update.is_some() { "a" } else { "no" }, if raa.is_some() { "an" } else { "no" },
                        match order { RAACommitmentOrder::CommitmentFirst => "commitment", RAACommitmentOrder::RevokeAndACKFirst => "RAA"});
                MonitorRestoreUpdates {
-                       raa, commitment_update, order, accepted_htlcs, failed_htlcs, funding_broadcastable, funding_locked
+                       raa, commitment_update, order, accepted_htlcs, failed_htlcs, finalized_claimed_htlcs, funding_broadcastable, funding_locked
                }
        }
 
@@ -5221,6 +5239,7 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
                        (5, self.config, required),
                        (7, self.shutdown_scriptpubkey, option),
                        (9, self.target_closing_feerate_sats_per_kw, option),
+                       (11, self.monitor_pending_finalized_fulfills, vec_type),
                });
 
                Ok(())
@@ -5454,6 +5473,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
 
                let mut announcement_sigs = None;
                let mut target_closing_feerate_sats_per_kw = None;
+               let mut monitor_pending_finalized_fulfills = Some(Vec::new());
                read_tlv_fields!(reader, {
                        (0, announcement_sigs, option),
                        (1, minimum_depth, option),
@@ -5461,6 +5481,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
                        (5, config, option), // Note that if none is provided we will *not* overwrite the existing one.
                        (7, shutdown_scriptpubkey, option),
                        (9, target_closing_feerate_sats_per_kw, option),
+                       (11, monitor_pending_finalized_fulfills, vec_type),
                });
 
                let mut secp_ctx = Secp256k1::new();
@@ -5496,6 +5517,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
                        monitor_pending_commitment_signed,
                        monitor_pending_forwards,
                        monitor_pending_failures,
+                       monitor_pending_finalized_fulfills: monitor_pending_finalized_fulfills.unwrap(),
 
                        pending_update_fee,
                        holding_cell_update_fee,