@layerzerolabs/common-canton 0.2.109 → 0.2.111

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 (230) hide show
  1. package/.turbo/turbo-build.log +808 -794
  2. package/.turbo/turbo-test.log +16 -12
  3. package/dist/{PVONQCBG.js → 2UKHG3HM.js} +3 -3
  4. package/dist/{PVONQCBG.js.map → 2UKHG3HM.js.map} +1 -1
  5. package/dist/{GMQEAD3I.js → 34I4OGQK.js} +3 -3
  6. package/dist/{GMQEAD3I.js.map → 34I4OGQK.js.map} +1 -1
  7. package/dist/{NLMU226B.js → 45YQNHS2.js} +3 -3
  8. package/dist/{NLMU226B.js.map → 45YQNHS2.js.map} +1 -1
  9. package/dist/{KK2NBQSG.js → 4GYCD3G4.js} +3 -3
  10. package/dist/{KK2NBQSG.js.map → 4GYCD3G4.js.map} +1 -1
  11. package/dist/{EIXIZULE.js → 5HH7PZW3.js} +37 -37
  12. package/dist/{EIXIZULE.js.map → 5HH7PZW3.js.map} +1 -1
  13. package/dist/{OQ2FVATH.js → 5OA7RJHH.js} +3 -3
  14. package/dist/{OQ2FVATH.js.map → 5OA7RJHH.js.map} +1 -1
  15. package/dist/{QYQCAXCB.js → 73I7CBP3.js} +3 -3
  16. package/dist/{QYQCAXCB.js.map → 73I7CBP3.js.map} +1 -1
  17. package/dist/{MDEOBKC3.js → 7GI6QGS6.js} +3 -3
  18. package/dist/{MDEOBKC3.js.map → 7GI6QGS6.js.map} +1 -1
  19. package/dist/{IOTRKLGP.js → 7STDATVZ.js} +3 -3
  20. package/dist/{IOTRKLGP.js.map → 7STDATVZ.js.map} +1 -1
  21. package/dist/{T4AL4FJH.js → ALC4M7WK.js} +3 -3
  22. package/dist/{T4AL4FJH.js.map → ALC4M7WK.js.map} +1 -1
  23. package/dist/{TWUSN2QY.js → AMLJTQWB.js} +3 -3
  24. package/dist/{TWUSN2QY.js.map → AMLJTQWB.js.map} +1 -1
  25. package/dist/{YCNGW63C.js → BL22CZFA.js} +3 -3
  26. package/dist/{YCNGW63C.js.map → BL22CZFA.js.map} +1 -1
  27. package/dist/{ZN2CNFMH.js → BLWJ63ZZ.js} +3 -3
  28. package/dist/{ZN2CNFMH.js.map → BLWJ63ZZ.js.map} +1 -1
  29. package/dist/CJ2WHLYC.js +116 -0
  30. package/dist/CJ2WHLYC.js.map +1 -0
  31. package/dist/{4AKFOZFY.js → CLAE73FR.js} +3 -3
  32. package/dist/{4AKFOZFY.js.map → CLAE73FR.js.map} +1 -1
  33. package/dist/CMDFOA7C.js +47 -0
  34. package/dist/CMDFOA7C.js.map +1 -0
  35. package/dist/CXTOAS7N.js +18 -0
  36. package/dist/CXTOAS7N.js.map +1 -0
  37. package/dist/{NX67V54F.js → DAP5XJGH.js} +3 -3
  38. package/dist/{NX67V54F.js.map → DAP5XJGH.js.map} +1 -1
  39. package/dist/{PSB6BQFH.js → EYLCZMM4.js} +5 -4
  40. package/dist/EYLCZMM4.js.map +1 -0
  41. package/dist/FPRRDKT5.js +52 -0
  42. package/dist/FPRRDKT5.js.map +1 -0
  43. package/dist/{KJRFPBY4.js → FXR2Z54G.js} +3 -3
  44. package/dist/{KJRFPBY4.js.map → FXR2Z54G.js.map} +1 -1
  45. package/dist/{HNZRSDTR.js → GOPXFEBJ.js} +11 -46
  46. package/dist/GOPXFEBJ.js.map +1 -0
  47. package/dist/{MJCI4XZ2.js → HLWLB4AY.js} +3 -3
  48. package/dist/{MJCI4XZ2.js.map → HLWLB4AY.js.map} +1 -1
  49. package/dist/{XSEEW6TB.js → HRZTWWO4.js} +3 -3
  50. package/dist/{XSEEW6TB.js.map → HRZTWWO4.js.map} +1 -1
  51. package/dist/{QHEXOE3Y.js → JI3XNGXO.js} +3 -27
  52. package/dist/JI3XNGXO.js.map +1 -0
  53. package/dist/{EPHLTMJZ.js → JSG7MGHH.js} +3 -3
  54. package/dist/{EPHLTMJZ.js.map → JSG7MGHH.js.map} +1 -1
  55. package/dist/{JH2I4JGJ.js → JXKVPYCE.js} +3 -3
  56. package/dist/{JH2I4JGJ.js.map → JXKVPYCE.js.map} +1 -1
  57. package/dist/{4VLNRPYZ.js → K2SFNQJC.js} +5 -5
  58. package/dist/{4VLNRPYZ.js.map → K2SFNQJC.js.map} +1 -1
  59. package/dist/{H7FW24YI.js → KBZ6YXX4.js} +3 -3
  60. package/dist/{H7FW24YI.js.map → KBZ6YXX4.js.map} +1 -1
  61. package/dist/{ZF6ASBPX.js → KH7RP6Q4.js} +3 -3
  62. package/dist/{ZF6ASBPX.js.map → KH7RP6Q4.js.map} +1 -1
  63. package/dist/{AV2FN74T.js → KTNEUXUI.js} +4 -4
  64. package/dist/{AV2FN74T.js.map → KTNEUXUI.js.map} +1 -1
  65. package/dist/{D3AV6J7R.js → LL7Z56UN.js} +3 -3
  66. package/dist/{D3AV6J7R.js.map → LL7Z56UN.js.map} +1 -1
  67. package/dist/{AYAFFPBV.js → MFVQ6EHM.js} +3 -3
  68. package/dist/{AYAFFPBV.js.map → MFVQ6EHM.js.map} +1 -1
  69. package/dist/{U7ISOK6B.js → NKXEPWZV.js} +3 -3
  70. package/dist/{U7ISOK6B.js.map → NKXEPWZV.js.map} +1 -1
  71. package/dist/{P3A2XIFY.js → NS763D57.js} +3 -3
  72. package/dist/{P3A2XIFY.js.map → NS763D57.js.map} +1 -1
  73. package/dist/{3UD2GTXW.js → PGQCNYFD.js} +3 -3
  74. package/dist/{3UD2GTXW.js.map → PGQCNYFD.js.map} +1 -1
  75. package/dist/{2UWZKS5E.js → Q3RL6UXD.js} +4 -4
  76. package/dist/{2UWZKS5E.js.map → Q3RL6UXD.js.map} +1 -1
  77. package/dist/{5KFMHJZB.js → QYQWHMQM.js} +3 -3
  78. package/dist/{5KFMHJZB.js.map → QYQWHMQM.js.map} +1 -1
  79. package/dist/{BJXKGZ5Y.js → QZJONP6W.js} +3 -3
  80. package/dist/{BJXKGZ5Y.js.map → QZJONP6W.js.map} +1 -1
  81. package/dist/{X66QZBHT.js → SLTAV2JF.js} +9 -2
  82. package/dist/SLTAV2JF.js.map +1 -0
  83. package/dist/{JV2DWUBW.js → SMLSAWCA.js} +48 -4
  84. package/dist/SMLSAWCA.js.map +1 -0
  85. package/dist/{RQXQCK22.js → UBHUOSK3.js} +3 -3
  86. package/dist/{RQXQCK22.js.map → UBHUOSK3.js.map} +1 -1
  87. package/dist/{OMRF3GH2.js → UO7AO4TN.js} +3 -3
  88. package/dist/{OMRF3GH2.js.map → UO7AO4TN.js.map} +1 -1
  89. package/dist/{R26MH4UH.js → UQMKPY2S.js} +3 -3
  90. package/dist/{R26MH4UH.js.map → UQMKPY2S.js.map} +1 -1
  91. package/dist/{HU7X7G5L.js → WSLU3JGO.js} +3 -3
  92. package/dist/{HU7X7G5L.js.map → WSLU3JGO.js.map} +1 -1
  93. package/dist/{WIQFSNER.js → XINHRIWA.js} +3 -3
  94. package/dist/{WIQFSNER.js.map → XINHRIWA.js.map} +1 -1
  95. package/dist/{PHVMGN7T.js → ZGWBZC76.js} +3 -3
  96. package/dist/{PHVMGN7T.js.map → ZGWBZC76.js.map} +1 -1
  97. package/dist/{AE56UC5I.js → ZPOY5WJ2.js} +3 -3
  98. package/dist/{AE56UC5I.js.map → ZPOY5WJ2.js.map} +1 -1
  99. package/dist/amulet.d.ts +7 -0
  100. package/dist/amulet.d.ts.map +1 -0
  101. package/dist/amulet.js +4 -0
  102. package/dist/amulet.js.map +1 -0
  103. package/dist/auth/index.js +1 -1
  104. package/dist/client/canton-client.d.ts +12 -0
  105. package/dist/client/canton-client.d.ts.map +1 -1
  106. package/dist/client/canton-client.js +138 -138
  107. package/dist/client/index.js +140 -139
  108. package/dist/client/interface.d.ts +12 -0
  109. package/dist/client/interface.d.ts.map +1 -1
  110. package/dist/client/utils.d.ts.map +1 -1
  111. package/dist/client/utils.js +2 -1
  112. package/dist/crypto.d.ts +23 -0
  113. package/dist/crypto.d.ts.map +1 -0
  114. package/dist/crypto.js +4 -0
  115. package/dist/crypto.js.map +1 -0
  116. package/dist/daml-serde.d.ts +73 -0
  117. package/dist/daml-serde.d.ts.map +1 -0
  118. package/dist/daml-serde.js +4 -0
  119. package/dist/daml-serde.js.map +1 -0
  120. package/dist/events.d.ts +9 -36
  121. package/dist/events.d.ts.map +1 -1
  122. package/dist/events.js +2 -2
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +150 -147
  126. package/dist/open-api/apis/DefaultApi.js +137 -137
  127. package/dist/open-api/apis/index.js +137 -137
  128. package/dist/open-api/index.js +137 -137
  129. package/dist/open-api/models/Command.js +3 -3
  130. package/dist/open-api/models/Command1.js +2 -2
  131. package/dist/open-api/models/Completion.js +3 -3
  132. package/dist/open-api/models/Completion1.js +3 -3
  133. package/dist/open-api/models/CompletionResponse.js +7 -7
  134. package/dist/open-api/models/CompletionResponseOneOf.js +3 -3
  135. package/dist/open-api/models/CompletionStreamResponse.js +7 -7
  136. package/dist/open-api/models/CreateUserRequest.js +10 -10
  137. package/dist/open-api/models/CumulativeFilter.js +2 -2
  138. package/dist/open-api/models/DeduplicationPeriod.js +1 -1
  139. package/dist/open-api/models/DeduplicationPeriod1.js +1 -1
  140. package/dist/open-api/models/DeduplicationPeriod2.js +3 -3
  141. package/dist/open-api/models/EventFormat.js +2 -2
  142. package/dist/open-api/models/FeaturesDescriptor.js +2 -2
  143. package/dist/open-api/models/Filters.js +2 -2
  144. package/dist/open-api/models/GetActiveContractsRequest.js +2 -2
  145. package/dist/open-api/models/GetEventsByContractIdRequest.js +2 -2
  146. package/dist/open-api/models/GetLedgerApiVersionResponse.js +3 -3
  147. package/dist/open-api/models/GetTransactionByIdRequest.js +2 -2
  148. package/dist/open-api/models/GetTransactionByOffsetRequest.js +2 -2
  149. package/dist/open-api/models/GetUpdateByIdRequest.js +2 -2
  150. package/dist/open-api/models/GetUpdateByOffsetRequest.js +2 -2
  151. package/dist/open-api/models/GetUpdatesRequest.js +2 -2
  152. package/dist/open-api/models/GrantUserRightsRequest.js +10 -10
  153. package/dist/open-api/models/GrantUserRightsResponse.js +10 -10
  154. package/dist/open-api/models/IdentifierFilter.js +2 -2
  155. package/dist/open-api/models/JsCommands.js +5 -5
  156. package/dist/open-api/models/JsContractEntry.js +3 -3
  157. package/dist/open-api/models/JsExecuteSubmissionAndWaitForTransactionRequest.js +7 -7
  158. package/dist/open-api/models/JsExecuteSubmissionAndWaitRequest.js +5 -5
  159. package/dist/open-api/models/JsExecuteSubmissionRequest.js +5 -5
  160. package/dist/open-api/models/JsGetActiveContractsResponse.js +4 -4
  161. package/dist/open-api/models/JsGetUpdateResponse.js +13 -13
  162. package/dist/open-api/models/JsGetUpdateTreesResponse.js +5 -5
  163. package/dist/open-api/models/JsGetUpdatesResponse.js +13 -13
  164. package/dist/open-api/models/JsPrepareSubmissionRequest.js +5 -5
  165. package/dist/open-api/models/JsReassignment.js +1 -1
  166. package/dist/open-api/models/JsReassignmentEvent.js +1 -1
  167. package/dist/open-api/models/JsSubmitAndWaitForReassignmentResponse.js +1 -1
  168. package/dist/open-api/models/JsSubmitAndWaitForTransactionRequest.js +9 -9
  169. package/dist/open-api/models/JsTopologyTransaction.js +6 -6
  170. package/dist/open-api/models/Kind.js +8 -8
  171. package/dist/open-api/models/ListUserRightsResponse.js +10 -10
  172. package/dist/open-api/models/Operation.js +4 -4
  173. package/dist/open-api/models/Reassignment.js +1 -1
  174. package/dist/open-api/models/Reassignment1.js +1 -1
  175. package/dist/open-api/models/ReassignmentCommand.js +3 -3
  176. package/dist/open-api/models/ReassignmentCommands.js +4 -4
  177. package/dist/open-api/models/RevokeUserRightsRequest.js +10 -10
  178. package/dist/open-api/models/RevokeUserRightsResponse.js +10 -10
  179. package/dist/open-api/models/Right.js +9 -9
  180. package/dist/open-api/models/SubmitAndWaitForReassignmentRequest.js +7 -7
  181. package/dist/open-api/models/SubmitReassignmentRequest.js +5 -5
  182. package/dist/open-api/models/TopologyEvent.js +5 -5
  183. package/dist/open-api/models/TopologyEventEvent.js +4 -4
  184. package/dist/open-api/models/TopologyTransaction.js +7 -7
  185. package/dist/open-api/models/TransactionFilter.js +2 -2
  186. package/dist/open-api/models/TransactionFormat.js +2 -2
  187. package/dist/open-api/models/Update.js +12 -12
  188. package/dist/open-api/models/Update1.js +4 -4
  189. package/dist/open-api/models/Update1OneOf1.js +1 -1
  190. package/dist/open-api/models/UpdateFormat.js +2 -2
  191. package/dist/open-api/models/UpdateOneOf1.js +1 -1
  192. package/dist/open-api/models/UpdateOneOf2.js +8 -8
  193. package/dist/open-api/models/UpdateVettedPackagesRequest.js +6 -6
  194. package/dist/open-api/models/VettedPackagesChange.js +5 -5
  195. package/dist/open-api/models/index.js +136 -136
  196. package/dist/provider.d.ts +9 -27
  197. package/dist/provider.d.ts.map +1 -1
  198. package/dist/provider.js +140 -140
  199. package/dist/sdk/canton-sdk.d.ts +7 -0
  200. package/dist/sdk/canton-sdk.d.ts.map +1 -1
  201. package/dist/sdk/canton-sdk.js +1 -1
  202. package/dist/sdk/index.js +1 -1
  203. package/dist/transaction.d.ts +64 -6
  204. package/dist/transaction.d.ts.map +1 -1
  205. package/dist/transaction.js +1 -1
  206. package/package.json +13 -10
  207. package/src/amulet.ts +28 -0
  208. package/src/client/canton-client.ts +60 -1
  209. package/src/client/interface.ts +16 -0
  210. package/src/client/utils.ts +1 -6
  211. package/src/crypto.ts +42 -0
  212. package/src/daml-serde.ts +182 -0
  213. package/src/events.ts +31 -155
  214. package/src/index.ts +3 -0
  215. package/src/provider.ts +12 -82
  216. package/src/sdk/canton-sdk.ts +13 -0
  217. package/src/transaction.ts +4 -0
  218. package/test/crypto.test.ts +52 -0
  219. package/test/daml-serde.test.ts +140 -0
  220. package/test/mocks/scripts/capture-disclosure.ts +5 -2
  221. package/test/mocks/scripts/capture-external-requests.ts +5 -2
  222. package/test/mocks/scripts/capture-unhappy-paths.ts +5 -2
  223. package/test/provider.test.ts +47 -36
  224. package/dist/GXJEEYPP.js +0 -104
  225. package/dist/GXJEEYPP.js.map +0 -1
  226. package/dist/HNZRSDTR.js.map +0 -1
  227. package/dist/JV2DWUBW.js.map +0 -1
  228. package/dist/PSB6BQFH.js.map +0 -1
  229. package/dist/QHEXOE3Y.js.map +0 -1
  230. package/dist/X66QZBHT.js.map +0 -1
@@ -13,8 +13,11 @@
13
13
  import type { ContractId } from '@daml/types';
14
14
  import * as path from 'path';
15
15
 
16
- import { MnemonicSignerAdapter } from '../../../../signer-adapter/src/mnemonicSignerAdapter.js';
17
- import { SignatureFormat, SignatureType } from '../../../../signer-adapter/src/model.js';
16
+ import {
17
+ MnemonicSignerAdapter,
18
+ SignatureFormat,
19
+ SignatureType,
20
+ } from '@layerzerolabs/ver-signer-adapter';
18
21
  import { CantonClient } from '../../../src/client/index.js';
19
22
  // Import SDK test contracts
20
23
  import { packageId } from '../../../src/daml/sdk-test-0.0.1/lib/index.js';
@@ -13,8 +13,11 @@
13
13
  import type { ContractId } from '@daml/types';
14
14
  import * as path from 'path';
15
15
 
16
- import { MnemonicSignerAdapter } from '../../../../signer-adapter/src/mnemonicSignerAdapter.js';
17
- import { SignatureFormat, SignatureType } from '../../../../signer-adapter/src/model.js';
16
+ import {
17
+ MnemonicSignerAdapter,
18
+ SignatureFormat,
19
+ SignatureType,
20
+ } from '@layerzerolabs/ver-signer-adapter';
18
21
  import { CantonClient } from '../../../src/client/index.js';
19
22
  // Import SDK test contracts
20
23
  import { packageId } from '../../../src/daml/sdk-test-0.0.1/lib/index.js';
@@ -14,54 +14,65 @@ vi.mock('../src/client/grpc', () => ({
14
14
  }));
15
15
  vi.mock('../src/open-api/runtime', () => ({ Configuration: class {} }));
16
16
 
17
- const BASE =
18
- 'http://localhost:2975?admin-api=localhost:2902&wallet-url=http://localhost:2903&sequencer-url=http://localhost:2904';
17
+ const BASE = 'http://localhost:2975?admin-api=localhost:2902&wallet-url=http://localhost:2903';
19
18
 
20
19
  const loadProvider = async () => import('../src/provider');
21
20
 
22
- describe('parseCantonUri / sequencerCommittee', () => {
23
- it('returns undefined when neither committee param is set', async () => {
24
- const { parseCantonUri } = await loadProvider();
25
- const params = parseCantonUri(BASE);
26
- expect(params.sequencerCommittee).toBeUndefined();
21
+ describe('parseCantonChainUri', () => {
22
+ it('parses ledger, admin, wallet and user params', async () => {
23
+ const { parseCantonChainUri } = await loadProvider();
24
+ const params = parseCantonChainUri(`${BASE}&user-id=alice`);
25
+ expect(params.jsonApiUrl).toBe('http://localhost:2975');
26
+ expect(params.adminApiHost).toBe('localhost:2902');
27
+ expect(params.walletUrl).toBe('http://localhost:2903');
28
+ expect(params.userId).toBe('alice');
27
29
  });
28
30
 
29
- it('parses validator pubkeys and quorum', async () => {
30
- const { parseCantonUri } = await loadProvider();
31
- const params = parseCantonUri(
32
- `${BASE}&sequencer-validators=0x04AB,0x04Cd&sequencer-quorum=1`,
33
- );
34
- expect(params.sequencerCommittee).toEqual({
35
- publicKeys: ['0x04ab', '0x04cd'],
36
- quorum: 1,
37
- });
31
+ it('defaults userId to participant_admin', async () => {
32
+ const { parseCantonChainUri } = await loadProvider();
33
+ const params = parseCantonChainUri(BASE);
34
+ expect(params.userId).toBe('participant_admin');
38
35
  });
39
36
 
40
- it('throws when only one committee param is set', async () => {
41
- const { parseCantonUri } = await loadProvider();
42
- expect(() => parseCantonUri(`${BASE}&sequencer-validators=0x04ab`)).toThrow(
43
- /set both sequencer-validators and sequencer-quorum together/,
44
- );
45
- expect(() => parseCantonUri(`${BASE}&sequencer-quorum=1`)).toThrow(
46
- /set both sequencer-validators and sequencer-quorum together/,
37
+ it('throws when admin-api is missing', async () => {
38
+ const { parseCantonChainUri } = await loadProvider();
39
+ expect(() =>
40
+ parseCantonChainUri('http://localhost:2975?wallet-url=http://localhost:2903'),
41
+ ).toThrow(/missing required "admin-api"/);
42
+ });
43
+
44
+ it('throws when wallet-url is missing', async () => {
45
+ const { parseCantonChainUri } = await loadProvider();
46
+ expect(() => parseCantonChainUri('http://localhost:2975?admin-api=localhost:2902')).toThrow(
47
+ /missing required "wallet-url"/,
47
48
  );
48
49
  });
49
50
 
50
- it('validates quorum range', async () => {
51
- const { parseCantonUri } = await loadProvider();
52
- expect(() =>
53
- parseCantonUri(`${BASE}&sequencer-validators=0x04ab&sequencer-quorum=0`),
54
- ).toThrow(/positive integer/);
55
- expect(() =>
56
- parseCantonUri(`${BASE}&sequencer-validators=0x04ab&sequencer-quorum=2`),
57
- ).toThrow(/exceeds committee size/);
51
+ it('strips canton params from jsonApiUrl but preserves unknown ones', async () => {
52
+ const { parseCantonChainUri } = await loadProvider();
53
+ const params = parseCantonChainUri(`${BASE}&foo=bar`);
54
+ expect(params.jsonApiUrl).toBe('http://localhost:2975/?foo=bar');
58
55
  });
59
56
 
60
- it('strips committee params from jsonApiUrl', async () => {
61
- const { parseCantonUri } = await loadProvider();
62
- const params = parseCantonUri(
63
- `${BASE}&foo=bar&sequencer-validators=0x04ab&sequencer-quorum=1`,
57
+ it('strips legacy VER params from a combined RPC URI', async () => {
58
+ const { parseCantonChainUri } = await loadProvider();
59
+ const params = parseCantonChainUri(
60
+ `${BASE}&sequencer-url=http://localhost:2904&sequencer-validators=0x04ab&sequencer-quorum=1`,
64
61
  );
65
- expect(params.jsonApiUrl).toBe('http://localhost:2975/?foo=bar');
62
+ expect(params.jsonApiUrl).toBe('http://localhost:2975');
63
+ });
64
+
65
+ it('extracts oauth2 credentials when present', async () => {
66
+ const { parseCantonChainUri } = await loadProvider();
67
+ const params = parseCantonChainUri(
68
+ `${BASE}&token-url=http://token&client-id=cid&client-secret=secret`,
69
+ );
70
+ expect(params.oauth2).toEqual({
71
+ tokenUrl: 'http://token',
72
+ clientId: 'cid',
73
+ clientSecret: 'secret',
74
+ scope: undefined,
75
+ audience: undefined,
76
+ });
66
77
  });
67
78
  });
package/dist/GXJEEYPP.js DELETED
@@ -1,104 +0,0 @@
1
- import { cantonTransactionSchema } from './PSB6BQFH.js';
2
- import { __name } from './VUOMXK5T.js';
3
- import { buildTransactionWithResultSchema } from '@layerzerolabs/common-chain-model';
4
- import { NonRetryableError } from '@layerzerolabs/common-error-utils';
5
-
6
- var cantonTxWithResultSchema = buildTransactionWithResultSchema(cantonTransactionSchema);
7
- var REQUEST_ARCHIVAL_POLL_INTERVAL_MS = 2e3;
8
- var REQUEST_ARCHIVAL_MAX_ATTEMPTS = 60;
9
- var IREQUEST_ACCEPT_CHOICE = "IRequest_Accept";
10
- var IREQUEST_REJECT_CHOICE = "IRequest_Reject";
11
- var REQUEST_TEMPLATE_QUALIFIED_NAME = "Request:Request";
12
- var fetchCreatedEvents = /* @__PURE__ */ __name(async (client, updateId, parties) => {
13
- const cantonTx = await client.fetchTransactionByUpdateId(updateId, parties);
14
- return cantonTx.events?.filter((event) => "CreatedEvent" in event).map((event) => event.CreatedEvent) ?? [];
15
- }, "fetchCreatedEvents");
16
- var findMatchingCreatedEvent = /* @__PURE__ */ __name((createdEvents, expectedTemplateId, expectedSignatories) => {
17
- const expectedSet = new Set(expectedSignatories);
18
- return createdEvents.find((event) => {
19
- if (event.templateId !== expectedTemplateId) return false;
20
- const signatories = event.signatories ?? [];
21
- return signatories.length > 0 && signatories.every((s) => expectedSet.has(s));
22
- });
23
- }, "findMatchingCreatedEvent");
24
- var findMatchingCreatedEventFromTx = /* @__PURE__ */ __name(async (client, tx) => {
25
- const parsed = cantonTxWithResultSchema.safeParse(tx);
26
- if (!parsed.success) return null;
27
- if (parsed.data.result.type !== "success") return null;
28
- const { populatedTransaction: { actAs, unresolvedCommands } } = parsed.data;
29
- const updateId = parsed.data.result.minedTxHash;
30
- if (!updateId || !actAs.length) return null;
31
- const createCommand = unresolvedCommands[0];
32
- if (!createCommand || !("createCommand" in createCommand)) return null;
33
- const createdEvents = await fetchCreatedEvents(client, updateId, actAs);
34
- return findMatchingCreatedEvent(createdEvents, createCommand.createCommand.templateId, actAs) ?? null;
35
- }, "findMatchingCreatedEventFromTx");
36
- var cantonDeploymentSucceeded = /* @__PURE__ */ __name(async (client, txWithResult) => {
37
- return await findMatchingCreatedEventFromTx(client, txWithResult) != null;
38
- }, "cantonDeploymentSucceeded");
39
- var cantonRegisterSucceeded = /* @__PURE__ */ __name(async (client, txWithResult) => {
40
- const parsed = cantonTxWithResultSchema.safeParse(txWithResult);
41
- if (!parsed.success || parsed.data.result.type !== "success") return false;
42
- const updateId = parsed.data.result.minedTxHash;
43
- if (!updateId) return false;
44
- const { actAs } = parsed.data.populatedTransaction;
45
- const parties = actAs.length ? actAs : await client.listUserParties();
46
- if (!parties.length) return false;
47
- const createdEvents = await fetchCreatedEvents(client, updateId, parties);
48
- const requestEvent = createdEvents.find((event) => event.templateId?.includes(REQUEST_TEMPLATE_QUALIFIED_NAME));
49
- if (!requestEvent) return false;
50
- try {
51
- await waitForRequestArchival(client, requestEvent.contractId, parties);
52
- return true;
53
- } catch {
54
- return false;
55
- }
56
- }, "cantonRegisterSucceeded");
57
- var waitForArchival = /* @__PURE__ */ __name(async (client, contractId, parties) => {
58
- for (let attempt = 1; attempt <= REQUEST_ARCHIVAL_MAX_ATTEMPTS; attempt++) {
59
- const { archived } = await client.fetchEventsByContractId(contractId, parties);
60
- if (archived) {
61
- return client.fetchTransactionByOffset(archived.offset, parties);
62
- }
63
- if (attempt < REQUEST_ARCHIVAL_MAX_ATTEMPTS) {
64
- await new Promise((resolve) => setTimeout(resolve, REQUEST_ARCHIVAL_POLL_INTERVAL_MS));
65
- }
66
- }
67
- throw new NonRetryableError(`Archival timeout (${REQUEST_ARCHIVAL_MAX_ATTEMPTS} attempts) for ${contractId}`);
68
- }, "waitForArchival");
69
- var getExercisedChoiceArgument = /* @__PURE__ */ __name((transaction, contractId, choice) => {
70
- for (const event of transaction.events ?? []) {
71
- if (!("ExercisedEvent" in event)) continue;
72
- const { ExercisedEvent: exercised } = event;
73
- if (exercised.contractId === contractId && exercised.choice === choice) {
74
- return exercised.choiceArgument;
75
- }
76
- }
77
- return void 0;
78
- }, "getExercisedChoiceArgument");
79
- var waitForRequestArchival = /* @__PURE__ */ __name(async (client, requestContractId, parties) => {
80
- const transaction = await waitForArchival(client, requestContractId, parties);
81
- const accept = getExercisedChoiceArgument(transaction, requestContractId, IREQUEST_ACCEPT_CHOICE);
82
- if (accept !== void 0) return accept;
83
- const reject = getExercisedChoiceArgument(transaction, requestContractId, IREQUEST_REJECT_CHOICE);
84
- if (reject !== void 0) {
85
- const reason = reject.rejectContext ? JSON.stringify(reject.rejectContext).slice(0, 500) : "unknown";
86
- throw new NonRetryableError(`Request rejected \u2014 rejectContext: ${reason}`);
87
- }
88
- const consuming = getConsumingChoice(transaction, requestContractId);
89
- throw new NonRetryableError(`Request ${requestContractId} archived via unexpected choice ${consuming ?? "<none>"}`);
90
- }, "waitForRequestArchival");
91
- var getConsumingChoice = /* @__PURE__ */ __name((transaction, contractId) => {
92
- for (const event of transaction.events ?? []) {
93
- if (!("ExercisedEvent" in event)) continue;
94
- const { ExercisedEvent: exercised } = event;
95
- if (exercised.contractId === contractId && exercised.consuming) {
96
- return exercised.choice;
97
- }
98
- }
99
- return void 0;
100
- }, "getConsumingChoice");
101
-
102
- export { cantonDeploymentSucceeded, cantonRegisterSucceeded, fetchCreatedEvents, findMatchingCreatedEvent, findMatchingCreatedEventFromTx, getExercisedChoiceArgument, waitForArchival, waitForRequestArchival };
103
- //# sourceMappingURL=GXJEEYPP.js.map
104
- //# sourceMappingURL=GXJEEYPP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/events.ts"],"names":["cantonTxWithResultSchema","buildTransactionWithResultSchema","cantonTransactionSchema","REQUEST_ARCHIVAL_POLL_INTERVAL_MS","REQUEST_ARCHIVAL_MAX_ATTEMPTS","IREQUEST_ACCEPT_CHOICE","IREQUEST_REJECT_CHOICE","REQUEST_TEMPLATE_QUALIFIED_NAME","fetchCreatedEvents","client","updateId","parties","cantonTx","fetchTransactionByUpdateId","events","filter","event","map","CreatedEvent","findMatchingCreatedEvent","createdEvents","expectedTemplateId","expectedSignatories","expectedSet","Set","find","templateId","signatories","length","every","s","has","findMatchingCreatedEventFromTx","tx","parsed","safeParse","success","data","result","type","populatedTransaction","actAs","unresolvedCommands","minedTxHash","createCommand","cantonDeploymentSucceeded","txWithResult","cantonRegisterSucceeded","listUserParties","requestEvent","includes","waitForRequestArchival","contractId","waitForArchival","attempt","archived","fetchEventsByContractId","fetchTransactionByOffset","offset","Promise","resolve","setTimeout","NonRetryableError","getExercisedChoiceArgument","transaction","choice","ExercisedEvent","exercised","choiceArgument","undefined","requestContractId","accept","reject","reason","rejectContext","JSON","stringify","slice","consuming","getConsumingChoice"],"mappings":"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","file":"GXJEEYPP.js","sourcesContent":["import { buildTransactionWithResultSchema } from '@layerzerolabs/common-chain-model';\nimport { NonRetryableError } from '@layerzerolabs/common-error-utils';\n\nimport type { CantonTransaction, ICantonClient } from './client';\nimport type { CreatedEvent } from './open-api/models';\nimport { cantonTransactionSchema } from './transaction';\n\nconst cantonTxWithResultSchema = buildTransactionWithResultSchema(cantonTransactionSchema);\n\n// TODO(canton): confirm these poll values are enough to wait for archival across environments.\nconst REQUEST_ARCHIVAL_POLL_INTERVAL_MS = 2000;\nconst REQUEST_ARCHIVAL_MAX_ATTEMPTS = 60;\n\n// IRequest interface choices that consume the Request contract via `archive reqCid` in their impls.\nconst IREQUEST_ACCEPT_CHOICE = 'IRequest_Accept';\nconst IREQUEST_REJECT_CHOICE = 'IRequest_Reject';\n\nconst REQUEST_TEMPLATE_QUALIFIED_NAME = 'Request:Request';\n\n/**\n * Fetches a transaction by updateId and returns all CreatedEvents.\n */\nexport const fetchCreatedEvents = async (\n client: ICantonClient,\n updateId: string,\n parties: string[],\n): Promise<CreatedEvent[]> => {\n const cantonTx = await client.fetchTransactionByUpdateId(updateId, parties);\n return (\n cantonTx.events\n ?.filter((event): event is { CreatedEvent: CreatedEvent } => 'CreatedEvent' in event)\n .map((event) => event.CreatedEvent) ?? []\n );\n};\n\n/**\n * Finds a CreatedEvent matching the expected templateId whose signatories\n * are a subset of the provided actAs parties.\n */\nexport const findMatchingCreatedEvent = (\n createdEvents: CreatedEvent[],\n expectedTemplateId: string,\n expectedSignatories: string[],\n): CreatedEvent | undefined => {\n const expectedSet = new Set(expectedSignatories);\n return createdEvents.find((event) => {\n if (event.templateId !== expectedTemplateId) return false;\n const signatories = event.signatories ?? [];\n return signatories.length > 0 && signatories.every((s) => expectedSet.has(s));\n });\n};\n\n/**\n * Parses a Canton transaction-with-result, fetches the created events from the ledger,\n * and returns the first CreatedEvent matching the submitted command's templateId and actAs\n * signatories. Returns null if the transaction is falsy, not successful, or has no match.\n */\nexport const findMatchingCreatedEventFromTx = async (\n client: ICantonClient,\n tx: unknown,\n): Promise<CreatedEvent | null> => {\n const parsed = cantonTxWithResultSchema.safeParse(tx);\n if (!parsed.success) return null;\n\n if (parsed.data.result.type !== 'success') return null;\n\n const {\n populatedTransaction: { actAs, unresolvedCommands },\n } = parsed.data;\n const updateId = parsed.data.result.minedTxHash;\n\n if (!updateId || !actAs.length) return null;\n\n const createCommand = unresolvedCommands[0];\n if (!createCommand || !('createCommand' in createCommand)) return null;\n\n const createdEvents = await fetchCreatedEvents(client, updateId, actAs);\n return (\n findMatchingCreatedEvent(createdEvents, createCommand.createCommand.templateId, actAs) ??\n null\n );\n};\n\n/**\n * Checks that a Canton deploy transaction resulted in a CreatedEvent\n * matching the submitted command's templateId and actAs signatories.\n */\nexport const cantonDeploymentSucceeded = async (\n client: ICantonClient,\n txWithResult: unknown,\n): Promise<boolean> => {\n return (await findMatchingCreatedEventFromTx(client, txWithResult)) != null;\n};\n\n/**\n * Success check for register-style deploys (an exercise on Uln302 that creates a\n * Request, which the validator then accepts or rejects in a later transaction).\n *\n * Positively confirms acceptance: locate the Request created by this submission,\n * then delegate to waitForRequestArchival, which waits for the Request to be\n * archived and verifies the IRequest_Accept choice ran (throwing on reject,\n * unexpected archival, or timeout). This is a positive accept check rather than\n * inferring success from the absence of a rejection event.\n */\nexport const cantonRegisterSucceeded = async (\n client: ICantonClient,\n txWithResult: unknown,\n): Promise<boolean> => {\n const parsed = cantonTxWithResultSchema.safeParse(txWithResult);\n if (!parsed.success || parsed.data.result.type !== 'success') return false;\n\n const updateId = parsed.data.result.minedTxHash;\n if (!updateId) return false;\n\n // Deferred-sender register payloads build with empty actAs (the sender is\n // resolved at sign time), so fall back to the parties this user can read as.\n const { actAs } = parsed.data.populatedTransaction;\n const parties = actAs.length ? actAs : await client.listUserParties();\n if (!parties.length) return false;\n\n const createdEvents = await fetchCreatedEvents(client, updateId, parties);\n const requestEvent = createdEvents.find((event) =>\n event.templateId?.includes(REQUEST_TEMPLATE_QUALIFIED_NAME),\n );\n if (!requestEvent) return false;\n\n try {\n await waitForRequestArchival(client, requestEvent.contractId, parties);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Poll until `contractId` is archived, then return the transaction tree that\n * archived it. Generic: knows nothing about which choice did the archiving.\n * Throws NonRetryableError on timeout.\n */\nexport const waitForArchival = async (\n client: ICantonClient,\n contractId: string,\n parties: string[],\n): Promise<CantonTransaction> => {\n for (let attempt = 1; attempt <= REQUEST_ARCHIVAL_MAX_ATTEMPTS; attempt++) {\n const { archived } = await client.fetchEventsByContractId(contractId, parties);\n if (archived) {\n return client.fetchTransactionByOffset(archived.offset, parties);\n }\n // Skip the sleep on the final attempt — there's no next iteration to wait for.\n if (attempt < REQUEST_ARCHIVAL_MAX_ATTEMPTS) {\n await new Promise((resolve) => setTimeout(resolve, REQUEST_ARCHIVAL_POLL_INTERVAL_MS));\n }\n }\n throw new NonRetryableError(\n `Archival timeout (${REQUEST_ARCHIVAL_MAX_ATTEMPTS} attempts) for ${contractId}`,\n );\n};\n\n/**\n * Return the argument of the first exercise of `choice` on `contractId` in a\n * transaction tree, typed as the caller expects. Generic over choice and arg\n * type; returns undefined when no such exercise is present.\n */\nexport const getExercisedChoiceArgument = <TArg = unknown>(\n transaction: CantonTransaction,\n contractId: string,\n choice: string,\n): TArg | undefined => {\n for (const event of transaction.events ?? []) {\n if (!('ExercisedEvent' in event)) continue;\n const { ExercisedEvent: exercised } = event;\n if (exercised.contractId === contractId && exercised.choice === choice) {\n return exercised.choiceArgument as TArg;\n }\n }\n return undefined;\n};\n\n/**\n * Wait for a Request to be archived and confirm it was accepted, returning the\n * IRequest_Accept choice argument typed as `TAccept` (callers pass the codegen\n * `IRequest_Accept` type to get `acceptContext` typed).\n *\n * IRequest_Accept and IRequest_Reject both end with `archive reqCid` in their\n * Daml impls, so the archive alone can't distinguish them — the choice is read\n * off the archive transaction tree. Throws NonRetryableError on rejection, on\n * archival via any other choice (unexpected), or on timeout.\n */\nexport const waitForRequestArchival = async <TAccept = unknown>(\n client: ICantonClient,\n requestContractId: string,\n parties: string[],\n): Promise<TAccept> => {\n const transaction = await waitForArchival(client, requestContractId, parties);\n\n const accept = getExercisedChoiceArgument<TAccept>(\n transaction,\n requestContractId,\n IREQUEST_ACCEPT_CHOICE,\n );\n if (accept !== undefined) return accept;\n\n const reject = getExercisedChoiceArgument<{ rejectContext?: unknown }>(\n transaction,\n requestContractId,\n IREQUEST_REJECT_CHOICE,\n );\n if (reject !== undefined) {\n const reason = reject.rejectContext\n ? JSON.stringify(reject.rejectContext).slice(0, 500)\n : 'unknown';\n throw new NonRetryableError(`Request rejected — rejectContext: ${reason}`);\n }\n\n const consuming = getConsumingChoice(transaction, requestContractId);\n throw new NonRetryableError(\n `Request ${requestContractId} archived via unexpected choice ${consuming ?? '<none>'}`,\n );\n};\n\n/** Name of the consuming exercise on `contractId` in a transaction tree, if any. */\nconst getConsumingChoice = (\n transaction: CantonTransaction,\n contractId: string,\n): string | undefined => {\n for (const event of transaction.events ?? []) {\n if (!('ExercisedEvent' in event)) continue;\n const { ExercisedEvent: exercised } = event;\n if (exercised.contractId === contractId && exercised.consuming) {\n return exercised.choice;\n }\n }\n return undefined;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/provider.ts"],"names":["parseCantonUri","uri","url","URL","adminApiHost","searchParams","get","Error","userId","walletUrl","sequencerUrl","sequencerValidatorsParam","sequencerQuorumParam","tokenUrl","undefined","clientId","clientSecret","scope","audience","key","delete","sequencerCommittee","publicKeys","split","map","s","trim","toLowerCase","filter","length","publicKey","startsWith","slice","quorum","Number","isInteger","jsonApiUrl","toString","replace","oauth2","createCantonProvider","isLocal","params","tokenProvider","createTokenProvider","configuration","Configuration","basePath","accessToken","getToken","client","CantonClient","grpcClient","CantonGrpcClient","host","LocalTokenProvider","actAs","admin","ClientCredentialsTokenProvider"],"mappings":";;;;;;;;AA2EO,SAASA,eAAeC,GAAAA,EAAW;AACtC,EAAA,MAAMC,GAAAA,GAAM,IAAIC,GAAAA,CAAIF,GAAAA,CAAAA;AAEpB,EAAA,MAAMG,YAAAA,GAAeF,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,WAAA,CAAA;AAC1C,EAAA,IAAI,CAACF,YAAAA,EAAc;AACf,IAAA,MAAM,IAAIG,MAAM,kEAAA,CAAA;AACpB,EAAA;AAEA,EAAA,MAAMC,MAAAA,GAASN,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,SAAA,CAAA,IAAc,mBAAA;AAClD,EAAA,MAAMG,SAAAA,GAAYP,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,YAAA,CAAA;AACvC,EAAA,IAAI,CAACG,SAAAA,EAAW;AACZ,IAAA,MAAM,IAAIF,MAAM,mEAAA,CAAA;AACpB,EAAA;AACA,EAAA,MAAMG,YAAAA,GAAeR,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,eAAA,CAAA;AAC1C,EAAA,IAAI,CAACI,YAAAA,EAAc;AACf,IAAA,MAAM,IAAIH,MAAM,sEAAA,CAAA;AACpB,EAAA;AACA,EAAA,MAAMI,wBAAAA,GAA2BT,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,sBAAA,CAAA;AACtD,EAAA,MAAMM,oBAAAA,GAAuBV,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,kBAAA,CAAA;AAClD,EAAA,MAAMO,QAAAA,GAAWX,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,WAAA,CAAA,IAAgBQ,MAAAA;AACtD,EAAA,MAAMC,QAAAA,GAAWb,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,WAAA,CAAA,IAAgBQ,MAAAA;AACtD,EAAA,MAAME,YAAAA,GAAed,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,eAAA,CAAA,IAAoBQ,MAAAA;AAC9D,EAAA,MAAMG,KAAAA,GAAQf,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,OAAA,CAAA,IAAYQ,MAAAA;AAC/C,EAAA,MAAMI,QAAAA,GAAWhB,GAAAA,CAAIG,YAAAA,CAAaC,GAAAA,CAAI,UAAA,CAAA,IAAeQ,MAAAA;AAGrD,EAAA,KAAA,MAAWK,GAAAA,IAAO;AACd,IAAA,WAAA;AACA,IAAA,SAAA;AACA,IAAA,YAAA;AACA,IAAA,eAAA;AACA,IAAA,sBAAA;AACA,IAAA,kBAAA;AACA,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,eAAA;AACA,IAAA,OAAA;AACA,IAAA;AACD,GAAA,EAAA;AACCjB,IAAAA,GAAAA,CAAIG,YAAAA,CAAae,OAAOD,GAAAA,CAAAA;AAC5B,EAAA;AAEA,EAAA,IAAIE,kBAAAA;AACJ,EAAA,IAAIV,wBAAAA,KAA6B,IAAA,IAAQC,oBAAAA,KAAyB,IAAA,EAAM;AACpE,IAAA,MAAMU,aAAaX,wBAAAA,CACdY,KAAAA,CAAM,GAAA,CAAA,CACNC,GAAAA,CAAI,CAACC,CAAAA,KAAMA,CAAAA,CAAEC,MAAI,CAAGC,WAAAA,EAAW,CAAA,CAC/BC,MAAAA,CAAO,CAACH,CAAAA,KAAMA,CAAAA,CAAEI,SAAS,CAAA,CAAA;AAC9B,IAAA,IAAIP,UAAAA,CAAWO,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,IAAItB,MACN,2EAAA,CAAA;AAER,IAAA;AACA,IAAA,KAAA,MAAWuB,aAAaR,UAAAA,EAAY;AAChC,MAAA,IAAI,CAACQ,SAAAA,CAAUC,UAAAA,CAAW,IAAA,CAAA,EAAO;AAC7B,QAAA,MAAM,IAAIxB,MACN,CAAA,yEAAA,EAA4EuB,SAAAA,CAAUE,MAAM,CAAA,EAAG,EAAA,CAAA,CAAA,GAAA,CAAQ,CAAA;AAE/G,MAAA;AACJ,IAAA;AAEA,IAAA,MAAMC,MAAAA,GAASC,OAAOtB,oBAAAA,CAAAA;AACtB,IAAA,IAAI,CAACsB,MAAAA,CAAOC,SAAAA,CAAUF,MAAAA,CAAAA,IAAWA,SAAS,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI1B,KAAAA,CACN,CAAA,sEAAA,EAAyEK,oBAAAA,CAAAA,CAAsB,CAAA;AAEvG,IAAA;AACA,IAAA,IAAIqB,MAAAA,GAASX,WAAWO,MAAAA,EAAQ;AAC5B,MAAA,MAAM,IAAItB,KAAAA,CACN,CAAA,qCAAA,EAAwC0B,MAAAA,CAAAA,wBAAAA,EAAiCX,UAAAA,CAAWO,MAAM,CAAA,CAAE,CAAA;AAEpG,IAAA;AACAR,IAAAA,kBAAAA,GAAqB;AACjBC,MAAAA,UAAAA;AACAW,MAAAA;AACJ,KAAA;EACJ,CAAA,MAAA,IAAWtB,wBAAAA,KAA6B,IAAA,IAAQC,oBAAAA,KAAyB,IAAA,EAAM;AAC3E,IAAA,MAAM,IAAIL,MACN,sFAAA,CAAA;AAER,EAAA;AAEA,EAAA,MAAM6B,aAAalC,GAAAA,CAAImC,QAAAA,EAAQ,CAAGC,OAAAA,CAAQ,OAAO,EAAA,CAAA;AAEjD,EAAA,MAAMC,MAAAA,GACF1B,QAAAA,IAAYE,QAAAA,IAAYC,YAAAA,GAClB;AAAEH,IAAAA,QAAAA;AAAUE,IAAAA,QAAAA;AAAUC,IAAAA,YAAAA;AAAcC,IAAAA,KAAAA;AAAOC,IAAAA;GAAS,GACpDJ,MAAAA;AAEV,EAAA,OAAO;AACHsB,IAAAA,UAAAA;AACAhC,IAAAA,YAAAA;AACAI,IAAAA,MAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA,YAAAA;AACAW,IAAAA,kBAAAA;AACAkB,IAAAA;AACJ,GAAA;AACJ;AAlGgBvC,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAsHT,SAASwC,oBAAAA,CAAqB,EACjCvC,GAAAA,EACAwC,OAAAA,EAAO,EACmB;AAC1B,EAAA,MAAMC,MAAAA,GAAS1C,eAAeC,GAAAA,CAAAA;AAE9B,EAAA,MAAM0C,aAAAA,GAAgBC,mBAAAA,CAAoBF,MAAAA,EAAQD,OAAAA,CAAAA;AAGlD,EAAA,MAAMI,aAAAA,GAAgB,IAAIC,aAAAA,CAAc;AACpCC,IAAAA,QAAAA,EAAUL,MAAAA,CAAON,UAAAA;IACjBY,WAAAA,kBAAa,MAAA,CAAA,MAAML,aAAAA,CAAcM,QAAAA,EAAQ,EAA5B,aAAA;GACjB,CAAA;AACA,EAAA,MAAMC,MAAAA,GAAS,IAAIC,YAAAA,CAAaN,aAAAA,EAAeH,OAAOlC,MAAM,CAAA;AAG5D,EAAA,MAAM4C,UAAAA,GAAa,IAAIC,gBAAAA,CAAiB;AACpCC,IAAAA,IAAAA,EAAMZ,MAAAA,CAAOtC,YAAAA;AACbuC,IAAAA;GACJ,CAAA;AAEA,EAAA,OAAO;AACHO,IAAAA,MAAAA;AACAE,IAAAA,UAAAA;AACAT,IAAAA,aAAAA;AACAlC,IAAAA,SAAAA,EAAWiC,MAAAA,CAAOjC,SAAAA;AAClBC,IAAAA,YAAAA,EAAcgC,MAAAA,CAAOhC,YAAAA;AACrBW,IAAAA,kBAAAA,EAAoBqB,MAAAA,CAAOrB;AAC/B,GAAA;AACJ;AA7BgBmB,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AA+BhB,SAASI,mBAAAA,CAAoBF,QAAyBD,OAAAA,EAAgB;AAClE,EAAA,IAAIA,OAAAA,EAAS;AACT,IAAA,OAAO,IAAIc,kBAAAA,CAAmB;AAC1B/C,MAAAA,MAAAA,EAAQkC,MAAAA,CAAOlC,MAAAA;AACfgD,MAAAA,KAAAA,EAAO,EAAA;MACPC,KAAAA,EAAO;KACX,CAAA;AACJ,EAAA;AAGA,EAAA,IAAI,CAACf,OAAOH,MAAAA,EAAQ;AAChB,IAAA,MAAM,IAAIhC,MACN,uGAAA,CAAA;AAER,EAAA;AAEA,EAAA,OAAO,IAAImD,8BAAAA,CAA+BhB,MAAAA,CAAOH,MAAM,CAAA;AAC3D;AAjBSK,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA","file":"HNZRSDTR.js","sourcesContent":["import {\n ClientCredentialsTokenProvider,\n type ClientCredentialsTokenProviderConfig,\n} from './auth/client-credentials-token-provider';\nimport { LocalTokenProvider } from './auth/local-token-provider';\nimport type { TokenProvider } from './auth/token-provider';\nimport { CantonClient } from './client/canton-client';\nimport { CantonGrpcClient } from './client/grpc';\nimport type { ICantonClient } from './client/interface';\nimport { Configuration } from './open-api/runtime';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Type\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Composite provider for Canton — bundles both transport layers and shared auth.\n *\n * - {@link client} — JSON Ledger API (commands, queries, updates)\n * - {@link grpcClient} — gRPC Admin API (topology transactions, namespace queries)\n * - {@link tokenProvider} — Shared Bearer-token source used by both transports\n */\nexport type CantonProvider = {\n client: ICantonClient;\n grpcClient: CantonGrpcClient;\n tokenProvider: TokenProvider;\n /** Validator wallet URL for scan-proxy CIP-56 endpoints. Required. */\n walletUrl: string;\n /** LayerZero sequencer base URL (e.g. \"http://localhost:8080\"); vApp JSON-RPC at `/vapp`. Required. */\n sequencerUrl: string;\n /** Sequencer validator pubkeys plus quorum for verifying signed read responses. */\n sequencerCommittee?: SequencerCommittee;\n};\n\n/**\n * Client-side committee config for secp256k1 sequencer read verification.\n * Pubkeys must be hex-encoded with `0x` prefix in the same format returned by\n * `recoverSecp256k1PublicKey`.\n */\nexport type SequencerCommittee = {\n publicKeys: `0x${string}`[];\n quorum: number;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// URI Parsing\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type CantonUriParams = {\n /** Base URL of the JSON Ledger API (e.g. \"http://localhost:5975\") */\n jsonApiUrl: string;\n /** Host:port of the gRPC Admin API (e.g. \"localhost:5076\") */\n adminApiHost: string;\n /** Ledger API user ID (default: \"participant_admin\") */\n userId: string;\n /** Validator wallet URL for scan-proxy CIP-56 endpoints (e.g. \"http://localhost:7201\"). Required. */\n walletUrl: string;\n /** LayerZero sequencer base URL (e.g. \"http://localhost:8080\"); vApp JSON-RPC at `/vapp`. Required. */\n sequencerUrl: string;\n /** Sequencer committee config parsed from the provider URI. */\n sequencerCommittee?: SequencerCommittee;\n /** OAuth2 client credentials config — present only for non-local environments */\n oauth2?: ClientCredentialsTokenProviderConfig;\n};\n\n/**\n * Parse a Canton provider URI into its constituent parts.\n *\n * URI format:\n * `<json-api-base>?admin-api=<host:port>&user-id=<id>[&token-url=...&client-id=...&client-secret=...&scope=...&audience=...]`\n *\n * The base URL (everything before the query string) is the JSON Ledger API endpoint.\n * Canton-specific params are extracted and removed; any remaining query params are\n * preserved on the JSON API URL.\n */\nexport function parseCantonUri(uri: string): CantonUriParams {\n const url = new URL(uri);\n\n const adminApiHost = url.searchParams.get('admin-api');\n if (!adminApiHost) {\n throw new Error('Canton provider URI missing required \"admin-api\" query parameter');\n }\n\n const userId = url.searchParams.get('user-id') ?? 'participant_admin';\n const walletUrl = url.searchParams.get('wallet-url');\n if (!walletUrl) {\n throw new Error('Canton provider URI missing required \"wallet-url\" query parameter');\n }\n const sequencerUrl = url.searchParams.get('sequencer-url');\n if (!sequencerUrl) {\n throw new Error('Canton provider URI missing required \"sequencer-url\" query parameter');\n }\n const sequencerValidatorsParam = url.searchParams.get('sequencer-validators');\n const sequencerQuorumParam = url.searchParams.get('sequencer-quorum');\n const tokenUrl = url.searchParams.get('token-url') ?? undefined;\n const clientId = url.searchParams.get('client-id') ?? undefined;\n const clientSecret = url.searchParams.get('client-secret') ?? undefined;\n const scope = url.searchParams.get('scope') ?? undefined;\n const audience = url.searchParams.get('audience') ?? undefined;\n\n // Remove Canton params to get clean JSON API URL\n for (const key of [\n 'admin-api',\n 'user-id',\n 'wallet-url',\n 'sequencer-url',\n 'sequencer-validators',\n 'sequencer-quorum',\n 'token-url',\n 'client-id',\n 'client-secret',\n 'scope',\n 'audience',\n ]) {\n url.searchParams.delete(key);\n }\n\n let sequencerCommittee: SequencerCommittee | undefined;\n if (sequencerValidatorsParam !== null && sequencerQuorumParam !== null) {\n const publicKeys = sequencerValidatorsParam\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter((s) => s.length > 0);\n if (publicKeys.length === 0) {\n throw new Error(\n 'Canton provider URI sequencer-validators must contain at least one pubkey',\n );\n }\n for (const publicKey of publicKeys) {\n if (!publicKey.startsWith('0x')) {\n throw new Error(\n `Canton provider URI sequencer-validators pubkey must start with 0x, got: ${publicKey.slice(0, 10)}...`,\n );\n }\n }\n\n const quorum = Number(sequencerQuorumParam);\n if (!Number.isInteger(quorum) || quorum < 1) {\n throw new Error(\n `Canton provider URI sequencer-quorum must be a positive integer, got: ${sequencerQuorumParam}`,\n );\n }\n if (quorum > publicKeys.length) {\n throw new Error(\n `Canton provider URI sequencer-quorum=${quorum} exceeds committee size ${publicKeys.length}`,\n );\n }\n sequencerCommittee = {\n publicKeys: publicKeys as `0x${string}`[],\n quorum,\n };\n } else if (sequencerValidatorsParam !== null || sequencerQuorumParam !== null) {\n throw new Error(\n 'Canton provider URI must set both sequencer-validators and sequencer-quorum together',\n );\n }\n\n const jsonApiUrl = url.toString().replace(/\\/$/, '');\n\n const oauth2 =\n tokenUrl && clientId && clientSecret\n ? { tokenUrl, clientId, clientSecret, scope, audience }\n : undefined;\n\n return {\n jsonApiUrl,\n adminApiHost,\n userId,\n walletUrl,\n sequencerUrl,\n sequencerCommittee,\n oauth2,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type CreateCantonProviderOptions = {\n /** Raw provider URI (from provider config) */\n uri: string;\n /** When true, uses LocalTokenProvider (self-signed JWTs) instead of OAuth2 */\n isLocal: boolean;\n};\n\n/**\n * Create a {@link CantonProvider} from a provider URI.\n *\n * - **isLocal=true**: Uses {@link LocalTokenProvider} with admin-level access (self-signed JWTs).\n * - **isLocal=false**: Uses {@link ClientCredentialsTokenProvider} with OAuth2 client\n * credentials extracted from the URI query parameters.\n */\nexport function createCantonProvider({\n uri,\n isLocal,\n}: CreateCantonProviderOptions): CantonProvider {\n const params = parseCantonUri(uri);\n\n const tokenProvider = createTokenProvider(params, isLocal);\n\n // ── JSON Ledger API Client ──────────────────────────────────────────\n const configuration = new Configuration({\n basePath: params.jsonApiUrl,\n accessToken: () => tokenProvider.getToken(),\n });\n const client = new CantonClient(configuration, params.userId);\n\n // ── gRPC Admin API Client ───────────────────────────────────────────\n const grpcClient = new CantonGrpcClient({\n host: params.adminApiHost,\n tokenProvider,\n });\n\n return {\n client,\n grpcClient,\n tokenProvider,\n walletUrl: params.walletUrl,\n sequencerUrl: params.sequencerUrl,\n sequencerCommittee: params.sequencerCommittee,\n };\n}\n\nfunction createTokenProvider(params: CantonUriParams, isLocal: boolean): TokenProvider {\n if (isLocal) {\n return new LocalTokenProvider({\n userId: params.userId,\n actAs: [],\n admin: true,\n });\n }\n\n // TODO(canton): add other prod auth methods (direct JWT passthrough, etc.).\n if (!params.oauth2) {\n throw new Error(\n 'Canton provider requires OAuth2 credentials (token-url, client-id, client-secret) in the provider URI',\n );\n }\n\n return new ClientCredentialsTokenProvider(params.oauth2);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client/canton-client.ts"],"names":["CantonClient","config","userId","DefaultApi","obj","key","undefined","pascal","charAt","toUpperCase","slice","camel","toLowerCase","err","resp","response","json","catch","context","body","CantonProtocolError","JSON","stringify","parties","includeCreatedEventBlob","Object","fromEntries","map","p","cumulative","identifierFilter","wildcardFilter","value","event","contractId","templateId","createdEventBlob","preparedTransaction","preparedTransactionHash","hashingSchemeVersion","connectedSynchronizers","getV2StateConnectedSynchronizers","synchronizers","s","synchronizerId","filter","id","once","CantonTransportError","uploadDar","dar","opts","bytes","byteOffset","byteLength","buffer","Blob","type","request","vetAllPackages","postV2Dars","skipIfVetted","code","skipped","reason","details","validateDar","then","postV2DarsValidate","listParties","getV2Parties","pageSize","pageToken","partyDetails","party","nextPageToken","listUserRights","apiResponse","getV2UsersUserIdRightsRaw","raw","rights","listUserParties","Set","right","kind","CanActAs","CanReadAs","add","allocateParty","partyIdHint","postV2Parties","allocatePartyRequest","identityProviderId","getPackageId","packageName","getPreferredPackagesRequest","packageVettingRequirements","postV2InteractiveSubmissionPreferredPackages","packageRef","packageReferences","find","ref","packageId","submit","actors","commands","commandId","randomUUID","ledgerEndResponse","getV2StateLedgerEnd","completionOffset","offset","jsCommands","actAs","readAs","disclosedContracts","postV2CommandsAsyncSubmit","waitForCommand","timeoutMs","poll","limit","streamIdleTimeoutMs","initialBackoffMs","backoffMs","initial","maxBackoffMs","max","beginExclusive","currentBackoff","deadline","Date","now","completionStreamRequest","rawResponse","postV2CommandsCompletionsRaw","responseText","text","completions","parse","item","normalized","completionResponse","offsetCheckpoint","checkpoint","checkpointOffset","Math","completionWrapper","completion","completionCommandId","status","updateId","error","message","remainingTime","sleepTime","min","Promise","resolve","setTimeout","lastCheckedOffset","getEventsByContractIdRequest","eventFormat","filtersByParty","verbose","postV2EventsEventsByContractId","archived","created","createdEvent","createDisclosure","validated","fetchContractById","fetchEventsByContractId","archivedEvent","fetchTransactionByUpdateId","postV2UpdatesUpdateByIdRaw","getUpdateByIdRequest","updateFormat","updateResponse","fetchTransactionByOffset","postV2UpdatesUpdateByOffsetRaw","getUpdateByOffsetRequest","prepareForSigning","jsPrepareSubmissionRequest","verboseHashing","packageIdSelectionPreference","postV2InteractiveSubmissionPrepare","submitSigned","prepared","signatures","jsExecuteSubmissionRequest","partySignatures","sig","format","signature","signedBy","signingAlgorithmSpec","deduplicationPeriod","deduplicationDuration","seconds","nanos","submissionId","postV2InteractiveSubmissionExecute","getLedgerEndOffset","queryActiveContracts","queryActiveContractsByParties","templateIds","cumulativeFilter","postV2StateActiveContractsRaw","getActiveContractsRequest","activeAtOffset","rawJson","contractEntry","JsActiveContract","contract","JsActiveContractFromJSON","getUpdates","endInclusive","postV2UpdatesRaw","getUpdatesRequest","includeTransactions","transactionShape","updateResponses","update","length","templateFilter","notFoundMessage","Transaction"],"mappings":"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","file":"JV2DWUBW.js","sourcesContent":["import type { ContractId } from '@daml/types';\nimport { once } from 'es-toolkit';\nimport { randomUUID } from 'node:crypto';\n\nimport { CantonProtocolError, CantonTransportError } 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} 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 } from '../open-api/runtime';\nimport type {\n ExternalSignature,\n PreparedTransaction,\n SubmitActors,\n SubmitResult,\n UserRight,\n WaitOptions,\n WaitResult,\n} from '../types';\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\n constructor(config: Configuration, userId: string = 'participant_admin') {\n this.#api = new DefaultApi(config);\n this.#userId = userId;\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 * Try to extract error body from API response.\n * Returns the parsed body or null if extraction fails.\n */\n async #extractErrorBody(err: unknown): Promise<Record<string, unknown> | null> {\n if (err && typeof err === 'object' && 'response' in err) {\n const resp = (err as { response: Response }).response;\n if (resp && typeof resp.json === 'function') {\n return (await resp.json().catch(() => null)) as Record<string, unknown> | null;\n }\n }\n return null;\n }\n\n /**\n * Throw a CantonProtocolError with extracted error details from API response.\n * Handles the common pattern of extracting JSON error details from failed requests.\n *\n * @param err - The caught error\n * @param context - Description of the operation (e.g., \"DAR upload\", \"Party allocation\")\n * @throws CantonProtocolError with extracted error details, or re-throws original error\n */\n async #throwApiError(err: unknown, context: string): Promise<never> {\n const body = await this.#extractErrorBody(err);\n if (body) {\n throw new CantonProtocolError(`${context} failed: ${JSON.stringify(body)}`);\n }\n throw err;\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.#api.getV2StateConnectedSynchronizers();\n const synchronizers = response.connectedSynchronizers ?? [];\n return synchronizers.map((s) => s.synchronizerId).filter((id): id is string => !!id);\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.#api.postV2Dars(request);\n } catch (err: unknown) {\n // If skipIfVetted, treat KNOWN_PACKAGE_VERSION as a no-op success\n if (opts.skipIfVetted) {\n const body = await this.#extractErrorBody(err);\n if (body) {\n if (body.code === 'KNOWN_PACKAGE_VERSION') {\n return { skipped: true, reason: 'already_vetted', details: body };\n }\n throw new CantonProtocolError(`DAR upload failed: ${JSON.stringify(body)}`);\n }\n }\n throw await this.#throwApiError(err, 'DAR upload');\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.#api.postV2DarsValidate({ ...request, synchronizerId }),\n );\n }\n\n return 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.#api.getV2Parties({\n pageSize: opts.pageSize,\n pageToken: opts.pageToken,\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.#api.getV2UsersUserIdRightsRaw({\n userId: this.#userId,\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 let response;\n try {\n response = await this.#api.postV2Parties({\n allocatePartyRequest: {\n partyIdHint,\n synchronizerId,\n userId: opts.userId ?? '',\n identityProviderId: opts.identityProviderId ?? '',\n },\n });\n } catch (err: unknown) {\n throw await this.#throwApiError(err, 'Party allocation');\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 * 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 let response;\n try {\n response = await this.#api.postV2InteractiveSubmissionPreferredPackages(request);\n } catch (err: unknown) {\n throw await this.#throwApiError(err, 'Package lookup');\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 ledgerEndResponse = await this.#api.getV2StateLedgerEnd();\n const completionOffset = ledgerEndResponse.offset;\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 try {\n await this.#api.postV2CommandsAsyncSubmit(request);\n } catch (err: unknown) {\n throw await this.#throwApiError(err, 'Command submission');\n }\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.#api.postV2CommandsCompletionsRaw(request);\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 // ─────────────────────────────────────────────────────────────────────────\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 ): Promise<CreatedEvent | undefined> {\n const request: PostV2EventsEventsByContractIdRequest = {\n getEventsByContractIdRequest: {\n contractId,\n eventFormat: {\n filtersByParty: this.#buildPartyFilters(parties, includeCreatedEventBlob),\n verbose: false,\n },\n },\n };\n\n const response = await this.#api.postV2EventsEventsByContractId(request);\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<DisclosedContract | 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 ): Promise<CreatedEvent | undefined> {\n return this.#fetchActiveContractEvent(contractId, parties, false);\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.#api.postV2EventsEventsByContractId(request);\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.#api.postV2UpdatesUpdateByIdRaw({\n getUpdateByIdRequest: {\n updateId,\n updateFormat: this.#buildUpdateFormat(parties),\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.#api.postV2UpdatesUpdateByOffsetRaw({\n getUpdateByOffsetRequest: {\n offset,\n updateFormat: this.#buildUpdateFormat(parties),\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 async prepareForSigning(\n actors: SubmitActors,\n commands: Command[],\n opts: { disclosedContracts?: DisclosedContract[]; commandId?: string } = {},\n ): Promise<PreparedTransaction> {\n const synchronizerId = await this.#ensureSynchronizerId();\n const commandId = opts.commandId ?? randomUUID();\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 packageIdSelectionPreference: [],\n },\n };\n\n let response;\n try {\n response = await this.#api.postV2InteractiveSubmissionPrepare(request);\n } catch (error: unknown) {\n throw await this.#throwApiError(error, 'Interactive submission prepare');\n }\n const validated = this.#validatePrepareResponse(response);\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,\n signatures: ExternalSignature[],\n ): Promise<SubmitResult> {\n // Snapshot ledger end so the caller can poll for completion from this point\n const ledgerEndResponse = await this.#api.getV2StateLedgerEnd();\n const completionOffset = ledgerEndResponse.offset;\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 try {\n await this.#api.postV2InteractiveSubmissionExecute(request);\n } catch (error: unknown) {\n throw await this.#throwApiError(error, 'Interactive submission execute');\n }\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.#api.getV2StateLedgerEnd();\n return response.offset;\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 */\n async queryActiveContracts(\n party: string,\n offset: number,\n opts?: { templateIds?: string[]; limit?: number },\n ): Promise<JsActiveContract[]> {\n return this.queryActiveContractsByParties([party], offset, opts?.templateIds ?? [], {\n limit: opts?.limit,\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 */\n async queryActiveContractsByParties(\n parties: string[],\n offset: number,\n templateIds: string[],\n opts?: { limit?: number },\n ): Promise<JsActiveContract[]> {\n const cumulativeFilter = this.#buildCumulativeFilters(templateIds);\n const filtersByParty = Object.fromEntries(\n parties.map((party) => [party, { cumulative: cumulativeFilter }]),\n );\n\n const rawResponse = await this.#api.postV2StateActiveContractsRaw({\n getActiveContractsRequest: {\n filter: { filtersByParty },\n verbose: true,\n activeAtOffset: offset,\n },\n limit: opts?.limit,\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.#api.postV2UpdatesRaw({\n getUpdatesRequest: {\n beginExclusive,\n endInclusive,\n verbose: false,\n updateFormat: {\n includeTransactions: {\n eventFormat,\n transactionShape: 'TRANSACTION_SHAPE_LEDGER_EFFECTS' as const,\n },\n },\n },\n limit: opts?.limit,\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(templateIds?: string[]): CumulativeFilter[] {\n if (templateIds?.length) {\n return templateIds.map((templateId) => ({\n identifierFilter: {\n templateFilter: { value: { templateId, includeCreatedEventBlob: false } },\n },\n }));\n }\n return [\n { identifierFilter: { wildcardFilter: { value: { includeCreatedEventBlob: false } } } },\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/transaction.ts"],"names":["cantonCommandSchema","z","union","object","createCommand","templateId","string","createArguments","any","exerciseCommand","contractId","choice","choiceArgument","createAndExerciseCommand","exerciseByKeyCommand","contractKey","cantonDisclosedContractSchema","optional","createdEventBlob","synchronizerId","cantonTransactionSchema","transactionSchema","extend","populatedTransaction","unresolvedCommands","array","unresolvedDisclosedContracts","actAs","partyToSenderEntity","record","cantonInflightTransactionSchema","preparedTransaction","preparedTransactionHash","hashingSchemeVersion","enum","commandId","completionOffset","number","cantonAssignedTransactionSchema","assignedTransactionSchema","shape","inflightTransaction","cantonSignedTransactionSchema","signedTransactionSchema","commands","disclosedContracts","signedTransaction","signatures","party","format","signature","signedBy","signingAlgorithmSpec","cantonMinedTransactionSchema","minedTransactionSchema","buildCantonTransaction","chainName","tx","timestamps","created","Date","now"],"mappings":"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","file":"PSB6BQFH.js","sourcesContent":["import { z } from 'zod';\n\nimport {\n assignedTransactionSchema,\n minedTransactionSchema,\n signedTransactionSchema,\n transactionSchema,\n} from '@layerzerolabs/common-chain-model';\nimport type { PartialBy } from '@layerzerolabs/typescript-utils';\n\n// === Component schemas ===\n\nexport const cantonCommandSchema = z.union([\n z.object({\n createCommand: z.object({\n templateId: z.string(),\n createArguments: z.any(),\n }),\n }),\n z.object({\n exerciseCommand: z.object({\n templateId: z.string(),\n contractId: z.string(),\n choice: z.string(),\n choiceArgument: z.any(),\n }),\n }),\n z.object({\n createAndExerciseCommand: z.object({\n templateId: z.string(),\n createArguments: z.any(),\n choice: z.string(),\n choiceArgument: z.any(),\n }),\n }),\n z.object({\n exerciseByKeyCommand: z.object({\n templateId: z.string(),\n contractKey: z.any(),\n choice: z.string(),\n choiceArgument: z.any(),\n }),\n }),\n]);\n\nexport const cantonDisclosedContractSchema = z.object({\n templateId: z.string().optional(),\n contractId: z.string(),\n createdEventBlob: z.string(),\n synchronizerId: z.string(),\n});\n\n// === Lifecycle schemas ===\n\n/**\n * Canton transaction schema for Daml Ledger API commands.\n */\nexport const cantonTransactionSchema = transactionSchema.extend({\n populatedTransaction: z.object({\n unresolvedCommands: z.array(cantonCommandSchema),\n unresolvedDisclosedContracts: z.array(cantonDisclosedContractSchema),\n\n /** Parties submitting the command (actAs) */\n actAs: z.array(z.string()),\n /** Maps each actAs party → the senderEntityName(s) controlling its signing\n * key(s), always as an array. `.optional()` only so deferred-sender create-time\n * payloads parse; by sign time every actAs party must map, or signing throws.\n * Multiple entries = a multisig party (decentralized namespace) whose keys must\n * all sign. */\n partyToSenderEntity: z.record(z.string(), z.array(z.string())).optional(),\n }),\n});\n\nconst cantonInflightTransactionSchema = z.object({\n /** The prepared transaction blob */\n preparedTransaction: z.string(),\n /** Hash of the prepared transaction (what was signed) */\n preparedTransactionHash: z.string(),\n /** Hashing scheme version used */\n hashingSchemeVersion: z.enum([\n 'HASHING_SCHEME_VERSION_UNSPECIFIED',\n 'HASHING_SCHEME_VERSION_V2',\n ]),\n /** Command ID for tracking */\n commandId: z.string(),\n // Ledger offset at which the submission landed — used as `beginExclusive`\n // for waitForCommand to avoid polling from the start of the ledger.\n // Optional: only present after send(); absent for old/retry scenarios.\n completionOffset: z.number().optional(),\n});\n\n/**\n * Assigned transaction includes the inflight transaction data.\n */\nexport const cantonAssignedTransactionSchema = assignedTransactionSchema.extend({\n ...cantonTransactionSchema.shape,\n inflightTransaction: cantonInflightTransactionSchema.optional(),\n});\n\n/**\n * Signed transaction includes the DER-encoded ECDSA signature.\n */\nexport const cantonSignedTransactionSchema = signedTransactionSchema.extend({\n ...cantonAssignedTransactionSchema.shape,\n // Resolved commands and contracts\n commands: z.array(cantonCommandSchema),\n disclosedContracts: z.array(cantonDisclosedContractSchema),\n signedTransaction: z.object({\n /** Per-party signatures in the format expected by Canton's submitSigned */\n signatures: z.array(\n z.object({\n party: z.string(),\n signatures: z.array(\n z.object({\n format: z.string(),\n signature: z.string(),\n signedBy: z.string(),\n signingAlgorithmSpec: z.string(),\n }),\n ),\n }),\n ),\n }),\n});\n\n/**\n * Mined transaction with confirmation result.\n */\nexport const cantonMinedTransactionSchema = minedTransactionSchema.extend({\n ...cantonSignedTransactionSchema.shape,\n inflightTransaction: cantonInflightTransactionSchema,\n});\n\n// === Types ===\n\nexport type CantonTx = z.infer<typeof cantonTransactionSchema>;\nexport type CantonAssignedTx = z.infer<typeof cantonAssignedTransactionSchema>;\nexport type CantonSignedTx = z.infer<typeof cantonSignedTransactionSchema>;\nexport type CantonMinedTx = z.infer<typeof cantonMinedTransactionSchema>;\n\n// === Builder ===\n\nexport type BuildCantonTransactionInput = PartialBy<CantonTx, 'chainName' | 'timestamps'>;\n\nexport const buildCantonTransaction = async (\n chainName: string,\n tx: BuildCantonTransactionInput,\n): Promise<CantonTx> => {\n return {\n ...tx,\n chainName,\n timestamps: {\n created: tx.timestamps?.created ?? Date.now(),\n },\n };\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client/utils.ts"],"names":["extractTransactions","updates","flatMap","update","Transaction","value","SECP256K1_SPKI_DER_HEADER","Uint8Array","HASH_PURPOSE_PUBLIC_KEY_FINGERPRINT","MULTIHASH_SHA256_PREFIX","computeCantonFingerprint","uncompressedPublicKey","publicKeyDer","length","set","purposePrefix","DataView","buffer","setUint32","hash","createHash","digest","result","Buffer","from","toString"],"mappings":";;;AAQO,SAASA,oBAAoBC,OAAAA,EAAuB;AACvD,EAAA,OAAOA,OAAAA,CAAQC,OAAAA,CAAQ,CAACC,MAAAA,KAAY,iBAAiBA,MAAAA,GAAS;AAACA,IAAAA,MAAAA,CAAOC,WAAAA,CAAYC;AAAS,GAAA,GAAA,EAAE,CAAA;AACjG;AAFgBL,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAKhB,IAAMM,yBAAAA,GAA4B,IAAIC,UAAAA,CAAW;AAC7C,EAAA,EAAA;AAAM,EAAA,EAAA;AAAM,EAAA,EAAA;AAAM,EAAA,EAAA;AAAM,EAAA,CAAA;AAAM,EAAA,CAAA;AAAM,EAAA,EAAA;AAAM,EAAA,GAAA;AAAM,EAAA,EAAA;AAAM,EAAA,GAAA;AAAM,EAAA,EAAA;AAAM,EAAA,CAAA;AAAM,EAAA,CAAA;AAAM,EAAA,CAAA;AAAM,EAAA,CAAA;AAAM,EAAA,EAAA;AAC1F,EAAA,GAAA;AAAM,EAAA,CAAA;AAAM,EAAA,CAAA;AAAM,EAAA,EAAA;AAAM,EAAA,CAAA;AAAM,EAAA,EAAA;AAAM,EAAA;AACvC,CAAA,CAAA;AAED,IAAMC,mCAAAA,GAAsC,EAAA;AAC5C,IAAMC,uBAAAA,GAA0B,IAAIF,UAAAA,CAAW;AAAC,EAAA,EAAA;AAAM,EAAA;AAAK,CAAA,CAAA;AAMpD,SAASG,yBAAyBC,qBAAAA,EAAiC;AACtE,EAAA,MAAMC,eAAe,IAAIL,UAAAA,CACrBD,yBAAAA,CAA0BO,MAAAA,GAASF,sBAAsBE,MAAM,CAAA;AAEnED,EAAAA,YAAAA,CAAaE,IAAIR,yBAAAA,CAAAA;AACjBM,EAAAA,YAAAA,CAAaE,GAAAA,CAAIH,qBAAAA,EAAuBL,yBAAAA,CAA0BO,MAAM,CAAA;AAExE,EAAA,MAAME,aAAAA,GAAgB,IAAIR,UAAAA,CAAW,CAAA,CAAA;AACrC,EAAA,IAAIS,SAASD,aAAAA,CAAcE,MAAM,CAAA,CAAEC,SAAAA,CAAU,GAAGV,mCAAAA,CAAAA;AAEhD,EAAA,MAAMW,IAAAA,GAAOC,UAAAA,CAAW,QAAA,CAAA,CAAUjB,MAAAA,CAAOY,aAAAA,CAAAA,CAAeZ,MAAAA,CAAOS,YAAAA,CAAAA,CAAcS,MAAAA,EAAM;AAEnF,EAAA,MAAMC,SAAS,IAAIf,UAAAA,CAAWE,uBAAAA,CAAwBI,MAAAA,GAASM,KAAKN,MAAM,CAAA;AAC1ES,EAAAA,MAAAA,CAAOR,IAAIL,uBAAAA,CAAAA;AACXa,EAAAA,MAAAA,CAAOR,GAAAA,CAAIK,IAAAA,EAAMV,uBAAAA,CAAwBI,MAAM,CAAA;AAE/C,EAAA,OAAOU,MAAAA,CAAOC,IAAAA,CAAKF,MAAAA,CAAAA,CAAQG,SAAS,KAAA,CAAA;AACxC;AAjBgBf,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA","file":"QHEXOE3Y.js","sourcesContent":["import { createHash } from 'node:crypto';\n\nimport type { CantonTransaction, CantonUpdate } from './interface';\n\n/**\n * Extract transactions from Canton updates.\n * Filters out checkpoints, reassignments, and topology transactions.\n */\nexport function extractTransactions(updates: CantonUpdate[]): CantonTransaction[] {\n return updates.flatMap((update) => ('Transaction' in update ? [update.Transaction.value] : []));\n}\n\n// DER header for secp256k1 SubjectPublicKeyInfo (23 bytes).\nconst SECP256K1_SPKI_DER_HEADER = new Uint8Array([\n 0x30, 0x56, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b,\n 0x81, 0x04, 0x00, 0x0a, 0x03, 0x42, 0x00,\n]);\n\nconst HASH_PURPOSE_PUBLIC_KEY_FINGERPRINT = 12;\nconst MULTIHASH_SHA256_PREFIX = new Uint8Array([0x12, 0x20]);\n\n/**\n * Computes the Canton fingerprint for an uncompressed secp256k1 public key.\n * DER-encodes the key, then computes hex(SHA-256 multihash of purpose=12 || publicKeyDer).\n */\nexport function computeCantonFingerprint(uncompressedPublicKey: Uint8Array): string {\n const publicKeyDer = new Uint8Array(\n SECP256K1_SPKI_DER_HEADER.length + uncompressedPublicKey.length,\n );\n publicKeyDer.set(SECP256K1_SPKI_DER_HEADER);\n publicKeyDer.set(uncompressedPublicKey, SECP256K1_SPKI_DER_HEADER.length);\n\n const purposePrefix = new Uint8Array(4);\n new DataView(purposePrefix.buffer).setUint32(0, HASH_PURPOSE_PUBLIC_KEY_FINGERPRINT);\n\n const hash = createHash('sha256').update(purposePrefix).update(publicKeyDer).digest();\n\n const result = new Uint8Array(MULTIHASH_SHA256_PREFIX.length + hash.length);\n result.set(MULTIHASH_SHA256_PREFIX);\n result.set(hash, MULTIHASH_SHA256_PREFIX.length);\n\n return Buffer.from(result).toString('hex');\n}\n"]}
@@ -1 +0,0 @@
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","fetchTransaction","updateId","fetchTransactionByUpdateId","fetchTransactionByOffset","offset","fetchEventsByContractId","createDisclosure","connectedSynchronizers","uploadDar","dar","validateDar","listParties","listUserParties","allocateParty","partyIdHint","getPackageId","packageName","getLedgerEndOffset","queryActiveContracts","party","normalizeActiveContract","contract","e","createdEvent","synchronizerId","queryActiveContractsByParties","templateIds","queryActiveContractsForParties","templateFilter","apiOpts","perPartyResults","Promise","all","map","partyId","seen","Set","result","contracts","c","cid","has","add","normalized","push"],"mappings":"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","file":"X66QZBHT.js","sourcesContent":["import type { Choice, ContractId, Party, Template } from '@daml/types';\n\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 {\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 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<DisclosedContract | undefined> {\n return this.#client.createDisclosure(contractId, parties);\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 },\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, 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"]}