@distrohelena/canton-typescript-sdk 0.1.4 → 0.1.6

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 (254) hide show
  1. package/README.md +333 -1
  2. package/dist/client/canton-client-options.d.ts +3 -0
  3. package/dist/client/canton-client-options.js +2 -0
  4. package/dist/client/service-registry.js +4 -3
  5. package/dist/core/errors/grpc-transport-error.d.ts +14 -0
  6. package/dist/core/errors/grpc-transport-error.js +76 -0
  7. package/dist/core/signing/sign-command-request.d.ts +4 -0
  8. package/dist/core/signing/sign-command-request.js +4 -0
  9. package/dist/core/signing/sign-command-result.d.ts +2 -0
  10. package/dist/core/signing/sign-command-result.js +9 -0
  11. package/dist/core/transports/transport.interface.d.ts +2 -2
  12. package/dist/core/types/canton-hash-purpose.d.ts +2 -1
  13. package/dist/core/types/canton-hash-purpose.js +1 -0
  14. package/dist/core/types/commands/create-and-exercise-command.js +1 -1
  15. package/dist/core/types/commands/exercise-by-key-command.js +2 -2
  16. package/dist/core/types/commands/exercise-command.js +2 -2
  17. package/dist/core/types/daml-numeric.d.ts +6 -0
  18. package/dist/core/types/daml-numeric.js +14 -0
  19. package/dist/core/types/daml-party.d.ts +6 -0
  20. package/dist/core/types/daml-party.js +14 -0
  21. package/dist/core/types/requests/create-decentralized-party-request.d.ts +41 -0
  22. package/dist/core/types/requests/create-decentralized-party-request.js +82 -0
  23. package/dist/core/types/requests/create-external-party-request.d.ts +42 -0
  24. package/dist/core/types/requests/create-external-party-request.js +47 -0
  25. package/dist/core/types/requests/finalize-decentralized-party-request.d.ts +39 -0
  26. package/dist/core/types/requests/finalize-decentralized-party-request.js +42 -0
  27. package/dist/core/types/requests/get-active-contracts-page-request.d.ts +15 -2
  28. package/dist/core/types/requests/get-active-contracts-page-request.js +4 -0
  29. package/dist/core/types/requests/submit-command-request.d.ts +2 -0
  30. package/dist/core/types/requests/submit-command-request.js +2 -0
  31. package/dist/core/types/topology/topology-signature-format.d.ts +2 -1
  32. package/dist/core/types/topology/topology-signature-format.js +1 -0
  33. package/dist/daml-lf/container/dar-archive-entry.d.ts +8 -0
  34. package/dist/daml-lf/container/dar-archive-entry.js +8 -0
  35. package/dist/daml-lf/container/dar-archive-loader.js +14 -0
  36. package/dist/daml-lf/container/dar-archive.d.ts +6 -0
  37. package/dist/daml-lf/container/dar-archive.js +4 -0
  38. package/dist/daml-lf/container/dar-source-bundle-loader.d.ts +5 -0
  39. package/dist/daml-lf/container/dar-source-bundle-loader.js +33 -0
  40. package/dist/daml-lf/container/dar-source-bundle.d.ts +45 -0
  41. package/dist/daml-lf/container/dar-source-bundle.js +11 -0
  42. package/dist/daml-lf/container/dar-source-file-entry.d.ts +8 -0
  43. package/dist/daml-lf/container/dar-source-file-entry.js +8 -0
  44. package/dist/daml-lf/daml-lf-compilation.d.ts +12 -0
  45. package/dist/daml-lf/daml-lf-compilation.js +35 -0
  46. package/dist/daml-lf/index.d.ts +11 -0
  47. package/dist/daml-lf/index.js +10 -0
  48. package/dist/daml-lf/interpreter/daml-lf-builtin-dispatch.d.ts +43 -0
  49. package/dist/daml-lf/interpreter/daml-lf-builtin-dispatch.js +933 -0
  50. package/dist/daml-lf/interpreter/daml-lf-evaluator.d.ts +95 -0
  51. package/dist/daml-lf/interpreter/daml-lf-evaluator.js +1131 -0
  52. package/dist/daml-lf/interpreter/daml-lf-interpreter-scaffold.d.ts +3 -0
  53. package/dist/daml-lf/interpreter/daml-lf-interpreter-scaffold.js +6 -1
  54. package/dist/daml-lf/interpreter/daml-lf-lexical-scope.d.ts +13 -0
  55. package/dist/daml-lf/interpreter/daml-lf-lexical-scope.js +46 -0
  56. package/dist/daml-lf/interpreter/daml-lf-runtime-frame.d.ts +16 -0
  57. package/dist/daml-lf/interpreter/daml-lf-runtime-frame.js +15 -0
  58. package/dist/daml-lf/interpreter/daml-lf-runtime-value.d.ts +21 -0
  59. package/dist/daml-lf/interpreter/daml-lf-runtime-value.js +4 -1
  60. package/dist/daml-lf/interpreter/daml-lf-step-kind.d.ts +7 -0
  61. package/dist/daml-lf/interpreter/daml-lf-step-kind.js +8 -0
  62. package/dist/daml-lf/interpreter/daml-lf-trace-sink.interface.d.ts +30 -0
  63. package/dist/daml-lf/interpreter/daml-lf-trace-sink.interface.js +1 -0
  64. package/dist/daml-lf/model/daml-lf-builtin-type.d.ts +3 -0
  65. package/dist/daml-lf/model/daml-lf-builtin-type.js +3 -0
  66. package/dist/daml-lf/model/daml-lf-choice.d.ts +5 -0
  67. package/dist/daml-lf/model/daml-lf-choice.js +4 -0
  68. package/dist/daml-lf/model/daml-lf-expression-path.d.ts +2 -0
  69. package/dist/daml-lf/model/daml-lf-expression-path.js +81 -0
  70. package/dist/daml-lf/model/daml-lf-expression.d.ts +146 -0
  71. package/dist/daml-lf/model/daml-lf-expression.js +71 -0
  72. package/dist/daml-lf/model/daml-lf-template.d.ts +2 -0
  73. package/dist/daml-lf/model/daml-lf-template.js +2 -0
  74. package/dist/daml-lf/model/daml-lf-type.d.ts +2 -0
  75. package/dist/daml-lf/model/daml-lf-type.js +4 -0
  76. package/dist/daml-lf/model/lf-2-model-mapper.d.ts +5 -0
  77. package/dist/daml-lf/model/lf-2-model-mapper.js +445 -12
  78. package/dist/debugger/errors/replay-determinism.exception.d.ts +3 -0
  79. package/dist/debugger/errors/replay-determinism.exception.js +3 -0
  80. package/dist/debugger/errors/replay-missing-package.exception.d.ts +3 -0
  81. package/dist/debugger/errors/replay-missing-package.exception.js +3 -0
  82. package/dist/debugger/errors/replay-missing-source.exception.d.ts +3 -0
  83. package/dist/debugger/errors/replay-missing-source.exception.js +3 -0
  84. package/dist/debugger/errors/replay-source-map.exception.d.ts +3 -0
  85. package/dist/debugger/errors/replay-source-map.exception.js +3 -0
  86. package/dist/debugger/errors/replay-state-hydration.exception.d.ts +3 -0
  87. package/dist/debugger/errors/replay-state-hydration.exception.js +3 -0
  88. package/dist/debugger/errors/replay-unsupported-lf-construct.exception.d.ts +3 -0
  89. package/dist/debugger/errors/replay-unsupported-lf-construct.exception.js +3 -0
  90. package/dist/debugger/errors/replay-unsupported-update.exception.d.ts +3 -0
  91. package/dist/debugger/errors/replay-unsupported-update.exception.js +3 -0
  92. package/dist/debugger/index.d.ts +31 -0
  93. package/dist/debugger/index.js +31 -0
  94. package/dist/debugger/ledger-replay-debugger-client.d.ts +31 -0
  95. package/dist/debugger/ledger-replay-debugger-client.js +53 -0
  96. package/dist/debugger/replay/ledger-replay-environment-builder.d.ts +95 -0
  97. package/dist/debugger/replay/ledger-replay-environment-builder.js +249 -0
  98. package/dist/debugger/replay/ledger-replay-session-loader.d.ts +78 -0
  99. package/dist/debugger/replay/ledger-replay-session-loader.js +565 -0
  100. package/dist/debugger/replay/replay-artifact-resolver.d.ts +30 -0
  101. package/dist/debugger/replay/replay-artifact-resolver.js +210 -0
  102. package/dist/debugger/replay/replay-determinism-validator.d.ts +12 -0
  103. package/dist/debugger/replay/replay-determinism-validator.js +161 -0
  104. package/dist/debugger/replay/replay-entrypoint-definition-resolver.d.ts +40 -0
  105. package/dist/debugger/replay/replay-entrypoint-definition-resolver.js +337 -0
  106. package/dist/debugger/replay/replay-entrypoint.d.ts +22 -0
  107. package/dist/debugger/replay/replay-entrypoint.js +14 -0
  108. package/dist/debugger/replay/replay-ledger-value-normalizer.d.ts +7 -0
  109. package/dist/debugger/replay/replay-ledger-value-normalizer.js +194 -0
  110. package/dist/debugger/replay/replay-update-loader.d.ts +24 -0
  111. package/dist/debugger/replay/replay-update-loader.js +94 -0
  112. package/dist/debugger/replay/replay-update-visibility-validator.d.ts +19 -0
  113. package/dist/debugger/replay/replay-update-visibility-validator.js +19 -0
  114. package/dist/debugger/session/in-memory-replay-session-store.d.ts +27 -0
  115. package/dist/debugger/session/in-memory-replay-session-store.js +109 -0
  116. package/dist/debugger/session/replay-phase.d.ts +7 -0
  117. package/dist/debugger/session/replay-phase.js +8 -0
  118. package/dist/debugger/session/replay-scope.d.ts +10 -0
  119. package/dist/debugger/session/replay-scope.js +10 -0
  120. package/dist/debugger/session/replay-session-metadata.d.ts +10 -0
  121. package/dist/debugger/session/replay-session-metadata.js +10 -0
  122. package/dist/debugger/session/replay-session-request.d.ts +6 -0
  123. package/dist/debugger/session/replay-session-request.js +10 -0
  124. package/dist/debugger/session/replay-session.d.ts +12 -0
  125. package/dist/debugger/session/replay-session.js +10 -0
  126. package/dist/debugger/session/replay-source-location.d.ts +17 -0
  127. package/dist/debugger/session/replay-source-location.js +16 -0
  128. package/dist/debugger/session/replay-stack-frame.d.ts +8 -0
  129. package/dist/debugger/session/replay-stack-frame.js +8 -0
  130. package/dist/debugger/session/replay-state-delta.d.ts +29 -0
  131. package/dist/debugger/session/replay-state-delta.js +24 -0
  132. package/dist/debugger/session/replay-step-advance-result.d.ts +24 -0
  133. package/dist/debugger/session/replay-step-advance-result.js +16 -0
  134. package/dist/debugger/session/replay-step.d.ts +30 -0
  135. package/dist/debugger/session/replay-step.js +24 -0
  136. package/dist/debugger/session/replay-value-preview.d.ts +8 -0
  137. package/dist/debugger/session/replay-value-preview.js +15 -0
  138. package/dist/debugger/source/daml-source-mapper.d.ts +12 -0
  139. package/dist/debugger/source/daml-source-mapper.js +21 -0
  140. package/dist/debugger/source/dar-source-map-metadata.d.ts +26 -0
  141. package/dist/debugger/source/dar-source-map-metadata.js +10 -0
  142. package/dist/debugger/source/source-coverage-validator.d.ts +8 -0
  143. package/dist/debugger/source/source-coverage-validator.js +16 -0
  144. package/dist/debugger/source/source-indexed-compilation.d.ts +45 -0
  145. package/dist/debugger/source/source-indexed-compilation.js +110 -0
  146. package/dist/debugger/source/source-mapping-precision.d.ts +5 -0
  147. package/dist/debugger/source/source-mapping-precision.js +4 -0
  148. package/dist/index.d.ts +20 -0
  149. package/dist/index.js +12 -0
  150. package/dist/query/cache/memory-query-cache.d.ts +9 -0
  151. package/dist/query/cache/memory-query-cache.js +24 -0
  152. package/dist/query/cache/query-cache-store.d.ts +5 -0
  153. package/dist/query/cache/query-cache-store.js +1 -0
  154. package/dist/query/canton-manager-options.d.ts +17 -0
  155. package/dist/query/canton-manager-options.js +1 -0
  156. package/dist/query/canton-manager.d.ts +11 -0
  157. package/dist/query/canton-manager.js +42 -0
  158. package/dist/query/errors/pqs-query-error.d.ts +10 -0
  159. package/dist/query/errors/pqs-query-error.js +11 -0
  160. package/dist/query/errors/pqs-schema-profile-error.d.ts +3 -0
  161. package/dist/query/errors/pqs-schema-profile-error.js +3 -0
  162. package/dist/query/errors/query-capability-error.d.ts +7 -0
  163. package/dist/query/errors/query-capability-error.js +10 -0
  164. package/dist/query/grpc/grpc-contract-query-client.d.ts +32 -0
  165. package/dist/query/grpc/grpc-contract-query-client.js +126 -0
  166. package/dist/query/model-types.d.ts +258 -0
  167. package/dist/query/model-types.js +14 -0
  168. package/dist/query/pqs/pqs-pool.d.ts +13 -0
  169. package/dist/query/pqs/pqs-pool.js +18 -0
  170. package/dist/query/pqs/pqs-query-client.d.ts +49 -0
  171. package/dist/query/pqs/pqs-query-client.js +324 -0
  172. package/dist/query/pqs/pqs-schema-profile.d.ts +25 -0
  173. package/dist/query/pqs/pqs-schema-profile.js +120 -0
  174. package/dist/query/pqs/pqs-sql-compiler.d.ts +7 -0
  175. package/dist/query/pqs/pqs-sql-compiler.js +132 -0
  176. package/dist/query/pqs/read-only-sql.d.ts +1 -0
  177. package/dist/query/pqs/read-only-sql.js +35 -0
  178. package/dist/query/query-client.d.ts +61 -0
  179. package/dist/query/query-client.js +1 -0
  180. package/dist/query/query-source.d.ts +4 -0
  181. package/dist/query/query-source.js +5 -0
  182. package/dist/services/commands/command-payload-builder.js +3 -3
  183. package/dist/services/commands/command-submission-pipeline.js +1 -7
  184. package/dist/services/party-management/decentralized-party-lifecycle.d.ts +6 -0
  185. package/dist/services/party-management/decentralized-party-lifecycle.js +82 -0
  186. package/dist/services/party-management/party-management-service-client.d.ts +16 -1
  187. package/dist/services/party-management/party-management-service-client.js +142 -1
  188. package/dist/services/topology-manager-write/topology-signed-transaction-assembler.js +4 -0
  189. package/dist/testing/campaign/campaign-artifact.d.ts +20 -0
  190. package/dist/testing/campaign/campaign-artifact.js +147 -0
  191. package/dist/testing/campaign/campaign-definition.d.ts +9 -0
  192. package/dist/testing/campaign/campaign-definition.js +78 -0
  193. package/dist/testing/campaign/campaign-metrics.d.ts +32 -0
  194. package/dist/testing/campaign/campaign-metrics.js +26 -0
  195. package/dist/testing/campaign/campaign-model.d.ts +11 -0
  196. package/dist/testing/campaign/campaign-model.js +21 -0
  197. package/dist/testing/campaign/campaign-runner.d.ts +99 -0
  198. package/dist/testing/campaign/campaign-runner.js +194 -0
  199. package/dist/testing/campaign/campaign-scheduler.d.ts +40 -0
  200. package/dist/testing/campaign/campaign-scheduler.js +75 -0
  201. package/dist/testing/campaign/campaign-types.d.ts +52 -0
  202. package/dist/testing/campaign/campaign-types.js +11 -0
  203. package/dist/testing/daml/daml-action-arbitrary.d.ts +13 -0
  204. package/dist/testing/daml/daml-action-arbitrary.js +24 -0
  205. package/dist/testing/daml/daml-choice-action-arbitrary.d.ts +18 -0
  206. package/dist/testing/daml/daml-choice-action-arbitrary.js +27 -0
  207. package/dist/testing/daml/daml-create-action-arbitrary.d.ts +19 -0
  208. package/dist/testing/daml/daml-create-action-arbitrary.js +34 -0
  209. package/dist/testing/daml/daml-testing-catalog.d.ts +38 -0
  210. package/dist/testing/daml/daml-testing-catalog.js +40 -0
  211. package/dist/testing/daml/daml-value-arbitrary.d.ts +8 -0
  212. package/dist/testing/daml/daml-value-arbitrary.js +43 -0
  213. package/dist/testing/daml/declarative-campaign-arbitrary.d.ts +15 -0
  214. package/dist/testing/daml/declarative-campaign-arbitrary.js +30 -0
  215. package/dist/testing/errors/invariant-campaign-failure.d.ts +24 -0
  216. package/dist/testing/errors/invariant-campaign-failure.js +37 -0
  217. package/dist/testing/errors/testing-configuration-error.d.ts +3 -0
  218. package/dist/testing/errors/testing-configuration-error.js +6 -0
  219. package/dist/testing/handlers/handler.d.ts +19 -0
  220. package/dist/testing/handlers/handler.js +31 -0
  221. package/dist/testing/index.d.ts +22 -0
  222. package/dist/testing/index.js +22 -0
  223. package/dist/testing/runtime/campaign-isolation.d.ts +14 -0
  224. package/dist/testing/runtime/campaign-isolation.js +23 -0
  225. package/dist/testing/runtime/canton-test-runtime.d.ts +58 -0
  226. package/dist/testing/runtime/canton-test-runtime.js +138 -0
  227. package/dist/testing/runtime/declarative-action-executor.d.ts +16 -0
  228. package/dist/testing/runtime/declarative-action-executor.js +41 -0
  229. package/dist/testing/targets/target.d.ts +49 -0
  230. package/dist/testing/targets/target.js +121 -0
  231. package/dist/transports/grpc/grpc-channel-factory.d.ts +4 -0
  232. package/dist/transports/grpc/grpc-channel-factory.js +42 -1
  233. package/dist/transports/grpc/grpc-transport.d.ts +2 -2
  234. package/dist/transports/grpc/grpc-transport.js +42 -3
  235. package/dist/transports/grpc/mappers/commands-mapper.d.ts +10 -2
  236. package/dist/transports/grpc/mappers/commands-mapper.js +30 -12
  237. package/dist/transports/grpc/mappers/contracts-mapper.d.ts +3 -1
  238. package/dist/transports/grpc/mappers/contracts-mapper.js +16 -3
  239. package/dist/transports/grpc/mappers/interactive-command-mapper.d.ts +15 -0
  240. package/dist/transports/grpc/mappers/interactive-command-mapper.js +54 -0
  241. package/dist/transports/grpc/mappers/topology-manager-write-mapper.js +59 -1
  242. package/dist/transports/json/json-transport.d.ts +2 -2
  243. package/dist/transports/json/json-transport.js +2 -2
  244. package/dist/transports/json/mappers/commands-mapper.js +23 -9
  245. package/node/.generated/start-local/additional-config.extra-participants.conf +37 -0
  246. package/node/.generated/start-local/additional-config.extra-validators.conf +35 -0
  247. package/node/.generated/start-local/compose-extra-participants.yaml +147 -0
  248. package/node/.generated/start-local/extra-participants.env +30 -0
  249. package/node/es256-jwt.mjs +177 -0
  250. package/node/start-local.sh +886 -0
  251. package/node/stop-local.sh +200 -0
  252. package/node/test-start-local.sh +354 -0
  253. package/node/test-stop-local.sh +112 -0
  254. package/package.json +21 -2
@@ -0,0 +1,210 @@
1
+ import { createHash } from "node:crypto";
2
+ import { GetDarRequest } from "../../core/types/requests/get-dar-request.js";
3
+ import { GetPackageReferencesRequest } from "../../core/types/requests/get-package-references-request.js";
4
+ import { DarArchiveLoader } from "../../daml-lf/container/dar-archive-loader.js";
5
+ import { DamlLfPackageLoader } from "../../daml-lf/daml-lf-package-loader.js";
6
+ import { DarSourceBundleLoader } from "../../daml-lf/container/dar-source-bundle-loader.js";
7
+ import { DamlLfArchiveException } from "../../daml-lf/errors/daml-lf-archive.exception.js";
8
+ import { DarSourceMapMetadata } from "../source/dar-source-map-metadata.js";
9
+ import { ReplayMissingSourceException } from "../errors/replay-missing-source.exception.js";
10
+ export class ReplayArtifactResolver {
11
+ dependencies;
12
+ archiveLoader = new DarArchiveLoader();
13
+ packageLoader = new DamlLfPackageLoader();
14
+ sourceBundleLoader = new DarSourceBundleLoader();
15
+ constructor(dependencies) {
16
+ this.dependencies = dependencies;
17
+ }
18
+ async resolveAsync(requiredPackageIds) {
19
+ const pending = [...requiredPackageIds];
20
+ const replayPackageIds = new Set();
21
+ const seenPackageIds = new Set();
22
+ const resolvedDars = new Map();
23
+ const packageFingerprints = new Map();
24
+ const candidateByDarMainPackageId = new Map();
25
+ const darMainPackageIdByContainedPackageId = new Map();
26
+ while (pending.length > 0) {
27
+ const packageId = pending.shift();
28
+ if (packageId === undefined || seenPackageIds.has(packageId)) {
29
+ continue;
30
+ }
31
+ seenPackageIds.add(packageId);
32
+ let candidate;
33
+ const knownDarMainPackageId = darMainPackageIdByContainedPackageId.get(packageId);
34
+ if (knownDarMainPackageId !== undefined) {
35
+ candidate =
36
+ candidateByDarMainPackageId.get(knownDarMainPackageId);
37
+ }
38
+ if (candidate === undefined) {
39
+ const references = await this.dependencies.participantPackageService.getPackageReferencesAsync(new GetPackageReferencesRequest({
40
+ packageId,
41
+ }));
42
+ candidate =
43
+ await this.resolveSourceMappedDarCandidateOrThrowAsync(packageId, references.dars, packageFingerprints, candidateByDarMainPackageId);
44
+ }
45
+ resolvedDars.set(candidate.dar.main, candidate.dar);
46
+ for (const containedPackageId of candidate.containedPackageIds) {
47
+ replayPackageIds.add(containedPackageId);
48
+ darMainPackageIdByContainedPackageId.set(containedPackageId, candidate.dar.main);
49
+ }
50
+ for (const importedPackageId of candidate.importedPackageIds) {
51
+ if (!seenPackageIds.has(importedPackageId)) {
52
+ pending.push(importedPackageId);
53
+ }
54
+ }
55
+ }
56
+ return {
57
+ dars: [...resolvedDars.values()],
58
+ packageIds: [...replayPackageIds.values()],
59
+ };
60
+ }
61
+ static createFingerprint(sourceFiles, executables) {
62
+ return createHash("sha256")
63
+ .update(JSON.stringify({
64
+ sourceFiles,
65
+ executables,
66
+ }))
67
+ .digest("hex");
68
+ }
69
+ async resolveSourceMappedDarCandidateOrThrowAsync(packageId, dars, packageFingerprints, candidateByDarMainPackageId) {
70
+ let selectedCandidate;
71
+ let missingSourceMapError;
72
+ for (const dar of dars) {
73
+ const cachedCandidate = candidateByDarMainPackageId.get(dar.main);
74
+ if (cachedCandidate !== undefined) {
75
+ if (selectedCandidate === undefined) {
76
+ selectedCandidate = cachedCandidate;
77
+ }
78
+ continue;
79
+ }
80
+ const response = await this.dependencies.participantPackageService.getDarAsync(new GetDarRequest({
81
+ mainPackageId: dar.main,
82
+ }));
83
+ try {
84
+ const archive = await this.archiveLoader.loadDarOrThrowAsync(response.payload);
85
+ const bundle = await this.sourceBundleLoader.loadSourceBundleOrThrowAsync(response.payload);
86
+ const metadata = new DarSourceMapMetadata(bundle.metadata);
87
+ const metadataPackageId = metadata.packageId ?? packageId;
88
+ const fingerprint = ReplayArtifactResolver.createFingerprint(bundle.sourceFiles.map((file) => ({
89
+ path: file.path,
90
+ content: file.content,
91
+ })), metadata.executables);
92
+ const previousFingerprint = packageFingerprints.get(metadataPackageId);
93
+ if (previousFingerprint !== undefined &&
94
+ previousFingerprint !== fingerprint) {
95
+ throw new ReplayMissingSourceException(`conflicting dar provenance for package '${metadataPackageId}'`);
96
+ }
97
+ packageFingerprints.set(metadataPackageId, fingerprint);
98
+ if (selectedCandidate === undefined) {
99
+ const debugPackageIds = new Set(archive.packageEntries
100
+ .filter((entry) => entry.path.endsWith("/data/debug-locations.dalf"))
101
+ .flatMap((entry) => {
102
+ try {
103
+ return [
104
+ this.packageLoader.loadRawPackageOrThrow(entry.bytes).packageId,
105
+ ];
106
+ }
107
+ catch {
108
+ return [];
109
+ }
110
+ }));
111
+ const packageGraph = this.readPackageGraph(archive.packageEntries.map((entry) => entry.bytes), metadataPackageId);
112
+ selectedCandidate = {
113
+ dar,
114
+ metadata,
115
+ containedPackageIds: packageGraph.containedPackageIds.filter((containedPackageId) => !debugPackageIds.has(containedPackageId)),
116
+ importedPackageIds: [
117
+ ...new Set([
118
+ ...metadata.importedPackages,
119
+ ...packageGraph.importedPackageIds.filter((importedPackageId) => !debugPackageIds.has(importedPackageId)),
120
+ ]),
121
+ ],
122
+ };
123
+ candidateByDarMainPackageId.set(dar.main, selectedCandidate);
124
+ }
125
+ }
126
+ catch (error) {
127
+ if (error instanceof DamlLfArchiveException &&
128
+ error.message.includes("debug/source-map.json")) {
129
+ missingSourceMapError ??= error;
130
+ continue;
131
+ }
132
+ throw error;
133
+ }
134
+ }
135
+ if (selectedCandidate !== undefined) {
136
+ return selectedCandidate;
137
+ }
138
+ if (missingSourceMapError !== undefined) {
139
+ throw missingSourceMapError;
140
+ }
141
+ throw new ReplayMissingSourceException(`missing source-mapped dar for package '${packageId}'`);
142
+ }
143
+ readPackageGraph(packageArchives, fallbackPackageId) {
144
+ const containedPackageIds = new Set([fallbackPackageId]);
145
+ const importedPackageIds = new Set();
146
+ for (const packageArchive of packageArchives) {
147
+ try {
148
+ const packageLoadResult = this.packageLoader.loadRawPackageOrThrow(packageArchive);
149
+ containedPackageIds.add(packageLoadResult.packageId);
150
+ for (const importedPackageId of this.readImportedPackageIds(packageLoadResult.rawPackage)) {
151
+ if (importedPackageId !== packageLoadResult.packageId) {
152
+ importedPackageIds.add(importedPackageId);
153
+ }
154
+ }
155
+ }
156
+ catch {
157
+ continue;
158
+ }
159
+ }
160
+ return {
161
+ containedPackageIds: [...containedPackageIds.values()],
162
+ importedPackageIds: [...importedPackageIds.values()],
163
+ };
164
+ }
165
+ readImportedPackageIds(rawPackage) {
166
+ const importedPackageIds = new Set();
167
+ const visited = new Set();
168
+ const visit = (value) => {
169
+ if (value === null || typeof value !== "object") {
170
+ return;
171
+ }
172
+ if (visited.has(value)) {
173
+ return;
174
+ }
175
+ visited.add(value);
176
+ const importedPackageId = this.tryResolveImportedPackageId(rawPackage, value);
177
+ if (importedPackageId !== undefined) {
178
+ importedPackageIds.add(importedPackageId);
179
+ }
180
+ if (Array.isArray(value)) {
181
+ for (const item of value) {
182
+ visit(item);
183
+ }
184
+ return;
185
+ }
186
+ for (const child of Object.values(value)) {
187
+ visit(child);
188
+ }
189
+ };
190
+ visit(rawPackage);
191
+ return [...importedPackageIds.values()];
192
+ }
193
+ tryResolveImportedPackageId(rawPackage, value) {
194
+ const candidate = value;
195
+ if (candidate.sum?.oneofKind === "importedPackageIdInternedStr") {
196
+ const index = candidate.sum.importedPackageIdInternedStr;
197
+ return index === undefined
198
+ ? undefined
199
+ : rawPackage.internedStrings[index];
200
+ }
201
+ if (candidate.sum?.oneofKind === "packageImportId" &&
202
+ rawPackage.importsSum?.oneofKind === "packageImports") {
203
+ const index = candidate.sum.packageImportId;
204
+ return index === undefined
205
+ ? undefined
206
+ : rawPackage.importsSum.packageImports?.importedPackages[index];
207
+ }
208
+ return undefined;
209
+ }
210
+ }
@@ -0,0 +1,12 @@
1
+ import { IDamlLfReplayEffect } from "../../daml-lf/interpreter/daml-lf-trace-sink.interface.js";
2
+ import { IReplayTransactionSnapshot } from "./ledger-replay-environment-builder.js";
3
+ export declare class ReplayDeterminismValidator {
4
+ validateOrThrow(snapshot: IReplayTransactionSnapshot, replayedEffects: readonly IDamlLfReplayEffect[]): void;
5
+ private collectObservedEffects;
6
+ private collectComparableReplayedEffects;
7
+ private serializeEffect;
8
+ private effectsEqual;
9
+ private normalizeComparableContractId;
10
+ private valuesEqual;
11
+ private normalizeComparableValue;
12
+ }
@@ -0,0 +1,161 @@
1
+ import { DAML_LF_NUMERIC_MARKER_KEY, DAML_LF_PARTY_MARKER_KEY, DAML_LF_RECORD_ID_MARKER_KEY, } from "../../daml-lf/interpreter/daml-lf-runtime-value.js";
2
+ import { ReplayDeterminismException } from "../errors/replay-determinism.exception.js";
3
+ import { normalizeReplayLedgerValue } from "./replay-ledger-value-normalizer.js";
4
+ export class ReplayDeterminismValidator {
5
+ validateOrThrow(snapshot, replayedEffects) {
6
+ const observedEffects = this.collectObservedEffects(snapshot);
7
+ const comparableReplayedEffects = this.collectComparableReplayedEffects(replayedEffects);
8
+ const syntheticCreateContractIds = new Map();
9
+ let createIndex = 0;
10
+ if (observedEffects.length !== comparableReplayedEffects.length) {
11
+ throw new ReplayDeterminismException(`replay produced ${comparableReplayedEffects.length} effects, but the ledger update exposed ${observedEffects.length}`);
12
+ }
13
+ for (const [index, observedEffect] of observedEffects.entries()) {
14
+ const replayedEffect = comparableReplayedEffects[index];
15
+ if (replayedEffect === undefined
16
+ || !this.effectsEqual(observedEffect, replayedEffect, syntheticCreateContractIds)) {
17
+ throw new ReplayDeterminismException(`replay diverged from the observed ledger effects at index ${index}: observed=${this.serializeEffect(observedEffect)} replayed=${replayedEffect === undefined ? "undefined" : this.serializeEffect(replayedEffect)}`);
18
+ }
19
+ if (observedEffect.kind === "create"
20
+ && observedEffect.contractId !== undefined) {
21
+ createIndex += 1;
22
+ syntheticCreateContractIds.set(`created-${createIndex}`, observedEffect.contractId);
23
+ }
24
+ }
25
+ }
26
+ collectObservedEffects(snapshot) {
27
+ return snapshot.events.flatMap((event) => {
28
+ switch (event.event?.oneofKind) {
29
+ case "created":
30
+ return [
31
+ {
32
+ kind: "create",
33
+ contractId: event.event.created?.contractId,
34
+ templateId: event.event.created?.templateId,
35
+ payload: normalizeReplayLedgerValue(event.event.created?.createArguments),
36
+ },
37
+ ];
38
+ case "exercised":
39
+ return [
40
+ {
41
+ kind: "exercise",
42
+ contractId: event.event.exercised?.contractId,
43
+ templateId: event.event.exercised?.templateId,
44
+ choice: event.event.exercised?.choice,
45
+ argument: normalizeReplayLedgerValue(event.event.exercised?.choiceArgument),
46
+ },
47
+ ];
48
+ case "archived":
49
+ return [
50
+ {
51
+ kind: "archive",
52
+ contractId: event.event.archived?.contractId,
53
+ templateId: event.event.archived?.templateId,
54
+ },
55
+ ];
56
+ default:
57
+ return [];
58
+ }
59
+ });
60
+ }
61
+ collectComparableReplayedEffects(replayedEffects) {
62
+ return replayedEffects.filter((effect) => effect.kind === "create"
63
+ || effect.kind === "exercise"
64
+ || effect.kind === "archive");
65
+ }
66
+ serializeEffect(effect) {
67
+ return JSON.stringify({
68
+ kind: effect.kind,
69
+ contractId: effect.kind === "create" ? undefined : effect.contractId,
70
+ templateId: effect.templateId,
71
+ choice: effect.choice,
72
+ argument: this.normalizeComparableValue(effect.argument),
73
+ payload: this.normalizeComparableValue(effect.payload),
74
+ });
75
+ }
76
+ effectsEqual(left, right, syntheticCreateContractIds) {
77
+ return (left.kind === right.kind
78
+ && this.normalizeComparableContractId(left.kind, left.contractId, syntheticCreateContractIds)
79
+ === this.normalizeComparableContractId(right.kind, right.contractId, syntheticCreateContractIds)
80
+ && this.valuesEqual(left.templateId, right.templateId)
81
+ && left.choice === right.choice
82
+ && this.valuesEqual(this.normalizeComparableValue(left.argument), this.normalizeComparableValue(right.argument))
83
+ && this.valuesEqual(this.normalizeComparableValue(left.payload), this.normalizeComparableValue(right.payload)));
84
+ }
85
+ normalizeComparableContractId(kind, contractId, syntheticCreateContractIds) {
86
+ if (kind === "create") {
87
+ return undefined;
88
+ }
89
+ return contractId === undefined
90
+ ? undefined
91
+ : syntheticCreateContractIds.get(contractId) ?? contractId;
92
+ }
93
+ valuesEqual(left, right) {
94
+ if (Array.isArray(left) || Array.isArray(right)) {
95
+ return (Array.isArray(left)
96
+ && Array.isArray(right)
97
+ && left.length === right.length
98
+ && left.every((item, index) => this.valuesEqual(item, right[index])));
99
+ }
100
+ if (left !== null
101
+ && right !== null
102
+ && typeof left === "object"
103
+ && typeof right === "object") {
104
+ const leftEntries = Object.entries(left);
105
+ const rightEntries = Object.entries(right);
106
+ const leftKeys = leftEntries.map(([key]) => key);
107
+ const rightKeys = rightEntries.map(([key]) => key);
108
+ const leftIsPositional = leftKeys.every((key) => /^\d+$/.test(key));
109
+ const rightIsPositional = rightKeys.every((key) => /^\d+$/.test(key));
110
+ if (leftIsPositional !== rightIsPositional) {
111
+ const positionalEntries = leftIsPositional ? leftEntries : rightEntries;
112
+ const namedEntries = leftIsPositional ? rightEntries : leftEntries;
113
+ return (positionalEntries.length === namedEntries.length
114
+ && positionalEntries
115
+ .sort(([leftKey], [rightKey]) => Number(leftKey) - Number(rightKey))
116
+ .every(([, value], index) => this.valuesEqual(value, namedEntries[index]?.[1])));
117
+ }
118
+ const leftSortedKeys = [...leftKeys].sort();
119
+ const rightSortedKeys = [...rightKeys].sort();
120
+ return (leftSortedKeys.length === rightSortedKeys.length
121
+ && leftSortedKeys.every((key, index) => key === rightSortedKeys[index])
122
+ && leftSortedKeys.every((key) => this.valuesEqual(left[key], right[key])));
123
+ }
124
+ return Object.is(left, right);
125
+ }
126
+ normalizeComparableValue(value) {
127
+ if (typeof value === "string"
128
+ && /^-?\d+\.\d+$/.test(value)) {
129
+ const normalizedValue = value
130
+ .replace(/(\.\d*?[1-9])0+$/, "$1")
131
+ .replace(/\.0+$/, "");
132
+ return normalizedValue === "-0" ? "0" : normalizedValue;
133
+ }
134
+ if (Array.isArray(value)) {
135
+ return value.map((item) => this.normalizeComparableValue(item));
136
+ }
137
+ if (value !== null
138
+ && typeof value === "object"
139
+ && DAML_LF_NUMERIC_MARKER_KEY in value
140
+ && typeof value[DAML_LF_NUMERIC_MARKER_KEY] === "string") {
141
+ return this.normalizeComparableValue(value[DAML_LF_NUMERIC_MARKER_KEY]);
142
+ }
143
+ if (value !== null
144
+ && typeof value === "object"
145
+ && DAML_LF_PARTY_MARKER_KEY in value
146
+ && typeof value[DAML_LF_PARTY_MARKER_KEY] === "string") {
147
+ return value[DAML_LF_PARTY_MARKER_KEY];
148
+ }
149
+ if (value !== null && typeof value === "object") {
150
+ return Object.fromEntries(Object.entries(value)
151
+ .filter(([key, item]) => key !== DAML_LF_RECORD_ID_MARKER_KEY
152
+ && item !== null
153
+ && item !== undefined)
154
+ .map(([key, item]) => [
155
+ key,
156
+ this.normalizeComparableValue(item),
157
+ ]));
158
+ }
159
+ return value;
160
+ }
161
+ }
@@ -0,0 +1,40 @@
1
+ import { DamlLfExpression } from "../../daml-lf/model/daml-lf-expression.js";
2
+ import { DamlLfValueDefinition } from "../../daml-lf/model/daml-lf-value-definition.js";
3
+ import { DamlLfTemplateId } from "../../daml-lf/model/daml-lf-template-id.js";
4
+ import { SourceIndexedCompilation } from "../source/source-indexed-compilation.js";
5
+ import { ReplayEntrypoint } from "./replay-entrypoint.js";
6
+ export interface ResolvedReplayEntrypointDefinition {
7
+ packageId: string;
8
+ moduleName: string;
9
+ definition: DamlLfValueDefinition;
10
+ entrypointArgumentRecordId?: {
11
+ packageId: string;
12
+ moduleName: string;
13
+ entityName: string;
14
+ };
15
+ frameIdentity?: {
16
+ packageId: string;
17
+ moduleName: string;
18
+ };
19
+ replayExpression: DamlLfExpression;
20
+ replayBindingMode: "standard" | "createWrapper" | "exerciseWrapper" | "templateChoice";
21
+ }
22
+ export declare class ReplayEntrypointDefinitionResolver {
23
+ private readonly indexedCompilation;
24
+ constructor(indexedCompilation: SourceIndexedCompilation);
25
+ resolveEntrypointDefinitionOrThrow(entrypoint: ReplayEntrypoint): ResolvedReplayEntrypointDefinition;
26
+ private resolveChoiceArgumentRecordId;
27
+ resolveChoiceDefinitionOrThrow(templateId: DamlLfTemplateId, choiceName: string): ResolvedReplayEntrypointDefinition;
28
+ private resolveReplayStrategy;
29
+ private resolveChoiceReplayExpression;
30
+ private resolveChoiceReplayStrategy;
31
+ private findExerciseSource;
32
+ private findExerciseSourceOrThrow;
33
+ private matchesTemplate;
34
+ private unwrapReplayExpression;
35
+ private resolveReplayBindingMode;
36
+ private shouldPreferTemplateChoiceExpression;
37
+ private normalizeCurriedChoiceExpression;
38
+ private wrapChoiceArgumentEnvelope;
39
+ private extractTrailingLambda;
40
+ }