@merkl/api 0.10.168 → 0.10.170

Sign up to get free protection for your applications and to get access to all the features.
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);