@canton-network/core-tx-parser 0.1.0 → 0.3.0

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/dist/index.cjs CHANGED
@@ -243,12 +243,12 @@ function isTransferObject(value) {
243
243
  return typeof v.sender === "string" && typeof v.receiver === "string" && typeof v.amount === "string" && typeof v.requestedAt === "string" && typeof v.executeBefore === "string" && Array.isArray(v.inputHoldingCids) && v.inputHoldingCids.every((cid) => typeof cid === "string") && !!instrumentId && typeof instrumentId.admin === "string" && typeof instrumentId.id === "string" && !!meta && typeof meta.values === "object" && meta.values !== null;
244
244
  }
245
245
  var TransactionParser = class {
246
- constructor(transaction, ledgerClient, partyId, isMasterUser) {
247
- __publicField(this, "ledgerClient");
246
+ constructor(ledgerProvider, transaction, partyId, isMasterUser) {
247
+ __publicField(this, "ledgerProvider");
248
248
  __publicField(this, "partyId");
249
249
  __publicField(this, "transaction");
250
250
  __publicField(this, "isMasterUser");
251
- this.ledgerClient = ledgerClient;
251
+ this.ledgerProvider = ledgerProvider;
252
252
  this.partyId = partyId;
253
253
  this.transaction = transaction;
254
254
  this.isMasterUser = isMasterUser;
@@ -710,27 +710,26 @@ var TransactionParser = class {
710
710
  }
711
711
  };
712
712
  const exerciseResultOutputTag = resultTag;
713
- let result = null;
714
- switch (exerciseResultOutputTag) {
715
- case "TransferInstructionResult_Failed":
716
- case "TransferInstructionResult_Pending":
717
- result = await this.buildMergeSplit(
718
- exercisedEvent,
719
- tokenStandardChoice
720
- );
721
- break;
722
- case "TransferInstructionResult_Completed":
723
- result = await this.buildTransfer(
724
- exercisedEvent,
725
- tokenStandardChoice,
726
- transferInstruction
727
- );
728
- break;
729
- default:
730
- throw new Error(
731
- `Unknown TransferInstructionResult: ${exerciseResultOutputTag}`
732
- );
733
- }
713
+ const result = await (async () => {
714
+ switch (exerciseResultOutputTag) {
715
+ case "TransferInstructionResult_Failed":
716
+ case "TransferInstructionResult_Pending":
717
+ return this.buildMergeSplit(
718
+ exercisedEvent,
719
+ tokenStandardChoice
720
+ );
721
+ case "TransferInstructionResult_Completed":
722
+ return this.buildTransfer(
723
+ exercisedEvent,
724
+ tokenStandardChoice,
725
+ transferInstruction
726
+ );
727
+ default:
728
+ throw new Error(
729
+ `Unknown TransferInstructionResult: ${exerciseResultOutputTag}`
730
+ );
731
+ }
732
+ })();
734
733
  return result && {
735
734
  ...result,
736
735
  transferInstruction
@@ -846,8 +845,22 @@ var TransactionParser = class {
846
845
  verbose: true
847
846
  })
848
847
  };
849
- const payload = this.ledgerClient.getCurrentClientVersion() === "3.3" ? { ...basePayload, requestingParties: [] } : basePayload;
850
- const events = await this.ledgerClient.postWithRetry("/v2/events/events-by-contract-id", payload).catch((err) => {
848
+ const version = await this.ledgerProvider.request({
849
+ method: "ledgerApi",
850
+ params: {
851
+ resource: "/v2/version",
852
+ requestMethod: "get"
853
+ }
854
+ });
855
+ const payload = version.version.includes("3.3") ? { ...basePayload, requestingParties: [] } : basePayload;
856
+ const events = await this.ledgerProvider.request({
857
+ method: "ledgerApi",
858
+ params: {
859
+ resource: "/v2/events/events-by-contract-id",
860
+ requestMethod: "post",
861
+ body: payload
862
+ }
863
+ }).catch((err) => {
851
864
  if (err.code === "CONTRACT_EVENTS_NOT_FOUND") {
852
865
  return null;
853
866
  } else {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/types.ts","../src/instrumentmap.ts","../src/parser.ts"],"names":["HOLDING_INTERFACE_ID","TRANSFER_FACTORY_INTERFACE_ID","TRANSFER_INSTRUCTION_INTERFACE_ID","ALLOCATION_FACTORY_INTERFACE_ID","ALLOCATION_INSTRUCTION_INTERFACE_ID","ALLOCATION_INTERFACE_ID","ALLOCATION_REQUEST_INTERFACE_ID","BigNumber","exercisedEvent","EventFilterBySetup"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n TRANSFER_FACTORY_INTERFACE_ID,\n ALLOCATION_FACTORY_INTERFACE_ID,\n ALLOCATION_INSTRUCTION_INTERFACE_ID,\n HOLDING_INTERFACE_ID,\n ALLOCATION_INTERFACE_ID,\n ALLOCATION_REQUEST_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\nexport interface InterfaceIdParts {\n packageName: string\n moduleName: string\n entityName: string\n}\n\nexport function splitInterfaceId(interfaceId: string): InterfaceIdParts | null {\n // Captures 3 groups: pkg, module and entity\n // Note that prefix # is optional in regexp below,\n // format without # is deprecated, but supported in canton 3.3 and will be removed in canton 3.4\n // https://docs.digitalasset.com/build/3.3/reference/lapi-migration-guide.html#identifier-addressing-by-package-name\n const regExp = /^#?([^:]+):([^:]+):([^:]+)$/\n const match = regExp.exec(interfaceId)\n if (!match) return null\n const [, packageName, moduleName, entityName] = match // [0]=full, [1]=pkg, [2]=module, [3]=entity\n return {\n packageName,\n moduleName,\n entityName,\n }\n}\n\nexport function matchInterfaceIds(a: string, b: string): boolean {\n const aParts = splitInterfaceId(a)\n const bParts = splitInterfaceId(b)\n\n return (\n aParts !== null &&\n bParts !== null &&\n aParts.moduleName === bParts.moduleName &&\n aParts.entityName === bParts.entityName\n )\n}\n\nexport const TokenStandardTransactionInterfaces = [\n HOLDING_INTERFACE_ID,\n TRANSFER_FACTORY_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n ALLOCATION_FACTORY_INTERFACE_ID,\n ALLOCATION_INSTRUCTION_INTERFACE_ID,\n ALLOCATION_INTERFACE_ID,\n ALLOCATION_REQUEST_INTERFACE_ID,\n]\n\nconst SpliceMetaKeyPrefix = 'splice.lfdecentralizedtrust.org/'\nexport const TxKindMetaKey = `${SpliceMetaKeyPrefix}tx-kind`\nexport const SenderMetaKey = `${SpliceMetaKeyPrefix}sender`\nexport const ReasonMetaKey = `${SpliceMetaKeyPrefix}reason`\nexport const BurnedMetaKey = `${SpliceMetaKeyPrefix}burned`\nexport const AllKnownMetaKeys = [\n TxKindMetaKey,\n SenderMetaKey,\n ReasonMetaKey,\n BurnedMetaKey,\n]\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { AllKnownMetaKeys, matchInterfaceIds } from './constants.js'\nimport { Types } from '@canton-network/core-ledger-client'\nimport { Holding, TransferInstructionView } from './types.js'\nimport {\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\n\ntype CreatedEvent = Types['CreatedEvent']\ntype ExercisedEvent = Types['ExercisedEvent']\ntype ArchivedEvent = Types['ArchivedEvent']\ntype JsInterfaceView = Types['JsInterfaceView']\n\nexport function hasInterface(\n interfaceId: string,\n event: ExercisedEvent | ArchivedEvent\n): boolean {\n return (event.implementedInterfaces || []).some((id) =>\n matchInterfaceIds(id, interfaceId)\n )\n}\n\nexport function getInterfaceView(\n createdEvent: CreatedEvent\n): JsInterfaceView | null {\n const interfaceViews = createdEvent.interfaceViews || null\n return (interfaceViews && interfaceViews[0]) || null\n}\n\nexport type KnownInterfaceView =\n | { type: 'Holding'; viewValue: Holding }\n | { type: 'TransferInstruction'; viewValue: TransferInstructionView }\n\nexport function getKnownInterfaceView(\n createdEvent: CreatedEvent\n): KnownInterfaceView | null {\n const interfaceView = getInterfaceView(createdEvent)\n if (!interfaceView) {\n return null\n } else if (\n matchInterfaceIds(HOLDING_INTERFACE_ID, interfaceView.interfaceId)\n ) {\n return {\n type: 'Holding',\n viewValue: interfaceView.viewValue as Holding,\n }\n } else if (\n matchInterfaceIds(\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n interfaceView.interfaceId\n )\n ) {\n return {\n type: 'TransferInstruction',\n viewValue: interfaceView.viewValue as TransferInstructionView,\n }\n } else {\n return null\n }\n}\n\n// TODO (#563): handle allocations in such a way that any callers have to handle them too\n/**\n * Use this when `createdEvent` is guaranteed to have an interface view because the ledger api filters\n * include it, and thus is guaranteed to be returned by the API.\n */\nexport function ensureInterfaceViewIsPresent(\n createdEvent: CreatedEvent,\n interfaceId: string\n): JsInterfaceView {\n const interfaceView = getInterfaceView(createdEvent)\n if (!interfaceView) {\n throw new Error(\n `Expected to have interface views, but didn't: ${JSON.stringify(\n createdEvent\n )}`\n )\n }\n if (!matchInterfaceIds(interfaceId, interfaceView.interfaceId)) {\n throw new Error(\n `Not a ${interfaceId} but a ${\n interfaceView.interfaceId\n }: ${JSON.stringify(createdEvent)}`\n )\n }\n return interfaceView\n}\n\ntype Meta = { values: { [key: string]: string } } | undefined\n\nexport function mergeMetas(event: ExercisedEvent, extra?: Meta): Meta {\n // Add a type assertion to help TypeScript understand the shape of choiceArgument\n const choiceArgument = event.choiceArgument as\n | {\n transfer?: { meta?: Meta }\n extraArgs?: { meta?: Meta }\n meta?: Meta\n }\n | undefined\n\n const lastWriteWins = [\n choiceArgument?.transfer?.meta,\n choiceArgument?.extraArgs?.meta,\n choiceArgument?.meta,\n extra,\n (event.exerciseResult as { meta?: Meta } | undefined)?.meta,\n ]\n const result: { [key: string]: string } = {}\n lastWriteWins.forEach((meta) => {\n const values: { [key: string]: string } = meta?.values || {}\n Object.entries(values).forEach(([k, v]) => {\n result[k] = v\n })\n })\n if (Object.keys(result).length === 0) {\n return undefined\n }\n // order of keys doesn't matter, but we return it consistent for test purposes (and it's nicer)\n else {\n return { values: result }\n }\n}\n\nexport function getMetaKeyValue(key: string, meta: Meta): string | null {\n return (meta?.values || {})[key] || null\n}\n\n/**\n * From the view of making it easy to build the display for the wallet,\n * we remove all metadata fields that were fully parsed, and whose content is reflected in the TypeScript structure.\n * Otherwise, the display code has to do so, overloading the user with superfluous metadata entries.\n */\nexport function removeParsedMetaKeys(meta: Meta): Meta {\n return {\n values: Object.fromEntries(\n Object.entries(meta?.values || {}).filter(\n ([k]) => !AllKnownMetaKeys.includes(k)\n )\n ),\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Metadata } from '@canton-network/core-token-standard'\nimport { v3_3, v3_4 } from '@canton-network/core-ledger-client-types'\n\nexport type ViewValue =\n | v3_3.components['schemas']['JsInterfaceView']['viewValue']\n | v3_4.components['schemas']['JsInterfaceView']['viewValue'] // unknown | undefined\nexport type JsActiveContract =\n | v3_3.components['schemas']['JsActiveContract']\n | v3_4.components['schemas']['JsActiveContract']\nexport interface Transaction {\n updateId: string\n offset: number\n recordTime: string\n synchronizerId: string\n events: TokenStandardEvent[]\n}\n\nexport interface TransferObject {\n amount: string\n executeBefore: string\n inputHoldingCids: string[]\n instrumentId: { admin: string; id: string }\n meta: Metadata\n receiver: string\n requestedAt: string\n sender: string\n}\n\nexport interface TokenStandardEvent {\n label: Label\n lockedHoldingsChange: HoldingsChange\n /** lockedHoldingsChangeSummaries contains one summary per instrument. */\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n /** @deprecated lockedHoldingsChangeSummary is incorrect in a\n * multi-instrument world. It will be removed in a future release, please\n * use unlockedHoldingsChangeSummaries instead. */\n lockedHoldingsChangeSummary: HoldingsChangeSummary\n unlockedHoldingsChange: HoldingsChange\n /** unlockedHoldingsChangeSummary contains one summary per instrument. */\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n /** @deprecated unlockedHoldingsChangeSummary is incorrect in a\n * multi-instrument world. It will be removed in a future release, please\n * use unlockedHoldingsChangeSummaries instead. */\n unlockedHoldingsChangeSummary: HoldingsChangeSummary\n transferInstruction: TransferInstructionView | null\n}\n\n// Same definition as HoldingView in Daml\nexport interface Holding {\n contractId: string\n owner: string\n instrumentId: { admin: string; id: string }\n amount: string\n lock: HoldingLock | null\n meta: any\n}\n\nexport interface HoldingLock {\n holders: string[]\n expiresAt?: string\n expiresAfter?: string\n context?: string\n}\n\nexport interface HoldingsChange {\n creates: Holding[]\n archives: Holding[]\n}\n\nexport interface HoldingsChangeSummary {\n instrumentId: { admin: string; id: string }\n numInputs: number\n inputAmount: string\n numOutputs: number\n outputAmount: string\n amountChange: string\n}\n\n/**\n * Same as TransferInstructionView in Daml when exercising a TransferInstruction choice,\n * otherwise just meta and transfer.\n */\n// TODO investigate because it actually differs from TransferInstructionView from daml codegen\n// where status is: { tag, value }\nexport interface TransferInstructionView {\n // currentInstructionCid: string // TODO (#505): add\n originalInstructionCid: string | null\n transfer?: any\n status: {\n before: any\n current: { tag: TransferInstructionCurrentTag; value: unknown } | null\n }\n meta: Metadata | null\n // Stable id to track one TransferInstruction lifecycle across updates, inspired by Java parser\n multiStepCorrelationId?: string\n}\n\nexport type TransferInstructionCurrentTag =\n | 'Pending'\n | 'Completed'\n | 'Rejected'\n | 'Withdrawn'\n | 'Failed'\n\nexport type Label =\n | TransferOut\n | TransferIn\n | MergeSplit\n | Burn\n | Mint\n | Unlock\n | Lock\n | ExpireDust\n | UnknownAction\ntype UnknownAction = RawArchive | RawCreate\ninterface BaseLabel {\n type: string\n meta: any\n}\ninterface KnownLabel extends BaseLabel {\n mintAmount: string\n burnAmount: string\n reason: string | null\n tokenStandardChoice: TokenStandardChoice | null\n}\nexport interface TokenStandardChoice {\n name: string\n choiceArgument: any\n exerciseResult: any\n}\n\nexport interface TransferOut extends KnownLabel {\n type: 'TransferOut'\n receiverAmounts: Array<{ receiver: string; amount: string }>\n}\n\nexport interface TransferIn extends KnownLabel {\n type: 'TransferIn'\n sender: string\n}\n\nexport interface MergeSplit extends KnownLabel {\n type: 'MergeSplit'\n}\n\n// Same as MergeSplit, but is more precise (tx-kind=burn)\nexport interface Burn extends KnownLabel {\n type: 'Burn'\n}\n\n// Same as MergeSplit, but is more precise (tx-kind=mint)\nexport interface Mint extends KnownLabel {\n type: 'Mint'\n}\n\nexport interface Unlock extends KnownLabel {\n type: 'Unlock'\n}\n\nexport interface Lock extends KnownLabel {\n type: 'Lock'\n}\n\nexport interface ExpireDust extends KnownLabel {\n type: 'ExpireDust'\n}\n\nexport interface RawArchive extends BaseLabel {\n type: 'Archive'\n parentChoice: string\n contractId: string\n offset: number\n templateId: string\n packageName: string\n actingParties: string[]\n payload: any\n meta: any\n}\nexport interface RawCreate extends BaseLabel {\n type: 'Create' | 'Lock'\n parentChoice: string\n contractId: string\n offset: number\n templateId: string\n payload: any\n packageName: string\n meta: any\n}\n\nexport const renderTransaction = (t: Transaction): any => {\n return { ...t, events: t.events.map(renderTransactionEvent) }\n}\n\nconst renderTransactionEvent = (e: TokenStandardEvent): any => {\n const lockedHoldingsChangeSummaries = e.lockedHoldingsChangeSummaries\n .map(renderHoldingsChangeSummary)\n .filter((s) => s !== null)\n\n const unlockedHoldingsChangeSummaries = e.unlockedHoldingsChangeSummaries\n .map(renderHoldingsChangeSummary)\n .filter((s) => s !== null)\n\n const lockedHoldingsChange = renderHoldingsChange(e.lockedHoldingsChange)\n const unlockedHoldingsChange = renderHoldingsChange(\n e.unlockedHoldingsChange\n )\n return {\n ...e,\n lockedHoldingsChange,\n unlockedHoldingsChange,\n lockedHoldingsChangeSummaries,\n // Deprecated\n lockedHoldingsChangeSummary: renderHoldingsChangeSummary(\n e.lockedHoldingsChangeSummary\n ),\n unlockedHoldingsChangeSummaries,\n // Deprecated\n unlockedHoldingsChangeSummary: renderHoldingsChangeSummary(\n e.unlockedHoldingsChangeSummary\n ),\n }\n}\n\nconst renderHoldingsChangeSummary = (\n s: HoldingsChangeSummary\n): Partial<HoldingsChangeSummary> | null => {\n if (\n s.numInputs === 0 &&\n s.numOutputs === 0 &&\n s.inputAmount === '0' &&\n s.outputAmount === '0' &&\n s.amountChange === '0'\n ) {\n return null\n }\n return {\n ...((s.instrumentId.admin !== '' || s.instrumentId.id !== '') && {\n instrumentId: s.instrumentId,\n }),\n ...(s.numInputs !== 0 && { numInputs: s.numInputs }),\n ...(s.inputAmount !== '0' && { inputAmount: s.inputAmount }),\n ...(s.numOutputs !== 0 && { numOutputs: s.numOutputs }),\n ...(s.outputAmount !== '0' && { outputAmount: s.outputAmount }),\n ...(s.amountChange !== '0' && { amountChange: s.amountChange }),\n }\n}\n\nconst renderHoldingsChange = (\n c: HoldingsChange\n): Partial<HoldingsChange> | null => {\n if (c.creates.length === 0 && c.archives.length === 0) {\n return null\n }\n return {\n ...(c.creates.length !== 0 && { creates: c.creates }),\n ...(c.archives.length !== 0 && { archives: c.archives }),\n }\n}\n\nexport interface PrettyTransactions {\n transactions: Transaction[]\n nextOffset: number\n}\n\nexport interface PrettyContract<T = ViewValue> {\n contractId: string\n interfaceViewValue: T\n activeContract: JsActiveContract\n fetchedAtOffset?: number | undefined\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\ntype InstrumentKey = { admin: string; id: string }\n\n/** InstrumentMap is a helper for when you want to group values by instrument. */\nexport class InstrumentMap<V> {\n private readonly map\n\n private encodeKey(instrumentId: InstrumentKey): string {\n return JSON.stringify([instrumentId.admin, instrumentId.id])\n }\n\n private decodeKey(key: string): InstrumentKey {\n const [admin, id] = JSON.parse(key)\n return { admin, id }\n }\n\n constructor() {\n this.map = new Map<string, V>()\n }\n\n set(key: InstrumentKey, value: V): void {\n this.map.set(this.encodeKey(key), value)\n }\n\n get(key: InstrumentKey): V | undefined {\n return this.map.get(this.encodeKey(key))\n }\n\n has(key: InstrumentKey): boolean {\n return this.map.has(this.encodeKey(key))\n }\n\n delete(key: InstrumentKey): boolean {\n return this.map.delete(this.encodeKey(key))\n }\n\n *entries(): IterableIterator<[InstrumentKey, V]> {\n for (const [key, value] of this.map.entries()) {\n yield [this.decodeKey(key), value]\n }\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ensureInterfaceViewIsPresent,\n getInterfaceView,\n getKnownInterfaceView,\n getMetaKeyValue,\n hasInterface,\n mergeMetas,\n removeParsedMetaKeys,\n} from './utils.js'\nimport {\n BurnedMetaKey,\n matchInterfaceIds,\n ReasonMetaKey,\n SenderMetaKey,\n TxKindMetaKey,\n} from './constants.js'\nimport {\n Holding,\n HoldingsChangeSummary,\n HoldingLock,\n HoldingsChange,\n Label,\n TokenStandardEvent,\n Transaction,\n TokenStandardChoice,\n TransferInstructionView,\n TransferInstructionCurrentTag,\n TransferObject,\n} from './types.js'\nimport { InstrumentMap } from './instrumentmap.js'\n\nimport {\n v3_3,\n EventFilterBySetup,\n} from '@canton-network/core-ledger-client-types'\nimport { LedgerClient } from '@canton-network/core-ledger-client'\nimport BigNumber from 'bignumber.js'\nimport { PartyId } from '@canton-network/core-types'\nimport {\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\n\ntype ArchivedEvent = v3_3.components['schemas']['ArchivedEvent']\ntype CreatedEvent = v3_3.components['schemas']['CreatedEvent']\ntype ExercisedEvent = v3_3.components['schemas']['ExercisedEvent']\ntype Event = v3_3.components['schemas']['Event']\ntype JsTransaction = v3_3.components['schemas']['JsTransaction']\ntype JsGetEventsByContractIdResponse =\n v3_3.components['schemas']['JsGetEventsByContractIdResponse']\n\nfunction currentStatusFromChoiceOrResult(\n choice?: string | undefined,\n resultTag?: string | undefined\n): TransferInstructionCurrentTag {\n // If the result explicitly says Failed/Completed, prefer it.\n if (resultTag === 'TransferInstructionResult_Failed') return 'Failed'\n if (resultTag === 'TransferInstructionResult_Completed') return 'Completed'\n\n switch (choice) {\n case 'TransferInstruction_Reject':\n return 'Rejected'\n case 'TransferInstruction_Withdraw':\n return 'Withdrawn'\n case 'TransferInstruction_Accept':\n case 'TransferInstruction_Update':\n // When result tag wasn't Completed/Failed above, fall back to Pending\n return 'Pending'\n default:\n // When resultTag is Pending or unknown\n return 'Pending'\n }\n}\n\n// -For TransferInstruction Create use originalInstructionCid if present, otherwise this TransferInstruction's cid\n// -For TransferInstruction Exercise: use the exercised TransferInstruction cid, which equals the earlier Pending transferInstruction's cid.\n// This lets us correlate Pending to Accept/Reject/Withdraw across updates.\nfunction getCorrelationIdFromTransferInstruction(\n currentInstructionCid: string,\n originalInstructionCid?: string | null\n): string {\n return originalInstructionCid ?? currentInstructionCid\n}\n\n// If the exercise produced a Pending TI, return its newly created transferInstructionCid\n// Otherwise (Completed/Failed/Rejected/Withdrawn), there is no pending TransferInstruction to correlate\nfunction getPendingTransferInstructionCid(\n exercisedEvent: ExercisedEvent\n): string | undefined {\n const output = (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string; value?: any } }\n | undefined\n )?.output\n if (output?.tag !== 'TransferInstructionResult_Pending') return undefined\n\n const cid = output.value?.transferInstructionCid\n return cid ?? undefined\n}\n\nfunction isTransferObject(value: unknown): value is TransferObject {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n const instrumentId = v.instrumentId as Record<string, unknown> | undefined\n const meta = v.meta as Record<string, unknown> | undefined\n return (\n typeof v.sender === 'string' &&\n typeof v.receiver === 'string' &&\n typeof v.amount === 'string' &&\n typeof v.requestedAt === 'string' &&\n typeof v.executeBefore === 'string' &&\n Array.isArray(v.inputHoldingCids) &&\n v.inputHoldingCids.every((cid) => typeof cid === 'string') &&\n !!instrumentId &&\n typeof instrumentId.admin === 'string' &&\n typeof instrumentId.id === 'string' &&\n !!meta &&\n typeof meta.values === 'object' &&\n meta.values !== null\n )\n}\n\nexport class TransactionParser {\n private readonly ledgerClient: LedgerClient\n private readonly partyId: PartyId\n private readonly transaction: JsTransaction\n private readonly isMasterUser: boolean\n\n constructor(\n transaction: JsTransaction,\n ledgerClient: LedgerClient,\n partyId: PartyId,\n isMasterUser: boolean\n ) {\n this.ledgerClient = ledgerClient\n this.partyId = partyId\n this.transaction = transaction\n this.isMasterUser = isMasterUser\n }\n\n async parseTransaction(): Promise<Transaction> {\n const tx = this.transaction\n const events = await this.parseEvents([...(tx.events || [])].reverse())\n return {\n updateId: tx.updateId,\n offset: tx.offset,\n recordTime: tx.recordTime,\n synchronizerId: tx.synchronizerId,\n events,\n }\n }\n\n async parseTransferObjects(): Promise<TransferObject[]> {\n const eventsStack = [...(this.transaction.events || [])].reverse()\n const results = await this.fetchTransferObjectChoice(eventsStack)\n return results\n }\n\n private async fetchTransferObjectChoice(\n eventsStack: Event[]\n ): Promise<TransferObject[]> {\n const result: TransferObject[] = []\n while (eventsStack.length > 0) {\n const currentEvent = eventsStack.pop()!\n const { exercisedEvent } = getNodeIdAndEvent(currentEvent)\n if (\n exercisedEvent &&\n (exercisedEvent.choice === 'TransferFactory_Transfer' ||\n exercisedEvent.choice === 'TransferRule_Transfer')\n ) {\n const { choiceArgument } = exercisedEvent\n if (\n choiceArgument &&\n typeof choiceArgument === 'object' &&\n 'transfer' in choiceArgument\n ) {\n const transfer = (choiceArgument as Record<string, unknown>)\n .transfer\n if (isTransferObject(transfer)) {\n result.push(transfer)\n }\n }\n }\n }\n return result\n }\n\n private async parseEvents(\n eventsStack: Event[]\n ): Promise<TokenStandardEvent[]> {\n let callStack: Array<{\n parentChoiceName: string\n untilNodeId: number\n }> = []\n let continueAfterNodeId = -1\n const result: TokenStandardEvent[] = []\n while (eventsStack.length > 0) {\n const currentEvent = eventsStack.pop()!\n\n const { nodeId, createdEvent, archivedEvent, exercisedEvent } =\n getNodeIdAndEvent(currentEvent)\n callStack = callStack.filter((s) => s.untilNodeId <= nodeId)\n const parentChoice =\n (callStack[callStack.length - 1] &&\n callStack[callStack.length - 1].parentChoiceName) ||\n 'none (root node)'\n\n let parsed: EventParseResult | null\n if (nodeId <= continueAfterNodeId) {\n parsed = null\n } else if (createdEvent) {\n parsed = this.parseRawCreate(createdEvent, parentChoice)\n } else if (archivedEvent) {\n parsed = await this.parseRawArchive(archivedEvent, parentChoice)\n } else if (exercisedEvent) {\n parsed = await this.parseExercise(exercisedEvent)\n } else {\n throw new Error(\n `Impossible event: ${JSON.stringify(currentEvent)}`\n )\n }\n if (parsed && isLeafEventNode(parsed)) {\n // Exclude events where nothing happened\n if (holdingChangesNonEmpty(parsed.event)) {\n result.push({\n ...parsed.event,\n label: {\n ...parsed.event.label,\n meta: removeParsedMetaKeys(parsed.event.label.meta),\n },\n })\n }\n continueAfterNodeId = parsed.continueAfterNodeId\n } else if (parsed) {\n callStack.push({\n parentChoiceName: parsed.parentChoiceName,\n untilNodeId: parsed.lastDescendantNodeId,\n })\n }\n }\n return result\n }\n\n private parseRawCreate(\n create: CreatedEvent,\n parentChoice: string\n ): EventParseResult | null {\n return this.buildRawEvent(create, create.nodeId, (result) => {\n return {\n // TODO: this code currently only looks at the first instrument\n // to determine the type of the Event.\n type:\n Number(\n result.lockedHoldingsChangeSummaries[0]?.amountChange\n ) > 0\n ? 'Lock'\n : 'Create',\n parentChoice,\n contractId: create.contractId,\n offset: create.offset,\n templateId: create.templateId,\n payload: result.payload,\n packageName: create.packageName,\n meta: undefined,\n }\n })\n }\n\n private async parseRawArchive(\n archive: ArchivedEvent,\n parentChoice: string\n ): Promise<EventParseResult | null> {\n const events = await this.getEventsForArchive(archive)\n if (!events) {\n return null\n }\n return this.buildRawEvent(\n events.created.createdEvent,\n archive.nodeId,\n (result) => {\n return {\n type: 'Archive',\n parentChoice,\n contractId: archive.contractId,\n offset: archive.offset,\n templateId: archive.templateId,\n packageName: archive.packageName,\n actingParties:\n (archive as ExercisedEvent).actingParties || [],\n payload: result.payload,\n meta: undefined,\n }\n }\n )\n }\n\n private buildRawEvent(\n originalCreate: CreatedEvent,\n nodeId: number,\n buildLabel: (result: {\n payload: any\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n }) => Label\n ): EventParseResult | null {\n const view = getKnownInterfaceView(originalCreate)\n let result: {\n payload: any\n lockedHoldingsChange: HoldingsChange\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n lockedHoldingsChangeSummary: HoldingsChangeSummary\n unlockedHoldingsChange: HoldingsChange\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n unlockedHoldingsChangeSummary: HoldingsChangeSummary\n transferInstruction: TransferInstructionView | null\n } | null\n switch (view?.type) {\n case 'Holding': {\n const holdingView = view.viewValue\n if (this.partyId !== holdingView.owner) {\n result = null\n } else {\n const isLocked = !!holdingView.lock\n const summary: HoldingsChangeSummary = {\n instrumentId: holdingView.instrumentId,\n amountChange: holdingView.amount,\n numInputs: 0,\n inputAmount: '0',\n numOutputs: 1,\n outputAmount: holdingView.amount,\n }\n const lockedHoldingsChangeSummaries = isLocked\n ? [summary]\n : []\n const unlockedHoldingsChangeSummaries = isLocked\n ? []\n : [summary]\n result = {\n payload: holdingView,\n unlockedHoldingsChange: {\n creates: isLocked ? [] : [holdingView],\n archives: [],\n },\n lockedHoldingsChange: {\n creates: isLocked ? [holdingView] : [],\n archives: [],\n },\n lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n lockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n unlockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n transferInstruction: null,\n }\n }\n break\n }\n case 'TransferInstruction': {\n const transferInstructionView = view.viewValue\n if (\n ![\n transferInstructionView.transfer.sender,\n transferInstructionView.transfer.receiver,\n ].some((stakeholder) => stakeholder === this.partyId)\n ) {\n result = null\n } else {\n const multiStepCorrelationId =\n getCorrelationIdFromTransferInstruction(\n originalCreate.contractId,\n transferInstructionView.originalInstructionCid ??\n null\n )\n result = {\n payload: transferInstructionView,\n transferInstruction: {\n originalInstructionCid:\n transferInstructionView.originalInstructionCid,\n transfer: transferInstructionView.transfer,\n meta: transferInstructionView.meta,\n status: {\n before: transferInstructionView.status, // raw DAML pending sub-state\n current: { tag: 'Pending', value: {} }, // normalized\n },\n multiStepCorrelationId,\n },\n unlockedHoldingsChange: { creates: [], archives: [] },\n lockedHoldingsChange: { creates: [], archives: [] },\n unlockedHoldingsChangeSummaries: [],\n unlockedHoldingsChangeSummary:\n emptyHoldingsChangeSummary,\n lockedHoldingsChangeSummaries: [],\n lockedHoldingsChangeSummary: emptyHoldingsChangeSummary,\n }\n }\n break\n }\n default:\n result = null\n }\n\n return (\n result && {\n continueAfterNodeId: nodeId,\n event: {\n label: buildLabel(result),\n unlockedHoldingsChange: result.unlockedHoldingsChange,\n lockedHoldingsChange: result.lockedHoldingsChange,\n lockedHoldingsChangeSummaries:\n result.lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n result.lockedHoldingsChangeSummary,\n unlockedHoldingsChangeSummaries:\n result.unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n result.unlockedHoldingsChangeSummary,\n transferInstruction: result.transferInstruction,\n },\n }\n )\n }\n\n private async parseExercise(\n exercise: ExercisedEvent\n ): Promise<EventParseResult | null> {\n let result: ParsedKnownExercisedEvent | null = null\n const tokenStandardChoice = {\n name: exercise.choice,\n choiceArgument: exercise.choiceArgument,\n exerciseResult: exercise.exerciseResult,\n }\n switch (exercise.choice) {\n case 'TransferRule_Transfer':\n case 'TransferFactory_Transfer':\n result = await this.buildTransfer(exercise, tokenStandardChoice)\n break\n case 'TransferInstruction_Accept':\n case 'TransferInstruction_Reject':\n case 'TransferInstruction_Withdraw':\n case 'TransferInstruction_Update':\n result = await this.buildFromTransferInstructionExercise(\n exercise,\n tokenStandardChoice\n )\n break\n case 'BurnMintFactory_BurnMint':\n result = await this.buildMergeSplit(\n exercise,\n tokenStandardChoice\n )\n break\n default: {\n const meta = mergeMetas(exercise)\n const txKind = getMetaKeyValue(TxKindMetaKey, meta)\n if (txKind) {\n result = await this.parseViaTxKind(exercise, txKind)\n }\n break\n }\n }\n if (!result) {\n return {\n lastDescendantNodeId: exercise.lastDescendantNodeId,\n parentChoiceName: exercise.choice,\n }\n } else {\n // only this.partyId's holdings should be included in the response\n const lockedHoldingsChange: HoldingsChange = {\n creates: result.children.creates.filter(\n (h) => !!h.lock && h.owner === this.partyId\n ),\n archives: result.children.archives.filter(\n (h) => !!h.lock && h.owner === this.partyId\n ),\n }\n const unlockedHoldingsChange: HoldingsChange = {\n creates: result.children.creates.filter(\n (h) => !h.lock && h.owner === this.partyId\n ),\n archives: result.children.archives.filter(\n (h) => !h.lock && h.owner === this.partyId\n ),\n }\n const lockedHoldingsChangeSummaries = computeSummaries(\n lockedHoldingsChange,\n this.partyId\n )\n const unlockedHoldingsChangeSummaries = computeSummaries(\n unlockedHoldingsChange,\n this.partyId\n )\n return {\n event: {\n label: result.label,\n lockedHoldingsChange,\n lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n lockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n unlockedHoldingsChange,\n unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n unlockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n transferInstruction: result.transferInstruction,\n },\n continueAfterNodeId: exercise.lastDescendantNodeId,\n }\n }\n }\n\n private async parseViaTxKind(\n exercisedEvent: ExercisedEvent,\n txKind: string\n ): Promise<ParsedKnownExercisedEvent | null> {\n switch (txKind) {\n case 'transfer':\n return await this.buildTransfer(exercisedEvent, null)\n case 'merge-split':\n case 'burn':\n case 'mint':\n return await this.buildMergeSplit(exercisedEvent, null)\n case 'unlock':\n return await this.buildBasic(exercisedEvent, 'Unlock', null)\n case 'expire-dust':\n return await this.buildBasic(exercisedEvent, 'ExpireDust', null)\n default:\n throw new Error(\n `Unknown tx-kind '${txKind}' in ${JSON.stringify(exercisedEvent)}`\n )\n }\n }\n\n private async buildTransfer(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice | null,\n transferInstructions?: TransferInstructionView\n ): Promise<ParsedKnownExercisedEvent | null> {\n const meta = mergeMetas(\n exercisedEvent,\n transferInstructions?.transfer?.meta\n )\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n const choiceArgumentTransfer = (\n exercisedEvent.choiceArgument as {\n transfer?: any\n }\n ).transfer\n\n const sender: string =\n transferInstructions?.transfer?.sender ||\n getMetaKeyValue(SenderMetaKey, meta) ||\n choiceArgumentTransfer.sender\n if (!sender) {\n console.error(\n `Malformed transfer didn't contain sender. Will instead attempt to parse the children.\n Transfer: ${JSON.stringify(exercisedEvent)}`\n )\n return null\n }\n\n const resultTag =\n (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string } }\n | undefined\n )?.output?.tag || undefined\n const pendingCid = getPendingTransferInstructionCid(exercisedEvent)\n const currentTag = currentStatusFromChoiceOrResult(\n exercisedEvent.choice,\n resultTag\n )\n\n const children = await this.getChildren(exercisedEvent)\n const receiverAmounts = new Map<string, BigNumber>()\n children.creates\n .filter((h) => h.owner !== sender)\n .forEach((holding) =>\n receiverAmounts.set(\n holding.owner,\n (receiverAmounts.get(holding.owner) || BigNumber('0')).plus(\n BigNumber(holding.amount)\n )\n )\n )\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n\n let label: Label\n if (receiverAmounts.size === 0) {\n label = {\n ...amountChanges,\n type: 'MergeSplit',\n tokenStandardChoice,\n reason,\n meta,\n }\n } else if (sender === this.partyId) {\n label = {\n ...amountChanges,\n type: 'TransferOut',\n receiverAmounts: [...receiverAmounts].map(([k, v]) => {\n return { receiver: k, amount: v.toString() }\n }),\n tokenStandardChoice,\n reason,\n meta,\n }\n } else {\n label = {\n type: 'TransferIn',\n // for Transfers, the burn/mint is always 0 for the receiving party (i.e., 0 for TransferIn)\n burnAmount: '0',\n mintAmount: '0',\n sender,\n tokenStandardChoice,\n reason,\n meta,\n }\n }\n\n if (transferInstructions) {\n transferInstructions.status.current = transferInstructions.status\n .current || { tag: currentTag, value: {} }\n return {\n label,\n children,\n transferInstruction: transferInstructions,\n }\n }\n\n const transferInstruction: TransferInstructionView = {\n originalInstructionCid: null,\n ...(choiceArgumentTransfer !== undefined && {\n transfer: choiceArgumentTransfer,\n }),\n status: {\n before: null,\n current: { tag: currentTag, value: {} },\n },\n meta: null,\n ...(pendingCid ? { multiStepCorrelationId: pendingCid } : {}),\n }\n\n return {\n label,\n children,\n transferInstruction,\n }\n }\n\n private async buildMergeSplit(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice | null\n ): Promise<ParsedKnownExercisedEvent> {\n let type: 'MergeSplit' | 'Mint' | 'Burn'\n const meta = mergeMetas(exercisedEvent)\n switch (getMetaKeyValue(TxKindMetaKey, meta)) {\n case 'burn':\n type = 'Burn'\n break\n case 'mint':\n type = 'Mint'\n break\n default:\n type = 'MergeSplit'\n }\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n const children = await this.getChildren(exercisedEvent)\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n\n const label: Label = {\n ...amountChanges,\n type,\n tokenStandardChoice,\n reason,\n meta,\n }\n\n return {\n label,\n children,\n transferInstruction: null,\n }\n }\n\n private async buildFromTransferInstructionExercise(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice\n ): Promise<ParsedKnownExercisedEvent | null> {\n const instructionCid = exercisedEvent.contractId\n const transferInstructionEvents =\n await this.getEventsForArchive(exercisedEvent)\n if (!transferInstructionEvents) {\n // This will happen when the party observes the archive but is not a stakeholder.\n // For example, for Amulet, a validator will see a TransferInstruction_Reject/Withdraw\n // but will not see the create of a TransferInstruction.\n return null\n }\n const transferInstructionView = ensureInterfaceViewIsPresent(\n transferInstructionEvents.created.createdEvent,\n TRANSFER_INSTRUCTION_INTERFACE_ID\n ).viewValue as TransferInstructionView\n\n const multiStepCorrelationId = getCorrelationIdFromTransferInstruction(\n instructionCid,\n transferInstructionView.originalInstructionCid ?? null\n )\n\n const resultTag =\n (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string } }\n | undefined\n )?.output?.tag || undefined\n\n const currentTag = currentStatusFromChoiceOrResult(\n exercisedEvent.choice,\n resultTag\n )\n\n const transferInstruction: TransferInstructionView = {\n originalInstructionCid:\n transferInstructionView.originalInstructionCid,\n multiStepCorrelationId,\n transfer: transferInstructionView.transfer,\n meta: transferInstructionView.meta,\n status: {\n before: transferInstructionView.status,\n current: { tag: currentTag, value: {} },\n },\n }\n\n const exerciseResultOutputTag = resultTag\n let result: ParsedKnownExercisedEvent | null = null\n\n switch (exerciseResultOutputTag) {\n case 'TransferInstructionResult_Failed':\n case 'TransferInstructionResult_Pending':\n result = await this.buildMergeSplit(\n exercisedEvent,\n tokenStandardChoice\n )\n break\n case 'TransferInstructionResult_Completed':\n result = await this.buildTransfer(\n exercisedEvent,\n tokenStandardChoice,\n transferInstruction\n )\n break\n default:\n throw new Error(\n `Unknown TransferInstructionResult: ${exerciseResultOutputTag}`\n )\n }\n return (\n result && {\n ...result,\n transferInstruction,\n }\n )\n }\n\n private async buildBasic(\n exercisedEvent: ExercisedEvent,\n type: 'Unlock' | 'ExpireDust',\n tokenStandardChoice: TokenStandardChoice | null\n ): Promise<ParsedKnownExercisedEvent> {\n const children = await this.getChildren(exercisedEvent)\n const meta = mergeMetas(exercisedEvent)\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n return {\n label: {\n ...amountChanges,\n type,\n tokenStandardChoice,\n reason,\n meta,\n },\n children,\n transferInstruction: null,\n }\n }\n\n private async getChildren(\n exercisedEvent: ExercisedEvent\n ): Promise<HoldingsChange> {\n const mutatingResult: HoldingsChange = { creates: [], archives: [] }\n const childrenEventsSlice = (this.transaction.events || [])\n .map(getNodeIdAndEvent)\n .filter(\n ({ nodeId }) =>\n nodeId > exercisedEvent.nodeId &&\n nodeId <= exercisedEvent.lastDescendantNodeId\n )\n\n if (\n exercisedEvent.consuming &&\n hasInterface(HOLDING_INTERFACE_ID, exercisedEvent)\n ) {\n const selfEvent = await this.getEventsForArchive(exercisedEvent)\n if (selfEvent) {\n const holdingView = ensureInterfaceViewIsPresent(\n selfEvent.created.createdEvent,\n HOLDING_INTERFACE_ID\n ).viewValue as Holding\n mutatingResult.archives.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId: exercisedEvent.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n }\n\n for (const {\n createdEvent,\n archivedEvent,\n exercisedEvent,\n } of childrenEventsSlice) {\n if (createdEvent) {\n const interfaceView = getInterfaceView(createdEvent)\n if (\n interfaceView &&\n matchInterfaceIds(\n HOLDING_INTERFACE_ID,\n interfaceView.interfaceId\n )\n ) {\n const holdingView = interfaceView.viewValue as Holding\n mutatingResult.creates.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId: createdEvent.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n } else if (\n (archivedEvent &&\n hasInterface(HOLDING_INTERFACE_ID, archivedEvent)) ||\n (exercisedEvent &&\n exercisedEvent.consuming &&\n hasInterface(HOLDING_INTERFACE_ID, exercisedEvent))\n ) {\n const contractEvents = await this.getEventsForArchive(\n archivedEvent || exercisedEvent!\n )\n if (contractEvents) {\n const holdingView = ensureInterfaceViewIsPresent(\n contractEvents.created?.createdEvent,\n HOLDING_INTERFACE_ID\n ).viewValue as Holding\n mutatingResult.archives.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId:\n archivedEvent?.contractId ||\n exercisedEvent!.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n }\n }\n\n return {\n // remove transient contracts\n creates: mutatingResult.creates.filter(\n (create) =>\n !mutatingResult.archives.some(\n (archive) => create.contractId === archive.contractId\n )\n ),\n archives: mutatingResult.archives.filter(\n (archive) =>\n !mutatingResult.creates.some(\n (create) => create.contractId === archive.contractId\n )\n ),\n }\n }\n\n private async getEventsForArchive(\n archivedEvent: ArchivedEvent | ExercisedEvent\n ): Promise<null | Required<JsGetEventsByContractIdResponse>> {\n if (!(archivedEvent.witnessParties || []).includes(this.partyId)) {\n return null\n }\n\n const basePayload = {\n contractId: archivedEvent.contractId,\n eventFormat: EventFilterBySetup({\n interfaceIds: [\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n ],\n isMasterUser: this.isMasterUser,\n partyId: this.partyId,\n verbose: true,\n }),\n }\n\n const payload =\n this.ledgerClient.getCurrentClientVersion() === '3.3'\n ? { ...basePayload, requestingParties: [] }\n : basePayload\n\n const events = await this.ledgerClient\n .postWithRetry('/v2/events/events-by-contract-id', payload)\n .catch((err) => {\n // This will happen for holdings with consuming choices\n // where the party the script is running on is an actor on the choice\n // but not a stakeholder.\n if (err.code === 'CONTRACT_EVENTS_NOT_FOUND') {\n return null\n } else {\n throw err\n }\n })\n if (!events) {\n return null\n }\n\n const created = events.created\n const archived = events.archived\n if (!created || !archived) {\n throw new Error(\n `Archival of ${\n archivedEvent.contractId\n } does not have a corresponding create/archive event: ${JSON.stringify(\n events\n )}`\n )\n }\n return { created, archived }\n }\n}\n\ntype EventParseResult = ParseChildren | ParsedEvent\nfunction isLeafEventNode(result: EventParseResult): result is ParsedEvent {\n return !!(result as ParsedEvent).event\n}\ninterface ParsedEvent {\n event: TokenStandardEvent\n continueAfterNodeId: number\n}\ninterface ParseChildren {\n parentChoiceName: string\n lastDescendantNodeId: number\n}\n\ninterface ParsedKnownExercisedEvent {\n label: Label\n children: HoldingsChange\n transferInstruction: TransferInstructionView | null\n}\n\n// a naive implementation like event.X?.nodeId || event.Y?.nodeId || event.Z?.nodeId fails when nodeId=0\ninterface NodeIdAndEvent {\n nodeId: number\n exercisedEvent?: ExercisedEvent\n archivedEvent?: ArchivedEvent | ExercisedEvent\n createdEvent?: CreatedEvent\n}\nfunction getNodeIdAndEvent(event: Event): NodeIdAndEvent {\n if ('ExercisedEvent' in event) {\n // ledger API's TRANSACTION_SHAPE_LEDGER_EFFECTS does not include ArchivedEvent, instead has the choice as Archive\n if (event.ExercisedEvent.choice === 'Archive') {\n return {\n nodeId: event.ExercisedEvent.nodeId,\n archivedEvent: event.ExercisedEvent,\n }\n } else {\n return {\n nodeId: event.ExercisedEvent.nodeId,\n exercisedEvent: event.ExercisedEvent,\n }\n }\n } else if ('CreatedEvent' in event) {\n return {\n nodeId: event.CreatedEvent.nodeId,\n createdEvent: event.CreatedEvent,\n }\n } else if ('ArchivedEvent' in event) {\n return {\n nodeId: event.ArchivedEvent.nodeId,\n archivedEvent: event.ArchivedEvent,\n }\n } else {\n throw new Error(`Impossible event type: ${event}`)\n }\n}\n\n/** sumHoldingsChange sums all the changes over a number of holdings.\n * Note that this function currently assumes all holdings use the same\n * instrument. */\nfunction sumHoldingsChange(\n change: HoldingsChange,\n filter: (owner: string, lock: HoldingLock | null) => boolean\n): BigNumber {\n return sumHoldings(\n change.creates.filter((create) => filter(create.owner, create.lock))\n ).minus(\n sumHoldings(\n change.archives.filter((archive) =>\n filter(archive.owner, archive.lock)\n )\n )\n )\n}\n\nfunction sumHoldings(holdings: Holding[]): BigNumber {\n if (holdings.length > 0) {\n // Sanity check.\n const instrumentId = holdings[0].instrumentId\n for (const holding of holdings) {\n if (\n holding.instrumentId.admin !== instrumentId.admin ||\n holding.instrumentId.id !== instrumentId.id\n ) {\n throw new Error(\n `Attempted to call sumHoldings on heterogeneous instruments: ${JSON.stringify(instrumentId)} != ${JSON.stringify(holding.instrumentId)}`\n )\n }\n }\n }\n return BigNumber.sum(\n ...holdings.map((h) => h.amount).concat(['0']) // avoid NaN\n )\n}\n\nfunction computeAmountChanges(\n children: HoldingsChange,\n meta: any,\n partyId: string\n) {\n const burnAmount = BigNumber(getMetaKeyValue(BurnedMetaKey, meta) || '0')\n const partyHoldingAmountChange = sumHoldingsChange(\n children,\n (owner) => owner === partyId\n )\n const otherPartiesHoldingAmountChange = sumHoldingsChange(\n children,\n (owner) => owner !== partyId\n )\n const mintAmount = partyHoldingAmountChange\n .plus(burnAmount)\n .plus(otherPartiesHoldingAmountChange)\n return {\n burnAmount: burnAmount.toString(),\n mintAmount: mintAmount.toString(),\n }\n}\n\nfunction computeSummary(\n instrumentId: { admin: string; id: string },\n changes: HoldingsChange,\n partyId: string\n): HoldingsChangeSummary {\n const amountChange = sumHoldingsChange(\n changes,\n (owner) => owner === partyId\n )\n const outputAmount = sumHoldings(changes.creates)\n const inputAmount = sumHoldings(changes.archives)\n return {\n instrumentId,\n amountChange: amountChange.toString(),\n numOutputs: changes.creates.length,\n outputAmount: outputAmount.toString(),\n numInputs: changes.archives.length,\n inputAmount: inputAmount.toString(),\n }\n}\n\nfunction holdingsChangeByInstrument(\n changes: HoldingsChange\n): InstrumentMap<HoldingsChange> {\n const map = new InstrumentMap<{ creates: Holding[]; archives: Holding[] }>()\n for (const create of changes.creates) {\n if (map.has(create.instrumentId)) {\n map.get(create.instrumentId)!.creates.push(create)\n } else {\n map.set(create.instrumentId, { creates: [create], archives: [] })\n }\n }\n for (const archive of changes.archives) {\n if (map.has(archive.instrumentId)) {\n map.get(archive.instrumentId)!.archives.push(archive)\n } else {\n map.set(archive.instrumentId, { creates: [], archives: [archive] })\n }\n }\n return map\n}\n\nfunction computeSummaries(\n changes: HoldingsChange,\n partyId: string\n): HoldingsChangeSummary[] {\n const byInstrument = holdingsChangeByInstrument(changes)\n return [...byInstrument.entries()].map(([instrumentId, change]) =>\n computeSummary(instrumentId, change, partyId)\n )\n}\n\nfunction holdingChangesNonEmpty(event: TokenStandardEvent): boolean {\n return (\n event.unlockedHoldingsChange.creates.length > 0 ||\n event.unlockedHoldingsChange.archives.length > 0 ||\n event.lockedHoldingsChange.creates.length > 0 ||\n event.lockedHoldingsChange.archives.length > 0\n )\n}\n\nconst emptyHoldingsChangeSummary: HoldingsChangeSummary = {\n // This is obviously incorrect, but the field was introduced at the same\n // time at which we introduced the more correct per-instrument summaries,\n // so we know that old code couldn't use this (broken) field, and new code\n // should use the correct summaries.\n instrumentId: { admin: '', id: '' },\n numInputs: 0,\n numOutputs: 0,\n inputAmount: '0',\n outputAmount: '0',\n amountChange: '0',\n}\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/types.ts","../src/instrumentmap.ts","../src/parser.ts"],"names":["HOLDING_INTERFACE_ID","TRANSFER_FACTORY_INTERFACE_ID","TRANSFER_INSTRUCTION_INTERFACE_ID","ALLOCATION_FACTORY_INTERFACE_ID","ALLOCATION_INSTRUCTION_INTERFACE_ID","ALLOCATION_INTERFACE_ID","ALLOCATION_REQUEST_INTERFACE_ID","BigNumber","exercisedEvent","EventFilterBySetup"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n TRANSFER_FACTORY_INTERFACE_ID,\n ALLOCATION_FACTORY_INTERFACE_ID,\n ALLOCATION_INSTRUCTION_INTERFACE_ID,\n HOLDING_INTERFACE_ID,\n ALLOCATION_INTERFACE_ID,\n ALLOCATION_REQUEST_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\nexport interface InterfaceIdParts {\n packageName: string\n moduleName: string\n entityName: string\n}\n\nexport function splitInterfaceId(interfaceId: string): InterfaceIdParts | null {\n // Captures 3 groups: pkg, module and entity\n // Note that prefix # is optional in regexp below,\n // format without # is deprecated, but supported in canton 3.3 and will be removed in canton 3.4\n // https://docs.digitalasset.com/build/3.3/reference/lapi-migration-guide.html#identifier-addressing-by-package-name\n const regExp = /^#?([^:]+):([^:]+):([^:]+)$/\n const match = regExp.exec(interfaceId)\n if (!match) return null\n const [, packageName, moduleName, entityName] = match // [0]=full, [1]=pkg, [2]=module, [3]=entity\n return {\n packageName,\n moduleName,\n entityName,\n }\n}\n\nexport function matchInterfaceIds(a: string, b: string): boolean {\n const aParts = splitInterfaceId(a)\n const bParts = splitInterfaceId(b)\n\n return (\n aParts !== null &&\n bParts !== null &&\n aParts.moduleName === bParts.moduleName &&\n aParts.entityName === bParts.entityName\n )\n}\n\nexport const TokenStandardTransactionInterfaces = [\n HOLDING_INTERFACE_ID,\n TRANSFER_FACTORY_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n ALLOCATION_FACTORY_INTERFACE_ID,\n ALLOCATION_INSTRUCTION_INTERFACE_ID,\n ALLOCATION_INTERFACE_ID,\n ALLOCATION_REQUEST_INTERFACE_ID,\n]\n\nconst SpliceMetaKeyPrefix = 'splice.lfdecentralizedtrust.org/'\nexport const TxKindMetaKey = `${SpliceMetaKeyPrefix}tx-kind`\nexport const SenderMetaKey = `${SpliceMetaKeyPrefix}sender`\nexport const ReasonMetaKey = `${SpliceMetaKeyPrefix}reason`\nexport const BurnedMetaKey = `${SpliceMetaKeyPrefix}burned`\nexport const AllKnownMetaKeys = [\n TxKindMetaKey,\n SenderMetaKey,\n ReasonMetaKey,\n BurnedMetaKey,\n]\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { AllKnownMetaKeys, matchInterfaceIds } from './constants.js'\n\nimport { Holding, TransferInstructionView } from './types.js'\nimport {\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\n\nimport { v3_3, v3_4 } from '@canton-network/core-ledger-client-types'\n\ntype ArchivedEvent =\n | v3_3.components['schemas']['ArchivedEvent']\n | v3_4.components['schemas']['ArchivedEvent']\ntype CreatedEvent =\n | v3_3.components['schemas']['CreatedEvent']\n | v3_4.components['schemas']['CreatedEvent']\ntype ExercisedEvent =\n | v3_3.components['schemas']['ExercisedEvent']\n | v3_4.components['schemas']['ExercisedEvent']\ntype JsInterfaceView =\n | v3_3.components['schemas']['JsInterfaceView']\n | v3_4.components['schemas']['JsInterfaceView']\n\nexport function hasInterface(\n interfaceId: string,\n event: ExercisedEvent | ArchivedEvent\n): boolean {\n return (event.implementedInterfaces || []).some((id) =>\n matchInterfaceIds(id, interfaceId)\n )\n}\n\nexport function getInterfaceView(\n createdEvent: CreatedEvent\n): JsInterfaceView | null {\n const interfaceViews = createdEvent.interfaceViews || null\n return (interfaceViews && interfaceViews[0]) || null\n}\n\nexport type KnownInterfaceView =\n | { type: 'Holding'; viewValue: Holding }\n | { type: 'TransferInstruction'; viewValue: TransferInstructionView }\n\nexport function getKnownInterfaceView(\n createdEvent: CreatedEvent\n): KnownInterfaceView | null {\n const interfaceView = getInterfaceView(createdEvent)\n if (!interfaceView) {\n return null\n } else if (\n matchInterfaceIds(HOLDING_INTERFACE_ID, interfaceView.interfaceId)\n ) {\n return {\n type: 'Holding',\n viewValue: interfaceView.viewValue as Holding,\n }\n } else if (\n matchInterfaceIds(\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n interfaceView.interfaceId\n )\n ) {\n return {\n type: 'TransferInstruction',\n viewValue: interfaceView.viewValue as TransferInstructionView,\n }\n } else {\n return null\n }\n}\n\n// TODO (#563): handle allocations in such a way that any callers have to handle them too\n/**\n * Use this when `createdEvent` is guaranteed to have an interface view because the ledger api filters\n * include it, and thus is guaranteed to be returned by the API.\n */\nexport function ensureInterfaceViewIsPresent(\n createdEvent: CreatedEvent,\n interfaceId: string\n): JsInterfaceView {\n const interfaceView = getInterfaceView(createdEvent)\n if (!interfaceView) {\n throw new Error(\n `Expected to have interface views, but didn't: ${JSON.stringify(\n createdEvent\n )}`\n )\n }\n if (!matchInterfaceIds(interfaceId, interfaceView.interfaceId)) {\n throw new Error(\n `Not a ${interfaceId} but a ${\n interfaceView.interfaceId\n }: ${JSON.stringify(createdEvent)}`\n )\n }\n return interfaceView\n}\n\ntype Meta = { values: { [key: string]: string } } | undefined\n\nexport function mergeMetas(event: ExercisedEvent, extra?: Meta): Meta {\n // Add a type assertion to help TypeScript understand the shape of choiceArgument\n const choiceArgument = event.choiceArgument as\n | {\n transfer?: { meta?: Meta }\n extraArgs?: { meta?: Meta }\n meta?: Meta\n }\n | undefined\n\n const lastWriteWins = [\n choiceArgument?.transfer?.meta,\n choiceArgument?.extraArgs?.meta,\n choiceArgument?.meta,\n extra,\n (event.exerciseResult as { meta?: Meta } | undefined)?.meta,\n ]\n const result: { [key: string]: string } = {}\n lastWriteWins.forEach((meta) => {\n const values: { [key: string]: string } = meta?.values || {}\n Object.entries(values).forEach(([k, v]) => {\n result[k] = v\n })\n })\n if (Object.keys(result).length === 0) {\n return undefined\n }\n // order of keys doesn't matter, but we return it consistent for test purposes (and it's nicer)\n else {\n return { values: result }\n }\n}\n\nexport function getMetaKeyValue(key: string, meta: Meta): string | null {\n return (meta?.values || {})[key] || null\n}\n\n/**\n * From the view of making it easy to build the display for the wallet,\n * we remove all metadata fields that were fully parsed, and whose content is reflected in the TypeScript structure.\n * Otherwise, the display code has to do so, overloading the user with superfluous metadata entries.\n */\nexport function removeParsedMetaKeys(meta: Meta): Meta {\n return {\n values: Object.fromEntries(\n Object.entries(meta?.values || {}).filter(\n ([k]) => !AllKnownMetaKeys.includes(k)\n )\n ),\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Metadata } from '@canton-network/core-token-standard'\nimport { v3_3, v3_4 } from '@canton-network/core-ledger-client-types'\n\nexport type ViewValue =\n | v3_3.components['schemas']['JsInterfaceView']['viewValue']\n | v3_4.components['schemas']['JsInterfaceView']['viewValue'] // unknown | undefined\nexport type JsActiveContract =\n | v3_3.components['schemas']['JsActiveContract']\n | v3_4.components['schemas']['JsActiveContract']\nexport interface Transaction {\n updateId: string\n offset: number\n recordTime: string\n synchronizerId: string\n events: TokenStandardEvent[]\n}\n\nexport interface TransferObject {\n amount: string\n executeBefore: string\n inputHoldingCids: string[]\n instrumentId: { admin: string; id: string }\n meta: Metadata\n receiver: string\n requestedAt: string\n sender: string\n}\n\nexport interface TokenStandardEvent {\n label: Label\n lockedHoldingsChange: HoldingsChange\n /** lockedHoldingsChangeSummaries contains one summary per instrument. */\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n /** @deprecated lockedHoldingsChangeSummary is incorrect in a\n * multi-instrument world. It will be removed in a future release, please\n * use unlockedHoldingsChangeSummaries instead. */\n lockedHoldingsChangeSummary: HoldingsChangeSummary\n unlockedHoldingsChange: HoldingsChange\n /** unlockedHoldingsChangeSummary contains one summary per instrument. */\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n /** @deprecated unlockedHoldingsChangeSummary is incorrect in a\n * multi-instrument world. It will be removed in a future release, please\n * use unlockedHoldingsChangeSummaries instead. */\n unlockedHoldingsChangeSummary: HoldingsChangeSummary\n transferInstruction: TransferInstructionView | null\n}\n\n// Same definition as HoldingView in Daml\nexport interface Holding {\n contractId: string\n owner: string\n instrumentId: { admin: string; id: string }\n amount: string\n lock: HoldingLock | null\n meta: any\n}\n\nexport interface HoldingLock {\n holders: string[]\n expiresAt?: string\n expiresAfter?: string\n context?: string\n}\n\nexport interface HoldingsChange {\n creates: Holding[]\n archives: Holding[]\n}\n\nexport interface HoldingsChangeSummary {\n instrumentId: { admin: string; id: string }\n numInputs: number\n inputAmount: string\n numOutputs: number\n outputAmount: string\n amountChange: string\n}\n\n/**\n * Same as TransferInstructionView in Daml when exercising a TransferInstruction choice,\n * otherwise just meta and transfer.\n */\n// TODO investigate because it actually differs from TransferInstructionView from daml codegen\n// where status is: { tag, value }\nexport interface TransferInstructionView {\n // currentInstructionCid: string // TODO (#505): add\n originalInstructionCid: string | null\n transfer?: any\n status: {\n before: any\n current: { tag: TransferInstructionCurrentTag; value: unknown } | null\n }\n meta: Metadata | null\n // Stable id to track one TransferInstruction lifecycle across updates, inspired by Java parser\n multiStepCorrelationId?: string\n}\n\nexport type TransferInstructionCurrentTag =\n | 'Pending'\n | 'Completed'\n | 'Rejected'\n | 'Withdrawn'\n | 'Failed'\n\nexport type Label =\n | TransferOut\n | TransferIn\n | MergeSplit\n | Burn\n | Mint\n | Unlock\n | Lock\n | ExpireDust\n | UnknownAction\ntype UnknownAction = RawArchive | RawCreate\ninterface BaseLabel {\n type: string\n meta: any\n}\ninterface KnownLabel extends BaseLabel {\n mintAmount: string\n burnAmount: string\n reason: string | null\n tokenStandardChoice: TokenStandardChoice | null\n}\nexport interface TokenStandardChoice {\n name: string\n choiceArgument: any\n exerciseResult: any\n}\n\nexport interface TransferOut extends KnownLabel {\n type: 'TransferOut'\n receiverAmounts: Array<{ receiver: string; amount: string }>\n}\n\nexport interface TransferIn extends KnownLabel {\n type: 'TransferIn'\n sender: string\n}\n\nexport interface MergeSplit extends KnownLabel {\n type: 'MergeSplit'\n}\n\n// Same as MergeSplit, but is more precise (tx-kind=burn)\nexport interface Burn extends KnownLabel {\n type: 'Burn'\n}\n\n// Same as MergeSplit, but is more precise (tx-kind=mint)\nexport interface Mint extends KnownLabel {\n type: 'Mint'\n}\n\nexport interface Unlock extends KnownLabel {\n type: 'Unlock'\n}\n\nexport interface Lock extends KnownLabel {\n type: 'Lock'\n}\n\nexport interface ExpireDust extends KnownLabel {\n type: 'ExpireDust'\n}\n\nexport interface RawArchive extends BaseLabel {\n type: 'Archive'\n parentChoice: string\n contractId: string\n offset: number\n templateId: string\n packageName: string\n actingParties: string[]\n payload: any\n meta: any\n}\nexport interface RawCreate extends BaseLabel {\n type: 'Create' | 'Lock'\n parentChoice: string\n contractId: string\n offset: number\n templateId: string\n payload: any\n packageName: string\n meta: any\n}\n\nexport const renderTransaction = (t: Transaction): any => {\n return { ...t, events: t.events.map(renderTransactionEvent) }\n}\n\nconst renderTransactionEvent = (e: TokenStandardEvent): any => {\n const lockedHoldingsChangeSummaries = e.lockedHoldingsChangeSummaries\n .map(renderHoldingsChangeSummary)\n .filter((s) => s !== null)\n\n const unlockedHoldingsChangeSummaries = e.unlockedHoldingsChangeSummaries\n .map(renderHoldingsChangeSummary)\n .filter((s) => s !== null)\n\n const lockedHoldingsChange = renderHoldingsChange(e.lockedHoldingsChange)\n const unlockedHoldingsChange = renderHoldingsChange(\n e.unlockedHoldingsChange\n )\n return {\n ...e,\n lockedHoldingsChange,\n unlockedHoldingsChange,\n lockedHoldingsChangeSummaries,\n // Deprecated\n lockedHoldingsChangeSummary: renderHoldingsChangeSummary(\n e.lockedHoldingsChangeSummary\n ),\n unlockedHoldingsChangeSummaries,\n // Deprecated\n unlockedHoldingsChangeSummary: renderHoldingsChangeSummary(\n e.unlockedHoldingsChangeSummary\n ),\n }\n}\n\nconst renderHoldingsChangeSummary = (\n s: HoldingsChangeSummary\n): Partial<HoldingsChangeSummary> | null => {\n if (\n s.numInputs === 0 &&\n s.numOutputs === 0 &&\n s.inputAmount === '0' &&\n s.outputAmount === '0' &&\n s.amountChange === '0'\n ) {\n return null\n }\n return {\n ...((s.instrumentId.admin !== '' || s.instrumentId.id !== '') && {\n instrumentId: s.instrumentId,\n }),\n ...(s.numInputs !== 0 && { numInputs: s.numInputs }),\n ...(s.inputAmount !== '0' && { inputAmount: s.inputAmount }),\n ...(s.numOutputs !== 0 && { numOutputs: s.numOutputs }),\n ...(s.outputAmount !== '0' && { outputAmount: s.outputAmount }),\n ...(s.amountChange !== '0' && { amountChange: s.amountChange }),\n }\n}\n\nconst renderHoldingsChange = (\n c: HoldingsChange\n): Partial<HoldingsChange> | null => {\n if (c.creates.length === 0 && c.archives.length === 0) {\n return null\n }\n return {\n ...(c.creates.length !== 0 && { creates: c.creates }),\n ...(c.archives.length !== 0 && { archives: c.archives }),\n }\n}\n\nexport interface PrettyTransactions {\n transactions: Transaction[]\n nextOffset: number\n}\n\nexport interface PrettyContract<T = ViewValue> {\n contractId: string\n interfaceViewValue: T\n activeContract: JsActiveContract\n fetchedAtOffset?: number | undefined\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\ntype InstrumentKey = { admin: string; id: string }\n\n/** InstrumentMap is a helper for when you want to group values by instrument. */\nexport class InstrumentMap<V> {\n private readonly map\n\n private encodeKey(instrumentId: InstrumentKey): string {\n return JSON.stringify([instrumentId.admin, instrumentId.id])\n }\n\n private decodeKey(key: string): InstrumentKey {\n const [admin, id] = JSON.parse(key)\n return { admin, id }\n }\n\n constructor() {\n this.map = new Map<string, V>()\n }\n\n set(key: InstrumentKey, value: V): void {\n this.map.set(this.encodeKey(key), value)\n }\n\n get(key: InstrumentKey): V | undefined {\n return this.map.get(this.encodeKey(key))\n }\n\n has(key: InstrumentKey): boolean {\n return this.map.has(this.encodeKey(key))\n }\n\n delete(key: InstrumentKey): boolean {\n return this.map.delete(this.encodeKey(key))\n }\n\n *entries(): IterableIterator<[InstrumentKey, V]> {\n for (const [key, value] of this.map.entries()) {\n yield [this.decodeKey(key), value]\n }\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ensureInterfaceViewIsPresent,\n getInterfaceView,\n getKnownInterfaceView,\n getMetaKeyValue,\n hasInterface,\n mergeMetas,\n removeParsedMetaKeys,\n} from './utils.js'\nimport {\n BurnedMetaKey,\n matchInterfaceIds,\n ReasonMetaKey,\n SenderMetaKey,\n TxKindMetaKey,\n} from './constants.js'\nimport {\n Holding,\n HoldingsChangeSummary,\n HoldingLock,\n HoldingsChange,\n Label,\n TokenStandardEvent,\n Transaction,\n TokenStandardChoice,\n TransferInstructionView,\n TransferInstructionCurrentTag,\n TransferObject,\n} from './types.js'\nimport { InstrumentMap } from './instrumentmap.js'\n\nimport {\n v3_3,\n EventFilterBySetup,\n v3_4,\n} from '@canton-network/core-ledger-client-types'\nimport BigNumber from 'bignumber.js'\nimport { PartyId } from '@canton-network/core-types'\nimport {\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\n\nimport { LedgerProvider, Ops } from '@canton-network/core-provider-ledger'\n\ntype ArchivedEvent =\n | v3_3.components['schemas']['ArchivedEvent']\n | v3_4.components['schemas']['ArchivedEvent']\ntype CreatedEvent =\n | v3_3.components['schemas']['CreatedEvent']\n | v3_4.components['schemas']['CreatedEvent']\ntype ExercisedEvent =\n | v3_3.components['schemas']['ExercisedEvent']\n | v3_4.components['schemas']['ExercisedEvent']\ntype Event =\n | v3_3.components['schemas']['Event']\n | v3_4.components['schemas']['Event']\ntype JsTransaction =\n | v3_3.components['schemas']['JsTransaction']\n | v3_4.components['schemas']['JsTransaction']\ntype JsGetEventsByContractIdResponse =\n | v3_3.components['schemas']['JsGetEventsByContractIdResponse']\n | v3_4.components['schemas']['JsGetEventsByContractIdResponse']\n\nfunction currentStatusFromChoiceOrResult(\n choice?: string | undefined,\n resultTag?: string | undefined\n): TransferInstructionCurrentTag {\n // If the result explicitly says Failed/Completed, prefer it.\n if (resultTag === 'TransferInstructionResult_Failed') return 'Failed'\n if (resultTag === 'TransferInstructionResult_Completed') return 'Completed'\n\n switch (choice) {\n case 'TransferInstruction_Reject':\n return 'Rejected'\n case 'TransferInstruction_Withdraw':\n return 'Withdrawn'\n case 'TransferInstruction_Accept':\n case 'TransferInstruction_Update':\n // When result tag wasn't Completed/Failed above, fall back to Pending\n return 'Pending'\n default:\n // When resultTag is Pending or unknown\n return 'Pending'\n }\n}\n\n// -For TransferInstruction Create use originalInstructionCid if present, otherwise this TransferInstruction's cid\n// -For TransferInstruction Exercise: use the exercised TransferInstruction cid, which equals the earlier Pending transferInstruction's cid.\n// This lets us correlate Pending to Accept/Reject/Withdraw across updates.\nfunction getCorrelationIdFromTransferInstruction(\n currentInstructionCid: string,\n originalInstructionCid?: string | null\n): string {\n return originalInstructionCid ?? currentInstructionCid\n}\n\n// If the exercise produced a Pending TI, return its newly created transferInstructionCid\n// Otherwise (Completed/Failed/Rejected/Withdrawn), there is no pending TransferInstruction to correlate\nfunction getPendingTransferInstructionCid(\n exercisedEvent: ExercisedEvent\n): string | undefined {\n const output = (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string; value?: any } }\n | undefined\n )?.output\n if (output?.tag !== 'TransferInstructionResult_Pending') return undefined\n\n const cid = output.value?.transferInstructionCid\n return cid ?? undefined\n}\n\nfunction isTransferObject(value: unknown): value is TransferObject {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n const instrumentId = v.instrumentId as Record<string, unknown> | undefined\n const meta = v.meta as Record<string, unknown> | undefined\n return (\n typeof v.sender === 'string' &&\n typeof v.receiver === 'string' &&\n typeof v.amount === 'string' &&\n typeof v.requestedAt === 'string' &&\n typeof v.executeBefore === 'string' &&\n Array.isArray(v.inputHoldingCids) &&\n v.inputHoldingCids.every((cid) => typeof cid === 'string') &&\n !!instrumentId &&\n typeof instrumentId.admin === 'string' &&\n typeof instrumentId.id === 'string' &&\n !!meta &&\n typeof meta.values === 'object' &&\n meta.values !== null\n )\n}\n\nexport class TransactionParser {\n private readonly ledgerProvider: LedgerProvider\n private readonly partyId: PartyId\n private readonly transaction: JsTransaction\n private readonly isMasterUser: boolean\n\n constructor(\n ledgerProvider: LedgerProvider,\n transaction: JsTransaction,\n\n partyId: PartyId,\n isMasterUser: boolean\n ) {\n this.ledgerProvider = ledgerProvider\n this.partyId = partyId\n this.transaction = transaction\n this.isMasterUser = isMasterUser\n }\n\n async parseTransaction(): Promise<Transaction> {\n const tx = this.transaction\n const events = await this.parseEvents([...(tx.events || [])].reverse())\n return {\n updateId: tx.updateId,\n offset: tx.offset,\n recordTime: tx.recordTime,\n synchronizerId: tx.synchronizerId,\n events,\n }\n }\n\n async parseTransferObjects(): Promise<TransferObject[]> {\n const eventsStack = [...(this.transaction.events || [])].reverse()\n const results = await this.fetchTransferObjectChoice(eventsStack)\n return results\n }\n\n private async fetchTransferObjectChoice(\n eventsStack: Event[]\n ): Promise<TransferObject[]> {\n const result: TransferObject[] = []\n while (eventsStack.length > 0) {\n const currentEvent = eventsStack.pop()!\n const { exercisedEvent } = getNodeIdAndEvent(currentEvent)\n if (\n exercisedEvent &&\n (exercisedEvent.choice === 'TransferFactory_Transfer' ||\n exercisedEvent.choice === 'TransferRule_Transfer')\n ) {\n const { choiceArgument } = exercisedEvent\n if (\n choiceArgument &&\n typeof choiceArgument === 'object' &&\n 'transfer' in choiceArgument\n ) {\n const transfer = (choiceArgument as Record<string, unknown>)\n .transfer\n if (isTransferObject(transfer)) {\n result.push(transfer)\n }\n }\n }\n }\n return result\n }\n\n private async parseEvents(\n eventsStack: Event[]\n ): Promise<TokenStandardEvent[]> {\n let callStack: Array<{\n parentChoiceName: string\n untilNodeId: number\n }> = []\n let continueAfterNodeId = -1\n const result: TokenStandardEvent[] = []\n while (eventsStack.length > 0) {\n const currentEvent = eventsStack.pop()!\n\n const { nodeId, createdEvent, archivedEvent, exercisedEvent } =\n getNodeIdAndEvent(currentEvent)\n callStack = callStack.filter((s) => s.untilNodeId <= nodeId)\n const parentChoice =\n (callStack[callStack.length - 1] &&\n callStack[callStack.length - 1].parentChoiceName) ||\n 'none (root node)'\n\n let parsed: EventParseResult | null\n if (nodeId <= continueAfterNodeId) {\n parsed = null\n } else if (createdEvent) {\n parsed = this.parseRawCreate(createdEvent, parentChoice)\n } else if (archivedEvent) {\n parsed = await this.parseRawArchive(archivedEvent, parentChoice)\n } else if (exercisedEvent) {\n parsed = await this.parseExercise(exercisedEvent)\n } else {\n throw new Error(\n `Impossible event: ${JSON.stringify(currentEvent)}`\n )\n }\n if (parsed && isLeafEventNode(parsed)) {\n // Exclude events where nothing happened\n if (holdingChangesNonEmpty(parsed.event)) {\n result.push({\n ...parsed.event,\n label: {\n ...parsed.event.label,\n meta: removeParsedMetaKeys(parsed.event.label.meta),\n },\n })\n }\n continueAfterNodeId = parsed.continueAfterNodeId\n } else if (parsed) {\n callStack.push({\n parentChoiceName: parsed.parentChoiceName,\n untilNodeId: parsed.lastDescendantNodeId,\n })\n }\n }\n return result\n }\n\n private parseRawCreate(\n create: CreatedEvent,\n parentChoice: string\n ): EventParseResult | null {\n return this.buildRawEvent(create, create.nodeId, (result) => {\n return {\n // TODO: this code currently only looks at the first instrument\n // to determine the type of the Event.\n type:\n Number(\n result.lockedHoldingsChangeSummaries[0]?.amountChange\n ) > 0\n ? 'Lock'\n : 'Create',\n parentChoice,\n contractId: create.contractId,\n offset: create.offset,\n templateId: create.templateId,\n payload: result.payload,\n packageName: create.packageName,\n meta: undefined,\n }\n })\n }\n\n private async parseRawArchive(\n archive: ArchivedEvent,\n parentChoice: string\n ): Promise<EventParseResult | null> {\n const events = await this.getEventsForArchive(archive)\n if (!events) {\n return null\n }\n\n return this.buildRawEvent(\n events.created.createdEvent,\n archive.nodeId,\n (result) => {\n return {\n type: 'Archive',\n parentChoice,\n contractId: archive.contractId,\n offset: archive.offset,\n templateId: archive.templateId,\n packageName: archive.packageName,\n actingParties:\n (archive as ExercisedEvent).actingParties || [],\n payload: result.payload,\n meta: undefined,\n }\n }\n )\n }\n\n private buildRawEvent(\n originalCreate: CreatedEvent,\n nodeId: number,\n buildLabel: (result: {\n payload: any\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n }) => Label\n ): EventParseResult | null {\n const view = getKnownInterfaceView(originalCreate)\n let result: {\n payload: any\n lockedHoldingsChange: HoldingsChange\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n lockedHoldingsChangeSummary: HoldingsChangeSummary\n unlockedHoldingsChange: HoldingsChange\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n unlockedHoldingsChangeSummary: HoldingsChangeSummary\n transferInstruction: TransferInstructionView | null\n } | null\n switch (view?.type) {\n case 'Holding': {\n const holdingView = view.viewValue\n if (this.partyId !== holdingView.owner) {\n result = null\n } else {\n const isLocked = !!holdingView.lock\n const summary: HoldingsChangeSummary = {\n instrumentId: holdingView.instrumentId,\n amountChange: holdingView.amount,\n numInputs: 0,\n inputAmount: '0',\n numOutputs: 1,\n outputAmount: holdingView.amount,\n }\n const lockedHoldingsChangeSummaries = isLocked\n ? [summary]\n : []\n const unlockedHoldingsChangeSummaries = isLocked\n ? []\n : [summary]\n result = {\n payload: holdingView,\n unlockedHoldingsChange: {\n creates: isLocked ? [] : [holdingView],\n archives: [],\n },\n lockedHoldingsChange: {\n creates: isLocked ? [holdingView] : [],\n archives: [],\n },\n lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n lockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n unlockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n transferInstruction: null,\n }\n }\n break\n }\n case 'TransferInstruction': {\n const transferInstructionView = view.viewValue\n if (\n ![\n transferInstructionView.transfer.sender,\n transferInstructionView.transfer.receiver,\n ].some((stakeholder) => stakeholder === this.partyId)\n ) {\n result = null\n } else {\n const multiStepCorrelationId =\n getCorrelationIdFromTransferInstruction(\n originalCreate.contractId,\n transferInstructionView.originalInstructionCid ??\n null\n )\n result = {\n payload: transferInstructionView,\n transferInstruction: {\n originalInstructionCid:\n transferInstructionView.originalInstructionCid,\n transfer: transferInstructionView.transfer,\n meta: transferInstructionView.meta,\n status: {\n before: transferInstructionView.status, // raw DAML pending sub-state\n current: { tag: 'Pending', value: {} }, // normalized\n },\n multiStepCorrelationId,\n },\n unlockedHoldingsChange: { creates: [], archives: [] },\n lockedHoldingsChange: { creates: [], archives: [] },\n unlockedHoldingsChangeSummaries: [],\n unlockedHoldingsChangeSummary:\n emptyHoldingsChangeSummary,\n lockedHoldingsChangeSummaries: [],\n lockedHoldingsChangeSummary: emptyHoldingsChangeSummary,\n }\n }\n break\n }\n default:\n result = null\n }\n\n return (\n result && {\n continueAfterNodeId: nodeId,\n event: {\n label: buildLabel(result),\n unlockedHoldingsChange: result.unlockedHoldingsChange,\n lockedHoldingsChange: result.lockedHoldingsChange,\n lockedHoldingsChangeSummaries:\n result.lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n result.lockedHoldingsChangeSummary,\n unlockedHoldingsChangeSummaries:\n result.unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n result.unlockedHoldingsChangeSummary,\n transferInstruction: result.transferInstruction,\n },\n }\n )\n }\n\n private async parseExercise(\n exercise: ExercisedEvent\n ): Promise<EventParseResult | null> {\n let result: ParsedKnownExercisedEvent | null = null\n const tokenStandardChoice = {\n name: exercise.choice,\n choiceArgument: exercise.choiceArgument,\n exerciseResult: exercise.exerciseResult,\n }\n switch (exercise.choice) {\n case 'TransferRule_Transfer':\n case 'TransferFactory_Transfer':\n result = await this.buildTransfer(exercise, tokenStandardChoice)\n break\n case 'TransferInstruction_Accept':\n case 'TransferInstruction_Reject':\n case 'TransferInstruction_Withdraw':\n case 'TransferInstruction_Update':\n result = await this.buildFromTransferInstructionExercise(\n exercise,\n tokenStandardChoice\n )\n break\n case 'BurnMintFactory_BurnMint':\n result = await this.buildMergeSplit(\n exercise,\n tokenStandardChoice\n )\n break\n default: {\n const meta = mergeMetas(exercise)\n const txKind = getMetaKeyValue(TxKindMetaKey, meta)\n if (txKind) {\n result = await this.parseViaTxKind(exercise, txKind)\n }\n break\n }\n }\n if (!result) {\n return {\n lastDescendantNodeId: exercise.lastDescendantNodeId,\n parentChoiceName: exercise.choice,\n }\n } else {\n // only this.partyId's holdings should be included in the response\n const lockedHoldingsChange: HoldingsChange = {\n creates: result.children.creates.filter(\n (h) => !!h.lock && h.owner === this.partyId\n ),\n archives: result.children.archives.filter(\n (h) => !!h.lock && h.owner === this.partyId\n ),\n }\n const unlockedHoldingsChange: HoldingsChange = {\n creates: result.children.creates.filter(\n (h) => !h.lock && h.owner === this.partyId\n ),\n archives: result.children.archives.filter(\n (h) => !h.lock && h.owner === this.partyId\n ),\n }\n const lockedHoldingsChangeSummaries = computeSummaries(\n lockedHoldingsChange,\n this.partyId\n )\n const unlockedHoldingsChangeSummaries = computeSummaries(\n unlockedHoldingsChange,\n this.partyId\n )\n return {\n event: {\n label: result.label,\n lockedHoldingsChange,\n lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n lockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n unlockedHoldingsChange,\n unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n unlockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n transferInstruction: result.transferInstruction,\n },\n continueAfterNodeId: exercise.lastDescendantNodeId,\n }\n }\n }\n\n private async parseViaTxKind(\n exercisedEvent: ExercisedEvent,\n txKind: string\n ): Promise<ParsedKnownExercisedEvent | null> {\n switch (txKind) {\n case 'transfer':\n return await this.buildTransfer(exercisedEvent, null)\n case 'merge-split':\n case 'burn':\n case 'mint':\n return await this.buildMergeSplit(exercisedEvent, null)\n case 'unlock':\n return await this.buildBasic(exercisedEvent, 'Unlock', null)\n case 'expire-dust':\n return await this.buildBasic(exercisedEvent, 'ExpireDust', null)\n default:\n throw new Error(\n `Unknown tx-kind '${txKind}' in ${JSON.stringify(exercisedEvent)}`\n )\n }\n }\n\n private async buildTransfer(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice | null,\n transferInstructions?: TransferInstructionView\n ): Promise<ParsedKnownExercisedEvent | null> {\n const meta = mergeMetas(\n exercisedEvent,\n transferInstructions?.transfer?.meta\n )\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n const choiceArgumentTransfer = (\n exercisedEvent.choiceArgument as {\n transfer?: any\n }\n ).transfer\n\n const sender: string =\n transferInstructions?.transfer?.sender ||\n getMetaKeyValue(SenderMetaKey, meta) ||\n choiceArgumentTransfer.sender\n if (!sender) {\n console.error(\n `Malformed transfer didn't contain sender. Will instead attempt to parse the children.\n Transfer: ${JSON.stringify(exercisedEvent)}`\n )\n return null\n }\n\n const resultTag =\n (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string } }\n | undefined\n )?.output?.tag || undefined\n const pendingCid = getPendingTransferInstructionCid(exercisedEvent)\n const currentTag = currentStatusFromChoiceOrResult(\n exercisedEvent.choice,\n resultTag\n )\n\n const children = await this.getChildren(exercisedEvent)\n const receiverAmounts = new Map<string, BigNumber>()\n children.creates\n .filter((h) => h.owner !== sender)\n .forEach((holding) =>\n receiverAmounts.set(\n holding.owner,\n (receiverAmounts.get(holding.owner) || BigNumber('0')).plus(\n BigNumber(holding.amount)\n )\n )\n )\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n\n let label: Label\n if (receiverAmounts.size === 0) {\n label = {\n ...amountChanges,\n type: 'MergeSplit',\n tokenStandardChoice,\n reason,\n meta,\n }\n } else if (sender === this.partyId) {\n label = {\n ...amountChanges,\n type: 'TransferOut',\n receiverAmounts: [...receiverAmounts].map(([k, v]) => {\n return { receiver: k, amount: v.toString() }\n }),\n tokenStandardChoice,\n reason,\n meta,\n }\n } else {\n label = {\n type: 'TransferIn',\n // for Transfers, the burn/mint is always 0 for the receiving party (i.e., 0 for TransferIn)\n burnAmount: '0',\n mintAmount: '0',\n sender,\n tokenStandardChoice,\n reason,\n meta,\n }\n }\n\n if (transferInstructions) {\n transferInstructions.status.current = transferInstructions.status\n .current || { tag: currentTag, value: {} }\n return {\n label,\n children,\n transferInstruction: transferInstructions,\n }\n }\n\n const transferInstruction: TransferInstructionView = {\n originalInstructionCid: null,\n ...(choiceArgumentTransfer !== undefined && {\n transfer: choiceArgumentTransfer,\n }),\n status: {\n before: null,\n current: { tag: currentTag, value: {} },\n },\n meta: null,\n ...(pendingCid ? { multiStepCorrelationId: pendingCid } : {}),\n }\n\n return {\n label,\n children,\n transferInstruction,\n }\n }\n\n private async buildMergeSplit(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice | null\n ): Promise<ParsedKnownExercisedEvent> {\n let type: 'MergeSplit' | 'Mint' | 'Burn'\n const meta = mergeMetas(exercisedEvent)\n switch (getMetaKeyValue(TxKindMetaKey, meta)) {\n case 'burn':\n type = 'Burn'\n break\n case 'mint':\n type = 'Mint'\n break\n default:\n type = 'MergeSplit'\n }\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n const children = await this.getChildren(exercisedEvent)\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n\n const label: Label = {\n ...amountChanges,\n type,\n tokenStandardChoice,\n reason,\n meta,\n }\n\n return {\n label,\n children,\n transferInstruction: null,\n }\n }\n\n private async buildFromTransferInstructionExercise(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice\n ): Promise<ParsedKnownExercisedEvent | null> {\n const instructionCid = exercisedEvent.contractId\n const transferInstructionEvents =\n await this.getEventsForArchive(exercisedEvent)\n if (!transferInstructionEvents) {\n // This will happen when the party observes the archive but is not a stakeholder.\n // For example, for Amulet, a validator will see a TransferInstruction_Reject/Withdraw\n // but will not see the create of a TransferInstruction.\n return null\n }\n const transferInstructionView = ensureInterfaceViewIsPresent(\n transferInstructionEvents.created.createdEvent,\n TRANSFER_INSTRUCTION_INTERFACE_ID\n ).viewValue as TransferInstructionView\n\n const multiStepCorrelationId = getCorrelationIdFromTransferInstruction(\n instructionCid,\n transferInstructionView.originalInstructionCid ?? null\n )\n\n const resultTag =\n (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string } }\n | undefined\n )?.output?.tag || undefined\n\n const currentTag = currentStatusFromChoiceOrResult(\n exercisedEvent.choice,\n resultTag\n )\n\n const transferInstruction: TransferInstructionView = {\n originalInstructionCid:\n transferInstructionView.originalInstructionCid,\n multiStepCorrelationId,\n transfer: transferInstructionView.transfer,\n meta: transferInstructionView.meta,\n status: {\n before: transferInstructionView.status,\n current: { tag: currentTag, value: {} },\n },\n }\n\n const exerciseResultOutputTag = resultTag\n const result =\n await (async (): Promise<ParsedKnownExercisedEvent | null> => {\n switch (exerciseResultOutputTag) {\n case 'TransferInstructionResult_Failed':\n case 'TransferInstructionResult_Pending':\n return this.buildMergeSplit(\n exercisedEvent,\n tokenStandardChoice\n )\n case 'TransferInstructionResult_Completed':\n return this.buildTransfer(\n exercisedEvent,\n tokenStandardChoice,\n transferInstruction\n )\n default:\n throw new Error(\n `Unknown TransferInstructionResult: ${exerciseResultOutputTag}`\n )\n }\n })()\n\n return (\n result && {\n ...result,\n transferInstruction,\n }\n )\n }\n\n private async buildBasic(\n exercisedEvent: ExercisedEvent,\n type: 'Unlock' | 'ExpireDust',\n tokenStandardChoice: TokenStandardChoice | null\n ): Promise<ParsedKnownExercisedEvent> {\n const children = await this.getChildren(exercisedEvent)\n const meta = mergeMetas(exercisedEvent)\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n return {\n label: {\n ...amountChanges,\n type,\n tokenStandardChoice,\n reason,\n meta,\n },\n children,\n transferInstruction: null,\n }\n }\n\n private async getChildren(\n exercisedEvent: ExercisedEvent\n ): Promise<HoldingsChange> {\n const mutatingResult: HoldingsChange = { creates: [], archives: [] }\n const childrenEventsSlice = (this.transaction.events || [])\n .map(getNodeIdAndEvent)\n .filter(\n ({ nodeId }) =>\n nodeId > exercisedEvent.nodeId &&\n nodeId <= exercisedEvent.lastDescendantNodeId\n )\n\n if (\n exercisedEvent.consuming &&\n hasInterface(HOLDING_INTERFACE_ID, exercisedEvent)\n ) {\n const selfEvent = await this.getEventsForArchive(exercisedEvent)\n if (selfEvent) {\n const holdingView = ensureInterfaceViewIsPresent(\n selfEvent.created.createdEvent,\n HOLDING_INTERFACE_ID\n ).viewValue as Holding\n mutatingResult.archives.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId: exercisedEvent.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n }\n\n for (const {\n createdEvent,\n archivedEvent,\n exercisedEvent,\n } of childrenEventsSlice) {\n if (createdEvent) {\n const interfaceView = getInterfaceView(createdEvent)\n if (\n interfaceView &&\n matchInterfaceIds(\n HOLDING_INTERFACE_ID,\n interfaceView.interfaceId\n )\n ) {\n const holdingView = interfaceView.viewValue as Holding\n mutatingResult.creates.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId: createdEvent.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n } else if (\n (archivedEvent &&\n hasInterface(HOLDING_INTERFACE_ID, archivedEvent)) ||\n (exercisedEvent &&\n exercisedEvent.consuming &&\n hasInterface(HOLDING_INTERFACE_ID, exercisedEvent))\n ) {\n const contractEvents = await this.getEventsForArchive(\n archivedEvent || exercisedEvent!\n )\n if (contractEvents) {\n const holdingView = ensureInterfaceViewIsPresent(\n contractEvents.created?.createdEvent,\n HOLDING_INTERFACE_ID\n ).viewValue as Holding\n mutatingResult.archives.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId:\n archivedEvent?.contractId ||\n exercisedEvent!.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n }\n }\n\n return {\n // remove transient contracts\n creates: mutatingResult.creates.filter(\n (create) =>\n !mutatingResult.archives.some(\n (archive) => create.contractId === archive.contractId\n )\n ),\n archives: mutatingResult.archives.filter(\n (archive) =>\n !mutatingResult.creates.some(\n (create) => create.contractId === archive.contractId\n )\n ),\n }\n }\n\n private async getEventsForArchive(\n archivedEvent: ArchivedEvent | ExercisedEvent\n ): Promise<null | Required<JsGetEventsByContractIdResponse>> {\n if (!(archivedEvent.witnessParties || []).includes(this.partyId)) {\n return null\n }\n\n const basePayload: Ops.PostV2EventsEventsByContractId['ledgerApi']['params']['body'] =\n {\n contractId: archivedEvent.contractId,\n eventFormat: EventFilterBySetup({\n interfaceIds: [\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n ],\n isMasterUser: this.isMasterUser,\n partyId: this.partyId,\n verbose: true,\n }),\n }\n\n const version = await this.ledgerProvider.request<Ops.GetV2Version>({\n method: 'ledgerApi',\n params: {\n resource: '/v2/version',\n requestMethod: 'get',\n },\n })\n\n const payload = version.version.includes('3.3')\n ? { ...basePayload, requestingParties: [] }\n : basePayload\n\n const events = await this.ledgerProvider\n .request<Ops.PostV2EventsEventsByContractId>({\n method: 'ledgerApi',\n params: {\n resource: '/v2/events/events-by-contract-id',\n requestMethod: 'post',\n body: payload,\n },\n })\n .catch((err) => {\n // This will happen for holdings with consuming choices\n // where the party the script is running on is an actor on the choice\n // but not a stakeholder.\n if (err.code === 'CONTRACT_EVENTS_NOT_FOUND') {\n return null\n } else {\n throw err\n }\n })\n\n if (!events) {\n return null\n }\n\n const created = events.created\n const archived = events.archived\n if (!created || !archived) {\n throw new Error(\n `Archival of ${\n archivedEvent.contractId\n } does not have a corresponding create/archive event: ${JSON.stringify(\n events\n )}`\n )\n }\n return { created, archived }\n }\n}\n\ntype EventParseResult = ParseChildren | ParsedEvent\nfunction isLeafEventNode(result: EventParseResult): result is ParsedEvent {\n return !!(result as ParsedEvent).event\n}\ninterface ParsedEvent {\n event: TokenStandardEvent\n continueAfterNodeId: number\n}\ninterface ParseChildren {\n parentChoiceName: string\n lastDescendantNodeId: number\n}\n\ninterface ParsedKnownExercisedEvent {\n label: Label\n children: HoldingsChange\n transferInstruction: TransferInstructionView | null\n}\n\n// a naive implementation like event.X?.nodeId || event.Y?.nodeId || event.Z?.nodeId fails when nodeId=0\ninterface NodeIdAndEvent {\n nodeId: number\n exercisedEvent?: ExercisedEvent\n archivedEvent?: ArchivedEvent | ExercisedEvent\n createdEvent?: CreatedEvent\n}\nfunction getNodeIdAndEvent(event: Event): NodeIdAndEvent {\n if ('ExercisedEvent' in event) {\n // ledger API's TRANSACTION_SHAPE_LEDGER_EFFECTS does not include ArchivedEvent, instead has the choice as Archive\n if (event.ExercisedEvent.choice === 'Archive') {\n return {\n nodeId: event.ExercisedEvent.nodeId,\n archivedEvent: event.ExercisedEvent,\n }\n } else {\n return {\n nodeId: event.ExercisedEvent.nodeId,\n exercisedEvent: event.ExercisedEvent,\n }\n }\n } else if ('CreatedEvent' in event) {\n return {\n nodeId: event.CreatedEvent.nodeId,\n createdEvent: event.CreatedEvent,\n }\n } else if ('ArchivedEvent' in event) {\n return {\n nodeId: event.ArchivedEvent.nodeId,\n archivedEvent: event.ArchivedEvent,\n }\n } else {\n throw new Error(`Impossible event type: ${event}`)\n }\n}\n\n/** sumHoldingsChange sums all the changes over a number of holdings.\n * Note that this function currently assumes all holdings use the same\n * instrument. */\nfunction sumHoldingsChange(\n change: HoldingsChange,\n filter: (owner: string, lock: HoldingLock | null) => boolean\n): BigNumber {\n return sumHoldings(\n change.creates.filter((create) => filter(create.owner, create.lock))\n ).minus(\n sumHoldings(\n change.archives.filter((archive) =>\n filter(archive.owner, archive.lock)\n )\n )\n )\n}\n\nfunction sumHoldings(holdings: Holding[]): BigNumber {\n if (holdings.length > 0) {\n // Sanity check.\n const instrumentId = holdings[0].instrumentId\n for (const holding of holdings) {\n if (\n holding.instrumentId.admin !== instrumentId.admin ||\n holding.instrumentId.id !== instrumentId.id\n ) {\n throw new Error(\n `Attempted to call sumHoldings on heterogeneous instruments: ${JSON.stringify(instrumentId)} != ${JSON.stringify(holding.instrumentId)}`\n )\n }\n }\n }\n return BigNumber.sum(\n ...holdings.map((h) => h.amount).concat(['0']) // avoid NaN\n )\n}\n\nfunction computeAmountChanges(\n children: HoldingsChange,\n meta: any,\n partyId: string\n) {\n const burnAmount = BigNumber(getMetaKeyValue(BurnedMetaKey, meta) || '0')\n const partyHoldingAmountChange = sumHoldingsChange(\n children,\n (owner) => owner === partyId\n )\n const otherPartiesHoldingAmountChange = sumHoldingsChange(\n children,\n (owner) => owner !== partyId\n )\n const mintAmount = partyHoldingAmountChange\n .plus(burnAmount)\n .plus(otherPartiesHoldingAmountChange)\n return {\n burnAmount: burnAmount.toString(),\n mintAmount: mintAmount.toString(),\n }\n}\n\nfunction computeSummary(\n instrumentId: { admin: string; id: string },\n changes: HoldingsChange,\n partyId: string\n): HoldingsChangeSummary {\n const amountChange = sumHoldingsChange(\n changes,\n (owner) => owner === partyId\n )\n const outputAmount = sumHoldings(changes.creates)\n const inputAmount = sumHoldings(changes.archives)\n return {\n instrumentId,\n amountChange: amountChange.toString(),\n numOutputs: changes.creates.length,\n outputAmount: outputAmount.toString(),\n numInputs: changes.archives.length,\n inputAmount: inputAmount.toString(),\n }\n}\n\nfunction holdingsChangeByInstrument(\n changes: HoldingsChange\n): InstrumentMap<HoldingsChange> {\n const map = new InstrumentMap<{ creates: Holding[]; archives: Holding[] }>()\n for (const create of changes.creates) {\n if (map.has(create.instrumentId)) {\n map.get(create.instrumentId)!.creates.push(create)\n } else {\n map.set(create.instrumentId, { creates: [create], archives: [] })\n }\n }\n for (const archive of changes.archives) {\n if (map.has(archive.instrumentId)) {\n map.get(archive.instrumentId)!.archives.push(archive)\n } else {\n map.set(archive.instrumentId, { creates: [], archives: [archive] })\n }\n }\n return map\n}\n\nfunction computeSummaries(\n changes: HoldingsChange,\n partyId: string\n): HoldingsChangeSummary[] {\n const byInstrument = holdingsChangeByInstrument(changes)\n return [...byInstrument.entries()].map(([instrumentId, change]) =>\n computeSummary(instrumentId, change, partyId)\n )\n}\n\nfunction holdingChangesNonEmpty(event: TokenStandardEvent): boolean {\n return (\n event.unlockedHoldingsChange.creates.length > 0 ||\n event.unlockedHoldingsChange.archives.length > 0 ||\n event.lockedHoldingsChange.creates.length > 0 ||\n event.lockedHoldingsChange.archives.length > 0\n )\n}\n\nconst emptyHoldingsChangeSummary: HoldingsChangeSummary = {\n // This is obviously incorrect, but the field was introduced at the same\n // time at which we introduced the more correct per-instrument summaries,\n // so we know that old code couldn't use this (broken) field, and new code\n // should use the correct summaries.\n instrumentId: { admin: '', id: '' },\n numInputs: 0,\n numOutputs: 0,\n inputAmount: '0',\n outputAmount: '0',\n amountChange: '0',\n}\n"]}
package/dist/index.js CHANGED
@@ -237,12 +237,12 @@ function isTransferObject(value) {
237
237
  return typeof v.sender === "string" && typeof v.receiver === "string" && typeof v.amount === "string" && typeof v.requestedAt === "string" && typeof v.executeBefore === "string" && Array.isArray(v.inputHoldingCids) && v.inputHoldingCids.every((cid) => typeof cid === "string") && !!instrumentId && typeof instrumentId.admin === "string" && typeof instrumentId.id === "string" && !!meta && typeof meta.values === "object" && meta.values !== null;
238
238
  }
239
239
  var TransactionParser = class {
240
- constructor(transaction, ledgerClient, partyId, isMasterUser) {
241
- __publicField(this, "ledgerClient");
240
+ constructor(ledgerProvider, transaction, partyId, isMasterUser) {
241
+ __publicField(this, "ledgerProvider");
242
242
  __publicField(this, "partyId");
243
243
  __publicField(this, "transaction");
244
244
  __publicField(this, "isMasterUser");
245
- this.ledgerClient = ledgerClient;
245
+ this.ledgerProvider = ledgerProvider;
246
246
  this.partyId = partyId;
247
247
  this.transaction = transaction;
248
248
  this.isMasterUser = isMasterUser;
@@ -704,27 +704,26 @@ var TransactionParser = class {
704
704
  }
705
705
  };
706
706
  const exerciseResultOutputTag = resultTag;
707
- let result = null;
708
- switch (exerciseResultOutputTag) {
709
- case "TransferInstructionResult_Failed":
710
- case "TransferInstructionResult_Pending":
711
- result = await this.buildMergeSplit(
712
- exercisedEvent,
713
- tokenStandardChoice
714
- );
715
- break;
716
- case "TransferInstructionResult_Completed":
717
- result = await this.buildTransfer(
718
- exercisedEvent,
719
- tokenStandardChoice,
720
- transferInstruction
721
- );
722
- break;
723
- default:
724
- throw new Error(
725
- `Unknown TransferInstructionResult: ${exerciseResultOutputTag}`
726
- );
727
- }
707
+ const result = await (async () => {
708
+ switch (exerciseResultOutputTag) {
709
+ case "TransferInstructionResult_Failed":
710
+ case "TransferInstructionResult_Pending":
711
+ return this.buildMergeSplit(
712
+ exercisedEvent,
713
+ tokenStandardChoice
714
+ );
715
+ case "TransferInstructionResult_Completed":
716
+ return this.buildTransfer(
717
+ exercisedEvent,
718
+ tokenStandardChoice,
719
+ transferInstruction
720
+ );
721
+ default:
722
+ throw new Error(
723
+ `Unknown TransferInstructionResult: ${exerciseResultOutputTag}`
724
+ );
725
+ }
726
+ })();
728
727
  return result && {
729
728
  ...result,
730
729
  transferInstruction
@@ -840,8 +839,22 @@ var TransactionParser = class {
840
839
  verbose: true
841
840
  })
842
841
  };
843
- const payload = this.ledgerClient.getCurrentClientVersion() === "3.3" ? { ...basePayload, requestingParties: [] } : basePayload;
844
- const events = await this.ledgerClient.postWithRetry("/v2/events/events-by-contract-id", payload).catch((err) => {
842
+ const version = await this.ledgerProvider.request({
843
+ method: "ledgerApi",
844
+ params: {
845
+ resource: "/v2/version",
846
+ requestMethod: "get"
847
+ }
848
+ });
849
+ const payload = version.version.includes("3.3") ? { ...basePayload, requestingParties: [] } : basePayload;
850
+ const events = await this.ledgerProvider.request({
851
+ method: "ledgerApi",
852
+ params: {
853
+ resource: "/v2/events/events-by-contract-id",
854
+ requestMethod: "post",
855
+ body: payload
856
+ }
857
+ }).catch((err) => {
845
858
  if (err.code === "CONTRACT_EVENTS_NOT_FOUND") {
846
859
  return null;
847
860
  } else {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/types.ts","../src/instrumentmap.ts","../src/parser.ts"],"names":["HOLDING_INTERFACE_ID","TRANSFER_INSTRUCTION_INTERFACE_ID","exercisedEvent"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n TRANSFER_FACTORY_INTERFACE_ID,\n ALLOCATION_FACTORY_INTERFACE_ID,\n ALLOCATION_INSTRUCTION_INTERFACE_ID,\n HOLDING_INTERFACE_ID,\n ALLOCATION_INTERFACE_ID,\n ALLOCATION_REQUEST_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\nexport interface InterfaceIdParts {\n packageName: string\n moduleName: string\n entityName: string\n}\n\nexport function splitInterfaceId(interfaceId: string): InterfaceIdParts | null {\n // Captures 3 groups: pkg, module and entity\n // Note that prefix # is optional in regexp below,\n // format without # is deprecated, but supported in canton 3.3 and will be removed in canton 3.4\n // https://docs.digitalasset.com/build/3.3/reference/lapi-migration-guide.html#identifier-addressing-by-package-name\n const regExp = /^#?([^:]+):([^:]+):([^:]+)$/\n const match = regExp.exec(interfaceId)\n if (!match) return null\n const [, packageName, moduleName, entityName] = match // [0]=full, [1]=pkg, [2]=module, [3]=entity\n return {\n packageName,\n moduleName,\n entityName,\n }\n}\n\nexport function matchInterfaceIds(a: string, b: string): boolean {\n const aParts = splitInterfaceId(a)\n const bParts = splitInterfaceId(b)\n\n return (\n aParts !== null &&\n bParts !== null &&\n aParts.moduleName === bParts.moduleName &&\n aParts.entityName === bParts.entityName\n )\n}\n\nexport const TokenStandardTransactionInterfaces = [\n HOLDING_INTERFACE_ID,\n TRANSFER_FACTORY_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n ALLOCATION_FACTORY_INTERFACE_ID,\n ALLOCATION_INSTRUCTION_INTERFACE_ID,\n ALLOCATION_INTERFACE_ID,\n ALLOCATION_REQUEST_INTERFACE_ID,\n]\n\nconst SpliceMetaKeyPrefix = 'splice.lfdecentralizedtrust.org/'\nexport const TxKindMetaKey = `${SpliceMetaKeyPrefix}tx-kind`\nexport const SenderMetaKey = `${SpliceMetaKeyPrefix}sender`\nexport const ReasonMetaKey = `${SpliceMetaKeyPrefix}reason`\nexport const BurnedMetaKey = `${SpliceMetaKeyPrefix}burned`\nexport const AllKnownMetaKeys = [\n TxKindMetaKey,\n SenderMetaKey,\n ReasonMetaKey,\n BurnedMetaKey,\n]\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { AllKnownMetaKeys, matchInterfaceIds } from './constants.js'\nimport { Types } from '@canton-network/core-ledger-client'\nimport { Holding, TransferInstructionView } from './types.js'\nimport {\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\n\ntype CreatedEvent = Types['CreatedEvent']\ntype ExercisedEvent = Types['ExercisedEvent']\ntype ArchivedEvent = Types['ArchivedEvent']\ntype JsInterfaceView = Types['JsInterfaceView']\n\nexport function hasInterface(\n interfaceId: string,\n event: ExercisedEvent | ArchivedEvent\n): boolean {\n return (event.implementedInterfaces || []).some((id) =>\n matchInterfaceIds(id, interfaceId)\n )\n}\n\nexport function getInterfaceView(\n createdEvent: CreatedEvent\n): JsInterfaceView | null {\n const interfaceViews = createdEvent.interfaceViews || null\n return (interfaceViews && interfaceViews[0]) || null\n}\n\nexport type KnownInterfaceView =\n | { type: 'Holding'; viewValue: Holding }\n | { type: 'TransferInstruction'; viewValue: TransferInstructionView }\n\nexport function getKnownInterfaceView(\n createdEvent: CreatedEvent\n): KnownInterfaceView | null {\n const interfaceView = getInterfaceView(createdEvent)\n if (!interfaceView) {\n return null\n } else if (\n matchInterfaceIds(HOLDING_INTERFACE_ID, interfaceView.interfaceId)\n ) {\n return {\n type: 'Holding',\n viewValue: interfaceView.viewValue as Holding,\n }\n } else if (\n matchInterfaceIds(\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n interfaceView.interfaceId\n )\n ) {\n return {\n type: 'TransferInstruction',\n viewValue: interfaceView.viewValue as TransferInstructionView,\n }\n } else {\n return null\n }\n}\n\n// TODO (#563): handle allocations in such a way that any callers have to handle them too\n/**\n * Use this when `createdEvent` is guaranteed to have an interface view because the ledger api filters\n * include it, and thus is guaranteed to be returned by the API.\n */\nexport function ensureInterfaceViewIsPresent(\n createdEvent: CreatedEvent,\n interfaceId: string\n): JsInterfaceView {\n const interfaceView = getInterfaceView(createdEvent)\n if (!interfaceView) {\n throw new Error(\n `Expected to have interface views, but didn't: ${JSON.stringify(\n createdEvent\n )}`\n )\n }\n if (!matchInterfaceIds(interfaceId, interfaceView.interfaceId)) {\n throw new Error(\n `Not a ${interfaceId} but a ${\n interfaceView.interfaceId\n }: ${JSON.stringify(createdEvent)}`\n )\n }\n return interfaceView\n}\n\ntype Meta = { values: { [key: string]: string } } | undefined\n\nexport function mergeMetas(event: ExercisedEvent, extra?: Meta): Meta {\n // Add a type assertion to help TypeScript understand the shape of choiceArgument\n const choiceArgument = event.choiceArgument as\n | {\n transfer?: { meta?: Meta }\n extraArgs?: { meta?: Meta }\n meta?: Meta\n }\n | undefined\n\n const lastWriteWins = [\n choiceArgument?.transfer?.meta,\n choiceArgument?.extraArgs?.meta,\n choiceArgument?.meta,\n extra,\n (event.exerciseResult as { meta?: Meta } | undefined)?.meta,\n ]\n const result: { [key: string]: string } = {}\n lastWriteWins.forEach((meta) => {\n const values: { [key: string]: string } = meta?.values || {}\n Object.entries(values).forEach(([k, v]) => {\n result[k] = v\n })\n })\n if (Object.keys(result).length === 0) {\n return undefined\n }\n // order of keys doesn't matter, but we return it consistent for test purposes (and it's nicer)\n else {\n return { values: result }\n }\n}\n\nexport function getMetaKeyValue(key: string, meta: Meta): string | null {\n return (meta?.values || {})[key] || null\n}\n\n/**\n * From the view of making it easy to build the display for the wallet,\n * we remove all metadata fields that were fully parsed, and whose content is reflected in the TypeScript structure.\n * Otherwise, the display code has to do so, overloading the user with superfluous metadata entries.\n */\nexport function removeParsedMetaKeys(meta: Meta): Meta {\n return {\n values: Object.fromEntries(\n Object.entries(meta?.values || {}).filter(\n ([k]) => !AllKnownMetaKeys.includes(k)\n )\n ),\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Metadata } from '@canton-network/core-token-standard'\nimport { v3_3, v3_4 } from '@canton-network/core-ledger-client-types'\n\nexport type ViewValue =\n | v3_3.components['schemas']['JsInterfaceView']['viewValue']\n | v3_4.components['schemas']['JsInterfaceView']['viewValue'] // unknown | undefined\nexport type JsActiveContract =\n | v3_3.components['schemas']['JsActiveContract']\n | v3_4.components['schemas']['JsActiveContract']\nexport interface Transaction {\n updateId: string\n offset: number\n recordTime: string\n synchronizerId: string\n events: TokenStandardEvent[]\n}\n\nexport interface TransferObject {\n amount: string\n executeBefore: string\n inputHoldingCids: string[]\n instrumentId: { admin: string; id: string }\n meta: Metadata\n receiver: string\n requestedAt: string\n sender: string\n}\n\nexport interface TokenStandardEvent {\n label: Label\n lockedHoldingsChange: HoldingsChange\n /** lockedHoldingsChangeSummaries contains one summary per instrument. */\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n /** @deprecated lockedHoldingsChangeSummary is incorrect in a\n * multi-instrument world. It will be removed in a future release, please\n * use unlockedHoldingsChangeSummaries instead. */\n lockedHoldingsChangeSummary: HoldingsChangeSummary\n unlockedHoldingsChange: HoldingsChange\n /** unlockedHoldingsChangeSummary contains one summary per instrument. */\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n /** @deprecated unlockedHoldingsChangeSummary is incorrect in a\n * multi-instrument world. It will be removed in a future release, please\n * use unlockedHoldingsChangeSummaries instead. */\n unlockedHoldingsChangeSummary: HoldingsChangeSummary\n transferInstruction: TransferInstructionView | null\n}\n\n// Same definition as HoldingView in Daml\nexport interface Holding {\n contractId: string\n owner: string\n instrumentId: { admin: string; id: string }\n amount: string\n lock: HoldingLock | null\n meta: any\n}\n\nexport interface HoldingLock {\n holders: string[]\n expiresAt?: string\n expiresAfter?: string\n context?: string\n}\n\nexport interface HoldingsChange {\n creates: Holding[]\n archives: Holding[]\n}\n\nexport interface HoldingsChangeSummary {\n instrumentId: { admin: string; id: string }\n numInputs: number\n inputAmount: string\n numOutputs: number\n outputAmount: string\n amountChange: string\n}\n\n/**\n * Same as TransferInstructionView in Daml when exercising a TransferInstruction choice,\n * otherwise just meta and transfer.\n */\n// TODO investigate because it actually differs from TransferInstructionView from daml codegen\n// where status is: { tag, value }\nexport interface TransferInstructionView {\n // currentInstructionCid: string // TODO (#505): add\n originalInstructionCid: string | null\n transfer?: any\n status: {\n before: any\n current: { tag: TransferInstructionCurrentTag; value: unknown } | null\n }\n meta: Metadata | null\n // Stable id to track one TransferInstruction lifecycle across updates, inspired by Java parser\n multiStepCorrelationId?: string\n}\n\nexport type TransferInstructionCurrentTag =\n | 'Pending'\n | 'Completed'\n | 'Rejected'\n | 'Withdrawn'\n | 'Failed'\n\nexport type Label =\n | TransferOut\n | TransferIn\n | MergeSplit\n | Burn\n | Mint\n | Unlock\n | Lock\n | ExpireDust\n | UnknownAction\ntype UnknownAction = RawArchive | RawCreate\ninterface BaseLabel {\n type: string\n meta: any\n}\ninterface KnownLabel extends BaseLabel {\n mintAmount: string\n burnAmount: string\n reason: string | null\n tokenStandardChoice: TokenStandardChoice | null\n}\nexport interface TokenStandardChoice {\n name: string\n choiceArgument: any\n exerciseResult: any\n}\n\nexport interface TransferOut extends KnownLabel {\n type: 'TransferOut'\n receiverAmounts: Array<{ receiver: string; amount: string }>\n}\n\nexport interface TransferIn extends KnownLabel {\n type: 'TransferIn'\n sender: string\n}\n\nexport interface MergeSplit extends KnownLabel {\n type: 'MergeSplit'\n}\n\n// Same as MergeSplit, but is more precise (tx-kind=burn)\nexport interface Burn extends KnownLabel {\n type: 'Burn'\n}\n\n// Same as MergeSplit, but is more precise (tx-kind=mint)\nexport interface Mint extends KnownLabel {\n type: 'Mint'\n}\n\nexport interface Unlock extends KnownLabel {\n type: 'Unlock'\n}\n\nexport interface Lock extends KnownLabel {\n type: 'Lock'\n}\n\nexport interface ExpireDust extends KnownLabel {\n type: 'ExpireDust'\n}\n\nexport interface RawArchive extends BaseLabel {\n type: 'Archive'\n parentChoice: string\n contractId: string\n offset: number\n templateId: string\n packageName: string\n actingParties: string[]\n payload: any\n meta: any\n}\nexport interface RawCreate extends BaseLabel {\n type: 'Create' | 'Lock'\n parentChoice: string\n contractId: string\n offset: number\n templateId: string\n payload: any\n packageName: string\n meta: any\n}\n\nexport const renderTransaction = (t: Transaction): any => {\n return { ...t, events: t.events.map(renderTransactionEvent) }\n}\n\nconst renderTransactionEvent = (e: TokenStandardEvent): any => {\n const lockedHoldingsChangeSummaries = e.lockedHoldingsChangeSummaries\n .map(renderHoldingsChangeSummary)\n .filter((s) => s !== null)\n\n const unlockedHoldingsChangeSummaries = e.unlockedHoldingsChangeSummaries\n .map(renderHoldingsChangeSummary)\n .filter((s) => s !== null)\n\n const lockedHoldingsChange = renderHoldingsChange(e.lockedHoldingsChange)\n const unlockedHoldingsChange = renderHoldingsChange(\n e.unlockedHoldingsChange\n )\n return {\n ...e,\n lockedHoldingsChange,\n unlockedHoldingsChange,\n lockedHoldingsChangeSummaries,\n // Deprecated\n lockedHoldingsChangeSummary: renderHoldingsChangeSummary(\n e.lockedHoldingsChangeSummary\n ),\n unlockedHoldingsChangeSummaries,\n // Deprecated\n unlockedHoldingsChangeSummary: renderHoldingsChangeSummary(\n e.unlockedHoldingsChangeSummary\n ),\n }\n}\n\nconst renderHoldingsChangeSummary = (\n s: HoldingsChangeSummary\n): Partial<HoldingsChangeSummary> | null => {\n if (\n s.numInputs === 0 &&\n s.numOutputs === 0 &&\n s.inputAmount === '0' &&\n s.outputAmount === '0' &&\n s.amountChange === '0'\n ) {\n return null\n }\n return {\n ...((s.instrumentId.admin !== '' || s.instrumentId.id !== '') && {\n instrumentId: s.instrumentId,\n }),\n ...(s.numInputs !== 0 && { numInputs: s.numInputs }),\n ...(s.inputAmount !== '0' && { inputAmount: s.inputAmount }),\n ...(s.numOutputs !== 0 && { numOutputs: s.numOutputs }),\n ...(s.outputAmount !== '0' && { outputAmount: s.outputAmount }),\n ...(s.amountChange !== '0' && { amountChange: s.amountChange }),\n }\n}\n\nconst renderHoldingsChange = (\n c: HoldingsChange\n): Partial<HoldingsChange> | null => {\n if (c.creates.length === 0 && c.archives.length === 0) {\n return null\n }\n return {\n ...(c.creates.length !== 0 && { creates: c.creates }),\n ...(c.archives.length !== 0 && { archives: c.archives }),\n }\n}\n\nexport interface PrettyTransactions {\n transactions: Transaction[]\n nextOffset: number\n}\n\nexport interface PrettyContract<T = ViewValue> {\n contractId: string\n interfaceViewValue: T\n activeContract: JsActiveContract\n fetchedAtOffset?: number | undefined\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\ntype InstrumentKey = { admin: string; id: string }\n\n/** InstrumentMap is a helper for when you want to group values by instrument. */\nexport class InstrumentMap<V> {\n private readonly map\n\n private encodeKey(instrumentId: InstrumentKey): string {\n return JSON.stringify([instrumentId.admin, instrumentId.id])\n }\n\n private decodeKey(key: string): InstrumentKey {\n const [admin, id] = JSON.parse(key)\n return { admin, id }\n }\n\n constructor() {\n this.map = new Map<string, V>()\n }\n\n set(key: InstrumentKey, value: V): void {\n this.map.set(this.encodeKey(key), value)\n }\n\n get(key: InstrumentKey): V | undefined {\n return this.map.get(this.encodeKey(key))\n }\n\n has(key: InstrumentKey): boolean {\n return this.map.has(this.encodeKey(key))\n }\n\n delete(key: InstrumentKey): boolean {\n return this.map.delete(this.encodeKey(key))\n }\n\n *entries(): IterableIterator<[InstrumentKey, V]> {\n for (const [key, value] of this.map.entries()) {\n yield [this.decodeKey(key), value]\n }\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ensureInterfaceViewIsPresent,\n getInterfaceView,\n getKnownInterfaceView,\n getMetaKeyValue,\n hasInterface,\n mergeMetas,\n removeParsedMetaKeys,\n} from './utils.js'\nimport {\n BurnedMetaKey,\n matchInterfaceIds,\n ReasonMetaKey,\n SenderMetaKey,\n TxKindMetaKey,\n} from './constants.js'\nimport {\n Holding,\n HoldingsChangeSummary,\n HoldingLock,\n HoldingsChange,\n Label,\n TokenStandardEvent,\n Transaction,\n TokenStandardChoice,\n TransferInstructionView,\n TransferInstructionCurrentTag,\n TransferObject,\n} from './types.js'\nimport { InstrumentMap } from './instrumentmap.js'\n\nimport {\n v3_3,\n EventFilterBySetup,\n} from '@canton-network/core-ledger-client-types'\nimport { LedgerClient } from '@canton-network/core-ledger-client'\nimport BigNumber from 'bignumber.js'\nimport { PartyId } from '@canton-network/core-types'\nimport {\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\n\ntype ArchivedEvent = v3_3.components['schemas']['ArchivedEvent']\ntype CreatedEvent = v3_3.components['schemas']['CreatedEvent']\ntype ExercisedEvent = v3_3.components['schemas']['ExercisedEvent']\ntype Event = v3_3.components['schemas']['Event']\ntype JsTransaction = v3_3.components['schemas']['JsTransaction']\ntype JsGetEventsByContractIdResponse =\n v3_3.components['schemas']['JsGetEventsByContractIdResponse']\n\nfunction currentStatusFromChoiceOrResult(\n choice?: string | undefined,\n resultTag?: string | undefined\n): TransferInstructionCurrentTag {\n // If the result explicitly says Failed/Completed, prefer it.\n if (resultTag === 'TransferInstructionResult_Failed') return 'Failed'\n if (resultTag === 'TransferInstructionResult_Completed') return 'Completed'\n\n switch (choice) {\n case 'TransferInstruction_Reject':\n return 'Rejected'\n case 'TransferInstruction_Withdraw':\n return 'Withdrawn'\n case 'TransferInstruction_Accept':\n case 'TransferInstruction_Update':\n // When result tag wasn't Completed/Failed above, fall back to Pending\n return 'Pending'\n default:\n // When resultTag is Pending or unknown\n return 'Pending'\n }\n}\n\n// -For TransferInstruction Create use originalInstructionCid if present, otherwise this TransferInstruction's cid\n// -For TransferInstruction Exercise: use the exercised TransferInstruction cid, which equals the earlier Pending transferInstruction's cid.\n// This lets us correlate Pending to Accept/Reject/Withdraw across updates.\nfunction getCorrelationIdFromTransferInstruction(\n currentInstructionCid: string,\n originalInstructionCid?: string | null\n): string {\n return originalInstructionCid ?? currentInstructionCid\n}\n\n// If the exercise produced a Pending TI, return its newly created transferInstructionCid\n// Otherwise (Completed/Failed/Rejected/Withdrawn), there is no pending TransferInstruction to correlate\nfunction getPendingTransferInstructionCid(\n exercisedEvent: ExercisedEvent\n): string | undefined {\n const output = (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string; value?: any } }\n | undefined\n )?.output\n if (output?.tag !== 'TransferInstructionResult_Pending') return undefined\n\n const cid = output.value?.transferInstructionCid\n return cid ?? undefined\n}\n\nfunction isTransferObject(value: unknown): value is TransferObject {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n const instrumentId = v.instrumentId as Record<string, unknown> | undefined\n const meta = v.meta as Record<string, unknown> | undefined\n return (\n typeof v.sender === 'string' &&\n typeof v.receiver === 'string' &&\n typeof v.amount === 'string' &&\n typeof v.requestedAt === 'string' &&\n typeof v.executeBefore === 'string' &&\n Array.isArray(v.inputHoldingCids) &&\n v.inputHoldingCids.every((cid) => typeof cid === 'string') &&\n !!instrumentId &&\n typeof instrumentId.admin === 'string' &&\n typeof instrumentId.id === 'string' &&\n !!meta &&\n typeof meta.values === 'object' &&\n meta.values !== null\n )\n}\n\nexport class TransactionParser {\n private readonly ledgerClient: LedgerClient\n private readonly partyId: PartyId\n private readonly transaction: JsTransaction\n private readonly isMasterUser: boolean\n\n constructor(\n transaction: JsTransaction,\n ledgerClient: LedgerClient,\n partyId: PartyId,\n isMasterUser: boolean\n ) {\n this.ledgerClient = ledgerClient\n this.partyId = partyId\n this.transaction = transaction\n this.isMasterUser = isMasterUser\n }\n\n async parseTransaction(): Promise<Transaction> {\n const tx = this.transaction\n const events = await this.parseEvents([...(tx.events || [])].reverse())\n return {\n updateId: tx.updateId,\n offset: tx.offset,\n recordTime: tx.recordTime,\n synchronizerId: tx.synchronizerId,\n events,\n }\n }\n\n async parseTransferObjects(): Promise<TransferObject[]> {\n const eventsStack = [...(this.transaction.events || [])].reverse()\n const results = await this.fetchTransferObjectChoice(eventsStack)\n return results\n }\n\n private async fetchTransferObjectChoice(\n eventsStack: Event[]\n ): Promise<TransferObject[]> {\n const result: TransferObject[] = []\n while (eventsStack.length > 0) {\n const currentEvent = eventsStack.pop()!\n const { exercisedEvent } = getNodeIdAndEvent(currentEvent)\n if (\n exercisedEvent &&\n (exercisedEvent.choice === 'TransferFactory_Transfer' ||\n exercisedEvent.choice === 'TransferRule_Transfer')\n ) {\n const { choiceArgument } = exercisedEvent\n if (\n choiceArgument &&\n typeof choiceArgument === 'object' &&\n 'transfer' in choiceArgument\n ) {\n const transfer = (choiceArgument as Record<string, unknown>)\n .transfer\n if (isTransferObject(transfer)) {\n result.push(transfer)\n }\n }\n }\n }\n return result\n }\n\n private async parseEvents(\n eventsStack: Event[]\n ): Promise<TokenStandardEvent[]> {\n let callStack: Array<{\n parentChoiceName: string\n untilNodeId: number\n }> = []\n let continueAfterNodeId = -1\n const result: TokenStandardEvent[] = []\n while (eventsStack.length > 0) {\n const currentEvent = eventsStack.pop()!\n\n const { nodeId, createdEvent, archivedEvent, exercisedEvent } =\n getNodeIdAndEvent(currentEvent)\n callStack = callStack.filter((s) => s.untilNodeId <= nodeId)\n const parentChoice =\n (callStack[callStack.length - 1] &&\n callStack[callStack.length - 1].parentChoiceName) ||\n 'none (root node)'\n\n let parsed: EventParseResult | null\n if (nodeId <= continueAfterNodeId) {\n parsed = null\n } else if (createdEvent) {\n parsed = this.parseRawCreate(createdEvent, parentChoice)\n } else if (archivedEvent) {\n parsed = await this.parseRawArchive(archivedEvent, parentChoice)\n } else if (exercisedEvent) {\n parsed = await this.parseExercise(exercisedEvent)\n } else {\n throw new Error(\n `Impossible event: ${JSON.stringify(currentEvent)}`\n )\n }\n if (parsed && isLeafEventNode(parsed)) {\n // Exclude events where nothing happened\n if (holdingChangesNonEmpty(parsed.event)) {\n result.push({\n ...parsed.event,\n label: {\n ...parsed.event.label,\n meta: removeParsedMetaKeys(parsed.event.label.meta),\n },\n })\n }\n continueAfterNodeId = parsed.continueAfterNodeId\n } else if (parsed) {\n callStack.push({\n parentChoiceName: parsed.parentChoiceName,\n untilNodeId: parsed.lastDescendantNodeId,\n })\n }\n }\n return result\n }\n\n private parseRawCreate(\n create: CreatedEvent,\n parentChoice: string\n ): EventParseResult | null {\n return this.buildRawEvent(create, create.nodeId, (result) => {\n return {\n // TODO: this code currently only looks at the first instrument\n // to determine the type of the Event.\n type:\n Number(\n result.lockedHoldingsChangeSummaries[0]?.amountChange\n ) > 0\n ? 'Lock'\n : 'Create',\n parentChoice,\n contractId: create.contractId,\n offset: create.offset,\n templateId: create.templateId,\n payload: result.payload,\n packageName: create.packageName,\n meta: undefined,\n }\n })\n }\n\n private async parseRawArchive(\n archive: ArchivedEvent,\n parentChoice: string\n ): Promise<EventParseResult | null> {\n const events = await this.getEventsForArchive(archive)\n if (!events) {\n return null\n }\n return this.buildRawEvent(\n events.created.createdEvent,\n archive.nodeId,\n (result) => {\n return {\n type: 'Archive',\n parentChoice,\n contractId: archive.contractId,\n offset: archive.offset,\n templateId: archive.templateId,\n packageName: archive.packageName,\n actingParties:\n (archive as ExercisedEvent).actingParties || [],\n payload: result.payload,\n meta: undefined,\n }\n }\n )\n }\n\n private buildRawEvent(\n originalCreate: CreatedEvent,\n nodeId: number,\n buildLabel: (result: {\n payload: any\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n }) => Label\n ): EventParseResult | null {\n const view = getKnownInterfaceView(originalCreate)\n let result: {\n payload: any\n lockedHoldingsChange: HoldingsChange\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n lockedHoldingsChangeSummary: HoldingsChangeSummary\n unlockedHoldingsChange: HoldingsChange\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n unlockedHoldingsChangeSummary: HoldingsChangeSummary\n transferInstruction: TransferInstructionView | null\n } | null\n switch (view?.type) {\n case 'Holding': {\n const holdingView = view.viewValue\n if (this.partyId !== holdingView.owner) {\n result = null\n } else {\n const isLocked = !!holdingView.lock\n const summary: HoldingsChangeSummary = {\n instrumentId: holdingView.instrumentId,\n amountChange: holdingView.amount,\n numInputs: 0,\n inputAmount: '0',\n numOutputs: 1,\n outputAmount: holdingView.amount,\n }\n const lockedHoldingsChangeSummaries = isLocked\n ? [summary]\n : []\n const unlockedHoldingsChangeSummaries = isLocked\n ? []\n : [summary]\n result = {\n payload: holdingView,\n unlockedHoldingsChange: {\n creates: isLocked ? [] : [holdingView],\n archives: [],\n },\n lockedHoldingsChange: {\n creates: isLocked ? [holdingView] : [],\n archives: [],\n },\n lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n lockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n unlockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n transferInstruction: null,\n }\n }\n break\n }\n case 'TransferInstruction': {\n const transferInstructionView = view.viewValue\n if (\n ![\n transferInstructionView.transfer.sender,\n transferInstructionView.transfer.receiver,\n ].some((stakeholder) => stakeholder === this.partyId)\n ) {\n result = null\n } else {\n const multiStepCorrelationId =\n getCorrelationIdFromTransferInstruction(\n originalCreate.contractId,\n transferInstructionView.originalInstructionCid ??\n null\n )\n result = {\n payload: transferInstructionView,\n transferInstruction: {\n originalInstructionCid:\n transferInstructionView.originalInstructionCid,\n transfer: transferInstructionView.transfer,\n meta: transferInstructionView.meta,\n status: {\n before: transferInstructionView.status, // raw DAML pending sub-state\n current: { tag: 'Pending', value: {} }, // normalized\n },\n multiStepCorrelationId,\n },\n unlockedHoldingsChange: { creates: [], archives: [] },\n lockedHoldingsChange: { creates: [], archives: [] },\n unlockedHoldingsChangeSummaries: [],\n unlockedHoldingsChangeSummary:\n emptyHoldingsChangeSummary,\n lockedHoldingsChangeSummaries: [],\n lockedHoldingsChangeSummary: emptyHoldingsChangeSummary,\n }\n }\n break\n }\n default:\n result = null\n }\n\n return (\n result && {\n continueAfterNodeId: nodeId,\n event: {\n label: buildLabel(result),\n unlockedHoldingsChange: result.unlockedHoldingsChange,\n lockedHoldingsChange: result.lockedHoldingsChange,\n lockedHoldingsChangeSummaries:\n result.lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n result.lockedHoldingsChangeSummary,\n unlockedHoldingsChangeSummaries:\n result.unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n result.unlockedHoldingsChangeSummary,\n transferInstruction: result.transferInstruction,\n },\n }\n )\n }\n\n private async parseExercise(\n exercise: ExercisedEvent\n ): Promise<EventParseResult | null> {\n let result: ParsedKnownExercisedEvent | null = null\n const tokenStandardChoice = {\n name: exercise.choice,\n choiceArgument: exercise.choiceArgument,\n exerciseResult: exercise.exerciseResult,\n }\n switch (exercise.choice) {\n case 'TransferRule_Transfer':\n case 'TransferFactory_Transfer':\n result = await this.buildTransfer(exercise, tokenStandardChoice)\n break\n case 'TransferInstruction_Accept':\n case 'TransferInstruction_Reject':\n case 'TransferInstruction_Withdraw':\n case 'TransferInstruction_Update':\n result = await this.buildFromTransferInstructionExercise(\n exercise,\n tokenStandardChoice\n )\n break\n case 'BurnMintFactory_BurnMint':\n result = await this.buildMergeSplit(\n exercise,\n tokenStandardChoice\n )\n break\n default: {\n const meta = mergeMetas(exercise)\n const txKind = getMetaKeyValue(TxKindMetaKey, meta)\n if (txKind) {\n result = await this.parseViaTxKind(exercise, txKind)\n }\n break\n }\n }\n if (!result) {\n return {\n lastDescendantNodeId: exercise.lastDescendantNodeId,\n parentChoiceName: exercise.choice,\n }\n } else {\n // only this.partyId's holdings should be included in the response\n const lockedHoldingsChange: HoldingsChange = {\n creates: result.children.creates.filter(\n (h) => !!h.lock && h.owner === this.partyId\n ),\n archives: result.children.archives.filter(\n (h) => !!h.lock && h.owner === this.partyId\n ),\n }\n const unlockedHoldingsChange: HoldingsChange = {\n creates: result.children.creates.filter(\n (h) => !h.lock && h.owner === this.partyId\n ),\n archives: result.children.archives.filter(\n (h) => !h.lock && h.owner === this.partyId\n ),\n }\n const lockedHoldingsChangeSummaries = computeSummaries(\n lockedHoldingsChange,\n this.partyId\n )\n const unlockedHoldingsChangeSummaries = computeSummaries(\n unlockedHoldingsChange,\n this.partyId\n )\n return {\n event: {\n label: result.label,\n lockedHoldingsChange,\n lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n lockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n unlockedHoldingsChange,\n unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n unlockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n transferInstruction: result.transferInstruction,\n },\n continueAfterNodeId: exercise.lastDescendantNodeId,\n }\n }\n }\n\n private async parseViaTxKind(\n exercisedEvent: ExercisedEvent,\n txKind: string\n ): Promise<ParsedKnownExercisedEvent | null> {\n switch (txKind) {\n case 'transfer':\n return await this.buildTransfer(exercisedEvent, null)\n case 'merge-split':\n case 'burn':\n case 'mint':\n return await this.buildMergeSplit(exercisedEvent, null)\n case 'unlock':\n return await this.buildBasic(exercisedEvent, 'Unlock', null)\n case 'expire-dust':\n return await this.buildBasic(exercisedEvent, 'ExpireDust', null)\n default:\n throw new Error(\n `Unknown tx-kind '${txKind}' in ${JSON.stringify(exercisedEvent)}`\n )\n }\n }\n\n private async buildTransfer(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice | null,\n transferInstructions?: TransferInstructionView\n ): Promise<ParsedKnownExercisedEvent | null> {\n const meta = mergeMetas(\n exercisedEvent,\n transferInstructions?.transfer?.meta\n )\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n const choiceArgumentTransfer = (\n exercisedEvent.choiceArgument as {\n transfer?: any\n }\n ).transfer\n\n const sender: string =\n transferInstructions?.transfer?.sender ||\n getMetaKeyValue(SenderMetaKey, meta) ||\n choiceArgumentTransfer.sender\n if (!sender) {\n console.error(\n `Malformed transfer didn't contain sender. Will instead attempt to parse the children.\n Transfer: ${JSON.stringify(exercisedEvent)}`\n )\n return null\n }\n\n const resultTag =\n (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string } }\n | undefined\n )?.output?.tag || undefined\n const pendingCid = getPendingTransferInstructionCid(exercisedEvent)\n const currentTag = currentStatusFromChoiceOrResult(\n exercisedEvent.choice,\n resultTag\n )\n\n const children = await this.getChildren(exercisedEvent)\n const receiverAmounts = new Map<string, BigNumber>()\n children.creates\n .filter((h) => h.owner !== sender)\n .forEach((holding) =>\n receiverAmounts.set(\n holding.owner,\n (receiverAmounts.get(holding.owner) || BigNumber('0')).plus(\n BigNumber(holding.amount)\n )\n )\n )\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n\n let label: Label\n if (receiverAmounts.size === 0) {\n label = {\n ...amountChanges,\n type: 'MergeSplit',\n tokenStandardChoice,\n reason,\n meta,\n }\n } else if (sender === this.partyId) {\n label = {\n ...amountChanges,\n type: 'TransferOut',\n receiverAmounts: [...receiverAmounts].map(([k, v]) => {\n return { receiver: k, amount: v.toString() }\n }),\n tokenStandardChoice,\n reason,\n meta,\n }\n } else {\n label = {\n type: 'TransferIn',\n // for Transfers, the burn/mint is always 0 for the receiving party (i.e., 0 for TransferIn)\n burnAmount: '0',\n mintAmount: '0',\n sender,\n tokenStandardChoice,\n reason,\n meta,\n }\n }\n\n if (transferInstructions) {\n transferInstructions.status.current = transferInstructions.status\n .current || { tag: currentTag, value: {} }\n return {\n label,\n children,\n transferInstruction: transferInstructions,\n }\n }\n\n const transferInstruction: TransferInstructionView = {\n originalInstructionCid: null,\n ...(choiceArgumentTransfer !== undefined && {\n transfer: choiceArgumentTransfer,\n }),\n status: {\n before: null,\n current: { tag: currentTag, value: {} },\n },\n meta: null,\n ...(pendingCid ? { multiStepCorrelationId: pendingCid } : {}),\n }\n\n return {\n label,\n children,\n transferInstruction,\n }\n }\n\n private async buildMergeSplit(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice | null\n ): Promise<ParsedKnownExercisedEvent> {\n let type: 'MergeSplit' | 'Mint' | 'Burn'\n const meta = mergeMetas(exercisedEvent)\n switch (getMetaKeyValue(TxKindMetaKey, meta)) {\n case 'burn':\n type = 'Burn'\n break\n case 'mint':\n type = 'Mint'\n break\n default:\n type = 'MergeSplit'\n }\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n const children = await this.getChildren(exercisedEvent)\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n\n const label: Label = {\n ...amountChanges,\n type,\n tokenStandardChoice,\n reason,\n meta,\n }\n\n return {\n label,\n children,\n transferInstruction: null,\n }\n }\n\n private async buildFromTransferInstructionExercise(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice\n ): Promise<ParsedKnownExercisedEvent | null> {\n const instructionCid = exercisedEvent.contractId\n const transferInstructionEvents =\n await this.getEventsForArchive(exercisedEvent)\n if (!transferInstructionEvents) {\n // This will happen when the party observes the archive but is not a stakeholder.\n // For example, for Amulet, a validator will see a TransferInstruction_Reject/Withdraw\n // but will not see the create of a TransferInstruction.\n return null\n }\n const transferInstructionView = ensureInterfaceViewIsPresent(\n transferInstructionEvents.created.createdEvent,\n TRANSFER_INSTRUCTION_INTERFACE_ID\n ).viewValue as TransferInstructionView\n\n const multiStepCorrelationId = getCorrelationIdFromTransferInstruction(\n instructionCid,\n transferInstructionView.originalInstructionCid ?? null\n )\n\n const resultTag =\n (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string } }\n | undefined\n )?.output?.tag || undefined\n\n const currentTag = currentStatusFromChoiceOrResult(\n exercisedEvent.choice,\n resultTag\n )\n\n const transferInstruction: TransferInstructionView = {\n originalInstructionCid:\n transferInstructionView.originalInstructionCid,\n multiStepCorrelationId,\n transfer: transferInstructionView.transfer,\n meta: transferInstructionView.meta,\n status: {\n before: transferInstructionView.status,\n current: { tag: currentTag, value: {} },\n },\n }\n\n const exerciseResultOutputTag = resultTag\n let result: ParsedKnownExercisedEvent | null = null\n\n switch (exerciseResultOutputTag) {\n case 'TransferInstructionResult_Failed':\n case 'TransferInstructionResult_Pending':\n result = await this.buildMergeSplit(\n exercisedEvent,\n tokenStandardChoice\n )\n break\n case 'TransferInstructionResult_Completed':\n result = await this.buildTransfer(\n exercisedEvent,\n tokenStandardChoice,\n transferInstruction\n )\n break\n default:\n throw new Error(\n `Unknown TransferInstructionResult: ${exerciseResultOutputTag}`\n )\n }\n return (\n result && {\n ...result,\n transferInstruction,\n }\n )\n }\n\n private async buildBasic(\n exercisedEvent: ExercisedEvent,\n type: 'Unlock' | 'ExpireDust',\n tokenStandardChoice: TokenStandardChoice | null\n ): Promise<ParsedKnownExercisedEvent> {\n const children = await this.getChildren(exercisedEvent)\n const meta = mergeMetas(exercisedEvent)\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n return {\n label: {\n ...amountChanges,\n type,\n tokenStandardChoice,\n reason,\n meta,\n },\n children,\n transferInstruction: null,\n }\n }\n\n private async getChildren(\n exercisedEvent: ExercisedEvent\n ): Promise<HoldingsChange> {\n const mutatingResult: HoldingsChange = { creates: [], archives: [] }\n const childrenEventsSlice = (this.transaction.events || [])\n .map(getNodeIdAndEvent)\n .filter(\n ({ nodeId }) =>\n nodeId > exercisedEvent.nodeId &&\n nodeId <= exercisedEvent.lastDescendantNodeId\n )\n\n if (\n exercisedEvent.consuming &&\n hasInterface(HOLDING_INTERFACE_ID, exercisedEvent)\n ) {\n const selfEvent = await this.getEventsForArchive(exercisedEvent)\n if (selfEvent) {\n const holdingView = ensureInterfaceViewIsPresent(\n selfEvent.created.createdEvent,\n HOLDING_INTERFACE_ID\n ).viewValue as Holding\n mutatingResult.archives.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId: exercisedEvent.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n }\n\n for (const {\n createdEvent,\n archivedEvent,\n exercisedEvent,\n } of childrenEventsSlice) {\n if (createdEvent) {\n const interfaceView = getInterfaceView(createdEvent)\n if (\n interfaceView &&\n matchInterfaceIds(\n HOLDING_INTERFACE_ID,\n interfaceView.interfaceId\n )\n ) {\n const holdingView = interfaceView.viewValue as Holding\n mutatingResult.creates.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId: createdEvent.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n } else if (\n (archivedEvent &&\n hasInterface(HOLDING_INTERFACE_ID, archivedEvent)) ||\n (exercisedEvent &&\n exercisedEvent.consuming &&\n hasInterface(HOLDING_INTERFACE_ID, exercisedEvent))\n ) {\n const contractEvents = await this.getEventsForArchive(\n archivedEvent || exercisedEvent!\n )\n if (contractEvents) {\n const holdingView = ensureInterfaceViewIsPresent(\n contractEvents.created?.createdEvent,\n HOLDING_INTERFACE_ID\n ).viewValue as Holding\n mutatingResult.archives.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId:\n archivedEvent?.contractId ||\n exercisedEvent!.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n }\n }\n\n return {\n // remove transient contracts\n creates: mutatingResult.creates.filter(\n (create) =>\n !mutatingResult.archives.some(\n (archive) => create.contractId === archive.contractId\n )\n ),\n archives: mutatingResult.archives.filter(\n (archive) =>\n !mutatingResult.creates.some(\n (create) => create.contractId === archive.contractId\n )\n ),\n }\n }\n\n private async getEventsForArchive(\n archivedEvent: ArchivedEvent | ExercisedEvent\n ): Promise<null | Required<JsGetEventsByContractIdResponse>> {\n if (!(archivedEvent.witnessParties || []).includes(this.partyId)) {\n return null\n }\n\n const basePayload = {\n contractId: archivedEvent.contractId,\n eventFormat: EventFilterBySetup({\n interfaceIds: [\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n ],\n isMasterUser: this.isMasterUser,\n partyId: this.partyId,\n verbose: true,\n }),\n }\n\n const payload =\n this.ledgerClient.getCurrentClientVersion() === '3.3'\n ? { ...basePayload, requestingParties: [] }\n : basePayload\n\n const events = await this.ledgerClient\n .postWithRetry('/v2/events/events-by-contract-id', payload)\n .catch((err) => {\n // This will happen for holdings with consuming choices\n // where the party the script is running on is an actor on the choice\n // but not a stakeholder.\n if (err.code === 'CONTRACT_EVENTS_NOT_FOUND') {\n return null\n } else {\n throw err\n }\n })\n if (!events) {\n return null\n }\n\n const created = events.created\n const archived = events.archived\n if (!created || !archived) {\n throw new Error(\n `Archival of ${\n archivedEvent.contractId\n } does not have a corresponding create/archive event: ${JSON.stringify(\n events\n )}`\n )\n }\n return { created, archived }\n }\n}\n\ntype EventParseResult = ParseChildren | ParsedEvent\nfunction isLeafEventNode(result: EventParseResult): result is ParsedEvent {\n return !!(result as ParsedEvent).event\n}\ninterface ParsedEvent {\n event: TokenStandardEvent\n continueAfterNodeId: number\n}\ninterface ParseChildren {\n parentChoiceName: string\n lastDescendantNodeId: number\n}\n\ninterface ParsedKnownExercisedEvent {\n label: Label\n children: HoldingsChange\n transferInstruction: TransferInstructionView | null\n}\n\n// a naive implementation like event.X?.nodeId || event.Y?.nodeId || event.Z?.nodeId fails when nodeId=0\ninterface NodeIdAndEvent {\n nodeId: number\n exercisedEvent?: ExercisedEvent\n archivedEvent?: ArchivedEvent | ExercisedEvent\n createdEvent?: CreatedEvent\n}\nfunction getNodeIdAndEvent(event: Event): NodeIdAndEvent {\n if ('ExercisedEvent' in event) {\n // ledger API's TRANSACTION_SHAPE_LEDGER_EFFECTS does not include ArchivedEvent, instead has the choice as Archive\n if (event.ExercisedEvent.choice === 'Archive') {\n return {\n nodeId: event.ExercisedEvent.nodeId,\n archivedEvent: event.ExercisedEvent,\n }\n } else {\n return {\n nodeId: event.ExercisedEvent.nodeId,\n exercisedEvent: event.ExercisedEvent,\n }\n }\n } else if ('CreatedEvent' in event) {\n return {\n nodeId: event.CreatedEvent.nodeId,\n createdEvent: event.CreatedEvent,\n }\n } else if ('ArchivedEvent' in event) {\n return {\n nodeId: event.ArchivedEvent.nodeId,\n archivedEvent: event.ArchivedEvent,\n }\n } else {\n throw new Error(`Impossible event type: ${event}`)\n }\n}\n\n/** sumHoldingsChange sums all the changes over a number of holdings.\n * Note that this function currently assumes all holdings use the same\n * instrument. */\nfunction sumHoldingsChange(\n change: HoldingsChange,\n filter: (owner: string, lock: HoldingLock | null) => boolean\n): BigNumber {\n return sumHoldings(\n change.creates.filter((create) => filter(create.owner, create.lock))\n ).minus(\n sumHoldings(\n change.archives.filter((archive) =>\n filter(archive.owner, archive.lock)\n )\n )\n )\n}\n\nfunction sumHoldings(holdings: Holding[]): BigNumber {\n if (holdings.length > 0) {\n // Sanity check.\n const instrumentId = holdings[0].instrumentId\n for (const holding of holdings) {\n if (\n holding.instrumentId.admin !== instrumentId.admin ||\n holding.instrumentId.id !== instrumentId.id\n ) {\n throw new Error(\n `Attempted to call sumHoldings on heterogeneous instruments: ${JSON.stringify(instrumentId)} != ${JSON.stringify(holding.instrumentId)}`\n )\n }\n }\n }\n return BigNumber.sum(\n ...holdings.map((h) => h.amount).concat(['0']) // avoid NaN\n )\n}\n\nfunction computeAmountChanges(\n children: HoldingsChange,\n meta: any,\n partyId: string\n) {\n const burnAmount = BigNumber(getMetaKeyValue(BurnedMetaKey, meta) || '0')\n const partyHoldingAmountChange = sumHoldingsChange(\n children,\n (owner) => owner === partyId\n )\n const otherPartiesHoldingAmountChange = sumHoldingsChange(\n children,\n (owner) => owner !== partyId\n )\n const mintAmount = partyHoldingAmountChange\n .plus(burnAmount)\n .plus(otherPartiesHoldingAmountChange)\n return {\n burnAmount: burnAmount.toString(),\n mintAmount: mintAmount.toString(),\n }\n}\n\nfunction computeSummary(\n instrumentId: { admin: string; id: string },\n changes: HoldingsChange,\n partyId: string\n): HoldingsChangeSummary {\n const amountChange = sumHoldingsChange(\n changes,\n (owner) => owner === partyId\n )\n const outputAmount = sumHoldings(changes.creates)\n const inputAmount = sumHoldings(changes.archives)\n return {\n instrumentId,\n amountChange: amountChange.toString(),\n numOutputs: changes.creates.length,\n outputAmount: outputAmount.toString(),\n numInputs: changes.archives.length,\n inputAmount: inputAmount.toString(),\n }\n}\n\nfunction holdingsChangeByInstrument(\n changes: HoldingsChange\n): InstrumentMap<HoldingsChange> {\n const map = new InstrumentMap<{ creates: Holding[]; archives: Holding[] }>()\n for (const create of changes.creates) {\n if (map.has(create.instrumentId)) {\n map.get(create.instrumentId)!.creates.push(create)\n } else {\n map.set(create.instrumentId, { creates: [create], archives: [] })\n }\n }\n for (const archive of changes.archives) {\n if (map.has(archive.instrumentId)) {\n map.get(archive.instrumentId)!.archives.push(archive)\n } else {\n map.set(archive.instrumentId, { creates: [], archives: [archive] })\n }\n }\n return map\n}\n\nfunction computeSummaries(\n changes: HoldingsChange,\n partyId: string\n): HoldingsChangeSummary[] {\n const byInstrument = holdingsChangeByInstrument(changes)\n return [...byInstrument.entries()].map(([instrumentId, change]) =>\n computeSummary(instrumentId, change, partyId)\n )\n}\n\nfunction holdingChangesNonEmpty(event: TokenStandardEvent): boolean {\n return (\n event.unlockedHoldingsChange.creates.length > 0 ||\n event.unlockedHoldingsChange.archives.length > 0 ||\n event.lockedHoldingsChange.creates.length > 0 ||\n event.lockedHoldingsChange.archives.length > 0\n )\n}\n\nconst emptyHoldingsChangeSummary: HoldingsChangeSummary = {\n // This is obviously incorrect, but the field was introduced at the same\n // time at which we introduced the more correct per-instrument summaries,\n // so we know that old code couldn't use this (broken) field, and new code\n // should use the correct summaries.\n instrumentId: { admin: '', id: '' },\n numInputs: 0,\n numOutputs: 0,\n inputAmount: '0',\n outputAmount: '0',\n amountChange: '0',\n}\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/types.ts","../src/instrumentmap.ts","../src/parser.ts"],"names":["HOLDING_INTERFACE_ID","TRANSFER_INSTRUCTION_INTERFACE_ID","exercisedEvent"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n TRANSFER_FACTORY_INTERFACE_ID,\n ALLOCATION_FACTORY_INTERFACE_ID,\n ALLOCATION_INSTRUCTION_INTERFACE_ID,\n HOLDING_INTERFACE_ID,\n ALLOCATION_INTERFACE_ID,\n ALLOCATION_REQUEST_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\nexport interface InterfaceIdParts {\n packageName: string\n moduleName: string\n entityName: string\n}\n\nexport function splitInterfaceId(interfaceId: string): InterfaceIdParts | null {\n // Captures 3 groups: pkg, module and entity\n // Note that prefix # is optional in regexp below,\n // format without # is deprecated, but supported in canton 3.3 and will be removed in canton 3.4\n // https://docs.digitalasset.com/build/3.3/reference/lapi-migration-guide.html#identifier-addressing-by-package-name\n const regExp = /^#?([^:]+):([^:]+):([^:]+)$/\n const match = regExp.exec(interfaceId)\n if (!match) return null\n const [, packageName, moduleName, entityName] = match // [0]=full, [1]=pkg, [2]=module, [3]=entity\n return {\n packageName,\n moduleName,\n entityName,\n }\n}\n\nexport function matchInterfaceIds(a: string, b: string): boolean {\n const aParts = splitInterfaceId(a)\n const bParts = splitInterfaceId(b)\n\n return (\n aParts !== null &&\n bParts !== null &&\n aParts.moduleName === bParts.moduleName &&\n aParts.entityName === bParts.entityName\n )\n}\n\nexport const TokenStandardTransactionInterfaces = [\n HOLDING_INTERFACE_ID,\n TRANSFER_FACTORY_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n ALLOCATION_FACTORY_INTERFACE_ID,\n ALLOCATION_INSTRUCTION_INTERFACE_ID,\n ALLOCATION_INTERFACE_ID,\n ALLOCATION_REQUEST_INTERFACE_ID,\n]\n\nconst SpliceMetaKeyPrefix = 'splice.lfdecentralizedtrust.org/'\nexport const TxKindMetaKey = `${SpliceMetaKeyPrefix}tx-kind`\nexport const SenderMetaKey = `${SpliceMetaKeyPrefix}sender`\nexport const ReasonMetaKey = `${SpliceMetaKeyPrefix}reason`\nexport const BurnedMetaKey = `${SpliceMetaKeyPrefix}burned`\nexport const AllKnownMetaKeys = [\n TxKindMetaKey,\n SenderMetaKey,\n ReasonMetaKey,\n BurnedMetaKey,\n]\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { AllKnownMetaKeys, matchInterfaceIds } from './constants.js'\n\nimport { Holding, TransferInstructionView } from './types.js'\nimport {\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\n\nimport { v3_3, v3_4 } from '@canton-network/core-ledger-client-types'\n\ntype ArchivedEvent =\n | v3_3.components['schemas']['ArchivedEvent']\n | v3_4.components['schemas']['ArchivedEvent']\ntype CreatedEvent =\n | v3_3.components['schemas']['CreatedEvent']\n | v3_4.components['schemas']['CreatedEvent']\ntype ExercisedEvent =\n | v3_3.components['schemas']['ExercisedEvent']\n | v3_4.components['schemas']['ExercisedEvent']\ntype JsInterfaceView =\n | v3_3.components['schemas']['JsInterfaceView']\n | v3_4.components['schemas']['JsInterfaceView']\n\nexport function hasInterface(\n interfaceId: string,\n event: ExercisedEvent | ArchivedEvent\n): boolean {\n return (event.implementedInterfaces || []).some((id) =>\n matchInterfaceIds(id, interfaceId)\n )\n}\n\nexport function getInterfaceView(\n createdEvent: CreatedEvent\n): JsInterfaceView | null {\n const interfaceViews = createdEvent.interfaceViews || null\n return (interfaceViews && interfaceViews[0]) || null\n}\n\nexport type KnownInterfaceView =\n | { type: 'Holding'; viewValue: Holding }\n | { type: 'TransferInstruction'; viewValue: TransferInstructionView }\n\nexport function getKnownInterfaceView(\n createdEvent: CreatedEvent\n): KnownInterfaceView | null {\n const interfaceView = getInterfaceView(createdEvent)\n if (!interfaceView) {\n return null\n } else if (\n matchInterfaceIds(HOLDING_INTERFACE_ID, interfaceView.interfaceId)\n ) {\n return {\n type: 'Holding',\n viewValue: interfaceView.viewValue as Holding,\n }\n } else if (\n matchInterfaceIds(\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n interfaceView.interfaceId\n )\n ) {\n return {\n type: 'TransferInstruction',\n viewValue: interfaceView.viewValue as TransferInstructionView,\n }\n } else {\n return null\n }\n}\n\n// TODO (#563): handle allocations in such a way that any callers have to handle them too\n/**\n * Use this when `createdEvent` is guaranteed to have an interface view because the ledger api filters\n * include it, and thus is guaranteed to be returned by the API.\n */\nexport function ensureInterfaceViewIsPresent(\n createdEvent: CreatedEvent,\n interfaceId: string\n): JsInterfaceView {\n const interfaceView = getInterfaceView(createdEvent)\n if (!interfaceView) {\n throw new Error(\n `Expected to have interface views, but didn't: ${JSON.stringify(\n createdEvent\n )}`\n )\n }\n if (!matchInterfaceIds(interfaceId, interfaceView.interfaceId)) {\n throw new Error(\n `Not a ${interfaceId} but a ${\n interfaceView.interfaceId\n }: ${JSON.stringify(createdEvent)}`\n )\n }\n return interfaceView\n}\n\ntype Meta = { values: { [key: string]: string } } | undefined\n\nexport function mergeMetas(event: ExercisedEvent, extra?: Meta): Meta {\n // Add a type assertion to help TypeScript understand the shape of choiceArgument\n const choiceArgument = event.choiceArgument as\n | {\n transfer?: { meta?: Meta }\n extraArgs?: { meta?: Meta }\n meta?: Meta\n }\n | undefined\n\n const lastWriteWins = [\n choiceArgument?.transfer?.meta,\n choiceArgument?.extraArgs?.meta,\n choiceArgument?.meta,\n extra,\n (event.exerciseResult as { meta?: Meta } | undefined)?.meta,\n ]\n const result: { [key: string]: string } = {}\n lastWriteWins.forEach((meta) => {\n const values: { [key: string]: string } = meta?.values || {}\n Object.entries(values).forEach(([k, v]) => {\n result[k] = v\n })\n })\n if (Object.keys(result).length === 0) {\n return undefined\n }\n // order of keys doesn't matter, but we return it consistent for test purposes (and it's nicer)\n else {\n return { values: result }\n }\n}\n\nexport function getMetaKeyValue(key: string, meta: Meta): string | null {\n return (meta?.values || {})[key] || null\n}\n\n/**\n * From the view of making it easy to build the display for the wallet,\n * we remove all metadata fields that were fully parsed, and whose content is reflected in the TypeScript structure.\n * Otherwise, the display code has to do so, overloading the user with superfluous metadata entries.\n */\nexport function removeParsedMetaKeys(meta: Meta): Meta {\n return {\n values: Object.fromEntries(\n Object.entries(meta?.values || {}).filter(\n ([k]) => !AllKnownMetaKeys.includes(k)\n )\n ),\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Metadata } from '@canton-network/core-token-standard'\nimport { v3_3, v3_4 } from '@canton-network/core-ledger-client-types'\n\nexport type ViewValue =\n | v3_3.components['schemas']['JsInterfaceView']['viewValue']\n | v3_4.components['schemas']['JsInterfaceView']['viewValue'] // unknown | undefined\nexport type JsActiveContract =\n | v3_3.components['schemas']['JsActiveContract']\n | v3_4.components['schemas']['JsActiveContract']\nexport interface Transaction {\n updateId: string\n offset: number\n recordTime: string\n synchronizerId: string\n events: TokenStandardEvent[]\n}\n\nexport interface TransferObject {\n amount: string\n executeBefore: string\n inputHoldingCids: string[]\n instrumentId: { admin: string; id: string }\n meta: Metadata\n receiver: string\n requestedAt: string\n sender: string\n}\n\nexport interface TokenStandardEvent {\n label: Label\n lockedHoldingsChange: HoldingsChange\n /** lockedHoldingsChangeSummaries contains one summary per instrument. */\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n /** @deprecated lockedHoldingsChangeSummary is incorrect in a\n * multi-instrument world. It will be removed in a future release, please\n * use unlockedHoldingsChangeSummaries instead. */\n lockedHoldingsChangeSummary: HoldingsChangeSummary\n unlockedHoldingsChange: HoldingsChange\n /** unlockedHoldingsChangeSummary contains one summary per instrument. */\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n /** @deprecated unlockedHoldingsChangeSummary is incorrect in a\n * multi-instrument world. It will be removed in a future release, please\n * use unlockedHoldingsChangeSummaries instead. */\n unlockedHoldingsChangeSummary: HoldingsChangeSummary\n transferInstruction: TransferInstructionView | null\n}\n\n// Same definition as HoldingView in Daml\nexport interface Holding {\n contractId: string\n owner: string\n instrumentId: { admin: string; id: string }\n amount: string\n lock: HoldingLock | null\n meta: any\n}\n\nexport interface HoldingLock {\n holders: string[]\n expiresAt?: string\n expiresAfter?: string\n context?: string\n}\n\nexport interface HoldingsChange {\n creates: Holding[]\n archives: Holding[]\n}\n\nexport interface HoldingsChangeSummary {\n instrumentId: { admin: string; id: string }\n numInputs: number\n inputAmount: string\n numOutputs: number\n outputAmount: string\n amountChange: string\n}\n\n/**\n * Same as TransferInstructionView in Daml when exercising a TransferInstruction choice,\n * otherwise just meta and transfer.\n */\n// TODO investigate because it actually differs from TransferInstructionView from daml codegen\n// where status is: { tag, value }\nexport interface TransferInstructionView {\n // currentInstructionCid: string // TODO (#505): add\n originalInstructionCid: string | null\n transfer?: any\n status: {\n before: any\n current: { tag: TransferInstructionCurrentTag; value: unknown } | null\n }\n meta: Metadata | null\n // Stable id to track one TransferInstruction lifecycle across updates, inspired by Java parser\n multiStepCorrelationId?: string\n}\n\nexport type TransferInstructionCurrentTag =\n | 'Pending'\n | 'Completed'\n | 'Rejected'\n | 'Withdrawn'\n | 'Failed'\n\nexport type Label =\n | TransferOut\n | TransferIn\n | MergeSplit\n | Burn\n | Mint\n | Unlock\n | Lock\n | ExpireDust\n | UnknownAction\ntype UnknownAction = RawArchive | RawCreate\ninterface BaseLabel {\n type: string\n meta: any\n}\ninterface KnownLabel extends BaseLabel {\n mintAmount: string\n burnAmount: string\n reason: string | null\n tokenStandardChoice: TokenStandardChoice | null\n}\nexport interface TokenStandardChoice {\n name: string\n choiceArgument: any\n exerciseResult: any\n}\n\nexport interface TransferOut extends KnownLabel {\n type: 'TransferOut'\n receiverAmounts: Array<{ receiver: string; amount: string }>\n}\n\nexport interface TransferIn extends KnownLabel {\n type: 'TransferIn'\n sender: string\n}\n\nexport interface MergeSplit extends KnownLabel {\n type: 'MergeSplit'\n}\n\n// Same as MergeSplit, but is more precise (tx-kind=burn)\nexport interface Burn extends KnownLabel {\n type: 'Burn'\n}\n\n// Same as MergeSplit, but is more precise (tx-kind=mint)\nexport interface Mint extends KnownLabel {\n type: 'Mint'\n}\n\nexport interface Unlock extends KnownLabel {\n type: 'Unlock'\n}\n\nexport interface Lock extends KnownLabel {\n type: 'Lock'\n}\n\nexport interface ExpireDust extends KnownLabel {\n type: 'ExpireDust'\n}\n\nexport interface RawArchive extends BaseLabel {\n type: 'Archive'\n parentChoice: string\n contractId: string\n offset: number\n templateId: string\n packageName: string\n actingParties: string[]\n payload: any\n meta: any\n}\nexport interface RawCreate extends BaseLabel {\n type: 'Create' | 'Lock'\n parentChoice: string\n contractId: string\n offset: number\n templateId: string\n payload: any\n packageName: string\n meta: any\n}\n\nexport const renderTransaction = (t: Transaction): any => {\n return { ...t, events: t.events.map(renderTransactionEvent) }\n}\n\nconst renderTransactionEvent = (e: TokenStandardEvent): any => {\n const lockedHoldingsChangeSummaries = e.lockedHoldingsChangeSummaries\n .map(renderHoldingsChangeSummary)\n .filter((s) => s !== null)\n\n const unlockedHoldingsChangeSummaries = e.unlockedHoldingsChangeSummaries\n .map(renderHoldingsChangeSummary)\n .filter((s) => s !== null)\n\n const lockedHoldingsChange = renderHoldingsChange(e.lockedHoldingsChange)\n const unlockedHoldingsChange = renderHoldingsChange(\n e.unlockedHoldingsChange\n )\n return {\n ...e,\n lockedHoldingsChange,\n unlockedHoldingsChange,\n lockedHoldingsChangeSummaries,\n // Deprecated\n lockedHoldingsChangeSummary: renderHoldingsChangeSummary(\n e.lockedHoldingsChangeSummary\n ),\n unlockedHoldingsChangeSummaries,\n // Deprecated\n unlockedHoldingsChangeSummary: renderHoldingsChangeSummary(\n e.unlockedHoldingsChangeSummary\n ),\n }\n}\n\nconst renderHoldingsChangeSummary = (\n s: HoldingsChangeSummary\n): Partial<HoldingsChangeSummary> | null => {\n if (\n s.numInputs === 0 &&\n s.numOutputs === 0 &&\n s.inputAmount === '0' &&\n s.outputAmount === '0' &&\n s.amountChange === '0'\n ) {\n return null\n }\n return {\n ...((s.instrumentId.admin !== '' || s.instrumentId.id !== '') && {\n instrumentId: s.instrumentId,\n }),\n ...(s.numInputs !== 0 && { numInputs: s.numInputs }),\n ...(s.inputAmount !== '0' && { inputAmount: s.inputAmount }),\n ...(s.numOutputs !== 0 && { numOutputs: s.numOutputs }),\n ...(s.outputAmount !== '0' && { outputAmount: s.outputAmount }),\n ...(s.amountChange !== '0' && { amountChange: s.amountChange }),\n }\n}\n\nconst renderHoldingsChange = (\n c: HoldingsChange\n): Partial<HoldingsChange> | null => {\n if (c.creates.length === 0 && c.archives.length === 0) {\n return null\n }\n return {\n ...(c.creates.length !== 0 && { creates: c.creates }),\n ...(c.archives.length !== 0 && { archives: c.archives }),\n }\n}\n\nexport interface PrettyTransactions {\n transactions: Transaction[]\n nextOffset: number\n}\n\nexport interface PrettyContract<T = ViewValue> {\n contractId: string\n interfaceViewValue: T\n activeContract: JsActiveContract\n fetchedAtOffset?: number | undefined\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\ntype InstrumentKey = { admin: string; id: string }\n\n/** InstrumentMap is a helper for when you want to group values by instrument. */\nexport class InstrumentMap<V> {\n private readonly map\n\n private encodeKey(instrumentId: InstrumentKey): string {\n return JSON.stringify([instrumentId.admin, instrumentId.id])\n }\n\n private decodeKey(key: string): InstrumentKey {\n const [admin, id] = JSON.parse(key)\n return { admin, id }\n }\n\n constructor() {\n this.map = new Map<string, V>()\n }\n\n set(key: InstrumentKey, value: V): void {\n this.map.set(this.encodeKey(key), value)\n }\n\n get(key: InstrumentKey): V | undefined {\n return this.map.get(this.encodeKey(key))\n }\n\n has(key: InstrumentKey): boolean {\n return this.map.has(this.encodeKey(key))\n }\n\n delete(key: InstrumentKey): boolean {\n return this.map.delete(this.encodeKey(key))\n }\n\n *entries(): IterableIterator<[InstrumentKey, V]> {\n for (const [key, value] of this.map.entries()) {\n yield [this.decodeKey(key), value]\n }\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ensureInterfaceViewIsPresent,\n getInterfaceView,\n getKnownInterfaceView,\n getMetaKeyValue,\n hasInterface,\n mergeMetas,\n removeParsedMetaKeys,\n} from './utils.js'\nimport {\n BurnedMetaKey,\n matchInterfaceIds,\n ReasonMetaKey,\n SenderMetaKey,\n TxKindMetaKey,\n} from './constants.js'\nimport {\n Holding,\n HoldingsChangeSummary,\n HoldingLock,\n HoldingsChange,\n Label,\n TokenStandardEvent,\n Transaction,\n TokenStandardChoice,\n TransferInstructionView,\n TransferInstructionCurrentTag,\n TransferObject,\n} from './types.js'\nimport { InstrumentMap } from './instrumentmap.js'\n\nimport {\n v3_3,\n EventFilterBySetup,\n v3_4,\n} from '@canton-network/core-ledger-client-types'\nimport BigNumber from 'bignumber.js'\nimport { PartyId } from '@canton-network/core-types'\nimport {\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n} from '@canton-network/core-token-standard'\n\nimport { LedgerProvider, Ops } from '@canton-network/core-provider-ledger'\n\ntype ArchivedEvent =\n | v3_3.components['schemas']['ArchivedEvent']\n | v3_4.components['schemas']['ArchivedEvent']\ntype CreatedEvent =\n | v3_3.components['schemas']['CreatedEvent']\n | v3_4.components['schemas']['CreatedEvent']\ntype ExercisedEvent =\n | v3_3.components['schemas']['ExercisedEvent']\n | v3_4.components['schemas']['ExercisedEvent']\ntype Event =\n | v3_3.components['schemas']['Event']\n | v3_4.components['schemas']['Event']\ntype JsTransaction =\n | v3_3.components['schemas']['JsTransaction']\n | v3_4.components['schemas']['JsTransaction']\ntype JsGetEventsByContractIdResponse =\n | v3_3.components['schemas']['JsGetEventsByContractIdResponse']\n | v3_4.components['schemas']['JsGetEventsByContractIdResponse']\n\nfunction currentStatusFromChoiceOrResult(\n choice?: string | undefined,\n resultTag?: string | undefined\n): TransferInstructionCurrentTag {\n // If the result explicitly says Failed/Completed, prefer it.\n if (resultTag === 'TransferInstructionResult_Failed') return 'Failed'\n if (resultTag === 'TransferInstructionResult_Completed') return 'Completed'\n\n switch (choice) {\n case 'TransferInstruction_Reject':\n return 'Rejected'\n case 'TransferInstruction_Withdraw':\n return 'Withdrawn'\n case 'TransferInstruction_Accept':\n case 'TransferInstruction_Update':\n // When result tag wasn't Completed/Failed above, fall back to Pending\n return 'Pending'\n default:\n // When resultTag is Pending or unknown\n return 'Pending'\n }\n}\n\n// -For TransferInstruction Create use originalInstructionCid if present, otherwise this TransferInstruction's cid\n// -For TransferInstruction Exercise: use the exercised TransferInstruction cid, which equals the earlier Pending transferInstruction's cid.\n// This lets us correlate Pending to Accept/Reject/Withdraw across updates.\nfunction getCorrelationIdFromTransferInstruction(\n currentInstructionCid: string,\n originalInstructionCid?: string | null\n): string {\n return originalInstructionCid ?? currentInstructionCid\n}\n\n// If the exercise produced a Pending TI, return its newly created transferInstructionCid\n// Otherwise (Completed/Failed/Rejected/Withdrawn), there is no pending TransferInstruction to correlate\nfunction getPendingTransferInstructionCid(\n exercisedEvent: ExercisedEvent\n): string | undefined {\n const output = (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string; value?: any } }\n | undefined\n )?.output\n if (output?.tag !== 'TransferInstructionResult_Pending') return undefined\n\n const cid = output.value?.transferInstructionCid\n return cid ?? undefined\n}\n\nfunction isTransferObject(value: unknown): value is TransferObject {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n const instrumentId = v.instrumentId as Record<string, unknown> | undefined\n const meta = v.meta as Record<string, unknown> | undefined\n return (\n typeof v.sender === 'string' &&\n typeof v.receiver === 'string' &&\n typeof v.amount === 'string' &&\n typeof v.requestedAt === 'string' &&\n typeof v.executeBefore === 'string' &&\n Array.isArray(v.inputHoldingCids) &&\n v.inputHoldingCids.every((cid) => typeof cid === 'string') &&\n !!instrumentId &&\n typeof instrumentId.admin === 'string' &&\n typeof instrumentId.id === 'string' &&\n !!meta &&\n typeof meta.values === 'object' &&\n meta.values !== null\n )\n}\n\nexport class TransactionParser {\n private readonly ledgerProvider: LedgerProvider\n private readonly partyId: PartyId\n private readonly transaction: JsTransaction\n private readonly isMasterUser: boolean\n\n constructor(\n ledgerProvider: LedgerProvider,\n transaction: JsTransaction,\n\n partyId: PartyId,\n isMasterUser: boolean\n ) {\n this.ledgerProvider = ledgerProvider\n this.partyId = partyId\n this.transaction = transaction\n this.isMasterUser = isMasterUser\n }\n\n async parseTransaction(): Promise<Transaction> {\n const tx = this.transaction\n const events = await this.parseEvents([...(tx.events || [])].reverse())\n return {\n updateId: tx.updateId,\n offset: tx.offset,\n recordTime: tx.recordTime,\n synchronizerId: tx.synchronizerId,\n events,\n }\n }\n\n async parseTransferObjects(): Promise<TransferObject[]> {\n const eventsStack = [...(this.transaction.events || [])].reverse()\n const results = await this.fetchTransferObjectChoice(eventsStack)\n return results\n }\n\n private async fetchTransferObjectChoice(\n eventsStack: Event[]\n ): Promise<TransferObject[]> {\n const result: TransferObject[] = []\n while (eventsStack.length > 0) {\n const currentEvent = eventsStack.pop()!\n const { exercisedEvent } = getNodeIdAndEvent(currentEvent)\n if (\n exercisedEvent &&\n (exercisedEvent.choice === 'TransferFactory_Transfer' ||\n exercisedEvent.choice === 'TransferRule_Transfer')\n ) {\n const { choiceArgument } = exercisedEvent\n if (\n choiceArgument &&\n typeof choiceArgument === 'object' &&\n 'transfer' in choiceArgument\n ) {\n const transfer = (choiceArgument as Record<string, unknown>)\n .transfer\n if (isTransferObject(transfer)) {\n result.push(transfer)\n }\n }\n }\n }\n return result\n }\n\n private async parseEvents(\n eventsStack: Event[]\n ): Promise<TokenStandardEvent[]> {\n let callStack: Array<{\n parentChoiceName: string\n untilNodeId: number\n }> = []\n let continueAfterNodeId = -1\n const result: TokenStandardEvent[] = []\n while (eventsStack.length > 0) {\n const currentEvent = eventsStack.pop()!\n\n const { nodeId, createdEvent, archivedEvent, exercisedEvent } =\n getNodeIdAndEvent(currentEvent)\n callStack = callStack.filter((s) => s.untilNodeId <= nodeId)\n const parentChoice =\n (callStack[callStack.length - 1] &&\n callStack[callStack.length - 1].parentChoiceName) ||\n 'none (root node)'\n\n let parsed: EventParseResult | null\n if (nodeId <= continueAfterNodeId) {\n parsed = null\n } else if (createdEvent) {\n parsed = this.parseRawCreate(createdEvent, parentChoice)\n } else if (archivedEvent) {\n parsed = await this.parseRawArchive(archivedEvent, parentChoice)\n } else if (exercisedEvent) {\n parsed = await this.parseExercise(exercisedEvent)\n } else {\n throw new Error(\n `Impossible event: ${JSON.stringify(currentEvent)}`\n )\n }\n if (parsed && isLeafEventNode(parsed)) {\n // Exclude events where nothing happened\n if (holdingChangesNonEmpty(parsed.event)) {\n result.push({\n ...parsed.event,\n label: {\n ...parsed.event.label,\n meta: removeParsedMetaKeys(parsed.event.label.meta),\n },\n })\n }\n continueAfterNodeId = parsed.continueAfterNodeId\n } else if (parsed) {\n callStack.push({\n parentChoiceName: parsed.parentChoiceName,\n untilNodeId: parsed.lastDescendantNodeId,\n })\n }\n }\n return result\n }\n\n private parseRawCreate(\n create: CreatedEvent,\n parentChoice: string\n ): EventParseResult | null {\n return this.buildRawEvent(create, create.nodeId, (result) => {\n return {\n // TODO: this code currently only looks at the first instrument\n // to determine the type of the Event.\n type:\n Number(\n result.lockedHoldingsChangeSummaries[0]?.amountChange\n ) > 0\n ? 'Lock'\n : 'Create',\n parentChoice,\n contractId: create.contractId,\n offset: create.offset,\n templateId: create.templateId,\n payload: result.payload,\n packageName: create.packageName,\n meta: undefined,\n }\n })\n }\n\n private async parseRawArchive(\n archive: ArchivedEvent,\n parentChoice: string\n ): Promise<EventParseResult | null> {\n const events = await this.getEventsForArchive(archive)\n if (!events) {\n return null\n }\n\n return this.buildRawEvent(\n events.created.createdEvent,\n archive.nodeId,\n (result) => {\n return {\n type: 'Archive',\n parentChoice,\n contractId: archive.contractId,\n offset: archive.offset,\n templateId: archive.templateId,\n packageName: archive.packageName,\n actingParties:\n (archive as ExercisedEvent).actingParties || [],\n payload: result.payload,\n meta: undefined,\n }\n }\n )\n }\n\n private buildRawEvent(\n originalCreate: CreatedEvent,\n nodeId: number,\n buildLabel: (result: {\n payload: any\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n }) => Label\n ): EventParseResult | null {\n const view = getKnownInterfaceView(originalCreate)\n let result: {\n payload: any\n lockedHoldingsChange: HoldingsChange\n lockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n lockedHoldingsChangeSummary: HoldingsChangeSummary\n unlockedHoldingsChange: HoldingsChange\n unlockedHoldingsChangeSummaries: HoldingsChangeSummary[]\n unlockedHoldingsChangeSummary: HoldingsChangeSummary\n transferInstruction: TransferInstructionView | null\n } | null\n switch (view?.type) {\n case 'Holding': {\n const holdingView = view.viewValue\n if (this.partyId !== holdingView.owner) {\n result = null\n } else {\n const isLocked = !!holdingView.lock\n const summary: HoldingsChangeSummary = {\n instrumentId: holdingView.instrumentId,\n amountChange: holdingView.amount,\n numInputs: 0,\n inputAmount: '0',\n numOutputs: 1,\n outputAmount: holdingView.amount,\n }\n const lockedHoldingsChangeSummaries = isLocked\n ? [summary]\n : []\n const unlockedHoldingsChangeSummaries = isLocked\n ? []\n : [summary]\n result = {\n payload: holdingView,\n unlockedHoldingsChange: {\n creates: isLocked ? [] : [holdingView],\n archives: [],\n },\n lockedHoldingsChange: {\n creates: isLocked ? [holdingView] : [],\n archives: [],\n },\n lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n lockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n unlockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n transferInstruction: null,\n }\n }\n break\n }\n case 'TransferInstruction': {\n const transferInstructionView = view.viewValue\n if (\n ![\n transferInstructionView.transfer.sender,\n transferInstructionView.transfer.receiver,\n ].some((stakeholder) => stakeholder === this.partyId)\n ) {\n result = null\n } else {\n const multiStepCorrelationId =\n getCorrelationIdFromTransferInstruction(\n originalCreate.contractId,\n transferInstructionView.originalInstructionCid ??\n null\n )\n result = {\n payload: transferInstructionView,\n transferInstruction: {\n originalInstructionCid:\n transferInstructionView.originalInstructionCid,\n transfer: transferInstructionView.transfer,\n meta: transferInstructionView.meta,\n status: {\n before: transferInstructionView.status, // raw DAML pending sub-state\n current: { tag: 'Pending', value: {} }, // normalized\n },\n multiStepCorrelationId,\n },\n unlockedHoldingsChange: { creates: [], archives: [] },\n lockedHoldingsChange: { creates: [], archives: [] },\n unlockedHoldingsChangeSummaries: [],\n unlockedHoldingsChangeSummary:\n emptyHoldingsChangeSummary,\n lockedHoldingsChangeSummaries: [],\n lockedHoldingsChangeSummary: emptyHoldingsChangeSummary,\n }\n }\n break\n }\n default:\n result = null\n }\n\n return (\n result && {\n continueAfterNodeId: nodeId,\n event: {\n label: buildLabel(result),\n unlockedHoldingsChange: result.unlockedHoldingsChange,\n lockedHoldingsChange: result.lockedHoldingsChange,\n lockedHoldingsChangeSummaries:\n result.lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n result.lockedHoldingsChangeSummary,\n unlockedHoldingsChangeSummaries:\n result.unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n result.unlockedHoldingsChangeSummary,\n transferInstruction: result.transferInstruction,\n },\n }\n )\n }\n\n private async parseExercise(\n exercise: ExercisedEvent\n ): Promise<EventParseResult | null> {\n let result: ParsedKnownExercisedEvent | null = null\n const tokenStandardChoice = {\n name: exercise.choice,\n choiceArgument: exercise.choiceArgument,\n exerciseResult: exercise.exerciseResult,\n }\n switch (exercise.choice) {\n case 'TransferRule_Transfer':\n case 'TransferFactory_Transfer':\n result = await this.buildTransfer(exercise, tokenStandardChoice)\n break\n case 'TransferInstruction_Accept':\n case 'TransferInstruction_Reject':\n case 'TransferInstruction_Withdraw':\n case 'TransferInstruction_Update':\n result = await this.buildFromTransferInstructionExercise(\n exercise,\n tokenStandardChoice\n )\n break\n case 'BurnMintFactory_BurnMint':\n result = await this.buildMergeSplit(\n exercise,\n tokenStandardChoice\n )\n break\n default: {\n const meta = mergeMetas(exercise)\n const txKind = getMetaKeyValue(TxKindMetaKey, meta)\n if (txKind) {\n result = await this.parseViaTxKind(exercise, txKind)\n }\n break\n }\n }\n if (!result) {\n return {\n lastDescendantNodeId: exercise.lastDescendantNodeId,\n parentChoiceName: exercise.choice,\n }\n } else {\n // only this.partyId's holdings should be included in the response\n const lockedHoldingsChange: HoldingsChange = {\n creates: result.children.creates.filter(\n (h) => !!h.lock && h.owner === this.partyId\n ),\n archives: result.children.archives.filter(\n (h) => !!h.lock && h.owner === this.partyId\n ),\n }\n const unlockedHoldingsChange: HoldingsChange = {\n creates: result.children.creates.filter(\n (h) => !h.lock && h.owner === this.partyId\n ),\n archives: result.children.archives.filter(\n (h) => !h.lock && h.owner === this.partyId\n ),\n }\n const lockedHoldingsChangeSummaries = computeSummaries(\n lockedHoldingsChange,\n this.partyId\n )\n const unlockedHoldingsChangeSummaries = computeSummaries(\n unlockedHoldingsChange,\n this.partyId\n )\n return {\n event: {\n label: result.label,\n lockedHoldingsChange,\n lockedHoldingsChangeSummaries,\n lockedHoldingsChangeSummary:\n lockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n unlockedHoldingsChange,\n unlockedHoldingsChangeSummaries,\n unlockedHoldingsChangeSummary:\n unlockedHoldingsChangeSummaries[0] ??\n emptyHoldingsChangeSummary,\n transferInstruction: result.transferInstruction,\n },\n continueAfterNodeId: exercise.lastDescendantNodeId,\n }\n }\n }\n\n private async parseViaTxKind(\n exercisedEvent: ExercisedEvent,\n txKind: string\n ): Promise<ParsedKnownExercisedEvent | null> {\n switch (txKind) {\n case 'transfer':\n return await this.buildTransfer(exercisedEvent, null)\n case 'merge-split':\n case 'burn':\n case 'mint':\n return await this.buildMergeSplit(exercisedEvent, null)\n case 'unlock':\n return await this.buildBasic(exercisedEvent, 'Unlock', null)\n case 'expire-dust':\n return await this.buildBasic(exercisedEvent, 'ExpireDust', null)\n default:\n throw new Error(\n `Unknown tx-kind '${txKind}' in ${JSON.stringify(exercisedEvent)}`\n )\n }\n }\n\n private async buildTransfer(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice | null,\n transferInstructions?: TransferInstructionView\n ): Promise<ParsedKnownExercisedEvent | null> {\n const meta = mergeMetas(\n exercisedEvent,\n transferInstructions?.transfer?.meta\n )\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n const choiceArgumentTransfer = (\n exercisedEvent.choiceArgument as {\n transfer?: any\n }\n ).transfer\n\n const sender: string =\n transferInstructions?.transfer?.sender ||\n getMetaKeyValue(SenderMetaKey, meta) ||\n choiceArgumentTransfer.sender\n if (!sender) {\n console.error(\n `Malformed transfer didn't contain sender. Will instead attempt to parse the children.\n Transfer: ${JSON.stringify(exercisedEvent)}`\n )\n return null\n }\n\n const resultTag =\n (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string } }\n | undefined\n )?.output?.tag || undefined\n const pendingCid = getPendingTransferInstructionCid(exercisedEvent)\n const currentTag = currentStatusFromChoiceOrResult(\n exercisedEvent.choice,\n resultTag\n )\n\n const children = await this.getChildren(exercisedEvent)\n const receiverAmounts = new Map<string, BigNumber>()\n children.creates\n .filter((h) => h.owner !== sender)\n .forEach((holding) =>\n receiverAmounts.set(\n holding.owner,\n (receiverAmounts.get(holding.owner) || BigNumber('0')).plus(\n BigNumber(holding.amount)\n )\n )\n )\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n\n let label: Label\n if (receiverAmounts.size === 0) {\n label = {\n ...amountChanges,\n type: 'MergeSplit',\n tokenStandardChoice,\n reason,\n meta,\n }\n } else if (sender === this.partyId) {\n label = {\n ...amountChanges,\n type: 'TransferOut',\n receiverAmounts: [...receiverAmounts].map(([k, v]) => {\n return { receiver: k, amount: v.toString() }\n }),\n tokenStandardChoice,\n reason,\n meta,\n }\n } else {\n label = {\n type: 'TransferIn',\n // for Transfers, the burn/mint is always 0 for the receiving party (i.e., 0 for TransferIn)\n burnAmount: '0',\n mintAmount: '0',\n sender,\n tokenStandardChoice,\n reason,\n meta,\n }\n }\n\n if (transferInstructions) {\n transferInstructions.status.current = transferInstructions.status\n .current || { tag: currentTag, value: {} }\n return {\n label,\n children,\n transferInstruction: transferInstructions,\n }\n }\n\n const transferInstruction: TransferInstructionView = {\n originalInstructionCid: null,\n ...(choiceArgumentTransfer !== undefined && {\n transfer: choiceArgumentTransfer,\n }),\n status: {\n before: null,\n current: { tag: currentTag, value: {} },\n },\n meta: null,\n ...(pendingCid ? { multiStepCorrelationId: pendingCid } : {}),\n }\n\n return {\n label,\n children,\n transferInstruction,\n }\n }\n\n private async buildMergeSplit(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice | null\n ): Promise<ParsedKnownExercisedEvent> {\n let type: 'MergeSplit' | 'Mint' | 'Burn'\n const meta = mergeMetas(exercisedEvent)\n switch (getMetaKeyValue(TxKindMetaKey, meta)) {\n case 'burn':\n type = 'Burn'\n break\n case 'mint':\n type = 'Mint'\n break\n default:\n type = 'MergeSplit'\n }\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n const children = await this.getChildren(exercisedEvent)\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n\n const label: Label = {\n ...amountChanges,\n type,\n tokenStandardChoice,\n reason,\n meta,\n }\n\n return {\n label,\n children,\n transferInstruction: null,\n }\n }\n\n private async buildFromTransferInstructionExercise(\n exercisedEvent: ExercisedEvent,\n tokenStandardChoice: TokenStandardChoice\n ): Promise<ParsedKnownExercisedEvent | null> {\n const instructionCid = exercisedEvent.contractId\n const transferInstructionEvents =\n await this.getEventsForArchive(exercisedEvent)\n if (!transferInstructionEvents) {\n // This will happen when the party observes the archive but is not a stakeholder.\n // For example, for Amulet, a validator will see a TransferInstruction_Reject/Withdraw\n // but will not see the create of a TransferInstruction.\n return null\n }\n const transferInstructionView = ensureInterfaceViewIsPresent(\n transferInstructionEvents.created.createdEvent,\n TRANSFER_INSTRUCTION_INTERFACE_ID\n ).viewValue as TransferInstructionView\n\n const multiStepCorrelationId = getCorrelationIdFromTransferInstruction(\n instructionCid,\n transferInstructionView.originalInstructionCid ?? null\n )\n\n const resultTag =\n (\n exercisedEvent.exerciseResult as\n | { output?: { tag?: string } }\n | undefined\n )?.output?.tag || undefined\n\n const currentTag = currentStatusFromChoiceOrResult(\n exercisedEvent.choice,\n resultTag\n )\n\n const transferInstruction: TransferInstructionView = {\n originalInstructionCid:\n transferInstructionView.originalInstructionCid,\n multiStepCorrelationId,\n transfer: transferInstructionView.transfer,\n meta: transferInstructionView.meta,\n status: {\n before: transferInstructionView.status,\n current: { tag: currentTag, value: {} },\n },\n }\n\n const exerciseResultOutputTag = resultTag\n const result =\n await (async (): Promise<ParsedKnownExercisedEvent | null> => {\n switch (exerciseResultOutputTag) {\n case 'TransferInstructionResult_Failed':\n case 'TransferInstructionResult_Pending':\n return this.buildMergeSplit(\n exercisedEvent,\n tokenStandardChoice\n )\n case 'TransferInstructionResult_Completed':\n return this.buildTransfer(\n exercisedEvent,\n tokenStandardChoice,\n transferInstruction\n )\n default:\n throw new Error(\n `Unknown TransferInstructionResult: ${exerciseResultOutputTag}`\n )\n }\n })()\n\n return (\n result && {\n ...result,\n transferInstruction,\n }\n )\n }\n\n private async buildBasic(\n exercisedEvent: ExercisedEvent,\n type: 'Unlock' | 'ExpireDust',\n tokenStandardChoice: TokenStandardChoice | null\n ): Promise<ParsedKnownExercisedEvent> {\n const children = await this.getChildren(exercisedEvent)\n const meta = mergeMetas(exercisedEvent)\n const amountChanges = computeAmountChanges(children, meta, this.partyId)\n const reason = getMetaKeyValue(ReasonMetaKey, meta)\n return {\n label: {\n ...amountChanges,\n type,\n tokenStandardChoice,\n reason,\n meta,\n },\n children,\n transferInstruction: null,\n }\n }\n\n private async getChildren(\n exercisedEvent: ExercisedEvent\n ): Promise<HoldingsChange> {\n const mutatingResult: HoldingsChange = { creates: [], archives: [] }\n const childrenEventsSlice = (this.transaction.events || [])\n .map(getNodeIdAndEvent)\n .filter(\n ({ nodeId }) =>\n nodeId > exercisedEvent.nodeId &&\n nodeId <= exercisedEvent.lastDescendantNodeId\n )\n\n if (\n exercisedEvent.consuming &&\n hasInterface(HOLDING_INTERFACE_ID, exercisedEvent)\n ) {\n const selfEvent = await this.getEventsForArchive(exercisedEvent)\n if (selfEvent) {\n const holdingView = ensureInterfaceViewIsPresent(\n selfEvent.created.createdEvent,\n HOLDING_INTERFACE_ID\n ).viewValue as Holding\n mutatingResult.archives.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId: exercisedEvent.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n }\n\n for (const {\n createdEvent,\n archivedEvent,\n exercisedEvent,\n } of childrenEventsSlice) {\n if (createdEvent) {\n const interfaceView = getInterfaceView(createdEvent)\n if (\n interfaceView &&\n matchInterfaceIds(\n HOLDING_INTERFACE_ID,\n interfaceView.interfaceId\n )\n ) {\n const holdingView = interfaceView.viewValue as Holding\n mutatingResult.creates.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId: createdEvent.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n } else if (\n (archivedEvent &&\n hasInterface(HOLDING_INTERFACE_ID, archivedEvent)) ||\n (exercisedEvent &&\n exercisedEvent.consuming &&\n hasInterface(HOLDING_INTERFACE_ID, exercisedEvent))\n ) {\n const contractEvents = await this.getEventsForArchive(\n archivedEvent || exercisedEvent!\n )\n if (contractEvents) {\n const holdingView = ensureInterfaceViewIsPresent(\n contractEvents.created?.createdEvent,\n HOLDING_INTERFACE_ID\n ).viewValue as Holding\n mutatingResult.archives.push({\n amount: holdingView.amount,\n instrumentId: holdingView.instrumentId,\n contractId:\n archivedEvent?.contractId ||\n exercisedEvent!.contractId,\n owner: holdingView.owner,\n meta: holdingView.meta,\n lock: holdingView.lock,\n })\n }\n }\n }\n\n return {\n // remove transient contracts\n creates: mutatingResult.creates.filter(\n (create) =>\n !mutatingResult.archives.some(\n (archive) => create.contractId === archive.contractId\n )\n ),\n archives: mutatingResult.archives.filter(\n (archive) =>\n !mutatingResult.creates.some(\n (create) => create.contractId === archive.contractId\n )\n ),\n }\n }\n\n private async getEventsForArchive(\n archivedEvent: ArchivedEvent | ExercisedEvent\n ): Promise<null | Required<JsGetEventsByContractIdResponse>> {\n if (!(archivedEvent.witnessParties || []).includes(this.partyId)) {\n return null\n }\n\n const basePayload: Ops.PostV2EventsEventsByContractId['ledgerApi']['params']['body'] =\n {\n contractId: archivedEvent.contractId,\n eventFormat: EventFilterBySetup({\n interfaceIds: [\n HOLDING_INTERFACE_ID,\n TRANSFER_INSTRUCTION_INTERFACE_ID,\n ],\n isMasterUser: this.isMasterUser,\n partyId: this.partyId,\n verbose: true,\n }),\n }\n\n const version = await this.ledgerProvider.request<Ops.GetV2Version>({\n method: 'ledgerApi',\n params: {\n resource: '/v2/version',\n requestMethod: 'get',\n },\n })\n\n const payload = version.version.includes('3.3')\n ? { ...basePayload, requestingParties: [] }\n : basePayload\n\n const events = await this.ledgerProvider\n .request<Ops.PostV2EventsEventsByContractId>({\n method: 'ledgerApi',\n params: {\n resource: '/v2/events/events-by-contract-id',\n requestMethod: 'post',\n body: payload,\n },\n })\n .catch((err) => {\n // This will happen for holdings with consuming choices\n // where the party the script is running on is an actor on the choice\n // but not a stakeholder.\n if (err.code === 'CONTRACT_EVENTS_NOT_FOUND') {\n return null\n } else {\n throw err\n }\n })\n\n if (!events) {\n return null\n }\n\n const created = events.created\n const archived = events.archived\n if (!created || !archived) {\n throw new Error(\n `Archival of ${\n archivedEvent.contractId\n } does not have a corresponding create/archive event: ${JSON.stringify(\n events\n )}`\n )\n }\n return { created, archived }\n }\n}\n\ntype EventParseResult = ParseChildren | ParsedEvent\nfunction isLeafEventNode(result: EventParseResult): result is ParsedEvent {\n return !!(result as ParsedEvent).event\n}\ninterface ParsedEvent {\n event: TokenStandardEvent\n continueAfterNodeId: number\n}\ninterface ParseChildren {\n parentChoiceName: string\n lastDescendantNodeId: number\n}\n\ninterface ParsedKnownExercisedEvent {\n label: Label\n children: HoldingsChange\n transferInstruction: TransferInstructionView | null\n}\n\n// a naive implementation like event.X?.nodeId || event.Y?.nodeId || event.Z?.nodeId fails when nodeId=0\ninterface NodeIdAndEvent {\n nodeId: number\n exercisedEvent?: ExercisedEvent\n archivedEvent?: ArchivedEvent | ExercisedEvent\n createdEvent?: CreatedEvent\n}\nfunction getNodeIdAndEvent(event: Event): NodeIdAndEvent {\n if ('ExercisedEvent' in event) {\n // ledger API's TRANSACTION_SHAPE_LEDGER_EFFECTS does not include ArchivedEvent, instead has the choice as Archive\n if (event.ExercisedEvent.choice === 'Archive') {\n return {\n nodeId: event.ExercisedEvent.nodeId,\n archivedEvent: event.ExercisedEvent,\n }\n } else {\n return {\n nodeId: event.ExercisedEvent.nodeId,\n exercisedEvent: event.ExercisedEvent,\n }\n }\n } else if ('CreatedEvent' in event) {\n return {\n nodeId: event.CreatedEvent.nodeId,\n createdEvent: event.CreatedEvent,\n }\n } else if ('ArchivedEvent' in event) {\n return {\n nodeId: event.ArchivedEvent.nodeId,\n archivedEvent: event.ArchivedEvent,\n }\n } else {\n throw new Error(`Impossible event type: ${event}`)\n }\n}\n\n/** sumHoldingsChange sums all the changes over a number of holdings.\n * Note that this function currently assumes all holdings use the same\n * instrument. */\nfunction sumHoldingsChange(\n change: HoldingsChange,\n filter: (owner: string, lock: HoldingLock | null) => boolean\n): BigNumber {\n return sumHoldings(\n change.creates.filter((create) => filter(create.owner, create.lock))\n ).minus(\n sumHoldings(\n change.archives.filter((archive) =>\n filter(archive.owner, archive.lock)\n )\n )\n )\n}\n\nfunction sumHoldings(holdings: Holding[]): BigNumber {\n if (holdings.length > 0) {\n // Sanity check.\n const instrumentId = holdings[0].instrumentId\n for (const holding of holdings) {\n if (\n holding.instrumentId.admin !== instrumentId.admin ||\n holding.instrumentId.id !== instrumentId.id\n ) {\n throw new Error(\n `Attempted to call sumHoldings on heterogeneous instruments: ${JSON.stringify(instrumentId)} != ${JSON.stringify(holding.instrumentId)}`\n )\n }\n }\n }\n return BigNumber.sum(\n ...holdings.map((h) => h.amount).concat(['0']) // avoid NaN\n )\n}\n\nfunction computeAmountChanges(\n children: HoldingsChange,\n meta: any,\n partyId: string\n) {\n const burnAmount = BigNumber(getMetaKeyValue(BurnedMetaKey, meta) || '0')\n const partyHoldingAmountChange = sumHoldingsChange(\n children,\n (owner) => owner === partyId\n )\n const otherPartiesHoldingAmountChange = sumHoldingsChange(\n children,\n (owner) => owner !== partyId\n )\n const mintAmount = partyHoldingAmountChange\n .plus(burnAmount)\n .plus(otherPartiesHoldingAmountChange)\n return {\n burnAmount: burnAmount.toString(),\n mintAmount: mintAmount.toString(),\n }\n}\n\nfunction computeSummary(\n instrumentId: { admin: string; id: string },\n changes: HoldingsChange,\n partyId: string\n): HoldingsChangeSummary {\n const amountChange = sumHoldingsChange(\n changes,\n (owner) => owner === partyId\n )\n const outputAmount = sumHoldings(changes.creates)\n const inputAmount = sumHoldings(changes.archives)\n return {\n instrumentId,\n amountChange: amountChange.toString(),\n numOutputs: changes.creates.length,\n outputAmount: outputAmount.toString(),\n numInputs: changes.archives.length,\n inputAmount: inputAmount.toString(),\n }\n}\n\nfunction holdingsChangeByInstrument(\n changes: HoldingsChange\n): InstrumentMap<HoldingsChange> {\n const map = new InstrumentMap<{ creates: Holding[]; archives: Holding[] }>()\n for (const create of changes.creates) {\n if (map.has(create.instrumentId)) {\n map.get(create.instrumentId)!.creates.push(create)\n } else {\n map.set(create.instrumentId, { creates: [create], archives: [] })\n }\n }\n for (const archive of changes.archives) {\n if (map.has(archive.instrumentId)) {\n map.get(archive.instrumentId)!.archives.push(archive)\n } else {\n map.set(archive.instrumentId, { creates: [], archives: [archive] })\n }\n }\n return map\n}\n\nfunction computeSummaries(\n changes: HoldingsChange,\n partyId: string\n): HoldingsChangeSummary[] {\n const byInstrument = holdingsChangeByInstrument(changes)\n return [...byInstrument.entries()].map(([instrumentId, change]) =>\n computeSummary(instrumentId, change, partyId)\n )\n}\n\nfunction holdingChangesNonEmpty(event: TokenStandardEvent): boolean {\n return (\n event.unlockedHoldingsChange.creates.length > 0 ||\n event.unlockedHoldingsChange.archives.length > 0 ||\n event.lockedHoldingsChange.creates.length > 0 ||\n event.lockedHoldingsChange.archives.length > 0\n )\n}\n\nconst emptyHoldingsChangeSummary: HoldingsChangeSummary = {\n // This is obviously incorrect, but the field was introduced at the same\n // time at which we introduced the more correct per-instrument summaries,\n // so we know that old code couldn't use this (broken) field, and new code\n // should use the correct summaries.\n instrumentId: { admin: '', id: '' },\n numInputs: 0,\n numOutputs: 0,\n inputAmount: '0',\n outputAmount: '0',\n amountChange: '0',\n}\n"]}
package/dist/parser.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import { Transaction, TransferObject } from './types.js';
2
- import { v3_3 } from '@canton-network/core-ledger-client-types';
3
- import { LedgerClient } from '@canton-network/core-ledger-client';
2
+ import { v3_3, v3_4 } from '@canton-network/core-ledger-client-types';
4
3
  import { PartyId } from '@canton-network/core-types';
5
- type JsTransaction = v3_3.components['schemas']['JsTransaction'];
4
+ import { LedgerProvider } from '@canton-network/core-provider-ledger';
5
+ type JsTransaction = v3_3.components['schemas']['JsTransaction'] | v3_4.components['schemas']['JsTransaction'];
6
6
  export declare class TransactionParser {
7
- private readonly ledgerClient;
7
+ private readonly ledgerProvider;
8
8
  private readonly partyId;
9
9
  private readonly transaction;
10
10
  private readonly isMasterUser;
11
- constructor(transaction: JsTransaction, ledgerClient: LedgerClient, partyId: PartyId, isMasterUser: boolean);
11
+ constructor(ledgerProvider: LedgerProvider, transaction: JsTransaction, partyId: PartyId, isMasterUser: boolean);
12
12
  parseTransaction(): Promise<Transaction>;
13
13
  parseTransferObjects(): Promise<TransferObject[]>;
14
14
  private fetchTransferObjectChoice;
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAoBA,OAAO,EAOH,WAAW,EAIX,cAAc,EACjB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACH,IAAI,EAEP,MAAM,0CAA0C,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAEjE,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAUpD,KAAK,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAA;AA2EhE,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGlC,WAAW,EAAE,aAAa,EAC1B,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,OAAO;IAQnB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC;IAYxC,oBAAoB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAMzC,yBAAyB;YA6BzB,WAAW;IAwDzB,OAAO,CAAC,cAAc;YAyBR,eAAe;IA4B7B,OAAO,CAAC,aAAa;YAiIP,aAAa;YAyFb,cAAc;YAsBd,aAAa;YAqHb,eAAe;YAmCf,oCAAoC;YA8EpC,UAAU;YAsBV,WAAW;YAuGX,mBAAmB;CAsDpC"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAoBA,OAAO,EAOH,WAAW,EAIX,cAAc,EACjB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACH,IAAI,EAEJ,IAAI,EACP,MAAM,0CAA0C,CAAA;AAEjD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAMpD,OAAO,EAAE,cAAc,EAAO,MAAM,sCAAsC,CAAA;AAc1E,KAAK,aAAa,GACZ,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,GAC3C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAA;AA4EjD,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGlC,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,aAAa,EAE1B,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,OAAO;IAQnB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC;IAYxC,oBAAoB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAMzC,yBAAyB;YA6BzB,WAAW;IAwDzB,OAAO,CAAC,cAAc;YAyBR,eAAe;IA6B7B,OAAO,CAAC,aAAa;YAiIP,aAAa;YAyFb,cAAc;YAsBd,aAAa;YAqHb,eAAe;YAmCf,oCAAoC;YA8EpC,UAAU;YAsBV,WAAW;YAuGX,mBAAmB;CAsEpC"}
package/dist/utils.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { Types } from '@canton-network/core-ledger-client';
2
1
  import { Holding, TransferInstructionView } from './types.js';
3
- type CreatedEvent = Types['CreatedEvent'];
4
- type ExercisedEvent = Types['ExercisedEvent'];
5
- type ArchivedEvent = Types['ArchivedEvent'];
6
- type JsInterfaceView = Types['JsInterfaceView'];
2
+ import { v3_3, v3_4 } from '@canton-network/core-ledger-client-types';
3
+ type ArchivedEvent = v3_3.components['schemas']['ArchivedEvent'] | v3_4.components['schemas']['ArchivedEvent'];
4
+ type CreatedEvent = v3_3.components['schemas']['CreatedEvent'] | v3_4.components['schemas']['CreatedEvent'];
5
+ type ExercisedEvent = v3_3.components['schemas']['ExercisedEvent'] | v3_4.components['schemas']['ExercisedEvent'];
6
+ type JsInterfaceView = v3_3.components['schemas']['JsInterfaceView'] | v3_4.components['schemas']['JsInterfaceView'];
7
7
  export declare function hasInterface(interfaceId: string, event: ExercisedEvent | ArchivedEvent): boolean;
8
8
  export declare function getInterfaceView(createdEvent: CreatedEvent): JsInterfaceView | null;
9
9
  export type KnownInterfaceView = {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,oCAAoC,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAM7D,KAAK,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,CAAA;AACzC,KAAK,cAAc,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAA;AAC7C,KAAK,aAAa,GAAG,KAAK,CAAC,eAAe,CAAC,CAAA;AAC3C,KAAK,eAAe,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAA;AAE/C,wBAAgB,YAAY,CACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,cAAc,GAAG,aAAa,GACtC,OAAO,CAIT;AAED,wBAAgB,gBAAgB,CAC5B,YAAY,EAAE,YAAY,GAC3B,eAAe,GAAG,IAAI,CAGxB;AAED,MAAM,MAAM,kBAAkB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,SAAS,EAAE,uBAAuB,CAAA;CAAE,CAAA;AAEzE,wBAAgB,qBAAqB,CACjC,YAAY,EAAE,YAAY,GAC3B,kBAAkB,GAAG,IAAI,CAwB3B;AAGD;;;GAGG;AACH,wBAAgB,4BAA4B,CACxC,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,GACpB,eAAe,CAiBjB;AAED,KAAK,IAAI,GAAG;IAAE,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,CAAA;AAE7D,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CA+BpE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAQrD"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAM7D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,0CAA0C,CAAA;AAErE,KAAK,aAAa,GACZ,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,GAC3C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAA;AACjD,KAAK,YAAY,GACX,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,GAC1C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAAA;AAChD,KAAK,cAAc,GACb,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,GAC5C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAA;AAClD,KAAK,eAAe,GACd,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,GAC7C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAA;AAEnD,wBAAgB,YAAY,CACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,cAAc,GAAG,aAAa,GACtC,OAAO,CAIT;AAED,wBAAgB,gBAAgB,CAC5B,YAAY,EAAE,YAAY,GAC3B,eAAe,GAAG,IAAI,CAGxB;AAED,MAAM,MAAM,kBAAkB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,SAAS,EAAE,uBAAuB,CAAA;CAAE,CAAA;AAEzE,wBAAgB,qBAAqB,CACjC,YAAY,EAAE,YAAY,GAC3B,kBAAkB,GAAG,IAAI,CAwB3B;AAGD;;;GAGG;AACH,wBAAgB,4BAA4B,CACxC,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,GACpB,eAAe,CAiBjB;AAED,KAAK,IAAI,GAAG;IAAE,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,CAAA;AAE7D,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CA+BpE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAQrD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canton-network/core-tx-parser",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "description": "Transaction parsing utilities for Canton Network transactions, including parsing of transaction trees and extraction of relevant information from transaction events.",
6
6
  "license": "Apache-2.0",
@@ -25,29 +25,29 @@
25
25
  },
26
26
  "devDependencies": {
27
27
  "@jest/globals": "^30.2.0",
28
- "@swc/core": "^1.15.10",
28
+ "@swc/core": "^1.15.18",
29
29
  "@swc/jest": "^0.2.39",
30
30
  "@types/jest": "^30.0.0",
31
- "@types/node": "^25.0.10",
31
+ "@types/node": "^25.3.3",
32
32
  "jest": "^30.2.0",
33
- "openapi-typescript": "^7.10.1",
33
+ "openapi-typescript": "^7.13.0",
34
34
  "ts-jest": "^29.4.6",
35
35
  "ts-jest-resolver": "^2.0.1",
36
36
  "tsup": "^8.5.1",
37
37
  "typescript": "^5.9.3"
38
38
  },
39
39
  "dependencies": {
40
- "@canton-network/core-ledger-client": "^0.28.1",
41
- "@canton-network/core-ledger-client-types": "^0.21.0",
42
- "@canton-network/core-ledger-proto": "^0.20.0",
43
- "@canton-network/core-splice-client": "^0.22.0",
44
- "@canton-network/core-token-standard": "^0.20.0",
45
- "@canton-network/core-types": "^0.19.0",
46
- "@canton-network/core-wallet-auth": "^0.20.0",
47
- "bignumber.js": "^9.3.1",
40
+ "@canton-network/core-ledger-client-types": "^0.23.0",
41
+ "@canton-network/core-ledger-proto": "^0.22.0",
42
+ "@canton-network/core-provider-ledger": "^0.4.0",
43
+ "@canton-network/core-splice-client": "^0.24.0",
44
+ "@canton-network/core-token-standard": "^0.22.0",
45
+ "@canton-network/core-types": "^0.21.0",
46
+ "@canton-network/core-wallet-auth": "^0.22.0",
47
+ "bignumber.js": "^10.0.2",
48
48
  "dayjs": "^1.11.19",
49
- "openapi-fetch": "^0.15.0",
50
- "pino": "^10.2.1"
49
+ "openapi-fetch": "^0.17.0",
50
+ "pino": "^10.3.1"
51
51
  },
52
52
  "files": [
53
53
  "dist/**"