@merkl/api 0.10.167 → 0.10.169

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. package/dist/src/cache/declaration.d.ts +0 -30
  2. package/dist/src/cache/declaration.js +0 -30
  3. package/dist/src/eden/index.d.ts +59 -12
  4. package/dist/src/index.d.ts +23 -4
  5. package/dist/src/libs/campaigns/campaignTypes/CLAMMDynamicData.js +2 -2
  6. package/dist/src/libs/positions/clamm/index.d.ts +1 -2
  7. package/dist/src/libs/positions/clamm/index.js +322 -330
  8. package/dist/src/libs/positions/clamm/thegraph/fetchAlmPositions.d.ts +1 -1
  9. package/dist/src/libs/positions/clamm/thegraph/fetchAlmPositions.js +1 -1
  10. package/dist/src/libs/positions/clamm/thegraph/fetchAmmPositions.d.ts +1 -1
  11. package/dist/src/libs/positions/clamm/thegraph/fetchAmmPositions.js +2 -2
  12. package/dist/src/libs/positions/clamm/thegraph/fetchFarmedPositions.d.ts +1 -2
  13. package/dist/src/libs/positions/clamm/thegraph/fetchFarmedPositions.js +1 -4
  14. package/dist/src/libs/positions/euler/index.js +2 -3
  15. package/dist/src/libs/positions/index.js +1 -1
  16. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +2 -2
  17. package/dist/src/modules/v4/campaign/campaign.service.d.ts +6 -5
  18. package/dist/src/modules/v4/campaign/campaign.service.js +10 -2
  19. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +2 -2
  20. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +159 -0
  21. package/dist/src/modules/v4/opportunity/opportunity.repository.js +29 -0
  22. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +131 -3
  23. package/dist/src/modules/v4/opportunity/opportunity.service.js +11 -0
  24. package/dist/src/modules/v4/position/implementations/AjnaPositionFetcher.d.ts +6 -0
  25. package/dist/src/modules/v4/position/implementations/AjnaPositionFetcher.js +90 -0
  26. package/dist/src/modules/v4/position/implementations/BadgerPositionFetcher.d.ts +6 -0
  27. package/dist/src/modules/v4/position/implementations/BadgerPositionFetcher.js +69 -0
  28. package/dist/src/modules/v4/position/implementations/ClammPositionFetcher.d.ts +6 -0
  29. package/dist/src/modules/v4/position/implementations/ClammPositionFetcher.js +71 -0
  30. package/dist/src/modules/v4/position/implementations/DolomitePositionFetcher.d.ts +6 -0
  31. package/dist/src/modules/v4/position/implementations/DolomitePositionFetcher.js +45 -0
  32. package/dist/src/modules/v4/position/implementations/ERC20PositionFetcher.d.ts +6 -0
  33. package/dist/src/modules/v4/position/implementations/ERC20PositionFetcher.js +47 -0
  34. package/dist/src/modules/v4/position/implementations/EulerPositionFetcher.d.ts +6 -0
  35. package/dist/src/modules/v4/position/implementations/EulerPositionFetcher.js +40 -0
  36. package/dist/src/modules/v4/position/index.d.ts +2 -0
  37. package/dist/src/modules/v4/position/index.js +2 -0
  38. package/dist/src/modules/v4/position/position.controller.d.ts +39 -0
  39. package/dist/src/modules/v4/position/position.controller.js +16 -0
  40. package/dist/src/modules/v4/position/position.model.d.ts +25 -0
  41. package/dist/src/modules/v4/position/position.model.js +5 -0
  42. package/dist/src/modules/v4/position/position.repository.d.ts +14 -0
  43. package/dist/src/modules/v4/position/position.repository.js +6 -0
  44. package/dist/src/modules/v4/position/position.service.d.ts +5 -0
  45. package/dist/src/modules/v4/position/position.service.js +34 -0
  46. package/dist/src/modules/v4/reward/reward.service.d.ts +5 -0
  47. package/dist/src/modules/v4/reward/reward.service.js +5 -2
  48. package/dist/src/modules/v4/router.d.ts +23 -4
  49. package/dist/src/modules/v4/router.js +3 -1
  50. package/dist/src/routes/v1/prices.js +2 -4
  51. package/dist/src/routes/v3/blacklist.d.ts +23 -4
  52. package/dist/src/routes/v3/campaigns.d.ts +24 -5
  53. package/dist/src/routes/v3/campaignsInfo.d.ts +23 -4
  54. package/dist/src/routes/v3/multiChainPositions.d.ts +23 -4
  55. package/dist/src/routes/v3/opportunity.d.ts +23 -4
  56. package/dist/src/routes/v3/positions.d.ts +23 -4
  57. package/dist/src/routes/v3/recipients.d.ts +6 -2
  58. package/dist/src/routes/v3/recipients.js +14 -8
  59. package/dist/src/routes/v3/rewards.d.ts +23 -4
  60. package/dist/src/routes/v3/updates.d.ts +23 -4
  61. package/dist/src/routes/v3/userRewards.d.ts +23 -4
  62. package/dist/src/utils/prices/services/erc4626Service.js +4 -4
  63. package/dist/tsconfig.package.tsbuildinfo +1 -1
  64. package/package.json +1 -1
  65. package/dist/src/libs/reports/campaignReport.d.ts +0 -9
  66. package/dist/src/libs/reports/campaignReport.js +0 -37
  67. package/dist/src/libs/reports/mainParameterRewards.d.ts +0 -3
  68. package/dist/src/libs/reports/mainParameterRewards.js +0 -48
@@ -1,5 +1,5 @@
1
1
  import { type MerklChainId } from "@sdk";
2
2
  import { BigNumber } from "ethers";
3
- export declare function fetchAlmPositionsV2(chainId: MerklChainId, user: string): Promise<{
3
+ export declare function fetchAlmPositions(chainId: MerklChainId, user: string): Promise<{
4
4
  [token: string]: BigNumber;
5
5
  }>;
@@ -4,7 +4,7 @@ import { request } from "graphql-request";
4
4
  import { almBalancesQuery, almNFTBalancesQuery } from ".";
5
5
  import { MERKL_USER_POSITION_FETCHING_TIMEOUT } from "../../../../constants";
6
6
  import { log } from "../../../../utils/logger";
7
- export async function fetchAlmPositionsV2(chainId, user) {
7
+ export async function fetchAlmPositions(chainId, user) {
8
8
  const res = {};
9
9
  const availableALMEndpoints = merklSubgraphALMEndpoints[chainId];
10
10
  if (Object.keys(availableALMEndpoints).length > 0) {
@@ -1,6 +1,6 @@
1
1
  import { AMM, type ANGLE_NETWORKS } from "@sdk";
2
2
  import { type PositionType } from ".";
3
- export declare function fetchAmmPositionsV2(chainId: (typeof ANGLE_NETWORKS.merkl)[number], user: string, amms: AMM[]): Promise<{
3
+ export declare function fetchAmmPositions(chainId: (typeof ANGLE_NETWORKS.merkl)[number], user: string, amms: AMM[]): Promise<{
4
4
  [amm in AMM]?: {
5
5
  nft: PositionType[];
6
6
  direct: PositionType[];
@@ -3,7 +3,7 @@ import { request } from "graphql-request";
3
3
  import { positionsQuery } from ".";
4
4
  import { MERKL_USER_POSITION_FETCHING_TIMEOUT } from "../../../../constants";
5
5
  import { log } from "../../../../utils/logger";
6
- export async function fetchAmmPositionsV2(chainId, user, amms) {
6
+ export async function fetchAmmPositions(chainId, user, amms) {
7
7
  const res = {};
8
8
  const promises = amms.map(async (amm) => {
9
9
  const tgURL = merklSubgraphAMMEndpoints[chainId][amm];
@@ -12,7 +12,7 @@ export async function fetchAmmPositionsV2(chainId, user, amms) {
12
12
  owner: user?.toLowerCase(),
13
13
  }), MERKL_USER_POSITION_FETCHING_TIMEOUT)
14
14
  .then(fetchedData => {
15
- res[amm] = {};
15
+ res[amm] = { nft: [], direct: [] };
16
16
  res[amm].nft = fetchedData?.nft?.reduce((prev, curr) => {
17
17
  if (!prev.map(i => i.id).includes(curr.id))
18
18
  prev.push(curr);
@@ -7,5 +7,4 @@ export type FarmPositionsType = {
7
7
  holder: string;
8
8
  }[];
9
9
  };
10
- export declare function fetchFarmedPositionsV2(chainId: MerklChainId, owners: string[], amm: AMM): Promise<FarmPositionsType>;
11
- export declare const fetchFarmedPositionsV2WithCache: (chainId: MerklChainId, user: string[], amm: AMM) => Promise<any>;
10
+ export declare function fetchFarmedPositions(chainId: MerklChainId, owners: string[], amm: AMM): Promise<FarmPositionsType>;
@@ -1,11 +1,9 @@
1
- import { Redis } from "../../../../cache";
2
1
  import { MERKL_USER_POSITION_FETCHING_TIMEOUT } from "../../../../constants";
3
- import { hashArray } from "../../../../utils/hashArray";
4
2
  import { AMM, NETWORK_LABELS, getSupportedNFPWrapperMapping, merklSubgraphNFPWrapperEndpoints, withTimeout, } from "@sdk";
5
3
  import { request } from "graphql-request";
6
4
  import { nftWrapperPositionsQuery } from ".";
7
5
  import { log } from "../../../../utils/logger";
8
- export async function fetchFarmedPositionsV2(chainId, owners, amm) {
6
+ export async function fetchFarmedPositions(chainId, owners, amm) {
9
7
  const res = {};
10
8
  const promises = getSupportedNFPWrapperMapping(chainId, amm).map(async (wrapper) => {
11
9
  const tgURL = merklSubgraphNFPWrapperEndpoints[chainId][wrapper];
@@ -41,4 +39,3 @@ export async function fetchFarmedPositionsV2(chainId, owners, amm) {
41
39
  await Promise.all(promises);
42
40
  return res;
43
41
  }
44
- export const fetchFarmedPositionsV2WithCache = async (chainId, user, amm) => await Redis.getOrSet(`FarmedPositions_${hashArray(chainId, user, amm)}$`, fetchFarmedPositionsV2, chainId, user, amm);
@@ -1,6 +1,5 @@
1
- import { BN2Number, Campaign, ERC20Interface, EulerVault__factory } from "@sdk";
1
+ import { BN2Number, Campaign, ERC20Interface } from "@sdk";
2
2
  import { getAddress } from "ethers/lib/utils";
3
- const EulerVaultInterface = EulerVault__factory.createInterface();
4
3
  export async function getEulerUserPositions(user, _chainId, tokens) {
5
4
  /**
6
5
  * Fetch user positions
@@ -9,7 +8,7 @@ export async function getEulerUserPositions(user, _chainId, tokens) {
9
8
  for (const token of Object.keys(tokens)) {
10
9
  calls.push({
11
10
  allowFailure: true,
12
- callData: EulerVaultInterface.encodeFunctionData("balanceOf", [user]),
11
+ callData: ERC20Interface.encodeFunctionData("balanceOf", [user]),
13
12
  target: token,
14
13
  });
15
14
  }
@@ -17,7 +17,7 @@ chainId, user) {
17
17
  const numkey = Number(key);
18
18
  switch (numkey) {
19
19
  case Campaign.CLAMM:
20
- promises.push(withTimeout(executeSimple(chainId, getClammUserPositions(user, chainId, positionsToCheck[numkey])), MERKL_USER_POSITION_FETCHING_GLOBAL_TIMEOUT));
20
+ promises.push(withTimeout(getClammUserPositions(user, chainId, positionsToCheck[numkey]), MERKL_USER_POSITION_FETCHING_GLOBAL_TIMEOUT));
21
21
  break;
22
22
  case Campaign.ERC20:
23
23
  promises.push(withTimeout(executeSimple(chainId, getERC20UserPositions(user, chainId, positionsToCheck[numkey])), MERKL_USER_POSITION_FETCHING_GLOBAL_TIMEOUT));
@@ -75,7 +75,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
75
75
  };
76
76
  headers: unknown;
77
77
  response: {
78
- 200: ({
78
+ 200: {
79
79
  params: any;
80
80
  chain: {
81
81
  name: string;
@@ -118,7 +118,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
118
118
  amount: string;
119
119
  opportunityId: string;
120
120
  creatorAddress: string;
121
- } | null)[];
121
+ }[];
122
122
  };
123
123
  };
124
124
  };
@@ -1,4 +1,4 @@
1
- import { type CampaignUnique, type ConvertedCampaignType, type CreateCampaignModel, type GetCampaignQueryModel } from "./";
1
+ import { type Campaign, type CampaignUnique, type ConvertedCampaignType, type CreateCampaignModel, type GetCampaignQueryModel } from "./";
2
2
  import { CampaignRepository } from "./campaign.repository";
3
3
  import type { CampaignType } from "../../../../database/api/.generated";
4
4
  import { type CampaignParameters, type Campaign as CampaignTypeV3, type ChainId } from "@sdk";
@@ -28,7 +28,7 @@ export declare abstract class CampaignService {
28
28
  * @param query
29
29
  * @returns A list of campaigns
30
30
  */
31
- static findMany(query: GetCampaignQueryModel): Promise<({
31
+ static findMany(query: GetCampaignQueryModel): Promise<{
32
32
  params: any;
33
33
  chain: {
34
34
  name: string;
@@ -71,7 +71,7 @@ export declare abstract class CampaignService {
71
71
  amount: string;
72
72
  opportunityId: string;
73
73
  creatorAddress: string;
74
- } | null)[]>;
74
+ }[]>;
75
75
  /**
76
76
  * Counts the number of campaigns that complies to query
77
77
  * @description used for pagination purposes
@@ -160,7 +160,7 @@ export declare abstract class CampaignService {
160
160
  * @returns A list of opportunities
161
161
  * TODO: remove this function in favor of prisma client extensions
162
162
  */
163
- static format(campaign: NonNullable<Awaited<ReturnType<typeof CampaignRepository.findMany>>>[number] | null): {
163
+ static format(campaign: NonNullable<Awaited<ReturnType<typeof CampaignRepository.findMany>>>[number]): {
164
164
  params: any;
165
165
  chain: {
166
166
  name: string;
@@ -203,7 +203,8 @@ export declare abstract class CampaignService {
203
203
  amount: string;
204
204
  opportunityId: string;
205
205
  creatorAddress: string;
206
- } | null;
206
+ };
207
+ static formatAsCampaignParameters<C extends CampaignTypeV3>(campaign: Campaign["model"]): CampaignParameters<C>;
207
208
  /**
208
209
  * Fetches the campaign dynamic data for a v3 campaign onchain
209
210
  * @param chainId
@@ -164,8 +164,6 @@ export class CampaignService {
164
164
  * TODO: remove this function in favor of prisma client extensions
165
165
  */
166
166
  static format(campaign) {
167
- if (campaign === null)
168
- return null;
169
167
  const { DistributionChain, ComputeChain, RewardToken, params, CampaignStatus, ...c } = campaign;
170
168
  return {
171
169
  ...c,
@@ -177,6 +175,16 @@ export class CampaignService {
177
175
  campaignStatus: CampaignStatus?.[0],
178
176
  };
179
177
  }
178
+ static formatAsCampaignParameters(campaign) {
179
+ return {
180
+ campaignSubType: campaign.subType ?? 0,
181
+ campaignParameters: campaign.params,
182
+ computeChainId: campaign.computeChainId,
183
+ campaignId: campaign.campaignId,
184
+ rewardToken: campaign.rewardToken.address,
185
+ amount: campaign.amount,
186
+ };
187
+ }
180
188
  /**
181
189
  * Fetches the campaign dynamic data for a v3 campaign onchain
182
190
  * @param chainId
@@ -232,7 +232,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
232
232
  tvl: number;
233
233
  apr: number;
234
234
  dailyRewards: number;
235
- campaigns: ({
235
+ campaigns: {
236
236
  params: any;
237
237
  chain: {
238
238
  name: string;
@@ -275,7 +275,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
275
275
  amount: string;
276
276
  opportunityId: string;
277
277
  creatorAddress: string;
278
- } | null)[];
278
+ }[];
279
279
  } | null | undefined;
280
280
  };
281
281
  };
@@ -1,4 +1,5 @@
1
1
  import { type Prisma, Status } from "../../../../database/api/.generated";
2
+ import type { MerklChainId } from "@sdk";
2
3
  import { type AprRecord } from "../apr";
3
4
  import { type DailyRewardsRecord } from "../reward";
4
5
  import { type TvlRecord } from "../tvl";
@@ -432,6 +433,164 @@ export declare abstract class OpportunityRepository {
432
433
  apr: number;
433
434
  dailyRewards: number;
434
435
  })[]>;
436
+ static findLiveWithFirstCampaign(chainId: MerklChainId): Promise<({
437
+ Chain: {
438
+ name: string;
439
+ id: number;
440
+ icon: string;
441
+ };
442
+ Campaigns: ({
443
+ ComputeChain: {
444
+ name: string;
445
+ id: number;
446
+ icon: string;
447
+ };
448
+ DistributionChain: {
449
+ name: string;
450
+ id: number;
451
+ icon: string;
452
+ };
453
+ RewardToken: {
454
+ symbol: string;
455
+ name: string | null;
456
+ id: string;
457
+ chainId: number;
458
+ address: string;
459
+ icon: string;
460
+ decimals: number;
461
+ verified: boolean;
462
+ price: number | null;
463
+ };
464
+ CampaignStatus: {
465
+ error: string;
466
+ details: Prisma.JsonValue;
467
+ status: import("../../../../database/api/.generated").$Enums.RunStatus;
468
+ campaignId: string;
469
+ computedUntil: bigint;
470
+ processingStarted: bigint;
471
+ }[];
472
+ } & {
473
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
474
+ id: string;
475
+ params: Prisma.JsonValue;
476
+ subType: number | null;
477
+ startTimestamp: bigint;
478
+ endTimestamp: bigint;
479
+ computeChainId: number;
480
+ distributionChainId: number;
481
+ campaignId: string;
482
+ rewardTokenId: string;
483
+ amount: string;
484
+ opportunityId: string;
485
+ creatorAddress: string;
486
+ })[];
487
+ Tokens: {
488
+ symbol: string;
489
+ name: string | null;
490
+ id: string;
491
+ chainId: number;
492
+ address: string;
493
+ icon: string;
494
+ decimals: number;
495
+ verified: boolean;
496
+ price: number | null;
497
+ }[];
498
+ Protocols: {
499
+ name: string;
500
+ url: string;
501
+ description: string;
502
+ id: string;
503
+ tags: import("../../../../database/api/.generated").$Enums.ProtocolTag[];
504
+ icon: string;
505
+ }[];
506
+ MainProtocol: {
507
+ name: string;
508
+ url: string;
509
+ description: string;
510
+ id: string;
511
+ tags: import("../../../../database/api/.generated").$Enums.ProtocolTag[];
512
+ icon: string;
513
+ } | null;
514
+ TvlRecords: ({
515
+ TvlBreakdown: {
516
+ type: import("../../../../database/api/.generated").$Enums.TvlType;
517
+ id: number;
518
+ identifier: string;
519
+ value: number;
520
+ tvlRecordId: string;
521
+ }[];
522
+ } & {
523
+ total: number;
524
+ id: string;
525
+ timestamp: bigint;
526
+ opportunityId: string;
527
+ })[];
528
+ AprRecords: ({
529
+ AprBreakdown: {
530
+ type: import("../../../../database/api/.generated").$Enums.AprType;
531
+ id: number;
532
+ identifier: string;
533
+ value: number;
534
+ aprRecordId: string;
535
+ }[];
536
+ } & {
537
+ id: string;
538
+ timestamp: bigint;
539
+ opportunityId: string;
540
+ cumulated: number;
541
+ })[];
542
+ DailyRewardsRecords: ({
543
+ DailyRewardsBreakdown: ({
544
+ Campaign: {
545
+ startTimestamp: bigint;
546
+ endTimestamp: bigint;
547
+ amount: string;
548
+ RewardToken: {
549
+ symbol: string;
550
+ name: string | null;
551
+ id: string;
552
+ chainId: number;
553
+ address: string;
554
+ icon: string;
555
+ decimals: number;
556
+ verified: boolean;
557
+ price: number | null;
558
+ };
559
+ CampaignStatus: {
560
+ error: string;
561
+ details: Prisma.JsonValue;
562
+ status: import("../../../../database/api/.generated").$Enums.RunStatus;
563
+ campaignId: string;
564
+ computedUntil: bigint;
565
+ processingStarted: bigint;
566
+ }[];
567
+ };
568
+ } & {
569
+ id: number;
570
+ value: number;
571
+ campaignId: string;
572
+ dailyRewardsRecordId: string;
573
+ })[];
574
+ } & {
575
+ total: number;
576
+ id: string;
577
+ timestamp: bigint;
578
+ opportunityId: string;
579
+ })[];
580
+ } & {
581
+ name: string;
582
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
583
+ id: string;
584
+ status: import("../../../../database/api/.generated").$Enums.Status;
585
+ tags: string[];
586
+ identifier: string;
587
+ chainId: number;
588
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
589
+ mainProtocolId: string | null;
590
+ tvl: number;
591
+ apr: number;
592
+ dailyRewards: number;
593
+ })[]>;
435
594
  static countMany(query: GetOpportunitiesQueryEntity): Promise<number>;
436
595
  static getAllIdsForDynamicOpp(): Promise<{
437
596
  id: string;
@@ -1,5 +1,6 @@
1
1
  import { apiDbClient } from "../../../utils/prisma";
2
2
  import { Status } from "../../../../database/api/.generated";
3
+ import moment from "moment";
3
4
  import { AprService } from "../apr";
4
5
  import { RewardService } from "../reward";
5
6
  import { TvlService } from "../tvl";
@@ -176,6 +177,34 @@ export class OpportunityRepository {
176
177
  ...args,
177
178
  });
178
179
  }
180
+ static async findLiveWithFirstCampaign(chainId) {
181
+ const now = moment().unix();
182
+ return await apiDbClient.opportunity.findMany({
183
+ include: {
184
+ ...OpportunityRepository.#getRecordInclusion(),
185
+ Campaigns: {
186
+ include: { RewardToken: true, ComputeChain: true, DistributionChain: true, CampaignStatus: true },
187
+ take: 1,
188
+ orderBy: { endTimestamp: "desc" },
189
+ },
190
+ MainProtocol: true,
191
+ Chain: true,
192
+ Protocols: true,
193
+ Tokens: true,
194
+ },
195
+ where: {
196
+ status: "LIVE",
197
+ Chain: { id: chainId },
198
+ Campaigns: {
199
+ some: {
200
+ endTimestamp: {
201
+ gt: now,
202
+ },
203
+ },
204
+ },
205
+ },
206
+ });
207
+ }
179
208
  static async countMany(query) {
180
209
  const args = OpportunityRepository.#transformQueryToPrismaFilters(query);
181
210
  return await apiDbClient.opportunity.count(args);
@@ -1,6 +1,6 @@
1
1
  import { type CreateCampaignModel } from "../campaign";
2
2
  import { Prisma } from "../../../../database/api/.generated";
3
- import { type ChainId } from "@sdk";
3
+ import { type ChainId, type MerklChainId } from "@sdk";
4
4
  import type { CreateOpportunityModel, GetOpportunitiesQueryEntity, LightOpportunityFromDB, OpportunityMetadata, OpportunityUnique } from "./opportunity.model";
5
5
  import { OpportunityRepository } from "./opportunity.repository";
6
6
  export declare abstract class OpportunityService {
@@ -102,7 +102,7 @@ export declare abstract class OpportunityService {
102
102
  apr: number;
103
103
  dailyRewards: number;
104
104
  } & {
105
- campaigns: ({
105
+ campaigns: {
106
106
  params: any;
107
107
  chain: {
108
108
  name: string;
@@ -145,7 +145,7 @@ export declare abstract class OpportunityService {
145
145
  amount: string;
146
146
  opportunityId: string;
147
147
  creatorAddress: string;
148
- } | null)[];
148
+ }[];
149
149
  }) | null>;
150
150
  static getUniqueOrThrow(opportunityId: string | OpportunityUnique): Promise<{
151
151
  aprRecord: {
@@ -318,6 +318,134 @@ export declare abstract class OpportunityService {
318
318
  apr: number;
319
319
  dailyRewards: number;
320
320
  } | null)[]>;
321
+ static findLiveWithFirstCampaign(chainId: MerklChainId): Promise<({
322
+ aprRecord: {
323
+ cumulated: number;
324
+ timestamp: bigint;
325
+ breakdowns: {
326
+ type: import("../../../../database/api/.generated").$Enums.AprType;
327
+ id: number;
328
+ identifier: string;
329
+ value: number;
330
+ aprRecordId: string;
331
+ }[];
332
+ };
333
+ tvlRecord: {
334
+ id: string;
335
+ total: number;
336
+ timestamp: bigint;
337
+ breakdowns: {
338
+ type: import("../../../../database/api/.generated").$Enums.TvlType;
339
+ id: number;
340
+ identifier: string;
341
+ value: number;
342
+ tvlRecordId: string;
343
+ }[];
344
+ };
345
+ rewardsRecord: {
346
+ id: string;
347
+ total: number;
348
+ timestamp: bigint;
349
+ breakdowns: {
350
+ id: number;
351
+ value: number;
352
+ campaignId: string;
353
+ dailyRewardsRecordId: string;
354
+ token: {
355
+ symbol: string;
356
+ name: string | null;
357
+ id: string;
358
+ chainId: number;
359
+ address: string;
360
+ icon: string;
361
+ decimals: number;
362
+ verified: boolean;
363
+ price: number | null;
364
+ };
365
+ amount: bigint;
366
+ }[];
367
+ };
368
+ id: string;
369
+ tokens: {
370
+ symbol: string;
371
+ name: string | null;
372
+ id: string;
373
+ chainId: number;
374
+ address: string;
375
+ icon: string;
376
+ decimals: number;
377
+ verified: boolean;
378
+ price: number | null;
379
+ }[];
380
+ chain: {
381
+ name: string;
382
+ id: number;
383
+ icon: string;
384
+ };
385
+ protocol: {
386
+ name: string;
387
+ url: string;
388
+ description: string;
389
+ id: string;
390
+ tags: import("../../../../database/api/.generated").$Enums.ProtocolTag[];
391
+ icon: string;
392
+ } | undefined;
393
+ name: string;
394
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
395
+ status: import("../../../../database/api/.generated").$Enums.Status;
396
+ tags: string[];
397
+ identifier: string;
398
+ chainId: number;
399
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
400
+ tvl: number;
401
+ apr: number;
402
+ dailyRewards: number;
403
+ } & {
404
+ campaigns: {
405
+ params: any;
406
+ chain: {
407
+ name: string;
408
+ id: number;
409
+ icon: string;
410
+ };
411
+ rewardToken: {
412
+ symbol: string;
413
+ name: string | null;
414
+ id: string;
415
+ chainId: number;
416
+ address: string;
417
+ icon: string;
418
+ decimals: number;
419
+ verified: boolean;
420
+ price: number | null;
421
+ };
422
+ distributionChain: {
423
+ name: string;
424
+ id: number;
425
+ icon: string;
426
+ } | undefined;
427
+ campaignStatus: {
428
+ error: string;
429
+ details: Prisma.JsonValue;
430
+ status: import("../../../../database/api/.generated").$Enums.RunStatus;
431
+ campaignId: string;
432
+ computedUntil: bigint;
433
+ processingStarted: bigint;
434
+ };
435
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
436
+ id: string;
437
+ subType: number | null;
438
+ startTimestamp: bigint;
439
+ endTimestamp: bigint;
440
+ computeChainId: number;
441
+ distributionChainId: number;
442
+ campaignId: string;
443
+ rewardTokenId: string;
444
+ amount: string;
445
+ opportunityId: string;
446
+ creatorAddress: string;
447
+ }[];
448
+ })[]>;
321
449
  static getAllIds(): Promise<{
322
450
  id: string;
323
451
  }[]>;
@@ -152,6 +152,17 @@ export class OpportunityService {
152
152
  }, query);
153
153
  });
154
154
  }
155
+ static async findLiveWithFirstCampaign(chainId) {
156
+ return record("data-layer.access", async () => {
157
+ return await CacheService.wrap(TTLPresets.MIN_10, async (chainId) => {
158
+ const opportunities = await OpportunityRepository.findLiveWithFirstCampaign(chainId);
159
+ return opportunities.map(o => {
160
+ const formatted = OpportunityService.formatResponse(o);
161
+ return Object.assign(formatted, { campaigns: o.Campaigns.map(CampaignService.format) });
162
+ });
163
+ }, chainId);
164
+ });
165
+ }
155
166
  static async getAllIds() {
156
167
  return await OpportunityRepository.getAllIdsForDynamicOpp();
157
168
  }
@@ -0,0 +1,6 @@
1
+ import { type MerklChainId } from "@sdk";
2
+ import type { Opportunity } from "../../opportunity";
3
+ import type { PositionFetcher } from "../position.model";
4
+ export declare class AjnaPositionFetcher implements PositionFetcher {
5
+ fetchPositions: (chainId: MerklChainId, user: string, opportunities: Opportunity["model"][]) => Promise<import("..").PositionT[]>;
6
+ }