@layerzerolabs/common-canton 0.2.120 → 0.2.122
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 +800 -783
- package/.turbo/turbo-test.log +19 -50
- package/dist/{MFVQ6EHM.js → 22ZNNS3H.js} +3 -3
- package/dist/{MFVQ6EHM.js.map → 22ZNNS3H.js.map} +1 -1
- package/dist/{Q3RL6UXD.js → 2UWZKS5E.js} +4 -4
- package/dist/{Q3RL6UXD.js.map → 2UWZKS5E.js.map} +1 -1
- package/dist/{CAJCIAM3.js → 333Q6X6C.js} +3 -3
- package/dist/{CAJCIAM3.js.map → 333Q6X6C.js.map} +1 -1
- package/dist/{HRZTWWO4.js → 3ESWXEO3.js} +3 -3
- package/dist/{HRZTWWO4.js.map → 3ESWXEO3.js.map} +1 -1
- package/dist/{AYF4OAKH.js → 4G6A7TFX.js} +4 -4
- package/dist/4G6A7TFX.js.map +1 -0
- package/dist/{5OA7RJHH.js → 4PEF77PU.js} +3 -3
- package/dist/{5OA7RJHH.js.map → 4PEF77PU.js.map} +1 -1
- package/dist/{M5WKPPPH.js → 4SOUDUP7.js} +3 -3
- package/dist/{M5WKPPPH.js.map → 4SOUDUP7.js.map} +1 -1
- package/dist/4WZTQJXP.js +30 -0
- package/dist/4WZTQJXP.js.map +1 -0
- package/dist/{QYQWHMQM.js → 5KFMHJZB.js} +3 -3
- package/dist/{QYQWHMQM.js.map → 5KFMHJZB.js.map} +1 -1
- package/dist/7JX6NIYS.js +3 -0
- package/dist/7JX6NIYS.js.map +1 -0
- package/dist/{BL22CZFA.js → A2ZXPTGE.js} +4 -4
- package/dist/{BL22CZFA.js.map → A2ZXPTGE.js.map} +1 -1
- package/dist/{3T46OKQU.js → AVC5GQFU.js} +3 -3
- package/dist/{3T46OKQU.js.map → AVC5GQFU.js.map} +1 -1
- package/dist/{45YQNHS2.js → BHESIRKK.js} +3 -3
- package/dist/{45YQNHS2.js.map → BHESIRKK.js.map} +1 -1
- package/dist/CXQSVBVW.js +67 -0
- package/dist/CXQSVBVW.js.map +1 -0
- package/dist/{WXYN3MFC.js → CYZU3DTJ.js} +3 -3
- package/dist/{WXYN3MFC.js.map → CYZU3DTJ.js.map} +1 -1
- package/dist/{LL7Z56UN.js → D3AV6J7R.js} +3 -3
- package/dist/{LL7Z56UN.js.map → D3AV6J7R.js.map} +1 -1
- package/dist/{EWDK2D2A.js → DDAINXFD.js} +3 -3
- package/dist/{EWDK2D2A.js.map → DDAINXFD.js.map} +1 -1
- package/dist/{JSG7MGHH.js → EPHLTMJZ.js} +3 -3
- package/dist/{JSG7MGHH.js.map → EPHLTMJZ.js.map} +1 -1
- package/dist/{ZPOY5WJ2.js → FZGCL63V.js} +3 -3
- package/dist/{ZPOY5WJ2.js.map → FZGCL63V.js.map} +1 -1
- package/dist/{KBZ6YXX4.js → GHWJBJNB.js} +3 -3
- package/dist/{KBZ6YXX4.js.map → GHWJBJNB.js.map} +1 -1
- package/dist/{7GI6QGS6.js → H3BWRDYY.js} +3 -3
- package/dist/{7GI6QGS6.js.map → H3BWRDYY.js.map} +1 -1
- package/dist/{WSLU3JGO.js → HU7X7G5L.js} +3 -3
- package/dist/{WSLU3JGO.js.map → HU7X7G5L.js.map} +1 -1
- package/dist/{7IWE7Y2N.js → JA7BSC7C.js} +4 -4
- package/dist/{7IWE7Y2N.js.map → JA7BSC7C.js.map} +1 -1
- package/dist/{JXKVPYCE.js → JH2I4JGJ.js} +3 -3
- package/dist/{JXKVPYCE.js.map → JH2I4JGJ.js.map} +1 -1
- package/dist/{WHTAP4A3.js → JJKMXRP7.js} +9 -7
- package/dist/JJKMXRP7.js.map +1 -0
- package/dist/{7STDATVZ.js → JUZKQC2G.js} +3 -3
- package/dist/{7STDATVZ.js.map → JUZKQC2G.js.map} +1 -1
- package/dist/{QZJONP6W.js → KCFOSGPU.js} +3 -3
- package/dist/{QZJONP6W.js.map → KCFOSGPU.js.map} +1 -1
- package/dist/{4GYCD3G4.js → KIQAFHKC.js} +3 -3
- package/dist/{4GYCD3G4.js.map → KIQAFHKC.js.map} +1 -1
- package/dist/{FXR2Z54G.js → KJRFPBY4.js} +3 -3
- package/dist/{FXR2Z54G.js.map → KJRFPBY4.js.map} +1 -1
- package/dist/M3GPMXME.js +12 -0
- package/dist/M3GPMXME.js.map +1 -0
- package/dist/{AMLJTQWB.js → N3INXXRG.js} +3 -3
- package/dist/{AMLJTQWB.js.map → N3INXXRG.js.map} +1 -1
- package/dist/{GSEDMLUC.js → NJW7UX2A.js} +3 -3
- package/dist/{GSEDMLUC.js.map → NJW7UX2A.js.map} +1 -1
- package/dist/{KTNEUXUI.js → NRGCZ4DG.js} +5 -5
- package/dist/{KTNEUXUI.js.map → NRGCZ4DG.js.map} +1 -1
- package/dist/NRSV2VHQ.js +335 -0
- package/dist/NRSV2VHQ.js.map +1 -0
- package/dist/{DAP5XJGH.js → NX67V54F.js} +3 -3
- package/dist/{DAP5XJGH.js.map → NX67V54F.js.map} +1 -1
- package/dist/{UBHUOSK3.js → OIFJOKIO.js} +3 -3
- package/dist/{UBHUOSK3.js.map → OIFJOKIO.js.map} +1 -1
- package/dist/{NKXEPWZV.js → OO73Z5K6.js} +4 -4
- package/dist/{NKXEPWZV.js.map → OO73Z5K6.js.map} +1 -1
- package/dist/{2UKHG3HM.js → OUEL7K27.js} +3 -3
- package/dist/{2UKHG3HM.js.map → OUEL7K27.js.map} +1 -1
- package/dist/{KH7RP6Q4.js → OWXOYIMA.js} +3 -3
- package/dist/{KH7RP6Q4.js.map → OWXOYIMA.js.map} +1 -1
- package/dist/{CLAE73FR.js → OZZHAISY.js} +3 -3
- package/dist/{CLAE73FR.js.map → OZZHAISY.js.map} +1 -1
- package/dist/{IIQYRITU.js → PDIG5OUV.js} +3 -3
- package/dist/{IIQYRITU.js.map → PDIG5OUV.js.map} +1 -1
- package/dist/QAKOQQ7E.js +71 -0
- package/dist/QAKOQQ7E.js.map +1 -0
- package/dist/{NS763D57.js → QJMVWOLL.js} +3 -3
- package/dist/{NS763D57.js.map → QJMVWOLL.js.map} +1 -1
- package/dist/{KVXEYMWG.js → QNO3456Y.js} +3 -3
- package/dist/{KVXEYMWG.js.map → QNO3456Y.js.map} +1 -1
- package/dist/{TDLALQCM.js → R5PCNLRD.js} +3 -3
- package/dist/{TDLALQCM.js.map → R5PCNLRD.js.map} +1 -1
- package/dist/{K2SFNQJC.js → RHNMCG3C.js} +4 -4
- package/dist/{K2SFNQJC.js.map → RHNMCG3C.js.map} +1 -1
- package/dist/RVQWP4JU.js +76 -0
- package/dist/RVQWP4JU.js.map +1 -0
- package/dist/{73I7CBP3.js → SNDN7G42.js} +3 -3
- package/dist/{73I7CBP3.js.map → SNDN7G42.js.map} +1 -1
- package/dist/{ALC4M7WK.js → T4AL4FJH.js} +3 -3
- package/dist/{ALC4M7WK.js.map → T4AL4FJH.js.map} +1 -1
- package/dist/{5HH7PZW3.js → TZTIULG5.js} +29 -29
- package/dist/{5HH7PZW3.js.map → TZTIULG5.js.map} +1 -1
- package/dist/{5E77SJL7.js → VT3WUH5Q.js} +8 -7
- package/dist/VT3WUH5Q.js.map +1 -0
- package/dist/WKC6X2E3.js +27 -0
- package/dist/WKC6X2E3.js.map +1 -0
- package/dist/WLV6EHDB.js +60 -0
- package/dist/WLV6EHDB.js.map +1 -0
- package/dist/{HLWLB4AY.js → WUXXJWII.js} +3 -3
- package/dist/{HLWLB4AY.js.map → WUXXJWII.js.map} +1 -1
- package/dist/client/amulet.d.ts.map +1 -1
- package/dist/client/amulet.js +1 -1
- package/dist/client/canton-client.js +125 -125
- package/dist/client/grpc.d.ts +104 -18
- package/dist/client/grpc.d.ts.map +1 -1
- package/dist/client/grpc.js +7 -1
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +132 -128
- package/dist/client/topology/mappings.d.ts +53 -0
- package/dist/client/topology/mappings.d.ts.map +1 -0
- package/dist/client/topology/mappings.js +6 -0
- package/dist/client/topology/mappings.js.map +1 -0
- package/dist/client/topology/signing.d.ts +23 -0
- package/dist/client/topology/signing.d.ts.map +1 -0
- package/dist/client/topology/signing.js +4 -0
- package/dist/client/topology/signing.js.map +1 -0
- package/dist/client/topology/synchronizer-connectivity.d.ts +26 -0
- package/dist/client/topology/synchronizer-connectivity.d.ts.map +1 -0
- package/dist/client/topology/synchronizer-connectivity.js +4 -0
- package/dist/client/topology/synchronizer-connectivity.js.map +1 -0
- package/dist/client/topology/types.d.ts +120 -0
- package/dist/client/topology/types.d.ts.map +1 -0
- package/dist/client/topology/types.js +3 -0
- package/dist/client/topology/types.js.map +1 -0
- package/dist/client/topology/utils.d.ts +38 -0
- package/dist/client/topology/utils.d.ts.map +1 -0
- package/dist/client/topology/utils.js +6 -0
- package/dist/client/topology/utils.js.map +1 -0
- package/dist/client/utils.d.ts +17 -0
- package/dist/client/utils.d.ts.map +1 -1
- package/dist/client/utils.js +1 -1
- package/dist/events.js +2 -2
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +141 -136
- package/dist/minFee.d.ts +6 -0
- package/dist/minFee.d.ts.map +1 -0
- package/dist/minFee.js +5 -0
- package/dist/minFee.js.map +1 -0
- package/dist/open-api/apis/DefaultApi.js +123 -123
- package/dist/open-api/apis/index.js +123 -123
- package/dist/open-api/index.js +123 -123
- package/dist/open-api/models/Command.js +3 -3
- package/dist/open-api/models/Completion.js +1 -1
- package/dist/open-api/models/Completion1.js +1 -1
- package/dist/open-api/models/CompletionResponse.js +5 -5
- package/dist/open-api/models/CompletionResponseOneOf.js +1 -1
- package/dist/open-api/models/CompletionStreamResponse.js +5 -5
- package/dist/open-api/models/CreateUserRequest.js +7 -7
- package/dist/open-api/models/CumulativeFilter.js +2 -2
- package/dist/open-api/models/DeduplicationPeriod.js +1 -1
- package/dist/open-api/models/DeduplicationPeriod1.js +1 -1
- package/dist/open-api/models/DeduplicationPeriod2.js +2 -2
- package/dist/open-api/models/EventFormat.js +2 -2
- package/dist/open-api/models/FeaturesDescriptor.js +2 -2
- package/dist/open-api/models/Filters.js +2 -2
- package/dist/open-api/models/GetActiveContractsRequest.js +2 -2
- package/dist/open-api/models/GetEventsByContractIdRequest.js +2 -2
- package/dist/open-api/models/GetLedgerApiVersionResponse.js +3 -3
- package/dist/open-api/models/GetTransactionByIdRequest.js +2 -2
- package/dist/open-api/models/GetTransactionByOffsetRequest.js +2 -2
- package/dist/open-api/models/GetUpdateByIdRequest.js +2 -2
- package/dist/open-api/models/GetUpdateByOffsetRequest.js +2 -2
- package/dist/open-api/models/GetUpdatesRequest.js +2 -2
- package/dist/open-api/models/GrantUserRightsRequest.js +7 -7
- package/dist/open-api/models/GrantUserRightsResponse.js +7 -7
- package/dist/open-api/models/IdentifierFilter.js +2 -2
- package/dist/open-api/models/JsCommands.js +5 -5
- package/dist/open-api/models/JsExecuteSubmissionAndWaitForTransactionRequest.js +5 -5
- package/dist/open-api/models/JsExecuteSubmissionAndWaitRequest.js +3 -3
- package/dist/open-api/models/JsExecuteSubmissionRequest.js +3 -3
- package/dist/open-api/models/JsGetUpdateResponse.js +19 -19
- package/dist/open-api/models/JsGetUpdateTreesResponse.js +10 -10
- package/dist/open-api/models/JsGetUpdatesResponse.js +19 -19
- package/dist/open-api/models/JsPrepareSubmissionRequest.js +5 -5
- package/dist/open-api/models/JsReassignment.js +4 -4
- package/dist/open-api/models/JsReassignmentEvent.js +3 -3
- package/dist/open-api/models/JsSubmitAndWaitForReassignmentResponse.js +5 -5
- package/dist/open-api/models/JsSubmitAndWaitForTransactionRequest.js +8 -8
- package/dist/open-api/models/JsTopologyTransaction.js +7 -7
- package/dist/open-api/models/Kind.js +5 -5
- package/dist/open-api/models/ListUserRightsResponse.js +7 -7
- package/dist/open-api/models/Operation.js +4 -4
- package/dist/open-api/models/Reassignment.js +5 -5
- package/dist/open-api/models/Reassignment1.js +5 -5
- package/dist/open-api/models/RevokeUserRightsRequest.js +7 -7
- package/dist/open-api/models/RevokeUserRightsResponse.js +7 -7
- package/dist/open-api/models/Right.js +6 -6
- package/dist/open-api/models/SubmitAndWaitForReassignmentRequest.js +2 -2
- package/dist/open-api/models/TopologyEvent.js +6 -6
- package/dist/open-api/models/TopologyEventEvent.js +5 -5
- package/dist/open-api/models/TopologyTransaction.js +8 -8
- package/dist/open-api/models/TransactionFilter.js +2 -2
- package/dist/open-api/models/TransactionFormat.js +2 -2
- package/dist/open-api/models/Update.js +18 -18
- package/dist/open-api/models/Update1.js +9 -9
- package/dist/open-api/models/Update1OneOf1.js +6 -6
- package/dist/open-api/models/UpdateFormat.js +2 -2
- package/dist/open-api/models/UpdateOneOf1.js +6 -6
- package/dist/open-api/models/UpdateOneOf2.js +9 -9
- package/dist/open-api/models/UpdateVettedPackagesRequest.js +6 -6
- package/dist/open-api/models/VettedPackagesChange.js +5 -5
- package/dist/open-api/models/index.js +122 -122
- package/dist/provider.d.ts +3 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +132 -127
- package/dist/refresh/index.js +2 -2
- package/dist/refresh/resolve.js +2 -2
- package/dist/sdk/index.d.ts +0 -1
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/transaction.d.ts +353 -144
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/package.json +12 -10
- package/src/client/amulet.ts +5 -2
- package/src/client/grpc.ts +396 -39
- package/src/client/index.ts +20 -0
- package/src/client/topology/mappings.ts +152 -0
- package/src/client/topology/signing.ts +56 -0
- package/src/client/topology/synchronizer-connectivity.ts +110 -0
- package/src/client/topology/types.ts +133 -0
- package/src/client/topology/utils.ts +93 -0
- package/src/client/utils.ts +47 -9
- package/src/index.ts +5 -29
- package/src/minFee.ts +12 -0
- package/src/provider.ts +11 -3
- package/src/sdk/index.ts +0 -1
- package/src/transaction.ts +25 -4
- package/src/types.ts +15 -0
- package/test/client/amulet.test.ts +64 -0
- package/test/provider.test.ts +22 -0
- package/dist/5E77SJL7.js.map +0 -1
- package/dist/AYF4OAKH.js.map +0 -1
- package/dist/F42TZTWJ.js +0 -33
- package/dist/F42TZTWJ.js.map +0 -1
- package/dist/PQI7CWCR.js +0 -19
- package/dist/PQI7CWCR.js.map +0 -1
- package/dist/WHTAP4A3.js.map +0 -1
- package/dist/XE6H2SH4.js +0 -3
- package/dist/XE6H2SH4.js.map +0 -1
- package/dist/YHW7AKHX.js +0 -62
- package/dist/YHW7AKHX.js.map +0 -1
package/src/provider.ts
CHANGED
|
@@ -55,6 +55,9 @@ export type CantonChainUriParams = {
|
|
|
55
55
|
* The base URL (everything before the query string) is the JSON Ledger API endpoint.
|
|
56
56
|
* Canton-specific params are extracted and removed; any remaining query params are
|
|
57
57
|
* preserved on the JSON API URL.
|
|
58
|
+
*
|
|
59
|
+
* When `client-secret` is omitted from the URI, `CANTON_CLIENT_SECRET` is read from the
|
|
60
|
+
* environment.
|
|
58
61
|
*/
|
|
59
62
|
export function parseCantonChainUri(uri: string): CantonChainUriParams {
|
|
60
63
|
const url = new URL(uri);
|
|
@@ -77,7 +80,12 @@ export function parseCantonChainUri(uri: string): CantonChainUriParams {
|
|
|
77
80
|
}
|
|
78
81
|
const tokenUrl = url.searchParams.get('token-url') ?? undefined;
|
|
79
82
|
const clientId = url.searchParams.get('client-id') ?? undefined;
|
|
80
|
-
|
|
83
|
+
// Prefer URI param; fall back to env so secrets are not committed in provider configs.
|
|
84
|
+
const clientSecret =
|
|
85
|
+
url.searchParams.get('client-secret') ??
|
|
86
|
+
// eslint-disable-next-line turbo/no-undeclared-env-vars -- runtime OAuth secret, not a turbo task input
|
|
87
|
+
process.env.CANTON_CLIENT_SECRET ??
|
|
88
|
+
undefined;
|
|
81
89
|
const scope = url.searchParams.get('scope') ?? undefined;
|
|
82
90
|
const audience = url.searchParams.get('audience') ?? undefined;
|
|
83
91
|
|
|
@@ -169,7 +177,7 @@ function createTokenProvider(params: CantonChainUriParams, isLocal: boolean): To
|
|
|
169
177
|
if (isLocal) {
|
|
170
178
|
return new LocalTokenProvider({
|
|
171
179
|
userId: params.userId,
|
|
172
|
-
actAs:
|
|
180
|
+
actAs: params.actAs,
|
|
173
181
|
admin: true,
|
|
174
182
|
});
|
|
175
183
|
}
|
|
@@ -177,7 +185,7 @@ function createTokenProvider(params: CantonChainUriParams, isLocal: boolean): To
|
|
|
177
185
|
// TODO(canton): add other prod auth methods (direct JWT passthrough, etc.).
|
|
178
186
|
if (!params.oauth2) {
|
|
179
187
|
throw new Error(
|
|
180
|
-
'Canton provider requires OAuth2 credentials (token-url, client-id, client-secret
|
|
188
|
+
'Canton provider requires OAuth2 credentials (token-url, client-id, client-secret in URI or CANTON_CLIENT_SECRET)',
|
|
181
189
|
);
|
|
182
190
|
}
|
|
183
191
|
|
package/src/sdk/index.ts
CHANGED
package/src/transaction.ts
CHANGED
|
@@ -9,6 +9,8 @@ import {
|
|
|
9
9
|
} from '@layerzerolabs/common-chain-model';
|
|
10
10
|
import type { PartialBy } from '@layerzerolabs/typescript-utils';
|
|
11
11
|
|
|
12
|
+
import type { CantonDeferredRef } from './deferredValue';
|
|
13
|
+
|
|
12
14
|
// === Component schemas ===
|
|
13
15
|
|
|
14
16
|
export const cantonCommandSchema = z.union([
|
|
@@ -44,6 +46,23 @@ export const cantonCommandSchema = z.union([
|
|
|
44
46
|
}),
|
|
45
47
|
]);
|
|
46
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Like cantonCommandSchema but with contractId typed as CantonDeferredRef | string.
|
|
51
|
+
* Used for unresolvedCommands where exercise contractIds are deferred sentinels.
|
|
52
|
+
* At runtime the validation is identical (z.string()); only the TypeScript type differs.
|
|
53
|
+
*/
|
|
54
|
+
export const unresolvedCantonCommandSchema = cantonCommandSchema as unknown as z.ZodType<
|
|
55
|
+
| z.infer<typeof cantonCommandSchema>
|
|
56
|
+
| {
|
|
57
|
+
exerciseCommand: {
|
|
58
|
+
templateId: string;
|
|
59
|
+
contractId: CantonDeferredRef | string;
|
|
60
|
+
choice: string;
|
|
61
|
+
choiceArgument: unknown;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
>;
|
|
65
|
+
|
|
47
66
|
export const cantonDisclosedContractSchema = z.object({
|
|
48
67
|
templateId: z.string().optional(),
|
|
49
68
|
contractId: z.string(),
|
|
@@ -58,16 +77,17 @@ export const cantonDisclosedContractSchema = z.object({
|
|
|
58
77
|
*/
|
|
59
78
|
export const cantonTransactionSchema = transactionSchema.extend({
|
|
60
79
|
populatedTransaction: z.object({
|
|
61
|
-
unresolvedCommands: z.array(
|
|
80
|
+
unresolvedCommands: z.array(unresolvedCantonCommandSchema),
|
|
62
81
|
unresolvedDisclosedContracts: z.array(cantonDisclosedContractSchema),
|
|
63
82
|
|
|
64
83
|
/** Parties submitting the command (actAs) */
|
|
65
84
|
actAs: z.array(z.string()),
|
|
66
85
|
/** Maps each actAs party → the senderEntityName(s) controlling its signing
|
|
67
86
|
* key(s), always as an array. `.optional()` only so deferred-sender create-time
|
|
68
|
-
* payloads parse
|
|
69
|
-
*
|
|
70
|
-
*
|
|
87
|
+
* payloads parse. At sign time: multi-party transactions must map every actAs
|
|
88
|
+
* party or signing throws; single-party transactions may omit the map and sign()
|
|
89
|
+
* falls back to the queue's senderEntityName. Multiple entries = a multisig party
|
|
90
|
+
* (decentralized namespace) whose keys must all sign. */
|
|
71
91
|
partyToSenderEntity: z.record(z.string(), z.array(z.string())).optional(),
|
|
72
92
|
/** Deployment spec set at prepare time; the deployment activity resolves the live address ref from this + the createCommand. */
|
|
73
93
|
deploymentSpec: z
|
|
@@ -154,6 +174,7 @@ export interface ContractDataIdentifier {
|
|
|
154
174
|
export type CantonTx = z.infer<typeof cantonTransactionSchema>;
|
|
155
175
|
export type CantonPopulatedTransaction = CantonTx['populatedTransaction'];
|
|
156
176
|
export type CantonCommands = z.infer<typeof cantonCommandSchema>[];
|
|
177
|
+
export type CantonUnresolvedCommands = z.infer<typeof unresolvedCantonCommandSchema>[];
|
|
157
178
|
export type CantonDisclosedContracts = z.infer<typeof cantonDisclosedContractSchema>[];
|
|
158
179
|
export type CantonAssignedTx = z.infer<typeof cantonAssignedTransactionSchema>;
|
|
159
180
|
export type CantonSignedTx = z.infer<typeof cantonSignedTransactionSchema>;
|
package/src/types.ts
CHANGED
|
@@ -27,6 +27,21 @@ export type TemplateId = string;
|
|
|
27
27
|
export const buildTemplateId = (packageId: string, modulePath: string): TemplateId =>
|
|
28
28
|
`${packageId}:${modulePath}`;
|
|
29
29
|
|
|
30
|
+
// '1' → '0.0000000001' (Canton Coin has 10 decimals)
|
|
31
|
+
export const smallestUnitsToDamlDecimal = (units: string): string => {
|
|
32
|
+
if (units.startsWith('-')) {
|
|
33
|
+
throw new Error(`smallestUnitsToDamlDecimal: negative value not supported: ${units}`);
|
|
34
|
+
}
|
|
35
|
+
const padded = units.padStart(11, '0');
|
|
36
|
+
return `${padded.slice(0, -10).replace(/^0+/, '') || '0'}.${padded.slice(-10)}`;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// '0.01' → '0.0100000000' — pads to exactly 10 fractional digits for ledger comparison
|
|
40
|
+
export const canonicalizeDamlDecimal = (value: string): string => {
|
|
41
|
+
const [integer = '0', fraction = ''] = value.split('.');
|
|
42
|
+
return `${integer}.${fraction.padEnd(10, '0')}`;
|
|
43
|
+
};
|
|
44
|
+
|
|
30
45
|
export type Contract<T extends object> = {
|
|
31
46
|
templateId: TemplateId;
|
|
32
47
|
contractId: ContractId<T>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { fetchAmuletContext, fetchDsoParty } from '../../src/client/amulet';
|
|
4
|
+
|
|
5
|
+
const TOKEN = 'test-token';
|
|
6
|
+
const DSO_PARTY_PATH = '/api/validator/v0/scan-proxy/dso-party-id';
|
|
7
|
+
const TRANSFER_FACTORY_PATH =
|
|
8
|
+
'/api/validator/v0/scan-proxy/registry/transfer-instruction/v1/transfer-factory';
|
|
9
|
+
|
|
10
|
+
const okResponse = (body: unknown): Response =>
|
|
11
|
+
({
|
|
12
|
+
ok: true,
|
|
13
|
+
status: 200,
|
|
14
|
+
json: async () => body,
|
|
15
|
+
text: async () => JSON.stringify(body),
|
|
16
|
+
}) as unknown as Response;
|
|
17
|
+
|
|
18
|
+
const requestedUrl = (): string => String(vi.mocked(fetch).mock.calls[0]![0]);
|
|
19
|
+
|
|
20
|
+
describe('amulet scan-proxy request URLs', () => {
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
vi.stubGlobal('fetch', vi.fn());
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
vi.restoreAllMocks();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('DSO party endpoint', () => {
|
|
30
|
+
it('targets the scan-proxy DSO party path on the wallet origin', async () => {
|
|
31
|
+
vi.mocked(fetch).mockResolvedValueOnce(okResponse({ dso_party_id: 'dso::123' }));
|
|
32
|
+
|
|
33
|
+
await fetchDsoParty('https://wallet.example.com', TOKEN);
|
|
34
|
+
|
|
35
|
+
expect(requestedUrl()).toBe(`https://wallet.example.com${DSO_PARTY_PATH}`);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('collapses a trailing slash on the wallet URL instead of doubling it', async () => {
|
|
39
|
+
vi.mocked(fetch).mockResolvedValueOnce(okResponse({ dso_party_id: 'dso::123' }));
|
|
40
|
+
|
|
41
|
+
await fetchDsoParty('https://wallet.example.com/', TOKEN);
|
|
42
|
+
|
|
43
|
+
expect(requestedUrl()).toBe(`https://wallet.example.com${DSO_PARTY_PATH}`);
|
|
44
|
+
expect(new URL(requestedUrl()).host).toBe('wallet.example.com');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('amulet context endpoint', () => {
|
|
49
|
+
it('targets the transfer factory path regardless of a trailing slash', async () => {
|
|
50
|
+
vi.mocked(fetch).mockResolvedValueOnce(
|
|
51
|
+
okResponse({
|
|
52
|
+
choiceContext: { disclosedContracts: [], choiceContextData: { values: {} } },
|
|
53
|
+
}),
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
await fetchAmuletContext('https://wallet.example.com/', TOKEN, {
|
|
57
|
+
admin: 'dso::123',
|
|
58
|
+
id: 'Amulet',
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
expect(requestedUrl()).toBe(`https://wallet.example.com${TRANSFER_FACTORY_PATH}`);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
package/test/provider.test.ts
CHANGED
|
@@ -75,4 +75,26 @@ describe('parseCantonChainUri', () => {
|
|
|
75
75
|
audience: undefined,
|
|
76
76
|
});
|
|
77
77
|
});
|
|
78
|
+
|
|
79
|
+
it('falls back to CANTON_CLIENT_SECRET when URI omits client-secret', async () => {
|
|
80
|
+
const previous = process.env.CANTON_CLIENT_SECRET;
|
|
81
|
+
process.env.CANTON_CLIENT_SECRET = 'from-env';
|
|
82
|
+
try {
|
|
83
|
+
const { parseCantonChainUri } = await loadProvider();
|
|
84
|
+
const params = parseCantonChainUri(`${BASE}&token-url=http://token&client-id=cid`);
|
|
85
|
+
expect(params.oauth2).toEqual({
|
|
86
|
+
tokenUrl: 'http://token',
|
|
87
|
+
clientId: 'cid',
|
|
88
|
+
clientSecret: 'from-env',
|
|
89
|
+
scope: undefined,
|
|
90
|
+
audience: undefined,
|
|
91
|
+
});
|
|
92
|
+
} finally {
|
|
93
|
+
if (previous === undefined) {
|
|
94
|
+
delete process.env.CANTON_CLIENT_SECRET;
|
|
95
|
+
} else {
|
|
96
|
+
process.env.CANTON_CLIENT_SECRET = previous;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
78
100
|
});
|
package/dist/5E77SJL7.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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":"5E77SJL7.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 walletUrl: params.walletUrl,\n tokenProvider,\n });\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/AYF4OAKH.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/amulet.ts"],"names":["AMULET_INSTRUMENT_ID","CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS","fetchAmuletContext","walletUrl","token","instrumentId","now","Date","later","getTime","response","fetch","method","headers","Authorization","body","JSON","stringify","choiceArguments","expectedAdmin","admin","transfer","sender","receiver","amount","requestedAt","toISOString","executeBefore","inputHoldingCids","meta","values","extraArgs","context","ok","text","CantonProtocolError","status","data","json","disclosedContracts","choiceContextData","amuletContext","choiceContext","injectExternalPartyAmuletRules","externalRulesContract","find","contract","templateId","includes","NonRetryableError","tag","value","contractId","externalPartyAmuletRulesCid","fetchDsoParty","dso_party_id"],"mappings":"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","file":"AYF4OAKH.js","sourcesContent":["import { NonRetryableError } from '@layerzerolabs/common-error-utils';\n\nimport type { TokenProvider } from '../auth/token-provider';\nimport { CantonProtocolError } from '../errors';\nimport type { DisclosedContract } from '../open-api/models';\n\n/** Validator-wallet access a {@link CantonClient} needs to serve amulet endpoints. */\nexport type CantonClientWalletConfig = {\n /** Validator wallet URL for scan-proxy CIP-56 endpoints. */\n walletUrl: string;\n /** Bearer-token source for wallet requests. */\n tokenProvider: TokenProvider;\n};\n\n/** The single Amulet instrument id used across Canton Network fee flows. */\nexport const AMULET_INSTRUMENT_ID = 'Amulet';\n\n/** Instrument identifier for an amulet context probe. */\nexport type InstrumentId = { admin: string; id: string };\n\n/** DAML ChoiceContext — a bag of named AnyValues passed to fee-bearing choices. */\nexport type ChoiceContext = { values: Record<string, unknown> };\n\nexport type AmuletContextResult = {\n amuletContext: ChoiceContext;\n disclosedContracts: DisclosedContract[];\n externalPartyAmuletRulesCid: string;\n};\n\n// The probe (amount 0, sender = receiver = admin) never executes — it only fetches context; 1-hour window is ample.\nconst CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS = 60 * 60 * 1000;\n\ntype AmuletContextResponse = {\n choiceContext: {\n disclosedContracts: DisclosedContract[];\n choiceContextData: ChoiceContext;\n };\n};\n\n/** Amulet ChoiceContext from the validator scan-proxy — same call for all fee-bearing choices. */\nexport const fetchAmuletContext = async (\n walletUrl: string,\n token: string,\n instrumentId: InstrumentId,\n): Promise<{ amuletContext: ChoiceContext; disclosedContracts: DisclosedContract[] }> => {\n const now = new Date();\n const later = new Date(now.getTime() + CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS);\n\n const response = await fetch(\n `${walletUrl}/api/validator/v0/scan-proxy/registry/transfer-instruction/v1/transfer-factory`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n choiceArguments: {\n expectedAdmin: instrumentId.admin,\n transfer: {\n sender: instrumentId.admin,\n receiver: instrumentId.admin,\n amount: '0',\n instrumentId,\n requestedAt: now.toISOString(),\n executeBefore: later.toISOString(),\n inputHoldingCids: [],\n meta: { values: {} },\n },\n extraArgs: { context: { values: {} }, meta: { values: {} } },\n },\n }),\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new CantonProtocolError(`Failed to get amulet context: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as AmuletContextResponse;\n const { disclosedContracts, choiceContextData: amuletContext } = data.choiceContext;\n\n return { amuletContext, disclosedContracts };\n};\n\n/** Injects ExternalPartyAmuletRules cid into the ChoiceContext — required by every flow hitting FeeUtils.validateContext. */\nexport const injectExternalPartyAmuletRules = (\n amuletContext: ChoiceContext,\n disclosedContracts: DisclosedContract[],\n): { amuletContext: ChoiceContext; externalPartyAmuletRulesCid: string } => {\n const externalRulesContract = disclosedContracts.find((contract) =>\n contract.templateId?.includes('ExternalPartyAmuletRules'),\n );\n\n if (!externalRulesContract) {\n throw new NonRetryableError(\n 'ExternalPartyAmuletRules not found in disclosed contracts from amulet context',\n );\n }\n\n return {\n amuletContext: {\n values: {\n ...amuletContext.values,\n 'external-party-amulet-rules': {\n tag: 'AV_ContractId',\n value: externalRulesContract.contractId,\n },\n },\n },\n externalPartyAmuletRulesCid: externalRulesContract.contractId,\n };\n};\n\n/** Fetch the DSO party id from the validator scan-proxy API. */\nexport const fetchDsoParty = async (walletUrl: string, token: string): Promise<string> => {\n const response = await fetch(`${walletUrl}/api/validator/v0/scan-proxy/dso-party-id`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) {\n throw new CantonProtocolError(`Failed to get DSO party: ${response.status}`);\n }\n const data = (await response.json()) as { dso_party_id: string };\n return data.dso_party_id;\n};\n"]}
|
package/dist/F42TZTWJ.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { SECP256K1_SPKI_DER_HEADER } from './CMDFOA7C.js';
|
|
2
|
-
import { __name } from './VUOMXK5T.js';
|
|
3
|
-
import { createHash } from 'crypto';
|
|
4
|
-
import { bytesToHex } from '@layerzerolabs/common-encoding-utils';
|
|
5
|
-
|
|
6
|
-
function extractTransactions(updates) {
|
|
7
|
-
return updates.flatMap((update) => "Transaction" in update ? [
|
|
8
|
-
update.Transaction.value
|
|
9
|
-
] : []);
|
|
10
|
-
}
|
|
11
|
-
__name(extractTransactions, "extractTransactions");
|
|
12
|
-
var HASH_PURPOSE_PUBLIC_KEY_FINGERPRINT = 12;
|
|
13
|
-
var MULTIHASH_SHA256_PREFIX = new Uint8Array([
|
|
14
|
-
18,
|
|
15
|
-
32
|
|
16
|
-
]);
|
|
17
|
-
function computeCantonFingerprint(uncompressedPublicKey) {
|
|
18
|
-
const publicKeyDer = new Uint8Array(SECP256K1_SPKI_DER_HEADER.length + uncompressedPublicKey.length);
|
|
19
|
-
publicKeyDer.set(SECP256K1_SPKI_DER_HEADER);
|
|
20
|
-
publicKeyDer.set(uncompressedPublicKey, SECP256K1_SPKI_DER_HEADER.length);
|
|
21
|
-
const purposePrefix = new Uint8Array(4);
|
|
22
|
-
new DataView(purposePrefix.buffer).setUint32(0, HASH_PURPOSE_PUBLIC_KEY_FINGERPRINT);
|
|
23
|
-
const hash = createHash("sha256").update(purposePrefix).update(publicKeyDer).digest();
|
|
24
|
-
const result = new Uint8Array(MULTIHASH_SHA256_PREFIX.length + hash.length);
|
|
25
|
-
result.set(MULTIHASH_SHA256_PREFIX);
|
|
26
|
-
result.set(hash, MULTIHASH_SHA256_PREFIX.length);
|
|
27
|
-
return bytesToHex(result);
|
|
28
|
-
}
|
|
29
|
-
__name(computeCantonFingerprint, "computeCantonFingerprint");
|
|
30
|
-
|
|
31
|
-
export { computeCantonFingerprint, extractTransactions };
|
|
32
|
-
//# sourceMappingURL=F42TZTWJ.js.map
|
|
33
|
-
//# sourceMappingURL=F42TZTWJ.js.map
|
package/dist/F42TZTWJ.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/utils.ts"],"names":["extractTransactions","updates","flatMap","update","Transaction","value","HASH_PURPOSE_PUBLIC_KEY_FINGERPRINT","MULTIHASH_SHA256_PREFIX","Uint8Array","computeCantonFingerprint","uncompressedPublicKey","publicKeyDer","SECP256K1_SPKI_DER_HEADER","length","set","purposePrefix","DataView","buffer","setUint32","hash","createHash","digest","result","bytesToHex"],"mappings":";;;;;AAWO,SAASA,oBAAoBC,OAAAA,EAAuB;AACvD,EAAA,OAAOA,OAAAA,CAAQC,OAAAA,CAAQ,CAACC,MAAAA,KAAY,iBAAiBA,MAAAA,GAAS;AAACA,IAAAA,MAAAA,CAAOC,WAAAA,CAAYC;AAAS,GAAA,GAAA,EAAE,CAAA;AACjG;AAFgBL,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAIhB,IAAMM,mCAAAA,GAAsC,EAAA;AAC5C,IAAMC,uBAAAA,GAA0B,IAAIC,UAAAA,CAAW;AAAC,EAAA,EAAA;AAAM,EAAA;AAAK,CAAA,CAAA;AAMpD,SAASC,yBAAyBC,qBAAAA,EAAiC;AACtE,EAAA,MAAMC,eAAe,IAAIH,UAAAA,CACrBI,yBAAAA,CAA0BC,MAAAA,GAASH,sBAAsBG,MAAM,CAAA;AAEnEF,EAAAA,YAAAA,CAAaG,IAAIF,yBAAAA,CAAAA;AACjBD,EAAAA,YAAAA,CAAaG,GAAAA,CAAIJ,qBAAAA,EAAuBE,yBAAAA,CAA0BC,MAAM,CAAA;AAExE,EAAA,MAAME,aAAAA,GAAgB,IAAIP,UAAAA,CAAW,CAAA,CAAA;AACrC,EAAA,IAAIQ,SAASD,aAAAA,CAAcE,MAAM,CAAA,CAAEC,SAAAA,CAAU,GAAGZ,mCAAAA,CAAAA;AAEhD,EAAA,MAAMa,IAAAA,GAAOC,UAAAA,CAAW,QAAA,CAAA,CAAUjB,MAAAA,CAAOY,aAAAA,CAAAA,CAAeZ,MAAAA,CAAOQ,YAAAA,CAAAA,CAAcU,MAAAA,EAAM;AAEnF,EAAA,MAAMC,SAAS,IAAId,UAAAA,CAAWD,uBAAAA,CAAwBM,MAAAA,GAASM,KAAKN,MAAM,CAAA;AAC1ES,EAAAA,MAAAA,CAAOR,IAAIP,uBAAAA,CAAAA;AACXe,EAAAA,MAAAA,CAAOR,GAAAA,CAAIK,IAAAA,EAAMZ,uBAAAA,CAAwBM,MAAM,CAAA;AAE/C,EAAA,OAAOU,WAAWD,MAAAA,CAAAA;AACtB;AAjBgBb,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA","file":"F42TZTWJ.js","sourcesContent":["import { createHash } from 'node:crypto';\n\nimport { bytesToHex } from '@layerzerolabs/common-encoding-utils';\n\nimport { SECP256K1_SPKI_DER_HEADER } from '../crypto';\nimport type { CantonTransaction, CantonUpdate } from './interface';\n\n/**\n * Extract transactions from Canton updates.\n * Filters out checkpoints, reassignments, and topology transactions.\n */\nexport function extractTransactions(updates: CantonUpdate[]): CantonTransaction[] {\n return updates.flatMap((update) => ('Transaction' in update ? [update.Transaction.value] : []));\n}\n\nconst HASH_PURPOSE_PUBLIC_KEY_FINGERPRINT = 12;\nconst MULTIHASH_SHA256_PREFIX = new Uint8Array([0x12, 0x20]);\n\n/**\n * Computes the Canton fingerprint for an uncompressed secp256k1 public key.\n * DER-encodes the key, then computes hex(SHA-256 multihash of purpose=12 || publicKeyDer).\n */\nexport function computeCantonFingerprint(uncompressedPublicKey: Uint8Array): string {\n const publicKeyDer = new Uint8Array(\n SECP256K1_SPKI_DER_HEADER.length + uncompressedPublicKey.length,\n );\n publicKeyDer.set(SECP256K1_SPKI_DER_HEADER);\n publicKeyDer.set(uncompressedPublicKey, SECP256K1_SPKI_DER_HEADER.length);\n\n const purposePrefix = new Uint8Array(4);\n new DataView(purposePrefix.buffer).setUint32(0, HASH_PURPOSE_PUBLIC_KEY_FINGERPRINT);\n\n const hash = createHash('sha256').update(purposePrefix).update(publicKeyDer).digest();\n\n const result = new Uint8Array(MULTIHASH_SHA256_PREFIX.length + hash.length);\n result.set(MULTIHASH_SHA256_PREFIX);\n result.set(hash, MULTIHASH_SHA256_PREFIX.length);\n\n return bytesToHex(result);\n}\n"]}
|
package/dist/PQI7CWCR.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { __name } from './VUOMXK5T.js';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
|
|
4
|
-
var IntLikeSchema = z.union([
|
|
5
|
-
z.bigint(),
|
|
6
|
-
z.number()
|
|
7
|
-
]).refine((value) => typeof value === "bigint" || Number.isSafeInteger(value), {
|
|
8
|
-
message: "number must be a safe integer; pass a bigint for values beyond MAX_SAFE_INTEGER"
|
|
9
|
-
});
|
|
10
|
-
var buildTemplateId = /* @__PURE__ */ __name((packageId, modulePath) => `${packageId}:${modulePath}`, "buildTemplateId");
|
|
11
|
-
var CommandStatus = {
|
|
12
|
-
Accepted: "accepted",
|
|
13
|
-
Rejected: "rejected",
|
|
14
|
-
Timeout: "timeout"
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export { CommandStatus, IntLikeSchema, buildTemplateId };
|
|
18
|
-
//# sourceMappingURL=PQI7CWCR.js.map
|
|
19
|
-
//# sourceMappingURL=PQI7CWCR.js.map
|
package/dist/PQI7CWCR.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"names":["IntLikeSchema","z","union","bigint","number","refine","value","Number","isSafeInteger","message","buildTemplateId","packageId","modulePath","CommandStatus","Accepted","Rejected","Timeout"],"mappings":";;;AAQO,IAAMA,aAAAA,GAAgBC,EACxBC,KAAAA,CAAM;AAACD,EAAAA,CAAAA,CAAEE,MAAAA,EAAM;AAAIF,EAAAA,CAAAA,CAAEG,MAAAA;CAAS,CAAA,CAC9BC,MAAAA,CAAO,CAACC,KAAAA,KAAU,OAAOA,UAAU,QAAA,IAAYC,MAAAA,CAAOC,aAAAA,CAAcF,KAAAA,CAAAA,EAAQ;EACzEG,OAAAA,EAAS;AACb,CAAA;AAcG,IAAMC,eAAAA,2BAAmBC,SAAAA,EAAmBC,UAAAA,KAC/C,GAAGD,SAAAA,CAAAA,CAAAA,EAAaC,UAAAA,CAAAA,CAAAA,EADW,iBAAA;AAyBxB,IAAMC,aAAAA,GAAgB;EACzBC,QAAAA,EAAU,UAAA;EACVC,QAAAA,EAAU,UAAA;EACVC,OAAAA,EAAS;AACb","file":"PQI7CWCR.js","sourcesContent":["import type { ContractId, Party } from '@daml/types';\nimport { z } from 'zod';\n\n/**\n * A 64-bit integer field (oneSigId / nonce / threshold / count / signed `Int`).\n * A `number` must be a safe integer — larger values have already lost precision as\n * a float, so a bigint is required (mirrors the {@link toBigInt} runtime guard).\n */\nexport const IntLikeSchema = z\n .union([z.bigint(), z.number()])\n .refine((value) => typeof value === 'bigint' || Number.isSafeInteger(value), {\n message: 'number must be a safe integer; pass a bigint for values beyond MAX_SAFE_INTEGER',\n });\nexport type IntLike = z.infer<typeof IntLikeSchema>;\n\n/**\n * Core Types\n */\nexport type TemplateId = string;\n\n/**\n * Build a Canton template ID from a package ID and module path.\n *\n * @example buildTemplateId('abc123', 'RequestFactory:RequestFactory')\n * // => 'abc123:RequestFactory:RequestFactory'\n */\nexport const buildTemplateId = (packageId: string, modulePath: string): TemplateId =>\n `${packageId}:${modulePath}`;\n\nexport type Contract<T extends object> = {\n templateId: TemplateId;\n contractId: ContractId<T>;\n payload: T;\n};\n\n/**\n * Submission Types\n */\nexport type SubmitActors = {\n actAs: Party[];\n readAs?: Party[];\n};\n\nexport type SubmitResult = {\n commandId: string;\n completionOffset: number;\n};\n\n/**\n * Wait / Reconciliation Types\n */\nexport const CommandStatus = {\n Accepted: 'accepted',\n Rejected: 'rejected',\n Timeout: 'timeout',\n} as const;\n\nexport type CommandStatus = (typeof CommandStatus)[keyof typeof CommandStatus];\n\nexport type WaitAccepted = {\n status: typeof CommandStatus.Accepted;\n commandId: string;\n updateId: string;\n offset: number;\n};\nexport type WaitRejected = {\n status: typeof CommandStatus.Rejected;\n commandId: string;\n offset: number;\n error: { code?: number; message: string; details?: unknown };\n};\ntype WaitTimeout = {\n status: typeof CommandStatus.Timeout;\n commandId: string;\n lastCheckedOffset?: number;\n};\n\nexport type WaitResult = WaitAccepted | WaitRejected | WaitTimeout;\n\nexport type WaitOptions = {\n parties: Party[];\n beginExclusive?: number;\n timeoutMs?: number;\n poll?: {\n limit?: number;\n streamIdleTimeoutMs?: number;\n backoffMs?: { initial: number; max: number };\n };\n};\n\n/**\n * External Party / Interactive Submission Types\n */\n\n/**\n * A prepared transaction ready for external signing.\n */\nexport type PreparedTransaction = {\n /** The transaction blob to sign */\n preparedTransaction: string;\n /** Hash of the transaction (sign this) */\n preparedTransactionHash: string;\n /** Hashing scheme version used */\n hashingSchemeVersion: 'HASHING_SCHEME_VERSION_UNSPECIFIED' | 'HASHING_SCHEME_VERSION_V2';\n /** Command ID for tracking */\n commandId: string;\n};\n\nexport type ExternalSignature = {\n /** The party that signed */\n party: Party;\n /** The signature bytes (base64 or hex) */\n signature: string;\n /** Fingerprint/ID of the signing key */\n signedBy: string;\n /** Signature format (e.g., 'Raw') */\n format: string;\n /** Signing algorithm (e.g., 'Ed25519') */\n signingAlgorithmSpec: string;\n};\n\n/**\n * A right granted to a Canton user, as returned by `/v2/users/{userId}/rights`.\n *\n * The `kind` is a discriminated union — only one variant is set per right:\n * - `CanActAs.value.party`: user can submit transactions as that party\n * - `CanReadAs.value.party`: user can read events visible to that party\n * - `ParticipantAdmin`: user has admin rights on the participant\n * - `IdentityProviderAdmin`: user can administer its identity provider\n * - `CanReadAsAnyParty`: user can read as any party\n * - `CanExecuteAsAnyParty`: user can submit as any party\n *\n * Hand-rolled because the OpenAPI generator's `Kind` converter is broken\n * (`instanceOfKindOneOf` checks lowercase `canActAs`, but `KindOneOfFromJSON`\n * reads uppercase `CanActAs`), so the typed client strips all party data.\n *\n * The four nullary variants carry `value: unknown` because Canton's wire\n * format for them is literally `{ \"value\": {} }` (see\n * https://docs.digitalasset.com/build/3.4/explanations/json-api/) and we\n * never read into that payload — only the presence of the variant matters.\n */\nexport type UserRightKind = {\n CanActAs?: { value: { party: string } };\n CanReadAs?: { value: { party: string } };\n ParticipantAdmin?: { value: unknown };\n IdentityProviderAdmin?: { value: unknown };\n CanReadAsAnyParty?: { value: unknown };\n CanExecuteAsAnyParty?: { value: unknown };\n};\n\nexport type UserRight = {\n kind: UserRightKind;\n};\n\n/** Normalized active contract (flat shape derived from JsActiveContract). */\nexport type NormalizedActiveContract = {\n contractId: string;\n templateId: string;\n payload: unknown;\n synchronizerId: string;\n};\n"]}
|
package/dist/WHTAP4A3.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transaction.ts"],"names":["cantonCommandSchema","z","union","object","createCommand","templateId","string","createArguments","any","exerciseCommand","contractId","choice","choiceArgument","createAndExerciseCommand","exerciseByKeyCommand","contractKey","cantonDisclosedContractSchema","optional","createdEventBlob","synchronizerId","cantonTransactionSchema","transactionSchema","extend","populatedTransaction","unresolvedCommands","array","unresolvedDisclosedContracts","actAs","partyToSenderEntity","record","deploymentSpec","packageName","ownerField","identityKeys","cantonTransactionWithResultSchema","buildTransactionWithResultSchema","cantonInflightTransactionSchema","preparedTransaction","preparedTransactionHash","hashingSchemeVersion","enum","commandId","completionOffset","number","cantonAssignedTransactionSchema","assignedTransactionSchema","shape","inflightTransaction","cantonSignedTransactionSchema","signedTransactionSchema","commands","disclosedContracts","signedTransaction","signatures","party","format","signature","signedBy","signingAlgorithmSpec","cantonMinedTransactionSchema","minedTransactionSchema","buildCantonTransaction","chainName","tx","timestamps","created","Date","now"],"mappings":"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","file":"WHTAP4A3.js","sourcesContent":["import { z } from 'zod';\n\nimport {\n assignedTransactionSchema,\n buildTransactionWithResultSchema,\n minedTransactionSchema,\n signedTransactionSchema,\n transactionSchema,\n} from '@layerzerolabs/common-chain-model';\nimport type { PartialBy } from '@layerzerolabs/typescript-utils';\n\n// === Component schemas ===\n\nexport const cantonCommandSchema = z.union([\n z.object({\n createCommand: z.object({\n templateId: z.string(),\n createArguments: z.any(),\n }),\n }),\n z.object({\n exerciseCommand: z.object({\n templateId: z.string(),\n contractId: z.string(),\n choice: z.string(),\n choiceArgument: z.any(),\n }),\n }),\n z.object({\n createAndExerciseCommand: z.object({\n templateId: z.string(),\n createArguments: z.any(),\n choice: z.string(),\n choiceArgument: z.any(),\n }),\n }),\n z.object({\n exerciseByKeyCommand: z.object({\n templateId: z.string(),\n contractKey: z.any(),\n choice: z.string(),\n choiceArgument: z.any(),\n }),\n }),\n]);\n\nexport const cantonDisclosedContractSchema = z.object({\n templateId: z.string().optional(),\n contractId: z.string(),\n createdEventBlob: z.string(),\n synchronizerId: z.string(),\n});\n\n// === Lifecycle schemas ===\n\n/**\n * Canton transaction schema for Daml Ledger API commands.\n */\nexport const cantonTransactionSchema = transactionSchema.extend({\n populatedTransaction: z.object({\n unresolvedCommands: z.array(cantonCommandSchema),\n unresolvedDisclosedContracts: z.array(cantonDisclosedContractSchema),\n\n /** Parties submitting the command (actAs) */\n actAs: z.array(z.string()),\n /** Maps each actAs party → the senderEntityName(s) controlling its signing\n * key(s), always as an array. `.optional()` only so deferred-sender create-time\n * payloads parse; by sign time every actAs party must map, or signing throws.\n * Multiple entries = a multisig party (decentralized namespace) whose keys must\n * all sign. */\n partyToSenderEntity: z.record(z.string(), z.array(z.string())).optional(),\n /** Deployment spec set at prepare time; the deployment activity resolves the live address ref from this + the createCommand. */\n deploymentSpec: z\n .object({\n packageName: z.string(),\n ownerField: z.string(),\n identityKeys: z.array(z.string()),\n })\n .optional(),\n }),\n});\n\nexport const cantonTransactionWithResultSchema =\n buildTransactionWithResultSchema(cantonTransactionSchema);\n\nconst cantonInflightTransactionSchema = z.object({\n /** The prepared transaction blob */\n preparedTransaction: z.string(),\n /** Hash of the prepared transaction (what was signed) */\n preparedTransactionHash: z.string(),\n /** Hashing scheme version used */\n hashingSchemeVersion: z.enum([\n 'HASHING_SCHEME_VERSION_UNSPECIFIED',\n 'HASHING_SCHEME_VERSION_V2',\n ]),\n /** Command ID for tracking */\n commandId: z.string(),\n // Ledger offset at which the submission landed — used as `beginExclusive`\n // for waitForCommand to avoid polling from the start of the ledger.\n // Optional: only present after send(); absent for old/retry scenarios.\n completionOffset: z.number().optional(),\n});\n\n/**\n * Assigned transaction includes the inflight transaction data.\n */\nexport const cantonAssignedTransactionSchema = assignedTransactionSchema.extend({\n ...cantonTransactionSchema.shape,\n inflightTransaction: cantonInflightTransactionSchema.optional(),\n});\n\n/**\n * Signed transaction includes the DER-encoded ECDSA signature.\n */\nexport const cantonSignedTransactionSchema = signedTransactionSchema.extend({\n ...cantonAssignedTransactionSchema.shape,\n // Resolved commands and contracts\n commands: z.array(cantonCommandSchema),\n disclosedContracts: z.array(cantonDisclosedContractSchema),\n signedTransaction: z.object({\n /** Per-party signatures in the format expected by Canton's submitSigned */\n signatures: z.array(\n z.object({\n party: z.string(),\n signatures: z.array(\n z.object({\n format: z.string(),\n signature: z.string(),\n signedBy: z.string(),\n signingAlgorithmSpec: z.string(),\n }),\n ),\n }),\n ),\n }),\n});\n\n/**\n * Mined transaction with confirmation result.\n */\nexport const cantonMinedTransactionSchema = minedTransactionSchema.extend({\n ...cantonSignedTransactionSchema.shape,\n inflightTransaction: cantonInflightTransactionSchema,\n});\n\n/** Identifies a contract by data so its live cid can be re-resolved at sign time. */\nexport interface ContractDataIdentifier {\n cid: string;\n templateId: string;\n party: string;\n contractStateFilter?: Record<string, unknown>;\n}\n\nexport type CantonTx = z.infer<typeof cantonTransactionSchema>;\nexport type CantonPopulatedTransaction = CantonTx['populatedTransaction'];\nexport type CantonCommands = z.infer<typeof cantonCommandSchema>[];\nexport type CantonDisclosedContracts = z.infer<typeof cantonDisclosedContractSchema>[];\nexport type CantonAssignedTx = z.infer<typeof cantonAssignedTransactionSchema>;\nexport type CantonSignedTx = z.infer<typeof cantonSignedTransactionSchema>;\nexport type CantonMinedTx = z.infer<typeof cantonMinedTransactionSchema>;\n\n// === Builder ===\n\nexport type BuildCantonTransactionInput = PartialBy<CantonTx, 'chainName' | 'timestamps'>;\n\nexport const buildCantonTransaction = async (\n chainName: string,\n tx: BuildCantonTransactionInput,\n): Promise<CantonTx> => {\n return {\n ...tx,\n chainName,\n timestamps: {\n created: tx.timestamps?.created ?? Date.now(),\n },\n };\n};\n"]}
|
package/dist/XE6H2SH4.js
DELETED
package/dist/XE6H2SH4.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"XE6H2SH4.js"}
|
package/dist/YHW7AKHX.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { __name } from './VUOMXK5T.js';
|
|
2
|
-
import { TopologyManagerReadServiceClient, ListDecentralizedNamespaceDefinitionRequest, BaseQuery, Empty, StoreId } from '@canton-network/core-ledger-proto';
|
|
3
|
-
import { ChannelCredentials } from '@grpc/grpc-js';
|
|
4
|
-
import { GrpcTransport } from '@protobuf-ts/grpc-transport';
|
|
5
|
-
|
|
6
|
-
function buildChannelCredentials(tls) {
|
|
7
|
-
if (!tls) return ChannelCredentials.createInsecure();
|
|
8
|
-
return ChannelCredentials.createSsl(tls.rootCert, tls.clientKey, tls.clientCert);
|
|
9
|
-
}
|
|
10
|
-
__name(buildChannelCredentials, "buildChannelCredentials");
|
|
11
|
-
var CantonGrpcClient = class {
|
|
12
|
-
static {
|
|
13
|
-
__name(this, "CantonGrpcClient");
|
|
14
|
-
}
|
|
15
|
-
#transport;
|
|
16
|
-
#topologyRead;
|
|
17
|
-
#tokenProvider;
|
|
18
|
-
constructor(opts) {
|
|
19
|
-
this.#transport = new GrpcTransport({
|
|
20
|
-
host: opts.host,
|
|
21
|
-
channelCredentials: buildChannelCredentials(opts.tls)
|
|
22
|
-
});
|
|
23
|
-
this.#topologyRead = new TopologyManagerReadServiceClient(this.#transport);
|
|
24
|
-
this.#tokenProvider = opts.tokenProvider;
|
|
25
|
-
}
|
|
26
|
-
async #getMeta() {
|
|
27
|
-
if (!this.#tokenProvider) return {};
|
|
28
|
-
const token = await this.#tokenProvider.getToken();
|
|
29
|
-
return {
|
|
30
|
-
Authorization: `Bearer ${token}`
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
async getLatestDecentralizedNamespaceDefinition(synchronizerId, namespaceFingerprint) {
|
|
34
|
-
const { response } = await this.#topologyRead.listDecentralizedNamespaceDefinition(ListDecentralizedNamespaceDefinitionRequest.create({
|
|
35
|
-
baseQuery: BaseQuery.create({
|
|
36
|
-
store: StoreId.create({
|
|
37
|
-
store: {
|
|
38
|
-
oneofKind: "synchronizer",
|
|
39
|
-
synchronizer: {
|
|
40
|
-
id: synchronizerId
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}),
|
|
44
|
-
timeQuery: {
|
|
45
|
-
oneofKind: "headState",
|
|
46
|
-
headState: Empty.create({})
|
|
47
|
-
}
|
|
48
|
-
}),
|
|
49
|
-
filterNamespace: namespaceFingerprint
|
|
50
|
-
}), {
|
|
51
|
-
meta: await this.#getMeta()
|
|
52
|
-
});
|
|
53
|
-
return response.results[0]?.item;
|
|
54
|
-
}
|
|
55
|
-
close() {
|
|
56
|
-
this.#transport.close();
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
export { CantonGrpcClient };
|
|
61
|
-
//# sourceMappingURL=YHW7AKHX.js.map
|
|
62
|
-
//# sourceMappingURL=YHW7AKHX.js.map
|
package/dist/YHW7AKHX.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/grpc.ts"],"names":["buildChannelCredentials","tls","ChannelCredentials","createInsecure","createSsl","rootCert","clientKey","clientCert","CantonGrpcClient","opts","GrpcTransport","host","channelCredentials","TopologyManagerReadServiceClient","tokenProvider","token","getToken","Authorization","getLatestDecentralizedNamespaceDefinition","synchronizerId","namespaceFingerprint","response","listDecentralizedNamespaceDefinition","ListDecentralizedNamespaceDefinitionRequest","create","baseQuery","BaseQuery","store","StoreId","oneofKind","synchronizer","id","timeQuery","headState","Empty","filterNamespace","meta","results","item","close"],"mappings":";;;;;AAyBA,SAASA,wBAAwBC,GAAAA,EAAgB;AAC7C,EAAA,IAAI,CAACA,GAAAA,EAAK,OAAOC,kBAAAA,CAAmBC,cAAAA,EAAc;AAClD,EAAA,OAAOD,mBAAmBE,SAAAA,CAAUH,GAAAA,CAAII,UAAUJ,GAAAA,CAAIK,SAAAA,EAAWL,IAAIM,UAAU,CAAA;AACnF;AAHSP,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AAcF,IAAMQ,mBAAN,MAAMA;EAvCb;;;AAwCa,EAAA,UAAA;AACA,EAAA,aAAA;AACA,EAAA,cAAA;AAET,EAAA,WAAA,CAAYC,IAAAA,EAA+B;AACvC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAIC,aAAAA,CAAc;AAChCC,MAAAA,IAAAA,EAAMF,IAAAA,CAAKE,IAAAA;MACXC,kBAAAA,EAAoBZ,uBAAAA,CAAwBS,KAAKR,GAAG;KACxD,CAAA;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAIY,gCAAAA,CAAiC,IAAA,CAAK,UAAU,CAAA;AACzE,IAAA,IAAA,CAAK,iBAAiBJ,IAAAA,CAAKK,aAAAA;AAC/B,EAAA;AAEA,EAAA,MAAM,QAAA,GAAQ;AACV,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,EAAgB,OAAO,EAAC;AAClC,IAAA,MAAMC,KAAAA,GAAQ,MAAM,IAAA,CAAK,cAAA,CAAeC,QAAAA,EAAQ;AAChD,IAAA,OAAO;AAAEC,MAAAA,aAAAA,EAAe,UAAUF,KAAAA,CAAAA;AAAQ,KAAA;AAC9C,EAAA;EAEA,MAAMG,yCAAAA,CACFC,gBACAC,oBAAAA,EACqD;AACrD,IAAA,MAAM,EAAEC,UAAQ,GAAK,MAAM,KAAK,aAAA,CAAcC,oCAAAA,CAC1CC,4CAA4CC,MAAAA,CAAO;AAC/CC,MAAAA,SAAAA,EAAWC,UAAUF,MAAAA,CAAO;AACxBG,QAAAA,KAAAA,EAAOC,QAAQJ,MAAAA,CAAO;UAClBG,KAAAA,EAAO;YAAEE,SAAAA,EAAW,cAAA;YAAgBC,YAAAA,EAAc;cAAEC,EAAAA,EAAIZ;AAAe;AAAE;SAC7E,CAAA;QACAa,SAAAA,EAAW;UAAEH,SAAAA,EAAW,WAAA;UAAaI,SAAAA,EAAWC,KAAAA,CAAMV,MAAAA,CAAO,EAAC;AAAG;OACrE,CAAA;MACAW,eAAAA,EAAiBf;AACrB,KAAA,CAAA,EACA;MAAEgB,IAAAA,EAAM,MAAM,KAAK,QAAA;KAAW,CAAA;AAElC,IAAA,OAAOf,QAAAA,CAASgB,OAAAA,CAAQ,CAAA,CAAA,EAAIC,IAAAA;AAChC,EAAA;EAEAC,KAAAA,GAAc;AACV,IAAA,IAAA,CAAK,WAAWA,KAAAA,EAAK;AACzB,EAAA;AACJ","file":"YHW7AKHX.js","sourcesContent":["import {\n BaseQuery,\n type DecentralizedNamespaceDefinition,\n Empty,\n ListDecentralizedNamespaceDefinitionRequest,\n StoreId,\n TopologyManagerReadServiceClient,\n} from '@canton-network/core-ledger-proto';\nimport { ChannelCredentials } from '@grpc/grpc-js';\nimport { GrpcTransport } from '@protobuf-ts/grpc-transport';\n\nimport type { TokenProvider } from '../auth/token-provider';\n\nexport type TlsOptions = {\n rootCert?: Buffer;\n clientKey?: Buffer;\n clientCert?: Buffer;\n};\n\nexport type CantonGrpcClientOptions = {\n host: string;\n tokenProvider?: TokenProvider;\n tls?: TlsOptions;\n};\n\nfunction buildChannelCredentials(tls?: TlsOptions): ChannelCredentials {\n if (!tls) return ChannelCredentials.createInsecure();\n return ChannelCredentials.createSsl(tls.rootCert, tls.clientKey, tls.clientCert);\n}\n\n/**\n * gRPC client for the Canton Admin API.\n *\n * Wraps the Topology Manager Read Service for querying topology state\n * (decentralized namespace definitions, etc.) via the participant's admin endpoint.\n *\n * If a {@link TokenProvider} is supplied, a fresh Bearer token is acquired\n * before each RPC call via per-call metadata.\n */\nexport class CantonGrpcClient {\n readonly #transport: GrpcTransport;\n readonly #topologyRead: TopologyManagerReadServiceClient;\n readonly #tokenProvider?: TokenProvider;\n\n constructor(opts: CantonGrpcClientOptions) {\n this.#transport = new GrpcTransport({\n host: opts.host,\n channelCredentials: buildChannelCredentials(opts.tls),\n });\n this.#topologyRead = new TopologyManagerReadServiceClient(this.#transport);\n this.#tokenProvider = opts.tokenProvider;\n }\n\n async #getMeta(): Promise<Record<string, string>> {\n if (!this.#tokenProvider) return {};\n const token = await this.#tokenProvider.getToken();\n return { Authorization: `Bearer ${token}` };\n }\n\n async getLatestDecentralizedNamespaceDefinition(\n synchronizerId: string,\n namespaceFingerprint: string,\n ): Promise<DecentralizedNamespaceDefinition | undefined> {\n const { response } = await this.#topologyRead.listDecentralizedNamespaceDefinition(\n ListDecentralizedNamespaceDefinitionRequest.create({\n baseQuery: BaseQuery.create({\n store: StoreId.create({\n store: { oneofKind: 'synchronizer', synchronizer: { id: synchronizerId } },\n }),\n timeQuery: { oneofKind: 'headState', headState: Empty.create({}) },\n }),\n filterNamespace: namespaceFingerprint,\n }),\n { meta: await this.#getMeta() },\n );\n return response.results[0]?.item;\n }\n\n close(): void {\n this.#transport.close();\n }\n}\n"]}
|