@merkl/api 0.10.225 → 0.10.227

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.
@@ -771,6 +771,7 @@ declare const eden: {
771
771
  items?: number | undefined;
772
772
  tags?: ("AMM" | "ALM" | "DEX" | "LENDING" | "PERPETUAL")[] | undefined;
773
773
  page?: number | undefined;
774
+ opportunityTag?: string | undefined;
774
775
  };
775
776
  fetch?: RequestInit | undefined;
776
777
  }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
@@ -3598,6 +3599,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
3598
3599
  items?: number | undefined;
3599
3600
  tags?: ("AMM" | "ALM" | "DEX" | "LENDING" | "PERPETUAL")[] | undefined;
3600
3601
  page?: number | undefined;
3602
+ opportunityTag?: string | undefined;
3601
3603
  };
3602
3604
  headers: unknown;
3603
3605
  response: {
@@ -6957,6 +6959,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
6957
6959
  items?: number | undefined;
6958
6960
  tags?: ("AMM" | "ALM" | "DEX" | "LENDING" | "PERPETUAL")[] | undefined;
6959
6961
  page?: number | undefined;
6962
+ opportunityTag?: string | undefined;
6960
6963
  };
6961
6964
  fetch?: RequestInit | undefined;
6962
6965
  }) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
@@ -858,6 +858,7 @@ declare const app: Elysia<"", false, {
858
858
  items?: number | undefined;
859
859
  tags?: ("AMM" | "ALM" | "DEX" | "LENDING" | "PERPETUAL")[] | undefined;
860
860
  page?: number | undefined;
861
+ opportunityTag?: string | undefined;
861
862
  };
862
863
  headers: unknown;
863
864
  response: {
package/dist/src/index.js CHANGED
@@ -85,7 +85,11 @@ const app = new Elysia({
85
85
  exclude: [/engine\/*/, /v1\/.*/, /v2\/.*/, /v3\/.*/, /swagger\/*/],
86
86
  }))
87
87
  .use(cors())
88
- .get("/", () => "Merkl API: docs available at /docs")
88
+ .get("/", () => "Merkl API: docs available at /docs", {
89
+ detail: {
90
+ hide: true,
91
+ },
92
+ })
89
93
  .use(v1)
90
94
  .use(v2)
91
95
  .use(v4)
@@ -17,13 +17,19 @@ export const CampaignController = new Elysia({ prefix: "/campaigns", detail: { t
17
17
  .get("/", async ({ query }) => await CampaignService.findMany(query), {
18
18
  query: GetCampaignQueryDto,
19
19
  response: t.Array(CampaignResourceDto),
20
- detail: `**Retrieve Multiple Campaigns**
21
- <p>This endpoint enables you to search for opportunities by providing specific criteria through query parameters.</p>`,
20
+ detail: {
21
+ description: `**Retrieve Multiple Campaigns**
22
+ <p>This endpoint enables you to search for campaigns by providing specific criteria through query parameters.</p>`,
23
+ },
22
24
  })
23
25
  // ─── Get Total Campaigns Count ───────────────────────────────────────
24
26
  .get("/count", async ({ query }) => await CampaignService.countMany(query), {
25
27
  query: GetCampaignQueryDto,
26
28
  response: t.Number(),
29
+ detail: {
30
+ description: `**Count Campaigns**
31
+ <p>This endpoint enables you to count campaigns corresponding to filters specified in the query params.</p>`,
32
+ },
27
33
  })
28
34
  .group("/campaigns-to-process", app => {
29
35
  return (app
@@ -22,6 +22,7 @@ export declare const ProtocolController: Elysia<"/protocols", false, {
22
22
  items?: number | undefined;
23
23
  tags?: ("AMM" | "ALM" | "DEX" | "LENDING" | "PERPETUAL")[] | undefined;
24
24
  page?: number | undefined;
25
+ opportunityTag?: string | undefined;
25
26
  };
26
27
  headers: unknown;
27
28
  response: {
@@ -5,7 +5,7 @@ import type { Resource } from "../prisma";
5
5
  * @see {@link Resource}
6
6
  */
7
7
  export type Protocol = Resource<"Protocol">;
8
- declare const protocolTypes: readonly ["arthswap", "baseswap", "camelot", "crust", "fenix", "horiza", "izumi", "kim", "pancakeswap-v3", "quickswap-algebra", "quickswap-uni", "ramses", "retro", "stryke", "stryke-pcs", "stryke-sushi", "sushiswap-v3", "swapr", "thruster", "uniswap-v3", "voltage", "zero", "koi", "supswap-v3", "zkswap", "thirdtrade", "uniswap-v2", "velodrome", "aerodrome", "balancer", "curve", "aura", "akron", "beefy", "dragonswap", "poolside", "koi", "radiant", "aave", "euler", "gearbox", "compound", "sturdy", "frax", "ionic", "moonwell", "fluid", "silo", "morpho", "coumpound", "dolomite", "badger", "ajna", "layerbank", "ion", "eigenlayer"];
8
+ declare const protocolTypes: readonly ["arthswap", "baseswap", "camelot", "crust", "fenix", "horiza", "izumi", "kim", "pancakeswap-v3", "quickswap-algebra", "quickswap-uni", "ramses", "retro", "stryke", "stryke-pcs", "stryke-sushi", "sushiswap-v3", "swapr", "thruster", "uniswap-v3", "voltage", "zero", "koi", "supswap-v3", "zkswap", "thirdtrade", "uniswap-v2", "velodrome", "aerodrome", "balancer", "curve", "aura", "akron", "beefy", "dragonswap", "poolside", "koi", "radiant", "aave", "euler", "gearbox", "compound", "sturdy", "frax", "ionic", "moonwell", "fluid", "silo", "morpho", "coumpound", "dolomite", "badger", "ajna", "layerbank", "ion", "eigenlayer", "syncswap-v3", "neptune"];
9
9
  export type ProtocolId = (typeof protocolTypes)[number];
10
10
  export declare const ProtocolResourceDto: import("@sinclair/typebox").TObject<{
11
11
  id: import("@sinclair/typebox").TString;
@@ -30,6 +30,7 @@ export declare const GetProtocolsQueryDto: import("@sinclair/typebox").TObject<{
30
30
  LENDING: "LENDING";
31
31
  PERPETUAL: "PERPETUAL";
32
32
  }>>>;
33
+ opportunityTag: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
33
34
  page: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
34
35
  items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
35
36
  }>;
@@ -60,6 +60,8 @@ const protocolTypes = [
60
60
  "layerbank",
61
61
  "ion",
62
62
  "eigenlayer",
63
+ "syncswap-v3",
64
+ "neptune",
63
65
  ];
64
66
  // ─── DTOs ────────────────────────────────────────────────────────────────────
65
67
  export const ProtocolResourceDto = t.Object({
@@ -73,6 +75,7 @@ export const ProtocolResourceDto = t.Object({
73
75
  export const GetProtocolsQueryDto = t.Object({
74
76
  id: t.Optional(t.String({ description: "Filter results by name. Useful for searching a protocol to verify its integration" })),
75
77
  tags: t.Optional(t.Array(t.Enum(ProtocolTag, { description: "Filter by protocol tag" }))),
78
+ opportunityTag: t.Optional(t.String({ description: "Filter by underlying opportunities' tag" })),
76
79
  page: t.Optional(t.Numeric({ description: "0-indexed page number", default: 0 })),
77
80
  items: t.Optional(t.Numeric({ description: "Number of items returned by page", default: 20 })), // items per page
78
81
  });
@@ -24,6 +24,15 @@ export class ProtocolRepository {
24
24
  where: {
25
25
  id: query.id ? { contains: query.id, mode: "insensitive" } : undefined,
26
26
  tags: query.tags ? { hasEvery: query.tags } : undefined,
27
+ Opportunities: query.opportunityTag
28
+ ? {
29
+ some: {
30
+ tags: {
31
+ has: query.opportunityTag,
32
+ },
33
+ },
34
+ }
35
+ : undefined,
27
36
  // id: typeof query.id === "string" ? query.id : !!query.id ? { in: query.id } : undefined,
28
37
  },
29
38
  };
@@ -34,6 +34,8 @@ export class ProtocolService {
34
34
  [AMMV3.AERODROME]: "aerodrome",
35
35
  [AMMV3.zkSwap]: "zkswap",
36
36
  [AMMV3.ThirdTrade]: "thirdtrade",
37
+ [AMMV3.SyncswapV3]: "syncswap-v3",
38
+ [AMMV3.Neptune]: "neptune",
37
39
  }[amm];
38
40
  }
39
41
  static async findMany(query) {
@@ -5,13 +5,16 @@ import Elysia from "elysia";
5
5
  import { CampaignIdDto, CampaignIdWithoutPageDto, CreateManyBreakdownDto, CreateManyRewardDto, RegisterClaimsDto, UpdatePendingDto, } from "./reward.model";
6
6
  import { RewardService } from "./reward.service";
7
7
  // ─── Rewards Controller ──────────────────────────────────────────────────────
8
- export const RewardController = new Elysia({ prefix: "/rewards", detail: { tags: ["Rewards"], hide: true } })
8
+ export const RewardController = new Elysia({ prefix: "/rewards", detail: { tags: ["Rewards"] } })
9
9
  // ─── Get Reward Breakdowns For Campaign Ids ──────────────────────────
10
10
  .get("/", async ({ query }) => await RewardService.breakdownForCampaign(query), {
11
11
  query: CampaignIdDto,
12
12
  beforeHandle: ({ query }) => {
13
13
  throwOnUnsupportedChainId(query.chainId);
14
14
  },
15
+ detail: {
16
+ description: "Returns the all the address that received rewards for a given campaign, sorted by descending amounts",
17
+ },
15
18
  })
16
19
  // ─── Get Total Amount Rewarded For Campaign Id ──────────────────────
17
20
  .get("/total", async ({ query }) => await RewardService.total(query), {
@@ -19,18 +22,21 @@ export const RewardController = new Elysia({ prefix: "/rewards", detail: { tags:
19
22
  beforeHandle: ({ query }) => {
20
23
  throwOnUnsupportedChainId(query.chainId);
21
24
  },
25
+ detail: { description: "Returns the total amount distributed for a given campaign" },
22
26
  })
23
27
  // ─── Create Many Rewards ─────────────────────────────────────────────
24
28
  .post("/engine", async ({ body }) => await RewardService.createManyReward(body), {
25
29
  headers: AuthorizationHeadersDto,
26
30
  body: CreateManyRewardDto,
27
31
  beforeHandle: EngineGuard,
32
+ detail: { hide: true },
28
33
  })
29
34
  // ─── Create Many Reward Breakdowns ───────────────────────────────────
30
35
  .post("/engine/breakdowns", async ({ body }) => await RewardService.createManyBreakdown(body), {
31
36
  headers: AuthorizationHeadersDto,
32
37
  body: CreateManyBreakdownDto,
33
38
  beforeHandle: EngineGuard,
39
+ detail: { hide: true },
34
40
  })
35
41
  // ─── Register new claims ──────────────────────────────────────────────
36
42
  .post("/engine/claims", async ({ body }) => await RewardService.registerClaims(body), {
@@ -44,12 +50,14 @@ export const RewardController = new Elysia({ prefix: "/rewards", detail: { tags:
44
50
  claim.recipient = throwOnInvalidRequiredAddress(claim.recipient);
45
51
  }
46
52
  },
53
+ detail: { hide: true },
47
54
  })
48
55
  // ─── Create Many Pending Rewards ─────────────────────────────────────
49
56
  .post("/engine/pendings", async ({ body }) => await RewardService.updatePendings(body), {
50
57
  headers: AuthorizationHeadersDto,
51
58
  body: UpdatePendingDto,
52
59
  beforeHandle: EngineGuard,
60
+ detail: { hide: true },
53
61
  })
54
62
  // ─── Get Reward Count By Chain And Root ──────────────────────────────
55
63
  .get("/count", async ({ query }) => await RewardService.count(query), {
@@ -57,11 +65,13 @@ export const RewardController = new Elysia({ prefix: "/rewards", detail: { tags:
57
65
  beforeHandle: ({ query }) => {
58
66
  throwOnUnsupportedChainId(query.chainId);
59
67
  },
68
+ detail: { hide: true },
60
69
  })
61
70
  // ─── Get Reward Count By Chain And Root ──────────────────────────────
62
71
  .get("/count/chains", async () => await RewardService.countAllchains(), {
63
72
  headers: AuthorizationHeadersDto,
64
73
  beforeHandle: BackOfficeGuard,
74
+ detail: { hide: true },
65
75
  })
66
76
  // ─── Unclaimed Data routes ───────────────────────────────────────────
67
77
  .group("/unclaim", app => {
@@ -70,5 +80,6 @@ export const RewardController = new Elysia({ prefix: "/rewards", detail: { tags:
70
80
  beforeHandle: ({ query }) => {
71
81
  throwOnUnsupportedChainId(query.chainId);
72
82
  },
83
+ detail: { description: "Returns the total of unclaimed rewards for given campaigns" },
73
84
  });
74
85
  });
@@ -79,9 +79,16 @@ export const RewardsPerChainDto = t.Object({
79
79
  chainId: t.Numeric(),
80
80
  });
81
81
  export const CampaignIdWithoutPageDto = t.Object({
82
- chainId: t.Numeric(),
82
+ chainId: t.Numeric({
83
+ description: "Chain ID",
84
+ }),
83
85
  campaignIds: t
84
- .Transform(t.Union([t.String(), t.Array(t.String())]))
86
+ .Transform(t.Union([
87
+ t.String({
88
+ description: "Comma-separated campaign IDs",
89
+ }),
90
+ t.Array(t.String()),
91
+ ]))
85
92
  .Decode(value => {
86
93
  return typeof value === "string" ? value.split(",") : value;
87
94
  })
@@ -97,10 +104,14 @@ export const CampaignIdListDto = t.Object({
97
104
  items: t.Optional(t.Numeric()), // items per page
98
105
  });
99
106
  export const CampaignIdDto = t.Object({
100
- chainId: t.Numeric(),
101
- campaignId: t.String(),
102
- page: t.Optional(t.Numeric()), // 0-indexed
103
- items: t.Optional(t.Numeric()), // items per page
107
+ chainId: t.Numeric({
108
+ description: "Chain ID",
109
+ }),
110
+ campaignId: t.String({
111
+ description: "Campaign ID",
112
+ }),
113
+ page: t.Optional(t.Numeric({ description: "Page number", default: 0 })), // 0-indexed
114
+ items: t.Optional(t.Numeric({ description: "Number of returned rows", default: 20 })), // items per page
104
115
  });
105
116
  export const UserRewardV3Dto = t.Record(t.String({ title: "TokenAddress" }), t.Object({
106
117
  symbol: t.String(),
@@ -736,6 +736,7 @@ export declare const v4: Elysia<"/v4", false, {
736
736
  items?: number | undefined;
737
737
  tags?: ("AMM" | "ALM" | "DEX" | "LENDING" | "PERPETUAL")[] | undefined;
738
738
  page?: number | undefined;
739
+ opportunityTag?: string | undefined;
739
740
  };
740
741
  headers: unknown;
741
742
  response: {