{"version":3,"sources":["../src/types.ts","../src/cache/item/base.ts","../src/cache/item/item.ts","../src/cache/item/paginatedItem.ts","../src/service.ts","../src/reader/base.ts","../src/cache/collection/base.ts","../src/cache/collection/collection.ts","../src/reader/reader.ts"],"names":["pino","offset","pageToken","LRUCache"],"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 { LedgerCommonSchemas } from '@canton-network/core-ledger-client-types'\nimport { ContractId, PartyId } from '@canton-network/core-types'\n\nexport type ACSKey = Partial<{\n    party: PartyId | undefined\n    templateId: string | undefined\n    interfaceId: string | undefined\n}>\n\nexport type ACEvent = {\n    offset: number\n    event:\n        | LedgerCommonSchemas['CreatedEvent']\n        | LedgerCommonSchemas['ArchivedEvent']\n    workflowId: string | null\n    synchronizerId: string | null\n    archived?: boolean\n}\n\nexport type ACSComponentState<T> = {\n    offset: number\n    acs: Array<T>\n}\n\nexport type ACSState = {\n    initial: ACSComponentState<\n        LedgerCommonSchemas['JsGetActiveContractsResponse']\n    >\n    updates: ACSComponentState<ACEvent>\n    archivedACs: Set<ContractId<string>>\n}\n\nexport type PaginatedACSState = {\n    pages: Record<\n        NonNullable<\n            LedgerCommonSchemas['JsGetActiveContractsPageResponse']['nextPageToken']\n        >,\n        LedgerCommonSchemas['JsGetActiveContractsPageResponse']\n    >\n    offset: number\n}\n\n/**\n * Configuration for ACS (Active Contract Set) update behavior.\n *\n * @property maxEventsBeforePrune - How many events do we accumulate before we prune (compact) the ACS history. Set to 0 to enable to compact all events, which is more efficient as long as application always asks for increasing (or equal) offsets.\n * @property safeOffsetDeltaForPrune - When we compact the ACS history, we keep all events within this offset delta of the last seen update offset. Set 0 to allow to compact everything.\n * @property maxUpdatesToFetch - How many updates do we fetch at once when fetching updates. If there are more updates, we will fetch again until we have caught up (returned data is always complete to the requested endInclusive offset - even if that means multiple fetches).\n */\nexport const ACS_UPDATE_CONFIG = {\n    maxEventsBeforePrune: 150,\n    safeOffsetDeltaForPrune: 200,\n    maxUpdatesToFetch: 100,\n} as const\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 { ACEvent, ACSState, PaginatedACSState } from '../../types'\nimport { AbstractLedgerProvider } from '@canton-network/core-provider-ledger'\nimport { LedgerCommonSchemas } from '@canton-network/core-ledger-client-types'\nimport pino from 'pino'\nimport {\n    ResolvedAcsOptions,\n    AcsService,\n    PaginatedResolvedAcsOptions,\n} from '../../service'\n\nexport const logger = pino({ name: 'acs-reader/cache' })\n\n/**\n * Checks if an event represents a contract creation.\n * Used to distinguish between created and archived events when processing cache updates.\n */\nexport function isCreatedEvent(event: ACEvent): event is ACEvent & {\n    archived: false\n    event: LedgerCommonSchemas['CreatedEvent']\n} {\n    return !event.archived\n}\n\nexport type BaseCache<Paginated extends boolean> = {\n    State: Paginated extends true ? PaginatedACSState : ACSState\n    Options: Paginated extends true\n        ? PaginatedResolvedAcsOptions\n        : ResolvedAcsOptions\n    ReturnValue: ReturnType<\n        AcsService[Paginated extends true\n            ? 'getPaginatedActiveContracts'\n            : 'getActiveContracts']\n    >\n}\n\nexport abstract class BaseACSCache<Paginated extends boolean = false> {\n    protected abstract readonly state: BaseCache<Paginated>['State']\n\n    protected readonly service: AcsService\n\n    constructor(protected readonly ledger: AbstractLedgerProvider) {\n        this.service = new AcsService(ledger)\n    }\n\n    /**\n     * Updates the cache to include ledger changes up to the specified offset.\n     * Fetches and applies incremental updates from the ledger, initializing the cache if needed.\n     * Automatically prunes old events when the update buffer exceeds configured thresholds (when not in pagination mode).\n     */\n    public abstract update(\n        options: BaseCache<Paginated>['Options']\n    ): Promise<void>\n\n    /**\n     * Calculates the active contract set at a specific ledger offset.\n     * Applies cached updates to the initial snapshot and filters out archived contracts.\n     * Throws an error if the cache is not initialized or the requested offset is too old.\n     */\n    public abstract calculateAt(\n        offset: number\n    ): LedgerCommonSchemas['JsGetActiveContractsResponse'][]\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 { ACEvent, ACS_UPDATE_CONFIG, ACSState } from '../../types'\nimport { Ops } from '@canton-network/core-provider-ledger'\nimport { LedgerCommonSchemas } from '@canton-network/core-ledger-client-types'\nimport { ResolvedAcsOptions, buildActiveContractFilter } from '../../service'\nimport { ContractId } from '@canton-network/core-types'\nimport { BaseACSCache, isCreatedEvent, logger } from './base'\n\nexport class ACSCache extends BaseACSCache {\n    protected readonly state: ACSState = {\n        initial: {\n            offset: 0,\n            acs: [],\n        },\n        updates: {\n            offset: 0,\n            acs: [],\n        },\n        archivedACs: new Set(),\n    }\n\n    /**\n     * Returns the initial snapshot of the active contract set.\n     * Contains the base state captured at a specific ledger offset.\n     */\n    private get initial() {\n        return this.state.initial\n    }\n\n    /**\n     * Returns the incremental updates applied after the initial snapshot.\n     * Contains created and archived events that occurred since the initial state.\n     */\n    private get updates() {\n        return this.state.updates\n    }\n\n    public async update(options: ResolvedAcsOptions) {\n        if (!this.initial.acs.length || this.initial.offset > options.offset) {\n            await this.initState(options)\n        }\n\n        const builtFilter = buildActiveContractFilter(options)\n\n        const updates = await this.fetchUpdates({\n            beginExclusive: this.updates.offset,\n            endInclusive: options.offset,\n            eventFormat: {\n                verbose: Boolean(builtFilter.verbose),\n                ...builtFilter.filter,\n            },\n        })\n\n        /**\n         * in practice length should never be > maxUpdatesToFetch only equal (server should never return more than limit in query). This is just a safeguard.\n         */\n        if (updates.length >= ACS_UPDATE_CONFIG.maxUpdatesToFetch)\n            void this.update(options)\n\n        const { newEvents, newOffset } = this.extractEvents({\n            offset: this.updates.offset,\n            updates,\n        })\n\n        if (newOffset > this.updates.offset) {\n            this.updates.offset = newOffset\n            this.updates.acs = this.updates.acs.concat(newEvents)\n        } else this.updates.offset = options.offset\n\n        if (this.updates.acs.length >= ACS_UPDATE_CONFIG.maxEventsBeforePrune) {\n            this.prune()\n        }\n    }\n\n    public calculateAt(offset: number) {\n        if (!this.initial.acs)\n            throw Error('No ACS initialized. Call `.update()` first')\n        if (this.initial.offset > offset)\n            throw Error('Provided offset cannot be smaller than ACS offset')\n\n        const newContracts: LedgerCommonSchemas['JsGetActiveContractsResponse'][] =\n            []\n        const newArchivedContracts: Set<ContractId<string>> = new Set()\n\n        this.updates.acs\n            .filter((ac) => ac.offset <= offset)\n            .map((ac) => {\n                if (isCreatedEvent(ac)) {\n                    newContracts.push({\n                        workflowId: ac.workflowId ?? '',\n                        contractEntry: {\n                            JsActiveContract: {\n                                createdEvent: ac.event,\n                                synchronizerId: ac.synchronizerId ?? '',\n                                reassignmentCounter: 0,\n                            },\n                        },\n                    })\n                } else {\n                    newArchivedContracts.add(\n                        ac.event.contractId as ContractId<string>\n                    )\n                }\n            })\n\n        const allContracts = this.initial.acs.concat(newContracts)\n        this.state.archivedACs =\n            this.state.archivedACs.union(newArchivedContracts)\n\n        return allContracts.filter(({ contractEntry }) => {\n            if (!contractEntry) return false\n            const id = (\n                'JsActiveContract' in contractEntry\n                    ? contractEntry.JsActiveContract.createdEvent.contractId\n                    : ''\n            ) as ContractId<string>\n\n            return !this.state.archivedACs.has(id)\n        })\n    }\n\n    /**\n     * Initializes the cache state by fetching the active contract set at the specified offset.\n     * Clears any existing updates and archived contract tracking.\n     */\n    private async initState(options: ResolvedAcsOptions) {\n        const initialAcs = await this.service.getActiveContracts(options)\n        this.state.initial = {\n            offset: options.offset,\n            acs: initialAcs,\n        }\n        this.state.updates = {\n            offset: options.offset,\n            acs: [],\n        }\n        this.state.archivedACs = new Set()\n    }\n\n    /**\n     * Compacts the cache by moving the initial snapshot forward to a more recent offset.\n     * Applies accumulated updates to create a new initial state and discards old events.\n     * Improves performance by reducing the number of updates to process on each query.\n     */\n    private prune() {\n        const newOffset = Math.max(\n            this.initial.offset,\n            this.updates.offset - ACS_UPDATE_CONFIG.safeOffsetDeltaForPrune\n        )\n\n        if (newOffset > this.initial.offset) {\n            const responses = this.calculateAt(newOffset)\n\n            this.state.initial = {\n                offset: newOffset,\n                acs: responses,\n            }\n            this.state.updates = {\n                offset: this.updates.offset,\n                acs: this.updates.acs.filter((ac) => ac.offset > newOffset),\n            }\n        }\n    }\n\n    /**\n     * Fetches ledger updates between two offsets.\n     * Queries the ledger API for transactions containing contract create and archive events.\n     */\n    private async fetchUpdates(args: {\n        beginExclusive: number\n        endInclusive: number\n        eventFormat: LedgerCommonSchemas['EventFormat']\n        filter?: LedgerCommonSchemas['TransactionFilter']\n    }) {\n        const { beginExclusive, endInclusive, eventFormat, filter } = args\n        const updateFormat: Ops.PostV2UpdatesFlats['ledgerApi']['params']['body']['updateFormat'] =\n            {\n                includeTransactions: {\n                    eventFormat,\n                    transactionShape: 'TRANSACTION_SHAPE_ACS_DELTA',\n                },\n            }\n\n        return await this.ledger.request<Ops.PostV2Updates>({\n            method: 'ledgerApi',\n            params: {\n                resource: '/v2/updates',\n                requestMethod: 'post',\n                body: {\n                    beginExclusive,\n                    endInclusive,\n                    updateFormat,\n                    verbose: false,\n                    ...(filter ? { filter } : {}),\n                },\n                query: {\n                    limit: ACS_UPDATE_CONFIG.maxUpdatesToFetch,\n                    stream_idle_timeout_ms: 1000,\n                },\n            },\n        })\n    }\n\n    /**\n     * Extracts contract creation and archival events from raw ledger updates.\n     * Processes transaction and checkpoint updates to build a list of relevant contract events.\n     * Tracks the highest offset seen across all updates.\n     */\n    private extractEvents(args: {\n        updates: Awaited<ReturnType<ACSCache['fetchUpdates']>>\n        offset: number\n    }) {\n        const { updates, offset } = args\n        const newEvents: Array<ACEvent> = []\n        let newOffset = offset\n        updates.forEach((update) => {\n            if (!update || !update.update) {\n                return\n            }\n            if ('Transaction' in update.update) {\n                const transaction = update.update.Transaction\n                const trOffset = transaction?.value?.offset\n                if (trOffset && trOffset > newOffset) {\n                    const events: Array<LedgerCommonSchemas['Event']> =\n                        transaction?.value?.events ?? []\n                    events.forEach((event) => {\n                        if (!event) {\n                            return\n                        }\n                        if (\n                            'CreatedEvent' in event ||\n                            'ArchivedEvent' in event\n                        ) {\n                            const eventData =\n                                'CreatedEvent' in event\n                                    ? event.CreatedEvent\n                                    : event.ArchivedEvent\n\n                            const acUpdate: ACEvent = {\n                                event: eventData,\n                                offset: trOffset,\n                                workflowId:\n                                    transaction?.value?.workflowId ?? null,\n                                synchronizerId:\n                                    transaction?.value?.synchronizerId ?? null,\n                                ...('ArchivedEvent' in event && {\n                                    archived: true,\n                                }),\n                            }\n                            newEvents.push(acUpdate)\n                            newOffset = trOffset\n                        }\n                    })\n                }\n            } else if ('OffsetCheckpoint' in update.update) {\n                const checkpoint = update.update.OffsetCheckpoint\n                const offset = checkpoint?.value?.offset\n                if (offset) {\n                    newOffset = offset\n                }\n            } else {\n                logger.warn(\n                    {\n                        value: JSON.stringify(update.update),\n                    },\n                    'ACS update got unknown update type'\n                )\n            }\n        })\n        return { newEvents, newOffset }\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\nimport { PaginatedResolvedAcsOptions } from '../../service'\nimport { PaginatedACSState } from '../../types'\nimport { BaseACSCache } from './base'\n\nexport class PaginatedACSCache extends BaseACSCache<true> {\n    public static readonly FIRST_PAGE_TOKEN = ''\n    protected readonly state: PaginatedACSState = {\n        pages: {\n            [PaginatedACSCache.FIRST_PAGE_TOKEN]: {\n                activeContracts: [],\n                activeAtOffset: 0,\n                nextPageToken: '',\n            },\n        },\n        offset: 0,\n    }\n\n    /**\n     * Token for fetching pages of active contracts. will loop over pages until desired offset is reached. When last obtained page was the last one it is `undefined`\n     */\n    private nextPageToken: string | undefined =\n        PaginatedACSCache.FIRST_PAGE_TOKEN\n\n    public async update(options: PaginatedResolvedAcsOptions) {\n        if (\n            !this.state.pages[PaginatedACSCache.FIRST_PAGE_TOKEN]\n                .activeContracts.length &&\n            !this.state.pages[PaginatedACSCache.FIRST_PAGE_TOKEN].nextPageToken\n        ) {\n            await this.initState(options)\n        }\n\n        if (options.pageToken) {\n            this.state.pages[options.pageToken] =\n                await this.service.getPaginatedActiveContracts(options)\n            this.nextPageToken =\n                this.state.pages[options.pageToken].nextPageToken\n        } else {\n            while (this.nextPageToken && options.offset > this.state.offset) {\n                this.state.pages[this.nextPageToken] =\n                    await this.service.getPaginatedActiveContracts({\n                        ...options,\n                        pageToken: this.nextPageToken,\n                    })\n                this.state.offset =\n                    this.state.pages[this.nextPageToken].activeAtOffset\n                this.nextPageToken =\n                    this.state.pages[this.nextPageToken].nextPageToken\n            }\n        }\n    }\n\n    public calculateAt(offset: number) {\n        const activeContracts = Object.values(this.state.pages).flatMap(\n            (page) => page.activeContracts\n        )\n\n        if (!activeContracts.length)\n            throw Error('No ACS initialized. Call `.update()` first')\n\n        return activeContracts.filter((ac) => {\n            const event =\n                ac.contractEntry && 'JsActiveContract' in ac.contractEntry\n                    ? ac.contractEntry.JsActiveContract.createdEvent\n                    : undefined\n            return event && event.offset <= offset\n        })\n    }\n\n    /**\n     * Retrieves a specific page from the cache using the page token.\n     * @param pageToken defaults to {@link PaginatedACSCache.FIRST_PAGE_TOKEN}\n     */\n    public getPage(pageToken: string = PaginatedACSCache.FIRST_PAGE_TOKEN) {\n        return this.state.pages[pageToken]\n    }\n\n    /**\n     * Initializes the cache state by fetching the first page of active contracts.\n     */\n    private async initState(options: PaginatedResolvedAcsOptions) {\n        const firstPage =\n            await this.service.getPaginatedActiveContracts(options)\n\n        this.state.pages[PaginatedACSCache.FIRST_PAGE_TOKEN] = firstPage\n        this.state.offset = firstPage.activeAtOffset\n        this.nextPageToken = firstPage.nextPageToken\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\nimport {\n    AbstractLedgerProvider,\n    Ops,\n} from '@canton-network/core-provider-ledger'\nimport { type LedgerCommonSchemas } from '@canton-network/core-ledger-client-types'\n\nimport { PartyId } from '@canton-network/core-types'\nimport { PaginatedACSCache } from './cache/item'\n\ntype Types = LedgerCommonSchemas\n\ntype Completion = Types['Completion']['value']\nexport type JSContractEntry = Types['JsContractEntry']\nexport type JsCantonError = Types['JsCantonError']\n\nconst COMPLETIONS_LIMIT = '100'\nconst COMPLETIONS_STREAM_IDLE_TIMEOUT_MS = '1000'\n\nexport type AcsOptions = {\n    offset?: number\n    templateIds?: string[]\n    parties?: string[] //TODO: Figure out if this should use this.partyId by default and not allow cross party filtering\n    filterByParty?: boolean\n    interfaceIds?: string[]\n    limit?: number\n    continueUntilCompletion?: boolean\n}\nexport type PaginatedAcsOptions = Omit<AcsOptions, 'limit'> &\n    Pick<Types['GetActiveContractsPageRequest'], 'pageToken' | 'maxPageSize'>\n\ntype ResolvedOptions<Options> = Omit<Options, 'offset'> & { offset: number }\n\nexport type ResolvedAcsOptions = ResolvedOptions<AcsOptions>\nexport type PaginatedResolvedAcsOptions = ResolvedOptions<PaginatedAcsOptions>\n\nexport class AcsService {\n    constructor(private readonly ledgerProvider: AbstractLedgerProvider) {}\n\n    public async getPaginatedActiveContracts(\n        options: Omit<\n            PaginatedResolvedAcsOptions,\n            'continueUntilCompletion'\n        > & {\n            continueUntilCompletion: true\n        }\n    ): Promise<Types['JsGetActiveContractsPageResponse'][]>\n    public async getPaginatedActiveContracts(\n        options: Omit<\n            PaginatedResolvedAcsOptions,\n            'continueUntilCompletion'\n        > & {\n            continueUntilCompletion: false\n        }\n    ): Promise<Types['JsGetActiveContractsPageResponse']>\n    public async getPaginatedActiveContracts(\n        options: Omit<PaginatedResolvedAcsOptions, 'continueUntilCompletion'>\n    ): Promise<Types['JsGetActiveContractsPageResponse']>\n    public async getPaginatedActiveContracts(\n        options: PaginatedResolvedAcsOptions\n    ): Promise<\n        | Types['JsGetActiveContractsPageResponse']\n        | Types['JsGetActiveContractsPageResponse'][]\n    > {\n        const { continueUntilCompletion, ...baseArgs } = options\n        const { maxPageSize, pageToken } = baseArgs\n\n        const { activeAtOffset, filter } = buildActiveContractFilter(options)\n\n        if (continueUntilCompletion) {\n            const results: Types['JsGetActiveContractsPageResponse'][] = []\n            let shouldContinue = true\n            while (shouldContinue) {\n                const pageToken = results.length\n                    ? results[results.length - 1].nextPageToken\n                    : PaginatedACSCache.FIRST_PAGE_TOKEN\n                const result = await this.getPaginatedActiveContracts({\n                    ...baseArgs,\n                    continueUntilCompletion: false,\n                    ...(pageToken ? { pageToken } : {}),\n                })\n\n                results.push(result)\n                shouldContinue = Boolean(result.nextPageToken)\n            }\n            return results\n        }\n\n        const body: Ops.GetV2StateActiveContractsPage['ledgerApi']['params']['body'] =\n            {\n                eventFormat: {},\n                activeAtOffset,\n            }\n        if (filter?.filtersByParty) {\n            body.eventFormat.filtersByParty = filter.filtersByParty\n        }\n        if (filter?.filtersForAnyParty) {\n            body.eventFormat.filtersForAnyParty = filter.filtersForAnyParty\n        }\n        if (maxPageSize !== undefined) {\n            body.maxPageSize = maxPageSize\n        }\n        if (pageToken !== undefined) {\n            body.pageToken = pageToken\n        }\n\n        return await this.ledgerProvider.request<Ops.GetV2StateActiveContractsPage>(\n            {\n                method: 'ledgerApi',\n                params: {\n                    requestMethod: 'get',\n                    resource: '/v2/state/active-contracts-page',\n                    body,\n                },\n            }\n        )\n    }\n\n    public async getActiveContracts(\n        options: ResolvedAcsOptions\n    ): Promise<Array<Types['JsGetActiveContractsResponse']>> {\n        const { limit, continueUntilCompletion } = options\n\n        const filter = buildActiveContractFilter(options)\n\n        if (continueUntilCompletion) {\n            // Query-mode: if limit it set, perform a series of http queries (scan whole ledger)\n            return await this.fetchActiveContractsUntilComplete(\n                filter,\n                limit ?? 200\n            )\n        }\n\n        return await this.ledgerProvider.request<Ops.PostV2StateActiveContracts>(\n            {\n                method: 'ledgerApi',\n                params: {\n                    resource: '/v2/state/active-contracts',\n                    requestMethod: 'post',\n                    body: filter,\n                    query: limit ? { limit: limit } : {},\n                },\n            }\n        )\n    }\n\n    private async fetchActiveContractsUntilComplete(\n        args: Ops.PostV2StateActiveContracts['ledgerApi']['params']['body'],\n        limit: number\n    ): Promise<Array<Types['JsGetActiveContractsResponse']>> {\n        const ledgerEnd =\n            await this.ledgerProvider.request<Ops.GetV2StateLedgerEnd>({\n                method: 'ledgerApi',\n                params: {\n                    resource: '/v2/state/ledger-end',\n                    requestMethod: 'get',\n                },\n            })\n\n        const bodyRequest: Partial<\n            Ops.PostV2Updates['ledgerApi']['params']['body']\n        > = {\n            beginExclusive: 0,\n            verbose: false,\n        }\n        if (ledgerEnd.offset !== undefined) {\n            bodyRequest.endInclusive = ledgerEnd.offset\n        }\n\n        if (args.filter) bodyRequest.filter = args.filter\n\n        const finalLedgerEnd = ledgerEnd.offset ?? 0\n        let currentOffset = 0\n\n        const allContractsData = new Map()\n        const exercisedContracts = new Set()\n\n        while (currentOffset < finalLedgerEnd) {\n            bodyRequest.beginExclusive = currentOffset\n            const results = (\n                await this.ledgerProvider.request<Ops.PostV2Updates>({\n                    method: 'ledgerApi',\n                    params: {\n                        resource: '/v2/updates',\n                        requestMethod: 'post',\n                        body: bodyRequest as Ops.PostV2Updates['ledgerApi']['params']['body'],\n                        query: { limit: limit },\n                    },\n                })\n            )\n                .filter(({ update }) => !!update && 'Transaction' in update)\n                .map(({ update }) => {\n                    if (update && 'Transaction' in update) {\n                        return update.Transaction.value\n                    }\n                    throw new Error('Expected Transaction update')\n                })\n                .map((data) => {\n                    const archivedEvents = data.events\n                        ?.filter((event) => !!event && 'ArchivedEvent' in event)\n                        .map(\n                            (event) =>\n                                (\n                                    event as {\n                                        ArchivedEvent: Types['ArchivedEvent']\n                                    }\n                                ).ArchivedEvent\n                        )\n                        .filter((event) => !!event)\n                    const exercisedEvents = data.events\n                        ?.filter(\n                            (event) => !!event && 'ExercisedEvent' in event\n                        )\n                        .map(\n                            (event) =>\n                                (\n                                    event as {\n                                        ExercisedEvent: Types['ExercisedEvent']\n                                    }\n                                ).ExercisedEvent\n                        )\n                        .filter((event) => !!event)\n                        .filter((event) => !!event.consuming)\n                    const createdEvents = data.events\n                        ?.filter((event) => !!event && 'CreatedEvent' in event)\n                        .map(\n                            (event) =>\n                                (\n                                    event as {\n                                        CreatedEvent: Types['CreatedEvent']\n                                    }\n                                ).CreatedEvent\n                        )\n                        .filter((event) => !!event)\n                        // TODO: remove the filter once /v2/updates is fixed\n                        .filter((event) =>\n                            Object.keys(\n                                args.filter?.filtersByParty ?? {}\n                            ).includes(\n                                (event.createArgument as { owner?: string })\n                                    ?.owner ?? ''\n                            )\n                        )\n\n                    archivedEvents?.forEach((event) => {\n                        if (event.contractId)\n                            exercisedContracts.add(event.contractId)\n                    })\n\n                    exercisedEvents?.forEach((event) => {\n                        if (event.contractId)\n                            exercisedContracts.add(event.contractId)\n                    })\n\n                    createdEvents?.forEach((event) => {\n                        if (!event.contractId) return\n                        allContractsData.set(event.contractId, {\n                            workflowId: data.workflowId,\n                            contractEntry: {\n                                JsActiveContract: {\n                                    synchronizerId: data.synchronizerId,\n                                    createdEvent: event,\n                                    reassignmentCounter: data.offset,\n                                },\n                            },\n                        })\n                    })\n\n                    currentOffset = Math.max(currentOffset, data.offset)\n                    return true\n                })\n\n            if (!results.length) currentOffset++\n        }\n\n        // filter through all contracts to retrieve only active ones\n        exercisedContracts.forEach((cid) => {\n            allContractsData.delete(cid)\n        })\n\n        return Array.from(allContractsData.values())\n    }\n}\n\nexport function buildActiveContractFilter(options: {\n    offset: number\n    templateIds?: string[]\n    parties?: string[] //TODO: Figure out if this should use this.partyId by default and not allow cross party filtering\n    filterByParty?: boolean\n    interfaceIds?: string[]\n    limit?: number\n}) {\n    const filter: Partial<\n        Ops.PostV2StateActiveContracts['ledgerApi']['params']['body']\n    > = {\n        filter: {\n            filtersByParty: {},\n        },\n        verbose: false,\n        activeAtOffset: options?.offset,\n    }\n\n    // Helper to build TemplateFilter array\n    const buildTemplateFilter = (templateIds?: string[]) => {\n        if (!templateIds) return []\n\n        return templateIds.map((templateId) => ({\n            identifierFilter: {\n                TemplateFilter: {\n                    value: {\n                        templateId,\n                        includeCreatedEventBlob: true, //TODO: figure out if this should be configurable\n                    },\n                },\n            },\n        }))\n    }\n\n    const buildInterfaceFilter = (interfaceIds?: string[]) => {\n        if (!interfaceIds) return []\n\n        return interfaceIds.map((interfaceId) => ({\n            identifierFilter: {\n                InterfaceFilter: {\n                    value: {\n                        interfaceId,\n                        includeCreatedEventBlob: true, //TODO: figure out if this should be configurable\n                        includeInterfaceView: true,\n                    },\n                },\n            },\n        }))\n    }\n\n    if (\n        options?.filterByParty &&\n        options.parties &&\n        options.parties.length > 0\n    ) {\n        // Filter by party: set filtersByParty for each party\n        const cumulativeFilter =\n            options?.templateIds && !options?.interfaceIds\n                ? buildTemplateFilter(options.templateIds)\n                : options?.interfaceIds && !options?.templateIds\n                  ? buildInterfaceFilter(options.interfaceIds)\n                  : []\n\n        for (const party of options.parties) {\n            const filtersByParty = filter.filter?.filtersByParty\n            if (!filtersByParty) {\n                throw new Error(\n                    'filtersByParty is missing from active contract filter'\n                )\n            }\n            filtersByParty[party] = {\n                cumulative: cumulativeFilter,\n            }\n        }\n    } else if (options?.templateIds) {\n        // Only template filter, no party\n        filter.filter!.filtersForAnyParty = {\n            cumulative: buildTemplateFilter(options.templateIds),\n        }\n    } else if (options?.interfaceIds) {\n        filter.filter!.filtersForAnyParty = {\n            cumulative: buildInterfaceFilter(options.interfaceIds),\n        }\n    }\n\n    return filter as Ops.PostV2StateActiveContracts['ledgerApi']['params']['body']\n}\n\n/**\n * Polls the completions endpoint until\n * the completion with the given (userId, commandId, submissionId) is returned.\n * Then returns the updateId, synchronizerId and recordTime of that completion.\n */\nexport async function awaitCompletion(\n    ledgerProvider: AbstractLedgerProvider,\n    ledgerEnd: number,\n    partyId: PartyId,\n    userId: string,\n    commandIdOrSubmissionId: string\n): Promise<Completion> {\n    const responses =\n        await ledgerProvider.request<Ops.PostV2CommandsCompletions>({\n            method: 'ledgerApi',\n            params: {\n                resource: '/v2/commands/completions',\n                requestMethod: 'post',\n                body: {\n                    userId,\n                    parties: [partyId],\n                    beginExclusive: ledgerEnd,\n                },\n                query: {\n                    limit: Number(COMPLETIONS_LIMIT),\n                    stream_idle_timeout_ms: Number(\n                        COMPLETIONS_STREAM_IDLE_TIMEOUT_MS\n                    ),\n                },\n            },\n        })\n\n    const completions = responses.filter(\n        (r) => !!r.completionResponse && 'Completion' in r.completionResponse\n    )\n\n    const wantedCompletion = responses.find((r) => {\n        if (r.completionResponse && 'Completion' in r.completionResponse) {\n            const completion = r.completionResponse.Completion.value\n            return (\n                completion.userId === userId &&\n                (completion.commandId === commandIdOrSubmissionId ||\n                    completion.submissionId === commandIdOrSubmissionId)\n            )\n        }\n        return false\n    })\n\n    if (\n        wantedCompletion &&\n        wantedCompletion.completionResponse &&\n        'Completion' in wantedCompletion.completionResponse\n    ) {\n        const completion = wantedCompletion.completionResponse.Completion.value\n        const status = completion.status\n        if (status && status.code !== 0) {\n            // status.code is 0 for success\n            throw new Error(\n                `Command failed with status code ${status.code} and message: ${status.message}`\n            )\n        }\n        return completion\n    } else {\n        const lastCompletion = completions[completions.length - 1]\n        const newLedgerEnd =\n            lastCompletion &&\n            lastCompletion.completionResponse &&\n            'Completion' in lastCompletion.completionResponse\n                ? lastCompletion.completionResponse.Completion.value.offset\n                : undefined\n\n        return awaitCompletion(\n            ledgerProvider,\n            newLedgerEnd || ledgerEnd, // !newLedgerEnd implies response was empty\n            partyId,\n            userId,\n            commandIdOrSubmissionId\n        )\n    }\n}\n\nexport async function promiseWithTimeout<T>(\n    promise: Promise<T>,\n    timeoutMs: number,\n    errorMessage: string\n): Promise<T> {\n    let timeoutPid: NodeJS.Timeout | null = null\n    const timeoutPromise: Promise<T> = new Promise((_resolve, reject) => {\n        timeoutPid = setTimeout(() => reject(errorMessage), timeoutMs)\n    })\n\n    try {\n        return await Promise.race([promise, timeoutPromise])\n    } finally {\n        if (timeoutPid) {\n            clearTimeout(timeoutPid)\n        }\n    }\n}\n\nexport type RetryableOptions = {\n    retries: number\n    delayMs: number\n    cantonErrorKeys: string[]\n}\nexport const defaultRetryableOptions: RetryableOptions = {\n    retries: 5,\n    delayMs: 3000,\n    cantonErrorKeys: [\n        'SEQUENCER_REQUEST_FAILED',\n        'SEQUENCER_BACKPRESSURE',\n        'SUBMISSION_ALREADY_IN_FLIGHT',\n        'LOCAL_VERDICT_TIMEOUT',\n        'NOT_SEQUENCED_TIMEOUT',\n        'NO_VIEW_WITH_VALID_RECIPIENTS',\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\nimport {\n    AbstractLedgerProvider,\n    Ops,\n} from '@canton-network/core-provider-ledger'\nimport {\n    ACSCacheCollection,\n    PaginatedACSCacheCollection,\n} from '../cache/collection/collection'\nimport {\n    AcsOptions,\n    AcsService,\n    PaginatedAcsOptions,\n    PaginatedResolvedAcsOptions,\n    ResolvedAcsOptions,\n} from '../service'\nimport { LedgerCommonSchemas } from '@canton-network/core-ledger-client-types'\nimport { ACSCacheCollectionOptions } from '../cache/collection'\n\nexport abstract class BaseReader<\n    Options extends AcsOptions | PaginatedAcsOptions,\n> {\n    protected cacheCollection: ACSCacheCollection | PaginatedACSCacheCollection\n    protected service: AcsService\n    constructor(\n        protected readonly ledger: AbstractLedgerProvider,\n        protected readonly cacheOptions?: ACSCacheCollectionOptions\n    ) {\n        this.cacheCollection = this.createCacheCollection()\n        this.service = new AcsService(ledger)\n    }\n\n    /**\n     * Creates the appropriate cache collection for this reader.\n     *\n     * @internal For internal use only.\n     * @returns The cache collection instance\n     */\n    protected abstract createCacheCollection():\n        | ACSCacheCollection\n        | PaginatedACSCacheCollection\n\n    /**\n     * Reads active contracts from the cache.\n     */\n    public async read(options: Options) {\n        const resolvedOptions = await this.resolveAcsOptions(options)\n        return await this.cacheCollection.readFromCache(resolvedOptions)\n    }\n\n    /**\n     * Convenience method that returns active contracts as JS contract objects.\n     */\n    public async readJsContracts(options: Options) {\n        return this.readJsContractsWith(await this.read(options))\n    }\n\n    /**\n     * Extracts active contracts from various output formats (single page, array of pages, or array of responses).\n     */\n    private getActiveContracts(\n        output:\n            | LedgerCommonSchemas['JsGetActiveContractsResponse'][]\n            | LedgerCommonSchemas['JsGetActiveContractsPageResponse']\n            | LedgerCommonSchemas['JsGetActiveContractsPageResponse'][]\n    ): LedgerCommonSchemas['JsGetActiveContractsResponse'][] {\n        // Handle single page response\n        if (!Array.isArray(output)) {\n            return 'activeContracts' in output ? output.activeContracts : []\n        }\n\n        // Handle array of pages vs array of responses\n        if (output.length > 0 && 'activeContracts' in output[0]) {\n            return output.flatMap((page) =>\n                'activeContracts' in page ? page.activeContracts : []\n            )\n        }\n\n        return output.filter(\n            (\n                item\n            ): item is LedgerCommonSchemas['JsGetActiveContractsResponse'] =>\n                !('activeContracts' in item)\n        )\n    }\n\n    /**\n     * Transforms active contracts output into JS contract objects with created event details and synchronizer ID.\n     */\n    private readJsContractsWith(output: Awaited<ReturnType<typeof this.read>>) {\n        const contracts = this.getActiveContracts(output)\n\n        return contracts\n            .filter(\n                (acs) =>\n                    acs.contractEntry != null &&\n                    'JsActiveContract' in acs.contractEntry\n            )\n            .map((acs) => {\n                const jsActiveContract = (\n                    acs.contractEntry as {\n                        JsActiveContract: LedgerCommonSchemas['JsActiveContract']\n                    }\n                ).JsActiveContract\n\n                return {\n                    ...jsActiveContract.createdEvent,\n                    synchronizerId: jsActiveContract.synchronizerId,\n                }\n            })\n    }\n\n    /**\n     * Resolves ACS options by ensuring an offset is present, fetching the current ledger end if needed.\n     */\n    protected async resolveAcsOptions(\n        options: Options\n    ): Promise<\n        Options extends PaginatedAcsOptions\n            ? PaginatedResolvedAcsOptions\n            : ResolvedAcsOptions\n    > {\n        const offset =\n            options.offset ??\n            (\n                await this.ledger.request<Ops.GetV2StateLedgerEnd>({\n                    method: 'ledgerApi',\n                    params: {\n                        resource: '/v2/state/ledger-end',\n                        requestMethod: 'get',\n                    },\n                })\n            ).offset!\n\n        return { ...options, offset }\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\nimport { LRUCache, LRUCacheOptions } from 'typescript-lru-cache'\nimport { ACSKey } from '../../types'\nimport { PaginatedResolvedAcsOptions, ResolvedAcsOptions } from '../../service'\nimport { AbstractLedgerProvider } from '@canton-network/core-provider-ledger'\nimport { LedgerCommonSchemas } from '@canton-network/core-ledger-client-types'\nimport { ACSCache, BaseACSCache, PaginatedACSCache } from '../item'\n\nexport type ACSCacheCollectionOptions = Pick<\n    LRUCacheOptions<string, BaseACSCache>,\n    'maxSize' | 'entryExpirationTimeInMS'\n>\n\nexport abstract class BaseCacheCollection<\n    Cache extends ACSCache | PaginatedACSCache,\n    Options extends ResolvedAcsOptions | PaginatedResolvedAcsOptions =\n        Cache extends ACSCache\n            ? ResolvedAcsOptions\n            : PaginatedResolvedAcsOptions,\n> {\n    private readonly collection: LRUCache<string, Cache>\n\n    constructor(\n        protected readonly ledger: AbstractLedgerProvider,\n        private readonly options: ACSCacheCollectionOptions = {\n            maxSize: 100,\n            entryExpirationTimeInMS: 10 * 60 * 1000,\n        }\n    ) {\n        this.collection = new LRUCache(options)\n    }\n\n    /**\n     * Reads the active contract set from the ledger with caching.\n     * Resolves party references and constructs cache keys from the provided template and interface IDs.\n     * Queries are deduplicated and cached per party-template-interface combination.\n     */\n    public async readFromCache(\n        options: Options\n    ): Promise<LedgerCommonSchemas['JsGetActiveContractsResponse'][]> {\n        const { parties, interfaceIds, templateIds } = options\n        const keys: ACSKey[] =\n            parties?.flatMap((party) => {\n                const withTemplateIds =\n                    templateIds?.map((templateId) => ({ party, templateId })) ??\n                    []\n                const withInterfaceIds =\n                    interfaceIds?.map((interfaceId) => ({\n                        party,\n                        interfaceId,\n                    })) ?? []\n                return [...withInterfaceIds, ...withTemplateIds]\n            }) ?? []\n\n        return await this.query({ options, keys })\n    }\n\n    protected abstract createCache(): Cache\n\n    protected getCache(key: ACSKey) {\n        const serializedKey = this.serializeKey(key)\n        const existingCache = this.collection.get(serializedKey)\n        if (existingCache) return existingCache\n\n        const newCache = this.createCache()\n        this.collection.set(serializedKey, newCache)\n\n        return newCache\n    }\n\n    /**\n     * Updates the cached active contract set for a specific key and returns contracts at the requested offset.\n     * If the cache is outdated, fetches updates from the ledger and applies them incrementally.\n     */\n    private async updateCache(args: {\n        options: ResolvedAcsOptions | PaginatedResolvedAcsOptions\n        key: ACSKey\n    }) {\n        const cache = this.getCache(args.key)\n        await cache.update(args.options)\n        return await cache.calculateAt(args.options.offset)\n    }\n\n    /**\n     * Queries multiple cache keys in parallel and combines the results.\n     * Each key represents a unique party-template-interface combination to be queried independently.\n     */\n    private async query(args: {\n        options: Options\n        keys: ACSKey[]\n    }): Promise<LedgerCommonSchemas['JsGetActiveContractsResponse'][]> {\n        const { options, keys } = args\n        return (\n            await Promise.all(\n                keys.map(\n                    async (key) => await this.updateCache({ options, key })\n                )\n            )\n        ).flat()\n    }\n\n    private serializeKey(key: ACSKey): string {\n        return `${key.party ?? 'ANY'}_T${key.templateId ?? '()'}_I${key.interfaceId ?? '()'}`\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\nimport { BaseCacheCollection } from './base'\nimport { ACSCache, PaginatedACSCache } from '../item'\nimport { ACSKey } from '../../types'\nimport { PaginatedAcsOptions } from '../../service'\nimport { Ops } from '@canton-network/core-provider-ledger'\n\ntype ReadPageFromCacheOptions = ACSKey & Pick<PaginatedAcsOptions, 'pageToken'>\n\nexport class ACSCacheCollection extends BaseCacheCollection<ACSCache> {\n    protected createCache(): ACSCache {\n        return new ACSCache(this.ledger)\n    }\n}\n\nexport class PaginatedACSCacheCollection extends BaseCacheCollection<PaginatedACSCache> {\n    protected createCache(): PaginatedACSCache {\n        return new PaginatedACSCache(this.ledger)\n    }\n\n    /**\n     * Reads a specific page of active contracts from the cache.\n     * Updates the cache to the current ledger offset before returning the page.\n     * @returns The requested page containing active contracts and pagination information\n     */\n    public async readPageFromCache({\n        party,\n        templateId,\n        interfaceId,\n        pageToken = PaginatedACSCache.FIRST_PAGE_TOKEN,\n    }: ReadPageFromCacheOptions) {\n        const cache = this.getCache({\n            party,\n            templateId,\n            interfaceId,\n        })\n\n        const offset = (\n            await this.ledger.request<Ops.GetV2StateLedgerEnd>({\n                method: 'ledgerApi',\n                params: {\n                    requestMethod: 'get',\n                    resource: '/v2/state/ledger-end',\n                },\n            })\n        ).offset\n\n        if (!offset) throw Error('Offset not found')\n\n        await cache.update({\n            parties: party ? [party] : [],\n            templateIds: templateId ? [templateId] : [],\n            interfaceIds: interfaceId ? [interfaceId] : [],\n            pageToken,\n            offset,\n        })\n\n        return cache.getPage(pageToken)\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\nimport { AbstractLedgerProvider } from '@canton-network/core-provider-ledger'\nimport { AcsOptions, PaginatedAcsOptions } from '../service'\nimport { BaseReader } from './base'\nimport {\n    ACSCacheCollection,\n    ACSCacheCollectionOptions,\n    PaginatedACSCacheCollection,\n} from '../cache/collection'\nimport { LedgerCommonSchemas } from '@canton-network/core-ledger-client-types'\n\nfunction isPageResponse(\n    obj: unknown\n): obj is LedgerCommonSchemas['JsGetActiveContractsPageResponse'] {\n    return typeof obj === 'object' && obj !== null && 'activeContracts' in obj\n}\n\nclass RawReader extends BaseReader<AcsOptions> {\n    constructor(\n        protected readonly ledger: AbstractLedgerProvider,\n        protected readonly cacheOptions?: ACSCacheCollectionOptions,\n        private readonly paginated?: boolean\n    ) {\n        super(ledger, cacheOptions)\n    }\n\n    public override async read(\n        options: AcsOptions\n    ): Promise<LedgerCommonSchemas['JsGetActiveContractsResponse'][]> {\n        const resolvedOptions = await this.resolveAcsOptions(options)\n        const output = await (this.paginated\n            ? this.service.getPaginatedActiveContracts(resolvedOptions)\n            : this.service.getActiveContracts(resolvedOptions))\n\n        if (!Array.isArray(output)) {\n            return isPageResponse(output) ? output.activeContracts : []\n        }\n\n        const first = output[0]\n        return first && isPageResponse(first)\n            ? output.flatMap((page) =>\n                  isPageResponse(page) ? page.activeContracts : []\n              )\n            : output\n    }\n\n    protected createCacheCollection() {\n        return this.paginated\n            ? new PaginatedACSCacheCollection(this.ledger, this.cacheOptions)\n            : new ACSCacheCollection(this.ledger, this.cacheOptions)\n    }\n}\n\nclass PaginatedReader extends BaseReader<PaginatedAcsOptions> {\n    public readonly raw: RawReader\n\n    constructor(\n        protected readonly ledger: AbstractLedgerProvider,\n        protected readonly cacheOptions?: ACSCacheCollectionOptions\n    ) {\n        super(ledger, cacheOptions)\n\n        this.raw = new RawReader(ledger, cacheOptions, true)\n    }\n\n    protected createCacheCollection() {\n        return new PaginatedACSCacheCollection(this.ledger, this.cacheOptions)\n    }\n}\n\nexport class ACSReader extends BaseReader<AcsOptions> {\n    public readonly raw: RawReader\n    public readonly paginated: PaginatedReader\n\n    constructor(\n        protected readonly ledger: AbstractLedgerProvider,\n        protected readonly cacheOptions?: ACSCacheCollectionOptions\n    ) {\n        super(ledger, cacheOptions)\n        this.raw = new RawReader(ledger, cacheOptions)\n        this.paginated = new PaginatedReader(ledger, cacheOptions)\n    }\n\n    protected createCacheCollection() {\n        return new ACSCacheCollection(this.ledger, this.cacheOptions)\n    }\n}\n"]}