@@ -252,8 +252,10 @@ pub struct OnchainTxHandler<ChannelSigner: WriteableEcdsaChannelSigner> {
252
252
pub ( crate ) pending_claim_requests : HashMap < PackageID , PackageTemplate > ,
253
253
#[ cfg( not( test) ) ]
254
254
pending_claim_requests : HashMap < PackageID , PackageTemplate > ,
255
+
256
+ // Used to track external events that need to be forwarded to the `ChainMonitor`.
255
257
#[ cfg( anchors) ]
256
- pending_claim_events : HashMap < PackageID , ClaimEvent > ,
258
+ pending_claim_events : Vec < ( PackageID , ClaimEvent ) > ,
257
259
258
260
// Used to link outpoints claimed in a connected block to a pending claim request. The keys
259
261
// represent the outpoints that our `ChannelMonitor` has detected we have keys/scripts to claim.
@@ -430,7 +432,7 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
430
432
pending_claim_requests,
431
433
onchain_events_awaiting_threshold_conf,
432
434
#[ cfg( anchors) ]
433
- pending_claim_events : HashMap :: new ( ) ,
435
+ pending_claim_events : Vec :: new ( ) ,
434
436
secp_ctx,
435
437
} )
436
438
}
@@ -451,8 +453,7 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
451
453
locktimed_packages : BTreeMap :: new ( ) ,
452
454
onchain_events_awaiting_threshold_conf : Vec :: new ( ) ,
453
455
#[ cfg( anchors) ]
454
- pending_claim_events : HashMap :: new ( ) ,
455
-
456
+ pending_claim_events : Vec :: new ( ) ,
456
457
secp_ctx,
457
458
}
458
459
}
@@ -467,9 +468,9 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
467
468
468
469
#[ cfg( anchors) ]
469
470
pub ( crate ) fn get_and_clear_pending_claim_events ( & mut self ) -> Vec < ClaimEvent > {
470
- let mut ret = HashMap :: new ( ) ;
471
- swap ( & mut ret , & mut self . pending_claim_events ) ;
472
- ret . into_iter ( ) . map ( |( _, event) | event) . collect :: < Vec < _ > > ( )
471
+ let mut events = Vec :: new ( ) ;
472
+ swap ( & mut events , & mut self . pending_claim_events ) ;
473
+ events . into_iter ( ) . map ( |( _, event) | event) . collect ( )
473
474
}
474
475
475
476
/// Lightning security model (i.e being able to redeem/timeout HTLC or penalize counterparty
@@ -713,7 +714,8 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
713
714
package_id
714
715
} ,
715
716
} ;
716
- self . pending_claim_events . insert ( package_id, claim_event) ;
717
+ debug_assert_eq ! ( self . pending_claim_events. iter( ) . filter( |entry| entry. 0 == package_id) . count( ) , 0 ) ;
718
+ self . pending_claim_events . push ( ( package_id, claim_event) ) ;
717
719
package_id
718
720
} ,
719
721
} ;
@@ -833,9 +835,9 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
833
835
log_debug ! ( logger, "Removing claim tracking for {} due to maturation of claim package {}." ,
834
836
outpoint, log_bytes!( package_id) ) ;
835
837
self . claimable_outpoints . remove ( outpoint) ;
836
- #[ cfg( anchors) ]
837
- self . pending_claim_events . remove ( & package_id) ;
838
838
}
839
+ #[ cfg( anchors) ]
840
+ self . pending_claim_events . retain ( |( id, _) | * id != package_id) ;
839
841
}
840
842
} ,
841
843
OnchainEvent :: ContentiousOutpoint { package } => {
@@ -870,7 +872,12 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
870
872
#[ cfg( anchors) ]
871
873
OnchainClaim :: Event ( claim_event) => {
872
874
log_info ! ( logger, "Yielding RBF-bumped onchain event to spend inputs {:?}" , request. outpoints( ) ) ;
873
- self . pending_claim_events . insert ( * package_id, claim_event) ;
875
+ if let Some ( ( existing_claim_idx, _) ) = self . pending_claim_events . iter ( ) . enumerate ( )
876
+ . find ( |( _, entry) | entry. 0 == * package_id)
877
+ {
878
+ self . pending_claim_events . remove ( existing_claim_idx) ;
879
+ }
880
+ self . pending_claim_events . push ( ( * package_id, claim_event) ) ;
874
881
} ,
875
882
}
876
883
if let Some ( request) = self . pending_claim_requests . get_mut ( package_id) {
@@ -934,7 +941,7 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
934
941
self . onchain_events_awaiting_threshold_conf . push ( entry) ;
935
942
}
936
943
}
937
- for ( ( _package_id, _) , request) in bump_candidates. iter_mut ( ) {
944
+ for ( ( _package_id, _) , ref mut request) in bump_candidates. iter_mut ( ) {
938
945
if let Some ( ( new_timer, new_feerate, bump_claim) ) = self . generate_claim ( height, & request, fee_estimator, & & * logger) {
939
946
request. set_timer ( new_timer) ;
940
947
request. set_feerate ( new_feerate) ;
@@ -946,7 +953,12 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
946
953
#[ cfg( anchors) ]
947
954
OnchainClaim :: Event ( claim_event) => {
948
955
log_info ! ( logger, "Yielding onchain event after reorg to spend inputs {:?}" , request. outpoints( ) ) ;
949
- self . pending_claim_events . insert ( _package_id, claim_event) ;
956
+ if let Some ( ( existing_claim_idx, _) ) = self . pending_claim_events . iter ( ) . enumerate ( )
957
+ . find ( |( _, entry) | entry. 0 == * _package_id)
958
+ {
959
+ self . pending_claim_events . remove ( existing_claim_idx) ;
960
+ }
961
+ self . pending_claim_events . push ( ( * _package_id, claim_event) ) ;
950
962
} ,
951
963
}
952
964
}
0 commit comments