@@ -265,8 +265,8 @@ func (p *Protocol) Start(ctx context.Context, sr protocol.StateReader) (protocol
265265 }
266266 }
267267 c .contractsStake = & contractStakeView {}
268- checker := blockdao .GetChecker (ctx )
269268 checkIndex := func (indexer ContractStakingIndexer ) error {
269+ checker := blockdao .GetChecker (ctx )
270270 if checker == nil {
271271 return nil
272272 }
@@ -295,59 +295,46 @@ func (p *Protocol) Start(ctx context.Context, sr protocol.StateReader) (protocol
295295 }
296296 return checker .CheckIndexer (ctx , indexer , height , func (h uint64 ) {
297297 if h % 5000 == 0 || h == height {
298- log .L ().Info ("Checking contract staking indexer" , zap .Uint64 ("height" , h ))
298+ log .L ().Info ("Checking contract staking indexer" , zap .Uint64 ("height" , h ), zap . String ( "contract" , indexer . ContractAddress (). String ()) )
299299 }
300300 })
301301 }
302- if p .skipContractStakingView (height ) {
303- if p .contractStakingIndexer != nil {
304- if err = checkIndex (p .contractStakingIndexer ); err != nil {
305- return nil , errors .Wrap (err , "failed to check contract staking indexer" )
306- }
307- }
308- if p .contractStakingIndexerV2 != nil {
309- if err = checkIndex (p .contractStakingIndexerV2 ); err != nil {
310- return nil , errors .Wrap (err , "failed to check contract staking indexer V2" )
311- }
312- }
313- if p .contractStakingIndexerV3 != nil {
314- if err = checkIndex (p .contractStakingIndexerV3 ); err != nil {
315- return nil , errors .Wrap (err , "failed to check contract staking indexer V3" )
316- }
317- }
318- return c , nil
302+ // List of all indexers to process
303+ indexers := []struct {
304+ indexer ContractStakingIndexer
305+ setter func (ContractStakeView )
306+ }{
307+ {p .contractStakingIndexer , func (v ContractStakeView ) { c .contractsStake .v1 = v }},
308+ {p .contractStakingIndexerV2 , func (v ContractStakeView ) { c .contractsStake .v2 = v }},
309+ {p .contractStakingIndexerV3 , func (v ContractStakeView ) { c .contractsStake .v3 = v }},
319310 }
320-
311+ // Process all indexers in parallel
321312 wg := sync.WaitGroup {}
322- errChan := make (chan error , 3 )
323- buildView := func (indexer ContractStakingIndexer , callback func (ContractStakeView )) {
324- if indexer == nil {
325- return
313+ errChan := make (chan error , len (indexers ))
314+ skipView := p .skipContractStakingView (height )
315+ for _ , idx := range indexers {
316+ if idx .indexer == nil {
317+ continue
326318 }
327319 wg .Add (1 )
328- go func () {
320+ go func (indexer ContractStakingIndexer , setter func ( ContractStakeView ) ) {
329321 defer wg .Done ()
322+ // First, checking the indexer
330323 if err := checkIndex (indexer ); err != nil {
331- errChan <- errors .Wrap (err , "failed to check contract staking indexer" )
324+ errChan <- errors .Wrapf (err , "failed to check contract staking indexer %s" , indexer . ContractAddress () )
332325 return
333326 }
334- view , err := NewContractStakeViewBuilder (indexer , p .blockStore ).Build (ctx , sr , height )
335- if err != nil {
336- errChan <- errors .Wrapf (err , "failed to create stake view for contract %s" , indexer .ContractAddress ())
337- return
327+ // If not skipping view creation, build the view
328+ if ! skipView {
329+ view , err := NewContractStakeViewBuilder (indexer , p .blockStore ).Build (ctx , sr , height )
330+ if err != nil {
331+ errChan <- errors .Wrapf (err , "failed to create stake view for contract %s" , indexer .ContractAddress ())
332+ return
333+ }
334+ setter (view )
338335 }
339- callback (view )
340- }()
341- }
342- buildView (p .contractStakingIndexer , func (view ContractStakeView ) {
343- c .contractsStake .v1 = view
344- })
345- buildView (p .contractStakingIndexerV2 , func (view ContractStakeView ) {
346- c .contractsStake .v2 = view
347- })
348- buildView (p .contractStakingIndexerV3 , func (view ContractStakeView ) {
349- c .contractsStake .v3 = view
350- })
336+ }(idx .indexer , idx .setter )
337+ }
351338 wg .Wait ()
352339 close (errChan )
353340 for err := range errChan {
0 commit comments