@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.
- package/README.md +220 -9
- package/dist/cjs/client/external-party-activation-client.js +20 -10
- package/dist/cjs/core/errors/active-contracts-traversal-error.js +12 -0
- package/dist/cjs/core/polling/poll-until-async.js +26 -0
- package/dist/cjs/core/types/active-contracts-traversal-options.js +26 -0
- package/dist/cjs/core/types/command-deduplication-period.js +2 -0
- package/dist/cjs/core/types/operation-deadline.js +42 -0
- package/dist/cjs/core/types/requests/allocate-party-request.js +2 -0
- package/dist/cjs/core/types/requests/finalize-decentralized-party-request.js +6 -0
- package/dist/cjs/core/types/requests/submit-command-request.js +43 -0
- package/dist/cjs/core/types/requests/wait-for-party-hosting-request.js +40 -0
- package/dist/cjs/index.js +13 -27
- package/dist/cjs/query/grpc/grpc-contract-query-client.js +33 -16
- package/dist/cjs/services/party-management/decentralized-party-lifecycle.js +28 -3
- package/dist/cjs/services/party-management/party-management-service-client.js +3 -0
- package/dist/cjs/services/state/state-service-client.js +1 -1
- package/dist/cjs/services/topology-aggregation/topology-aggregation-service-client.js +36 -0
- package/dist/cjs/transports/grpc/grpc-channel-factory.js +5 -7
- package/dist/cjs/transports/grpc/grpc-transport.js +31 -15
- package/dist/cjs/transports/grpc/mappers/command-deduplication-mapper.js +22 -0
- package/dist/cjs/transports/grpc/mappers/commands-mapper.js +3 -4
- package/dist/cjs/transports/grpc/mappers/interactive-command-mapper.js +5 -3
- package/dist/cjs/transports/grpc/mappers/parties-mapper.js +1 -12
- package/dist/cjs/transports/json/mappers/commands-mapper.js +5 -1
- package/dist/cjs/transports/json/mappers/parties-mapper.js +1 -0
- package/dist/client/external-party-activation-client.js +20 -10
- package/dist/client/external-party-activation-response.d.ts +1 -1
- package/dist/core/errors/active-contracts-traversal-error.d.ts +5 -0
- package/dist/core/errors/active-contracts-traversal-error.js +8 -0
- package/dist/core/polling/poll-until-async.d.ts +10 -0
- package/dist/core/polling/poll-until-async.js +23 -0
- package/dist/core/transports/transport.interface.d.ts +11 -3
- package/dist/core/types/active-contracts-traversal-options.d.ts +11 -0
- package/dist/core/types/active-contracts-traversal-options.js +22 -0
- package/dist/core/types/command-deduplication-period.d.ts +7 -0
- package/dist/core/types/command-deduplication-period.js +1 -0
- package/dist/core/types/operation-deadline.d.ts +13 -0
- package/dist/core/types/operation-deadline.js +38 -0
- package/dist/core/types/requests/allocate-party-request.d.ts +2 -0
- package/dist/core/types/requests/allocate-party-request.js +2 -0
- package/dist/core/types/requests/finalize-decentralized-party-request.d.ts +6 -0
- package/dist/core/types/requests/finalize-decentralized-party-request.js +6 -0
- package/dist/core/types/requests/submit-command-request.d.ts +5 -0
- package/dist/core/types/requests/submit-command-request.js +43 -0
- package/dist/core/types/requests/wait-for-party-hosting-request.d.ts +14 -0
- package/dist/core/types/requests/wait-for-party-hosting-request.js +36 -0
- package/dist/index.d.ts +5 -11
- package/dist/index.js +4 -11
- package/dist/query/grpc/grpc-contract-query-client.js +33 -16
- package/dist/services/party-management/decentralized-party-lifecycle.d.ts +1 -1
- package/dist/services/party-management/decentralized-party-lifecycle.js +28 -3
- package/dist/services/party-management/party-management-service-client.js +3 -0
- package/dist/services/state/state-service-client.d.ts +1 -1
- package/dist/services/state/state-service-client.js +1 -1
- package/dist/services/topology-aggregation/topology-aggregation-service-client.d.ts +4 -1
- package/dist/services/topology-aggregation/topology-aggregation-service-client.js +36 -0
- package/dist/services/topology-manager-read/topology-manager-read-service-client.d.ts +3 -1
- package/dist/services/user-management/user-management-service-client.d.ts +7 -1
- package/dist/transports/grpc/grpc-channel-factory.d.ts +0 -1
- package/dist/transports/grpc/grpc-channel-factory.js +5 -7
- package/dist/transports/grpc/grpc-transport.d.ts +10 -3
- package/dist/transports/grpc/grpc-transport.js +31 -15
- package/dist/transports/grpc/mappers/command-deduplication-mapper.d.ts +5 -0
- package/dist/transports/grpc/mappers/command-deduplication-mapper.js +19 -0
- package/dist/transports/grpc/mappers/commands-mapper.js +3 -4
- package/dist/transports/grpc/mappers/interactive-command-mapper.js +5 -3
- package/dist/transports/grpc/mappers/parties-mapper.d.ts +3 -7
- package/dist/transports/grpc/mappers/parties-mapper.js +1 -10
- package/dist/transports/json/json-transport.d.ts +10 -5
- package/dist/transports/json/mappers/commands-mapper.js +5 -1
- package/dist/transports/json/mappers/parties-mapper.d.ts +1 -0
- package/dist/transports/json/mappers/parties-mapper.js +1 -0
- package/node/participant-358-synchronizer.mjs +174 -0
- package/node/start-local-participant-358.sh +214 -0
- package/node/stop-local-participant-358.sh +18 -0
- package/node/test-participant-358-sidecar-smoke.sh +19 -0
- package/node/test-participant-358-sidecar.sh +113 -0
- package/package.json +18 -2
- package/dist/cjs/core/types/health-check-status.js +0 -10
- package/dist/cjs/core/types/requests/get-ledger-api-version-request.js +0 -6
- package/dist/cjs/core/types/requests/get-package-references-request.js +0 -10
- package/dist/cjs/core/types/requests/get-participant-id-request.js +0 -7
- package/dist/cjs/core/types/requests/get-participant-status-request.js +0 -6
- package/dist/cjs/core/types/requests/health-check-request.js +0 -10
- package/dist/cjs/core/types/responses/get-ledger-api-version-response.js +0 -12
- package/dist/cjs/core/types/responses/get-package-references-response.js +0 -10
- package/dist/cjs/core/types/responses/get-participant-id-response.js +0 -10
- package/dist/cjs/core/types/responses/get-participant-status-response.js +0 -12
- package/dist/cjs/core/types/responses/health-check-response.js +0 -10
- package/dist/cjs/transports/grpc/mappers/health-mapper.js +0 -24
- package/dist/cjs/transports/grpc/mappers/participant-status-mapper.js +0 -58
- package/dist/core/types/health-check-status.d.ts +0 -6
- package/dist/core/types/health-check-status.js +0 -7
- package/dist/core/types/requests/get-ledger-api-version-request.d.ts +0 -2
- package/dist/core/types/requests/get-ledger-api-version-request.js +0 -2
- package/dist/core/types/requests/get-package-references-request.d.ts +0 -6
- package/dist/core/types/requests/get-package-references-request.js +0 -6
- package/dist/core/types/requests/get-participant-id-request.d.ts +0 -3
- package/dist/core/types/requests/get-participant-id-request.js +0 -3
- package/dist/core/types/requests/get-participant-status-request.d.ts +0 -2
- package/dist/core/types/requests/get-participant-status-request.js +0 -2
- package/dist/core/types/requests/health-check-request.d.ts +0 -6
- package/dist/core/types/requests/health-check-request.js +0 -6
- package/dist/core/types/responses/get-ledger-api-version-response.d.ts +0 -8
- package/dist/core/types/responses/get-ledger-api-version-response.js +0 -8
- package/dist/core/types/responses/get-package-references-response.d.ts +0 -7
- package/dist/core/types/responses/get-package-references-response.js +0 -6
- package/dist/core/types/responses/get-participant-id-response.d.ts +0 -6
- package/dist/core/types/responses/get-participant-id-response.js +0 -6
- package/dist/core/types/responses/get-participant-status-response.d.ts +0 -10
- package/dist/core/types/responses/get-participant-status-response.js +0 -8
- package/dist/core/types/responses/health-check-response.d.ts +0 -7
- package/dist/core/types/responses/health-check-response.js +0 -6
- package/dist/transports/grpc/mappers/health-mapper.d.ts +0 -5
- package/dist/transports/grpc/mappers/health-mapper.js +0 -21
- package/dist/transports/grpc/mappers/participant-status-mapper.d.ts +0 -5
- package/dist/transports/grpc/mappers/participant-status-mapper.js +0 -54
- package/node/.generated/start-local/additional-config.extra-participants.conf +0 -72
- package/node/.generated/start-local/additional-config.extra-validators.conf +0 -105
- package/node/.generated/start-local/compose-extra-participants.yaml +0 -366
- 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 {
|
|
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,
|
|
10
|
-
export declare function mapGrpcCreatePartyRequest(request:
|
|
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 {
|
|
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,
|
|
14
|
-
import { GetParticipantIdResponse } from "
|
|
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
|
};
|
|
@@ -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"
|