Skip to content

Commit

Permalink
Ccip-3424 Add ccip smoke in CI (#14501)
Browse files Browse the repository at this point in the history
* add ccip v1.6 smoke in ci

* changes

* reduce timeout

* more fix

* login to ecr

* amazon ecr login

* add constant

* fixes

* add selected network

* undo rename

* add token config

* fix lint

* updates

* changes

* more updates

* fix lint

* go.mod: bump chainlink-ccip

* fixes

* changes

* change jd version

* hardcoded jd

* fixes

* update references

* set onramp in ccip reader tester data

* renamed

* set timeout

* review comments

---------

Co-authored-by: Makram Kamaleddine <[email protected]>
  • Loading branch information
AnieeG and makramkd authored Sep 25, 2024
1 parent 8c9bd82 commit 2440917
Show file tree
Hide file tree
Showing 24 changed files with 295 additions and 106 deletions.
17 changes: 17 additions & 0 deletions .github/e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,23 @@ runner-test-matrix:

# END: OCR tests

# START: CCIPv1.6 tests

- id: smoke/ccip_test.go:*
path: integration-tests/smoke/ccip_test.go
test_env_type: docker
runs_on: ubuntu-latest
triggers:
- PR E2E Core Tests
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/ && go test smoke/ccip_test.go -timeout 12m -test.parallel=1 -count=1 -json
pyroscope_env: ci-smoke-ccipv1_6-evm-simulated
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2

# END: CCIPv1.6 tests

# START: Automation tests

- id: smoke/automation_test.go:^TestAutomationBasic/registry_2_0|TestAutomationBasic/registry_2_1_conditional|TestAutomationBasic/registry_2_1_logtrigger$
Expand Down
14 changes: 9 additions & 5 deletions .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ jobs:
contents: read
needs: [build-chainlink, changes]
if: github.event_name == 'pull_request' && ( needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true')
uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@aad83f232743646faa35f5ac03ee3829148d37ce
uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@f2025f8695992ed7948c15ff5e458e4e9ddc9952
with:
workflow_name: Run Core E2E Tests For PR
chainlink_version: ${{ inputs.evm-ref || github.sha }}
Expand Down Expand Up @@ -271,6 +271,7 @@ jobs:
AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }}
AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }}
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
AWS_ACCOUNT_ID_PROD: ${{ secrets.AWS_ACCOUNT_ID_PROD }}

run-core-e2e-tests-for-merge-queue:
name: Run Core E2E Tests For Merge Queue
Expand All @@ -282,7 +283,7 @@ jobs:
contents: read
needs: [build-chainlink, changes]
if: github.event_name == 'merge_group' && ( needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true')
uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@aad83f232743646faa35f5ac03ee3829148d37ce
uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@f2025f8695992ed7948c15ff5e458e4e9ddc9952
with:
workflow_name: Run Core E2E Tests For Merge Queue
chainlink_version: ${{ inputs.evm-ref || github.sha }}
Expand Down Expand Up @@ -315,6 +316,7 @@ jobs:
AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }}
AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }}
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
AWS_ACCOUNT_ID_PROD: ${{ secrets.AWS_ACCOUNT_ID_PROD }}

run-ccip-e2e-tests-for-pr:
name: Run CCIP E2E Tests For PR
Expand All @@ -326,7 +328,7 @@ jobs:
contents: read
needs: [build-chainlink, changes]
if: github.event_name == 'pull_request' && (needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true')
uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@aad83f232743646faa35f5ac03ee3829148d37ce
uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@f2025f8695992ed7948c15ff5e458e4e9ddc9952
with:
workflow_name: Run CCIP E2E Tests For PR
chainlink_version: ${{ inputs.evm-ref || github.sha }}
Expand Down Expand Up @@ -354,7 +356,8 @@ jobs:
AWS_REGION: ${{ secrets.QA_AWS_REGION }}
AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }}
AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }}
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
AWS_ACCOUNT_ID_PROD: ${{ secrets.AWS_ACCOUNT_ID_PROD }}

run-ccip-e2e-tests-for-merge-queue:
name: Run CCIP E2E Tests For Merge Queue
Expand All @@ -366,7 +369,7 @@ jobs:
contents: read
needs: [build-chainlink, changes]
if: github.event_name == 'merge_group' && (needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true')
uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@aad83f232743646faa35f5ac03ee3829148d37ce
uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@f2025f8695992ed7948c15ff5e458e4e9ddc9952
with:
workflow_name: Run CCIP E2E Tests For Merge Queue
chainlink_version: ${{ inputs.evm-ref || github.sha }}
Expand Down Expand Up @@ -395,6 +398,7 @@ jobs:
AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }}
AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }}
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
AWS_ACCOUNT_ID_PROD: ${{ secrets.AWS_ACCOUNT_ID_PROD }}

check-e2e-test-results:
if: always()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,7 @@ func testSetup(ctx context.Context, t *testing.T, readerChain, destChain cciptyp
_, err1 := contract.SetSourceChainConfig(auth, uint64(sourceChain), ccip_reader_tester.OffRampSourceChainConfig{
IsEnabled: true,
MinSeqNr: uint64(seqNum),
OnRamp: utils.RandomAddress().Bytes(),
})
assert.NoError(t, err1)
simulatedBackend.Commit()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/crypto"
"github.com/smartcontractkit/chainlink-common/pkg/utils/tests"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -197,7 +198,7 @@ func Test_USDCReader_MessageHashes(t *testing.T) {
}
}
return true
}, 2*time.Second, 100*time.Millisecond)
}, tests.WaitTimeout(t), 100*time.Millisecond)
})
}
}
Expand Down
2 changes: 1 addition & 1 deletion core/scripts/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ require (
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
github.com/shirou/gopsutil/v3 v3.24.3 // indirect
github.com/smartcontractkit/chain-selectors v1.0.23 // indirect
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240924115754-8858b0423283 // indirect
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240925142036-56f243802342 // indirect
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 // indirect
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240916152957-433914114bd2 // indirect
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240910155501-42f20443189f // indirect
Expand Down
4 changes: 2 additions & 2 deletions core/scripts/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1085,8 +1085,8 @@ github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnj
github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240924115754-8858b0423283 h1:f0vdqcOL9kJZwfmWE76roIyEuiZx/R82js0IfXNAvXg=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240924115754-8858b0423283/go.mod h1:KP82vFCqm+M1G1t6Vos5CewGUGYJkxxCEdxnta4uLlE=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240925142036-56f243802342 h1:uEgdiVPKiPkwSXpsRgK9gxC2TMpjvE5GXpSPl/C20r0=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240925142036-56f243802342/go.mod h1:VyldDDFSelaLyEXO1M7xVoGTTtlT9apfxh90vIMeOwc=
github.com/smartcontractkit/chainlink-common v0.2.3-0.20240925085218-aded1b263ecc h1:ALbyaoRzUSXQ2NhGFKVOyJqO22IB5yQjhjKWbIZGbrI=
github.com/smartcontractkit/chainlink-common v0.2.3-0.20240925085218-aded1b263ecc/go.mod h1:F6WUS6N4mP5ScwpwyTyAJc9/vjR+GXbMCRUOVekQi1g=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 h1:lTGIOQYLk1Ufn++X/AvZnt6VOcuhste5yp+C157No/Q=
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ require (
github.com/shopspring/decimal v1.4.0
github.com/smartcontractkit/chain-selectors v1.0.23
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240924115754-8858b0423283
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240925142036-56f243802342
github.com/smartcontractkit/chainlink-common v0.2.3-0.20240925085218-aded1b263ecc
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240916152957-433914114bd2
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1046,8 +1046,8 @@ github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnj
github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240924115754-8858b0423283 h1:f0vdqcOL9kJZwfmWE76roIyEuiZx/R82js0IfXNAvXg=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240924115754-8858b0423283/go.mod h1:KP82vFCqm+M1G1t6Vos5CewGUGYJkxxCEdxnta4uLlE=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240925142036-56f243802342 h1:uEgdiVPKiPkwSXpsRgK9gxC2TMpjvE5GXpSPl/C20r0=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240925142036-56f243802342/go.mod h1:VyldDDFSelaLyEXO1M7xVoGTTtlT9apfxh90vIMeOwc=
github.com/smartcontractkit/chainlink-common v0.2.3-0.20240925085218-aded1b263ecc h1:ALbyaoRzUSXQ2NhGFKVOyJqO22IB5yQjhjKWbIZGbrI=
github.com/smartcontractkit/chainlink-common v0.2.3-0.20240925085218-aded1b263ecc/go.mod h1:F6WUS6N4mP5ScwpwyTyAJc9/vjR+GXbMCRUOVekQi1g=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 h1:lTGIOQYLk1Ufn++X/AvZnt6VOcuhste5yp+C157No/Q=
Expand Down
6 changes: 5 additions & 1 deletion integration-tests/deployment/ccip/deploy_home_chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ package ccipdeployment
import (
"bytes"
"context"
"errors"
"fmt"
"time"

"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/pkg/errors"

"github.com/smartcontractkit/chainlink-ccip/chainconfig"
"github.com/smartcontractkit/chainlink-ccip/pluginconfig"
Expand Down Expand Up @@ -140,6 +140,10 @@ func AddNodes(
) error {
var nodeParams []capabilities_registry.CapabilitiesRegistryNodeParams
for _, p2pID := range p2pIDs {
// if any p2pIDs are empty throw error
if bytes.Equal(p2pID[:], make([]byte, 32)) {
return errors.Wrapf(errors.New("empty p2pID"), "p2pID: %x selector: %d", p2pID, chain.Selector)
}
nodeParam := capabilities_registry.CapabilitiesRegistryNodeParams{
NodeOperatorId: NodeOperatorID,
Signer: p2pID, // Not used in tests
Expand Down
117 changes: 74 additions & 43 deletions integration-tests/deployment/ccip/test_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ import (
"time"

"github.com/ethereum/go-ethereum/accounts/abi/bind"
"golang.org/x/sync/errgroup"

"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"

"github.com/smartcontractkit/chainlink-testing-framework/lib/logging"

Expand All @@ -23,6 +26,7 @@ import (
"github.com/smartcontractkit/chainlink/integration-tests/deployment"
jobv1 "github.com/smartcontractkit/chainlink/integration-tests/deployment/jd/job/v1"
"github.com/smartcontractkit/chainlink/integration-tests/deployment/memory"
"github.com/smartcontractkit/chainlink/integration-tests/docker/test_env"

"github.com/smartcontractkit/chainlink-common/pkg/logger"

Expand Down Expand Up @@ -55,12 +59,30 @@ func Context(tb testing.TB) context.Context {
return ctx
}

type DeployedTestEnvironment struct {
type DeployedEnv struct {
Ab deployment.AddressBook
Env deployment.Environment
HomeChainSel uint64
FeedChainSel uint64
Nodes map[string]memory.Node
}

type DeployedTestEnvironment struct {
DeployedEnv
Nodes map[string]memory.Node
}

func SetUpHomeAndFeedChains(t *testing.T, lggr logger.Logger, homeChainSel, feedChainSel uint64, chains map[uint64]deployment.Chain) (deployment.AddressBook, deployment.CapabilityRegistryConfig) {
homeChainEVM, _ := chainsel.ChainIdFromSelector(homeChainSel)
ab, capReg, err := DeployCapReg(lggr, chains[homeChainSel])
require.NoError(t, err)

feedAb, _, err := DeployFeeds(lggr, chains[feedChainSel])
require.NoError(t, err)
require.NoError(t, ab.Merge(feedAb))
return ab, deployment.CapabilityRegistryConfig{
EVMChainID: homeChainEVM,
Contract: capReg,
}
}

// NewEnvironmentWithCRAndFeeds creates a new CCIP environment
Expand All @@ -80,19 +102,10 @@ func NewEnvironmentWithCRAndFeeds(t *testing.T, lggr logger.Logger, numChains in
})
// Take lowest for determinism.
homeChainSel := chainSels[HomeChainIndex]
homeChainEVM, _ := chainsel.ChainIdFromSelector(homeChainSel)
ab, capReg, err := DeployCapReg(lggr, chains[homeChainSel])
require.NoError(t, err)

feedSel := chainSels[FeedChainIndex]
feedAb, _, err := DeployFeeds(lggr, chains[feedSel])
require.NoError(t, err)
require.NoError(t, ab.Merge(feedAb))
ab, capReg := SetUpHomeAndFeedChains(t, lggr, homeChainSel, feedSel, chains)

nodes := memory.NewNodes(t, zapcore.InfoLevel, chains, 4, 1, deployment.CapabilityRegistryConfig{
EVMChainID: homeChainEVM,
Contract: capReg,
})
nodes := memory.NewNodes(t, zapcore.InfoLevel, chains, 4, 1, capReg)
for _, node := range nodes {
require.NoError(t, node.App.Start(ctx))
t.Cleanup(func() {
Expand All @@ -102,11 +115,13 @@ func NewEnvironmentWithCRAndFeeds(t *testing.T, lggr logger.Logger, numChains in

e := memory.NewMemoryEnvironmentFromChainsNodes(t, lggr, chains, nodes)
return DeployedTestEnvironment{
Ab: ab,
Env: e,
HomeChainSel: homeChainSel,
FeedChainSel: feedSel,
Nodes: nodes,
DeployedEnv: DeployedEnv{
Ab: ab,
Env: e,
HomeChainSel: homeChainSel,
FeedChainSel: feedSel,
},
Nodes: nodes,
}
}

Expand Down Expand Up @@ -136,11 +151,13 @@ func NewEnvironmentWithCRAndJobs(t *testing.T, lggr logger.Logger, numChains int
}

func ReplayAllLogs(nodes map[string]memory.Node, chains map[uint64]deployment.Chain) error {
blockBySel := make(map[uint64]uint64)
for sel := range chains {
blockBySel[sel] = 1
}
for _, node := range nodes {
for sel := range chains {
if err := node.ReplayLogs(map[uint64]uint64{sel: 1}); err != nil {
return err
}
if err := node.ReplayLogs(blockBySel); err != nil {
return err
}
}
return nil
Expand Down Expand Up @@ -187,10 +204,28 @@ func SendRequest(t *testing.T, e deployment.Environment, state CCIPOnChainState,

// DeployedLocalDevEnvironment is a helper struct for setting up a local dev environment with docker
type DeployedLocalDevEnvironment struct {
Ab deployment.AddressBook
Env deployment.Environment
HomeChainSel uint64
Nodes []devenv.Node
DeployedEnv
testEnv *test_env.CLClusterTestEnv
DON *devenv.DON
}

func (d DeployedLocalDevEnvironment) RestartChainlinkNodes(t *testing.T) error {
errGrp := errgroup.Group{}
for _, n := range d.testEnv.ClCluster.Nodes {
n := n
errGrp.Go(func() error {
if err := n.Container.Terminate(testcontext.Get(t)); err != nil {
return err
}
err := n.RestartContainer()
if err != nil {
return err
}
return nil
})

}
return errGrp.Wait()
}

func NewDeployedLocalDevEnvironment(t *testing.T, lggr logger.Logger) DeployedLocalDevEnvironment {
Expand All @@ -206,21 +241,12 @@ func NewDeployedLocalDevEnvironment(t *testing.T, lggr logger.Logger) DeployedLo
// locate the home chain
homeChainSel := envConfig.HomeChainSelector
require.NotEmpty(t, homeChainSel, "homeChainSel should not be empty")
homeChainEVM, err := chainsel.ChainIdFromSelector(homeChainSel)
require.NoError(t, err)
require.NotEmpty(t, homeChainEVM, "homeChainEVM should not be empty")

// deploy the capability registry
ab, capReg, err := DeployCapReg(lggr, chains[homeChainSel])
require.NoError(t, err)
feedSel := envConfig.FeedChainSelector
require.NotEmpty(t, feedSel, "feedSel should not be empty")
ab, capReg := SetUpHomeAndFeedChains(t, lggr, homeChainSel, feedSel, chains)

// start the chainlink nodes with the CR address
err = devenv.StartChainlinkNodes(t,
envConfig, deployment.CapabilityRegistryConfig{
EVMChainID: homeChainEVM,
Contract: capReg,
},
testEnv, cfg)
err = devenv.StartChainlinkNodes(t, envConfig, capReg, testEnv, cfg)
require.NoError(t, err)

e, don, err := devenv.NewEnvironment(ctx, lggr, *envConfig)
Expand All @@ -230,11 +256,16 @@ func NewDeployedLocalDevEnvironment(t *testing.T, lggr logger.Logger) DeployedLo
zeroLogLggr := logging.GetTestLogger(t)
// fund the nodes
devenv.FundNodes(t, zeroLogLggr, testEnv, cfg, don.PluginNodes())

return DeployedLocalDevEnvironment{
Ab: ab,
Env: *e,
HomeChainSel: homeChainSel,
Nodes: don.Nodes,
DeployedEnv: DeployedEnv{
Ab: ab,
Env: *e,
HomeChainSel: homeChainSel,
FeedChainSel: feedSel,
},
DON: don,
testEnv: testEnv,
}
}

Expand Down
3 changes: 3 additions & 0 deletions integration-tests/deployment/devenv/.sample.env
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# set the following if you don't want the test to tear down the docker containers after test run is finished
# TESTCONTAINERS_RYUK_DISABLED=true

E2E_JD_IMAGE=<job-distributor-image>
E2E_JD_VERSION=<job-distributor-version>

Expand Down
4 changes: 4 additions & 0 deletions integration-tests/deployment/devenv/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ It can either create new simulated private Ethereum network containers or connec

The tests created with this environment are run as [end-to-end integration smoke tests](../../smoke).

Pre-requisites:
- Docker
- Pull access for chainlink and job-distributor images

#### Setting Up Testconfig with Simulated Private Ethereum Network

To run tests (e.g., [ccip-test](../../smoke/ccip_test.go)),
Expand Down
Loading

0 comments on commit 2440917

Please sign in to comment.