From 31b5e6f721e45d25076c7e13d59399eddc917f30 Mon Sep 17 00:00:00 2001 From: asoliman Date: Mon, 17 Feb 2025 20:06:53 +0400 Subject: [PATCH 1/4] Parallelize connecting lanes in ccip deployer --- deployment/environment/crib/ccip_deployer.go | 200 ++++++++++--------- 1 file changed, 109 insertions(+), 91 deletions(-) diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index ee3e5fe6dd1..08e991a62bf 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -4,9 +4,10 @@ import ( "context" "errors" "fmt" - "math/big" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" + "golang.org/x/sync/errgroup" + "math/big" + "sync" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" @@ -401,106 +402,123 @@ func setupLinkPools(e *deployment.Environment) (deployment.Environment, error) { } func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (deployment.Environment, error) { - onRampUpdatesByChain := make(map[uint64]map[uint64]changeset.OnRampDestinationUpdate) - pricesByChain := make(map[uint64]changeset.FeeQuoterPriceUpdatePerSource) - feeQuoterDestsUpdatesByChain := make(map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig) - updateOffRampSources := make(map[uint64]map[uint64]changeset.OffRampSourceUpdate) - updateRouterChanges := make(map[uint64]changeset.RouterUpdates) + eg := errgroup.Group{} poolUpdates := make(map[uint64]changeset.TokenPoolConfig) + rateLimitPerChain := make(changeset.RateLimiterPerChain) + mu := sync.Mutex{} for src := range e.Chains { - onRampUpdatesByChain[src] = make(map[uint64]changeset.OnRampDestinationUpdate) - pricesByChain[src] = changeset.FeeQuoterPriceUpdatePerSource{ - TokenPrices: map[common.Address]*big.Int{ - state.Chains[src].LinkToken.Address(): testhelpers.DefaultLinkPrice, - state.Chains[src].Weth9.Address(): testhelpers.DefaultWethPrice, - }, - GasPrices: make(map[uint64]*big.Int), - } - feeQuoterDestsUpdatesByChain[src] = make(map[uint64]fee_quoter.FeeQuoterDestChainConfig) - updateOffRampSources[src] = make(map[uint64]changeset.OffRampSourceUpdate) - updateRouterChanges[src] = changeset.RouterUpdates{ - OffRampUpdates: make(map[uint64]bool), - OnRampUpdates: make(map[uint64]bool), - } - rateLimitPerChain := make(changeset.RateLimiterPerChain) + eg.Go(func() error { + onRampUpdatesByChain := make(map[uint64]map[uint64]changeset.OnRampDestinationUpdate) + pricesByChain := make(map[uint64]changeset.FeeQuoterPriceUpdatePerSource) + feeQuoterDestsUpdatesByChain := make(map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig) + updateOffRampSources := make(map[uint64]map[uint64]changeset.OffRampSourceUpdate) + updateRouterChanges := make(map[uint64]changeset.RouterUpdates) + onRampUpdatesByChain[src] = make(map[uint64]changeset.OnRampDestinationUpdate) + pricesByChain[src] = changeset.FeeQuoterPriceUpdatePerSource{ + TokenPrices: map[common.Address]*big.Int{ + state.Chains[src].LinkToken.Address(): testhelpers.DefaultLinkPrice, + state.Chains[src].Weth9.Address(): testhelpers.DefaultWethPrice, + }, + GasPrices: make(map[uint64]*big.Int), + } + feeQuoterDestsUpdatesByChain[src] = make(map[uint64]fee_quoter.FeeQuoterDestChainConfig) + updateOffRampSources[src] = make(map[uint64]changeset.OffRampSourceUpdate) + updateRouterChanges[src] = changeset.RouterUpdates{ + OffRampUpdates: make(map[uint64]bool), + OnRampUpdates: make(map[uint64]bool), + } - for dst := range e.Chains { - if src != dst { - onRampUpdatesByChain[src][dst] = changeset.OnRampDestinationUpdate{ - IsEnabled: true, - AllowListEnabled: false, + for dst := range e.Chains { + if src != dst { + onRampUpdatesByChain[src][dst] = changeset.OnRampDestinationUpdate{ + IsEnabled: true, + AllowListEnabled: false, + } + pricesByChain[src].GasPrices[dst] = testhelpers.DefaultGasPrice + feeQuoterDestsUpdatesByChain[src][dst] = changeset.DefaultFeeQuoterDestChainConfig(true) + + updateOffRampSources[src][dst] = changeset.OffRampSourceUpdate{ + IsEnabled: true, + IsRMNVerificationDisabled: true, + } + + updateRouterChanges[src].OffRampUpdates[dst] = true + updateRouterChanges[src].OnRampUpdates[dst] = true + mu.Lock() + rateLimitPerChain[dst] = changeset.RateLimiterConfig{ + Inbound: token_pool.RateLimiterConfig{ + IsEnabled: false, + Capacity: big.NewInt(0), + Rate: big.NewInt(0), + }, + Outbound: token_pool.RateLimiterConfig{ + IsEnabled: false, + Capacity: big.NewInt(0), + Rate: big.NewInt(0), + }, + } + mu.Unlock() } - pricesByChain[src].GasPrices[dst] = testhelpers.DefaultGasPrice - feeQuoterDestsUpdatesByChain[src][dst] = changeset.DefaultFeeQuoterDestChainConfig(true) + } - updateOffRampSources[src][dst] = changeset.OffRampSourceUpdate{ - IsEnabled: true, - IsRMNVerificationDisabled: true, - } + mu.Lock() + poolUpdates[src] = changeset.TokenPoolConfig{ + Type: changeset.BurnMintTokenPool, + Version: deployment.Version1_5_1, + ChainUpdates: rateLimitPerChain, + } + mu.Unlock() - updateRouterChanges[src].OffRampUpdates[dst] = true - updateRouterChanges[src].OnRampUpdates[dst] = true - rateLimitPerChain[dst] = changeset.RateLimiterConfig{ - Inbound: token_pool.RateLimiterConfig{ - IsEnabled: false, - Capacity: big.NewInt(0), - Rate: big.NewInt(0), + _, err := commonchangeset.Apply(nil, *e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), + changeset.UpdateOnRampDestsConfig{ + UpdatesByChain: onRampUpdatesByChain, }, - Outbound: token_pool.RateLimiterConfig{ - IsEnabled: false, - Capacity: big.NewInt(0), - Rate: big.NewInt(0), + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), + changeset.UpdateFeeQuoterPricesConfig{ + PricesByChain: pricesByChain, }, - } - } - } + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), + changeset.UpdateFeeQuoterDestsConfig{ + UpdatesByChain: feeQuoterDestsUpdatesByChain, + }, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), + changeset.UpdateOffRampSourcesConfig{ + UpdatesByChain: updateOffRampSources, + }, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), + changeset.UpdateRouterRampsConfig{ + UpdatesByChain: updateRouterChanges, + }, + ), + ) + return err + }) + } - poolUpdates[src] = changeset.TokenPoolConfig{ - Type: changeset.BurnMintTokenPool, - Version: deployment.Version1_5_1, - ChainUpdates: rateLimitPerChain, - } + err := eg.Wait() + if err != nil { + return *e, err } - return commonchangeset.Apply(nil, *e, nil, - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ConfigureTokenPoolContractsChangeset), - changeset.ConfigureTokenPoolContractsConfig{ - TokenSymbol: changeset.LinkSymbol, - PoolUpdates: poolUpdates, - }, - ), - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), - changeset.UpdateOnRampDestsConfig{ - UpdatesByChain: onRampUpdatesByChain, - }, - ), - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - changeset.UpdateFeeQuoterPricesConfig{ - PricesByChain: pricesByChain, - }, - ), - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - changeset.UpdateFeeQuoterDestsConfig{ - UpdatesByChain: feeQuoterDestsUpdatesByChain, - }, - ), - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), - changeset.UpdateOffRampSourcesConfig{ - UpdatesByChain: updateOffRampSources, - }, - ), - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), - changeset.UpdateRouterRampsConfig{ - UpdatesByChain: updateRouterChanges, - }, - ), - ) + _, err = commonchangeset.Apply(nil, *e, nil, commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ConfigureTokenPoolContractsChangeset), + changeset.ConfigureTokenPoolContractsConfig{ + TokenSymbol: changeset.LinkSymbol, + PoolUpdates: poolUpdates, + }, + )) + + return *e, err } func setupOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64) (deployment.Environment, error) { From 9f7aeca560bad0cdb5eaf2e294a5223295d88fff Mon Sep 17 00:00:00 2001 From: asoliman Date: Mon, 17 Feb 2025 20:07:11 +0400 Subject: [PATCH 2/4] Parallelize token pools deployment --- .../ccip/changeset/cs_deploy_token_pools.go | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/deployment/ccip/changeset/cs_deploy_token_pools.go b/deployment/ccip/changeset/cs_deploy_token_pools.go index 5666636dcbb..ac8bfd9edd4 100644 --- a/deployment/ccip/changeset/cs_deploy_token_pools.go +++ b/deployment/ccip/changeset/cs_deploy_token_pools.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "golang.org/x/sync/errgroup" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -158,14 +159,21 @@ func DeployTokenPoolContractsChangeset(env deployment.Environment, c DeployToken return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - for chainSelector, poolConfig := range c.NewPools { - chain := env.Chains[chainSelector] - chainState := state.Chains[chainSelector] + deployGrp := errgroup.Group{} - _, err := deployTokenPool(env.Logger, chain, chainState, newAddresses, poolConfig, c.IsTestRouter) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to deploy %s token pool on %s: %w", c.TokenSymbol, chain.String(), err) - } + for chainSelector, poolConfig := range c.NewPools { + chainSelector, poolConfig := chainSelector, poolConfig + deployGrp.Go(func() error { + chain := env.Chains[chainSelector] + chainState := state.Chains[chainSelector] + _, err := deployTokenPool(env.Logger, chain, chainState, newAddresses, poolConfig, c.IsTestRouter) + return err + }) + } + + if err := deployGrp.Wait(); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to deploy %s token pool on %s", + c.TokenSymbol, err) } return deployment.ChangesetOutput{ From 7aaa4ea0abfcb147baa13fa75f70286631a5e73c Mon Sep 17 00:00:00 2001 From: asoliman Date: Tue, 18 Feb 2025 18:50:38 +0400 Subject: [PATCH 3/4] lint --- deployment/ccip/changeset/cs_deploy_token_pools.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/ccip/changeset/cs_deploy_token_pools.go b/deployment/ccip/changeset/cs_deploy_token_pools.go index ac8bfd9edd4..94afb0a35f7 100644 --- a/deployment/ccip/changeset/cs_deploy_token_pools.go +++ b/deployment/ccip/changeset/cs_deploy_token_pools.go @@ -172,7 +172,7 @@ func DeployTokenPoolContractsChangeset(env deployment.Environment, c DeployToken } if err := deployGrp.Wait(); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to deploy %s token pool on %s", + return deployment.ChangesetOutput{}, fmt.Errorf("failed to deploy %s token pool on %w", c.TokenSymbol, err) } From 6bea252976ce5c4303d8b2a8cc75d3c898790991 Mon Sep 17 00:00:00 2001 From: asoliman Date: Wed, 19 Feb 2025 13:16:00 +0400 Subject: [PATCH 4/4] shadow variable --- deployment/environment/crib/ccip_deployer.go | 1 + 1 file changed, 1 insertion(+) diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index 08e991a62bf..fb8890238d3 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -407,6 +407,7 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de rateLimitPerChain := make(changeset.RateLimiterPerChain) mu := sync.Mutex{} for src := range e.Chains { + src := src eg.Go(func() error { onRampUpdatesByChain := make(map[uint64]map[uint64]changeset.OnRampDestinationUpdate) pricesByChain := make(map[uint64]changeset.FeeQuoterPriceUpdatePerSource)