{"version":3,"file":"index.cjs","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","HOLDING_INTERFACE_ID","TRANSFER_INSTRUCTION_INTERFACE_ID","BigNumber","TRANSFER_INSTRUCTION_INTERFACE_ID","HOLDING_INTERFACE_ID","EventFilterBySetup"],"sources":["../src/constants.ts","../src/utils.ts","../src/types.ts","../src/instrumentmap.ts","../src/parser.ts"],"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 or package-id, module and entity\n    // Accepts both #<package-name>:<module>:<entity> and <package-id>:<module>:<entity>\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 { type LedgerCommonSchemas } from '@canton-network/core-ledger-client-types'\n\ntype ArchivedEvent = LedgerCommonSchemas['ArchivedEvent']\ntype CreatedEvent = LedgerCommonSchemas['CreatedEvent']\ntype ExercisedEvent = LedgerCommonSchemas['ExercisedEvent']\ntype JsInterfaceView = LedgerCommonSchemas['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 || !interfaceView.interfaceId) {\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 (\n        !interfaceView.interfaceId ||\n        !matchInterfaceIds(interfaceId, interfaceView.interfaceId)\n    ) {\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 { type LedgerCommonSchemas } from '@canton-network/core-ledger-client-types'\n\nexport type ViewValue = LedgerCommonSchemas['JsInterfaceView']['viewValue'] // unknown | undefined\nexport type JsActiveContract = LedgerCommonSchemas['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' | 'Completed' | 'Rejected' | 'Withdrawn' | '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    EventFilterBySetup,\n    type LedgerCommonSchemas,\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 {\n    AbstractLedgerProvider,\n    Ops,\n} from '@canton-network/core-provider-ledger'\n\ntype ArchivedEvent = LedgerCommonSchemas['ArchivedEvent']\ntype CreatedEvent = LedgerCommonSchemas['CreatedEvent']\ntype ExercisedEvent = LedgerCommonSchemas['ExercisedEvent']\ntype Event = LedgerCommonSchemas['Event']\ntype JsTransaction = LedgerCommonSchemas['JsTransaction']\ntype JsGetEventsByContractIdResponse =\n    LedgerCommonSchemas['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 } } | 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: AbstractLedgerProvider\n    private readonly partyId: PartyId\n    private readonly transaction: JsTransaction\n    private readonly isMasterUser: boolean\n\n    constructor(\n        ledgerProvider: AbstractLedgerProvider,\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 with no holding changes, but keep transfer\n                // instruction events so pending offers remain visible.\n                if (\n                    holdingChangesNonEmpty(parsed.event) ||\n                    parsed.event.transferInstruction?.transfer != null\n                ) {\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                } as Label\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            case 'AllocationFactory_Allocate':\n            case 'Allocation_ExecuteTransfer':\n                result = await this.buildTransfer(exercise, tokenStandardChoice)\n                break\n            case 'Allocation_Withdraw':\n            case 'Allocation_Cancel':\n                result = await this.buildBasic(\n                    exercise,\n                    'Unlock',\n                    tokenStandardChoice\n                )\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 rawTransferArg = (\n            exercisedEvent.choiceArgument as {\n                transfer?: any\n            }\n        ).transfer\n        // Ignore `transfer` arguments that aren't a token-standard transfer,\n        // e.g. AmuletRules_Transfer's, which has no receiver or amount.\n        const choiceArgumentTransfer =\n            rawTransferArg?.receiver != null && rawTransferArg?.amount != null\n                ? rawTransferArg\n                : undefined\n\n        const sender: string =\n            transferInstructions?.transfer?.sender ||\n            getMetaKeyValue(SenderMetaKey, meta) ||\n            rawTransferArg?.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 } } | 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 } } | 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                    interfaceView.interfaceId &&\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                }) as Ops.PostV2EventsEventsByContractId['ledgerApi']['params']['body']['eventFormat'],\n            }\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: basePayload,\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 (isContractEventsNotFoundError(err)) {\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\nconst CONTRACT_EVENTS_NOT_FOUND = 'CONTRACT_EVENTS_NOT_FOUND'\n\n/** Detects the ledger API CONTRACT_EVENTS_NOT_FOUND error across the\n *  different error shapes thrown by the various provider/transport stacks:\n *  - JsCantonError from a direct ledger client:\n *    `{ code: 'CONTRACT_EVENTS_NOT_FOUND', cause, ... }`\n *  - JSON-RPC error response (e.g. wallet gateway over HTTP):\n *    `{ error: { code, message, data: JsCantonError } }`\n *  - JSON-RPC error object (e.g. extension window transport):\n *    `{ code, message, data: JsCantonError }`\n *  - As a last resort, a stringified error body containing the code. */\nexport function isContractEventsNotFoundError(err: unknown): boolean {\n    const e = err as any\n    return (\n        e?.code === CONTRACT_EVENTS_NOT_FOUND ||\n        e?.data?.code === CONTRACT_EVENTS_NOT_FOUND ||\n        e?.error?.data?.code === CONTRACT_EVENTS_NOT_FOUND ||\n        (typeof e?.error?.data === 'string' &&\n            e.error.data.includes(CONTRACT_EVENTS_NOT_FOUND))\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"],"mappings":"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"}