@merkl/api 0.10.341 → 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: {
@@ -205,43 +205,29 @@ export class OpportunityRepository {
205
205
  const order = query.order ?? "desc";
206
206
  const test = query.test ?? false;
207
207
  const creatorAddress = query.creatorAddress ?? null;
208
- const noFilters = Object.values(filters).every(v => v === undefined);
209
- const tokensFilters = tokens?.map(symbol => ({
210
- Tokens: { some: { symbol: { equals: symbol, mode: "insensitive" } } },
211
- }));
212
208
  const orderBy = {
213
209
  [sort]: order,
214
210
  };
215
211
  return {
216
212
  orderBy,
217
- where: noFilters
218
- ? { OR: tokensFilters }
219
- : {
220
- AND: [
221
- ...(tokensFilters ?? []),
222
- { tags: !filters.tags ? undefined : { has: filters.tags } },
223
- { tvl: filters.minimumTvl ? { gte: filters.minimumTvl } : undefined },
224
- { chainId: !chainIds ? undefined : { in: chainIds } },
225
- { name: !filters.name ? undefined : { contains: filters.name, mode: "insensitive" } },
226
- {
227
- action: !actions ? undefined : { in: actions },
228
- },
229
- {
230
- status: !status ? undefined : { in: status },
231
- },
232
- { mainProtocolId: !protocols ? undefined : { in: protocols } },
233
- {
234
- Campaigns: test || !creatorAddress
235
- ? undefined
236
- : {
237
- some: {
238
- RewardToken: !test ? { isTest: false } : undefined,
239
- creatorAddress: creatorAddress ? creatorAddress : undefined,
240
- },
241
- },
213
+ where: {
214
+ tags: !filters.tags ? undefined : { has: filters.tags },
215
+ tvl: filters.minimumTvl ? { gte: filters.minimumTvl } : undefined,
216
+ chainId: !chainIds ? undefined : { in: chainIds },
217
+ name: !filters.name ? undefined : { contains: filters.name, mode: "insensitive" },
218
+ action: !actions ? undefined : { in: actions },
219
+ status: !status ? undefined : { in: status },
220
+ mainProtocolId: !protocols ? undefined : { in: protocols },
221
+ Campaigns: test || !creatorAddress
222
+ ? undefined
223
+ : {
224
+ some: {
225
+ RewardToken: !test ? { isTest: false } : undefined,
226
+ creatorAddress: creatorAddress ? creatorAddress : undefined,
242
227
  },
243
- ],
244
- },
228
+ },
229
+ Tokens: { some: { symbol: { in: tokens } } },
230
+ },
245
231
  };
246
232
  }
247
233
  static async findMany(query) {
@@ -192,7 +192,7 @@ const ModeInterfaceCampaigns = {
192
192
  hooks: [],
193
193
  poolAddress: "0xd54aba804a676c8f265e2e6742d7b86d383d093b",
194
194
  whitelist: [],
195
- blacklist: ["0x67135675e22F7ff34eBA30f15f39F9cd30d29079"],
195
+ blacklist: [],
196
196
  url: "https://app.kim.exchange/pools/v4/0xd54aba804a676c8f265e2e6742d7b86d383d093b",
197
197
  forwarders: [],
198
198
  isOutOfRangeIncentivized: false,
@@ -403,7 +403,7 @@ const ModeInterfaceCampaigns = {
403
403
  hooks: [],
404
404
  poolAddress: "0x27f0976b26194c448d987c275bb409eab6083964",
405
405
  whitelist: [],
406
- blacklist: ["0x67135675e22F7ff34eBA30f15f39F9cd30d29079"],
406
+ blacklist: [],
407
407
  url: "https://app.kim.exchange/pools/v4/0x27f0976b26194c448d987c275bb409eab6083964",
408
408
  forwarders: [],
409
409
  isOutOfRangeIncentivized: false,
@@ -560,7 +560,7 @@ const ModeInterfaceCampaigns = {
560
560
  hooks: [],
561
561
  poolAddress: "0x34d6146f8fdd9599f574fc6a686d6f6498217b7e",
562
562
  whitelist: [],
563
- blacklist: ["0x788F382d835Cb00851b883DAD7f30798AE480622"],
563
+ blacklist: [],
564
564
  url: "https://app.kim.exchange/pools/v4/0x34d6146f8fdd9599f574fc6a686d6f6498217b7e",
565
565
  isOutOfRangeIncentivized: false,
566
566
  weightFees: 2000,
@@ -635,7 +635,7 @@ const ModeInterfaceCampaigns = {
635
635
  campaignType: Campaign.ERC20,
636
636
  computeChainId: ChainId.MODE,
637
637
  hooks: [],
638
- targetToken: "0xa30c1544d12309a519A205A486f6AF0515dFA442",
638
+ targetToken: "0xbEd575b0FeDa4F84b71144634693DaCc07749471",
639
639
  whitelist: [],
640
640
  blacklist: [],
641
641
  url: "https://app.mitosis.org/?asset=ezETH&type=deposit&to=mode",
@@ -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) {