From: Matt Corallo Date: Tue, 10 Dec 2019 03:17:31 +0000 (-0500) Subject: If 2 claimable-outpoint-spending txn are in 1 block, clean up properly X-Git-Tag: v0.0.12~169^2~5 X-Git-Url: http://git.bitcoin.ninja/?a=commitdiff_plain;h=475719d01cc5e4aa6566442583c3067f74bbd87c;p=rust-lightning If 2 claimable-outpoint-spending txn are in 1 block, clean up properly 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". --- diff --git a/lightning/src/ln/channelmonitor.rs b/lightning/src/ln/channelmonitor.rs index 296709d10..72f11fe25 100644 --- a/lightning/src/ln/channelmonitor.rs +++ b/lightning/src/ln/channelmonitor.rs @@ -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]); } } }