@merkl/api 0.17.21 → 0.17.23

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.
Files changed (37) hide show
  1. package/dist/database/api/.generated/drizzle/schema.d.ts +46 -0
  2. package/dist/database/api/.generated/drizzle/schema.js +5 -1
  3. package/dist/database/api/.generated/drizzle/schema.ts +8 -1
  4. package/dist/database/api/.generated/edge.js +26 -4
  5. package/dist/database/api/.generated/index-browser.js +7 -1
  6. package/dist/database/api/.generated/index.d.ts +149 -2
  7. package/dist/database/api/.generated/index.js +26 -4
  8. package/dist/database/api/.generated/package.json +1 -1
  9. package/dist/database/api/.generated/schema.prisma +29 -8
  10. package/dist/database/api/.generated/wasm.js +7 -1
  11. package/dist/src/eden/index.d.ts +241 -10
  12. package/dist/src/index.d.ts +53 -2
  13. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +40 -1
  14. package/dist/src/modules/v4/campaign/campaign.controller.js +16 -1
  15. package/dist/src/modules/v4/campaign/campaign.model.d.ts +14 -1
  16. package/dist/src/modules/v4/campaign/campaign.model.js +11 -1
  17. package/dist/src/modules/v4/campaign/campaign.repository.d.ts +64 -32
  18. package/dist/src/modules/v4/campaign/campaign.repository.js +84 -122
  19. package/dist/src/modules/v4/campaign/campaign.service.d.ts +61 -19
  20. package/dist/src/modules/v4/campaign/campaign.service.js +51 -63
  21. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +1 -0
  22. package/dist/src/modules/v4/opportunity/opportunity.converter.js +1 -0
  23. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +5 -0
  24. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +3 -0
  25. package/dist/src/modules/v4/programPayload/programPayload.repository.d.ts +100 -1
  26. package/dist/src/modules/v4/programPayload/programPayload.repository.js +146 -1
  27. package/dist/src/modules/v4/protocol/protocol.repository.d.ts +1 -0
  28. package/dist/src/modules/v4/router.d.ts +53 -2
  29. package/dist/src/modules/v4/status/status.service.js +1 -1
  30. package/dist/src/modules/v4/token/token.controller.d.ts +12 -1
  31. package/dist/src/modules/v4/token/token.controller.js +2 -2
  32. package/dist/src/modules/v4/token/token.service.d.ts +13 -1
  33. package/dist/src/modules/v4/token/token.service.js +1 -3
  34. package/dist/src/utils/error.d.ts +6 -0
  35. package/dist/src/utils/error.js +12 -0
  36. package/dist/tsconfig.package.tsbuildinfo +1 -1
  37. package/package.json +1 -1
@@ -2,7 +2,6 @@ import { CampaignService } from "./campaign.service";
2
2
  import { TokenService } from "../token/token.service";
3
3
  import { log } from "../../../utils/logger";
4
4
  import { apiDbClient, engineDbClient } from "../../../utils/prisma";
5
- import { ALL_CAMPAIGNS_FOR_CHAIN_AFTER } from "../../../utils/queries/allCampaigns";
6
5
  import { Prisma, RunStatus } from "../../../../database/api/.generated";
7
6
  import { MAX_COMPUTE_JOB_TIME } from "@sdk";
8
7
  import moment from "moment";
@@ -126,6 +125,17 @@ export class CampaignRepository {
126
125
  },
127
126
  });
128
127
  }
128
+ static async countLives(query) {
129
+ const now = moment().unix();
130
+ const where = {
131
+ ...query,
132
+ endTimestamp: { gte: now },
133
+ startTimestamp: { lte: now },
134
+ };
135
+ return await apiDbClient.campaign.count({
136
+ where,
137
+ });
138
+ }
129
139
  /**
130
140
  * Upserts a campaign in the database. If the campaign already exists, it updates the existing record;
131
141
  * otherwise, it creates a new one.
@@ -133,6 +143,8 @@ export class CampaignRepository {
133
143
  * @param {CreateCampaignModel} campaign - The campaign data to be upserted.
134
144
  * @returns The upserted campaign record.
135
145
  *
146
+ * @dev Should be the only way of creating campaigns in the database.
147
+ *
136
148
  * @throws {Error} If unable to fetch data for the reward token.
137
149
  *
138
150
  * @remarks
@@ -154,12 +166,18 @@ export class CampaignRepository {
154
166
  if (!rewardToken) {
155
167
  throw new Error(`unable to fetch data for token ${campaign.rewardTokenAddress}`);
156
168
  }
169
+ const previousCampaign = await CampaignRepository.findUnique(campaign.id);
170
+ const creatorAddress = previousCampaign?.manualOverrides?.includes("creatorAddress")
171
+ ? previousCampaign.creatorAddress
172
+ : campaign.creator;
157
173
  const params = JSON.parse(campaign.params);
158
- const opportunityId = OpportunityService.hashId({
159
- chainId: campaign.computeChainId,
160
- identifier: campaign.opportunityIdentifier,
161
- type: campaignType,
162
- });
174
+ const opportunityId = previousCampaign?.manualOverrides?.includes("opportunityId")
175
+ ? previousCampaign.opportunityId
176
+ : OpportunityService.hashId({
177
+ chainId: campaign.computeChainId,
178
+ identifier: campaign.opportunityIdentifier,
179
+ type: campaignType,
180
+ });
163
181
  const data = {
164
182
  id: campaign.id,
165
183
  amount: campaign.amount,
@@ -175,9 +193,9 @@ export class CampaignRepository {
175
193
  },
176
194
  Creator: {
177
195
  connectOrCreate: {
178
- where: { address: campaign.creator },
196
+ where: { address: creatorAddress },
179
197
  create: {
180
- address: campaign.creator,
198
+ address: creatorAddress,
181
199
  },
182
200
  },
183
201
  },
@@ -202,83 +220,12 @@ export class CampaignRepository {
202
220
  log.error(`Failed to upsert campaign ${campaign.campaignId}`, err);
203
221
  }
204
222
  }
205
- static async upsertMany(campaigns) {
206
- if (!campaigns.length)
207
- return { success: 0, fail: 0 };
208
- const campaignType = CampaignService.getTypeFromV3(campaigns[0].type);
209
- const data = [];
210
- for (const campaign of campaigns) {
211
- const [rewardToken] = await TokenService.getManyOrCreate([
212
- { chainId: campaign.chainId, address: campaign.rewardTokenAddress },
213
- ]);
214
- const opportunityId = OpportunityService.hashId({
215
- chainId: campaign.computeChainId,
216
- identifier: campaign.opportunityIdentifier,
217
- type: campaignType,
218
- });
219
- data.push({
220
- id: campaign.id,
221
- amount: campaign.amount,
222
- campaignId: campaign.campaignId,
223
- endTimestamp: BigInt(campaign.endTimestamp),
224
- params: JSON.parse(campaign.params),
225
- startTimestamp: BigInt(campaign.startTimestamp),
226
- type: campaignType,
227
- ComputeChain: {
228
- connect: {
229
- id: campaign.computeChainId,
230
- },
231
- },
232
- Creator: {
233
- connectOrCreate: {
234
- where: { address: campaign.creator },
235
- create: { address: campaign.creator },
236
- },
237
- },
238
- Opportunity: {
239
- connect: { id: opportunityId },
240
- },
241
- RewardToken: {
242
- connect: rewardToken ? { id: TokenService.hashId(rewardToken) } : undefined,
243
- },
244
- subType: campaign.subType,
245
- DistributionChain: { connect: { id: campaign.chainId } },
246
- });
247
- }
248
- const failedCampaigns = [];
249
- const successCampaigns = [];
250
- for (const campaign of data) {
251
- try {
252
- await apiDbClient.campaign.upsert({
253
- where: {
254
- // TODO: use id
255
- id: CampaignService.hashId({
256
- campaignId: campaign.campaignId,
257
- distributionChain: campaign.DistributionChain.connect?.id,
258
- }),
259
- },
260
- create: campaign,
261
- update: campaign,
262
- });
263
- successCampaigns.push(campaign);
264
- }
265
- catch (err) {
266
- log.error(`Failed to upsert campaign ${campaign.campaignId}`, err);
267
- failedCampaigns.push(campaign);
268
- }
269
- }
270
- return { success: successCampaigns.length, fail: failedCampaigns.length };
271
- }
272
223
  /**
273
- * Fetches the campaign data for a v3 campaign in database
274
- * @param chainId
275
- * @param timestamp from which campaigns endTimestamp are filtered
276
- * @returns
224
+ * Retrieves a campaign from the engine database by its chain and campaign id.
225
+ * @dev Types are different from the API database.
226
+ * @dev IDs are different from the API database.
227
+ * id in the engine database = campaignId in the API database
277
228
  */
278
- static async getFromEngineDb(chainId, timestamp) {
279
- //TODO use a typesafe fetching methode (this one is from campaignUpdater)
280
- return (await engineDbClient.$queryRaw(ALL_CAMPAIGNS_FOR_CHAIN_AFTER(chainId, timestamp)));
281
- }
282
229
  static async getFromEngineDbWithId(campaignIds) {
283
230
  return await engineDbClient.campaigns.findMany({
284
231
  where: {
@@ -291,18 +238,15 @@ export class CampaignRepository {
291
238
  },
292
239
  });
293
240
  }
294
- static async checkIfExist(id) {
295
- return !!(await apiDbClient.campaign.findFirst({
296
- select: {
297
- id: true,
298
- },
299
- where: {
300
- id,
301
- },
302
- }));
303
- }
304
241
  static async findUnique(id) {
305
242
  return await apiDbClient.campaign.findUnique({
243
+ include: {
244
+ DistributionChain: true,
245
+ ComputeChain: true,
246
+ RewardToken: true,
247
+ CampaignStatus: true,
248
+ Creator: true,
249
+ },
306
250
  where: {
307
251
  id,
308
252
  },
@@ -410,30 +354,6 @@ export class CampaignRepository {
410
354
  const args = CampaignRepository.transformQueryToPrismaFilters(query);
411
355
  return await apiDbClient.campaign.count(args);
412
356
  }
413
- static async countLives(chainId) {
414
- const now = moment().unix();
415
- return await apiDbClient.campaign.count({
416
- where: {
417
- distributionChainId: chainId,
418
- endTimestamp: {
419
- gte: now,
420
- },
421
- startTimestamp: {
422
- lte: now,
423
- },
424
- },
425
- });
426
- }
427
- static async findManyCampaignId(chainId) {
428
- return await apiDbClient.campaign.findMany({
429
- select: {
430
- campaignId: true,
431
- },
432
- where: {
433
- distributionChainId: chainId,
434
- },
435
- });
436
- }
437
357
  static async findChains() {
438
358
  const campaigns = await apiDbClient.campaign.findMany({
439
359
  select: { distributionChainId: true, id: true },
@@ -443,13 +363,55 @@ export class CampaignRepository {
443
363
  return acc;
444
364
  }, {});
445
365
  }
366
+ static async addManualOverride(id, field) {
367
+ const manualOverrides = (await apiDbClient.campaign.findUnique({
368
+ where: { id },
369
+ select: { manualOverrides: true },
370
+ }))?.manualOverrides ?? [];
371
+ if (!manualOverrides?.includes(field))
372
+ manualOverrides?.push(field);
373
+ await apiDbClient.campaign.update({
374
+ where: { id },
375
+ data: {
376
+ manualOverrides: {
377
+ set: manualOverrides,
378
+ },
379
+ },
380
+ });
381
+ }
382
+ static async removeManualOverride(id, field) {
383
+ const manualOverrides = (await apiDbClient.campaign.findUnique({
384
+ where: { id },
385
+ select: { manualOverrides: true },
386
+ }))?.manualOverrides ?? [];
387
+ await apiDbClient.campaign.update({
388
+ where: { id },
389
+ data: {
390
+ manualOverrides: {
391
+ set: manualOverrides.filter(override => override !== field),
392
+ },
393
+ },
394
+ });
395
+ }
446
396
  static async updateOpportunity(id, data) {
447
- const updateData = {
448
- Opportunity: {
449
- connect: { id: data.opportunityId },
397
+ await apiDbClient.campaign.update({
398
+ where: { id },
399
+ data: {
400
+ Opportunity: {
401
+ connect: { id: data.opportunityId },
402
+ },
450
403
  },
451
- };
452
- return await apiDbClient.campaign.update({ where: { id }, data: updateData });
404
+ });
405
+ await CampaignRepository.addManualOverride(id, "opportunityId");
406
+ }
407
+ static async updateCreator(id, creatorAddress) {
408
+ await apiDbClient.campaign.update({
409
+ where: { id },
410
+ data: {
411
+ creatorAddress: creatorAddress,
412
+ },
413
+ });
414
+ await CampaignRepository.addManualOverride(id, "creatorAddress");
453
415
  }
454
416
  static async updateMetaData(id, params) {
455
417
  const updateData = {
@@ -1,4 +1,5 @@
1
- import type { CampaignUnique, CampaignWithParams, CreateCampaignModel, GetCampaignQueryModel, UpdateCampaignModel, UpdateMetaDataCampaignModel } from "./";
1
+ import type { CampaignUnique, CampaignWithParams, CreateCampaignModel, GetCampaignQueryModel, UpdateCampaignCreatorModel, UpdateCampaignModel, UpdateMetaDataCampaignModel } from "./";
2
+ import type { CampaignManualOverride } from "../../../../database/api/.generated";
2
3
  import { Campaign as CampaignEnum, type CampaignParameters, type ChainId } from "@sdk";
3
4
  import { CampaignRepository } from "./campaign.repository";
4
5
  export declare abstract class CampaignService {
@@ -37,6 +38,7 @@ export declare abstract class CampaignService {
37
38
  amount: string;
38
39
  opportunityId: string;
39
40
  creatorAddress: string;
41
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
40
42
  })[]>;
41
43
  static getFutureCampaigns(query?: {
42
44
  computeChainId?: number;
@@ -71,8 +73,10 @@ export declare abstract class CampaignService {
71
73
  amount: string;
72
74
  opportunityId: string;
73
75
  creatorAddress: string;
76
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
74
77
  })[]>;
75
78
  static getLiveCampaigns(query?: {
79
+ distributionChainId?: number;
76
80
  computeChainId?: number;
77
81
  type?: string;
78
82
  }): Promise<({
@@ -105,7 +109,13 @@ export declare abstract class CampaignService {
105
109
  amount: string;
106
110
  opportunityId: string;
107
111
  creatorAddress: string;
112
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
108
113
  })[]>;
114
+ static countLives(query?: {
115
+ distributionChainId?: number;
116
+ computeChainId?: number;
117
+ type?: string;
118
+ }): Promise<number>;
109
119
  static create(campaign: Omit<CreateCampaignModel, "id">): Promise<{
110
120
  type: string;
111
121
  id: string;
@@ -120,11 +130,8 @@ export declare abstract class CampaignService {
120
130
  amount: string;
121
131
  opportunityId: string;
122
132
  creatorAddress: string;
133
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
123
134
  } | undefined>;
124
- static createMany(campaigns: Omit<CreateCampaignModel, "id">[], upsert?: boolean): Promise<{
125
- success: number;
126
- fail: number;
127
- }>;
128
135
  /**
129
136
  * @dev back-office function
130
137
  * @dev deprecated should be replaced with a manual override
@@ -143,7 +150,12 @@ export declare abstract class CampaignService {
143
150
  amount: string;
144
151
  opportunityId: string;
145
152
  creatorAddress: string;
153
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
146
154
  }>;
155
+ /**
156
+ * @dev back-office function for manual overrides
157
+ */
158
+ static updateCreator(campaign: UpdateCampaignCreatorModel): Promise<void>;
147
159
  /**
148
160
  * @dev back-office function
149
161
  */
@@ -203,6 +215,7 @@ export declare abstract class CampaignService {
203
215
  rewardTokenId: string;
204
216
  amount: string;
205
217
  opportunityId: string;
218
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
206
219
  }[]>;
207
220
  /**
208
221
  * Counts the number of campaigns that complies to query
@@ -211,9 +224,45 @@ export declare abstract class CampaignService {
211
224
  * @returns the number of campaigns
212
225
  */
213
226
  static countMany(query: GetCampaignQueryModel): Promise<number>;
214
- static countLives(chainId: number): Promise<number>;
215
227
  static checkIfExist(campaign: CampaignUnique | string): Promise<boolean>;
216
- static findUnique(campaign: CampaignUnique | string): Promise<{
228
+ static findUnique(campaign: CampaignUnique | string): Promise<({
229
+ ComputeChain: {
230
+ name: string;
231
+ id: number;
232
+ icon: string;
233
+ };
234
+ DistributionChain: {
235
+ name: string;
236
+ id: number;
237
+ icon: string;
238
+ };
239
+ RewardToken: {
240
+ symbol: string;
241
+ name: string | null;
242
+ id: string;
243
+ icon: string;
244
+ chainId: number;
245
+ address: string;
246
+ decimals: number;
247
+ displaySymbol: string;
248
+ verified: boolean;
249
+ isTest: boolean;
250
+ price: number | null;
251
+ };
252
+ Creator: {
253
+ tags: string[];
254
+ address: string;
255
+ creatorId: string | null;
256
+ };
257
+ CampaignStatus: {
258
+ error: string;
259
+ details: import("database/api/.generated/runtime/library").JsonValue;
260
+ status: import("../../../../database/api/.generated").$Enums.RunStatus;
261
+ campaignId: string;
262
+ computedUntil: bigint;
263
+ processingStarted: bigint;
264
+ }[];
265
+ } & {
217
266
  type: string;
218
267
  id: string;
219
268
  params: import("database/api/.generated/runtime/library").JsonValue;
@@ -227,7 +276,8 @@ export declare abstract class CampaignService {
227
276
  amount: string;
228
277
  opportunityId: string;
229
278
  creatorAddress: string;
230
- } | null>;
279
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
280
+ }) | null>;
231
281
  static findUniqueOrThrow(campaign: CampaignUnique | string, withOpportunity?: boolean): Promise<{
232
282
  ComputeChain: {
233
283
  name: string;
@@ -294,7 +344,9 @@ export declare abstract class CampaignService {
294
344
  amount: string;
295
345
  opportunityId: string;
296
346
  creatorAddress: string;
347
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
297
348
  }>;
349
+ static removeManualOverride(campaign: CampaignUnique | string, field: CampaignManualOverride): Promise<void>;
298
350
  static findCampaignsToProcess(distributionChainId: ChainId): Promise<{
299
351
  endTimestamp: bigint;
300
352
  campaignId: string;
@@ -314,10 +366,6 @@ export declare abstract class CampaignService {
314
366
  success: number;
315
367
  fail: number;
316
368
  }>;
317
- static fetchMissingCampaigns(chainId: ChainId, campaignIds: CampaignUnique[]): Promise<{
318
- success: number;
319
- fail: number;
320
- }>;
321
369
  static findChains(): Promise<Record<string, ChainId>>;
322
370
  /**
323
371
  * Returns the campaign data
@@ -339,13 +387,6 @@ export declare abstract class CampaignService {
339
387
  live: C[];
340
388
  soon: C[];
341
389
  };
342
- /**
343
- * Returns the campaign data
344
- * @param chainId to fetch campaigns for
345
- * @param timestamp from which campaigns endTimestamp are filtered
346
- * @returns
347
- */
348
- static getFromEngineDb(chainId: number, timestamp: number): Promise<CampaignParameters<CampaignV3>[]>;
349
390
  /**
350
391
  * Convert raw
351
392
  * @param query
@@ -402,6 +443,7 @@ export declare abstract class CampaignService {
402
443
  rewardTokenId: string;
403
444
  amount: string;
404
445
  opportunityId: string;
446
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
405
447
  };
406
448
  static formatAsCampaignParameters<C extends CampaignEnum>(campaign: CampaignWithParams): CampaignParameters<C>;
407
449
  /**
@@ -4,7 +4,7 @@ import { OpportunityService } from "../opportunity";
4
4
  import { StatusService } from "../status/status.service";
5
5
  import { TokenRepository } from "../token/token.repository";
6
6
  import { TokenService } from "../token/token.service";
7
- import { InvalidParameter } from "../../../utils/error";
7
+ import { CannotParseOpportunity, InvalidParameter } from "../../../utils/error";
8
8
  import { executeSimple } from "../../../utils/execute";
9
9
  import { log } from "../../../utils/logger";
10
10
  import { Campaign as CampaignEnum, NETWORK_LABELS, } from "@sdk";
@@ -30,32 +30,19 @@ export class CampaignService {
30
30
  static async getLiveCampaigns(query) {
31
31
  return await CampaignRepository.getLiveCampaigns(query);
32
32
  }
33
+ static async countLives(query) {
34
+ return await CampaignRepository.countLives(query);
35
+ }
33
36
  static async create(campaign) {
34
37
  const id = CampaignService.hashId({ distributionChain: campaign.chainId, campaignId: campaign.campaignId });
35
- await OpportunityService.createFromCampaign(campaign);
38
+ try {
39
+ await OpportunityService.createFromCampaign(campaign);
40
+ }
41
+ catch {
42
+ throw new CannotParseOpportunity(campaign.campaignId, campaign.chainId, campaign.type);
43
+ }
36
44
  return await CampaignRepository.upsert({ id, ...campaign });
37
45
  }
38
- static async createMany(campaigns, upsert = false) {
39
- const failedToFetchMetadata = [];
40
- const campaignsToInsert = [];
41
- await Promise.all(campaigns.map(async (campaign) => {
42
- const id = CampaignService.hashId({ distributionChain: campaign.chainId, campaignId: campaign.campaignId });
43
- campaign.computeChainId = campaign.computeChainId === 0 ? campaign.chainId : campaign.computeChainId;
44
- try {
45
- if (upsert || !(await CampaignService.checkIfExist(id))) {
46
- await OpportunityService.createFromCampaign(campaign);
47
- campaignsToInsert.push({ id, ...campaign });
48
- }
49
- }
50
- catch (err) {
51
- log.error(`Cannot get Opportunity metadata for campaign ${campaign.campaignId} of type ${campaign.type}`, err);
52
- failedToFetchMetadata.push(campaign);
53
- }
54
- }));
55
- let { success, fail } = await CampaignRepository.upsertMany(campaignsToInsert);
56
- fail += failedToFetchMetadata.length;
57
- return { success, fail };
58
- }
59
46
  /**
60
47
  * @dev back-office function
61
48
  * @dev deprecated should be replaced with a manual override
@@ -73,6 +60,16 @@ export class CampaignService {
73
60
  const updatedParams = JSON.stringify(params);
74
61
  return await CampaignRepository.updateMetaData(id, updatedParams);
75
62
  }
63
+ /**
64
+ * @dev back-office function for manual overrides
65
+ */
66
+ static async updateCreator(campaign) {
67
+ const id = CampaignService.hashId({
68
+ distributionChain: campaign.distributionChain,
69
+ campaignId: campaign.campaignId,
70
+ });
71
+ return await CampaignRepository.updateCreator(id, campaign.creatorAddress);
72
+ }
76
73
  /**
77
74
  * @dev back-office function
78
75
  */
@@ -117,10 +114,6 @@ export class CampaignService {
117
114
  await OpportunityService.createFromCampaign(updatedCampaign, upsert);
118
115
  // Move campaign to new opportunity
119
116
  await CampaignRepository.updateOpportunity(id, { id, ...updatedCampaignData });
120
- // Update new opportunity with campaign
121
- // await OpportunityService.recreate(opportunityId);
122
- // Remov (update) campaign from old opportunity
123
- await OpportunityService.recreate(existingCampaign.opportunityId);
124
117
  // Return new opportunityId
125
118
  return (await CampaignService.findUniqueOrThrow(campaign)).opportunityId;
126
119
  }
@@ -148,12 +141,9 @@ export class CampaignService {
148
141
  }
149
142
  return await CampaignRepository.countMany(query);
150
143
  }
151
- static async countLives(chainId) {
152
- return await CampaignRepository.countLives(chainId);
153
- }
154
144
  static async checkIfExist(campaign) {
155
145
  const id = typeof campaign === "string" ? campaign : CampaignService.hashId(campaign);
156
- return await CampaignRepository.checkIfExist(id);
146
+ return !!(await CampaignRepository.findUnique(id));
157
147
  }
158
148
  static async findUnique(campaign) {
159
149
  const id = typeof campaign === "string" ? campaign : CampaignService.hashId(campaign);
@@ -163,6 +153,10 @@ export class CampaignService {
163
153
  const id = typeof campaign === "string" ? campaign : CampaignService.hashId(campaign);
164
154
  return await CampaignRepository.findUniqueOrThrow(id, withOpportunity);
165
155
  }
156
+ static async removeManualOverride(campaign, field) {
157
+ const id = typeof campaign === "string" ? campaign : CampaignService.hashId(campaign);
158
+ return await CampaignRepository.removeManualOverride(id, field);
159
+ }
166
160
  static async findCampaignsToProcess(distributionChainId) {
167
161
  return (await CampaignRepository.findCampaignsToProcess(distributionChainId))
168
162
  .filter(campaign => campaign.endTimestamp > (campaign?.CampaignStatus?.[0]?.computedUntil ?? 0n))
@@ -193,29 +187,32 @@ export class CampaignService {
193
187
  log.warn(`Campaign ${campaign.campaignId} on ${NETWORK_LABELS[campaign.distributionChain]} not found in engine db`);
194
188
  }
195
189
  }
196
- return await CampaignService.createMany(campaignsFromEngine.map(campaign => {
197
- return {
198
- amount: campaign.amount,
199
- chainId: campaign.chainId,
200
- computeChainId: campaign.computeChainId,
201
- creator: campaign.creator,
202
- endTimestamp: campaign.endTimestamp.toString(),
203
- campaignId: campaign.campaignId,
204
- opportunityIdentifier: campaign.mainParameter,
205
- params: JSON.stringify(campaign.campaignParameters),
206
- rewardTokenAddress: campaign.rewardToken,
207
- startTimestamp: campaign.startTimestamp.toString(),
208
- type: campaign.campaignType,
209
- subType: campaign.campaignSubType,
210
- };
211
- }));
212
- }
213
- static async fetchMissingCampaigns(chainId, campaignIds) {
214
- const foundCampaignIds = (await CampaignRepository.findManyCampaignId(chainId)).reduce((acc, { campaignId }) => acc.add(CampaignService.hashId({ distributionChain: chainId, campaignId })), new Set());
215
- const missingCampaigns = campaignIds.filter(campaignId => !foundCampaignIds.has(CampaignService.hashId(campaignId)));
216
- if (!missingCampaigns.length)
217
- return { success: 0, fail: 0 };
218
- return await CampaignService.fill(missingCampaigns);
190
+ let success = 0;
191
+ let fail = 0;
192
+ for (const engineCampaign of campaignsFromEngine) {
193
+ try {
194
+ await CampaignService.create({
195
+ amount: engineCampaign.amount,
196
+ chainId: engineCampaign.chainId,
197
+ computeChainId: engineCampaign.computeChainId,
198
+ creator: engineCampaign.creator,
199
+ endTimestamp: engineCampaign.endTimestamp.toString(),
200
+ campaignId: engineCampaign.campaignId,
201
+ opportunityIdentifier: engineCampaign.mainParameter,
202
+ params: JSON.stringify(engineCampaign.campaignParameters),
203
+ rewardTokenAddress: engineCampaign.rewardToken,
204
+ startTimestamp: engineCampaign.startTimestamp.toString(),
205
+ type: engineCampaign.campaignType,
206
+ subType: engineCampaign.campaignSubType,
207
+ });
208
+ success++;
209
+ }
210
+ catch {
211
+ log.warn(`Failed to create campaign ${engineCampaign.campaignId} on ${NETWORK_LABELS[engineCampaign.chainId]}`);
212
+ fail++;
213
+ }
214
+ }
215
+ return { success, fail };
219
216
  }
220
217
  static async findChains() {
221
218
  return await CampaignRepository.findChains();
@@ -240,15 +237,6 @@ export class CampaignService {
240
237
  const soon = campaigns.filter(({ startTimestamp: start }) => start > timestamp);
241
238
  return { past, live, soon };
242
239
  }
243
- /**
244
- * Returns the campaign data
245
- * @param chainId to fetch campaigns for
246
- * @param timestamp from which campaigns endTimestamp are filtered
247
- * @returns
248
- */
249
- static async getFromEngineDb(chainId, timestamp) {
250
- return CampaignRepository.getFromEngineDb(chainId, timestamp);
251
- }
252
240
  /**
253
241
  * Convert raw
254
242
  * @param query
@@ -226,6 +226,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
226
226
  rewardTokenId: string;
227
227
  amount: string;
228
228
  opportunityId: string;
229
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
229
230
  }[] | undefined;
230
231
  id: string;
231
232
  depositUrl: string | undefined;
@@ -21,6 +21,7 @@ export class OpportunityConvertorService {
21
21
  endTimestamp: Number(campaign.endTimestamp),
22
22
  startTimestamp: Number(campaign.startTimestamp),
23
23
  rewardToken: campaign.rewardToken.address,
24
+ amm: campaign.params?.amm,
24
25
  };
25
26
  }
26
27
  static convertV4toV3(opportunity, withCampaigns = false) {
@@ -56,6 +56,7 @@ export declare abstract class OpportunityRepository {
56
56
  amount: string;
57
57
  opportunityId: string;
58
58
  creatorAddress: string;
59
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
59
60
  })[];
60
61
  Tokens: {
61
62
  symbol: string;
@@ -189,6 +190,7 @@ export declare abstract class OpportunityRepository {
189
190
  amount: string;
190
191
  opportunityId: string;
191
192
  creatorAddress: string;
193
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
192
194
  }[];
193
195
  Tokens: {
194
196
  symbol: string;
@@ -378,6 +380,7 @@ export declare abstract class OpportunityRepository {
378
380
  amount: string;
379
381
  opportunityId: string;
380
382
  creatorAddress: string;
383
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
381
384
  })[];
382
385
  Tokens: {
383
386
  symbol: string;
@@ -511,6 +514,7 @@ export declare abstract class OpportunityRepository {
511
514
  amount: string;
512
515
  opportunityId: string;
513
516
  creatorAddress: string;
517
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
514
518
  }[];
515
519
  Tokens: {
516
520
  symbol: string;
@@ -688,6 +692,7 @@ export declare abstract class OpportunityRepository {
688
692
  amount: string;
689
693
  opportunityId: string;
690
694
  creatorAddress: string;
695
+ manualOverrides: import("../../../../database/api/.generated").$Enums.CampaignManualOverride[];
691
696
  })[];
692
697
  Tokens: {
693
698
  symbol: string;