@layerzerolabs/common-canton 0.2.111 → 0.2.113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +633 -633
- package/.turbo/turbo-test.log +11 -45
- package/dist/{GOPXFEBJ.js → 4CJTJBWF.js} +6 -2
- package/dist/4CJTJBWF.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/provider.d.ts +2 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +1 -1
- package/package.json +11 -11
- package/src/provider.ts +10 -0
- package/dist/GOPXFEBJ.js.map +0 -1
package/.turbo/turbo-test.log
CHANGED
|
@@ -9,45 +9,11 @@
|
|
|
9
9
|
✅ dpm-3.4.8-openapi-generator-7.21.0
|
|
10
10
|
🔧 openapi-generator version: 7.21.0
|
|
11
11
|
$ docker image inspect --format {{.Architecture}} 438003944538.dkr.ecr.us-east-1.amazonaws.com/layerzerolabs/canton-openapi-tooling:openapi-generator-7.21.0-patch-2
|
|
12
|
-
(node:
|
|
12
|
+
(node:134318) [MODULE_TYPELESS_PACKAGE_JSON] Warning: Module type of file:///home/runner/work/monorepo-internal/monorepo-internal/configs/vm-tooling/values/docker-image-repo.ts is not specified and it doesn't parse as CommonJS.
|
|
13
13
|
Reparsing as ES module because module syntax was detected. This incurs a performance overhead.
|
|
14
14
|
To eliminate this warning, add "type": "module" to /home/runner/work/monorepo-internal/monorepo-internal/package.json.
|
|
15
15
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
16
|
-
|
|
17
|
-
📥 Pulling Docker image from: 438003944538.dkr.ecr.us-east-1.amazonaws.com/layerzerolabs/canton-openapi-tooling:openapi-generator-7.21.0-patch-2
|
|
18
|
-
$ docker pull 438003944538.dkr.ecr.us-east-1.amazonaws.com/layerzerolabs/canton-openapi-tooling:openapi-generator-7.21.0-patch-2
|
|
19
|
-
openapi-generator-7.21.0-patch-2: Pulling from layerzerolabs/canton-openapi-tooling
|
|
20
|
-
17639c486e57: Pulling fs layer
|
|
21
|
-
051d551be118: Pulling fs layer
|
|
22
|
-
18a60288e8be: Pulling fs layer
|
|
23
|
-
dfe8d6e6f390: Pulling fs layer
|
|
24
|
-
e41c3f01e557: Pulling fs layer
|
|
25
|
-
fe131d3b296c: Pulling fs layer
|
|
26
|
-
dfe8d6e6f390: Waiting
|
|
27
|
-
e41c3f01e557: Waiting
|
|
28
|
-
fe131d3b296c: Waiting
|
|
29
|
-
18a60288e8be: Verifying Checksum
|
|
30
|
-
18a60288e8be: Download complete
|
|
31
|
-
17639c486e57: Verifying Checksum
|
|
32
|
-
17639c486e57: Download complete
|
|
33
|
-
e41c3f01e557: Verifying Checksum
|
|
34
|
-
e41c3f01e557: Download complete
|
|
35
|
-
dfe8d6e6f390: Verifying Checksum
|
|
36
|
-
dfe8d6e6f390: Download complete
|
|
37
|
-
fe131d3b296c: Verifying Checksum
|
|
38
|
-
fe131d3b296c: Download complete
|
|
39
|
-
17639c486e57: Pull complete
|
|
40
|
-
051d551be118: Verifying Checksum
|
|
41
|
-
051d551be118: Download complete
|
|
42
|
-
051d551be118: Pull complete
|
|
43
|
-
18a60288e8be: Pull complete
|
|
44
|
-
dfe8d6e6f390: Pull complete
|
|
45
|
-
e41c3f01e557: Pull complete
|
|
46
|
-
fe131d3b296c: Pull complete
|
|
47
|
-
Digest: sha256:9f4b76e7e635939d8107dbe5cf56b881ece20ecb08873f25e5e9d66b2955b5cb
|
|
48
|
-
Status: Downloaded newer image for 438003944538.dkr.ecr.us-east-1.amazonaws.com/layerzerolabs/canton-openapi-tooling:openapi-generator-7.21.0-patch-2
|
|
49
|
-
438003944538.dkr.ecr.us-east-1.amazonaws.com/layerzerolabs/canton-openapi-tooling:openapi-generator-7.21.0-patch-2
|
|
50
|
-
✅ Successfully pulled: 438003944538.dkr.ecr.us-east-1.amazonaws.com/layerzerolabs/canton-openapi-tooling:openapi-generator-7.21.0-patch-2
|
|
16
|
+
✅ Using cached Docker image: 438003944538.dkr.ecr.us-east-1.amazonaws.com/layerzerolabs/canton-openapi-tooling:openapi-generator-7.21.0-patch-2 (amd64)
|
|
51
17
|
👤 Running container as UID:GID 1001:1001
|
|
52
18
|
📜 Executing custom script: set -euo pipefail && rm -rf "src/open-api" && canton-openapi-generator generate -g typescript-fetch -o "src/open-api" --additional-properties=importFileExtension=.js
|
|
53
19
|
$ docker run --rm --add-host=host.docker.internal:host-gateway -e LOCAL_UID=1001 -e LOCAL_GID=1001 -v /home/runner/work/monorepo-internal/monorepo-internal:/workspace -w /workspace/packages/vms/canton/common 438003944538.dkr.ecr.us-east-1.amazonaws.com/layerzerolabs/canton-openapi-tooling:openapi-generator-7.21.0-patch-2 bash -c $'set -euo pipefail && rm -rf "src/open-api" && canton-openapi-generator generate -g typescript-fetch -o "src/open-api" --additional-properties=importFileExtension=.js'
|
|
@@ -729,24 +695,24 @@ $ docker run --rm --add-host=host.docker.internal:host-gateway -e LOCAL_UID=1001
|
|
|
729
695
|
# We appreciate your support! Please consider donation to help us maintain this project. #
|
|
730
696
|
# https://opencollective.com/openapi_generator/donate #
|
|
731
697
|
############################################################################################
|
|
732
|
-
⏳ bash -c set -euo pipefail && rm -rf "src/open-api" && canton-openapi-generator generate -g typescript-fetch -o "src/open-api" --additional-properties=importFileExtension=.js:
|
|
698
|
+
⏳ bash -c set -euo pipefail && rm -rf "src/open-api" && canton-openapi-generator generate -g typescript-fetch -o "src/open-api" --additional-properties=importFileExtension=.js: 5.412s
|
|
733
699
|
[33mTesting types with tsc and vue-tsc is an experimental feature.
|
|
734
700
|
Breaking changes might not follow SemVer, please pin Vitest's version when using it.[39m
|
|
735
701
|
|
|
736
702
|
[1m[46m RUN [49m[22m [36mv3.2.6 [39m[90m/home/runner/work/monorepo-internal/monorepo-internal/packages/vms/canton/common[39m
|
|
737
703
|
|
|
738
|
-
[32m✓[39m test/provider.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m
|
|
739
|
-
[32m✓[39m test/auth/local-token-provider.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m
|
|
740
|
-
[32m✓[39m test/auth/client-credentials-token-provider.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m
|
|
741
|
-
[32m✓[39m test/crypto.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m
|
|
742
|
-
[32m✓[39m test/daml-serde.test.ts [2m([22m[2m19 tests[22m[2m)[22m[32m
|
|
704
|
+
[32m✓[39m test/provider.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 32[2mms[22m[39m
|
|
705
|
+
[32m✓[39m test/auth/local-token-provider.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 12[2mms[22m[39m
|
|
706
|
+
[32m✓[39m test/auth/client-credentials-token-provider.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 20[2mms[22m[39m
|
|
707
|
+
[32m✓[39m test/crypto.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 9[2mms[22m[39m
|
|
708
|
+
[32m✓[39m test/daml-serde.test.ts [2m([22m[2m19 tests[22m[2m)[22m[32m 16[2mms[22m[39m
|
|
743
709
|
[90mstderr[2m | test/sdk.test.ts[2m > [22m[2mError Handling (Unhappy Paths)[2m > [22m[2mshould handle double archive error
|
|
744
710
|
[22m[39mMock miss: GET /v2/state/connected-synchronizers
|
|
745
711
|
|
|
746
712
|
[90mstderr[2m | test/sdk.test.ts[2m > [22m[2mError Handling (Unhappy Paths)[2m > [22m[2mshould handle unauthorized party error
|
|
747
713
|
[22m[39mMock miss: GET /v2/state/connected-synchronizers
|
|
748
714
|
|
|
749
|
-
[32m✓[39m test/sdk.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m
|
|
715
|
+
[32m✓[39m test/sdk.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 28[2mms[22m[39m
|
|
750
716
|
[32m✓[39m [44m[1m TS [22m[49m test/sdk.test.ts [2m([22m[2m18 tests[22m[2m)[22m
|
|
751
717
|
[32m✓[39m [44m[1m TS [22m[49m test/auth/client-credentials-token-provider.test.ts [2m([22m[2m7 tests[22m[2m)[22m
|
|
752
718
|
[32m✓[39m [44m[1m TS [22m[49m test/daml-serde.test.ts [2m([22m[2m19 tests[22m[2m)[22m
|
|
@@ -757,6 +723,6 @@ Breaking changes might not follow SemVer, please pin Vitest's version when using
|
|
|
757
723
|
[2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
|
|
758
724
|
[2m Tests [22m [1m[32m124 passed[39m[22m[90m (124)[39m
|
|
759
725
|
[2mType Errors [22m [2mno errors[22m
|
|
760
|
-
[2m Start at [22m
|
|
761
|
-
[2m Duration [22m 5.
|
|
726
|
+
[2m Start at [22m 05:46:59
|
|
727
|
+
[2m Duration [22m 5.06s[2m (transform 1.42s, setup 0ms, collect 2.30s, tests 117ms, environment 1ms, prepare 1.43s, typecheck 4.57s)[22m
|
|
762
728
|
|
|
@@ -13,6 +13,8 @@ function parseCantonChainUri(uri) {
|
|
|
13
13
|
throw new Error('Canton provider URI missing required "admin-api" query parameter');
|
|
14
14
|
}
|
|
15
15
|
const userId = url.searchParams.get("user-id") ?? "participant_admin";
|
|
16
|
+
const actAsParam = url.searchParams.get("act-as");
|
|
17
|
+
const actAs = actAsParam?.split(",").map((party) => party.trim()).filter((party) => party.length > 0) ?? [];
|
|
16
18
|
const walletUrl = url.searchParams.get("wallet-url");
|
|
17
19
|
if (!walletUrl) {
|
|
18
20
|
throw new Error('Canton provider URI missing required "wallet-url" query parameter');
|
|
@@ -25,6 +27,7 @@ function parseCantonChainUri(uri) {
|
|
|
25
27
|
for (const key of [
|
|
26
28
|
"admin-api",
|
|
27
29
|
"user-id",
|
|
30
|
+
"act-as",
|
|
28
31
|
"wallet-url",
|
|
29
32
|
"sequencer-url",
|
|
30
33
|
"sequencer-validators",
|
|
@@ -49,6 +52,7 @@ function parseCantonChainUri(uri) {
|
|
|
49
52
|
jsonApiUrl,
|
|
50
53
|
adminApiHost,
|
|
51
54
|
userId,
|
|
55
|
+
actAs,
|
|
52
56
|
walletUrl,
|
|
53
57
|
oauth2
|
|
54
58
|
};
|
|
@@ -90,5 +94,5 @@ function createTokenProvider(params, isLocal) {
|
|
|
90
94
|
__name(createTokenProvider, "createTokenProvider");
|
|
91
95
|
|
|
92
96
|
export { createCantonChainProvider, parseCantonChainUri };
|
|
93
|
-
//# sourceMappingURL=
|
|
94
|
-
//# sourceMappingURL=
|
|
97
|
+
//# sourceMappingURL=4CJTJBWF.js.map
|
|
98
|
+
//# sourceMappingURL=4CJTJBWF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider.ts"],"names":["parseCantonChainUri","uri","url","URL","adminApiHost","searchParams","get","Error","userId","actAsParam","actAs","split","map","party","trim","filter","length","walletUrl","tokenUrl","undefined","clientId","clientSecret","scope","audience","key","delete","jsonApiUrl","toString","replace","oauth2","createCantonChainProvider","isLocal","params","tokenProvider","createTokenProvider","configuration","Configuration","basePath","accessToken","getToken","client","CantonClient","grpcClient","CantonGrpcClient","host","LocalTokenProvider","admin","ClientCredentialsTokenProvider"],"mappings":"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","file":"4CJTJBWF.js","sourcesContent":["import {\n ClientCredentialsTokenProvider,\n type ClientCredentialsTokenProviderConfig,\n} from './auth/client-credentials-token-provider';\nimport { LocalTokenProvider } from './auth/local-token-provider';\nimport type { TokenProvider } from './auth/token-provider';\nimport { CantonClient } from './client/canton-client';\nimport { CantonGrpcClient } from './client/grpc';\nimport type { ICantonClient } from './client/interface';\nimport { Configuration } from './open-api/runtime';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Type\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * - {@link client} — JSON Ledger API (commands, queries, updates)\n * - {@link grpcClient} — gRPC Admin API (topology transactions, namespace queries)\n * - {@link tokenProvider} — Shared Bearer-token source used by both transports\n * - {@link walletUrl} — Canton Network validator wallet (scan-proxy CIP-56 endpoints)\n */\nexport type CantonChainProvider = {\n client: ICantonClient;\n grpcClient: CantonGrpcClient;\n tokenProvider: TokenProvider;\n /** Validator wallet URL for scan-proxy CIP-56 endpoints. Required. */\n walletUrl: string;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// URI Parsing\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type CantonChainUriParams = {\n /** Base URL of the JSON Ledger API (e.g. \"http://localhost:5975\") */\n jsonApiUrl: string;\n /** Host:port of the gRPC Admin API (e.g. \"localhost:5076\") */\n adminApiHost: string;\n /** Ledger API user ID (default: \"participant_admin\") */\n userId: string;\n /** Parties granted `actAs` on localnet tokens (comma-separated in the URI). */\n actAs: string[];\n /** Validator wallet URL for scan-proxy CIP-56 endpoints (e.g. \"http://localhost:7201\"). Required. */\n walletUrl: string;\n /** OAuth2 client credentials config — present only for non-local environments */\n oauth2?: ClientCredentialsTokenProviderConfig;\n};\n\n/**\n * Parse a Canton chain provider URI into its constituent parts.\n *\n * URI format:\n * `<json-api-base>?admin-api=<host:port>&user-id=<id>&wallet-url=<url>[&token-url=...&client-id=...&client-secret=...&scope=...&audience=...]`\n *\n * The base URL (everything before the query string) is the JSON Ledger API endpoint.\n * Canton-specific params are extracted and removed; any remaining query params are\n * preserved on the JSON API URL.\n */\nexport function parseCantonChainUri(uri: string): CantonChainUriParams {\n const url = new URL(uri);\n\n const adminApiHost = url.searchParams.get('admin-api');\n if (!adminApiHost) {\n throw new Error('Canton provider URI missing required \"admin-api\" query parameter');\n }\n\n const userId = url.searchParams.get('user-id') ?? 'participant_admin';\n const actAsParam = url.searchParams.get('act-as');\n const actAs =\n actAsParam\n ?.split(',')\n .map((party) => party.trim())\n .filter((party) => party.length > 0) ?? [];\n const walletUrl = url.searchParams.get('wallet-url');\n if (!walletUrl) {\n throw new Error('Canton provider URI missing required \"wallet-url\" query parameter');\n }\n const tokenUrl = url.searchParams.get('token-url') ?? undefined;\n const clientId = url.searchParams.get('client-id') ?? undefined;\n const clientSecret = url.searchParams.get('client-secret') ?? undefined;\n const scope = url.searchParams.get('scope') ?? undefined;\n const audience = url.searchParams.get('audience') ?? undefined;\n\n for (const key of [\n 'admin-api',\n 'user-id',\n 'act-as',\n 'wallet-url',\n 'sequencer-url',\n 'sequencer-validators',\n 'sequencer-quorum',\n 'token-url',\n 'client-id',\n 'client-secret',\n 'scope',\n 'audience',\n ]) {\n url.searchParams.delete(key);\n }\n\n const jsonApiUrl = url.toString().replace(/\\/$/, '');\n\n const oauth2 =\n tokenUrl && clientId && clientSecret\n ? { tokenUrl, clientId, clientSecret, scope, audience }\n : undefined;\n\n return {\n jsonApiUrl,\n adminApiHost,\n userId,\n actAs,\n walletUrl,\n oauth2,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type CreateCantonChainProviderOptions = {\n /** Raw provider URI (from provider config) */\n uri: string;\n /** When true, uses LocalTokenProvider (self-signed JWTs) instead of OAuth2 */\n isLocal: boolean;\n};\n\n/**\n * Create a {@link CantonChainProvider} from a provider URI.\n *\n * - **isLocal=true**: Uses {@link LocalTokenProvider} with admin-level access (self-signed JWTs).\n * - **isLocal=false**: Uses {@link ClientCredentialsTokenProvider} with OAuth2 client\n * credentials extracted from the URI query parameters.\n */\nexport function createCantonChainProvider({\n uri,\n isLocal,\n}: CreateCantonChainProviderOptions): CantonChainProvider {\n const params = parseCantonChainUri(uri);\n\n const tokenProvider = createTokenProvider(params, isLocal);\n\n // ── JSON Ledger API Client ──────────────────────────────────────────\n const configuration = new Configuration({\n basePath: params.jsonApiUrl,\n accessToken: () => tokenProvider.getToken(),\n });\n const client = new CantonClient(configuration, params.userId);\n\n // ── gRPC Admin API Client ───────────────────────────────────────────\n const grpcClient = new CantonGrpcClient({\n host: params.adminApiHost,\n tokenProvider,\n });\n\n return {\n client,\n grpcClient,\n tokenProvider,\n walletUrl: params.walletUrl,\n };\n}\n\nfunction createTokenProvider(params: CantonChainUriParams, isLocal: boolean): TokenProvider {\n if (isLocal) {\n return new LocalTokenProvider({\n userId: params.userId,\n actAs: [],\n admin: true,\n });\n }\n\n // TODO(canton): add other prod auth methods (direct JWT passthrough, etc.).\n if (!params.oauth2) {\n throw new Error(\n 'Canton provider requires OAuth2 credentials (token-url, client-id, client-secret) in the provider URI',\n );\n }\n\n return new ClientCredentialsTokenProvider(params.oauth2);\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ export { IntLikeSchema, assertHexLength, codePointLength, formatDamlDecimal, int
|
|
|
12
12
|
export { cantonActiveContractIdRef, cantonActiveContractIdsRef, cantonAmuletContextRef, cantonAmuletRulesCidRef, cantonDeferredValueSchema, cantonRefreshPartyFilterSchema, cantonSenderPartyRef, encodeCantonDeferredValue, isCantonPlaceholder, parseCantonDeferredValue } from './5PRNJEPB.js';
|
|
13
13
|
export { cantonDeploymentSucceeded, fetchCreatedEvents, findMatchingCreatedEvent, findMatchingCreatedEventFromTx, getExercisedEvent, waitForArchival } from './FPRRDKT5.js';
|
|
14
14
|
export { buildCantonTransaction, cantonAssignedTransactionSchema, cantonCommandSchema, cantonDisclosedContractSchema, cantonMinedTransactionSchema, cantonSignedTransactionSchema, cantonTransactionSchema, cantonTransactionWithResultSchema } from './EYLCZMM4.js';
|
|
15
|
-
export { createCantonChainProvider, parseCantonChainUri } from './
|
|
15
|
+
export { createCantonChainProvider, parseCantonChainUri } from './4CJTJBWF.js';
|
|
16
16
|
export { ClientCredentialsTokenProvider } from './V2H2WXKE.js';
|
|
17
17
|
export { LocalTokenProvider } from './SCEF7TLZ.js';
|
|
18
18
|
export { CantonClient } from './SMLSAWCA.js';
|
package/dist/provider.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export type CantonChainUriParams = {
|
|
|
22
22
|
adminApiHost: string;
|
|
23
23
|
/** Ledger API user ID (default: "participant_admin") */
|
|
24
24
|
userId: string;
|
|
25
|
+
/** Parties granted `actAs` on localnet tokens (comma-separated in the URI). */
|
|
26
|
+
actAs: string[];
|
|
25
27
|
/** Validator wallet URL for scan-proxy CIP-56 endpoints (e.g. "http://localhost:7201"). Required. */
|
|
26
28
|
walletUrl: string;
|
|
27
29
|
/** OAuth2 client credentials config — present only for non-local environments */
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,oCAAoC,EAC5C,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOxD;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAMF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,MAAM,CAAC,EAAE,oCAAoC,CAAC;CACjD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,oCAAoC,EAC5C,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOxD;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAMF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qGAAqG;IACrG,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,MAAM,CAAC,EAAE,oCAAoC,CAAC;CACjD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAyDrE;AAMD,MAAM,MAAM,gCAAgC,GAAG;IAC3C,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,EACtC,GAAG,EACH,OAAO,GACV,EAAE,gCAAgC,GAAG,mBAAmB,CAwBxD"}
|
package/dist/provider.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/common-canton",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.113",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Canton VM client and utilities",
|
|
6
6
|
"license": "MIT",
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
"@protobuf-ts/grpc-transport": "^2.9.4",
|
|
24
24
|
"es-toolkit": "^1.39.10",
|
|
25
25
|
"zod": "4.3.5",
|
|
26
|
-
"@layerzerolabs/common-chain-model": "0.2.
|
|
27
|
-
"@layerzerolabs/common-
|
|
28
|
-
"@layerzerolabs/common-
|
|
29
|
-
"@layerzerolabs/typescript-utils": "0.2.
|
|
26
|
+
"@layerzerolabs/common-chain-model": "0.2.113",
|
|
27
|
+
"@layerzerolabs/common-encoding-utils": "0.2.113",
|
|
28
|
+
"@layerzerolabs/common-error-utils": "0.2.113",
|
|
29
|
+
"@layerzerolabs/typescript-utils": "0.2.113"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "^22.18.6",
|
|
@@ -35,12 +35,12 @@
|
|
|
35
35
|
"tsup": "^8.4.0",
|
|
36
36
|
"typescript": "^5.8.2",
|
|
37
37
|
"vitest": "^3.2.6",
|
|
38
|
-
"@layerzerolabs/eslint-configuration": "^0.2.
|
|
39
|
-
"@layerzerolabs/tsup-configuration": "0.2.
|
|
40
|
-
"@layerzerolabs/
|
|
41
|
-
"@layerzerolabs/
|
|
42
|
-
"@layerzerolabs/
|
|
43
|
-
"@layerzerolabs/vm-tooling-canton": "0.2.
|
|
38
|
+
"@layerzerolabs/eslint-configuration": "^0.2.113",
|
|
39
|
+
"@layerzerolabs/tsup-configuration": "0.2.113",
|
|
40
|
+
"@layerzerolabs/ver-signer-adapter": "0.2.113",
|
|
41
|
+
"@layerzerolabs/vitest-configuration": "0.2.113",
|
|
42
|
+
"@layerzerolabs/typescript-configuration": "0.2.113",
|
|
43
|
+
"@layerzerolabs/vm-tooling-canton": "0.2.113"
|
|
44
44
|
},
|
|
45
45
|
"publishConfig": {
|
|
46
46
|
"access": "restricted",
|
package/src/provider.ts
CHANGED
|
@@ -38,6 +38,8 @@ export type CantonChainUriParams = {
|
|
|
38
38
|
adminApiHost: string;
|
|
39
39
|
/** Ledger API user ID (default: "participant_admin") */
|
|
40
40
|
userId: string;
|
|
41
|
+
/** Parties granted `actAs` on localnet tokens (comma-separated in the URI). */
|
|
42
|
+
actAs: string[];
|
|
41
43
|
/** Validator wallet URL for scan-proxy CIP-56 endpoints (e.g. "http://localhost:7201"). Required. */
|
|
42
44
|
walletUrl: string;
|
|
43
45
|
/** OAuth2 client credentials config — present only for non-local environments */
|
|
@@ -63,6 +65,12 @@ export function parseCantonChainUri(uri: string): CantonChainUriParams {
|
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
const userId = url.searchParams.get('user-id') ?? 'participant_admin';
|
|
68
|
+
const actAsParam = url.searchParams.get('act-as');
|
|
69
|
+
const actAs =
|
|
70
|
+
actAsParam
|
|
71
|
+
?.split(',')
|
|
72
|
+
.map((party) => party.trim())
|
|
73
|
+
.filter((party) => party.length > 0) ?? [];
|
|
66
74
|
const walletUrl = url.searchParams.get('wallet-url');
|
|
67
75
|
if (!walletUrl) {
|
|
68
76
|
throw new Error('Canton provider URI missing required "wallet-url" query parameter');
|
|
@@ -76,6 +84,7 @@ export function parseCantonChainUri(uri: string): CantonChainUriParams {
|
|
|
76
84
|
for (const key of [
|
|
77
85
|
'admin-api',
|
|
78
86
|
'user-id',
|
|
87
|
+
'act-as',
|
|
79
88
|
'wallet-url',
|
|
80
89
|
'sequencer-url',
|
|
81
90
|
'sequencer-validators',
|
|
@@ -100,6 +109,7 @@ export function parseCantonChainUri(uri: string): CantonChainUriParams {
|
|
|
100
109
|
jsonApiUrl,
|
|
101
110
|
adminApiHost,
|
|
102
111
|
userId,
|
|
112
|
+
actAs,
|
|
103
113
|
walletUrl,
|
|
104
114
|
oauth2,
|
|
105
115
|
};
|
package/dist/GOPXFEBJ.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider.ts"],"names":["parseCantonChainUri","uri","url","URL","adminApiHost","searchParams","get","Error","userId","walletUrl","tokenUrl","undefined","clientId","clientSecret","scope","audience","key","delete","jsonApiUrl","toString","replace","oauth2","createCantonChainProvider","isLocal","params","tokenProvider","createTokenProvider","configuration","Configuration","basePath","accessToken","getToken","client","CantonClient","grpcClient","CantonGrpcClient","host","LocalTokenProvider","actAs","admin","ClientCredentialsTokenProvider"],"mappings":"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","file":"GOPXFEBJ.js","sourcesContent":["import {\n ClientCredentialsTokenProvider,\n type ClientCredentialsTokenProviderConfig,\n} from './auth/client-credentials-token-provider';\nimport { LocalTokenProvider } from './auth/local-token-provider';\nimport type { TokenProvider } from './auth/token-provider';\nimport { CantonClient } from './client/canton-client';\nimport { CantonGrpcClient } from './client/grpc';\nimport type { ICantonClient } from './client/interface';\nimport { Configuration } from './open-api/runtime';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Type\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * - {@link client} — JSON Ledger API (commands, queries, updates)\n * - {@link grpcClient} — gRPC Admin API (topology transactions, namespace queries)\n * - {@link tokenProvider} — Shared Bearer-token source used by both transports\n * - {@link walletUrl} — Canton Network validator wallet (scan-proxy CIP-56 endpoints)\n */\nexport type CantonChainProvider = {\n client: ICantonClient;\n grpcClient: CantonGrpcClient;\n tokenProvider: TokenProvider;\n /** Validator wallet URL for scan-proxy CIP-56 endpoints. Required. */\n walletUrl: string;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// URI Parsing\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type CantonChainUriParams = {\n /** Base URL of the JSON Ledger API (e.g. \"http://localhost:5975\") */\n jsonApiUrl: string;\n /** Host:port of the gRPC Admin API (e.g. \"localhost:5076\") */\n adminApiHost: string;\n /** Ledger API user ID (default: \"participant_admin\") */\n userId: string;\n /** Validator wallet URL for scan-proxy CIP-56 endpoints (e.g. \"http://localhost:7201\"). Required. */\n walletUrl: string;\n /** OAuth2 client credentials config — present only for non-local environments */\n oauth2?: ClientCredentialsTokenProviderConfig;\n};\n\n/**\n * Parse a Canton chain provider URI into its constituent parts.\n *\n * URI format:\n * `<json-api-base>?admin-api=<host:port>&user-id=<id>&wallet-url=<url>[&token-url=...&client-id=...&client-secret=...&scope=...&audience=...]`\n *\n * The base URL (everything before the query string) is the JSON Ledger API endpoint.\n * Canton-specific params are extracted and removed; any remaining query params are\n * preserved on the JSON API URL.\n */\nexport function parseCantonChainUri(uri: string): CantonChainUriParams {\n const url = new URL(uri);\n\n const adminApiHost = url.searchParams.get('admin-api');\n if (!adminApiHost) {\n throw new Error('Canton provider URI missing required \"admin-api\" query parameter');\n }\n\n const userId = url.searchParams.get('user-id') ?? 'participant_admin';\n const walletUrl = url.searchParams.get('wallet-url');\n if (!walletUrl) {\n throw new Error('Canton provider URI missing required \"wallet-url\" query parameter');\n }\n const tokenUrl = url.searchParams.get('token-url') ?? undefined;\n const clientId = url.searchParams.get('client-id') ?? undefined;\n const clientSecret = url.searchParams.get('client-secret') ?? undefined;\n const scope = url.searchParams.get('scope') ?? undefined;\n const audience = url.searchParams.get('audience') ?? undefined;\n\n for (const key of [\n 'admin-api',\n 'user-id',\n 'wallet-url',\n 'sequencer-url',\n 'sequencer-validators',\n 'sequencer-quorum',\n 'token-url',\n 'client-id',\n 'client-secret',\n 'scope',\n 'audience',\n ]) {\n url.searchParams.delete(key);\n }\n\n const jsonApiUrl = url.toString().replace(/\\/$/, '');\n\n const oauth2 =\n tokenUrl && clientId && clientSecret\n ? { tokenUrl, clientId, clientSecret, scope, audience }\n : undefined;\n\n return {\n jsonApiUrl,\n adminApiHost,\n userId,\n walletUrl,\n oauth2,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type CreateCantonChainProviderOptions = {\n /** Raw provider URI (from provider config) */\n uri: string;\n /** When true, uses LocalTokenProvider (self-signed JWTs) instead of OAuth2 */\n isLocal: boolean;\n};\n\n/**\n * Create a {@link CantonChainProvider} from a provider URI.\n *\n * - **isLocal=true**: Uses {@link LocalTokenProvider} with admin-level access (self-signed JWTs).\n * - **isLocal=false**: Uses {@link ClientCredentialsTokenProvider} with OAuth2 client\n * credentials extracted from the URI query parameters.\n */\nexport function createCantonChainProvider({\n uri,\n isLocal,\n}: CreateCantonChainProviderOptions): CantonChainProvider {\n const params = parseCantonChainUri(uri);\n\n const tokenProvider = createTokenProvider(params, isLocal);\n\n // ── JSON Ledger API Client ──────────────────────────────────────────\n const configuration = new Configuration({\n basePath: params.jsonApiUrl,\n accessToken: () => tokenProvider.getToken(),\n });\n const client = new CantonClient(configuration, params.userId);\n\n // ── gRPC Admin API Client ───────────────────────────────────────────\n const grpcClient = new CantonGrpcClient({\n host: params.adminApiHost,\n tokenProvider,\n });\n\n return {\n client,\n grpcClient,\n tokenProvider,\n walletUrl: params.walletUrl,\n };\n}\n\nfunction createTokenProvider(params: CantonChainUriParams, isLocal: boolean): TokenProvider {\n if (isLocal) {\n return new LocalTokenProvider({\n userId: params.userId,\n actAs: [],\n admin: true,\n });\n }\n\n // TODO(canton): add other prod auth methods (direct JWT passthrough, etc.).\n if (!params.oauth2) {\n throw new Error(\n 'Canton provider requires OAuth2 credentials (token-url, client-id, client-secret) in the provider URI',\n );\n }\n\n return new ClientCredentialsTokenProvider(params.oauth2);\n}\n"]}
|