@distrohelena/canton-typescript-sdk 0.1.32 → 0.1.35

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 (121) hide show
  1. package/README.md +220 -9
  2. package/dist/cjs/client/external-party-activation-client.js +20 -10
  3. package/dist/cjs/core/errors/active-contracts-traversal-error.js +12 -0
  4. package/dist/cjs/core/polling/poll-until-async.js +26 -0
  5. package/dist/cjs/core/types/active-contracts-traversal-options.js +26 -0
  6. package/dist/cjs/core/types/command-deduplication-period.js +2 -0
  7. package/dist/cjs/core/types/operation-deadline.js +42 -0
  8. package/dist/cjs/core/types/requests/allocate-party-request.js +2 -0
  9. package/dist/cjs/core/types/requests/finalize-decentralized-party-request.js +6 -0
  10. package/dist/cjs/core/types/requests/submit-command-request.js +43 -0
  11. package/dist/cjs/core/types/requests/wait-for-party-hosting-request.js +40 -0
  12. package/dist/cjs/index.js +13 -27
  13. package/dist/cjs/query/grpc/grpc-contract-query-client.js +33 -16
  14. package/dist/cjs/services/party-management/decentralized-party-lifecycle.js +28 -3
  15. package/dist/cjs/services/party-management/party-management-service-client.js +3 -0
  16. package/dist/cjs/services/state/state-service-client.js +1 -1
  17. package/dist/cjs/services/topology-aggregation/topology-aggregation-service-client.js +36 -0
  18. package/dist/cjs/transports/grpc/grpc-channel-factory.js +5 -7
  19. package/dist/cjs/transports/grpc/grpc-transport.js +31 -15
  20. package/dist/cjs/transports/grpc/mappers/command-deduplication-mapper.js +22 -0
  21. package/dist/cjs/transports/grpc/mappers/commands-mapper.js +3 -4
  22. package/dist/cjs/transports/grpc/mappers/interactive-command-mapper.js +5 -3
  23. package/dist/cjs/transports/grpc/mappers/parties-mapper.js +1 -12
  24. package/dist/cjs/transports/json/mappers/commands-mapper.js +5 -1
  25. package/dist/cjs/transports/json/mappers/parties-mapper.js +1 -0
  26. package/dist/client/external-party-activation-client.js +20 -10
  27. package/dist/client/external-party-activation-response.d.ts +1 -1
  28. package/dist/core/errors/active-contracts-traversal-error.d.ts +5 -0
  29. package/dist/core/errors/active-contracts-traversal-error.js +8 -0
  30. package/dist/core/polling/poll-until-async.d.ts +10 -0
  31. package/dist/core/polling/poll-until-async.js +23 -0
  32. package/dist/core/transports/transport.interface.d.ts +11 -3
  33. package/dist/core/types/active-contracts-traversal-options.d.ts +11 -0
  34. package/dist/core/types/active-contracts-traversal-options.js +22 -0
  35. package/dist/core/types/command-deduplication-period.d.ts +7 -0
  36. package/dist/core/types/command-deduplication-period.js +1 -0
  37. package/dist/core/types/operation-deadline.d.ts +13 -0
  38. package/dist/core/types/operation-deadline.js +38 -0
  39. package/dist/core/types/requests/allocate-party-request.d.ts +2 -0
  40. package/dist/core/types/requests/allocate-party-request.js +2 -0
  41. package/dist/core/types/requests/finalize-decentralized-party-request.d.ts +6 -0
  42. package/dist/core/types/requests/finalize-decentralized-party-request.js +6 -0
  43. package/dist/core/types/requests/submit-command-request.d.ts +5 -0
  44. package/dist/core/types/requests/submit-command-request.js +43 -0
  45. package/dist/core/types/requests/wait-for-party-hosting-request.d.ts +14 -0
  46. package/dist/core/types/requests/wait-for-party-hosting-request.js +36 -0
  47. package/dist/index.d.ts +5 -11
  48. package/dist/index.js +4 -11
  49. package/dist/query/grpc/grpc-contract-query-client.js +33 -16
  50. package/dist/services/party-management/decentralized-party-lifecycle.d.ts +1 -1
  51. package/dist/services/party-management/decentralized-party-lifecycle.js +28 -3
  52. package/dist/services/party-management/party-management-service-client.js +3 -0
  53. package/dist/services/state/state-service-client.d.ts +1 -1
  54. package/dist/services/state/state-service-client.js +1 -1
  55. package/dist/services/topology-aggregation/topology-aggregation-service-client.d.ts +4 -1
  56. package/dist/services/topology-aggregation/topology-aggregation-service-client.js +36 -0
  57. package/dist/services/topology-manager-read/topology-manager-read-service-client.d.ts +3 -1
  58. package/dist/services/user-management/user-management-service-client.d.ts +7 -1
  59. package/dist/transports/grpc/grpc-channel-factory.d.ts +0 -1
  60. package/dist/transports/grpc/grpc-channel-factory.js +5 -7
  61. package/dist/transports/grpc/grpc-transport.d.ts +10 -3
  62. package/dist/transports/grpc/grpc-transport.js +31 -15
  63. package/dist/transports/grpc/mappers/command-deduplication-mapper.d.ts +5 -0
  64. package/dist/transports/grpc/mappers/command-deduplication-mapper.js +19 -0
  65. package/dist/transports/grpc/mappers/commands-mapper.js +3 -4
  66. package/dist/transports/grpc/mappers/interactive-command-mapper.js +5 -3
  67. package/dist/transports/grpc/mappers/parties-mapper.d.ts +3 -7
  68. package/dist/transports/grpc/mappers/parties-mapper.js +1 -10
  69. package/dist/transports/json/json-transport.d.ts +10 -5
  70. package/dist/transports/json/mappers/commands-mapper.js +5 -1
  71. package/dist/transports/json/mappers/parties-mapper.d.ts +1 -0
  72. package/dist/transports/json/mappers/parties-mapper.js +1 -0
  73. package/node/participant-358-synchronizer.mjs +174 -0
  74. package/node/start-local-participant-358.sh +214 -0
  75. package/node/stop-local-participant-358.sh +18 -0
  76. package/node/test-participant-358-sidecar-smoke.sh +19 -0
  77. package/node/test-participant-358-sidecar.sh +113 -0
  78. package/package.json +18 -2
  79. package/dist/cjs/core/types/health-check-status.js +0 -10
  80. package/dist/cjs/core/types/requests/get-ledger-api-version-request.js +0 -6
  81. package/dist/cjs/core/types/requests/get-package-references-request.js +0 -10
  82. package/dist/cjs/core/types/requests/get-participant-id-request.js +0 -7
  83. package/dist/cjs/core/types/requests/get-participant-status-request.js +0 -6
  84. package/dist/cjs/core/types/requests/health-check-request.js +0 -10
  85. package/dist/cjs/core/types/responses/get-ledger-api-version-response.js +0 -12
  86. package/dist/cjs/core/types/responses/get-package-references-response.js +0 -10
  87. package/dist/cjs/core/types/responses/get-participant-id-response.js +0 -10
  88. package/dist/cjs/core/types/responses/get-participant-status-response.js +0 -12
  89. package/dist/cjs/core/types/responses/health-check-response.js +0 -10
  90. package/dist/cjs/transports/grpc/mappers/health-mapper.js +0 -24
  91. package/dist/cjs/transports/grpc/mappers/participant-status-mapper.js +0 -58
  92. package/dist/core/types/health-check-status.d.ts +0 -6
  93. package/dist/core/types/health-check-status.js +0 -7
  94. package/dist/core/types/requests/get-ledger-api-version-request.d.ts +0 -2
  95. package/dist/core/types/requests/get-ledger-api-version-request.js +0 -2
  96. package/dist/core/types/requests/get-package-references-request.d.ts +0 -6
  97. package/dist/core/types/requests/get-package-references-request.js +0 -6
  98. package/dist/core/types/requests/get-participant-id-request.d.ts +0 -3
  99. package/dist/core/types/requests/get-participant-id-request.js +0 -3
  100. package/dist/core/types/requests/get-participant-status-request.d.ts +0 -2
  101. package/dist/core/types/requests/get-participant-status-request.js +0 -2
  102. package/dist/core/types/requests/health-check-request.d.ts +0 -6
  103. package/dist/core/types/requests/health-check-request.js +0 -6
  104. package/dist/core/types/responses/get-ledger-api-version-response.d.ts +0 -8
  105. package/dist/core/types/responses/get-ledger-api-version-response.js +0 -8
  106. package/dist/core/types/responses/get-package-references-response.d.ts +0 -7
  107. package/dist/core/types/responses/get-package-references-response.js +0 -6
  108. package/dist/core/types/responses/get-participant-id-response.d.ts +0 -6
  109. package/dist/core/types/responses/get-participant-id-response.js +0 -6
  110. package/dist/core/types/responses/get-participant-status-response.d.ts +0 -10
  111. package/dist/core/types/responses/get-participant-status-response.js +0 -8
  112. package/dist/core/types/responses/health-check-response.d.ts +0 -7
  113. package/dist/core/types/responses/health-check-response.js +0 -6
  114. package/dist/transports/grpc/mappers/health-mapper.d.ts +0 -5
  115. package/dist/transports/grpc/mappers/health-mapper.js +0 -21
  116. package/dist/transports/grpc/mappers/participant-status-mapper.d.ts +0 -5
  117. package/dist/transports/grpc/mappers/participant-status-mapper.js +0 -54
  118. package/node/.generated/start-local/additional-config.extra-participants.conf +0 -72
  119. package/node/.generated/start-local/additional-config.extra-validators.conf +0 -105
  120. package/node/.generated/start-local/compose-extra-participants.yaml +0 -366
  121. package/node/.generated/start-local/extra-participants.env +0 -88
@@ -0,0 +1,19 @@
1
+ import { ValidationError } from "../../../core/errors/validation-error.js";
2
+ export function mapGrpcDeduplicationPeriod(period, options) {
3
+ if (period === undefined) {
4
+ return { oneofKind: undefined };
5
+ }
6
+ else if (period.kind === "duration") {
7
+ return {
8
+ oneofKind: "deduplicationDuration",
9
+ deduplicationDuration: { seconds: String(period.seconds), nanos: 0 },
10
+ };
11
+ }
12
+ else if (!options.allowParticipantBegin && period.offset === "0") {
13
+ throw new ValidationError("interactive command deduplication offsets must be positive");
14
+ }
15
+ return {
16
+ oneofKind: "deduplicationOffset",
17
+ deduplicationOffset: period.offset,
18
+ };
19
+ }
@@ -10,16 +10,15 @@ import { ExerciseByKeyCommand } from "../../../core/types/commands/exercise-by-k
10
10
  import { ExerciseCommand } from "../../../core/types/commands/exercise-command.js";
11
11
  import { SubmitCommandResponse } from "../../../core/types/responses/submit-command-response.js";
12
12
  import { SubmitCommandTransactionResponse } from "../../../core/types/responses/submit-command-transaction-response.js";
13
+ import { mapGrpcDeduplicationPeriod } from "./command-deduplication-mapper.js";
13
14
  export function mapGrpcSubmitCommandRequest(request) {
14
15
  return {
15
16
  commands: {
16
17
  workflowId: "",
17
18
  userId: request.userId ?? "",
18
- commandId: randomUUID(),
19
+ commandId: request.commandId ?? randomUUID(),
19
20
  commands: [mapGrpcLedgerCommand(request.command)],
20
- deduplicationPeriod: {
21
- oneofKind: undefined,
22
- },
21
+ deduplicationPeriod: mapGrpcDeduplicationPeriod(request.deduplicationPeriod, { allowParticipantBegin: true }),
23
22
  actAs: [...request.actAs],
24
23
  readAs: [...request.readAs],
25
24
  submissionId: "",
@@ -1,8 +1,12 @@
1
1
  import { ValidationError } from "../../../core/errors/validation-error.js";
2
2
  import { SubmitCommandResponse } from "../../../core/types/responses/submit-command-response.js";
3
3
  import { SignatureFormat, SigningAlgorithmSpec, } from "../generated/canton/com/daml/ledger/api/v2/crypto.js";
4
+ import { mapGrpcDeduplicationPeriod } from "./command-deduplication-mapper.js";
4
5
  import { mapGrpcLedgerCommand } from "./commands-mapper.js";
5
6
  export function mapGrpcPrepareSubmissionRequest(request, commandId) {
7
+ mapGrpcDeduplicationPeriod(request.deduplicationPeriod, {
8
+ allowParticipantBegin: false,
9
+ });
6
10
  return {
7
11
  userId: request.userId ?? "",
8
12
  commandId,
@@ -22,9 +26,7 @@ export function mapGrpcExecuteSubmissionAndWaitRequest(init) {
22
26
  partySignatures: {
23
27
  signatures: init.signerResults.map(({ party, result }) => ({ party, signatures: [mapGrpcSignature(result)] })),
24
28
  },
25
- deduplicationPeriod: {
26
- oneofKind: undefined,
27
- },
29
+ deduplicationPeriod: mapGrpcDeduplicationPeriod(init.request.deduplicationPeriod, { allowParticipantBegin: false }),
28
30
  submissionId: init.submissionId,
29
31
  userId: init.request.userId ?? "",
30
32
  hashingSchemeVersion: init.hashingSchemeVersion,
@@ -1,13 +1,11 @@
1
- import { GetParticipantIdRequest } from "../../../core/types/requests/get-participant-id-request.js";
2
1
  import { GetPartiesRequest } from "../../../core/types/requests/get-parties-request.js";
3
- import { CreatePartyRequest } from "../../../core/types/requests/create-party-request.js";
2
+ import { AllocatePartyRequest as SdkAllocatePartyRequest } from "../../../core/types/requests/allocate-party-request.js";
4
3
  import { ListPartiesRequest } from "../../../core/types/requests/list-parties-request.js";
5
4
  import { CreatePartyResponse } from "../../../core/types/responses/create-party-response.js";
6
- import { GetParticipantIdResponse as SdkGetParticipantIdResponse } from "../../../core/types/responses/get-participant-id-response.js";
7
5
  import { GetPartiesResponse as SdkGetPartiesResponse } from "../../../core/types/responses/get-parties-response.js";
8
6
  import { ListPartiesResponse } from "../../../core/types/responses/list-parties-response.js";
9
- import { AllocatePartyRequest, AllocatePartyResponse, GetParticipantIdResponse, GetPartiesResponse, ListKnownPartiesRequest, ListKnownPartiesResponse } from "../generated/canton/com/daml/ledger/api/v2/admin/party_management_service.js";
10
- export declare function mapGrpcCreatePartyRequest(request: CreatePartyRequest): AllocatePartyRequest;
7
+ import { AllocatePartyRequest, AllocatePartyResponse, GetPartiesResponse, ListKnownPartiesRequest, ListKnownPartiesResponse } from "../generated/canton/com/daml/ledger/api/v2/admin/party_management_service.js";
8
+ export declare function mapGrpcCreatePartyRequest(request: SdkAllocatePartyRequest): AllocatePartyRequest;
11
9
  export declare function mapGrpcCreateParty(payload: {
12
10
  identifier?: string;
13
11
  partyDetails?: {
@@ -16,8 +14,6 @@ export declare function mapGrpcCreateParty(payload: {
16
14
  } | AllocatePartyResponse): CreatePartyResponse;
17
15
  export declare function mapGrpcListPartiesRequest(request: ListPartiesRequest): ListKnownPartiesRequest;
18
16
  export declare function mapGrpcListParties(payload: ListKnownPartiesResponse): ListPartiesResponse;
19
- export declare function mapGrpcGetParticipantIdRequest(_request: GetParticipantIdRequest): Record<string, never>;
20
- export declare function mapGrpcGetParticipantId(payload: Partial<GetParticipantIdResponse>): SdkGetParticipantIdResponse;
21
17
  export declare function mapGrpcGetPartiesRequest(request: GetPartiesRequest): {
22
18
  parties: string[];
23
19
  identityProviderId: string;
@@ -1,6 +1,5 @@
1
1
  import { PartyDetails as SdkPartyDetails } from "../../../core/types/party-details.js";
2
2
  import { CreatePartyResponse } from "../../../core/types/responses/create-party-response.js";
3
- import { GetParticipantIdResponse as SdkGetParticipantIdResponse } from "../../../core/types/responses/get-participant-id-response.js";
4
3
  import { GetPartiesResponse as SdkGetPartiesResponse } from "../../../core/types/responses/get-parties-response.js";
5
4
  import { ListPartiesResponse } from "../../../core/types/responses/list-parties-response.js";
6
5
  export function mapGrpcCreatePartyRequest(request) {
@@ -8,7 +7,7 @@ export function mapGrpcCreatePartyRequest(request) {
8
7
  partyIdHint: request.partyIdHint ?? "",
9
8
  identityProviderId: "",
10
9
  synchronizerId: "",
11
- userId: "",
10
+ userId: request.userId ?? "",
12
11
  };
13
12
  }
14
13
  export function mapGrpcCreateParty(payload) {
@@ -37,14 +36,6 @@ export function mapGrpcListParties(payload) {
37
36
  nextPageToken: payload.nextPageToken || undefined,
38
37
  });
39
38
  }
40
- export function mapGrpcGetParticipantIdRequest(_request) {
41
- return {};
42
- }
43
- export function mapGrpcGetParticipantId(payload) {
44
- return new SdkGetParticipantIdResponse({
45
- participantId: payload.participantId ?? "",
46
- });
47
- }
48
39
  export function mapGrpcGetPartiesRequest(request) {
49
40
  return {
50
41
  parties: [...request.parties],
@@ -1,18 +1,24 @@
1
1
  import { AllocatePartyRequest } from "../../core/types/requests/allocate-party-request.js";
2
2
  import { GetActiveContractsRequest } from "../../core/types/requests/get-active-contracts-request.js";
3
- import { GetParticipantIdRequest } from "../../core/types/requests/get-participant-id-request.js";
3
+ import { GetUserRequest } from "../../core/types/requests/get-user-request.js";
4
4
  import { ListKnownPartiesRequest } from "../../core/types/requests/list-known-parties-request.js";
5
+ import { ListPartyToParticipantRequest } from "../../core/types/requests/list-party-to-participant-request.js";
6
+ import { ListUserRightsRequest } from "../../core/types/requests/list-user-rights-request.js";
7
+ import { ListUsersRequest } from "../../core/types/requests/list-users-request.js";
5
8
  import { SubmitCommandRequest } from "../../core/types/requests/submit-command-request.js";
6
9
  import { AllocatePartyResponse } from "../../core/types/responses/allocate-party-response.js";
10
+ import { GetUserResponse } from "../../core/types/responses/get-user-response.js";
11
+ import { ListPartyToParticipantResponse } from "../../core/types/responses/list-party-to-participant-response.js";
12
+ import { ListUserRightsResponse } from "../../core/types/responses/list-user-rights-response.js";
13
+ import { ListUsersResponse } from "../../core/types/responses/list-users-response.js";
7
14
  import type { ListPartiesRequest as TopologyListPartiesRequest, ListPartiesResponse as TopologyListPartiesResponse, ListKeyOwnersRequest, ListKeyOwnersResponse } from "../grpc/generated/canton/com/digitalasset/canton/topology/admin/v30/topology_aggregation_service.js";
8
15
  import type { AddTransactionsRequest, AddTransactionsResponse, AuthorizeRequest, AuthorizeResponse, CreateTemporaryTopologyStoreRequest, CreateTemporaryTopologyStoreResponse, DropTemporaryTopologyStoreRequest, DropTemporaryTopologyStoreResponse, GenerateTransactionsRequest, GenerateTransactionsResponse, ImportTopologySnapshotRequest, ImportTopologySnapshotResponse, ImportTopologySnapshotV2Request, ImportTopologySnapshotV2Response, SignTransactionsRequest, SignTransactionsResponse } from "../grpc/generated/canton/com/digitalasset/canton/topology/admin/v30/topology_manager_write_service.js";
9
16
  import type { GetContractRequest, GetContractResponse } from "../grpc/generated/canton/com/daml/ledger/api/v2/contract_service.js";
10
17
  import type { AddPartyAsyncRequest, AddPartyAsyncResponse, ClearPartyOnboardingFlagRequest, ClearPartyOnboardingFlagResponse, GetHighestOffsetByTimestampRequest, GetHighestOffsetByTimestampResponse } from "../grpc/generated/canton/com/digitalasset/canton/admin/participant/v30/party_management_service.js";
11
18
  import type { GetEventsByContractIdRequest, GetEventsByContractIdResponse } from "../grpc/generated/canton/com/daml/ledger/api/v2/event_query_service.js";
12
19
  import type { CurrentTimeRequest, CurrentTimeResponse, GetIdRequest, GetIdResponse } from "../grpc/generated/canton/com/digitalasset/canton/topology/admin/v30/initialization_service.js";
13
- import type { ListAllRequest, ListAllResponse, ListLsuAnnouncementRequest, ListLsuAnnouncementResponse, ListLsuSequencerConnectionSuccessorRequest, ListLsuSequencerConnectionSuccessorResponse, ListMediatorSynchronizerStateRequest, ListMediatorSynchronizerStateResponse, ListSequencingParametersStateRequest, ListSequencingParametersStateResponse, ListSynchronizerParametersStateRequest, ListSynchronizerParametersStateResponse, ListPartyToParticipantRequest, ListPartyToParticipantResponse, ListVettedPackagesRequest as TopologyListVettedPackagesRequest, ListVettedPackagesResponse as TopologyListVettedPackagesResponse, ListPartyHostingLimitsRequest, ListPartyHostingLimitsResponse, ListParticipantSynchronizerPermissionRequest, ListParticipantSynchronizerPermissionResponse, ListSynchronizerTrustCertificateRequest, ListSynchronizerTrustCertificateResponse, ListPartyToKeyMappingRequest, ListPartyToKeyMappingResponse, ListOwnerToKeyMappingRequest, ListOwnerToKeyMappingResponse, ListDecentralizedNamespaceDefinitionRequest, ListDecentralizedNamespaceDefinitionResponse, ListNamespaceDelegationRequest, ListNamespaceDelegationResponse, ListSequencerSynchronizerStateRequest, ListSequencerSynchronizerStateResponse } from "../grpc/generated/canton/com/digitalasset/canton/topology/admin/v30/topology_manager_read_service.js";
14
- import { GetParticipantIdResponse } from "../../core/types/responses/get-participant-id-response.js";
15
- import type { GetPartiesRequest, GetPartiesResponse } from "../grpc/generated/canton/com/daml/ledger/api/v2/admin/party_management_service.js";
20
+ import type { ListAllRequest, ListAllResponse, ListLsuAnnouncementRequest, ListLsuAnnouncementResponse, ListLsuSequencerConnectionSuccessorRequest, ListLsuSequencerConnectionSuccessorResponse, ListMediatorSynchronizerStateRequest, ListMediatorSynchronizerStateResponse, ListSequencingParametersStateRequest, ListSequencingParametersStateResponse, ListSynchronizerParametersStateRequest, ListSynchronizerParametersStateResponse, ListVettedPackagesRequest as TopologyListVettedPackagesRequest, ListVettedPackagesResponse as TopologyListVettedPackagesResponse, ListPartyHostingLimitsRequest, ListPartyHostingLimitsResponse, ListParticipantSynchronizerPermissionRequest, ListParticipantSynchronizerPermissionResponse, ListSynchronizerTrustCertificateRequest, ListSynchronizerTrustCertificateResponse, ListPartyToKeyMappingRequest, ListPartyToKeyMappingResponse, ListOwnerToKeyMappingRequest, ListOwnerToKeyMappingResponse, ListDecentralizedNamespaceDefinitionRequest, ListDecentralizedNamespaceDefinitionResponse, ListNamespaceDelegationRequest, ListNamespaceDelegationResponse, ListSequencerSynchronizerStateRequest, ListSequencerSynchronizerStateResponse } from "../grpc/generated/canton/com/digitalasset/canton/topology/admin/v30/topology_manager_read_service.js";
21
+ import type { GetParticipantIdRequest, GetParticipantIdResponse, GetPartiesRequest, GetPartiesResponse } from "../grpc/generated/canton/com/daml/ledger/api/v2/admin/party_management_service.js";
16
22
  import type { GetResourceLimitsRequest, GetResourceLimitsResponse } from "../grpc/generated/canton/com/digitalasset/canton/admin/participant/v30/resource_management_service.js";
17
23
  import type { GetNoWaitCommitmentsFromRequest, GetNoWaitCommitmentsFromResponse, GetParticipantScheduleRequest as GetParticipantPruningScheduleRequest, GetParticipantScheduleResponse as GetParticipantPruningScheduleResponse, GetScheduleRequest as GetPruningScheduleRequest, GetScheduleResponse as GetPruningScheduleResponse } from "../grpc/generated/canton/com/digitalasset/canton/admin/pruning/v30/pruning.js";
18
24
  import type { AllocateExternalPartyRequest, AllocateExternalPartyResponse, GenerateExternalPartyTopologyRequest, GenerateExternalPartyTopologyResponse } from "../grpc/generated/canton/com/daml/ledger/api/v2/admin/party_management_service.js";
@@ -36,7 +42,6 @@ import { ICommandSigner } from "../../core/signing/command-signer.interface.js";
36
42
  import { RequestOptions } from "../../core/types/request-options.js";
37
43
  import type { ListKnownPackagesRequest, ListKnownPackagesResponse, UploadDarFileRequest } from "../grpc/generated/canton/com/daml/ledger/api/v2/admin/package_management_service.js";
38
44
  import { UploadDarFileResponse } from "../grpc/generated/canton/com/daml/ledger/api/v2/admin/package_management_service.js";
39
- import type { GetUserRequest, GetUserResponse, ListUserRightsRequest, ListUserRightsResponse, ListUsersRequest, ListUsersResponse } from "../grpc/generated/canton/com/daml/ledger/api/v2/admin/user_management_service.js";
40
45
  import type { GetCommandStatusRequest, GetCommandStatusResponse } from "../grpc/generated/canton/com/daml/ledger/api/v2/admin/command_inspection_service.js";
41
46
  import type { GetActiveContractsPageRequest, GetActiveContractsPageResponse, GetConnectedSynchronizersRequest, GetConnectedSynchronizersResponse, GetLedgerEndRequest, GetLedgerEndResponse, GetLatestPrunedOffsetsRequest, GetLatestPrunedOffsetsResponse } from "../grpc/generated/canton/com/daml/ledger/api/v2/state_service.js";
42
47
  import { GetPackageRequest, GetPackageResponse, GetPackageStatusRequest, GetPackageStatusResponse, ListPackagesRequest, ListPackagesResponse, ListVettedPackagesRequest, ListVettedPackagesResponse } from "../grpc/generated/canton/com/daml/ledger/api/v2/package_service.js";
@@ -1,4 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ import { TransportError } from "../../../core/errors/transport-error.js";
2
3
  import { ValidationError } from "../../../core/errors/validation-error.js";
3
4
  import { CreateAndExerciseCommand } from "../../../core/types/commands/create-and-exercise-command.js";
4
5
  import { CreateCommand } from "../../../core/types/commands/create-command.js";
@@ -9,8 +10,11 @@ import { ExerciseByKeyCommand } from "../../../core/types/commands/exercise-by-k
9
10
  import { ExerciseCommand } from "../../../core/types/commands/exercise-command.js";
10
11
  import { SubmitCommandResponse } from "../../../core/types/responses/submit-command-response.js";
11
12
  export function mapJsonSubmitCommandRequest(request) {
13
+ if (request.deduplicationPeriod !== undefined) {
14
+ throw new TransportError("command deduplication periods are not supported by the JSON transport");
15
+ }
12
16
  return {
13
- commandId: randomUUID(),
17
+ commandId: request.commandId ?? randomUUID(),
14
18
  actAs: request.actAs,
15
19
  readAs: request.readAs,
16
20
  commands: [mapJsonCommand(request.command)],
@@ -13,6 +13,7 @@ export declare function mapJsonCreateParty(payload: {
13
13
  }): CreatePartyResponse;
14
14
  export declare function mapJsonAllocatePartyRequest(request: AllocatePartyRequest): {
15
15
  partyIdHint?: string;
16
+ userId?: string;
16
17
  localMetadata?: {
17
18
  attributes: Record<string, string>;
18
19
  };
@@ -11,6 +11,7 @@ export function mapJsonCreateParty(payload) {
11
11
  export function mapJsonAllocatePartyRequest(request) {
12
12
  return {
13
13
  partyIdHint: request.partyIdHint,
14
+ userId: request.userId,
14
15
  localMetadata: request.displayName === undefined
15
16
  ? undefined
16
17
  : {
@@ -0,0 +1,174 @@
1
+ import { createHmac } from "node:crypto";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { credentials } from "@grpc/grpc-js";
4
+ import { GrpcTransport } from "@protobuf-ts/grpc-transport";
5
+ import { SynchronizerConnectivityServiceClient } from "../dist/transports/grpc/generated/canton/com/digitalasset/canton/admin/participant/v30/synchronizer_connectivity_service.client.js";
6
+ import { ListRegisteredSynchronizersResponse_Status } from "../dist/transports/grpc/generated/canton/com/digitalasset/canton/admin/participant/v30/synchronizer_connectivity_service.js";
7
+ import { SequencerConnectionValidation } from "../dist/transports/grpc/generated/canton/com/digitalasset/canton/admin/sequencer/v30/sequencer_connection.js";
8
+ import { VersionServiceClient } from "../dist/transports/grpc/generated/canton/com/daml/ledger/api/v2/version_service.client.js";
9
+ import { UserManagementServiceClient } from "../dist/transports/grpc/generated/canton/com/daml/ledger/api/v2/admin/user_management_service.client.js";
10
+ import {
11
+ GrantUserRightsRequest,
12
+ Right,
13
+ Right_CanReadAsAnyParty,
14
+ } from "../dist/transports/grpc/generated/canton/com/daml/ledger/api/v2/admin/user_management_service.js";
15
+
16
+ function getRequiredEnvironment(name) {
17
+ const value = process.env[name];
18
+ if (!value) throw new Error(`${name} must be set.`);
19
+ return value;
20
+ }
21
+
22
+ function createSharedSecretToken() {
23
+ const secret = process.env.PARTICIPANT_358_SOURCE_SHARED_SECRET ?? "unsafe";
24
+ const audience = process.env.PARTICIPANT_358_SOURCE_AUTH_AUDIENCE
25
+ ?? "https://canton.network.global";
26
+ const subject = process.env.PARTICIPANT_358_SOURCE_AUTH_SUBJECT
27
+ ?? "ledger-api-user";
28
+ const ttlSeconds = Number.parseInt(
29
+ process.env.PARTICIPANT_358_TOKEN_TTL_SECONDS ?? "300",
30
+ 10,
31
+ );
32
+ if (!Number.isSafeInteger(ttlSeconds) || ttlSeconds <= 0) {
33
+ throw new Error("PARTICIPANT_358_TOKEN_TTL_SECONDS must be a positive integer.");
34
+ }
35
+ const issuedAt = Math.floor(Date.now() / 1000);
36
+ const header = Buffer.from(JSON.stringify({ alg: "HS256", typ: "JWT" })).toString("base64url");
37
+ const payload = Buffer.from(JSON.stringify({
38
+ aud: audience,
39
+ sub: subject,
40
+ iat: issuedAt,
41
+ exp: issuedAt + ttlSeconds,
42
+ })).toString("base64url");
43
+ const signature = createHmac("sha256", secret)
44
+ .update(`${header}.${payload}`)
45
+ .digest("base64url");
46
+ return `${header}.${payload}.${signature}`;
47
+ }
48
+
49
+ async function writeLedgerToken() {
50
+ const targetFile = getRequiredEnvironment("PARTICIPANT_358_LEDGER_TOKEN_FILE");
51
+ await writeFile(targetFile, `${createSharedSecretToken()}\n`, { mode: 0o600 });
52
+ }
53
+
54
+ function createClient(endpoint, token) {
55
+ const transport = new GrpcTransport({
56
+ host: endpoint.replace(/^https?:\/\//, ""),
57
+ channelCredentials: credentials.createInsecure(),
58
+ });
59
+ const options = token ? { meta: { authorization: `Bearer ${token}` } } : undefined;
60
+ return { client: new SynchronizerConnectivityServiceClient(transport), options, transport };
61
+ }
62
+
63
+ function encode(value) {
64
+ if (value instanceof Uint8Array) return { $bytes: Buffer.from(value).toString("base64") };
65
+ if (Array.isArray(value)) return value.map(encode);
66
+ if (value && typeof value === "object") {
67
+ return Object.fromEntries(Object.entries(value).map(([key, nested]) => [key, encode(nested)]));
68
+ }
69
+ return value;
70
+ }
71
+
72
+ function decode(value) {
73
+ if (Array.isArray(value)) return value.map(decode);
74
+ if (value && typeof value === "object") {
75
+ if (typeof value.$bytes === "string") return Buffer.from(value.$bytes, "base64");
76
+ return Object.fromEntries(Object.entries(value).map(([key, nested]) => [key, decode(nested)]));
77
+ }
78
+ return value;
79
+ }
80
+
81
+ async function exportSynchronizerConfig() {
82
+ const targetFile = getRequiredEnvironment("PARTICIPANT_358_SYNCHRONIZER_CONFIG");
83
+ const sourceEndpoint = getRequiredEnvironment("PARTICIPANT_358_SOURCE_ADMIN_ENDPOINT");
84
+ const sourceToken = process.env.PARTICIPANT_358_SOURCE_ADMIN_BEARER_TOKEN ?? createSharedSecretToken();
85
+ const { client, options, transport } = createClient(sourceEndpoint, sourceToken);
86
+ try {
87
+ const response = await client.listRegisteredSynchronizers({ allStatuses: false }, options).response;
88
+ const connected = response.results.filter((result) => result.connected && result.config);
89
+ if (connected.length !== 1) {
90
+ throw new Error(`Expected exactly one connected synchronizer from ${sourceEndpoint}; found ${connected.length}. Set PARTICIPANT_358_SOURCE_ADMIN_ENDPOINT to a participant with one connected synchronizer.`);
91
+ }
92
+ await writeFile(targetFile, `${JSON.stringify(encode(connected[0].config), null, 2)}\n`, { mode: 0o600 });
93
+ } finally {
94
+ transport.close();
95
+ }
96
+ }
97
+
98
+ async function connectSynchronizer() {
99
+ const configFile = getRequiredEnvironment("PARTICIPANT_358_SYNCHRONIZER_CONFIG");
100
+ const targetEndpoint = getRequiredEnvironment("PARTICIPANT_358_ADMIN_ENDPOINT");
101
+ const targetToken = process.env.PARTICIPANT_358_ADMIN_BEARER_TOKEN ?? createSharedSecretToken();
102
+ const config = decode(JSON.parse(await readFile(configFile, "utf8")));
103
+ const { client, options, transport } = createClient(targetEndpoint, targetToken);
104
+ try {
105
+ const connectResponse = await client.connectSynchronizer({
106
+ config,
107
+ sequencerConnectionValidation: SequencerConnectionValidation.ALL,
108
+ }, options).response;
109
+ if (!connectResponse.connectedSuccessfully) {
110
+ throw new Error("ConnectSynchronizer completed without a healthy connection.");
111
+ }
112
+ const registered = await client.listRegisteredSynchronizers({ allStatuses: false }, options).response;
113
+ const isHealthy = registered.results.some(
114
+ (result) => result.connected
115
+ && result.status === ListRegisteredSynchronizersResponse_Status.ACTIVE
116
+ && result.config?.synchronizerAlias === config.synchronizerAlias,
117
+ );
118
+ if (!isHealthy) throw new Error("Synchronizer did not reach active/connected state.");
119
+ } finally {
120
+ transport.close();
121
+ }
122
+ }
123
+
124
+ async function readLedgerApiVersion() {
125
+ const endpoint = getRequiredEnvironment("PARTICIPANT_358_LEDGER_ENDPOINT");
126
+ const token = process.env.PARTICIPANT_358_LEDGER_BEARER_TOKEN ?? createSharedSecretToken();
127
+ const { options, transport } = createClient(endpoint, token);
128
+ try {
129
+ const response = await new VersionServiceClient(transport)
130
+ .getLedgerApiVersion({}, options).response;
131
+ process.stdout.write(`${response.version}\n`);
132
+ } finally {
133
+ transport.close();
134
+ }
135
+ }
136
+
137
+ async function ensureLedgerUserReadRights() {
138
+ const endpoint = getRequiredEnvironment("PARTICIPANT_358_LEDGER_ENDPOINT");
139
+ const token = process.env.PARTICIPANT_358_LEDGER_BEARER_TOKEN ?? createSharedSecretToken();
140
+ const userId = process.env.PARTICIPANT_358_LEDGER_USER_ID ?? "ledger-api-user";
141
+ const { options, transport } = createClient(endpoint, token);
142
+
143
+ try {
144
+ const request = GrantUserRightsRequest.create({
145
+ userId,
146
+ rights: [Right.create({
147
+ kind: {
148
+ oneofKind: "canReadAsAnyParty",
149
+ canReadAsAnyParty: Right_CanReadAsAnyParty.create(),
150
+ },
151
+ })],
152
+ });
153
+
154
+ await new UserManagementServiceClient(transport)
155
+ .grantUserRights(request, options).response;
156
+ } finally {
157
+ transport.close();
158
+ }
159
+ }
160
+
161
+ const command = process.argv[2];
162
+ if (command === "export") {
163
+ await exportSynchronizerConfig();
164
+ } else if (command === "connect") {
165
+ await connectSynchronizer();
166
+ } else if (command === "ledger-api-version") {
167
+ await readLedgerApiVersion();
168
+ } else if (command === "mint-ledger-token") {
169
+ await writeLedgerToken();
170
+ } else if (command === "ensure-ledger-user-read-rights") {
171
+ await ensureLedgerUserReadRights();
172
+ } else {
173
+ throw new Error("Expected 'export', 'connect', 'ledger-api-version', 'mint-ledger-token', or 'ensure-ledger-user-read-rights'.");
174
+ }
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
5
+ REPO_ROOT="$(cd -- "$SCRIPT_DIR/.." && pwd)"
6
+ RUNTIME_DIR="${PARTICIPANT_358_RUNTIME_DIR:-$REPO_ROOT/.generated/participant-358}"
7
+ PROJECT_NAME="${PARTICIPANT_358_PROJECT_NAME:-canton-participant-358}"
8
+ CANTON_IMAGE="${PARTICIPANT_358_CANTON_IMAGE:-ghcr.io/digital-asset/decentralized-canton-sync/docker/canton:0.6.12}"
9
+ POSTGRES_IMAGE="${PARTICIPANT_358_POSTGRES_IMAGE:-postgres:16}"
10
+ NETWORK_NAME="${PARTICIPANT_358_NETWORK:-quickstart}"
11
+ LEDGER_PORT="${PARTICIPANT_358_LEDGER_PORT:-8901}"
12
+ ADMIN_PORT="${PARTICIPANT_358_ADMIN_PORT:-8902}"
13
+ JSON_PORT="${PARTICIPANT_358_JSON_PORT:-8975}"
14
+ SOURCE_ADMIN_ENDPOINT="${PARTICIPANT_358_SOURCE_ADMIN_ENDPOINT:-localhost:3902}"
15
+ SYNCHRONIZER_CONFIG="$RUNTIME_DIR/registered-synchronizer.json"
16
+ LEDGER_TOKEN_FILE="$RUNTIME_DIR/ledger-api-user.token"
17
+ DOCKER_COMPOSE_CMD=()
18
+
19
+ print_bearer_token_exports() {
20
+ local escaped_token_file
21
+ printf -v escaped_token_file '%q' "$LEDGER_TOKEN_FILE"
22
+ printf 'export SDK_TEST_LEDGER_BEARER_TOKEN="$(cat %s)"\n' "$escaped_token_file"
23
+ printf 'export SDK_TEST_LEDGER_ADMIN_BEARER_TOKEN="$(cat %s)"\n' "$escaped_token_file"
24
+ printf 'export SDK_TEST_PARTICIPANT_ADMIN_BEARER_TOKEN="$(cat %s)"\n' "$escaped_token_file"
25
+ printf 'export SDK_EXAMPLE_BEARER_TOKEN="$(cat %s)"\n' "$escaped_token_file"
26
+ }
27
+
28
+ if (( $# > 0 )); then
29
+ if [[ "$1" != "--refresh-token" || $# -ne 1 ]]; then
30
+ echo "Usage: $(basename "$0") [--refresh-token]" >&2
31
+ exit 1
32
+ elif [[ ! -d "$RUNTIME_DIR" || ! -f "$LEDGER_TOKEN_FILE" ]]; then
33
+ echo "Participant 3.5.8 runtime token does not exist at $LEDGER_TOKEN_FILE. Start the sidecar first." >&2
34
+ exit 1
35
+ fi
36
+
37
+ PARTICIPANT_358_LEDGER_TOKEN_FILE="$LEDGER_TOKEN_FILE" \
38
+ node "$SCRIPT_DIR/participant-358-synchronizer.mjs" mint-ledger-token
39
+ chmod 600 "$LEDGER_TOKEN_FILE"
40
+ print_bearer_token_exports
41
+ exit 0
42
+ fi
43
+
44
+ resolve_docker_compose_cmd() {
45
+ if docker compose version >/dev/null 2>&1; then DOCKER_COMPOSE_CMD=(docker compose); return; fi
46
+ if docker-compose version >/dev/null 2>&1; then DOCKER_COMPOSE_CMD=(docker-compose); return; fi
47
+ echo "Unable to find a working Docker Compose command." >&2
48
+ exit 1
49
+ }
50
+
51
+ validate_port() {
52
+ local value="$1"
53
+ [[ "$value" =~ ^[1-9][0-9]{0,4}$ ]] && (( value <= 65535 )) || { echo "Invalid port: $value" >&2; exit 1; }
54
+ }
55
+
56
+ for port in "$LEDGER_PORT" "$ADMIN_PORT" "$JSON_PORT"; do validate_port "$port"; done
57
+ if [[ "$LEDGER_PORT" == "$ADMIN_PORT" || "$LEDGER_PORT" == "$JSON_PORT" || "$ADMIN_PORT" == "$JSON_PORT" ]]; then
58
+ echo "Participant 3.5.8 Ledger, Admin, and JSON ports must be distinct." >&2
59
+ exit 1
60
+ fi
61
+ for normal_port in 3901 3902 3975; do
62
+ if [[ "$LEDGER_PORT" == "$normal_port" || "$ADMIN_PORT" == "$normal_port" || "$JSON_PORT" == "$normal_port" ]]; then
63
+ echo "Participant 3.5.8 ports must not collide with CN Quickstart ports." >&2
64
+ exit 1
65
+ fi
66
+ done
67
+
68
+ assert_host_port_available() {
69
+ local port="$1"
70
+ if command -v ss >/dev/null 2>&1 && ss -ltn "sport = :$port" | tail -n +2 | grep -q .; then
71
+ echo "Host port $port is already in use. Set the corresponding PARTICIPANT_358_*_PORT value." >&2
72
+ exit 1
73
+ fi
74
+ }
75
+ for port in "$LEDGER_PORT" "$ADMIN_PORT" "$JSON_PORT"; do assert_host_port_available "$port"; done
76
+
77
+ mkdir -p "$RUNTIME_DIR"
78
+ chmod 700 "$RUNTIME_DIR"
79
+ PARTICIPANT_358_LEDGER_TOKEN_FILE="$LEDGER_TOKEN_FILE" \
80
+ node "$SCRIPT_DIR/participant-358-synchronizer.mjs" mint-ledger-token
81
+ chmod 600 "$LEDGER_TOKEN_FILE"
82
+ cat > "$RUNTIME_DIR/participant-358.env" <<EOF
83
+ PARTICIPANT_358_SYNCHRONIZER_CONFIG=$SYNCHRONIZER_CONFIG
84
+ PARTICIPANT_358_SOURCE_ADMIN_ENDPOINT=$SOURCE_ADMIN_ENDPOINT
85
+ PARTICIPANT_358_ADMIN_ENDPOINT=localhost:$ADMIN_PORT
86
+ PARTICIPANT_358_LEDGER_TOKEN_FILE=$LEDGER_TOKEN_FILE
87
+ EOF
88
+ chmod 600 "$RUNTIME_DIR/participant-358.env"
89
+
90
+ cat > "$RUNTIME_DIR/canton.conf" <<EOF
91
+ canton {
92
+ parameters { manual-start = no }
93
+ participants.participant358 {
94
+ storage {
95
+ type = postgres
96
+ config {
97
+ dataSourceClass = "org.postgresql.ds.PGSimpleDataSource"
98
+ properties {
99
+ serverName = \${?DB_SERVER}
100
+ portNumber = 5432
101
+ databaseName = participant358
102
+ currentSchema = participant358
103
+ user = \${?DB_USER}
104
+ password = \${?DB_PASSWORD}
105
+ }
106
+ }
107
+ }
108
+ init {
109
+ generate-topology-transactions-and-keys = true
110
+ identity.type = auto
111
+ }
112
+ admin-api {
113
+ address = "0.0.0.0"
114
+ port = 5002
115
+ }
116
+ ledger-api {
117
+ address = "0.0.0.0"
118
+ port = 5001
119
+ auth-services = [{
120
+ type = unsafe-jwt-hmac-256
121
+ target-audience = "https://canton.network.global"
122
+ secret = "unsafe"
123
+ }]
124
+ user-management-service.additional-admin-user-id = "ledger-api-user"
125
+ }
126
+ http-ledger-api {
127
+ address = "0.0.0.0"
128
+ port = 7575
129
+ }
130
+ monitoring.http-health-server {
131
+ address = "0.0.0.0"
132
+ port = 7000
133
+ }
134
+ }
135
+ }
136
+ EOF
137
+
138
+ cat > "$RUNTIME_DIR/compose.yaml" <<EOF
139
+ name: $PROJECT_NAME
140
+ services:
141
+ postgres:
142
+ image: $POSTGRES_IMAGE
143
+ environment:
144
+ POSTGRES_DB: participant358
145
+ POSTGRES_USER: participant358
146
+ POSTGRES_PASSWORD: participant358
147
+ healthcheck:
148
+ test: ["CMD-SHELL", "pg_isready -U participant358 -d participant358"]
149
+ interval: 2s
150
+ timeout: 3s
151
+ retries: 30
152
+ participant358:
153
+ image: $CANTON_IMAGE
154
+ depends_on:
155
+ postgres:
156
+ condition: service_healthy
157
+ environment:
158
+ DB_SERVER: postgres
159
+ DB_USER: participant358
160
+ DB_PASSWORD: participant358
161
+ volumes:
162
+ - "$RUNTIME_DIR/canton.conf:/app/app.conf:ro"
163
+ ports:
164
+ - "127.0.0.1:$LEDGER_PORT:5001"
165
+ - "127.0.0.1:$ADMIN_PORT:5002"
166
+ - "127.0.0.1:$JSON_PORT:7575"
167
+ networks:
168
+ - default
169
+ - localnet
170
+ networks:
171
+ localnet:
172
+ external: true
173
+ name: $NETWORK_NAME
174
+ EOF
175
+
176
+ if [[ "${PARTICIPANT_358_SKIP_SYNCHRONIZER_CONNECT:-0}" != "1" ]]; then
177
+ PARTICIPANT_358_SYNCHRONIZER_CONFIG="$SYNCHRONIZER_CONFIG" \
178
+ PARTICIPANT_358_SOURCE_ADMIN_ENDPOINT="$SOURCE_ADMIN_ENDPOINT" \
179
+ PARTICIPANT_358_SOURCE_ADMIN_BEARER_TOKEN="${PARTICIPANT_358_SOURCE_ADMIN_BEARER_TOKEN:-}" \
180
+ node "$SCRIPT_DIR/participant-358-synchronizer.mjs" export
181
+ fi
182
+
183
+ resolve_docker_compose_cmd
184
+ "${DOCKER_COMPOSE_CMD[@]}" --project-name "$PROJECT_NAME" --file "$RUNTIME_DIR/compose.yaml" up -d
185
+
186
+ if [[ "${PARTICIPANT_358_SKIP_SYNCHRONIZER_CONNECT:-0}" != "1" ]]; then
187
+ deadline=$((SECONDS + ${PARTICIPANT_358_CONNECT_TIMEOUT_SECONDS:-90}))
188
+ until PARTICIPANT_358_SYNCHRONIZER_CONFIG="$SYNCHRONIZER_CONFIG" \
189
+ PARTICIPANT_358_ADMIN_ENDPOINT="localhost:$ADMIN_PORT" \
190
+ PARTICIPANT_358_ADMIN_BEARER_TOKEN="${PARTICIPANT_358_ADMIN_BEARER_TOKEN:-}" \
191
+ node "$SCRIPT_DIR/participant-358-synchronizer.mjs" connect
192
+ do
193
+ if (( SECONDS >= deadline )); then
194
+ echo "Participant 3.5.8 sidecar did not become ready. Inspect: ${DOCKER_COMPOSE_CMD[*]} --project-name $PROJECT_NAME --file $RUNTIME_DIR/compose.yaml logs participant358" >&2
195
+ exit 1
196
+ fi
197
+ sleep 2
198
+ done
199
+
200
+ PARTICIPANT_358_LEDGER_ENDPOINT="localhost:$LEDGER_PORT" \
201
+ PARTICIPANT_358_LEDGER_BEARER_TOKEN="$(cat "$LEDGER_TOKEN_FILE")" \
202
+ node "$SCRIPT_DIR/participant-358-synchronizer.mjs" ensure-ledger-user-read-rights
203
+ fi
204
+
205
+ cat <<EOF
206
+ Participant 3.5.8 sidecar is ready.
207
+ export SDK_TEST_LEDGER_ENDPOINT=localhost:$LEDGER_PORT
208
+ export SDK_TEST_LEDGER_ADMIN_ENDPOINT=localhost:$LEDGER_PORT
209
+ export SDK_TEST_PARTICIPANT_ADMIN_ENDPOINT=localhost:$ADMIN_PORT
210
+ export SDK_EXAMPLE_LEDGER_ENDPOINT=localhost:$LEDGER_PORT
211
+ export SDK_EXAMPLE_LEDGER_ADMIN_ENDPOINT=localhost:$LEDGER_PORT
212
+ export SDK_EXAMPLE_PARTICIPANT_ADMIN_ENDPOINT=localhost:$ADMIN_PORT
213
+ EOF
214
+ print_bearer_token_exports
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
5
+ REPO_ROOT="$(cd -- "$SCRIPT_DIR/.." && pwd)"
6
+ RUNTIME_DIR="${PARTICIPANT_358_RUNTIME_DIR:-$REPO_ROOT/.generated/participant-358}"
7
+ PROJECT_NAME="${PARTICIPANT_358_PROJECT_NAME:-canton-participant-358}"
8
+ DOCKER_COMPOSE_CMD=()
9
+
10
+ if [[ ! -f "$RUNTIME_DIR/compose.yaml" ]]; then
11
+ echo "Participant 3.5.8 sidecar is not configured. Nothing to stop."
12
+ exit 0
13
+ fi
14
+ if docker compose version >/dev/null 2>&1; then DOCKER_COMPOSE_CMD=(docker compose); elif docker-compose version >/dev/null 2>&1; then DOCKER_COMPOSE_CMD=(docker-compose); else
15
+ echo "Unable to find a working Docker Compose command." >&2
16
+ exit 1
17
+ fi
18
+ "${DOCKER_COMPOSE_CMD[@]}" --project-name "$PROJECT_NAME" --file "$RUNTIME_DIR/compose.yaml" down --volumes --remove-orphans
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ if [[ "${PARTICIPANT_358_SMOKE_TEST:-0}" != "1" ]]; then
5
+ echo "Set PARTICIPANT_358_SMOKE_TEST=1 to run this Docker smoke test against an already-running CN Quickstart localnet."
6
+ exit 0
7
+ fi
8
+
9
+ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
10
+ REPO_ROOT="$(cd -- "$SCRIPT_DIR/.." && pwd)"
11
+ trap 'bash "$SCRIPT_DIR/stop-local-participant-358.sh"' EXIT
12
+
13
+ bash "$SCRIPT_DIR/start-local-participant-358.sh"
14
+ version="$(PARTICIPANT_358_LEDGER_ENDPOINT="localhost:${PARTICIPANT_358_LEDGER_PORT:-8901}" node "$SCRIPT_DIR/participant-358-synchronizer.mjs" ledger-api-version)"
15
+ [[ "$version" == 3.5.8* ]] || {
16
+ echo "Expected Canton 3.5.8 Ledger API response, received: $version" >&2
17
+ exit 1
18
+ }
19
+ echo "Participant 3.5.8 Ledger API response: $version"