If 2 claimable-outpoint-spending txn are in 1 block, clean up properly
authorMatt Corallo <git@bluematt.me>
Tue, 10 Dec 2019 03:17:31 +0000 (22:17 -0500)
committerAntoine Riard <ariard@student.42.fr>
Tue, 10 Dec 2019 22:42:58 +0000 (17:42 -0500)
This resolves an issue where we will never track 2 on-chain events
which are waiting for ANTI_REORG_DELAY at the same height.

This partially reverts and fixes "Move our_claim_txn_waiting_first_conf
to pending_claim_requests".

lightning/src/ln/channelmonitor.rs

index 296709d10b332aeca2366d67445b6ed4261824a7..72f11fe25f241406ae4d2a2bc12314ea01f293a8 100644 (file)
@@ -2418,10 +2418,15 @@ impl ChannelMonitor {
                                                // before we could anyway), wait for ANTI_REORG_DELAY and clean the RBF
                                                // tracking map.
                                                if set_equality {
+                                                       let new_event = OnchainEvent::Claim { claim_request: ancestor_claimable_txid.0.clone() };
                                                        match self.onchain_events_waiting_threshold_conf.entry(height + ANTI_REORG_DELAY - 1) {
-                                                               hash_map::Entry::Occupied(_) => {},
+                                                               hash_map::Entry::Occupied(mut entry) => {
+                                                                       if !entry.get().contains(&new_event) {
+                                                                               entry.get_mut().push(new_event);
+                                                                       }
+                                                               },
                                                                hash_map::Entry::Vacant(entry) => {
-                                                                       entry.insert(vec![OnchainEvent::Claim { claim_request: ancestor_claimable_txid.0.clone()}]);
+                                                                       entry.insert(vec![new_event]);
                                                                }
                                                        }
                                                } else { // If false, generate new claim request with update outpoint set
@@ -2440,10 +2445,15 @@ impl ChannelMonitor {
                                }
                        }
                        for (outpoint, input_material) in claimed_outputs_material.drain(..) {
+                               let new_event = OnchainEvent::ContentiousOutpoint { outpoint, input_material };
                                match self.onchain_events_waiting_threshold_conf.entry(height + ANTI_REORG_DELAY - 1) {
-                                       hash_map::Entry::Occupied(_) => {},
+                                       hash_map::Entry::Occupied(mut entry) => {
+                                               if !entry.get().contains(&new_event) {
+                                                       entry.get_mut().push(new_event);
+                                               }
+                                       },
                                        hash_map::Entry::Vacant(entry) => {
-                                               entry.insert(vec![OnchainEvent::ContentiousOutpoint { outpoint, input_material }]);
+                                               entry.insert(vec![new_event]);
                                        }
                                }
                        }