@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.
- package/dist/database/api/.generated/drizzle/schema.d.ts +46 -0
- package/dist/database/api/.generated/drizzle/schema.js +5 -1
- package/dist/database/api/.generated/drizzle/schema.ts +8 -1
- package/dist/database/api/.generated/edge.js +26 -4
- package/dist/database/api/.generated/index-browser.js +7 -1
- package/dist/database/api/.generated/index.d.ts +149 -2
- package/dist/database/api/.generated/index.js +26 -4
- package/dist/database/api/.generated/package.json +1 -1
- package/dist/database/api/.generated/schema.prisma +29 -8
- package/dist/database/api/.generated/wasm.js +7 -1
- package/dist/src/eden/index.d.ts +241 -10
- package/dist/src/index.d.ts +53 -2
- package/dist/src/modules/v4/campaign/campaign.controller.d.ts +40 -1
- package/dist/src/modules/v4/campaign/campaign.controller.js +16 -1
- package/dist/src/modules/v4/campaign/campaign.model.d.ts +14 -1
- package/dist/src/modules/v4/campaign/campaign.model.js +11 -1
- package/dist/src/modules/v4/campaign/campaign.repository.d.ts +64 -32
- package/dist/src/modules/v4/campaign/campaign.repository.js +84 -122
- package/dist/src/modules/v4/campaign/campaign.service.d.ts +61 -19
- package/dist/src/modules/v4/campaign/campaign.service.js +51 -63
- package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +1 -0
- package/dist/src/modules/v4/opportunity/opportunity.converter.js +1 -0
- package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +5 -0
- package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +3 -0
- package/dist/src/modules/v4/programPayload/programPayload.repository.d.ts +100 -1
- package/dist/src/modules/v4/programPayload/programPayload.repository.js +146 -1
- package/dist/src/modules/v4/protocol/protocol.repository.d.ts +1 -0
- package/dist/src/modules/v4/router.d.ts +53 -2
- package/dist/src/modules/v4/status/status.service.js +1 -1
- package/dist/src/modules/v4/token/token.controller.d.ts +12 -1
- package/dist/src/modules/v4/token/token.controller.js +2 -2
- package/dist/src/modules/v4/token/token.service.d.ts +13 -1
- package/dist/src/modules/v4/token/token.service.js +1 -3
- package/dist/src/utils/error.d.ts +6 -0
- package/dist/src/utils/error.js +12 -0
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- 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 =
|
159
|
-
|
160
|
-
|
161
|
-
|
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:
|
196
|
+
where: { address: creatorAddress },
|
179
197
|
create: {
|
180
|
-
address:
|
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
|
-
*
|
274
|
-
* @
|
275
|
-
* @
|
276
|
-
*
|
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
|
-
|
448
|
-
|
449
|
-
|
397
|
+
await apiDbClient.campaign.update({
|
398
|
+
where: { id },
|
399
|
+
data: {
|
400
|
+
Opportunity: {
|
401
|
+
connect: { id: data.opportunityId },
|
402
|
+
},
|
450
403
|
},
|
451
|
-
};
|
452
|
-
|
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
|
-
|
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
|
-
|
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.
|
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
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
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;
|