@layerzerolabs/common-canton 1.2.99 → 1.2.101

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.
Files changed (104) hide show
  1. package/dist/{D3KVE5XQ.js → 3H5UAMWJ.js} +12 -9
  2. package/dist/3H5UAMWJ.js.map +1 -0
  3. package/dist/{YBGD26CU.js → 45C3KMUJ.js} +12 -6
  4. package/dist/45C3KMUJ.js.map +1 -0
  5. package/dist/{5BK6GCUD.js → 5VT3BVW6.js} +4 -4
  6. package/dist/{5BK6GCUD.js.map → 5VT3BVW6.js.map} +1 -1
  7. package/dist/{CMFVLC7C.js → 6GIDRO6Y.js} +3 -3
  8. package/dist/{CMFVLC7C.js.map → 6GIDRO6Y.js.map} +1 -1
  9. package/dist/{4SK2ZV46.js → 7DFFQF5Y.js} +37 -14
  10. package/dist/7DFFQF5Y.js.map +1 -0
  11. package/dist/{RFGCLYQN.js → 7Z6L2FXT.js} +3 -3
  12. package/dist/{RFGCLYQN.js.map → 7Z6L2FXT.js.map} +1 -1
  13. package/dist/{NSHNCUWI.js → A4HRBTRS.js} +5 -5
  14. package/dist/{NSHNCUWI.js.map → A4HRBTRS.js.map} +1 -1
  15. package/dist/{HQMIA66Y.js → DELPT7WC.js} +3 -3
  16. package/dist/{HQMIA66Y.js.map → DELPT7WC.js.map} +1 -1
  17. package/dist/{4WZTQJXP.js → KDLPAZ3P.js} +2 -2
  18. package/dist/{4WZTQJXP.js.map → KDLPAZ3P.js.map} +1 -1
  19. package/dist/{YV6LAB6R.js → KGEOWAAR.js} +3 -3
  20. package/dist/{YV6LAB6R.js.map → KGEOWAAR.js.map} +1 -1
  21. package/dist/{K7FRAGGM.js → KLMACWXT.js} +3 -3
  22. package/dist/KLMACWXT.js.map +1 -0
  23. package/dist/{UG2M23HF.js → MM7EIOP4.js} +3 -3
  24. package/dist/{UG2M23HF.js.map → MM7EIOP4.js.map} +1 -1
  25. package/dist/{E6W3YWXU.js → MRAAJXQA.js} +4 -4
  26. package/dist/{E6W3YWXU.js.map → MRAAJXQA.js.map} +1 -1
  27. package/dist/{NGED2YCU.js → OK7GQCQM.js} +9 -5
  28. package/dist/OK7GQCQM.js.map +1 -0
  29. package/dist/{JJDWTXLN.js → QOVYNKLD.js} +3 -3
  30. package/dist/{JJDWTXLN.js.map → QOVYNKLD.js.map} +1 -1
  31. package/dist/{HC2GOOAL.js → QWU4V7O2.js} +138 -24
  32. package/dist/QWU4V7O2.js.map +1 -0
  33. package/dist/{XUXLV3PL.js → SAHSVYH6.js} +2 -2
  34. package/dist/{XUXLV3PL.js.map → SAHSVYH6.js.map} +1 -1
  35. package/dist/{5VKWPQE4.js → SEKZMYNZ.js} +3 -3
  36. package/dist/{5VKWPQE4.js.map → SEKZMYNZ.js.map} +1 -1
  37. package/dist/{DCDLEU2R.js → UUUJS2PY.js} +11 -3
  38. package/dist/UUUJS2PY.js.map +1 -0
  39. package/dist/{M3GPMXME.js → W3ZJSUA6.js} +3 -3
  40. package/dist/{M3GPMXME.js.map → W3ZJSUA6.js.map} +1 -1
  41. package/dist/{IUQEDBC6.js → XKBA43N7.js} +12 -9
  42. package/dist/XKBA43N7.js.map +1 -0
  43. package/dist/{KPFKPA5E.js → XWNGGI4V.js} +6 -6
  44. package/dist/XWNGGI4V.js.map +1 -0
  45. package/dist/{2B3PTIL7.js → ZVEWMW6Q.js} +4 -4
  46. package/dist/{2B3PTIL7.js.map → ZVEWMW6Q.js.map} +1 -1
  47. package/dist/client/amulet.d.ts +11 -1
  48. package/dist/client/amulet.d.ts.map +1 -1
  49. package/dist/client/amulet.js +3 -3
  50. package/dist/client/canton-client.d.ts +13 -4
  51. package/dist/client/canton-client.d.ts.map +1 -1
  52. package/dist/client/canton-client.js +4 -4
  53. package/dist/client/grpc.js +2 -2
  54. package/dist/client/index.d.ts +1 -1
  55. package/dist/client/index.d.ts.map +1 -1
  56. package/dist/client/index.js +6 -6
  57. package/dist/client/interface.d.ts +13 -4
  58. package/dist/client/interface.d.ts.map +1 -1
  59. package/dist/client/topology/utils.d.ts +4 -0
  60. package/dist/client/topology/utils.d.ts.map +1 -1
  61. package/dist/client/topology/utils.js +1 -1
  62. package/dist/events.js +3 -3
  63. package/dist/index.js +23 -23
  64. package/dist/minFee.js +2 -2
  65. package/dist/provider.js +7 -7
  66. package/dist/refresh/callback-burn-mint.js +5 -5
  67. package/dist/refresh/callback-lock-unlock.js +5 -5
  68. package/dist/refresh/callback-registry.js +4 -4
  69. package/dist/refresh/callback.js +7 -7
  70. package/dist/refresh/index.js +17 -17
  71. package/dist/refresh/onesig-config.js +1 -1
  72. package/dist/refresh/onesig-request.js +1 -1
  73. package/dist/refresh/onesig-scope.d.ts.map +1 -1
  74. package/dist/refresh/onesig-scope.js +1 -1
  75. package/dist/refresh/onesig-transfer-instruction.js +8 -8
  76. package/dist/refresh/onesig-transfer.js +9 -9
  77. package/dist/refresh/plan.d.ts +18 -0
  78. package/dist/refresh/plan.d.ts.map +1 -1
  79. package/dist/refresh/plan.js +1 -1
  80. package/dist/refresh/prepare-amulet-transfer.d.ts.map +1 -1
  81. package/dist/refresh/prepare-amulet-transfer.js +4 -4
  82. package/dist/refresh/resolve-plan.d.ts.map +1 -1
  83. package/dist/refresh/resolve-plan.js +15 -15
  84. package/dist/refresh/resolve.js +16 -16
  85. package/dist/sdk/canton-sdk.d.ts +1 -0
  86. package/dist/sdk/canton-sdk.d.ts.map +1 -1
  87. package/dist/sdk/canton-sdk.js +1 -1
  88. package/dist/sdk/index.js +1 -1
  89. package/dist/transaction.d.ts +30 -0
  90. package/dist/transaction.d.ts.map +1 -1
  91. package/dist/transaction.js +2 -2
  92. package/dist/types.d.ts +14 -0
  93. package/dist/types.d.ts.map +1 -1
  94. package/dist/types.js +1 -1
  95. package/package.json +10 -10
  96. package/dist/4SK2ZV46.js.map +0 -1
  97. package/dist/D3KVE5XQ.js.map +0 -1
  98. package/dist/DCDLEU2R.js.map +0 -1
  99. package/dist/HC2GOOAL.js.map +0 -1
  100. package/dist/IUQEDBC6.js.map +0 -1
  101. package/dist/K7FRAGGM.js.map +0 -1
  102. package/dist/KPFKPA5E.js.map +0 -1
  103. package/dist/NGED2YCU.js.map +0 -1
  104. package/dist/YBGD26CU.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/canton-client.ts"],"names":["CantonClient","config","userId","wallet","DefaultApi","CantonProtocolError","getDsoParty","walletUrl","tokenProvider","fetchDsoParty","getToken","getAmuletTransferFactoryContext","args","fetchAmuletTransferFactoryContext","getTransferInstructionContext","fetchTransferInstructionContext","token","getTransferInstructionAcceptContext","contractId","fetchAcceptContext","getAmuletContextWithExternalRules","instrumentId","options","amuletContext","disclosedContracts","fetchAmuletContext","contextWithRules","externalPartyAmuletRulesCid","injectExternalPartyAmuletRules","obj","key","undefined","pascal","charAt","toUpperCase","slice","camel","toLowerCase","call","err","ResponseError","cantonApiErrorFromResponse","response","parties","includeCreatedEventBlob","Object","fromEntries","map","p","cumulative","identifierFilter","wildcardFilter","value","event","templateId","createdEventBlob","preparedTransaction","preparedTransactionHash","hashingSchemeVersion","connectedSynchronizers","getV2StateConnectedSynchronizers","synchronizerId","getLocalParticipantId","getV2PartiesParticipantId","participantId","once","id","CantonTransportError","uploadDar","dar","opts","bytes","byteOffset","byteLength","buffer","body","Blob","type","request","vetAllPackages","postV2Dars","skipIfVetted","CantonApiError","code","skipped","reason","details","validateDar","then","postV2DarsValidate","listParties","getV2Parties","pageSize","pageToken","partyDetails","party","nextPageToken","listUserRights","apiResponse","getV2UsersUserIdRightsRaw","raw","json","rights","listUserParties","Set","right","kind","CanActAs","CanReadAs","add","allocateParty","partyIdHint","postV2Parties","allocatePartyRequest","identityProviderId","generateExternalPartyTopology","generateExternalPartyTopologyRequest","synchronizer","partyHint","publicKey","localParticipantObservationOnly","confirmationThreshold","postV2PartiesExternalGenerateTopology","partyId","multiHash","topologyTransactions","length","allocateExternalParty","allocateExternalPartyRequest","onboardingTransactions","tx","transaction","multiHashSignatures","postV2PartiesExternalAllocate","grantCanActAs","postV2UsersUserIdRights","grantUserRightsRequest","canActAs","getPackageId","packageName","getPreferredPackagesRequest","packageVettingRequirements","postV2InteractiveSubmissionPreferredPackages","packageRef","packageReferences","find","ref","packageId","submit","actors","commands","commandId","randomUUID","completionOffset","getLedgerEndOffset","jsCommands","actAs","readAs","postV2CommandsAsyncSubmit","waitForCommand","timeoutMs","poll","limit","streamIdleTimeoutMs","initialBackoffMs","backoffMs","initial","maxBackoffMs","max","beginExclusive","currentBackoff","deadline","Date","now","completionStreamRequest","rawResponse","postV2CommandsCompletionsRaw","responseText","text","completions","JSON","parse","item","normalized","completionResponse","offsetCheckpoint","checkpoint","checkpointOffset","Math","completionWrapper","completion","offset","completionCommandId","status","updateId","error","message","remainingTime","sleepTime","min","Promise","resolve","setTimeout","lastCheckedOffset","expiry","waitForCommandWithExpiry","maxRecordTime","Number","isSafeInteger","isFinite","rejection","previousOffset","entries","expired","entry","checkpointWrapper","times","some","time","recordTime","isInteger","delay","interfaceIds","getEventsByContractIdRequest","eventFormat","filtersByParty","verbose","postV2EventsEventsByContractId","archived","created","createdEvent","createDisclosure","validated","fetchContractById","fetchEventsByContractId","archivedEvent","fetchTransactionByUpdateId","postV2UpdatesUpdateByIdRaw","getUpdateByIdRequest","updateFormat","updateResponse","fetchTransactionByOffset","postV2UpdatesUpdateByOffsetRaw","getUpdateByOffsetRequest","prepareForSigning","all","jsPrepareSubmissionRequest","verboseHashing","packageIdSelectionPreference","postV2InteractiveSubmissionPrepare","metadata","PreparedTransactionProto","fromBinary","Buffer","from","BigInt","submitSigned","prepared","signatures","jsExecuteSubmissionRequest","partySignatures","sig","format","signature","signedBy","signingAlgorithmSpec","deduplicationPeriod","deduplicationDuration","seconds","nanos","submissionId","postV2InteractiveSubmissionExecute","getV2StateLedgerEnd","queryActiveContracts","queryActiveContractsByParties","templateIds","queryActiveContractsByInterface","cumulativeFilter","postV2StateActiveContractsRaw","getActiveContractsRequest","activeAtOffset","rawJson","contractEntry","JsActiveContract","filter","contract","JsActiveContractFromJSON","getUpdates","endInclusive","postV2UpdatesRaw","getUpdatesRequest","includeTransactions","transactionShape","updateResponses","update","templateFilter","interfaceId","interfaceFilter","includeInterfaceView","notFoundMessage","Transaction"],"mappings":"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","file":"QWU4V7O2.js","sourcesContent":["import { PreparedTransaction as PreparedTransactionProto } from '@canton-network/core-ledger-proto';\nimport type { ContractId } from '@daml/types';\nimport { once } from 'es-toolkit';\nimport { randomUUID } from 'node:crypto';\n\nimport {\n CantonApiError,\n cantonApiErrorFromResponse,\n CantonProtocolError,\n CantonTransportError,\n} from '../errors';\nimport {\n DefaultApi,\n type PostV2CommandsAsyncSubmitRequest,\n type PostV2CommandsCompletionsRequest,\n type PostV2DarsRequest,\n type PostV2DarsValidateRequest,\n type PostV2EventsEventsByContractIdRequest,\n type PostV2InteractiveSubmissionExecuteRequest,\n type PostV2InteractiveSubmissionPreferredPackagesRequest,\n type PostV2InteractiveSubmissionPrepareRequest,\n type PostV2PartiesExternalAllocateRequest,\n type PostV2PartiesExternalGenerateTopologyRequest,\n} from '../open-api/apis/DefaultApi';\nimport {\n type ArchivedEvent,\n type Command,\n type CreatedEvent,\n type CumulativeFilter,\n type DisclosedContract,\n type JsActiveContract,\n JsActiveContractFromJSON,\n} from '../open-api/models';\nimport { type Configuration, ResponseError } from '../open-api/runtime';\nimport type { CantonDisclosedContract } from '../transaction';\nimport type {\n ExternalSignature,\n PreparedTransaction,\n PreparedTransactionWithExpiry,\n SubmitActors,\n SubmitResult,\n UserRight,\n WaitOptions,\n WaitRejected,\n WaitResult,\n WaitWithExpiryResult,\n} from '../types';\nimport {\n type AmuletContextOptions,\n type AmuletContextResult,\n type AmuletTransferFactoryArgs,\n type CantonClientWalletConfig,\n fetchAcceptContext,\n fetchAmuletContext,\n fetchAmuletTransferFactoryContext,\n fetchDsoParty,\n fetchTransferInstructionContext,\n injectExternalPartyAmuletRules,\n type InstrumentId,\n type TransferInstructionAcceptContextResult,\n type TransferInstructionChoice,\n} from './amulet';\nimport type {\n CantonTransaction,\n CantonUpdate,\n CantonUpdateResponse,\n ICantonClient,\n} from './interface';\n\n/**\n * CantonClient - The engine layer for Canton ledger operations.\n *\n * Responsibilities:\n * - Synchronizer discovery and caching\n * - Command submission and completion waiting\n * - Disclosed contract building\n * - JSON normalization (temporary workaround)\n *\n * This class uses composition (not inheritance) to wrap the generated API,\n * exposing only the minimal surface needed for ledger app operations.\n */\nexport class CantonClient implements ICantonClient {\n readonly #api: DefaultApi;\n readonly #userId: string;\n readonly #wallet?: CantonClientWalletConfig;\n #dsoParty?: string;\n\n constructor(\n config: Configuration,\n userId: string = 'participant_admin',\n wallet?: CantonClientWalletConfig,\n ) {\n this.#api = new DefaultApi(config);\n this.#userId = userId;\n this.#wallet = wallet;\n }\n\n #requireWallet(): CantonClientWalletConfig {\n if (!this.#wallet) {\n throw new CantonProtocolError(\n 'CantonClient has no wallet config (walletUrl + tokenProvider); amulet endpoints are unavailable',\n );\n }\n return this.#wallet;\n }\n\n async getDsoParty(): Promise<string> {\n const { walletUrl, tokenProvider } = this.#requireWallet();\n if (this.#dsoParty) return this.#dsoParty;\n this.#dsoParty = await fetchDsoParty(walletUrl, await tokenProvider.getToken());\n return this.#dsoParty;\n }\n\n async getAmuletTransferFactoryContext(args: AmuletTransferFactoryArgs) {\n const { walletUrl, tokenProvider } = this.#requireWallet();\n return fetchAmuletTransferFactoryContext(walletUrl, await tokenProvider.getToken(), args);\n }\n\n async getTransferInstructionContext(args: {\n contractId: string;\n choice: TransferInstructionChoice;\n }): Promise<TransferInstructionAcceptContextResult> {\n const { walletUrl, tokenProvider } = this.#requireWallet();\n return fetchTransferInstructionContext({\n ...args,\n walletUrl,\n token: await tokenProvider.getToken(),\n });\n }\n\n async getTransferInstructionAcceptContext({\n contractId,\n }: {\n contractId: string;\n }): Promise<TransferInstructionAcceptContextResult> {\n const { walletUrl, tokenProvider } = this.#requireWallet();\n return fetchAcceptContext({ walletUrl, token: await tokenProvider.getToken(), contractId });\n }\n\n /** Amulet ChoiceContext with ExternalPartyAmuletRules injected — required by every flow hitting FeeUtils.validateContext. */\n async getAmuletContextWithExternalRules(\n instrumentId: InstrumentId,\n options?: AmuletContextOptions,\n ): Promise<AmuletContextResult> {\n const { walletUrl, tokenProvider } = this.#requireWallet();\n const { amuletContext, disclosedContracts } = await fetchAmuletContext(\n walletUrl,\n await tokenProvider.getToken(),\n instrumentId,\n options,\n );\n const { amuletContext: contextWithRules, externalPartyAmuletRulesCid } =\n injectExternalPartyAmuletRules(amuletContext, disclosedContracts);\n return { amuletContext: contextWithRules, disclosedContracts, externalPartyAmuletRulesCid };\n }\n\n /**\n * Get a property from an object, trying PascalCase first then camelCase.\n * Canton API returns PascalCase but OpenAPI expects camelCase.\n */\n #getField<T>(obj: Record<string, unknown> | undefined, key: string): T | undefined {\n if (!obj) return undefined;\n const pascal = key.charAt(0).toUpperCase() + key.slice(1);\n const camel = key.charAt(0).toLowerCase() + key.slice(1);\n return (obj[pascal] ?? obj[camel]) as T | undefined;\n }\n\n /**\n * Run an API call, normalizing a thrown `ResponseError` into a `CantonApiError`\n * that carries `errorCategory` (for retry classification). Other errors pass through.\n */\n async #invoke<T>(call: () => Promise<T>): Promise<T> {\n try {\n return await call();\n } catch (err) {\n if (err instanceof ResponseError) {\n throw await cantonApiErrorFromResponse(err.response);\n }\n throw err;\n }\n }\n\n /**\n * Build party-based filter object for event queries.\n */\n #buildPartyFilters(parties: string[], includeCreatedEventBlob: boolean) {\n return Object.fromEntries(\n parties.map((p) => [\n p,\n {\n cumulative: [\n {\n identifierFilter: {\n wildcardFilter: { value: { includeCreatedEventBlob } },\n },\n },\n ],\n },\n ]),\n );\n }\n\n /**\n * Validate and extract disclosure fields from a CreatedEvent.\n */\n #validateDisclosureEvent(\n event: { templateId?: string; contractId?: string; createdEventBlob?: string },\n contractId: ContractId<unknown>,\n ): { templateId: string; contractId: string; createdEventBlob: string } {\n if (!event.templateId) {\n throw new CantonProtocolError('Disclosure response missing templateId', {\n contractId,\n });\n }\n if (!event.contractId) {\n throw new CantonProtocolError('Disclosure response missing contractId', {\n contractId,\n });\n }\n if (!event.createdEventBlob) {\n throw new CantonProtocolError('Disclosure response missing createdEventBlob', {\n contractId,\n });\n }\n return {\n templateId: event.templateId,\n contractId: event.contractId,\n createdEventBlob: event.createdEventBlob,\n };\n }\n\n /**\n * Validate and extract prepared transaction fields from a prepare response.\n */\n #validatePrepareResponse(response: {\n preparedTransaction?: string;\n preparedTransactionHash?: string;\n hashingSchemeVersion?: string;\n }): {\n preparedTransaction: string;\n preparedTransactionHash: string;\n hashingSchemeVersion: string;\n } {\n if (!response.preparedTransaction) {\n throw new CantonProtocolError('Prepare response missing preparedTransaction');\n }\n if (!response.preparedTransactionHash) {\n throw new CantonProtocolError('Prepare response missing preparedTransactionHash');\n }\n if (!response.hashingSchemeVersion) {\n throw new CantonProtocolError('Prepare response missing hashingSchemeVersion');\n }\n return {\n preparedTransaction: response.preparedTransaction,\n preparedTransactionHash: response.preparedTransactionHash,\n hashingSchemeVersion: response.hashingSchemeVersion,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Synchronizer Discovery\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Returns all connected synchronizer IDs.\n */\n async connectedSynchronizers(): Promise<string[]> {\n const response = await this.#invoke(() => this.#api.getV2StateConnectedSynchronizers());\n\n return response.connectedSynchronizers?.map(({ synchronizerId }) => synchronizerId) ?? [];\n }\n\n async getLocalParticipantId(): Promise<string> {\n const response = await this.#invoke(() => this.#api.getV2PartiesParticipantId());\n return response.participantId;\n }\n\n /**\n * Internal: ensures we have a cached synchronizer ID, fetching if needed.\n */\n #ensureSynchronizerId = once(async (): Promise<string> => {\n const [id] = await this.connectedSynchronizers();\n\n if (!id) {\n throw new CantonTransportError('No connected synchronizers found');\n }\n\n return id;\n });\n\n // ─────────────────────────────────────────────────────────────────────────\n // DAR Upload / Validation\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Upload a DAR (Daml Archive) to the participant node.\n *\n * @param dar - Raw DAR bytes.\n * @param opts.vetAllPackages - Whether to vet all packages in the DAR.\n * @param opts.synchronizerId - Synchronizer to upload to (auto-detected if omitted).\n * @param opts.skipIfVetted - If true, silently succeeds when the DAR is already vetted.\n */\n async uploadDar(\n dar: Uint8Array<ArrayBuffer>,\n opts: { vetAllPackages?: boolean; synchronizerId?: string; skipIfVetted?: boolean } = {},\n ): Promise<object> {\n // Extract the underlying ArrayBuffer, handling views that don't start at offset 0\n const bytes =\n dar.byteOffset === 0 && dar.byteLength === dar.buffer.byteLength\n ? dar.buffer\n : dar.buffer.slice(dar.byteOffset, dar.byteOffset + dar.byteLength);\n const body = new Blob([bytes], { type: 'application/octet-stream' });\n const synchronizerId = opts.synchronizerId ?? (await this.#ensureSynchronizerId());\n const request: PostV2DarsRequest = {\n body,\n vetAllPackages: opts.vetAllPackages,\n synchronizerId,\n };\n\n try {\n return await this.#invoke(() => this.#api.postV2Dars(request));\n } catch (err: unknown) {\n // If skipIfVetted, treat KNOWN_PACKAGE_VERSION as a no-op success\n if (\n opts.skipIfVetted &&\n err instanceof CantonApiError &&\n err.code === 'KNOWN_PACKAGE_VERSION'\n ) {\n return { skipped: true, reason: 'already_vetted', details: err.body };\n }\n throw err;\n }\n }\n\n /**\n * Validate a DAR against the participant without uploading it.\n *\n * @param dar - Raw DAR bytes.\n * @param opts.synchronizerId - Synchronizer to validate against (auto-detected if omitted).\n */\n async validateDar(\n dar: Uint8Array<ArrayBuffer>,\n opts: { synchronizerId?: string } = {},\n ): Promise<void> {\n const bytes =\n dar.byteOffset === 0 && dar.byteLength === dar.buffer.byteLength\n ? dar.buffer\n : dar.buffer.slice(dar.byteOffset, dar.byteOffset + dar.byteLength);\n const body = new Blob([bytes], { type: 'application/octet-stream' });\n const request: PostV2DarsValidateRequest = {\n body,\n synchronizerId: opts.synchronizerId,\n };\n\n if (!request.synchronizerId) {\n return this.#ensureSynchronizerId().then((synchronizerId) =>\n this.#invoke(() => this.#api.postV2DarsValidate({ ...request, synchronizerId })),\n );\n }\n\n return this.#invoke(() => this.#api.postV2DarsValidate(request));\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Party Management\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * List all known parties on the participant node.\n *\n * @param opts.pageSize - Maximum number of results per page\n * @param opts.pageToken - Pagination token from previous response\n * @returns Array of party IDs and pagination token\n */\n async listParties(\n opts: { pageSize?: number; pageToken?: string } = {},\n ): Promise<{ parties: string[]; nextPageToken?: string }> {\n const response = await this.#invoke(() =>\n this.#api.getV2Parties({\n pageSize: opts.pageSize,\n pageToken: opts.pageToken,\n }),\n );\n\n return {\n parties: response.partyDetails?.map((p) => p.party) ?? [],\n nextPageToken: response.nextPageToken,\n };\n }\n\n /**\n * Return the rights granted to the current user (this.#userId).\n *\n * Bypasses the OpenAPI generator's typed `Kind` converter, which is\n * broken: `instanceOfKindOneOf` checks lowercase `canActAs in value`, but\n * `KindOneOfFromJSONTyped` reads uppercase `json['CanActAs']`, so the\n * typed client returns every `kind` as `{}`. We parse the raw JSON\n * ourselves to preserve the actual variant payload.\n */\n async listUserRights(): Promise<UserRight[]> {\n const apiResponse = await this.#invoke(() =>\n this.#api.getV2UsersUserIdRightsRaw({\n userId: this.#userId,\n }),\n );\n const raw = (await apiResponse.raw.json()) as { rights?: UserRight[] };\n return raw.rights ?? [];\n }\n\n /**\n * Return the parties the current user has CanActAs or CanReadAs rights\n * for. Convenience wrapper over `listUserRights()` for the common case\n * where the caller just needs party-scoped access (e.g. to query events\n * or fetch transactions).\n *\n * Use this instead of `listParties()` when the caller only has scoped\n * rights — `listParties()` returns *all* parties on the participant\n * (including DSO, splice parties), and Canton returns 403 if you query\n * as a party you can't read.\n */\n async listUserParties(): Promise<string[]> {\n const rights = await this.listUserRights();\n const parties = new Set<string>();\n for (const right of rights) {\n // Only `CanActAs` / `CanReadAs` carry a party; the other four\n // variants (ParticipantAdmin, IdentityProviderAdmin,\n // CanReadAsAnyParty, CanExecuteAsAnyParty) have empty payloads.\n const party = right.kind.CanActAs?.value.party ?? right.kind.CanReadAs?.value.party;\n if (party !== undefined) {\n parties.add(party);\n }\n }\n return [...parties];\n }\n\n /**\n * Allocate a new party on the participant node.\n *\n * @param partyIdHint - A hint for the party ID (e.g., \"alice\", \"bob\")\n * @param opts.userId - User who gets actAs rights (empty string = no user)\n * @param opts.synchronizerId - Synchronizer to allocate on (auto-detected if omitted)\n * @param opts.identityProviderId - Identity provider ID (empty string = default)\n * @returns The allocated party ID\n */\n async allocateParty(\n partyIdHint: string,\n opts: { userId?: string; synchronizerId?: string; identityProviderId?: string } = {},\n ): Promise<string> {\n const synchronizerId = opts.synchronizerId ?? (await this.#ensureSynchronizerId());\n\n const response = await this.#invoke(() =>\n this.#api.postV2Parties({\n allocatePartyRequest: {\n partyIdHint,\n synchronizerId,\n userId: opts.userId ?? '',\n identityProviderId: opts.identityProviderId ?? '',\n },\n }),\n );\n\n const party = response.partyDetails?.party;\n if (!party) {\n throw new CantonProtocolError('Party allocation response missing party ID');\n }\n\n return party;\n }\n\n /**\n * Generate unsigned topology transactions for an external party.\n *\n * POST /v2/parties/external/generate-topology\n */\n async generateExternalPartyTopology(args: {\n partyHint: string;\n publicKey: { format: string; keyData: string; keySpec: string };\n localParticipantObservationOnly: boolean;\n confirmationThreshold: number;\n }): Promise<{\n partyId: string;\n topologyTransactions: string[];\n multiHash: string;\n synchronizerId: string;\n }> {\n const synchronizerId = await this.#ensureSynchronizerId();\n const request: PostV2PartiesExternalGenerateTopologyRequest = {\n generateExternalPartyTopologyRequest: {\n synchronizer: synchronizerId,\n partyHint: args.partyHint,\n publicKey: args.publicKey,\n localParticipantObservationOnly: args.localParticipantObservationOnly,\n confirmationThreshold: args.confirmationThreshold,\n },\n };\n\n const response = await this.#invoke(() =>\n this.#api.postV2PartiesExternalGenerateTopology(request),\n );\n\n if (!response.partyId || !response.multiHash) {\n throw new CantonProtocolError(\n 'generateExternalPartyTopology response missing partyId or multiHash',\n );\n }\n\n if (!response.topologyTransactions?.length) {\n throw new CantonProtocolError(\n 'generateExternalPartyTopology response missing topologyTransactions',\n );\n }\n\n return {\n partyId: response.partyId,\n topologyTransactions: response.topologyTransactions,\n multiHash: response.multiHash,\n synchronizerId,\n };\n }\n\n /**\n * Submit signed topology transactions to register an external party.\n *\n * POST /v2/parties/external/allocate\n */\n async allocateExternalParty(args: {\n synchronizerId: string;\n topologyTransactions: string[];\n multiHashSignatures: Array<{\n format: string;\n signature: string;\n signedBy: string;\n signingAlgorithmSpec: string;\n }>;\n }): Promise<string> {\n const request: PostV2PartiesExternalAllocateRequest = {\n allocateExternalPartyRequest: {\n synchronizer: args.synchronizerId,\n onboardingTransactions: args.topologyTransactions.map((tx) => ({\n transaction: tx,\n })),\n multiHashSignatures: args.multiHashSignatures,\n identityProviderId: '',\n },\n };\n\n const response = await this.#invoke(() => this.#api.postV2PartiesExternalAllocate(request));\n\n if (!response.partyId) {\n throw new CantonProtocolError('allocateExternalParty response missing partyId');\n }\n\n return response.partyId;\n }\n\n /**\n * Grant canActAs right for a party to the current service user.\n * Idempotent — safe to call even if the right is already granted.\n *\n * POST /v2/users/{userId}/rights\n */\n async grantCanActAs(partyId: string): Promise<void> {\n await this.#invoke(() =>\n this.#api.postV2UsersUserIdRights({\n userId: this.#userId,\n grantUserRightsRequest: {\n userId: this.#userId,\n rights: [{ kind: { canActAs: { value: { party: partyId } } } }],\n identityProviderId: '',\n },\n }),\n );\n }\n\n /**\n * Get the package ID for a package by name.\n *\n * @param packageName - The package name (e.g., \"layerzero-oft\")\n * @param parties - Parties whose vetting state should be considered\n * @param opts.synchronizerId - Synchronizer to query (auto-detected if omitted)\n * @returns The package ID (hash)\n */\n async getPackageId(\n packageName: string,\n parties: string[],\n opts: { synchronizerId?: string } = {},\n ): Promise<string> {\n const synchronizerId = opts.synchronizerId ?? (await this.#ensureSynchronizerId());\n\n const request: PostV2InteractiveSubmissionPreferredPackagesRequest = {\n getPreferredPackagesRequest: {\n packageVettingRequirements: [\n {\n packageName,\n parties,\n },\n ],\n synchronizerId,\n },\n };\n\n const response = await this.#invoke(() =>\n this.#api.postV2InteractiveSubmissionPreferredPackages(request),\n );\n\n const packageRef = response.packageReferences?.find(\n (ref) => ref.packageName === packageName,\n );\n if (!packageRef?.packageId) {\n throw new CantonProtocolError(\n `Package \"${packageName}\" not found or not vetted for parties`,\n );\n }\n\n return packageRef.packageId;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Command Submission\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Submit a batch of commands atomically.\n *\n * @returns commandId and completionOffset for use with waitForCommand()\n */\n async submit(\n actors: SubmitActors,\n commands: Command[],\n opts: { disclosedContracts?: DisclosedContract[]; commandId?: string } = {},\n ): Promise<SubmitResult> {\n const synchronizerId = await this.#ensureSynchronizerId();\n const commandId = opts.commandId ?? randomUUID();\n\n // Snapshot ledger end before submission so waitForCommand knows where to start polling\n const completionOffset = await this.getLedgerEndOffset();\n\n const request: PostV2CommandsAsyncSubmitRequest = {\n jsCommands: {\n commandId,\n actAs: actors.actAs,\n readAs: actors.readAs ?? actors.actAs,\n userId: this.#userId,\n synchronizerId,\n commands,\n disclosedContracts: opts.disclosedContracts,\n },\n };\n\n await this.#invoke(() => this.#api.postV2CommandsAsyncSubmit(request));\n\n return { commandId, completionOffset };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Completion Waiting / Reconciliation\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Wait for a command to be accepted or rejected.\n *\n * Uses bounded exponential backoff to avoid hammering the participant.\n */\n async waitForCommand(commandId: string, opts: WaitOptions): Promise<WaitResult> {\n const { parties, timeoutMs = 30_000, poll = {} } = opts;\n\n const limit = poll.limit ?? 50;\n const streamIdleTimeoutMs = poll.streamIdleTimeoutMs ?? 1000;\n const initialBackoffMs = poll.backoffMs?.initial ?? 100;\n const maxBackoffMs = poll.backoffMs?.max ?? 5000;\n\n let beginExclusive = opts.beginExclusive ?? 0;\n let currentBackoff = initialBackoffMs;\n const deadline = Date.now() + timeoutMs;\n\n // Poll the completions stream until we find our commandId or timeout\n while (Date.now() < deadline) {\n const request: PostV2CommandsCompletionsRequest = {\n completionStreamRequest: {\n beginExclusive,\n parties,\n userId: this.#userId,\n },\n limit,\n streamIdleTimeoutMs,\n };\n\n const rawResponse = await this.#invoke(() =>\n this.#api.postV2CommandsCompletionsRaw(request),\n );\n const responseText = await rawResponse.raw.text();\n const completions = JSON.parse(responseText) as unknown[];\n\n // Scan each completion for our commandId\n for (const item of completions) {\n const normalized = item as Record<string, unknown>;\n const completionResponse = this.#getField<Record<string, unknown>>(\n normalized,\n 'completionResponse',\n );\n if (!completionResponse) continue;\n\n // Handle offsetCheckpoint responses (no commandId)\n const offsetCheckpoint = this.#getField<Record<string, unknown>>(\n completionResponse,\n 'offsetCheckpoint',\n );\n if (offsetCheckpoint) {\n const checkpoint =\n this.#getField<Record<string, unknown>>(offsetCheckpoint, 'value') ??\n offsetCheckpoint;\n const checkpointOffset = this.#getField<number>(checkpoint, 'offset');\n if (checkpointOffset !== undefined) {\n beginExclusive = Math.max(beginExclusive, checkpointOffset);\n }\n continue;\n }\n\n // Navigate: completionResponse.completion.value\n const completionWrapper = this.#getField<Record<string, unknown>>(\n completionResponse,\n 'completion',\n );\n const completion =\n this.#getField<Record<string, unknown>>(completionWrapper, 'value') ??\n completionWrapper;\n if (!completion) continue;\n\n const offset = this.#getField<number>(completion, 'offset');\n const completionCommandId = this.#getField<string>(completion, 'commandId');\n\n // Found our command — check gRPC status to determine accept/reject\n if (completionCommandId === commandId) {\n const status = this.#getField<{\n code?: number;\n message?: string;\n details?: unknown;\n }>(completion, 'status');\n\n // code === 0 or status undefined means success (gRPC OK)\n if (!status || status.code === 0) {\n return {\n status: 'accepted',\n commandId,\n updateId: this.#getField<string>(completion, 'updateId') ?? '',\n offset: offset ?? 0,\n };\n } else {\n return {\n status: 'rejected',\n commandId,\n offset: offset ?? 0,\n error: {\n code: status.code,\n message: status.message ?? 'Unknown rejection',\n details: status.details,\n },\n };\n }\n }\n\n // Not our command — advance offset cursor past it\n if (offset !== undefined) {\n beginExclusive = Math.max(beginExclusive, offset);\n }\n }\n\n // Bounded exponential backoff\n const remainingTime = deadline - Date.now();\n const sleepTime = Math.min(currentBackoff, remainingTime, maxBackoffMs);\n if (sleepTime > 0) {\n await new Promise((resolve) => setTimeout(resolve, sleepTime));\n }\n currentBackoff = Math.min(currentBackoff * 2, maxBackoffMs);\n }\n\n return { status: 'timeout', commandId, lastCheckedOffset: beginExclusive };\n }\n\n async #assertCommandSource(expiry: PreparedTransactionWithExpiry['expiry']): Promise<void> {\n if (\n !expiry.userId ||\n expiry.userId !== this.#userId ||\n !expiry.participantId ||\n expiry.participantId !== (await this.getLocalParticipantId())\n ) {\n throw new CantonProtocolError(\n 'Command source differs from the preparing participant or user',\n );\n }\n }\n\n async waitForCommandWithExpiry(\n commandId: string,\n opts: Omit<WaitOptions, 'beginExclusive'> & {\n expiry: PreparedTransactionWithExpiry['expiry'];\n },\n ): Promise<WaitWithExpiryResult> {\n const { expiry, parties, timeoutMs = 30_000, poll = {} } = opts;\n await this.#assertCommandSource(expiry);\n let beginExclusive = expiry.completionOffset;\n const maxRecordTime = Date.parse(expiry.maxRecordTime);\n if (\n !Number.isSafeInteger(beginExclusive) ||\n beginExclusive < 0 ||\n !Number.isFinite(maxRecordTime) ||\n !expiry.synchronizerId\n ) {\n throw new CantonProtocolError('Invalid command expiry metadata');\n }\n const deadline = Date.now() + timeoutMs;\n let backoffMs = poll.backoffMs?.initial ?? 100;\n let rejection: WaitRejected | undefined;\n while (Date.now() < deadline) {\n const previousOffset = beginExclusive;\n const response = await this.#invoke(() =>\n this.#api.postV2CommandsCompletionsRaw({\n completionStreamRequest: { beginExclusive, parties, userId: this.#userId },\n limit: poll.limit ?? 50,\n streamIdleTimeoutMs: poll.streamIdleTimeoutMs ?? 1000,\n }),\n );\n const entries = (await response.raw.json()) as Record<string, unknown>[];\n let expired = false;\n for (const entry of entries) {\n const item = this.#getField<Record<string, unknown>>(entry, 'completionResponse');\n const checkpointWrapper = this.#getField<Record<string, unknown>>(\n item,\n 'offsetCheckpoint',\n );\n const checkpoint =\n this.#getField<Record<string, unknown>>(checkpointWrapper, 'value') ??\n checkpointWrapper;\n const completionWrapper = this.#getField<Record<string, unknown>>(\n item,\n 'completion',\n );\n const completion =\n this.#getField<Record<string, unknown>>(completionWrapper, 'value') ??\n completionWrapper;\n if (!checkpoint && !completion) {\n if (this.#getField<unknown>(item, 'empty') !== undefined) continue;\n throw new CantonProtocolError('Unrecognized command completion response');\n }\n const offset = this.#getField<number>(checkpoint ?? completion, 'offset');\n if (!Number.isSafeInteger(offset) || offset! < 0) {\n throw new CantonProtocolError('Invalid command completion offset');\n }\n if (checkpoint) {\n const times = this.#getField<\n Array<{ synchronizerId: string; recordTime: string }>\n >(checkpoint, 'synchronizerTimes');\n expired ||=\n offset! >= beginExclusive &&\n !!times?.some(\n (time) =>\n time.synchronizerId === expiry.synchronizerId &&\n Date.parse(time.recordTime) > maxRecordTime,\n );\n } else if (this.#getField<string>(completion, 'commandId') === commandId) {\n const status = this.#getField<{\n code?: number;\n message?: string;\n details?: unknown;\n }>(completion, 'status');\n if (\n status &&\n (!Number.isInteger(status.code) || status.code! < 0 || status.code! > 16)\n ) {\n throw new CantonProtocolError('Invalid command completion status');\n }\n if (!status || status.code === 0) {\n const updateId = this.#getField<string>(completion, 'updateId');\n if (!updateId)\n throw new CantonProtocolError('Accepted command is missing updateId');\n return { status: 'accepted', commandId, updateId, offset: offset! };\n }\n rejection = {\n status: 'rejected',\n commandId,\n offset: offset!,\n error: {\n code: status.code,\n message: status.message ?? 'Unknown rejection',\n details: status.details,\n },\n };\n }\n beginExclusive = Math.max(beginExclusive, offset!);\n }\n // A rejection can belong to a resubmission; only the checkpoint rules out later acceptance.\n if (expired) return rejection ?? { status: 'expired', commandId };\n if (beginExclusive > previousOffset) {\n backoffMs = poll.backoffMs?.initial ?? 100;\n continue;\n }\n const delay = Math.min(backoffMs, poll.backoffMs?.max ?? 5000, deadline - Date.now());\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));\n backoffMs = Math.min(backoffMs * 2, poll.backoffMs?.max ?? 5000);\n }\n return { status: 'timeout', commandId, lastCheckedOffset: beginExclusive };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disclosed Contracts\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch active contract's created event by ID.\n * Returns undefined if contract doesn't exist or is archived.\n */\n async #fetchActiveContractEvent(\n contractId: ContractId<unknown>,\n parties: string[],\n includeCreatedEventBlob: boolean,\n interfaceIds?: string[],\n ): Promise<CreatedEvent | undefined> {\n const request: PostV2EventsEventsByContractIdRequest = {\n getEventsByContractIdRequest: {\n contractId,\n eventFormat: {\n filtersByParty: interfaceIds?.length\n ? Object.fromEntries(\n parties.map((party) => [\n party,\n {\n cumulative: this.#buildInterfaceCumulativeFilters(\n interfaceIds,\n includeCreatedEventBlob,\n ),\n },\n ]),\n )\n : this.#buildPartyFilters(parties, includeCreatedEventBlob),\n verbose: false,\n },\n },\n };\n\n const response = await this.#invoke(() =>\n this.#api.postV2EventsEventsByContractId(request),\n );\n\n // If archived, contract is not active\n if (response.archived) return undefined;\n\n return response.created?.createdEvent;\n }\n\n /**\n * Build a disclosure for a contract.\n *\n * @param contractId - The contract ID to create disclosure for\n * @param parties - Parties that have visibility to the contract\n * @returns DisclosedContract if visible, undefined if not found\n * @throws CantonProtocolError if contract visible but blob missing (server/config mismatch)\n */\n async createDisclosure(\n contractId: ContractId<unknown>,\n parties: string[],\n ): Promise<CantonDisclosedContract | undefined> {\n const synchronizerId = await this.#ensureSynchronizerId();\n const created = await this.#fetchActiveContractEvent(contractId, parties, true);\n\n if (!created) return undefined;\n\n const validated = this.#validateDisclosureEvent(created, contractId);\n return {\n ...validated,\n synchronizerId,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Internal: Active Contract Queries (used by CantonSdk)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch a single contract by ID.\n *\n * @param contractId The contract ID to fetch\n * @param parties Parties to use for filtering (required for non-admin tokens)\n */\n async fetchContractById(\n contractId: ContractId<unknown>,\n parties: string[],\n opts?: { interfaceIds?: string[] },\n ): Promise<CreatedEvent | undefined> {\n return this.#fetchActiveContractEvent(contractId, parties, false, opts?.interfaceIds);\n }\n\n /**\n * Fetch both the created and archived events for a contract by ID.\n * Unlike fetchContractById, this preserves archival information.\n */\n async fetchEventsByContractId(\n contractId: string,\n parties: string[],\n ): Promise<{ created: CreatedEvent | undefined; archived: ArchivedEvent | undefined }> {\n const request: PostV2EventsEventsByContractIdRequest = {\n getEventsByContractIdRequest: {\n contractId,\n eventFormat: {\n filtersByParty: this.#buildPartyFilters(parties, false),\n verbose: false,\n },\n },\n };\n\n const response = await this.#invoke(() =>\n this.#api.postV2EventsEventsByContractId(request),\n );\n\n return {\n created: response.created?.createdEvent,\n archived: response.archived?.archivedEvent,\n };\n }\n\n /**\n * Fetch an update (transaction) by its ID.\n * @param updateId The update ID from a completion\n * @param parties Parties to use for the query filter\n * @returns The full update response\n */\n async fetchTransactionByUpdateId(\n updateId: string,\n parties: string[],\n ): Promise<CantonTransaction> {\n const response = await this.#invoke(() =>\n this.#api.postV2UpdatesUpdateByIdRaw({\n getUpdateByIdRequest: {\n updateId,\n updateFormat: this.#buildUpdateFormat(parties),\n },\n }),\n );\n\n const updateResponse: CantonUpdateResponse = await response.raw.json();\n return this.#parseTransactionFromUpdate(\n updateResponse,\n `Update ${updateId} is not a transaction`,\n );\n }\n\n /**\n * Fetch a transaction by its offset.\n * @param offset - The ledger offset\n * @param parties - Parties to use for the query filter\n * @returns The full transaction including recordTime\n */\n async fetchTransactionByOffset(offset: number, parties: string[]): Promise<CantonTransaction> {\n const response = await this.#invoke(() =>\n this.#api.postV2UpdatesUpdateByOffsetRaw({\n getUpdateByOffsetRequest: {\n offset,\n updateFormat: this.#buildUpdateFormat(parties),\n },\n }),\n );\n\n const updateResponse: CantonUpdateResponse = await response.raw.json();\n return this.#parseTransactionFromUpdate(\n updateResponse,\n `Update at offset ${offset} is not a transaction`,\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // External Party / Interactive Submission\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Prepare commands for external party signing.\n *\n * Returns a typed PreparedTransaction that preserves the contract type\n * through the signing flow. After signing, use submitSigned() to submit.\n *\n * @typeparam T The contract payload type (phantom type for type safety)\n *\n * @example\n * ```ts\n * const prepared = await client.prepareForSigning<Oft>({ actAs: [party] }, [cmd]);\n * const signature = await sign(prepared.preparedTransactionHash);\n * await client.submitSigned(prepared, [signature]);\n * ```\n */\n prepareForSigning(\n actors: SubmitActors,\n commands: Command[],\n opts: {\n disclosedContracts?: DisclosedContract[];\n commandId?: string;\n maxRecordTime: string;\n },\n ): Promise<PreparedTransactionWithExpiry>;\n prepareForSigning(\n actors: SubmitActors,\n commands: Command[],\n opts?: {\n disclosedContracts?: DisclosedContract[];\n commandId?: string;\n maxRecordTime?: undefined;\n },\n ): Promise<PreparedTransaction>;\n async prepareForSigning(\n actors: SubmitActors,\n commands: Command[],\n opts: {\n disclosedContracts?: DisclosedContract[];\n commandId?: string;\n maxRecordTime?: string;\n } = {},\n ): Promise<PreparedTransaction | PreparedTransactionWithExpiry> {\n const synchronizerId = await this.#ensureSynchronizerId();\n const commandId = opts.commandId ?? randomUUID();\n\n let expiry: PreparedTransactionWithExpiry['expiry'] | undefined;\n if (opts.maxRecordTime !== undefined) {\n const [participantId, completionOffset] = await Promise.all([\n this.getLocalParticipantId(),\n this.getLedgerEndOffset(),\n ]);\n expiry = {\n maxRecordTime: opts.maxRecordTime,\n synchronizerId,\n participantId,\n userId: this.#userId,\n completionOffset,\n };\n }\n\n const request: PostV2InteractiveSubmissionPrepareRequest = {\n jsPrepareSubmissionRequest: {\n userId: this.#userId,\n commandId,\n commands,\n actAs: actors.actAs,\n readAs: actors.readAs ?? actors.actAs,\n disclosedContracts: opts.disclosedContracts,\n synchronizerId,\n verboseHashing: false,\n ...(expiry\n ? {\n maxRecordTime: expiry.maxRecordTime,\n hashingSchemeVersion: 'HASHING_SCHEME_VERSION_V3' as const,\n }\n : {}),\n packageIdSelectionPreference: [],\n },\n };\n\n const response = await this.#invoke(() =>\n this.#api.postV2InteractiveSubmissionPrepare(request),\n );\n const validated = this.#validatePrepareResponse(response);\n\n if (expiry) {\n const metadata = PreparedTransactionProto.fromBinary(\n Buffer.from(validated.preparedTransaction, 'base64'),\n ).metadata;\n const deadline = Date.parse(expiry.maxRecordTime);\n if (\n !Number.isFinite(deadline) ||\n validated.hashingSchemeVersion !== 'HASHING_SCHEME_VERSION_V3' ||\n metadata?.maxRecordTime !== BigInt(deadline) * 1000n\n ) {\n throw new CantonProtocolError(\n 'Prepared transaction does not contain the requested signed maxRecordTime',\n );\n }\n return {\n ...validated,\n hashingSchemeVersion: 'HASHING_SCHEME_VERSION_V3',\n commandId,\n expiry,\n };\n }\n\n return {\n ...validated,\n hashingSchemeVersion:\n validated.hashingSchemeVersion as PreparedTransaction['hashingSchemeVersion'],\n commandId,\n };\n }\n\n /**\n * Submit a pre-signed transaction.\n *\n * The generic type T flows from prepareForSigning() for type documentation.\n */\n async submitSigned(\n prepared: PreparedTransaction | PreparedTransactionWithExpiry,\n signatures: ExternalSignature[],\n ): Promise<SubmitResult> {\n const expiry = 'expiry' in prepared ? prepared.expiry : undefined;\n if (expiry) await this.#assertCommandSource(expiry);\n const completionOffset = expiry?.completionOffset ?? (await this.getLedgerEndOffset());\n if (expiry && Date.now() >= Date.parse(expiry.maxRecordTime)) {\n return { commandId: prepared.commandId, completionOffset };\n }\n\n const request: PostV2InteractiveSubmissionExecuteRequest = {\n jsExecuteSubmissionRequest: {\n preparedTransaction: prepared.preparedTransaction,\n // Map each ExternalSignature into the Canton per-party signature format\n partySignatures: {\n signatures: signatures.map((sig) => ({\n party: sig.party,\n signatures: [\n {\n format: sig.format,\n signature: sig.signature,\n signedBy: sig.signedBy,\n signingAlgorithmSpec: sig.signingAlgorithmSpec,\n },\n ],\n })),\n },\n deduplicationPeriod: {\n deduplicationDuration: {\n value: { seconds: 3600, nanos: 0 }, // 1 hour default\n },\n },\n submissionId: randomUUID(),\n userId: this.#userId,\n hashingSchemeVersion: prepared.hashingSchemeVersion,\n },\n };\n\n await this.#invoke(() => this.#api.postV2InteractiveSubmissionExecute(request));\n\n return { commandId: prepared.commandId, completionOffset };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Active Contracts Query\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the current ledger end offset.\n */\n async getLedgerEndOffset(): Promise<number> {\n const response = await this.#invoke(() => this.#api.getV2StateLedgerEnd());\n return response.offset ?? 0;\n }\n\n /**\n * Query active contracts at a given offset with optional template filtering.\n *\n * @param party - Party to query as\n * @param offset - Ledger offset for the snapshot\n * @param opts.templateIds - Optional template IDs to filter by\n * @param opts.limit - Maximum number of contracts to return\n * @param opts.includeCreatedEventBlob - Include CIP disclosure blobs (default false)\n */\n async queryActiveContracts(\n party: string,\n offset: number,\n opts?: { templateIds?: string[]; limit?: number; includeCreatedEventBlob?: boolean },\n ): Promise<JsActiveContract[]> {\n return this.queryActiveContractsByParties([party], offset, opts?.templateIds ?? [], {\n limit: opts?.limit,\n includeCreatedEventBlob: opts?.includeCreatedEventBlob,\n });\n }\n\n /**\n * Query active contracts visible to any of the given parties.\n *\n * Single API call with all parties in filtersByParty.\n *\n * @param parties - Parties to query as (for visibility)\n * @param offset - Ledger offset for the snapshot\n * @param templateIds - Template IDs to filter by\n * @param opts.limit - Maximum number of contracts to return\n * @param opts.includeCreatedEventBlob - Include CIP disclosure blobs (default false)\n */\n async queryActiveContractsByParties(\n parties: string[],\n offset: number,\n templateIds: string[],\n opts?: { limit?: number; includeCreatedEventBlob?: boolean },\n ): Promise<JsActiveContract[]> {\n return this.#fetchActiveContracts(\n parties,\n offset,\n this.#buildCumulativeFilters(templateIds, opts?.includeCreatedEventBlob),\n opts,\n );\n }\n\n /**\n * Query active contracts visible to any of the given parties that implement\n * the given interfaces.\n *\n * @param parties - Parties to query as (for visibility)\n * @param offset - Ledger offset for the snapshot\n * @param interfaceIds - Interface IDs to filter by (e.g. \"#package:Module:Interface\")\n * @param opts.limit - Maximum number of contracts to return\n */\n async queryActiveContractsByInterface(\n parties: string[],\n offset: number,\n interfaceIds: string[],\n opts?: { limit?: number; includeCreatedEventBlob?: boolean },\n ): Promise<JsActiveContract[]> {\n return this.#fetchActiveContracts(\n parties,\n offset,\n this.#buildInterfaceCumulativeFilters(interfaceIds, opts?.includeCreatedEventBlob),\n opts,\n );\n }\n\n async #fetchActiveContracts(\n parties: string[],\n offset: number,\n cumulativeFilter: CumulativeFilter[],\n opts?: { limit?: number },\n ): Promise<JsActiveContract[]> {\n const filtersByParty = Object.fromEntries(\n parties.map((party) => [party, { cumulative: cumulativeFilter }]),\n );\n\n // `eventFormat` replaces the legacy `filter` + `verbose: true` fields, which Canton 3.6\n // rejects by default (DEPRECATED_API_DISABLED) and 3.7 removes.\n const rawResponse = await this.#invoke(() =>\n this.#api.postV2StateActiveContractsRaw({\n getActiveContractsRequest: {\n eventFormat: { filtersByParty, verbose: false },\n activeAtOffset: offset,\n },\n limit: opts?.limit,\n }),\n );\n\n // Raw response is an array of streamed entries; extract and deserialize contracts\n type RawActiveContractsResponse = Array<{\n contractEntry?: { JsActiveContract?: Record<string, unknown> };\n }>;\n const rawJson: RawActiveContractsResponse = await rawResponse.raw.json();\n\n return rawJson\n .map((item) => item.contractEntry?.JsActiveContract)\n .filter((contract): contract is Record<string, unknown> => contract != null)\n .map((contract) => JsActiveContractFromJSON(contract));\n }\n\n /**\n * Stream transactions from a given offset.\n *\n * Uses `updateFormat` with `TRANSACTION_SHAPE_LEDGER_EFFECTS` so consumers\n * receive `ExercisedEvent`s (e.g. the request-poller depends on\n * `Request_Create` exercise results). The deprecated legacy `filter`\n * shape would default to `ACS_DELTA`, which only emits Created/Archived\n * events and silently drops every exercise on the wire.\n *\n * @param party - Party to query as\n * @param beginExclusive - Start offset (exclusive)\n * @param endInclusive - End offset (inclusive)\n * @param opts.templateIds - Optional template IDs to filter by\n * @param opts.limit - Maximum number of transactions to return\n */\n async getUpdates(\n party: string,\n beginExclusive: number,\n endInclusive: number,\n opts?: { templateIds?: string[]; limit?: number },\n ): Promise<CantonUpdate[]> {\n const eventFormat = {\n filtersByParty: {\n [party]: { cumulative: this.#buildCumulativeFilters(opts?.templateIds) },\n },\n verbose: false,\n };\n const rawResponse = await this.#invoke(() =>\n this.#api.postV2UpdatesRaw({\n getUpdatesRequest: {\n beginExclusive,\n endInclusive,\n updateFormat: {\n includeTransactions: {\n eventFormat,\n transactionShape: 'TRANSACTION_SHAPE_LEDGER_EFFECTS' as const,\n },\n },\n },\n limit: opts?.limit,\n }),\n );\n\n const updateResponses: CantonUpdateResponse[] = await rawResponse.raw.json();\n\n return updateResponses.map((response) => response.update);\n }\n\n /**\n * Build cumulative filters for party-based queries.\n * If templateIds provided, filters by those templates; otherwise uses wildcard.\n */\n #buildCumulativeFilters(\n templateIds?: string[],\n includeCreatedEventBlob = false,\n ): CumulativeFilter[] {\n if (templateIds?.length) {\n return templateIds.map((templateId) => ({\n identifierFilter: {\n templateFilter: { value: { templateId, includeCreatedEventBlob } },\n },\n }));\n }\n return [\n {\n identifierFilter: {\n wildcardFilter: { value: { includeCreatedEventBlob } },\n },\n },\n ];\n }\n\n /**\n * Build cumulative filters for interface-based ACS queries.\n * If interfaceIds provided, filters by those interfaces; otherwise uses wildcard.\n */\n #buildInterfaceCumulativeFilters(\n interfaceIds?: string[],\n includeCreatedEventBlob = false,\n ): CumulativeFilter[] {\n if (interfaceIds?.length) {\n return interfaceIds.map((interfaceId) => ({\n identifierFilter: {\n interfaceFilter: {\n value: {\n interfaceId,\n includeInterfaceView: true,\n includeCreatedEventBlob,\n },\n },\n },\n }));\n }\n return [\n {\n identifierFilter: {\n wildcardFilter: { value: { includeCreatedEventBlob } },\n },\n },\n ];\n }\n\n /**\n * Build the standard update format for fetching transactions.\n */\n #buildUpdateFormat(parties: string[]) {\n return {\n includeTransactions: {\n eventFormat: {\n filtersByParty: this.#buildPartyFilters(parties, false),\n verbose: false,\n },\n transactionShape: 'TRANSACTION_SHAPE_LEDGER_EFFECTS' as const,\n },\n };\n }\n\n /**\n * Parse an update response and extract the transaction.\n * The response structure is: { update: { Transaction: { value: CantonTransaction } } }\n */\n #parseTransactionFromUpdate(\n json: CantonUpdateResponse,\n notFoundMessage: string,\n ): CantonTransaction {\n // Update can be a Transaction, Reassignment, TopologyTransaction, or OffsetCheckpoint\n if (!('Transaction' in json.update)) {\n throw new CantonProtocolError(notFoundMessage);\n }\n\n return json.update.Transaction.value;\n }\n}\n"]}
@@ -383,5 +383,5 @@ var CantonSdk = class _CantonSdk {
383
383
  };
384
384
 
385
385
  export { CantonSdk };
386
- //# sourceMappingURL=XUXLV3PL.js.map
387
- //# sourceMappingURL=XUXLV3PL.js.map
386
+ //# sourceMappingURL=SAHSVYH6.js.map
387
+ //# sourceMappingURL=SAHSVYH6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sdk/canton-sdk.ts"],"names":["CantonSdk","client","event","contractId","undefined","templateId","CantonProtocolError","createArgument","payload","buildCreate","template","packageId","parts","replace","split","createCommand","join","createArguments","encode","buildExercise","choice","args","encodedArgs","argumentEncode","exerciseCommand","choiceName","choiceArgument","submit","actors","commands","opts","prepareForSigning","submitSigned","prepared","signatures","waitForCommand","commandId","get","parties","fetchContractById","fetchContractEvent","fetchTransaction","updateId","fetchTransactionByUpdateId","fetchTransactionByOffset","offset","fetchEventsByContractId","createDisclosure","getDsoParty","getAmuletTransferFactoryContext","connectedSynchronizers","uploadDar","dar","validateDar","listParties","listUserParties","allocateParty","partyIdHint","getPackageId","packageName","getLedgerEndOffset","queryActiveContracts","party","normalizeActiveContract","contract","e","createdEvent","synchronizerId","queryActiveContractsByParties","templateIds","queryActiveContractsByInterface","interfaceIds","queryActiveContractsForParties","templateFilter","apiOpts","perPartyResults","Promise","all","map","partyId","seen","Set","result","contracts","c","cid","has","add","normalized","push"],"mappings":"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","file":"XUXLV3PL.js","sourcesContent":["import type { Choice, ContractId, Party, Template } from '@daml/types';\n\nimport type { AmuletTransferFactoryArgs } from '../client/amulet';\nimport type { CantonTransaction, ICantonClient } from '../client/index';\nimport { CantonProtocolError } from '../errors';\nimport type {\n ArchivedEvent,\n Command,\n CreatedEvent,\n DisclosedContract,\n JsActiveContract,\n} from '../open-api/models';\nimport type { TransferFactoryContext } from '../refresh/registry-context';\nimport type { CantonDisclosedContract } from '../transaction';\nimport type {\n Contract,\n ExternalSignature,\n NormalizedActiveContract,\n PreparedTransaction,\n SubmitActors,\n SubmitResult,\n WaitOptions,\n WaitResult,\n} from '../types';\n\n/**\n * High-level SDK for Canton/DAML contract operations.\n *\n * Users interact with this SDK, not CantonClient directly.\n *\n * @example\n * ```ts\n * import { CantonClient, CantonSdk } from '@layerzerolabs/common-canton';\n *\n * const client = new CantonClient(config, userId);\n * const sdk = new CantonSdk(client);\n *\n * await sdk.submit({ actAs: [party] }, [cmd]);\n * ```\n */\nexport class CantonSdk {\n readonly #client: ICantonClient;\n\n constructor(client: ICantonClient) {\n this.#client = client;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Private Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Validate and extract contract fields from a CreatedEvent.\n * Returns undefined if event is undefined (contract not found).\n */\n #validateContractEvent<T extends object>(\n event: { templateId?: string; contractId?: string; createArgument?: unknown } | undefined,\n contractId: ContractId<T>,\n ): Contract<T> | undefined {\n if (!event) return undefined;\n\n if (!event.templateId) {\n throw new CantonProtocolError('Contract response missing templateId', {\n contractId,\n });\n }\n if (!event.contractId) {\n throw new CantonProtocolError('Contract response missing contractId', {\n contractId,\n });\n }\n if (event.createArgument === undefined) {\n throw new CantonProtocolError('Contract response missing createArgument', {\n contractId,\n });\n }\n return {\n templateId: event.templateId,\n contractId: event.contractId as ContractId<T>,\n payload: event.createArgument as T,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Command Builders\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Build a create command using a generated DAML template.\n *\n * @param template The generated DAML template (e.g., StateCommitment)\n * @param payload The contract payload\n * @param packageId The package ID from the generated package's index.js\n */\n buildCreate<T extends object, K, I extends string>(\n template: Template<T, K, I>,\n payload: T,\n packageId: string,\n ): Command {\n // Generated templateId format: '#packageName:Module:Entity'\n // Canton API needs: 'packageId:Module:Entity'\n const parts = template.templateId.replace(/^#/, '').split(':');\n parts[0] = packageId;\n\n return {\n createCommand: {\n templateId: parts.join(':'),\n createArguments: template.encode(payload),\n },\n };\n }\n\n /**\n * Build an exercise command using a generated DAML choice.\n *\n * @param choice The generated DAML choice (e.g., StateCommitment.Archive)\n * @param contractId The contract ID to exercise on\n * @param args The choice arguments\n * @param packageId The package ID from the generated package's index.js\n */\n buildExercise<T extends object, C, R, K>(\n choice: Choice<T, C, R, K>,\n contractId: ContractId<T>,\n args: C,\n packageId: string,\n ): Command {\n // Generated templateId format: '#packageName:Module:Entity'\n // Canton API needs: 'packageId:Module:Entity'\n const parts = choice.template().templateId.replace(/^#/, '').split(':');\n parts[0] = packageId;\n\n const encodedArgs = choice.argumentEncode(args);\n\n return {\n exerciseCommand: {\n templateId: parts.join(':'),\n contractId,\n choice: choice.choiceName,\n choiceArgument: encodedArgs,\n },\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Submission (networked)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Submit commands to the ledger.\n */\n submit(\n actors: SubmitActors,\n commands: Command[],\n opts?: { disclosedContracts?: DisclosedContract[]; commandId?: string },\n ): Promise<SubmitResult> {\n return this.#client.submit(actors, commands, opts);\n }\n\n /**\n * Prepare commands for off-chain signing by external parties.\n */\n prepareForSigning(\n actors: SubmitActors,\n commands: Command[],\n opts?: { disclosedContracts?: DisclosedContract[]; commandId?: string },\n ): Promise<PreparedTransaction> {\n return this.#client.prepareForSigning(actors, commands, opts);\n }\n\n /**\n * Submit a pre-signed transaction (external party flow).\n */\n submitSigned(\n prepared: PreparedTransaction,\n signatures: ExternalSignature[],\n ): Promise<SubmitResult> {\n return this.#client.submitSigned(prepared, signatures);\n }\n\n /**\n * Wait for a command to be accepted or rejected.\n */\n waitForCommand(commandId: string, opts: WaitOptions): Promise<WaitResult> {\n return this.#client.waitForCommand(commandId, opts);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Queries\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch a specific contract by ID.\n * Returns undefined if archived or not visible.\n *\n * @param contractId The contract ID to fetch\n * @param parties Parties to use for visibility filtering\n */\n async get<T extends object>(\n contractId: ContractId<T>,\n parties: Party[],\n ): Promise<Contract<T> | undefined> {\n const event = await this.#client.fetchContractById(contractId, parties);\n return this.#validateContractEvent(event, contractId);\n }\n\n /**\n * Fetch a live contract's created event by ID, with the views of `interfaceIds` when given:\n * one point lookup that returns the payload, the interface views and the signatories.\n */\n fetchContractEvent(\n contractId: string,\n parties: Party[],\n opts?: { interfaceIds?: string[] },\n ): Promise<CreatedEvent | undefined> {\n return this.#client.fetchContractById(contractId as ContractId<unknown>, parties, opts);\n }\n\n /**\n * Fetch an update (transaction) by its ID.\n *\n * Use this to get created contract IDs after a command is accepted.\n * The updateId comes from WaitResult.updateId.\n *\n * @param updateId The update ID from WaitResult\n * @param parties Parties to filter events\n * @returns Parsed update with events\n *\n * @example\n * ```ts\n * const waitResult = await sdk.waitForCommand(commandId, opts);\n * if (waitResult.status === 'accepted') {\n * const tx = await sdk.fetchTransaction(waitResult.updateId, [party]);\n * const createdIds = (tx.events ?? [])\n * .filter(e => 'CreatedEvent' in e)\n * .map(e => e.CreatedEvent.contractId);\n * }\n * ```\n */\n fetchTransaction(updateId: string, parties: string[]): Promise<CantonTransaction> {\n return this.#client.fetchTransactionByUpdateId(updateId, parties);\n }\n\n /**\n * Fetch a transaction by its offset.\n *\n * @param offset The ledger offset\n * @param parties Parties to filter events\n * @returns Parsed transaction with events and timestamps\n */\n fetchTransactionByOffset(offset: number, parties: string[]): Promise<CantonTransaction> {\n return this.#client.fetchTransactionByOffset(offset, parties);\n }\n\n /**\n * Fetch both the created and archived events for a contract by ID.\n *\n * @param contractId - The contract ID to look up\n * @param parties - Parties to use for visibility filtering\n */\n fetchEventsByContractId(\n contractId: string,\n parties: string[],\n ): Promise<{ created: CreatedEvent | undefined; archived: ArchivedEvent | undefined }> {\n return this.#client.fetchEventsByContractId(contractId, parties);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disclosure\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a disclosure for a contract.\n *\n * Disclosures allow a party to share a contract's content with another party\n * who isn't a stakeholder, enabling them to exercise choices that reference it.\n *\n * @param contractId The contract to create disclosure for\n * @param parties Parties that have visibility to the contract\n * @returns The disclosed contract, or undefined if contract not found\n *\n * @example\n * ```ts\n * // Alice creates disclosure for Bob to use\n * const disclosure = await aliceSdk.createDisclosure(contractId, [aliceParty]);\n * if (disclosure) {\n * // Bob uses the disclosure in his submission\n * await bobSdk.submit(\n * { actAs: [bobParty] },\n * [command],\n * { disclosedContracts: [disclosure] }\n * );\n * }\n * ```\n */\n createDisclosure<T extends object>(\n contractId: ContractId<T>,\n parties: Party[],\n ): Promise<CantonDisclosedContract | undefined> {\n return this.#client.createDisclosure(contractId, parties);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Amulet wallet\n // ─────────────────────────────────────────────────────────────────────────\n\n /** DSO party from the validator wallet. Requires a client built with wallet config. */\n getDsoParty(): Promise<string> {\n return this.#client.getDsoParty();\n }\n\n /** Amulet CIP-56 transfer-factory context from the validator wallet's scan-proxy. */\n getAmuletTransferFactoryContext(\n args: AmuletTransferFactoryArgs,\n ): Promise<TransferFactoryContext> {\n return this.#client.getAmuletTransferFactoryContext(args);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Utilities\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get connected synchronizers.\n */\n connectedSynchronizers(): Promise<string[]> {\n return this.#client.connectedSynchronizers();\n }\n\n /**\n * Upload a DAR to the participant node.\n *\n * POST /v2/dars\n *\n * @param opts.skipIfVetted - If true, treat KNOWN_PACKAGE_VERSION errors as success\n */\n uploadDar(\n dar: Uint8Array<ArrayBuffer>,\n opts?: { vetAllPackages?: boolean; synchronizerId?: string; skipIfVetted?: boolean },\n ): Promise<object> {\n return this.#client.uploadDar(dar, opts);\n }\n\n /**\n * Validate a DAR for upgrade compatibility against the current vetting state.\n *\n * POST /v2/dars/validate\n */\n validateDar(dar: Uint8Array<ArrayBuffer>, opts?: { synchronizerId?: string }): Promise<void> {\n return this.#client.validateDar(dar, opts);\n }\n\n /**\n * List all known parties on the participant node.\n *\n * GET /v2/parties\n *\n * @param opts.pageSize - Maximum number of results per page\n * @param opts.pageToken - Pagination token from previous response\n * @returns Array of party IDs\n */\n listParties(opts?: {\n pageSize?: number;\n pageToken?: string;\n }): Promise<{ parties: string[]; nextPageToken?: string }> {\n return this.#client.listParties(opts);\n }\n\n /**\n * List the parties the configured user can act/read as.\n *\n * Narrower than {@link listParties} (all parties on the node): use this when a\n * call needs the caller's own read-scoped parties.\n */\n listUserParties(): Promise<string[]> {\n return this.#client.listUserParties();\n }\n\n /**\n * Allocate a new party on the participant node.\n *\n * POST /v2/parties\n *\n * @param partyIdHint - A hint for the party ID (e.g., \"alice\", \"bob\")\n * @param opts.userId - User who gets actAs rights (empty string = no user)\n * @param opts.synchronizerId - Synchronizer to allocate on (auto-detected if omitted)\n * @param opts.identityProviderId - Identity provider ID (empty string = default)\n * @returns The allocated party ID\n */\n allocateParty(\n partyIdHint: string,\n opts?: { userId?: string; synchronizerId?: string; identityProviderId?: string },\n ): Promise<string> {\n return this.#client.allocateParty(partyIdHint, opts);\n }\n\n /**\n * Get the package ID for a package by name.\n *\n * POST /v2/interactive-submission/preferred-packages\n *\n * @param packageName - The package name (e.g., \"layerzero-oft\")\n * @param parties - Parties whose vetting state should be considered\n * @param opts.synchronizerId - Synchronizer to query (auto-detected if omitted)\n * @returns The package ID (hash)\n */\n getPackageId(\n packageName: string,\n parties: string[],\n opts?: { synchronizerId?: string },\n ): Promise<string> {\n return this.#client.getPackageId(packageName, parties, opts);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Active Contracts Query\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the current ledger end offset.\n *\n * GET /v2/state/ledger-end\n *\n * @returns The current ledger end offset\n */\n getLedgerEndOffset(): Promise<number> {\n return this.#client.getLedgerEndOffset();\n }\n\n /**\n * Query active contracts at a given offset with optional template filtering.\n *\n * POST /v2/state/active-contracts\n *\n * @param party - Party to query as (for visibility)\n * @param offset - Ledger offset to query at\n * @param opts.templateIds - Template IDs to filter by (e.g., \"packageId:Module:Template\")\n * @param opts.limit - Maximum number of contracts to return\n * @returns Array of active contracts\n *\n * @example\n * ```ts\n * const offset = await sdk.getLedgerEndOffset();\n * const contracts = await sdk.queryActiveContracts(party, offset, {\n * templateIds: ['packageId:SimpleRequest:SimpleRequest'],\n * limit: 100,\n * });\n * for (const contract of contracts) {\n * console.log(contract.createdEvent.contractId, contract.createdEvent.templateId);\n * }\n * ```\n */\n queryActiveContracts(\n party: string,\n offset: number,\n opts?: { templateIds?: string[]; limit?: number; includeCreatedEventBlob?: boolean },\n ): Promise<JsActiveContract[]> {\n return this.#client.queryActiveContracts(party, offset, opts);\n }\n\n /**\n * Normalize a ledger API JsActiveContract to a flat shape (contractId, templateId, payload, synchronizerId).\n * Useful when you only need these fields and not createdEvent / reassignmentCounter.\n */\n static normalizeActiveContract(contract: JsActiveContract): NormalizedActiveContract {\n const e = contract.createdEvent;\n return {\n contractId: e.contractId,\n templateId: e.templateId,\n payload: e.createArgument,\n synchronizerId: contract.synchronizerId,\n };\n }\n\n /**\n * Query active contracts visible to any of the given parties (single API call).\n */\n queryActiveContractsByParties(\n parties: string[],\n offset: number,\n templateIds: string[],\n opts?: { limit?: number },\n ): Promise<JsActiveContract[]> {\n return this.#client.queryActiveContractsByParties(parties, offset, templateIds, opts);\n }\n\n /**\n * Query active contracts visible to any of the given parties that implement\n * the given interfaces (single API call).\n */\n queryActiveContractsByInterface(\n parties: string[],\n offset: number,\n interfaceIds: string[],\n opts?: { limit?: number; includeCreatedEventBlob?: boolean },\n ): Promise<JsActiveContract[]> {\n return this.#client.queryActiveContractsByInterface(parties, offset, interfaceIds, opts);\n }\n\n /**\n * Query active contracts visible to any of the given parties, deduplicated by contractId.\n * Returns normalized contracts (flat shape). Use when you need a merged view across multiple parties.\n *\n * @param parties - Party IDs to query as (contracts visible to any party are included, each contract once)\n * @param opts - Optional templateIds and limit (passed per-party to the ledger API); optional templateFilter (applied after fetch)\n */\n async queryActiveContractsForParties(\n parties: string[],\n opts?: {\n templateIds?: string[];\n limit?: number;\n /** If provided, only contracts whose templateId passes this predicate are returned. */\n templateFilter?: (templateId: string) => boolean;\n },\n ): Promise<NormalizedActiveContract[]> {\n const offset = await this.#client.getLedgerEndOffset();\n const { templateFilter, ...apiOpts } = opts ?? {};\n const perPartyResults = await Promise.all(\n parties.map((partyId) => this.#client.queryActiveContracts(partyId, offset, apiOpts)),\n );\n const seen = new Set<string>();\n const result: NormalizedActiveContract[] = [];\n for (const contracts of perPartyResults) {\n for (const c of contracts) {\n const cid = c.createdEvent.contractId;\n if (!seen.has(cid)) {\n seen.add(cid);\n const normalized = CantonSdk.normalizeActiveContract(c);\n if (!templateFilter || templateFilter(normalized.templateId)) {\n result.push(normalized);\n }\n }\n }\n }\n return result;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/sdk/canton-sdk.ts"],"names":["CantonSdk","client","event","contractId","undefined","templateId","CantonProtocolError","createArgument","payload","buildCreate","template","packageId","parts","replace","split","createCommand","join","createArguments","encode","buildExercise","choice","args","encodedArgs","argumentEncode","exerciseCommand","choiceName","choiceArgument","submit","actors","commands","opts","prepareForSigning","submitSigned","prepared","signatures","waitForCommand","commandId","get","parties","fetchContractById","fetchContractEvent","fetchTransaction","updateId","fetchTransactionByUpdateId","fetchTransactionByOffset","offset","fetchEventsByContractId","createDisclosure","getDsoParty","getAmuletTransferFactoryContext","connectedSynchronizers","uploadDar","dar","validateDar","listParties","listUserParties","allocateParty","partyIdHint","getPackageId","packageName","getLedgerEndOffset","queryActiveContracts","party","normalizeActiveContract","contract","e","createdEvent","synchronizerId","queryActiveContractsByParties","templateIds","queryActiveContractsByInterface","interfaceIds","queryActiveContractsForParties","templateFilter","apiOpts","perPartyResults","Promise","all","map","partyId","seen","Set","result","contracts","c","cid","has","add","normalized","push"],"mappings":"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","file":"SAHSVYH6.js","sourcesContent":["import type { Choice, ContractId, Party, Template } from '@daml/types';\n\nimport type { AmuletTransferFactoryArgs } from '../client/amulet';\nimport type { CantonTransaction, ICantonClient } from '../client/index';\nimport { CantonProtocolError } from '../errors';\nimport type {\n ArchivedEvent,\n Command,\n CreatedEvent,\n DisclosedContract,\n JsActiveContract,\n} from '../open-api/models';\nimport type { TransferFactoryContext } from '../refresh/registry-context';\nimport type { CantonDisclosedContract } from '../transaction';\nimport type {\n Contract,\n ExternalSignature,\n NormalizedActiveContract,\n PreparedTransaction,\n SubmitActors,\n SubmitResult,\n WaitOptions,\n WaitResult,\n} from '../types';\n\n/**\n * High-level SDK for Canton/DAML contract operations.\n *\n * Users interact with this SDK, not CantonClient directly.\n *\n * @example\n * ```ts\n * import { CantonClient, CantonSdk } from '@layerzerolabs/common-canton';\n *\n * const client = new CantonClient(config, userId);\n * const sdk = new CantonSdk(client);\n *\n * await sdk.submit({ actAs: [party] }, [cmd]);\n * ```\n */\nexport class CantonSdk {\n readonly #client: ICantonClient;\n\n constructor(client: ICantonClient) {\n this.#client = client;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Private Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Validate and extract contract fields from a CreatedEvent.\n * Returns undefined if event is undefined (contract not found).\n */\n #validateContractEvent<T extends object>(\n event: { templateId?: string; contractId?: string; createArgument?: unknown } | undefined,\n contractId: ContractId<T>,\n ): Contract<T> | undefined {\n if (!event) return undefined;\n\n if (!event.templateId) {\n throw new CantonProtocolError('Contract response missing templateId', {\n contractId,\n });\n }\n if (!event.contractId) {\n throw new CantonProtocolError('Contract response missing contractId', {\n contractId,\n });\n }\n if (event.createArgument === undefined) {\n throw new CantonProtocolError('Contract response missing createArgument', {\n contractId,\n });\n }\n return {\n templateId: event.templateId,\n contractId: event.contractId as ContractId<T>,\n payload: event.createArgument as T,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Command Builders\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Build a create command using a generated DAML template.\n *\n * @param template The generated DAML template (e.g., StateCommitment)\n * @param payload The contract payload\n * @param packageId The package ID from the generated package's index.js\n */\n buildCreate<T extends object, K, I extends string>(\n template: Template<T, K, I>,\n payload: T,\n packageId: string,\n ): Command {\n // Generated templateId format: '#packageName:Module:Entity'\n // Canton API needs: 'packageId:Module:Entity'\n const parts = template.templateId.replace(/^#/, '').split(':');\n parts[0] = packageId;\n\n return {\n createCommand: {\n templateId: parts.join(':'),\n createArguments: template.encode(payload),\n },\n };\n }\n\n /**\n * Build an exercise command using a generated DAML choice.\n *\n * @param choice The generated DAML choice (e.g., StateCommitment.Archive)\n * @param contractId The contract ID to exercise on\n * @param args The choice arguments\n * @param packageId The package ID from the generated package's index.js\n */\n buildExercise<T extends object, C, R, K>(\n choice: Choice<T, C, R, K>,\n contractId: ContractId<T>,\n args: C,\n packageId: string,\n ): Command {\n // Generated templateId format: '#packageName:Module:Entity'\n // Canton API needs: 'packageId:Module:Entity'\n const parts = choice.template().templateId.replace(/^#/, '').split(':');\n parts[0] = packageId;\n\n const encodedArgs = choice.argumentEncode(args);\n\n return {\n exerciseCommand: {\n templateId: parts.join(':'),\n contractId,\n choice: choice.choiceName,\n choiceArgument: encodedArgs,\n },\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Submission (networked)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Submit commands to the ledger.\n */\n submit(\n actors: SubmitActors,\n commands: Command[],\n opts?: { disclosedContracts?: DisclosedContract[]; commandId?: string },\n ): Promise<SubmitResult> {\n return this.#client.submit(actors, commands, opts);\n }\n\n /**\n * Prepare commands for off-chain signing by external parties.\n */\n prepareForSigning(\n actors: SubmitActors,\n commands: Command[],\n opts?: { disclosedContracts?: DisclosedContract[]; commandId?: string },\n ): Promise<PreparedTransaction> {\n return this.#client.prepareForSigning(actors, commands, opts);\n }\n\n /**\n * Submit a pre-signed transaction (external party flow).\n */\n submitSigned(\n prepared: PreparedTransaction,\n signatures: ExternalSignature[],\n ): Promise<SubmitResult> {\n return this.#client.submitSigned(prepared, signatures);\n }\n\n /**\n * Wait for a command to be accepted or rejected.\n */\n waitForCommand(commandId: string, opts: WaitOptions): Promise<WaitResult> {\n return this.#client.waitForCommand(commandId, opts);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Queries\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch a specific contract by ID.\n * Returns undefined if archived or not visible.\n *\n * @param contractId The contract ID to fetch\n * @param parties Parties to use for visibility filtering\n */\n async get<T extends object>(\n contractId: ContractId<T>,\n parties: Party[],\n ): Promise<Contract<T> | undefined> {\n const event = await this.#client.fetchContractById(contractId, parties);\n return this.#validateContractEvent(event, contractId);\n }\n\n /**\n * Fetch a live contract's created event by ID, with the views of `interfaceIds` when given:\n * one point lookup that returns the payload, the interface views and the signatories.\n */\n fetchContractEvent(\n contractId: string,\n parties: Party[],\n opts?: { interfaceIds?: string[] },\n ): Promise<CreatedEvent | undefined> {\n return this.#client.fetchContractById(contractId as ContractId<unknown>, parties, opts);\n }\n\n /**\n * Fetch an update (transaction) by its ID.\n *\n * Use this to get created contract IDs after a command is accepted.\n * The updateId comes from WaitResult.updateId.\n *\n * @param updateId The update ID from WaitResult\n * @param parties Parties to filter events\n * @returns Parsed update with events\n *\n * @example\n * ```ts\n * const waitResult = await sdk.waitForCommand(commandId, opts);\n * if (waitResult.status === 'accepted') {\n * const tx = await sdk.fetchTransaction(waitResult.updateId, [party]);\n * const createdIds = (tx.events ?? [])\n * .filter(e => 'CreatedEvent' in e)\n * .map(e => e.CreatedEvent.contractId);\n * }\n * ```\n */\n fetchTransaction(updateId: string, parties: string[]): Promise<CantonTransaction> {\n return this.#client.fetchTransactionByUpdateId(updateId, parties);\n }\n\n /**\n * Fetch a transaction by its offset.\n *\n * @param offset The ledger offset\n * @param parties Parties to filter events\n * @returns Parsed transaction with events and timestamps\n */\n fetchTransactionByOffset(offset: number, parties: string[]): Promise<CantonTransaction> {\n return this.#client.fetchTransactionByOffset(offset, parties);\n }\n\n /**\n * Fetch both the created and archived events for a contract by ID.\n *\n * @param contractId - The contract ID to look up\n * @param parties - Parties to use for visibility filtering\n */\n fetchEventsByContractId(\n contractId: string,\n parties: string[],\n ): Promise<{ created: CreatedEvent | undefined; archived: ArchivedEvent | undefined }> {\n return this.#client.fetchEventsByContractId(contractId, parties);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disclosure\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a disclosure for a contract.\n *\n * Disclosures allow a party to share a contract's content with another party\n * who isn't a stakeholder, enabling them to exercise choices that reference it.\n *\n * @param contractId The contract to create disclosure for\n * @param parties Parties that have visibility to the contract\n * @returns The disclosed contract, or undefined if contract not found\n *\n * @example\n * ```ts\n * // Alice creates disclosure for Bob to use\n * const disclosure = await aliceSdk.createDisclosure(contractId, [aliceParty]);\n * if (disclosure) {\n * // Bob uses the disclosure in his submission\n * await bobSdk.submit(\n * { actAs: [bobParty] },\n * [command],\n * { disclosedContracts: [disclosure] }\n * );\n * }\n * ```\n */\n createDisclosure<T extends object>(\n contractId: ContractId<T>,\n parties: Party[],\n ): Promise<CantonDisclosedContract | undefined> {\n return this.#client.createDisclosure(contractId, parties);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Amulet wallet\n // ─────────────────────────────────────────────────────────────────────────\n\n /** DSO party from the validator wallet. Requires a client built with wallet config. */\n getDsoParty(): Promise<string> {\n return this.#client.getDsoParty();\n }\n\n /** Amulet CIP-56 transfer-factory context from the validator wallet's scan-proxy. */\n getAmuletTransferFactoryContext(\n args: AmuletTransferFactoryArgs,\n ): Promise<TransferFactoryContext> {\n return this.#client.getAmuletTransferFactoryContext(args);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Utilities\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get connected synchronizers.\n */\n connectedSynchronizers(): Promise<string[]> {\n return this.#client.connectedSynchronizers();\n }\n\n /**\n * Upload a DAR to the participant node.\n *\n * POST /v2/dars\n *\n * @param opts.skipIfVetted - If true, treat KNOWN_PACKAGE_VERSION errors as success\n */\n uploadDar(\n dar: Uint8Array<ArrayBuffer>,\n opts?: { vetAllPackages?: boolean; synchronizerId?: string; skipIfVetted?: boolean },\n ): Promise<object> {\n return this.#client.uploadDar(dar, opts);\n }\n\n /**\n * Validate a DAR for upgrade compatibility against the current vetting state.\n *\n * POST /v2/dars/validate\n */\n validateDar(dar: Uint8Array<ArrayBuffer>, opts?: { synchronizerId?: string }): Promise<void> {\n return this.#client.validateDar(dar, opts);\n }\n\n /**\n * List all known parties on the participant node.\n *\n * GET /v2/parties\n *\n * @param opts.pageSize - Maximum number of results per page\n * @param opts.pageToken - Pagination token from previous response\n * @returns Array of party IDs\n */\n listParties(opts?: {\n pageSize?: number;\n pageToken?: string;\n }): Promise<{ parties: string[]; nextPageToken?: string }> {\n return this.#client.listParties(opts);\n }\n\n /**\n * List the parties the configured user can act/read as.\n *\n * Narrower than {@link listParties} (all parties on the node): use this when a\n * call needs the caller's own read-scoped parties.\n */\n listUserParties(): Promise<string[]> {\n return this.#client.listUserParties();\n }\n\n /**\n * Allocate a new party on the participant node.\n *\n * POST /v2/parties\n *\n * @param partyIdHint - A hint for the party ID (e.g., \"alice\", \"bob\")\n * @param opts.userId - User who gets actAs rights (empty string = no user)\n * @param opts.synchronizerId - Synchronizer to allocate on (auto-detected if omitted)\n * @param opts.identityProviderId - Identity provider ID (empty string = default)\n * @returns The allocated party ID\n */\n allocateParty(\n partyIdHint: string,\n opts?: { userId?: string; synchronizerId?: string; identityProviderId?: string },\n ): Promise<string> {\n return this.#client.allocateParty(partyIdHint, opts);\n }\n\n /**\n * Get the package ID for a package by name.\n *\n * POST /v2/interactive-submission/preferred-packages\n *\n * @param packageName - The package name (e.g., \"layerzero-oft\")\n * @param parties - Parties whose vetting state should be considered\n * @param opts.synchronizerId - Synchronizer to query (auto-detected if omitted)\n * @returns The package ID (hash)\n */\n getPackageId(\n packageName: string,\n parties: string[],\n opts?: { synchronizerId?: string },\n ): Promise<string> {\n return this.#client.getPackageId(packageName, parties, opts);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Active Contracts Query\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the current ledger end offset.\n *\n * GET /v2/state/ledger-end\n *\n * @returns The current ledger end offset\n */\n getLedgerEndOffset(): Promise<number> {\n return this.#client.getLedgerEndOffset();\n }\n\n /**\n * Query active contracts at a given offset with optional template filtering.\n *\n * POST /v2/state/active-contracts\n *\n * @param party - Party to query as (for visibility)\n * @param offset - Ledger offset to query at\n * @param opts.templateIds - Template IDs to filter by (e.g., \"packageId:Module:Template\")\n * @param opts.limit - Maximum number of contracts to return\n * @returns Array of active contracts\n *\n * @example\n * ```ts\n * const offset = await sdk.getLedgerEndOffset();\n * const contracts = await sdk.queryActiveContracts(party, offset, {\n * templateIds: ['packageId:SimpleRequest:SimpleRequest'],\n * limit: 100,\n * });\n * for (const contract of contracts) {\n * console.log(contract.createdEvent.contractId, contract.createdEvent.templateId);\n * }\n * ```\n */\n queryActiveContracts(\n party: string,\n offset: number,\n opts?: { templateIds?: string[]; limit?: number; includeCreatedEventBlob?: boolean },\n ): Promise<JsActiveContract[]> {\n return this.#client.queryActiveContracts(party, offset, opts);\n }\n\n /**\n * Normalize a ledger API JsActiveContract to a flat shape (contractId, templateId, payload, synchronizerId).\n * Useful when you only need these fields and not createdEvent / reassignmentCounter.\n */\n static normalizeActiveContract(contract: JsActiveContract): NormalizedActiveContract {\n const e = contract.createdEvent;\n return {\n contractId: e.contractId,\n templateId: e.templateId,\n payload: e.createArgument,\n synchronizerId: contract.synchronizerId,\n };\n }\n\n /**\n * Query active contracts visible to any of the given parties (single API call).\n */\n queryActiveContractsByParties(\n parties: string[],\n offset: number,\n templateIds: string[],\n opts?: { limit?: number; includeCreatedEventBlob?: boolean },\n ): Promise<JsActiveContract[]> {\n return this.#client.queryActiveContractsByParties(parties, offset, templateIds, opts);\n }\n\n /**\n * Query active contracts visible to any of the given parties that implement\n * the given interfaces (single API call).\n */\n queryActiveContractsByInterface(\n parties: string[],\n offset: number,\n interfaceIds: string[],\n opts?: { limit?: number; includeCreatedEventBlob?: boolean },\n ): Promise<JsActiveContract[]> {\n return this.#client.queryActiveContractsByInterface(parties, offset, interfaceIds, opts);\n }\n\n /**\n * Query active contracts visible to any of the given parties, deduplicated by contractId.\n * Returns normalized contracts (flat shape). Use when you need a merged view across multiple parties.\n *\n * @param parties - Party IDs to query as (contracts visible to any party are included, each contract once)\n * @param opts - Optional templateIds and limit (passed per-party to the ledger API); optional templateFilter (applied after fetch)\n */\n async queryActiveContractsForParties(\n parties: string[],\n opts?: {\n templateIds?: string[];\n limit?: number;\n /** If provided, only contracts whose templateId passes this predicate are returned. */\n templateFilter?: (templateId: string) => boolean;\n },\n ): Promise<NormalizedActiveContract[]> {\n const offset = await this.#client.getLedgerEndOffset();\n const { templateFilter, ...apiOpts } = opts ?? {};\n const perPartyResults = await Promise.all(\n parties.map((partyId) => this.#client.queryActiveContracts(partyId, offset, apiOpts)),\n );\n const seen = new Set<string>();\n const result: NormalizedActiveContract[] = [];\n for (const contracts of perPartyResults) {\n for (const c of contracts) {\n const cid = c.createdEvent.contractId;\n if (!seen.has(cid)) {\n seen.add(cid);\n const normalized = CantonSdk.normalizeActiveContract(c);\n if (!templateFilter || templateFilter(normalized.templateId)) {\n result.push(normalized);\n }\n }\n }\n }\n return result;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { buildChannelCredentials, synchronizerStore, headStateBaseQuery, computeDecentralizedNamespace } from './K7FRAGGM.js';
1
+ import { buildChannelCredentials, synchronizerStore, headStateBaseQuery, computeDecentralizedNamespace } from './KLMACWXT.js';
2
2
  import { buildNamespaceDelegationMapping, buildDecentralizedNamespaceDefinitionMapping, buildPartyToKeyMapping, buildPartyToParticipantMapping } from './RVQWP4JU.js';
3
3
  import { computePublicKeyFingerprint } from './WLV6EHDB.js';
4
4
  import { SynchronizerConnectivityServiceClient } from './VJ4PVZYL.js';
@@ -381,5 +381,5 @@ var CantonGrpcClient = class {
381
381
  };
382
382
 
383
383
  export { CantonGrpcClient };
384
- //# sourceMappingURL=5VKWPQE4.js.map
385
- //# sourceMappingURL=5VKWPQE4.js.map
384
+ //# sourceMappingURL=SEKZMYNZ.js.map
385
+ //# sourceMappingURL=SEKZMYNZ.js.map
@@ -1 +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":"5VKWPQE4.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
+ {"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":"SEKZMYNZ.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"]}