@@ -247,8 +247,14 @@ pub struct OnchainTxHandler<ChannelSigner: Sign> {
247
247
pub ( crate ) pending_claim_requests : HashMap < PackageID , PackageTemplate > ,
248
248
#[ cfg( not( test) ) ]
249
249
pending_claim_requests : HashMap < PackageID , PackageTemplate > ,
250
+
251
+ // Used to track external events that need to be forwarded to the `ChainMonitor`. We
252
+ // additionally maintain an ordered sequence of the events as they occur, such that we don't
253
+ // rely on the HashMap's randomized iterations.
250
254
#[ cfg( anchors) ]
251
255
pending_claim_events : HashMap < PackageID , ClaimEvent > ,
256
+ #[ cfg( anchors) ]
257
+ pending_claim_events_sequence : Vec < PackageID > ,
252
258
253
259
// Used to link outpoints claimed in a connected block to a pending claim request.
254
260
// Key is outpoint than monitor parsing has detected we have keys/scripts to claim
@@ -409,6 +415,8 @@ impl<'a, K: KeysInterface> ReadableArgs<(&'a K, u64, [u8; 32])> for OnchainTxHan
409
415
onchain_events_awaiting_threshold_conf,
410
416
#[ cfg( anchors) ]
411
417
pending_claim_events : HashMap :: new ( ) ,
418
+ #[ cfg( anchors) ]
419
+ pending_claim_events_sequence : Vec :: new ( ) ,
412
420
secp_ctx,
413
421
} )
414
422
}
@@ -430,7 +438,8 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
430
438
onchain_events_awaiting_threshold_conf : Vec :: new ( ) ,
431
439
#[ cfg( anchors) ]
432
440
pending_claim_events : HashMap :: new ( ) ,
433
-
441
+ #[ cfg( anchors) ]
442
+ pending_claim_events_sequence : Vec :: new ( ) ,
434
443
secp_ctx,
435
444
}
436
445
}
@@ -445,9 +454,19 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
445
454
446
455
#[ cfg( anchors) ]
447
456
pub ( crate ) fn get_and_clear_pending_claim_events ( & mut self ) -> Vec < ClaimEvent > {
448
- let mut ret = HashMap :: new ( ) ;
449
- swap ( & mut ret, & mut self . pending_claim_events ) ;
450
- ret. into_iter ( ) . map ( |( _, event) | event) . collect :: < Vec < _ > > ( )
457
+ let mut set = HashMap :: new ( ) ;
458
+ swap ( & mut set, & mut self . pending_claim_events ) ;
459
+ let mut sequence = Vec :: new ( ) ;
460
+ swap ( & mut sequence, & mut self . pending_claim_events_sequence ) ;
461
+
462
+ let mut pending_claim_events = Vec :: with_capacity ( set. len ( ) ) ;
463
+ for package_id in & sequence {
464
+ if !set. contains_key ( package_id) {
465
+ continue ;
466
+ }
467
+ pending_claim_events. push ( set. remove ( package_id) . unwrap ( ) ) ;
468
+ }
469
+ pending_claim_events
451
470
}
452
471
453
472
/// Lightning security model (i.e being able to redeem/timeout HTLC or penalize counterparty
@@ -692,6 +711,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
692
711
} ,
693
712
} ;
694
713
self . pending_claim_events . insert ( package_id, claim_event) ;
714
+ self . pending_claim_events_sequence . push ( package_id) ;
695
715
package_id
696
716
} ,
697
717
} ;
@@ -813,6 +833,8 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
813
833
self . claimable_outpoints . remove ( & outpoint) ;
814
834
#[ cfg( anchors) ]
815
835
self . pending_claim_events . remove ( & package_id) ;
836
+ #[ cfg( anchors) ]
837
+ self . pending_claim_events_sequence . retain ( |id| * id != package_id) ;
816
838
}
817
839
}
818
840
} ,
@@ -849,6 +871,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
849
871
OnchainClaim :: Event ( claim_event) => {
850
872
log_info ! ( logger, "Yielding RBF-bumped onchain event to spend inputs {:?}" , request. outpoints( ) ) ;
851
873
self . pending_claim_events . insert ( * first_claim_txid, claim_event) ;
874
+ self . pending_claim_events_sequence . push ( * first_claim_txid) ;
852
875
} ,
853
876
}
854
877
if let Some ( request) = self . pending_claim_requests . get_mut ( first_claim_txid) {
0 commit comments