diff --git a/packages/interfold-sdk/src/events/event-listener.ts b/packages/interfold-sdk/src/events/event-listener.ts index dfaf651c58..bd4f482b3a 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)