diff --git a/btcstaking-tracker/stakingeventwatcher/stakingeventwatcher.go b/btcstaking-tracker/stakingeventwatcher/stakingeventwatcher.go index 6eb90de..95c131b 100644 --- a/btcstaking-tracker/stakingeventwatcher/stakingeventwatcher.go +++ b/btcstaking-tracker/stakingeventwatcher/stakingeventwatcher.go @@ -580,12 +580,7 @@ func (sew *StakingEventWatcher) handlerVerifiedDelegations() { // checkBtcForStakingTx gets a snapshot of current Delegations in cache // checks if staking tx is in BTC, generates a proof and invokes sending of MsgAddBTCDelegationInclusionProof func (sew *StakingEventWatcher) checkBtcForStakingTx() error { - delegations := sew.pendingTracker.GetDelegations() - if delegations == nil { - return nil - } - - for _, del := range delegations { + for del := range sew.pendingTracker.DelegationsIter() { if del.ActivationInProgress { continue } diff --git a/btcstaking-tracker/stakingeventwatcher/tracked_delegations.go b/btcstaking-tracker/stakingeventwatcher/tracked_delegations.go index 7bbcecf..5d2ddce 100644 --- a/btcstaking-tracker/stakingeventwatcher/tracked_delegations.go +++ b/btcstaking-tracker/stakingeventwatcher/tracked_delegations.go @@ -2,6 +2,7 @@ package stakingeventwatcher import ( "fmt" + "iter" "sync" "github.com/btcsuite/btcd/chaincfg/chainhash" @@ -58,6 +59,20 @@ func (td *TrackedDelegations) GetDelegations() []*TrackedDelegation { return delegations } +func (td *TrackedDelegations) DelegationsIter() iter.Seq[*TrackedDelegation] { + return func(yield func(*TrackedDelegation) bool) { + td.mu.RLock() + defer td.mu.RUnlock() + + // we lock for the entirety of the iteration + for _, v := range td.mapping { + if !yield(v) { + return + } + } + } +} + func (td *TrackedDelegations) AddDelegation( StakingTx *wire.MsgTx, StakingOutputIdx uint32,