@merkl/api 0.10.177 → 0.10.181

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. package/dist/database/api/.generated/edge.js +6 -6
  2. package/dist/database/api/.generated/index-browser.js +4 -4
  3. package/dist/database/api/.generated/index.d.ts +2 -2
  4. package/dist/database/api/.generated/index.js +6 -6
  5. package/dist/database/api/.generated/libquery_engine-debian-openssl-1.1.x.so.node +0 -0
  6. package/dist/database/api/.generated/libquery_engine-linux-arm64-openssl-1.1.x.so.node +0 -0
  7. package/dist/database/api/.generated/libquery_engine-linux-musl-arm64-openssl-3.0.x.so.node +0 -0
  8. package/dist/database/api/.generated/package.json +1 -1
  9. package/dist/database/api/.generated/runtime/edge-esm.js +15 -15
  10. package/dist/database/api/.generated/runtime/edge.js +16 -16
  11. package/dist/database/api/.generated/runtime/library.d.ts +23 -34
  12. package/dist/database/api/.generated/runtime/library.js +56 -56
  13. package/dist/database/api/.generated/runtime/react-native.js +23 -23
  14. package/dist/database/api/.generated/runtime/wasm.js +15 -15
  15. package/dist/database/api/.generated/wasm.js +4 -4
  16. package/dist/database/engine/.generated/edge.js +6 -6
  17. package/dist/database/engine/.generated/index-browser.js +4 -4
  18. package/dist/database/engine/.generated/index.d.ts +2 -2
  19. package/dist/database/engine/.generated/index.js +6 -6
  20. package/dist/database/engine/.generated/libquery_engine-debian-openssl-1.1.x.so.node +0 -0
  21. package/dist/database/engine/.generated/libquery_engine-linux-arm64-openssl-1.1.x.so.node +0 -0
  22. package/dist/database/engine/.generated/libquery_engine-linux-musl-arm64-openssl-3.0.x.so.node +0 -0
  23. package/dist/database/engine/.generated/package.json +1 -1
  24. package/dist/database/engine/.generated/runtime/edge-esm.js +15 -15
  25. package/dist/database/engine/.generated/runtime/edge.js +16 -16
  26. package/dist/database/engine/.generated/runtime/library.d.ts +23 -34
  27. package/dist/database/engine/.generated/runtime/library.js +56 -56
  28. package/dist/database/engine/.generated/runtime/react-native.js +23 -23
  29. package/dist/database/engine/.generated/runtime/wasm.js +15 -15
  30. package/dist/database/engine/.generated/wasm.js +4 -4
  31. package/dist/src/eden/index.d.ts +348 -63
  32. package/dist/src/index.d.ts +140 -21
  33. package/dist/src/index.js +1 -1
  34. package/dist/src/libs/campaigns/campaignTypes/CLAMMDynamicData.js +2 -2
  35. package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicDataRefacto.js +3 -3
  36. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.d.ts +2 -1
  37. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.js +4 -0
  38. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AuraProcessor.d.ts +1 -0
  39. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/AuraProcessor.js +12 -3
  40. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/PendleProcessor.d.ts +1 -1
  41. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/PendleProcessor.js +1 -3
  42. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/StakingProcessor.d.ts +39 -0
  43. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/StakingProcessor.js +45 -0
  44. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/processorMapping.js +2 -0
  45. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1RefactoFinal.d.ts +2 -1
  46. package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1RefactoFinal.js +25 -1
  47. package/dist/src/modules/v4/bucket/bucket.service.d.ts +5 -0
  48. package/dist/src/modules/v4/bucket/bucket.service.js +11 -0
  49. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +11 -13
  50. package/dist/src/modules/v4/campaign/campaign.controller.js +3 -3
  51. package/dist/src/modules/v4/campaign/campaign.repository.js +1 -1
  52. package/dist/src/modules/v4/chain/chain.controller.d.ts +24 -0
  53. package/dist/src/modules/v4/chain/chain.controller.js +8 -2
  54. package/dist/src/modules/v4/chain/chain.model.d.ts +4 -0
  55. package/dist/src/modules/v4/chain/chain.model.js +4 -0
  56. package/dist/src/modules/v4/chain/chain.repository.d.ts +6 -1
  57. package/dist/src/modules/v4/chain/chain.repository.js +3 -0
  58. package/dist/src/modules/v4/chain/chain.service.d.ts +6 -1
  59. package/dist/src/modules/v4/chain/chain.service.js +7 -0
  60. package/dist/src/modules/v4/enso/enso.service.d.ts +1 -1
  61. package/dist/src/modules/v4/interaction/interaction.controller.d.ts +1 -1
  62. package/dist/src/modules/v4/{position → liquidity}/implementations/AjnaPositionFetcher.d.ts +1 -1
  63. package/dist/src/modules/v4/{position → liquidity}/implementations/BadgerPositionFetcher.d.ts +1 -1
  64. package/dist/src/modules/v4/{position → liquidity}/implementations/ClammPositionFetcher.d.ts +1 -1
  65. package/dist/src/modules/v4/{position → liquidity}/implementations/DolomitePositionFetcher.d.ts +1 -1
  66. package/dist/src/modules/v4/{position → liquidity}/implementations/DolomitePositionFetcher.js +2 -2
  67. package/dist/src/modules/v4/{position → liquidity}/implementations/ERC20PositionFetcher.d.ts +1 -1
  68. package/dist/src/modules/v4/{position → liquidity}/implementations/EulerPositionFetcher.d.ts +1 -1
  69. package/dist/src/modules/v4/liquidity/index.d.ts +2 -0
  70. package/dist/src/modules/v4/liquidity/index.js +2 -0
  71. package/dist/src/modules/v4/{position/position.controller.d.ts → liquidity/liquidity.controller.d.ts} +3 -3
  72. package/dist/src/modules/v4/{position/position.controller.js → liquidity/liquidity.controller.js} +4 -4
  73. package/dist/src/modules/v4/{position/position.repository.d.ts → liquidity/liquidity.repository.d.ts} +1 -1
  74. package/dist/src/modules/v4/{position/position.repository.js → liquidity/liquidity.repository.js} +1 -1
  75. package/dist/src/modules/v4/liquidity/liquidity.service.d.ts +5 -0
  76. package/dist/src/modules/v4/{position/position.service.js → liquidity/liquidity.service.js} +2 -2
  77. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +34 -0
  78. package/dist/src/modules/v4/opportunity/opportunity.controller.js +11 -2
  79. package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +8 -0
  80. package/dist/src/modules/v4/opportunity/opportunity.model.js +5 -0
  81. package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +29 -1
  82. package/dist/src/modules/v4/opportunity/opportunity.repository.js +6 -0
  83. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +15 -1
  84. package/dist/src/modules/v4/opportunity/opportunity.service.js +7 -6
  85. package/dist/src/modules/v4/protocol/protocol.controller.d.ts +30 -1
  86. package/dist/src/modules/v4/protocol/protocol.controller.js +9 -2
  87. package/dist/src/modules/v4/protocol/protocol.model.d.ts +10 -1
  88. package/dist/src/modules/v4/protocol/protocol.model.js +9 -0
  89. package/dist/src/modules/v4/protocol/protocol.repository.d.ts +9 -1
  90. package/dist/src/modules/v4/protocol/protocol.repository.js +4 -1
  91. package/dist/src/modules/v4/protocol/protocol.service.d.ts +11 -3
  92. package/dist/src/modules/v4/protocol/protocol.service.js +38 -32
  93. package/dist/src/modules/v4/reward/subservices/converter.js +2 -2
  94. package/dist/src/modules/v4/router.d.ts +140 -21
  95. package/dist/src/modules/v4/router.js +2 -2
  96. package/dist/src/modules/v4/token/token.controller.d.ts +38 -4
  97. package/dist/src/modules/v4/token/token.controller.js +11 -3
  98. package/dist/src/modules/v4/token/token.model.d.ts +9 -0
  99. package/dist/src/modules/v4/token/token.model.js +7 -0
  100. package/dist/src/modules/v4/token/token.repository.d.ts +14 -1
  101. package/dist/src/modules/v4/token/token.repository.js +3 -0
  102. package/dist/src/modules/v4/token/token.service.d.ts +18 -5
  103. package/dist/src/modules/v4/token/token.service.js +9 -2
  104. package/dist/src/routes/v3/blacklist.d.ts +140 -21
  105. package/dist/src/routes/v3/campaigns.d.ts +140 -21
  106. package/dist/src/routes/v3/campaignsInfo.d.ts +140 -21
  107. package/dist/src/routes/v3/multiChainPositions.d.ts +140 -21
  108. package/dist/src/routes/v3/opportunity.d.ts +140 -21
  109. package/dist/src/routes/v3/positions.d.ts +140 -21
  110. package/dist/src/routes/v3/rewards.d.ts +140 -21
  111. package/dist/src/routes/v3/updates.d.ts +140 -21
  112. package/dist/src/routes/v3/userRewards.d.ts +140 -21
  113. package/dist/src/utils/decodeCalls.js +5 -1
  114. package/dist/src/utils/encodeCalls.js +13 -1
  115. package/dist/src/utils/generateCardName.js +3 -1
  116. package/dist/src/utils/logger.d.ts +12 -6
  117. package/dist/tsconfig.package.tsbuildinfo +1 -1
  118. package/package.json +24 -24
  119. package/dist/src/modules/v4/position/index.d.ts +0 -2
  120. package/dist/src/modules/v4/position/index.js +0 -2
  121. package/dist/src/modules/v4/position/position.service.d.ts +0 -5
  122. /package/dist/src/modules/v4/{position → liquidity}/implementations/AjnaPositionFetcher.js +0 -0
  123. /package/dist/src/modules/v4/{position → liquidity}/implementations/BadgerPositionFetcher.js +0 -0
  124. /package/dist/src/modules/v4/{position → liquidity}/implementations/ClammPositionFetcher.js +0 -0
  125. /package/dist/src/modules/v4/{position → liquidity}/implementations/ERC20PositionFetcher.js +0 -0
  126. /package/dist/src/modules/v4/{position → liquidity}/implementations/EulerPositionFetcher.js +0 -0
  127. /package/dist/src/modules/v4/{position/position.model.d.ts → liquidity/liquidity.model.d.ts} +0 -0
  128. /package/dist/src/modules/v4/{position/position.model.js → liquidity/liquidity.model.js} +0 -0
@@ -98,6 +98,30 @@ export declare const ChainController: Elysia<"/chains", false, {
98
98
  };
99
99
  };
100
100
  };
101
+ } & {
102
+ chains: {
103
+ ":chainId": {
104
+ patch: {
105
+ body: {
106
+ icon?: string | undefined;
107
+ };
108
+ params: {
109
+ chainId: number;
110
+ };
111
+ query: unknown;
112
+ headers: {
113
+ authorization: string;
114
+ };
115
+ response: {
116
+ 200: {
117
+ name: string;
118
+ id: number;
119
+ icon: string;
120
+ };
121
+ };
122
+ };
123
+ };
124
+ };
101
125
  }, {
102
126
  derive: {};
103
127
  resolve: {};
@@ -1,8 +1,8 @@
1
- import { AuthorizationHeadersDto } from "../../../guards/BackOffice.guard";
1
+ import { AuthorizationHeadersDto, BackOfficeGuard } from "../../../guards/BackOffice.guard";
2
2
  import { TokenAuthGuard } from "../../../guards/TokenAuth.guard";
3
3
  import Elysia from "elysia";
4
4
  import { ExplorerService } from "../explorer";
5
- import { ChainUniqueDto, CreateChainExplorerDto, GetChainQueryDto } from "./chain.model";
5
+ import { ChainUniqueDto, CreateChainExplorerDto, GetChainQueryDto, UpdateChainDto } from "./chain.model";
6
6
  import { ChainService } from "./chain.service";
7
7
  // ─── Chains Controller ───────────────────────────────────────────────────────
8
8
  export const ChainController = new Elysia({ prefix: "/chains", detail: { tags: ["Chains"] } })
@@ -35,4 +35,10 @@ export const ChainController = new Elysia({ prefix: "/chains", detail: { tags: [
35
35
  body: CreateChainExplorerDto,
36
36
  detail: { hide: true },
37
37
  });
38
+ })
39
+ .patch("/:chainId", async ({ params, body }) => await ChainService.update(params.chainId, body), {
40
+ params: ChainUniqueDto,
41
+ body: UpdateChainDto,
42
+ headers: AuthorizationHeadersDto,
43
+ beforeHandle: BackOfficeGuard,
38
44
  });
@@ -22,6 +22,10 @@ export declare const CreateChainExplorerDto: import("@sinclair/typebox").TObject
22
22
  chainId: import("@sinclair/typebox").TNumber;
23
23
  url: import("@sinclair/typebox").TString;
24
24
  }>;
25
+ export declare const UpdateChainDto: import("@sinclair/typebox").TObject<{
26
+ icon: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
27
+ }>;
25
28
  export type ChainUniqueModel = typeof ChainUniqueDto.static;
26
29
  export type ChainSearchDto = typeof GetChainQueryDto.static;
27
30
  export type ChainsArrayModel = typeof ChainArrayDto.static;
31
+ export type UpdateChainModel = typeof UpdateChainDto.static;
@@ -18,3 +18,7 @@ export const CreateChainExplorerDto = t.Object({
18
18
  chainId: t.Number(),
19
19
  url: t.String(),
20
20
  });
21
+ export const UpdateChainDto = t.Object({
22
+ icon: t.Optional(t.String({ format: "uri" })),
23
+ // iconFile: t.Optional(t.File()),
24
+ });
@@ -1,5 +1,5 @@
1
1
  import type { Campaign, CampaignParameters } from "@sdk";
2
- import type { Chain, ChainSearchDto } from "./chain.model";
2
+ import type { Chain, ChainSearchDto, UpdateChainModel } from "./chain.model";
3
3
  export declare abstract class ChainRepository {
4
4
  #private;
5
5
  /**
@@ -63,4 +63,9 @@ export declare abstract class ChainRepository {
63
63
  * @returns
64
64
  */
65
65
  static fetchDynamicDataV3<CampaignType extends Campaign>(chainId: number, campaignType: CampaignType, campaigns: CampaignParameters<CampaignType>[]): Promise<any>;
66
+ static update(id: number, data: UpdateChainModel): Promise<{
67
+ name: string;
68
+ id: number;
69
+ icon: string;
70
+ }>;
66
71
  }
@@ -61,4 +61,7 @@ export class ChainRepository {
61
61
  const calls = campaignsDynamicData(chainId, campaigns, campaignType);
62
62
  return executeSimple(chainId, calls);
63
63
  }
64
+ static async update(id, data) {
65
+ return await apiDbClient.chain.update({ where: { id }, data });
66
+ }
64
67
  }
@@ -1,4 +1,4 @@
1
- import type { ChainSearchDto } from "./chain.model";
1
+ import type { ChainSearchDto, UpdateChainModel } from "./chain.model";
2
2
  export declare abstract class ChainService {
3
3
  static get(chainId: number): Promise<({
4
4
  Explorer: {
@@ -39,4 +39,9 @@ export declare abstract class ChainService {
39
39
  * @returns an array of chainId
40
40
  */
41
41
  static getSupportedIds(): Promise<number[]>;
42
+ static update(id: number, data: UpdateChainModel): Promise<{
43
+ name: string;
44
+ id: number;
45
+ icon: string;
46
+ }>;
42
47
  }
@@ -39,4 +39,11 @@ export class ChainService {
39
39
  }
40
40
  return supportedIds;
41
41
  }
42
+ static async update(id, data) {
43
+ // let iconUri = data.icon;
44
+ // if (data.iconFile) {
45
+ // iconUri = await BucketService.upload("merkl-assets", `/chains/${id}`, data.iconFile.stream(), true);
46
+ // }
47
+ return await ChainRepository.update(id, data);
48
+ }
42
49
  }
@@ -12,7 +12,7 @@ export declare abstract class EnsoService {
12
12
  id: string;
13
13
  tags: import("../../../../database/api/.generated").$Enums.ProtocolTag[];
14
14
  icon: string;
15
- } & {})[] | null>;
15
+ } & {})[]>;
16
16
  static getTokens(chainId: number, slug: EnsoSlug, identifier?: string): Promise<{
17
17
  type: "base" | "defi";
18
18
  chainId: number;
@@ -47,7 +47,7 @@ export declare const InteractionController: Elysia<"/interaction", false, {
47
47
  id: string;
48
48
  tags: import("../../../../database/api/.generated").$Enums.ProtocolTag[];
49
49
  icon: string;
50
- } & {})[] | null;
50
+ } & {})[];
51
51
  };
52
52
  };
53
53
  };
@@ -1,6 +1,6 @@
1
1
  import { type MerklChainId } from "@sdk";
2
2
  import type { Opportunity } from "../../opportunity";
3
- import type { PositionFetcher } from "../position.model";
3
+ import type { PositionFetcher } from "../liquidity.model";
4
4
  export declare class AjnaPositionFetcher implements PositionFetcher {
5
5
  fetchPositions: (chainId: MerklChainId, user: string, opportunities: Opportunity["model"][]) => Promise<import("..").PositionT[]>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { type MerklChainId } from "@sdk";
2
2
  import type { Opportunity } from "../../opportunity";
3
- import type { PositionFetcher, PositionT } from "../position.model";
3
+ import type { PositionFetcher, PositionT } from "../liquidity.model";
4
4
  export declare class BadgerPositionFetcher implements PositionFetcher {
5
5
  fetchPositions: (chainId: MerklChainId, user: string, opportunities: Opportunity["model"][]) => Promise<PositionT[]>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { type MerklChainId } from "@sdk";
2
2
  import type { Opportunity } from "../../opportunity";
3
- import type { PositionFetcher, PositionT } from "../position.model";
3
+ import type { PositionFetcher, PositionT } from "../liquidity.model";
4
4
  export declare class ClammPositionFetcher implements PositionFetcher {
5
5
  fetchPositions: (chainId: MerklChainId, user: string, opportunities: Opportunity["model"][]) => Promise<PositionT[]>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { type MerklChainId } from "@sdk";
2
2
  import type { Opportunity } from "../../opportunity";
3
- import type { PositionFetcher } from "../position.model";
3
+ import type { PositionFetcher } from "../liquidity.model";
4
4
  export declare class DolomitePositionFetcher implements PositionFetcher {
5
5
  fetchPositions: (chainId: MerklChainId, user: string, opportunities: Opportunity["model"][]) => Promise<import("..").PositionT[]>;
6
6
  }
@@ -1,12 +1,12 @@
1
1
  import { Campaign } from "@sdk";
2
2
  import { utils } from "ethers";
3
3
  import { CampaignService } from "../../campaign";
4
- import { PositionRepository } from "../position.repository";
4
+ import { LiquidityRepository } from "../liquidity.repository";
5
5
  const campaignType = Campaign.DOLOMITE;
6
6
  export class DolomitePositionFetcher {
7
7
  fetchPositions = async (chainId, user, opportunities) => {
8
8
  opportunities = opportunities.filter(o => o.type === Campaign[campaignType] && o.tokens?.length > 0 && o.chainId === chainId);
9
- const dolomitePositions = await PositionRepository.findManyDolomitePositions(chainId, user);
9
+ const dolomitePositions = await LiquidityRepository.findManyDolomitePositions(chainId, user);
10
10
  // Generic calls
11
11
  for (const opportunity of opportunities) {
12
12
  // Call per opportunity
@@ -1,6 +1,6 @@
1
1
  import { type MerklChainId } from "@sdk";
2
2
  import type { Opportunity } from "../../opportunity";
3
- import type { PositionFetcher, PositionT } from "../position.model";
3
+ import type { PositionFetcher, PositionT } from "../liquidity.model";
4
4
  export declare class ERC20PositionFetcher implements PositionFetcher {
5
5
  fetchPositions: (chainId: MerklChainId, user: string, opportunities: Opportunity["model"][]) => Promise<PositionT[]>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { type MerklChainId } from "@sdk";
2
2
  import type { Opportunity } from "../../opportunity";
3
- import type { PositionFetcher, PositionT } from "../position.model";
3
+ import type { PositionFetcher, PositionT } from "../liquidity.model";
4
4
  export declare class EulerPositionFetcher implements PositionFetcher {
5
5
  fetchPositions: (chainId: MerklChainId, user: string, opportunities: Opportunity["model"][]) => Promise<PositionT[]>;
6
6
  }
@@ -0,0 +1,2 @@
1
+ export * from "./liquidity.model";
2
+ export * from "./liquidity.service";
@@ -0,0 +1,2 @@
1
+ export * from "./liquidity.model";
2
+ export * from "./liquidity.service";
@@ -1,5 +1,5 @@
1
1
  import { Elysia } from "elysia";
2
- export declare const PositionController: Elysia<"/positions", false, {
2
+ export declare const LiquidityController: Elysia<"/liquidity", false, {
3
3
  decorator: {};
4
4
  store: {};
5
5
  derive: {};
@@ -12,7 +12,7 @@ export declare const PositionController: Elysia<"/positions", false, {
12
12
  macro: {};
13
13
  macroFn: {};
14
14
  }, {
15
- positions: {
15
+ liquidity: {
16
16
  index: {
17
17
  get: {
18
18
  body: unknown;
@@ -23,7 +23,7 @@ export declare const PositionController: Elysia<"/positions", false, {
23
23
  };
24
24
  headers: unknown;
25
25
  response: {
26
- 200: any[];
26
+ 200: import("./liquidity.model").PositionT[];
27
27
  };
28
28
  };
29
29
  };
@@ -1,12 +1,12 @@
1
1
  import { throwOnInvalidRequiredAddress, throwOnUnsupportedChainId } from "../../../utils/throw";
2
2
  import { Elysia } from "elysia";
3
- import { PositionsInputDto } from "./position.model";
4
- import { PositionService } from "./position.service";
3
+ import { PositionsInputDto } from "./liquidity.model";
4
+ import { LiquidityService } from "./liquidity.service";
5
5
  // ─── Positions Controller ──────────────────────────────────────────────
6
- export const PositionController = new Elysia({ prefix: "/positions", detail: { tags: ["Positions"] } })
6
+ export const LiquidityController = new Elysia({ prefix: "/liquidity", detail: { tags: ["Positions"] } })
7
7
  // ─── Get User Positions on a Chain ───────────────────────────────────
8
8
  .get("/", async ({ query }) => {
9
- return await PositionService.fetchPositions(query);
9
+ return await LiquidityService.fetchPositions(query);
10
10
  }, {
11
11
  query: PositionsInputDto,
12
12
  beforeHandle: ({ query }) => {
@@ -1,5 +1,5 @@
1
1
  import type { MerklChainId } from "@sdk";
2
- export declare class PositionRepository {
2
+ export declare class LiquidityRepository {
3
3
  static findManyDolomitePositions(chainId: MerklChainId, user: string): Promise<{
4
4
  balance: string;
5
5
  token: {
@@ -1,5 +1,5 @@
1
1
  import axios from "axios";
2
- export class PositionRepository {
2
+ export class LiquidityRepository {
3
3
  static async findManyDolomitePositions(chainId, user) {
4
4
  return (await axios.get(`https://api.dolomite.io/balances/${chainId}/users/${user}`)).data.Result;
5
5
  }
@@ -0,0 +1,5 @@
1
+ import type { PositionT, PositionsInputModel } from "./liquidity.model";
2
+ export declare class LiquidityService {
3
+ #private;
4
+ static fetchPositions(query: PositionsInputModel): Promise<PositionT[]>;
5
+ }
@@ -7,7 +7,7 @@ import { ClammPositionFetcher } from "./implementations/ClammPositionFetcher";
7
7
  import { DolomitePositionFetcher } from "./implementations/DolomitePositionFetcher";
8
8
  import { ERC20PositionFetcher } from "./implementations/ERC20PositionFetcher";
9
9
  import { EulerPositionFetcher } from "./implementations/EulerPositionFetcher";
10
- export class PositionService {
10
+ export class LiquidityService {
11
11
  static #fetchers = {
12
12
  [Campaign.ERC20]: new ERC20PositionFetcher(),
13
13
  [Campaign.EULER]: new EulerPositionFetcher(),
@@ -20,7 +20,7 @@ export class PositionService {
20
20
  const opportunities = await OpportunityService.findLiveWithFirstCampaign(query.chainId);
21
21
  const promises = [];
22
22
  for (const campaignType of Object.keys(Campaign)) {
23
- const fetcher = PositionService.#fetchers[Number.parseInt(campaignType)];
23
+ const fetcher = LiquidityService.#fetchers[Number.parseInt(campaignType)];
24
24
  if (fetcher) {
25
25
  promises.push(withTimeout(fetcher.fetchPositions(query.chainId, query.address, opportunities.filter(o => !!o)), MERKL_USER_POSITION_FETCHING_GLOBAL_TIMEOUT));
26
26
  }
@@ -468,6 +468,40 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
468
468
  };
469
469
  };
470
470
  };
471
+ } & {
472
+ opportunities: {
473
+ ":id": {
474
+ patch: {
475
+ body: {
476
+ name?: string | undefined;
477
+ tags?: string[] | undefined;
478
+ };
479
+ params: {
480
+ id: string;
481
+ };
482
+ query: unknown;
483
+ headers: {
484
+ authorization: string;
485
+ };
486
+ response: {
487
+ 200: {
488
+ name: string;
489
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
490
+ id: string;
491
+ status: import("../../../../database/api/.generated").$Enums.Status;
492
+ tags: string[];
493
+ identifier: string;
494
+ chainId: number;
495
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
496
+ mainProtocolId: string | null;
497
+ tvl: number;
498
+ apr: number;
499
+ dailyRewards: number;
500
+ };
501
+ };
502
+ };
503
+ };
504
+ };
471
505
  }, {
472
506
  derive: {};
473
507
  resolve: {};
@@ -1,7 +1,8 @@
1
1
  import { NotFoundError } from "../../../errors";
2
+ import { BackOfficeGuard } from "../../../guards/BackOffice.guard";
2
3
  import { AuthorizationHeadersDto, TokenAuthGuard } from "../../../guards/TokenAuth.guard";
3
4
  import Elysia from "elysia";
4
- import { CreateOpportunityDto, GetOpportunitiesQueryDto, OpportunityAggregateFieldDto, OpportunityUniqueDto, } from "./opportunity.model";
5
+ import { CreateOpportunityDto, GetOpportunitiesQueryDto, OpportunityAggregateFieldDto, OpportunityIdDto, OpportunityUniqueDto, UpdateOpportunityDto, } from "./opportunity.model";
5
6
  import { OpportunityService } from "./opportunity.service";
6
7
  import { transformId } from "./transform-id.pipe";
7
8
  import { validateId } from "./validate-id.pipe";
@@ -65,8 +66,16 @@ export const OpportunityController = new Elysia({
65
66
  })
66
67
  // ─── Get Opportunities Count ─────────────────────────────────────────
67
68
  .get("/count", async ({ query }) => await OpportunityService.countMany(query), { query: GetOpportunitiesQueryDto })
68
- // ─── Get Aggregate fields ─────────────────────────────────────────
69
+ // ─── Get Aggregate Fields ────────────────────────────────────────────
69
70
  .get("/aggregate/:field", async ({ query, params }) => await OpportunityService.aggregate(query, params.field), {
70
71
  params: OpportunityAggregateFieldDto,
71
72
  query: GetOpportunitiesQueryDto,
73
+ })
74
+ // ─── Update An Opportunity ───────────────────────────────────────────
75
+ .patch("/:id", async ({ params, body }) => await OpportunityService.update(params.id, body), {
76
+ params: OpportunityIdDto,
77
+ body: UpdateOpportunityDto,
78
+ headers: AuthorizationHeadersDto,
79
+ beforeHandle: BackOfficeGuard,
80
+ detail: { hide: true },
72
81
  });
@@ -112,8 +112,16 @@ export declare const CreateOpportunityDto: import("@sinclair/typebox").TObject<{
112
112
  export declare const OpportunityAggregateFieldDto: import("@sinclair/typebox").TObject<{
113
113
  field: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"dailyRewards">[]>;
114
114
  }>;
115
+ export declare const OpportunityIdDto: import("@sinclair/typebox").TObject<{
116
+ id: import("@sinclair/typebox").TString;
117
+ }>;
118
+ export declare const UpdateOpportunityDto: import("@sinclair/typebox").TObject<{
119
+ name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
120
+ tags: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
121
+ }>;
115
122
  export type GetOpportunitiesQueryModel = typeof GetOpportunitiesQueryDto.static;
116
123
  export type CreateOpportunityModel = typeof CreateOpportunityDto.static & {
117
124
  id: string;
118
125
  };
119
126
  export type OpportunityAggregateField = typeof OpportunityAggregateFieldDto.static;
127
+ export type UpdateOpportunityModel = typeof UpdateOpportunityDto.static;
@@ -39,3 +39,8 @@ export const CreateOpportunityDto = t.Object({
39
39
  export const OpportunityAggregateFieldDto = t.Object({
40
40
  field: t.Union(["dailyRewards"].map(v => t.Literal(v))),
41
41
  });
42
+ export const OpportunityIdDto = t.Object({ id: t.String() });
43
+ export const UpdateOpportunityDto = t.Object({
44
+ name: t.Optional(t.String()),
45
+ tags: t.Optional(t.Array(t.String())),
46
+ });
@@ -3,7 +3,7 @@ import type { MerklChainId } from "@sdk";
3
3
  import { type AprRecord } from "../apr";
4
4
  import { type DailyRewardsRecord } from "../reward";
5
5
  import { type TvlRecord } from "../tvl";
6
- import type { CreateOpportunityModel, GetOpportunitiesQueryModel } from "./opportunity.model";
6
+ import type { CreateOpportunityModel, GetOpportunitiesQueryModel, UpdateOpportunityModel } from "./opportunity.model";
7
7
  export declare abstract class OpportunityRepository {
8
8
  #private;
9
9
  static create(newOpp: CreateOpportunityModel): Promise<void>;
@@ -701,7 +701,35 @@ export declare abstract class OpportunityRepository {
701
701
  apr: number;
702
702
  dailyRewards: number;
703
703
  }>;
704
+ static updateChainId(id: string, chainId: MerklChainId): Promise<{
705
+ name: string;
706
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
707
+ id: string;
708
+ status: import("../../../../database/api/.generated").$Enums.Status;
709
+ tags: string[];
710
+ identifier: string;
711
+ chainId: number;
712
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
713
+ mainProtocolId: string | null;
714
+ tvl: number;
715
+ apr: number;
716
+ dailyRewards: number;
717
+ }>;
704
718
  static aggregateSum(field: keyof Prisma.OpportunitySumAggregateInputType, query: GetOpportunitiesQueryModel): Promise<{
705
719
  sum: never;
706
720
  }>;
721
+ static update(id: string, data: UpdateOpportunityModel): Promise<{
722
+ name: string;
723
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
724
+ id: string;
725
+ status: import("../../../../database/api/.generated").$Enums.Status;
726
+ tags: string[];
727
+ identifier: string;
728
+ chainId: number;
729
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
730
+ mainProtocolId: string | null;
731
+ tvl: number;
732
+ apr: number;
733
+ dailyRewards: number;
734
+ }>;
707
735
  }
@@ -281,6 +281,9 @@ export class OpportunityRepository {
281
281
  static async updateName(id, name) {
282
282
  return await apiDbClient.opportunity.update({ where: { id }, data: { name } });
283
283
  }
284
+ static async updateChainId(id, chainId) {
285
+ return await apiDbClient.opportunity.update({ where: { id }, data: { chainId } });
286
+ }
284
287
  static async aggregateSum(field, query) {
285
288
  const args = OpportunityRepository.#transformQueryToPrismaFilters(query);
286
289
  const result = await apiDbClient.opportunity.aggregate({
@@ -291,4 +294,7 @@ export class OpportunityRepository {
291
294
  });
292
295
  return { sum: result._sum[field] ?? null };
293
296
  }
297
+ static async update(id, data) {
298
+ return await apiDbClient.opportunity.update({ where: { id }, data });
299
+ }
294
300
  }
@@ -1,7 +1,7 @@
1
1
  import { type CreateCampaignModel } from "../campaign";
2
2
  import { Prisma } from "../../../../database/api/.generated";
3
3
  import { type ChainId, type MerklChainId } from "@sdk";
4
- import type { CreateOpportunityModel, GetOpportunitiesQueryModel, LightOpportunityFromDB, OpportunityMetadata, OpportunityUnique } from "./opportunity.model";
4
+ import type { CreateOpportunityModel, GetOpportunitiesQueryModel, LightOpportunityFromDB, OpportunityMetadata, OpportunityUnique, UpdateOpportunityModel } from "./opportunity.model";
5
5
  import { OpportunityRepository } from "./opportunity.repository";
6
6
  export declare abstract class OpportunityService {
7
7
  static hashId(opportunity: OpportunityUnique): string;
@@ -605,4 +605,18 @@ export declare abstract class OpportunityService {
605
605
  static aggregate(query: GetOpportunitiesQueryModel, field: keyof Prisma.OpportunitySumAggregateInputType): Promise<{
606
606
  sum: never;
607
607
  }>;
608
+ static update(id: string, data: UpdateOpportunityModel): Promise<{
609
+ name: string;
610
+ type: import("../../../../database/api/.generated").$Enums.CampaignType;
611
+ id: string;
612
+ status: import("../../../../database/api/.generated").$Enums.Status;
613
+ tags: string[];
614
+ identifier: string;
615
+ chainId: number;
616
+ action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
617
+ mainProtocolId: string | null;
618
+ tvl: number;
619
+ apr: number;
620
+ dailyRewards: number;
621
+ }>;
608
622
  }
@@ -146,12 +146,10 @@ export class OpportunityService {
146
146
  * @returns A list of opportunities
147
147
  */
148
148
  static async getMany(query) {
149
- return record("data-layer.access", async () => {
150
- return await CacheService.wrap(TTLPresets.MIN_5, async (query) => {
151
- const opportunities = await OpportunityRepository.findMany(query);
152
- return opportunities.map(OpportunityService.formatResponse);
153
- }, query);
154
- });
149
+ return await CacheService.wrap(TTLPresets.MIN_5, async (query) => {
150
+ const opportunities = await OpportunityRepository.findMany(query);
151
+ return opportunities.map(OpportunityService.formatResponse);
152
+ }, query);
155
153
  }
156
154
  static async findLiveWithFirstCampaign(chainId) {
157
155
  return record("data-layer.access", async () => {
@@ -221,4 +219,7 @@ export class OpportunityService {
221
219
  static aggregate(query, field) {
222
220
  return OpportunityRepository.aggregateSum(field, query);
223
221
  }
222
+ static async update(id, data) {
223
+ return await OpportunityRepository.update(id, data);
224
+ }
224
225
  }
@@ -56,7 +56,7 @@ export declare const ProtocolController: Elysia<"/protocols", false, {
56
56
  id: string;
57
57
  tags: import("../../../../database/api/.generated").$Enums.ProtocolTag[];
58
58
  icon: string;
59
- } & {})[] | null;
59
+ } & {})[];
60
60
  };
61
61
  };
62
62
  };
@@ -75,6 +75,35 @@ export declare const ProtocolController: Elysia<"/protocols", false, {
75
75
  };
76
76
  };
77
77
  };
78
+ } & {
79
+ protocols: {
80
+ ":id": {
81
+ patch: {
82
+ body: {
83
+ url?: string | undefined;
84
+ description?: string | undefined;
85
+ icon?: string | undefined;
86
+ };
87
+ params: {
88
+ id: string;
89
+ };
90
+ query: unknown;
91
+ headers: {
92
+ authorization: string;
93
+ };
94
+ response: {
95
+ 200: {
96
+ name: string;
97
+ url: string;
98
+ description: string;
99
+ id: string;
100
+ tags: import("../../../../database/api/.generated").$Enums.ProtocolTag[];
101
+ icon: string;
102
+ };
103
+ };
104
+ };
105
+ };
106
+ };
78
107
  }, {
79
108
  derive: {};
80
109
  resolve: {};
@@ -1,5 +1,6 @@
1
+ import { AuthorizationHeadersDto, BackOfficeGuard } from "../../../guards/BackOffice.guard";
1
2
  import Elysia from "elysia";
2
- import { GetProtocolsQueryDto } from "./protocol.model";
3
+ import { GetProtocolsQueryDto, ProtocolIdDto, UpdateProtocolDto } from "./protocol.model";
3
4
  import { ProtocolService } from "./protocol.service";
4
5
  // ─── Protocols Controller ────────────────────────────────────────────────────
5
6
  export const ProtocolController = new Elysia({ prefix: "/protocols", detail: { tags: ["Protocols"] } })
@@ -15,4 +16,10 @@ export const ProtocolController = new Elysia({ prefix: "/protocols", detail: { t
15
16
  query: GetProtocolsQueryDto,
16
17
  })
17
18
  // ─── Count Protocols ──────────────────────────────────────────────
18
- .get("/count", async ({ query }) => await ProtocolService.countMany(query));
19
+ .get("/count", async ({ query }) => await ProtocolService.countMany(query))
20
+ .patch("/:id", async ({ params, body }) => await ProtocolService.update(params.id, body), {
21
+ params: ProtocolIdDto,
22
+ body: UpdateProtocolDto,
23
+ headers: AuthorizationHeadersDto,
24
+ beforeHandle: BackOfficeGuard,
25
+ });
@@ -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", "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"];
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"];
9
9
  export type ProtocolId = (typeof protocolTypes)[number];
10
10
  export declare const GetProtocolsQueryDto: import("@sinclair/typebox").TObject<{
11
11
  id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TTransform<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>]>, string[]>>;
@@ -22,6 +22,15 @@ export declare const GetProtocolsQueryDto: import("@sinclair/typebox").TObject<{
22
22
  export declare const GetProtocolParamsDto: import("@sinclair/typebox").TObject<{
23
23
  id: import("@sinclair/typebox").TString;
24
24
  }>;
25
+ export declare const UpdateProtocolDto: import("@sinclair/typebox").TObject<{
26
+ icon: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
27
+ url: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
28
+ description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
29
+ }>;
30
+ export declare const ProtocolIdDto: import("@sinclair/typebox").TObject<{
31
+ id: import("@sinclair/typebox").TString;
32
+ }>;
25
33
  export type GetProtocolsQueryModel = typeof GetProtocolsQueryDto.static;
26
34
  export type GetProtocolModel = typeof GetProtocolParamsDto.static;
35
+ export type UpdateProtocolModel = typeof UpdateProtocolDto.static;
27
36
  export {};