@layerzerolabs/common-canton 1.2.85 → 1.2.87

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.
@@ -1,6 +1,6 @@
1
1
  import { CantonClient } from './XZSSPQAG.js';
2
2
  import { Configuration } from './XVX7EVTW.js';
3
- import { CantonGrpcClient } from './K6KCXLMQ.js';
3
+ import { CantonGrpcClient } from './LHA6QVMC.js';
4
4
  import { LocalTokenProvider } from './YF7P4UQM.js';
5
5
  import { ClientCredentialsTokenProvider } from './V2H2WXKE.js';
6
6
  import { __name } from './VUOMXK5T.js';
@@ -99,5 +99,5 @@ function createTokenProvider(params, isLocal) {
99
99
  __name(createTokenProvider, "createTokenProvider");
100
100
 
101
101
  export { createCantonChainProvider, parseCantonChainUri };
102
- //# sourceMappingURL=4S3STHD2.js.map
103
- //# sourceMappingURL=4S3STHD2.js.map
102
+ //# sourceMappingURL=5R6WVDPV.js.map
103
+ //# sourceMappingURL=5R6WVDPV.js.map
@@ -1 +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","process","env","CANTON_CLIENT_SECRET","scope","audience","key","delete","jsonApiUrl","toString","replace","oauth2","createCantonChainProvider","isLocal","params","tokenProvider","createTokenProvider","configuration","Configuration","basePath","accessToken","getToken","client","CantonClient","grpcClient","CantonGrpcClient","host","insecureTransport","LocalTokenProvider","admin","ClientCredentialsTokenProvider"],"mappings":"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","file":"4S3STHD2.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 *\n * When `client-secret` is omitted from the URI, `CANTON_CLIENT_SECRET` is read from the\n * environment.\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 // Prefer URI param; fall back to env so secrets are not committed in provider configs.\n const clientSecret =\n url.searchParams.get('client-secret') ??\n // eslint-disable-next-line turbo/no-undeclared-env-vars -- runtime OAuth secret, not a turbo task input\n process.env.CANTON_CLIENT_SECRET ??\n 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 * over an unencrypted admin channel, allowed for a loopback admin host only.\n * - **isLocal=false**: Uses {@link ClientCredentialsTokenProvider} with OAuth2 client\n * credentials extracted from the URI query parameters, over a TLS admin channel.\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 insecureTransport: isLocal,\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: params.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 URI or CANTON_CLIENT_SECRET)',\n );\n }\n\n return new ClientCredentialsTokenProvider(params.oauth2);\n}\n"]}
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","process","env","CANTON_CLIENT_SECRET","scope","audience","key","delete","jsonApiUrl","toString","replace","oauth2","createCantonChainProvider","isLocal","params","tokenProvider","createTokenProvider","configuration","Configuration","basePath","accessToken","getToken","client","CantonClient","grpcClient","CantonGrpcClient","host","insecureTransport","LocalTokenProvider","admin","ClientCredentialsTokenProvider"],"mappings":"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","file":"5R6WVDPV.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 *\n * When `client-secret` is omitted from the URI, `CANTON_CLIENT_SECRET` is read from the\n * environment.\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 // Prefer URI param; fall back to env so secrets are not committed in provider configs.\n const clientSecret =\n url.searchParams.get('client-secret') ??\n // eslint-disable-next-line turbo/no-undeclared-env-vars -- runtime OAuth secret, not a turbo task input\n process.env.CANTON_CLIENT_SECRET ??\n 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 * over an unencrypted admin channel, allowed for a loopback admin host only.\n * - **isLocal=false**: Uses {@link ClientCredentialsTokenProvider} with OAuth2 client\n * credentials extracted from the URI query parameters, over a TLS admin channel.\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 insecureTransport: isLocal,\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: params.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 URI or CANTON_CLIENT_SECRET)',\n );\n }\n\n return new ClientCredentialsTokenProvider(params.oauth2);\n}\n"]}
@@ -129,7 +129,10 @@ var CantonGrpcClient = class {
129
129
  {
130
130
  namespace: item.namespace,
131
131
  targetKeyFingerprint: computePublicKeyFingerprint(publicKey),
132
- isRootDelegation: item.isRootDelegation,
132
+ targetPublicKeyDer: publicKey,
133
+ // `is_root_delegation` is deprecated: current nodes report the scope in
134
+ // `restriction` and leave the bool false, so accept either.
135
+ isRootDelegation: item.isRootDelegation || item.restriction.oneofKind === "canSignAllMappings",
133
136
  serial: result.context?.serial ?? 0
134
137
  }
135
138
  ];
@@ -142,12 +145,13 @@ var CantonGrpcClient = class {
142
145
  * pass the `1220…` suffix as `namespaceFingerprint`.
143
146
  *
144
147
  * @param namespaceFingerprint - Decentralized namespace fingerprint to filter on.
148
+ * @param proposals - If `true`, query pending proposals instead of authorized mappings.
145
149
  * @returns All matching DND mappings, or an empty array if none exist.
146
150
  */
147
- async getDecentralizedNamespaceDefinition(namespaceFingerprint) {
151
+ async getDecentralizedNamespaceDefinition(namespaceFingerprint, proposals = false) {
148
152
  const synchronizerId = await this.#getSynchronizerId();
149
153
  const { response } = await this.#topologyRead.listDecentralizedNamespaceDefinition(ListDecentralizedNamespaceDefinitionRequest.create({
150
- baseQuery: headStateBaseQuery(synchronizerId),
154
+ baseQuery: headStateBaseQuery(synchronizerId, proposals),
151
155
  filterNamespace: namespaceFingerprint
152
156
  }), {
153
157
  meta: await this.#getMeta()
@@ -164,7 +168,11 @@ var CantonGrpcClient = class {
164
168
  owners: [
165
169
  ...item.owners
166
170
  ],
167
- serial: result.context?.serial ?? 0
171
+ serial: result.context?.serial ?? 0,
172
+ transactionHash: result.context?.transactionHash?.length ? Buffer.from(result.context.transactionHash).toString("hex") : void 0,
173
+ signedByFingerprints: result.context ? [
174
+ ...result.context.signedByFingerprints
175
+ ] : void 0
168
176
  }
169
177
  ];
170
178
  });
@@ -175,12 +183,13 @@ var CantonGrpcClient = class {
175
183
  * Queries topology head state on the synchronizer.
176
184
  *
177
185
  * @param partyId - Full party identifier (e.g. `hint::1220…`).
186
+ * @param proposals - List pending proposals instead of the effective state.
178
187
  * @returns All matching PTK mappings, or an empty array if none exist.
179
188
  */
180
- async getPartyToKeyMapping(partyId) {
189
+ async getPartyToKeyMapping(partyId, proposals = false) {
181
190
  const synchronizerId = await this.#getSynchronizerId();
182
191
  const { response } = await this.#topologyRead.listPartyToKeyMapping(ListPartyToKeyMappingRequest.create({
183
- baseQuery: headStateBaseQuery(synchronizerId),
192
+ baseQuery: headStateBaseQuery(synchronizerId, proposals),
184
193
  filterParty: partyId
185
194
  }), {
186
195
  meta: await this.#getMeta()
@@ -195,7 +204,11 @@ var CantonGrpcClient = class {
195
204
  party: item.party,
196
205
  threshold: item.threshold,
197
206
  signingKeyFingerprints: item.signingKeys.map((key) => computePublicKeyFingerprint(key.publicKey)),
198
- serial: result.context?.serial ?? 0
207
+ serial: result.context?.serial ?? 0,
208
+ transactionHash: result.context?.transactionHash?.length ? Buffer.from(result.context.transactionHash).toString("hex") : void 0,
209
+ signedByFingerprints: result.context ? [
210
+ ...result.context.signedByFingerprints
211
+ ] : void 0
199
212
  }
200
213
  ];
201
214
  });
@@ -368,5 +381,5 @@ var CantonGrpcClient = class {
368
381
  };
369
382
 
370
383
  export { CantonGrpcClient };
371
- //# sourceMappingURL=K6KCXLMQ.js.map
372
- //# sourceMappingURL=K6KCXLMQ.js.map
384
+ //# sourceMappingURL=LHA6QVMC.js.map
385
+ //# sourceMappingURL=LHA6QVMC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/grpc.ts"],"names":["TOPOLOGY_TRANSACTION_NOT_FOUND","DEFAULT_GRPC_CLIENT_OPTIONS","CantonGrpcClient","opts","tokenProvider","synchronizerId","GrpcTransport","host","channelCredentials","buildChannelCredentials","insecureTransport","clientOptions","grpcClientOptions","TopologyManagerReadServiceClient","TopologyManagerWriteServiceClient","SynchronizerConnectivityServiceClient","token","getToken","Authorization","response","listConnectedSynchronizers","meta","synchronizer","connectedSynchronizers","CantonProtocolError","mapping","serial","generateTransactions","GenerateTransactionsRequest","create","proposals","GenerateTransactionsRequest_Proposal","operation","Enums_TopologyChangeOp","ADD_REPLACE","store","synchronizerStore","generated","generatedTransactions","getNamespaceDelegation","namespaceFingerprint","listNamespaceDelegation","ListNamespaceDelegationRequest","baseQuery","headStateBaseQuery","filterNamespace","filterTargetKeyFingerprint","results","flatMap","result","item","publicKey","targetKey","namespace","targetKeyFingerprint","computePublicKeyFingerprint","targetPublicKeyDer","isRootDelegation","restriction","oneofKind","context","getDecentralizedNamespaceDefinition","listDecentralizedNamespaceDefinition","ListDecentralizedNamespaceDefinitionRequest","decentralizedNamespace","threshold","owners","transactionHash","length","Buffer","from","toString","undefined","signedByFingerprints","getPartyToKeyMapping","partyId","listPartyToKeyMapping","ListPartyToKeyMappingRequest","filterParty","party","signingKeyFingerprints","signingKeys","map","key","getPartyToParticipantMapping","listPartyToParticipant","ListPartyToParticipantRequest","filterParticipant","participants","participant","participantUid","permission","createNamespaceDelegationTx","params","buildNamespaceDelegationMapping","publicKeyDer","createDecentralizedNamespaceDefinitionTx","computeDecentralizedNamespace","buildDecentralizedNamespaceDefinitionMapping","updateDecentralizedNamespaceDefinitionTx","createPartyToKeyTx","buildPartyToKeyMapping","signingPublicKeyDers","createPartyToParticipantTx","buildPartyToParticipantMapping","participantIds","submitTopologyTransactions","transactions","CantonError","addTransactions","AddTransactionsRequest","authorizeTopologyTransaction","transactionHashHex","options","retries","retryDelayMs","attempt","authorize","AuthorizeRequest","type","mustFullyAuthorize","err","msg","Error","message","String","includes","Promise","resolve","setTimeout","close"],"mappings":"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","file":"LHA6QVMC.js","sourcesContent":["import {\n AddTransactionsRequest,\n AuthorizeRequest,\n Enums_TopologyChangeOp,\n GenerateTransactionsRequest,\n GenerateTransactionsRequest_Proposal,\n ListDecentralizedNamespaceDefinitionRequest,\n ListNamespaceDelegationRequest,\n ListPartyToKeyMappingRequest,\n ListPartyToParticipantRequest,\n type SignedTopologyTransaction,\n TopologyManagerReadServiceClient,\n TopologyManagerWriteServiceClient,\n type TopologyMapping,\n} from '@canton-network/core-ledger-proto';\nimport { GrpcTransport } from '@protobuf-ts/grpc-transport';\n\nimport type { TokenProvider } from '../auth/token-provider';\nimport { CantonError, CantonProtocolError } from '../errors';\nimport {\n buildDecentralizedNamespaceDefinitionMapping,\n buildNamespaceDelegationMapping,\n buildPartyToKeyMapping,\n buildPartyToParticipantMapping,\n} from './topology/mappings';\nimport { SynchronizerConnectivityServiceClient } from './topology/synchronizer-connectivity';\nimport type {\n CantonGrpcClientOptions,\n CreateDecentralizedNamespaceDefinitionTxParams,\n CreateNamespaceDelegationTxParams,\n CreatePartyToKeyMappingTxParams,\n CreatePartyToParticipantMappingTxParams,\n DecentralizedNamespaceDefinitionState,\n GeneratedTopologyTransaction,\n NamespaceDelegationState,\n PartyToKeyMappingState,\n PartyToParticipantMappingState,\n UpdateDecentralizedNamespaceDefinitionTxParams,\n} from './topology/types';\nimport {\n buildChannelCredentials,\n computeDecentralizedNamespace,\n headStateBaseQuery,\n synchronizerStore,\n} from './topology/utils';\nimport { computePublicKeyFingerprint } from './utils';\n\n// Canton error id for a topology transaction the store has not seen yet. gRPC errors carry it only\n// in the message, so it is matched there.\nconst TOPOLOGY_TRANSACTION_NOT_FOUND = 'TOPOLOGY_TRANSACTION_NOT_FOUND';\n\n/** Default gRPC client options: 128 MiB message-size limits for large admin responses. */\nconst DEFAULT_GRPC_CLIENT_OPTIONS = {\n 'grpc.max_receive_message_length': 128 * 1024 * 1024,\n 'grpc.max_send_message_length': 128 * 1024 * 1024,\n} as const;\n\n/**\n * gRPC client for the Canton participant admin Topology Manager API.\n *\n * Exposes read queries for topology mappings and write helpers that call\n * `GenerateTransactions` to produce unsigned topology transactions and\n * `AddTransactions` to submit signed ones.\n *\n * A fresh Bearer token is attached to each RPC via {@link TokenProvider}.\n */\nexport class CantonGrpcClient {\n readonly #transport: GrpcTransport;\n readonly #topologyRead: TopologyManagerReadServiceClient;\n readonly #topologyWrite: TopologyManagerWriteServiceClient;\n readonly #connectivity: SynchronizerConnectivityServiceClient;\n readonly #tokenProvider: TokenProvider;\n #synchronizerId?: string;\n\n /**\n * @param opts - Admin API host, auth, optional synchronizer id, and transport security.\n */\n constructor(opts: CantonGrpcClientOptions) {\n this.#tokenProvider = opts.tokenProvider;\n this.#synchronizerId = opts.synchronizerId;\n this.#transport = new GrpcTransport({\n host: opts.host,\n channelCredentials: buildChannelCredentials(opts.host, opts.insecureTransport),\n clientOptions: opts.grpcClientOptions ?? DEFAULT_GRPC_CLIENT_OPTIONS,\n });\n this.#topologyRead = new TopologyManagerReadServiceClient(this.#transport);\n this.#topologyWrite = new TopologyManagerWriteServiceClient(this.#transport);\n this.#connectivity = new SynchronizerConnectivityServiceClient(this.#transport);\n }\n\n /** Returns per-RPC gRPC metadata with a fresh Bearer token. */\n async #getMeta(): Promise<Record<string, string>> {\n const token = await this.#tokenProvider.getToken();\n return { Authorization: `Bearer ${token}` };\n }\n\n /**\n * Returns the client synchronizer id, discovering it on first use when omitted at construction.\n *\n * @throws {CantonProtocolError} If the participant exposes no synchronizer store.\n */\n async #getSynchronizerId(): Promise<string> {\n if (this.#synchronizerId) {\n return this.#synchronizerId;\n }\n this.#synchronizerId = await this.#discoverSynchronizerId();\n return this.#synchronizerId;\n }\n\n /**\n * Resolves the logical id of the first synchronizer the participant is connected to.\n *\n * @throws {CantonProtocolError} If the participant is not connected to any synchronizer.\n */\n async #discoverSynchronizerId(): Promise<string> {\n const { response } = await this.#connectivity.listConnectedSynchronizers(\n {},\n { meta: await this.#getMeta() },\n );\n for (const synchronizer of response.connectedSynchronizers) {\n if (synchronizer.synchronizerId) {\n return synchronizer.synchronizerId;\n }\n }\n throw new CantonProtocolError('Participant is not connected to any synchronizer');\n }\n\n /**\n * Calls `GenerateTransactions` for a single ADD_REPLACE mapping.\n *\n * @param synchronizerId - Synchronizer store to target.\n * @param mapping - Topology mapping to encode into the transaction.\n * @param serial - Topology serial (`0` lets Canton auto-determine).\n * @returns Unsigned topology transaction (`serializedTransaction`, `transactionHash`).\n * @throws {CantonProtocolError} If the RPC returns no generated transaction.\n */\n async #generateTopologyTransaction(\n synchronizerId: string,\n mapping: TopologyMapping,\n serial: number,\n ): Promise<GeneratedTopologyTransaction> {\n const { response } = await this.#topologyWrite.generateTransactions(\n GenerateTransactionsRequest.create({\n proposals: [\n GenerateTransactionsRequest_Proposal.create({\n operation: Enums_TopologyChangeOp.ADD_REPLACE,\n serial,\n mapping,\n store: synchronizerStore(synchronizerId),\n }),\n ],\n }),\n { meta: await this.#getMeta() },\n );\n\n const generated = response.generatedTransactions[0];\n\n if (!generated) {\n throw new CantonProtocolError('GenerateTransactions returned no topology transaction');\n }\n\n return generated;\n }\n\n /**\n * Lists Namespace Delegation (NSD) mappings for a namespace.\n *\n * Queries topology head state on the synchronizer. Returns every result from\n * the list RPC.\n *\n * @param namespaceFingerprint - Namespace to filter on (for root NSD, the owner key fingerprint).\n * @returns All matching NSD mappings, or an empty array if none exist.\n */\n async getNamespaceDelegation(\n namespaceFingerprint: string,\n ): Promise<NamespaceDelegationState[]> {\n const synchronizerId = await this.#getSynchronizerId();\n const { response } = await this.#topologyRead.listNamespaceDelegation(\n ListNamespaceDelegationRequest.create({\n baseQuery: headStateBaseQuery(synchronizerId),\n filterNamespace: namespaceFingerprint,\n // Empty string = no target-key filter; return all delegations for this namespace.\n filterTargetKeyFingerprint: '',\n }),\n { meta: await this.#getMeta() },\n );\n\n return response.results.flatMap((result) => {\n const item = result.item;\n const publicKey = item?.targetKey?.publicKey;\n if (!item || !publicKey) {\n return [];\n }\n return [\n {\n namespace: item.namespace,\n targetKeyFingerprint: computePublicKeyFingerprint(publicKey),\n targetPublicKeyDer: publicKey,\n // `is_root_delegation` is deprecated: current nodes report the scope in\n // `restriction` and leave the bool false, so accept either.\n isRootDelegation:\n item.isRootDelegation ||\n item.restriction.oneofKind === 'canSignAllMappings',\n serial: result.context?.serial ?? 0,\n },\n ];\n });\n }\n\n /**\n * Lists Decentralized Namespace Definition (DND) mappings for a namespace.\n *\n * Queries topology head state on the synchronizer. For a party id `hint::1220…`,\n * pass the `1220…` suffix as `namespaceFingerprint`.\n *\n * @param namespaceFingerprint - Decentralized namespace fingerprint to filter on.\n * @param proposals - If `true`, query pending proposals instead of authorized mappings.\n * @returns All matching DND mappings, or an empty array if none exist.\n */\n async getDecentralizedNamespaceDefinition(\n namespaceFingerprint: string,\n proposals = false,\n ): Promise<DecentralizedNamespaceDefinitionState[]> {\n const synchronizerId = await this.#getSynchronizerId();\n const { response } = await this.#topologyRead.listDecentralizedNamespaceDefinition(\n ListDecentralizedNamespaceDefinitionRequest.create({\n baseQuery: headStateBaseQuery(synchronizerId, proposals),\n filterNamespace: namespaceFingerprint,\n }),\n { meta: await this.#getMeta() },\n );\n\n return response.results.flatMap((result) => {\n const item = result.item;\n if (!item) {\n return [];\n }\n return [\n {\n namespace: item.decentralizedNamespace,\n threshold: item.threshold,\n owners: [...item.owners],\n serial: result.context?.serial ?? 0,\n transactionHash: result.context?.transactionHash?.length\n ? Buffer.from(result.context.transactionHash).toString('hex')\n : undefined,\n signedByFingerprints: result.context\n ? [...result.context.signedByFingerprints]\n : undefined,\n },\n ];\n });\n }\n\n /**\n * Lists Party-to-Key (PTK) mappings for a party.\n *\n * Queries topology head state on the synchronizer.\n *\n * @param partyId - Full party identifier (e.g. `hint::1220…`).\n * @param proposals - List pending proposals instead of the effective state.\n * @returns All matching PTK mappings, or an empty array if none exist.\n */\n async getPartyToKeyMapping(\n partyId: string,\n proposals = false,\n ): Promise<PartyToKeyMappingState[]> {\n const synchronizerId = await this.#getSynchronizerId();\n const { response } = await this.#topologyRead.listPartyToKeyMapping(\n ListPartyToKeyMappingRequest.create({\n baseQuery: headStateBaseQuery(synchronizerId, proposals),\n filterParty: partyId,\n }),\n { meta: await this.#getMeta() },\n );\n\n return response.results.flatMap((result) => {\n const item = result.item;\n if (!item) {\n return [];\n }\n return [\n {\n party: item.party,\n threshold: item.threshold,\n signingKeyFingerprints: item.signingKeys.map((key) =>\n computePublicKeyFingerprint(key.publicKey),\n ),\n serial: result.context?.serial ?? 0,\n transactionHash: result.context?.transactionHash?.length\n ? Buffer.from(result.context.transactionHash).toString('hex')\n : undefined,\n signedByFingerprints: result.context\n ? [...result.context.signedByFingerprints]\n : undefined,\n },\n ];\n });\n }\n\n /**\n * Lists Party-to-Participant (PTP) mappings for a party.\n *\n * Queries topology head state on the synchronizer.\n *\n * @param partyId - Full party identifier (e.g. `hint::1220…`).\n * @param proposals - If `true`, query pending proposals instead of authorized mappings.\n * @returns All matching PTP mappings, or an empty array if none exist.\n */\n async getPartyToParticipantMapping(\n partyId: string,\n proposals = false,\n ): Promise<PartyToParticipantMappingState[]> {\n const synchronizerId = await this.#getSynchronizerId();\n const { response } = await this.#topologyRead.listPartyToParticipant(\n ListPartyToParticipantRequest.create({\n baseQuery: headStateBaseQuery(synchronizerId, proposals),\n filterParty: partyId,\n // Empty string = no participant filter; return all hosting mappings for this party.\n filterParticipant: '',\n }),\n { meta: await this.#getMeta() },\n );\n\n return response.results.flatMap((result) => {\n const item = result.item;\n if (!item) {\n return [];\n }\n return [\n {\n party: item.party,\n threshold: item.threshold,\n participants: item.participants.map((participant) => ({\n participantUid: participant.participantUid,\n permission: participant.permission,\n })),\n serial: result.context?.serial ?? 0,\n },\n ];\n });\n }\n\n /**\n * Builds an unsigned Namespace Delegation (NSD) topology transaction.\n *\n * Calls `GenerateTransactions` with an ADD_REPLACE mapping. The returned\n * `transactionHash` must be signed by the namespace key.\n *\n * @param params - Owner public key and optional serial.\n * @returns Unsigned topology transaction (`serializedTransaction`, `transactionHash`).\n */\n async createNamespaceDelegationTx(\n params: CreateNamespaceDelegationTxParams,\n ): Promise<GeneratedTopologyTransaction> {\n const synchronizerId = await this.#getSynchronizerId();\n const mapping = buildNamespaceDelegationMapping(params.publicKeyDer);\n return this.#generateTopologyTransaction(synchronizerId, mapping, params.serial ?? 0);\n }\n\n /**\n * Builds an unsigned Decentralized Namespace Definition (DND) topology transaction.\n *\n * The decentralized namespace id is derived from `params.owners`. All owners\n * must sign the transaction hash.\n *\n * @param params - Owner fingerprints, threshold, and optional serial.\n * @returns Unsigned topology transaction (`serializedTransaction`, `transactionHash`).\n */\n async createDecentralizedNamespaceDefinitionTx(\n params: CreateDecentralizedNamespaceDefinitionTxParams,\n ): Promise<GeneratedTopologyTransaction> {\n const synchronizerId = await this.#getSynchronizerId();\n const decentralizedNamespace = computeDecentralizedNamespace(params.owners);\n const mapping = buildDecentralizedNamespaceDefinitionMapping(\n decentralizedNamespace,\n params.threshold,\n params.owners,\n );\n return this.#generateTopologyTransaction(synchronizerId, mapping, params.serial ?? 0);\n }\n\n async updateDecentralizedNamespaceDefinitionTx(\n params: UpdateDecentralizedNamespaceDefinitionTxParams,\n ): Promise<GeneratedTopologyTransaction> {\n const synchronizerId = await this.#getSynchronizerId();\n const mapping = buildDecentralizedNamespaceDefinitionMapping(\n params.namespace,\n params.threshold,\n params.owners,\n );\n return this.#generateTopologyTransaction(synchronizerId, mapping, params.serial ?? 0);\n }\n\n /**\n * Builds an unsigned Party-to-Key (PTK) topology transaction.\n *\n * Decentralized namespace owners must sign the transaction hash.\n *\n * @param params - Party id, signing keys, threshold, and optional serial.\n * @returns Unsigned topology transaction (`serializedTransaction`, `transactionHash`).\n */\n async createPartyToKeyTx(\n params: CreatePartyToKeyMappingTxParams,\n ): Promise<GeneratedTopologyTransaction> {\n const synchronizerId = await this.#getSynchronizerId();\n const mapping = buildPartyToKeyMapping(\n params.partyId,\n params.signingPublicKeyDers,\n params.threshold,\n );\n return this.#generateTopologyTransaction(synchronizerId, mapping, params.serial ?? 0);\n }\n\n /**\n * Builds an unsigned Party-to-Participant (PTP) topology transaction.\n *\n * Party owners sign the transaction hash. On submit, set `proposal: true` on the\n * signed transaction so the hosting participant can authorize via `Authorize`.\n *\n * @param params - Party id, participant ids, threshold, and optional serial.\n * @returns Unsigned topology transaction (`serializedTransaction`, `transactionHash`).\n */\n async createPartyToParticipantTx(\n params: CreatePartyToParticipantMappingTxParams,\n ): Promise<GeneratedTopologyTransaction> {\n const synchronizerId = await this.#getSynchronizerId();\n const mapping = buildPartyToParticipantMapping(\n params.partyId,\n params.participantIds,\n params.threshold,\n );\n return this.#generateTopologyTransaction(synchronizerId, mapping, params.serial ?? 0);\n }\n\n /**\n * Submits signed topology transactions to the synchronizer store.\n *\n * Multiple transactions are submitted atomically in one `AddTransactions` call.\n * When batching, sign `computeMultiTransactionHash` over all transaction hashes\n * and attach the same `MultiTransactionSignatures` to each entry.\n *\n * Set `proposal: true` on a transaction when the hosting participant must\n * authorize that mapping afterward.\n *\n * @param transactions - One or more signed topology transactions.\n * @throws {CantonError} If `transactions` is empty.\n */\n async submitTopologyTransactions(\n transactions: readonly SignedTopologyTransaction[],\n ): Promise<void> {\n if (transactions.length === 0) {\n throw new CantonError('AddTransactions requires at least one transaction');\n }\n const synchronizerId = await this.#getSynchronizerId();\n await this.#topologyWrite.addTransactions(\n AddTransactionsRequest.create({\n transactions: [...transactions],\n store: synchronizerStore(synchronizerId),\n }),\n { meta: await this.#getMeta() },\n );\n }\n\n /**\n * Authorizes a pending topology proposal by its hash.\n *\n * The participant uses its own local signing keys to add its authorization to\n * the pending proposal identified by `transactionHashHex`. For a PTP where the\n * participant is a required signer, this completes the authorization so the\n * transaction becomes effective on the synchronizer.\n *\n * @param transactionHashHex - Hex-encoded hash of the pending proposal.\n */\n async authorizeTopologyTransaction(\n transactionHashHex: string,\n options: { retries?: number; retryDelayMs?: number } = {},\n ): Promise<void> {\n const { retries = 10, retryDelayMs = 2_000 } = options;\n const synchronizerId = await this.#getSynchronizerId();\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n await this.#topologyWrite.authorize(\n AuthorizeRequest.create({\n type: { oneofKind: 'transactionHash', transactionHash: transactionHashHex },\n mustFullyAuthorize: false,\n store: synchronizerStore(synchronizerId),\n }),\n { meta: await this.#getMeta() },\n );\n return;\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n // addTransactions is async — the proposal may not yet be visible.\n if (msg.includes(TOPOLOGY_TRANSACTION_NOT_FOUND) && attempt < retries) {\n await new Promise<void>((resolve) => setTimeout(resolve, retryDelayMs));\n continue;\n }\n throw err;\n }\n }\n }\n\n /** Closes the underlying gRPC transport. */\n close(): void {\n this.#transport.close();\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { CANTON_DEFERRED_VALUE_SUFFIX, isCantonDeferredSentinel } from './U6EV6YAY.js';
1
+ import { CANTON_DEFERRED_VALUE_SUFFIX, isCantonDeferredSentinel, CANTON_DEFERRED_VALUE_PREFIX } from './U6EV6YAY.js';
2
2
  import { __name } from './VUOMXK5T.js';
3
3
  import { hexZeroPad, trim0x } from '@layerzerolabs/common-encoding-utils';
4
4
 
@@ -33,7 +33,29 @@ var toCantonAddress = /* @__PURE__ */ __name((raw) => {
33
33
  throw new Error(`Not a Canton-native address: ${raw}`);
34
34
  }, "toCantonAddress");
35
35
  var isCantonAddress = /* @__PURE__ */ __name((value) => value.startsWith(CANTON_PARTY_ADDRESS_PREFIX) || value.startsWith(CANTON_CID_ADDRESS_PREFIX) || isCantonDeferredSentinel(value) || isCantonGlobalAddress(value), "isCantonAddress");
36
+ var cantonAddressToPartyId = /* @__PURE__ */ __name((address) => {
37
+ const isNonPartyAddress = address.startsWith(CANTON_CID_ADDRESS_PREFIX) || address.startsWith(CANTON_GLOBAL_ADDRESS_PREFIX) || address.startsWith(CANTON_DEFERRED_VALUE_PREFIX);
38
+ if (isNonPartyAddress) {
39
+ throw new Error(`Not a Canton party address: ${address}`);
40
+ }
41
+ let candidate;
42
+ if (address.startsWith(CANTON_PARTY_ADDRESS_PREFIX)) {
43
+ if (!address.endsWith(CANTON_DEFERRED_VALUE_SUFFIX)) {
44
+ throw new Error(`Not a Canton party address: ${address}`);
45
+ }
46
+ candidate = address.slice(CANTON_PARTY_ADDRESS_PREFIX.length, address.length - CANTON_DEFERRED_VALUE_SUFFIX.length);
47
+ } else if (address.startsWith("<<")) {
48
+ throw new Error(`Not a Canton party address: ${address}`);
49
+ } else {
50
+ candidate = address;
51
+ }
52
+ const match = CANTON_PARTY_ID_REGEX.exec(candidate);
53
+ if (!match || !match[1] || match[1].includes("<") || match[1].includes(">")) {
54
+ throw new Error(`Not a Canton party address: ${address}`);
55
+ }
56
+ return `${match[1]}::${match[2]}`;
57
+ }, "cantonAddressToPartyId");
36
58
 
37
- export { CANTON_CID_ADDRESS_PREFIX, CANTON_GLOBAL_ADDRESS_PREFIX, CANTON_PARTY_ADDRESS_PREFIX, cantonCidAddress, cantonDeferredAddress, cantonGlobalAddress, cantonPartyAddress, isCantonAddress, isCantonGlobalAddress, toCantonAddress };
38
- //# sourceMappingURL=C7YYEPNV.js.map
39
- //# sourceMappingURL=C7YYEPNV.js.map
59
+ export { CANTON_CID_ADDRESS_PREFIX, CANTON_GLOBAL_ADDRESS_PREFIX, CANTON_PARTY_ADDRESS_PREFIX, cantonAddressToPartyId, cantonCidAddress, cantonDeferredAddress, cantonGlobalAddress, cantonPartyAddress, isCantonAddress, isCantonGlobalAddress, toCantonAddress };
60
+ //# sourceMappingURL=THWUUI4S.js.map
61
+ //# sourceMappingURL=THWUUI4S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/address.ts"],"names":["CANTON_PARTY_ID_REGEX","CANTON_CONTRACT_ID_HEX_LENGTH","CANTON_PARTY_ADDRESS_PREFIX","CANTON_CID_ADDRESS_PREFIX","CANTON_GLOBAL_ADDRESS_PREFIX","cantonPartyAddress","hint","fingerprint","CANTON_DEFERRED_VALUE_SUFFIX","cantonCidAddress","contractId","cantonGlobalAddress","address","test","Error","hexZeroPad","toLowerCase","isCantonGlobalAddress","value","cantonDeferredAddress","sentinel","toCantonAddress","raw","isCantonDeferredSentinel","partyMatch","exec","bare","trim0x","length","startsWith","isCantonAddress","cantonAddressToPartyId","isNonPartyAddress","CANTON_DEFERRED_VALUE_PREFIX","candidate","endsWith","slice","match","includes"],"mappings":"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","file":"THWUUI4S.js","sourcesContent":["import { hexZeroPad, trim0x } from '@layerzerolabs/common-encoding-utils';\nimport type { Branded } from '@layerzerolabs/typescript-utils';\n\nimport {\n CANTON_DEFERRED_VALUE_PREFIX,\n CANTON_DEFERRED_VALUE_SUFFIX,\n isCantonDeferredSentinel,\n} from './deferredValue';\n\nconst CANTON_PARTY_ID_REGEX = /^(.+)::([0-9a-fA-F]+)$/;\nconst CANTON_CONTRACT_ID_HEX_LENGTH = 138; // 69 bytes\n\nexport const CANTON_PARTY_ADDRESS_PREFIX = '<<CANTON_PARTY::';\nexport const CANTON_CID_ADDRESS_PREFIX = '<<CANTON_CID::';\nexport const CANTON_GLOBAL_ADDRESS_PREFIX = '<<CANTON_GLOBAL::';\n\n/** A Canton ledger or VER global address, with an explicit sentinel prefix. */\nexport type CantonAddress = Branded<string, 'CantonAddress'>;\n\n/** Construct a party `CantonAddress` from hint and fingerprint. */\nexport const cantonPartyAddress = (hint: string, fingerprint: string): CantonAddress =>\n `${CANTON_PARTY_ADDRESS_PREFIX}${hint}::${fingerprint}${CANTON_DEFERRED_VALUE_SUFFIX}` as CantonAddress;\n\n/** Construct a contract-ID `CantonAddress` from the raw 69-byte hex contract id. */\nexport const cantonCidAddress = (contractId: string): CantonAddress =>\n `${CANTON_CID_ADDRESS_PREFIX}${contractId}${CANTON_DEFERRED_VALUE_SUFFIX}` as CantonAddress;\n\n/** Explicitly wrap an already-derived VER global address. This does not hash the input. */\nexport const cantonGlobalAddress = (address: string): CantonAddress => {\n if (!/^(?:0x)?[0-9a-fA-F]{1,64}$/.test(address)) {\n throw new Error(`Invalid Canton global bytes32 address: ${address}`);\n }\n return `${CANTON_GLOBAL_ADDRESS_PREFIX}${hexZeroPad(address, 32).toLowerCase()}${CANTON_DEFERRED_VALUE_SUFFIX}` as CantonAddress;\n};\n\nexport const isCantonGlobalAddress = (value: string): value is CantonAddress =>\n /^<<CANTON_GLOBAL::0x[0-9a-fA-F]{64}>>$/.test(value);\n\n/** Wrap a deferred-ref sentinel (`<<CANTON_DEFERRED:{json}>>`) as a `CantonAddress`. */\nexport const cantonDeferredAddress = (sentinel: string): CantonAddress => sentinel as CantonAddress;\n\n/** Wrap a raw Canton ledger value (party id, contract id, or deferred sentinel) as `CantonAddress`. */\nexport const toCantonAddress = (raw: string): CantonAddress => {\n if (isCantonDeferredSentinel(raw)) {\n return cantonDeferredAddress(raw);\n }\n const partyMatch = CANTON_PARTY_ID_REGEX.exec(raw);\n if (partyMatch) {\n const [, hint, fingerprint] = partyMatch;\n return cantonPartyAddress(hint!, fingerprint!);\n }\n const bare = trim0x(raw);\n if (bare.length === CANTON_CONTRACT_ID_HEX_LENGTH && bare.startsWith('00')) {\n return cantonCidAddress(bare);\n }\n throw new Error(`Not a Canton-native address: ${raw}`);\n};\n\n/** Returns true if `value` is a valid `CantonAddress` sentinel string. */\nexport const isCantonAddress = (value: string): value is CantonAddress =>\n value.startsWith(CANTON_PARTY_ADDRESS_PREFIX) ||\n value.startsWith(CANTON_CID_ADDRESS_PREFIX) ||\n isCantonDeferredSentinel(value) ||\n isCantonGlobalAddress(value);\n\n/**\n * Convert a Canton party address (`<<CANTON_PARTY::hint::fingerprint>>`) back to its raw party id\n * (`hint::fingerprint`). This is the inverse of {@link cantonPartyAddress} / {@link toCantonAddress}\n * for parties.\n *\n * A raw party id (`hint::fingerprint`, hex fingerprint) is also accepted and returned unchanged.\n *\n * @throws Error for contract-id (`<<CANTON_CID::...>>`), global (`<<CANTON_GLOBAL::...>>`) and deferred\n * (`<<CANTON_DEFERRED:...>>`) addresses, and for any malformed input.\n */\nexport const cantonAddressToPartyId = (address: string): string => {\n const isNonPartyAddress =\n address.startsWith(CANTON_CID_ADDRESS_PREFIX) ||\n address.startsWith(CANTON_GLOBAL_ADDRESS_PREFIX) ||\n address.startsWith(CANTON_DEFERRED_VALUE_PREFIX);\n if (isNonPartyAddress) {\n throw new Error(`Not a Canton party address: ${address}`);\n }\n let candidate: string;\n if (address.startsWith(CANTON_PARTY_ADDRESS_PREFIX)) {\n if (!address.endsWith(CANTON_DEFERRED_VALUE_SUFFIX)) {\n throw new Error(`Not a Canton party address: ${address}`);\n }\n candidate = address.slice(\n CANTON_PARTY_ADDRESS_PREFIX.length,\n address.length - CANTON_DEFERRED_VALUE_SUFFIX.length,\n );\n } else if (address.startsWith('<<')) {\n throw new Error(`Not a Canton party address: ${address}`);\n } else {\n candidate = address;\n }\n const match = CANTON_PARTY_ID_REGEX.exec(candidate);\n if (!match || !match[1] || match[1].includes('<') || match[1].includes('>')) {\n throw new Error(`Not a Canton party address: ${address}`);\n }\n return `${match[1]}::${match[2]}`;\n};\n"]}
package/dist/address.d.ts CHANGED
@@ -17,4 +17,15 @@ export declare const cantonDeferredAddress: (sentinel: string) => CantonAddress;
17
17
  export declare const toCantonAddress: (raw: string) => CantonAddress;
18
18
  /** Returns true if `value` is a valid `CantonAddress` sentinel string. */
19
19
  export declare const isCantonAddress: (value: string) => value is CantonAddress;
20
+ /**
21
+ * Convert a Canton party address (`<<CANTON_PARTY::hint::fingerprint>>`) back to its raw party id
22
+ * (`hint::fingerprint`). This is the inverse of {@link cantonPartyAddress} / {@link toCantonAddress}
23
+ * for parties.
24
+ *
25
+ * A raw party id (`hint::fingerprint`, hex fingerprint) is also accepted and returned unchanged.
26
+ *
27
+ * @throws Error for contract-id (`<<CANTON_CID::...>>`), global (`<<CANTON_GLOBAL::...>>`) and deferred
28
+ * (`<<CANTON_DEFERRED:...>>`) addresses, and for any malformed input.
29
+ */
30
+ export declare const cantonAddressToPartyId: (address: string) => string;
20
31
  //# sourceMappingURL=address.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../src/address.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAO/D,eAAO,MAAM,2BAA2B,qBAAqB,CAAC;AAC9D,eAAO,MAAM,yBAAyB,mBAAmB,CAAC;AAC1D,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAEhE,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAE7D,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,SAAU,MAAM,eAAe,MAAM,KAAG,aACoC,CAAC;AAE5G,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,eAAgB,MAAM,KAAG,aACyC,CAAC;AAEhG,2FAA2F;AAC3F,eAAO,MAAM,mBAAmB,YAAa,MAAM,KAAG,aAKrD,CAAC;AAEF,eAAO,MAAM,qBAAqB,UAAW,MAAM,KAAG,KAAK,IAAI,aACP,CAAC;AAEzD,wFAAwF;AACxF,eAAO,MAAM,qBAAqB,aAAc,MAAM,KAAG,aAA0C,CAAC;AAEpG,uGAAuG;AACvG,eAAO,MAAM,eAAe,QAAS,MAAM,KAAG,aAc7C,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,eAAe,UAAW,MAAM,KAAG,KAAK,IAAI,aAIzB,CAAC"}
1
+ {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../src/address.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAW/D,eAAO,MAAM,2BAA2B,qBAAqB,CAAC;AAC9D,eAAO,MAAM,yBAAyB,mBAAmB,CAAC;AAC1D,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAEhE,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAE7D,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,SAAU,MAAM,eAAe,MAAM,KAAG,aACoC,CAAC;AAE5G,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,eAAgB,MAAM,KAAG,aACyC,CAAC;AAEhG,2FAA2F;AAC3F,eAAO,MAAM,mBAAmB,YAAa,MAAM,KAAG,aAKrD,CAAC;AAEF,eAAO,MAAM,qBAAqB,UAAW,MAAM,KAAG,KAAK,IAAI,aACP,CAAC;AAEzD,wFAAwF;AACxF,eAAO,MAAM,qBAAqB,aAAc,MAAM,KAAG,aAA0C,CAAC;AAEpG,uGAAuG;AACvG,eAAO,MAAM,eAAe,QAAS,MAAM,KAAG,aAc7C,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,eAAe,UAAW,MAAM,KAAG,KAAK,IAAI,aAIzB,CAAC;AAEjC;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,YAAa,MAAM,KAAG,MA2BxD,CAAC"}
package/dist/address.js CHANGED
@@ -1,4 +1,4 @@
1
- export { CANTON_CID_ADDRESS_PREFIX, CANTON_GLOBAL_ADDRESS_PREFIX, CANTON_PARTY_ADDRESS_PREFIX, cantonCidAddress, cantonDeferredAddress, cantonGlobalAddress, cantonPartyAddress, isCantonAddress, isCantonGlobalAddress, toCantonAddress } from './C7YYEPNV.js';
1
+ export { CANTON_CID_ADDRESS_PREFIX, CANTON_GLOBAL_ADDRESS_PREFIX, CANTON_PARTY_ADDRESS_PREFIX, cantonAddressToPartyId, cantonCidAddress, cantonDeferredAddress, cantonGlobalAddress, cantonPartyAddress, isCantonAddress, isCantonGlobalAddress, toCantonAddress } from './THWUUI4S.js';
2
2
  import './U6EV6YAY.js';
3
3
  import './VUOMXK5T.js';
4
4
  //# sourceMappingURL=address.js.map
package/dist/browser.js CHANGED
@@ -1,4 +1,4 @@
1
- export { CANTON_CID_ADDRESS_PREFIX, CANTON_GLOBAL_ADDRESS_PREFIX, CANTON_PARTY_ADDRESS_PREFIX, cantonCidAddress, cantonDeferredAddress, cantonGlobalAddress, cantonPartyAddress, isCantonAddress, isCantonGlobalAddress, toCantonAddress } from './C7YYEPNV.js';
1
+ export { CANTON_CID_ADDRESS_PREFIX, CANTON_GLOBAL_ADDRESS_PREFIX, CANTON_PARTY_ADDRESS_PREFIX, cantonAddressToPartyId, cantonCidAddress, cantonDeferredAddress, cantonGlobalAddress, cantonPartyAddress, isCantonAddress, isCantonGlobalAddress, toCantonAddress } from './THWUUI4S.js';
2
2
  export { SECP256K1_SPKI_DER_HEADER, SECP256K1_SPKI_DER_HEADER_HEX, derEncodeSignature, publicKeyToSpkiDer } from './CMDFOA7C.js';
3
3
  export { assertHexLength, codePointLength, formatDamlDecimal, intToHex, keccak256Hex, padLeft, showBool, showInt, textToHex, timeToUnixSeconds, toBigInt } from './EZIA6KIP.js';
4
4
  export { CANTON_DEFERRED_SENDER, CANTON_DEFERRED_VALUE_PREFIX, CANTON_DEFERRED_VALUE_SUFFIX, cantonActiveContractIdRef, cantonDeferredSenderSchema, cantonDeferredValueSchema, cantonExpectedSignatoriesSchema, cantonRefreshPartyFilterSchema, cantonSenderPartyRef, encodeCantonDeferredValue, isCantonDeferredSender, isCantonDeferredSentinel, isCantonPlaceholder, parseCantonDeferredValue } from './U6EV6YAY.js';
@@ -32,18 +32,20 @@ export declare class CantonGrpcClient {
32
32
  * pass the `1220…` suffix as `namespaceFingerprint`.
33
33
  *
34
34
  * @param namespaceFingerprint - Decentralized namespace fingerprint to filter on.
35
+ * @param proposals - If `true`, query pending proposals instead of authorized mappings.
35
36
  * @returns All matching DND mappings, or an empty array if none exist.
36
37
  */
37
- getDecentralizedNamespaceDefinition(namespaceFingerprint: string): Promise<DecentralizedNamespaceDefinitionState[]>;
38
+ getDecentralizedNamespaceDefinition(namespaceFingerprint: string, proposals?: boolean): Promise<DecentralizedNamespaceDefinitionState[]>;
38
39
  /**
39
40
  * Lists Party-to-Key (PTK) mappings for a party.
40
41
  *
41
42
  * Queries topology head state on the synchronizer.
42
43
  *
43
44
  * @param partyId - Full party identifier (e.g. `hint::1220…`).
45
+ * @param proposals - List pending proposals instead of the effective state.
44
46
  * @returns All matching PTK mappings, or an empty array if none exist.
45
47
  */
46
- getPartyToKeyMapping(partyId: string): Promise<PartyToKeyMappingState[]>;
48
+ getPartyToKeyMapping(partyId: string, proposals?: boolean): Promise<PartyToKeyMappingState[]>;
47
49
  /**
48
50
  * Lists Party-to-Participant (PTP) mappings for a party.
49
51
  *
@@ -1 +1 @@
1
- {"version":3,"file":"grpc.d.ts","sourceRoot":"","sources":["../../src/client/grpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAUH,KAAK,yBAAyB,EAIjC,MAAM,mCAAmC,CAAC;AAY3C,OAAO,KAAK,EACR,uBAAuB,EACvB,8CAA8C,EAC9C,iCAAiC,EACjC,+BAA+B,EAC/B,uCAAuC,EACvC,qCAAqC,EACrC,4BAA4B,EAC5B,wBAAwB,EACxB,sBAAsB,EACtB,8BAA8B,EAC9B,8CAA8C,EACjD,MAAM,kBAAkB,CAAC;AAmB1B;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;;IAQzB;;OAEG;IACH,YAAY,IAAI,EAAE,uBAAuB,EAWxC;IA4ED;;;;;;;;OAQG;IACG,sBAAsB,CACxB,oBAAoB,EAAE,MAAM,GAC7B,OAAO,CAAC,wBAAwB,EAAE,CAAC,CA2BrC;IAED;;;;;;;;OAQG;IACG,mCAAmC,CACrC,oBAAoB,EAAE,MAAM,GAC7B,OAAO,CAAC,qCAAqC,EAAE,CAAC,CAwBlD;IAED;;;;;;;OAOG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA0B7E;IAED;;;;;;;;OAQG;IACG,4BAA4B,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,UAAQ,GAClB,OAAO,CAAC,8BAA8B,EAAE,CAAC,CA6B3C;IAED;;;;;;;;OAQG;IACG,2BAA2B,CAC7B,MAAM,EAAE,iCAAiC,GAC1C,OAAO,CAAC,4BAA4B,CAAC,CAIvC;IAED;;;;;;;;OAQG;IACG,wCAAwC,CAC1C,MAAM,EAAE,8CAA8C,GACvD,OAAO,CAAC,4BAA4B,CAAC,CASvC;IAEK,wCAAwC,CAC1C,MAAM,EAAE,8CAA8C,GACvD,OAAO,CAAC,4BAA4B,CAAC,CAQvC;IAED;;;;;;;OAOG;IACG,kBAAkB,CACpB,MAAM,EAAE,+BAA+B,GACxC,OAAO,CAAC,4BAA4B,CAAC,CAQvC;IAED;;;;;;;;OAQG;IACG,0BAA0B,CAC5B,MAAM,EAAE,uCAAuC,GAChD,OAAO,CAAC,4BAA4B,CAAC,CAQvC;IAED;;;;;;;;;;;;OAYG;IACG,0BAA0B,CAC5B,YAAY,EAAE,SAAS,yBAAyB,EAAE,GACnD,OAAO,CAAC,IAAI,CAAC,CAYf;IAED;;;;;;;;;OASG;IACG,4BAA4B,CAC9B,kBAAkB,EAAE,MAAM,EAC1B,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO,GAC1D,OAAO,CAAC,IAAI,CAAC,CAwBf;IAED,4CAA4C;IAC5C,KAAK,IAAI,IAAI,CAEZ;CACJ"}
1
+ {"version":3,"file":"grpc.d.ts","sourceRoot":"","sources":["../../src/client/grpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAUH,KAAK,yBAAyB,EAIjC,MAAM,mCAAmC,CAAC;AAY3C,OAAO,KAAK,EACR,uBAAuB,EACvB,8CAA8C,EAC9C,iCAAiC,EACjC,+BAA+B,EAC/B,uCAAuC,EACvC,qCAAqC,EACrC,4BAA4B,EAC5B,wBAAwB,EACxB,sBAAsB,EACtB,8BAA8B,EAC9B,8CAA8C,EACjD,MAAM,kBAAkB,CAAC;AAmB1B;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;;IAQzB;;OAEG;IACH,YAAY,IAAI,EAAE,uBAAuB,EAWxC;IA4ED;;;;;;;;OAQG;IACG,sBAAsB,CACxB,oBAAoB,EAAE,MAAM,GAC7B,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAgCrC;IAED;;;;;;;;;OASG;IACG,mCAAmC,CACrC,oBAAoB,EAAE,MAAM,EAC5B,SAAS,UAAQ,GAClB,OAAO,CAAC,qCAAqC,EAAE,CAAC,CA8BlD;IAED;;;;;;;;OAQG;IACG,oBAAoB,CACtB,OAAO,EAAE,MAAM,EACf,SAAS,UAAQ,GAClB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAgCnC;IAED;;;;;;;;OAQG;IACG,4BAA4B,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,UAAQ,GAClB,OAAO,CAAC,8BAA8B,EAAE,CAAC,CA6B3C;IAED;;;;;;;;OAQG;IACG,2BAA2B,CAC7B,MAAM,EAAE,iCAAiC,GAC1C,OAAO,CAAC,4BAA4B,CAAC,CAIvC;IAED;;;;;;;;OAQG;IACG,wCAAwC,CAC1C,MAAM,EAAE,8CAA8C,GACvD,OAAO,CAAC,4BAA4B,CAAC,CASvC;IAEK,wCAAwC,CAC1C,MAAM,EAAE,8CAA8C,GACvD,OAAO,CAAC,4BAA4B,CAAC,CAQvC;IAED;;;;;;;OAOG;IACG,kBAAkB,CACpB,MAAM,EAAE,+BAA+B,GACxC,OAAO,CAAC,4BAA4B,CAAC,CAQvC;IAED;;;;;;;;OAQG;IACG,0BAA0B,CAC5B,MAAM,EAAE,uCAAuC,GAChD,OAAO,CAAC,4BAA4B,CAAC,CAQvC;IAED;;;;;;;;;;;;OAYG;IACG,0BAA0B,CAC5B,YAAY,EAAE,SAAS,yBAAyB,EAAE,GACnD,OAAO,CAAC,IAAI,CAAC,CAYf;IAED;;;;;;;;;OASG;IACG,4BAA4B,CAC9B,kBAAkB,EAAE,MAAM,EAC1B,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO,GAC1D,OAAO,CAAC,IAAI,CAAC,CAwBf;IAED,4CAA4C;IAC5C,KAAK,IAAI,IAAI,CAEZ;CACJ"}
@@ -1,4 +1,4 @@
1
- export { CantonGrpcClient } from '../K6KCXLMQ.js';
1
+ export { CantonGrpcClient } from '../LHA6QVMC.js';
2
2
  import '../RVQWP4JU.js';
3
3
  import '../VJ4PVZYL.js';
4
4
  import '../K7FRAGGM.js';
@@ -285,7 +285,7 @@ export { AMULET_INSTRUMENT_ID, fetchAcceptContext, fetchAmuletContext, fetchAmul
285
285
  import '../TLQX4ZQW.js';
286
286
  import '../ZEK5YBPA.js';
287
287
  import '../YMXOSAU4.js';
288
- export { CantonGrpcClient } from '../K6KCXLMQ.js';
288
+ export { CantonGrpcClient } from '../LHA6QVMC.js';
289
289
  import '../RVQWP4JU.js';
290
290
  import '../VJ4PVZYL.js';
291
291
  export { computeDecentralizedNamespace, computeMultiTransactionHash } from '../K7FRAGGM.js';
@@ -50,6 +50,8 @@ export type NamespaceDelegationState = {
50
50
  namespace: string;
51
51
  /** Fingerprint of the key receiving delegation authority. */
52
52
  targetKeyFingerprint: string;
53
+ /** DER (X.509 SubjectPublicKeyInfo) public key receiving delegation authority. */
54
+ targetPublicKeyDer: Uint8Array;
53
55
  /** Whether this is a root (self) namespace delegation. */
54
56
  isRootDelegation: boolean;
55
57
  /** Topology serial of this mapping revision. */
@@ -65,6 +67,10 @@ export type DecentralizedNamespaceDefinitionState = {
65
67
  owners: string[];
66
68
  /** Topology serial of this mapping revision. */
67
69
  serial: number;
70
+ /** Hex-encoded topology transaction hash of this revision (when returned by the node). */
71
+ transactionHash?: string;
72
+ /** Fingerprints of the keys that have signed this revision (useful for pending proposals). */
73
+ signedByFingerprints?: string[];
68
74
  };
69
75
  /** Party-to-Key (PTK) mapping as returned by topology list queries. */
70
76
  export type PartyToKeyMappingState = {
@@ -76,6 +82,10 @@ export type PartyToKeyMappingState = {
76
82
  signingKeyFingerprints: string[];
77
83
  /** Topology serial of this mapping revision. */
78
84
  serial: number;
85
+ /** Hex-encoded topology transaction hash of this revision (when returned by the node). */
86
+ transactionHash?: string;
87
+ /** Fingerprints of the keys that have signed this revision (useful for pending proposals). */
88
+ signedByFingerprints?: string[];
79
89
  };
80
90
  /** Party-to-Participant (PTP) mapping as returned by topology list queries. */
81
91
  export type PartyToParticipantMappingState = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/topology/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,2BAA2B,EAChC,KAAK,iDAAiD,EACzD,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,8GAA8G;AAC9G,MAAM,MAAM,4BAA4B,GAAG,iDAAiD,CAAC;AAE7F,iFAAiF;AACjF,MAAM,MAAM,iCAAiC,GAAG;IAC5C,gHAAgH;IAChH,YAAY,EAAE,UAAU,CAAC;IACzB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,+FAA+F;AAC/F,MAAM,MAAM,8CAA8C,GAAG;IACzD,kFAAkF;IAClF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,8CAA8C,GACtD,8CAA8C,GAAG;IAC7C,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEN,iFAAiF;AACjF,MAAM,MAAM,+BAA+B,GAAG;IAC1C,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,oBAAoB,EAAE,UAAU,EAAE,CAAC;IACnC,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,uCAAuC,GAAG;IAClD,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,uEAAuE;AACvE,MAAM,MAAM,wBAAwB,GAAG;IACnC,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qFAAqF;AACrF,MAAM,MAAM,qCAAqC,GAAG;IAChD,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,uEAAuE;AACvE,MAAM,MAAM,sBAAsB,GAAG;IACjC,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,8BAA8B,GAAG;IACzC,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,YAAY,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,2BAA2B,CAAA;KAAE,EAAE,CAAC;IACpF,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,uBAAuB,GAAG;IAClC,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,aAAa,CAAC;CACrC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/topology/types.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ import './7JX6NIYS.js';
20
20
  export { buildMultiTransactionSignatures, buildSignedTransaction } from './WKC6X2E3.js';
21
21
  import './IIWYAFUO.js';
22
22
  export { parseMinFeeValue } from './M3GPMXME.js';
23
- export { createCantonChainProvider, parseCantonChainUri } from './4S3STHD2.js';
23
+ export { createCantonChainProvider, parseCantonChainUri } from './5R6WVDPV.js';
24
24
  export { CantonClient } from './XZSSPQAG.js';
25
25
  import './YQ7YDN2E.js';
26
26
  import './YBJJNRKE.js';
@@ -305,7 +305,7 @@ export { AMULET_INSTRUMENT_ID, fetchAcceptContext, fetchAmuletContext, fetchAmul
305
305
  export { assertSafeRegistryUrl, contractIdsFromAnyValue, discloseUtilityCredentials, discoveryUrlsForAppUid, mergeTransferFactoryContexts, partyIdFromRegistryFingerprint } from './TLQX4ZQW.js';
306
306
  import './ZEK5YBPA.js';
307
307
  export { callbackDisclosure, callbackInterfaceView } from './YMXOSAU4.js';
308
- export { CantonGrpcClient } from './K6KCXLMQ.js';
308
+ export { CantonGrpcClient } from './LHA6QVMC.js';
309
309
  import './RVQWP4JU.js';
310
310
  import './VJ4PVZYL.js';
311
311
  export { computeDecentralizedNamespace, computeMultiTransactionHash } from './K7FRAGGM.js';
@@ -316,7 +316,7 @@ import './RSV7WS7X.js';
316
316
  export { LocalTokenProvider } from './YF7P4UQM.js';
317
317
  export { ClientCredentialsTokenProvider } from './V2H2WXKE.js';
318
318
  export { parseAmuletAmount, parseAmuletDecimal } from './CXTOAS7N.js';
319
- export { CANTON_CID_ADDRESS_PREFIX, CANTON_GLOBAL_ADDRESS_PREFIX, CANTON_PARTY_ADDRESS_PREFIX, cantonCidAddress, cantonDeferredAddress, cantonGlobalAddress, cantonPartyAddress, isCantonAddress, isCantonGlobalAddress, toCantonAddress } from './C7YYEPNV.js';
319
+ export { CANTON_CID_ADDRESS_PREFIX, CANTON_GLOBAL_ADDRESS_PREFIX, CANTON_PARTY_ADDRESS_PREFIX, cantonAddressToPartyId, cantonCidAddress, cantonDeferredAddress, cantonGlobalAddress, cantonPartyAddress, isCantonAddress, isCantonGlobalAddress, toCantonAddress } from './THWUUI4S.js';
320
320
  export { SECP256K1_SPKI_DER_HEADER, SECP256K1_SPKI_DER_HEADER_HEX, derEncodeSignature, publicKeyToSpkiDer } from './CMDFOA7C.js';
321
321
  export { assertHexLength, codePointLength, formatDamlDecimal, intToHex, keccak256Hex, padLeft, showBool, showInt, textToHex, timeToUnixSeconds, toBigInt } from './EZIA6KIP.js';
322
322
  export { CantonApiError, CantonError, CantonProtocolError, CantonTransportError, IOAppResolutionError, cantonApiErrorFromResponse, isRetryableCantonError } from './NYEJEKEY.js';
package/dist/provider.js CHANGED
@@ -1,4 +1,4 @@
1
- export { createCantonChainProvider, parseCantonChainUri } from './4S3STHD2.js';
1
+ export { createCantonChainProvider, parseCantonChainUri } from './5R6WVDPV.js';
2
2
  import './XZSSPQAG.js';
3
3
  import './YQ7YDN2E.js';
4
4
  import './YBJJNRKE.js';
@@ -283,7 +283,7 @@ import './7FS5WGDR.js';
283
283
  import './TLQX4ZQW.js';
284
284
  import './ZEK5YBPA.js';
285
285
  import './YMXOSAU4.js';
286
- import './K6KCXLMQ.js';
286
+ import './LHA6QVMC.js';
287
287
  import './RVQWP4JU.js';
288
288
  import './VJ4PVZYL.js';
289
289
  import './K7FRAGGM.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@layerzerolabs/common-canton",
3
- "version": "1.2.85",
3
+ "version": "1.2.87",
4
4
  "private": false,
5
5
  "description": "Canton VM client and utilities",
6
6
  "license": "MIT",
@@ -32,10 +32,10 @@
32
32
  "@canton-network/core-ledger-proto": "^1.7.0",
33
33
  "@daml/types": "3.4.8",
34
34
  "@grpc/grpc-js": "^1.14.5",
35
- "@layerzerolabs/common-chain-model": "1.2.85",
36
- "@layerzerolabs/common-encoding-utils": "1.2.85",
37
- "@layerzerolabs/common-error-utils": "1.2.85",
38
- "@layerzerolabs/typescript-utils": "1.2.85",
35
+ "@layerzerolabs/common-chain-model": "1.2.87",
36
+ "@layerzerolabs/common-encoding-utils": "1.2.87",
37
+ "@layerzerolabs/common-error-utils": "1.2.87",
38
+ "@layerzerolabs/typescript-utils": "1.2.87",
39
39
  "@mojotech/json-type-validation": "^3.1.0",
40
40
  "@noble/hashes": "^1.8.0",
41
41
  "@noble/secp256k1": "1.7.1",
@@ -46,11 +46,11 @@
46
46
  "zod": "4.3.5"
47
47
  },
48
48
  "devDependencies": {
49
- "@layerzerolabs/eslint-configuration": "^1.2.85",
50
- "@layerzerolabs/tsup-configuration": "1.2.85",
51
- "@layerzerolabs/typescript-configuration": "1.2.85",
52
- "@layerzerolabs/vitest-configuration": "1.2.85",
53
- "@layerzerolabs/vm-tooling-canton": "1.2.85",
49
+ "@layerzerolabs/eslint-configuration": "^1.2.87",
50
+ "@layerzerolabs/tsup-configuration": "1.2.87",
51
+ "@layerzerolabs/typescript-configuration": "1.2.87",
52
+ "@layerzerolabs/vitest-configuration": "1.2.87",
53
+ "@layerzerolabs/vm-tooling-canton": "1.2.87",
54
54
  "@vitest/coverage-v8": "4.1.10",
55
55
  "eslint": "9.39.1",
56
56
  "tsup": "^8.4.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/address.ts"],"names":["CANTON_PARTY_ID_REGEX","CANTON_CONTRACT_ID_HEX_LENGTH","CANTON_PARTY_ADDRESS_PREFIX","CANTON_CID_ADDRESS_PREFIX","CANTON_GLOBAL_ADDRESS_PREFIX","cantonPartyAddress","hint","fingerprint","CANTON_DEFERRED_VALUE_SUFFIX","cantonCidAddress","contractId","cantonGlobalAddress","address","test","Error","hexZeroPad","toLowerCase","isCantonGlobalAddress","value","cantonDeferredAddress","sentinel","toCantonAddress","raw","isCantonDeferredSentinel","partyMatch","exec","bare","trim0x","length","startsWith","isCantonAddress"],"mappings":";;;;AAKA,IAAMA,qBAAAA,GAAwB,wBAAA;AAC9B,IAAMC,6BAAAA,GAAgC,GAAA;AAE/B,IAAMC,2BAAAA,GAA8B;AACpC,IAAMC,yBAAAA,GAA4B;AAClC,IAAMC,4BAAAA,GAA+B;AAMrC,IAAMC,kBAAAA,mBAAqB,MAAA,CAAA,CAACC,IAAAA,EAAcC,WAAAA,KAC7C,CAAA,EAAGL,2BAAAA,CAAAA,EAA8BI,IAAAA,CAAAA,EAAAA,EAASC,WAAAA,CAAAA,EAAcC,4BAAAA,CAAAA,CAAAA,EAD1B,oBAAA;AAI3B,IAAMC,gBAAAA,2BAAoBC,UAAAA,KAC7B,CAAA,EAAGP,yBAAAA,CAAAA,EAA4BO,UAAAA,CAAAA,EAAaF,4BAAAA,CAAAA,CAAAA,EADhB,kBAAA;AAIzB,IAAMG,mBAAAA,2BAAuBC,OAAAA,KAAAA;AAChC,EAAA,IAAI,CAAC,4BAAA,CAA6BC,IAAAA,CAAKD,OAAAA,CAAAA,EAAU;AAC7C,IAAA,MAAM,IAAIE,KAAAA,CAAM,CAAA,uCAAA,EAA0CF,OAAAA,CAAAA,CAAS,CAAA;AACvE,EAAA;AACA,EAAA,OAAO,CAAA,EAAGR,4BAAAA,CAAAA,EAA+BW,UAAAA,CAAWH,OAAAA,EAAS,EAAA,CAAA,CAAII,WAAAA,EAAW,CAAA,EAAKR,4BAAAA,CAAAA,CAAAA;AACrF,CAAA,EALmC,qBAAA;AAO5B,IAAMS,wCAAwB,MAAA,CAAA,CAACC,KAAAA,KAClC,wCAAA,CAAyCL,IAAAA,CAAKK,KAAAA,CAAAA,EADb,uBAAA;AAI9B,IAAMC,qBAAAA,mBAAwB,MAAA,CAAA,CAACC,QAAAA,KAAoCA,QAAAA,EAArC,uBAAA;AAG9B,IAAMC,eAAAA,2BAAmBC,GAAAA,KAAAA;AAC5B,EAAA,IAAIC,wBAAAA,CAAyBD,GAAAA,CAAAA,EAAM;AAC/B,IAAA,OAAOH,sBAAsBG,GAAAA,CAAAA;AACjC,EAAA;AACA,EAAA,MAAME,UAAAA,GAAaxB,qBAAAA,CAAsByB,IAAAA,CAAKH,GAAAA,CAAAA;AAC9C,EAAA,IAAIE,UAAAA,EAAY;AACZ,IAAA,MAAM,GAAGlB,IAAAA,EAAMC,WAAAA,CAAAA,GAAeiB,UAAAA;AAC9B,IAAA,OAAOnB,kBAAAA,CAAmBC,MAAOC,WAAAA,CAAAA;AACrC,EAAA;AACA,EAAA,MAAMmB,IAAAA,GAAOC,OAAOL,GAAAA,CAAAA;AACpB,EAAA,IAAII,KAAKE,MAAAA,KAAW3B,6BAAAA,IAAiCyB,IAAAA,CAAKG,UAAAA,CAAW,IAAA,CAAA,EAAO;AACxE,IAAA,OAAOpB,iBAAiBiB,IAAAA,CAAAA;AAC5B,EAAA;AACA,EAAA,MAAM,IAAIZ,KAAAA,CAAM,CAAA,6BAAA,EAAgCQ,GAAAA,CAAAA,CAAK,CAAA;AACzD,CAAA,EAd+B,iBAAA;AAiBxB,IAAMQ,kCAAkB,MAAA,CAAA,CAACZ,KAAAA,KAC5BA,KAAAA,CAAMW,UAAAA,CAAW3B,2BAAAA,CAAAA,IACjBgB,KAAAA,CAAMW,UAAAA,CAAW1B,yBAAAA,KACjBoB,wBAAAA,CAAyBL,KAAAA,CAAAA,IACzBD,qBAAAA,CAAsBC,KAAAA,CAAAA,EAJK,iBAAA","file":"C7YYEPNV.js","sourcesContent":["import { hexZeroPad, trim0x } from '@layerzerolabs/common-encoding-utils';\nimport type { Branded } from '@layerzerolabs/typescript-utils';\n\nimport { CANTON_DEFERRED_VALUE_SUFFIX, isCantonDeferredSentinel } from './deferredValue';\n\nconst CANTON_PARTY_ID_REGEX = /^(.+)::([0-9a-fA-F]+)$/;\nconst CANTON_CONTRACT_ID_HEX_LENGTH = 138; // 69 bytes\n\nexport const CANTON_PARTY_ADDRESS_PREFIX = '<<CANTON_PARTY::';\nexport const CANTON_CID_ADDRESS_PREFIX = '<<CANTON_CID::';\nexport const CANTON_GLOBAL_ADDRESS_PREFIX = '<<CANTON_GLOBAL::';\n\n/** A Canton ledger or VER global address, with an explicit sentinel prefix. */\nexport type CantonAddress = Branded<string, 'CantonAddress'>;\n\n/** Construct a party `CantonAddress` from hint and fingerprint. */\nexport const cantonPartyAddress = (hint: string, fingerprint: string): CantonAddress =>\n `${CANTON_PARTY_ADDRESS_PREFIX}${hint}::${fingerprint}${CANTON_DEFERRED_VALUE_SUFFIX}` as CantonAddress;\n\n/** Construct a contract-ID `CantonAddress` from the raw 69-byte hex contract id. */\nexport const cantonCidAddress = (contractId: string): CantonAddress =>\n `${CANTON_CID_ADDRESS_PREFIX}${contractId}${CANTON_DEFERRED_VALUE_SUFFIX}` as CantonAddress;\n\n/** Explicitly wrap an already-derived VER global address. This does not hash the input. */\nexport const cantonGlobalAddress = (address: string): CantonAddress => {\n if (!/^(?:0x)?[0-9a-fA-F]{1,64}$/.test(address)) {\n throw new Error(`Invalid Canton global bytes32 address: ${address}`);\n }\n return `${CANTON_GLOBAL_ADDRESS_PREFIX}${hexZeroPad(address, 32).toLowerCase()}${CANTON_DEFERRED_VALUE_SUFFIX}` as CantonAddress;\n};\n\nexport const isCantonGlobalAddress = (value: string): value is CantonAddress =>\n /^<<CANTON_GLOBAL::0x[0-9a-fA-F]{64}>>$/.test(value);\n\n/** Wrap a deferred-ref sentinel (`<<CANTON_DEFERRED:{json}>>`) as a `CantonAddress`. */\nexport const cantonDeferredAddress = (sentinel: string): CantonAddress => sentinel as CantonAddress;\n\n/** Wrap a raw Canton ledger value (party id, contract id, or deferred sentinel) as `CantonAddress`. */\nexport const toCantonAddress = (raw: string): CantonAddress => {\n if (isCantonDeferredSentinel(raw)) {\n return cantonDeferredAddress(raw);\n }\n const partyMatch = CANTON_PARTY_ID_REGEX.exec(raw);\n if (partyMatch) {\n const [, hint, fingerprint] = partyMatch;\n return cantonPartyAddress(hint!, fingerprint!);\n }\n const bare = trim0x(raw);\n if (bare.length === CANTON_CONTRACT_ID_HEX_LENGTH && bare.startsWith('00')) {\n return cantonCidAddress(bare);\n }\n throw new Error(`Not a Canton-native address: ${raw}`);\n};\n\n/** Returns true if `value` is a valid `CantonAddress` sentinel string. */\nexport const isCantonAddress = (value: string): value is CantonAddress =>\n value.startsWith(CANTON_PARTY_ADDRESS_PREFIX) ||\n value.startsWith(CANTON_CID_ADDRESS_PREFIX) ||\n isCantonDeferredSentinel(value) ||\n isCantonGlobalAddress(value);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client/grpc.ts"],"names":["TOPOLOGY_TRANSACTION_NOT_FOUND","DEFAULT_GRPC_CLIENT_OPTIONS","CantonGrpcClient","opts","tokenProvider","synchronizerId","GrpcTransport","host","channelCredentials","buildChannelCredentials","insecureTransport","clientOptions","grpcClientOptions","TopologyManagerReadServiceClient","TopologyManagerWriteServiceClient","SynchronizerConnectivityServiceClient","token","getToken","Authorization","response","listConnectedSynchronizers","meta","synchronizer","connectedSynchronizers","CantonProtocolError","mapping","serial","generateTransactions","GenerateTransactionsRequest","create","proposals","GenerateTransactionsRequest_Proposal","operation","Enums_TopologyChangeOp","ADD_REPLACE","store","synchronizerStore","generated","generatedTransactions","getNamespaceDelegation","namespaceFingerprint","listNamespaceDelegation","ListNamespaceDelegationRequest","baseQuery","headStateBaseQuery","filterNamespace","filterTargetKeyFingerprint","results","flatMap","result","item","publicKey","targetKey","namespace","targetKeyFingerprint","computePublicKeyFingerprint","isRootDelegation","context","getDecentralizedNamespaceDefinition","listDecentralizedNamespaceDefinition","ListDecentralizedNamespaceDefinitionRequest","decentralizedNamespace","threshold","owners","getPartyToKeyMapping","partyId","listPartyToKeyMapping","ListPartyToKeyMappingRequest","filterParty","party","signingKeyFingerprints","signingKeys","map","key","getPartyToParticipantMapping","listPartyToParticipant","ListPartyToParticipantRequest","filterParticipant","participants","participant","participantUid","permission","createNamespaceDelegationTx","params","buildNamespaceDelegationMapping","publicKeyDer","createDecentralizedNamespaceDefinitionTx","computeDecentralizedNamespace","buildDecentralizedNamespaceDefinitionMapping","updateDecentralizedNamespaceDefinitionTx","createPartyToKeyTx","buildPartyToKeyMapping","signingPublicKeyDers","createPartyToParticipantTx","buildPartyToParticipantMapping","participantIds","submitTopologyTransactions","transactions","length","CantonError","addTransactions","AddTransactionsRequest","authorizeTopologyTransaction","transactionHashHex","options","retries","retryDelayMs","attempt","authorize","AuthorizeRequest","type","oneofKind","transactionHash","mustFullyAuthorize","err","msg","Error","message","String","includes","Promise","resolve","setTimeout","close"],"mappings":"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","file":"K6KCXLMQ.js","sourcesContent":["import {\n AddTransactionsRequest,\n AuthorizeRequest,\n Enums_TopologyChangeOp,\n GenerateTransactionsRequest,\n GenerateTransactionsRequest_Proposal,\n ListDecentralizedNamespaceDefinitionRequest,\n ListNamespaceDelegationRequest,\n ListPartyToKeyMappingRequest,\n ListPartyToParticipantRequest,\n type SignedTopologyTransaction,\n TopologyManagerReadServiceClient,\n TopologyManagerWriteServiceClient,\n type TopologyMapping,\n} from '@canton-network/core-ledger-proto';\nimport { GrpcTransport } from '@protobuf-ts/grpc-transport';\n\nimport type { TokenProvider } from '../auth/token-provider';\nimport { CantonError, CantonProtocolError } from '../errors';\nimport {\n buildDecentralizedNamespaceDefinitionMapping,\n buildNamespaceDelegationMapping,\n buildPartyToKeyMapping,\n buildPartyToParticipantMapping,\n} from './topology/mappings';\nimport { SynchronizerConnectivityServiceClient } from './topology/synchronizer-connectivity';\nimport type {\n CantonGrpcClientOptions,\n CreateDecentralizedNamespaceDefinitionTxParams,\n CreateNamespaceDelegationTxParams,\n CreatePartyToKeyMappingTxParams,\n CreatePartyToParticipantMappingTxParams,\n DecentralizedNamespaceDefinitionState,\n GeneratedTopologyTransaction,\n NamespaceDelegationState,\n PartyToKeyMappingState,\n PartyToParticipantMappingState,\n UpdateDecentralizedNamespaceDefinitionTxParams,\n} from './topology/types';\nimport {\n buildChannelCredentials,\n computeDecentralizedNamespace,\n headStateBaseQuery,\n synchronizerStore,\n} from './topology/utils';\nimport { computePublicKeyFingerprint } from './utils';\n\n// Canton error id for a topology transaction the store has not seen yet. gRPC errors carry it only\n// in the message, so it is matched there.\nconst TOPOLOGY_TRANSACTION_NOT_FOUND = 'TOPOLOGY_TRANSACTION_NOT_FOUND';\n\n/** Default gRPC client options: 128 MiB message-size limits for large admin responses. */\nconst DEFAULT_GRPC_CLIENT_OPTIONS = {\n 'grpc.max_receive_message_length': 128 * 1024 * 1024,\n 'grpc.max_send_message_length': 128 * 1024 * 1024,\n} as const;\n\n/**\n * gRPC client for the Canton participant admin Topology Manager API.\n *\n * Exposes read queries for topology mappings and write helpers that call\n * `GenerateTransactions` to produce unsigned topology transactions and\n * `AddTransactions` to submit signed ones.\n *\n * A fresh Bearer token is attached to each RPC via {@link TokenProvider}.\n */\nexport class CantonGrpcClient {\n readonly #transport: GrpcTransport;\n readonly #topologyRead: TopologyManagerReadServiceClient;\n readonly #topologyWrite: TopologyManagerWriteServiceClient;\n readonly #connectivity: SynchronizerConnectivityServiceClient;\n readonly #tokenProvider: TokenProvider;\n #synchronizerId?: string;\n\n /**\n * @param opts - Admin API host, auth, optional synchronizer id, and transport security.\n */\n constructor(opts: CantonGrpcClientOptions) {\n this.#tokenProvider = opts.tokenProvider;\n this.#synchronizerId = opts.synchronizerId;\n this.#transport = new GrpcTransport({\n host: opts.host,\n channelCredentials: buildChannelCredentials(opts.host, opts.insecureTransport),\n clientOptions: opts.grpcClientOptions ?? DEFAULT_GRPC_CLIENT_OPTIONS,\n });\n this.#topologyRead = new TopologyManagerReadServiceClient(this.#transport);\n this.#topologyWrite = new TopologyManagerWriteServiceClient(this.#transport);\n this.#connectivity = new SynchronizerConnectivityServiceClient(this.#transport);\n }\n\n /** Returns per-RPC gRPC metadata with a fresh Bearer token. */\n async #getMeta(): Promise<Record<string, string>> {\n const token = await this.#tokenProvider.getToken();\n return { Authorization: `Bearer ${token}` };\n }\n\n /**\n * Returns the client synchronizer id, discovering it on first use when omitted at construction.\n *\n * @throws {CantonProtocolError} If the participant exposes no synchronizer store.\n */\n async #getSynchronizerId(): Promise<string> {\n if (this.#synchronizerId) {\n return this.#synchronizerId;\n }\n this.#synchronizerId = await this.#discoverSynchronizerId();\n return this.#synchronizerId;\n }\n\n /**\n * Resolves the logical id of the first synchronizer the participant is connected to.\n *\n * @throws {CantonProtocolError} If the participant is not connected to any synchronizer.\n */\n async #discoverSynchronizerId(): Promise<string> {\n const { response } = await this.#connectivity.listConnectedSynchronizers(\n {},\n { meta: await this.#getMeta() },\n );\n for (const synchronizer of response.connectedSynchronizers) {\n if (synchronizer.synchronizerId) {\n return synchronizer.synchronizerId;\n }\n }\n throw new CantonProtocolError('Participant is not connected to any synchronizer');\n }\n\n /**\n * Calls `GenerateTransactions` for a single ADD_REPLACE mapping.\n *\n * @param synchronizerId - Synchronizer store to target.\n * @param mapping - Topology mapping to encode into the transaction.\n * @param serial - Topology serial (`0` lets Canton auto-determine).\n * @returns Unsigned topology transaction (`serializedTransaction`, `transactionHash`).\n * @throws {CantonProtocolError} If the RPC returns no generated transaction.\n */\n async #generateTopologyTransaction(\n synchronizerId: string,\n mapping: TopologyMapping,\n serial: number,\n ): Promise<GeneratedTopologyTransaction> {\n const { response } = await this.#topologyWrite.generateTransactions(\n GenerateTransactionsRequest.create({\n proposals: [\n GenerateTransactionsRequest_Proposal.create({\n operation: Enums_TopologyChangeOp.ADD_REPLACE,\n serial,\n mapping,\n store: synchronizerStore(synchronizerId),\n }),\n ],\n }),\n { meta: await this.#getMeta() },\n );\n\n const generated = response.generatedTransactions[0];\n\n if (!generated) {\n throw new CantonProtocolError('GenerateTransactions returned no topology transaction');\n }\n\n return generated;\n }\n\n /**\n * Lists Namespace Delegation (NSD) mappings for a namespace.\n *\n * Queries topology head state on the synchronizer. Returns every result from\n * the list RPC.\n *\n * @param namespaceFingerprint - Namespace to filter on (for root NSD, the owner key fingerprint).\n * @returns All matching NSD mappings, or an empty array if none exist.\n */\n async getNamespaceDelegation(\n namespaceFingerprint: string,\n ): Promise<NamespaceDelegationState[]> {\n const synchronizerId = await this.#getSynchronizerId();\n const { response } = await this.#topologyRead.listNamespaceDelegation(\n ListNamespaceDelegationRequest.create({\n baseQuery: headStateBaseQuery(synchronizerId),\n filterNamespace: namespaceFingerprint,\n // Empty string = no target-key filter; return all delegations for this namespace.\n filterTargetKeyFingerprint: '',\n }),\n { meta: await this.#getMeta() },\n );\n\n return response.results.flatMap((result) => {\n const item = result.item;\n const publicKey = item?.targetKey?.publicKey;\n if (!item || !publicKey) {\n return [];\n }\n return [\n {\n namespace: item.namespace,\n targetKeyFingerprint: computePublicKeyFingerprint(publicKey),\n isRootDelegation: item.isRootDelegation,\n serial: result.context?.serial ?? 0,\n },\n ];\n });\n }\n\n /**\n * Lists Decentralized Namespace Definition (DND) mappings for a namespace.\n *\n * Queries topology head state on the synchronizer. For a party id `hint::1220…`,\n * pass the `1220…` suffix as `namespaceFingerprint`.\n *\n * @param namespaceFingerprint - Decentralized namespace fingerprint to filter on.\n * @returns All matching DND mappings, or an empty array if none exist.\n */\n async getDecentralizedNamespaceDefinition(\n namespaceFingerprint: string,\n ): Promise<DecentralizedNamespaceDefinitionState[]> {\n const synchronizerId = await this.#getSynchronizerId();\n const { response } = await this.#topologyRead.listDecentralizedNamespaceDefinition(\n ListDecentralizedNamespaceDefinitionRequest.create({\n baseQuery: headStateBaseQuery(synchronizerId),\n filterNamespace: namespaceFingerprint,\n }),\n { meta: await this.#getMeta() },\n );\n\n return response.results.flatMap((result) => {\n const item = result.item;\n if (!item) {\n return [];\n }\n return [\n {\n namespace: item.decentralizedNamespace,\n threshold: item.threshold,\n owners: [...item.owners],\n serial: result.context?.serial ?? 0,\n },\n ];\n });\n }\n\n /**\n * Lists Party-to-Key (PTK) mappings for a party.\n *\n * Queries topology head state on the synchronizer.\n *\n * @param partyId - Full party identifier (e.g. `hint::1220…`).\n * @returns All matching PTK mappings, or an empty array if none exist.\n */\n async getPartyToKeyMapping(partyId: string): Promise<PartyToKeyMappingState[]> {\n const synchronizerId = await this.#getSynchronizerId();\n const { response } = await this.#topologyRead.listPartyToKeyMapping(\n ListPartyToKeyMappingRequest.create({\n baseQuery: headStateBaseQuery(synchronizerId),\n filterParty: partyId,\n }),\n { meta: await this.#getMeta() },\n );\n\n return response.results.flatMap((result) => {\n const item = result.item;\n if (!item) {\n return [];\n }\n return [\n {\n party: item.party,\n threshold: item.threshold,\n signingKeyFingerprints: item.signingKeys.map((key) =>\n computePublicKeyFingerprint(key.publicKey),\n ),\n serial: result.context?.serial ?? 0,\n },\n ];\n });\n }\n\n /**\n * Lists Party-to-Participant (PTP) mappings for a party.\n *\n * Queries topology head state on the synchronizer.\n *\n * @param partyId - Full party identifier (e.g. `hint::1220…`).\n * @param proposals - If `true`, query pending proposals instead of authorized mappings.\n * @returns All matching PTP mappings, or an empty array if none exist.\n */\n async getPartyToParticipantMapping(\n partyId: string,\n proposals = false,\n ): Promise<PartyToParticipantMappingState[]> {\n const synchronizerId = await this.#getSynchronizerId();\n const { response } = await this.#topologyRead.listPartyToParticipant(\n ListPartyToParticipantRequest.create({\n baseQuery: headStateBaseQuery(synchronizerId, proposals),\n filterParty: partyId,\n // Empty string = no participant filter; return all hosting mappings for this party.\n filterParticipant: '',\n }),\n { meta: await this.#getMeta() },\n );\n\n return response.results.flatMap((result) => {\n const item = result.item;\n if (!item) {\n return [];\n }\n return [\n {\n party: item.party,\n threshold: item.threshold,\n participants: item.participants.map((participant) => ({\n participantUid: participant.participantUid,\n permission: participant.permission,\n })),\n serial: result.context?.serial ?? 0,\n },\n ];\n });\n }\n\n /**\n * Builds an unsigned Namespace Delegation (NSD) topology transaction.\n *\n * Calls `GenerateTransactions` with an ADD_REPLACE mapping. The returned\n * `transactionHash` must be signed by the namespace key.\n *\n * @param params - Owner public key and optional serial.\n * @returns Unsigned topology transaction (`serializedTransaction`, `transactionHash`).\n */\n async createNamespaceDelegationTx(\n params: CreateNamespaceDelegationTxParams,\n ): Promise<GeneratedTopologyTransaction> {\n const synchronizerId = await this.#getSynchronizerId();\n const mapping = buildNamespaceDelegationMapping(params.publicKeyDer);\n return this.#generateTopologyTransaction(synchronizerId, mapping, params.serial ?? 0);\n }\n\n /**\n * Builds an unsigned Decentralized Namespace Definition (DND) topology transaction.\n *\n * The decentralized namespace id is derived from `params.owners`. All owners\n * must sign the transaction hash.\n *\n * @param params - Owner fingerprints, threshold, and optional serial.\n * @returns Unsigned topology transaction (`serializedTransaction`, `transactionHash`).\n */\n async createDecentralizedNamespaceDefinitionTx(\n params: CreateDecentralizedNamespaceDefinitionTxParams,\n ): Promise<GeneratedTopologyTransaction> {\n const synchronizerId = await this.#getSynchronizerId();\n const decentralizedNamespace = computeDecentralizedNamespace(params.owners);\n const mapping = buildDecentralizedNamespaceDefinitionMapping(\n decentralizedNamespace,\n params.threshold,\n params.owners,\n );\n return this.#generateTopologyTransaction(synchronizerId, mapping, params.serial ?? 0);\n }\n\n async updateDecentralizedNamespaceDefinitionTx(\n params: UpdateDecentralizedNamespaceDefinitionTxParams,\n ): Promise<GeneratedTopologyTransaction> {\n const synchronizerId = await this.#getSynchronizerId();\n const mapping = buildDecentralizedNamespaceDefinitionMapping(\n params.namespace,\n params.threshold,\n params.owners,\n );\n return this.#generateTopologyTransaction(synchronizerId, mapping, params.serial ?? 0);\n }\n\n /**\n * Builds an unsigned Party-to-Key (PTK) topology transaction.\n *\n * Decentralized namespace owners must sign the transaction hash.\n *\n * @param params - Party id, signing keys, threshold, and optional serial.\n * @returns Unsigned topology transaction (`serializedTransaction`, `transactionHash`).\n */\n async createPartyToKeyTx(\n params: CreatePartyToKeyMappingTxParams,\n ): Promise<GeneratedTopologyTransaction> {\n const synchronizerId = await this.#getSynchronizerId();\n const mapping = buildPartyToKeyMapping(\n params.partyId,\n params.signingPublicKeyDers,\n params.threshold,\n );\n return this.#generateTopologyTransaction(synchronizerId, mapping, params.serial ?? 0);\n }\n\n /**\n * Builds an unsigned Party-to-Participant (PTP) topology transaction.\n *\n * Party owners sign the transaction hash. On submit, set `proposal: true` on the\n * signed transaction so the hosting participant can authorize via `Authorize`.\n *\n * @param params - Party id, participant ids, threshold, and optional serial.\n * @returns Unsigned topology transaction (`serializedTransaction`, `transactionHash`).\n */\n async createPartyToParticipantTx(\n params: CreatePartyToParticipantMappingTxParams,\n ): Promise<GeneratedTopologyTransaction> {\n const synchronizerId = await this.#getSynchronizerId();\n const mapping = buildPartyToParticipantMapping(\n params.partyId,\n params.participantIds,\n params.threshold,\n );\n return this.#generateTopologyTransaction(synchronizerId, mapping, params.serial ?? 0);\n }\n\n /**\n * Submits signed topology transactions to the synchronizer store.\n *\n * Multiple transactions are submitted atomically in one `AddTransactions` call.\n * When batching, sign `computeMultiTransactionHash` over all transaction hashes\n * and attach the same `MultiTransactionSignatures` to each entry.\n *\n * Set `proposal: true` on a transaction when the hosting participant must\n * authorize that mapping afterward.\n *\n * @param transactions - One or more signed topology transactions.\n * @throws {CantonError} If `transactions` is empty.\n */\n async submitTopologyTransactions(\n transactions: readonly SignedTopologyTransaction[],\n ): Promise<void> {\n if (transactions.length === 0) {\n throw new CantonError('AddTransactions requires at least one transaction');\n }\n const synchronizerId = await this.#getSynchronizerId();\n await this.#topologyWrite.addTransactions(\n AddTransactionsRequest.create({\n transactions: [...transactions],\n store: synchronizerStore(synchronizerId),\n }),\n { meta: await this.#getMeta() },\n );\n }\n\n /**\n * Authorizes a pending topology proposal by its hash.\n *\n * The participant uses its own local signing keys to add its authorization to\n * the pending proposal identified by `transactionHashHex`. For a PTP where the\n * participant is a required signer, this completes the authorization so the\n * transaction becomes effective on the synchronizer.\n *\n * @param transactionHashHex - Hex-encoded hash of the pending proposal.\n */\n async authorizeTopologyTransaction(\n transactionHashHex: string,\n options: { retries?: number; retryDelayMs?: number } = {},\n ): Promise<void> {\n const { retries = 10, retryDelayMs = 2_000 } = options;\n const synchronizerId = await this.#getSynchronizerId();\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n await this.#topologyWrite.authorize(\n AuthorizeRequest.create({\n type: { oneofKind: 'transactionHash', transactionHash: transactionHashHex },\n mustFullyAuthorize: false,\n store: synchronizerStore(synchronizerId),\n }),\n { meta: await this.#getMeta() },\n );\n return;\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n // addTransactions is async — the proposal may not yet be visible.\n if (msg.includes(TOPOLOGY_TRANSACTION_NOT_FOUND) && attempt < retries) {\n await new Promise<void>((resolve) => setTimeout(resolve, retryDelayMs));\n continue;\n }\n throw err;\n }\n }\n }\n\n /** Closes the underlying gRPC transport. */\n close(): void {\n this.#transport.close();\n }\n}\n"]}