diff --git a/integration-tests/ccip-tests/smoke/ccip_test.go b/integration-tests/ccip-tests/smoke/ccip_test.go index 5f4c679ebb..e00513f17d 100644 --- a/integration-tests/ccip-tests/smoke/ccip_test.go +++ b/integration-tests/ccip-tests/smoke/ccip_test.go @@ -2,12 +2,14 @@ package smoke import ( "fmt" + "github.com/ethereum/go-ethereum/core/types" + "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/osutil" "math/big" + "strings" "testing" "time" - "github.com/ethereum/go-ethereum/core/types" - "github.com/AlekSi/pointer" "github.com/rs/zerolog" "github.com/stretchr/testify/assert" @@ -56,40 +58,20 @@ func TestSmokeCCIPForBidirectionalLane(t *testing.T) { require.NoError(t, setUpOutput.TearDown()) }) + // Create test definitions for each lane. var tests []testDefinition - lookBackDuration := TestCfg.TestGroupInput.SkipRequestIfAnotherRequestTriggeredWithin - var recentTxFound *types.Log - var err error - - addLanesToTest := func(lane *actions.CCIPLane) { - // Create test definitions for given lane if no previous request has been triggered within the specified timeframe. - // By default, the timeframe is set to nil. To define a timeframe, assign a duration to the variable - // SkipRequestIfAnotherRequestTriggeredWithin. - if lookBackDuration != nil { - recentTxFound, err = lane.Source.IsPastRequestTriggeredWithinTimeframe(lane.Context, lookBackDuration) - require.NoError(t, err, "error while finding recent request for lane network %s to network %s", - lane.SourceNetworkName, lane.DestNetworkName) - } - if recentTxFound == nil { + for _, lane := range setUpOutput.Lanes { + tests = append(tests, testDefinition{ + testName: fmt.Sprintf("CCIP message transfer from network %s to network %s", + lane.ForwardLane.SourceNetworkName, lane.ForwardLane.DestNetworkName), + lane: lane.ForwardLane, + }) + if lane.ReverseLane != nil { tests = append(tests, testDefinition{ testName: fmt.Sprintf("CCIP message transfer from network %s to network %s", - lane.SourceNetworkName, lane.DestNetworkName), - lane: lane, + lane.ReverseLane.SourceNetworkName, lane.ReverseLane.DestNetworkName), + lane: lane.ReverseLane, }) - } else { - log.Info(). - Str("TX", recentTxFound.TxHash.Hex()). - Uint64("Block Number", recentTxFound.BlockNumber). - Str("Source", lane.SourceNetworkName). - Str("Dest", lane.DestNetworkName). - Msgf("Lane Skipped. Recent request found within %v minutes.", lookBackDuration.Duration().Minutes()) - } - } - for _, lane := range setUpOutput.Lanes { - addLanesToTest(lane.ForwardLane) - if lane.ReverseLane != nil { - recentTxFound = nil - addLanesToTest(lane.ReverseLane) } } @@ -928,6 +910,123 @@ func TestSmokeCCIPReorgAboveFinalityAtSource(t *testing.T) { }) } +// TestSmokeCCIPForGivenNetworkPairs is designed specifically for scheduled mainnet testing. This test checks for recent +// transaction and skip the lanes accordingly. This test also has capability to take override input on network pairs and phase timeout. +func TestSmokeCCIPForGivenNetworkPairs(t *testing.T) { + t.Parallel() + log := logging.GetTestLogger(t) + TestCfg := testsetups.NewCCIPTestConfig(t, log, testconfig.Smoke) + // override network pairs + var temp []testsetups.NetworkPair + overrideNetworkPairs, err := osutil.GetEnv("OVERRIDE_NETWORK_PAIRS") + require.NoError(t, err, "Error getting OVERRIDE_NETWORK_PAIRS environment variable") + if overrideNetworkPairs != "" { + networkPairs := strings.Split(overrideNetworkPairs, ";") + for _, networkPair := range networkPairs { + // check for any malformed inputs + if !strings.Contains(networkPair, ",") || len(strings.Split(networkPair, ",")) != 2 { + log.Error().Msgf("malformed OVERRIDE_NETWORK_PAIRS environment variable for network pair: %s ", networkPair) + return + } + networkPair = strings.ToUpper(strings.ReplaceAll(networkPair, "_", " ")) + for _, network := range TestCfg.NetworkPairs { + if strings.Contains(networkPair, strings.ToUpper(network.NetworkA.Name)) && strings.Contains(networkPair, strings.ToUpper(network.NetworkB.Name)) { + temp = append(temp, network) + break + } + } + } + log.Info().Int("Pairs", len(temp)).Msg("Number of lanes overridden in the test") + log.Info().Interface("Lanes", networkPairs).Msg("Lanes under test") + TestCfg.NetworkPairs = temp + } + + // phase timeout override + phaseTimeout, err := osutil.GetEnv("OVERRIDE_PHASE_TIMEOUT") + require.NoError(t, err, "Error getting OVERRIDE_PHASE_TIMEOUT environment variable") + if phaseTimeout != "" { + configDuration, err := config.ParseDuration(phaseTimeout) + require.NoError(t, err, "Error parsing phase timeout value") + TestCfg.TestGroupInput.PhaseTimeout = &configDuration + log.Info().Float64("Timeout in minutes", configDuration.Duration().Minutes()).Msg("Phase timeout is overridden") + } + + gasLimit := big.NewInt(*TestCfg.TestGroupInput.MsgDetails.DestGasLimit) + setUpOutput := testsetups.CCIPDefaultTestSetUp(t, &log, "smoke-ccip", nil, TestCfg) + if len(setUpOutput.Lanes) == 0 { + log.Error().Msg("No lanes found") + return + } + + t.Cleanup(func() { + // If we are running a test that is a token transfer, we need to verify the balance. + // skip the balance check for existing deployment, there can be multiple external requests in progress for existing deployments + // other than token transfer initiated by the test, which can affect the balance check + // therefore we check the balance only for the ccip environment created by the test + if TestCfg.TestGroupInput.MsgDetails.IsTokenTransfer() && + !pointer.GetBool(TestCfg.TestGroupInput.USDCMockDeployment) && + !pointer.GetBool(TestCfg.TestGroupInput.ExistingDeployment) { + setUpOutput.Balance.Verify(t) + } + require.NoError(t, setUpOutput.TearDown(), "error in tear down step") + }) + + var tests []testDefinition + lookBackDuration := TestCfg.TestGroupInput.SkipRequestIfAnotherRequestTriggeredWithin + var recentTxFound *types.Log + + addLanesToTest := func(lane *actions.CCIPLane) { + // Create test definitions for given lane if no previous request has been triggered within the specified timeframe. + // By default, the timeframe is set to nil. To define a timeframe, assign a duration to the variable + // SkipRequestIfAnotherRequestTriggeredWithin. + if lookBackDuration != nil { + recentTxFound, err = lane.Source.IsPastRequestTriggeredWithinTimeframe(lane.Context, lookBackDuration) + require.NoError(t, err, "error while finding recent request for lane network %s to network %s", + lane.SourceNetworkName, lane.DestNetworkName) + } + if recentTxFound == nil { + tests = append(tests, testDefinition{ + testName: fmt.Sprintf("CCIP message transfer from network %s to network %s", + lane.SourceNetworkName, lane.DestNetworkName), + lane: lane, + }) + } else { + log.Info(). + Str("TX", recentTxFound.TxHash.Hex()). + Uint64("Block Number", recentTxFound.BlockNumber). + Str("Source", lane.SourceNetworkName). + Str("Dest", lane.DestNetworkName). + Msgf("Lane Skipped. Recent request found within %v minutes.", lookBackDuration.Duration().Minutes()) + } + } + for _, lane := range setUpOutput.Lanes { + addLanesToTest(lane.ForwardLane) + if lane.ReverseLane != nil { + recentTxFound = nil + addLanesToTest(lane.ReverseLane) + } + } + + // Execute tests. + log.Info().Int("Total Lanes", len(tests)).Msg("Starting CCIP test") + for _, test := range tests { + tc := test + t.Run(tc.testName, func(t *testing.T) { + t.Parallel() + tc.lane.Test = t + log.Info(). + Str("Source", tc.lane.SourceNetworkName). + Str("Destination", tc.lane.DestNetworkName). + Msgf("Starting lane %s -> %s", tc.lane.SourceNetworkName, tc.lane.DestNetworkName) + + tc.lane.RecordStateBeforeTransfer() + err = tc.lane.SendRequests(1, gasLimit) + require.NoError(t, err, "error sending requests") + tc.lane.ValidateRequests() + }) + } +} + // performAboveFinalityReorgAndValidate is to perform the above finality reorg test func performAboveFinalityReorgAndValidate(t *testing.T, network string) { t.Helper() diff --git a/integration-tests/ccip-tests/testconfig/override/mainnet.toml b/integration-tests/ccip-tests/testconfig/override/mainnet.toml index ebecebe6a4..6fa0c3e0dd 100644 --- a/integration-tests/ccip-tests/testconfig/override/mainnet.toml +++ b/integration-tests/ccip-tests/testconfig/override/mainnet.toml @@ -1081,76 +1081,78 @@ TTL = '8h' [CCIP.Env.Network] selected_networks = [ - 'ARBITRUM_MAINNET', - 'AVALANCHE_MAINNET', - 'BASE_MAINNET', - 'BLAST_MAINNET', - 'BSC_MAINNET', - 'ETHEREUM_MAINNET', - 'GNOSIS_MAINNET', - 'KROMA_MAINNET', - 'METIS_ANDROMEDA', - 'OPTIMISM_MAINNET', - 'POLYGON_MAINNET', - 'WEMIX_MAINNET', - 'ZKSYNC_MAINNET', - ] + 'ARBITRUM_MAINNET', + 'AVALANCHE_MAINNET', + 'BASE_MAINNET', + 'BLAST_MAINNET', + 'BSC_MAINNET', + 'CELO_MAINNET', + 'ETHEREUM_MAINNET', + 'GNOSIS_MAINNET', + 'KROMA_MAINNET', + 'METIS_ANDROMEDA', + 'MODE_MAINNET', + 'OPTIMISM_MAINNET', + 'POLYGON_MAINNET', + 'WEMIX_MAINNET', + 'ZKSYNC_MAINNET', +] [CCIP.Groups.load] NetworkPairs = [ - 'ARBITRUM_MAINNET,BSC_MAINNET', # added as batch 1 - 'ARBITRUM_MAINNET,OPTIMISM_MAINNET', # added as batch 1 - 'AVALANCHE_MAINNET,ARBITRUM_MAINNET', # added as batch 2 - 'AVALANCHE_MAINNET,BASE_MAINNET', # added as batch 2 - 'AVALANCHE_MAINNET,BSC_MAINNET', - 'AVALANCHE_MAINNET,OPTIMISM_MAINNET', # added as batch 2 - 'AVALANCHE_MAINNET,POLYGON_MAINNET', - 'AVALANCHE_MAINNET,WEMIX_MAINNET', # added as batch 2 - 'BASE_MAINNET,ARBITRUM_MAINNET', - 'BASE_MAINNET,BSC_MAINNET', - 'BASE_MAINNET,OPTIMISM_MAINNET', - 'BASE_MAINNET,POLYGON_MAINNET', # added as batch 2 - 'BLAST_MAINNET,ARBITRUM_MAINNET', # added as batch 3 - 'BLAST_MAINNET,BASE_MAINNET', # added as batch 3 - 'BLAST_MAINNET,BSC_MAINNET', # added as batch 3 - 'BSC_MAINNET,OPTIMISM_MAINNET', # added as batch 2 - 'BSC_MAINNET,POLYGON_MAINNET', - 'BSC_MAINNET,WEMIX_MAINNET', # added as batch 2 - 'ETHEREUM_MAINNET,ARBITRUM_MAINNET', - 'ETHEREUM_MAINNET,AVALANCHE_MAINNET', - 'ETHEREUM_MAINNET,BASE_MAINNET', - 'ETHEREUM_MAINNET,BLAST_MAINNET', # added as batch 3 - 'ETHEREUM_MAINNET,BSC_MAINNET', - 'ETHEREUM_MAINNET,CELO_MAINNET', # added as batch 3 - 'ETHEREUM_MAINNET,GNOSIS_MAINNET', # added as batch 3 - 'ETHEREUM_MAINNET,METIS_ANDROMEDA', # added as batch 3 - 'ETHEREUM_MAINNET,MODE_MAINNET', # added as batch 3 - 'ETHEREUM_MAINNET,OPTIMISM_MAINNET', - 'ETHEREUM_MAINNET,POLYGON_MAINNET', - 'ETHEREUM_MAINNET,WEMIX_MAINNET', - 'ETHEREUM_MAINNET,ZKSYNC_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,ARBITRUM_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,AVALANCHE_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,BASE_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,BSC_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,OPTIMISM_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,POLYGON_MAINNET', # added as batch 3 - 'METIS_ANDROMEDA,ARBITRUM_MAINNET', # added as batch 3 - 'MODE_MAINNET,ARBITRUM_MAINNET', # added as batch 3 - 'MODE_MAINNET,BASE_MAINNET', # added as batch 3 - 'MODE_MAINNET,BSC_MAINNET', # added as batch 3 - 'MODE_MAINNET,OPTIMISM_MAINNET', # added as batch 3 - 'OPTIMISM_MAINNET,POLYGON_MAINNET', - 'OPTIMISM_MAINNET,WEMIX_MAINNET', # added as batch 2 - 'POLYGON_MAINNET,ARBITRUM_MAINNET', # added as batch 1 - 'POLYGON_MAINNET,WEMIX_MAINNET', # added as batch 2 - 'WEMIX_MAINNET,ARBITRUM_MAINNET', # added as batch 2 - 'WEMIX_MAINNET,KROMA_MAINNET', - 'ZKSYNC_MAINNET,ARBITRUM_MAINNET' # added as batch 3 + 'ARBITRUM_MAINNET,BSC_MAINNET', + 'ARBITRUM_MAINNET,OPTIMISM_MAINNET', + 'AVALANCHE_MAINNET,ARBITRUM_MAINNET', + 'AVALANCHE_MAINNET,BASE_MAINNET', + 'AVALANCHE_MAINNET,BSC_MAINNET', + 'AVALANCHE_MAINNET,OPTIMISM_MAINNET', + 'AVALANCHE_MAINNET,POLYGON_MAINNET', + 'AVALANCHE_MAINNET,WEMIX_MAINNET', + 'BASE_MAINNET,ARBITRUM_MAINNET', + 'BASE_MAINNET,BSC_MAINNET', + 'BASE_MAINNET,OPTIMISM_MAINNET', + 'BASE_MAINNET,POLYGON_MAINNET', + 'BLAST_MAINNET,ARBITRUM_MAINNET', + 'BLAST_MAINNET,BASE_MAINNET', + 'BLAST_MAINNET,BSC_MAINNET', + 'BSC_MAINNET,OPTIMISM_MAINNET', + 'BSC_MAINNET,POLYGON_MAINNET', + 'BSC_MAINNET,WEMIX_MAINNET', + 'ETHEREUM_MAINNET,ARBITRUM_MAINNET', + 'ETHEREUM_MAINNET,AVALANCHE_MAINNET', + 'ETHEREUM_MAINNET,BASE_MAINNET', + 'ETHEREUM_MAINNET,BLAST_MAINNET', + 'ETHEREUM_MAINNET,BSC_MAINNET', + 'ETHEREUM_MAINNET,CELO_MAINNET', + 'ETHEREUM_MAINNET,GNOSIS_MAINNET', + 'ETHEREUM_MAINNET,METIS_ANDROMEDA', + 'ETHEREUM_MAINNET,MODE_MAINNET', + 'ETHEREUM_MAINNET,OPTIMISM_MAINNET', + 'ETHEREUM_MAINNET,POLYGON_MAINNET', + 'ETHEREUM_MAINNET,WEMIX_MAINNET', + 'ETHEREUM_MAINNET,ZKSYNC_MAINNET', + 'GNOSIS_MAINNET,ARBITRUM_MAINNET', + 'GNOSIS_MAINNET,AVALANCHE_MAINNET', + 'GNOSIS_MAINNET,BASE_MAINNET', + 'GNOSIS_MAINNET,BSC_MAINNET', + 'GNOSIS_MAINNET,OPTIMISM_MAINNET', + 'GNOSIS_MAINNET,POLYGON_MAINNET', + 'METIS_ANDROMEDA,ARBITRUM_MAINNET', + 'MODE_MAINNET,ARBITRUM_MAINNET', + 'MODE_MAINNET,BASE_MAINNET', + 'MODE_MAINNET,BSC_MAINNET', + 'MODE_MAINNET,OPTIMISM_MAINNET', + 'OPTIMISM_MAINNET,POLYGON_MAINNET', + 'OPTIMISM_MAINNET,WEMIX_MAINNET', + 'POLYGON_MAINNET,ARBITRUM_MAINNET', + 'POLYGON_MAINNET,WEMIX_MAINNET', + 'WEMIX_MAINNET,ARBITRUM_MAINNET', + 'WEMIX_MAINNET,KROMA_MAINNET', + 'ZKSYNC_MAINNET,ARBITRUM_MAINNET' ] BiDirectionalLane = true -PhaseTimeout = '30m' +PhaseTimeout = '20m' ExistingDeployment = true SkipRequestIfAnotherRequestTriggeredWithin = '40m' @@ -1175,59 +1177,59 @@ AmountPerToken = 1 [CCIP.Groups.smoke] # these are all the valid network pairs NetworkPairs = [ - 'ARBITRUM_MAINNET,BSC_MAINNET', # added as batch 1 - 'ARBITRUM_MAINNET,OPTIMISM_MAINNET', # added as batch 1 - 'AVALANCHE_MAINNET,ARBITRUM_MAINNET', # added as batch 2 - 'AVALANCHE_MAINNET,BASE_MAINNET', # added as batch 2 - 'AVALANCHE_MAINNET,BSC_MAINNET', - 'AVALANCHE_MAINNET,OPTIMISM_MAINNET', # added as batch 2 - 'AVALANCHE_MAINNET,POLYGON_MAINNET', - 'AVALANCHE_MAINNET,WEMIX_MAINNET', # added as batch 2 - 'BASE_MAINNET,ARBITRUM_MAINNET', - 'BASE_MAINNET,BSC_MAINNET', - 'BASE_MAINNET,OPTIMISM_MAINNET', - 'BASE_MAINNET,POLYGON_MAINNET', # added as batch 2 - 'BLAST_MAINNET,ARBITRUM_MAINNET', # added as batch 3 - 'BLAST_MAINNET,BASE_MAINNET', # added as batch 3 - 'BLAST_MAINNET,BSC_MAINNET', # added as batch 3 - 'BSC_MAINNET,OPTIMISM_MAINNET', # added as batch 2 - 'BSC_MAINNET,POLYGON_MAINNET', - 'BSC_MAINNET,WEMIX_MAINNET', # added as batch 2 - 'ETHEREUM_MAINNET,ARBITRUM_MAINNET', - 'ETHEREUM_MAINNET,AVALANCHE_MAINNET', - 'ETHEREUM_MAINNET,BASE_MAINNET', - 'ETHEREUM_MAINNET,BLAST_MAINNET', # added as batch 3 - 'ETHEREUM_MAINNET,BSC_MAINNET', - 'ETHEREUM_MAINNET,CELO_MAINNET', # added as batch 3 - 'ETHEREUM_MAINNET,GNOSIS_MAINNET', # added as batch 3 - 'ETHEREUM_MAINNET,METIS_ANDROMEDA', # added as batch 3 - 'ETHEREUM_MAINNET,MODE_MAINNET', # added as batch 3 - 'ETHEREUM_MAINNET,OPTIMISM_MAINNET', - 'ETHEREUM_MAINNET,POLYGON_MAINNET', - 'ETHEREUM_MAINNET,WEMIX_MAINNET', - 'ETHEREUM_MAINNET,ZKSYNC_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,ARBITRUM_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,AVALANCHE_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,BASE_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,BSC_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,OPTIMISM_MAINNET', # added as batch 3 - 'GNOSIS_MAINNET,POLYGON_MAINNET', # added as batch 3 - 'METIS_ANDROMEDA,ARBITRUM_MAINNET', # added as batch 3 - 'MODE_MAINNET,ARBITRUM_MAINNET', # added as batch 3 - 'MODE_MAINNET,BASE_MAINNET', # added as batch 3 - 'MODE_MAINNET,BSC_MAINNET', # added as batch 3 - 'MODE_MAINNET,OPTIMISM_MAINNET', # added as batch 3 - 'OPTIMISM_MAINNET,POLYGON_MAINNET', - 'OPTIMISM_MAINNET,WEMIX_MAINNET', # added as batch 2 - 'POLYGON_MAINNET,ARBITRUM_MAINNET', # added as batch 1 - 'POLYGON_MAINNET,WEMIX_MAINNET', # added as batch 2 - 'WEMIX_MAINNET,ARBITRUM_MAINNET', # added as batch 2 - 'WEMIX_MAINNET,KROMA_MAINNET', - 'ZKSYNC_MAINNET,ARBITRUM_MAINNET' # added as batch 3 + 'ARBITRUM_MAINNET,BSC_MAINNET', + 'ARBITRUM_MAINNET,OPTIMISM_MAINNET', + 'AVALANCHE_MAINNET,ARBITRUM_MAINNET', + 'AVALANCHE_MAINNET,BASE_MAINNET', + 'AVALANCHE_MAINNET,BSC_MAINNET', + 'AVALANCHE_MAINNET,OPTIMISM_MAINNET', + 'AVALANCHE_MAINNET,POLYGON_MAINNET', + 'AVALANCHE_MAINNET,WEMIX_MAINNET', + 'BASE_MAINNET,ARBITRUM_MAINNET', + 'BASE_MAINNET,BSC_MAINNET', + 'BASE_MAINNET,OPTIMISM_MAINNET', + 'BASE_MAINNET,POLYGON_MAINNET', + 'BLAST_MAINNET,ARBITRUM_MAINNET', + 'BLAST_MAINNET,BASE_MAINNET', + 'BLAST_MAINNET,BSC_MAINNET', + 'BSC_MAINNET,OPTIMISM_MAINNET', + 'BSC_MAINNET,POLYGON_MAINNET', + 'BSC_MAINNET,WEMIX_MAINNET', + 'ETHEREUM_MAINNET,ARBITRUM_MAINNET', + 'ETHEREUM_MAINNET,AVALANCHE_MAINNET', + 'ETHEREUM_MAINNET,BASE_MAINNET', + 'ETHEREUM_MAINNET,BLAST_MAINNET', + 'ETHEREUM_MAINNET,BSC_MAINNET', + 'ETHEREUM_MAINNET,CELO_MAINNET', + 'ETHEREUM_MAINNET,GNOSIS_MAINNET', + 'ETHEREUM_MAINNET,METIS_ANDROMEDA', + 'ETHEREUM_MAINNET,MODE_MAINNET', + 'ETHEREUM_MAINNET,OPTIMISM_MAINNET', + 'ETHEREUM_MAINNET,POLYGON_MAINNET', + 'ETHEREUM_MAINNET,WEMIX_MAINNET', + 'ETHEREUM_MAINNET,ZKSYNC_MAINNET', + 'GNOSIS_MAINNET,ARBITRUM_MAINNET', + 'GNOSIS_MAINNET,AVALANCHE_MAINNET', + 'GNOSIS_MAINNET,BASE_MAINNET', + 'GNOSIS_MAINNET,BSC_MAINNET', + 'GNOSIS_MAINNET,OPTIMISM_MAINNET', + 'GNOSIS_MAINNET,POLYGON_MAINNET', + 'METIS_ANDROMEDA,ARBITRUM_MAINNET', + 'MODE_MAINNET,ARBITRUM_MAINNET', + 'MODE_MAINNET,BASE_MAINNET', + 'MODE_MAINNET,BSC_MAINNET', + 'MODE_MAINNET,OPTIMISM_MAINNET', + 'OPTIMISM_MAINNET,POLYGON_MAINNET', + 'OPTIMISM_MAINNET,WEMIX_MAINNET', + 'POLYGON_MAINNET,ARBITRUM_MAINNET', + 'POLYGON_MAINNET,WEMIX_MAINNET', + 'WEMIX_MAINNET,ARBITRUM_MAINNET', + 'WEMIX_MAINNET,KROMA_MAINNET', + 'ZKSYNC_MAINNET,ARBITRUM_MAINNET' ] BiDirectionalLane = true -PhaseTimeout = '40m' +PhaseTimeout = '20m' LocalCluster = false ExistingDeployment = true ReuseContracts = true