@fairmint/canton-node-sdk 0.0.210 → 0.0.211
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/build/src/utils/amulet/external-party-transfer-offer.d.ts +73 -0
- package/build/src/utils/amulet/external-party-transfer-offer.d.ts.map +1 -0
- package/build/src/utils/amulet/external-party-transfer-offer.js +308 -0
- package/build/src/utils/amulet/external-party-transfer-offer.js.map +1 -0
- package/build/src/utils/amulet/index.d.ts +1 -0
- package/build/src/utils/amulet/index.d.ts.map +1 -1
- package/build/src/utils/amulet/index.js +1 -0
- package/build/src/utils/amulet/index.js.map +1 -1
- package/build/src/utils/canton-response-utils.d.ts +3 -0
- package/build/src/utils/canton-response-utils.d.ts.map +1 -0
- package/build/src/utils/canton-response-utils.js +18 -0
- package/build/src/utils/canton-response-utils.js.map +1 -0
- package/build/src/utils/external-signing/canton-protocol.d.ts +57 -0
- package/build/src/utils/external-signing/canton-protocol.d.ts.map +1 -0
- package/build/src/utils/external-signing/canton-protocol.js +339 -0
- package/build/src/utils/external-signing/canton-protocol.js.map +1 -0
- package/build/src/utils/external-signing/execute-external-transaction.d.ts +11 -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 +24 -2
- package/build/src/utils/external-signing/execute-external-transaction.js.map +1 -1
- package/build/src/utils/external-signing/external-party-onboarding.d.ts +65 -0
- package/build/src/utils/external-signing/external-party-onboarding.d.ts.map +1 -0
- package/build/src/utils/external-signing/external-party-onboarding.js +249 -0
- package/build/src/utils/external-signing/external-party-onboarding.js.map +1 -0
- package/build/src/utils/external-signing/index.d.ts +2 -0
- package/build/src/utils/external-signing/index.d.ts.map +1 -1
- package/build/src/utils/external-signing/index.js +2 -0
- package/build/src/utils/external-signing/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type LedgerJsonApiClient } from '../../clients/ledger-json-api';
|
|
2
|
+
import { type ValidatorApiClient } from '../../clients/validator-api';
|
|
3
|
+
import { type ExecuteExternalTransactionAndWaitResult } from '../external-signing/execute-external-transaction';
|
|
4
|
+
export declare const CANTON_TRANSFER_OFFER_TEMPLATE_ID = "#splice-wallet:Splice.Wallet.TransferOffer:TransferOffer";
|
|
5
|
+
export interface CantonDisclosedContract {
|
|
6
|
+
readonly contractId: string;
|
|
7
|
+
readonly templateId: string;
|
|
8
|
+
readonly createdEventBlob: string;
|
|
9
|
+
readonly synchronizerId: string;
|
|
10
|
+
}
|
|
11
|
+
export interface TransferOfferDisclosure {
|
|
12
|
+
readonly contract: CantonDisclosedContract;
|
|
13
|
+
readonly raw: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
export interface PrepareExternalPartyTransferOfferAcceptanceOptions {
|
|
16
|
+
readonly ledgerClient: LedgerJsonApiClient;
|
|
17
|
+
readonly validatorClient?: ValidatorApiClient;
|
|
18
|
+
/** Provider/source party that created the offer. Used for synchronizer and active-contract disclosure lookup. */
|
|
19
|
+
readonly providerPartyId: string;
|
|
20
|
+
readonly userId: string;
|
|
21
|
+
readonly acceptingPartyId: string;
|
|
22
|
+
readonly offerContractId: string;
|
|
23
|
+
readonly commandId?: string;
|
|
24
|
+
readonly synchronizerId?: string;
|
|
25
|
+
readonly disclosedContract?: CantonDisclosedContract;
|
|
26
|
+
readonly verboseHashing?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface PreparedExternalPartyTransferOfferAcceptance {
|
|
29
|
+
readonly offerContractId: string;
|
|
30
|
+
readonly acceptingPartyId: string;
|
|
31
|
+
readonly commandId: string;
|
|
32
|
+
readonly synchronizerId: string;
|
|
33
|
+
readonly preparedTransaction: string;
|
|
34
|
+
readonly preparedTransactionHashHex: string;
|
|
35
|
+
readonly hashingSchemeVersion: string;
|
|
36
|
+
readonly offerDisclosure: TransferOfferDisclosure;
|
|
37
|
+
readonly raw: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
export interface SubmitExternalPartyTransferOfferAcceptanceOptions {
|
|
40
|
+
readonly ledgerClient: LedgerJsonApiClient;
|
|
41
|
+
readonly userId: string;
|
|
42
|
+
readonly acceptingPartyId: string;
|
|
43
|
+
readonly publicKeyBase64: string;
|
|
44
|
+
readonly publicKeyFingerprint?: string | null;
|
|
45
|
+
readonly preparedTransaction: string;
|
|
46
|
+
readonly preparedTransactionHashHex: string;
|
|
47
|
+
readonly signatureBase64: string;
|
|
48
|
+
readonly hashingSchemeVersion?: string;
|
|
49
|
+
readonly submissionId?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface SubmittedExternalPartyTransferOfferAcceptance extends ExecuteExternalTransactionAndWaitResult {
|
|
52
|
+
readonly acceptingPartyId: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Prepares `TransferOffer_Accept` for an externally hosted party.
|
|
56
|
+
*
|
|
57
|
+
* The returned `preparedTransactionHashHex` is the value the end-user key must sign outside the SDK. The helper fetches
|
|
58
|
+
* the transfer-offer disclosed contract from the validator wallet API when available and falls back to Ledger active
|
|
59
|
+
* contracts for the provider/source party.
|
|
60
|
+
*/
|
|
61
|
+
export declare function prepareExternalPartyTransferOfferAcceptance(options: PrepareExternalPartyTransferOfferAcceptanceOptions): Promise<PreparedExternalPartyTransferOfferAcceptance>;
|
|
62
|
+
/** Verifies the end-user signature and executes a prepared `TransferOffer_Accept`, waiting for the update id. */
|
|
63
|
+
export declare function submitExternalPartyTransferOfferAcceptance(options: SubmitExternalPartyTransferOfferAcceptanceOptions): Promise<SubmittedExternalPartyTransferOfferAcceptance>;
|
|
64
|
+
export declare function readRequiredTransferOfferDisclosedContract(input: {
|
|
65
|
+
readonly ledgerClient: LedgerJsonApiClient;
|
|
66
|
+
readonly validatorClient?: ValidatorApiClient;
|
|
67
|
+
readonly providerPartyId: string;
|
|
68
|
+
readonly offerContractId: string;
|
|
69
|
+
readonly synchronizerId: string;
|
|
70
|
+
}): Promise<TransferOfferDisclosure>;
|
|
71
|
+
export declare function readTransferOfferDisclosedContractFromList(source: unknown, offerContractId: string, synchronizerId: string): TransferOfferDisclosure | null;
|
|
72
|
+
export declare function readTransferOfferDisclosedContractFromActiveContracts(source: unknown, offerContractId: string, expectedSynchronizerId?: string): TransferOfferDisclosure | null;
|
|
73
|
+
//# sourceMappingURL=external-party-transfer-offer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-party-transfer-offer.d.ts","sourceRoot":"","sources":["../../../../src/utils/amulet/external-party-transfer-offer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CANTON_TRANSFER_OFFER_TEMPLATE_ID = void 0;
|
|
4
|
+
exports.prepareExternalPartyTransferOfferAcceptance = prepareExternalPartyTransferOfferAcceptance;
|
|
5
|
+
exports.submitExternalPartyTransferOfferAcceptance = submitExternalPartyTransferOfferAcceptance;
|
|
6
|
+
exports.readRequiredTransferOfferDisclosedContract = readRequiredTransferOfferDisclosedContract;
|
|
7
|
+
exports.readTransferOfferDisclosedContractFromList = readTransferOfferDisclosedContractFromList;
|
|
8
|
+
exports.readTransferOfferDisclosedContractFromActiveContracts = readTransferOfferDisclosedContractFromActiveContracts;
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
|
+
const errors_1 = require("../../core/errors");
|
|
11
|
+
const utils_1 = require("../../core/utils");
|
|
12
|
+
const canton_response_utils_1 = require("../canton-response-utils");
|
|
13
|
+
const canton_protocol_1 = require("../external-signing/canton-protocol");
|
|
14
|
+
const execute_external_transaction_1 = require("../external-signing/execute-external-transaction");
|
|
15
|
+
const external_party_onboarding_1 = require("../external-signing/external-party-onboarding");
|
|
16
|
+
const prepare_external_transaction_1 = require("../external-signing/prepare-external-transaction");
|
|
17
|
+
exports.CANTON_TRANSFER_OFFER_TEMPLATE_ID = '#splice-wallet:Splice.Wallet.TransferOffer:TransferOffer';
|
|
18
|
+
/**
|
|
19
|
+
* Prepares `TransferOffer_Accept` for an externally hosted party.
|
|
20
|
+
*
|
|
21
|
+
* The returned `preparedTransactionHashHex` is the value the end-user key must sign outside the SDK. The helper fetches
|
|
22
|
+
* the transfer-offer disclosed contract from the validator wallet API when available and falls back to Ledger active
|
|
23
|
+
* contracts for the provider/source party.
|
|
24
|
+
*/
|
|
25
|
+
async function prepareExternalPartyTransferOfferAcceptance(options) {
|
|
26
|
+
validateRequiredString('providerPartyId', options.providerPartyId);
|
|
27
|
+
validateRequiredString('userId', options.userId);
|
|
28
|
+
validateRequiredString('acceptingPartyId', options.acceptingPartyId);
|
|
29
|
+
validateRequiredString('offerContractId', options.offerContractId);
|
|
30
|
+
const connectedSynchronizerId = await readRequiredConnectedSynchronizerId(options.ledgerClient, options.providerPartyId);
|
|
31
|
+
if (options.synchronizerId && options.synchronizerId !== connectedSynchronizerId) {
|
|
32
|
+
throw new errors_1.ValidationError('Prepared transfer-offer synchronizer no longer matches the provider synchronizer', {
|
|
33
|
+
expectedSynchronizerId: options.synchronizerId,
|
|
34
|
+
connectedSynchronizerId,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const synchronizerId = connectedSynchronizerId;
|
|
38
|
+
const offerDisclosure = options.disclosedContract
|
|
39
|
+
? readCallerTransferOfferDisclosure(options.disclosedContract, options.offerContractId, synchronizerId)
|
|
40
|
+
: await readRequiredTransferOfferDisclosedContract({
|
|
41
|
+
ledgerClient: options.ledgerClient,
|
|
42
|
+
providerPartyId: options.providerPartyId,
|
|
43
|
+
offerContractId: options.offerContractId,
|
|
44
|
+
synchronizerId,
|
|
45
|
+
...(options.validatorClient ? { validatorClient: options.validatorClient } : {}),
|
|
46
|
+
});
|
|
47
|
+
const prepared = await (0, prepare_external_transaction_1.prepareExternalTransaction)({
|
|
48
|
+
ledgerClient: options.ledgerClient,
|
|
49
|
+
commands: [
|
|
50
|
+
{
|
|
51
|
+
ExerciseCommand: {
|
|
52
|
+
templateId: exports.CANTON_TRANSFER_OFFER_TEMPLATE_ID,
|
|
53
|
+
contractId: options.offerContractId,
|
|
54
|
+
choice: 'TransferOffer_Accept',
|
|
55
|
+
choiceArgument: {},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
commandId: options.commandId ?? `accept-transfer-offer-${(0, node_crypto_1.randomUUID)()}`,
|
|
60
|
+
userId: options.userId,
|
|
61
|
+
actAs: [options.acceptingPartyId],
|
|
62
|
+
readAs: [options.acceptingPartyId],
|
|
63
|
+
disclosedContracts: [offerDisclosure.contract],
|
|
64
|
+
synchronizerId,
|
|
65
|
+
verboseHashing: options.verboseHashing ?? false,
|
|
66
|
+
packageIdSelectionPreference: [],
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
offerContractId: options.offerContractId,
|
|
70
|
+
acceptingPartyId: options.acceptingPartyId,
|
|
71
|
+
commandId: prepared.commandId,
|
|
72
|
+
synchronizerId,
|
|
73
|
+
preparedTransaction: (0, canton_response_utils_1.readRequiredString)(prepared, 'preparedTransaction', 'transfer-offer accept prepare'),
|
|
74
|
+
preparedTransactionHashHex: (0, canton_protocol_1.preparedTransactionHashToHex)((0, canton_response_utils_1.readRequiredString)(prepared, 'preparedTransactionHash', 'transfer-offer accept prepare'), 'transfer-offer accept prepare'),
|
|
75
|
+
hashingSchemeVersion: readOptionalString(prepared, 'hashingSchemeVersion') ?? 'HASHING_SCHEME_VERSION_V2',
|
|
76
|
+
offerDisclosure,
|
|
77
|
+
raw: (0, canton_response_utils_1.objectOrEmpty)(prepared),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function readCallerTransferOfferDisclosure(contract, offerContractId, synchronizerId) {
|
|
81
|
+
if (contract.contractId !== offerContractId) {
|
|
82
|
+
throw new errors_1.ValidationError('Disclosed transfer-offer contract ID does not match offerContractId', {
|
|
83
|
+
contractId: contract.contractId,
|
|
84
|
+
offerContractId,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (contract.synchronizerId !== synchronizerId) {
|
|
88
|
+
throw new errors_1.ValidationError('Disclosed transfer-offer synchronizer does not match the provider synchronizer', {
|
|
89
|
+
disclosedSynchronizerId: contract.synchronizerId,
|
|
90
|
+
synchronizerId,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
validateRequiredString('disclosedContract.templateId', contract.templateId);
|
|
94
|
+
validateRequiredString('disclosedContract.createdEventBlob', contract.createdEventBlob);
|
|
95
|
+
return {
|
|
96
|
+
contract,
|
|
97
|
+
raw: { source: 'caller' },
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Verifies the end-user signature and executes a prepared `TransferOffer_Accept`, waiting for the update id. */
|
|
101
|
+
async function submitExternalPartyTransferOfferAcceptance(options) {
|
|
102
|
+
validateRequiredString('userId', options.userId);
|
|
103
|
+
const publicKeyFingerprint = (0, canton_protocol_1.assertCantonPartyMatchesPublicKey)({
|
|
104
|
+
partyId: options.acceptingPartyId,
|
|
105
|
+
publicKeyBase64: options.publicKeyBase64,
|
|
106
|
+
...(options.publicKeyFingerprint !== undefined ? { publicKeyFingerprint: options.publicKeyFingerprint } : {}),
|
|
107
|
+
});
|
|
108
|
+
(0, canton_protocol_1.assertCantonHashSignature)({
|
|
109
|
+
publicKeyBase64: options.publicKeyBase64,
|
|
110
|
+
hashHex: options.preparedTransactionHashHex,
|
|
111
|
+
signatureBase64: options.signatureBase64,
|
|
112
|
+
});
|
|
113
|
+
const result = await (0, execute_external_transaction_1.executeExternalTransactionAndWait)({
|
|
114
|
+
ledgerClient: options.ledgerClient,
|
|
115
|
+
userId: options.userId,
|
|
116
|
+
preparedTransaction: options.preparedTransaction,
|
|
117
|
+
hashingSchemeVersion: options.hashingSchemeVersion ?? 'HASHING_SCHEME_VERSION_V2',
|
|
118
|
+
submissionId: options.submissionId ?? (0, node_crypto_1.randomUUID)(),
|
|
119
|
+
partySignatures: [
|
|
120
|
+
{
|
|
121
|
+
party: options.acceptingPartyId,
|
|
122
|
+
signatures: [
|
|
123
|
+
{
|
|
124
|
+
signature: options.signatureBase64,
|
|
125
|
+
signedBy: publicKeyFingerprint,
|
|
126
|
+
format: external_party_onboarding_1.CANTON_RAW_SIGNATURE_FORMAT,
|
|
127
|
+
signingAlgorithmSpec: external_party_onboarding_1.CANTON_ED25519_SIGNATURE_ALGORITHM,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
...result,
|
|
135
|
+
acceptingPartyId: options.acceptingPartyId,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async function readRequiredTransferOfferDisclosedContract(input) {
|
|
139
|
+
if (input.validatorClient) {
|
|
140
|
+
try {
|
|
141
|
+
const offerList = await input.validatorClient.listTransferOffers();
|
|
142
|
+
const disclosed = readTransferOfferDisclosedContractFromList(offerList, input.offerContractId, input.synchronizerId);
|
|
143
|
+
if (disclosed)
|
|
144
|
+
return disclosed;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Fall through to Ledger active contracts; some validator deployments do not expose created_event_blob here.
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const activeContracts = await input.ledgerClient.getActiveContracts({
|
|
151
|
+
parties: [input.providerPartyId],
|
|
152
|
+
templateIds: [exports.CANTON_TRANSFER_OFFER_TEMPLATE_ID],
|
|
153
|
+
includeCreatedEventBlob: true,
|
|
154
|
+
});
|
|
155
|
+
const disclosed = readTransferOfferDisclosedContractFromActiveContracts(activeContracts, input.offerContractId, input.synchronizerId);
|
|
156
|
+
if (disclosed)
|
|
157
|
+
return disclosed;
|
|
158
|
+
throw new errors_1.OperationError('Canton transfer-offer disclosure was unavailable. Retry after the offer is visible on the ledger.', errors_1.OperationErrorCode.MISSING_CONTRACT, { offerContractId: input.offerContractId });
|
|
159
|
+
}
|
|
160
|
+
function readTransferOfferDisclosedContractFromList(source, offerContractId, synchronizerId) {
|
|
161
|
+
const sourceOffers = (0, utils_1.isRecord)(source) ? source['offers'] : undefined;
|
|
162
|
+
const offers = Array.isArray(sourceOffers) ? sourceOffers : source;
|
|
163
|
+
if (!Array.isArray(offers))
|
|
164
|
+
return null;
|
|
165
|
+
for (const offer of offers) {
|
|
166
|
+
const disclosed = readDisclosedContractFromPossibleOffer(offer, offerContractId, synchronizerId);
|
|
167
|
+
if (disclosed)
|
|
168
|
+
return disclosed;
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
function readTransferOfferDisclosedContractFromActiveContracts(source, offerContractId, expectedSynchronizerId) {
|
|
173
|
+
if (!Array.isArray(source))
|
|
174
|
+
return null;
|
|
175
|
+
for (const item of source) {
|
|
176
|
+
const contractEntry = (0, utils_1.isRecord)(item) ? (0, canton_response_utils_1.objectOrEmpty)(item['contractEntry']) : {};
|
|
177
|
+
const activeContract = (0, canton_response_utils_1.objectOrEmpty)(contractEntry['JsActiveContract']);
|
|
178
|
+
const createdEvent = (0, canton_response_utils_1.objectOrEmpty)(activeContract['createdEvent']);
|
|
179
|
+
const contractId = readFirstString([createdEvent], ['contractId', 'contract_id']);
|
|
180
|
+
if (contractId !== offerContractId)
|
|
181
|
+
continue;
|
|
182
|
+
const templateId = readFirstString([createdEvent], ['templateId', 'template_id']) ?? exports.CANTON_TRANSFER_OFFER_TEMPLATE_ID;
|
|
183
|
+
const createdEventBlob = readFirstString([createdEvent], ['createdEventBlob', 'created_event_blob']);
|
|
184
|
+
const synchronizerId = readFirstString(activeContract, [
|
|
185
|
+
'synchronizerId',
|
|
186
|
+
'synchronizer_id',
|
|
187
|
+
'domainId',
|
|
188
|
+
'domain_id',
|
|
189
|
+
]);
|
|
190
|
+
if (!createdEventBlob || !synchronizerId)
|
|
191
|
+
continue;
|
|
192
|
+
if (expectedSynchronizerId && synchronizerId !== expectedSynchronizerId)
|
|
193
|
+
continue;
|
|
194
|
+
return {
|
|
195
|
+
contract: {
|
|
196
|
+
contractId,
|
|
197
|
+
templateId,
|
|
198
|
+
createdEventBlob,
|
|
199
|
+
synchronizerId,
|
|
200
|
+
},
|
|
201
|
+
raw: {
|
|
202
|
+
source: 'ledger-active-contracts',
|
|
203
|
+
contract: (0, utils_1.isRecord)(item) ? item : {},
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
function readDisclosedContractFromPossibleOffer(source, offerContractId, defaultSynchronizerId) {
|
|
210
|
+
if (!(0, utils_1.isRecord)(source))
|
|
211
|
+
return null;
|
|
212
|
+
const transferOffer = (0, canton_response_utils_1.objectOrEmpty)(source['transfer_offer']);
|
|
213
|
+
const transferOfferContract = (0, canton_response_utils_1.objectOrEmpty)(transferOffer['contract']);
|
|
214
|
+
const offer = (0, canton_response_utils_1.objectOrEmpty)(source['offer']);
|
|
215
|
+
const offerContract = (0, canton_response_utils_1.objectOrEmpty)(offer['contract']);
|
|
216
|
+
const contract = (0, canton_response_utils_1.objectOrEmpty)(source['contract']);
|
|
217
|
+
const records = [source, contract, offer, offerContract, transferOffer, transferOfferContract];
|
|
218
|
+
for (const record of records) {
|
|
219
|
+
const contractId = readFirstString(record, ['contractId', 'contract_id']);
|
|
220
|
+
if (contractId !== offerContractId)
|
|
221
|
+
continue;
|
|
222
|
+
const createdEventBlob = readFirstString(record, ['createdEventBlob', 'created_event_blob']);
|
|
223
|
+
if (!createdEventBlob)
|
|
224
|
+
continue;
|
|
225
|
+
const templateId = readFirstString(record, ['templateId', 'template_id']) ?? exports.CANTON_TRANSFER_OFFER_TEMPLATE_ID;
|
|
226
|
+
const synchronizerId = readFirstString(record, ['synchronizerId', 'synchronizer_id', 'domainId', 'domain_id']) ?? defaultSynchronizerId;
|
|
227
|
+
if (synchronizerId !== defaultSynchronizerId)
|
|
228
|
+
continue;
|
|
229
|
+
return {
|
|
230
|
+
contract: {
|
|
231
|
+
contractId,
|
|
232
|
+
templateId,
|
|
233
|
+
createdEventBlob,
|
|
234
|
+
synchronizerId,
|
|
235
|
+
},
|
|
236
|
+
raw: {
|
|
237
|
+
source: 'validator-transfer-offers',
|
|
238
|
+
contract: source,
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
async function readRequiredConnectedSynchronizerId(ledgerClient, providerPartyId) {
|
|
245
|
+
const raw = await ledgerClient.getConnectedSynchronizers({ party: providerPartyId });
|
|
246
|
+
const synchronizerId = parseRequiredSingleSynchronizerId(raw);
|
|
247
|
+
if (synchronizerId)
|
|
248
|
+
return synchronizerId;
|
|
249
|
+
throw new errors_1.OperationError('Canton provider did not report a connected synchronizer', errors_1.OperationErrorCode.MISSING_DOMAIN_ID);
|
|
250
|
+
}
|
|
251
|
+
function parseRequiredSingleSynchronizerId(raw) {
|
|
252
|
+
if (!(0, utils_1.isRecord)(raw) && !Array.isArray(raw))
|
|
253
|
+
return null;
|
|
254
|
+
const direct = (0, utils_1.isRecord)(raw) ? raw['connectedSynchronizers'] : undefined;
|
|
255
|
+
const itemsField = (0, utils_1.isRecord)(raw) ? raw['items'] : undefined;
|
|
256
|
+
const items = Array.isArray(raw)
|
|
257
|
+
? raw
|
|
258
|
+
: Array.isArray(direct)
|
|
259
|
+
? direct
|
|
260
|
+
: Array.isArray(itemsField)
|
|
261
|
+
? itemsField
|
|
262
|
+
: [];
|
|
263
|
+
const synchronizerIds = [];
|
|
264
|
+
for (const item of items) {
|
|
265
|
+
if (typeof item === 'string' && item.trim()) {
|
|
266
|
+
synchronizerIds.push(item);
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
if (!(0, utils_1.isRecord)(item)) {
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
for (const key of ['synchronizerId', 'synchronizer', 'domainId', 'id']) {
|
|
273
|
+
const value = item[key];
|
|
274
|
+
if (typeof value === 'string' && value.trim()) {
|
|
275
|
+
synchronizerIds.push(value);
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
const uniqueSynchronizerIds = new Set(synchronizerIds);
|
|
281
|
+
if (uniqueSynchronizerIds.size > 1) {
|
|
282
|
+
throw new errors_1.OperationError('Canton provider reported multiple connected synchronizers', errors_1.OperationErrorCode.MISSING_DOMAIN_ID, { synchronizerIds });
|
|
283
|
+
}
|
|
284
|
+
return synchronizerIds[0] ?? null;
|
|
285
|
+
}
|
|
286
|
+
function validateRequiredString(name, value) {
|
|
287
|
+
if (!value.trim()) {
|
|
288
|
+
throw new errors_1.ValidationError(`${name} is required`, { [name]: value });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
function readOptionalString(source, key) {
|
|
292
|
+
if (!(0, utils_1.isRecord)(source) || !(key in source))
|
|
293
|
+
return null;
|
|
294
|
+
const value = source[key];
|
|
295
|
+
return typeof value === 'string' && value.trim() ? value : null;
|
|
296
|
+
}
|
|
297
|
+
function readFirstString(records, keys) {
|
|
298
|
+
const sources = Array.isArray(records) ? records : [records];
|
|
299
|
+
for (const record of sources) {
|
|
300
|
+
for (const key of keys) {
|
|
301
|
+
const value = record[key];
|
|
302
|
+
if (typeof value === 'string' && value.trim())
|
|
303
|
+
return value;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=external-party-transfer-offer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-party-transfer-offer.js","sourceRoot":"","sources":["../../../../src/utils/amulet/external-party-transfer-offer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/amulet/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,UAAU,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/amulet/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,UAAU,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,SAAS,CAAC"}
|
|
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./external-party-cc-transfer"), exports);
|
|
18
|
+
__exportStar(require("./external-party-transfer-offer"), exports);
|
|
18
19
|
__exportStar(require("./get-amulets-for-transfer"), exports);
|
|
19
20
|
__exportStar(require("./get-locked-amulets"), exports);
|
|
20
21
|
__exportStar(require("./offers"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/amulet/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,6DAA2C;AAC3C,uDAAqC;AACrC,2CAAyB;AACzB,0DAAwC;AACxC,2DAAyC;AACzC,4DAA0C;AAC1C,0CAAwB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/amulet/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,kEAAgD;AAChD,6DAA2C;AAC3C,uDAAqC;AACrC,2CAAyB;AACzB,0DAAwC;AACxC,2DAAyC;AACzC,4DAA0C;AAC1C,0CAAwB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canton-response-utils.d.ts","sourceRoot":"","sources":["../../../src/utils/canton-response-utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAS1F;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAErE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readRequiredString = readRequiredString;
|
|
4
|
+
exports.objectOrEmpty = objectOrEmpty;
|
|
5
|
+
const errors_1 = require("../core/errors");
|
|
6
|
+
const utils_1 = require("../core/utils");
|
|
7
|
+
function readRequiredString(source, key, operation) {
|
|
8
|
+
if ((0, utils_1.isRecord)(source) && key in source) {
|
|
9
|
+
const value = source[key];
|
|
10
|
+
if (typeof value === 'string' && value.trim())
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
throw new errors_1.OperationError(`Canton ${operation} response did not include ${key}`, errors_1.OperationErrorCode.TRANSACTION_FAILED);
|
|
14
|
+
}
|
|
15
|
+
function objectOrEmpty(value) {
|
|
16
|
+
return (0, utils_1.isRecord)(value) ? value : {};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=canton-response-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canton-response-utils.js","sourceRoot":"","sources":["../../../src/utils/canton-response-utils.ts"],"names":[],"mappings":";;AAGA,gDASC;AAED,sCAEC;AAhBD,2CAAoE;AACpE,yCAAyC;AAEzC,SAAgB,kBAAkB,CAAC,MAAe,EAAE,GAAW,EAAE,SAAiB;IAChF,IAAI,IAAA,gBAAQ,EAAC,MAAM,CAAC,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,uBAAc,CACtB,UAAU,SAAS,6BAA6B,GAAG,EAAE,EACrD,2BAAkB,CAAC,kBAAkB,CACtC,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface CantonPartyPublicKeyInput {
|
|
2
|
+
readonly partyId: string;
|
|
3
|
+
readonly publicKeyBase64: string;
|
|
4
|
+
readonly publicKeyFingerprint?: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface CantonHashSignatureInput {
|
|
7
|
+
readonly publicKeyBase64: string;
|
|
8
|
+
readonly hashHex: string;
|
|
9
|
+
readonly signatureBase64: string;
|
|
10
|
+
}
|
|
11
|
+
export interface Ed25519SignatureInput {
|
|
12
|
+
readonly publicKeyBase64: string;
|
|
13
|
+
readonly payload: Buffer | Uint8Array | string;
|
|
14
|
+
readonly signatureBase64: string;
|
|
15
|
+
readonly failureMessage?: string;
|
|
16
|
+
}
|
|
17
|
+
/** Normalizes a raw or DER-wrapped Ed25519 public key into Canton's DER X.509 SubjectPublicKeyInfo base64 format. */
|
|
18
|
+
export declare function normalizeEd25519PublicKeyForCanton(publicKeyBase64: string): string;
|
|
19
|
+
/** Extracts and validates the raw 32-byte Ed25519 public key from raw or DER X.509 base64 input. */
|
|
20
|
+
export declare function extractRawEd25519PublicKey(publicKeyBase64: string): Buffer;
|
|
21
|
+
/** Converts a raw or DER-wrapped Ed25519 public key into the equivalent Solana address. */
|
|
22
|
+
export declare function deriveSolanaAddressFromEd25519PublicKeyBase64(publicKeyBase64: string): string;
|
|
23
|
+
/** Derives the Canton fingerprint suffix for an Ed25519 external-party key. */
|
|
24
|
+
export declare function deriveCantonEd25519PublicKeyFingerprint(publicKeyBase64: string): string;
|
|
25
|
+
/** Builds a deterministic external party id from a party hint/prefix and a Canton public-key fingerprint. */
|
|
26
|
+
export declare function buildExternalPartyId(partyHint: string, publicKeyFingerprint: string): string;
|
|
27
|
+
/** Extracts the public-key fingerprint suffix from a Canton party id. */
|
|
28
|
+
export declare function extractPublicKeyFingerprint(partyId: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Verifies that a party id fingerprint and optional caller-supplied fingerprint match a submitted Ed25519 public key.
|
|
31
|
+
*
|
|
32
|
+
* Returns the derived fingerprint when the party/key binding is valid.
|
|
33
|
+
*/
|
|
34
|
+
export declare function assertCantonPartyMatchesPublicKey(input: CantonPartyPublicKeyInput): string;
|
|
35
|
+
/** Converts a Canton hash from hex, base64, or base64url into lowercase hex. */
|
|
36
|
+
export declare function normalizeCantonHashToHex(hash: string, operation?: string): string;
|
|
37
|
+
/** Validates and lowercases a submitted Canton SHA-256 multihash hex value. */
|
|
38
|
+
export declare function assertCantonSha256MultihashHex(value: string): string;
|
|
39
|
+
/** Converts a hex-encoded hash into base64 bytes for browser wallet signing. */
|
|
40
|
+
export declare function hashHexToBase64(hashHex: string): string;
|
|
41
|
+
/** Verifies an Ed25519 signature over a hex-encoded Canton hash. */
|
|
42
|
+
export declare function assertCantonHashSignature(input: CantonHashSignatureInput): void;
|
|
43
|
+
/** Verifies an Ed25519 signature against a raw payload using a raw or DER-wrapped public key. */
|
|
44
|
+
export declare function assertEd25519Signature(input: Ed25519SignatureInput): void;
|
|
45
|
+
/** Produces stable JSON for token/signature payloads by sorting object keys and omitting undefined values. */
|
|
46
|
+
export declare function canonicalizeCantonProtocolPayload(payload: unknown): string;
|
|
47
|
+
/** Hashes a canonicalized protocol payload with SHA-256. */
|
|
48
|
+
export declare function hashCantonProtocolPayload(payload: unknown): string;
|
|
49
|
+
/** Builds an HMAC-bound token for a prepared Canton transaction or topology payload. */
|
|
50
|
+
export declare function buildCantonPrepareToken(secret: string, payload: Record<string, unknown>): string;
|
|
51
|
+
/** Verifies that a submitted prepare token exactly binds to the expected prepared Canton payload. */
|
|
52
|
+
export declare function assertCantonPrepareToken(secret: string, token: string, expectedPayload: Record<string, unknown>): void;
|
|
53
|
+
/** Computes the SHA-256 hex digest of a base64 prepared transaction blob for token binding. */
|
|
54
|
+
export declare function hashPreparedTransaction(preparedTransaction: string): string;
|
|
55
|
+
/** Converts a base64/base64url prepared transaction hash returned by interactive submission into lowercase hex. */
|
|
56
|
+
export declare function preparedTransactionHashToHex(hashBase64: string, operation?: string): string;
|
|
57
|
+
//# sourceMappingURL=canton-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canton-protocol.d.ts","sourceRoot":"","sources":["../../../../src/utils/external-signing/canton-protocol.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IAC/C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,qHAAqH;AACrH,wBAAgB,kCAAkC,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAElF;AAED,oGAAoG;AACpG,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAY1E;AAED,2FAA2F;AAC3F,wBAAgB,6CAA6C,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED,+EAA+E;AAC/E,wBAAgB,uCAAuC,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAMvF;AAED,6GAA6G;AAC7G,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAU5F;AAED,yEAAyE;AACzE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,yBAAyB,GAAG,MAAM,CAkB1F;AAED,gFAAgF;AAChF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAc,GAAG,MAAM,CAkBtF;AAED,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,oEAAoE;AACpE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI,CAO/E;AAED,iGAAiG;AACjG,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAQzE;AAED,8GAA8G;AAC9G,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAE1E;AAED,4DAA4D;AAC5D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAElE;AAED,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAKhG;AAED,qGAAqG;AACrG,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,IAAI,CAUN;AAQD,+FAA+F;AAC/F,wBAAgB,uBAAuB,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,mHAAmH;AACnH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,SAAmC,GAAG,MAAM,CAiBrH"}
|