Skip to content

Commit 33b3ed4

Browse files
committed
feat: strategy timings cache
1 parent 89c258a commit 33b3ed4

35 files changed

+635
-53
lines changed

apps/processing/src/services/sharedDependencies.service.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
KyselyRoundRepository,
2222
KyselyStrategyProcessingCheckpointRepository,
2323
KyselyStrategyRegistryRepository,
24+
KyselyStrategyTimingsCache,
2425
KyselyTransactionManager,
2526
} from "@grants-stack-indexer/repository";
2627
import {
@@ -136,6 +137,10 @@ export class SharedDependenciesService {
136137
kyselyDatabase,
137138
env.DATABASE_SCHEMA,
138139
);
140+
const strategyTimingsRepository = new KyselyStrategyTimingsCache(
141+
kyselyDatabase,
142+
env.DATABASE_SCHEMA,
143+
);
139144

140145
const strategyProcessingCheckpointRepository =
141146
new KyselyStrategyProcessingCheckpointRepository(kyselyDatabase, env.DATABASE_SCHEMA);
@@ -165,6 +170,7 @@ export class SharedDependenciesService {
165170
attestationRepository,
166171
transactionManager,
167172
legacyProjectRepository,
173+
strategyTimingsRepository,
168174
},
169175
registriesRepositories: {
170176
eventRegistryRepository,

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
"type": "module",
99
"scripts": {
1010
"api:configure": "pnpm run --filter @grants-stack-indexer/hasura-config api:configure",
11+
"bootstrap:all": "pnpm run --filter @grants-stack-indexer/bootstrap bootstrap:metadata bootstrap:pricing bootstrap:strategyTimings",
1112
"bootstrap:metadata": "pnpm run --filter @grants-stack-indexer/bootstrap bootstrap:metadata",
1213
"bootstrap:pricing": "pnpm run --filter @grants-stack-indexer/bootstrap bootstrap:pricing",
14+
"bootstrap:strategyTimings": "pnpm run --filter @grants-stack-indexer/bootstrap bootstrap:strategyTimings",
1315
"build": "turbo run build",
1416
"check-types": "turbo run check-types",
1517
"clean": "turbo run clean",

packages/data-flow/src/orchestrator.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,12 @@ export class Orchestrator {
196196
{ abortSignal: signal },
197197
);
198198
processedEvents++;
199-
this.logger.info(`Processed events: ${processedEvents}/${totalEvents}`, {
200-
className: Orchestrator.name,
201-
chainId: this.chainId,
202-
});
199+
if (processedEvents % 1000 === 0) {
200+
this.logger.info(`Processed events: ${processedEvents}/${totalEvents}`, {
201+
className: Orchestrator.name,
202+
chainId: this.chainId,
203+
});
204+
}
203205
} catch (error: unknown) {
204206
if (event) {
205207
await this.eventsRegistry.saveLastProcessedEvent(this.chainId, {

packages/data-flow/src/types/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import {
55
IApplicationPayoutRepository,
66
IApplicationRepository,
77
IAttestationRepository,
8+
ICache,
89
IDonationRepository,
910
ILegacyProjectRepository,
1011
IProjectRepository,
1112
IRoundRepository,
1213
ITransactionManager,
14+
StrategyTimings,
1315
} from "@grants-stack-indexer/repository";
14-
import { ICacheable } from "@grants-stack-indexer/shared";
16+
import { Address, ICacheable } from "@grants-stack-indexer/shared";
1517

1618
/**
1719
* The core dependencies for the data flow
@@ -34,4 +36,5 @@ export type CoreDependencies = Pick<
3436
attestationRepository: IAttestationRepository;
3537
transactionManager: ITransactionManager;
3638
legacyProjectRepository: ILegacyProjectRepository;
39+
strategyTimingsRepository: ICache<Address, StrategyTimings>;
3740
};

packages/data-flow/test/integration/helpers/dependencies.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export const createMockRepositories = (): Pick<
2323
| "transactionManager"
2424
| "attestationRepository"
2525
| "legacyProjectRepository"
26+
| "strategyTimingsRepository"
2627
> => ({
2728
projectRepository: {
2829
getProjects: vi.fn(),
@@ -87,6 +88,10 @@ export const createMockRepositories = (): Pick<
8788
attestationRepository: {
8889
insertAttestation: vi.fn(),
8990
},
91+
strategyTimingsRepository: {
92+
get: vi.fn(),
93+
set: vi.fn(),
94+
},
9095
});
9196

9297
// Mock providers

packages/data-flow/test/unit/orchestrator.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
IApplicationPayoutRepository,
1111
IApplicationRepository,
1212
IAttestationRepository,
13+
ICache,
1314
IDonationRepository,
1415
IEventRegistryRepository,
1516
ILegacyProjectRepository,
@@ -18,6 +19,7 @@ import {
1819
ITransactionManager,
1920
RoundNotFound,
2021
RoundNotFoundForId,
22+
StrategyTimings,
2123
} from "@grants-stack-indexer/repository";
2224
import {
2325
AlloEvent,
@@ -123,6 +125,7 @@ describe("Orchestrator", { sequential: true }, () => {
123125
applicationPayoutRepository: {} as unknown as IApplicationPayoutRepository,
124126
attestationRepository: {} as unknown as IAttestationRepository,
125127
legacyProjectRepository: {} as unknown as ILegacyProjectRepository,
128+
strategyTimingsRepository: {} as unknown as ICache<Address, StrategyTimings>,
126129
pricingProvider: mockPricingProvider,
127130
metadataProvider: mockMetadataProvider,
128131
};

packages/data-flow/test/unit/retroactiveProcessor.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@ import {
66
IApplicationPayoutRepository,
77
IApplicationRepository,
88
IAttestationRepository,
9+
ICache,
910
IDonationRepository,
1011
ILegacyProjectRepository,
1112
IProjectRepository,
1213
IRoundRepository,
1314
IStrategyProcessingCheckpointRepository,
1415
ITransactionManager,
1516
Strategy,
17+
StrategyTimings,
1618
} from "@grants-stack-indexer/repository";
1719
import {
20+
Address,
1821
ChainId,
1922
ContractToEventName,
2023
DeepPartial,
@@ -147,6 +150,7 @@ describe("RetroactiveProcessor", () => {
147150
attestationRepository: {} as IAttestationRepository,
148151
legacyProjectRepository: {} as ILegacyProjectRepository,
149152
transactionManager: {} as ITransactionManager,
153+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
150154
pricingProvider: {
151155
getTokenPrice: vi.fn(),
152156
getTokenPrices: vi.fn(),

packages/indexer-client/src/providers/envioIndexerClient.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,14 @@ export class EnvioIndexerClient implements IIndexerClient {
205205
vars["toLogIndex"] = to.logIndex;
206206
}
207207

208-
const whereClause =
208+
let whereClause =
209209
andConditions.length > 1
210210
? `_and: [{ ${andConditions.join(" }, { ")} }]`
211211
: andConditions[0];
212212

213+
if (params.eventName) {
214+
whereClause += `, event_name: { _eq: "${params.eventName}" }`;
215+
}
213216
const response = (await this.client.request(
214217
gql`
215218
query getEvents(

packages/indexer-client/src/types/indexerClient.types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,8 @@ export type GetEventsFilters = {
3333
* Limit of events to fetch
3434
*/
3535
limit?: number;
36+
/**
37+
* Name of the event to fetch
38+
*/
39+
eventName?: string;
3640
};

packages/processors/src/processors/allo/handlers/poolCreated.handler.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ import { RoundMetadataSchema } from "../../../schemas/index.js";
1111

1212
type Dependencies = Pick<
1313
ProcessorDependencies,
14-
"evmProvider" | "pricingProvider" | "metadataProvider" | "roundRepository"
14+
| "evmProvider"
15+
| "pricingProvider"
16+
| "metadataProvider"
17+
| "roundRepository"
18+
| "strategyTimingsRepository"
1519
>;
1620

1721
/**
@@ -33,7 +37,7 @@ export class PoolCreatedHandler implements IEventHandler<"Allo", "PoolCreated">
3337
) {}
3438

3539
async handle(): Promise<Changeset[]> {
36-
const { metadataProvider, evmProvider } = this.dependencies;
40+
const { metadataProvider, evmProvider, strategyTimingsRepository } = this.dependencies;
3741
const metadataPointer = this.event.params.metadata[1];
3842
const {
3943
poolId,
@@ -76,7 +80,18 @@ export class PoolCreatedHandler implements IEventHandler<"Allo", "PoolCreated">
7680
};
7781

7882
if (strategyHandler) {
79-
strategyTimings = await strategyHandler.fetchStrategyTimings(strategyAddress);
83+
const strategyTimingsOnRegistry = await strategyTimingsRepository.get(strategyAddress);
84+
if (strategyTimingsOnRegistry) {
85+
strategyTimings = strategyTimingsOnRegistry.timings as unknown as StrategyTimings;
86+
} else {
87+
strategyTimings = await strategyHandler.fetchStrategyTimings(strategyAddress);
88+
await strategyTimingsRepository.set(strategyAddress, {
89+
address: strategyAddress,
90+
timings: JSON.stringify(strategyTimings),
91+
strategyId,
92+
createdAt: new Date(),
93+
});
94+
}
8095
if (parsedRoundMetadata.success && token) {
8196
matchAmountObj = await strategyHandler.fetchMatchAmount(
8297
Number(parsedRoundMetadata.data.quadraticFundingConfig.matchingFundsAvailable),
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import type { EvmProvider } from "@grants-stack-indexer/chain-providers";
22
import type {
33
IApplicationReadRepository,
4+
ICache,
45
IProjectReadRepository,
56
IRoundReadRepository,
7+
StrategyTimings,
68
} from "@grants-stack-indexer/repository";
79
import { IMetadataProvider } from "@grants-stack-indexer/metadata";
810
import { IPricingProvider } from "@grants-stack-indexer/pricing";
9-
import { ILogger } from "@grants-stack-indexer/shared";
11+
import { Address, ILogger } from "@grants-stack-indexer/shared";
1012

1113
export type ProcessorDependencies = {
1214
evmProvider: EvmProvider;
@@ -15,5 +17,6 @@ export type ProcessorDependencies = {
1517
roundRepository: IRoundReadRepository;
1618
projectRepository: IProjectReadRepository;
1719
applicationRepository: IApplicationReadRepository;
20+
strategyTimingsRepository: ICache<Address, StrategyTimings>;
1821
logger: ILogger;
1922
};

packages/processors/test/allo/allo.processor.spec.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,18 @@ import type { IMetadataProvider } from "@grants-stack-indexer/metadata";
55
import type { IPricingProvider } from "@grants-stack-indexer/pricing";
66
import type {
77
IApplicationReadRepository,
8+
ICache,
89
IProjectReadRepository,
910
IRoundReadRepository,
11+
StrategyTimings,
1012
} from "@grants-stack-indexer/repository";
11-
import type { AlloEvent, ChainId, ILogger, ProcessorEvent } from "@grants-stack-indexer/shared";
13+
import type {
14+
Address,
15+
AlloEvent,
16+
ChainId,
17+
ILogger,
18+
ProcessorEvent,
19+
} from "@grants-stack-indexer/shared";
1220

1321
import { UnsupportedEventException } from "../../src/internal.js";
1422
import { AlloProcessor } from "../../src/processors/allo/allo.processor.js";
@@ -50,6 +58,7 @@ describe("AlloProcessor", () => {
5058
roundRepository: mockRoundRepository,
5159
projectRepository: {} as IProjectReadRepository,
5260
applicationRepository: {} as IApplicationReadRepository,
61+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
5362
logger,
5463
});
5564

packages/processors/test/allo/handlers/poolCreated.handler.spec.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,14 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
44
import type { EvmProvider } from "@grants-stack-indexer/chain-providers";
55
import type { IMetadataProvider } from "@grants-stack-indexer/metadata";
66
import type { IPricingProvider } from "@grants-stack-indexer/pricing";
7-
import type { IRoundReadRepository, Round } from "@grants-stack-indexer/repository";
87
import type {
8+
ICache,
9+
IRoundReadRepository,
10+
Round,
11+
StrategyTimings,
12+
} from "@grants-stack-indexer/repository";
13+
import type {
14+
Address,
915
ChainId,
1016
DeepPartial,
1117
ProcessorEvent,
@@ -94,6 +100,7 @@ describe("PoolCreatedHandler", () => {
94100
pricingProvider: mockPricingProvider,
95101
metadataProvider: mockMetadataProvider,
96102
roundRepository: mockRoundRepository,
103+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
97104
});
98105

99106
const result = await handler.handle();
@@ -121,6 +128,7 @@ describe("PoolCreatedHandler", () => {
121128
pricingProvider: mockPricingProvider,
122129
metadataProvider: mockMetadataProvider,
123130
roundRepository: mockRoundRepository,
131+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
124132
});
125133

126134
const result = await handler.handle();
@@ -183,6 +191,7 @@ describe("PoolCreatedHandler", () => {
183191
pricingProvider: mockPricingProvider,
184192
metadataProvider: mockMetadataProvider,
185193
roundRepository: mockRoundRepository,
194+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
186195
});
187196

188197
const result = await handler.handle();
@@ -258,6 +267,7 @@ describe("PoolCreatedHandler", () => {
258267
pricingProvider: mockPricingProvider,
259268
metadataProvider: mockMetadataProvider,
260269
roundRepository: mockRoundRepository,
270+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
261271
});
262272

263273
const result = await handler.handle();
@@ -288,6 +298,7 @@ describe("PoolCreatedHandler", () => {
288298
pricingProvider: mockPricingProvider,
289299
metadataProvider: mockMetadataProvider,
290300
roundRepository: mockRoundRepository,
301+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
291302
});
292303

293304
const result = await handler.handle();
@@ -326,6 +337,7 @@ describe("PoolCreatedHandler", () => {
326337
pricingProvider: mockPricingProvider,
327338
metadataProvider: mockMetadataProvider,
328339
roundRepository: mockRoundRepository,
340+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
329341
});
330342

331343
await expect(() => handler.handle()).rejects.toThrow("Token price not found");
@@ -378,6 +390,7 @@ describe("PoolCreatedHandler", () => {
378390
pricingProvider: mockPricingProvider,
379391
metadataProvider: mockMetadataProvider,
380392
roundRepository: mockRoundRepository,
393+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
381394
});
382395

383396
const result = await handler.handle();
@@ -462,6 +475,7 @@ describe("PoolCreatedHandler", () => {
462475
pricingProvider: mockPricingProvider,
463476
metadataProvider: mockMetadataProvider,
464477
roundRepository: mockRoundRepository,
478+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
465479
});
466480

467481
await handler.handle();
@@ -489,6 +503,7 @@ describe("PoolCreatedHandler", () => {
489503
pricingProvider: mockPricingProvider,
490504
metadataProvider: mockMetadataProvider,
491505
roundRepository: mockRoundRepository,
506+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
492507
});
493508

494509
const result = await handler.handle();

packages/processors/test/alloV1ToV2Migration/allo/alloV1ToV2Migration.processor.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import type { IMetadataProvider } from "@grants-stack-indexer/metadata";
55
import type { IPricingProvider } from "@grants-stack-indexer/pricing";
66
import type {
77
IApplicationReadRepository,
8+
ICache,
89
IProjectReadRepository,
910
IRoundReadRepository,
11+
StrategyTimings,
1012
} from "@grants-stack-indexer/repository";
11-
import type { ChainId, ILogger, ProcessorEvent } from "@grants-stack-indexer/shared";
13+
import type { Address, ChainId, ILogger, ProcessorEvent } from "@grants-stack-indexer/shared";
1214

1315
import { UnsupportedEventException } from "../../../src/internal.js";
1416
import {
@@ -52,6 +54,7 @@ describe("AlloV1ToV2ProfileMigrationProcessor", () => {
5254
roundRepository: mockRoundRepository,
5355
projectRepository: {} as IProjectReadRepository,
5456
applicationRepository: {} as IApplicationReadRepository,
57+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
5558
logger,
5659
});
5760

packages/processors/test/gitcoinAttestationNetwork/gitcoinAttestationNetwork.processor.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ import type { IMetadataProvider } from "@grants-stack-indexer/metadata";
55
import type { IPricingProvider } from "@grants-stack-indexer/pricing";
66
import type {
77
IApplicationReadRepository,
8+
ICache,
89
IProjectReadRepository,
910
IRoundReadRepository,
11+
StrategyTimings,
1012
} from "@grants-stack-indexer/repository";
1113
import type {
14+
Address,
1215
ChainId,
1316
GitcoinAttestationNetworkEvent,
1417
ILogger,
@@ -62,6 +65,7 @@ describe("GitcoinAttestationNetworkProcessor", () => {
6265
roundRepository: mockRoundRepository,
6366
projectRepository: mockProjectRepository,
6467
applicationRepository: mockApplicationRepository,
68+
strategyTimingsRepository: {} as ICache<Address, StrategyTimings>,
6569
logger,
6670
});
6771
});

0 commit comments

Comments
 (0)