@layerzerolabs/common-canton 0.2.108 → 0.2.109

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.
@@ -10,40 +10,37 @@ import type { PartialBy } from '@layerzerolabs/typescript-utils';
10
10
 
11
11
  // === Component schemas ===
12
12
 
13
- // Payload fields (createArguments, choiceArgument, contractKey) are z.any() —
14
- // arbitrary Daml values whose shape depends on the template.
15
-
16
- const createCommandSchema = z.object({
17
- templateId: z.string(),
18
- createArguments: z.any(),
19
- });
20
-
21
- const exerciseCommandSchema = z.object({
22
- templateId: z.string(),
23
- contractId: z.string(),
24
- choice: z.string(),
25
- choiceArgument: z.any(),
26
- });
27
-
28
- const createAndExerciseCommandSchema = z.object({
29
- templateId: z.string(),
30
- createArguments: z.any(),
31
- choice: z.string(),
32
- choiceArgument: z.any(),
33
- });
34
-
35
- const exerciseByKeyCommandSchema = z.object({
36
- templateId: z.string(),
37
- contractKey: z.any(),
38
- choice: z.string(),
39
- choiceArgument: z.any(),
40
- });
41
-
42
13
  export const cantonCommandSchema = z.union([
43
- z.object({ createCommand: createCommandSchema }),
44
- z.object({ exerciseCommand: exerciseCommandSchema }),
45
- z.object({ createAndExerciseCommand: createAndExerciseCommandSchema }),
46
- z.object({ exerciseByKeyCommand: exerciseByKeyCommandSchema }),
14
+ z.object({
15
+ createCommand: z.object({
16
+ templateId: z.string(),
17
+ createArguments: z.any(),
18
+ }),
19
+ }),
20
+ z.object({
21
+ exerciseCommand: z.object({
22
+ templateId: z.string(),
23
+ contractId: z.string(),
24
+ choice: z.string(),
25
+ choiceArgument: z.any(),
26
+ }),
27
+ }),
28
+ z.object({
29
+ createAndExerciseCommand: z.object({
30
+ templateId: z.string(),
31
+ createArguments: z.any(),
32
+ choice: z.string(),
33
+ choiceArgument: z.any(),
34
+ }),
35
+ }),
36
+ z.object({
37
+ exerciseByKeyCommand: z.object({
38
+ templateId: z.string(),
39
+ contractKey: z.any(),
40
+ choice: z.string(),
41
+ choiceArgument: z.any(),
42
+ }),
43
+ }),
47
44
  ]);
48
45
 
49
46
  export const cantonDisclosedContractSchema = z.object({
@@ -53,54 +50,27 @@ export const cantonDisclosedContractSchema = z.object({
53
50
  synchronizerId: z.string(),
54
51
  });
55
52
 
56
- /** Whose Active Contract Set a refresh entry is queried against:
57
- * - `'sender'`: the deferred register sender, resolved at sign time. Correct for
58
- * contracts the sender is a stakeholder of (e.g. its own amulet holdings).
59
- * - `{ party }`: an explicit stakeholder party known at build time. Needed for
60
- * contracts the sender cannot see — e.g. a signatory-controlled
61
- * RequestFactoryConfig, which only its handler (the signatory) is guaranteed
62
- * to have in its ACS. */
63
- export const refreshPartyFilterSchema = z.union([
64
- z.literal('sender'),
65
- z.object({ party: z.string() }),
66
- ]);
67
-
68
- /** A contract located by an Active Contract Set query, run as a party that can see
69
- * it (the sender for holdings; a config's handler/admin for RequestFactory/OFT). */
70
- const ledgerRefreshEntrySchema = z.object({
71
- /** Party whose Active Contract Set to query. `'sender'` is resolved at sign time. */
72
- partyToFilter: refreshPartyFilterSchema,
73
- /** Template id to query. */
74
- templateId: z.string(),
75
- });
53
+ // === Lifecycle schemas ===
76
54
 
77
55
  /**
78
- * Declarative description of ledger contracts the building factory deferred to sign
79
- * time, resolved by a generic ledger-query refresh executor. (The amulet fee context is
80
- * refreshed automatically when a command carries its placeholder, so it isn't declared
81
- * here.)
56
+ * Canton transaction schema for Daml Ledger API commands.
82
57
  */
83
- export const cantonRefreshSpecSchema = z.object({
84
- /** Command-tree placeholders, each replaced with the contract id(s) from a ledger query. */
85
- commands: z
86
- .array(
87
- ledgerRefreshEntrySchema.extend({
88
- /** Sentinel to replace in the command tree. */
89
- placeholder: z.string(),
90
- /** When true, the placeholder is replaced with the full array of resolved
91
- * contract ids (e.g. amulet holdings); otherwise with the single id. */
92
- multiple: z.boolean().optional(),
93
- }),
94
- )
95
- .optional(),
96
- /** Contracts fetched via a ledger query (run as each entry's `partyToFilter`)
97
- * and appended to disclosedContracts. */
98
- disclosedContracts: z.array(ledgerRefreshEntrySchema).optional(),
99
- });
58
+ export const cantonTransactionSchema = transactionSchema.extend({
59
+ populatedTransaction: z.object({
60
+ unresolvedCommands: z.array(cantonCommandSchema),
61
+ unresolvedDisclosedContracts: z.array(cantonDisclosedContractSchema),
100
62
 
101
- export type CantonRefreshSpec = z.infer<typeof cantonRefreshSpecSchema>;
63
+ /** Parties submitting the command (actAs) */
64
+ actAs: z.array(z.string()),
65
+ /** Maps each actAs party → the senderEntityName(s) controlling its signing
66
+ * key(s), always as an array. `.optional()` only so deferred-sender create-time
67
+ * payloads parse; by sign time every actAs party must map, or signing throws.
68
+ * Multiple entries = a multisig party (decentralized namespace) whose keys must
69
+ * all sign. */
70
+ partyToSenderEntity: z.record(z.string(), z.array(z.string())).optional(),
71
+ }),
72
+ });
102
73
 
103
- /** Output of prepareForSigning — needed by submitSigned to execute the transaction. */
104
74
  const cantonInflightTransactionSchema = z.object({
105
75
  /** The prepared transaction blob */
106
76
  preparedTransaction: z.string(),
@@ -113,41 +83,12 @@ const cantonInflightTransactionSchema = z.object({
113
83
  ]),
114
84
  /** Command ID for tracking */
115
85
  commandId: z.string(),
116
- /** Ledger offset at which the submission landed — used as `beginExclusive`
117
- * for waitForCommand to avoid polling from the start of the ledger.
118
- * Optional: only present after send(); absent for old/retry scenarios. */
86
+ // Ledger offset at which the submission landed — used as `beginExclusive`
87
+ // for waitForCommand to avoid polling from the start of the ledger.
88
+ // Optional: only present after send(); absent for old/retry scenarios.
119
89
  completionOffset: z.number().optional(),
120
90
  });
121
91
 
122
- // === Lifecycle schemas ===
123
-
124
- /**
125
- * Canton transaction schema for Daml Ledger API commands.
126
- *
127
- * Canton uses an interactive submission (prepare-sign-submit) flow for external party signing.
128
- * The populatedTransaction contains the commands to send to prepareForSigning.
129
- */
130
- export const cantonTransactionSchema = transactionSchema.extend({
131
- populatedTransaction: z.object({
132
- /** Parties submitting the command (actAs) */
133
- actAs: z.array(z.string()),
134
- /** Daml commands to send to prepareForSigning */
135
- commands: z.array(cantonCommandSchema),
136
- /** Disclosed contracts for contract/key lookups */
137
- disclosedContracts: z.array(cantonDisclosedContractSchema),
138
- /** Maps each actAs party → the senderEntityName(s) controlling its signing
139
- * key(s), always as an array. `.optional()` only so deferred-sender create-time
140
- * payloads parse; by sign time every actAs party must map, or signing throws.
141
- * Multiple entries = a multisig party (decentralized namespace) whose keys must
142
- * all sign. */
143
- partyToSenderEntity: z.record(z.string(), z.array(z.string())).optional(),
144
- /** Sign-time refresh spec for placeholders the building factory deferred
145
- * (e.g. amulet input holdings, disclosures, time-sensitive choice context).
146
- * Resolved by the generic refresh executor before prepareForSigning. */
147
- refreshSpec: cantonRefreshSpecSchema.optional(),
148
- }),
149
- });
150
-
151
92
  /**
152
93
  * Assigned transaction includes the inflight transaction data.
153
94
  */
@@ -161,6 +102,9 @@ export const cantonAssignedTransactionSchema = assignedTransactionSchema.extend(
161
102
  */
162
103
  export const cantonSignedTransactionSchema = signedTransactionSchema.extend({
163
104
  ...cantonAssignedTransactionSchema.shape,
105
+ // Resolved commands and contracts
106
+ commands: z.array(cantonCommandSchema),
107
+ disclosedContracts: z.array(cantonDisclosedContractSchema),
164
108
  signedTransaction: z.object({
165
109
  /** Per-party signatures in the format expected by Canton's submitSigned */
166
110
  signatures: z.array(
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/events.ts"],"names":["cantonTxWithResultSchema","buildTransactionWithResultSchema","cantonTransactionSchema","REQUEST_ARCHIVAL_POLL_INTERVAL_MS","REQUEST_ARCHIVAL_MAX_ATTEMPTS","IREQUEST_ACCEPT_CHOICE","IREQUEST_REJECT_CHOICE","REQUEST_TEMPLATE_QUALIFIED_NAME","fetchCreatedEvents","client","updateId","parties","cantonTx","fetchTransactionByUpdateId","events","filter","event","map","CreatedEvent","findMatchingCreatedEvent","createdEvents","expectedTemplateId","expectedSignatories","expectedSet","Set","find","templateId","signatories","length","every","s","has","findMatchingCreatedEventFromTx","tx","parsed","safeParse","success","data","result","type","commands","actAs","populatedTransaction","minedTxHash","createCommand","cantonDeploymentSucceeded","txWithResult","cantonRegisterSucceeded","listUserParties","requestEvent","includes","waitForRequestArchival","contractId","waitForArchival","attempt","archived","fetchEventsByContractId","fetchTransactionByOffset","offset","Promise","resolve","setTimeout","NonRetryableError","getExercisedChoiceArgument","transaction","choice","ExercisedEvent","exercised","choiceArgument","undefined","requestContractId","accept","reject","reason","rejectContext","JSON","stringify","slice","consuming","getConsumingChoice"],"mappings":"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","file":"C6X67NTL.js","sourcesContent":["import { buildTransactionWithResultSchema } from '@layerzerolabs/common-chain-model';\nimport { NonRetryableError } from '@layerzerolabs/common-error-utils';\n\nimport type { CantonTransaction, ICantonClient } from './client';\nimport type { CreatedEvent } from './open-api/models';\nimport { cantonTransactionSchema } from './transaction';\n\nconst cantonTxWithResultSchema = buildTransactionWithResultSchema(cantonTransactionSchema);\n\n// TODO(canton): confirm these poll values are enough to wait for archival across environments.\nconst REQUEST_ARCHIVAL_POLL_INTERVAL_MS = 2000;\nconst REQUEST_ARCHIVAL_MAX_ATTEMPTS = 60;\n\n// IRequest interface choices that consume the Request contract via `archive reqCid` in their impls.\nconst IREQUEST_ACCEPT_CHOICE = 'IRequest_Accept';\nconst IREQUEST_REJECT_CHOICE = 'IRequest_Reject';\n\nconst REQUEST_TEMPLATE_QUALIFIED_NAME = 'Request:Request';\n\n/**\n * Fetches a transaction by updateId and returns all CreatedEvents.\n */\nexport const fetchCreatedEvents = async (\n client: ICantonClient,\n updateId: string,\n parties: string[],\n): Promise<CreatedEvent[]> => {\n const cantonTx = await client.fetchTransactionByUpdateId(updateId, parties);\n return (\n cantonTx.events\n ?.filter((event): event is { CreatedEvent: CreatedEvent } => 'CreatedEvent' in event)\n .map((event) => event.CreatedEvent) ?? []\n );\n};\n\n/**\n * Finds a CreatedEvent matching the expected templateId whose signatories\n * are a subset of the provided actAs parties.\n */\nexport const findMatchingCreatedEvent = (\n createdEvents: CreatedEvent[],\n expectedTemplateId: string,\n expectedSignatories: string[],\n): CreatedEvent | undefined => {\n const expectedSet = new Set(expectedSignatories);\n return createdEvents.find((event) => {\n if (event.templateId !== expectedTemplateId) return false;\n const signatories = event.signatories ?? [];\n return signatories.length > 0 && signatories.every((s) => expectedSet.has(s));\n });\n};\n\n/**\n * Parses a Canton transaction-with-result, fetches the created events from the ledger,\n * and returns the first CreatedEvent matching the submitted command's templateId and actAs\n * signatories. Returns null if the transaction is falsy, not successful, or has no match.\n */\nexport const findMatchingCreatedEventFromTx = async (\n client: ICantonClient,\n tx: unknown,\n): Promise<CreatedEvent | null> => {\n if (!tx) return null;\n\n const parsed = cantonTxWithResultSchema.safeParse(tx);\n if (!parsed.success) return null;\n if (parsed.data.result.type !== 'success') return null;\n\n const { commands, actAs } = parsed.data.populatedTransaction;\n const updateId = parsed.data.result.minedTxHash;\n\n if (!updateId || !actAs.length) return null;\n\n const createCommand = commands[0];\n if (!createCommand || !('createCommand' in createCommand)) return null;\n\n const createdEvents = await fetchCreatedEvents(client, updateId, actAs);\n return (\n findMatchingCreatedEvent(createdEvents, createCommand.createCommand.templateId, actAs) ??\n null\n );\n};\n\n/**\n * Checks that a Canton deploy transaction resulted in a CreatedEvent\n * matching the submitted command's templateId and actAs signatories.\n */\nexport const cantonDeploymentSucceeded = async (\n client: ICantonClient,\n txWithResult: unknown,\n): Promise<boolean> => {\n return (await findMatchingCreatedEventFromTx(client, txWithResult)) != null;\n};\n\n/**\n * Success check for register-style deploys (an exercise on Uln302 that creates a\n * Request, which the validator then accepts or rejects in a later transaction).\n *\n * Positively confirms acceptance: locate the Request created by this submission,\n * then delegate to waitForRequestArchival, which waits for the Request to be\n * archived and verifies the IRequest_Accept choice ran (throwing on reject,\n * unexpected archival, or timeout). This is a positive accept check rather than\n * inferring success from the absence of a rejection event.\n */\nexport const cantonRegisterSucceeded = async (\n client: ICantonClient,\n txWithResult: unknown,\n): Promise<boolean> => {\n const parsed = cantonTxWithResultSchema.safeParse(txWithResult);\n if (!parsed.success || parsed.data.result.type !== 'success') return false;\n\n const updateId = parsed.data.result.minedTxHash;\n if (!updateId) return false;\n\n // Deferred-sender register payloads build with empty actAs (the sender is\n // resolved at sign time), so fall back to the parties this user can read as.\n const { actAs } = parsed.data.populatedTransaction;\n const parties = actAs.length ? actAs : await client.listUserParties();\n if (!parties.length) return false;\n\n const createdEvents = await fetchCreatedEvents(client, updateId, parties);\n const requestEvent = createdEvents.find((event) =>\n event.templateId?.includes(REQUEST_TEMPLATE_QUALIFIED_NAME),\n );\n if (!requestEvent) return false;\n\n try {\n await waitForRequestArchival(client, requestEvent.contractId, parties);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Poll until `contractId` is archived, then return the transaction tree that\n * archived it. Generic: knows nothing about which choice did the archiving.\n * Throws NonRetryableError on timeout.\n */\nexport const waitForArchival = async (\n client: ICantonClient,\n contractId: string,\n parties: string[],\n): Promise<CantonTransaction> => {\n for (let attempt = 1; attempt <= REQUEST_ARCHIVAL_MAX_ATTEMPTS; attempt++) {\n const { archived } = await client.fetchEventsByContractId(contractId, parties);\n if (archived) {\n return client.fetchTransactionByOffset(archived.offset, parties);\n }\n // Skip the sleep on the final attempt — there's no next iteration to wait for.\n if (attempt < REQUEST_ARCHIVAL_MAX_ATTEMPTS) {\n await new Promise((resolve) => setTimeout(resolve, REQUEST_ARCHIVAL_POLL_INTERVAL_MS));\n }\n }\n throw new NonRetryableError(\n `Archival timeout (${REQUEST_ARCHIVAL_MAX_ATTEMPTS} attempts) for ${contractId}`,\n );\n};\n\n/**\n * Return the argument of the first exercise of `choice` on `contractId` in a\n * transaction tree, typed as the caller expects. Generic over choice and arg\n * type; returns undefined when no such exercise is present.\n */\nexport const getExercisedChoiceArgument = <TArg = unknown>(\n transaction: CantonTransaction,\n contractId: string,\n choice: string,\n): TArg | undefined => {\n for (const event of transaction.events ?? []) {\n if (!('ExercisedEvent' in event)) continue;\n const { ExercisedEvent: exercised } = event;\n if (exercised.contractId === contractId && exercised.choice === choice) {\n return exercised.choiceArgument as TArg;\n }\n }\n return undefined;\n};\n\n/**\n * Wait for a Request to be archived and confirm it was accepted, returning the\n * IRequest_Accept choice argument typed as `TAccept` (callers pass the codegen\n * `IRequest_Accept` type to get `acceptContext` typed).\n *\n * IRequest_Accept and IRequest_Reject both end with `archive reqCid` in their\n * Daml impls, so the archive alone can't distinguish them — the choice is read\n * off the archive transaction tree. Throws NonRetryableError on rejection, on\n * archival via any other choice (unexpected), or on timeout.\n */\nexport const waitForRequestArchival = async <TAccept = unknown>(\n client: ICantonClient,\n requestContractId: string,\n parties: string[],\n): Promise<TAccept> => {\n const transaction = await waitForArchival(client, requestContractId, parties);\n\n const accept = getExercisedChoiceArgument<TAccept>(\n transaction,\n requestContractId,\n IREQUEST_ACCEPT_CHOICE,\n );\n if (accept !== undefined) return accept;\n\n const reject = getExercisedChoiceArgument<{ rejectContext?: unknown }>(\n transaction,\n requestContractId,\n IREQUEST_REJECT_CHOICE,\n );\n if (reject !== undefined) {\n const reason = reject.rejectContext\n ? JSON.stringify(reject.rejectContext).slice(0, 500)\n : 'unknown';\n throw new NonRetryableError(`Request rejected — rejectContext: ${reason}`);\n }\n\n const consuming = getConsumingChoice(transaction, requestContractId);\n throw new NonRetryableError(\n `Request ${requestContractId} archived via unexpected choice ${consuming ?? '<none>'}`,\n );\n};\n\n/** Name of the consuming exercise on `contractId` in a transaction tree, if any. */\nconst getConsumingChoice = (\n transaction: CantonTransaction,\n contractId: string,\n): string | undefined => {\n for (const event of transaction.events ?? []) {\n if (!('ExercisedEvent' in event)) continue;\n const { ExercisedEvent: exercised } = event;\n if (exercised.contractId === contractId && exercised.consuming) {\n return exercised.choice;\n }\n }\n return undefined;\n};\n"]}
package/dist/RPQSAPB3.js DELETED
@@ -1,43 +0,0 @@
1
- import { __name } from './VUOMXK5T.js';
2
- import { mapValues } from 'es-toolkit';
3
-
4
- var visit = /* @__PURE__ */ __name((value, replace) => {
5
- const result = replace(value);
6
- if (result) return result.value;
7
- if (Array.isArray(value)) {
8
- return value.map((item) => visit(item, replace));
9
- }
10
- if (value !== null && typeof value === "object") {
11
- return mapValues(value, (item) => visit(item, replace));
12
- }
13
- return value;
14
- }, "visit");
15
- var containsLeaf = /* @__PURE__ */ __name((value, predicate) => {
16
- if (predicate(value)) return true;
17
- if (Array.isArray(value)) return value.some((item) => containsLeaf(item, predicate));
18
- return value !== null && typeof value === "object" && Object.values(value).some((item) => containsLeaf(item, predicate));
19
- }, "containsLeaf");
20
- var CANTON_SENDER_PLACEHOLDER = "<<CANTON_SENDER_PLACEHOLDER>>";
21
- var isCantonSenderPlaceholder = /* @__PURE__ */ __name((value) => value === CANTON_SENDER_PLACEHOLDER, "isCantonSenderPlaceholder");
22
- var replaceCantonSenderPlaceholders = /* @__PURE__ */ __name((value, senderParty) => visit(value, (leaf) => leaf === CANTON_SENDER_PLACEHOLDER ? {
23
- value: senderParty
24
- } : void 0), "replaceCantonSenderPlaceholders");
25
- var containsCantonSenderPlaceholder = /* @__PURE__ */ __name((value) => containsLeaf(value, (leaf) => leaf === CANTON_SENDER_PLACEHOLDER), "containsCantonSenderPlaceholder");
26
- var CANTON_AMULET_CIDS_PLACEHOLDER = "<<CANTON_AMULET_CIDS_PLACEHOLDER>>";
27
- var isAmuletCidsPlaceholderArray = /* @__PURE__ */ __name((value) => Array.isArray(value) && value.length === 1 && value[0] === CANTON_AMULET_CIDS_PLACEHOLDER, "isAmuletCidsPlaceholderArray");
28
- var containsCantonAmuletCidsPlaceholder = /* @__PURE__ */ __name((value) => containsLeaf(value, isAmuletCidsPlaceholderArray), "containsCantonAmuletCidsPlaceholder");
29
- var replaceCantonAmuletCidsPlaceholder = /* @__PURE__ */ __name((value, amuletCids) => visit(value, (leaf) => isAmuletCidsPlaceholderArray(leaf) ? {
30
- value: amuletCids
31
- } : void 0), "replaceCantonAmuletCidsPlaceholder");
32
- var CANTON_AMULET_CONTEXT_PLACEHOLDER = "<<CANTON_AMULET_CONTEXT_PLACEHOLDER>>";
33
- var CANTON_AMULET_RULES_CID_PLACEHOLDER = "<<CANTON_AMULET_RULES_CID_PLACEHOLDER>>";
34
- var CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER = "<<CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER>>";
35
- var isCantonPlaceholder = /* @__PURE__ */ __name((value) => value.startsWith("<<") && value.endsWith(">>"), "isCantonPlaceholder");
36
- var containsPlaceholderValue = /* @__PURE__ */ __name((value, placeholder) => containsLeaf(value, (leaf) => leaf === placeholder), "containsPlaceholderValue");
37
- var replacePlaceholderValue = /* @__PURE__ */ __name((value, placeholder, replacement) => visit(value, (leaf) => leaf === placeholder ? {
38
- value: replacement
39
- } : void 0), "replacePlaceholderValue");
40
-
41
- export { CANTON_AMULET_CIDS_PLACEHOLDER, CANTON_AMULET_CONTEXT_PLACEHOLDER, CANTON_AMULET_RULES_CID_PLACEHOLDER, CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER, CANTON_SENDER_PLACEHOLDER, containsCantonAmuletCidsPlaceholder, containsCantonSenderPlaceholder, containsPlaceholderValue, isCantonPlaceholder, isCantonSenderPlaceholder, replaceCantonAmuletCidsPlaceholder, replaceCantonSenderPlaceholders, replacePlaceholderValue };
42
- //# sourceMappingURL=RPQSAPB3.js.map
43
- //# sourceMappingURL=RPQSAPB3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/senderPlaceholder.ts"],"names":["visit","value","replace","result","Array","isArray","map","item","mapValues","containsLeaf","predicate","some","Object","values","CANTON_SENDER_PLACEHOLDER","isCantonSenderPlaceholder","replaceCantonSenderPlaceholders","senderParty","leaf","undefined","containsCantonSenderPlaceholder","CANTON_AMULET_CIDS_PLACEHOLDER","isAmuletCidsPlaceholderArray","length","containsCantonAmuletCidsPlaceholder","replaceCantonAmuletCidsPlaceholder","amuletCids","CANTON_AMULET_CONTEXT_PLACEHOLDER","CANTON_AMULET_RULES_CID_PLACEHOLDER","CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER","isCantonPlaceholder","startsWith","endsWith","containsPlaceholderValue","placeholder","replacePlaceholderValue","replacement"],"mappings":"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","file":"RPQSAPB3.js","sourcesContent":["import { mapValues } from 'es-toolkit';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Generic JSON-tree visitors\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Result of a leaf check: either the leaf has been replaced (with `value`),\n * or `undefined` to leave it alone and recurse into its children.\n */\ntype LeafResult = { value: unknown } | undefined;\n\n/** Walk a JSON value and rewrite leaves matched by `replace`; recursion stops at a swapped leaf. */\nconst visit = <T>(value: T, replace: (leaf: unknown) => LeafResult): T => {\n const result = replace(value);\n if (result) return result.value as T;\n if (Array.isArray(value)) {\n return value.map((item) => visit(item, replace)) as T;\n }\n if (value !== null && typeof value === 'object') {\n return mapValues(value as Record<string, unknown>, (item) => visit(item, replace)) as T;\n }\n return value;\n};\n\n/** True if `predicate` matches any leaf or sub-value in the tree. */\nconst containsLeaf = (value: unknown, predicate: (leaf: unknown) => boolean): boolean => {\n if (predicate(value)) return true;\n if (Array.isArray(value)) return value.some((item) => containsLeaf(item, predicate));\n return (\n value !== null &&\n typeof value === 'object' &&\n Object.values(value).some((item) => containsLeaf(item, predicate))\n );\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Sender placeholder\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Sentinel emitted in place of the sender `Party` when the sender is unknown at\n * create time; substituted for the real party at sign time.\n */\nexport const CANTON_SENDER_PLACEHOLDER = '<<CANTON_SENDER_PLACEHOLDER>>';\n\n/**\n * Returns true if `value` is the Canton sender placeholder.\n */\nexport const isCantonSenderPlaceholder = (value: string): boolean =>\n value === CANTON_SENDER_PLACEHOLDER;\n\n/** Replace every {@link CANTON_SENDER_PLACEHOLDER} in a command tree with the actual sender party ID. */\nexport const replaceCantonSenderPlaceholders = <T>(value: T, senderParty: string): T =>\n visit(value, (leaf) =>\n leaf === CANTON_SENDER_PLACEHOLDER ? { value: senderParty } : undefined,\n );\n\n/** Returns true if the command tree contains the sender placeholder anywhere. */\nexport const containsCantonSenderPlaceholder = (value: unknown): boolean =>\n containsLeaf(value, (leaf) => leaf === CANTON_SENDER_PLACEHOLDER);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// AmuletCids placeholder\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Sentinel emitted as the sole element of the `amuletCids` array\n * (`amuletCids: [CANTON_AMULET_CIDS_PLACEHOLDER]`); substituted for the resolved\n * sender's Amulet contract IDs at sign time.\n */\nexport const CANTON_AMULET_CIDS_PLACEHOLDER = '<<CANTON_AMULET_CIDS_PLACEHOLDER>>';\n\nconst isAmuletCidsPlaceholderArray = (value: unknown): value is [string] =>\n Array.isArray(value) && value.length === 1 && value[0] === CANTON_AMULET_CIDS_PLACEHOLDER;\n\n/**\n * Returns true if the command tree contains an amulet-cids placeholder array\n * anywhere — i.e. an array `[CANTON_AMULET_CIDS_PLACEHOLDER]`.\n */\nexport const containsCantonAmuletCidsPlaceholder = (value: unknown): boolean =>\n containsLeaf(value, isAmuletCidsPlaceholderArray);\n\n/**\n * Recursively walks a JSON-serializable value and replaces every\n * `[CANTON_AMULET_CIDS_PLACEHOLDER]` array with the supplied list of resolved\n * Amulet contract IDs.\n */\nexport const replaceCantonAmuletCidsPlaceholder = <T>(value: T, amuletCids: string[]): T =>\n visit(value, (leaf) =>\n isAmuletCidsPlaceholderArray(leaf) ? { value: amuletCids } : undefined,\n );\n\n/** Sentinel for a choice's `extraArgs.context`, replaced with the freshly-fetched\n * amulet choice context at sign time. */\nexport const CANTON_AMULET_CONTEXT_PLACEHOLDER = '<<CANTON_AMULET_CONTEXT_PLACEHOLDER>>';\n\n/** Sentinel for the exercised ExternalPartyAmuletRules contract id, re-pinned to the\n * freshly-fetched amulet fee bundle at sign time. */\nexport const CANTON_AMULET_RULES_CID_PLACEHOLDER = '<<CANTON_AMULET_RULES_CID_PLACEHOLDER>>';\n\n/** Sentinel for a RequestFactoryConfig contract id, swapped for the sender's\n * active config CID at sign time so a re-deploy doesn't strand a baked-in id. */\nexport const CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER =\n '<<CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER>>';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Generic placeholder helpers (sentinel-agnostic)\n//\n// Used by the sign-time refresh executor, which receives the sentinel to match as\n// data (from the transaction's refreshSpec, or a known amulet sentinel) instead of\n// hardcoding it here — keeping these helpers free of any contract knowledge.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Returns true if `value` is any Canton sign-time sentinel — every placeholder\n * above uses the `<<…>>` wrapper, so callers can defer a cid's resolution\n * without matching a specific constant. */\nexport const isCantonPlaceholder = (value: string): boolean =>\n value.startsWith('<<') && value.endsWith('>>');\n\n/** Returns true if any scalar leaf in the tree equals `placeholder`. */\nexport const containsPlaceholderValue = (value: unknown, placeholder: string): boolean =>\n containsLeaf(value, (leaf) => leaf === placeholder);\n\n/** Replace every scalar sentinel leaf equal to `placeholder` with `replacement`. */\nexport const replacePlaceholderValue = <T>(\n value: T,\n placeholder: string,\n replacement: unknown,\n): T => visit(value, (leaf) => (leaf === placeholder ? { value: replacement } : undefined));\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/transaction.ts"],"names":["createCommandSchema","z","object","templateId","string","createArguments","any","exerciseCommandSchema","contractId","choice","choiceArgument","createAndExerciseCommandSchema","exerciseByKeyCommandSchema","contractKey","cantonCommandSchema","union","createCommand","exerciseCommand","createAndExerciseCommand","exerciseByKeyCommand","cantonDisclosedContractSchema","optional","createdEventBlob","synchronizerId","refreshPartyFilterSchema","literal","party","ledgerRefreshEntrySchema","partyToFilter","cantonRefreshSpecSchema","commands","array","extend","placeholder","multiple","boolean","disclosedContracts","cantonInflightTransactionSchema","preparedTransaction","preparedTransactionHash","hashingSchemeVersion","enum","commandId","completionOffset","number","cantonTransactionSchema","transactionSchema","populatedTransaction","actAs","partyToSenderEntity","record","refreshSpec","cantonAssignedTransactionSchema","assignedTransactionSchema","shape","inflightTransaction","cantonSignedTransactionSchema","signedTransactionSchema","signedTransaction","signatures","format","signature","signedBy","signingAlgorithmSpec","cantonMinedTransactionSchema","minedTransactionSchema","buildCantonTransaction","chainName","tx","timestamps","created","Date","now"],"mappings":"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","file":"ZYJRG5VO.js","sourcesContent":["import { z } from 'zod';\n\nimport {\n assignedTransactionSchema,\n minedTransactionSchema,\n signedTransactionSchema,\n transactionSchema,\n} from '@layerzerolabs/common-chain-model';\nimport type { PartialBy } from '@layerzerolabs/typescript-utils';\n\n// === Component schemas ===\n\n// Payload fields (createArguments, choiceArgument, contractKey) are z.any() —\n// arbitrary Daml values whose shape depends on the template.\n\nconst createCommandSchema = z.object({\n templateId: z.string(),\n createArguments: z.any(),\n});\n\nconst exerciseCommandSchema = z.object({\n templateId: z.string(),\n contractId: z.string(),\n choice: z.string(),\n choiceArgument: z.any(),\n});\n\nconst createAndExerciseCommandSchema = z.object({\n templateId: z.string(),\n createArguments: z.any(),\n choice: z.string(),\n choiceArgument: z.any(),\n});\n\nconst exerciseByKeyCommandSchema = z.object({\n templateId: z.string(),\n contractKey: z.any(),\n choice: z.string(),\n choiceArgument: z.any(),\n});\n\nexport const cantonCommandSchema = z.union([\n z.object({ createCommand: createCommandSchema }),\n z.object({ exerciseCommand: exerciseCommandSchema }),\n z.object({ createAndExerciseCommand: createAndExerciseCommandSchema }),\n z.object({ exerciseByKeyCommand: exerciseByKeyCommandSchema }),\n]);\n\nexport const cantonDisclosedContractSchema = z.object({\n templateId: z.string().optional(),\n contractId: z.string(),\n createdEventBlob: z.string(),\n synchronizerId: z.string(),\n});\n\n/** Whose Active Contract Set a refresh entry is queried against:\n * - `'sender'`: the deferred register sender, resolved at sign time. Correct for\n * contracts the sender is a stakeholder of (e.g. its own amulet holdings).\n * - `{ party }`: an explicit stakeholder party known at build time. Needed for\n * contracts the sender cannot see — e.g. a signatory-controlled\n * RequestFactoryConfig, which only its handler (the signatory) is guaranteed\n * to have in its ACS. */\nexport const refreshPartyFilterSchema = z.union([\n z.literal('sender'),\n z.object({ party: z.string() }),\n]);\n\n/** A contract located by an Active Contract Set query, run as a party that can see\n * it (the sender for holdings; a config's handler/admin for RequestFactory/OFT). */\nconst ledgerRefreshEntrySchema = z.object({\n /** Party whose Active Contract Set to query. `'sender'` is resolved at sign time. */\n partyToFilter: refreshPartyFilterSchema,\n /** Template id to query. */\n templateId: z.string(),\n});\n\n/**\n * Declarative description of ledger contracts the building factory deferred to sign\n * time, resolved by a generic ledger-query refresh executor. (The amulet fee context is\n * refreshed automatically when a command carries its placeholder, so it isn't declared\n * here.)\n */\nexport const cantonRefreshSpecSchema = z.object({\n /** Command-tree placeholders, each replaced with the contract id(s) from a ledger query. */\n commands: z\n .array(\n ledgerRefreshEntrySchema.extend({\n /** Sentinel to replace in the command tree. */\n placeholder: z.string(),\n /** When true, the placeholder is replaced with the full array of resolved\n * contract ids (e.g. amulet holdings); otherwise with the single id. */\n multiple: z.boolean().optional(),\n }),\n )\n .optional(),\n /** Contracts fetched via a ledger query (run as each entry's `partyToFilter`)\n * and appended to disclosedContracts. */\n disclosedContracts: z.array(ledgerRefreshEntrySchema).optional(),\n});\n\nexport type CantonRefreshSpec = z.infer<typeof cantonRefreshSpecSchema>;\n\n/** Output of prepareForSigning — needed by submitSigned to execute the transaction. */\nconst cantonInflightTransactionSchema = z.object({\n /** The prepared transaction blob */\n preparedTransaction: z.string(),\n /** Hash of the prepared transaction (what was signed) */\n preparedTransactionHash: z.string(),\n /** Hashing scheme version used */\n hashingSchemeVersion: z.enum([\n 'HASHING_SCHEME_VERSION_UNSPECIFIED',\n 'HASHING_SCHEME_VERSION_V2',\n ]),\n /** Command ID for tracking */\n commandId: z.string(),\n /** Ledger offset at which the submission landed — used as `beginExclusive`\n * for waitForCommand to avoid polling from the start of the ledger.\n * Optional: only present after send(); absent for old/retry scenarios. */\n completionOffset: z.number().optional(),\n});\n\n// === Lifecycle schemas ===\n\n/**\n * Canton transaction schema for Daml Ledger API commands.\n *\n * Canton uses an interactive submission (prepare-sign-submit) flow for external party signing.\n * The populatedTransaction contains the commands to send to prepareForSigning.\n */\nexport const cantonTransactionSchema = transactionSchema.extend({\n populatedTransaction: z.object({\n /** Parties submitting the command (actAs) */\n actAs: z.array(z.string()),\n /** Daml commands to send to prepareForSigning */\n commands: z.array(cantonCommandSchema),\n /** Disclosed contracts for contract/key lookups */\n disclosedContracts: z.array(cantonDisclosedContractSchema),\n /** Maps each actAs party → the senderEntityName(s) controlling its signing\n * key(s), always as an array. `.optional()` only so deferred-sender create-time\n * payloads parse; by sign time every actAs party must map, or signing throws.\n * Multiple entries = a multisig party (decentralized namespace) whose keys must\n * all sign. */\n partyToSenderEntity: z.record(z.string(), z.array(z.string())).optional(),\n /** Sign-time refresh spec for placeholders the building factory deferred\n * (e.g. amulet input holdings, disclosures, time-sensitive choice context).\n * Resolved by the generic refresh executor before prepareForSigning. */\n refreshSpec: cantonRefreshSpecSchema.optional(),\n }),\n});\n\n/**\n * Assigned transaction includes the inflight transaction data.\n */\nexport const cantonAssignedTransactionSchema = assignedTransactionSchema.extend({\n ...cantonTransactionSchema.shape,\n inflightTransaction: cantonInflightTransactionSchema.optional(),\n});\n\n/**\n * Signed transaction includes the DER-encoded ECDSA signature.\n */\nexport const cantonSignedTransactionSchema = signedTransactionSchema.extend({\n ...cantonAssignedTransactionSchema.shape,\n signedTransaction: z.object({\n /** Per-party signatures in the format expected by Canton's submitSigned */\n signatures: z.array(\n z.object({\n party: z.string(),\n signatures: z.array(\n z.object({\n format: z.string(),\n signature: z.string(),\n signedBy: z.string(),\n signingAlgorithmSpec: z.string(),\n }),\n ),\n }),\n ),\n }),\n});\n\n/**\n * Mined transaction with confirmation result.\n */\nexport const cantonMinedTransactionSchema = minedTransactionSchema.extend({\n ...cantonSignedTransactionSchema.shape,\n inflightTransaction: cantonInflightTransactionSchema,\n});\n\n// === Types ===\n\nexport type CantonTx = z.infer<typeof cantonTransactionSchema>;\nexport type CantonAssignedTx = z.infer<typeof cantonAssignedTransactionSchema>;\nexport type CantonSignedTx = z.infer<typeof cantonSignedTransactionSchema>;\nexport type CantonMinedTx = z.infer<typeof cantonMinedTransactionSchema>;\n\n// === Builder ===\n\nexport type BuildCantonTransactionInput = PartialBy<CantonTx, 'chainName' | 'timestamps'>;\n\nexport const buildCantonTransaction = async (\n chainName: string,\n tx: BuildCantonTransactionInput,\n): Promise<CantonTx> => {\n return {\n ...tx,\n chainName,\n timestamps: {\n created: tx.timestamps?.created ?? Date.now(),\n },\n };\n};\n"]}
@@ -1,48 +0,0 @@
1
- /**
2
- * Sentinel emitted in place of the sender `Party` when the sender is unknown at
3
- * create time; substituted for the real party at sign time.
4
- */
5
- export declare const CANTON_SENDER_PLACEHOLDER = "<<CANTON_SENDER_PLACEHOLDER>>";
6
- /**
7
- * Returns true if `value` is the Canton sender placeholder.
8
- */
9
- export declare const isCantonSenderPlaceholder: (value: string) => boolean;
10
- /** Replace every {@link CANTON_SENDER_PLACEHOLDER} in a command tree with the actual sender party ID. */
11
- export declare const replaceCantonSenderPlaceholders: <T>(value: T, senderParty: string) => T;
12
- /** Returns true if the command tree contains the sender placeholder anywhere. */
13
- export declare const containsCantonSenderPlaceholder: (value: unknown) => boolean;
14
- /**
15
- * Sentinel emitted as the sole element of the `amuletCids` array
16
- * (`amuletCids: [CANTON_AMULET_CIDS_PLACEHOLDER]`); substituted for the resolved
17
- * sender's Amulet contract IDs at sign time.
18
- */
19
- export declare const CANTON_AMULET_CIDS_PLACEHOLDER = "<<CANTON_AMULET_CIDS_PLACEHOLDER>>";
20
- /**
21
- * Returns true if the command tree contains an amulet-cids placeholder array
22
- * anywhere — i.e. an array `[CANTON_AMULET_CIDS_PLACEHOLDER]`.
23
- */
24
- export declare const containsCantonAmuletCidsPlaceholder: (value: unknown) => boolean;
25
- /**
26
- * Recursively walks a JSON-serializable value and replaces every
27
- * `[CANTON_AMULET_CIDS_PLACEHOLDER]` array with the supplied list of resolved
28
- * Amulet contract IDs.
29
- */
30
- export declare const replaceCantonAmuletCidsPlaceholder: <T>(value: T, amuletCids: string[]) => T;
31
- /** Sentinel for a choice's `extraArgs.context`, replaced with the freshly-fetched
32
- * amulet choice context at sign time. */
33
- export declare const CANTON_AMULET_CONTEXT_PLACEHOLDER = "<<CANTON_AMULET_CONTEXT_PLACEHOLDER>>";
34
- /** Sentinel for the exercised ExternalPartyAmuletRules contract id, re-pinned to the
35
- * freshly-fetched amulet fee bundle at sign time. */
36
- export declare const CANTON_AMULET_RULES_CID_PLACEHOLDER = "<<CANTON_AMULET_RULES_CID_PLACEHOLDER>>";
37
- /** Sentinel for a RequestFactoryConfig contract id, swapped for the sender's
38
- * active config CID at sign time so a re-deploy doesn't strand a baked-in id. */
39
- export declare const CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER = "<<CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER>>";
40
- /** Returns true if `value` is any Canton sign-time sentinel — every placeholder
41
- * above uses the `<<…>>` wrapper, so callers can defer a cid's resolution
42
- * without matching a specific constant. */
43
- export declare const isCantonPlaceholder: (value: string) => boolean;
44
- /** Returns true if any scalar leaf in the tree equals `placeholder`. */
45
- export declare const containsPlaceholderValue: (value: unknown, placeholder: string) => boolean;
46
- /** Replace every scalar sentinel leaf equal to `placeholder` with `replacement`. */
47
- export declare const replacePlaceholderValue: <T>(value: T, placeholder: string, replacement: unknown) => T;
48
- //# sourceMappingURL=senderPlaceholder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"senderPlaceholder.d.ts","sourceRoot":"","sources":["../src/senderPlaceholder.ts"],"names":[],"mappings":"AAwCA;;;GAGG;AACH,eAAO,MAAM,yBAAyB,kCAAkC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,yBAAyB,GAAI,OAAO,MAAM,KAAG,OACnB,CAAC;AAExC,yGAAyG;AACzG,eAAO,MAAM,+BAA+B,GAAI,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,MAAM,KAAG,CAG9E,CAAC;AAEN,iFAAiF;AACjF,eAAO,MAAM,+BAA+B,GAAI,OAAO,OAAO,KAAG,OACI,CAAC;AAMtE;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,uCAAuC,CAAC;AAKnF;;;GAGG;AACH,eAAO,MAAM,mCAAmC,GAAI,OAAO,OAAO,KAAG,OAChB,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,GAAI,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,MAAM,EAAE,KAAG,CAGlF,CAAC;AAEN;0CAC0C;AAC1C,eAAO,MAAM,iCAAiC,0CAA0C,CAAC;AAEzF;sDACsD;AACtD,eAAO,MAAM,mCAAmC,4CAA4C,CAAC;AAE7F;kFACkF;AAClF,eAAO,MAAM,6CAA6C,sDACH,CAAC;AAUxD;;4CAE4C;AAC5C,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,KAAG,OACF,CAAC;AAEnD,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,GAAI,OAAO,OAAO,EAAE,aAAa,MAAM,KAAG,OACxB,CAAC;AAExD,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,GAAI,CAAC,EACrC,OAAO,CAAC,EACR,aAAa,MAAM,EACnB,aAAa,OAAO,KACrB,CAAwF,CAAC"}
@@ -1,4 +0,0 @@
1
- export { CANTON_AMULET_CIDS_PLACEHOLDER, CANTON_AMULET_CONTEXT_PLACEHOLDER, CANTON_AMULET_RULES_CID_PLACEHOLDER, CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER, CANTON_SENDER_PLACEHOLDER, containsCantonAmuletCidsPlaceholder, containsCantonSenderPlaceholder, containsPlaceholderValue, isCantonPlaceholder, isCantonSenderPlaceholder, replaceCantonAmuletCidsPlaceholder, replaceCantonSenderPlaceholders, replacePlaceholderValue } from './RPQSAPB3.js';
2
- import './VUOMXK5T.js';
3
- //# sourceMappingURL=senderPlaceholder.js.map
4
- //# sourceMappingURL=senderPlaceholder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"senderPlaceholder.js"}
@@ -1,130 +0,0 @@
1
- import { mapValues } from 'es-toolkit';
2
-
3
- // ─────────────────────────────────────────────────────────────────────────────
4
- // Generic JSON-tree visitors
5
- // ─────────────────────────────────────────────────────────────────────────────
6
-
7
- /**
8
- * Result of a leaf check: either the leaf has been replaced (with `value`),
9
- * or `undefined` to leave it alone and recurse into its children.
10
- */
11
- type LeafResult = { value: unknown } | undefined;
12
-
13
- /** Walk a JSON value and rewrite leaves matched by `replace`; recursion stops at a swapped leaf. */
14
- const visit = <T>(value: T, replace: (leaf: unknown) => LeafResult): T => {
15
- const result = replace(value);
16
- if (result) return result.value as T;
17
- if (Array.isArray(value)) {
18
- return value.map((item) => visit(item, replace)) as T;
19
- }
20
- if (value !== null && typeof value === 'object') {
21
- return mapValues(value as Record<string, unknown>, (item) => visit(item, replace)) as T;
22
- }
23
- return value;
24
- };
25
-
26
- /** True if `predicate` matches any leaf or sub-value in the tree. */
27
- const containsLeaf = (value: unknown, predicate: (leaf: unknown) => boolean): boolean => {
28
- if (predicate(value)) return true;
29
- if (Array.isArray(value)) return value.some((item) => containsLeaf(item, predicate));
30
- return (
31
- value !== null &&
32
- typeof value === 'object' &&
33
- Object.values(value).some((item) => containsLeaf(item, predicate))
34
- );
35
- };
36
-
37
- // ─────────────────────────────────────────────────────────────────────────────
38
- // Sender placeholder
39
- // ─────────────────────────────────────────────────────────────────────────────
40
-
41
- /**
42
- * Sentinel emitted in place of the sender `Party` when the sender is unknown at
43
- * create time; substituted for the real party at sign time.
44
- */
45
- export const CANTON_SENDER_PLACEHOLDER = '<<CANTON_SENDER_PLACEHOLDER>>';
46
-
47
- /**
48
- * Returns true if `value` is the Canton sender placeholder.
49
- */
50
- export const isCantonSenderPlaceholder = (value: string): boolean =>
51
- value === CANTON_SENDER_PLACEHOLDER;
52
-
53
- /** Replace every {@link CANTON_SENDER_PLACEHOLDER} in a command tree with the actual sender party ID. */
54
- export const replaceCantonSenderPlaceholders = <T>(value: T, senderParty: string): T =>
55
- visit(value, (leaf) =>
56
- leaf === CANTON_SENDER_PLACEHOLDER ? { value: senderParty } : undefined,
57
- );
58
-
59
- /** Returns true if the command tree contains the sender placeholder anywhere. */
60
- export const containsCantonSenderPlaceholder = (value: unknown): boolean =>
61
- containsLeaf(value, (leaf) => leaf === CANTON_SENDER_PLACEHOLDER);
62
-
63
- // ─────────────────────────────────────────────────────────────────────────────
64
- // AmuletCids placeholder
65
- // ─────────────────────────────────────────────────────────────────────────────
66
-
67
- /**
68
- * Sentinel emitted as the sole element of the `amuletCids` array
69
- * (`amuletCids: [CANTON_AMULET_CIDS_PLACEHOLDER]`); substituted for the resolved
70
- * sender's Amulet contract IDs at sign time.
71
- */
72
- export const CANTON_AMULET_CIDS_PLACEHOLDER = '<<CANTON_AMULET_CIDS_PLACEHOLDER>>';
73
-
74
- const isAmuletCidsPlaceholderArray = (value: unknown): value is [string] =>
75
- Array.isArray(value) && value.length === 1 && value[0] === CANTON_AMULET_CIDS_PLACEHOLDER;
76
-
77
- /**
78
- * Returns true if the command tree contains an amulet-cids placeholder array
79
- * anywhere — i.e. an array `[CANTON_AMULET_CIDS_PLACEHOLDER]`.
80
- */
81
- export const containsCantonAmuletCidsPlaceholder = (value: unknown): boolean =>
82
- containsLeaf(value, isAmuletCidsPlaceholderArray);
83
-
84
- /**
85
- * Recursively walks a JSON-serializable value and replaces every
86
- * `[CANTON_AMULET_CIDS_PLACEHOLDER]` array with the supplied list of resolved
87
- * Amulet contract IDs.
88
- */
89
- export const replaceCantonAmuletCidsPlaceholder = <T>(value: T, amuletCids: string[]): T =>
90
- visit(value, (leaf) =>
91
- isAmuletCidsPlaceholderArray(leaf) ? { value: amuletCids } : undefined,
92
- );
93
-
94
- /** Sentinel for a choice's `extraArgs.context`, replaced with the freshly-fetched
95
- * amulet choice context at sign time. */
96
- export const CANTON_AMULET_CONTEXT_PLACEHOLDER = '<<CANTON_AMULET_CONTEXT_PLACEHOLDER>>';
97
-
98
- /** Sentinel for the exercised ExternalPartyAmuletRules contract id, re-pinned to the
99
- * freshly-fetched amulet fee bundle at sign time. */
100
- export const CANTON_AMULET_RULES_CID_PLACEHOLDER = '<<CANTON_AMULET_RULES_CID_PLACEHOLDER>>';
101
-
102
- /** Sentinel for a RequestFactoryConfig contract id, swapped for the sender's
103
- * active config CID at sign time so a re-deploy doesn't strand a baked-in id. */
104
- export const CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER =
105
- '<<CANTON_REQUEST_FACTORY_CONFIG_CID_PLACEHOLDER>>';
106
-
107
- // ─────────────────────────────────────────────────────────────────────────────
108
- // Generic placeholder helpers (sentinel-agnostic)
109
- //
110
- // Used by the sign-time refresh executor, which receives the sentinel to match as
111
- // data (from the transaction's refreshSpec, or a known amulet sentinel) instead of
112
- // hardcoding it here — keeping these helpers free of any contract knowledge.
113
- // ─────────────────────────────────────────────────────────────────────────────
114
-
115
- /** Returns true if `value` is any Canton sign-time sentinel — every placeholder
116
- * above uses the `<<…>>` wrapper, so callers can defer a cid's resolution
117
- * without matching a specific constant. */
118
- export const isCantonPlaceholder = (value: string): boolean =>
119
- value.startsWith('<<') && value.endsWith('>>');
120
-
121
- /** Returns true if any scalar leaf in the tree equals `placeholder`. */
122
- export const containsPlaceholderValue = (value: unknown, placeholder: string): boolean =>
123
- containsLeaf(value, (leaf) => leaf === placeholder);
124
-
125
- /** Replace every scalar sentinel leaf equal to `placeholder` with `replacement`. */
126
- export const replacePlaceholderValue = <T>(
127
- value: T,
128
- placeholder: string,
129
- replacement: unknown,
130
- ): T => visit(value, (leaf) => (leaf === placeholder ? { value: replacement } : undefined));