Repository navigation
feat(canton): add CCIP bridge disclosures and client examples - #10002
Closed
ralph-bitgo[bot] wants to merge 5 commits into
Closed
ralph-bitgo[bot] wants to merge 5 commits into
ralph-bitgo[bot] wants to merge 5 commits into
Conversation
Add CantonDisclosedContract and an optional disclosedContracts array to CantonCommandParams so clients can pass the CCIP OffRamp/CCV/token-pool disclosure blobs (fetched from the public EDS endpoints) through to the platform, and an optional createArgumentFilter on CantonCommandResolveContractSpec so contract resolution can select a CCIPReceiver payload-aware by receiverFinalityConfig. Why: CCIP Execute/Send require cross-party disclosures at ledger prepare time and finality-specific receivers; without these fields external clients cannot assemble the commands for custodial Canton wallets. Ticket: SCAAS-11643 Session-Id: c64486c0-8dba-415e-ab0a-1e7c4a99b35e Task-Id: ce366653-12a0-4f96-bb86-02993a4d1b4c Requested-By: Zeeshan Amjad <zeeshanamjad@bitgo.com>
Add a disclosedContracts setter to CantonCommandBuilder and include the disclosures in CantonCommandBuilder.toRequestObject()/CantonCommandRequest when present, forwarding them to IMS alongside the existing resolveContracts specs. Why: CantonCommandRequest had no disclosedContracts field, so the platform could not pass client-fetched CCIP disclosures through to the ledger prepare call — a hard blocker for custodial Execute/Send. Ticket: SCAAS-11643 Session-Id: c64486c0-8dba-415e-ab0a-1e7c4a99b35e Task-Id: ce366653-12a0-4f96-bb86-02993a4d1b4c Requested-By: Zeeshan Amjad <zeeshanamjad@bitgo.com>
Add executeCcipMessage.js and sendCcipMessage.js (inbound and outbound USD1 CCIP lanes) plus a README covering platform vs client responsibilities and the wallet-party onboarding prerequisites (domain hosting, CCIP package vetting, JSON-API rights). The scripts attach the EDS disclosure blobs via cantonCommandParams.disclosedContracts, select the receiver finality-aware (createArgumentFilter, or --receiverCid), halt dependent setup steps on pending approvals, and pass tokenName so the platform can lock and validate Send holdings. Why: external clients need a working reference for bridging USD1 between EVM and Canton on BitGo custodial wallets; each onboarding prerequisite missing today surfaces as a cryptic mid-flow ledger error. Ticket: SCAAS-11643 Session-Id: c64486c0-8dba-415e-ab0a-1e7c4a99b35e Task-Id: ce366653-12a0-4f96-bb86-02993a4d1b4c Requested-By: Zeeshan Amjad <zeeshanamjad@bitgo.com>
Read the actual wallet party during Execute dry runs, permit router-only setup resume, reject conflicting finality overrides, and require a verified lane configuration for production execution. Blank-party disclosures and skipped receiver setup make the draft flow fail; unverified production identities must not silently route funds. Seven offline CLI scenarios exercise these paths without ledger calls. Ticket: SCAAS-11643 Session-Id: c64486c0-8dba-415e-ab0a-1e7c4a99b35e Task-Id: ce366653-12a0-4f96-bb86-02993a4d1b4c Requested-By: Zeeshan Amjad <zeeshanamjad@bitgo.com>
Contributor
Contributor
|
|
…sures server-side
- Remove the disclosedContracts() builder setter, the CantonCommandRequest
field, and the CantonDisclosedContract type from sdk-core baseTypes
(createArgumentFilter stays — used by the payload-aware receiver
resolution).
- executeCcipMessage.js: the client now supplies only the encoded message
and the raw CCV verifier results ({ destAddress, verifierResults });
IMS resolves and injects the receiver exercise target, choice context,
CCV contract ids/contexts, token transfer, and all ledger disclosures —
all EDS calls removed from the example.
- sendCcipMessage.js: the client supplies only the message, instruments,
and holding ids; IMS resolves the token pool (TAR), fee token config,
pool/global/CCV/executor contexts and contract ids, and all ledger
disclosures — TAR/pool/global/CCV/executor EDS calls removed.
- README updated to reflect the new responsibility split.
SCAAS-11643
zeeshanamjad-eng
force-pushed
the
SCAAS-11643-ccip-bridge-examples
branch
from
October 19, 2026 12:36
65e4fca to
772df0b
Compare
Contributor
|
Closing without merging — per review, no BitGoJS changes are needed for the CCIP Canton flow:
Companion changes: indexerdb-microservice#2372 + bitgo-microservices#63639 carry the IMS/wallet-platform side. This branch stays as a reference for the scripts' history. |
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.
Description
Add Canton CCIP bridge request support and USD1 EVM↔Canton client examples:
CantonCommandParams.disclosedContractsand payload-awareresolveContracts.createArgumentFilter; export the EDS disclosure shape.CantonCommandBuilder/CantonCommandRequest.tokenName. Setup halts on pending approval and supports router-only resume. Dry runs read the actual wallet party but never submit. Conflicting finality overrides fail early.--laneConfigwith independently verified identities/URLs; the draft production constants are not treated as verified.Why: external clients cannot prepare custodial CCIP Execute/Send without cross-party disclosures and correct receiver finality. The examples expose the existing sendMany flow while avoiding validator credentials and preventing dependent setup steps from racing pending approval.
Issue Number
SCAAS-11643
Type of change
How Has This Been Tested?
cd modules/sdk-coin-canton && npx mocha --grep CantonCommandBuilder). Scoped SDK builds completed/current after workspace installation; ESLint passed for sdk-core and sdk-coin-canton, and sdk-coin-canton formatting passed.node --check. Seven offline CLI scenarios exercised dry-run party handling, finality filtering, approval halting, router-only resume, outbound disclosures/tokenName, production gating and conflicting-finality rejection. External responses were fixtures; no live signing or ledger execution was exercised.BITGOJS_TEST_PASSWORD-gated setup; those suites were not locally verified.Checklist:
Related delivery and remaining acceptance
The IMS draft provides server-side disclosure/factory resolution and pending-input metadata. Wallet-platform provides Send locks and validation. Live custodial lane execution, production constants verification, validator onboarding and the party-preflight API product ask remain outstanding; this draft does not close operational acceptance.
Pre-PR ACI gate skipped: no
.github/ai-checks/pr-riskon the base branch.Cross-repository drafts