@merkl/api 0.20.120 → 0.20.122

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.
@@ -2308,7 +2308,33 @@ declare const eden: {
2308
2308
  price: number | null;
2309
2309
  }[];
2310
2310
  }>>;
2311
- }) & {};
2311
+ }) & {
2312
+ get: (options?: {
2313
+ headers?: Record<string, unknown> | undefined;
2314
+ query?: Record<string, unknown> | undefined;
2315
+ fetch?: RequestInit | undefined;
2316
+ } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
2317
+ 200: {
2318
+ [x: number]: {
2319
+ minimumAmountPerHour: any;
2320
+ symbol: string;
2321
+ id: string;
2322
+ name: string | null;
2323
+ icon: string;
2324
+ address: string;
2325
+ chainId: number;
2326
+ decimals: number;
2327
+ displaySymbol: string;
2328
+ verified: boolean;
2329
+ isTest: boolean;
2330
+ isPoint: boolean;
2331
+ isPreTGE: boolean;
2332
+ isNative: boolean;
2333
+ price: number | null;
2334
+ }[];
2335
+ };
2336
+ }>>;
2337
+ };
2312
2338
  balances: {
2313
2339
  get: (options: {
2314
2340
  headers?: Record<string, unknown> | undefined;
@@ -4570,7 +4596,7 @@ declare const eden: {
4570
4596
  get: (options: {
4571
4597
  headers?: Record<string, unknown> | undefined;
4572
4598
  query: {
4573
- types?: string | number | string[] | number[] | undefined;
4599
+ types?: string | number | number[] | string[] | undefined;
4574
4600
  chainIds?: string | string[] | undefined;
4575
4601
  creatorTag?: string | undefined;
4576
4602
  live?: boolean | undefined;
@@ -7811,6 +7837,36 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
7811
7837
  };
7812
7838
  };
7813
7839
  };
7840
+ } & {
7841
+ reward: {
7842
+ get: {
7843
+ body: unknown;
7844
+ params: {};
7845
+ query: unknown;
7846
+ headers: unknown;
7847
+ response: {
7848
+ 200: {
7849
+ [x: number]: {
7850
+ minimumAmountPerHour: any;
7851
+ symbol: string;
7852
+ id: string;
7853
+ name: string | null;
7854
+ icon: string;
7855
+ address: string;
7856
+ chainId: number;
7857
+ decimals: number;
7858
+ displaySymbol: string;
7859
+ verified: boolean;
7860
+ isTest: boolean;
7861
+ isPoint: boolean;
7862
+ isPreTGE: boolean;
7863
+ isNative: boolean;
7864
+ price: number | null;
7865
+ }[];
7866
+ };
7867
+ };
7868
+ };
7869
+ };
7814
7870
  } & {
7815
7871
  reward: {
7816
7872
  ":chainId": {
@@ -10775,7 +10831,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
10775
10831
  body: unknown;
10776
10832
  params: {};
10777
10833
  query: {
10778
- types?: string | number | string[] | number[] | undefined;
10834
+ types?: string | number | number[] | string[] | undefined;
10779
10835
  chainIds?: string | string[] | undefined;
10780
10836
  creatorTag?: string | undefined;
10781
10837
  live?: boolean | undefined;
@@ -13833,7 +13889,33 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
13833
13889
  price: number | null;
13834
13890
  }[];
13835
13891
  }>>;
13836
- }) & {};
13892
+ }) & {
13893
+ get: (options?: {
13894
+ headers?: Record<string, unknown> | undefined;
13895
+ query?: Record<string, unknown> | undefined;
13896
+ fetch?: RequestInit | undefined;
13897
+ } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
13898
+ 200: {
13899
+ [x: number]: {
13900
+ minimumAmountPerHour: any;
13901
+ symbol: string;
13902
+ id: string;
13903
+ name: string | null;
13904
+ icon: string;
13905
+ address: string;
13906
+ chainId: number;
13907
+ decimals: number;
13908
+ displaySymbol: string;
13909
+ verified: boolean;
13910
+ isTest: boolean;
13911
+ isPoint: boolean;
13912
+ isPreTGE: boolean;
13913
+ isNative: boolean;
13914
+ price: number | null;
13915
+ }[];
13916
+ };
13917
+ }>>;
13918
+ };
13837
13919
  balances: {
13838
13920
  get: (options: {
13839
13921
  headers?: Record<string, unknown> | undefined;
@@ -16095,7 +16177,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
16095
16177
  get: (options: {
16096
16178
  headers?: Record<string, unknown> | undefined;
16097
16179
  query: {
16098
- types?: string | number | string[] | number[] | undefined;
16180
+ types?: string | number | number[] | string[] | undefined;
16099
16181
  chainIds?: string | string[] | undefined;
16100
16182
  creatorTag?: string | undefined;
16101
16183
  live?: boolean | undefined;
@@ -2662,6 +2662,36 @@ declare const app: Elysia<"", false, {
2662
2662
  };
2663
2663
  };
2664
2664
  };
2665
+ } & {
2666
+ reward: {
2667
+ get: {
2668
+ body: unknown;
2669
+ params: {};
2670
+ query: unknown;
2671
+ headers: unknown;
2672
+ response: {
2673
+ 200: {
2674
+ [x: number]: {
2675
+ minimumAmountPerHour: any;
2676
+ symbol: string;
2677
+ id: string;
2678
+ name: string | null;
2679
+ icon: string;
2680
+ address: string;
2681
+ chainId: number;
2682
+ decimals: number;
2683
+ displaySymbol: string;
2684
+ verified: boolean;
2685
+ isTest: boolean;
2686
+ isPoint: boolean;
2687
+ isPreTGE: boolean;
2688
+ isNative: boolean;
2689
+ price: number | null;
2690
+ }[];
2691
+ };
2692
+ };
2693
+ };
2694
+ };
2665
2695
  } & {
2666
2696
  reward: {
2667
2697
  ":chainId": {
@@ -5626,7 +5656,7 @@ declare const app: Elysia<"", false, {
5626
5656
  body: unknown;
5627
5657
  params: {};
5628
5658
  query: {
5629
- types?: string | number | string[] | number[] | undefined;
5659
+ types?: string | number | number[] | string[] | undefined;
5630
5660
  chainIds?: string | string[] | undefined;
5631
5661
  creatorTag?: string | undefined;
5632
5662
  live?: boolean | undefined;
@@ -41,7 +41,7 @@ export async function getOnlyUserBalance(chainId, userAddress, tokenAddresses) {
41
41
  return res;
42
42
  }
43
43
  export async function getUserBalances(user, chainId, tokenAddresses) {
44
- const tokens = await TokenService.findManyObjectPerAddress({ chainId, verified: true });
44
+ const tokens = await TokenService.findManyObjectPerAddress({ chainId, verified: true, items: 0 });
45
45
  if (!tokens) {
46
46
  log.debug("❌ Chain not supported");
47
47
  return {
@@ -34,13 +34,12 @@ export class MerklRootService {
34
34
  const merkleRootsPromises = await Promise.allSettled(ids.map(chainId => MerklRootService.fetchFromCache(chainId)));
35
35
  /** Filter out unsuccessful chainIds */
36
36
  ids = ids.filter((_, index) => merkleRootsPromises[index].status === "fulfilled");
37
- const roots = merkleRootsPromises
37
+ return merkleRootsPromises
38
38
  .filter(({ status }) => status === "fulfilled")
39
39
  .reduce((acc, promise, index) => {
40
40
  acc[ids[index]] = promise.value;
41
41
  return acc;
42
42
  }, {});
43
- return roots;
44
43
  });
45
44
  }
46
45
  static async create(x) {
@@ -2532,6 +2532,36 @@ export declare const v4: Elysia<"/v4", false, {
2532
2532
  };
2533
2533
  };
2534
2534
  };
2535
+ } & {
2536
+ reward: {
2537
+ get: {
2538
+ body: unknown;
2539
+ params: {};
2540
+ query: unknown;
2541
+ headers: unknown;
2542
+ response: {
2543
+ 200: {
2544
+ [x: number]: {
2545
+ minimumAmountPerHour: any;
2546
+ symbol: string;
2547
+ id: string;
2548
+ name: string | null;
2549
+ icon: string;
2550
+ address: string;
2551
+ chainId: number;
2552
+ decimals: number;
2553
+ displaySymbol: string;
2554
+ verified: boolean;
2555
+ isTest: boolean;
2556
+ isPoint: boolean;
2557
+ isPreTGE: boolean;
2558
+ isNative: boolean;
2559
+ price: number | null;
2560
+ }[];
2561
+ };
2562
+ };
2563
+ };
2564
+ };
2535
2565
  } & {
2536
2566
  reward: {
2537
2567
  ":chainId": {
@@ -77,6 +77,36 @@ export declare const TokenController: Elysia<"/tokens", false, {
77
77
  };
78
78
  };
79
79
  };
80
+ } & {
81
+ reward: {
82
+ get: {
83
+ body: unknown;
84
+ params: {};
85
+ query: unknown;
86
+ headers: unknown;
87
+ response: {
88
+ 200: {
89
+ [x: number]: {
90
+ minimumAmountPerHour: any;
91
+ symbol: string;
92
+ id: string;
93
+ name: string | null;
94
+ icon: string;
95
+ address: string;
96
+ chainId: number;
97
+ decimals: number;
98
+ displaySymbol: string;
99
+ verified: boolean;
100
+ isTest: boolean;
101
+ isPoint: boolean;
102
+ isPreTGE: boolean;
103
+ isNative: boolean;
104
+ price: number | null;
105
+ }[];
106
+ };
107
+ };
108
+ };
109
+ };
80
110
  } & {
81
111
  reward: {
82
112
  ":chainId": {
@@ -40,7 +40,13 @@ export const TokenController = new Elysia({ prefix: "/tokens", detail: { tags: [
40
40
  hide: true,
41
41
  },
42
42
  })
43
- // ─── Get Valid Reward Token ───────────────────────────────────────────
43
+ // ─── Get All Valid Reward Tokens across all chains ───────────────────
44
+ .get("/reward", async () => TokenService.getAllValidRewardTokens(), {
45
+ detail: {
46
+ description: "Get all tokens that are accept as reward tokens",
47
+ },
48
+ })
49
+ // ─── Get Valid Reward Tokens on a given chain ────────────────────────
44
50
  .get("/reward/:chainId", async ({ params }) => TokenService.getValidRewardTokens(params.chainId), {
45
51
  params: t.Object({
46
52
  chainId: t.Numeric(),
@@ -6,7 +6,7 @@ export class TokenRepository {
6
6
  const ids = query.id ? query.id.map(id => ({ id })) : [];
7
7
  const { page: _page, items: _items } = query;
8
8
  const page = _page ? _page : 0;
9
- const items = _items !== undefined ? _items : 100;
9
+ const items = _items === 0 ? 10_000 : _items !== undefined ? _items : 100;
10
10
  return {
11
11
  take: items === 0 ? undefined : items,
12
12
  skip: page * items,
@@ -246,6 +246,23 @@ export declare abstract class TokenService {
246
246
  } & {
247
247
  price?: number | null | undefined;
248
248
  })[]>;
249
+ static getAllValidRewardTokens(): Promise<Record<number, {
250
+ minimumAmountPerHour: any;
251
+ symbol: string;
252
+ id: string;
253
+ name: string | null;
254
+ icon: string;
255
+ address: string;
256
+ chainId: number;
257
+ decimals: number;
258
+ displaySymbol: string;
259
+ verified: boolean;
260
+ isTest: boolean;
261
+ isPoint: boolean;
262
+ isPreTGE: boolean;
263
+ isNative: boolean;
264
+ price: number | null;
265
+ }[]>>;
249
266
  static getValidRewardTokens(chainId: number): Promise<{
250
267
  minimumAmountPerHour: any;
251
268
  symbol: string;
@@ -9,8 +9,9 @@ import { PriceService } from "@/modules/v4/price/price.service";
9
9
  import { log } from "@/utils/logger";
10
10
  import { throwOnInvalidRequiredAddress, throwOnUnsupportedChainId } from "@/utils/throw";
11
11
  import { Prisma } from "@db/api";
12
- import { ChainInteractionService, DistributionCreatorService, NETWORK_LABELS, NULL_ADDRESS, bigIntToNumber, } from "@sdk";
12
+ import { ChainInteractionService, DistributionCreatorService, NETWORK_LABELS, NULL_ADDRESS, bigIntToNumber, withTimeout, } from "@sdk";
13
13
  import { getAddress, isAddress, parseUnits } from "viem";
14
+ import { ChainService } from "../chain/chain.service";
14
15
  import { TokenRepository } from "./token.repository";
15
16
  export class TokenService {
16
17
  static hashId(token) {
@@ -206,8 +207,8 @@ export class TokenService {
206
207
  * @returns A list of tokens
207
208
  */
208
209
  static async findManyOrFetch(query) {
209
- const foundTokens = (await TokenRepository.findMany(query)).map(TokenService.format);
210
210
  const isTokenAddress = query.chainId && query.search && isAddress(query.search);
211
+ const foundTokens = (await TokenRepository.findMany(isTokenAddress ? { ...query, address: query.search } : query)).map(TokenService.format);
211
212
  if (isTokenAddress &&
212
213
  !foundTokens.some(t => TokenService.isSame(t, { chainId: query.chainId, address: query.search }))) {
213
214
  const token = await TokenService.fetchOnChain({ chainId: query.chainId, address: query.search });
@@ -298,6 +299,23 @@ export class TokenService {
298
299
  }
299
300
  }));
300
301
  }
302
+ static async getAllValidRewardTokens() {
303
+ return await CacheService.wrap(TTLPresets.MIN_5, async () => {
304
+ let chains = await ChainService.findMany({
305
+ test: true,
306
+ });
307
+ /** Fetch current Merkle Roots */
308
+ const promises = await Promise.allSettled(chains.map(chain => withTimeout(TokenService.getValidRewardTokens(chain.id), 5_000)));
309
+ /** Filter out unsuccessful chainIds */
310
+ chains = chains.filter((_, index) => promises[index].status === "fulfilled");
311
+ return promises
312
+ .filter(({ status }) => status === "fulfilled")
313
+ .reduce((acc, promise, index) => {
314
+ acc[chains[index].id] = promise.value;
315
+ return acc;
316
+ }, {});
317
+ });
318
+ }
301
319
  static async getValidRewardTokens(chainId) {
302
320
  const validRewardTokens = await DistributionCreatorService(chainId).validRewardTokens();
303
321
  return (await TokenRepository.findList(chainId, validRewardTokens.map(t => getAddress(t.token)))).map(x => {
@@ -33,7 +33,7 @@ declare const _default: (app: Elysia) => Elysia<"", false, {
33
33
  body: unknown;
34
34
  params: {};
35
35
  query: {
36
- types?: string | number | string[] | number[] | undefined;
36
+ types?: string | number | number[] | string[] | undefined;
37
37
  chainIds?: string | string[] | undefined;
38
38
  creatorTag?: string | undefined;
39
39
  live?: boolean | undefined;
@@ -74,7 +74,7 @@ export declare const v3: Elysia<"/v3", false, {
74
74
  body: unknown;
75
75
  params: {};
76
76
  query: {
77
- types?: string | number | string[] | number[] | undefined;
77
+ types?: string | number | number[] | string[] | undefined;
78
78
  chainIds?: string | string[] | undefined;
79
79
  creatorTag?: string | undefined;
80
80
  live?: boolean | undefined;