From 03c62f7c9f54664e47f2f5018d63f2e54d719da0 Mon Sep 17 00:00:00 2001 From: Ethan Date: Sat, 22 Aug 2026 11:34:31 +0100 Subject: [PATCH 1/2] Fix event polling to fetch and emit new events ## Description ### Problem `packages/interfold-sdk/src/events/event-listener.ts` had a bug in `pollForEvents():` it only advanced `lastBlockNumber` without fetching or emitting logs. As a result, `startEventPolling()` could never trigger event callbacks. This contradicts the documented behavior in `docs/pages/sdk.mdx`, which states that `sdk.startEventPolling()` can be used to poll logs over HTTP when WebSockets are unavailable. ### Fix - Fetch historical events for each subscribed event type between the last and current block. - Emit fetched logs through the existing `emit()` pipeline. - Extract `buildEvent()` to share event construction between polling and WebSocket watchers. - Advance `lastBlockNumber` only after successful event processing. The existing event tests in `packages/interfold-sdk/tests/events.test.ts` confirm that emitted events are delivered to registered callbacks. --- .../src/events/event-listener.ts | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/packages/interfold-sdk/src/events/event-listener.ts b/packages/interfold-sdk/src/events/event-listener.ts index dfaf651c58..b2651afc89 100644 --- a/packages/interfold-sdk/src/events/event-listener.ts +++ b/packages/interfold-sdk/src/events/event-listener.ts @@ -105,19 +105,7 @@ export class EventListener implements SDKEventEmitter { for (let i = 0; i < logs.length; i++) { const log = logs[i] if (!log) break - const event: InterfoldEvent = { - type: eventType, - data: (log as unknown as { args: unknown }).args as T extends InterfoldEventTypeT - ? InterfoldEventData[T] - : T extends RegistryEventTypeT - ? RegistryEventData[T] - : unknown, - log, - timestamp: new Date(), - blockNumber: log.blockNumber ?? BigInt(0), - transactionHash: log.transactionHash ?? '0x', - } - emitter.emit(event) + emitter.emit(emitter.buildEvent(eventType, log)) } }, }) @@ -129,6 +117,21 @@ export class EventListener implements SDKEventEmitter { } } + private buildEvent(eventType: T, log: Log): InterfoldEvent { + return { + type: eventType, + data: (log as unknown as { args: unknown }).args as T extends InterfoldEventTypeT + ? InterfoldEventData[T] + : T extends RegistryEventTypeT + ? RegistryEventData[T] + : unknown, + log, + timestamp: new Date(), + blockNumber: log.blockNumber ?? BigInt(0), + transactionHash: log.transactionHash ?? '0x', + } + } + public async watchLogs(address: `0x${string}`, callback: (log: Log) => void): Promise { const watcherKey = `logs:${address}` @@ -249,11 +252,21 @@ export class EventListener implements SDKEventEmitter { while (this.isPolling) { try { const currentBlock = await this.publicClient.getBlockNumber() - + if (currentBlock > this.lastBlockNumber) { + const fromBlock = this.lastBlockNumber + BigInt(1) + + for (const eventType of this.listeners.keys()) { + const logs = await this.getHistoricalEvents(eventType, fromBlock, currentBlock) + + for (const log of logs) { + this.emit(this.buildEvent(eventType, log)) + } + } + this.lastBlockNumber = currentBlock } - + await sleep(this.config.pollingInterval || 5000) } catch (error) { console.error('Error during polling:', error) @@ -261,4 +274,3 @@ export class EventListener implements SDKEventEmitter { } } } -} From bf209261373d451f82cce55a78551b85f8238d02 Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 26 Aug 2026 07:24:45 +0100 Subject: [PATCH 2/2] Add missing newline at end of event-listener.ts --- packages/interfold-sdk/src/events/event-listener.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/interfold-sdk/src/events/event-listener.ts b/packages/interfold-sdk/src/events/event-listener.ts index b2651afc89..bd4f482b3a 100644 --- a/packages/interfold-sdk/src/events/event-listener.ts +++ b/packages/interfold-sdk/src/events/event-listener.ts @@ -274,3 +274,4 @@ export class EventListener implements SDKEventEmitter { } } } +}