@merkl/api 0.10.177 → 0.10.181

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 (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
@@ -26,6 +26,8 @@ const protocolTypes = [
26
26
  "zero",
27
27
  "koi",
28
28
  "supswap-v3",
29
+ "zkswap",
30
+ "thirdtrade",
29
31
  // ─── LP DEX ──────────────────────────────────────────────────────────
30
32
  "uniswap-v2",
31
33
  "velodrome",
@@ -69,3 +71,10 @@ export const GetProtocolsQueryDto = t.Object({
69
71
  items: t.Optional(t.Numeric()),
70
72
  });
71
73
  export const GetProtocolParamsDto = t.Object({ id: t.String() });
74
+ export const UpdateProtocolDto = t.Object({
75
+ icon: t.Optional(t.String({ format: "uri" })),
76
+ url: t.Optional(t.String({ format: "uri" })),
77
+ description: t.Optional(t.String()),
78
+ // iconFile: t.Optional(t.File()),
79
+ });
80
+ export const ProtocolIdDto = t.Object({ id: t.String() });
@@ -1,4 +1,4 @@
1
- import type { GetProtocolsQueryModel, Protocol } from "./protocol.model";
1
+ import type { GetProtocolsQueryModel, Protocol, UpdateProtocolModel } from "./protocol.model";
2
2
  export declare abstract class ProtocolRepository {
3
3
  #private;
4
4
  static create(template: Protocol["action"]["create"]["args"]): Promise<{
@@ -34,4 +34,12 @@ export declare abstract class ProtocolRepository {
34
34
  icon: string;
35
35
  }[]>;
36
36
  static countMany(query: GetProtocolsQueryModel): Promise<number>;
37
+ static update(id: string, data: UpdateProtocolModel): Promise<{
38
+ name: string;
39
+ url: string;
40
+ description: string;
41
+ id: string;
42
+ tags: import("../../../../database/api/.generated").$Enums.ProtocolTag[];
43
+ icon: string;
44
+ }>;
37
45
  }
@@ -15,7 +15,7 @@ export class ProtocolRepository {
15
15
  where: {
16
16
  name: query.name ? { contains: query.name, mode: "insensitive" } : undefined,
17
17
  tags: query.tags ? { hasEvery: query.tags } : undefined,
18
- id: query.id ? { in: query.id } : undefined,
18
+ id: typeof query.id === "string" ? query.id : !!query.id ? { in: query.id } : undefined,
19
19
  },
20
20
  };
21
21
  }
@@ -34,4 +34,7 @@ export class ProtocolRepository {
34
34
  const args = ProtocolRepository.#transformQueryToPrismaFilters(query);
35
35
  return await apiDbClient.protocol.count(args);
36
36
  }
37
+ static async update(id, data) {
38
+ return await apiDbClient.protocol.update({ where: { id }, data });
39
+ }
37
40
  }
@@ -1,10 +1,18 @@
1
1
  import { AMM as AMMV3 } from "@sdk";
2
- import type { GetProtocolsQueryModel, Protocol, ProtocolId } from "./protocol.model";
2
+ import type { GetProtocolsQueryModel, Protocol, ProtocolId, UpdateProtocolModel } from "./protocol.model";
3
3
  export declare abstract class ProtocolService {
4
4
  static getIdFromAmmV3(amm: AMMV3): ProtocolId;
5
- static getIdFromErc20Type(_type: string): ProtocolId | undefined;
6
- static findMany(query: GetProtocolsQueryModel): Promise<Protocol["model"][] | null>;
5
+ static findMany(query: GetProtocolsQueryModel): Promise<Protocol["model"][]>;
7
6
  static countMany(query: GetProtocolsQueryModel): Promise<number>;
8
7
  static getFromId(id: ProtocolId | string): Promise<Protocol["model"] | null>;
9
8
  static getFromName(name: string): Promise<Protocol["model"] | null>;
9
+ static update(id: string, data: UpdateProtocolModel): Promise<{
10
+ name: string;
11
+ url: string;
12
+ description: string;
13
+ id: string;
14
+ tags: import("../../../../database/api/.generated").$Enums.ProtocolTag[];
15
+ icon: string;
16
+ }>;
17
+ static changeLogoUrls(): Promise<void>;
10
18
  }
@@ -1,4 +1,7 @@
1
+ import { log } from "../../../utils/logger";
1
2
  import { AMM as AMMV3 } from "@sdk";
3
+ import { ChainService } from "../chain";
4
+ import { TokenService } from "../token";
2
5
  import { ProtocolRepository } from "./protocol.repository";
3
6
  // ─── Protocols Services ──────────────────────────────────────────────────────
4
7
  export class ProtocolService {
@@ -28,40 +31,11 @@ export class ProtocolService {
28
31
  [AMMV3.ZERO]: "zero",
29
32
  [AMMV3.KOI]: "koi",
30
33
  [AMMV3.SupswapV3]: "supswap-v3",
34
+ [AMMV3.AERODROME]: "aerodrome",
35
+ [AMMV3.zkSwap]: "zkswap",
36
+ [AMMV3.ThirdTrade]: "thirdtrade",
31
37
  }[amm];
32
38
  }
33
- static getIdFromErc20Type(_type) {
34
- return {
35
- uniswapv2: "uniswap-v2",
36
- velodrome: "velodrome",
37
- aerodrome: "aerodrome",
38
- balancerGauge: "balancer",
39
- balancerPool: "balancer",
40
- curve: "curve",
41
- aura: "aura",
42
- akron: "akron",
43
- dragonswap: "dragonswap",
44
- poolside: "poolside",
45
- koi: "koi",
46
- radiant_borrow: "radiant",
47
- radiant_lend: "radiant",
48
- aave_borrowing: "radiant",
49
- euler_borrow: "euler",
50
- euler_lend: "euler",
51
- gearbox: "gearbox",
52
- compound: "compound",
53
- aave_lending: "aave",
54
- sturdy_aggregator: "sturdy",
55
- sturdy_silo: "sturdy",
56
- fraxlend: "frax",
57
- moonwell: "moonwell",
58
- ionic: "ionic",
59
- fluid: "fluid",
60
- silostaking: "silo",
61
- layerbank: "layerbank",
62
- beefy: "beefy",
63
- }[_type];
64
- }
65
39
  static async findMany(query) {
66
40
  return ProtocolRepository.findMany(query);
67
41
  }
@@ -75,4 +49,36 @@ export class ProtocolService {
75
49
  static async getFromName(name) {
76
50
  return (await ProtocolRepository.findManyByName(name))[0];
77
51
  }
52
+ static async update(id, data) {
53
+ // let iconUri = data.icon;
54
+ // if (data.iconFile) {
55
+ // iconUri = await BucketService.upload("merkl-assets", `/protocols/${id}`, data.iconFile.stream(), true);
56
+ // }
57
+ return await ProtocolRepository.update(id, data);
58
+ }
59
+ static async changeLogoUrls() {
60
+ const oldUrl = "https://storage.googleapis.com/merkl-assets/";
61
+ const newUrl = "https://raw.githubusercontent.com/AngleProtocol/angle-token-list/main/src/assets/";
62
+ const protocols = await ProtocolService.findMany({ items: 10_000 });
63
+ for (const protocol of protocols) {
64
+ if (protocol.icon.includes(oldUrl)) {
65
+ await ProtocolService.update(protocol.id, { icon: protocol.icon.replace(oldUrl, newUrl) });
66
+ log.info(`Updated protocol ${protocol.id} icon`);
67
+ }
68
+ }
69
+ const chains = await ChainService.findMany();
70
+ for (const chain of chains) {
71
+ if (chain.icon.includes(oldUrl)) {
72
+ await ChainService.update(chain.id, { icon: chain.icon.replace(oldUrl, newUrl) });
73
+ log.info(`Updated chain ${chain.id} icon`);
74
+ }
75
+ }
76
+ const tokens = await TokenService.findMany({});
77
+ for (const token of tokens) {
78
+ if (token.icon.includes(oldUrl)) {
79
+ await TokenService.update(token.id, { icon: token.icon.replace(oldUrl, newUrl) });
80
+ log.info(`Updated token ${token.id} icon`);
81
+ }
82
+ }
83
+ }
78
84
  }
@@ -77,8 +77,8 @@ export class RewardConvertorService {
77
77
  accumulated: "0",
78
78
  unclaimed: "0",
79
79
  pending: "0",
80
- auxiliaryData1: breakdown.auxiliaryData1 === "" ? "0" : breakdown.auxiliaryData1 ?? "0",
81
- auxiliaryData2: breakdown.auxiliaryData2 === "" ? "0" : breakdown.auxiliaryData2 ?? "0",
80
+ auxiliaryData1: breakdown.auxiliaryData1 === "" ? "0" : (breakdown.auxiliaryData1 ?? "0"),
81
+ auxiliaryData2: breakdown.auxiliaryData2 === "" ? "0" : (breakdown.auxiliaryData2 ?? "0"),
82
82
  decimals: token.decimals,
83
83
  mainParameter: breakdown.opportunity.identifier,
84
84
  symbol: token.symbol,
@@ -477,6 +477,40 @@ export declare const v4: Elysia<"/v4", false, {
477
477
  };
478
478
  };
479
479
  };
480
+ } & {
481
+ opportunities: {
482
+ ":id": {
483
+ patch: {
484
+ body: {
485
+ name?: string | undefined;
486
+ tags?: string[] | undefined;
487
+ };
488
+ params: {
489
+ id: string;
490
+ };
491
+ query: unknown;
492
+ headers: {
493
+ authorization: string;
494
+ };
495
+ response: {
496
+ 200: {
497
+ name: string;
498
+ type: import("../../../database/api/.generated").$Enums.CampaignType;
499
+ id: string;
500
+ status: import("../../../database/api/.generated").$Enums.Status;
501
+ tags: string[];
502
+ identifier: string;
503
+ chainId: number;
504
+ action: import("../../../database/api/.generated").$Enums.OpportunityAction;
505
+ mainProtocolId: string | null;
506
+ tvl: number;
507
+ apr: number;
508
+ dailyRewards: number;
509
+ };
510
+ };
511
+ };
512
+ };
513
+ };
480
514
  };
481
515
  } & {
482
516
  v4: {
@@ -660,19 +694,17 @@ export declare const v4: Elysia<"/v4", false, {
660
694
  } & {
661
695
  "campaigns-to-process": {
662
696
  engine: {
663
- "": {
664
- post: {
665
- body: unknown;
666
- params: {};
667
- query: {
668
- chainId: number;
669
- };
670
- headers: {
671
- authorization: string;
672
- };
673
- response: {
674
- 200: string;
675
- };
697
+ post: {
698
+ body: unknown;
699
+ params: {};
700
+ query: {
701
+ chainId: number;
702
+ };
703
+ headers: {
704
+ authorization: string;
705
+ };
706
+ response: {
707
+ 200: string;
676
708
  };
677
709
  };
678
710
  };
@@ -725,7 +757,7 @@ export declare const v4: Elysia<"/v4", false, {
725
757
  id: string;
726
758
  tags: import("../../../database/api/.generated").$Enums.ProtocolTag[];
727
759
  icon: string;
728
- } & {})[] | null;
760
+ } & {})[];
729
761
  };
730
762
  };
731
763
  };
@@ -744,6 +776,35 @@ export declare const v4: Elysia<"/v4", false, {
744
776
  };
745
777
  };
746
778
  };
779
+ } & {
780
+ protocols: {
781
+ ":id": {
782
+ patch: {
783
+ body: {
784
+ url?: string | undefined;
785
+ description?: string | undefined;
786
+ icon?: string | undefined;
787
+ };
788
+ params: {
789
+ id: string;
790
+ };
791
+ query: unknown;
792
+ headers: {
793
+ authorization: string;
794
+ };
795
+ response: {
796
+ 200: {
797
+ name: string;
798
+ url: string;
799
+ description: string;
800
+ id: string;
801
+ tags: import("../../../database/api/.generated").$Enums.ProtocolTag[];
802
+ icon: string;
803
+ };
804
+ };
805
+ };
806
+ };
807
+ };
747
808
  };
748
809
  } & {
749
810
  v4: {
@@ -822,7 +883,7 @@ export declare const v4: Elysia<"/v4", false, {
822
883
  };
823
884
  headers: unknown;
824
885
  response: {
825
- 200: {
886
+ 200: ({
826
887
  symbol: string;
827
888
  name: string | null;
828
889
  id: string;
@@ -830,11 +891,11 @@ export declare const v4: Elysia<"/v4", false, {
830
891
  address: string;
831
892
  icon: string;
832
893
  decimals: number;
833
- displaySymbol: string;
834
894
  verified: boolean;
835
895
  isTest: boolean;
836
- price: number | null;
837
- }[];
896
+ } & {
897
+ price?: number | null | undefined;
898
+ })[];
838
899
  };
839
900
  };
840
901
  };
@@ -860,6 +921,40 @@ export declare const v4: Elysia<"/v4", false, {
860
921
  };
861
922
  };
862
923
  };
924
+ } & {
925
+ tokens: {
926
+ ":id": {
927
+ patch: {
928
+ body: {
929
+ icon?: string | undefined;
930
+ displaySymbol?: string | undefined;
931
+ isTest?: boolean | undefined;
932
+ };
933
+ params: {
934
+ id: string;
935
+ };
936
+ query: unknown;
937
+ headers: {
938
+ authorization: string;
939
+ };
940
+ response: {
941
+ 200: {
942
+ symbol: string;
943
+ name: string | null;
944
+ id: string;
945
+ chainId: number;
946
+ address: string;
947
+ icon: string;
948
+ decimals: number;
949
+ displaySymbol: string;
950
+ verified: boolean;
951
+ isTest: boolean;
952
+ price: number | null;
953
+ };
954
+ };
955
+ };
956
+ };
957
+ };
863
958
  };
864
959
  } & {
865
960
  v4: {
@@ -1139,6 +1234,30 @@ export declare const v4: Elysia<"/v4", false, {
1139
1234
  };
1140
1235
  };
1141
1236
  };
1237
+ } & {
1238
+ chains: {
1239
+ ":chainId": {
1240
+ patch: {
1241
+ body: {
1242
+ icon?: string | undefined;
1243
+ };
1244
+ params: {
1245
+ chainId: number;
1246
+ };
1247
+ query: unknown;
1248
+ headers: {
1249
+ authorization: string;
1250
+ };
1251
+ response: {
1252
+ 200: {
1253
+ name: string;
1254
+ id: number;
1255
+ icon: string;
1256
+ };
1257
+ };
1258
+ };
1259
+ };
1260
+ };
1142
1261
  };
1143
1262
  } & {
1144
1263
  v4: {
@@ -1839,7 +1958,7 @@ export declare const v4: Elysia<"/v4", false, {
1839
1958
  id: string;
1840
1959
  tags: import("../../../database/api/.generated").$Enums.ProtocolTag[];
1841
1960
  icon: string;
1842
- } & {})[] | null;
1961
+ } & {})[];
1843
1962
  };
1844
1963
  };
1845
1964
  };
@@ -2230,7 +2349,7 @@ export declare const v4: Elysia<"/v4", false, {
2230
2349
  };
2231
2350
  } & {
2232
2351
  v4: {
2233
- positions: {
2352
+ liquidity: {
2234
2353
  index: {
2235
2354
  get: {
2236
2355
  body: unknown;
@@ -2241,7 +2360,7 @@ export declare const v4: Elysia<"/v4", false, {
2241
2360
  };
2242
2361
  headers: unknown;
2243
2362
  response: {
2244
- 200: any[];
2363
+ 200: import("./liquidity").PositionT[];
2245
2364
  };
2246
2365
  };
2247
2366
  };
@@ -17,8 +17,8 @@ import { PrismaInstrumentation } from "@prisma/instrumentation";
17
17
  import Elysia from "elysia";
18
18
  import { DynamicDataController } from "./dynamicData";
19
19
  import { InteractionController } from "./interaction/interaction.controller";
20
+ import { LiquidityController } from "./liquidity/liquidity.controller";
20
21
  import { MerklRootController } from "./merklRoot";
21
- import { PositionController } from "./position/position.controller";
22
22
  import { StatusController } from "./status";
23
23
  import { UserController } from "./user";
24
24
  // ─── V4 Router ───────────────────────────────────────────────────────────────
@@ -59,4 +59,4 @@ export const v4 = new Elysia({ tags: ["v4"], prefix: "/v4" })
59
59
  .use(AccountingController)
60
60
  .use(DynamicDataController)
61
61
  .use(StatusController)
62
- .use(PositionController);
62
+ .use(LiquidityController);
@@ -87,7 +87,7 @@ export declare const TokenController: Elysia<"/tokens", false, {
87
87
  };
88
88
  headers: unknown;
89
89
  response: {
90
- 200: {
90
+ 200: ({
91
91
  symbol: string;
92
92
  name: string | null;
93
93
  id: string;
@@ -95,11 +95,11 @@ export declare const TokenController: Elysia<"/tokens", false, {
95
95
  address: string;
96
96
  icon: string;
97
97
  decimals: number;
98
- displaySymbol: string;
99
98
  verified: boolean;
100
99
  isTest: boolean;
101
- price: number | null;
102
- }[];
100
+ } & {
101
+ price?: number | null | undefined;
102
+ })[];
103
103
  };
104
104
  };
105
105
  };
@@ -125,6 +125,40 @@ export declare const TokenController: Elysia<"/tokens", false, {
125
125
  };
126
126
  };
127
127
  };
128
+ } & {
129
+ tokens: {
130
+ ":id": {
131
+ patch: {
132
+ body: {
133
+ icon?: string | undefined;
134
+ displaySymbol?: string | undefined;
135
+ isTest?: boolean | undefined;
136
+ };
137
+ params: {
138
+ id: string;
139
+ };
140
+ query: unknown;
141
+ headers: {
142
+ authorization: string;
143
+ };
144
+ response: {
145
+ 200: {
146
+ symbol: string;
147
+ name: string | null;
148
+ id: string;
149
+ chainId: number;
150
+ address: string;
151
+ icon: string;
152
+ decimals: number;
153
+ displaySymbol: string;
154
+ verified: boolean;
155
+ isTest: boolean;
156
+ price: number | null;
157
+ };
158
+ };
159
+ };
160
+ };
161
+ };
128
162
  }, {
129
163
  derive: {};
130
164
  resolve: {};
@@ -1,6 +1,7 @@
1
1
  import { NotFoundError } from "../../../errors/NotFound.error";
2
+ import { AuthorizationHeadersDto, BackOfficeGuard } from "../../../guards/BackOffice.guard";
2
3
  import Elysia from "elysia";
3
- import { FindUniqueTokenDto, GetTokenBalanceDto, GetTokenQueryDto } from "./token.model";
4
+ import { FindUniqueTokenDto, GetTokenBalanceDto, GetTokenQueryDto, TokenIdDto, UpdateTokenDto } from "./token.model";
4
5
  import { TokenService } from "./token.service";
5
6
  // ─── Tokens Controller ───────────────────────────────────────────────────────
6
7
  export const TokenController = new Elysia({ prefix: "/tokens", detail: { tags: ["Tokens"] } })
@@ -25,5 +26,12 @@ export const TokenController = new Elysia({ prefix: "/tokens", detail: { tags: [
25
26
  })
26
27
  // ─── Get Many Tokens ─────────────────────────────────────────────────
27
28
  .get("/", async ({ query }) => await TokenService.findMany(query), { query: GetTokenQueryDto })
28
- // ─── Count Tokens ─────────────────────────────────────────────────
29
- .get("/count", async ({ query }) => await TokenService.countMany(query), { query: GetTokenQueryDto });
29
+ // ─── Count Tokens ────────────────────────────────────────────────────
30
+ .get("/count", async ({ query }) => await TokenService.countMany(query), { query: GetTokenQueryDto })
31
+ // ─── Update IsTest Status ────────────────────────────────────────────
32
+ .patch("/:id", async ({ params, body }) => await TokenService.update(params.id, body), {
33
+ params: TokenIdDto,
34
+ body: UpdateTokenDto,
35
+ headers: AuthorizationHeadersDto,
36
+ beforeHandle: BackOfficeGuard,
37
+ });
@@ -32,5 +32,14 @@ export declare const GetTokenBalanceDto: import("@sinclair/typebox").TObject<{
32
32
  tokenAddress: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
33
33
  additionalTokenAddresses: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
34
34
  }>;
35
+ export declare const TokenIdDto: import("@sinclair/typebox").TObject<{
36
+ id: import("@sinclair/typebox").TString;
37
+ }>;
38
+ export declare const UpdateTokenDto: import("@sinclair/typebox").TObject<{
39
+ isTest: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
40
+ icon: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
41
+ displaySymbol: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
42
+ }>;
35
43
  export type TokenModel = typeof TokenDto.static;
36
44
  export type GetTokenQueryModel = typeof GetTokenQueryDto.static;
45
+ export type UpdateTokenModel = typeof UpdateTokenDto.static;
@@ -22,3 +22,10 @@ export const GetTokenBalanceDto = t.Object({
22
22
  tokenAddress: t.Optional(t.String({ description: "If provided, the default verified token balances won't be included" })),
23
23
  additionalTokenAddresses: t.Optional(t.Array(t.String())),
24
24
  });
25
+ export const TokenIdDto = t.Object({ id: t.String() });
26
+ export const UpdateTokenDto = t.Object({
27
+ isTest: t.Optional(t.Boolean()),
28
+ icon: t.Optional(t.String({ format: "uri" })),
29
+ // iconFile: t.Optional(t.File()),
30
+ displaySymbol: t.Optional(t.String()),
31
+ });
@@ -1,5 +1,5 @@
1
1
  import { type ChainId } from "@sdk";
2
- import type { GetTokenQueryModel, Token, TokenModel } from "./token.model";
2
+ import type { GetTokenQueryModel, Token, TokenModel, UpdateTokenModel } from "./token.model";
3
3
  export declare abstract class TokenRepository {
4
4
  #private;
5
5
  /**
@@ -68,4 +68,17 @@ export declare abstract class TokenRepository {
68
68
  * @param token
69
69
  */
70
70
  static create(token: Token["model"]): Promise<Token["model"] | undefined>;
71
+ static update(id: string, data: UpdateTokenModel): Promise<{
72
+ symbol: string;
73
+ name: string | null;
74
+ id: string;
75
+ chainId: number;
76
+ address: string;
77
+ icon: string;
78
+ decimals: number;
79
+ displaySymbol: string;
80
+ verified: boolean;
81
+ isTest: boolean;
82
+ price: number | null;
83
+ }>;
71
84
  }
@@ -127,4 +127,7 @@ export class TokenRepository {
127
127
  },
128
128
  });
129
129
  }
130
+ static async update(id, data) {
131
+ return await apiDbClient.token.update({ where: { id }, data });
132
+ }
130
133
  }
@@ -1,4 +1,4 @@
1
- import type { GetTokenQueryModel, Token, TokenModel, TokenUnique } from "./";
1
+ import type { GetTokenQueryModel, Token, TokenModel, TokenUnique, UpdateTokenModel } from "./";
2
2
  import type { Pricer } from "../../../utils/pricer";
3
3
  import { Prisma } from "../../../../database/api/.generated";
4
4
  import { type ChainId } from "@sdk";
@@ -133,7 +133,7 @@ export declare abstract class TokenService {
133
133
  * @param query
134
134
  * @returns A list of tokens
135
135
  */
136
- static findMany(query: GetTokenQueryModel): Promise<{
136
+ static findMany(query: GetTokenQueryModel): Promise<({
137
137
  symbol: string;
138
138
  name: string | null;
139
139
  id: string;
@@ -141,11 +141,11 @@ export declare abstract class TokenService {
141
141
  address: string;
142
142
  icon: string;
143
143
  decimals: number;
144
- displaySymbol: string;
145
144
  verified: boolean;
146
145
  isTest: boolean;
147
- price: number | null;
148
- }[]>;
146
+ } & {
147
+ price?: number | null | undefined;
148
+ })[]>;
149
149
  /**
150
150
  * Get value of tokens
151
151
  * @param tokenAmounts address/chain + amount of token
@@ -170,4 +170,17 @@ export declare abstract class TokenService {
170
170
  * @param address
171
171
  */
172
172
  static getManyOrCreate(tokens: TokenModel[]): Promise<(Token["model"] | undefined)[]>;
173
+ static update(id: string, data: UpdateTokenModel): Promise<{
174
+ symbol: string;
175
+ name: string | null;
176
+ id: string;
177
+ chainId: number;
178
+ address: string;
179
+ icon: string;
180
+ decimals: number;
181
+ displaySymbol: string;
182
+ verified: boolean;
183
+ isTest: boolean;
184
+ price: number | null;
185
+ }>;
173
186
  }
@@ -47,7 +47,7 @@ export class TokenService {
47
47
  * @param additionalTokens balances along with the verified ones
48
48
  */
49
49
  static async fetchVerifiedBalances(chainId, userAddress, additionalTokenAddresses) {
50
- const verifiedTokens = (await TokenService.findMany({ chainId: chainId, verified: true })).map(t => TokenService.format(t));
50
+ const verifiedTokens = await TokenService.findMany({ chainId: chainId, verified: true });
51
51
  const additionalTokens = !!additionalTokenAddresses?.length
52
52
  ? await TokenService.getManyOrCreate(additionalTokenAddresses?.map(address => ({ chainId, address })))
53
53
  : [];
@@ -222,7 +222,7 @@ export class TokenService {
222
222
  * @returns A list of tokens
223
223
  */
224
224
  static async findMany(query) {
225
- return await TokenRepository.findMany(query);
225
+ return (await TokenRepository.findMany(query)).map(TokenService.format);
226
226
  }
227
227
  /**
228
228
  * Get value of tokens
@@ -274,4 +274,11 @@ export class TokenService {
274
274
  }
275
275
  }));
276
276
  }
277
+ static async update(id, data) {
278
+ // let iconUri = data.icon;
279
+ // if (data.iconFile) {
280
+ // iconUri = await BucketService.upload("merkl-assets", `/tokens/${id}`, data.iconFile.stream(), true);
281
+ // }
282
+ return await TokenRepository.update(id, data);
283
+ }
277
284
  }