@merkl/api 0.10.342 → 0.10.343

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.
@@ -1022,6 +1022,30 @@ declare const eden: {
1022
1022
  };
1023
1023
  }>>;
1024
1024
  }) & {
1025
+ reward: ((params: {
1026
+ chainId: string | number;
1027
+ }) => {
1028
+ get: (options?: {
1029
+ headers?: Record<string, unknown> | undefined;
1030
+ query?: Record<string, unknown> | undefined;
1031
+ fetch?: RequestInit | undefined;
1032
+ } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
1033
+ 200: {
1034
+ minimumAmountPerHour: any;
1035
+ symbol: string;
1036
+ name: string | null;
1037
+ id: string;
1038
+ icon: string;
1039
+ chainId: number;
1040
+ address: string;
1041
+ decimals: number;
1042
+ displaySymbol: string;
1043
+ verified: boolean;
1044
+ isTest: boolean;
1045
+ price: number | null;
1046
+ }[];
1047
+ }>>;
1048
+ }) & {};
1025
1049
  balances: {
1026
1050
  get: (options: {
1027
1051
  headers?: Record<string, unknown> | undefined;
@@ -4295,6 +4319,37 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
4295
4319
  };
4296
4320
  };
4297
4321
  };
4322
+ } & {
4323
+ tokens: {
4324
+ reward: {
4325
+ ":chainId": {
4326
+ get: {
4327
+ body: unknown;
4328
+ params: {
4329
+ chainId: number;
4330
+ };
4331
+ query: unknown;
4332
+ headers: unknown;
4333
+ response: {
4334
+ 200: {
4335
+ minimumAmountPerHour: any;
4336
+ symbol: string;
4337
+ name: string | null;
4338
+ id: string;
4339
+ icon: string;
4340
+ chainId: number;
4341
+ address: string;
4342
+ decimals: number;
4343
+ displaySymbol: string;
4344
+ verified: boolean;
4345
+ isTest: boolean;
4346
+ price: number | null;
4347
+ }[];
4348
+ };
4349
+ };
4350
+ };
4351
+ };
4352
+ };
4298
4353
  } & {
4299
4354
  tokens: {
4300
4355
  balances: {
@@ -8016,6 +8071,30 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
8016
8071
  };
8017
8072
  }>>;
8018
8073
  }) & {
8074
+ reward: ((params: {
8075
+ chainId: string | number;
8076
+ }) => {
8077
+ get: (options?: {
8078
+ headers?: Record<string, unknown> | undefined;
8079
+ query?: Record<string, unknown> | undefined;
8080
+ fetch?: RequestInit | undefined;
8081
+ } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
8082
+ 200: {
8083
+ minimumAmountPerHour: any;
8084
+ symbol: string;
8085
+ name: string | null;
8086
+ id: string;
8087
+ icon: string;
8088
+ chainId: number;
8089
+ address: string;
8090
+ decimals: number;
8091
+ displaySymbol: string;
8092
+ verified: boolean;
8093
+ isTest: boolean;
8094
+ price: number | null;
8095
+ }[];
8096
+ }>>;
8097
+ }) & {};
8019
8098
  balances: {
8020
8099
  get: (options: {
8021
8100
  headers?: Record<string, unknown> | undefined;
@@ -1188,6 +1188,37 @@ declare const app: Elysia<"", false, {
1188
1188
  };
1189
1189
  };
1190
1190
  };
1191
+ } & {
1192
+ tokens: {
1193
+ reward: {
1194
+ ":chainId": {
1195
+ get: {
1196
+ body: unknown;
1197
+ params: {
1198
+ chainId: number;
1199
+ };
1200
+ query: unknown;
1201
+ headers: unknown;
1202
+ response: {
1203
+ 200: {
1204
+ minimumAmountPerHour: any;
1205
+ symbol: string;
1206
+ name: string | null;
1207
+ id: string;
1208
+ icon: string;
1209
+ chainId: number;
1210
+ address: string;
1211
+ decimals: number;
1212
+ displaySymbol: string;
1213
+ verified: boolean;
1214
+ isTest: boolean;
1215
+ price: number | null;
1216
+ }[];
1217
+ };
1218
+ };
1219
+ };
1220
+ };
1221
+ };
1191
1222
  } & {
1192
1223
  tokens: {
1193
1224
  balances: {
@@ -1066,6 +1066,37 @@ export declare const v4: Elysia<"/v4", false, {
1066
1066
  };
1067
1067
  };
1068
1068
  };
1069
+ } & {
1070
+ tokens: {
1071
+ reward: {
1072
+ ":chainId": {
1073
+ get: {
1074
+ body: unknown;
1075
+ params: {
1076
+ chainId: number;
1077
+ };
1078
+ query: unknown;
1079
+ headers: unknown;
1080
+ response: {
1081
+ 200: {
1082
+ minimumAmountPerHour: any;
1083
+ symbol: string;
1084
+ name: string | null;
1085
+ id: string;
1086
+ icon: string;
1087
+ chainId: number;
1088
+ address: string;
1089
+ decimals: number;
1090
+ displaySymbol: string;
1091
+ verified: boolean;
1092
+ isTest: boolean;
1093
+ price: number | null;
1094
+ }[];
1095
+ };
1096
+ };
1097
+ };
1098
+ };
1099
+ };
1069
1100
  } & {
1070
1101
  tokens: {
1071
1102
  balances: {
@@ -38,6 +38,37 @@ export declare const TokenController: Elysia<"/tokens", false, {
38
38
  };
39
39
  };
40
40
  };
41
+ } & {
42
+ tokens: {
43
+ reward: {
44
+ ":chainId": {
45
+ get: {
46
+ body: unknown;
47
+ params: {
48
+ chainId: number;
49
+ };
50
+ query: unknown;
51
+ headers: unknown;
52
+ response: {
53
+ 200: {
54
+ minimumAmountPerHour: any;
55
+ symbol: string;
56
+ name: string | null;
57
+ id: string;
58
+ icon: string;
59
+ chainId: number;
60
+ address: string;
61
+ decimals: number;
62
+ displaySymbol: string;
63
+ verified: boolean;
64
+ isTest: boolean;
65
+ price: number | null;
66
+ }[];
67
+ };
68
+ };
69
+ };
70
+ };
71
+ };
41
72
  } & {
42
73
  tokens: {
43
74
  balances: {
@@ -2,6 +2,7 @@ import { NotFoundError } from "../../../errors/NotFound.error";
2
2
  import { AuthorizationHeadersDto, BackOfficeGuard } from "../../../guards/BackOffice.guard";
3
3
  import { throwOnInvalidRequiredAddress, throwOnUnsupportedChainId } from "../../../utils/throw";
4
4
  import Elysia from "elysia";
5
+ import { ChainDto } from "../accounting";
5
6
  import { CreateTokenDto, FindUniqueTokenDto, GetTokenBalanceDto, GetTokenQueryDto, TokenIdDto, UpdateTokenDto, } from "./token.model";
6
7
  import { TokenService } from "./token.service";
7
8
  // ─── Tokens Controller ───────────────────────────────────────────────────────
@@ -17,6 +18,11 @@ export const TokenController = new Elysia({ prefix: "/tokens", detail: { tags: [
17
18
  throw new NotFoundError();
18
19
  }
19
20
  }, { params: FindUniqueTokenDto })
21
+ // ─── Get Valid Reward Token ───────────────────────────────────────────
22
+ .get("/reward/:chainId", async ({ params }) => TokenService.getValidRewardTokens(params.chainId), {
23
+ params: ChainDto,
24
+ beforeHandle: ({ params }) => throwOnUnsupportedChainId(params.chainId),
25
+ })
20
26
  // ─── Get Tokens With Balances ────────────────────────────────────────
21
27
  .get("/balances", async ({ query: { chainId, userAddress, tokenAddress, additionalTokenAddresses } }) => {
22
28
  if (tokenAddress)
@@ -42,6 +42,19 @@ export declare abstract class TokenRepository {
42
42
  isTest: boolean;
43
43
  price: number | null;
44
44
  }[]>;
45
+ static findList(chainId: number, addresses: string[]): Promise<{
46
+ symbol: string;
47
+ name: string | null;
48
+ id: string;
49
+ icon: string;
50
+ chainId: number;
51
+ address: string;
52
+ decimals: number;
53
+ displaySymbol: string;
54
+ verified: boolean;
55
+ isTest: boolean;
56
+ price: number | null;
57
+ }[]>;
45
58
  static countMany(query: GetTokenQueryModel): Promise<number>;
46
59
  /**
47
60
  * upsert a token on database
@@ -67,6 +67,17 @@ export class TokenRepository {
67
67
  });
68
68
  return tokens;
69
69
  }
70
+ static async findList(chainId, addresses) {
71
+ const tokens = await apiDbClient.token.findMany({
72
+ where: {
73
+ chainId,
74
+ address: {
75
+ in: addresses,
76
+ },
77
+ },
78
+ });
79
+ return tokens;
80
+ }
70
81
  static async countMany(query) {
71
82
  const args = TokenRepository.#transformQueryToPrismaFilters(query);
72
83
  return await apiDbClient.token.count(args);
@@ -188,6 +188,20 @@ export declare abstract class TokenService {
188
188
  * @param address
189
189
  */
190
190
  static getManyOrCreate(tokens: TokenModel[]): Promise<(Token["model"] | undefined)[]>;
191
+ static getValidRewardTokens(chainId: number): Promise<{
192
+ minimumAmountPerHour: any;
193
+ symbol: string;
194
+ name: string | null;
195
+ id: string;
196
+ icon: string;
197
+ chainId: number;
198
+ address: string;
199
+ decimals: number;
200
+ displaySymbol: string;
201
+ verified: boolean;
202
+ isTest: boolean;
203
+ price: number | null;
204
+ }[]>;
191
205
  static update(id: string, data: UpdateTokenModel): Promise<{
192
206
  symbol: string;
193
207
  name: string | null;
@@ -3,8 +3,10 @@ import { getOnlyUserBalance } from "../../../libs/tokens/balances";
3
3
  import { log } from "../../../utils/logger";
4
4
  import { apiDbClient } from "../../../utils/prisma";
5
5
  import { Prisma } from "../../../../database/api/.generated";
6
- import { NETWORK_LABELS, bigIntToNumber } from "@sdk";
7
- import { parseUnits } from "viem";
6
+ import { DistributionCreatorService, NETWORK_LABELS, bigIntToNumber } from "@sdk";
7
+ import { getAddress, parseUnits } from "viem";
8
+ import { CacheService } from "../cache";
9
+ import { TTLPresets } from "../cache/cache.model";
8
10
  import { TokenRepository } from "./token.repository";
9
11
  export class TokenService {
10
12
  static hashId(token) {
@@ -283,6 +285,19 @@ export class TokenService {
283
285
  }
284
286
  }));
285
287
  }
288
+ static async getValidRewardTokens(chainId) {
289
+ return await CacheService.wrap(TTLPresets.MIN_5, async (chainId) => {
290
+ const validRewardTokens = await DistributionCreatorService(chainId).validRewardTokens();
291
+ return (await TokenRepository.findList(chainId, validRewardTokens.map(t => getAddress(t.token)))).map(x => {
292
+ return {
293
+ ...x,
294
+ minimumAmountPerHour: validRewardTokens
295
+ .find(t => getAddress(t.token) === x.address)
296
+ ?.minimumAmountPerEpoch.toString(),
297
+ };
298
+ });
299
+ }, chainId);
300
+ }
286
301
  static async update(id, data) {
287
302
  // let iconUri = data.icon;
288
303
  // if (data.iconFile) {