feat(load): Connect load tests to prod-testnet#766
Open
rodrigombsoares wants to merge 8 commits into
Open
Conversation
rodrigombsoares
commented
Jul 8, 2026
d7a46c7 to
709048a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Connects CCIP e2e and WASP load tests to Canton TestNet + Sepolia on top of the pr3 env-bootstrap scaffolding. Adds real Canton auth, compile-time v1_0_0 ledger bindings (
-tags=prodledger), contract reuse on prod, all four load directions, and CI that runs them against live infrastructure. Includes a prod receiver fix: CCIPReceiver deploy now wires the required committee-verifier CCV, with a CLI command and test bootstrap auto-resolution so inbound EVM→Canton execution works on prod.Features
Prod-testnet connectivity & config
env-prod-testnet.ci.toml— checked-in config for Canton TestNet + Sepolia (CLDF addresses, RPCs, indexers, Canton gRPC endpoints)env-prod-testnet-out.toml→env-prod-testnet.ci.toml(overridable viaCCIP_CONFIG_FILE)cldf_auth.go): OAuth client credentials / authorization code / static JWT viaCANTON_AUTH_*,CANTON_PARTY_ID,CANTON_GRPC_URL, etc.cldf.gorefactor — real auth providers, party resolution from env or ledger, optional internal endpointsTestIntegration_CantonProdTestnet_Connection(gRPC auth + list holdings).gitignore— local prod/staging env files underccip/devenv/Ledger bindings for deployed contracts (
-tags=prodledger)Prod ledger uses
bindings/generated/v1_0_0, notlatest. Newccip/devenv/ledgerbind/package:prodledger)CcvExtraContextvsContext, etc.)send_op_prod.go,execute_op_prod.go)impl.go,manual_execution.go,fee_quoter_limits.goContract lifecycle on prod (reuse, don’t redeploy)
CANTON_ROUTER_INSTANCE_ID,CANTON_SENDER_INSTANCE_ID,CANTON_RECEIVER_INSTANCE_IDisRemote()— remote chains skip FeeQuoter ACS lookups (e.g. max data bytes check)Prod receiver fix (required CCV)
On prod, inbound EVM→Canton messages fail if the party’s CCIPReceiver is deployed without the committee verifier in
RequiredCCVs. This PR fixes that in three places:CLI:
canton sync-receiver-ccvNew CLI subcommand to deploy or update a CCIPReceiver with the correct required CCV before running inbound prod load/e2e:
canton sync-receiver-ccv \ --required-ccv '<committee-verifier-instanceId@owner>' \ --finality 1cantonops.GetOrCreateReceiver— finds an existing receiver by finality, updatesRequiredCCVsif needed, or deploys a new one--required-ccvis the Canton committee verifier raw instance address (instanceId@owner)DeployCCIPReceivernow includes CCVDeployCCIPReceiverinmanual_execution.gono longer deploys withRequiredCCVs: nil. It readsCANTON_RECEIVER_REQUIRED_CCVviareceiverRequiredCCVsFromEnv()and passes it into the receiver template at deploy time:Tests and load runs that call
SetupReceive/ManuallyExecuteMessageautomatically get a correctly configured receiver when the env var is set.Test bootstrap auto-resolution
SetupCantonReceiveintests/helpers.goauto-populatesCANTON_RECEIVER_REQUIRED_CCVfrom the CLDF datastore (committee verifier address) when unset, so e2e/load tests don’t require manual env wiring on prod. On failure it tells you to set the var explicitly or runsync-receiver-ccv.Config fix
env-prod-testnet.ci.toml— committee verifier entry updated with the correct raw-instance label (committeeverifier-tqkny@ccvOwner::...) so datastore resolution works.Related hardening
testhelpers.ResolveAddressFromDatastore— clearer error when address ref has no labels (raw instance address missing)EVM→Canton message path fixes
NO_EXECUTION_ADDRESSinstead of EVM Executor — Canton execution is manual; EVM executor doesn’t support Canton destEVMToCantonMessageOptionscentralized with correct finality + no-exec executorhashInstanceAddress— handles both devenv raw addresses (instanceId@owner) and prod pre-hashed 32-byte addressesConfirmEVMSendOnSourcebypass on prod — uses tx receipt only; avoids broken block-1→latest poller on public Sepolia RPCLoad tests on prod-testnet (all 4 directions)
CANTON_LOAD_SKIP_EXEC_CONFIRM=true); no EVM exec confirmConfirmExecOnDest)Makefile targets added:
run-*-load-prod,run-*-token-e2e-prod(all use-tags=prodledger -ccip-env=prod-testnet).Prod-specific test behavior:
PRIVATE_KEYdrives EVM sender/receiver on prod (ResolveEVMReceiver)Token lane resolution on prod
resolveTokenLaneFromDatastore— when on-chainGetTokenTransferConfigsdoesn’t match (typical on prod), fall back to TOML + CLDF datastore usingremote_pool_*refsCI / GitHub Actions
ccip-load-testaction consolidated — devenv setup, prod Go install, test run, log upload in one action-tags=prodledger -ccip-env=prod-testnet(was missing in pr3)skip_exec_confirm=trueforcanton2evmdirection in prod CIccip-load-command.ymlworkflow + chatops referenceBug fixes
ledgerbindlayer — prod template IDs / field names were wrong withlatestbindingssync-receiver-ccv; test auto-resolutionEVMToCantonMessageOptionsTestMainflag.Parse()so-ccip-envworks in e2e package