@fairmint/canton-node-sdk 0.0.234 → 0.0.236
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/bin/canton-localnet +17 -1
- package/build/src/clients/scan-api/ScanApiClient.generated.d.ts +4 -0
- package/build/src/clients/scan-api/ScanApiClient.generated.d.ts.map +1 -1
- package/build/src/clients/scan-api/ScanApiClient.generated.js +2 -0
- package/build/src/clients/scan-api/ScanApiClient.generated.js.map +1 -1
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/index.d.ts +1 -0
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/index.d.ts.map +1 -1
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/index.js +1 -0
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/index.js.map +1 -1
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/v2/get-allocation-factory-v2-from-registry.d.ts +106 -0
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/v2/get-allocation-factory-v2-from-registry.d.ts.map +1 -0
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/v2/get-allocation-factory-v2-from-registry.js +51 -0
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/v2/get-allocation-factory-v2-from-registry.js.map +1 -0
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/v2/index.d.ts +2 -0
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/v2/index.d.ts.map +1 -0
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/v2/index.js +18 -0
- package/build/src/clients/scan-api/operations/v0/registry/allocation-instruction/v2/index.js.map +1 -0
- package/build/src/clients/validator-api/ValidatorApiClient.generated.d.ts +18 -3
- package/build/src/clients/validator-api/ValidatorApiClient.generated.d.ts.map +1 -1
- package/build/src/clients/validator-api/ValidatorApiClient.generated.js +12 -2
- package/build/src/clients/validator-api/ValidatorApiClient.generated.js.map +1 -1
- package/build/src/clients/validator-api/operations/v0/ans/index.d.ts +1 -1
- package/build/src/clients/validator-api/operations/v0/ans/index.js +1 -1
- package/build/src/clients/validator-api/operations/v0/ans/list-owned-entries.d.ts +7 -0
- package/build/src/clients/validator-api/operations/v0/ans/list-owned-entries.d.ts.map +1 -0
- package/build/src/clients/validator-api/operations/v0/ans/{list-entries-proxy.js → list-owned-entries.js} +4 -12
- package/build/src/clients/validator-api/operations/v0/ans/list-owned-entries.js.map +1 -0
- package/build/src/clients/validator-api/operations/v0/ans/lookup-by-name.d.ts +2 -3
- package/build/src/clients/validator-api/operations/v0/ans/lookup-by-name.d.ts.map +1 -1
- package/build/src/clients/validator-api/operations/v0/ans/lookup-by-name.js +1 -1
- package/build/src/clients/validator-api/operations/v0/ans/lookup-by-name.js.map +1 -1
- package/build/src/clients/validator-api/operations/v0/ans/lookup-by-party.d.ts +2 -3
- package/build/src/clients/validator-api/operations/v0/ans/lookup-by-party.d.ts.map +1 -1
- package/build/src/clients/validator-api/operations/v0/ans/lookup-by-party.js +1 -1
- package/build/src/clients/validator-api/operations/v0/ans/lookup-by-party.js.map +1 -1
- package/build/src/clients/validator-api/operations/v0/scan-proxy/ans-entry.d.ts +22 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/ans-entry.d.ts.map +1 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/ans-entry.js +3 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/ans-entry.js.map +1 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/get-dso-info.d.ts +15 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/get-dso-info.d.ts.map +1 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/get-dso-info.js +12 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/get-dso-info.js.map +1 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/get-holdings-summary-at-v1.d.ts +18 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/get-holdings-summary-at-v1.d.ts.map +1 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/get-holdings-summary-at-v1.js +20 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/get-holdings-summary-at-v1.js.map +1 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/index.d.ts +5 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/index.d.ts.map +1 -1
- package/build/src/clients/validator-api/operations/v0/scan-proxy/index.js +5 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/index.js.map +1 -1
- package/build/src/clients/validator-api/operations/v0/scan-proxy/list-ans-entries.d.ts +23 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/list-ans-entries.d.ts.map +1 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/list-ans-entries.js +24 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/list-ans-entries.js.map +1 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/list-unclaimed-development-fund-coupons.d.ts +7 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/list-unclaimed-development-fund-coupons.d.ts.map +1 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/list-unclaimed-development-fund-coupons.js +12 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/list-unclaimed-development-fund-coupons.js.map +1 -0
- package/build/src/clients/validator-api/operations/v0/scan-proxy/lookup-transfer-command-counter-by-party.d.ts +11 -1
- package/build/src/clients/validator-api/operations/v0/scan-proxy/lookup-transfer-command-counter-by-party.d.ts.map +1 -1
- package/build/src/clients/validator-api/operations/v0/scan-proxy/lookup-transfer-command-counter-by-party.js +8 -4
- package/build/src/clients/validator-api/operations/v0/scan-proxy/lookup-transfer-command-counter-by-party.js.map +1 -1
- package/build/src/clients/validator-api/operations/v0/scan-proxy/lookup-transfer-command-status.d.ts +13 -1
- package/build/src/clients/validator-api/operations/v0/scan-proxy/lookup-transfer-command-status.d.ts.map +1 -1
- package/build/src/clients/validator-api/operations/v0/scan-proxy/lookup-transfer-command-status.js +15 -4
- package/build/src/clients/validator-api/operations/v0/scan-proxy/lookup-transfer-command-status.js.map +1 -1
- package/build/src/clients/validator-api/operations/v0/wallet/index.d.ts +1 -0
- package/build/src/clients/validator-api/operations/v0/wallet/index.d.ts.map +1 -1
- package/build/src/clients/validator-api/operations/v0/wallet/index.js +1 -0
- package/build/src/clients/validator-api/operations/v0/wallet/index.js.map +1 -1
- package/build/src/clients/validator-api/operations/v0/wallet/tap.d.ts +20 -0
- package/build/src/clients/validator-api/operations/v0/wallet/tap.d.ts.map +1 -0
- package/build/src/clients/validator-api/operations/v0/wallet/tap.js +24 -0
- package/build/src/clients/validator-api/operations/v0/wallet/tap.js.map +1 -0
- package/build/src/clients/validator-api/schemas/api/scan-proxy.d.ts +0 -8
- package/build/src/clients/validator-api/schemas/api/scan-proxy.d.ts.map +1 -1
- package/build/src/clients/validator-api/schemas/api/scan-proxy.js +1 -8
- package/build/src/clients/validator-api/schemas/api/scan-proxy.js.map +1 -1
- package/build/src/clients/validator-api/schemas/operations/scan-proxy.d.ts +0 -9
- package/build/src/clients/validator-api/schemas/operations/scan-proxy.d.ts.map +1 -1
- package/build/src/clients/validator-api/schemas/operations/scan-proxy.js +1 -9
- package/build/src/clients/validator-api/schemas/operations/scan-proxy.js.map +1 -1
- package/build/src/core/errors.d.ts +2 -0
- package/build/src/core/errors.d.ts.map +1 -1
- package/build/src/core/errors.js +14 -0
- package/build/src/core/errors.js.map +1 -1
- package/build/src/core/utils/abort.d.ts +3 -0
- package/build/src/core/utils/abort.d.ts.map +1 -0
- package/build/src/core/utils/abort.js +57 -0
- package/build/src/core/utils/abort.js.map +1 -0
- package/build/src/utils/amulet/external-party-cc-transfer.d.ts.map +1 -1
- package/build/src/utils/amulet/external-party-cc-transfer.js +24 -4
- package/build/src/utils/amulet/external-party-cc-transfer.js.map +1 -1
- package/build/src/utils/external-signing/canton-ed25519-signer.d.ts +64 -0
- package/build/src/utils/external-signing/canton-ed25519-signer.d.ts.map +1 -0
- package/build/src/utils/external-signing/canton-ed25519-signer.js +206 -0
- package/build/src/utils/external-signing/canton-ed25519-signer.js.map +1 -0
- package/build/src/utils/external-signing/execute-external-transaction.d.ts +16 -0
- package/build/src/utils/external-signing/execute-external-transaction.d.ts.map +1 -1
- package/build/src/utils/external-signing/execute-external-transaction.js +17 -5
- package/build/src/utils/external-signing/execute-external-transaction.js.map +1 -1
- package/build/src/utils/external-signing/external-party-details.d.ts +3 -0
- package/build/src/utils/external-signing/external-party-details.d.ts.map +1 -0
- package/build/src/utils/external-signing/external-party-details.js +23 -0
- package/build/src/utils/external-signing/external-party-details.js.map +1 -0
- package/build/src/utils/external-signing/external-party-lifecycle.d.ts +95 -0
- package/build/src/utils/external-signing/external-party-lifecycle.d.ts.map +1 -0
- package/build/src/utils/external-signing/external-party-lifecycle.js +207 -0
- package/build/src/utils/external-signing/external-party-lifecycle.js.map +1 -0
- package/build/src/utils/external-signing/external-party-onboarding.d.ts +3 -7
- package/build/src/utils/external-signing/external-party-onboarding.d.ts.map +1 -1
- package/build/src/utils/external-signing/external-party-onboarding.js +12 -55
- package/build/src/utils/external-signing/external-party-onboarding.js.map +1 -1
- package/build/src/utils/external-signing/external-signing-client.d.ts +114 -0
- package/build/src/utils/external-signing/external-signing-client.d.ts.map +1 -0
- package/build/src/utils/external-signing/external-signing-client.js +271 -0
- package/build/src/utils/external-signing/external-signing-client.js.map +1 -0
- package/build/src/utils/external-signing/index.d.ts +3 -0
- package/build/src/utils/external-signing/index.d.ts.map +1 -1
- package/build/src/utils/external-signing/index.js +3 -0
- package/build/src/utils/external-signing/index.js.map +1 -1
- package/build/src/utils/index.d.ts +1 -0
- package/build/src/utils/index.d.ts.map +1 -1
- package/build/src/utils/index.js +1 -0
- package/build/src/utils/index.js.map +1 -1
- package/build/src/utils/party-readiness/index.d.ts +2 -0
- package/build/src/utils/party-readiness/index.d.ts.map +1 -1
- package/build/src/utils/party-readiness/index.js +22 -12
- package/build/src/utils/party-readiness/index.js.map +1 -1
- package/build/src/utils/token-standard/index.d.ts +2 -0
- package/build/src/utils/token-standard/index.d.ts.map +1 -0
- package/build/src/utils/token-standard/index.js +18 -0
- package/build/src/utils/token-standard/index.js.map +1 -0
- package/build/src/utils/token-standard/v2/allocation.d.ts +140 -0
- package/build/src/utils/token-standard/v2/allocation.d.ts.map +1 -0
- package/build/src/utils/token-standard/v2/allocation.js +468 -0
- package/build/src/utils/token-standard/v2/allocation.js.map +1 -0
- package/build/src/utils/token-standard/v2/index.d.ts +3 -0
- package/build/src/utils/token-standard/v2/index.d.ts.map +1 -0
- package/build/src/utils/token-standard/v2/index.js +19 -0
- package/build/src/utils/token-standard/v2/index.js.map +1 -0
- package/build/src/utils/token-standard/v2/types.d.ts +13 -0
- package/build/src/utils/token-standard/v2/types.d.ts.map +1 -0
- package/build/src/utils/token-standard/v2/types.js +3 -0
- package/build/src/utils/token-standard/v2/types.js.map +1 -0
- package/package.json +1 -1
- package/scripts/localnet-cloud.sh +67 -1
- package/build/src/clients/validator-api/operations/v0/ans/list-entries-proxy.d.ts +0 -13
- package/build/src/clients/validator-api/operations/v0/ans/list-entries-proxy.d.ts.map +0 -1
- package/build/src/clients/validator-api/operations/v0/ans/list-entries-proxy.js.map +0 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_CANTON_ED25519_SIGNING_REQUEST_TTL_MS = exports.DEFAULT_CANTON_ED25519_SIGNING_REQUEST_TTL_MS = exports.CantonEd25519SigningPurpose = void 0;
|
|
4
|
+
exports.signAndVerifyCantonEd25519Payload = signAndVerifyCantonEd25519Payload;
|
|
5
|
+
exports.normalizeCantonEd25519Signature = normalizeCantonEd25519Signature;
|
|
6
|
+
const errors_1 = require("../../core/errors");
|
|
7
|
+
const canton_protocol_1 = require("./canton-protocol");
|
|
8
|
+
exports.CantonEd25519SigningPurpose = {
|
|
9
|
+
EXTERNAL_PARTY_TOPOLOGY: 'external-party-topology',
|
|
10
|
+
INTERACTIVE_SUBMISSION: 'interactive-submission',
|
|
11
|
+
};
|
|
12
|
+
exports.DEFAULT_CANTON_ED25519_SIGNING_REQUEST_TTL_MS = 5 * 60 * 1000;
|
|
13
|
+
exports.MAX_CANTON_ED25519_SIGNING_REQUEST_TTL_MS = 15 * 60 * 1000;
|
|
14
|
+
/** Calls an external signer and independently verifies its response against the signer's declared public key. */
|
|
15
|
+
async function signAndVerifyCantonEd25519Payload(options) {
|
|
16
|
+
const purpose = validateSigningPurpose(options.purpose);
|
|
17
|
+
const operationId = validateRequiredString('operationId', options.operationId);
|
|
18
|
+
const synchronizerId = validateRequiredString('synchronizerId', options.synchronizerId);
|
|
19
|
+
const payloadHex = normalizeHexPayload(options.payloadHex);
|
|
20
|
+
const requestTtlMs = validateRequestTtlMs(options.requestTtlMs ?? exports.DEFAULT_CANTON_ED25519_SIGNING_REQUEST_TTL_MS);
|
|
21
|
+
const now = options.now ?? Date.now;
|
|
22
|
+
const issuedAtMs = validateTimestamp(now());
|
|
23
|
+
const issuedAt = new Date(issuedAtMs).toISOString();
|
|
24
|
+
const expiresAt = new Date(issuedAtMs + requestTtlMs).toISOString();
|
|
25
|
+
const context = options.context === undefined ? undefined : normalizeSigningContext(options.context);
|
|
26
|
+
const publicKeyBase64 = (0, canton_protocol_1.normalizeEd25519PublicKeyForCanton)(options.signer.publicKeyBase64);
|
|
27
|
+
const publicKeyFingerprint = (0, canton_protocol_1.assertCantonPartyMatchesPublicKey)({
|
|
28
|
+
partyId: options.partyId,
|
|
29
|
+
publicKeyBase64,
|
|
30
|
+
});
|
|
31
|
+
const request = {
|
|
32
|
+
purpose,
|
|
33
|
+
operationId,
|
|
34
|
+
partyId: options.partyId,
|
|
35
|
+
publicKeyBase64,
|
|
36
|
+
publicKeyFingerprint,
|
|
37
|
+
synchronizerId,
|
|
38
|
+
payloadHex,
|
|
39
|
+
payloadBase64: (0, canton_protocol_1.hashHexToBase64)(payloadHex),
|
|
40
|
+
issuedAt,
|
|
41
|
+
expiresAt,
|
|
42
|
+
...(context !== undefined ? { context } : {}),
|
|
43
|
+
};
|
|
44
|
+
const signatureBase64 = normalizeCantonEd25519Signature(await waitForCantonSigner(options.signer, request, requestTtlMs, options.signal));
|
|
45
|
+
if (validateTimestamp(now()) >= issuedAtMs + requestTtlMs) {
|
|
46
|
+
throw new errors_1.ValidationError('Canton Ed25519 signing request expired before the signer completed', {
|
|
47
|
+
operationId,
|
|
48
|
+
expiresAt,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
(0, canton_protocol_1.assertEd25519Signature)({
|
|
52
|
+
publicKeyBase64,
|
|
53
|
+
payload: Buffer.from(payloadHex, 'hex'),
|
|
54
|
+
signatureBase64,
|
|
55
|
+
failureMessage: 'External Canton signer returned an invalid Ed25519 signature',
|
|
56
|
+
});
|
|
57
|
+
return { request, signatureBase64 };
|
|
58
|
+
}
|
|
59
|
+
async function waitForCantonSigner(signer, request, requestTtlMs, externalSignal) {
|
|
60
|
+
if (externalSignal?.aborted) {
|
|
61
|
+
throw signingAborted(request.operationId);
|
|
62
|
+
}
|
|
63
|
+
const controller = new AbortController();
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
let settled = false;
|
|
66
|
+
const finish = (callback) => {
|
|
67
|
+
if (settled)
|
|
68
|
+
return;
|
|
69
|
+
settled = true;
|
|
70
|
+
clearTimeout(timeout);
|
|
71
|
+
externalSignal?.removeEventListener('abort', onAbort);
|
|
72
|
+
callback();
|
|
73
|
+
};
|
|
74
|
+
const onAbort = () => {
|
|
75
|
+
// Preserve a signer result that settled before abort but whose promise handler is already queued.
|
|
76
|
+
queueMicrotask(() => finish(() => reject(signingAborted(request.operationId))));
|
|
77
|
+
controller.abort();
|
|
78
|
+
};
|
|
79
|
+
const timeout = setTimeout(() => {
|
|
80
|
+
controller.abort();
|
|
81
|
+
finish(() => reject(new errors_1.ValidationError('Canton Ed25519 signing request expired before the signer completed', {
|
|
82
|
+
operationId: request.operationId,
|
|
83
|
+
expiresAt: request.expiresAt,
|
|
84
|
+
})));
|
|
85
|
+
}, requestTtlMs);
|
|
86
|
+
externalSignal?.addEventListener('abort', onAbort, { once: true });
|
|
87
|
+
if (externalSignal?.aborted) {
|
|
88
|
+
onAbort();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
queueMicrotask(() => {
|
|
92
|
+
if (settled || controller.signal.aborted) {
|
|
93
|
+
finish(() => reject(signingAborted(request.operationId)));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
let pending;
|
|
97
|
+
try {
|
|
98
|
+
pending = signer.signCantonPayload(request, { signal: controller.signal });
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
finish(() => reject(error));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
Promise.resolve(pending).then((signature) => finish(() => resolve(signature)), (error) => finish(() => reject(error)));
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function signingAborted(operationId) {
|
|
109
|
+
return new errors_1.ValidationError('Canton Ed25519 signing request was aborted', { operationId });
|
|
110
|
+
}
|
|
111
|
+
/** Normalizes supported signer outputs into canonical, padded base64. */
|
|
112
|
+
function normalizeCantonEd25519Signature(signature) {
|
|
113
|
+
if ('signatureBase64' in signature) {
|
|
114
|
+
return encodeSignatureBytes(decodeBase64Signature(signature.signatureBase64));
|
|
115
|
+
}
|
|
116
|
+
if ('signatureHex' in signature) {
|
|
117
|
+
return encodeSignatureBytes(decodeHexSignature(signature.signatureHex));
|
|
118
|
+
}
|
|
119
|
+
return encodeSignatureBytes(Buffer.from(signature.signatureBytes));
|
|
120
|
+
}
|
|
121
|
+
function decodeBase64Signature(value) {
|
|
122
|
+
const normalized = value.trim().replace(/-/g, '+').replace(/_/g, '/');
|
|
123
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(normalized) || normalized.length % 4 === 1) {
|
|
124
|
+
throw invalidCantonEd25519Signature();
|
|
125
|
+
}
|
|
126
|
+
const padded = normalized.padEnd(normalized.length + ((4 - (normalized.length % 4)) % 4), '=');
|
|
127
|
+
const decoded = Buffer.from(padded, 'base64');
|
|
128
|
+
if (decoded.toString('base64').replace(/=+$/, '') !== normalized.replace(/=+$/, '')) {
|
|
129
|
+
throw invalidCantonEd25519Signature();
|
|
130
|
+
}
|
|
131
|
+
return decoded;
|
|
132
|
+
}
|
|
133
|
+
function decodeHexSignature(value) {
|
|
134
|
+
const normalized = value.trim().replace(/^0x/i, '');
|
|
135
|
+
if (!/^[0-9a-fA-F]+$/.test(normalized) || normalized.length % 2 !== 0) {
|
|
136
|
+
throw invalidCantonEd25519Signature();
|
|
137
|
+
}
|
|
138
|
+
return Buffer.from(normalized, 'hex');
|
|
139
|
+
}
|
|
140
|
+
function encodeSignatureBytes(signature) {
|
|
141
|
+
if (signature.length !== 64) {
|
|
142
|
+
throw invalidCantonEd25519Signature(signature.length);
|
|
143
|
+
}
|
|
144
|
+
return signature.toString('base64');
|
|
145
|
+
}
|
|
146
|
+
function invalidCantonEd25519Signature(actualLength) {
|
|
147
|
+
return new errors_1.ValidationError('External Canton signer must return a 64-byte Ed25519 signature', {
|
|
148
|
+
...(actualLength !== undefined ? { actualLength } : {}),
|
|
149
|
+
expectedLength: 64,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function normalizeHexPayload(value) {
|
|
153
|
+
const normalized = value.trim();
|
|
154
|
+
if (!/^(?:[0-9a-fA-F]{2})+$/.test(normalized)) {
|
|
155
|
+
throw new errors_1.ValidationError('payloadHex must be non-empty, even-length hexadecimal bytes', { payloadHex: value });
|
|
156
|
+
}
|
|
157
|
+
return normalized.toLowerCase();
|
|
158
|
+
}
|
|
159
|
+
function validateRequiredString(name, value) {
|
|
160
|
+
const normalized = value.trim();
|
|
161
|
+
if (!normalized) {
|
|
162
|
+
throw new errors_1.ValidationError(`${name} is required`, { [name]: value });
|
|
163
|
+
}
|
|
164
|
+
return normalized;
|
|
165
|
+
}
|
|
166
|
+
function validateRequestTtlMs(value) {
|
|
167
|
+
if (!Number.isSafeInteger(value) || value <= 0 || value > exports.MAX_CANTON_ED25519_SIGNING_REQUEST_TTL_MS) {
|
|
168
|
+
throw new errors_1.ValidationError(`requestTtlMs must be a positive safe integer no greater than ${exports.MAX_CANTON_ED25519_SIGNING_REQUEST_TTL_MS}`, { requestTtlMs: value, maxRequestTtlMs: exports.MAX_CANTON_ED25519_SIGNING_REQUEST_TTL_MS });
|
|
169
|
+
}
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
function validateTimestamp(value) {
|
|
173
|
+
const latestIssuedAtMs = 8640000000000000 - exports.MAX_CANTON_ED25519_SIGNING_REQUEST_TTL_MS;
|
|
174
|
+
if (!Number.isSafeInteger(value) || value < 0 || value > latestIssuedAtMs) {
|
|
175
|
+
throw new errors_1.ValidationError('now must return a non-negative, valid Unix timestamp in milliseconds', { now: value });
|
|
176
|
+
}
|
|
177
|
+
return value;
|
|
178
|
+
}
|
|
179
|
+
function normalizeSigningContext(context) {
|
|
180
|
+
if (typeof context !== 'object' || context === null || Array.isArray(context)) {
|
|
181
|
+
throw new errors_1.ValidationError('Canton signing context must be an object of primitive JSON values');
|
|
182
|
+
}
|
|
183
|
+
const entries = [];
|
|
184
|
+
for (const [key, value] of Object.entries(context)) {
|
|
185
|
+
if (!key.trim()) {
|
|
186
|
+
throw new errors_1.ValidationError('Canton signing context keys must not be empty');
|
|
187
|
+
}
|
|
188
|
+
if (value !== null &&
|
|
189
|
+
typeof value !== 'string' &&
|
|
190
|
+
typeof value !== 'boolean' &&
|
|
191
|
+
(typeof value !== 'number' || !Number.isFinite(value))) {
|
|
192
|
+
throw new errors_1.ValidationError('Canton signing context values must be primitive JSON values', { key });
|
|
193
|
+
}
|
|
194
|
+
entries.push([key, value]);
|
|
195
|
+
}
|
|
196
|
+
// Object.fromEntries defines `__proto__` as an own data property instead of invoking Object.prototype's setter.
|
|
197
|
+
return Object.fromEntries(entries);
|
|
198
|
+
}
|
|
199
|
+
function validateSigningPurpose(value) {
|
|
200
|
+
if (value !== exports.CantonEd25519SigningPurpose.EXTERNAL_PARTY_TOPOLOGY &&
|
|
201
|
+
value !== exports.CantonEd25519SigningPurpose.INTERACTIVE_SUBMISSION) {
|
|
202
|
+
throw new errors_1.ValidationError('Unsupported Canton Ed25519 signing purpose', { purpose: value });
|
|
203
|
+
}
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=canton-ed25519-signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canton-ed25519-signer.js","sourceRoot":"","sources":["../../../../src/utils/external-signing/canton-ed25519-signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import { type LedgerJsonApiClient } from '../../clients/ledger-json-api';
|
|
2
2
|
import { type InteractiveSubmissionExecuteRequest, type InteractiveSubmissionExecuteResponse } from '../../clients/ledger-json-api/schemas/api/interactive-submission';
|
|
3
3
|
export type PartySignature = InteractiveSubmissionExecuteRequest['partySignatures']['signatures'][number];
|
|
4
|
+
/** Immutable compatibility value. Use the factory below when building a submission request. */
|
|
5
|
+
export declare const DEFAULT_INTERACTIVE_SUBMISSION_DEDUPLICATION_PERIOD: Readonly<{
|
|
6
|
+
DeduplicationDuration: Readonly<{
|
|
7
|
+
value: Readonly<{
|
|
8
|
+
duration: "30s";
|
|
9
|
+
}>;
|
|
10
|
+
}>;
|
|
11
|
+
}>;
|
|
12
|
+
/** Returns an isolated default deduplication period for one interactive submission. */
|
|
13
|
+
export declare function createDefaultInteractiveSubmissionDeduplicationPeriod(): {
|
|
14
|
+
DeduplicationDuration: {
|
|
15
|
+
value: {
|
|
16
|
+
duration: string;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
4
20
|
export interface ExecuteExternalTransactionOptions {
|
|
5
21
|
readonly ledgerClient: LedgerJsonApiClient;
|
|
6
22
|
readonly userId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-external-transaction.d.ts","sourceRoot":"","sources":["../../../../src/utils/external-signing/execute-external-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,KAAK,mCAAmC,EACxC,KAAK,oCAAoC,EAC1C,MAAM,kEAAkE,CAAC;AAG1E,MAAM,MAAM,cAAc,GAAG,mCAAmC,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1G,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IACpD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,mCAAmC,CAAC,qBAAqB,CAAC,CAAC;CAC3F;AAED,MAAM,WAAW,uCAAuC;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,oCAAoC,CAAC,CAE/C;AAED;;;;;GAKG;AACH,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,uCAAuC,CAAC,CAclD"}
|
|
1
|
+
{"version":3,"file":"execute-external-transaction.d.ts","sourceRoot":"","sources":["../../../../src/utils/external-signing/execute-external-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,KAAK,mCAAmC,EACxC,KAAK,oCAAoC,EAC1C,MAAM,kEAAkE,CAAC;AAG1E,MAAM,MAAM,cAAc,GAAG,mCAAmC,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1G,+FAA+F;AAC/F,eAAO,MAAM,mDAAmD;;;;;;EAIoB,CAAC;AAErF,uFAAuF;AACvF,wBAAgB,qDAAqD,IAAI;IACvE,qBAAqB,EAAE;QAAE,KAAK,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACxD,CAMA;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IACpD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,mCAAmC,CAAC,qBAAqB,CAAC,CAAC;CAC3F;AAED,MAAM,WAAW,uCAAuC;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,oCAAoC,CAAC,CAE/C;AAED;;;;;GAKG;AACH,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,uCAAuC,CAAC,CAclD"}
|
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_INTERACTIVE_SUBMISSION_DEDUPLICATION_PERIOD = void 0;
|
|
4
|
+
exports.createDefaultInteractiveSubmissionDeduplicationPeriod = createDefaultInteractiveSubmissionDeduplicationPeriod;
|
|
3
5
|
exports.executeExternalTransaction = executeExternalTransaction;
|
|
4
6
|
exports.executeExternalTransactionAndWait = executeExternalTransactionAndWait;
|
|
5
7
|
const canton_response_utils_1 = require("../canton-response-utils");
|
|
8
|
+
/** Immutable compatibility value. Use the factory below when building a submission request. */
|
|
9
|
+
exports.DEFAULT_INTERACTIVE_SUBMISSION_DEDUPLICATION_PERIOD = Object.freeze({
|
|
10
|
+
DeduplicationDuration: Object.freeze({
|
|
11
|
+
value: Object.freeze({ duration: '30s' }),
|
|
12
|
+
}),
|
|
13
|
+
});
|
|
14
|
+
/** Returns an isolated default deduplication period for one interactive submission. */
|
|
15
|
+
function createDefaultInteractiveSubmissionDeduplicationPeriod() {
|
|
16
|
+
return {
|
|
17
|
+
DeduplicationDuration: {
|
|
18
|
+
value: { duration: exports.DEFAULT_INTERACTIVE_SUBMISSION_DEDUPLICATION_PERIOD.DeduplicationDuration.value.duration },
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
6
22
|
/**
|
|
7
23
|
* Executes an interactive submission after offline signing (`interactiveSubmissionExecute`).
|
|
8
24
|
*
|
|
@@ -35,11 +51,7 @@ function buildExecuteExternalTransactionRequest(options) {
|
|
|
35
51
|
preparedTransaction: options.preparedTransaction,
|
|
36
52
|
hashingSchemeVersion: options.hashingSchemeVersion ?? 'HASHING_SCHEME_VERSION_V2',
|
|
37
53
|
submissionId: options.submissionId,
|
|
38
|
-
deduplicationPeriod: options.deduplicationPeriod ??
|
|
39
|
-
DeduplicationDuration: {
|
|
40
|
-
value: { duration: '30s' },
|
|
41
|
-
},
|
|
42
|
-
},
|
|
54
|
+
deduplicationPeriod: options.deduplicationPeriod ?? createDefaultInteractiveSubmissionDeduplicationPeriod(),
|
|
43
55
|
partySignatures: {
|
|
44
56
|
signatures: [...options.partySignatures],
|
|
45
57
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-external-transaction.js","sourceRoot":"","sources":["../../../../src/utils/external-signing/execute-external-transaction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"execute-external-transaction.js","sourceRoot":"","sources":["../../../../src/utils/external-signing/execute-external-transaction.ts"],"names":[],"mappings":";;;;;;AAKA,oEAA6E;AAI7E,+FAA+F;AAClF,QAAA,mDAAmD,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/E,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC;QACnC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KAC1C,CAAC;CACH,CAAmF,CAAC;AAErF,uFAAuF;AACvF;IAGE,OAAO;QACL,qBAAqB,EAAE;YACrB,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAA,mDAAmD,CAAC,qBAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE;SAC9G;KACgF,CAAC;AACtF,CAAC;AAiBD;;;;;GAKG;AACI,KAAK,qCACV,OAA0C;IAE1C,OAAO,OAAO,CAAC,YAAY,CAAC,4BAA4B,CAAC,sCAAsC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5G,CAAC;AAED;;;;;GAKG;AACI,KAAK,4CACV,OAA0C;IAE1C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,eAAe,CACpD,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,2CAA2C,EAC9E,sCAAsC,CAAC,OAAO,CAAC,EAC/C;QACE,WAAW,EAAE,kBAAkB;QAC/B,kBAAkB,EAAE,IAAI;KACzB,CACF,CAAC;IACF,MAAM,QAAQ,GAAG,IAAA,0CAAkB,EAAC,GAAG,EAAE,UAAU,EAAE,uCAAuC,CAAC,CAAC;IAC9F,OAAO;QACL,QAAQ;QACR,GAAG,EAAE,IAAA,qCAAa,EAAC,GAAG,CAAC;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,sCAAsC,CAC7C,OAA0C;IAE1C,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;QAChD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,2BAA2B;QACjF,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,IAAI,qDAAqD,EAAE;QAC3G,eAAe,EAAE;YACf,UAAU,EAAE,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;SACzC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-party-details.d.ts","sourceRoot":"","sources":["../../../../src/utils/external-signing/external-party-details.ts"],"names":[],"mappings":"AAEA,2FAA2F;AAC3F,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAYlH"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readMatchingExternalPartyDetails = readMatchingExternalPartyDetails;
|
|
4
|
+
const utils_1 = require("../../core/utils");
|
|
5
|
+
/** Reads the first valid party-details record, optionally requiring one exact party id. */
|
|
6
|
+
function readMatchingExternalPartyDetails(source, partyId) {
|
|
7
|
+
if (!(0, utils_1.isRecord)(source))
|
|
8
|
+
return null;
|
|
9
|
+
const { partyDetails } = source;
|
|
10
|
+
const details = Array.isArray(partyDetails) ? partyDetails : [partyDetails];
|
|
11
|
+
for (const detail of details) {
|
|
12
|
+
if (!(0, utils_1.isRecord)(detail))
|
|
13
|
+
continue;
|
|
14
|
+
const { party } = detail;
|
|
15
|
+
if (typeof party !== 'string' || !party.trim())
|
|
16
|
+
continue;
|
|
17
|
+
if (partyId !== undefined && party !== partyId)
|
|
18
|
+
continue;
|
|
19
|
+
return detail;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=external-party-details.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-party-details.js","sourceRoot":"","sources":["../../../../src/utils/external-signing/external-party-details.ts"],"names":[],"mappings":";;;AAAA,4CAA4C;AAE5C,2FAA2F;AAC3F,0CAAiD,MAAe,EAAE,OAAgB;IAChF,IAAI,CAAC,IAAA,gBAAQ,EAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC5E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAA,gBAAQ,EAAC,MAAM,CAAC;YAAE,SAAS;QAChC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,SAAS;QACzD,IAAI,OAAO,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO;YAAE,SAAS;QACzD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { type LedgerJsonApiClient } from '../../clients/ledger-json-api';
|
|
2
|
+
import { type PartySynchronizerReadiness } from '../party-readiness';
|
|
3
|
+
export type ExternalPartyOnboardingState = 'not-found' | 'allocated' | 'in-flight' | 'ready' | 'unknown';
|
|
4
|
+
interface ExternalPartyOnboardingStatusBase {
|
|
5
|
+
readonly state: ExternalPartyOnboardingState;
|
|
6
|
+
readonly partyId: string;
|
|
7
|
+
readonly publicKeyFingerprint: string;
|
|
8
|
+
readonly synchronizerId: string;
|
|
9
|
+
readonly exists: boolean | null;
|
|
10
|
+
readonly ready: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ExternalPartyNotFoundStatus extends ExternalPartyOnboardingStatusBase {
|
|
13
|
+
readonly state: 'not-found';
|
|
14
|
+
readonly exists: false;
|
|
15
|
+
readonly ready: false;
|
|
16
|
+
readonly partyDetails: null;
|
|
17
|
+
}
|
|
18
|
+
export interface ExternalPartyInFlightStatus extends ExternalPartyOnboardingStatusBase {
|
|
19
|
+
readonly state: 'in-flight';
|
|
20
|
+
readonly exists: true;
|
|
21
|
+
readonly ready: false;
|
|
22
|
+
readonly partyDetails: Record<string, unknown>;
|
|
23
|
+
readonly readiness: PartySynchronizerReadiness;
|
|
24
|
+
}
|
|
25
|
+
export interface ExternalPartyAllocatedStatus extends ExternalPartyOnboardingStatusBase {
|
|
26
|
+
readonly state: 'allocated';
|
|
27
|
+
readonly exists: true;
|
|
28
|
+
readonly ready: false;
|
|
29
|
+
readonly partyDetails: Record<string, unknown>;
|
|
30
|
+
readonly readiness: PartySynchronizerReadiness;
|
|
31
|
+
}
|
|
32
|
+
export interface ExternalPartyReadyStatus extends ExternalPartyOnboardingStatusBase {
|
|
33
|
+
readonly state: 'ready';
|
|
34
|
+
readonly exists: true;
|
|
35
|
+
readonly ready: true;
|
|
36
|
+
readonly partyDetails: Record<string, unknown>;
|
|
37
|
+
readonly readiness: PartySynchronizerReadiness;
|
|
38
|
+
}
|
|
39
|
+
export interface ExternalPartyUnknownStatus extends ExternalPartyOnboardingStatusBase {
|
|
40
|
+
readonly state: 'unknown';
|
|
41
|
+
readonly exists: boolean | null;
|
|
42
|
+
readonly ready: false;
|
|
43
|
+
readonly failedAt: 'party-details' | 'readiness';
|
|
44
|
+
readonly failure: ExternalPartyStatusFailure;
|
|
45
|
+
readonly partyDetails?: Record<string, unknown>;
|
|
46
|
+
}
|
|
47
|
+
export type ExternalPartyOnboardingStatus = ExternalPartyNotFoundStatus | ExternalPartyAllocatedStatus | ExternalPartyInFlightStatus | ExternalPartyReadyStatus | ExternalPartyUnknownStatus;
|
|
48
|
+
export interface ExternalPartyStatusFailure {
|
|
49
|
+
readonly name: string;
|
|
50
|
+
readonly message: string;
|
|
51
|
+
readonly status?: number;
|
|
52
|
+
readonly code?: string;
|
|
53
|
+
readonly context?: unknown;
|
|
54
|
+
}
|
|
55
|
+
export interface ReconcileExternalPartyOnboardingOptions {
|
|
56
|
+
readonly ledgerClient: LedgerJsonApiClient;
|
|
57
|
+
readonly partyId: string;
|
|
58
|
+
readonly publicKeyBase64: string;
|
|
59
|
+
readonly synchronizerId: string;
|
|
60
|
+
readonly identityProviderId?: string;
|
|
61
|
+
readonly participantId?: string;
|
|
62
|
+
/** Set false when local observation, rather than local submit permission, is the intended terminal state. */
|
|
63
|
+
readonly expectSubmitReady?: boolean;
|
|
64
|
+
/** Cancels pending reconciliation reads. */
|
|
65
|
+
readonly signal?: AbortSignal;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Reconciles external-party visibility and submit readiness without relying on allocation error text.
|
|
69
|
+
*
|
|
70
|
+
* `in-flight` means the party is allocated locally but has not yet become submission-capable on the requested
|
|
71
|
+
* synchronizer. `unknown` preserves transport/API uncertainty instead of incorrectly treating it as absence.
|
|
72
|
+
*/
|
|
73
|
+
export declare function reconcileExternalPartyOnboarding(options: ReconcileExternalPartyOnboardingOptions): Promise<ExternalPartyOnboardingStatus>;
|
|
74
|
+
export type ExternalPartyAllocationFailureKind = 'already-exists' | 'definite-rejection' | 'ambiguous';
|
|
75
|
+
export interface ExternalPartyAllocationFailure {
|
|
76
|
+
readonly kind: ExternalPartyAllocationFailureKind;
|
|
77
|
+
readonly definite: boolean;
|
|
78
|
+
readonly shouldReconcile: boolean;
|
|
79
|
+
readonly status?: number;
|
|
80
|
+
readonly code?: string;
|
|
81
|
+
readonly details: ExternalPartyStatusFailure;
|
|
82
|
+
}
|
|
83
|
+
/** Classifies allocation failures from structured SDK/Canton fields, never from localized error messages. */
|
|
84
|
+
export declare function classifyExternalPartyAllocationFailure(error: unknown): ExternalPartyAllocationFailure;
|
|
85
|
+
export interface ReconcileExternalPartyAllocationFailureOptions extends ReconcileExternalPartyOnboardingOptions {
|
|
86
|
+
readonly error: unknown;
|
|
87
|
+
}
|
|
88
|
+
export interface ExternalPartyAllocationReconciliation {
|
|
89
|
+
readonly failure: ExternalPartyAllocationFailure;
|
|
90
|
+
readonly status: ExternalPartyOnboardingStatus;
|
|
91
|
+
}
|
|
92
|
+
/** Returns one structured allocation failure plus the currently observable party lifecycle state. */
|
|
93
|
+
export declare function reconcileExternalPartyAllocationFailure(options: ReconcileExternalPartyAllocationFailureOptions): Promise<ExternalPartyAllocationReconciliation>;
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=external-party-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-party-lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/utils/external-signing/external-party-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reconcileExternalPartyOnboarding = reconcileExternalPartyOnboarding;
|
|
4
|
+
exports.classifyExternalPartyAllocationFailure = classifyExternalPartyAllocationFailure;
|
|
5
|
+
exports.reconcileExternalPartyAllocationFailure = reconcileExternalPartyAllocationFailure;
|
|
6
|
+
const errors_1 = require("../../core/errors");
|
|
7
|
+
const abort_1 = require("../../core/utils/abort");
|
|
8
|
+
const party_readiness_1 = require("../party-readiness");
|
|
9
|
+
const canton_protocol_1 = require("./canton-protocol");
|
|
10
|
+
const external_party_details_1 = require("./external-party-details");
|
|
11
|
+
const external_party_onboarding_1 = require("./external-party-onboarding");
|
|
12
|
+
/**
|
|
13
|
+
* Reconciles external-party visibility and submit readiness without relying on allocation error text.
|
|
14
|
+
*
|
|
15
|
+
* `in-flight` means the party is allocated locally but has not yet become submission-capable on the requested
|
|
16
|
+
* synchronizer. `unknown` preserves transport/API uncertainty instead of incorrectly treating it as absence.
|
|
17
|
+
*/
|
|
18
|
+
async function reconcileExternalPartyOnboarding(options) {
|
|
19
|
+
const publicKeyFingerprint = (0, canton_protocol_1.assertCantonPartyMatchesPublicKey)({
|
|
20
|
+
partyId: options.partyId,
|
|
21
|
+
publicKeyBase64: options.publicKeyBase64,
|
|
22
|
+
});
|
|
23
|
+
const base = {
|
|
24
|
+
partyId: options.partyId,
|
|
25
|
+
publicKeyFingerprint,
|
|
26
|
+
synchronizerId: options.synchronizerId,
|
|
27
|
+
};
|
|
28
|
+
let partyDetails;
|
|
29
|
+
const createPartyDetailsAbortError = () => reconciliationAborted(options, 'party-details');
|
|
30
|
+
try {
|
|
31
|
+
const raw = await (0, abort_1.runWithAbortSignal)(options.signal, createPartyDetailsAbortError,
|
|
32
|
+
// Preserve the ledger promise's exact settlement order relative to abort.
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
34
|
+
() => options.ledgerClient.getPartyDetails({
|
|
35
|
+
party: options.partyId,
|
|
36
|
+
identityProviderId: options.identityProviderId ?? external_party_onboarding_1.DEFAULT_CANTON_IDENTITY_PROVIDER_ID,
|
|
37
|
+
}));
|
|
38
|
+
const matched = (0, external_party_details_1.readMatchingExternalPartyDetails)(raw, options.partyId);
|
|
39
|
+
if (!matched) {
|
|
40
|
+
return {
|
|
41
|
+
...base,
|
|
42
|
+
state: 'unknown',
|
|
43
|
+
exists: null,
|
|
44
|
+
ready: false,
|
|
45
|
+
failedAt: 'party-details',
|
|
46
|
+
failure: {
|
|
47
|
+
name: 'UnexpectedCantonResponse',
|
|
48
|
+
message: 'Canton party details response did not contain the requested party',
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
partyDetails = matched;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (options.signal?.aborted)
|
|
56
|
+
throw createPartyDetailsAbortError();
|
|
57
|
+
if (readErrorStatus(error) === 404) {
|
|
58
|
+
return {
|
|
59
|
+
...base,
|
|
60
|
+
state: 'not-found',
|
|
61
|
+
exists: false,
|
|
62
|
+
ready: false,
|
|
63
|
+
partyDetails: null,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
...base,
|
|
68
|
+
state: 'unknown',
|
|
69
|
+
exists: null,
|
|
70
|
+
ready: false,
|
|
71
|
+
failedAt: 'party-details',
|
|
72
|
+
failure: normalizeStatusFailure(error),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const createReadinessAbortError = () => reconciliationAborted(options, 'readiness');
|
|
76
|
+
try {
|
|
77
|
+
const readiness = await (0, abort_1.runWithAbortSignal)(options.signal, createReadinessAbortError,
|
|
78
|
+
// Preserve the readiness promise's exact settlement order relative to abort.
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
80
|
+
() => (0, party_readiness_1.checkPartySynchronizerReadiness)({
|
|
81
|
+
ledgerClient: options.ledgerClient,
|
|
82
|
+
party: options.partyId,
|
|
83
|
+
synchronizerId: options.synchronizerId,
|
|
84
|
+
...(options.participantId !== undefined ? { participantId: options.participantId } : {}),
|
|
85
|
+
}));
|
|
86
|
+
if (readiness.ready) {
|
|
87
|
+
return {
|
|
88
|
+
...base,
|
|
89
|
+
state: 'ready',
|
|
90
|
+
exists: true,
|
|
91
|
+
ready: true,
|
|
92
|
+
partyDetails,
|
|
93
|
+
readiness,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (options.expectSubmitReady === false) {
|
|
97
|
+
return {
|
|
98
|
+
...base,
|
|
99
|
+
state: 'allocated',
|
|
100
|
+
exists: true,
|
|
101
|
+
ready: false,
|
|
102
|
+
partyDetails,
|
|
103
|
+
readiness,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
...base,
|
|
108
|
+
state: 'in-flight',
|
|
109
|
+
exists: true,
|
|
110
|
+
ready: false,
|
|
111
|
+
partyDetails,
|
|
112
|
+
readiness,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (options.signal?.aborted)
|
|
117
|
+
throw createReadinessAbortError();
|
|
118
|
+
return {
|
|
119
|
+
...base,
|
|
120
|
+
state: 'unknown',
|
|
121
|
+
exists: true,
|
|
122
|
+
ready: false,
|
|
123
|
+
failedAt: 'readiness',
|
|
124
|
+
failure: normalizeStatusFailure(error),
|
|
125
|
+
partyDetails,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function reconciliationAborted(options, step) {
|
|
130
|
+
return new errors_1.ValidationError('Canton external-party reconciliation was aborted', {
|
|
131
|
+
partyId: options.partyId,
|
|
132
|
+
synchronizerId: options.synchronizerId,
|
|
133
|
+
step,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/** Classifies allocation failures from structured SDK/Canton fields, never from localized error messages. */
|
|
137
|
+
function classifyExternalPartyAllocationFailure(error) {
|
|
138
|
+
const details = normalizeStatusFailure(error);
|
|
139
|
+
const alreadyExists = details.status === 409 && details.code === 'ALREADY_EXISTS';
|
|
140
|
+
if (alreadyExists) {
|
|
141
|
+
return {
|
|
142
|
+
kind: 'already-exists',
|
|
143
|
+
definite: true,
|
|
144
|
+
shouldReconcile: true,
|
|
145
|
+
status: 409,
|
|
146
|
+
code: 'ALREADY_EXISTS',
|
|
147
|
+
details,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const definiteAnswer = (0, errors_1.readCantonDefiniteAnswer)(error);
|
|
151
|
+
const definite = definiteAnswer ??
|
|
152
|
+
(error instanceof errors_1.ValidationError || error instanceof errors_1.OperationError || (0, errors_1.isDefiniteCantonMutationRejection)(error));
|
|
153
|
+
return {
|
|
154
|
+
kind: definite ? 'definite-rejection' : 'ambiguous',
|
|
155
|
+
definite,
|
|
156
|
+
shouldReconcile: !definite,
|
|
157
|
+
...(details.status !== undefined ? { status: details.status } : {}),
|
|
158
|
+
...(details.code !== undefined ? { code: details.code } : {}),
|
|
159
|
+
details,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/** Returns one structured allocation failure plus the currently observable party lifecycle state. */
|
|
163
|
+
async function reconcileExternalPartyAllocationFailure(options) {
|
|
164
|
+
const failure = classifyExternalPartyAllocationFailure(options.error);
|
|
165
|
+
const status = await reconcileExternalPartyOnboarding(options);
|
|
166
|
+
return { failure, status };
|
|
167
|
+
}
|
|
168
|
+
function normalizeStatusFailure(error) {
|
|
169
|
+
const normalized = (0, errors_1.normalizeCantonError)(error);
|
|
170
|
+
if (normalized)
|
|
171
|
+
return toStatusFailure(normalized);
|
|
172
|
+
if (error instanceof Error) {
|
|
173
|
+
return { name: error.name, message: error.message };
|
|
174
|
+
}
|
|
175
|
+
return { name: 'UnknownError', message: describeUnknownFailure(error) };
|
|
176
|
+
}
|
|
177
|
+
function describeUnknownFailure(error) {
|
|
178
|
+
if (typeof error === 'string')
|
|
179
|
+
return error;
|
|
180
|
+
try {
|
|
181
|
+
const serialized = JSON.stringify(error);
|
|
182
|
+
if (typeof serialized === 'string')
|
|
183
|
+
return serialized;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Fall through when the thrown value is not JSON-serializable.
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
return String(error);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return 'Unserializable thrown value';
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function toStatusFailure(details) {
|
|
196
|
+
return {
|
|
197
|
+
name: details.name,
|
|
198
|
+
message: details.message,
|
|
199
|
+
...(details.status !== undefined ? { status: details.status } : {}),
|
|
200
|
+
...(details.code !== undefined ? { code: details.code } : {}),
|
|
201
|
+
...(details.context !== undefined ? { context: details.context } : {}),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function readErrorStatus(error) {
|
|
205
|
+
return (0, errors_1.normalizeCantonError)(error)?.status;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=external-party-lifecycle.js.map
|