@merkl/api 0.10.168 → 0.10.170

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 (97) hide show
  1. package/dist/database/api/.generated/edge.js +6 -3
  2. package/dist/database/api/.generated/index-browser.js +3 -0
  3. package/dist/database/api/.generated/index.d.ts +113 -0
  4. package/dist/database/api/.generated/index.js +6 -3
  5. package/dist/database/api/.generated/package.json +1 -1
  6. package/dist/database/api/.generated/schema.prisma +17 -15
  7. package/dist/database/api/.generated/wasm.js +3 -0
  8. package/dist/src/cache/declaration.d.ts +0 -30
  9. package/dist/src/cache/declaration.js +0 -30
  10. package/dist/src/eden/index.d.ts +167 -15
  11. package/dist/src/index.d.ts +59 -5
  12. package/dist/src/libs/campaigns/campaignTypes/CLAMMDynamicData.js +2 -2
  13. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/factoryFinder.js +2 -0
  14. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.d.ts +3 -1
  15. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.js +8 -0
  16. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/PendleYTProcessor.d.ts +29 -0
  17. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/PendleYTProcessor.js +31 -0
  18. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/processorMapping.js +3 -0
  19. package/dist/src/libs/positions/clamm/index.d.ts +1 -2
  20. package/dist/src/libs/positions/clamm/index.js +322 -330
  21. package/dist/src/libs/positions/clamm/thegraph/fetchAlmPositions.d.ts +1 -1
  22. package/dist/src/libs/positions/clamm/thegraph/fetchAlmPositions.js +1 -1
  23. package/dist/src/libs/positions/clamm/thegraph/fetchAmmPositions.d.ts +1 -1
  24. package/dist/src/libs/positions/clamm/thegraph/fetchAmmPositions.js +2 -2
  25. package/dist/src/libs/positions/clamm/thegraph/fetchFarmedPositions.d.ts +1 -2
  26. package/dist/src/libs/positions/clamm/thegraph/fetchFarmedPositions.js +1 -4
  27. package/dist/src/libs/positions/euler/index.js +2 -3
  28. package/dist/src/libs/positions/index.js +1 -1
  29. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +6 -2
  30. package/dist/src/modules/v4/campaign/campaign.model.d.ts +1 -0
  31. package/dist/src/modules/v4/campaign/campaign.model.js +1 -0
  32. package/dist/src/modules/v4/campaign/campaign.repository.d.ts +2 -0
  33. package/dist/src/modules/v4/campaign/campaign.repository.js +2 -1
  34. package/dist/src/modules/v4/campaign/campaign.service.d.ts +10 -5
  35. package/dist/src/modules/v4/campaign/campaign.service.js +10 -2
  36. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +20 -3
  37. package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +2 -1
  38. package/dist/src/modules/v4/opportunity/opportunity.model.js +1 -0
  39. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +83 -5
  40. package/dist/src/modules/v4/opportunity/opportunity.repository.js +31 -0
  41. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +162 -8
  42. package/dist/src/modules/v4/opportunity/opportunity.service.js +11 -0
  43. package/dist/src/modules/v4/position/implementations/AjnaPositionFetcher.d.ts +6 -0
  44. package/dist/src/modules/v4/position/implementations/AjnaPositionFetcher.js +90 -0
  45. package/dist/src/modules/v4/position/implementations/BadgerPositionFetcher.d.ts +6 -0
  46. package/dist/src/modules/v4/position/implementations/BadgerPositionFetcher.js +69 -0
  47. package/dist/src/modules/v4/position/implementations/ClammPositionFetcher.d.ts +6 -0
  48. package/dist/src/modules/v4/position/implementations/ClammPositionFetcher.js +71 -0
  49. package/dist/src/modules/v4/position/implementations/DolomitePositionFetcher.d.ts +6 -0
  50. package/dist/src/modules/v4/position/implementations/DolomitePositionFetcher.js +45 -0
  51. package/dist/src/modules/v4/position/implementations/ERC20PositionFetcher.d.ts +6 -0
  52. package/dist/src/modules/v4/position/implementations/ERC20PositionFetcher.js +47 -0
  53. package/dist/src/modules/v4/position/implementations/EulerPositionFetcher.d.ts +6 -0
  54. package/dist/src/modules/v4/position/implementations/EulerPositionFetcher.js +40 -0
  55. package/dist/src/modules/v4/position/index.d.ts +2 -0
  56. package/dist/src/modules/v4/position/index.js +2 -0
  57. package/dist/src/modules/v4/position/position.controller.d.ts +39 -0
  58. package/dist/src/modules/v4/position/position.controller.js +16 -0
  59. package/dist/src/modules/v4/position/position.model.d.ts +25 -0
  60. package/dist/src/modules/v4/position/position.model.js +5 -0
  61. package/dist/src/modules/v4/position/position.repository.d.ts +14 -0
  62. package/dist/src/modules/v4/position/position.repository.js +6 -0
  63. package/dist/src/modules/v4/position/position.service.d.ts +5 -0
  64. package/dist/src/modules/v4/position/position.service.js +34 -0
  65. package/dist/src/modules/v4/price/price.controller.js +1 -1
  66. package/dist/src/modules/v4/price/price.service.d.ts +1 -1
  67. package/dist/src/modules/v4/price/price.service.js +3 -3
  68. package/dist/src/modules/v4/reward/reward.repository.d.ts +4 -0
  69. package/dist/src/modules/v4/reward/reward.service.d.ts +27 -0
  70. package/dist/src/modules/v4/reward/reward.service.js +5 -2
  71. package/dist/src/modules/v4/router.d.ts +59 -5
  72. package/dist/src/modules/v4/router.js +3 -1
  73. package/dist/src/modules/v4/token/token.controller.d.ts +6 -0
  74. package/dist/src/modules/v4/token/token.service.d.ts +12 -0
  75. package/dist/src/modules/v4/user/user.controller.d.ts +8 -0
  76. package/dist/src/routes/v1/prices.js +2 -4
  77. package/dist/src/routes/v3/blacklist.d.ts +59 -5
  78. package/dist/src/routes/v3/campaigns.d.ts +60 -6
  79. package/dist/src/routes/v3/campaignsInfo.d.ts +59 -5
  80. package/dist/src/routes/v3/multiChainPositions.d.ts +59 -5
  81. package/dist/src/routes/v3/opportunity.d.ts +59 -5
  82. package/dist/src/routes/v3/positions.d.ts +59 -5
  83. package/dist/src/routes/v3/recipients.d.ts +6 -2
  84. package/dist/src/routes/v3/recipients.js +14 -8
  85. package/dist/src/routes/v3/rewards.d.ts +59 -5
  86. package/dist/src/routes/v3/updates.d.ts +59 -5
  87. package/dist/src/routes/v3/userRewards.d.ts +59 -5
  88. package/dist/src/utils/decodeCalls.js +4 -1
  89. package/dist/src/utils/encodeCalls.js +4 -1
  90. package/dist/src/utils/generateCardName.js +2 -0
  91. package/dist/src/utils/prices/services/erc4626Service.js +10 -4
  92. package/dist/tsconfig.package.tsbuildinfo +1 -1
  93. package/package.json +1 -1
  94. package/dist/src/libs/reports/campaignReport.d.ts +0 -9
  95. package/dist/src/libs/reports/campaignReport.js +0 -37
  96. package/dist/src/libs/reports/mainParameterRewards.d.ts +0 -3
  97. 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));
@@ -72,10 +72,11 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
72
72
  campaignId?: string | undefined;
73
73
  opportunityId?: string | undefined;
74
74
  tokenSymbol?: string | undefined;
75
+ test?: boolean | undefined;
75
76
  };
76
77
  headers: unknown;
77
78
  response: {
78
- 200: ({
79
+ 200: {
79
80
  params: any;
80
81
  chain: {
81
82
  name: string;
@@ -90,7 +91,9 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
90
91
  address: string;
91
92
  icon: string;
92
93
  decimals: number;
94
+ displaySymbol: string;
93
95
  verified: boolean;
96
+ isTest: boolean;
94
97
  price: number | null;
95
98
  };
96
99
  distributionChain: {
@@ -118,7 +121,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
118
121
  amount: string;
119
122
  opportunityId: string;
120
123
  creatorAddress: string;
121
- } | null)[];
124
+ }[];
122
125
  };
123
126
  };
124
127
  };
@@ -140,6 +143,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
140
143
  campaignId?: string | undefined;
141
144
  opportunityId?: string | undefined;
142
145
  tokenSymbol?: string | undefined;
146
+ test?: boolean | undefined;
143
147
  };
144
148
  headers: unknown;
145
149
  response: {
@@ -77,6 +77,7 @@ export declare const GetCampaignQueryDto: import("@sinclair/typebox").TObject<{
77
77
  mainParameter: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
78
78
  tokenSymbol: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
79
79
  tokenAddress: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
80
+ test: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
80
81
  opportunityId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
81
82
  startTimestamp: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
82
83
  endTimestamp: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
@@ -48,6 +48,7 @@ export const GetCampaignQueryDto = t.Object({
48
48
  mainParameter: t.Optional(t.String()),
49
49
  tokenSymbol: t.Optional(t.String()),
50
50
  tokenAddress: t.Optional(t.String()),
51
+ test: t.Optional(t.Boolean()),
51
52
  opportunityId: t.Optional(t.String()),
52
53
  startTimestamp: t.Optional(t.String({ pattern: "[0-9].*" })),
53
54
  endTimestamp: t.Optional(t.String({ pattern: "[0-9].*" })),
@@ -102,7 +102,9 @@ export declare abstract class CampaignRepository {
102
102
  address: string;
103
103
  icon: string;
104
104
  decimals: number;
105
+ displaySymbol: string;
105
106
  verified: boolean;
107
+ isTest: boolean;
106
108
  price: number | null;
107
109
  };
108
110
  CampaignStatus: {
@@ -10,7 +10,7 @@ import { TokenService } from "../token";
10
10
  export class CampaignRepository {
11
11
  // ─── Private Methods ─────────────────────────────────────────────────
12
12
  static #transformQueryToPrismaFilters(query) {
13
- const { chainId, endTimestamp, opportunityId, mainParameter, campaignId, startTimestamp, subType, type, tokenAddress, tokenSymbol, } = query;
13
+ const { chainId, endTimestamp, opportunityId, mainParameter, campaignId, startTimestamp, subType, type, tokenAddress, tokenSymbol, test, } = query;
14
14
  return {
15
15
  where: {
16
16
  computeChainId: chainId,
@@ -26,6 +26,7 @@ export class CampaignRepository {
26
26
  RewardToken: {
27
27
  address: tokenAddress ? tokenAddress : undefined,
28
28
  symbol: tokenSymbol ? tokenSymbol : undefined,
29
+ isTest: !test ? false : undefined,
29
30
  },
30
31
  },
31
32
  };
@@ -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;
@@ -43,7 +43,9 @@ export declare abstract class CampaignService {
43
43
  address: string;
44
44
  icon: string;
45
45
  decimals: number;
46
+ displaySymbol: string;
46
47
  verified: boolean;
48
+ isTest: boolean;
47
49
  price: number | null;
48
50
  };
49
51
  distributionChain: {
@@ -71,7 +73,7 @@ export declare abstract class CampaignService {
71
73
  amount: string;
72
74
  opportunityId: string;
73
75
  creatorAddress: string;
74
- } | null)[]>;
76
+ }[]>;
75
77
  /**
76
78
  * Counts the number of campaigns that complies to query
77
79
  * @description used for pagination purposes
@@ -160,7 +162,7 @@ export declare abstract class CampaignService {
160
162
  * @returns A list of opportunities
161
163
  * TODO: remove this function in favor of prisma client extensions
162
164
  */
163
- static format(campaign: NonNullable<Awaited<ReturnType<typeof CampaignRepository.findMany>>>[number] | null): {
165
+ static format(campaign: NonNullable<Awaited<ReturnType<typeof CampaignRepository.findMany>>>[number]): {
164
166
  params: any;
165
167
  chain: {
166
168
  name: string;
@@ -175,7 +177,9 @@ export declare abstract class CampaignService {
175
177
  address: string;
176
178
  icon: string;
177
179
  decimals: number;
180
+ displaySymbol: string;
178
181
  verified: boolean;
182
+ isTest: boolean;
179
183
  price: number | null;
180
184
  };
181
185
  distributionChain: {
@@ -203,7 +207,8 @@ export declare abstract class CampaignService {
203
207
  amount: string;
204
208
  opportunityId: string;
205
209
  creatorAddress: string;
206
- } | null;
210
+ };
211
+ static formatAsCampaignParameters<C extends CampaignTypeV3>(campaign: Campaign["model"]): CampaignParameters<C>;
207
212
  /**
208
213
  * Fetches the campaign dynamic data for a v3 campaign onchain
209
214
  * @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
@@ -92,7 +92,9 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
92
92
  address: string;
93
93
  icon: string;
94
94
  decimals: number;
95
+ displaySymbol: string;
95
96
  verified: boolean;
97
+ isTest: boolean;
96
98
  price: number | null;
97
99
  };
98
100
  amount: bigint;
@@ -107,7 +109,9 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
107
109
  address: string;
108
110
  icon: string;
109
111
  decimals: number;
112
+ displaySymbol: string;
110
113
  verified: boolean;
114
+ isTest: boolean;
111
115
  price: number | null;
112
116
  }[];
113
117
  chain: {
@@ -191,7 +195,9 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
191
195
  address: string;
192
196
  icon: string;
193
197
  decimals: number;
198
+ displaySymbol: string;
194
199
  verified: boolean;
200
+ isTest: boolean;
195
201
  price: number | null;
196
202
  };
197
203
  amount: bigint;
@@ -206,7 +212,9 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
206
212
  address: string;
207
213
  icon: string;
208
214
  decimals: number;
215
+ displaySymbol: string;
209
216
  verified: boolean;
217
+ isTest: boolean;
210
218
  price: number | null;
211
219
  }[];
212
220
  chain: {
@@ -232,7 +240,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
232
240
  tvl: number;
233
241
  apr: number;
234
242
  dailyRewards: number;
235
- campaigns: ({
243
+ campaigns: {
236
244
  params: any;
237
245
  chain: {
238
246
  name: string;
@@ -247,7 +255,9 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
247
255
  address: string;
248
256
  icon: string;
249
257
  decimals: number;
258
+ displaySymbol: string;
250
259
  verified: boolean;
260
+ isTest: boolean;
251
261
  price: number | null;
252
262
  };
253
263
  distributionChain: {
@@ -275,7 +285,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
275
285
  amount: string;
276
286
  opportunityId: string;
277
287
  creatorAddress: string;
278
- } | null)[];
288
+ }[];
279
289
  } | null | undefined;
280
290
  };
281
291
  };
@@ -300,6 +310,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
300
310
  action?: string | undefined;
301
311
  mainProtocolId?: string | undefined;
302
312
  order?: undefined;
313
+ test?: boolean | undefined;
303
314
  minimumTvl?: number | undefined;
304
315
  };
305
316
  headers: unknown;
@@ -345,7 +356,9 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
345
356
  address: string;
346
357
  icon: string;
347
358
  decimals: number;
359
+ displaySymbol: string;
348
360
  verified: boolean;
361
+ isTest: boolean;
349
362
  price: number | null;
350
363
  };
351
364
  amount: bigint;
@@ -360,7 +373,9 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
360
373
  address: string;
361
374
  icon: string;
362
375
  decimals: number;
376
+ displaySymbol: string;
363
377
  verified: boolean;
378
+ isTest: boolean;
364
379
  price: number | null;
365
380
  }[];
366
381
  chain: {
@@ -409,6 +424,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
409
424
  action?: string | undefined;
410
425
  mainProtocolId?: string | undefined;
411
426
  order?: undefined;
427
+ test?: boolean | undefined;
412
428
  minimumTvl?: number | undefined;
413
429
  };
414
430
  headers: unknown;
@@ -439,12 +455,13 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
439
455
  action?: string | undefined;
440
456
  mainProtocolId?: string | undefined;
441
457
  order?: undefined;
458
+ test?: boolean | undefined;
442
459
  minimumTvl?: number | undefined;
443
460
  };
444
461
  headers: unknown;
445
462
  response: {
446
463
  200: {
447
- sum: File;
464
+ sum: number | null;
448
465
  };
449
466
  };
450
467
  };
@@ -53,6 +53,7 @@ export declare const GetOpportunitiesQueryDto: import("@sinclair/typebox").TObje
53
53
  INVALID: "INVALID";
54
54
  }>, import("@sinclair/typebox").TRegExp]>>;
55
55
  tags: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
56
+ test: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
56
57
  minimumTvl: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
57
58
  tokens: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
58
59
  status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TEnum<{
@@ -111,7 +112,7 @@ export declare const CreateOpportunityDto: import("@sinclair/typebox").TObject<{
111
112
  export declare const OpportunityAggregateFieldDto: import("@sinclair/typebox").TObject<{
112
113
  field: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"dailyRewards">[]>;
113
114
  }>;
114
- export type GetOpportunitiesQueryEntity = typeof GetOpportunitiesQueryDto.static;
115
+ export type GetOpportunitiesQueryModel = typeof GetOpportunitiesQueryDto.static;
115
116
  export type CreateOpportunityModel = typeof CreateOpportunityDto.static & {
116
117
  id: string;
117
118
  };
@@ -15,6 +15,7 @@ export const GetOpportunitiesQueryDto = t.Object({
15
15
  //TODO: find a systemic way of handling query param arrays
16
16
  action: t.Optional(t.Union([t.Enum(OpportunityAction), t.RegExp(/^(POOL|HOLD|DROP|LEND|BORROW)+(,(POOL|HOLD|DROP|LEND|BORROW)+)*$/)])),
17
17
  tags: t.Optional(t.String()),
18
+ test: t.Optional(t.Boolean()),
18
19
  minimumTvl: t.Optional(t.Number()),
19
20
  tokens: t.Optional(t.String({ title: "Symbol" })),
20
21
  status: t.Optional(t.Union([t.Enum(Status), t.RegExp(/^(LIVE|PAST|SOON)+(,(LIVE|PAST|SOON)+)*$/)])),
@@ -1,8 +1,9 @@
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";
5
- import type { CreateOpportunityModel, GetOpportunitiesQueryEntity } from "./opportunity.model";
6
+ import type { CreateOpportunityModel, GetOpportunitiesQueryModel } from "./opportunity.model";
6
7
  export declare abstract class OpportunityRepository {
7
8
  #private;
8
9
  static create(newOpp: CreateOpportunityModel): Promise<void>;
@@ -20,7 +21,9 @@ export declare abstract class OpportunityRepository {
20
21
  address: string;
21
22
  icon: string;
22
23
  decimals: number;
24
+ displaySymbol: string;
23
25
  verified: boolean;
26
+ isTest: boolean;
24
27
  price: number | null;
25
28
  }[];
26
29
  Protocols: {
@@ -81,7 +84,9 @@ export declare abstract class OpportunityRepository {
81
84
  address: string;
82
85
  icon: string;
83
86
  decimals: number;
87
+ displaySymbol: string;
84
88
  verified: boolean;
89
+ isTest: boolean;
85
90
  price: number | null;
86
91
  };
87
92
  CampaignStatus: {
@@ -144,7 +149,9 @@ export declare abstract class OpportunityRepository {
144
149
  address: string;
145
150
  icon: string;
146
151
  decimals: number;
152
+ displaySymbol: string;
147
153
  verified: boolean;
154
+ isTest: boolean;
148
155
  price: number | null;
149
156
  };
150
157
  CampaignStatus: {
@@ -178,7 +185,9 @@ export declare abstract class OpportunityRepository {
178
185
  address: string;
179
186
  icon: string;
180
187
  decimals: number;
188
+ displaySymbol: string;
181
189
  verified: boolean;
190
+ isTest: boolean;
182
191
  price: number | null;
183
192
  }[];
184
193
  Protocols: {
@@ -239,7 +248,9 @@ export declare abstract class OpportunityRepository {
239
248
  address: string;
240
249
  icon: string;
241
250
  decimals: number;
251
+ displaySymbol: string;
242
252
  verified: boolean;
253
+ isTest: boolean;
243
254
  price: number | null;
244
255
  };
245
256
  CampaignStatus: {
@@ -287,7 +298,9 @@ export declare abstract class OpportunityRepository {
287
298
  address: string;
288
299
  icon: string;
289
300
  decimals: number;
301
+ displaySymbol: string;
290
302
  verified: boolean;
303
+ isTest: boolean;
291
304
  price: number | null;
292
305
  };
293
306
  } & {
@@ -319,12 +332,73 @@ export declare abstract class OpportunityRepository {
319
332
  apr: number;
320
333
  dailyRewards: number;
321
334
  })[]>;
322
- static findMany(query: GetOpportunitiesQueryEntity): Promise<({
335
+ static findMany(query: GetOpportunitiesQueryModel): Promise<{
336
+ name: string;
337
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
338
+ id: string;
339
+ status: import("../../../../database/api/.generated").$Enums.Status;
340
+ tags: string[];
341
+ identifier: string;
342
+ chainId: number;
343
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
344
+ mainProtocolId: string | null;
345
+ tvl: number;
346
+ apr: number;
347
+ dailyRewards: number;
348
+ }[]>;
349
+ static findLiveWithFirstCampaign(chainId: MerklChainId): Promise<({
323
350
  Chain: {
324
351
  name: string;
325
352
  id: number;
326
353
  icon: string;
327
354
  };
355
+ Campaigns: ({
356
+ ComputeChain: {
357
+ name: string;
358
+ id: number;
359
+ icon: string;
360
+ };
361
+ DistributionChain: {
362
+ name: string;
363
+ id: number;
364
+ icon: string;
365
+ };
366
+ RewardToken: {
367
+ symbol: string;
368
+ name: string | null;
369
+ id: string;
370
+ chainId: number;
371
+ address: string;
372
+ icon: string;
373
+ decimals: number;
374
+ displaySymbol: string;
375
+ verified: boolean;
376
+ isTest: boolean;
377
+ price: number | null;
378
+ };
379
+ CampaignStatus: {
380
+ error: string;
381
+ details: Prisma.JsonValue;
382
+ status: import("../../../../database/api/.generated").$Enums.RunStatus;
383
+ campaignId: string;
384
+ computedUntil: bigint;
385
+ processingStarted: bigint;
386
+ }[];
387
+ } & {
388
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
389
+ id: string;
390
+ params: Prisma.JsonValue;
391
+ subType: number | null;
392
+ startTimestamp: bigint;
393
+ endTimestamp: bigint;
394
+ computeChainId: number;
395
+ distributionChainId: number;
396
+ campaignId: string;
397
+ rewardTokenId: string;
398
+ amount: string;
399
+ opportunityId: string;
400
+ creatorAddress: string;
401
+ })[];
328
402
  Tokens: {
329
403
  symbol: string;
330
404
  name: string | null;
@@ -333,7 +407,9 @@ export declare abstract class OpportunityRepository {
333
407
  address: string;
334
408
  icon: string;
335
409
  decimals: number;
410
+ displaySymbol: string;
336
411
  verified: boolean;
412
+ isTest: boolean;
337
413
  price: number | null;
338
414
  }[];
339
415
  Protocols: {
@@ -394,7 +470,9 @@ export declare abstract class OpportunityRepository {
394
470
  address: string;
395
471
  icon: string;
396
472
  decimals: number;
473
+ displaySymbol: string;
397
474
  verified: boolean;
475
+ isTest: boolean;
398
476
  price: number | null;
399
477
  };
400
478
  CampaignStatus: {
@@ -432,7 +510,7 @@ export declare abstract class OpportunityRepository {
432
510
  apr: number;
433
511
  dailyRewards: number;
434
512
  })[]>;
435
- static countMany(query: GetOpportunitiesQueryEntity): Promise<number>;
513
+ static countMany(query: GetOpportunitiesQueryModel): Promise<number>;
436
514
  static getAllIdsForDynamicOpp(): Promise<{
437
515
  id: string;
438
516
  }[]>;
@@ -520,7 +598,7 @@ export declare abstract class OpportunityRepository {
520
598
  apr: number;
521
599
  dailyRewards: number;
522
600
  }>;
523
- static aggregateSum(field: keyof Prisma.OpportunitySumAggregateInputType, query: GetOpportunitiesQueryEntity): Promise<{
524
- sum: never;
601
+ static aggregateSum(field: keyof Prisma.OpportunitySumAggregateInputType, query: GetOpportunitiesQueryModel): Promise<{
602
+ sum: number | null;
525
603
  }>;
526
604
  }
@@ -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";
@@ -128,6 +129,7 @@ export class OpportunityRepository {
128
129
  const protocols = query.mainProtocolId?.split(",");
129
130
  const sort = (query.sort === "rewards" ? "dailyRewards" : query.sort) ?? "dailyRewards";
130
131
  const order = query.order ?? "desc";
132
+ const test = query.test ?? false;
131
133
  const noFilters = Object.values(filters).every(v => v === undefined);
132
134
  const tokensFilters = tokens?.map(symbol => ({
133
135
  Tokens: { some: { symbol: { equals: symbol, mode: "insensitive" } } },
@@ -153,6 +155,7 @@ export class OpportunityRepository {
153
155
  status: !status ? undefined : { in: status },
154
156
  },
155
157
  { mainProtocolId: !protocols ? undefined : { in: protocols } },
158
+ test ? undefined : { Campaigns: { some: { RewardToken: { isTest: false } } } },
156
159
  ],
157
160
  },
158
161
  };
@@ -176,6 +179,34 @@ export class OpportunityRepository {
176
179
  ...args,
177
180
  });
178
181
  }
182
+ static async findLiveWithFirstCampaign(chainId) {
183
+ const now = moment().unix();
184
+ return await apiDbClient.opportunity.findMany({
185
+ include: {
186
+ ...OpportunityRepository.#getRecordInclusion(),
187
+ Campaigns: {
188
+ include: { RewardToken: true, ComputeChain: true, DistributionChain: true, CampaignStatus: true },
189
+ take: 1,
190
+ orderBy: { endTimestamp: "desc" },
191
+ },
192
+ MainProtocol: true,
193
+ Chain: true,
194
+ Protocols: true,
195
+ Tokens: true,
196
+ },
197
+ where: {
198
+ status: "LIVE",
199
+ Chain: { id: chainId },
200
+ Campaigns: {
201
+ some: {
202
+ endTimestamp: {
203
+ gt: now,
204
+ },
205
+ },
206
+ },
207
+ },
208
+ });
209
+ }
179
210
  static async countMany(query) {
180
211
  const args = OpportunityRepository.#transformQueryToPrismaFilters(query);
181
212
  return await apiDbClient.opportunity.count(args);