@merkl/api 0.10.180 → 0.10.182

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 (44) hide show
  1. package/dist/src/eden/index.d.ts +58 -12
  2. package/dist/src/index.d.ts +24 -4
  3. package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicDataRefacto.js +3 -3
  4. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.d.ts +2 -1
  5. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.js +4 -0
  6. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AuraProcessor.d.ts +1 -0
  7. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AuraProcessor.js +12 -3
  8. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/PendleProcessor.d.ts +1 -1
  9. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/PendleProcessor.js +1 -3
  10. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/StakingProcessor.d.ts +39 -0
  11. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/StakingProcessor.js +45 -0
  12. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/processorMapping.js +2 -0
  13. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1RefactoFinal.d.ts +2 -1
  14. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1RefactoFinal.js +25 -1
  15. package/dist/src/modules/v4/claims/claims.controller.d.ts +40 -0
  16. package/dist/src/modules/v4/claims/claims.controller.js +13 -0
  17. package/dist/src/modules/v4/claims/claims.model.d.ts +9 -0
  18. package/dist/src/modules/v4/claims/claims.model.js +1 -0
  19. package/dist/src/modules/v4/claims/claims.repository.d.ts +5 -0
  20. package/dist/src/modules/v4/claims/claims.repository.js +39 -0
  21. package/dist/src/modules/v4/claims/claims.service.d.ts +8 -0
  22. package/dist/src/modules/v4/claims/claims.service.js +31 -0
  23. package/dist/src/modules/v4/claims/index.d.ts +3 -0
  24. package/dist/src/modules/v4/claims/index.js +3 -0
  25. package/dist/src/modules/v4/router.d.ts +24 -4
  26. package/dist/src/modules/v4/router.js +3 -1
  27. package/dist/src/modules/v4/token/token.controller.d.ts +4 -4
  28. package/dist/src/modules/v4/token/token.service.d.ts +4 -4
  29. package/dist/src/modules/v4/token/token.service.js +2 -2
  30. package/dist/src/modules/v4/user/user.model.d.ts +1 -0
  31. package/dist/src/routes/v3/blacklist.d.ts +24 -4
  32. package/dist/src/routes/v3/campaigns.d.ts +24 -4
  33. package/dist/src/routes/v3/campaignsInfo.d.ts +24 -4
  34. package/dist/src/routes/v3/multiChainPositions.d.ts +24 -4
  35. package/dist/src/routes/v3/opportunity.d.ts +24 -4
  36. package/dist/src/routes/v3/positions.d.ts +24 -4
  37. package/dist/src/routes/v3/rewards.d.ts +24 -4
  38. package/dist/src/routes/v3/updates.d.ts +24 -4
  39. package/dist/src/routes/v3/userRewards.d.ts +24 -4
  40. package/dist/src/utils/decodeCalls.js +5 -1
  41. package/dist/src/utils/encodeCalls.js +13 -1
  42. package/dist/src/utils/generateCardName.js +3 -1
  43. package/dist/tsconfig.package.tsbuildinfo +1 -1
  44. package/package.json +1 -1
@@ -788,7 +788,7 @@ declare const eden: {
788
788
  };
789
789
  fetch?: RequestInit | undefined;
790
790
  }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
791
- 200: {
791
+ 200: ({
792
792
  symbol: string;
793
793
  name: string | null;
794
794
  id: string;
@@ -796,11 +796,11 @@ declare const eden: {
796
796
  address: string;
797
797
  icon: string;
798
798
  decimals: number;
799
- displaySymbol: string;
800
799
  verified: boolean;
801
800
  isTest: boolean;
802
- price: number | null;
803
- }[];
801
+ } & {
802
+ price?: number | null | undefined;
803
+ })[];
804
804
  }>>;
805
805
  };
806
806
  count: {
@@ -1914,6 +1914,19 @@ declare const eden: {
1914
1914
  }>>;
1915
1915
  };
1916
1916
  };
1917
+ claims: ((params: {
1918
+ address: string | number;
1919
+ }) => {
1920
+ get: (options?: {
1921
+ headers?: Record<string, unknown> | undefined;
1922
+ query?: Record<string, unknown> | undefined;
1923
+ fetch?: RequestInit | undefined;
1924
+ } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
1925
+ 200: (import("../modules/v4/claims").ClaimModel & {
1926
+ token: import("../modules/v4").Token["model"];
1927
+ })[];
1928
+ }>>;
1929
+ }) & {};
1917
1930
  };
1918
1931
  };
1919
1932
  type Api = typeof eden;
@@ -2826,7 +2839,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
2826
2839
  };
2827
2840
  headers: unknown;
2828
2841
  response: {
2829
- 200: {
2842
+ 200: ({
2830
2843
  symbol: string;
2831
2844
  name: string | null;
2832
2845
  id: string;
@@ -2834,11 +2847,11 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
2834
2847
  address: string;
2835
2848
  icon: string;
2836
2849
  decimals: number;
2837
- displaySymbol: string;
2838
2850
  verified: boolean;
2839
2851
  isTest: boolean;
2840
- price: number | null;
2841
- }[];
2852
+ } & {
2853
+ price?: number | null | undefined;
2854
+ })[];
2842
2855
  };
2843
2856
  };
2844
2857
  };
@@ -4309,6 +4322,26 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
4309
4322
  };
4310
4323
  };
4311
4324
  };
4325
+ } & {
4326
+ v4: {
4327
+ claims: {
4328
+ ":address": {
4329
+ get: {
4330
+ body: unknown;
4331
+ params: {
4332
+ address: string;
4333
+ };
4334
+ query: unknown;
4335
+ headers: unknown;
4336
+ response: {
4337
+ 200: (import("../modules/v4/claims").ClaimModel & {
4338
+ token: import("../modules/v4").Token["model"];
4339
+ })[];
4340
+ };
4341
+ };
4342
+ };
4343
+ };
4344
+ };
4312
4345
  }, {
4313
4346
  derive: {};
4314
4347
  resolve: {};
@@ -5105,7 +5138,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
5105
5138
  };
5106
5139
  fetch?: RequestInit | undefined;
5107
5140
  }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
5108
- 200: {
5141
+ 200: ({
5109
5142
  symbol: string;
5110
5143
  name: string | null;
5111
5144
  id: string;
@@ -5113,11 +5146,11 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
5113
5146
  address: string;
5114
5147
  icon: string;
5115
5148
  decimals: number;
5116
- displaySymbol: string;
5117
5149
  verified: boolean;
5118
5150
  isTest: boolean;
5119
- price: number | null;
5120
- }[];
5151
+ } & {
5152
+ price?: number | null | undefined;
5153
+ })[];
5121
5154
  }>>;
5122
5155
  };
5123
5156
  count: {
@@ -6231,6 +6264,19 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
6231
6264
  }>>;
6232
6265
  };
6233
6266
  };
6267
+ claims: ((params: {
6268
+ address: string | number;
6269
+ }) => {
6270
+ get: (options?: {
6271
+ headers?: Record<string, unknown> | undefined;
6272
+ query?: Record<string, unknown> | undefined;
6273
+ fetch?: RequestInit | undefined;
6274
+ } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
6275
+ 200: (import("../modules/v4/claims").ClaimModel & {
6276
+ token: import("../modules/v4").Token["model"];
6277
+ })[];
6278
+ }>>;
6279
+ }) & {};
6234
6280
  };
6235
6281
  };
6236
6282
  export type Opportunity = FromPromise<Api["v4"]["opportunities"]["index"]["get"]>;
@@ -901,7 +901,7 @@ declare const app: Elysia<"", false, {
901
901
  };
902
902
  headers: unknown;
903
903
  response: {
904
- 200: {
904
+ 200: ({
905
905
  symbol: string;
906
906
  name: string | null;
907
907
  id: string;
@@ -909,11 +909,11 @@ declare const app: Elysia<"", false, {
909
909
  address: string;
910
910
  icon: string;
911
911
  decimals: number;
912
- displaySymbol: string;
913
912
  verified: boolean;
914
913
  isTest: boolean;
915
- price: number | null;
916
- }[];
914
+ } & {
915
+ price?: number | null | undefined;
916
+ })[];
917
917
  };
918
918
  };
919
919
  };
@@ -2384,6 +2384,26 @@ declare const app: Elysia<"", false, {
2384
2384
  };
2385
2385
  };
2386
2386
  };
2387
+ } & {
2388
+ v4: {
2389
+ claims: {
2390
+ ":address": {
2391
+ get: {
2392
+ body: unknown;
2393
+ params: {
2394
+ address: string;
2395
+ };
2396
+ query: unknown;
2397
+ headers: unknown;
2398
+ response: {
2399
+ 200: (import("./modules/v4/claims").ClaimModel & {
2400
+ token: import("./modules/v4").Token["model"];
2401
+ })[];
2402
+ };
2403
+ };
2404
+ };
2405
+ };
2406
+ };
2387
2407
  }, {
2388
2408
  derive: {};
2389
2409
  resolve: {};
@@ -64,7 +64,7 @@ export async function ERC20DynamicDataRefacto(chainId, campaigns) {
64
64
  calls: [],
65
65
  typeInfo: {},
66
66
  };
67
- typeStruct = getTokenTypeRound1(resultRound1, campaign.campaignParameters.targetToken, i);
67
+ typeStruct = getTokenTypeRound1(resultRound1, campaign.campaignParameters.targetToken, i, campaign);
68
68
  i += 5;
69
69
  tokenTypesByCampaign[campaign.campaignId] = typeStruct;
70
70
  callsRounds2.push(...typeStruct.calls);
@@ -124,8 +124,8 @@ export async function ERC20DynamicDataRefacto(chainId, campaigns) {
124
124
  const callsForCampaign = tokenTypesByCampaign[campaign.campaignId].calls.length;
125
125
  tokenTypesByCampaign[campaign.campaignId] = await getTokenPricesInfo(i, tokenTypesByCampaign[campaign.campaignId].type, tokenTypesByCampaign[campaign.campaignId].typeInfo, result, campaign, pricer);
126
126
  i += callsForCampaign;
127
- const totalSupplyTargetToken = tokenTypesByCampaign[campaign.campaignId].typeInfo.totalSupply;
128
127
  const whitelistedSupplyTargetToken = tokenTypesByCampaign[campaign.campaignId].typeInfo.whitelistedSupplyTargetToken;
128
+ const totalSupplyTargetToken = whitelistedSupplyTargetToken;
129
129
  const priceTargetToken = tokenTypesByCampaign[campaign.campaignId].typeInfo.priceTargetToken;
130
130
  let lastEligibilityRatio = 1;
131
131
  if (!!campaign.campaignParameters.hooks?.length) {
@@ -141,7 +141,7 @@ export async function ERC20DynamicDataRefacto(chainId, campaigns) {
141
141
  campaign.campaignParameters.duration /
142
142
  (whitelistedSupplyTargetToken * priceTargetToken),
143
143
  totalSupplyTargetToken,
144
- tvl: totalSupplyTargetToken * priceTargetToken,
144
+ tvl: whitelistedSupplyTargetToken * priceTargetToken,
145
145
  type: tokenTypesByCampaign[campaign.campaignId].type,
146
146
  typeInfo: tokenTypesByCampaign[campaign.campaignId].typeInfo,
147
147
  priceRewardToken: priceRewardToken,
@@ -57,7 +57,8 @@ export declare enum tokenType {
57
57
  pendleYT = "pendleYT",
58
58
  pancakeswap = "pancakeswap",
59
59
  tempestStaking = "tempestStaking",
60
- holdstation = "holdstation"
60
+ holdstation = "holdstation",
61
+ staking = "staking"
61
62
  }
62
63
  export declare const tokenTypeToProtocol: {
63
64
  [key in tokenType]: {
@@ -59,6 +59,7 @@ export var tokenType;
59
59
  tokenType["pancakeswap"] = "pancakeswap";
60
60
  tokenType["tempestStaking"] = "tempestStaking";
61
61
  tokenType["holdstation"] = "holdstation";
62
+ tokenType["staking"] = "staking";
62
63
  })(tokenType || (tokenType = {}));
63
64
  export const tokenTypeToProtocol = {
64
65
  [tokenType.aave_borrowing]: { protocol: "Aave" },
@@ -139,4 +140,7 @@ export const tokenTypeToProtocol = {
139
140
  [tokenType.holdstation]: {
140
141
  protocol: "HoldStation",
141
142
  },
143
+ [tokenType.staking]: {
144
+ protocol: "Staking",
145
+ },
142
146
  };
@@ -21,6 +21,7 @@ type callKeysAura = mandatoryCallKeys & {
21
21
  pid: string;
22
22
  gaugeBalance: string;
23
23
  auraBalance: string;
24
+ vaultBalance: string;
24
25
  };
25
26
  type dataRawAura = callKeysAura & {
26
27
  poolTokensRaw: Array<string[] | BigNumber[]>;
@@ -2,6 +2,7 @@ import { decodeCall } from "../../../../../utils/decodeCalls";
2
2
  import { createCall } from "../../../../../utils/encodeCalls";
3
3
  import { generateCardName } from "../../../../../utils/generateCardName";
4
4
  import { BN2Number } from "@sdk";
5
+ import { utils } from "ethers";
5
6
  import { GenericProcessor, roundType } from "./GenericProcessor";
6
7
  export class AuraProcessor extends GenericProcessor {
7
8
  rounds = {
@@ -21,6 +22,7 @@ export class AuraProcessor extends GenericProcessor {
21
22
  { key: "poolTokensRaw", call: "getPoolTokens", target: "vault", metaData: "poolId" },
22
23
  { key: "gaugeBalance", call: "balanceOf", target: "balancerPool", metaData: "gaugeContract" },
23
24
  { key: "auraBalance", call: "balanceOf", target: "gaugeContract", metaData: "auraStaker" },
25
+ { key: "vaultBalance", call: "balanceOf", target: "balancerPool", metaData: "vault" },
24
26
  { key: "totalSupplyGauge", call: "totalSupply", target: "gaugeContract" },
25
27
  ],
26
28
  round4: [{ key: "totalSupply", call: "totalSupply", target: "tokenAddress" }],
@@ -43,8 +45,15 @@ export class AuraProcessor extends GenericProcessor {
43
45
  }
44
46
  }
45
47
  async processingRound5(index, type, typeInfo, calls, campaign, pricer) {
46
- const { whitelistedSupplyTargetToken, totalSupply, blacklistedSupply } = this.handleWhiteListBlacklistRound5(typeInfo, campaign);
47
- const totalSupplyBalancerPool = BN2Number(typeInfo.totalSupplyBalancerPool, 18);
48
+ let { whitelistedSupplyTargetToken, totalSupply, blacklistedSupply } = this.handleWhiteListBlacklistRound5(typeInfo, campaign);
49
+ const vaultBalance = BN2Number(typeInfo.vaultBalance, 18);
50
+ const vaultIndex = campaign.campaignParameters.blacklist
51
+ ?.map(b => utils.getAddress(b))
52
+ ?.indexOf(utils.getAddress(typeInfo.vault));
53
+ if (vaultIndex !== -1) {
54
+ blacklistedSupply -= BN2Number(decodeCall(calls, index + vaultIndex, "balanceOf"), campaign.campaignParameters.decimalsTargetToken); // The vault balance was already removed from the total supply
55
+ }
56
+ const totalSupplyBalancerPool = BN2Number(typeInfo.totalSupplyBalancerPool, 18) - vaultBalance;
48
57
  const gaugeBalance = BN2Number(typeInfo.gaugeBalance, 18);
49
58
  const auraBalance = BN2Number(typeInfo.auraBalance, 18);
50
59
  const totalSupplyGauge = BN2Number(typeInfo.totalSupplyGauge, 18);
@@ -66,7 +75,7 @@ export class AuraProcessor extends GenericProcessor {
66
75
  }
67
76
  const percentageOfSupplyInAura = (auraBalance / totalSupplyGauge) * (gaugeBalance / totalSupplyBalancerPool);
68
77
  const tvl = poolTvl * percentageOfSupplyInAura;
69
- const priceTargetToken = tvl / totalSupply;
78
+ const priceTargetToken = tvl / totalSupplyBalancerPool;
70
79
  return {
71
80
  ...typeInfo,
72
81
  totalSupplyBalancerPool,
@@ -1,5 +1,5 @@
1
1
  import type { Pricer } from "../../../../../utils/pricer";
2
- import { type Campaign, type CampaignParameters } from "@sdk";
2
+ import type { Campaign, CampaignParameters } from "@sdk";
3
3
  import type { tokenType } from "../helpers/tokenType";
4
4
  import { GenericProcessor, type dataType, type mandatoryCallKeys } from "./GenericProcessor";
5
5
  type callType = {
@@ -1,5 +1,4 @@
1
1
  import { generateCardName } from "../../../../../utils/generateCardName";
2
- import { ChainId } from "@sdk";
3
2
  import { GenericProcessor } from "./GenericProcessor";
4
3
  export class PendleProcessor extends GenericProcessor {
5
4
  rounds = {
@@ -14,8 +13,7 @@ export class PendleProcessor extends GenericProcessor {
14
13
  async processingRound5(_index, type, typeInfo, _calls, campaign, pricer) {
15
14
  const { whitelistedSupplyTargetToken, totalSupply, blacklistedSupply } = this.handleWhiteListBlacklistRound5(typeInfo, campaign);
16
15
  const priceTargetToken = (await pricer.get({
17
- address: typeInfo.tokenAddress,
18
- chainId: ChainId.MAINNET,
16
+ symbol: typeInfo.tokenAddress,
19
17
  })) ?? 0;
20
18
  const tvl = priceTargetToken * totalSupply;
21
19
  return {
@@ -0,0 +1,39 @@
1
+ import type { Pricer } from "../../../../../utils/pricer";
2
+ import type { Campaign, CampaignParameters } from "@sdk";
3
+ import type { tokenType, tokenTypeStruct } from "../helpers/tokenType";
4
+ import { GenericProcessor, type dataType, type mandatoryCallKeys } from "./GenericProcessor";
5
+ type callType = {
6
+ key: keyof dataRawStaking;
7
+ call: string;
8
+ target: keyof callKeysStaking;
9
+ metaData?: keyof callKeysStaking;
10
+ optional?: boolean;
11
+ };
12
+ type callKeysStaking = mandatoryCallKeys & {
13
+ stakingContract: string;
14
+ lockNFT: string;
15
+ stakingSymbol: string;
16
+ };
17
+ type dataRawStaking = callKeysStaking & {
18
+ eip712DomainName: string;
19
+ };
20
+ type dataTypeStaking = dataType & {};
21
+ export declare class StakingProcessor extends GenericProcessor<callKeysStaking, dataRawStaking, dataTypeStaking> {
22
+ rounds: {
23
+ round1: callType[];
24
+ round2: callType[];
25
+ round3: callType[];
26
+ round4: callType[];
27
+ };
28
+ processingRound1(typeInfo: dataRawStaking): void;
29
+ processingRound2(typeInfo: dataRawStaking): void;
30
+ processingRound3(typeInfo: dataRawStaking): void;
31
+ processingRound4(typeInfo: dataRawStaking): void;
32
+ processingRound5(index: number, type: tokenType, typeInfo: dataRawStaking, calls: string[], campaign: CampaignParameters<Campaign.ERC20> | CampaignParameters<Campaign.EULER>, pricer: Pricer): Promise<dataTypeStaking>;
33
+ computeRound1(type: tokenType, typeInfo: dataRawStaking): tokenTypeStruct;
34
+ computeRound2(index: number, type: tokenType, typeInfo: dataRawStaking, calls: string[]): tokenTypeStruct;
35
+ computeRound3(index: number, type: tokenType, typeInfo: dataRawStaking, calls: string[]): tokenTypeStruct;
36
+ computeRound4(index: number, type: tokenType, typeInfo: dataRawStaking, calls: string[], campaign: CampaignParameters<Campaign.ERC20>): tokenTypeStruct;
37
+ computeRound5(index: number, type: tokenType, typeInfo: dataRawStaking, calls: string[], campaign: CampaignParameters<Campaign.ERC20> | CampaignParameters<Campaign.EULER>, pricer: Pricer): Promise<tokenTypeStruct>;
38
+ }
39
+ export {};
@@ -0,0 +1,45 @@
1
+ import { GenericProcessor } from "./GenericProcessor";
2
+ export class StakingProcessor extends GenericProcessor {
3
+ rounds = {
4
+ round1: [
5
+ { key: "lockNFT", call: "lockNFT", target: "stakingContract", optional: true },
6
+ { key: "eip712DomainName", call: "eip712DomainName", target: "stakingContract", optional: true },
7
+ ],
8
+ round2: [{ key: "stakingSymbol", call: "symbol", target: "lockNFT", optional: true }],
9
+ round3: [],
10
+ round4: [{ key: "totalSupply", call: "totalSupply", target: "tokenAddress" }],
11
+ };
12
+ // override computeRound1(): void {}
13
+ processingRound1(typeInfo) {
14
+ if (typeInfo.stakingContract === "0x18eeD20f71BEf84B605253C89A7576E3634134C0") {
15
+ typeInfo.stakingSymbol = "CyberStaking";
16
+ }
17
+ }
18
+ processingRound2(typeInfo) {
19
+ typeInfo.stakingSymbol = typeInfo.eip712DomainName;
20
+ }
21
+ processingRound3(typeInfo) {
22
+ super.processingRound3(typeInfo);
23
+ }
24
+ processingRound4(typeInfo) {
25
+ super.processingRound4(typeInfo);
26
+ }
27
+ async processingRound5(index, type, typeInfo, calls, campaign, pricer) {
28
+ return super.processingRound5(index, type, typeInfo, calls, campaign, pricer);
29
+ }
30
+ computeRound1(type, typeInfo) {
31
+ return super.computeRound1(type, typeInfo);
32
+ }
33
+ computeRound2(index, type, typeInfo, calls) {
34
+ return super.computeRound2(index, type, typeInfo, calls);
35
+ }
36
+ computeRound3(index, type, typeInfo, calls) {
37
+ return super.computeRound3(index, type, typeInfo, calls);
38
+ }
39
+ computeRound4(index, type, typeInfo, calls, campaign) {
40
+ return super.computeRound4(index, type, typeInfo, calls, campaign);
41
+ }
42
+ async computeRound5(index, type, typeInfo, calls, campaign, pricer) {
43
+ return super.computeRound5(index, type, typeInfo, calls, campaign, pricer);
44
+ }
45
+ }
@@ -21,6 +21,7 @@ import { PendleYTProcessor } from "./PendleYTProcessor";
21
21
  import { RadiantProcessor } from "./RadiantProcessor";
22
22
  import { RfxProcessor } from "./RfxProcessor";
23
23
  import { SpliceProcessor } from "./SpliceProcessor";
24
+ import { StakingProcessor } from "./StakingProcessor";
24
25
  import { SturdySiloProcessor } from "./SturdySiloProcessor";
25
26
  import { TempestVaultProcessor } from "./TempestVaultProcessor";
26
27
  import { TorosProcessor } from "./TorosProcessor";
@@ -88,4 +89,5 @@ export const processorMapping = {
88
89
  [tokenType.pancakeswap]: UniswapProcessor,
89
90
  [tokenType.tempestStaking]: TempestVaultProcessor,
90
91
  [tokenType.holdstation]: HoldStationProcessor,
92
+ [tokenType.staking]: StakingProcessor,
91
93
  };
@@ -1,3 +1,4 @@
1
+ import type { Campaign, CampaignParameters } from "@sdk";
1
2
  import type { Multicall3 } from "libs/sdk/src/generated/Multicall";
2
3
  import { type tokenTypeStruct } from "./helpers/tokenType";
3
- export declare function getTokenTypeRound1(calls: Multicall3.ResultStructOutput[], targetToken: string, index: number): tokenTypeStruct;
4
+ export declare function getTokenTypeRound1(calls: Multicall3.ResultStructOutput[], targetToken: string, index: number, campaign: CampaignParameters<Campaign.ERC20> | CampaignParameters<Campaign.EULER>): tokenTypeStruct;
@@ -179,7 +179,27 @@ function parseForBalancer(calls, index, targetToken, name) {
179
179
  // Not a balancer pool
180
180
  }
181
181
  }
182
- export function getTokenTypeRound1(calls, targetToken, index) {
182
+ function parseForStaking(campaign, calls, index, targetToken) {
183
+ try {
184
+ const whitelist = campaign.campaignParameters.whitelist;
185
+ console.log("whitelist", whitelist, whitelist.length);
186
+ if (whitelist.length === 1) {
187
+ const forwarders = campaign.campaignParameters.forwarders;
188
+ console.log("forwarders", forwarders);
189
+ if (forwarders.length === 1) {
190
+ if (forwarders[0].sender === whitelist[0]) {
191
+ const name = decodeCall(calls, index + 2, "name");
192
+ return generateResult(tokenType.staking, name, targetToken, { stakingContract: whitelist[0] });
193
+ }
194
+ }
195
+ }
196
+ }
197
+ catch (e) {
198
+ // No factory on this token
199
+ // console.log(e);
200
+ }
201
+ }
202
+ export function getTokenTypeRound1(calls, targetToken, index, campaign) {
183
203
  const returnValueOfCalls = calls.map(call => call.returnData);
184
204
  let result = parseForFactory(returnValueOfCalls, index, targetToken);
185
205
  if (result)
@@ -188,6 +208,10 @@ export function getTokenTypeRound1(calls, targetToken, index) {
188
208
  if (result)
189
209
  return result;
190
210
  result = parseForMetamorpho(returnValueOfCalls, index, targetToken);
211
+ if (result)
212
+ return result;
213
+ console.log("parsing for staking");
214
+ result = parseForStaking(campaign, returnValueOfCalls, index, targetToken);
191
215
  if (result)
192
216
  return result;
193
217
  let name;
@@ -0,0 +1,40 @@
1
+ import Elysia from "elysia";
2
+ export declare const ClaimController: Elysia<"/claims", false, {
3
+ decorator: {};
4
+ store: {};
5
+ derive: {};
6
+ resolve: {};
7
+ }, {
8
+ type: {};
9
+ error: {};
10
+ }, {
11
+ schema: {};
12
+ macro: {};
13
+ macroFn: {};
14
+ }, {
15
+ claims: {
16
+ ":address": {
17
+ get: {
18
+ body: unknown;
19
+ params: {
20
+ address: string;
21
+ };
22
+ query: unknown;
23
+ headers: unknown;
24
+ response: {
25
+ 200: (import("./claims.model").ClaimModel & {
26
+ token: import("..").Token["model"];
27
+ })[];
28
+ };
29
+ };
30
+ };
31
+ };
32
+ }, {
33
+ derive: {};
34
+ resolve: {};
35
+ schema: {};
36
+ }, {
37
+ derive: {};
38
+ resolve: {};
39
+ schema: {};
40
+ }>;
@@ -0,0 +1,13 @@
1
+ import { throwOnInvalidRequiredAddress } from "../../../utils/throw";
2
+ import Elysia from "elysia";
3
+ import { UserUniqueDto } from "../user";
4
+ import { ClaimService } from "./claims.service";
5
+ // ─── Claim Controller ───────────────────────────────────────────────────────
6
+ export const ClaimController = new Elysia({ prefix: "/claims", detail: { tags: ["Claims"] } })
7
+ // ─── Get Historical Claims ────────────────────────────────────────────
8
+ .get("/:address", async ({ params }) => await ClaimService.getHistoricalClaims(params), {
9
+ params: UserUniqueDto,
10
+ beforeHandle: ({ params }) => {
11
+ params.address = throwOnInvalidRequiredAddress(params.address);
12
+ },
13
+ });
@@ -0,0 +1,9 @@
1
+ export type ClaimModel = {
2
+ timestamp: number;
3
+ token: string;
4
+ user: string;
5
+ amount: string;
6
+ rawAmount: string;
7
+ root: string;
8
+ txHash?: string;
9
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import { type MerklChainId } from "@sdk";
2
+ import type { ClaimModel } from "./claims.model";
3
+ export declare class ClaimRepository {
4
+ static fetch(chainId: MerklChainId, address: string): Promise<ClaimModel[]>;
5
+ }
@@ -0,0 +1,39 @@
1
+ import { merklSubgraphClaimsEndpoints } from "@sdk";
2
+ import request, { gql } from "graphql-request";
3
+ export class ClaimRepository {
4
+ static async fetch(chainId, address) {
5
+ try {
6
+ return (await request(merklSubgraphClaimsEndpoints[chainId],
7
+ // Request is limited to first 100 by default so needs to be sorted
8
+ gql `query MerklClaims($user: String) {
9
+ merklClaims(where: {user: $user }, orderBy: timestamp, orderDirection: desc) {
10
+ timestamp
11
+ token
12
+ user
13
+ amount
14
+ rawAmount
15
+ root
16
+ id
17
+ txHash
18
+ }
19
+ }
20
+ `, { user: address?.toLowerCase() })).merklClaims;
21
+ }
22
+ catch {
23
+ return (await request(merklSubgraphClaimsEndpoints[chainId],
24
+ // Request is limited to first 100 by default so needs to be sorted
25
+ gql `query MerklClaims($user: String) {
26
+ merklClaims(where: {user: $user }, orderBy: timestamp, orderDirection: desc) {
27
+ timestamp
28
+ token
29
+ user
30
+ amount
31
+ rawAmount
32
+ root
33
+ id
34
+ }
35
+ }
36
+ `, { user: address?.toLowerCase() })).merklClaims;
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,8 @@
1
+ import type { Token } from "../token";
2
+ import type { UserUniqueModel } from "../user";
3
+ import type { ClaimModel } from "./claims.model";
4
+ export declare abstract class ClaimService {
5
+ static getHistoricalClaims(params: UserUniqueModel): Promise<(ClaimModel & {
6
+ token: Token["model"];
7
+ })[]>;
8
+ }
@@ -0,0 +1,31 @@
1
+ import { MerklRootService } from "../merklRoot";
2
+ import { RewardService } from "../reward";
3
+ import { ClaimRepository } from "./claims.repository";
4
+ export class ClaimService {
5
+ // ─── Get Historical Claims ─────────────────────────────────────────────────
6
+ static async getHistoricalClaims(params) {
7
+ const roots = (await MerklRootService.fetchAll()).map(r => r.live);
8
+ const rewards = await RewardService.getByRecipient(params.address, roots, true);
9
+ const chainIds = [];
10
+ for (const reward of rewards) {
11
+ if (!chainIds.includes(reward.RewardToken.chainId)) {
12
+ chainIds.push(reward.RewardToken.chainId);
13
+ }
14
+ }
15
+ const tokens = rewards.reduce((acc, reward) => {
16
+ acc[reward.RewardToken.address.toLowerCase()] = reward.RewardToken;
17
+ return acc;
18
+ }, {});
19
+ const promises = await Promise.allSettled(chainIds.map(chainId => ClaimRepository.fetch(chainId, params.address)));
20
+ const claims = await promises
21
+ .filter(p => p.status === "fulfilled")
22
+ .flatMap(p => p.value)
23
+ .map(claim => {
24
+ return {
25
+ ...claim,
26
+ token: tokens[claim.token.toLowerCase()],
27
+ };
28
+ });
29
+ return claims.sort((a, b) => Number(b.timestamp) - Number(a.timestamp));
30
+ }
31
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./claims.model";
2
+ export * from "./claims.service";
3
+ export * from "./claims.controller";
@@ -0,0 +1,3 @@
1
+ export * from "./claims.model";
2
+ export * from "./claims.service";
3
+ export * from "./claims.controller";