@interfold/sdk 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,6 +34,7 @@ var import_types = require("@interfold/contracts/types");
34
34
  var InterfoldEventType = /* @__PURE__ */ ((InterfoldEventType2) => {
35
35
  InterfoldEventType2["E3_REQUESTED"] = "E3Requested";
36
36
  InterfoldEventType2["CIPHERTEXT_OUTPUT_PUBLISHED"] = "CiphertextOutputPublished";
37
+ InterfoldEventType2["CIPHERTEXT_OUTPUT_REFERENCE_PUBLISHED"] = "CiphertextOutputReferencePublished";
37
38
  InterfoldEventType2["PLAINTEXT_OUTPUT_PUBLISHED"] = "PlaintextOutputPublished";
38
39
  InterfoldEventType2["E3_PROGRAM_REGISTERED"] = "E3ProgramRegistered";
39
40
  InterfoldEventType2["ENCRYPTION_SCHEME_ENABLED"] = "EncryptionSchemeEnabled";
@@ -49,6 +50,7 @@ var RegistryEventType = /* @__PURE__ */ ((RegistryEventType2) => {
49
50
  RegistryEventType2["COMMITTEE_RANDOMNESS_REQUESTED"] = "CommitteeRandomnessRequested";
50
51
  RegistryEventType2["RANDOMNESS_CIRCUIT_BREAKER_TRIPPED"] = "RandomnessCircuitBreakerTripped";
51
52
  RegistryEventType2["COMMITTEE_PUBLISHED"] = "CommitteePublished";
53
+ RegistryEventType2["COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED"] = "CommitteePublicKeyChunkPublished";
52
54
  RegistryEventType2["COMMITTEE_FINALIZED"] = "SortitionCommitteeFinalized";
53
55
  RegistryEventType2["INTERFOLD_SET"] = "InterfoldSet";
54
56
  RegistryEventType2["OWNERSHIP_TRANSFERRED"] = "OwnershipTransferred";
@@ -101,6 +103,7 @@ var EventListener = class _EventListener {
101
103
  "CommitteeRandomnessRequested" /* COMMITTEE_RANDOMNESS_REQUESTED */,
102
104
  "RandomnessCircuitBreakerTripped" /* RANDOMNESS_CIRCUIT_BREAKER_TRIPPED */,
103
105
  "CommitteePublished" /* COMMITTEE_PUBLISHED */,
106
+ "CommitteePublicKeyChunkPublished" /* COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED */,
104
107
  "SortitionCommitteeFinalized" /* COMMITTEE_FINALIZED */,
105
108
  "InterfoldSet" /* INTERFOLD_SET */
106
109
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/events/index.ts","../../src/events/event-listener.ts","../../src/events/types.ts","../../src/utils.ts"],"sourcesContent":["// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nexport { EventListener } from './event-listener'\nexport type { EventListenerOptions } from './event-listener'\n\nexport { InterfoldEventType, RandomnessProviderEventType, RegistryEventType } from './types'\n\nexport type {\n AllEventTypes,\n InterfoldEvent,\n EventCallback,\n EventFilter,\n SDKEventEmitter,\n EventListenerConfig,\n E3RequestedData,\n E3ActivatedData,\n CiphertextOutputPublishedData,\n PlaintextOutputPublishedData,\n CiphernodeAddedData,\n CiphernodeRemovedData,\n CommitteeRequestedData,\n CommitteeRandomnessRequestedData,\n RandomnessCircuitBreakerTrippedData,\n RandomnessFulfilledData,\n RandomnessProviderEvent,\n RandomnessProviderEventCallback,\n CommitteePublishedData,\n CommitteeFinalizedData,\n InterfoldEventData,\n RegistryEventData,\n} from './types'\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Log, type PublicClient } from 'viem'\nimport { CiphernodeRegistryOwnable__factory, Interfold__factory, IRandomnessProvider__factory } from '@interfold/contracts/types'\n\nimport {\n RegistryEventType,\n type RandomnessProviderEvent,\n type RandomnessProviderEventCallback,\n type RandomnessProviderEventType,\n type AllEventTypes,\n type InterfoldEvent,\n type InterfoldEventData,\n type InterfoldEventType as InterfoldEventTypeT,\n type EventCallback,\n type EventListenerConfig,\n type RegistryEventData,\n type RegistryEventType as RegistryEventTypeT,\n type SDKEventEmitter,\n} from './types'\nimport type { ContractAddresses } from '../contracts/types'\nimport { SDKError, sleep } from '../utils'\n\nexport interface EventListenerOptions {\n publicClient: PublicClient\n contracts: ContractAddresses\n config?: EventListenerConfig\n}\n\nexport class EventListener implements SDKEventEmitter {\n private static readonly DEFAULT_HISTORICAL_BLOCK_RANGE = 10_000n\n private static readonly MAX_REMEMBERED_LOGS = 10_000\n private listeners: Map<AllEventTypes, Set<EventCallback>> = new Map()\n private activeWatchers: Map<string, () => void> = new Map()\n private watcherStartBlocks: Map<string, bigint | undefined> = new Map()\n private randomnessProviderListeners: Map<string, Set<RandomnessProviderEventCallback>> = new Map()\n private seenLiveLogs: Map<string, true> = new Map()\n private isPolling = false\n private lastBlockNumber: bigint = BigInt(0)\n private publicClient: PublicClient\n private contracts: ContractAddresses\n private config: EventListenerConfig\n\n constructor(options: EventListenerOptions) {\n this.publicClient = options.publicClient\n this.contracts = options.contracts\n this.config = options.config || {}\n }\n\n // Registry-exclusive event names that don't collide with InterfoldEventType.\n // Shared names like 'OwnershipTransferred' and 'Initialized' exist in both\n // enums with the same string value, so they cannot be disambiguated at\n // runtime; those default to the Interfold contract.\n private static readonly REGISTRY_ONLY_EVENTS: ReadonlySet<string> = new Set([\n RegistryEventType.COMMITTEE_REQUESTED,\n RegistryEventType.COMMITTEE_RANDOMNESS_REQUESTED,\n RegistryEventType.RANDOMNESS_CIRCUIT_BREAKER_TRIPPED,\n RegistryEventType.COMMITTEE_PUBLISHED,\n RegistryEventType.COMMITTEE_FINALIZED,\n RegistryEventType.INTERFOLD_SET,\n ])\n\n private resolveContract(eventType: AllEventTypes): { address: `0x${string}`; abi: Abi } {\n const isRegistryEvent = EventListener.REGISTRY_ONLY_EVENTS.has(eventType as string)\n return {\n address: isRegistryEvent ? this.contracts.ciphernodeRegistry : this.contracts.interfold,\n abi: isRegistryEvent ? CiphernodeRegistryOwnable__factory.abi : Interfold__factory.abi,\n }\n }\n\n public async onInterfoldEvent<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): Promise<void> {\n const { address, abi } = this.resolveContract(eventType)\n return this.watchContractEvent(address, eventType, abi, callback)\n }\n\n public async onRandomnessProviderEvent<T extends RandomnessProviderEventType>(\n provider: `0x${string}`,\n eventType: T,\n callback: RandomnessProviderEventCallback<T>,\n fromBlock?: bigint,\n ): Promise<void> {\n const listenerKey = `${provider.toLowerCase()}:${eventType}`\n const watcherKey = `randomness-provider:${listenerKey}`\n const requestedStartBlock = fromBlock ?? this.config.fromBlock\n let callbacks = this.randomnessProviderListeners.get(listenerKey)\n if (!callbacks) {\n callbacks = new Set()\n this.randomnessProviderListeners.set(listenerKey, callbacks)\n }\n\n if (this.activeWatchers.has(watcherKey)) {\n const activeStartBlock = this.watcherStartBlocks.get(watcherKey)\n if (fromBlock !== undefined && requestedStartBlock !== activeStartBlock) {\n throw new SDKError(\n `Randomness provider watcher for ${eventType} on ${provider} already starts at ${activeStartBlock ?? 'latest'}; requested ${requestedStartBlock ?? 'latest'}`,\n 'INVALID_EVENT_CONFIG',\n )\n }\n callbacks.add(callback as RandomnessProviderEventCallback)\n return\n }\n\n callbacks.add(callback as RandomnessProviderEventCallback)\n\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address: provider,\n abi: IRandomnessProvider__factory.abi,\n eventName: eventType,\n fromBlock: requestedStartBlock,\n onLogs: (logs: Log[]) => {\n for (const log of logs) {\n if (!this.rememberLiveLog(log)) continue\n const event: RandomnessProviderEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: RandomnessProviderEvent<T>['data'] }).args,\n provider,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? 0n,\n transactionHash: log.transactionHash ?? '0x',\n }\n const currentCallbacks = this.randomnessProviderListeners.get(listenerKey)\n currentCallbacks?.forEach((currentCallback) => {\n try {\n const result = currentCallback(event)\n if (result) {\n void result.catch((error) => {\n console.error(`Error in randomness provider callback for ${eventType}:`, error)\n })\n }\n } catch (error) {\n console.error(`Error in randomness provider callback for ${eventType}:`, error)\n }\n })\n }\n },\n })\n this.activeWatchers.set(watcherKey, unwatch)\n this.watcherStartBlocks.set(watcherKey, requestedStartBlock)\n } catch (error) {\n callbacks.delete(callback as RandomnessProviderEventCallback)\n if (callbacks.size === 0) this.randomnessProviderListeners.delete(listenerKey)\n throw new SDKError(`Failed to watch randomness provider event ${eventType} on ${provider}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n\n public offRandomnessProviderEvent<T extends RandomnessProviderEventType>(\n provider: `0x${string}`,\n eventType: T,\n callback: RandomnessProviderEventCallback<T>,\n ): void {\n const listenerKey = `${provider.toLowerCase()}:${eventType}`\n const callbacks = this.randomnessProviderListeners.get(listenerKey)\n callbacks?.delete(callback as RandomnessProviderEventCallback)\n if (callbacks && callbacks.size === 0) {\n this.randomnessProviderListeners.delete(listenerKey)\n const watcherKey = `randomness-provider:${listenerKey}`\n const unwatch = this.activeWatchers.get(watcherKey)\n if (unwatch) unwatch()\n this.activeWatchers.delete(watcherKey)\n this.watcherStartBlocks.delete(watcherKey)\n }\n }\n\n public async getHistoricalRandomnessProviderEvents(\n provider: `0x${string}`,\n eventType: RandomnessProviderEventType,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n const start = fromBlock ?? this.config.fromBlock\n if (start === undefined) {\n throw new SDKError('Randomness provider history requires fromBlock or EventListenerConfig.fromBlock', 'INVALID_EVENT_CONFIG')\n }\n try {\n return await this.getHistoricalContractEvents(provider, IRandomnessProvider__factory.abi, eventType, start, toBlock)\n } catch (error) {\n throw new SDKError(`Failed to get randomness provider events from ${provider}: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n public async once<T extends AllEventTypes>(type: T, callback: EventCallback<T>): Promise<void> {\n const handler: EventCallback<T> = (event) => {\n this.off(type, handler)\n const prom = callback(event)\n if (prom) {\n prom.catch((e) => console.error(e))\n }\n }\n return this.onInterfoldEvent(type, handler)\n }\n\n public async watchContractEvent<T extends AllEventTypes>(\n address: `0x${string}`,\n eventType: T,\n abi: Abi,\n callback: EventCallback<T>,\n ): Promise<void> {\n const watcherKey = `${address}:${eventType}`\n\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const emitter = this\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: this.config.fromBlock,\n onLogs(logs: Log[]) {\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i]\n if (!log) break\n if (!emitter.rememberLiveLog(log)) continue\n const event: InterfoldEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: unknown }).args as T extends InterfoldEventTypeT\n ? InterfoldEventData[T]\n : T extends RegistryEventTypeT\n ? RegistryEventData[T]\n : unknown,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? BigInt(0),\n transactionHash: log.transactionHash ?? '0x',\n }\n emitter.emit(event)\n }\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch contract event ${eventType} on ${address}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n }\n\n public async watchLogs(address: `0x${string}`, callback: (log: Log) => void): Promise<void> {\n const watcherKey = `logs:${address}`\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchEvent({\n address,\n onLogs: (logs: Log[]) => {\n logs.forEach((log: Log) => {\n callback(log)\n })\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch logs for address ${address}: ${error}`, 'WATCH_LOGS_FAILED')\n }\n }\n }\n\n public async startPolling(): Promise<void> {\n if (this.isPolling) return\n\n this.isPolling = true\n\n try {\n this.lastBlockNumber = await this.publicClient.getBlockNumber()\n void this.pollForEvents()\n } catch (error) {\n this.isPolling = false\n throw new SDKError(`Failed to start polling: ${error}`, 'POLLING_START_FAILED')\n }\n }\n\n public stopPolling(): void {\n this.isPolling = false\n }\n\n public async getHistoricalEvents(eventType: AllEventTypes, fromBlock?: bigint, toBlock?: bigint): Promise<Log[]> {\n const { address, abi } = this.resolveContract(eventType)\n\n try {\n return await this.getHistoricalContractEvents(address, abi, eventType as string, fromBlock, toBlock)\n } catch (error) {\n throw new SDKError(`Failed to get historical events: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n public on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n }\n\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n const callbacks = this.listeners.get(eventType)\n if (callbacks) {\n callbacks.delete(callback as EventCallback)\n if (callbacks.size === 0) {\n this.listeners.delete(eventType)\n const watchersToRemove: string[] = []\n this.activeWatchers.forEach((unwatch, key) => {\n if (key.endsWith(`:${eventType}`)) {\n try {\n unwatch()\n } catch (error) {\n console.error(`Error unwatching event ${eventType}:`, error)\n }\n watchersToRemove.push(key)\n }\n })\n watchersToRemove.forEach((key) => this.activeWatchers.delete(key))\n }\n }\n }\n\n public emit<T extends AllEventTypes>(event: InterfoldEvent<T>): void {\n const callbacks = this.listeners.get(event.type)\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n const result = (callback as EventCallback<T>)(event)\n if (result) {\n void result.catch((error) => {\n console.error(`Error in event callback for ${event.type}:`, error)\n })\n }\n } catch (error) {\n console.error(`Error in event callback for ${event.type}:`, error)\n }\n })\n }\n }\n\n public cleanup(): void {\n this.stopPolling()\n\n this.activeWatchers.forEach((unwatch) => {\n try {\n unwatch()\n } catch (error) {\n console.error('Error unwatching during cleanup:', error)\n }\n })\n this.activeWatchers.clear()\n this.watcherStartBlocks.clear()\n this.listeners.clear()\n this.randomnessProviderListeners.clear()\n this.seenLiveLogs.clear()\n }\n\n private logIdentity(log: Log): string | undefined {\n if (log.blockHash && log.transactionHash && log.logIndex !== null && log.logIndex !== undefined) {\n return `${log.blockHash}:${log.transactionHash}:${log.logIndex}:${Boolean(log.removed)}`\n }\n return undefined\n }\n\n private rememberLiveLog(log: Log): boolean {\n const identity = this.logIdentity(log)\n if (!identity) return true\n if (this.seenLiveLogs.has(identity)) return false\n\n this.seenLiveLogs.set(identity, true)\n if (this.seenLiveLogs.size > EventListener.MAX_REMEMBERED_LOGS) {\n const oldest = this.seenLiveLogs.keys().next().value\n if (oldest !== undefined) this.seenLiveLogs.delete(oldest)\n }\n return true\n }\n\n private async getHistoricalContractEvents(\n address: `0x${string}`,\n abi: Abi,\n eventName: string,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n const start = fromBlock ?? this.config.fromBlock\n const configuredEnd = toBlock ?? this.config.toBlock\n if (start === undefined) {\n return (await this.publicClient.getContractEvents({\n address,\n abi,\n eventName,\n toBlock: configuredEnd,\n })) as Log[]\n }\n\n const end = configuredEnd ?? (await this.publicClient.getBlockNumber({ cacheTime: 0 }))\n if (end < start) return []\n\n const range = this.config.historicalBlockRange ?? EventListener.DEFAULT_HISTORICAL_BLOCK_RANGE\n if (range <= 0n) throw new SDKError('Historical block range must be greater than zero', 'INVALID_EVENT_CONFIG')\n\n const logs: Log[] = []\n const seen = new Set<string>()\n for (let cursor = start; cursor <= end; cursor += range) {\n const chunkEnd = cursor + range - 1n < end ? cursor + range - 1n : end\n const chunk = (await this.publicClient.getContractEvents({\n address,\n abi,\n eventName,\n fromBlock: cursor,\n toBlock: chunkEnd,\n })) as Log[]\n for (const log of chunk) {\n const identity = this.logIdentity(log)\n if (identity && seen.has(identity)) continue\n if (identity) {\n seen.add(identity)\n this.rememberLiveLog(log)\n }\n logs.push(log)\n }\n }\n return logs\n }\n\n private async pollForEvents(): Promise<void> {\n while (this.isPolling) {\n try {\n const currentBlock = await this.publicClient.getBlockNumber()\n\n if (currentBlock > this.lastBlockNumber) {\n this.lastBlockNumber = currentBlock\n }\n\n await sleep(this.config.pollingInterval || 5000)\n } catch (error) {\n console.error('Error during polling:', error)\n await sleep(this.config.pollingInterval || 5000)\n }\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport type { Log } from 'viem'\n\nexport enum InterfoldEventType {\n E3_REQUESTED = 'E3Requested',\n CIPHERTEXT_OUTPUT_PUBLISHED = 'CiphertextOutputPublished',\n PLAINTEXT_OUTPUT_PUBLISHED = 'PlaintextOutputPublished',\n E3_PROGRAM_REGISTERED = 'E3ProgramRegistered',\n ENCRYPTION_SCHEME_ENABLED = 'EncryptionSchemeEnabled',\n CIPHERNODE_REGISTRY_SET = 'CiphernodeRegistrySet',\n MAX_DURATION_SET = 'MaxDurationSet',\n PARAM_SET_REGISTERED = 'ParamSetRegistered',\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RegistryEventType {\n COMMITTEE_REQUESTED = 'CommitteeRequested',\n COMMITTEE_RANDOMNESS_REQUESTED = 'CommitteeRandomnessRequested',\n RANDOMNESS_CIRCUIT_BREAKER_TRIPPED = 'RandomnessCircuitBreakerTripped',\n COMMITTEE_PUBLISHED = 'CommitteePublished',\n COMMITTEE_FINALIZED = 'SortitionCommitteeFinalized',\n INTERFOLD_SET = 'InterfoldSet',\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RandomnessProviderEventType {\n RANDOMNESS_FULFILLED = 'RandomnessFulfilled',\n}\n\nexport type AllEventTypes = InterfoldEventType | RegistryEventType\n\nexport interface E3RequestedData {\n e3Id: bigint\n e3: {\n seed: bigint\n committeeSize: number\n requestBlock: bigint\n inputWindow: readonly [bigint, bigint]\n encryptionSchemeId: string\n e3Program: string\n paramSet: number\n decryptionVerifier: string\n committeePublicKey: string\n ciphertextOutput: string\n ciphertextCommitment: string\n plaintextOutput: string\n }\n cryptoConfigId: string\n}\n\nexport interface E3ActivatedData {\n e3Id: bigint\n expiration: bigint\n committeePublicKey: string\n}\n\nexport interface CiphertextOutputPublishedData {\n e3Id: bigint\n ciphertextOutput: string\n ciphertextCommitment: string\n}\n\nexport interface PlaintextOutputPublishedData {\n e3Id: bigint\n plaintextOutput: string\n proof: string\n}\n\nexport interface CiphernodeAddedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CiphernodeRemovedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CommitteeRequestedData {\n e3Id: bigint\n entropyBlock: bigint\n threshold: [bigint, bigint]\n requestBlock: bigint\n committeeDeadline: bigint\n ticketPrice: bigint\n}\n\nexport interface CommitteeRandomnessRequestedData {\n e3Id: bigint\n requestId: bigint\n provider: string\n randomnessDeadline: bigint\n}\n\nexport interface RandomnessCircuitBreakerTrippedData {\n e3Id: bigint\n requestId: bigint\n randomnessProvider: string\n}\n\nexport interface RandomnessFulfilledData {\n requestId: bigint\n e3Id: bigint\n randomWord: bigint\n fulfilledAt: bigint\n}\n\nexport interface CommitteePublishedData {\n e3Id: bigint\n nodes: string[]\n publicKey: string\n pkCommitment: string\n proof: string\n}\n\nexport interface CommitteeFinalizedData {\n e3Id: bigint\n committee: string[]\n scores: bigint[]\n}\n\nexport interface InterfoldEventData {\n [InterfoldEventType.E3_REQUESTED]: E3RequestedData\n [InterfoldEventType.CIPHERTEXT_OUTPUT_PUBLISHED]: CiphertextOutputPublishedData\n [InterfoldEventType.PLAINTEXT_OUTPUT_PUBLISHED]: PlaintextOutputPublishedData\n [InterfoldEventType.E3_PROGRAM_REGISTERED]: { e3Program: string }\n [InterfoldEventType.ENCRYPTION_SCHEME_ENABLED]: { encryptionSchemeId: string }\n [InterfoldEventType.CIPHERNODE_REGISTRY_SET]: { ciphernodeRegistry: string }\n [InterfoldEventType.MAX_DURATION_SET]: { maxDuration: bigint }\n [InterfoldEventType.PARAM_SET_REGISTERED]: { paramSet: number; encodedParams: string }\n [InterfoldEventType.OWNERSHIP_TRANSFERRED]: { previousOwner: string; newOwner: string }\n [InterfoldEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface RegistryEventData {\n [RegistryEventType.COMMITTEE_REQUESTED]: CommitteeRequestedData\n [RegistryEventType.COMMITTEE_RANDOMNESS_REQUESTED]: CommitteeRandomnessRequestedData\n [RegistryEventType.RANDOMNESS_CIRCUIT_BREAKER_TRIPPED]: RandomnessCircuitBreakerTrippedData\n [RegistryEventType.COMMITTEE_PUBLISHED]: CommitteePublishedData\n [RegistryEventType.COMMITTEE_FINALIZED]: CommitteeFinalizedData\n [RegistryEventType.INTERFOLD_SET]: { interfold: string }\n [RegistryEventType.OWNERSHIP_TRANSFERRED]: { previousOwner: string; newOwner: string }\n [RegistryEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface InterfoldEvent<T extends AllEventTypes> {\n type: T\n data: T extends InterfoldEventType ? InterfoldEventData[T] : T extends RegistryEventType ? RegistryEventData[T] : unknown\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport interface RandomnessProviderEvent<T extends RandomnessProviderEventType = RandomnessProviderEventType> {\n type: T\n data: RandomnessFulfilledData\n provider: `0x${string}`\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport type RandomnessProviderEventCallback<T extends RandomnessProviderEventType = RandomnessProviderEventType> = (\n event: RandomnessProviderEvent<T>,\n) => void | Promise<void>\n\nexport type EventCallback<T extends AllEventTypes = AllEventTypes> = (event: InterfoldEvent<T>) => void | Promise<void>\n\nexport interface EventFilter<T = unknown> {\n address?: `0x${string}`\n fromBlock?: bigint\n toBlock?: bigint\n args?: Partial<T>\n}\n\nexport interface SDKEventEmitter {\n on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n emit<T extends AllEventTypes>(event: InterfoldEvent<T>): void\n}\n\nexport interface EventListenerConfig {\n fromBlock?: bigint\n toBlock?: bigint\n /** Maximum block span for each historical RPC query. */\n historicalBlockRange?: bigint\n polling?: boolean\n pollingInterval?: number\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Address, type Hash, type Log, PublicClient, encodeAbiParameters } from 'viem'\nimport type { BfvParams } from './types'\n\nexport class SDKError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message)\n this.name = 'SDKError'\n }\n}\n\nexport function isValidAddress(address: string): address is Address {\n return /^0x[a-fA-F0-9]{40}$/.test(address)\n}\n\nexport function isValidHash(hash: string): hash is Hash {\n return /^0x[a-fA-F0-9]{64}$/.test(hash)\n}\n\nexport function formatEventName(contractName: string, eventName: string): string {\n return `${contractName}.${eventName}`\n}\n\nexport function parseEventData<T>(log: Log): T {\n return log.data as unknown as T\n}\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport const sleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function formatBigInt(value: bigint): string {\n return value.toString()\n}\n\nexport function parseBigInt(value: string): bigint {\n return BigInt(value)\n}\n\nexport function generateEventId(log: Log): string {\n return `${log.blockHash}-${log.logIndex}`\n}\n\n/**\n * Get the current timestamp in seconds\n * from onchain\n * @param publicClient - The public client to use\n */\nexport async function getCurrentTimestamp(publicClient: PublicClient): Promise<bigint> {\n const block = await publicClient.getBlock()\n return block.timestamp\n}\n\n// Compute provider parameters structure\nexport interface ComputeProviderParams {\n name: string\n parallel: boolean\n batch_size: number\n}\n\n// Default compute provider configuration\nexport const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = {\n name: 'risc0',\n parallel: false,\n batch_size: 2,\n}\n\n// Default E3 configuration (`committeeSize` is `IInterfold.CommitteeSize`, not circuit N_PARTIES).\nexport const DEFAULT_E3_CONFIG = {\n committeeSize: 0, // CommitteeSize.Minimum\n duration: 1800, // 30 minutes in seconds\n payment_amount: '0', // 0 ETH in wei\n} as const\n\n/**\n * Encode BFV parameters for the smart contract\n * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption\n */\nexport function encodeBfvParams(params: BfvParams): `0x${string}` {\n const { degree, plaintextModulus, moduli, error1Variance } = params\n\n if (error1Variance === undefined) {\n throw new SDKError(\n 'error1Variance is required in ProtocolParams. All BFV parameter sets must specify error1_variance.',\n 'MISSING_ERROR1_VARIANCE',\n )\n }\n\n return encodeAbiParameters(\n [\n {\n name: 'bfvParams',\n type: 'tuple',\n components: [\n { name: 'degree', type: 'uint256' },\n { name: 'plaintext_modulus', type: 'uint256' },\n { name: 'moduli', type: 'uint256[]' },\n { name: 'error1_variance', type: 'string' },\n ],\n },\n ],\n [\n {\n degree: BigInt(degree),\n plaintext_modulus: BigInt(plaintextModulus),\n moduli: [...moduli],\n error1_variance: error1Variance,\n },\n ],\n )\n}\n\n/**\n * Encode compute provider parameters for the smart contract'\n * If mock is true, the compute provider parameters will return 32 bytes of 0x00\n */\nexport function encodeComputeProviderParams(params: ComputeProviderParams, mock: boolean = false): `0x${string}` {\n if (mock) {\n return `0x${'00'.repeat(32)}` as `0x${string}`\n }\n\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Encode custom parameters for the smart contract.\n */\nexport function encodeCustomParams(params: Record<string, unknown>): `0x${string}` {\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n// inputWindow[0] is always larger than now and dkg deadline\nexport const inputWindowStartBuffer = 15n\n\n/**\n * Calculate start window for E3 request\n * @dev This function can be used for testing purposes, or for E3s which need to start as soon as possible.\n * @param publicClient - The public client to use\n * @param duration - The duration of the input window in seconds\n * @param startBuffer - Buffer in seconds added to current timestamp for input window start\n */\nexport async function calculateInputWindow(\n publicClient: PublicClient,\n duration: number = DEFAULT_E3_CONFIG.duration,\n startBuffer: bigint = inputWindowStartBuffer,\n): Promise<[bigint, bigint]> {\n const now = await getCurrentTimestamp(publicClient)\n return [BigInt(now) + startBuffer, BigInt(now) + startBuffer + BigInt(duration)]\n}\n\n/**\n * Decode plaintextOutput bytes to get the actual result number\n */\nexport function decodePlaintextOutput(plaintextOutput: string): number | null {\n try {\n // Remove '0x' prefix if present\n const hex = plaintextOutput.startsWith('0x') ? plaintextOutput.slice(2) : plaintextOutput\n\n // Convert hex to bytes\n const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [])\n\n if (bytes.length < 8) {\n console.warn('Plaintext output too short for u64 decoding')\n return null\n }\n\n // Decode first u64 (8 bytes) as little-endian\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const result = view.getBigUint64(0, true) // true for little-endian\n\n return Number(result)\n } catch (error) {\n console.error('Failed to decode plaintext output:', error)\n return null\n }\n}\n\n// Helper function to convert proof bytes to field elements\nexport function proofToFields(proof: Uint8Array): string[] {\n const fields: string[] = []\n for (let i = 0; i < proof.length; i += 32) {\n const chunk = proof.slice(i, i + 32)\n fields.push('0x' + Buffer.from(chunk).toString('hex'))\n }\n return fields\n}\n"],"mappings":"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","names":["InterfoldEventType","RegistryEventType","RandomnessProviderEventType"]}
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/events/event-listener.ts","../../src/events/types.ts","../../src/utils.ts"],"sourcesContent":["// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nexport { EventListener } from './event-listener'\nexport type { EventListenerOptions } from './event-listener'\n\nexport { InterfoldEventType, RandomnessProviderEventType, RegistryEventType } from './types'\n\nexport type {\n AllEventTypes,\n InterfoldEvent,\n EventCallback,\n EventFilter,\n SDKEventEmitter,\n EventListenerConfig,\n E3RequestedData,\n E3ActivatedData,\n CiphertextOutputPublishedData,\n CiphertextOutputReferencePublishedData,\n PlaintextOutputPublishedData,\n CiphernodeAddedData,\n CiphernodeRemovedData,\n CommitteeRequestedData,\n CommitteeRandomnessRequestedData,\n RandomnessCircuitBreakerTrippedData,\n RandomnessFulfilledData,\n RandomnessProviderEvent,\n RandomnessProviderEventCallback,\n CommitteePublishedData,\n CommitteePublicKeyChunkPublishedData,\n CommitteeFinalizedData,\n InterfoldEventData,\n RegistryEventData,\n} from './types'\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Log, type PublicClient } from 'viem'\nimport { CiphernodeRegistryOwnable__factory, Interfold__factory, IRandomnessProvider__factory } from '@interfold/contracts/types'\n\nimport {\n RegistryEventType,\n type RandomnessProviderEvent,\n type RandomnessProviderEventCallback,\n type RandomnessProviderEventType,\n type AllEventTypes,\n type InterfoldEvent,\n type InterfoldEventData,\n type InterfoldEventType as InterfoldEventTypeT,\n type EventCallback,\n type EventListenerConfig,\n type RegistryEventData,\n type RegistryEventType as RegistryEventTypeT,\n type SDKEventEmitter,\n} from './types'\nimport type { ContractAddresses } from '../contracts/types'\nimport { SDKError, sleep } from '../utils'\n\nexport interface EventListenerOptions {\n publicClient: PublicClient\n contracts: ContractAddresses\n config?: EventListenerConfig\n}\n\nexport class EventListener implements SDKEventEmitter {\n private static readonly DEFAULT_HISTORICAL_BLOCK_RANGE = 10_000n\n private static readonly MAX_REMEMBERED_LOGS = 10_000\n private listeners: Map<AllEventTypes, Set<EventCallback>> = new Map()\n private activeWatchers: Map<string, () => void> = new Map()\n private watcherStartBlocks: Map<string, bigint | undefined> = new Map()\n private randomnessProviderListeners: Map<string, Set<RandomnessProviderEventCallback>> = new Map()\n private seenLiveLogs: Map<string, true> = new Map()\n private isPolling = false\n private lastBlockNumber: bigint = BigInt(0)\n private publicClient: PublicClient\n private contracts: ContractAddresses\n private config: EventListenerConfig\n\n constructor(options: EventListenerOptions) {\n this.publicClient = options.publicClient\n this.contracts = options.contracts\n this.config = options.config || {}\n }\n\n // Registry-exclusive event names that don't collide with InterfoldEventType.\n // Shared names like 'OwnershipTransferred' and 'Initialized' exist in both\n // enums with the same string value, so they cannot be disambiguated at\n // runtime; those default to the Interfold contract.\n private static readonly REGISTRY_ONLY_EVENTS: ReadonlySet<string> = new Set([\n RegistryEventType.COMMITTEE_REQUESTED,\n RegistryEventType.COMMITTEE_RANDOMNESS_REQUESTED,\n RegistryEventType.RANDOMNESS_CIRCUIT_BREAKER_TRIPPED,\n RegistryEventType.COMMITTEE_PUBLISHED,\n RegistryEventType.COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED,\n RegistryEventType.COMMITTEE_FINALIZED,\n RegistryEventType.INTERFOLD_SET,\n ])\n\n private resolveContract(eventType: AllEventTypes): { address: `0x${string}`; abi: Abi } {\n const isRegistryEvent = EventListener.REGISTRY_ONLY_EVENTS.has(eventType as string)\n return {\n address: isRegistryEvent ? this.contracts.ciphernodeRegistry : this.contracts.interfold,\n abi: isRegistryEvent ? CiphernodeRegistryOwnable__factory.abi : Interfold__factory.abi,\n }\n }\n\n public async onInterfoldEvent<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): Promise<void> {\n const { address, abi } = this.resolveContract(eventType)\n return this.watchContractEvent(address, eventType, abi, callback)\n }\n\n public async onRandomnessProviderEvent<T extends RandomnessProviderEventType>(\n provider: `0x${string}`,\n eventType: T,\n callback: RandomnessProviderEventCallback<T>,\n fromBlock?: bigint,\n ): Promise<void> {\n const listenerKey = `${provider.toLowerCase()}:${eventType}`\n const watcherKey = `randomness-provider:${listenerKey}`\n const requestedStartBlock = fromBlock ?? this.config.fromBlock\n let callbacks = this.randomnessProviderListeners.get(listenerKey)\n if (!callbacks) {\n callbacks = new Set()\n this.randomnessProviderListeners.set(listenerKey, callbacks)\n }\n\n if (this.activeWatchers.has(watcherKey)) {\n const activeStartBlock = this.watcherStartBlocks.get(watcherKey)\n if (fromBlock !== undefined && requestedStartBlock !== activeStartBlock) {\n throw new SDKError(\n `Randomness provider watcher for ${eventType} on ${provider} already starts at ${activeStartBlock ?? 'latest'}; requested ${requestedStartBlock ?? 'latest'}`,\n 'INVALID_EVENT_CONFIG',\n )\n }\n callbacks.add(callback as RandomnessProviderEventCallback)\n return\n }\n\n callbacks.add(callback as RandomnessProviderEventCallback)\n\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address: provider,\n abi: IRandomnessProvider__factory.abi,\n eventName: eventType,\n fromBlock: requestedStartBlock,\n onLogs: (logs: Log[]) => {\n for (const log of logs) {\n if (!this.rememberLiveLog(log)) continue\n const event: RandomnessProviderEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: RandomnessProviderEvent<T>['data'] }).args,\n provider,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? 0n,\n transactionHash: log.transactionHash ?? '0x',\n }\n const currentCallbacks = this.randomnessProviderListeners.get(listenerKey)\n currentCallbacks?.forEach((currentCallback) => {\n try {\n const result = currentCallback(event)\n if (result) {\n void result.catch((error) => {\n console.error(`Error in randomness provider callback for ${eventType}:`, error)\n })\n }\n } catch (error) {\n console.error(`Error in randomness provider callback for ${eventType}:`, error)\n }\n })\n }\n },\n })\n this.activeWatchers.set(watcherKey, unwatch)\n this.watcherStartBlocks.set(watcherKey, requestedStartBlock)\n } catch (error) {\n callbacks.delete(callback as RandomnessProviderEventCallback)\n if (callbacks.size === 0) this.randomnessProviderListeners.delete(listenerKey)\n throw new SDKError(`Failed to watch randomness provider event ${eventType} on ${provider}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n\n public offRandomnessProviderEvent<T extends RandomnessProviderEventType>(\n provider: `0x${string}`,\n eventType: T,\n callback: RandomnessProviderEventCallback<T>,\n ): void {\n const listenerKey = `${provider.toLowerCase()}:${eventType}`\n const callbacks = this.randomnessProviderListeners.get(listenerKey)\n callbacks?.delete(callback as RandomnessProviderEventCallback)\n if (callbacks && callbacks.size === 0) {\n this.randomnessProviderListeners.delete(listenerKey)\n const watcherKey = `randomness-provider:${listenerKey}`\n const unwatch = this.activeWatchers.get(watcherKey)\n if (unwatch) unwatch()\n this.activeWatchers.delete(watcherKey)\n this.watcherStartBlocks.delete(watcherKey)\n }\n }\n\n public async getHistoricalRandomnessProviderEvents(\n provider: `0x${string}`,\n eventType: RandomnessProviderEventType,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n const start = fromBlock ?? this.config.fromBlock\n if (start === undefined) {\n throw new SDKError('Randomness provider history requires fromBlock or EventListenerConfig.fromBlock', 'INVALID_EVENT_CONFIG')\n }\n try {\n return await this.getHistoricalContractEvents(provider, IRandomnessProvider__factory.abi, eventType, start, toBlock)\n } catch (error) {\n throw new SDKError(`Failed to get randomness provider events from ${provider}: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n public async once<T extends AllEventTypes>(type: T, callback: EventCallback<T>): Promise<void> {\n const handler: EventCallback<T> = (event) => {\n this.off(type, handler)\n const prom = callback(event)\n if (prom) {\n prom.catch((e) => console.error(e))\n }\n }\n return this.onInterfoldEvent(type, handler)\n }\n\n public async watchContractEvent<T extends AllEventTypes>(\n address: `0x${string}`,\n eventType: T,\n abi: Abi,\n callback: EventCallback<T>,\n ): Promise<void> {\n const watcherKey = `${address}:${eventType}`\n\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const emitter = this\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: this.config.fromBlock,\n onLogs(logs: Log[]) {\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i]\n if (!log) break\n if (!emitter.rememberLiveLog(log)) continue\n const event: InterfoldEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: unknown }).args as T extends InterfoldEventTypeT\n ? InterfoldEventData[T]\n : T extends RegistryEventTypeT\n ? RegistryEventData[T]\n : unknown,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? BigInt(0),\n transactionHash: log.transactionHash ?? '0x',\n }\n emitter.emit(event)\n }\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch contract event ${eventType} on ${address}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n }\n\n public async watchLogs(address: `0x${string}`, callback: (log: Log) => void): Promise<void> {\n const watcherKey = `logs:${address}`\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchEvent({\n address,\n onLogs: (logs: Log[]) => {\n logs.forEach((log: Log) => {\n callback(log)\n })\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch logs for address ${address}: ${error}`, 'WATCH_LOGS_FAILED')\n }\n }\n }\n\n public async startPolling(): Promise<void> {\n if (this.isPolling) return\n\n this.isPolling = true\n\n try {\n this.lastBlockNumber = await this.publicClient.getBlockNumber()\n void this.pollForEvents()\n } catch (error) {\n this.isPolling = false\n throw new SDKError(`Failed to start polling: ${error}`, 'POLLING_START_FAILED')\n }\n }\n\n public stopPolling(): void {\n this.isPolling = false\n }\n\n public async getHistoricalEvents(eventType: AllEventTypes, fromBlock?: bigint, toBlock?: bigint): Promise<Log[]> {\n const { address, abi } = this.resolveContract(eventType)\n\n try {\n return await this.getHistoricalContractEvents(address, abi, eventType as string, fromBlock, toBlock)\n } catch (error) {\n throw new SDKError(`Failed to get historical events: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n public on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n }\n\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n const callbacks = this.listeners.get(eventType)\n if (callbacks) {\n callbacks.delete(callback as EventCallback)\n if (callbacks.size === 0) {\n this.listeners.delete(eventType)\n const watchersToRemove: string[] = []\n this.activeWatchers.forEach((unwatch, key) => {\n if (key.endsWith(`:${eventType}`)) {\n try {\n unwatch()\n } catch (error) {\n console.error(`Error unwatching event ${eventType}:`, error)\n }\n watchersToRemove.push(key)\n }\n })\n watchersToRemove.forEach((key) => this.activeWatchers.delete(key))\n }\n }\n }\n\n public emit<T extends AllEventTypes>(event: InterfoldEvent<T>): void {\n const callbacks = this.listeners.get(event.type)\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n const result = (callback as EventCallback<T>)(event)\n if (result) {\n void result.catch((error) => {\n console.error(`Error in event callback for ${event.type}:`, error)\n })\n }\n } catch (error) {\n console.error(`Error in event callback for ${event.type}:`, error)\n }\n })\n }\n }\n\n public cleanup(): void {\n this.stopPolling()\n\n this.activeWatchers.forEach((unwatch) => {\n try {\n unwatch()\n } catch (error) {\n console.error('Error unwatching during cleanup:', error)\n }\n })\n this.activeWatchers.clear()\n this.watcherStartBlocks.clear()\n this.listeners.clear()\n this.randomnessProviderListeners.clear()\n this.seenLiveLogs.clear()\n }\n\n private logIdentity(log: Log): string | undefined {\n if (log.blockHash && log.transactionHash && log.logIndex !== null && log.logIndex !== undefined) {\n return `${log.blockHash}:${log.transactionHash}:${log.logIndex}:${Boolean(log.removed)}`\n }\n return undefined\n }\n\n private rememberLiveLog(log: Log): boolean {\n const identity = this.logIdentity(log)\n if (!identity) return true\n if (this.seenLiveLogs.has(identity)) return false\n\n this.seenLiveLogs.set(identity, true)\n if (this.seenLiveLogs.size > EventListener.MAX_REMEMBERED_LOGS) {\n const oldest = this.seenLiveLogs.keys().next().value\n if (oldest !== undefined) this.seenLiveLogs.delete(oldest)\n }\n return true\n }\n\n private async getHistoricalContractEvents(\n address: `0x${string}`,\n abi: Abi,\n eventName: string,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n const start = fromBlock ?? this.config.fromBlock\n const configuredEnd = toBlock ?? this.config.toBlock\n if (start === undefined) {\n return (await this.publicClient.getContractEvents({\n address,\n abi,\n eventName,\n toBlock: configuredEnd,\n })) as Log[]\n }\n\n const end = configuredEnd ?? (await this.publicClient.getBlockNumber({ cacheTime: 0 }))\n if (end < start) return []\n\n const range = this.config.historicalBlockRange ?? EventListener.DEFAULT_HISTORICAL_BLOCK_RANGE\n if (range <= 0n) throw new SDKError('Historical block range must be greater than zero', 'INVALID_EVENT_CONFIG')\n\n const logs: Log[] = []\n const seen = new Set<string>()\n for (let cursor = start; cursor <= end; cursor += range) {\n const chunkEnd = cursor + range - 1n < end ? cursor + range - 1n : end\n const chunk = (await this.publicClient.getContractEvents({\n address,\n abi,\n eventName,\n fromBlock: cursor,\n toBlock: chunkEnd,\n })) as Log[]\n for (const log of chunk) {\n const identity = this.logIdentity(log)\n if (identity && seen.has(identity)) continue\n if (identity) {\n seen.add(identity)\n this.rememberLiveLog(log)\n }\n logs.push(log)\n }\n }\n return logs\n }\n\n private async pollForEvents(): Promise<void> {\n while (this.isPolling) {\n try {\n const currentBlock = await this.publicClient.getBlockNumber()\n\n if (currentBlock > this.lastBlockNumber) {\n this.lastBlockNumber = currentBlock\n }\n\n await sleep(this.config.pollingInterval || 5000)\n } catch (error) {\n console.error('Error during polling:', error)\n await sleep(this.config.pollingInterval || 5000)\n }\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport type { Log } from 'viem'\n\nexport enum InterfoldEventType {\n E3_REQUESTED = 'E3Requested',\n CIPHERTEXT_OUTPUT_PUBLISHED = 'CiphertextOutputPublished',\n CIPHERTEXT_OUTPUT_REFERENCE_PUBLISHED = 'CiphertextOutputReferencePublished',\n PLAINTEXT_OUTPUT_PUBLISHED = 'PlaintextOutputPublished',\n E3_PROGRAM_REGISTERED = 'E3ProgramRegistered',\n ENCRYPTION_SCHEME_ENABLED = 'EncryptionSchemeEnabled',\n CIPHERNODE_REGISTRY_SET = 'CiphernodeRegistrySet',\n MAX_DURATION_SET = 'MaxDurationSet',\n PARAM_SET_REGISTERED = 'ParamSetRegistered',\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RegistryEventType {\n COMMITTEE_REQUESTED = 'CommitteeRequested',\n COMMITTEE_RANDOMNESS_REQUESTED = 'CommitteeRandomnessRequested',\n RANDOMNESS_CIRCUIT_BREAKER_TRIPPED = 'RandomnessCircuitBreakerTripped',\n COMMITTEE_PUBLISHED = 'CommitteePublished',\n COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED = 'CommitteePublicKeyChunkPublished',\n COMMITTEE_FINALIZED = 'SortitionCommitteeFinalized',\n INTERFOLD_SET = 'InterfoldSet',\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RandomnessProviderEventType {\n RANDOMNESS_FULFILLED = 'RandomnessFulfilled',\n}\n\nexport type AllEventTypes = InterfoldEventType | RegistryEventType\n\nexport interface E3RequestedData {\n e3Id: bigint\n e3: {\n seed: bigint\n committeeSize: number\n requestBlock: bigint\n inputWindow: readonly [bigint, bigint]\n encryptionSchemeId: string\n e3Program: string\n paramSet: number\n decryptionVerifier: string\n committeePublicKey: string\n ciphertextOutput: string\n ciphertextCommitment: string\n plaintextOutput: string\n }\n cryptoConfigId: string\n}\n\nexport interface E3ActivatedData {\n e3Id: bigint\n expiration: bigint\n committeePublicKey: string\n}\n\nexport interface CiphertextOutputPublishedData {\n e3Id: bigint\n ciphertextOutput: string\n ciphertextCommitment: string\n}\n\nexport interface CiphertextOutputReferencePublishedData {\n e3Id: bigint\n contentHash: string\n ciphertextCommitment: string\n availabilityBlock: number\n availabilityLeafIndex: bigint\n}\n\nexport interface PlaintextOutputPublishedData {\n e3Id: bigint\n plaintextOutput: string\n proof: string\n}\n\nexport interface CiphernodeAddedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CiphernodeRemovedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CommitteeRequestedData {\n e3Id: bigint\n entropyBlock: bigint\n threshold: [bigint, bigint]\n requestBlock: bigint\n committeeDeadline: bigint\n ticketPrice: bigint\n}\n\nexport interface CommitteeRandomnessRequestedData {\n e3Id: bigint\n requestId: bigint\n provider: string\n randomnessDeadline: bigint\n}\n\nexport interface RandomnessCircuitBreakerTrippedData {\n e3Id: bigint\n requestId: bigint\n randomnessProvider: string\n}\n\nexport interface RandomnessFulfilledData {\n requestId: bigint\n e3Id: bigint\n randomWord: bigint\n fulfilledAt: bigint\n}\n\nexport interface CommitteePublishedData {\n e3Id: bigint\n nodes: string[]\n publicKey: string\n pkCommitment: string\n proof: string\n}\n\nexport interface CommitteePublicKeyChunkPublishedData {\n e3Id: bigint\n publisher: string\n candidateHash: string\n nodes: string[]\n pkCommitment: string\n chunkIndex: number\n chunkCount: number\n totalLength: number\n chunk: string\n}\n\nexport interface CommitteeFinalizedData {\n e3Id: bigint\n committee: string[]\n scores: bigint[]\n}\n\nexport interface InterfoldEventData {\n [InterfoldEventType.E3_REQUESTED]: E3RequestedData\n [InterfoldEventType.CIPHERTEXT_OUTPUT_PUBLISHED]: CiphertextOutputPublishedData\n [InterfoldEventType.CIPHERTEXT_OUTPUT_REFERENCE_PUBLISHED]: CiphertextOutputReferencePublishedData\n [InterfoldEventType.PLAINTEXT_OUTPUT_PUBLISHED]: PlaintextOutputPublishedData\n [InterfoldEventType.E3_PROGRAM_REGISTERED]: { e3Program: string }\n [InterfoldEventType.ENCRYPTION_SCHEME_ENABLED]: { encryptionSchemeId: string }\n [InterfoldEventType.CIPHERNODE_REGISTRY_SET]: { ciphernodeRegistry: string }\n [InterfoldEventType.MAX_DURATION_SET]: { maxDuration: bigint }\n [InterfoldEventType.PARAM_SET_REGISTERED]: { paramSet: number; encodedParams: string }\n [InterfoldEventType.OWNERSHIP_TRANSFERRED]: { previousOwner: string; newOwner: string }\n [InterfoldEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface RegistryEventData {\n [RegistryEventType.COMMITTEE_REQUESTED]: CommitteeRequestedData\n [RegistryEventType.COMMITTEE_RANDOMNESS_REQUESTED]: CommitteeRandomnessRequestedData\n [RegistryEventType.RANDOMNESS_CIRCUIT_BREAKER_TRIPPED]: RandomnessCircuitBreakerTrippedData\n [RegistryEventType.COMMITTEE_PUBLISHED]: CommitteePublishedData\n [RegistryEventType.COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED]: CommitteePublicKeyChunkPublishedData\n [RegistryEventType.COMMITTEE_FINALIZED]: CommitteeFinalizedData\n [RegistryEventType.INTERFOLD_SET]: { interfold: string }\n [RegistryEventType.OWNERSHIP_TRANSFERRED]: { previousOwner: string; newOwner: string }\n [RegistryEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface InterfoldEvent<T extends AllEventTypes> {\n type: T\n data: T extends InterfoldEventType ? InterfoldEventData[T] : T extends RegistryEventType ? RegistryEventData[T] : unknown\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport interface RandomnessProviderEvent<T extends RandomnessProviderEventType = RandomnessProviderEventType> {\n type: T\n data: RandomnessFulfilledData\n provider: `0x${string}`\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport type RandomnessProviderEventCallback<T extends RandomnessProviderEventType = RandomnessProviderEventType> = (\n event: RandomnessProviderEvent<T>,\n) => void | Promise<void>\n\nexport type EventCallback<T extends AllEventTypes = AllEventTypes> = (event: InterfoldEvent<T>) => void | Promise<void>\n\nexport interface EventFilter<T = unknown> {\n address?: `0x${string}`\n fromBlock?: bigint\n toBlock?: bigint\n args?: Partial<T>\n}\n\nexport interface SDKEventEmitter {\n on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n emit<T extends AllEventTypes>(event: InterfoldEvent<T>): void\n}\n\nexport interface EventListenerConfig {\n fromBlock?: bigint\n toBlock?: bigint\n /** Maximum block span for each historical RPC query. */\n historicalBlockRange?: bigint\n polling?: boolean\n pollingInterval?: number\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Address, type Hash, type Log, PublicClient, encodeAbiParameters } from 'viem'\nimport type { BfvParams } from './types'\n\nexport class SDKError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message)\n this.name = 'SDKError'\n }\n}\n\nexport function isValidAddress(address: string): address is Address {\n return /^0x[a-fA-F0-9]{40}$/.test(address)\n}\n\nexport function isValidHash(hash: string): hash is Hash {\n return /^0x[a-fA-F0-9]{64}$/.test(hash)\n}\n\nexport function formatEventName(contractName: string, eventName: string): string {\n return `${contractName}.${eventName}`\n}\n\nexport function parseEventData<T>(log: Log): T {\n return log.data as unknown as T\n}\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport const sleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function formatBigInt(value: bigint): string {\n return value.toString()\n}\n\nexport function parseBigInt(value: string): bigint {\n return BigInt(value)\n}\n\nexport function generateEventId(log: Log): string {\n return `${log.blockHash}-${log.logIndex}`\n}\n\n/**\n * Get the current timestamp in seconds\n * from onchain\n * @param publicClient - The public client to use\n */\nexport async function getCurrentTimestamp(publicClient: PublicClient): Promise<bigint> {\n const block = await publicClient.getBlock()\n return block.timestamp\n}\n\n// Compute provider parameters structure\nexport interface ComputeProviderParams {\n name: string\n parallel: boolean\n batch_size: number\n}\n\n// Default compute provider configuration\nexport const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = {\n name: 'risc0',\n parallel: false,\n batch_size: 2,\n}\n\n// Default E3 configuration (`committeeSize` is `IInterfold.CommitteeSize`, not circuit N_PARTIES).\nexport const DEFAULT_E3_CONFIG = {\n committeeSize: 0, // CommitteeSize.Minimum\n duration: 1800, // 30 minutes in seconds\n payment_amount: '0', // 0 ETH in wei\n} as const\n\nexport function cryptoConfigIdForParamSet(paramSet: number): Hash {\n if (paramSet === 0) {\n return '0x04f3677e73b0f5066d6caf5cbd92e3fb2e38338edaf5cfc971ab28f7b684da78'\n }\n if (paramSet === 1) {\n return '0xd9c86e581f8291ffb5b63595600e8d096ed30b16e2e0a6634a76c22b1f58fb4e'\n }\n throw new SDKError(`Unsupported BFV parameter set: ${paramSet}`, 'UNSUPPORTED_CRYPTO_CONFIG')\n}\n\n/**\n * Encode BFV parameters for the smart contract\n * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption\n */\nexport function encodeBfvParams(params: BfvParams): `0x${string}` {\n const { degree, plaintextModulus, moduli, error1Variance } = params\n\n if (error1Variance === undefined) {\n throw new SDKError(\n 'error1Variance is required in ProtocolParams. All BFV parameter sets must specify error1_variance.',\n 'MISSING_ERROR1_VARIANCE',\n )\n }\n\n return encodeAbiParameters(\n [\n {\n name: 'bfvParams',\n type: 'tuple',\n components: [\n { name: 'degree', type: 'uint256' },\n { name: 'plaintext_modulus', type: 'uint256' },\n { name: 'moduli', type: 'uint256[]' },\n { name: 'error1_variance', type: 'string' },\n ],\n },\n ],\n [\n {\n degree: BigInt(degree),\n plaintext_modulus: BigInt(plaintextModulus),\n moduli: [...moduli],\n error1_variance: error1Variance,\n },\n ],\n )\n}\n\n/**\n * Encode compute provider parameters for the smart contract'\n * If mock is true, the compute provider parameters will return 32 bytes of 0x00\n */\nexport function encodeComputeProviderParams(params: ComputeProviderParams, mock: boolean = false): `0x${string}` {\n if (mock) {\n return `0x${'00'.repeat(32)}` as `0x${string}`\n }\n\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Encode custom parameters for the smart contract.\n */\nexport function encodeCustomParams(params: Record<string, unknown>): `0x${string}` {\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n// inputWindow[0] is always larger than now and dkg deadline\nexport const inputWindowStartBuffer = 15n\n\n/**\n * Calculate start window for E3 request\n * @dev This function can be used for testing purposes, or for E3s which need to start as soon as possible.\n * @param publicClient - The public client to use\n * @param duration - The duration of the input window in seconds\n * @param startBuffer - Buffer in seconds added to current timestamp for input window start\n */\nexport async function calculateInputWindow(\n publicClient: PublicClient,\n duration: number = DEFAULT_E3_CONFIG.duration,\n startBuffer: bigint = inputWindowStartBuffer,\n): Promise<[bigint, bigint]> {\n const now = await getCurrentTimestamp(publicClient)\n return [BigInt(now) + startBuffer, BigInt(now) + startBuffer + BigInt(duration)]\n}\n\n/**\n * Decode plaintextOutput bytes to get the actual result number\n */\nexport function decodePlaintextOutput(plaintextOutput: string): number | null {\n try {\n // Remove '0x' prefix if present\n const hex = plaintextOutput.startsWith('0x') ? plaintextOutput.slice(2) : plaintextOutput\n\n // Convert hex to bytes\n const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [])\n\n if (bytes.length < 8) {\n console.warn('Plaintext output too short for u64 decoding')\n return null\n }\n\n // Decode first u64 (8 bytes) as little-endian\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const result = view.getBigUint64(0, true) // true for little-endian\n\n return Number(result)\n } catch (error) {\n console.error('Failed to decode plaintext output:', error)\n return null\n }\n}\n\n// Helper function to convert proof bytes to field elements\nexport function proofToFields(proof: Uint8Array): string[] {\n const fields: string[] = []\n for (let i = 0; i < proof.length; i += 32) {\n const chunk = proof.slice(i, i + 32)\n fields.push('0x' + Buffer.from(chunk).toString('hex'))\n }\n return fields\n}\n"],"mappings":"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","names":["InterfoldEventType","RegistryEventType","RandomnessProviderEventType"]}
@@ -1,9 +1,10 @@
1
1
  import { Log, PublicClient, Abi } from 'viem';
2
- import { C as ContractAddresses } from '../types-Cwx_flfX.js';
2
+ import { C as ContractAddresses } from '../types-BJe3EYvv.js';
3
3
 
4
4
  declare enum InterfoldEventType {
5
5
  E3_REQUESTED = "E3Requested",
6
6
  CIPHERTEXT_OUTPUT_PUBLISHED = "CiphertextOutputPublished",
7
+ CIPHERTEXT_OUTPUT_REFERENCE_PUBLISHED = "CiphertextOutputReferencePublished",
7
8
  PLAINTEXT_OUTPUT_PUBLISHED = "PlaintextOutputPublished",
8
9
  E3_PROGRAM_REGISTERED = "E3ProgramRegistered",
9
10
  ENCRYPTION_SCHEME_ENABLED = "EncryptionSchemeEnabled",
@@ -18,6 +19,7 @@ declare enum RegistryEventType {
18
19
  COMMITTEE_RANDOMNESS_REQUESTED = "CommitteeRandomnessRequested",
19
20
  RANDOMNESS_CIRCUIT_BREAKER_TRIPPED = "RandomnessCircuitBreakerTripped",
20
21
  COMMITTEE_PUBLISHED = "CommitteePublished",
22
+ COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED = "CommitteePublicKeyChunkPublished",
21
23
  COMMITTEE_FINALIZED = "SortitionCommitteeFinalized",
22
24
  INTERFOLD_SET = "InterfoldSet",
23
25
  OWNERSHIP_TRANSFERRED = "OwnershipTransferred",
@@ -55,6 +57,13 @@ interface CiphertextOutputPublishedData {
55
57
  ciphertextOutput: string;
56
58
  ciphertextCommitment: string;
57
59
  }
60
+ interface CiphertextOutputReferencePublishedData {
61
+ e3Id: bigint;
62
+ contentHash: string;
63
+ ciphertextCommitment: string;
64
+ availabilityBlock: number;
65
+ availabilityLeafIndex: bigint;
66
+ }
58
67
  interface PlaintextOutputPublishedData {
59
68
  e3Id: bigint;
60
69
  plaintextOutput: string;
@@ -104,6 +113,17 @@ interface CommitteePublishedData {
104
113
  pkCommitment: string;
105
114
  proof: string;
106
115
  }
116
+ interface CommitteePublicKeyChunkPublishedData {
117
+ e3Id: bigint;
118
+ publisher: string;
119
+ candidateHash: string;
120
+ nodes: string[];
121
+ pkCommitment: string;
122
+ chunkIndex: number;
123
+ chunkCount: number;
124
+ totalLength: number;
125
+ chunk: string;
126
+ }
107
127
  interface CommitteeFinalizedData {
108
128
  e3Id: bigint;
109
129
  committee: string[];
@@ -112,6 +132,7 @@ interface CommitteeFinalizedData {
112
132
  interface InterfoldEventData {
113
133
  [InterfoldEventType.E3_REQUESTED]: E3RequestedData;
114
134
  [InterfoldEventType.CIPHERTEXT_OUTPUT_PUBLISHED]: CiphertextOutputPublishedData;
135
+ [InterfoldEventType.CIPHERTEXT_OUTPUT_REFERENCE_PUBLISHED]: CiphertextOutputReferencePublishedData;
115
136
  [InterfoldEventType.PLAINTEXT_OUTPUT_PUBLISHED]: PlaintextOutputPublishedData;
116
137
  [InterfoldEventType.E3_PROGRAM_REGISTERED]: {
117
138
  e3Program: string;
@@ -142,6 +163,7 @@ interface RegistryEventData {
142
163
  [RegistryEventType.COMMITTEE_RANDOMNESS_REQUESTED]: CommitteeRandomnessRequestedData;
143
164
  [RegistryEventType.RANDOMNESS_CIRCUIT_BREAKER_TRIPPED]: RandomnessCircuitBreakerTrippedData;
144
165
  [RegistryEventType.COMMITTEE_PUBLISHED]: CommitteePublishedData;
166
+ [RegistryEventType.COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED]: CommitteePublicKeyChunkPublishedData;
145
167
  [RegistryEventType.COMMITTEE_FINALIZED]: CommitteeFinalizedData;
146
168
  [RegistryEventType.INTERFOLD_SET]: {
147
169
  interfold: string;
@@ -234,4 +256,4 @@ declare class EventListener implements SDKEventEmitter {
234
256
  private pollForEvents;
235
257
  }
236
258
 
237
- export { type AllEventTypes, type CiphernodeAddedData, type CiphernodeRemovedData, type CiphertextOutputPublishedData, type CommitteeFinalizedData, type CommitteePublishedData, type CommitteeRandomnessRequestedData, type CommitteeRequestedData, type E3ActivatedData, type E3RequestedData, type EventCallback, type EventFilter, EventListener, type EventListenerConfig, type EventListenerOptions, type InterfoldEvent, type InterfoldEventData, InterfoldEventType, type PlaintextOutputPublishedData, type RandomnessCircuitBreakerTrippedData, type RandomnessFulfilledData, type RandomnessProviderEvent, type RandomnessProviderEventCallback, RandomnessProviderEventType, type RegistryEventData, RegistryEventType, type SDKEventEmitter };
259
+ export { type AllEventTypes, type CiphernodeAddedData, type CiphernodeRemovedData, type CiphertextOutputPublishedData, type CiphertextOutputReferencePublishedData, type CommitteeFinalizedData, type CommitteePublicKeyChunkPublishedData, type CommitteePublishedData, type CommitteeRandomnessRequestedData, type CommitteeRequestedData, type E3ActivatedData, type E3RequestedData, type EventCallback, type EventFilter, EventListener, type EventListenerConfig, type EventListenerOptions, type InterfoldEvent, type InterfoldEventData, InterfoldEventType, type PlaintextOutputPublishedData, type RandomnessCircuitBreakerTrippedData, type RandomnessFulfilledData, type RandomnessProviderEvent, type RandomnessProviderEventCallback, RandomnessProviderEventType, type RegistryEventData, RegistryEventType, type SDKEventEmitter };
@@ -5,6 +5,7 @@ import { CiphernodeRegistryOwnable__factory, Interfold__factory, IRandomnessProv
5
5
  var InterfoldEventType = /* @__PURE__ */ ((InterfoldEventType2) => {
6
6
  InterfoldEventType2["E3_REQUESTED"] = "E3Requested";
7
7
  InterfoldEventType2["CIPHERTEXT_OUTPUT_PUBLISHED"] = "CiphertextOutputPublished";
8
+ InterfoldEventType2["CIPHERTEXT_OUTPUT_REFERENCE_PUBLISHED"] = "CiphertextOutputReferencePublished";
8
9
  InterfoldEventType2["PLAINTEXT_OUTPUT_PUBLISHED"] = "PlaintextOutputPublished";
9
10
  InterfoldEventType2["E3_PROGRAM_REGISTERED"] = "E3ProgramRegistered";
10
11
  InterfoldEventType2["ENCRYPTION_SCHEME_ENABLED"] = "EncryptionSchemeEnabled";
@@ -20,6 +21,7 @@ var RegistryEventType = /* @__PURE__ */ ((RegistryEventType2) => {
20
21
  RegistryEventType2["COMMITTEE_RANDOMNESS_REQUESTED"] = "CommitteeRandomnessRequested";
21
22
  RegistryEventType2["RANDOMNESS_CIRCUIT_BREAKER_TRIPPED"] = "RandomnessCircuitBreakerTripped";
22
23
  RegistryEventType2["COMMITTEE_PUBLISHED"] = "CommitteePublished";
24
+ RegistryEventType2["COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED"] = "CommitteePublicKeyChunkPublished";
23
25
  RegistryEventType2["COMMITTEE_FINALIZED"] = "SortitionCommitteeFinalized";
24
26
  RegistryEventType2["INTERFOLD_SET"] = "InterfoldSet";
25
27
  RegistryEventType2["OWNERSHIP_TRANSFERRED"] = "OwnershipTransferred";
@@ -72,6 +74,7 @@ var EventListener = class _EventListener {
72
74
  "CommitteeRandomnessRequested" /* COMMITTEE_RANDOMNESS_REQUESTED */,
73
75
  "RandomnessCircuitBreakerTripped" /* RANDOMNESS_CIRCUIT_BREAKER_TRIPPED */,
74
76
  "CommitteePublished" /* COMMITTEE_PUBLISHED */,
77
+ "CommitteePublicKeyChunkPublished" /* COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED */,
75
78
  "SortitionCommitteeFinalized" /* COMMITTEE_FINALIZED */,
76
79
  "InterfoldSet" /* INTERFOLD_SET */
77
80
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/events/event-listener.ts","../../src/events/types.ts","../../src/utils.ts"],"sourcesContent":["// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Log, type PublicClient } from 'viem'\nimport { CiphernodeRegistryOwnable__factory, Interfold__factory, IRandomnessProvider__factory } from '@interfold/contracts/types'\n\nimport {\n RegistryEventType,\n type RandomnessProviderEvent,\n type RandomnessProviderEventCallback,\n type RandomnessProviderEventType,\n type AllEventTypes,\n type InterfoldEvent,\n type InterfoldEventData,\n type InterfoldEventType as InterfoldEventTypeT,\n type EventCallback,\n type EventListenerConfig,\n type RegistryEventData,\n type RegistryEventType as RegistryEventTypeT,\n type SDKEventEmitter,\n} from './types'\nimport type { ContractAddresses } from '../contracts/types'\nimport { SDKError, sleep } from '../utils'\n\nexport interface EventListenerOptions {\n publicClient: PublicClient\n contracts: ContractAddresses\n config?: EventListenerConfig\n}\n\nexport class EventListener implements SDKEventEmitter {\n private static readonly DEFAULT_HISTORICAL_BLOCK_RANGE = 10_000n\n private static readonly MAX_REMEMBERED_LOGS = 10_000\n private listeners: Map<AllEventTypes, Set<EventCallback>> = new Map()\n private activeWatchers: Map<string, () => void> = new Map()\n private watcherStartBlocks: Map<string, bigint | undefined> = new Map()\n private randomnessProviderListeners: Map<string, Set<RandomnessProviderEventCallback>> = new Map()\n private seenLiveLogs: Map<string, true> = new Map()\n private isPolling = false\n private lastBlockNumber: bigint = BigInt(0)\n private publicClient: PublicClient\n private contracts: ContractAddresses\n private config: EventListenerConfig\n\n constructor(options: EventListenerOptions) {\n this.publicClient = options.publicClient\n this.contracts = options.contracts\n this.config = options.config || {}\n }\n\n // Registry-exclusive event names that don't collide with InterfoldEventType.\n // Shared names like 'OwnershipTransferred' and 'Initialized' exist in both\n // enums with the same string value, so they cannot be disambiguated at\n // runtime; those default to the Interfold contract.\n private static readonly REGISTRY_ONLY_EVENTS: ReadonlySet<string> = new Set([\n RegistryEventType.COMMITTEE_REQUESTED,\n RegistryEventType.COMMITTEE_RANDOMNESS_REQUESTED,\n RegistryEventType.RANDOMNESS_CIRCUIT_BREAKER_TRIPPED,\n RegistryEventType.COMMITTEE_PUBLISHED,\n RegistryEventType.COMMITTEE_FINALIZED,\n RegistryEventType.INTERFOLD_SET,\n ])\n\n private resolveContract(eventType: AllEventTypes): { address: `0x${string}`; abi: Abi } {\n const isRegistryEvent = EventListener.REGISTRY_ONLY_EVENTS.has(eventType as string)\n return {\n address: isRegistryEvent ? this.contracts.ciphernodeRegistry : this.contracts.interfold,\n abi: isRegistryEvent ? CiphernodeRegistryOwnable__factory.abi : Interfold__factory.abi,\n }\n }\n\n public async onInterfoldEvent<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): Promise<void> {\n const { address, abi } = this.resolveContract(eventType)\n return this.watchContractEvent(address, eventType, abi, callback)\n }\n\n public async onRandomnessProviderEvent<T extends RandomnessProviderEventType>(\n provider: `0x${string}`,\n eventType: T,\n callback: RandomnessProviderEventCallback<T>,\n fromBlock?: bigint,\n ): Promise<void> {\n const listenerKey = `${provider.toLowerCase()}:${eventType}`\n const watcherKey = `randomness-provider:${listenerKey}`\n const requestedStartBlock = fromBlock ?? this.config.fromBlock\n let callbacks = this.randomnessProviderListeners.get(listenerKey)\n if (!callbacks) {\n callbacks = new Set()\n this.randomnessProviderListeners.set(listenerKey, callbacks)\n }\n\n if (this.activeWatchers.has(watcherKey)) {\n const activeStartBlock = this.watcherStartBlocks.get(watcherKey)\n if (fromBlock !== undefined && requestedStartBlock !== activeStartBlock) {\n throw new SDKError(\n `Randomness provider watcher for ${eventType} on ${provider} already starts at ${activeStartBlock ?? 'latest'}; requested ${requestedStartBlock ?? 'latest'}`,\n 'INVALID_EVENT_CONFIG',\n )\n }\n callbacks.add(callback as RandomnessProviderEventCallback)\n return\n }\n\n callbacks.add(callback as RandomnessProviderEventCallback)\n\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address: provider,\n abi: IRandomnessProvider__factory.abi,\n eventName: eventType,\n fromBlock: requestedStartBlock,\n onLogs: (logs: Log[]) => {\n for (const log of logs) {\n if (!this.rememberLiveLog(log)) continue\n const event: RandomnessProviderEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: RandomnessProviderEvent<T>['data'] }).args,\n provider,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? 0n,\n transactionHash: log.transactionHash ?? '0x',\n }\n const currentCallbacks = this.randomnessProviderListeners.get(listenerKey)\n currentCallbacks?.forEach((currentCallback) => {\n try {\n const result = currentCallback(event)\n if (result) {\n void result.catch((error) => {\n console.error(`Error in randomness provider callback for ${eventType}:`, error)\n })\n }\n } catch (error) {\n console.error(`Error in randomness provider callback for ${eventType}:`, error)\n }\n })\n }\n },\n })\n this.activeWatchers.set(watcherKey, unwatch)\n this.watcherStartBlocks.set(watcherKey, requestedStartBlock)\n } catch (error) {\n callbacks.delete(callback as RandomnessProviderEventCallback)\n if (callbacks.size === 0) this.randomnessProviderListeners.delete(listenerKey)\n throw new SDKError(`Failed to watch randomness provider event ${eventType} on ${provider}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n\n public offRandomnessProviderEvent<T extends RandomnessProviderEventType>(\n provider: `0x${string}`,\n eventType: T,\n callback: RandomnessProviderEventCallback<T>,\n ): void {\n const listenerKey = `${provider.toLowerCase()}:${eventType}`\n const callbacks = this.randomnessProviderListeners.get(listenerKey)\n callbacks?.delete(callback as RandomnessProviderEventCallback)\n if (callbacks && callbacks.size === 0) {\n this.randomnessProviderListeners.delete(listenerKey)\n const watcherKey = `randomness-provider:${listenerKey}`\n const unwatch = this.activeWatchers.get(watcherKey)\n if (unwatch) unwatch()\n this.activeWatchers.delete(watcherKey)\n this.watcherStartBlocks.delete(watcherKey)\n }\n }\n\n public async getHistoricalRandomnessProviderEvents(\n provider: `0x${string}`,\n eventType: RandomnessProviderEventType,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n const start = fromBlock ?? this.config.fromBlock\n if (start === undefined) {\n throw new SDKError('Randomness provider history requires fromBlock or EventListenerConfig.fromBlock', 'INVALID_EVENT_CONFIG')\n }\n try {\n return await this.getHistoricalContractEvents(provider, IRandomnessProvider__factory.abi, eventType, start, toBlock)\n } catch (error) {\n throw new SDKError(`Failed to get randomness provider events from ${provider}: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n public async once<T extends AllEventTypes>(type: T, callback: EventCallback<T>): Promise<void> {\n const handler: EventCallback<T> = (event) => {\n this.off(type, handler)\n const prom = callback(event)\n if (prom) {\n prom.catch((e) => console.error(e))\n }\n }\n return this.onInterfoldEvent(type, handler)\n }\n\n public async watchContractEvent<T extends AllEventTypes>(\n address: `0x${string}`,\n eventType: T,\n abi: Abi,\n callback: EventCallback<T>,\n ): Promise<void> {\n const watcherKey = `${address}:${eventType}`\n\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const emitter = this\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: this.config.fromBlock,\n onLogs(logs: Log[]) {\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i]\n if (!log) break\n if (!emitter.rememberLiveLog(log)) continue\n const event: InterfoldEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: unknown }).args as T extends InterfoldEventTypeT\n ? InterfoldEventData[T]\n : T extends RegistryEventTypeT\n ? RegistryEventData[T]\n : unknown,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? BigInt(0),\n transactionHash: log.transactionHash ?? '0x',\n }\n emitter.emit(event)\n }\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch contract event ${eventType} on ${address}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n }\n\n public async watchLogs(address: `0x${string}`, callback: (log: Log) => void): Promise<void> {\n const watcherKey = `logs:${address}`\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchEvent({\n address,\n onLogs: (logs: Log[]) => {\n logs.forEach((log: Log) => {\n callback(log)\n })\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch logs for address ${address}: ${error}`, 'WATCH_LOGS_FAILED')\n }\n }\n }\n\n public async startPolling(): Promise<void> {\n if (this.isPolling) return\n\n this.isPolling = true\n\n try {\n this.lastBlockNumber = await this.publicClient.getBlockNumber()\n void this.pollForEvents()\n } catch (error) {\n this.isPolling = false\n throw new SDKError(`Failed to start polling: ${error}`, 'POLLING_START_FAILED')\n }\n }\n\n public stopPolling(): void {\n this.isPolling = false\n }\n\n public async getHistoricalEvents(eventType: AllEventTypes, fromBlock?: bigint, toBlock?: bigint): Promise<Log[]> {\n const { address, abi } = this.resolveContract(eventType)\n\n try {\n return await this.getHistoricalContractEvents(address, abi, eventType as string, fromBlock, toBlock)\n } catch (error) {\n throw new SDKError(`Failed to get historical events: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n public on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n }\n\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n const callbacks = this.listeners.get(eventType)\n if (callbacks) {\n callbacks.delete(callback as EventCallback)\n if (callbacks.size === 0) {\n this.listeners.delete(eventType)\n const watchersToRemove: string[] = []\n this.activeWatchers.forEach((unwatch, key) => {\n if (key.endsWith(`:${eventType}`)) {\n try {\n unwatch()\n } catch (error) {\n console.error(`Error unwatching event ${eventType}:`, error)\n }\n watchersToRemove.push(key)\n }\n })\n watchersToRemove.forEach((key) => this.activeWatchers.delete(key))\n }\n }\n }\n\n public emit<T extends AllEventTypes>(event: InterfoldEvent<T>): void {\n const callbacks = this.listeners.get(event.type)\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n const result = (callback as EventCallback<T>)(event)\n if (result) {\n void result.catch((error) => {\n console.error(`Error in event callback for ${event.type}:`, error)\n })\n }\n } catch (error) {\n console.error(`Error in event callback for ${event.type}:`, error)\n }\n })\n }\n }\n\n public cleanup(): void {\n this.stopPolling()\n\n this.activeWatchers.forEach((unwatch) => {\n try {\n unwatch()\n } catch (error) {\n console.error('Error unwatching during cleanup:', error)\n }\n })\n this.activeWatchers.clear()\n this.watcherStartBlocks.clear()\n this.listeners.clear()\n this.randomnessProviderListeners.clear()\n this.seenLiveLogs.clear()\n }\n\n private logIdentity(log: Log): string | undefined {\n if (log.blockHash && log.transactionHash && log.logIndex !== null && log.logIndex !== undefined) {\n return `${log.blockHash}:${log.transactionHash}:${log.logIndex}:${Boolean(log.removed)}`\n }\n return undefined\n }\n\n private rememberLiveLog(log: Log): boolean {\n const identity = this.logIdentity(log)\n if (!identity) return true\n if (this.seenLiveLogs.has(identity)) return false\n\n this.seenLiveLogs.set(identity, true)\n if (this.seenLiveLogs.size > EventListener.MAX_REMEMBERED_LOGS) {\n const oldest = this.seenLiveLogs.keys().next().value\n if (oldest !== undefined) this.seenLiveLogs.delete(oldest)\n }\n return true\n }\n\n private async getHistoricalContractEvents(\n address: `0x${string}`,\n abi: Abi,\n eventName: string,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n const start = fromBlock ?? this.config.fromBlock\n const configuredEnd = toBlock ?? this.config.toBlock\n if (start === undefined) {\n return (await this.publicClient.getContractEvents({\n address,\n abi,\n eventName,\n toBlock: configuredEnd,\n })) as Log[]\n }\n\n const end = configuredEnd ?? (await this.publicClient.getBlockNumber({ cacheTime: 0 }))\n if (end < start) return []\n\n const range = this.config.historicalBlockRange ?? EventListener.DEFAULT_HISTORICAL_BLOCK_RANGE\n if (range <= 0n) throw new SDKError('Historical block range must be greater than zero', 'INVALID_EVENT_CONFIG')\n\n const logs: Log[] = []\n const seen = new Set<string>()\n for (let cursor = start; cursor <= end; cursor += range) {\n const chunkEnd = cursor + range - 1n < end ? cursor + range - 1n : end\n const chunk = (await this.publicClient.getContractEvents({\n address,\n abi,\n eventName,\n fromBlock: cursor,\n toBlock: chunkEnd,\n })) as Log[]\n for (const log of chunk) {\n const identity = this.logIdentity(log)\n if (identity && seen.has(identity)) continue\n if (identity) {\n seen.add(identity)\n this.rememberLiveLog(log)\n }\n logs.push(log)\n }\n }\n return logs\n }\n\n private async pollForEvents(): Promise<void> {\n while (this.isPolling) {\n try {\n const currentBlock = await this.publicClient.getBlockNumber()\n\n if (currentBlock > this.lastBlockNumber) {\n this.lastBlockNumber = currentBlock\n }\n\n await sleep(this.config.pollingInterval || 5000)\n } catch (error) {\n console.error('Error during polling:', error)\n await sleep(this.config.pollingInterval || 5000)\n }\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport type { Log } from 'viem'\n\nexport enum InterfoldEventType {\n E3_REQUESTED = 'E3Requested',\n CIPHERTEXT_OUTPUT_PUBLISHED = 'CiphertextOutputPublished',\n PLAINTEXT_OUTPUT_PUBLISHED = 'PlaintextOutputPublished',\n E3_PROGRAM_REGISTERED = 'E3ProgramRegistered',\n ENCRYPTION_SCHEME_ENABLED = 'EncryptionSchemeEnabled',\n CIPHERNODE_REGISTRY_SET = 'CiphernodeRegistrySet',\n MAX_DURATION_SET = 'MaxDurationSet',\n PARAM_SET_REGISTERED = 'ParamSetRegistered',\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RegistryEventType {\n COMMITTEE_REQUESTED = 'CommitteeRequested',\n COMMITTEE_RANDOMNESS_REQUESTED = 'CommitteeRandomnessRequested',\n RANDOMNESS_CIRCUIT_BREAKER_TRIPPED = 'RandomnessCircuitBreakerTripped',\n COMMITTEE_PUBLISHED = 'CommitteePublished',\n COMMITTEE_FINALIZED = 'SortitionCommitteeFinalized',\n INTERFOLD_SET = 'InterfoldSet',\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RandomnessProviderEventType {\n RANDOMNESS_FULFILLED = 'RandomnessFulfilled',\n}\n\nexport type AllEventTypes = InterfoldEventType | RegistryEventType\n\nexport interface E3RequestedData {\n e3Id: bigint\n e3: {\n seed: bigint\n committeeSize: number\n requestBlock: bigint\n inputWindow: readonly [bigint, bigint]\n encryptionSchemeId: string\n e3Program: string\n paramSet: number\n decryptionVerifier: string\n committeePublicKey: string\n ciphertextOutput: string\n ciphertextCommitment: string\n plaintextOutput: string\n }\n cryptoConfigId: string\n}\n\nexport interface E3ActivatedData {\n e3Id: bigint\n expiration: bigint\n committeePublicKey: string\n}\n\nexport interface CiphertextOutputPublishedData {\n e3Id: bigint\n ciphertextOutput: string\n ciphertextCommitment: string\n}\n\nexport interface PlaintextOutputPublishedData {\n e3Id: bigint\n plaintextOutput: string\n proof: string\n}\n\nexport interface CiphernodeAddedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CiphernodeRemovedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CommitteeRequestedData {\n e3Id: bigint\n entropyBlock: bigint\n threshold: [bigint, bigint]\n requestBlock: bigint\n committeeDeadline: bigint\n ticketPrice: bigint\n}\n\nexport interface CommitteeRandomnessRequestedData {\n e3Id: bigint\n requestId: bigint\n provider: string\n randomnessDeadline: bigint\n}\n\nexport interface RandomnessCircuitBreakerTrippedData {\n e3Id: bigint\n requestId: bigint\n randomnessProvider: string\n}\n\nexport interface RandomnessFulfilledData {\n requestId: bigint\n e3Id: bigint\n randomWord: bigint\n fulfilledAt: bigint\n}\n\nexport interface CommitteePublishedData {\n e3Id: bigint\n nodes: string[]\n publicKey: string\n pkCommitment: string\n proof: string\n}\n\nexport interface CommitteeFinalizedData {\n e3Id: bigint\n committee: string[]\n scores: bigint[]\n}\n\nexport interface InterfoldEventData {\n [InterfoldEventType.E3_REQUESTED]: E3RequestedData\n [InterfoldEventType.CIPHERTEXT_OUTPUT_PUBLISHED]: CiphertextOutputPublishedData\n [InterfoldEventType.PLAINTEXT_OUTPUT_PUBLISHED]: PlaintextOutputPublishedData\n [InterfoldEventType.E3_PROGRAM_REGISTERED]: { e3Program: string }\n [InterfoldEventType.ENCRYPTION_SCHEME_ENABLED]: { encryptionSchemeId: string }\n [InterfoldEventType.CIPHERNODE_REGISTRY_SET]: { ciphernodeRegistry: string }\n [InterfoldEventType.MAX_DURATION_SET]: { maxDuration: bigint }\n [InterfoldEventType.PARAM_SET_REGISTERED]: { paramSet: number; encodedParams: string }\n [InterfoldEventType.OWNERSHIP_TRANSFERRED]: { previousOwner: string; newOwner: string }\n [InterfoldEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface RegistryEventData {\n [RegistryEventType.COMMITTEE_REQUESTED]: CommitteeRequestedData\n [RegistryEventType.COMMITTEE_RANDOMNESS_REQUESTED]: CommitteeRandomnessRequestedData\n [RegistryEventType.RANDOMNESS_CIRCUIT_BREAKER_TRIPPED]: RandomnessCircuitBreakerTrippedData\n [RegistryEventType.COMMITTEE_PUBLISHED]: CommitteePublishedData\n [RegistryEventType.COMMITTEE_FINALIZED]: CommitteeFinalizedData\n [RegistryEventType.INTERFOLD_SET]: { interfold: string }\n [RegistryEventType.OWNERSHIP_TRANSFERRED]: { previousOwner: string; newOwner: string }\n [RegistryEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface InterfoldEvent<T extends AllEventTypes> {\n type: T\n data: T extends InterfoldEventType ? InterfoldEventData[T] : T extends RegistryEventType ? RegistryEventData[T] : unknown\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport interface RandomnessProviderEvent<T extends RandomnessProviderEventType = RandomnessProviderEventType> {\n type: T\n data: RandomnessFulfilledData\n provider: `0x${string}`\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport type RandomnessProviderEventCallback<T extends RandomnessProviderEventType = RandomnessProviderEventType> = (\n event: RandomnessProviderEvent<T>,\n) => void | Promise<void>\n\nexport type EventCallback<T extends AllEventTypes = AllEventTypes> = (event: InterfoldEvent<T>) => void | Promise<void>\n\nexport interface EventFilter<T = unknown> {\n address?: `0x${string}`\n fromBlock?: bigint\n toBlock?: bigint\n args?: Partial<T>\n}\n\nexport interface SDKEventEmitter {\n on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n emit<T extends AllEventTypes>(event: InterfoldEvent<T>): void\n}\n\nexport interface EventListenerConfig {\n fromBlock?: bigint\n toBlock?: bigint\n /** Maximum block span for each historical RPC query. */\n historicalBlockRange?: bigint\n polling?: boolean\n pollingInterval?: number\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Address, type Hash, type Log, PublicClient, encodeAbiParameters } from 'viem'\nimport type { BfvParams } from './types'\n\nexport class SDKError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message)\n this.name = 'SDKError'\n }\n}\n\nexport function isValidAddress(address: string): address is Address {\n return /^0x[a-fA-F0-9]{40}$/.test(address)\n}\n\nexport function isValidHash(hash: string): hash is Hash {\n return /^0x[a-fA-F0-9]{64}$/.test(hash)\n}\n\nexport function formatEventName(contractName: string, eventName: string): string {\n return `${contractName}.${eventName}`\n}\n\nexport function parseEventData<T>(log: Log): T {\n return log.data as unknown as T\n}\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport const sleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function formatBigInt(value: bigint): string {\n return value.toString()\n}\n\nexport function parseBigInt(value: string): bigint {\n return BigInt(value)\n}\n\nexport function generateEventId(log: Log): string {\n return `${log.blockHash}-${log.logIndex}`\n}\n\n/**\n * Get the current timestamp in seconds\n * from onchain\n * @param publicClient - The public client to use\n */\nexport async function getCurrentTimestamp(publicClient: PublicClient): Promise<bigint> {\n const block = await publicClient.getBlock()\n return block.timestamp\n}\n\n// Compute provider parameters structure\nexport interface ComputeProviderParams {\n name: string\n parallel: boolean\n batch_size: number\n}\n\n// Default compute provider configuration\nexport const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = {\n name: 'risc0',\n parallel: false,\n batch_size: 2,\n}\n\n// Default E3 configuration (`committeeSize` is `IInterfold.CommitteeSize`, not circuit N_PARTIES).\nexport const DEFAULT_E3_CONFIG = {\n committeeSize: 0, // CommitteeSize.Minimum\n duration: 1800, // 30 minutes in seconds\n payment_amount: '0', // 0 ETH in wei\n} as const\n\n/**\n * Encode BFV parameters for the smart contract\n * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption\n */\nexport function encodeBfvParams(params: BfvParams): `0x${string}` {\n const { degree, plaintextModulus, moduli, error1Variance } = params\n\n if (error1Variance === undefined) {\n throw new SDKError(\n 'error1Variance is required in ProtocolParams. All BFV parameter sets must specify error1_variance.',\n 'MISSING_ERROR1_VARIANCE',\n )\n }\n\n return encodeAbiParameters(\n [\n {\n name: 'bfvParams',\n type: 'tuple',\n components: [\n { name: 'degree', type: 'uint256' },\n { name: 'plaintext_modulus', type: 'uint256' },\n { name: 'moduli', type: 'uint256[]' },\n { name: 'error1_variance', type: 'string' },\n ],\n },\n ],\n [\n {\n degree: BigInt(degree),\n plaintext_modulus: BigInt(plaintextModulus),\n moduli: [...moduli],\n error1_variance: error1Variance,\n },\n ],\n )\n}\n\n/**\n * Encode compute provider parameters for the smart contract'\n * If mock is true, the compute provider parameters will return 32 bytes of 0x00\n */\nexport function encodeComputeProviderParams(params: ComputeProviderParams, mock: boolean = false): `0x${string}` {\n if (mock) {\n return `0x${'00'.repeat(32)}` as `0x${string}`\n }\n\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Encode custom parameters for the smart contract.\n */\nexport function encodeCustomParams(params: Record<string, unknown>): `0x${string}` {\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n// inputWindow[0] is always larger than now and dkg deadline\nexport const inputWindowStartBuffer = 15n\n\n/**\n * Calculate start window for E3 request\n * @dev This function can be used for testing purposes, or for E3s which need to start as soon as possible.\n * @param publicClient - The public client to use\n * @param duration - The duration of the input window in seconds\n * @param startBuffer - Buffer in seconds added to current timestamp for input window start\n */\nexport async function calculateInputWindow(\n publicClient: PublicClient,\n duration: number = DEFAULT_E3_CONFIG.duration,\n startBuffer: bigint = inputWindowStartBuffer,\n): Promise<[bigint, bigint]> {\n const now = await getCurrentTimestamp(publicClient)\n return [BigInt(now) + startBuffer, BigInt(now) + startBuffer + BigInt(duration)]\n}\n\n/**\n * Decode plaintextOutput bytes to get the actual result number\n */\nexport function decodePlaintextOutput(plaintextOutput: string): number | null {\n try {\n // Remove '0x' prefix if present\n const hex = plaintextOutput.startsWith('0x') ? plaintextOutput.slice(2) : plaintextOutput\n\n // Convert hex to bytes\n const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [])\n\n if (bytes.length < 8) {\n console.warn('Plaintext output too short for u64 decoding')\n return null\n }\n\n // Decode first u64 (8 bytes) as little-endian\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const result = view.getBigUint64(0, true) // true for little-endian\n\n return Number(result)\n } catch (error) {\n console.error('Failed to decode plaintext output:', error)\n return null\n }\n}\n\n// Helper function to convert proof bytes to field elements\nexport function proofToFields(proof: Uint8Array): string[] {\n const fields: string[] = []\n for (let i = 0; i < proof.length; i += 32) {\n const chunk = proof.slice(i, i + 32)\n fields.push('0x' + Buffer.from(chunk).toString('hex'))\n }\n return fields\n}\n"],"mappings":"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","names":["InterfoldEventType","RegistryEventType","RandomnessProviderEventType"]}
1
+ {"version":3,"sources":["../../src/events/event-listener.ts","../../src/events/types.ts","../../src/utils.ts"],"sourcesContent":["// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Log, type PublicClient } from 'viem'\nimport { CiphernodeRegistryOwnable__factory, Interfold__factory, IRandomnessProvider__factory } from '@interfold/contracts/types'\n\nimport {\n RegistryEventType,\n type RandomnessProviderEvent,\n type RandomnessProviderEventCallback,\n type RandomnessProviderEventType,\n type AllEventTypes,\n type InterfoldEvent,\n type InterfoldEventData,\n type InterfoldEventType as InterfoldEventTypeT,\n type EventCallback,\n type EventListenerConfig,\n type RegistryEventData,\n type RegistryEventType as RegistryEventTypeT,\n type SDKEventEmitter,\n} from './types'\nimport type { ContractAddresses } from '../contracts/types'\nimport { SDKError, sleep } from '../utils'\n\nexport interface EventListenerOptions {\n publicClient: PublicClient\n contracts: ContractAddresses\n config?: EventListenerConfig\n}\n\nexport class EventListener implements SDKEventEmitter {\n private static readonly DEFAULT_HISTORICAL_BLOCK_RANGE = 10_000n\n private static readonly MAX_REMEMBERED_LOGS = 10_000\n private listeners: Map<AllEventTypes, Set<EventCallback>> = new Map()\n private activeWatchers: Map<string, () => void> = new Map()\n private watcherStartBlocks: Map<string, bigint | undefined> = new Map()\n private randomnessProviderListeners: Map<string, Set<RandomnessProviderEventCallback>> = new Map()\n private seenLiveLogs: Map<string, true> = new Map()\n private isPolling = false\n private lastBlockNumber: bigint = BigInt(0)\n private publicClient: PublicClient\n private contracts: ContractAddresses\n private config: EventListenerConfig\n\n constructor(options: EventListenerOptions) {\n this.publicClient = options.publicClient\n this.contracts = options.contracts\n this.config = options.config || {}\n }\n\n // Registry-exclusive event names that don't collide with InterfoldEventType.\n // Shared names like 'OwnershipTransferred' and 'Initialized' exist in both\n // enums with the same string value, so they cannot be disambiguated at\n // runtime; those default to the Interfold contract.\n private static readonly REGISTRY_ONLY_EVENTS: ReadonlySet<string> = new Set([\n RegistryEventType.COMMITTEE_REQUESTED,\n RegistryEventType.COMMITTEE_RANDOMNESS_REQUESTED,\n RegistryEventType.RANDOMNESS_CIRCUIT_BREAKER_TRIPPED,\n RegistryEventType.COMMITTEE_PUBLISHED,\n RegistryEventType.COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED,\n RegistryEventType.COMMITTEE_FINALIZED,\n RegistryEventType.INTERFOLD_SET,\n ])\n\n private resolveContract(eventType: AllEventTypes): { address: `0x${string}`; abi: Abi } {\n const isRegistryEvent = EventListener.REGISTRY_ONLY_EVENTS.has(eventType as string)\n return {\n address: isRegistryEvent ? this.contracts.ciphernodeRegistry : this.contracts.interfold,\n abi: isRegistryEvent ? CiphernodeRegistryOwnable__factory.abi : Interfold__factory.abi,\n }\n }\n\n public async onInterfoldEvent<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): Promise<void> {\n const { address, abi } = this.resolveContract(eventType)\n return this.watchContractEvent(address, eventType, abi, callback)\n }\n\n public async onRandomnessProviderEvent<T extends RandomnessProviderEventType>(\n provider: `0x${string}`,\n eventType: T,\n callback: RandomnessProviderEventCallback<T>,\n fromBlock?: bigint,\n ): Promise<void> {\n const listenerKey = `${provider.toLowerCase()}:${eventType}`\n const watcherKey = `randomness-provider:${listenerKey}`\n const requestedStartBlock = fromBlock ?? this.config.fromBlock\n let callbacks = this.randomnessProviderListeners.get(listenerKey)\n if (!callbacks) {\n callbacks = new Set()\n this.randomnessProviderListeners.set(listenerKey, callbacks)\n }\n\n if (this.activeWatchers.has(watcherKey)) {\n const activeStartBlock = this.watcherStartBlocks.get(watcherKey)\n if (fromBlock !== undefined && requestedStartBlock !== activeStartBlock) {\n throw new SDKError(\n `Randomness provider watcher for ${eventType} on ${provider} already starts at ${activeStartBlock ?? 'latest'}; requested ${requestedStartBlock ?? 'latest'}`,\n 'INVALID_EVENT_CONFIG',\n )\n }\n callbacks.add(callback as RandomnessProviderEventCallback)\n return\n }\n\n callbacks.add(callback as RandomnessProviderEventCallback)\n\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address: provider,\n abi: IRandomnessProvider__factory.abi,\n eventName: eventType,\n fromBlock: requestedStartBlock,\n onLogs: (logs: Log[]) => {\n for (const log of logs) {\n if (!this.rememberLiveLog(log)) continue\n const event: RandomnessProviderEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: RandomnessProviderEvent<T>['data'] }).args,\n provider,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? 0n,\n transactionHash: log.transactionHash ?? '0x',\n }\n const currentCallbacks = this.randomnessProviderListeners.get(listenerKey)\n currentCallbacks?.forEach((currentCallback) => {\n try {\n const result = currentCallback(event)\n if (result) {\n void result.catch((error) => {\n console.error(`Error in randomness provider callback for ${eventType}:`, error)\n })\n }\n } catch (error) {\n console.error(`Error in randomness provider callback for ${eventType}:`, error)\n }\n })\n }\n },\n })\n this.activeWatchers.set(watcherKey, unwatch)\n this.watcherStartBlocks.set(watcherKey, requestedStartBlock)\n } catch (error) {\n callbacks.delete(callback as RandomnessProviderEventCallback)\n if (callbacks.size === 0) this.randomnessProviderListeners.delete(listenerKey)\n throw new SDKError(`Failed to watch randomness provider event ${eventType} on ${provider}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n\n public offRandomnessProviderEvent<T extends RandomnessProviderEventType>(\n provider: `0x${string}`,\n eventType: T,\n callback: RandomnessProviderEventCallback<T>,\n ): void {\n const listenerKey = `${provider.toLowerCase()}:${eventType}`\n const callbacks = this.randomnessProviderListeners.get(listenerKey)\n callbacks?.delete(callback as RandomnessProviderEventCallback)\n if (callbacks && callbacks.size === 0) {\n this.randomnessProviderListeners.delete(listenerKey)\n const watcherKey = `randomness-provider:${listenerKey}`\n const unwatch = this.activeWatchers.get(watcherKey)\n if (unwatch) unwatch()\n this.activeWatchers.delete(watcherKey)\n this.watcherStartBlocks.delete(watcherKey)\n }\n }\n\n public async getHistoricalRandomnessProviderEvents(\n provider: `0x${string}`,\n eventType: RandomnessProviderEventType,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n const start = fromBlock ?? this.config.fromBlock\n if (start === undefined) {\n throw new SDKError('Randomness provider history requires fromBlock or EventListenerConfig.fromBlock', 'INVALID_EVENT_CONFIG')\n }\n try {\n return await this.getHistoricalContractEvents(provider, IRandomnessProvider__factory.abi, eventType, start, toBlock)\n } catch (error) {\n throw new SDKError(`Failed to get randomness provider events from ${provider}: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n public async once<T extends AllEventTypes>(type: T, callback: EventCallback<T>): Promise<void> {\n const handler: EventCallback<T> = (event) => {\n this.off(type, handler)\n const prom = callback(event)\n if (prom) {\n prom.catch((e) => console.error(e))\n }\n }\n return this.onInterfoldEvent(type, handler)\n }\n\n public async watchContractEvent<T extends AllEventTypes>(\n address: `0x${string}`,\n eventType: T,\n abi: Abi,\n callback: EventCallback<T>,\n ): Promise<void> {\n const watcherKey = `${address}:${eventType}`\n\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const emitter = this\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: this.config.fromBlock,\n onLogs(logs: Log[]) {\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i]\n if (!log) break\n if (!emitter.rememberLiveLog(log)) continue\n const event: InterfoldEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: unknown }).args as T extends InterfoldEventTypeT\n ? InterfoldEventData[T]\n : T extends RegistryEventTypeT\n ? RegistryEventData[T]\n : unknown,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? BigInt(0),\n transactionHash: log.transactionHash ?? '0x',\n }\n emitter.emit(event)\n }\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch contract event ${eventType} on ${address}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n }\n\n public async watchLogs(address: `0x${string}`, callback: (log: Log) => void): Promise<void> {\n const watcherKey = `logs:${address}`\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchEvent({\n address,\n onLogs: (logs: Log[]) => {\n logs.forEach((log: Log) => {\n callback(log)\n })\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch logs for address ${address}: ${error}`, 'WATCH_LOGS_FAILED')\n }\n }\n }\n\n public async startPolling(): Promise<void> {\n if (this.isPolling) return\n\n this.isPolling = true\n\n try {\n this.lastBlockNumber = await this.publicClient.getBlockNumber()\n void this.pollForEvents()\n } catch (error) {\n this.isPolling = false\n throw new SDKError(`Failed to start polling: ${error}`, 'POLLING_START_FAILED')\n }\n }\n\n public stopPolling(): void {\n this.isPolling = false\n }\n\n public async getHistoricalEvents(eventType: AllEventTypes, fromBlock?: bigint, toBlock?: bigint): Promise<Log[]> {\n const { address, abi } = this.resolveContract(eventType)\n\n try {\n return await this.getHistoricalContractEvents(address, abi, eventType as string, fromBlock, toBlock)\n } catch (error) {\n throw new SDKError(`Failed to get historical events: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n public on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n }\n\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n const callbacks = this.listeners.get(eventType)\n if (callbacks) {\n callbacks.delete(callback as EventCallback)\n if (callbacks.size === 0) {\n this.listeners.delete(eventType)\n const watchersToRemove: string[] = []\n this.activeWatchers.forEach((unwatch, key) => {\n if (key.endsWith(`:${eventType}`)) {\n try {\n unwatch()\n } catch (error) {\n console.error(`Error unwatching event ${eventType}:`, error)\n }\n watchersToRemove.push(key)\n }\n })\n watchersToRemove.forEach((key) => this.activeWatchers.delete(key))\n }\n }\n }\n\n public emit<T extends AllEventTypes>(event: InterfoldEvent<T>): void {\n const callbacks = this.listeners.get(event.type)\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n const result = (callback as EventCallback<T>)(event)\n if (result) {\n void result.catch((error) => {\n console.error(`Error in event callback for ${event.type}:`, error)\n })\n }\n } catch (error) {\n console.error(`Error in event callback for ${event.type}:`, error)\n }\n })\n }\n }\n\n public cleanup(): void {\n this.stopPolling()\n\n this.activeWatchers.forEach((unwatch) => {\n try {\n unwatch()\n } catch (error) {\n console.error('Error unwatching during cleanup:', error)\n }\n })\n this.activeWatchers.clear()\n this.watcherStartBlocks.clear()\n this.listeners.clear()\n this.randomnessProviderListeners.clear()\n this.seenLiveLogs.clear()\n }\n\n private logIdentity(log: Log): string | undefined {\n if (log.blockHash && log.transactionHash && log.logIndex !== null && log.logIndex !== undefined) {\n return `${log.blockHash}:${log.transactionHash}:${log.logIndex}:${Boolean(log.removed)}`\n }\n return undefined\n }\n\n private rememberLiveLog(log: Log): boolean {\n const identity = this.logIdentity(log)\n if (!identity) return true\n if (this.seenLiveLogs.has(identity)) return false\n\n this.seenLiveLogs.set(identity, true)\n if (this.seenLiveLogs.size > EventListener.MAX_REMEMBERED_LOGS) {\n const oldest = this.seenLiveLogs.keys().next().value\n if (oldest !== undefined) this.seenLiveLogs.delete(oldest)\n }\n return true\n }\n\n private async getHistoricalContractEvents(\n address: `0x${string}`,\n abi: Abi,\n eventName: string,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n const start = fromBlock ?? this.config.fromBlock\n const configuredEnd = toBlock ?? this.config.toBlock\n if (start === undefined) {\n return (await this.publicClient.getContractEvents({\n address,\n abi,\n eventName,\n toBlock: configuredEnd,\n })) as Log[]\n }\n\n const end = configuredEnd ?? (await this.publicClient.getBlockNumber({ cacheTime: 0 }))\n if (end < start) return []\n\n const range = this.config.historicalBlockRange ?? EventListener.DEFAULT_HISTORICAL_BLOCK_RANGE\n if (range <= 0n) throw new SDKError('Historical block range must be greater than zero', 'INVALID_EVENT_CONFIG')\n\n const logs: Log[] = []\n const seen = new Set<string>()\n for (let cursor = start; cursor <= end; cursor += range) {\n const chunkEnd = cursor + range - 1n < end ? cursor + range - 1n : end\n const chunk = (await this.publicClient.getContractEvents({\n address,\n abi,\n eventName,\n fromBlock: cursor,\n toBlock: chunkEnd,\n })) as Log[]\n for (const log of chunk) {\n const identity = this.logIdentity(log)\n if (identity && seen.has(identity)) continue\n if (identity) {\n seen.add(identity)\n this.rememberLiveLog(log)\n }\n logs.push(log)\n }\n }\n return logs\n }\n\n private async pollForEvents(): Promise<void> {\n while (this.isPolling) {\n try {\n const currentBlock = await this.publicClient.getBlockNumber()\n\n if (currentBlock > this.lastBlockNumber) {\n this.lastBlockNumber = currentBlock\n }\n\n await sleep(this.config.pollingInterval || 5000)\n } catch (error) {\n console.error('Error during polling:', error)\n await sleep(this.config.pollingInterval || 5000)\n }\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport type { Log } from 'viem'\n\nexport enum InterfoldEventType {\n E3_REQUESTED = 'E3Requested',\n CIPHERTEXT_OUTPUT_PUBLISHED = 'CiphertextOutputPublished',\n CIPHERTEXT_OUTPUT_REFERENCE_PUBLISHED = 'CiphertextOutputReferencePublished',\n PLAINTEXT_OUTPUT_PUBLISHED = 'PlaintextOutputPublished',\n E3_PROGRAM_REGISTERED = 'E3ProgramRegistered',\n ENCRYPTION_SCHEME_ENABLED = 'EncryptionSchemeEnabled',\n CIPHERNODE_REGISTRY_SET = 'CiphernodeRegistrySet',\n MAX_DURATION_SET = 'MaxDurationSet',\n PARAM_SET_REGISTERED = 'ParamSetRegistered',\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RegistryEventType {\n COMMITTEE_REQUESTED = 'CommitteeRequested',\n COMMITTEE_RANDOMNESS_REQUESTED = 'CommitteeRandomnessRequested',\n RANDOMNESS_CIRCUIT_BREAKER_TRIPPED = 'RandomnessCircuitBreakerTripped',\n COMMITTEE_PUBLISHED = 'CommitteePublished',\n COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED = 'CommitteePublicKeyChunkPublished',\n COMMITTEE_FINALIZED = 'SortitionCommitteeFinalized',\n INTERFOLD_SET = 'InterfoldSet',\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RandomnessProviderEventType {\n RANDOMNESS_FULFILLED = 'RandomnessFulfilled',\n}\n\nexport type AllEventTypes = InterfoldEventType | RegistryEventType\n\nexport interface E3RequestedData {\n e3Id: bigint\n e3: {\n seed: bigint\n committeeSize: number\n requestBlock: bigint\n inputWindow: readonly [bigint, bigint]\n encryptionSchemeId: string\n e3Program: string\n paramSet: number\n decryptionVerifier: string\n committeePublicKey: string\n ciphertextOutput: string\n ciphertextCommitment: string\n plaintextOutput: string\n }\n cryptoConfigId: string\n}\n\nexport interface E3ActivatedData {\n e3Id: bigint\n expiration: bigint\n committeePublicKey: string\n}\n\nexport interface CiphertextOutputPublishedData {\n e3Id: bigint\n ciphertextOutput: string\n ciphertextCommitment: string\n}\n\nexport interface CiphertextOutputReferencePublishedData {\n e3Id: bigint\n contentHash: string\n ciphertextCommitment: string\n availabilityBlock: number\n availabilityLeafIndex: bigint\n}\n\nexport interface PlaintextOutputPublishedData {\n e3Id: bigint\n plaintextOutput: string\n proof: string\n}\n\nexport interface CiphernodeAddedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CiphernodeRemovedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CommitteeRequestedData {\n e3Id: bigint\n entropyBlock: bigint\n threshold: [bigint, bigint]\n requestBlock: bigint\n committeeDeadline: bigint\n ticketPrice: bigint\n}\n\nexport interface CommitteeRandomnessRequestedData {\n e3Id: bigint\n requestId: bigint\n provider: string\n randomnessDeadline: bigint\n}\n\nexport interface RandomnessCircuitBreakerTrippedData {\n e3Id: bigint\n requestId: bigint\n randomnessProvider: string\n}\n\nexport interface RandomnessFulfilledData {\n requestId: bigint\n e3Id: bigint\n randomWord: bigint\n fulfilledAt: bigint\n}\n\nexport interface CommitteePublishedData {\n e3Id: bigint\n nodes: string[]\n publicKey: string\n pkCommitment: string\n proof: string\n}\n\nexport interface CommitteePublicKeyChunkPublishedData {\n e3Id: bigint\n publisher: string\n candidateHash: string\n nodes: string[]\n pkCommitment: string\n chunkIndex: number\n chunkCount: number\n totalLength: number\n chunk: string\n}\n\nexport interface CommitteeFinalizedData {\n e3Id: bigint\n committee: string[]\n scores: bigint[]\n}\n\nexport interface InterfoldEventData {\n [InterfoldEventType.E3_REQUESTED]: E3RequestedData\n [InterfoldEventType.CIPHERTEXT_OUTPUT_PUBLISHED]: CiphertextOutputPublishedData\n [InterfoldEventType.CIPHERTEXT_OUTPUT_REFERENCE_PUBLISHED]: CiphertextOutputReferencePublishedData\n [InterfoldEventType.PLAINTEXT_OUTPUT_PUBLISHED]: PlaintextOutputPublishedData\n [InterfoldEventType.E3_PROGRAM_REGISTERED]: { e3Program: string }\n [InterfoldEventType.ENCRYPTION_SCHEME_ENABLED]: { encryptionSchemeId: string }\n [InterfoldEventType.CIPHERNODE_REGISTRY_SET]: { ciphernodeRegistry: string }\n [InterfoldEventType.MAX_DURATION_SET]: { maxDuration: bigint }\n [InterfoldEventType.PARAM_SET_REGISTERED]: { paramSet: number; encodedParams: string }\n [InterfoldEventType.OWNERSHIP_TRANSFERRED]: { previousOwner: string; newOwner: string }\n [InterfoldEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface RegistryEventData {\n [RegistryEventType.COMMITTEE_REQUESTED]: CommitteeRequestedData\n [RegistryEventType.COMMITTEE_RANDOMNESS_REQUESTED]: CommitteeRandomnessRequestedData\n [RegistryEventType.RANDOMNESS_CIRCUIT_BREAKER_TRIPPED]: RandomnessCircuitBreakerTrippedData\n [RegistryEventType.COMMITTEE_PUBLISHED]: CommitteePublishedData\n [RegistryEventType.COMMITTEE_PUBLIC_KEY_CHUNK_PUBLISHED]: CommitteePublicKeyChunkPublishedData\n [RegistryEventType.COMMITTEE_FINALIZED]: CommitteeFinalizedData\n [RegistryEventType.INTERFOLD_SET]: { interfold: string }\n [RegistryEventType.OWNERSHIP_TRANSFERRED]: { previousOwner: string; newOwner: string }\n [RegistryEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface InterfoldEvent<T extends AllEventTypes> {\n type: T\n data: T extends InterfoldEventType ? InterfoldEventData[T] : T extends RegistryEventType ? RegistryEventData[T] : unknown\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport interface RandomnessProviderEvent<T extends RandomnessProviderEventType = RandomnessProviderEventType> {\n type: T\n data: RandomnessFulfilledData\n provider: `0x${string}`\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport type RandomnessProviderEventCallback<T extends RandomnessProviderEventType = RandomnessProviderEventType> = (\n event: RandomnessProviderEvent<T>,\n) => void | Promise<void>\n\nexport type EventCallback<T extends AllEventTypes = AllEventTypes> = (event: InterfoldEvent<T>) => void | Promise<void>\n\nexport interface EventFilter<T = unknown> {\n address?: `0x${string}`\n fromBlock?: bigint\n toBlock?: bigint\n args?: Partial<T>\n}\n\nexport interface SDKEventEmitter {\n on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n emit<T extends AllEventTypes>(event: InterfoldEvent<T>): void\n}\n\nexport interface EventListenerConfig {\n fromBlock?: bigint\n toBlock?: bigint\n /** Maximum block span for each historical RPC query. */\n historicalBlockRange?: bigint\n polling?: boolean\n pollingInterval?: number\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Address, type Hash, type Log, PublicClient, encodeAbiParameters } from 'viem'\nimport type { BfvParams } from './types'\n\nexport class SDKError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message)\n this.name = 'SDKError'\n }\n}\n\nexport function isValidAddress(address: string): address is Address {\n return /^0x[a-fA-F0-9]{40}$/.test(address)\n}\n\nexport function isValidHash(hash: string): hash is Hash {\n return /^0x[a-fA-F0-9]{64}$/.test(hash)\n}\n\nexport function formatEventName(contractName: string, eventName: string): string {\n return `${contractName}.${eventName}`\n}\n\nexport function parseEventData<T>(log: Log): T {\n return log.data as unknown as T\n}\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport const sleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function formatBigInt(value: bigint): string {\n return value.toString()\n}\n\nexport function parseBigInt(value: string): bigint {\n return BigInt(value)\n}\n\nexport function generateEventId(log: Log): string {\n return `${log.blockHash}-${log.logIndex}`\n}\n\n/**\n * Get the current timestamp in seconds\n * from onchain\n * @param publicClient - The public client to use\n */\nexport async function getCurrentTimestamp(publicClient: PublicClient): Promise<bigint> {\n const block = await publicClient.getBlock()\n return block.timestamp\n}\n\n// Compute provider parameters structure\nexport interface ComputeProviderParams {\n name: string\n parallel: boolean\n batch_size: number\n}\n\n// Default compute provider configuration\nexport const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = {\n name: 'risc0',\n parallel: false,\n batch_size: 2,\n}\n\n// Default E3 configuration (`committeeSize` is `IInterfold.CommitteeSize`, not circuit N_PARTIES).\nexport const DEFAULT_E3_CONFIG = {\n committeeSize: 0, // CommitteeSize.Minimum\n duration: 1800, // 30 minutes in seconds\n payment_amount: '0', // 0 ETH in wei\n} as const\n\nexport function cryptoConfigIdForParamSet(paramSet: number): Hash {\n if (paramSet === 0) {\n return '0x04f3677e73b0f5066d6caf5cbd92e3fb2e38338edaf5cfc971ab28f7b684da78'\n }\n if (paramSet === 1) {\n return '0xd9c86e581f8291ffb5b63595600e8d096ed30b16e2e0a6634a76c22b1f58fb4e'\n }\n throw new SDKError(`Unsupported BFV parameter set: ${paramSet}`, 'UNSUPPORTED_CRYPTO_CONFIG')\n}\n\n/**\n * Encode BFV parameters for the smart contract\n * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption\n */\nexport function encodeBfvParams(params: BfvParams): `0x${string}` {\n const { degree, plaintextModulus, moduli, error1Variance } = params\n\n if (error1Variance === undefined) {\n throw new SDKError(\n 'error1Variance is required in ProtocolParams. All BFV parameter sets must specify error1_variance.',\n 'MISSING_ERROR1_VARIANCE',\n )\n }\n\n return encodeAbiParameters(\n [\n {\n name: 'bfvParams',\n type: 'tuple',\n components: [\n { name: 'degree', type: 'uint256' },\n { name: 'plaintext_modulus', type: 'uint256' },\n { name: 'moduli', type: 'uint256[]' },\n { name: 'error1_variance', type: 'string' },\n ],\n },\n ],\n [\n {\n degree: BigInt(degree),\n plaintext_modulus: BigInt(plaintextModulus),\n moduli: [...moduli],\n error1_variance: error1Variance,\n },\n ],\n )\n}\n\n/**\n * Encode compute provider parameters for the smart contract'\n * If mock is true, the compute provider parameters will return 32 bytes of 0x00\n */\nexport function encodeComputeProviderParams(params: ComputeProviderParams, mock: boolean = false): `0x${string}` {\n if (mock) {\n return `0x${'00'.repeat(32)}` as `0x${string}`\n }\n\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Encode custom parameters for the smart contract.\n */\nexport function encodeCustomParams(params: Record<string, unknown>): `0x${string}` {\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n// inputWindow[0] is always larger than now and dkg deadline\nexport const inputWindowStartBuffer = 15n\n\n/**\n * Calculate start window for E3 request\n * @dev This function can be used for testing purposes, or for E3s which need to start as soon as possible.\n * @param publicClient - The public client to use\n * @param duration - The duration of the input window in seconds\n * @param startBuffer - Buffer in seconds added to current timestamp for input window start\n */\nexport async function calculateInputWindow(\n publicClient: PublicClient,\n duration: number = DEFAULT_E3_CONFIG.duration,\n startBuffer: bigint = inputWindowStartBuffer,\n): Promise<[bigint, bigint]> {\n const now = await getCurrentTimestamp(publicClient)\n return [BigInt(now) + startBuffer, BigInt(now) + startBuffer + BigInt(duration)]\n}\n\n/**\n * Decode plaintextOutput bytes to get the actual result number\n */\nexport function decodePlaintextOutput(plaintextOutput: string): number | null {\n try {\n // Remove '0x' prefix if present\n const hex = plaintextOutput.startsWith('0x') ? plaintextOutput.slice(2) : plaintextOutput\n\n // Convert hex to bytes\n const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [])\n\n if (bytes.length < 8) {\n console.warn('Plaintext output too short for u64 decoding')\n return null\n }\n\n // Decode first u64 (8 bytes) as little-endian\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const result = view.getBigUint64(0, true) // true for little-endian\n\n return Number(result)\n } catch (error) {\n console.error('Failed to decode plaintext output:', error)\n return null\n }\n}\n\n// Helper function to convert proof bytes to field elements\nexport function proofToFields(proof: Uint8Array): string[] {\n const fields: string[] = []\n for (let i = 0; i < proof.length; i += 32) {\n const chunk = proof.slice(i, i + 32)\n fields.push('0x' + Buffer.from(chunk).toString('hex'))\n }\n return fields\n}\n"],"mappings":"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","names":["InterfoldEventType","RegistryEventType","RandomnessProviderEventType"]}