@merkl/api 0.16.18 → 0.16.20

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 (45) hide show
  1. package/dist/src/backgroundJobs/jobs/campaignsCacheUpdater.js +1 -1
  2. package/dist/src/backgroundJobs/jobs/sync.js +1 -1
  3. package/dist/src/cache/index.d.ts +1 -1
  4. package/dist/src/cache/index.js +2 -2
  5. package/dist/src/eden/index.d.ts +410 -35
  6. package/dist/src/entities/campaign.js +1 -1
  7. package/dist/src/index.d.ts +82 -7
  8. package/dist/src/libs/deprecated-merklv3/index.js +2 -2
  9. package/dist/src/modules/v4/accounting/accounting.controller.js +1 -1
  10. package/dist/src/modules/v4/accounting/accounting.service.d.ts +1 -1
  11. package/dist/src/modules/v4/accounting/accounting.service.js +1 -1
  12. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +13 -1
  13. package/dist/src/modules/v4/campaign/campaign.repository.js +1 -1
  14. package/dist/src/modules/v4/campaign/campaign.service.d.ts +26 -2
  15. package/dist/src/modules/v4/chain/chain.controller.js +1 -1
  16. package/dist/src/modules/v4/chain/chain.repository.d.ts +1 -6
  17. package/dist/src/modules/v4/chain/chain.repository.js +2 -5
  18. package/dist/src/modules/v4/chain/chain.service.d.ts +1 -6
  19. package/dist/src/modules/v4/chain/chain.service.js +2 -5
  20. package/dist/src/modules/v4/enso/enso.service.js +4 -1
  21. package/dist/src/modules/v4/kyberzap/kyberzap.service.js +1 -1
  22. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +40 -4
  23. package/dist/src/modules/v4/opportunity/opportunity.controller.js +1 -1
  24. package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +2 -2
  25. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +109 -13
  26. package/dist/src/modules/v4/opportunity/opportunity.service.js +1 -1
  27. package/dist/src/modules/v4/opportunity/subservices/getClammMetadata.service.js +3 -3
  28. package/dist/src/modules/v4/protocol/protocol.controller.d.ts +1 -0
  29. package/dist/src/modules/v4/protocol/protocol.model.d.ts +1 -0
  30. package/dist/src/modules/v4/protocol/protocol.model.js +1 -0
  31. package/dist/src/modules/v4/protocol/protocol.repository.js +5 -1
  32. package/dist/src/modules/v4/protocol/protocol.service.d.ts +0 -2
  33. package/dist/src/modules/v4/protocol/protocol.service.js +1 -39
  34. package/dist/src/modules/v4/reward/reward.service.js +1 -1
  35. package/dist/src/modules/v4/router.d.ts +82 -7
  36. package/dist/src/modules/v4/token/token.controller.d.ts +28 -2
  37. package/dist/src/modules/v4/token/token.service.d.ts +71 -7
  38. package/dist/src/modules/v4/token/token.service.js +3 -3
  39. package/dist/src/modules/v4/user/user.service.js +1 -1
  40. package/dist/src/routes/v3/multiChainPositions.js +1 -1
  41. package/dist/src/routes/v3/opportunity.js +5 -0
  42. package/dist/src/utils/camelToKebabCase.d.ts +1 -0
  43. package/dist/src/utils/camelToKebabCase.js +3 -0
  44. package/dist/tsconfig.package.tsbuildinfo +1 -1
  45. package/package.json +1 -1
@@ -7,7 +7,7 @@ export const removeTestTokens = (v) => !["aglamerkl", "test"].includes(v.campaig
7
7
  export async function getCampaignsFor(chainIds, filters = { onlyLive: false }) {
8
8
  const cachePrefix = filters?.onlyLive ? "LiveCampaigns" : "Campaigns";
9
9
  const cacheKeys = chainIds.map(chain => `${cachePrefix}_${chain}`);
10
- return (await Redis.getMany(cacheKeys)).reduce((prev, allData, index) => {
10
+ return (await Redis.findMany(cacheKeys)).reduce((prev, allData, index) => {
11
11
  if (!!allData) {
12
12
  const chain = chainIds[index];
13
13
  prev[chain] = Object.keys(allData).reduce((acc, curr) => {
@@ -223,8 +223,20 @@ declare const app: Elysia<"", false, {
223
223
  name: string;
224
224
  status: "PAST" | "LIVE" | "SOON";
225
225
  action: import("../database/api/.generated").$Enums.OpportunityAction;
226
- tokens: any[];
227
- mainProtocol: "morpho" | "euler" | "ambient" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswapv4" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | "gamma" | "oku" | "hourglass" | "veda" | "kyo" | "sonex" | undefined;
226
+ tokens: ({
227
+ symbol: string;
228
+ name: string | null;
229
+ id: string;
230
+ icon: string;
231
+ chainId: number;
232
+ address: string;
233
+ decimals: number;
234
+ verified: boolean;
235
+ isTest: boolean;
236
+ } & {
237
+ price?: number | null | undefined;
238
+ })[];
239
+ mainProtocol: string | undefined;
228
240
  depositUrl: any;
229
241
  tags: string[];
230
242
  };
@@ -309,7 +321,19 @@ declare const app: Elysia<"", false, {
309
321
  };
310
322
  id: string;
311
323
  depositUrl: string | undefined;
312
- tokens: Token[];
324
+ tokens: ({
325
+ symbol: string;
326
+ name: string | null;
327
+ id: string;
328
+ icon: string;
329
+ chainId: number;
330
+ address: string;
331
+ decimals: number;
332
+ verified: boolean;
333
+ isTest: boolean;
334
+ } & {
335
+ price?: number | null | undefined;
336
+ })[];
313
337
  chain: {
314
338
  name: string;
315
339
  id: number;
@@ -596,7 +620,19 @@ declare const app: Elysia<"", false, {
596
620
  id: number;
597
621
  icon: string;
598
622
  };
599
- rewardToken: Token;
623
+ rewardToken: {
624
+ symbol: string;
625
+ name: string | null;
626
+ id: string;
627
+ icon: string;
628
+ chainId: number;
629
+ address: string;
630
+ decimals: number;
631
+ verified: boolean;
632
+ isTest: boolean;
633
+ } & {
634
+ price?: number | null | undefined;
635
+ };
600
636
  distributionChain: {
601
637
  name: string;
602
638
  id: number;
@@ -1076,7 +1112,19 @@ declare const app: Elysia<"", false, {
1076
1112
  id: number;
1077
1113
  icon: string;
1078
1114
  };
1079
- rewardToken: Token;
1115
+ rewardToken: {
1116
+ symbol: string;
1117
+ name: string | null;
1118
+ id: string;
1119
+ icon: string;
1120
+ chainId: number;
1121
+ address: string;
1122
+ decimals: number;
1123
+ verified: boolean;
1124
+ isTest: boolean;
1125
+ } & {
1126
+ price?: number | null | undefined;
1127
+ };
1080
1128
  distributionChain: {
1081
1129
  name: string;
1082
1130
  id: number;
@@ -1233,6 +1281,7 @@ declare const app: Elysia<"", false, {
1233
1281
  items?: number | undefined;
1234
1282
  tags?: string[] | undefined;
1235
1283
  page?: number | undefined;
1284
+ ids?: string[] | undefined;
1236
1285
  opportunityTag?: string | undefined;
1237
1286
  };
1238
1287
  headers: unknown;
@@ -1489,7 +1538,21 @@ declare const app: Elysia<"", false, {
1489
1538
  };
1490
1539
  headers: unknown;
1491
1540
  response: {
1492
- 200: any[];
1541
+ 200: ({
1542
+ symbol: string;
1543
+ name: string | null;
1544
+ id: string;
1545
+ icon: string;
1546
+ chainId: number;
1547
+ address: string;
1548
+ decimals: number;
1549
+ verified: boolean;
1550
+ isTest: boolean;
1551
+ } & {
1552
+ price?: number | null | undefined;
1553
+ } & {
1554
+ balance: bigint;
1555
+ })[];
1493
1556
  };
1494
1557
  };
1495
1558
  };
@@ -1511,7 +1574,19 @@ declare const app: Elysia<"", false, {
1511
1574
  };
1512
1575
  headers: unknown;
1513
1576
  response: {
1514
- 200: Token[];
1577
+ 200: ({
1578
+ symbol: string;
1579
+ name: string | null;
1580
+ id: string;
1581
+ icon: string;
1582
+ chainId: number;
1583
+ address: string;
1584
+ decimals: number;
1585
+ verified: boolean;
1586
+ isTest: boolean;
1587
+ } & {
1588
+ price?: number | null | undefined;
1589
+ })[];
1515
1590
  };
1516
1591
  };
1517
1592
  };
@@ -9,7 +9,7 @@ const fetchCachedData = async (chainIds, onlyLive) => {
9
9
  onlyLive = false;
10
10
  }
11
11
  const cacheKeys = chainIds.map(chainId => onlyLive ? `LiveCampaignsOldFormat_${chainId}` : `CampaignsOldFormat_${chainId}`);
12
- return await Redis.getMany(cacheKeys);
12
+ return await Redis.findMany(cacheKeys);
13
13
  };
14
14
  export async function getClamsInfo(chainIds, AMMs, user, onlyLive) {
15
15
  if (!chainIds && !user && !AMMs) {
@@ -34,7 +34,7 @@ export async function getClamsInfo(chainIds, AMMs, user, onlyLive) {
34
34
  const cachedData = await fetchCachedData(chainIds, onlyLive);
35
35
  let chainData = [];
36
36
  if (!!user) {
37
- chainData = await Redis.getMany(chainIds.map(chainId => `MerklChainData_${chainId}`));
37
+ chainData = await Redis.findMany(chainIds.map(chainId => `MerklChainData_${chainId}`));
38
38
  }
39
39
  /** Parallel computation of data for each chain */
40
40
  const result = {};
@@ -3,7 +3,7 @@ import { AccountingService, ChainDto, DateDto, GetTransactionsQueryModel, Revenu
3
3
  import { throwOnInvalidRequiredAddress, throwOnUnsupportedChainId } from "../../../utils/throw";
4
4
  import Elysia from "elysia";
5
5
  export const AccountingController = new Elysia({ prefix: "/accounting", detail: { tags: ["Accounting"], hide: true } })
6
- .get("/", async ({ query }) => await AccountingService.getMany(query), {
6
+ .get("/", async ({ query }) => await AccountingService.findMany(query), {
7
7
  query: GetTransactionsQueryModel,
8
8
  headers: AuthorizationHeadersDto,
9
9
  beforeHandle: async ({ headers }) => {
@@ -3,7 +3,7 @@ import { ChainId } from "@sdk";
3
3
  export declare class AccountingService {
4
4
  static hashId(chainId: ChainId, fromTokenId: string, toTokenId: string, timestamp: number): string;
5
5
  static getTokenId(chainId: number, address: string): string;
6
- static getMany(query: GetTransactionsQueryModel): Promise<{
6
+ static findMany(query: GetTransactionsQueryModel): Promise<{
7
7
  id: string;
8
8
  timestamp: number;
9
9
  chainId: number;
@@ -8,7 +8,7 @@ export class AccountingService {
8
8
  static getTokenId(chainId, address) {
9
9
  return TokenService.hashId({ chainId, address });
10
10
  }
11
- static async getMany(query) {
11
+ static async findMany(query) {
12
12
  return await AccountingRepository.findMany(query);
13
13
  }
14
14
  static async getRevenue() {
@@ -138,7 +138,19 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
138
138
  id: number;
139
139
  icon: string;
140
140
  };
141
- rewardToken: Token;
141
+ rewardToken: {
142
+ symbol: string;
143
+ name: string | null;
144
+ id: string;
145
+ icon: string;
146
+ chainId: number;
147
+ address: string;
148
+ decimals: number;
149
+ verified: boolean;
150
+ isTest: boolean;
151
+ } & {
152
+ price?: number | null | undefined;
153
+ };
142
154
  distributionChain: {
143
155
  name: string;
144
156
  id: number;
@@ -237,7 +237,7 @@ export class CampaignRepository {
237
237
  status: {
238
238
  not: RunStatus.PROCESSING,
239
239
  },
240
- computedUntil: { lt: currentTime }, // more than 10 min ago
240
+ computedUntil: { lt: currentTime - 10 * 60 }, // more than 10 min ago
241
241
  },
242
242
  {
243
243
  status: RunStatus.PROCESSING,
@@ -58,7 +58,19 @@ export declare abstract class CampaignService {
58
58
  id: number;
59
59
  icon: string;
60
60
  };
61
- rewardToken: Token;
61
+ rewardToken: {
62
+ symbol: string;
63
+ name: string | null;
64
+ id: string;
65
+ icon: string;
66
+ chainId: number;
67
+ address: string;
68
+ decimals: number;
69
+ verified: boolean;
70
+ isTest: boolean;
71
+ } & {
72
+ price?: number | null | undefined;
73
+ };
62
74
  distributionChain: {
63
75
  name: string;
64
76
  id: number;
@@ -193,7 +205,19 @@ export declare abstract class CampaignService {
193
205
  id: number;
194
206
  icon: string;
195
207
  };
196
- rewardToken: Token;
208
+ rewardToken: {
209
+ symbol: string;
210
+ name: string | null;
211
+ id: string;
212
+ icon: string;
213
+ chainId: number;
214
+ address: string;
215
+ decimals: number;
216
+ verified: boolean;
217
+ isTest: boolean;
218
+ } & {
219
+ price?: number | null | undefined;
220
+ };
197
221
  distributionChain: {
198
222
  name: string;
199
223
  id: number;
@@ -17,7 +17,7 @@ export const ChainController = new Elysia({ prefix: "/chains", detail: { tags: [
17
17
  })
18
18
  // ─── Get All Supported Chains ────────────────────────────────────────
19
19
  .get("/", async ({ query }) => {
20
- const chains = await ChainService.getMany(query);
20
+ const chains = await ChainService.findMany(query);
21
21
  return chains.map(({ Explorer, ...chain }) => ({ explorers: Explorer, ...chain }));
22
22
  }, {
23
23
  query: GetChainQueryDto,
@@ -22,7 +22,7 @@ export declare abstract class ChainRepository {
22
22
  * @param query object with fields to search for
23
23
  * @returns
24
24
  */
25
- static readMany(query: ChainSearchDto): Promise<({
25
+ static findMany(query: ChainSearchDto): Promise<({
26
26
  Explorer: {
27
27
  type: import("../../../../database/api/.generated").$Enums.ExplorerType;
28
28
  url: string;
@@ -53,11 +53,6 @@ export declare abstract class ChainRepository {
53
53
  chainId: number;
54
54
  }[];
55
55
  }>;
56
- static findMany(): Promise<{
57
- name: string;
58
- id: number;
59
- icon: string;
60
- }[]>;
61
56
  static findUniqueOrThrow(id: number): Promise<{
62
57
  Explorer: {
63
58
  type: import("../../../../database/api/.generated").$Enums.ExplorerType;
@@ -13,14 +13,14 @@ export class ChainRepository {
13
13
  }
14
14
  static #transformQueryToPrismaFilters(query) {
15
15
  return {
16
- where: { name: { contains: query.name, mode: "insensitive" } },
16
+ where: { name: query.name ? { contains: query.name, mode: "insensitive" } : undefined },
17
17
  };
18
18
  }
19
19
  /** Returns many chains based on query
20
20
  * @param query object with fields to search for
21
21
  * @returns
22
22
  */
23
- static async readMany(query) {
23
+ static async findMany(query) {
24
24
  const args = ChainRepository.#transformQueryToPrismaFilters(query);
25
25
  return apiDbClient.chain.findMany({
26
26
  include: { Explorer: { take: 5 } },
@@ -56,9 +56,6 @@ export class ChainRepository {
56
56
  await ExplorerRepository.create(data.id, data.explorerType, data.explorerUrl);
57
57
  return await ChainRepository.findUniqueOrThrow(data.id);
58
58
  }
59
- static async findMany() {
60
- return apiDbClient.chain.findMany();
61
- }
62
59
  static async findUniqueOrThrow(id) {
63
60
  return apiDbClient.chain.findUniqueOrThrow({
64
61
  where: {
@@ -12,12 +12,7 @@ export declare abstract class ChainService {
12
12
  id: number;
13
13
  icon: string;
14
14
  }) | null>;
15
- static findMany(): Promise<{
16
- name: string;
17
- id: number;
18
- icon: string;
19
- }[]>;
20
- static getMany(query: ChainSearchDto): Promise<({
15
+ static findMany(query: ChainSearchDto): Promise<({
21
16
  Explorer: {
22
17
  type: import("../../../../database/api/.generated").$Enums.ExplorerType;
23
18
  url: string;
@@ -7,11 +7,8 @@ export class ChainService {
7
7
  return ChainRepository.read(chainId);
8
8
  }
9
9
  //TODO: determine find vs get nomenclature and cache handling
10
- static async findMany() {
11
- return await CacheService.wrap(TTLPresets.HOUR_4, ChainRepository.findMany);
12
- }
13
- static async getMany(query) {
14
- return ChainRepository.readMany(query);
10
+ static async findMany(query) {
11
+ return await CacheService.wrap(TTLPresets.HOUR_4, ChainRepository.findMany, query);
15
12
  }
16
13
  static async countMany(query) {
17
14
  return ChainRepository.countMany(query);
@@ -28,7 +28,10 @@ export class EnsoService {
28
28
  .filter(p => query.chainId === undefined || p.chains.some(c => c.id === query.chainId))
29
29
  .map(p => EnsoService.getProtocolId(p.slug))
30
30
  .filter(id => id !== undefined);
31
- return await ProtocolService.findMany({ id: protocolIds });
31
+ return await ProtocolService.findMany({
32
+ id: protocolIds.length === 1 ? protocolIds[0] : undefined,
33
+ ids: protocolIds.length > 1 ? protocolIds : undefined,
34
+ });
32
35
  }
33
36
  static async getTokens(chainId, slug, identifier) {
34
37
  const tokens = await EnsoService.#fetch("/v1/tokens", {
@@ -1,6 +1,6 @@
1
1
  import { TokenService } from "../token/token.service";
2
2
  import { chainToKyberLabel, dexIdToProtocolId, } from "./kyberzap.model";
3
- const KYBERZAP = `https://zap-api.kyberswap.com/`;
3
+ const KYBERZAP = "https://zap-api.kyberswap.com/";
4
4
  export class KyberZapService {
5
5
  static async #fetch(route, params) {
6
6
  const res = await fetch(`${KYBERZAP}${chainToKyberLabel[params?.chainId] ?? ""}${route}?${params?.query ? new URLSearchParams(params?.query) : ""}`, {
@@ -78,8 +78,20 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
78
78
  name: string;
79
79
  status: "PAST" | "LIVE" | "SOON";
80
80
  action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
81
- tokens: any[];
82
- mainProtocol: "morpho" | "euler" | "ambient" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswapv4" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | "gamma" | "oku" | "hourglass" | "veda" | "kyo" | "sonex" | undefined;
81
+ tokens: ({
82
+ symbol: string;
83
+ name: string | null;
84
+ id: string;
85
+ icon: string;
86
+ chainId: number;
87
+ address: string;
88
+ decimals: number;
89
+ verified: boolean;
90
+ isTest: boolean;
91
+ } & {
92
+ price?: number | null | undefined;
93
+ })[];
94
+ mainProtocol: string | undefined;
83
95
  depositUrl: any;
84
96
  tags: string[];
85
97
  };
@@ -164,7 +176,19 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
164
176
  };
165
177
  id: string;
166
178
  depositUrl: string | undefined;
167
- tokens: Token[];
179
+ tokens: ({
180
+ symbol: string;
181
+ name: string | null;
182
+ id: string;
183
+ icon: string;
184
+ chainId: number;
185
+ address: string;
186
+ decimals: number;
187
+ verified: boolean;
188
+ isTest: boolean;
189
+ } & {
190
+ price?: number | null | undefined;
191
+ })[];
168
192
  chain: {
169
193
  name: string;
170
194
  id: number;
@@ -451,7 +475,19 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
451
475
  id: number;
452
476
  icon: string;
453
477
  };
454
- rewardToken: Token;
478
+ rewardToken: {
479
+ symbol: string;
480
+ name: string | null;
481
+ id: string;
482
+ icon: string;
483
+ chainId: number;
484
+ address: string;
485
+ decimals: number;
486
+ verified: boolean;
487
+ isTest: boolean;
488
+ } & {
489
+ price?: number | null | undefined;
490
+ };
455
491
  distributionChain: {
456
492
  name: string;
457
493
  id: number;
@@ -45,7 +45,7 @@ export const OpportunityController = new Elysia({
45
45
  detail: { hide: true },
46
46
  })
47
47
  // ─── Get All Opportunities ───────────────────────────────────────────
48
- .get("/", async ({ query }) => await OpportunityService.getMany(query), {
48
+ .get("/", async ({ query }) => await OpportunityService.findMany(query), {
49
49
  query: GetOpportunitiesQueryDto,
50
50
  detail: {
51
51
  description: `**Retrieve Multiple Opportunities**
@@ -1,7 +1,7 @@
1
1
  import { type AprRecord } from "../apr/apr.model";
2
2
  import { type Campaign } from "../campaign/campaign.model";
3
3
  import type { Resource } from "../prisma";
4
- import { type Protocol, type ProtocolId } from "../protocol/protocol.model";
4
+ import { type Protocol } from "../protocol/protocol.model";
5
5
  import { type DailyRewardsRecord } from "../reward/reward.model";
6
6
  import { type Token } from "../token/token.model";
7
7
  import { type TvlRecord } from "../tvl/tvl.model";
@@ -32,7 +32,7 @@ export type OpportunityMetadata = {
32
32
  chainId: number;
33
33
  address: string;
34
34
  }[];
35
- mainProtocol?: ProtocolId;
35
+ mainProtocol?: string;
36
36
  tags?: string[];
37
37
  };
38
38
  export type OpportunityUnique = {