@merkl/api 0.10.138 → 0.10.140

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 (73) hide show
  1. package/dist/src/eden/index.d.ts +291 -520
  2. package/dist/src/index.d.ts +99 -186
  3. package/dist/src/index.js +1 -1
  4. package/dist/src/libs/deprecated-merklv3/index.js +1 -1
  5. package/dist/src/modules/v4/blacklist/blacklist.controller.d.ts +0 -21
  6. package/dist/src/modules/v4/blacklist/blacklist.controller.js +2 -2
  7. package/dist/src/modules/v4/blacklist/blacklist.repository.d.ts +0 -8
  8. package/dist/src/modules/v4/blacklist/blacklist.repository.js +1 -4
  9. package/dist/src/modules/v4/blacklist/blacklist.service.d.ts +1 -9
  10. package/dist/src/modules/v4/blacklist/blacklist.service.js +1 -4
  11. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +3 -3
  12. package/dist/src/modules/v4/campaign/campaign.controller.js +8 -6
  13. package/dist/src/modules/v4/campaign/campaign.service.js +1 -2
  14. package/dist/src/modules/v4/chain/chain.controller.js +2 -1
  15. package/dist/src/modules/v4/dynamicData/dynamicData.controller.d.ts +20 -26
  16. package/dist/src/modules/v4/dynamicData/dynamicData.controller.js +5 -5
  17. package/dist/src/modules/v4/enso/enso.service.d.ts +1 -1
  18. package/dist/src/modules/v4/{participate/participate.controller.d.ts → interaction/interaction.controller.d.ts} +6 -6
  19. package/dist/src/modules/v4/{participate/participate.controller.js → interaction/interaction.controller.js} +12 -13
  20. package/dist/src/modules/v4/{participate/participate.model.d.ts → interaction/interaction.model.d.ts} +12 -12
  21. package/dist/src/modules/v4/{participate/participate.model.js → interaction/interaction.model.js} +3 -3
  22. package/dist/src/modules/v4/{participate/participate.service.d.ts → interaction/interaction.service.d.ts} +5 -5
  23. package/dist/src/modules/v4/{participate/participate.service.js → interaction/interaction.service.js} +3 -3
  24. package/dist/src/modules/v4/merklRoot/merklRoot.controller.d.ts +2 -2
  25. package/dist/src/modules/v4/merklRoot/merklRoot.controller.js +2 -2
  26. package/dist/src/modules/v4/opportunity/opportunity.controller.js +5 -1
  27. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +28 -2
  28. package/dist/src/modules/v4/opportunity/opportunity.repository.js +16 -1
  29. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +2 -1
  30. package/dist/src/modules/v4/opportunity/opportunity.service.js +30 -0
  31. package/dist/src/modules/v4/opportunity/subservices/getClammMetadata.service.js +1 -1
  32. package/dist/src/modules/v4/opportunity/subservices/getDolomiteMetadata.service.js +1 -1
  33. package/dist/src/modules/v4/opportunity/subservices/getErc20SnapshotMetadata.service.js +1 -1
  34. package/dist/src/modules/v4/opportunity/subservices/getJsonAirDropMetadata.service.js +3 -3
  35. package/dist/src/modules/v4/opportunity/subservices/getMorphoMetadata.service.js +2 -2
  36. package/dist/src/modules/v4/opportunity/subservices/getRadiantMetadata.service.js +1 -1
  37. package/dist/src/modules/v4/opportunity/subservices/getSiloMetadata.service.js +1 -1
  38. package/dist/src/modules/v4/price/price.controller.js +3 -0
  39. package/dist/src/modules/v4/reward/reward.controller.d.ts +31 -29
  40. package/dist/src/modules/v4/reward/reward.controller.js +3 -3
  41. package/dist/src/modules/v4/reward/{rewardConvertor.service.d.ts → subservices/converter.d.ts} +2 -2
  42. package/dist/src/modules/v4/reward/{rewardConvertor.service.js → subservices/converter.js} +1 -1
  43. package/dist/src/modules/v4/router.d.ts +99 -186
  44. package/dist/src/modules/v4/router.js +2 -2
  45. package/dist/src/modules/v4/status/status.controller.d.ts +40 -102
  46. package/dist/src/modules/v4/status/status.controller.js +16 -22
  47. package/dist/src/modules/v4/status/status.model.d.ts +33 -26
  48. package/dist/src/modules/v4/status/status.model.js +9 -20
  49. package/dist/src/modules/v4/status/status.repository.d.ts +12 -42
  50. package/dist/src/modules/v4/status/status.repository.js +10 -22
  51. package/dist/src/modules/v4/status/status.service.d.ts +4 -36
  52. package/dist/src/modules/v4/status/status.service.js +9 -18
  53. package/dist/src/modules/v4/uniswapV4/uniswapV4.controller.d.ts +1 -1
  54. package/dist/src/modules/v4/uniswapV4/uniswapV4.controller.js +1 -1
  55. package/dist/src/modules/v4/user/user.controller.js +3 -2
  56. package/dist/src/routes/v3/ERC20Campaigns.d.ts +99 -186
  57. package/dist/src/routes/v3/blacklist.d.ts +99 -186
  58. package/dist/src/routes/v3/campaigns.d.ts +99 -186
  59. package/dist/src/routes/v3/campaignsInfo.d.ts +99 -186
  60. package/dist/src/routes/v3/multiChainPositions.d.ts +99 -186
  61. package/dist/src/routes/v3/opportunity.d.ts +99 -186
  62. package/dist/src/routes/v3/positions.d.ts +99 -186
  63. package/dist/src/routes/v3/rewards.d.ts +99 -186
  64. package/dist/src/routes/v3/rewards.js +1 -1
  65. package/dist/src/routes/v3/updates.d.ts +99 -186
  66. package/dist/src/routes/v3/userRewards.d.ts +99 -186
  67. package/dist/src/routes/v3/userRewards.js +1 -1
  68. package/dist/tsconfig.package.tsbuildinfo +1 -1
  69. package/package.json +1 -2
  70. package/dist/src/modules/v4/apr/apr.repository.d.ts +0 -0
  71. package/dist/src/modules/v4/apr/apr.repository.js +0 -1
  72. package/dist/src/modules/v4/tvl/tvl.repository.d.ts +0 -0
  73. package/dist/src/modules/v4/tvl/tvl.repository.js +0 -1
@@ -1,5 +1,5 @@
1
1
  import Elysia from "elysia";
2
- export declare const DynamicDataController: Elysia<"/dynamicData", false, {
2
+ export declare const DynamicDataController: Elysia<"/dynamic-data", false, {
3
3
  decorator: {};
4
4
  store: {};
5
5
  derive: {};
@@ -12,31 +12,25 @@ export declare const DynamicDataController: Elysia<"/dynamicData", false, {
12
12
  macro: {};
13
13
  macroFn: {};
14
14
  }, {
15
- dynamicData: {
16
- chainId: {
17
- ":chainId": {
18
- token: {
19
- ":tokenAddress": {
20
- get: {
21
- body: unknown;
22
- params: {
23
- chainId: number;
24
- tokenAddress: string;
25
- };
26
- query: unknown;
27
- headers: {
28
- authorization: string;
29
- };
30
- response: {
31
- 200: {
32
- tvl: number;
33
- totalSupply: number;
34
- cardName: string;
35
- blacklistedSupply: number;
36
- priceTargetToken: number;
37
- };
38
- };
39
- };
15
+ "dynamic-data": {
16
+ index: {
17
+ get: {
18
+ body: unknown;
19
+ params: {};
20
+ query: {
21
+ chainId: number;
22
+ tokenAddress: string;
23
+ };
24
+ headers: {
25
+ authorization: string;
26
+ };
27
+ response: {
28
+ 200: {
29
+ tvl: number;
30
+ totalSupply: number;
31
+ cardName: string;
32
+ blacklistedSupply: number;
33
+ priceTargetToken: number;
40
34
  };
41
35
  };
42
36
  };
@@ -4,13 +4,13 @@ import { throwOnUnsupportedChainId } from "src/utils/throw";
4
4
  import { DynamicDataSourceIdentifier } from "./dynamicData.model";
5
5
  import { DynamicDataService } from "./dynamicData.service";
6
6
  // ─── DynamicDatas Controller ───────────────────────────────────────────────────────
7
- export const DynamicDataController = new Elysia({ prefix: "/dynamicData", detail: { tags: ["DynamicData"] } })
7
+ export const DynamicDataController = new Elysia({ prefix: "/dynamic-data", detail: { tags: ["DynamicData"] } })
8
8
  // ─── Get type Info By Token Address ───────────────────────────────────────
9
- .get("/chainId/:chainId/token/:tokenAddress", async ({ params }) => await DynamicDataService.queryERC20DynamicData(params.chainId, params.tokenAddress), {
10
- params: DynamicDataSourceIdentifier,
9
+ .get("/", async ({ query }) => await DynamicDataService.queryERC20DynamicData(query.chainId, query.tokenAddress), {
10
+ query: DynamicDataSourceIdentifier,
11
11
  headers: AuthorizationHeadersDto,
12
- beforeHandle: ({ params, headers }) => {
12
+ beforeHandle: ({ query, headers }) => {
13
13
  BackOfficeGuard({ headers });
14
- throwOnUnsupportedChainId(params.chainId);
14
+ throwOnUnsupportedChainId(query.chainId);
15
15
  },
16
16
  });
@@ -1,4 +1,4 @@
1
- import type { GetParticipateProtocolsQuery } from "../participate/participate.model";
1
+ import type { GetParticipateProtocolsQuery } from "../interaction/interaction.model";
2
2
  import { type ProtocolId } from "../protocol";
3
3
  import { type EnsoApi, type EnsoSlug } from "./enso.model";
4
4
  export declare abstract class EnsoService {
@@ -1,5 +1,5 @@
1
1
  import Elysia from "elysia";
2
- export declare const ParticipateController: Elysia<"/participate", false, {
2
+ export declare const InteractionController: Elysia<"/interaction", false, {
3
3
  decorator: {};
4
4
  store: {};
5
5
  derive: {};
@@ -12,7 +12,7 @@ export declare const ParticipateController: Elysia<"/participate", false, {
12
12
  macro: {};
13
13
  macroFn: {};
14
14
  }, {
15
- participate: {
15
+ interaction: {
16
16
  targets: {
17
17
  get: {
18
18
  body: unknown;
@@ -24,13 +24,13 @@ export declare const ParticipateController: Elysia<"/participate", false, {
24
24
  };
25
25
  headers: unknown;
26
26
  response: {
27
- 200: import("./participate.model").ParticipateTarget[] | undefined;
27
+ 200: import("./interaction.model").InteractionTarget[] | undefined;
28
28
  };
29
29
  };
30
30
  };
31
31
  };
32
32
  } & {
33
- participate: {
33
+ interaction: {
34
34
  protocols: {
35
35
  get: {
36
36
  body: unknown;
@@ -53,7 +53,7 @@ export declare const ParticipateController: Elysia<"/participate", false, {
53
53
  };
54
54
  };
55
55
  } & {
56
- participate: {
56
+ interaction: {
57
57
  quote: {
58
58
  get: {
59
59
  body: unknown;
@@ -79,7 +79,7 @@ export declare const ParticipateController: Elysia<"/participate", false, {
79
79
  };
80
80
  };
81
81
  } & {
82
- participate: {
82
+ interaction: {
83
83
  transaction: {
84
84
  get: {
85
85
  body: unknown;
@@ -1,16 +1,15 @@
1
1
  import Elysia from "elysia";
2
2
  import { EnsoService } from "../enso/enso.service";
3
- import { GetParticipateProtocolsQueryDto, GetParticipateQuoteQueryDto, GetParticipateTargetsQueryDto, } from "./participate.model";
4
- import { ParticipateService } from "./participate.service";
5
- // ─── Participate Controller ──────────────────────────────────────────────────
6
- export const ParticipateController = new Elysia({ prefix: "/participate", detail: { tags: ["Participate"] } })
7
- // ─── Get All Targets ───────────────────────────────────────────────
3
+ import { GetInteractionProtocolsQueryDto, GetInteractionQuoteQueryDto, GetInteractionTargetsQueryDto, } from "./interaction.model";
4
+ import { InteractionService } from "./interaction.service";
5
+ // ─── Interaction Controller ──────────────────────────────────────────────────
6
+ export const InteractionController = new Elysia({ prefix: "/interaction", detail: { tags: ["Interaction"] } })
8
7
  .get("/targets", async ({ query: { protocolId, chainId, identifier } }) => {
9
8
  if (identifier)
10
- return await ParticipateService.getTarget(chainId, protocolId, identifier);
11
- return await ParticipateService.getTargets(chainId, protocolId);
9
+ return await InteractionService.getTarget(chainId, protocolId, identifier);
10
+ return await InteractionService.getTargets(chainId, protocolId);
12
11
  }, {
13
- query: GetParticipateTargetsQueryDto,
12
+ query: GetInteractionTargetsQueryDto,
14
13
  detail: {
15
14
  summary: "Available interaction targets for a protocol",
16
15
  description: "Retrieves all the pool/token/contract",
@@ -18,7 +17,7 @@ export const ParticipateController = new Elysia({ prefix: "/participate", detail
18
17
  })
19
18
  // ─── Get All Compatible Protocols ───────────────────────────────────────
20
19
  .get("/protocols", async ({ query }) => await EnsoService.getCompatibleProtocols(query), {
21
- query: GetParticipateProtocolsQueryDto,
20
+ query: GetInteractionProtocolsQueryDto,
22
21
  detail: {
23
22
  summary: "Interactable protocols",
24
23
  description: "Retrieves protocols integrated by merkl which supports being interacted with",
@@ -26,7 +25,7 @@ export const ParticipateController = new Elysia({ prefix: "/participate", detail
26
25
  })
27
26
  // ─── Get Quote ───────────────────────────────────────────────────────
28
27
  .get("/quote", async ({ query: { protocolId, chainId, identifier, userAddress, fromAmount, fromTokenAddress } }) => {
29
- const [target] = (await ParticipateService.getTarget(chainId, protocolId, identifier)) ?? [];
28
+ const [target] = (await InteractionService.getTarget(chainId, protocolId, identifier)) ?? [];
30
29
  //TODO: throw error
31
30
  if (!target)
32
31
  return;
@@ -39,7 +38,7 @@ export const ParticipateController = new Elysia({ prefix: "/participate", detail
39
38
  chainId,
40
39
  });
41
40
  }, {
42
- query: GetParticipateQuoteQueryDto,
41
+ query: GetInteractionQuoteQueryDto,
43
42
  detail: {
44
43
  summary: "Preview participate transaction",
45
44
  description: "",
@@ -47,7 +46,7 @@ export const ParticipateController = new Elysia({ prefix: "/participate", detail
47
46
  })
48
47
  // ─── Get Transaction ─────────────────────────────────────────────────
49
48
  .get("/transaction", async ({ query: { protocolId, chainId, identifier, userAddress, fromAmount, fromTokenAddress } }) => {
50
- const [target] = (await ParticipateService.getTarget(chainId, protocolId, identifier)) ?? [];
49
+ const [target] = (await InteractionService.getTarget(chainId, protocolId, identifier)) ?? [];
51
50
  //TODO: throw error
52
51
  if (!target)
53
52
  return;
@@ -60,7 +59,7 @@ export const ParticipateController = new Elysia({ prefix: "/participate", detail
60
59
  chainId,
61
60
  });
62
61
  }, {
63
- query: GetParticipateQuoteQueryDto,
62
+ query: GetInteractionQuoteQueryDto,
64
63
  detail: {
65
64
  summary: "Get participate transaction",
66
65
  description: "",
@@ -1,7 +1,7 @@
1
1
  import type { Token } from "../token";
2
2
  export declare const participateInputTypes: readonly ["tokenAmount", "token"];
3
- export type ParticipateInputType = (typeof participateInputTypes)[number];
4
- export type ParticipateInput<T extends ParticipateInputType = ParticipateInputType> = {
3
+ export type InteractionInputType = (typeof participateInputTypes)[number];
4
+ export type InteractionInput<T extends InteractionInputType = InteractionInputType> = {
5
5
  tokenAmount: {
6
6
  chain: number[];
7
7
  address: string[];
@@ -12,32 +12,32 @@ export type ParticipateInput<T extends ParticipateInputType = ParticipateInputTy
12
12
  };
13
13
  }[T];
14
14
  export declare const participateTypes: readonly ["link", "deposit", "withdraw"];
15
- export type ParticipateType = (typeof participateTypes)[number];
16
- export type ParticipateSchema<T extends ParticipateType> = {
15
+ export type InteractionType = (typeof participateTypes)[number];
16
+ export type InteractionSchema<T extends InteractionType> = {
17
17
  link: {
18
18
  link: string;
19
19
  };
20
20
  deposit: {
21
- inputs: ParticipateInput[];
21
+ inputs: InteractionInput[];
22
22
  };
23
23
  withdraw: {
24
24
  d: string;
25
25
  };
26
26
  }[T];
27
- export type ParticipateTarget = {
27
+ export type InteractionTarget = {
28
28
  identifier: string;
29
29
  name: string;
30
30
  tokens: Token["model"][];
31
31
  };
32
- export type ParticipateSchemas = {
33
- [T in ParticipateType]?: ParticipateSchema<T>;
32
+ export type InteractionSchemas = {
33
+ [T in InteractionType]?: InteractionSchema<T>;
34
34
  };
35
- export declare const GetParticipateTargetsQueryDto: import("@sinclair/typebox").TObject<{
35
+ export declare const GetInteractionTargetsQueryDto: import("@sinclair/typebox").TObject<{
36
36
  chainId: import("@sinclair/typebox").TNumber;
37
37
  protocolId: import("@sinclair/typebox").TString;
38
38
  identifier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
39
39
  }>;
40
- export declare const GetParticipateQuoteQueryDto: import("@sinclair/typebox").TObject<{
40
+ export declare const GetInteractionQuoteQueryDto: import("@sinclair/typebox").TObject<{
41
41
  chainId: import("@sinclair/typebox").TNumber;
42
42
  protocolId: import("@sinclair/typebox").TString;
43
43
  identifier: import("@sinclair/typebox").TString;
@@ -45,7 +45,7 @@ export declare const GetParticipateQuoteQueryDto: import("@sinclair/typebox").TO
45
45
  fromTokenAddress: import("@sinclair/typebox").TString;
46
46
  fromAmount: import("@sinclair/typebox").TString;
47
47
  }>;
48
- export declare const GetParticipateProtocolsQueryDto: import("@sinclair/typebox").TObject<{
48
+ export declare const GetInteractionProtocolsQueryDto: import("@sinclair/typebox").TObject<{
49
49
  chainId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
50
50
  }>;
51
- export type GetParticipateProtocolsQuery = typeof GetParticipateProtocolsQueryDto.static;
51
+ export type GetInteractionProtocolsQuery = typeof GetInteractionProtocolsQueryDto.static;
@@ -2,14 +2,14 @@ import protocol from "database/api/seeder/resources/protocol";
2
2
  import { t } from "elysia";
3
3
  export const participateInputTypes = ["tokenAmount", "token"];
4
4
  export const participateTypes = ["link", "deposit", "withdraw"];
5
- export const GetParticipateTargetsQueryDto = t.Object({
5
+ export const GetInteractionTargetsQueryDto = t.Object({
6
6
  chainId: t.Numeric(),
7
7
  protocolId: t.String({
8
8
  examples: Object.values(protocol).reduce((obj, i) => Object.assign(obj, { [i.name]: { value: i.id } }), {}),
9
9
  }),
10
10
  identifier: t.Optional(t.String()),
11
11
  });
12
- export const GetParticipateQuoteQueryDto = t.Object({
12
+ export const GetInteractionQuoteQueryDto = t.Object({
13
13
  chainId: t.Numeric(),
14
14
  protocolId: t.String({
15
15
  examples: Object.values(protocol).reduce((obj, i) => Object.assign(obj, { [i.name]: { value: i.id } }), {}),
@@ -19,6 +19,6 @@ export const GetParticipateQuoteQueryDto = t.Object({
19
19
  fromTokenAddress: t.String(),
20
20
  fromAmount: t.String(),
21
21
  });
22
- export const GetParticipateProtocolsQueryDto = t.Object({
22
+ export const GetInteractionProtocolsQueryDto = t.Object({
23
23
  chainId: t.Optional(t.Numeric()),
24
24
  });
@@ -1,8 +1,8 @@
1
1
  import { EnsoService } from "../enso/enso.service";
2
2
  import type { ProtocolId } from "../protocol";
3
- import type { ParticipateTarget } from "./participate.model";
4
- export declare abstract class ParticipateService {
5
- static getTarget(chainId: number, protocolId: ProtocolId, identifier: string): Promise<ParticipateTarget[] | undefined>;
6
- static getTargetsFromEnsoTokens(tokens: Awaited<ReturnType<typeof EnsoService.getTokens>>): Promise<ParticipateTarget[]>;
7
- static getTargets(chainId: number, protocolId: ProtocolId): Promise<ParticipateTarget[] | undefined>;
3
+ import type { InteractionTarget } from "./interaction.model";
4
+ export declare abstract class InteractionService {
5
+ static getTarget(chainId: number, protocolId: ProtocolId, identifier: string): Promise<InteractionTarget[] | undefined>;
6
+ static getTargetsFromEnsoTokens(tokens: Awaited<ReturnType<typeof EnsoService.getTokens>>): Promise<InteractionTarget[]>;
7
+ static getTargets(chainId: number, protocolId: ProtocolId): Promise<InteractionTarget[] | undefined>;
8
8
  }
@@ -1,12 +1,12 @@
1
1
  import { EnsoService } from "../enso/enso.service";
2
2
  import { TokenService } from "../token";
3
- export class ParticipateService {
3
+ export class InteractionService {
4
4
  static async getTarget(chainId, protocolId, identifier) {
5
5
  const slug = EnsoService.getSlug(protocolId);
6
6
  if (!slug)
7
7
  return;
8
8
  const tokens = await EnsoService.getTokens(chainId, slug, identifier);
9
- return await ParticipateService.getTargetsFromEnsoTokens(tokens);
9
+ return await InteractionService.getTargetsFromEnsoTokens(tokens);
10
10
  }
11
11
  static async getTargetsFromEnsoTokens(tokens) {
12
12
  const targets = [];
@@ -28,6 +28,6 @@ export class ParticipateService {
28
28
  if (!slug)
29
29
  return;
30
30
  const tokens = await EnsoService.getTokens(chainId, slug);
31
- return await ParticipateService.getTargetsFromEnsoTokens(tokens);
31
+ return await InteractionService.getTargetsFromEnsoTokens(tokens);
32
32
  }
33
33
  }
@@ -13,7 +13,7 @@ export declare const MerklRootController: Elysia<"/roots", false, {
13
13
  macroFn: {};
14
14
  }, {
15
15
  roots: {
16
- timestamps: {
16
+ index: {
17
17
  get: {
18
18
  body: unknown;
19
19
  params: {};
@@ -36,7 +36,7 @@ export declare const MerklRootController: Elysia<"/roots", false, {
36
36
  };
37
37
  } & {
38
38
  roots: {
39
- index: {
39
+ live: {
40
40
  get: {
41
41
  body: unknown;
42
42
  params: {};
@@ -5,11 +5,11 @@ import { MerklRootService } from "./merklRoot.service";
5
5
  // ─── Merkl Roots Controller ──────────────────────────────────────────────────
6
6
  export const MerklRootController = new Elysia({ prefix: "/roots", detail: { tags: ["Roots"] } })
7
7
  // ─── Get Merkl Root By Timestamp ─────────────────────────────────────
8
- .get("/timestamps", async ({ query }) => await MerklRootService.rootForTimestamp(query), {
8
+ .get("/", async ({ query }) => await MerklRootService.rootForTimestamp(query), {
9
9
  query: RootByTimestampsDto,
10
10
  beforeHandle: async ({ query }) => {
11
11
  throwOnUnsupportedChainId(query.chainId);
12
12
  },
13
13
  })
14
14
  // ─── Get all live Merkl Roots ─────────────────────────────────────────
15
- .get("/", async () => await MerklRootService.fetchAll());
15
+ .get("/live", async () => await MerklRootService.fetchAll());
@@ -6,12 +6,16 @@ import { OpportunityService } from "./opportunity.service";
6
6
  import { transformId } from "./transform-id.pipe";
7
7
  import { validateId } from "./validate-id.pipe";
8
8
  // ─── Opportunities Controller ────────────────────────────────────────────────
9
- export const OpportunityController = new Elysia({ prefix: "/opportunities", detail: { tags: ["Opportunities"] } })
9
+ export const OpportunityController = new Elysia({
10
+ prefix: "/opportunities",
11
+ detail: { tags: ["Opportunities"] },
12
+ })
10
13
  // ─── Create An Opportunity ───────────────────────────────────────────
11
14
  .post("/", async ({ body }) => await OpportunityService.create(body), {
12
15
  beforeHandle: TokenAuthGuard,
13
16
  headers: AuthorizationHeadersDto,
14
17
  body: CreateOpportunityDto,
18
+ detail: { hide: true },
15
19
  })
16
20
  // ─── Get An Opportunity By Id ────────────────────────────────────────
17
21
  .get("/:id", async ({ params }) => {
@@ -254,7 +254,19 @@ export declare abstract class OpportunityRepository {
254
254
  dailyRewards: number;
255
255
  }>;
256
256
  static findManyWithCampaigns(filters: Prisma.OpportunityFindManyArgs): Promise<({
257
- Campaigns: {
257
+ Campaigns: ({
258
+ RewardToken: {
259
+ symbol: string;
260
+ name: string | null;
261
+ id: string;
262
+ chainId: number;
263
+ address: string;
264
+ icon: string;
265
+ decimals: number;
266
+ verified: boolean;
267
+ price: number | null;
268
+ };
269
+ } & {
258
270
  type: import("../../../../database/api/.generated").$Enums.CampaignType;
259
271
  id: string;
260
272
  params: Prisma.JsonValue;
@@ -268,7 +280,7 @@ export declare abstract class OpportunityRepository {
268
280
  amount: string;
269
281
  opportunityId: string;
270
282
  creatorAddress: string;
271
- }[];
283
+ })[];
272
284
  } & {
273
285
  name: string;
274
286
  type: import("../../../../database/api/.generated").$Enums.CampaignType;
@@ -462,6 +474,20 @@ export declare abstract class OpportunityRepository {
462
474
  apr: number;
463
475
  dailyRewards: number;
464
476
  }>;
477
+ static updateName(id: string, name: string): Promise<{
478
+ name: string;
479
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
480
+ id: string;
481
+ status: import("../../../../database/api/.generated").$Enums.Status;
482
+ tags: string[];
483
+ identifier: string;
484
+ chainId: number;
485
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
486
+ mainProtocolId: string | null;
487
+ tvl: number;
488
+ apr: number;
489
+ dailyRewards: number;
490
+ }>;
465
491
  static aggregateSum(field: keyof Prisma.OpportunitySumAggregateInputType, query: GetOpportunitiesQueryEntity): Promise<{
466
492
  sum: never;
467
493
  }>;
@@ -93,7 +93,19 @@ export class OpportunityRepository {
93
93
  });
94
94
  }
95
95
  static async findManyWithCampaigns(filters) {
96
- return await apiDbClient.opportunity.findMany({ ...filters, include: { Campaigns: true } });
96
+ return await apiDbClient.opportunity.findMany({
97
+ ...filters,
98
+ include: {
99
+ Campaigns: {
100
+ include: {
101
+ RewardToken: true,
102
+ },
103
+ orderBy: {
104
+ endTimestamp: "desc",
105
+ },
106
+ },
107
+ },
108
+ });
97
109
  }
98
110
  static #transformQueryToPrismaFilters(query) {
99
111
  const { page: _page, items: _items, ...filters } = query;
@@ -215,6 +227,9 @@ export class OpportunityRepository {
215
227
  return await apiDbClient.opportunity.update({ where: { id }, data: { status, apr: 0, dailyRewards: 0 } });
216
228
  return await apiDbClient.opportunity.update({ where: { id }, data: { status } });
217
229
  }
230
+ static async updateName(id, name) {
231
+ return await apiDbClient.opportunity.update({ where: { id }, data: { name } });
232
+ }
218
233
  static async aggregateSum(field, query) {
219
234
  const args = OpportunityRepository.#transformQueryToPrismaFilters(query);
220
235
  const result = await apiDbClient.opportunity.aggregate({
@@ -1,6 +1,6 @@
1
1
  import { type CreateCampaignModel } from "../campaign";
2
2
  import { Prisma } from "../../../../database/api/.generated";
3
- import type { ChainId } from "@sdk";
3
+ import { type ChainId } from "@sdk";
4
4
  import type { CreateOpportunityModel, GetOpportunitiesQueryEntity, LightOpportunityFromDB, OpportunityMetadata, OpportunityUnique } from "./opportunity.model";
5
5
  import { OpportunityRepository } from "./opportunity.repository";
6
6
  export declare abstract class OpportunityService {
@@ -17,6 +17,7 @@ export declare abstract class OpportunityService {
17
17
  * @returns {OpportunityMetadata}
18
18
  */
19
19
  static getMetadata(campaign: CreateCampaignModel): Promise<OpportunityMetadata>;
20
+ static updateNames(): Promise<void>;
20
21
  static updateMetadata(chain: ChainId): Promise<void>;
21
22
  static getUniqueWithCampaignsOrThrow(opportunityId: string | OpportunityUnique): Promise<({
22
23
  aprRecord: {
@@ -3,6 +3,7 @@ import { CampaignService } from "../campaign";
3
3
  import { log } from "../../../utils/logger";
4
4
  import { OpportunityAction, Prisma } from "../../../../database/api/.generated";
5
5
  import { record } from "@elysiajs/opentelemetry";
6
+ import { Campaign } from "@sdk";
6
7
  import { CacheService } from "../cache";
7
8
  import { TTLPresets } from "../cache/cache.model";
8
9
  import { OpportunityRepository } from "./opportunity.repository";
@@ -75,6 +76,35 @@ export class OpportunityService {
75
76
  throw "UNKNOWN CAMPAIGN TYPE";
76
77
  }
77
78
  }
79
+ static async updateNames() {
80
+ const opportunities = await OpportunityRepository.findManyWithCampaigns({});
81
+ log.info(`updating ${opportunities.length} opportunities names`);
82
+ for (const [i, opp] of opportunities.entries()) {
83
+ try {
84
+ const campaignData = opp.Campaigns[0];
85
+ const campaign = {
86
+ ...campaignData,
87
+ creator: campaignData.creatorAddress,
88
+ chainId: campaignData.distributionChainId,
89
+ rewardTokenAddress: campaignData.RewardToken.address,
90
+ opportunityIdentifier: opp.identifier,
91
+ subType: campaignData.subType ?? undefined,
92
+ type: Campaign[campaignData.type],
93
+ params: JSON.stringify(campaignData.params),
94
+ startTimestamp: campaignData.startTimestamp.toString(),
95
+ endTimestamp: campaignData.endTimestamp.toString(),
96
+ };
97
+ const metadata = await OpportunityService.getMetadata(campaign);
98
+ if (opp.name !== metadata.name) {
99
+ log.info(`updating opportunity ${opp.id} name from ${opp.name} to ${metadata.name}`);
100
+ await OpportunityRepository.updateName(opp.id, metadata.name);
101
+ }
102
+ }
103
+ catch (err) {
104
+ log.error(`failed to update opportunity ${opp.id} name`, err);
105
+ }
106
+ }
107
+ }
78
108
  static async updateMetadata(chain) {
79
109
  try {
80
110
  const opportunities = await OpportunityRepository.findManyWithCampaigns({
@@ -22,7 +22,7 @@ export const getClammMetadata = (chainId, params) => {
22
22
  platform = "iZUMi";
23
23
  }
24
24
  return {
25
- name: [platform, `${params.symbolToken0}/${params.symbolToken1}`, params.poolFee && `${params.poolFee}%`].join(" "),
25
+ name: `Provide liquidity to ${params.symbolToken0}-${params.symbolToken1}${params.poolFee ? ` ${params.poolFee}%` : ""}`,
26
26
  action: OpportunityAction.POOL,
27
27
  tokens: [
28
28
  { chainId, address: params.token0 },
@@ -1,7 +1,7 @@
1
1
  import { OpportunityAction } from "../../../../../database/api/.generated";
2
2
  export const getDolomiteMetadata = (chainId, campaignSubType, params) => {
3
3
  const subtypes = [
4
- { name: "Delta", action: OpportunityAction.LEND },
4
+ { name: "Supply (delta)", action: OpportunityAction.LEND },
5
5
  { name: "Supply", action: OpportunityAction.LEND },
6
6
  { name: "Borrow", action: OpportunityAction.BORROW },
7
7
  ];
@@ -1,7 +1,7 @@
1
1
  import { OpportunityAction } from "../../../../../database/api/.generated";
2
2
  export const getErc20SnapshotMetadata = (chainId, params) => {
3
3
  return {
4
- name: ["Airdrop", params.symbolTargetToken, "holders"].join(" "),
4
+ name: ["Get", params.symbolTargetToken, "airdrop"].join(" "),
5
5
  action: OpportunityAction.DROP,
6
6
  tokens: [{ chainId, address: params.targetToken }],
7
7
  };
@@ -3,9 +3,9 @@ import { OpportunityAction } from "../../../../../database/api/.generated";
3
3
  export const getJsonAirdropMetadata = async (chainId, creator, params) => {
4
4
  const ACI = "0xdeadD8aB03075b7FBA81864202a2f59EE25B312b".toLowerCase();
5
5
  const aaveDAO = "0x5300A1a15135EA4dc7aD5a167152C01EFc9b192A".toLowerCase();
6
- const aciPrefix = creator.toLowerCase() === ACI && "Aave Merit Rewards -";
7
- const aavePrefix = creator.toLowerCase() === aaveDAO && "Aave - aAMPL distribution -";
8
- const prefix = aavePrefix ? aavePrefix : aciPrefix ? aciPrefix : "Airdrop in";
6
+ const aciPrefix = creator.toLowerCase() === ACI && "Get Merit rewards -";
7
+ const aavePrefix = creator.toLowerCase() === aaveDAO && "Get aAMPL distribution -";
8
+ const prefix = aavePrefix ? aavePrefix : aciPrefix ? aciPrefix : "Get airdrop in";
9
9
  let tokenAddress;
10
10
  try {
11
11
  const res = await fetch(params.jsonUrl);
@@ -4,10 +4,10 @@ export const getMorphoMetadata = (chainId, campaignSubType, params) => {
4
4
  const morphoParams = params;
5
5
  const market = `${morphoParams.symbolLoanToken}/${morphoParams.symbolBorrowToken} ${morphoParams?.LLTV && BN2Number(morphoParams?.LLTV, 16)}%`;
6
6
  const subtypes = [
7
- { name: `Metamorpho ${morphoParams.nameTargetToken}`, action: OpportunityAction.LEND },
7
+ { name: `Deposit in ${morphoParams.nameTargetToken} - Metamorpho`, action: OpportunityAction.LEND },
8
8
  { name: `Supply ${morphoParams.symbolLoanToken} on ${market}`, action: OpportunityAction.LEND },
9
9
  { name: `Borrow ${morphoParams.symbolLoanToken} on ${market}`, action: OpportunityAction.BORROW },
10
- { name: `Collateral ${morphoParams.symbolBorrowToken} on ${market}`, action: OpportunityAction.LEND },
10
+ { name: `Lend ${morphoParams.symbolBorrowToken} on ${market}`, action: OpportunityAction.LEND },
11
11
  ];
12
12
  const subtype = subtypes[campaignSubType];
13
13
  return {
@@ -2,7 +2,7 @@ import { OpportunityAction } from "../../../../../database/api/.generated";
2
2
  export const getRadiantMetadata = (chainId, campaignSubType, params) => {
3
3
  return {
4
4
  action: campaignSubType <= 1 ? OpportunityAction.LEND : OpportunityAction.BORROW,
5
- name: ["Radiant", params.symbolTargetToken].join(" "),
5
+ name: [campaignSubType <= 1 ? "Lend" : "Borrow", params.symbolTargetToken].join(" "),
6
6
  tokens: [{ chainId, address: params.targetToken }],
7
7
  mainProtocol: "radiant",
8
8
  };
@@ -6,7 +6,7 @@ export const getSiloMetadata = (chainId, campaignSubType, params) => {
6
6
  suffix += ` (${assetSymbol} Market)`;
7
7
  return {
8
8
  action: campaignSubType <= 1 ? OpportunityAction.LEND : OpportunityAction.BORROW,
9
- name: ["Silo", params.symbolTargetToken, suffix].join(" "),
9
+ name: [campaignSubType <= 1 ? "Lend" : "Borrow", params.symbolTargetToken, suffix].join(" "),
10
10
  tokens: [{ chainId, address: params.targetToken }],
11
11
  mainProtocol: "silo",
12
12
  };
@@ -35,6 +35,7 @@ export const PriceController = new Elysia({ prefix: "/prices", detail: { tags: [
35
35
  headers: AuthorizationHeadersDto,
36
36
  body: CreatePriceSourceDto,
37
37
  beforeHandle: BackOfficeGuard,
38
+ detail: { hide: true },
38
39
  })
39
40
  // ─── Update A Price Source ───────────────────
40
41
  .patch("/symbol/:symbol", async ({ params, body }) => await PriceService.updatePriceSource(params.symbol, body), {
@@ -42,11 +43,13 @@ export const PriceController = new Elysia({ prefix: "/prices", detail: { tags: [
42
43
  params: PriceSourceIdentifier,
43
44
  body: UpdatePriceSourceDto,
44
45
  beforeHandle: BackOfficeGuard,
46
+ detail: { hide: true },
45
47
  })
46
48
  // ─── Delete A Price Source ───────────────────
47
49
  .delete("/symbol/:symbol", async ({ params }) => await PriceService.deletePriceSource(params.symbol), {
48
50
  headers: AuthorizationHeadersDto,
49
51
  params: PriceSourceIdentifier,
50
52
  beforeHandle: BackOfficeGuard,
53
+ detail: { hide: true },
51
54
  }));
52
55
  });