@merkl/api 0.10.208 → 0.10.210

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. package/dist/database/api/.generated/edge.js +6 -4
  2. package/dist/database/api/.generated/index-browser.js +3 -1
  3. package/dist/database/api/.generated/index.d.ts +3 -1
  4. package/dist/database/api/.generated/index.js +6 -4
  5. package/dist/database/api/.generated/package.json +1 -1
  6. package/dist/database/api/.generated/schema.prisma +2 -0
  7. package/dist/database/api/.generated/wasm.js +3 -1
  8. package/dist/database/api/seeder/resources/protocol.d.ts +12 -0
  9. package/dist/database/api/seeder/resources/protocol.js +2 -0
  10. package/dist/src/eden/index.d.ts +39 -9
  11. package/dist/src/entities/opportunity.js +37 -1
  12. package/dist/src/index.d.ts +15 -3
  13. package/dist/src/index.js +1 -1
  14. package/dist/src/libs/campaigns/campaignTypes/EigenLayerDynamicData.d.ts +3 -0
  15. package/dist/src/libs/campaigns/campaignTypes/EigenLayerDynamicData.js +67 -0
  16. package/dist/src/libs/campaigns/campaignsDynamicData.js +4 -0
  17. package/dist/src/libs/positions/EigenLayer/index.d.ts +6 -0
  18. package/dist/src/libs/positions/EigenLayer/index.js +53 -0
  19. package/dist/src/libs/positions/ajna/index.d.ts +4 -39
  20. package/dist/src/libs/positions/ajna/index.js +2 -2
  21. package/dist/src/libs/positions/badger/index.d.ts +3 -24
  22. package/dist/src/libs/positions/badger/index.js +1 -1
  23. package/dist/src/libs/positions/index.js +4 -0
  24. package/dist/src/libs/positions/morpho/index.d.ts +4 -38
  25. package/dist/src/libs/positions/prepareFetch.js +29 -1
  26. package/dist/src/libs/positions/types.d.ts +55 -0
  27. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +2 -2
  28. package/dist/src/modules/v4/campaign/campaign.model.d.ts +2 -0
  29. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +1 -1
  30. package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +2 -0
  31. package/dist/src/modules/v4/protocol/protocol.model.d.ts +1 -1
  32. package/dist/src/modules/v4/protocol/protocol.model.js +2 -0
  33. package/dist/src/modules/v4/router.d.ts +3 -3
  34. package/dist/src/utils/generateCardName.js +1 -0
  35. package/dist/tsconfig.package.tsbuildinfo +1 -1
  36. package/package.json +1 -1
@@ -1,6 +1,15 @@
1
1
  import type { Campaign as CampaignResource } from "../modules/v4";
2
2
  import type { CampaignType } from "../../database/api/.generated";
3
3
  declare const eden: {
4
+ index: {
5
+ get: (options?: {
6
+ headers?: Record<string, unknown> | undefined;
7
+ query?: Record<string, unknown> | undefined;
8
+ fetch?: RequestInit | undefined;
9
+ } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
10
+ 200: string;
11
+ }>>;
12
+ };
4
13
  v1: {
5
14
  allowances: {
6
15
  get: (options: {
@@ -362,7 +371,7 @@ declare const eden: {
362
371
  index: {
363
372
  post: (body: {
364
373
  name?: string | undefined;
365
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4";
374
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER";
366
375
  tokens: {
367
376
  chainId: number;
368
377
  address: string;
@@ -583,7 +592,7 @@ declare const eden: {
583
592
  get: (options: {
584
593
  headers?: Record<string, unknown> | undefined;
585
594
  query: {
586
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | undefined;
595
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | undefined;
587
596
  items?: number | undefined;
588
597
  subType?: number | undefined;
589
598
  page?: number | undefined;
@@ -652,7 +661,7 @@ declare const eden: {
652
661
  get: (options: {
653
662
  headers?: Record<string, unknown> | undefined;
654
663
  query: {
655
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | undefined;
664
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | undefined;
656
665
  items?: number | undefined;
657
666
  subType?: number | undefined;
658
667
  page?: number | undefined;
@@ -2691,6 +2700,18 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
2691
2700
  macro: {};
2692
2701
  macroFn: {};
2693
2702
  }, {
2703
+ index: {
2704
+ get: {
2705
+ body: unknown;
2706
+ params: {};
2707
+ query: unknown;
2708
+ headers: unknown;
2709
+ response: {
2710
+ 200: string;
2711
+ };
2712
+ };
2713
+ };
2714
+ } & {
2694
2715
  v1: {
2695
2716
  allowances: {
2696
2717
  get: {
@@ -2803,7 +2824,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
2803
2824
  post: {
2804
2825
  body: {
2805
2826
  name?: string | undefined;
2806
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4";
2827
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER";
2807
2828
  tokens: {
2808
2829
  chainId: number;
2809
2830
  address: string;
@@ -3350,7 +3371,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
3350
3371
  body: unknown;
3351
3372
  params: {};
3352
3373
  query: {
3353
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | undefined;
3374
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | undefined;
3354
3375
  items?: number | undefined;
3355
3376
  subType?: number | undefined;
3356
3377
  page?: number | undefined;
@@ -3422,7 +3443,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
3422
3443
  body: unknown;
3423
3444
  params: {};
3424
3445
  query: {
3425
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | undefined;
3446
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | undefined;
3426
3447
  items?: number | undefined;
3427
3448
  subType?: number | undefined;
3428
3449
  page?: number | undefined;
@@ -6023,6 +6044,15 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
6023
6044
  resolve: {};
6024
6045
  schema: {};
6025
6046
  }>, config?: import("@elysiajs/eden").Treaty.Config) => {
6047
+ index: {
6048
+ get: (options?: {
6049
+ headers?: Record<string, unknown> | undefined;
6050
+ query?: Record<string, unknown> | undefined;
6051
+ fetch?: RequestInit | undefined;
6052
+ } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
6053
+ 200: string;
6054
+ }>>;
6055
+ };
6026
6056
  v1: {
6027
6057
  allowances: {
6028
6058
  get: (options: {
@@ -6384,7 +6414,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
6384
6414
  index: {
6385
6415
  post: (body: {
6386
6416
  name?: string | undefined;
6387
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4";
6417
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER";
6388
6418
  tokens: {
6389
6419
  chainId: number;
6390
6420
  address: string;
@@ -6605,7 +6635,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
6605
6635
  get: (options: {
6606
6636
  headers?: Record<string, unknown> | undefined;
6607
6637
  query: {
6608
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | undefined;
6638
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | undefined;
6609
6639
  items?: number | undefined;
6610
6640
  subType?: number | undefined;
6611
6641
  page?: number | undefined;
@@ -6674,7 +6704,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
6674
6704
  get: (options: {
6675
6705
  headers?: Record<string, unknown> | undefined;
6676
6706
  query: {
6677
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | undefined;
6707
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | undefined;
6678
6708
  items?: number | undefined;
6679
6709
  subType?: number | undefined;
6680
6710
  page?: number | undefined;
@@ -210,6 +210,7 @@ export const extractOpportunities = {
210
210
  "poolside",
211
211
  "koi",
212
212
  "pancakeswap",
213
+ "tempest",
213
214
  ],
214
215
  borrow: ["radiant_borrow", "aave_borrowing", "euler_borrow"],
215
216
  lend: [
@@ -343,7 +344,7 @@ export const extractOpportunities = {
343
344
  return opportunity;
344
345
  },
345
346
  [Campaign.BADGER]: (campaign, campaigns, prices) => {
346
- const { chainId, tvl, campaignSubType, campaignParameters: params, computeChainId } = campaign;
347
+ const { chainId, tvl, campaignParameters: params, computeChainId } = campaign;
347
348
  const { active, all } = campaigns;
348
349
  const aprBreakdown = active.reduce((res, campaign) => {
349
350
  res[`Campaign ${campaign.campaignId.slice(0, 8)}`] = {
@@ -377,6 +378,41 @@ export const extractOpportunities = {
377
378
  };
378
379
  return opportunity;
379
380
  },
381
+ [Campaign.EIGENLAYER]: (campaign, campaigns, prices) => {
382
+ const { chainId, tvl, campaignParameters: params, computeChainId } = campaign;
383
+ const { active, all } = campaigns;
384
+ const aprBreakdown = active.reduce((res, campaign) => {
385
+ res[`Campaign ${campaign.campaignId.slice(0, 8)}`] = {
386
+ value: campaign.apr ?? 0,
387
+ address: campaign.campaignId,
388
+ type: EAprBreakdownType.DETAILS,
389
+ };
390
+ return res;
391
+ }, {});
392
+ // @Hugo WIP todo for aprBreakdown2
393
+ const aprBreakdown2 = getCampaignsApr(active);
394
+ const opportunity = {
395
+ id: `${Campaign.EIGENLAYER}_${campaign.mainParameter}`,
396
+ platform: "EigenLayer strategy",
397
+ name: ["EigenLayer", "strategy", params.symbolUnderlyingToken].join(" "),
398
+ chainId: !computeChainId ? chainId : computeChainId,
399
+ distributionChainId: chainId,
400
+ tvl,
401
+ action: "lend",
402
+ subtype: 0,
403
+ status: getStatus(all),
404
+ tags: getTags(campaigns.all),
405
+ dailyrewards: getDailyRewards(active, prices),
406
+ tokenIcons: [params.symbolUnderlyingToken],
407
+ campaigns: { ...campaigns, type: Campaign.EIGENLAYER, ids: campaigns.all.map(c => c.campaignId) },
408
+ rewardTokenIcons: getRewardTokenIcons(campaigns.active),
409
+ dailyRewardTokens: getRewardTokens(campaigns.active),
410
+ apr: getApr(active),
411
+ aprBreakdown,
412
+ aprBreakdown2,
413
+ };
414
+ return opportunity;
415
+ },
380
416
  [Campaign.AJNA]: (campaign, campaigns, prices) => {
381
417
  const { chainId, tvl, campaignSubType, campaignParameters: params, computeChainId } = campaign;
382
418
  const { active, all } = campaigns;
@@ -24,6 +24,18 @@ declare const app: Elysia<"", false, {
24
24
  macro: {};
25
25
  macroFn: {};
26
26
  }, {
27
+ index: {
28
+ get: {
29
+ body: unknown;
30
+ params: {};
31
+ query: unknown;
32
+ headers: unknown;
33
+ response: {
34
+ 200: string;
35
+ };
36
+ };
37
+ };
38
+ } & {
27
39
  v1: {
28
40
  allowances: {
29
41
  get: {
@@ -136,7 +148,7 @@ declare const app: Elysia<"", false, {
136
148
  post: {
137
149
  body: {
138
150
  name?: string | undefined;
139
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4";
151
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER";
140
152
  tokens: {
141
153
  chainId: number;
142
154
  address: string;
@@ -683,7 +695,7 @@ declare const app: Elysia<"", false, {
683
695
  body: unknown;
684
696
  params: {};
685
697
  query: {
686
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | undefined;
698
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | undefined;
687
699
  items?: number | undefined;
688
700
  subType?: number | undefined;
689
701
  page?: number | undefined;
@@ -755,7 +767,7 @@ declare const app: Elysia<"", false, {
755
767
  body: unknown;
756
768
  params: {};
757
769
  query: {
758
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | undefined;
770
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | undefined;
759
771
  items?: number | undefined;
760
772
  subType?: number | undefined;
761
773
  page?: number | undefined;
package/dist/src/index.js CHANGED
@@ -85,7 +85,7 @@ const app = new Elysia({
85
85
  exclude: [/engine\/*/, /v1\/.*/, /v2\/.*/, /v3\/.*/, /swagger\/*/],
86
86
  }))
87
87
  .use(cors())
88
- // .get("/", () => "Merkl API")
88
+ .get("/", () => "Merkl API: docs available at /docs")
89
89
  .use(v1)
90
90
  .use(v2)
91
91
  .use(v4)
@@ -0,0 +1,3 @@
1
+ import { type Campaign, type CampaignDynamicData, type CampaignParameters, type MerklChainId } from "@sdk";
2
+ import type { UncachedResult } from "../../../utils/execute";
3
+ export declare function EigenLayerDynamicData(_chainId: MerklChainId, campaigns: CampaignParameters<Campaign.EIGENLAYER>[]): Promise<UncachedResult<Partial<CampaignDynamicData<Campaign.EIGENLAYER>[]>>>;
@@ -0,0 +1,67 @@
1
+ import { BN2Number, ChainInteractionService, EigenLayerStrategyInterface, EigenLayerStrategy__factory, YEAR, } from "@sdk";
2
+ import { log } from "../../../utils/logger";
3
+ import { Pricer } from "../../../utils/pricer";
4
+ export async function EigenLayerDynamicData(_chainId, campaigns) {
5
+ const pricer = await Pricer.load();
6
+ const calls = [];
7
+ for (const campaign of campaigns) {
8
+ calls.push({
9
+ allowFailure: true,
10
+ callData: EigenLayerStrategyInterface.encodeFunctionData("totalShares"),
11
+ target: campaign.campaignParameters.strategy,
12
+ });
13
+ }
14
+ return {
15
+ cached: false,
16
+ call: {
17
+ callData: calls,
18
+ handler: () => { },
19
+ reducer: async (result) => {
20
+ let i = 0;
21
+ const dynamicData = [];
22
+ for (const campaign of campaigns) {
23
+ let totalSupplyShares;
24
+ let totalSupplyStrategy;
25
+ try {
26
+ totalSupplyShares = EigenLayerStrategyInterface.decodeFunctionResult("totalShares", result[i++])[0];
27
+ }
28
+ catch {
29
+ log.warn(`Error getting totalShares for campaign ${campaign.campaignId} and strategy ${campaign.campaignParameters.strategy}`);
30
+ totalSupplyShares = 0.0000001;
31
+ }
32
+ try {
33
+ totalSupplyStrategy = BN2Number(await EigenLayerStrategy__factory.connect(campaign.campaignParameters.strategy, ChainInteractionService(campaign.computeChainId).provider()).sharesToUnderlying(totalSupplyShares), campaign.campaignParameters.decimalsUnderlyingToken);
34
+ }
35
+ catch {
36
+ log.warn(`Error getting totalSupply for campaign ${campaign.campaignId} and strategy ${campaign.campaignParameters.strategy}`);
37
+ totalSupplyStrategy = 0.0000001;
38
+ }
39
+ const priceRewardToken = (await pricer.get({
40
+ address: campaign.rewardToken,
41
+ chainId: campaign.chainId,
42
+ symbol: campaign.campaignParameters.symbolRewardToken,
43
+ })) ?? 0;
44
+ const priceTargetToken = (await pricer.get({
45
+ address: campaign.campaignParameters.underlyingToken,
46
+ chainId: campaign.computeChainId,
47
+ symbol: campaign.campaignParameters.symbolUnderlyingToken,
48
+ })) ?? 0;
49
+ const tvl = totalSupplyStrategy * priceTargetToken;
50
+ dynamicData.push({
51
+ ...campaign,
52
+ apr: (priceRewardToken *
53
+ BN2Number(campaign.amount, campaign.campaignParameters.decimalsRewardToken) *
54
+ YEAR *
55
+ 100) /
56
+ campaign.campaignParameters.duration /
57
+ (totalSupplyStrategy * priceTargetToken),
58
+ totalSupplyTargetToken: totalSupplyStrategy,
59
+ tvl,
60
+ priceRewardToken: priceRewardToken,
61
+ });
62
+ }
63
+ return dynamicData;
64
+ },
65
+ },
66
+ };
67
+ }
@@ -8,6 +8,7 @@ import { CompoundDynamicData } from "./campaignTypes/CompoundDynamicData";
8
8
  import { DolomiteDynamicData } from "./campaignTypes/DolomiteDynamicData";
9
9
  import { ERC20DynamicData } from "./campaignTypes/ERC20DynamicData";
10
10
  import { ERC20_SNAPSHOTDynamicData } from "./campaignTypes/ERC20_SNAPSHOTDynamicData";
11
+ import { EigenLayerDynamicData } from "./campaignTypes/EigenLayerDynamicData";
11
12
  import { EulerDynamicData } from "./campaignTypes/EulerDynamicData";
12
13
  import { JSON_AIRDROPDynamicData } from "./campaignTypes/JSON_AIRDROPDynamicData";
13
14
  import { MORPHODynamicData } from "./campaignTypes/MORPHODynamicData";
@@ -61,6 +62,9 @@ export async function campaignsDynamicData(chainId, campaigns, type) {
61
62
  case Campaign.COMPOUND: {
62
63
  return CompoundDynamicData(chainId, campaigns);
63
64
  }
65
+ case Campaign.EIGENLAYER: {
66
+ return EigenLayerDynamicData(chainId, campaigns);
67
+ }
64
68
  }
65
69
  return {
66
70
  cached: false,
@@ -0,0 +1,6 @@
1
+ import { type MerklChainId } from "@sdk";
2
+ import type { UncachedResult } from "../../../utils/execute";
3
+ import type { EigenLayerFetchedCampaign, PositionType } from "../types";
4
+ export declare function getEigenLayerUserPositions(user: string, _chainId: MerklChainId, campaigns: {
5
+ [mainparameter: string]: EigenLayerFetchedCampaign;
6
+ }): Promise<UncachedResult<PositionType>>;
@@ -0,0 +1,53 @@
1
+ import { BN2Number, ChainInteractionService, EigenLayerStrategyInterface, EigenLayerStrategy__factory, } from "@sdk";
2
+ export async function getEigenLayerUserPositions(user, _chainId, campaigns) {
3
+ /**
4
+ * Fetch user positions
5
+ */
6
+ const calls = [];
7
+ for (const mainParameter of Object.keys(campaigns)) {
8
+ calls.push({
9
+ allowFailure: true,
10
+ callData: EigenLayerStrategyInterface.encodeFunctionData("shares", [user]),
11
+ target: campaigns[mainParameter].strategy,
12
+ });
13
+ }
14
+ return {
15
+ cached: false,
16
+ call: {
17
+ callData: calls,
18
+ handler: () => { },
19
+ reducer: async (result) => {
20
+ let j = 0;
21
+ const finalRes = {};
22
+ for (const campaignId of Object.keys(campaigns)) {
23
+ let userShares = 0;
24
+ let userSupply = 0;
25
+ const strategy = campaigns[campaignId].strategy;
26
+ userShares = EigenLayerStrategyInterface.decodeFunctionResult("shares", result[j++])[0];
27
+ userSupply = BN2Number(await EigenLayerStrategy__factory.connect(strategy, ChainInteractionService(_chainId).provider()).sharesToUnderlying(userShares), campaigns[campaignId].decimals);
28
+ const res = {
29
+ userPositions: [],
30
+ decimals: campaigns[campaignId].decimals,
31
+ totalSupply: BN2Number(campaigns[campaignId].totalSupplyTargetToken, campaigns[campaignId].decimals),
32
+ userTVL: 0,
33
+ };
34
+ if (userSupply > 0) {
35
+ res.userPositions.push({
36
+ balance: userSupply,
37
+ token: strategy,
38
+ origin: "Direct",
39
+ totalSupply: campaigns.campaignId.totalSupplyTargetToken,
40
+ tvl: campaigns[campaignId].tvl,
41
+ });
42
+ // to modify
43
+ }
44
+ // Add to final result if there are positions
45
+ if (res.userPositions.length > 0) {
46
+ finalRes[`14_${campaignId}`] = { ...res };
47
+ }
48
+ }
49
+ return finalRes;
50
+ },
51
+ },
52
+ };
53
+ }
@@ -1,41 +1,6 @@
1
- import { type Forwarder, type ForwarderParameters, type MerklChainId } from "@sdk";
1
+ import { type MerklChainId } from "@sdk";
2
2
  import type { UncachedResult } from "../../../utils/execute";
3
- export type UserPosition = {
4
- balance: number;
5
- token: string;
6
- origin: string;
7
- totalSupply: number;
8
- tvl: number;
9
- };
10
- export type FetchedCampaign = {
11
- rewardToken: string;
12
- targetToken: string;
13
- symbolRewardToken: string;
14
- subtype: number;
15
- tvl: number;
16
- poolId: string;
17
- decimals: number;
18
- totalSupplyTargetToken: number;
19
- computedtotalSupply: number;
20
- amount: number;
21
- forwarders?: {
22
- [address: string]: ForwarderParameters<Forwarder>;
23
- };
24
- };
25
- export type MorphoPositionType = {
26
- [mainParameter: string]: {
27
- userPositions: UserPosition[];
28
- decimals: number;
29
- totalSupply: number;
30
- userTVL: number;
31
- };
32
- };
33
- export type Res = {
34
- userPositions: UserPosition[];
35
- decimals: number;
36
- totalSupply: number;
37
- userTVL: number;
38
- };
3
+ import type { AjnaFetchedCampaign, PositionType } from "../types";
39
4
  export declare function getAjnaUserPositions(user: string, _chainId: MerklChainId, campaigns: {
40
- [mainparameter: string]: FetchedCampaign;
41
- }): Promise<UncachedResult<MorphoPositionType>>;
5
+ [mainparameter: string]: AjnaFetchedCampaign;
6
+ }): Promise<UncachedResult<PositionType>>;
@@ -1,5 +1,5 @@
1
1
  import { batchMulticallCallWithRetry } from "../../../utils/generic";
2
- import { AjnaSubCampaignType, BN2Number, NETWORK_LABELS, PoolInfoUtilsInterface, } from "@sdk";
2
+ import { AjnaSubCampaignType, BN2Number, NETWORK_LABELS, PoolInfoUtilsInterface } from "@sdk";
3
3
  import { POOL_INFO_UTILS } from "@sdk";
4
4
  import axios from "axios";
5
5
  export async function getAjnaUserPositions(user, _chainId, campaigns) {
@@ -28,7 +28,7 @@ export async function getAjnaUserPositions(user, _chainId, campaigns) {
28
28
  call: {
29
29
  callData: calls,
30
30
  handler: () => { },
31
- reducer: async (result) => {
31
+ reducer: async (_result) => {
32
32
  const finalRes = {};
33
33
  const resCalls = await batchMulticallCallWithRetry(_chainId, {
34
34
  calls,
@@ -1,27 +1,6 @@
1
1
  import { type MerklChainId } from "@sdk";
2
2
  import type { UncachedResult } from "../../../utils/execute";
3
- import type { FetchedCampaign } from "../morpho";
4
- export type UserPosition = {
5
- balance: number;
6
- token: string;
7
- origin: string;
8
- totalSupply: number;
9
- tvl: number;
10
- };
11
- export type MorphoPositionType = {
12
- [mainParameter: string]: {
13
- userPositions: UserPosition[];
14
- decimals: number;
15
- totalSupply: number;
16
- userTVL: number;
17
- };
18
- };
19
- export type Res = {
20
- userPositions: UserPosition[];
21
- decimals: number;
22
- totalSupply: number;
23
- userTVL: number;
24
- };
3
+ import type { BadgerFetchedCampaign, PositionType } from "../types";
25
4
  export declare function getBadgerUserPositions(user: string, _chainId: MerklChainId, campaigns: {
26
- [mainparameter: string]: FetchedCampaign;
27
- }): Promise<UncachedResult<MorphoPositionType>>;
5
+ [mainparameter: string]: BadgerFetchedCampaign;
6
+ }): Promise<UncachedResult<PositionType>>;
@@ -70,7 +70,7 @@ export async function getBadgerUserPositions(user, _chainId, campaigns) {
70
70
  if (res.userPositions.length > 0) {
71
71
  finalRes[`9_${campaignId}`] = { ...res };
72
72
  }
73
- i++;
73
+ i = i++;
74
74
  }
75
75
  return finalRes;
76
76
  },
@@ -1,6 +1,7 @@
1
1
  import { Campaign, withTimeout } from "@sdk";
2
2
  import { MERKL_USER_POSITION_FETCHING_GLOBAL_TIMEOUT } from "../../constants";
3
3
  import { executeSimple } from "../../utils/execute";
4
+ import { getEigenLayerUserPositions } from "./EigenLayer";
4
5
  import { getAjnaUserPositions } from "./ajna";
5
6
  import { getBadgerUserPositions } from "./badger";
6
7
  import { getClammUserPositions } from "./clamm";
@@ -42,6 +43,9 @@ chainId, user) {
42
43
  break;
43
44
  case Campaign.COMPOUND:
44
45
  promises.push(withTimeout(executeSimple(chainId, getCompoundUserPositions(user, chainId, positionsToCheck[numkey])), MERKL_USER_POSITION_FETCHING_GLOBAL_TIMEOUT));
46
+ break;
47
+ case Campaign.EIGENLAYER:
48
+ promises.push(withTimeout(executeSimple(chainId, getEigenLayerUserPositions(user, chainId, positionsToCheck[numkey])), MERKL_USER_POSITION_FETCHING_GLOBAL_TIMEOUT));
45
49
  }
46
50
  }
47
51
  return Object.assign({}, ...(await Promise.all(promises)));
@@ -1,40 +1,6 @@
1
- import { type Forwarder, type ForwarderParameters, type MerklChainId } from "@sdk";
1
+ import { type MerklChainId } from "@sdk";
2
2
  import type { UncachedResult } from "../../../utils/execute";
3
- export type MorphoPositionType = {
4
- [mainParameter: string]: {
5
- userPositions: UserPosition[];
6
- decimals: number;
7
- totalSupply: number;
8
- userTVL: number;
9
- };
10
- };
11
- export type FetchedCampaign = {
12
- rewardToken: string;
13
- targetToken: string;
14
- symbolRewardToken: string;
15
- subtype: number;
16
- tvl: number;
17
- marketId: string;
18
- decimals: number;
19
- totalSupplyTargetToken: number;
20
- amount: number;
21
- forwarders?: {
22
- [address: string]: ForwarderParameters<Forwarder>;
23
- };
24
- };
25
- export type UserPosition = {
26
- balance: number;
27
- token: string;
28
- origin: string;
29
- totalSupply: number;
30
- tvl: number;
31
- };
32
- export type Res = {
33
- userPositions: UserPosition[];
34
- decimals: number;
35
- totalSupply: number;
36
- userTVL: number;
37
- };
3
+ import type { MorphoFetchedCampaign, PositionType } from "../types";
38
4
  export declare function getMorphoUserPositions(user: string, _chainId: MerklChainId, campaigns: {
39
- [mainparameter: string]: FetchedCampaign;
40
- }): Promise<UncachedResult<MorphoPositionType>>;
5
+ [mainparameter: string]: MorphoFetchedCampaign;
6
+ }): Promise<UncachedResult<PositionType>>;
@@ -312,8 +312,34 @@ function prepareCompoundFetch(previous, campaign) {
312
312
  };
313
313
  return previous;
314
314
  }
315
+ function prepareEigenLayerFetch(previous, campaign) {
316
+ if (campaign.campaignType !== Campaign.EIGENLAYER) {
317
+ return previous;
318
+ }
319
+ const forwarders = {};
320
+ if (campaign.campaignParameters.forwarders && campaign.campaignParameters.forwarders.length > 0) {
321
+ for (const forwarder of campaign.campaignParameters.forwarders) {
322
+ forwarders[utils.getAddress(forwarder.sender)] = forwarder;
323
+ }
324
+ }
325
+ previous[campaign.mainParameter] = {
326
+ rewardToken: campaign.rewardToken,
327
+ symbolRewardToken: campaign.campaignParameters.symbolRewardToken,
328
+ tvl: campaign.tvl,
329
+ forwarders: forwarders,
330
+ targetToken: campaign.campaignParameters.strategy,
331
+ decimalsTargetToken: campaign.campaignParameters.decimalsUnderlyingToken,
332
+ totalSupplyTargetToken: campaign.totalSupplyTargetToken,
333
+ underlyingToken: campaign.campaignParameters.underlyingToken,
334
+ symbolUnderlyingToken: campaign.campaignParameters.symbolUnderlyingToken,
335
+ decimals: campaign.campaignParameters.decimalsUnderlyingToken,
336
+ amount: Number.parseFloat((BigInt(campaign.amount) / BigInt(10 ** campaign.campaignParameters.decimalsRewardToken)).toString()),
337
+ };
338
+ return previous;
339
+ }
315
340
  export function prepareFetch(type, previous, // FIXME
316
- campaign) {
341
+ campaign //FIXME
342
+ ) {
317
343
  switch (type) {
318
344
  case Campaign.CLAMM:
319
345
  return prepareClammFetch(previous, campaign);
@@ -333,6 +359,8 @@ campaign) {
333
359
  return prepareAjnaFetch(previous, campaign);
334
360
  case Campaign.COMPOUND:
335
361
  return prepareCompoundFetch(previous, campaign);
362
+ case Campaign.EIGENLAYER:
363
+ return prepareEigenLayerFetch(previous, campaign);
336
364
  default:
337
365
  return previous;
338
366
  }