@merkl/api 0.20.72 → 0.20.73

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 +17 -0
  2. package/dist/database/api/.generated/drizzle/schema.js +1 -0
  3. package/dist/database/api/.generated/drizzle/schema.ts +1 -0
  4. package/dist/database/api/.generated/edge.js +4 -3
  5. package/dist/database/api/.generated/index-browser.js +1 -0
  6. package/dist/database/api/.generated/index.d.ts +69 -1
  7. package/dist/database/api/.generated/index.js +4 -3
  8. package/dist/database/api/.generated/package.json +1 -1
  9. package/dist/database/api/.generated/schema.prisma +24 -23
  10. package/dist/database/api/.generated/wasm.js +1 -0
  11. package/dist/src/eden/index.d.ts +99 -37
  12. package/dist/src/engine/dynamicData/utils/getEulerV2Vaults.js +7 -6
  13. package/dist/src/index.d.ts +27 -17
  14. package/dist/src/jobs/update-euler-vaults.js +3 -1
  15. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +3 -0
  16. package/dist/src/modules/v4/campaign/campaign.repository.d.ts +5 -0
  17. package/dist/src/modules/v4/campaign/campaign.service.d.ts +9 -0
  18. package/dist/src/modules/v4/campaign/campaign.service.js +10 -1
  19. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +7 -0
  20. package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +3 -0
  21. package/dist/src/modules/v4/opportunity/opportunity.model.js +4 -1
  22. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +9 -0
  23. package/dist/src/modules/v4/opportunity/opportunity.repository.js +0 -1
  24. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +12 -0
  25. package/dist/src/modules/v4/opportunity/opportunity.service.js +4 -3
  26. package/dist/src/modules/v4/protocol/protocol.repository.d.ts +1 -0
  27. package/dist/src/modules/v4/reward/reward.repository.d.ts +1 -0
  28. package/dist/src/modules/v4/reward/reward.service.d.ts +8 -0
  29. package/dist/src/modules/v4/router.d.ts +12 -0
  30. package/dist/src/modules/v4/user/user.controller.d.ts +2 -0
  31. package/dist/src/routes/v3/euler.d.ts +16 -18
  32. package/dist/src/routes/v3/euler.js +20 -11
  33. package/dist/src/routes/v3/router.d.ts +15 -17
  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
@@ -107,7 +107,7 @@ async function computeCollatListAndReturnVaults(chainId, vaults) {
107
107
  }
108
108
  catch { }
109
109
  vault.collaterals.push({
110
- address: collat.collateral,
110
+ address: getAddress(collat.collateral),
111
111
  symbol: symbolCollateral,
112
112
  symbolUnderlying: symbolUnderlying,
113
113
  borrowLTV: collat.borrowLTV.toString(),
@@ -129,7 +129,7 @@ export async function getEulerV2Vaults(chainId) {
129
129
  let vaults = [];
130
130
  // 0_ Fetch all euler vaults from database
131
131
  const storedVaults = await apiDbClient.logged.findMany({
132
- where: { type: LoggedEntityType.EULER },
132
+ where: { type: LoggedEntityType.EULER, ...(!!chainId && { chainId: chainId }) },
133
133
  });
134
134
  const res = await Promise.all(chainIdArray.map(async (chainId) => {
135
135
  let vaultsPerChain = [];
@@ -137,7 +137,7 @@ export async function getEulerV2Vaults(chainId) {
137
137
  try {
138
138
  // 1_ Get latest euler vaults from chain
139
139
  const storedVaultsPerChain = storedVaults.filter(vault => vault.chainId === chainId);
140
- log.info(`found ${storedVaultsPerChain.length} already stored vaults on ${NETWORK_LABELS[chainId]}`);
140
+ log.info(`🎈 found ${storedVaultsPerChain.length} already stored vaults on ${NETWORK_LABELS[chainId]}`);
141
141
  let fromBlock;
142
142
  if (storedVaultsPerChain.length > 0) {
143
143
  fromBlock = Math.max(...storedVaultsPerChain.map(vault => vault.fetchAtBlock)) + 1;
@@ -156,9 +156,9 @@ export async function getEulerV2Vaults(chainId) {
156
156
  const aux = EulerEVKInterface.decodeEventLog("EVaultCreated", log.data, log.topics);
157
157
  const name = (await EulerVault__factory.connect(log.address, providers[chainId]).name()).split(" ");
158
158
  const vaultName = (await fetchEulerVaultName(getAddress(log.address), chainId)) ?? name[name.length - 1];
159
- /** Match previous typing */
159
+ // Match previous typings
160
160
  return {
161
- address: log.address.toString(),
161
+ address: getAddress(log.address.toString()),
162
162
  asset: aux[1].toString(),
163
163
  fetchedAtBlock: Number(log.blockNumber),
164
164
  chainId: chainId,
@@ -193,7 +193,7 @@ export async function getEulerV2Vaults(chainId) {
193
193
  fetchAtBlock: vault.fetchedAtBlock,
194
194
  caughtFromAddress: EULER_ADDRESSES[vault.chainId].VAULT_FACTORY,
195
195
  chainId: vault.chainId,
196
- address: vault.address,
196
+ address: getAddress(vault.address),
197
197
  entityData: vault,
198
198
  id: Bun.hash(`${vault.address}-${vault.chainId}`).toString(),
199
199
  type: LoggedEntityType.EULER,
@@ -205,6 +205,7 @@ export async function getEulerV2Vaults(chainId) {
205
205
  throw new Error("Error while saving vaults to API database (`Logged` table)");
206
206
  }
207
207
  }
208
+ // Add to exising vaults
208
209
  if (storedVaults.length > 0) {
209
210
  vaults = vaults.concat(storedVaults.map(v => v.entityData));
210
211
  }
@@ -199,6 +199,7 @@ declare const app: Elysia<"", false, {
199
199
  tvl: number;
200
200
  apr: number;
201
201
  dailyRewards: number;
202
+ lastCampaignCreatedAt: Date;
202
203
  } | null;
203
204
  };
204
205
  };
@@ -239,6 +240,7 @@ declare const app: Elysia<"", false, {
239
240
  tvl: number;
240
241
  apr: number;
241
242
  dailyRewards: number;
243
+ lastCampaignCreatedAt: Date;
242
244
  };
243
245
  };
244
246
  };
@@ -482,6 +484,7 @@ declare const app: Elysia<"", false, {
482
484
  tvl: number;
483
485
  apr: number;
484
486
  dailyRewards: number;
487
+ lastCampaignCreatedAt: Date;
485
488
  };
486
489
  id: string;
487
490
  type: string;
@@ -497,6 +500,7 @@ declare const app: Elysia<"", false, {
497
500
  id: string;
498
501
  depositUrl: string | undefined;
499
502
  explorerAddress: string | undefined;
503
+ lastCampaignCreatedAt: string;
500
504
  tokens: ({
501
505
  symbol: string;
502
506
  id: string;
@@ -675,6 +679,7 @@ declare const app: Elysia<"", false, {
675
679
  tvl: number;
676
680
  apr: number;
677
681
  dailyRewards: number;
682
+ lastCampaignCreatedAt: string;
678
683
  };
679
684
  readonly 404: {
680
685
  name: string;
@@ -807,6 +812,7 @@ declare const app: Elysia<"", false, {
807
812
  tvl: number;
808
813
  apr: number;
809
814
  dailyRewards: number;
815
+ lastCampaignCreatedAt: string;
810
816
  campaigns: {
811
817
  creator?: {
812
818
  tags?: string[] | undefined;
@@ -973,6 +979,7 @@ declare const app: Elysia<"", false, {
973
979
  tvl: number;
974
980
  apr: number;
975
981
  dailyRewards: number;
982
+ lastCampaignCreatedAt: string;
976
983
  campaigns: {
977
984
  creator?: {
978
985
  tags?: string[] | undefined;
@@ -1416,6 +1423,7 @@ declare const app: Elysia<"", false, {
1416
1423
  tvl: number;
1417
1424
  apr: number;
1418
1425
  dailyRewards: number;
1426
+ lastCampaignCreatedAt: Date;
1419
1427
  };
1420
1428
  id: string;
1421
1429
  type: string;
@@ -1501,6 +1509,7 @@ declare const app: Elysia<"", false, {
1501
1509
  tvl: number;
1502
1510
  apr: number;
1503
1511
  dailyRewards: number;
1512
+ lastCampaignCreatedAt: Date;
1504
1513
  };
1505
1514
  id: string;
1506
1515
  type: string;
@@ -1687,6 +1696,7 @@ declare const app: Elysia<"", false, {
1687
1696
  tvl: number;
1688
1697
  apr: number;
1689
1698
  dailyRewards: number;
1699
+ lastCampaignCreatedAt: Date;
1690
1700
  };
1691
1701
  id: string;
1692
1702
  type: string;
@@ -3543,6 +3553,7 @@ declare const app: Elysia<"", false, {
3543
3553
  tvl: number;
3544
3554
  apr: number;
3545
3555
  dailyRewards: number;
3556
+ lastCampaignCreatedAt: Date;
3546
3557
  };
3547
3558
  pending: string;
3548
3559
  reason: string;
@@ -3662,6 +3673,7 @@ declare const app: Elysia<"", false, {
3662
3673
  tvl: number;
3663
3674
  apr: number;
3664
3675
  dailyRewards: number;
3676
+ lastCampaignCreatedAt: Date;
3665
3677
  };
3666
3678
  pending: string;
3667
3679
  reason: string;
@@ -5354,34 +5366,34 @@ declare const app: Elysia<"", false, {
5354
5366
  } & {
5355
5367
  v3: {
5356
5368
  euler: {
5357
- get: {
5358
- body: unknown;
5359
- params: {};
5360
- query: unknown;
5361
- headers: unknown;
5362
- response: {
5363
- 200: EulerVaultType[];
5369
+ index: {
5370
+ get: {
5371
+ body: unknown;
5372
+ params: {};
5373
+ query: unknown;
5374
+ headers: unknown;
5375
+ response: {
5376
+ 200: EulerVaultType[];
5377
+ };
5364
5378
  };
5365
5379
  };
5366
- };
5367
- } & {
5368
- euler: {
5380
+ } & {
5369
5381
  ":chainId": {
5370
5382
  get: {
5371
5383
  body: unknown;
5372
5384
  params: {
5373
5385
  chainId: number;
5374
5386
  };
5375
- query: unknown;
5387
+ query: {
5388
+ vaultAddress?: string | undefined;
5389
+ };
5376
5390
  headers: unknown;
5377
5391
  response: {
5378
5392
  200: EulerVaultType[];
5379
5393
  };
5380
5394
  };
5381
5395
  };
5382
- };
5383
- } & {
5384
- euler: {
5396
+ } & {
5385
5397
  update: {
5386
5398
  post: {
5387
5399
  body: unknown;
@@ -5395,9 +5407,7 @@ declare const app: Elysia<"", false, {
5395
5407
  };
5396
5408
  };
5397
5409
  };
5398
- };
5399
- } & {
5400
- euler: {
5410
+ } & {
5401
5411
  update: {
5402
5412
  ":chainId": {
5403
5413
  post: {
@@ -2,9 +2,11 @@ import { Redis } from "@/cache";
2
2
  import { getEulerV2Vaults, updateEulerVaultsCollatInDatabase } from "@/engine/dynamicData/utils/getEulerV2Vaults";
3
3
  import { logger } from "@/utils/logger";
4
4
  (async () => {
5
- await Redis.safeSet("EulerV2Vaults", await getEulerV2Vaults());
6
5
  try {
6
+ // First update collat values in database
7
7
  await updateEulerVaultsCollatInDatabase();
8
+ // Second update Redis cache
9
+ await Redis.safeSet("EulerV2Vaults", await getEulerV2Vaults());
8
10
  }
9
11
  catch (e) {
10
12
  console.error(e);
@@ -256,6 +256,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
256
256
  tvl: number;
257
257
  apr: number;
258
258
  dailyRewards: number;
259
+ lastCampaignCreatedAt: Date;
259
260
  };
260
261
  id: string;
261
262
  type: string;
@@ -341,6 +342,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
341
342
  tvl: number;
342
343
  apr: number;
343
344
  dailyRewards: number;
345
+ lastCampaignCreatedAt: Date;
344
346
  };
345
347
  id: string;
346
348
  type: string;
@@ -527,6 +529,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
527
529
  tvl: number;
528
530
  apr: number;
529
531
  dailyRewards: number;
532
+ lastCampaignCreatedAt: Date;
530
533
  };
531
534
  id: string;
532
535
  type: string;
@@ -318,6 +318,7 @@ export declare abstract class CampaignRepository {
318
318
  tvl: number;
319
319
  apr: number;
320
320
  dailyRewards: number;
321
+ lastCampaignCreatedAt: Date;
321
322
  };
322
323
  } & {
323
324
  id: string;
@@ -365,6 +366,7 @@ export declare abstract class CampaignRepository {
365
366
  tvl: number;
366
367
  apr: number;
367
368
  dailyRewards: number;
369
+ lastCampaignCreatedAt: Date;
368
370
  };
369
371
  } & {
370
372
  id: string;
@@ -428,6 +430,7 @@ export declare abstract class CampaignRepository {
428
430
  tvl: number;
429
431
  apr: number;
430
432
  dailyRewards: number;
433
+ lastCampaignCreatedAt: Date;
431
434
  };
432
435
  } & {
433
436
  id: string;
@@ -611,6 +614,7 @@ export declare abstract class CampaignRepository {
611
614
  tvl: number;
612
615
  apr: number;
613
616
  dailyRewards: number;
617
+ lastCampaignCreatedAt: Date;
614
618
  };
615
619
  Creator: {
616
620
  tags: string[];
@@ -694,6 +698,7 @@ export declare abstract class CampaignRepository {
694
698
  tvl: number;
695
699
  apr: number;
696
700
  dailyRewards: number;
701
+ lastCampaignCreatedAt: Date;
697
702
  };
698
703
  Creator: {
699
704
  tags: string[];
@@ -25,6 +25,7 @@ export declare abstract class CampaignService {
25
25
  tvl: number;
26
26
  apr: number;
27
27
  dailyRewards: number;
28
+ lastCampaignCreatedAt: Date;
28
29
  };
29
30
  } & {
30
31
  id: string;
@@ -64,6 +65,7 @@ export declare abstract class CampaignService {
64
65
  tvl: number;
65
66
  apr: number;
66
67
  dailyRewards: number;
68
+ lastCampaignCreatedAt: Date;
67
69
  };
68
70
  } & {
69
71
  id: string;
@@ -119,6 +121,7 @@ export declare abstract class CampaignService {
119
121
  tvl: number;
120
122
  apr: number;
121
123
  dailyRewards: number;
124
+ lastCampaignCreatedAt: Date;
122
125
  };
123
126
  } & {
124
127
  id: string;
@@ -256,6 +259,7 @@ export declare abstract class CampaignService {
256
259
  tvl: number;
257
260
  apr: number;
258
261
  dailyRewards: number;
262
+ lastCampaignCreatedAt: Date;
259
263
  };
260
264
  id: string;
261
265
  type: string;
@@ -328,6 +332,7 @@ export declare abstract class CampaignService {
328
332
  tvl: number;
329
333
  apr: number;
330
334
  dailyRewards: number;
335
+ lastCampaignCreatedAt: Date;
331
336
  };
332
337
  id: string;
333
338
  type: string;
@@ -401,6 +406,7 @@ export declare abstract class CampaignService {
401
406
  tvl: number;
402
407
  apr: number;
403
408
  dailyRewards: number;
409
+ lastCampaignCreatedAt: Date;
404
410
  };
405
411
  id: string;
406
412
  type: string;
@@ -474,6 +480,7 @@ export declare abstract class CampaignService {
474
480
  tvl: number;
475
481
  apr: number;
476
482
  dailyRewards: number;
483
+ lastCampaignCreatedAt: Date;
477
484
  };
478
485
  id: string;
479
486
  type: string;
@@ -595,6 +602,7 @@ export declare abstract class CampaignService {
595
602
  tvl: number;
596
603
  apr: number;
597
604
  dailyRewards: number;
605
+ lastCampaignCreatedAt: Date;
598
606
  };
599
607
  Creator: {
600
608
  tags: string[];
@@ -748,6 +756,7 @@ export declare abstract class CampaignService {
748
756
  tvl: number;
749
757
  apr: number;
750
758
  dailyRewards: number;
759
+ lastCampaignCreatedAt: Date;
751
760
  };
752
761
  id: string;
753
762
  type: string;
@@ -3,11 +3,12 @@ import { OpportunityService } from "@/modules/v4/opportunity";
3
3
  import { StatusService } from "@/modules/v4/status/status.service";
4
4
  import { TokenRepository } from "@/modules/v4/token/token.repository";
5
5
  import { TokenService } from "@/modules/v4/token/token.service";
6
- import { CannotParseOpportunity, InvalidParameter } from "@/utils/error";
6
+ import { CannotParseOpportunity, CannotUpdateOpportunityLastCreatedAt, InvalidParameter } from "@/utils/error";
7
7
  import { log } from "@/utils/logger";
8
8
  import { Campaign as CampaignEnum, NETWORK_LABELS, } from "@sdk";
9
9
  import { utils } from "ethers";
10
10
  import moment from "moment";
11
+ import { OpportunityRepository } from "../opportunity/opportunity.repository";
11
12
  import { CampaignRepository } from "./campaign.repository";
12
13
  export class CampaignService {
13
14
  static hashId(campaign) {
@@ -40,6 +41,14 @@ export class CampaignService {
40
41
  console.error(e);
41
42
  throw new CannotParseOpportunity(campaign.campaignId, campaign.chainId, campaign.type);
42
43
  }
44
+ if (!!CampaignRepository.findUnique(id)) {
45
+ try {
46
+ await OpportunityRepository.update(id, { lastCampaignCreatedAt: new Date() });
47
+ }
48
+ catch {
49
+ throw new CannotUpdateOpportunityLastCreatedAt(campaign.campaignId, campaign.chainId, campaign.type);
50
+ }
51
+ }
43
52
  return await CampaignRepository.upsert({ id, ...campaign });
44
53
  }
45
54
  /**
@@ -54,6 +54,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
54
54
  tvl: number;
55
55
  apr: number;
56
56
  dailyRewards: number;
57
+ lastCampaignCreatedAt: Date;
57
58
  } | null;
58
59
  };
59
60
  };
@@ -94,6 +95,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
94
95
  tvl: number;
95
96
  apr: number;
96
97
  dailyRewards: number;
98
+ lastCampaignCreatedAt: Date;
97
99
  };
98
100
  };
99
101
  };
@@ -337,6 +339,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
337
339
  tvl: number;
338
340
  apr: number;
339
341
  dailyRewards: number;
342
+ lastCampaignCreatedAt: Date;
340
343
  };
341
344
  id: string;
342
345
  type: string;
@@ -352,6 +355,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
352
355
  id: string;
353
356
  depositUrl: string | undefined;
354
357
  explorerAddress: string | undefined;
358
+ lastCampaignCreatedAt: string;
355
359
  tokens: ({
356
360
  symbol: string;
357
361
  id: string;
@@ -530,6 +534,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
530
534
  tvl: number;
531
535
  apr: number;
532
536
  dailyRewards: number;
537
+ lastCampaignCreatedAt: string;
533
538
  };
534
539
  readonly 404: {
535
540
  name: string;
@@ -662,6 +667,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
662
667
  tvl: number;
663
668
  apr: number;
664
669
  dailyRewards: number;
670
+ lastCampaignCreatedAt: string;
665
671
  campaigns: {
666
672
  creator?: {
667
673
  tags?: string[] | undefined;
@@ -828,6 +834,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
828
834
  tvl: number;
829
835
  apr: number;
830
836
  dailyRewards: number;
837
+ lastCampaignCreatedAt: string;
831
838
  campaigns: {
832
839
  creator?: {
833
840
  tags?: string[] | undefined;
@@ -18,6 +18,7 @@ export type Opportunity = Resource<"Opportunity", "mainProtocolId" | "manualOver
18
18
  explorerAddress?: string;
19
19
  chain: Chain["model"];
20
20
  tokens: Token["model"][];
21
+ lastCampaignCreatedAt: string;
21
22
  protocol?: Protocol["model"];
22
23
  aprRecord?: AprRecord["model"];
23
24
  tvlRecord?: TvlRecord["model"];
@@ -121,6 +122,7 @@ export declare const OpportunityResourceDto: import("@sinclair/typebox").TObject
121
122
  amount: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TBigInt, import("@sinclair/typebox").TString]>;
122
123
  }>>;
123
124
  }>>;
125
+ lastCampaignCreatedAt: import("@sinclair/typebox").TString;
124
126
  protocol: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
125
127
  id: import("@sinclair/typebox").TString;
126
128
  name: import("@sinclair/typebox").TString;
@@ -176,6 +178,7 @@ export declare const OpportunityWithCampaignsResourceDto: import("@sinclair/type
176
178
  tvl: import("@sinclair/typebox").TNumber;
177
179
  apr: import("@sinclair/typebox").TNumber;
178
180
  dailyRewards: import("@sinclair/typebox").TNumber;
181
+ lastCampaignCreatedAt: import("@sinclair/typebox").TString;
179
182
  aprRecord: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
180
183
  cumulated: import("@sinclair/typebox").TNumber;
181
184
  timestamp: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TBigInt, import("@sinclair/typebox").TString]>;
@@ -28,6 +28,7 @@ export const OpportunityResourceDto = t.Object({
28
28
  aprRecord: t.Optional(AprRecordResourceDto),
29
29
  tvlRecord: t.Optional(TvlRecordResourceDto),
30
30
  rewardsRecord: t.Optional(DailyRewardsRecordResourceDto),
31
+ lastCampaignCreatedAt: t.String({ format: "date" }),
31
32
  protocol: t.Optional(t.Union([ProtocolResourceDto, t.Null()])),
32
33
  });
33
34
  export const OpportunityWithCampaignsResourceDto = t.Composite([
@@ -77,7 +78,9 @@ export const GetOpportunitiesQueryDto = t.Object({
77
78
  rewardTokenSymbol: t.Optional(t.String({
78
79
  description: "Filter by opportunity that have at least 1 campaigns where the reward token has this symbol",
79
80
  })),
80
- sort: t.Optional(t.RegExp(/(apr|tvl|rewards)/, { description: "Sort by `apr`, `tvl` or `rewards`" })),
81
+ sort: t.Optional(t.RegExp(/(apr|tvl|rewards|lastCampaignCreatedAt)/, {
82
+ description: "Sort by `apr`, `tvl`, `rewards` or last campaign creation date",
83
+ })),
81
84
  order: t.Optional(t.RegExp(/desc|asc/, {
82
85
  description: "`asc` to sort in ascending order or `desc` to sort in descending order.",
83
86
  default: "desc",
@@ -25,6 +25,7 @@ export declare abstract class OpportunityRepository {
25
25
  tvl: number;
26
26
  apr: number;
27
27
  dailyRewards: number;
28
+ lastCampaignCreatedAt: Date;
28
29
  } | null>;
29
30
  static findUnique(id: string): Promise<({
30
31
  Chain: {
@@ -184,6 +185,7 @@ export declare abstract class OpportunityRepository {
184
185
  tvl: number;
185
186
  apr: number;
186
187
  dailyRewards: number;
188
+ lastCampaignCreatedAt: Date;
187
189
  }) | null>;
188
190
  static findUniqueOrThrow(id: string, withTest?: boolean, withPoints?: boolean, withCampaigns?: boolean): Promise<{
189
191
  Chain: {
@@ -327,6 +329,7 @@ export declare abstract class OpportunityRepository {
327
329
  tvl: number;
328
330
  apr: number;
329
331
  dailyRewards: number;
332
+ lastCampaignCreatedAt: Date;
330
333
  }>;
331
334
  /**
332
335
  * Gets opportunities and campaigns for which filtered on campaigns
@@ -528,6 +531,7 @@ export declare abstract class OpportunityRepository {
528
531
  tvl: number;
529
532
  apr: number;
530
533
  dailyRewards: number;
534
+ lastCampaignCreatedAt: Date;
531
535
  })[]>;
532
536
  static findMany(query: GetOpportunitiesQueryModel): Promise<({
533
537
  Chain: {
@@ -678,6 +682,7 @@ export declare abstract class OpportunityRepository {
678
682
  tvl: number;
679
683
  apr: number;
680
684
  dailyRewards: number;
685
+ lastCampaignCreatedAt: Date;
681
686
  })[]>;
682
687
  /**
683
688
  * @dev Live campaigns here can be:
@@ -880,6 +885,7 @@ export declare abstract class OpportunityRepository {
880
885
  tvl: number;
881
886
  apr: number;
882
887
  dailyRewards: number;
888
+ lastCampaignCreatedAt: Date;
883
889
  })[]>;
884
890
  static countMany(query: GetOpportunitiesQueryModel): Promise<number>;
885
891
  /**
@@ -939,6 +945,7 @@ export declare abstract class OpportunityRepository {
939
945
  tvl: number;
940
946
  apr: number;
941
947
  dailyRewards: number;
948
+ lastCampaignCreatedAt: Date;
942
949
  };
943
950
  }>;
944
951
  static updateStatus(id: string, status: Status): Promise<{
@@ -957,6 +964,7 @@ export declare abstract class OpportunityRepository {
957
964
  tvl: number;
958
965
  apr: number;
959
966
  dailyRewards: number;
967
+ lastCampaignCreatedAt: Date;
960
968
  }>;
961
969
  static update(id: string, data: Partial<Opportunity["raw"]>): Promise<{
962
970
  id: string;
@@ -974,6 +982,7 @@ export declare abstract class OpportunityRepository {
974
982
  tvl: number;
975
983
  apr: number;
976
984
  dailyRewards: number;
985
+ lastCampaignCreatedAt: Date;
977
986
  }>;
978
987
  static updateMany(ids: string[], data: Partial<Opportunity["raw"]>): Promise<import("database/api/.generated/runtime/library").GetBatchResult>;
979
988
  static aggregateSum(field: keyof Prisma.OpportunitySumAggregateInputType, query: GetOpportunitiesQueryModel): Promise<{
@@ -320,7 +320,6 @@ export class OpportunityRepository {
320
320
  const withPoints = query.point ?? false;
321
321
  const withCampaigns = query.campaigns ?? false;
322
322
  const args = OpportunityRepository.#transformQueryToPrismaFilters(query);
323
- const search = query.search ?? undefined;
324
323
  return await apiDbClient.opportunity.findMany({
325
324
  take: items === 0 ? undefined : items,
326
325
  skip: page * items,
@@ -22,6 +22,7 @@ export declare abstract class OpportunityService {
22
22
  tvl: number;
23
23
  apr: number;
24
24
  dailyRewards: number;
25
+ lastCampaignCreatedAt: Date;
25
26
  }>;
26
27
  static deleteOverrides(id: string, overridesToDelete: OpportunityManualOverride[]): Promise<{
27
28
  id: string;
@@ -72,6 +73,7 @@ export declare abstract class OpportunityService {
72
73
  tvl: number;
73
74
  apr: number;
74
75
  dailyRewards: number;
76
+ lastCampaignCreatedAt: Date;
75
77
  } | null>;
76
78
  /**
77
79
  * @param upsert whether to update the opportunity if it already exists in database
@@ -229,6 +231,7 @@ export declare abstract class OpportunityService {
229
231
  tvl: number;
230
232
  apr: number;
231
233
  dailyRewards: number;
234
+ lastCampaignCreatedAt: string;
232
235
  campaigns: {
233
236
  creator?: {
234
237
  tags?: string[] | undefined;
@@ -367,6 +370,7 @@ export declare abstract class OpportunityService {
367
370
  tvl: number;
368
371
  apr: number;
369
372
  dailyRewards: number;
373
+ lastCampaignCreatedAt: string;
370
374
  campaigns: {
371
375
  creator?: {
372
376
  tags?: string[] | undefined;
@@ -538,6 +542,7 @@ export declare abstract class OpportunityService {
538
542
  tvl: number;
539
543
  apr: number;
540
544
  dailyRewards: number;
545
+ lastCampaignCreatedAt: Date;
541
546
  };
542
547
  id: string;
543
548
  type: string;
@@ -553,6 +558,7 @@ export declare abstract class OpportunityService {
553
558
  id: string;
554
559
  depositUrl: string | undefined;
555
560
  explorerAddress: string | undefined;
561
+ lastCampaignCreatedAt: string;
556
562
  tokens: ({
557
563
  symbol: string;
558
564
  id: string;
@@ -711,6 +717,7 @@ export declare abstract class OpportunityService {
711
717
  tvl: number;
712
718
  apr: number;
713
719
  dailyRewards: number;
720
+ lastCampaignCreatedAt: Date;
714
721
  };
715
722
  id: string;
716
723
  type: string;
@@ -726,6 +733,7 @@ export declare abstract class OpportunityService {
726
733
  id: string;
727
734
  depositUrl: string | undefined;
728
735
  explorerAddress: string | undefined;
736
+ lastCampaignCreatedAt: string;
729
737
  tokens: ({
730
738
  symbol: string;
731
739
  id: string;
@@ -877,6 +885,7 @@ export declare abstract class OpportunityService {
877
885
  tvl: number;
878
886
  apr: number;
879
887
  dailyRewards: number;
888
+ lastCampaignCreatedAt: Date;
880
889
  };
881
890
  id: string;
882
891
  type: string;
@@ -892,6 +901,7 @@ export declare abstract class OpportunityService {
892
901
  id: string;
893
902
  depositUrl: string | undefined;
894
903
  explorerAddress: string | undefined;
904
+ lastCampaignCreatedAt: string;
895
905
  tokens: ({
896
906
  symbol: string;
897
907
  id: string;
@@ -934,6 +944,7 @@ export declare abstract class OpportunityService {
934
944
  id: string;
935
945
  depositUrl: string | undefined;
936
946
  explorerAddress: string | undefined;
947
+ lastCampaignCreatedAt: string;
937
948
  tokens: ({
938
949
  symbol: string;
939
950
  id: string;
@@ -998,6 +1009,7 @@ export declare abstract class OpportunityService {
998
1009
  tvl: number;
999
1010
  apr: number;
1000
1011
  dailyRewards: number;
1012
+ lastCampaignCreatedAt: Date;
1001
1013
  }>;
1002
1014
  static updateMany(ids: string[], data: Partial<Opportunity["raw"]>): Promise<import("database/api/.generated/runtime/library").GetBatchResult>;
1003
1015
  }
@@ -221,15 +221,16 @@ export class OpportunityService {
221
221
  return formated;
222
222
  }
223
223
  static formatResponseBase(opportunity) {
224
- let { mainProtocolId, id, Tokens, Chain, Protocols, MainProtocol, manualOverrides, ...opp } = opportunity;
224
+ let { mainProtocolId, id, Tokens, Chain, Protocols, MainProtocol, lastCampaignCreatedAt, depositUrl, explorerAddress, manualOverrides, ...opp } = opportunity;
225
225
  if (mainProtocolId === "unknown") {
226
226
  MainProtocol = null;
227
227
  }
228
228
  return {
229
229
  ...opp,
230
230
  id,
231
- depositUrl: opp.depositUrl ?? undefined,
232
- explorerAddress: opp.explorerAddress ?? undefined,
231
+ depositUrl: depositUrl ?? undefined,
232
+ explorerAddress: explorerAddress ?? undefined,
233
+ lastCampaignCreatedAt: lastCampaignCreatedAt.toISOString(),
233
234
  tokens: Tokens.map(t => TokenService.format(t)),
234
235
  chain: Chain,
235
236
  protocol: MainProtocol ?? undefined,