Skip to content

Commit a9ba748

Browse files
committed
check custom filter in persistence
1 parent ba21422 commit a9ba748

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

src/processors/persistence-filters.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,46 @@
1-
import { Log, Trace, logFilter, traceFilter } from '@originprotocol/squid-utils'
1+
import { Context, Log, Trace, logFilter, traceFilter } from '@originprotocol/squid-utils'
22

33
type LogFilterInstance = ReturnType<typeof logFilter>
44
type TraceFilterInstance = ReturnType<typeof traceFilter>
5+
type CustomFilter = (ctx: Context, log: Log) => Promise<{ include: boolean }> | { include: boolean }
56

6-
const logFilters: LogFilterInstance[] = []
7+
interface RegisteredLogFilter {
8+
filter: LogFilterInstance
9+
customFilter?: CustomFilter
10+
}
11+
12+
const logFilters: RegisteredLogFilter[] = []
713
const traceFilters: TraceFilterInstance[] = []
814

9-
export const registerLogFilter = (filter: LogFilterInstance) => {
10-
logFilters.push(filter)
15+
export const registerLogFilter = (filter: LogFilterInstance, customFilter?: CustomFilter) => {
16+
logFilters.push({ filter, customFilter })
1117
}
1218

1319
export const registerTraceFilter = (filter: TraceFilterInstance) => {
1420
traceFilters.push(filter)
1521
}
1622

23+
/**
24+
* Check if a log matches any registered filter.
25+
* Filters with a customFilter require the async version (matchesAnyLogFilterAsync).
26+
* This sync version only checks filters without customFilters.
27+
*/
1728
export const matchesAnyLogFilter = (log: Log): boolean => {
18-
return logFilters.some((f) => f.matches(log))
29+
return logFilters.some((f) => f.filter.matches(log))
30+
}
31+
32+
/**
33+
* Check if a log matches any registered filter, including custom filters.
34+
* A log matches if any filter's subscription matches AND its customFilter (if present) returns include: true.
35+
*/
36+
export const matchesAnyLogFilterAsync = async (ctx: Context, log: Log): Promise<boolean> => {
37+
for (const { filter, customFilter } of logFilters) {
38+
if (!filter.matches(log)) continue
39+
if (!customFilter) return true
40+
const result = await customFilter(ctx, log)
41+
if (result.include) return true
42+
}
43+
return false
1944
}
2045

2146
export const matchesAnyTraceFilter = (trace: Trace): boolean => {

src/processors/persistence.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { AbiData } from '../model'
44
import { EventRecord } from '../model'
55
import { TraceRecord } from '../model'
66
import { abiRegistry } from '../utils/abi-registry'
7-
import { matchesAnyLogFilter, matchesAnyTraceFilter } from './persistence-filters'
7+
import { matchesAnyLogFilterAsync, matchesAnyTraceFilter } from './persistence-filters'
88

99
export const persistenceProcessor = defineProcessor({
1010
name: 'Persistence',
@@ -27,7 +27,7 @@ export const persistenceProcessor = defineProcessor({
2727
const blockHash = block.header.hash
2828

2929
for (const log of block.logs) {
30-
if (!matchesAnyLogFilter(log)) continue
30+
if (!(await matchesAnyLogFilterAsync(ctx, log))) continue
3131
const id = `${ctx.chain.id}:${blockNumber}:${log.transactionIndex}:${log.logIndex}`
3232
const topic0 = log.topics[0]
3333
if (!topic0) continue

src/templates/event.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export const createEventProcessor = ({
4848
topic3,
4949
transaction: true,
5050
})
51-
registerLogFilter(filter)
51+
registerLogFilter(filter, track.customFilter)
5252
for (const af of additionalFilters ?? []) registerLogFilter(af)
5353
return { track, filter, entries, additionalFilters }
5454
})

0 commit comments

Comments
 (0)