@merkl/api 0.10.132 → 0.10.134

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. package/dist/src/constants.d.ts +1 -0
  2. package/dist/src/constants.js +1 -0
  3. package/dist/src/eden/index.d.ts +98 -25
  4. package/dist/src/index.d.ts +36 -7
  5. package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicDataRefacto.js +4 -8
  6. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.d.ts +3 -2
  7. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.js +11 -3
  8. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/MaverickBPProcessor.d.ts +50 -0
  9. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/MaverickBPProcessor.js +75 -0
  10. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/processorMapping.js +2 -0
  11. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1RefactoFinal.js +2 -0
  12. package/dist/src/modules/v4/enso/enso.service.d.ts +1 -0
  13. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +32 -0
  14. package/dist/src/modules/v4/opportunity/opportunity.controller.js +7 -2
  15. package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +4 -0
  16. package/dist/src/modules/v4/opportunity/opportunity.model.js +3 -0
  17. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +3 -0
  18. package/dist/src/modules/v4/opportunity/opportunity.repository.js +10 -0
  19. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +4 -0
  20. package/dist/src/modules/v4/opportunity/opportunity.service.js +3 -0
  21. package/dist/src/modules/v4/participate/participate.controller.d.ts +1 -0
  22. package/dist/src/modules/v4/protocol/protocol.controller.d.ts +3 -7
  23. package/dist/src/modules/v4/protocol/protocol.controller.js +4 -9
  24. package/dist/src/modules/v4/protocol/protocol.model.d.ts +2 -2
  25. package/dist/src/modules/v4/protocol/protocol.model.js +4 -1
  26. package/dist/src/modules/v4/protocol/protocol.service.js +4 -3
  27. package/dist/src/modules/v4/router.d.ts +36 -7
  28. package/dist/src/routes/v3/ERC20Campaigns.d.ts +36 -7
  29. package/dist/src/routes/v3/blacklist.d.ts +36 -7
  30. package/dist/src/routes/v3/campaigns.d.ts +36 -7
  31. package/dist/src/routes/v3/campaignsInfo.d.ts +36 -7
  32. package/dist/src/routes/v3/multiChainPositions.d.ts +36 -7
  33. package/dist/src/routes/v3/opportunity.d.ts +36 -7
  34. package/dist/src/routes/v3/positions.d.ts +36 -7
  35. package/dist/src/routes/v3/rewards.d.ts +36 -7
  36. package/dist/src/routes/v3/updates.d.ts +36 -7
  37. package/dist/src/routes/v3/userRewards.d.ts +36 -7
  38. package/dist/src/utils/decodeCalls.js +3 -1
  39. package/dist/src/utils/encodeCalls.js +7 -1
  40. package/dist/src/utils/generateCardName.js +2 -0
  41. package/dist/tsconfig.package.tsbuildinfo +1 -1
  42. package/package.json +2 -1
@@ -348,3 +348,4 @@ export declare const constantChain: {
348
348
  glcr?: undefined;
349
349
  };
350
350
  };
351
+ export declare const MAVERICK_ZKSYNC_BP_LENS_ADDRESS = "0xd32CE31CaC98CAC0631764B8286358c0606D87F9";
@@ -117,3 +117,4 @@ export const constantChain = {
117
117
  cake: "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82",
118
118
  },
119
119
  };
120
+ export const MAVERICK_ZKSYNC_BP_LENS_ADDRESS = "0xd32CE31CaC98CAC0631764B8286358c0606D87F9";
@@ -378,6 +378,31 @@ declare const eden: {
378
378
  200: number;
379
379
  }>>;
380
380
  };
381
+ aggregate: ((params: {
382
+ field: string | number;
383
+ }) => {
384
+ get: (options: {
385
+ headers?: Record<string, unknown> | undefined;
386
+ query: {
387
+ sort?: undefined;
388
+ name?: string | undefined;
389
+ tokens?: string | undefined;
390
+ status?: string | undefined;
391
+ items?: number | undefined;
392
+ tags?: string | undefined;
393
+ chainId?: string | undefined;
394
+ page?: number | undefined;
395
+ action?: string | undefined;
396
+ mainProtocolId?: string | undefined;
397
+ order?: undefined;
398
+ };
399
+ fetch?: RequestInit | undefined;
400
+ }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
401
+ 200: {
402
+ sum: File;
403
+ };
404
+ }>>;
405
+ }) & {};
381
406
  };
382
407
  campaigns: {
383
408
  index: {
@@ -550,6 +575,7 @@ declare const eden: {
550
575
  name: string;
551
576
  url: string;
552
577
  description: string;
578
+ id: string;
553
579
  tags: import("../../database/api/.generated").$Enums.ProtocolTag[];
554
580
  icon: string;
555
581
  } | null;
@@ -571,23 +597,18 @@ declare const eden: {
571
597
  name: string;
572
598
  url: string;
573
599
  description: string;
600
+ id: string;
574
601
  tags: import("../../database/api/.generated").$Enums.ProtocolTag[];
575
602
  icon: string;
576
603
  } & {})[] | null;
577
604
  }>>;
578
605
  };
579
606
  count: {
580
- get: (options: {
607
+ get: (options?: {
581
608
  headers?: Record<string, unknown> | undefined;
582
- query: {
583
- name?: string | undefined;
584
- id?: string[] | undefined;
585
- items?: number | undefined;
586
- tags?: ("AMM" | "ALM" | "DEX" | "LENDING")[] | undefined;
587
- page?: number | undefined;
588
- };
609
+ query?: Record<string, unknown> | undefined;
589
610
  fetch?: RequestInit | undefined;
590
- }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
611
+ } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
591
612
  200: number;
592
613
  }>>;
593
614
  };
@@ -1430,6 +1451,7 @@ declare const eden: {
1430
1451
  name: string;
1431
1452
  url: string;
1432
1453
  description: string;
1454
+ id: string;
1433
1455
  tags: import("../../database/api/.generated").$Enums.ProtocolTag[];
1434
1456
  icon: string;
1435
1457
  } & {})[] | null;
@@ -2218,6 +2240,38 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
2218
2240
  };
2219
2241
  };
2220
2242
  };
2243
+ } & {
2244
+ opportunities: {
2245
+ aggregate: {
2246
+ ":field": {
2247
+ get: {
2248
+ body: unknown;
2249
+ params: {
2250
+ field: never;
2251
+ };
2252
+ query: {
2253
+ sort?: undefined;
2254
+ name?: string | undefined;
2255
+ tokens?: string | undefined;
2256
+ status?: string | undefined;
2257
+ items?: number | undefined;
2258
+ tags?: string | undefined;
2259
+ chainId?: string | undefined;
2260
+ page?: number | undefined;
2261
+ action?: string | undefined;
2262
+ mainProtocolId?: string | undefined;
2263
+ order?: undefined;
2264
+ };
2265
+ headers: unknown;
2266
+ response: {
2267
+ 200: {
2268
+ sum: File;
2269
+ };
2270
+ };
2271
+ };
2272
+ };
2273
+ };
2274
+ };
2221
2275
  };
2222
2276
  } & {
2223
2277
  v4: {
@@ -2422,6 +2476,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
2422
2476
  name: string;
2423
2477
  url: string;
2424
2478
  description: string;
2479
+ id: string;
2425
2480
  tags: import("../../database/api/.generated").$Enums.ProtocolTag[];
2426
2481
  icon: string;
2427
2482
  } | null;
@@ -2448,6 +2503,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
2448
2503
  name: string;
2449
2504
  url: string;
2450
2505
  description: string;
2506
+ id: string;
2451
2507
  tags: import("../../database/api/.generated").$Enums.ProtocolTag[];
2452
2508
  icon: string;
2453
2509
  } & {})[] | null;
@@ -2461,13 +2517,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
2461
2517
  get: {
2462
2518
  body: unknown;
2463
2519
  params: {};
2464
- query: {
2465
- name?: string | undefined;
2466
- id?: string[] | undefined;
2467
- items?: number | undefined;
2468
- tags?: ("AMM" | "ALM" | "DEX" | "LENDING")[] | undefined;
2469
- page?: number | undefined;
2470
- };
2520
+ query: unknown;
2471
2521
  headers: unknown;
2472
2522
  response: {
2473
2523
  200: number;
@@ -3547,6 +3597,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
3547
3597
  name: string;
3548
3598
  url: string;
3549
3599
  description: string;
3600
+ id: string;
3550
3601
  tags: import("../../database/api/.generated").$Enums.ProtocolTag[];
3551
3602
  icon: string;
3552
3603
  } & {})[] | null;
@@ -4385,6 +4436,31 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
4385
4436
  200: number;
4386
4437
  }>>;
4387
4438
  };
4439
+ aggregate: ((params: {
4440
+ field: string | number;
4441
+ }) => {
4442
+ get: (options: {
4443
+ headers?: Record<string, unknown> | undefined;
4444
+ query: {
4445
+ sort?: undefined;
4446
+ name?: string | undefined;
4447
+ tokens?: string | undefined;
4448
+ status?: string | undefined;
4449
+ items?: number | undefined;
4450
+ tags?: string | undefined;
4451
+ chainId?: string | undefined;
4452
+ page?: number | undefined;
4453
+ action?: string | undefined;
4454
+ mainProtocolId?: string | undefined;
4455
+ order?: undefined;
4456
+ };
4457
+ fetch?: RequestInit | undefined;
4458
+ }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
4459
+ 200: {
4460
+ sum: File;
4461
+ };
4462
+ }>>;
4463
+ }) & {};
4388
4464
  };
4389
4465
  campaigns: {
4390
4466
  index: {
@@ -4557,6 +4633,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
4557
4633
  name: string;
4558
4634
  url: string;
4559
4635
  description: string;
4636
+ id: string;
4560
4637
  tags: import("../../database/api/.generated").$Enums.ProtocolTag[];
4561
4638
  icon: string;
4562
4639
  } | null;
@@ -4578,23 +4655,18 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
4578
4655
  name: string;
4579
4656
  url: string;
4580
4657
  description: string;
4658
+ id: string;
4581
4659
  tags: import("../../database/api/.generated").$Enums.ProtocolTag[];
4582
4660
  icon: string;
4583
4661
  } & {})[] | null;
4584
4662
  }>>;
4585
4663
  };
4586
4664
  count: {
4587
- get: (options: {
4665
+ get: (options?: {
4588
4666
  headers?: Record<string, unknown> | undefined;
4589
- query: {
4590
- name?: string | undefined;
4591
- id?: string[] | undefined;
4592
- items?: number | undefined;
4593
- tags?: ("AMM" | "ALM" | "DEX" | "LENDING")[] | undefined;
4594
- page?: number | undefined;
4595
- };
4667
+ query?: Record<string, unknown> | undefined;
4596
4668
  fetch?: RequestInit | undefined;
4597
- }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
4669
+ } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
4598
4670
  200: number;
4599
4671
  }>>;
4600
4672
  };
@@ -5437,6 +5509,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
5437
5509
  name: string;
5438
5510
  url: string;
5439
5511
  description: string;
5512
+ id: string;
5440
5513
  tags: import("../../database/api/.generated").$Enums.ProtocolTag[];
5441
5514
  icon: string;
5442
5515
  } & {})[] | null;
@@ -435,6 +435,38 @@ declare const app: Elysia<"", false, {
435
435
  };
436
436
  };
437
437
  };
438
+ } & {
439
+ opportunities: {
440
+ aggregate: {
441
+ ":field": {
442
+ get: {
443
+ body: unknown;
444
+ params: {
445
+ field: never;
446
+ };
447
+ query: {
448
+ sort?: undefined;
449
+ name?: string | undefined;
450
+ tokens?: string | undefined;
451
+ status?: string | undefined;
452
+ items?: number | undefined;
453
+ tags?: string | undefined;
454
+ chainId?: string | undefined;
455
+ page?: number | undefined;
456
+ action?: string | undefined;
457
+ mainProtocolId?: string | undefined;
458
+ order?: undefined;
459
+ };
460
+ headers: unknown;
461
+ response: {
462
+ 200: {
463
+ sum: File;
464
+ };
465
+ };
466
+ };
467
+ };
468
+ };
469
+ };
438
470
  };
439
471
  } & {
440
472
  v4: {
@@ -639,6 +671,7 @@ declare const app: Elysia<"", false, {
639
671
  name: string;
640
672
  url: string;
641
673
  description: string;
674
+ id: string;
642
675
  tags: import("../database/api/.generated").$Enums.ProtocolTag[];
643
676
  icon: string;
644
677
  } | null;
@@ -665,6 +698,7 @@ declare const app: Elysia<"", false, {
665
698
  name: string;
666
699
  url: string;
667
700
  description: string;
701
+ id: string;
668
702
  tags: import("../database/api/.generated").$Enums.ProtocolTag[];
669
703
  icon: string;
670
704
  } & {})[] | null;
@@ -678,13 +712,7 @@ declare const app: Elysia<"", false, {
678
712
  get: {
679
713
  body: unknown;
680
714
  params: {};
681
- query: {
682
- name?: string | undefined;
683
- id?: string[] | undefined;
684
- items?: number | undefined;
685
- tags?: ("AMM" | "ALM" | "DEX" | "LENDING")[] | undefined;
686
- page?: number | undefined;
687
- };
715
+ query: unknown;
688
716
  headers: unknown;
689
717
  response: {
690
718
  200: number;
@@ -1764,6 +1792,7 @@ declare const app: Elysia<"", false, {
1764
1792
  name: string;
1765
1793
  url: string;
1766
1794
  description: string;
1795
+ id: string;
1767
1796
  tags: import("../database/api/.generated").$Enums.ProtocolTag[];
1768
1797
  icon: string;
1769
1798
  } & {})[] | null;
@@ -33,23 +33,19 @@ export async function ERC20DynamicDataRefacto(chainId, campaigns) {
33
33
  allowFailure: true,
34
34
  callData: FactoryInterface.encodeFunctionData("factory"),
35
35
  target: campaign.campaignParameters.targetToken,
36
- });
37
- callsRounds1.push({
36
+ }, {
38
37
  allowFailure: true,
39
38
  callData: MetamorphoInterface.encodeFunctionData("MORPHO"),
40
39
  target: campaign.campaignParameters.targetToken,
41
- });
42
- callsRounds1.push({
40
+ }, {
43
41
  allowFailure: true,
44
42
  callData: ERC20Interface.encodeFunctionData("name"),
45
43
  target: campaign.campaignParameters.targetToken,
46
- });
47
- callsRounds1.push({
44
+ }, {
48
45
  allowFailure: true,
49
46
  callData: BalancerPoolInterface.encodeFunctionData("getPoolId"),
50
47
  target: campaign.campaignParameters.targetToken,
51
- });
52
- callsRounds1.push({
48
+ }, {
53
49
  allowFailure: true,
54
50
  callData: EnzymeInterface.encodeFunctionData("getCreator"),
55
51
  target: campaign.campaignParameters.targetToken,
@@ -46,10 +46,11 @@ export declare enum tokenType {
46
46
  koi = "koi",
47
47
  baseswap = "baseswap",
48
48
  zkswap = "zkswap",
49
- pendle = "pendle",
50
49
  ironcladStaking = "ironcladStaking",
51
50
  rfx = "rfx",
52
- woofi = "woofi"
51
+ woofi = "woofi",
52
+ pendle = "pendle",
53
+ maverickBoostedPosition = "maverickBoostedPosition"
53
54
  }
54
55
  export declare const tokenTypeToProtocol: {
55
56
  [key in tokenType]: {
@@ -47,10 +47,11 @@ export var tokenType;
47
47
  tokenType["koi"] = "koi";
48
48
  tokenType["baseswap"] = "baseswap";
49
49
  tokenType["zkswap"] = "zkswap";
50
- tokenType["pendle"] = "pendle";
51
50
  tokenType["ironcladStaking"] = "ironcladStaking";
52
51
  tokenType["rfx"] = "rfx";
53
52
  tokenType["woofi"] = "woofi";
53
+ tokenType["pendle"] = "pendle";
54
+ tokenType["maverickBoostedPosition"] = "maverickBoostedPosition";
54
55
  })(tokenType || (tokenType = {}));
55
56
  export const tokenTypeToProtocol = {
56
57
  [tokenType.aave_borrowing]: { protocol: "Aave" },
@@ -100,7 +101,14 @@ export const tokenTypeToProtocol = {
100
101
  [tokenType.zerolend_borrowing]: { protocol: "ZeroLend" },
101
102
  [tokenType.zerolend_lending]: { protocol: "ZeroLend" },
102
103
  [tokenType.zkswap]: { protocol: "ZKSwap" },
103
- [tokenType.ironcladStaking]: { protocol: "Ironclad" },
104
104
  [tokenType.rfx]: { protocol: "RFX" },
105
- [tokenType.woofi]: { protocol: "Woofi" },
105
+ [tokenType.woofi]: {
106
+ protocol: "Woofi",
107
+ },
108
+ [tokenType.ironcladStaking]: {
109
+ protocol: "Ironclad",
110
+ },
111
+ [tokenType.maverickBoostedPosition]: {
112
+ protocol: "Maverick",
113
+ },
106
114
  };
@@ -0,0 +1,50 @@
1
+ import type { Pricer } from "../../../../../utils/pricer";
2
+ import { type Campaign, type CampaignParameters } from "@sdk";
3
+ import type { tokenType } from "../helpers/tokenType";
4
+ import { GenericProcessor, type dataType, type mandatoryCallKeys } from "./GenericProcessor";
5
+ type callType = {
6
+ key: keyof dataRawMaverickBP;
7
+ call: string;
8
+ target: keyof callKeysMaverickBP;
9
+ metaData?: keyof callKeysMaverickBP;
10
+ };
11
+ type callKeysMaverickBP = mandatoryCallKeys & {
12
+ boostedPositionInformation: string;
13
+ tokenA: string;
14
+ tokenB: string;
15
+ lensAddress: string;
16
+ };
17
+ type dataRawMaverickBP = callKeysMaverickBP & {
18
+ amountA: string;
19
+ amountB: string;
20
+ decimalsTokenA: string;
21
+ decimalsTokenB: string;
22
+ bpInfoReturnData: {
23
+ [key: string]: string | number;
24
+ };
25
+ symbolTokenA: string;
26
+ symbolTokenB: string;
27
+ };
28
+ type dataTypeMaverickBP = dataType & {
29
+ amountA: number;
30
+ amountB: number;
31
+ decimalsTokenA: number;
32
+ decimalsTokenB: number;
33
+ lensAddress: string;
34
+ symbolTokenA: string;
35
+ symbolTokenB: string;
36
+ tokenA: string;
37
+ tokenB: string;
38
+ };
39
+ export declare class MaverickBPProcessor extends GenericProcessor<callKeysMaverickBP, dataRawMaverickBP, dataTypeMaverickBP> {
40
+ rounds: {
41
+ round1: callType[];
42
+ round2: callType[];
43
+ round3: callType[];
44
+ round4: callType[];
45
+ };
46
+ processingRound1(typeInfo: dataRawMaverickBP): void;
47
+ processingRound2(typeInfo: dataRawMaverickBP): void;
48
+ processingRound5(_index: number, type: tokenType, typeInfo: dataRawMaverickBP, _calls: string[], campaign: CampaignParameters<Campaign.ERC20> | CampaignParameters<Campaign.EULER>, pricer: Pricer): Promise<dataTypeMaverickBP>;
49
+ }
50
+ export {};
@@ -0,0 +1,75 @@
1
+ import { MAVERICK_ZKSYNC_BP_LENS_ADDRESS } from "../../../../../constants";
2
+ import { generateCardName } from "../../../../../utils/generateCardName";
3
+ import { BN2Number } from "@sdk";
4
+ import { GenericProcessor } from "./GenericProcessor";
5
+ export class MaverickBPProcessor extends GenericProcessor {
6
+ rounds = {
7
+ round1: [
8
+ {
9
+ key: "bpInfoReturnData",
10
+ call: "boostedPositionInformation",
11
+ target: "lensAddress",
12
+ metaData: "tokenAddress",
13
+ },
14
+ ],
15
+ round2: [
16
+ {
17
+ key: "symbolTokenA",
18
+ call: "symbol",
19
+ target: "tokenA",
20
+ },
21
+ {
22
+ key: "symbolTokenB",
23
+ call: "symbol",
24
+ target: "tokenB",
25
+ },
26
+ {
27
+ key: "decimalsTokenA",
28
+ call: "decimals",
29
+ target: "tokenA",
30
+ },
31
+ {
32
+ key: "decimalsTokenB",
33
+ call: "decimals",
34
+ target: "tokenB",
35
+ },
36
+ ],
37
+ round3: [],
38
+ round4: [{ key: "totalSupply", call: "totalSupply", target: "tokenAddress" }],
39
+ };
40
+ processingRound1(typeInfo) {
41
+ typeInfo.lensAddress = MAVERICK_ZKSYNC_BP_LENS_ADDRESS;
42
+ }
43
+ processingRound2(typeInfo) {
44
+ typeInfo.tokenA = typeInfo.bpInfoReturnData.tokenA;
45
+ typeInfo.tokenB = typeInfo.bpInfoReturnData.tokenB;
46
+ typeInfo.amountA = typeInfo.bpInfoReturnData.amountA.toString();
47
+ typeInfo.amountB = typeInfo.bpInfoReturnData.amountB.toString();
48
+ }
49
+ async processingRound5(_index, type, typeInfo, _calls, campaign, pricer) {
50
+ const { whitelistedSupplyTargetToken, totalSupply, blacklistedSupply } = this.handleWhiteListBlacklistRound5(typeInfo, campaign);
51
+ const decimalsTokenA = Number(typeInfo.decimalsTokenA);
52
+ const decimalsTokenB = Number(typeInfo.decimalsTokenB);
53
+ const amountA = BN2Number(typeInfo.amountA, decimalsTokenA);
54
+ const amountB = BN2Number(typeInfo.amountB, decimalsTokenB);
55
+ const tokenAPRice = (await pricer.get({ symbol: typeInfo.symbolTokenA })) ?? 0;
56
+ const tokenBPrice = (await pricer.get({ symbol: typeInfo.symbolTokenB })) ?? 0;
57
+ // Not rebased (ie divided by 10edecimals)
58
+ const tvl = tokenAPRice * amountA + tokenBPrice * amountB;
59
+ const priceTargetToken = tvl / totalSupply;
60
+ const { bpInfoReturnData, ...rest } = typeInfo;
61
+ return {
62
+ ...rest,
63
+ blacklistedSupply,
64
+ amountA,
65
+ amountB,
66
+ decimalsTokenA,
67
+ decimalsTokenB,
68
+ cardName: generateCardName(type, typeInfo, campaign),
69
+ priceTargetToken: priceTargetToken,
70
+ totalSupply,
71
+ tvl,
72
+ whitelistedSupplyTargetToken,
73
+ };
74
+ }
75
+ }
@@ -13,6 +13,7 @@ import { FluidProcessor } from "./FluidProcessor";
13
13
  import { FraxProcessor } from "./FraxProcessor";
14
14
  import { GearboxProcessor } from "./GearboxProcessor";
15
15
  import { GenericProcessor } from "./GenericProcessor";
16
+ import { MaverickBPProcessor } from "./MaverickBPProcessor";
16
17
  import { MetamorphoProcessor } from "./MetamorphoProcessor";
17
18
  import { PendleProcessor } from "./PendleProcessor";
18
19
  import { RadiantProcessor } from "./RadiantProcessor";
@@ -74,4 +75,5 @@ export const processorMapping = {
74
75
  [tokenType.ironcladStaking]: GenericProcessor,
75
76
  [tokenType.rfx]: RfxProcessor,
76
77
  [tokenType.woofi]: WoofiProcessor,
78
+ [tokenType.maverickBoostedPosition]: MaverickBPProcessor,
77
79
  };
@@ -81,6 +81,8 @@ function satisfiesNameConditions(name, type) {
81
81
  return lowerCaseName === "ironclad token";
82
82
  case tokenType.woofi:
83
83
  return lowerCaseName.includes("woofi");
84
+ case tokenType.maverickBoostedPosition:
85
+ return lowerCaseName.includes("maverick");
84
86
  default:
85
87
  return false;
86
88
  }
@@ -9,6 +9,7 @@ export declare abstract class EnsoService {
9
9
  name: string;
10
10
  url: string;
11
11
  description: string;
12
+ id: string;
12
13
  tags: import("../../../../database/api/.generated").$Enums.ProtocolTag[];
13
14
  icon: string;
14
15
  } & {})[] | null>;
@@ -408,6 +408,38 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
408
408
  };
409
409
  };
410
410
  };
411
+ } & {
412
+ opportunities: {
413
+ aggregate: {
414
+ ":field": {
415
+ get: {
416
+ body: unknown;
417
+ params: {
418
+ field: never;
419
+ };
420
+ query: {
421
+ sort?: undefined;
422
+ name?: string | undefined;
423
+ tokens?: string | undefined;
424
+ status?: string | undefined;
425
+ items?: number | undefined;
426
+ tags?: string | undefined;
427
+ chainId?: string | undefined;
428
+ page?: number | undefined;
429
+ action?: string | undefined;
430
+ mainProtocolId?: string | undefined;
431
+ order?: undefined;
432
+ };
433
+ headers: unknown;
434
+ response: {
435
+ 200: {
436
+ sum: File;
437
+ };
438
+ };
439
+ };
440
+ };
441
+ };
442
+ };
411
443
  }, {
412
444
  derive: {};
413
445
  resolve: {};
@@ -1,7 +1,7 @@
1
1
  import { NotFoundError } from "../../../errors";
2
2
  import { AuthorizationHeadersDto, TokenAuthGuard } from "../../../guards/TokenAuth.guard";
3
3
  import Elysia from "elysia";
4
- import { CreateOpportunityDto, GetOpportunitiesQueryDto, OpportunityUniqueDto } from "./opportunity.model";
4
+ import { CreateOpportunityDto, GetOpportunitiesQueryDto, OpportunityAggregateFieldDto, OpportunityUniqueDto, } from "./opportunity.model";
5
5
  import { OpportunityService } from "./opportunity.service";
6
6
  import { transformId } from "./transform-id.pipe";
7
7
  import { validateId } from "./validate-id.pipe";
@@ -60,4 +60,9 @@ export const OpportunityController = new Elysia({ prefix: "/opportunities", deta
60
60
  query: GetOpportunitiesQueryDto,
61
61
  })
62
62
  // ─── Get Opportunities Count ─────────────────────────────────────────
63
- .get("/count", async ({ query }) => await OpportunityService.countMany(query), { query: GetOpportunitiesQueryDto });
63
+ .get("/count", async ({ query }) => await OpportunityService.countMany(query), { query: GetOpportunitiesQueryDto })
64
+ // ─── Get Aggregate fields ─────────────────────────────────────────
65
+ .get("/aggregate/:field", async ({ query, params }) => await OpportunityService.aggregate(query, params.field), {
66
+ params: OpportunityAggregateFieldDto,
67
+ query: GetOpportunitiesQueryDto,
68
+ });
@@ -107,7 +107,11 @@ export declare const CreateOpportunityDto: import("@sinclair/typebox").TObject<{
107
107
  protocols: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
108
108
  mainProtocol: import("@sinclair/typebox").TString;
109
109
  }>;
110
+ export declare const OpportunityAggregateFieldDto: import("@sinclair/typebox").TObject<{
111
+ field: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"dailyRewards">[]>;
112
+ }>;
110
113
  export type GetOpportunitiesQueryEntity = typeof GetOpportunitiesQueryDto.static;
111
114
  export type CreateOpportunityModel = typeof CreateOpportunityDto.static & {
112
115
  id: string;
113
116
  };
117
+ export type OpportunityAggregateField = typeof OpportunityAggregateFieldDto.static;
@@ -34,3 +34,6 @@ export const CreateOpportunityDto = t.Object({
34
34
  protocols: t.Array(t.String()),
35
35
  mainProtocol: t.String(),
36
36
  });
37
+ export const OpportunityAggregateFieldDto = t.Object({
38
+ field: t.Union(["dailyRewards"].map(v => t.Literal(v))),
39
+ });
@@ -476,4 +476,7 @@ export declare abstract class OpportunityRepository {
476
476
  apr: number;
477
477
  dailyRewards: number;
478
478
  }>;
479
+ static aggregateSum(field: keyof Prisma.OpportunitySumAggregateInputType, query: GetOpportunitiesQueryEntity): Promise<{
480
+ sum: never;
481
+ }>;
479
482
  }
@@ -214,4 +214,14 @@ export class OpportunityRepository {
214
214
  static async updateApr(id, apr) {
215
215
  return await apiDbClient.opportunity.update({ where: { id }, data: { apr } });
216
216
  }
217
+ static async aggregateSum(field, query) {
218
+ const args = OpportunityRepository.#transformQueryToPrismaFilters(query);
219
+ const result = await apiDbClient.opportunity.aggregate({
220
+ _sum: {
221
+ [field]: true,
222
+ },
223
+ ...args,
224
+ });
225
+ return { sum: result._sum[field] ?? null };
226
+ }
217
227
  }