|
9 | 9 | "github.com/ethereum/go-ethereum/accounts/abi" |
10 | 10 | "github.com/ethereum/go-ethereum/accounts/abi/bind" |
11 | 11 | "github.com/ethereum/go-ethereum/common" |
| 12 | + "golang.org/x/sync/errgroup" |
12 | 13 |
|
13 | 14 | chain_selectors "github.com/smartcontractkit/chain-selectors" |
14 | 15 |
|
@@ -312,57 +313,72 @@ func (c CCIPChainState) validateAllDestChainConfigs( |
312 | 313 | v16FeeTokens []common.Address, |
313 | 314 | fqV2 *fqv2ops.FeeQuoterContract, |
314 | 315 | ) error { |
| 316 | + var mu sync.Mutex |
315 | 317 | var errs []error |
| 318 | + grp := errgroup.Group{} |
| 319 | + grp.SetLimit(20) |
316 | 320 |
|
317 | 321 | for _, destChainSel := range connectedChains { |
318 | | - var v16Cfg *fee_quoter.FeeQuoterDestChainConfig |
319 | | - var v20Cfg *fqv2ops.DestChainConfig |
320 | | - var legacyCfg *evm_2_evm_onramp.EVM2EVMOnRampDynamicConfig |
321 | | - |
322 | | - if c.FeeQuoter != nil && v16FeeTokens != nil { |
323 | | - cfg, err := c.FeeQuoter.GetDestChainConfig(callOpts, destChainSel) |
324 | | - if err != nil { |
325 | | - errs = append(errs, fmt.Errorf("failed to get FeeQuoter v1.6 dest chain config for chain %d: %w", destChainSel, err)) |
326 | | - } else { |
327 | | - v16Cfg = &cfg |
| 322 | + dest := destChainSel |
| 323 | + grp.Go(func() error { |
| 324 | + var destErrs []error |
| 325 | + var v16Cfg *fee_quoter.FeeQuoterDestChainConfig |
| 326 | + var v20Cfg *fqv2ops.DestChainConfig |
| 327 | + var legacyCfg *evm_2_evm_onramp.EVM2EVMOnRampDynamicConfig |
| 328 | + |
| 329 | + if c.FeeQuoter != nil && v16FeeTokens != nil { |
| 330 | + cfg, err := c.FeeQuoter.GetDestChainConfig(callOpts, dest) |
| 331 | + if err != nil { |
| 332 | + destErrs = append(destErrs, fmt.Errorf("failed to get FeeQuoter v1.6 dest chain config for chain %d: %w", dest, err)) |
| 333 | + } else { |
| 334 | + v16Cfg = &cfg |
| 335 | + } |
328 | 336 | } |
329 | | - } |
330 | | - if fqV2 != nil { |
331 | | - cfg, err := fqV2.GetDestChainConfig(callOpts, destChainSel) |
332 | | - if err != nil { |
333 | | - errs = append(errs, fmt.Errorf("failed to get FeeQuoter v2.0 dest chain config for chain %d: %w", destChainSel, err)) |
334 | | - } else { |
335 | | - v20Cfg = &cfg |
| 337 | + if fqV2 != nil { |
| 338 | + cfg, err := fqV2.GetDestChainConfig(callOpts, dest) |
| 339 | + if err != nil { |
| 340 | + destErrs = append(destErrs, fmt.Errorf("failed to get FeeQuoter v2.0 dest chain config for chain %d: %w", dest, err)) |
| 341 | + } else { |
| 342 | + v20Cfg = &cfg |
| 343 | + } |
336 | 344 | } |
337 | | - } |
338 | | - if legacyOnRamp := c.EVM2EVMOnRamp[destChainSel]; legacyOnRamp != nil { |
339 | | - cfg, err := legacyOnRamp.GetDynamicConfig(callOpts) |
340 | | - if err != nil { |
341 | | - errs = append(errs, fmt.Errorf("failed to get v1.5 OnRamp dynamic config for dest chain %d: %w", destChainSel, err)) |
342 | | - } else { |
343 | | - legacyCfg = &cfg |
| 345 | + if legacyOnRamp := c.EVM2EVMOnRamp[dest]; legacyOnRamp != nil { |
| 346 | + cfg, err := legacyOnRamp.GetDynamicConfig(callOpts) |
| 347 | + if err != nil { |
| 348 | + destErrs = append(destErrs, fmt.Errorf("failed to get v1.5 OnRamp dynamic config for dest chain %d: %w", dest, err)) |
| 349 | + } else { |
| 350 | + legacyCfg = &cfg |
| 351 | + } |
344 | 352 | } |
345 | | - } |
346 | 353 |
|
347 | | - v16Enabled := v16Cfg != nil && v16Cfg.IsEnabled |
348 | | - v20Enabled := v20Cfg != nil && v20Cfg.IsEnabled |
| 354 | + v16Enabled := v16Cfg != nil && v16Cfg.IsEnabled |
| 355 | + v20Enabled := v20Cfg != nil && v20Cfg.IsEnabled |
349 | 356 |
|
350 | | - // Skip v1.6 checks when lane is enabled only in v2.0. |
351 | | - if v16Cfg != nil && (v16Enabled || !v20Enabled) { |
352 | | - if err := c.validateV16DestChainConfig(callOpts, sourceChainSel, destChainSel, *v16Cfg, legacyCfg); err != nil { |
353 | | - errs = append(errs, err) |
| 357 | + // Skip v1.6 checks when lane is enabled only in v2.0. |
| 358 | + if v16Cfg != nil && (v16Enabled || !v20Enabled) { |
| 359 | + if err := c.validateV16DestChainConfig(callOpts, sourceChainSel, dest, *v16Cfg, legacyCfg); err != nil { |
| 360 | + destErrs = append(destErrs, err) |
| 361 | + } |
354 | 362 | } |
355 | | - } |
356 | | - if v20Cfg != nil { |
357 | | - v16ForV20 := v16Cfg |
358 | | - if !v16Enabled && v20Enabled { |
359 | | - v16ForV20 = nil |
| 363 | + if v20Cfg != nil { |
| 364 | + v16ForV20 := v16Cfg |
| 365 | + if !v16Enabled && v20Enabled { |
| 366 | + v16ForV20 = nil |
| 367 | + } |
| 368 | + if err := c.validateV20DestChainConfig(callOpts, sourceChainSel, dest, *v20Cfg, v16ForV20, legacyCfg, fqV2); err != nil { |
| 369 | + destErrs = append(destErrs, err) |
| 370 | + } |
360 | 371 | } |
361 | | - if err := c.validateV20DestChainConfig(callOpts, sourceChainSel, destChainSel, *v20Cfg, v16ForV20, legacyCfg, fqV2); err != nil { |
362 | | - errs = append(errs, err) |
| 372 | + |
| 373 | + if len(destErrs) > 0 { |
| 374 | + mu.Lock() |
| 375 | + errs = append(errs, destErrs...) |
| 376 | + mu.Unlock() |
363 | 377 | } |
364 | | - } |
| 378 | + return nil |
| 379 | + }) |
365 | 380 | } |
| 381 | + _ = grp.Wait() |
366 | 382 |
|
367 | 383 | return errors.Join(errs...) |
368 | 384 | } |
@@ -533,33 +549,40 @@ func (c CCIPChainState) validateAllTokenTransferFeeConfigs( |
533 | 549 | e.Logger.Debugw("Validating TokenTransferFeeConfigs", "tokens", len(allTokens), "connectedChains", len(connectedChains)) |
534 | 550 | var mu sync.Mutex |
535 | 551 | var errs []error |
536 | | - var wg sync.WaitGroup |
537 | | - sem := make(chan struct{}, 20) |
| 552 | + outerGrp := errgroup.Group{} |
| 553 | + outerGrp.SetLimit(20) |
538 | 554 | for _, tokenAddr := range allTokens { |
539 | 555 | token := tokenAddr |
540 | 556 | tokenLabel := token.Hex() |
541 | 557 | if sym, ok := addrToSymbol[token]; ok { |
542 | 558 | tokenLabel = fmt.Sprintf("%s (%s)", sym, token.Hex()) |
543 | 559 | } |
544 | | - wg.Add(1) |
545 | | - sem <- struct{}{} |
546 | | - go func() { |
547 | | - defer wg.Done() |
548 | | - defer func() { <-sem }() |
| 560 | + outerGrp.Go(func() error { |
549 | 561 | var tokenErrs []error |
| 562 | + var tokenMu sync.Mutex |
| 563 | + innerGrp := errgroup.Group{} |
| 564 | + innerGrp.SetLimit(10) |
550 | 565 | for _, destChainSel := range connectedChains { |
551 | | - if err := c.validateTokenTransferFee(callOpts, destChainSel, token, tokenLabel, fqV2); err != nil { |
552 | | - tokenErrs = append(tokenErrs, err) |
553 | | - } |
| 566 | + dest := destChainSel |
| 567 | + innerGrp.Go(func() error { |
| 568 | + if err := c.validateTokenTransferFee(callOpts, dest, token, tokenLabel, fqV2); err != nil { |
| 569 | + tokenMu.Lock() |
| 570 | + tokenErrs = append(tokenErrs, err) |
| 571 | + tokenMu.Unlock() |
| 572 | + } |
| 573 | + return nil |
| 574 | + }) |
554 | 575 | } |
| 576 | + _ = innerGrp.Wait() |
555 | 577 | if len(tokenErrs) > 0 { |
556 | 578 | mu.Lock() |
557 | 579 | errs = append(errs, tokenErrs...) |
558 | 580 | mu.Unlock() |
559 | 581 | } |
560 | | - }() |
| 582 | + return nil |
| 583 | + }) |
561 | 584 | } |
562 | | - wg.Wait() |
| 585 | + _ = outerGrp.Wait() |
563 | 586 |
|
564 | 587 | return errors.Join(errs...) |
565 | 588 | } |
|
0 commit comments