+ //- resurect outpoint back in its claimable set and regenerate tx
+ for ev in events {
+ match ev {
+ OnchainEvent::ContentiousOutpoint { outpoint, input_material } => {
+ if let Some(ancestor_claimable_txid) = self.claimable_outpoints.get(&outpoint) {
+ if let Some(claim_material) = self.pending_claim_requests.get_mut(&ancestor_claimable_txid.0) {
+ claim_material.per_input_material.insert(outpoint, input_material);
+ // Using a HashMap guarantee us than if we have multiple outpoints getting
+ // resurrected only one bump claim tx is going to be broadcast
+ bump_candidates.insert(ancestor_claimable_txid.clone(), claim_material.clone());
+ }
+ }
+ },
+ _ => {},
+ }
+ }
+ }
+ for (_, claim_material) in bump_candidates.iter_mut() {
+ if let Some((new_timer, new_feerate, bump_tx)) = self.bump_claim_tx(height, &claim_material, fee_estimator) {
+ claim_material.height_timer = new_timer;
+ claim_material.feerate_previous = new_feerate;
+ broadcaster.broadcast_transaction(&bump_tx);
+ }
+ }
+ for (ancestor_claim_txid, claim_material) in bump_candidates.drain() {
+ self.pending_claim_requests.insert(ancestor_claim_txid.0, claim_material);
+ }
+ //TODO: if we implement cross-block aggregated claim transaction we need to refresh set of outpoints and regenerate tx but
+ // right now if one of the outpoint get disconnected, just erase whole pending claim request.
+ let mut remove_request = Vec::new();
+ self.claimable_outpoints.retain(|_, ref v|
+ if v.1 == height {
+ remove_request.push(v.0.clone());
+ false
+ } else { true });
+ for req in remove_request {
+ self.pending_claim_requests.remove(&req);