@merkl/api 0.19.13 → 0.19.15

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 (47) hide show
  1. package/dist/database/api/seeder/resources/protocol.d.ts +12 -12
  2. package/dist/database/api/seeder/resources/protocol.js +13 -13
  3. package/dist/src/eden/index.d.ts +656 -279
  4. package/dist/src/engine/erc20SubTypeProcessors/helpers/tokenType.d.ts +3 -1
  5. package/dist/src/engine/erc20SubTypeProcessors/helpers/tokenType.js +4 -0
  6. package/dist/src/engine/erc20SubTypeProcessors/implementations/BEXRewardGaugeProcessor.d.ts +51 -0
  7. package/dist/src/engine/erc20SubTypeProcessors/implementations/BEXRewardGaugeProcessor.js +102 -0
  8. package/dist/src/engine/erc20SubTypeProcessors/implementations/processorMapping.js +3 -0
  9. package/dist/src/engine/erc20SubTypeProcessors/subtypesRound1.js +4 -0
  10. package/dist/src/engine/opportunityMetadata/factory.js +1 -1
  11. package/dist/src/engine/opportunityMetadata/implementations/Ajna.d.ts +3 -1
  12. package/dist/src/engine/opportunityMetadata/implementations/Ajna.js +6 -0
  13. package/dist/src/engine/opportunityMetadata/implementations/{Ambiant.d.ts → Ambient.d.ts} +2 -0
  14. package/dist/src/engine/opportunityMetadata/implementations/{Ambiant.js → Ambient.js} +5 -1
  15. package/dist/src/engine/opportunityMetadata/implementations/Badger.d.ts +2 -0
  16. package/dist/src/engine/opportunityMetadata/implementations/Badger.js +5 -0
  17. package/dist/src/engine/opportunityMetadata/implementations/Clamm.d.ts +27 -0
  18. package/dist/src/engine/opportunityMetadata/implementations/Clamm.js +145 -1
  19. package/dist/src/engine/opportunityMetadata/implementations/Compound.d.ts +2 -0
  20. package/dist/src/engine/opportunityMetadata/implementations/Compound.js +4 -0
  21. package/dist/src/engine/opportunityMetadata/implementations/Erc20.d.ts +2 -0
  22. package/dist/src/engine/opportunityMetadata/implementations/Erc20.js +4 -0
  23. package/dist/src/engine/opportunityMetadata/implementations/Euler.d.ts +2 -0
  24. package/dist/src/engine/opportunityMetadata/implementations/Euler.js +4 -0
  25. package/dist/src/engine/opportunityMetadata/implementations/EventBased.d.ts +3 -0
  26. package/dist/src/engine/opportunityMetadata/implementations/EventBased.js +4 -0
  27. package/dist/src/engine/opportunityMetadata/implementations/Hyperdrive.d.ts +2 -0
  28. package/dist/src/engine/opportunityMetadata/implementations/Hyperdrive.js +5 -0
  29. package/dist/src/engine/opportunityMetadata/implementations/JsonAirdrop.d.ts +8 -0
  30. package/dist/src/engine/opportunityMetadata/implementations/JsonAirdrop.js +4 -0
  31. package/dist/src/engine/opportunityMetadata/implementations/Morpho.d.ts +2 -0
  32. package/dist/src/engine/opportunityMetadata/implementations/Morpho.js +17 -1
  33. package/dist/src/index.d.ts +169 -0
  34. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +169 -0
  35. package/dist/src/modules/v4/campaign/campaign.controller.js +62 -0
  36. package/dist/src/modules/v4/dynamicData/dynamicData.service.d.ts +2 -2
  37. package/dist/src/modules/v4/dynamicData/dynamicData.service.js +5 -4
  38. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +16 -1
  39. package/dist/src/modules/v4/opportunity/opportunity.service.js +34 -4
  40. package/dist/src/modules/v4/programPayload/programPayload.repository.d.ts +3 -15
  41. package/dist/src/modules/v4/programPayload/programPayload.repository.js +3 -36
  42. package/dist/src/modules/v4/router.d.ts +169 -0
  43. package/dist/src/utils/decodeCalls.js +9 -1
  44. package/dist/src/utils/encodeCalls.js +9 -1
  45. package/dist/src/utils/generateCardName.js +3 -0
  46. package/dist/tsconfig.package.tsbuildinfo +1 -1
  47. package/package.json +1 -1
@@ -10,6 +10,14 @@ export declare class JsonAirdropMetadata implements MetadataBuilder<campaignType
10
10
  address: string;
11
11
  }[];
12
12
  mainProtocol: string | undefined;
13
+ depositUrl?: undefined;
14
+ } | {
15
+ action: "DROP";
16
+ name: string;
17
+ tokens: never[];
18
+ mainProtocol: string | undefined;
19
+ depositUrl: any;
13
20
  }>;
21
+ static generateUrl(_computeChainId: ChainId, params: CampaignParameters<campaignType>["campaignParameters"]): any;
14
22
  }
15
23
  export {};
@@ -32,7 +32,11 @@ export class JsonAirdropMetadata {
32
32
  name: `${prefix} ${params.symbolRewardToken}`,
33
33
  tokens: [],
34
34
  mainProtocol: aavePrefix || aciPrefix ? "aave" : undefined,
35
+ depositUrl: JsonAirdropMetadata.generateUrl(computeChainId, params),
35
36
  };
36
37
  }
37
38
  }
39
+ static generateUrl(_computeChainId, params) {
40
+ return params.jsonUrl;
41
+ }
38
42
  }
@@ -10,6 +10,8 @@ export declare class MorphoMetadata implements MetadataBuilder<campaignType> {
10
10
  }[];
11
11
  name: string;
12
12
  mainProtocol: string;
13
+ depositUrl: string | undefined;
13
14
  }>;
15
+ static generateUrl(computeChainId: ChainId, params: CampaignParameters<campaignType>["campaignParameters"], subType: CampaignParameters<campaignType>["campaignSubType"]): string | undefined;
14
16
  }
15
17
  export {};
@@ -1,5 +1,5 @@
1
1
  import { OpportunityAction } from "@db/api";
2
- import { BN2Number } from "@sdk";
2
+ import { BN2Number, MorphoSubCampaignType, NETWORK_LABELS, } from "@sdk";
3
3
  export class MorphoMetadata {
4
4
  async build(computeChainId, params, subType) {
5
5
  const morphoParams = params;
@@ -16,6 +16,22 @@ export class MorphoMetadata {
16
16
  tokens: [{ chainId: computeChainId, address: params.targetToken }],
17
17
  name: subtype.name,
18
18
  mainProtocol: "morpho",
19
+ depositUrl: MorphoMetadata.generateUrl(computeChainId, params, subType),
19
20
  };
20
21
  }
22
+ static generateUrl(computeChainId, params, subType) {
23
+ switch (subType) {
24
+ case MorphoSubCampaignType.META: {
25
+ return `https://app.morpho.org/vault?vault=${params.targetToken}&network=${NETWORK_LABELS[computeChainId]?.toLowerCase()}`;
26
+ }
27
+ case MorphoSubCampaignType.SUPPLY_BLUE: {
28
+ return `https://app.morpho.org/?network=${NETWORK_LABELS[computeChainId]?.toLowerCase()}`;
29
+ }
30
+ case MorphoSubCampaignType.BORROWING_BLUE:
31
+ case MorphoSubCampaignType.COLLATERAL_BLUE: {
32
+ const typedParams = params;
33
+ return `https://app.morpho.org/market?id=${typedParams.marketId}&network=${NETWORK_LABELS[computeChainId]?.toLowerCase()}`;
34
+ }
35
+ }
36
+ }
21
37
  }
@@ -1246,6 +1246,175 @@ declare const app: Elysia<"", false, {
1246
1246
  };
1247
1247
  };
1248
1248
  };
1249
+ } & {
1250
+ "dry-run": {
1251
+ ":campaignId": {
1252
+ "dynamic-data": {
1253
+ get: {
1254
+ body: unknown;
1255
+ params: {
1256
+ campaignId: string;
1257
+ };
1258
+ query: unknown;
1259
+ headers: {
1260
+ authorization: string;
1261
+ };
1262
+ response: {
1263
+ 200: unknown[];
1264
+ };
1265
+ };
1266
+ };
1267
+ };
1268
+ };
1269
+ } & {
1270
+ "dry-run": {
1271
+ ":campaignId": {
1272
+ "meta-data": {
1273
+ get: {
1274
+ body: unknown;
1275
+ params: {
1276
+ campaignId: string;
1277
+ };
1278
+ query: unknown;
1279
+ headers: {
1280
+ authorization: string;
1281
+ };
1282
+ response: {
1283
+ 200: {
1284
+ id: string;
1285
+ chainId: number;
1286
+ type: string;
1287
+ identifier: string;
1288
+ name: string;
1289
+ status: "PAST" | "LIVE" | "SOON";
1290
+ action: any;
1291
+ tokens: ({
1292
+ symbol: string;
1293
+ id: string;
1294
+ name: string | null;
1295
+ icon: string;
1296
+ address: string;
1297
+ chainId: number;
1298
+ decimals: number;
1299
+ verified: boolean;
1300
+ isTest: boolean;
1301
+ isPoint: boolean;
1302
+ isNative: boolean;
1303
+ } & {
1304
+ price?: number | null | undefined;
1305
+ })[][];
1306
+ mainProtocol: string | undefined;
1307
+ depositUrl: any;
1308
+ tags: string[];
1309
+ };
1310
+ };
1311
+ };
1312
+ };
1313
+ };
1314
+ };
1315
+ } & {
1316
+ index: {
1317
+ get: {
1318
+ body: unknown;
1319
+ params: {};
1320
+ query: {
1321
+ type?: string | undefined;
1322
+ status?: "NONE" | "PAST" | "LIVE" | "SOON" | undefined;
1323
+ items?: number | undefined;
1324
+ subType?: number | undefined;
1325
+ page?: number | undefined;
1326
+ types?: string[] | undefined;
1327
+ campaignId?: string | undefined;
1328
+ opportunityId?: string | undefined;
1329
+ startTimestamp?: string | undefined;
1330
+ endTimestamp?: string | undefined;
1331
+ creatorAddress?: string | undefined;
1332
+ chainId?: number | undefined;
1333
+ creatorId?: string | undefined;
1334
+ mainParameter?: string | undefined;
1335
+ point?: boolean | undefined;
1336
+ tokenAddress?: string | undefined;
1337
+ test?: boolean | undefined;
1338
+ creatorTag?: string | undefined;
1339
+ distributionChainIds?: number[] | undefined;
1340
+ tokenSymbol?: string | undefined;
1341
+ withOpportunity?: boolean | undefined;
1342
+ createdAfter?: Date | null | undefined;
1343
+ };
1344
+ headers: unknown;
1345
+ response: {
1346
+ 200: {
1347
+ params: any;
1348
+ chain: {
1349
+ id: number;
1350
+ name: string;
1351
+ icon: string;
1352
+ };
1353
+ endTimestamp: number;
1354
+ startTimestamp: number;
1355
+ rewardToken: {
1356
+ symbol: string;
1357
+ id: string;
1358
+ name: string | null;
1359
+ icon: string;
1360
+ address: string;
1361
+ chainId: number;
1362
+ decimals: number;
1363
+ verified: boolean;
1364
+ isTest: boolean;
1365
+ isPoint: boolean;
1366
+ isNative: boolean;
1367
+ } & {
1368
+ price?: number | null | undefined;
1369
+ };
1370
+ distributionChain: {
1371
+ id: number;
1372
+ name: string;
1373
+ icon: string;
1374
+ } | undefined;
1375
+ campaignStatus: {
1376
+ computedUntil: number;
1377
+ processingStarted: number;
1378
+ error: string;
1379
+ status: import("@db/api").$Enums.RunStatus;
1380
+ details: import("database/api/.generated/runtime/library").JsonValue;
1381
+ campaignId: string;
1382
+ } | undefined;
1383
+ creatorAddress: string;
1384
+ creator: {
1385
+ tags: string[];
1386
+ address: string;
1387
+ creatorId: string | null;
1388
+ };
1389
+ createdAt: string;
1390
+ Opportunity: {
1391
+ id: string;
1392
+ name: string;
1393
+ type: string;
1394
+ status: import("@db/api").$Enums.Status;
1395
+ tags: string[];
1396
+ identifier: string;
1397
+ action: import("@db/api").$Enums.OpportunityAction;
1398
+ chainId: number;
1399
+ depositUrl: string | null;
1400
+ mainProtocolId: string | null;
1401
+ tvl: number;
1402
+ apr: number;
1403
+ dailyRewards: number;
1404
+ };
1405
+ id: string;
1406
+ type: string;
1407
+ subType: number | null;
1408
+ computeChainId: number;
1409
+ distributionChainId: number;
1410
+ campaignId: string;
1411
+ rewardTokenId: string;
1412
+ amount: string;
1413
+ opportunityId: string;
1414
+ }[];
1415
+ };
1416
+ };
1417
+ };
1249
1418
  } & {
1250
1419
  ":id": {
1251
1420
  get: {
@@ -163,6 +163,175 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
163
163
  };
164
164
  };
165
165
  };
166
+ } & {
167
+ "dry-run": {
168
+ ":campaignId": {
169
+ "dynamic-data": {
170
+ get: {
171
+ body: unknown;
172
+ params: {
173
+ campaignId: string;
174
+ };
175
+ query: unknown;
176
+ headers: {
177
+ authorization: string;
178
+ };
179
+ response: {
180
+ 200: unknown[];
181
+ };
182
+ };
183
+ };
184
+ };
185
+ };
186
+ } & {
187
+ "dry-run": {
188
+ ":campaignId": {
189
+ "meta-data": {
190
+ get: {
191
+ body: unknown;
192
+ params: {
193
+ campaignId: string;
194
+ };
195
+ query: unknown;
196
+ headers: {
197
+ authorization: string;
198
+ };
199
+ response: {
200
+ 200: {
201
+ id: string;
202
+ chainId: number;
203
+ type: string;
204
+ identifier: string;
205
+ name: string;
206
+ status: "PAST" | "LIVE" | "SOON";
207
+ action: any;
208
+ tokens: ({
209
+ symbol: string;
210
+ id: string;
211
+ name: string | null;
212
+ icon: string;
213
+ address: string;
214
+ chainId: number;
215
+ decimals: number;
216
+ verified: boolean;
217
+ isTest: boolean;
218
+ isPoint: boolean;
219
+ isNative: boolean;
220
+ } & {
221
+ price?: number | null | undefined;
222
+ })[][];
223
+ mainProtocol: string | undefined;
224
+ depositUrl: any;
225
+ tags: string[];
226
+ };
227
+ };
228
+ };
229
+ };
230
+ };
231
+ };
232
+ } & {
233
+ index: {
234
+ get: {
235
+ body: unknown;
236
+ params: {};
237
+ query: {
238
+ type?: string | undefined;
239
+ status?: "NONE" | "PAST" | "LIVE" | "SOON" | undefined;
240
+ items?: number | undefined;
241
+ subType?: number | undefined;
242
+ page?: number | undefined;
243
+ types?: string[] | undefined;
244
+ campaignId?: string | undefined;
245
+ opportunityId?: string | undefined;
246
+ startTimestamp?: string | undefined;
247
+ endTimestamp?: string | undefined;
248
+ creatorAddress?: string | undefined;
249
+ chainId?: number | undefined;
250
+ creatorId?: string | undefined;
251
+ mainParameter?: string | undefined;
252
+ point?: boolean | undefined;
253
+ tokenAddress?: string | undefined;
254
+ test?: boolean | undefined;
255
+ creatorTag?: string | undefined;
256
+ distributionChainIds?: number[] | undefined;
257
+ tokenSymbol?: string | undefined;
258
+ withOpportunity?: boolean | undefined;
259
+ createdAfter?: Date | null | undefined;
260
+ };
261
+ headers: unknown;
262
+ response: {
263
+ 200: {
264
+ params: any;
265
+ chain: {
266
+ id: number;
267
+ name: string;
268
+ icon: string;
269
+ };
270
+ endTimestamp: number;
271
+ startTimestamp: number;
272
+ rewardToken: {
273
+ symbol: string;
274
+ id: string;
275
+ name: string | null;
276
+ icon: string;
277
+ address: string;
278
+ chainId: number;
279
+ decimals: number;
280
+ verified: boolean;
281
+ isTest: boolean;
282
+ isPoint: boolean;
283
+ isNative: boolean;
284
+ } & {
285
+ price?: number | null | undefined;
286
+ };
287
+ distributionChain: {
288
+ id: number;
289
+ name: string;
290
+ icon: string;
291
+ } | undefined;
292
+ campaignStatus: {
293
+ computedUntil: number;
294
+ processingStarted: number;
295
+ error: string;
296
+ status: import("@db/api").$Enums.RunStatus;
297
+ details: import("database/api/.generated/runtime/library").JsonValue;
298
+ campaignId: string;
299
+ } | undefined;
300
+ creatorAddress: string;
301
+ creator: {
302
+ tags: string[];
303
+ address: string;
304
+ creatorId: string | null;
305
+ };
306
+ createdAt: string;
307
+ Opportunity: {
308
+ id: string;
309
+ name: string;
310
+ type: string;
311
+ status: import("@db/api").$Enums.Status;
312
+ tags: string[];
313
+ identifier: string;
314
+ action: import("@db/api").$Enums.OpportunityAction;
315
+ chainId: number;
316
+ depositUrl: string | null;
317
+ mainProtocolId: string | null;
318
+ tvl: number;
319
+ apr: number;
320
+ dailyRewards: number;
321
+ };
322
+ id: string;
323
+ type: string;
324
+ subType: number | null;
325
+ computeChainId: number;
326
+ distributionChainId: number;
327
+ campaignId: string;
328
+ rewardTokenId: string;
329
+ amount: string;
330
+ opportunityId: string;
331
+ }[];
332
+ };
333
+ };
334
+ };
166
335
  } & {
167
336
  ":id": {
168
337
  get: {
@@ -6,6 +6,7 @@ import { Campaign } from "@sdk";
6
6
  import Elysia, { t } from "elysia";
7
7
  import { throwOnUnsupportedChainId } from "src/utils/throw";
8
8
  import { DynamicDataService } from "../dynamicData/dynamicData.service";
9
+ import { OpportunityService } from "../opportunity";
9
10
  import { CampaignResourceDto, CreateCampaignDto, GetCampaignQueryDto, RemoveManualOverrideDto, UpdateCampaignCreatorDto, UpdateCampaignDto, UpdateMetaDataCampaignDto, } from "./campaign.model";
10
11
  import { CampaignService } from "./campaign.service";
11
12
  // ─── Campaigns Controller ────────────────────────────────────────────────────
@@ -66,6 +67,67 @@ export const CampaignController = new Elysia({ prefix: "/campaigns", detail: { t
66
67
  };
67
68
  return await DynamicDataService.updateForCampaigns([campaignV3]);
68
69
  }, { beforeHandle: BackOfficeGuard, headers: AuthorizationHeadersDto, detail: { hide: true } })
70
+ // ─── Test Dynamic and MetaData ──────────────────────────────────────────────
71
+ .get("/dry-run/:campaignId/dynamic-data", async ({ params }) => {
72
+ const id = (await CampaignService.findMany({ campaignId: params.campaignId, test: true }))[0].id;
73
+ if (!id)
74
+ throw new NotFoundError();
75
+ const campaign = await CampaignService.findUniqueOrThrow(id, true);
76
+ const campaignV3 = {
77
+ amount: campaign.amount,
78
+ campaignId: campaign.campaignId,
79
+ mainParameter: campaign.Opportunity.identifier,
80
+ campaignParameters: campaign.params,
81
+ campaignSubType: campaign.subType,
82
+ campaignType: Campaign[campaign.type],
83
+ chainId: campaign.distributionChainId,
84
+ computeChainId: campaign.computeChainId,
85
+ creator: campaign.creatorAddress,
86
+ endTimestamp: Number(campaign.endTimestamp),
87
+ rewardToken: campaign.RewardToken.address,
88
+ startTimestamp: Number(campaign.startTimestamp),
89
+ index: 0,
90
+ };
91
+ return await DynamicDataService.updateForCampaigns([campaignV3], true);
92
+ }, { beforeHandle: BackOfficeGuard, headers: AuthorizationHeadersDto, detail: { hide: true } })
93
+ .get("/dry-run/:campaignId/meta-data", async ({ params }) => {
94
+ const id = (await CampaignService.findMany({ campaignId: params.campaignId, test: true }))[0].id;
95
+ if (!id)
96
+ throw new NotFoundError();
97
+ const campaign = await CampaignService.findUniqueOrThrow(id, true);
98
+ const campaignV3 = {
99
+ amount: campaign.amount,
100
+ campaignId: campaign.campaignId,
101
+ mainParameter: campaign.Opportunity.identifier,
102
+ campaignParameters: campaign.params,
103
+ campaignSubType: campaign.subType,
104
+ chainId: campaign.distributionChainId,
105
+ computeChainId: campaign.computeChainId,
106
+ creator: campaign.creatorAddress,
107
+ endTimestamp: campaign.endTimestamp.toString(),
108
+ rewardToken: campaign.RewardToken.address,
109
+ startTimestamp: campaign.startTimestamp.toString(),
110
+ index: 0,
111
+ type: Campaign[campaign.type],
112
+ params: JSON.stringify(campaign.params),
113
+ rewardTokenAddress: campaign.RewardToken.address,
114
+ opportunityIdentifier: campaign.Opportunity.identifier,
115
+ };
116
+ return await OpportunityService.fakeCreateFromCampaign(campaignV3);
117
+ }, { beforeHandle: BackOfficeGuard, headers: AuthorizationHeadersDto, detail: { hide: true } })
118
+ // ─── Get Many Campaigns ──────────────────────────────────────────────
119
+ .get("/", async ({ query }) => {
120
+ if (query.items === 0)
121
+ throw new HttpError("Bad Request: Cannot retrieve 0 items", 400);
122
+ return await CampaignService.findMany(query);
123
+ }, {
124
+ query: GetCampaignQueryDto,
125
+ response: t.Array(CampaignResourceDto),
126
+ detail: {
127
+ description: `**Retrieve Multiple Campaigns**
128
+ <p>This endpoint enables you to search for campaigns by providing specific criteria through query parameters.</p>`,
129
+ },
130
+ })
69
131
  // ─── Get One Campaign ────────────────────────────────────────────────
70
132
  .get("/:id", async ({ params }) => {
71
133
  try {
@@ -9,6 +9,6 @@ export declare class DynamicDataService {
9
9
  priceTargetToken: number;
10
10
  type: string;
11
11
  }>;
12
- static updateForCampaignType(campaigns: CampaignParameters<CampaignEnum>[], type: Campaign): Promise<unknown[]>;
13
- static updateForCampaigns(campaigns: CampaignParameters<CampaignEnum>[]): Promise<unknown[]>;
12
+ static updateForCampaignType(campaigns: CampaignParameters<CampaignEnum>[], type: Campaign, dryRun?: boolean): Promise<unknown[]>;
13
+ static updateForCampaigns(campaigns: CampaignParameters<CampaignEnum>[], dryRun?: boolean): Promise<unknown[]>;
14
14
  }
@@ -52,7 +52,7 @@ export class DynamicDataService {
52
52
  type: result[0]?.type ?? "defaultType",
53
53
  };
54
54
  }
55
- static async updateForCampaignType(campaigns, type) {
55
+ static async updateForCampaignType(campaigns, type, dryRun = false) {
56
56
  const chainId = campaigns[0].computeChainId;
57
57
  const dynamicDataArray = [];
58
58
  const dynamicData = await dynamicDataBuilderFactory(typeof type === "number" ? type : Campaign[type]).build(chainId, campaigns);
@@ -78,7 +78,8 @@ export class DynamicDataService {
78
78
  type: Campaign[+type],
79
79
  });
80
80
  try {
81
- await OpportunityRepository.updateRecords(opportunityId, apr, tvl, dailyRewards);
81
+ if (!dryRun)
82
+ await OpportunityRepository.updateRecords(opportunityId, apr, tvl, dailyRewards);
82
83
  }
83
84
  catch (err) {
84
85
  throw new HttpError("Failed to update dynamic data", 500, {
@@ -97,7 +98,7 @@ export class DynamicDataService {
97
98
  }
98
99
  return dynamicDataArray;
99
100
  }
100
- static async updateForCampaigns(campaigns) {
101
+ static async updateForCampaigns(campaigns, dryRun = false) {
101
102
  const campaignTypeToCampaigns = new Map();
102
103
  for (const campaign of campaigns) {
103
104
  const type = campaign.campaignType;
@@ -113,7 +114,7 @@ export class DynamicDataService {
113
114
  try {
114
115
  log.info(`updating dynamic data for ${campaigns.length} campaigns of type ${CampaignEnum[campaignType]}`);
115
116
  try {
116
- dynamicDataArray.push(await DynamicDataService.updateForCampaignType(campaigns, campaignType));
117
+ dynamicDataArray.push(await DynamicDataService.updateForCampaignType(campaigns, campaignType, dryRun));
117
118
  }
118
119
  catch (err) {
119
120
  console.error(`Failed to update dynamic data for campaign type ${CampaignEnum[campaignType]}`, err);
@@ -32,8 +32,23 @@ export declare abstract class OpportunityService {
32
32
  type: string;
33
33
  identifier: string;
34
34
  name: string;
35
- status: "SOON";
35
+ status: "PAST" | "LIVE" | "SOON";
36
36
  action: OpportunityAction;
37
+ tokens: ({
38
+ symbol: string;
39
+ id: string;
40
+ name: string | null;
41
+ icon: string;
42
+ address: string;
43
+ chainId: number;
44
+ decimals: number;
45
+ verified: boolean;
46
+ isTest: boolean;
47
+ isPoint: boolean;
48
+ isNative: boolean;
49
+ } & {
50
+ price?: number | null | undefined;
51
+ })[][];
37
52
  mainProtocol: string | undefined;
38
53
  depositUrl: any;
39
54
  tags: string[];
@@ -10,6 +10,7 @@ import { Prisma, Status } from "@db/api";
10
10
  import { Campaign as CampaignEnum } from "@sdk";
11
11
  import moment from "moment";
12
12
  import { metadataBuilderFactory } from "../../../engine/opportunityMetadata/factory";
13
+ import { ProtocolService } from "../protocol/protocol.service";
13
14
  import { OpportunityRepository } from "./opportunity.repository";
14
15
  export class OpportunityService {
15
16
  static hashId(opportunity) {
@@ -44,17 +45,36 @@ export class OpportunityService {
44
45
  identifier: campaign.opportunityIdentifier,
45
46
  type: campaignType,
46
47
  });
48
+ const protocol = (await ProtocolService.findMany({ id: metadata.mainProtocol }))?.[0];
49
+ const tokens = await Promise.all(metadata.tokens.map(async (t) => {
50
+ return await TokenService.findMany(t);
51
+ }));
47
52
  const params = JSON.parse(campaign.params);
53
+ const now = moment().unix();
48
54
  const opportunity = {
49
55
  id: opportunityId,
50
56
  chainId: campaign.computeChainId,
51
57
  type: campaignType,
52
58
  identifier: campaign.opportunityIdentifier, // mainParameter
53
59
  name: metadata.name,
54
- status: Status.SOON,
60
+ status: now >= +campaign.startTimestamp && now < +campaign.endTimestamp
61
+ ? Status.LIVE
62
+ : now > +campaign.endTimestamp
63
+ ? Status.PAST
64
+ : Status.SOON,
55
65
  action: metadata.action,
66
+ tokens,
56
67
  mainProtocol: metadata.mainProtocol,
57
- depositUrl: !!params.url ? params.url : undefined,
68
+ // If creator has specified a deposit URL, use it
69
+ // Else if we have the specific logic to handle the deposit URL, use it
70
+ // Else if the protocol has a deposit URL, use it
71
+ depositUrl: !!params.url
72
+ ? params.url
73
+ : !!metadata.depositUrl
74
+ ? metadata.depositUrl
75
+ : !!metadata.mainProtocol && !!protocol.url
76
+ ? protocol.url
77
+ : undefined,
58
78
  tags,
59
79
  };
60
80
  return opportunity;
@@ -69,8 +89,9 @@ export class OpportunityService {
69
89
  type: campaignType,
70
90
  });
71
91
  const tokens = (await TokenService.findManyOrCreate(metadata.tokens)).filter(t => t !== undefined);
72
- const params = JSON.parse(campaign.params);
73
92
  const now = moment().unix();
93
+ const protocol = (await ProtocolService.findMany({ id: metadata.mainProtocol }))?.[0];
94
+ const params = JSON.parse(campaign.params);
74
95
  const opportunity = {
75
96
  id: opportunityId,
76
97
  chainId: campaign.computeChainId,
@@ -85,7 +106,16 @@ export class OpportunityService {
85
106
  action: metadata.action,
86
107
  tokens,
87
108
  mainProtocol: metadata.mainProtocol,
88
- depositUrl: !!params.url ? params.url : undefined,
109
+ // If creator has specified a deposit URL, use it
110
+ // Else if we have the specific logic to handle the deposit URL, use it
111
+ // Else if the protocol has a deposit URL, use it
112
+ depositUrl: !!params.url
113
+ ? params.url
114
+ : !!metadata.depositUrl
115
+ ? metadata.depositUrl
116
+ : !!metadata.mainProtocol && !!protocol.url
117
+ ? protocol.url
118
+ : undefined,
89
119
  tags,
90
120
  };
91
121
  await OpportunityRepository.create(opportunity, upsert);