@3rd-eye-labs/openmm 0.1.5 → 0.1.7

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 (271) hide show
  1. package/dist/api/index.d.ts +3 -0
  2. package/dist/api/index.d.ts.map +1 -0
  3. package/dist/api/index.js +9 -0
  4. package/dist/api/index.js.map +1 -0
  5. package/dist/api/openapi.d.ts +3 -0
  6. package/dist/api/openapi.d.ts.map +1 -0
  7. package/dist/api/openapi.js +214 -0
  8. package/dist/api/openapi.js.map +1 -0
  9. package/dist/api/routes/balance.d.ts +3 -0
  10. package/dist/api/routes/balance.d.ts.map +1 -0
  11. package/dist/api/routes/balance.js +101 -0
  12. package/dist/api/routes/balance.js.map +1 -0
  13. package/dist/api/routes/cardano.d.ts +3 -0
  14. package/dist/api/routes/cardano.d.ts.map +1 -0
  15. package/dist/api/routes/cardano.js +177 -0
  16. package/dist/api/routes/cardano.js.map +1 -0
  17. package/dist/api/routes/health.d.ts +3 -0
  18. package/dist/api/routes/health.d.ts.map +1 -0
  19. package/dist/api/routes/health.js +115 -0
  20. package/dist/api/routes/health.js.map +1 -0
  21. package/dist/api/routes/index.d.ts +3 -0
  22. package/dist/api/routes/index.d.ts.map +1 -0
  23. package/dist/api/routes/index.js +39 -0
  24. package/dist/api/routes/index.js.map +1 -0
  25. package/dist/api/routes/orderbook.d.ts +3 -0
  26. package/dist/api/routes/orderbook.d.ts.map +1 -0
  27. package/dist/api/routes/orderbook.js +123 -0
  28. package/dist/api/routes/orderbook.js.map +1 -0
  29. package/dist/api/routes/orders.d.ts +3 -0
  30. package/dist/api/routes/orders.d.ts.map +1 -0
  31. package/dist/api/routes/orders.js +214 -0
  32. package/dist/api/routes/orders.js.map +1 -0
  33. package/dist/api/routes/price.d.ts +3 -0
  34. package/dist/api/routes/price.d.ts.map +1 -0
  35. package/dist/api/routes/price.js +124 -0
  36. package/dist/api/routes/price.js.map +1 -0
  37. package/dist/api/routes/strategy.d.ts +3 -0
  38. package/dist/api/routes/strategy.d.ts.map +1 -0
  39. package/dist/api/routes/strategy.js +345 -0
  40. package/dist/api/routes/strategy.js.map +1 -0
  41. package/dist/api/routes/ticker.d.ts +3 -0
  42. package/dist/api/routes/ticker.d.ts.map +1 -0
  43. package/dist/api/routes/ticker.js +91 -0
  44. package/dist/api/routes/ticker.js.map +1 -0
  45. package/dist/api/routes/trades.d.ts +3 -0
  46. package/dist/api/routes/trades.d.ts.map +1 -0
  47. package/dist/api/routes/trades.js +129 -0
  48. package/dist/api/routes/trades.js.map +1 -0
  49. package/dist/api/server.d.ts +11 -0
  50. package/dist/api/server.d.ts.map +1 -0
  51. package/dist/api/server.js +65 -0
  52. package/dist/api/server.js.map +1 -0
  53. package/dist/cli/cli.js +3 -1
  54. package/dist/cli/cli.js.map +1 -1
  55. package/dist/cli/commands/grid.d.ts +3 -0
  56. package/dist/cli/commands/grid.d.ts.map +1 -0
  57. package/dist/cli/commands/grid.js +103 -0
  58. package/dist/cli/commands/grid.js.map +1 -0
  59. package/dist/cli/commands/multi-trade.d.ts +3 -0
  60. package/dist/cli/commands/multi-trade.d.ts.map +1 -0
  61. package/dist/cli/commands/multi-trade.js +175 -0
  62. package/dist/cli/commands/multi-trade.js.map +1 -0
  63. package/dist/cli/commands/serve.d.ts +3 -0
  64. package/dist/cli/commands/serve.d.ts.map +1 -0
  65. package/dist/cli/commands/serve.js +53 -0
  66. package/dist/cli/commands/serve.js.map +1 -0
  67. package/dist/cli/pool-discovery.d.ts +56 -0
  68. package/dist/cli/pool-discovery.d.ts.map +1 -0
  69. package/dist/cli/pool-discovery.js +283 -0
  70. package/dist/cli/pool-discovery.js.map +1 -0
  71. package/dist/config/environment.d.ts +19 -0
  72. package/dist/config/environment.d.ts.map +1 -1
  73. package/dist/config/environment.js +87 -51
  74. package/dist/config/environment.js.map +1 -1
  75. package/dist/core/price-aggregation/price-cache.d.ts +55 -0
  76. package/dist/core/price-aggregation/price-cache.d.ts.map +1 -0
  77. package/dist/core/price-aggregation/price-cache.js +152 -0
  78. package/dist/core/price-aggregation/price-cache.js.map +1 -0
  79. package/dist/examples/mexc-connector-comprehensive-test.d.ts +15 -0
  80. package/dist/examples/mexc-connector-comprehensive-test.d.ts.map +1 -0
  81. package/dist/examples/mexc-connector-comprehensive-test.js +514 -0
  82. package/dist/examples/mexc-connector-comprehensive-test.js.map +1 -0
  83. package/dist/examples/mexc-order-update-test.d.ts +4 -0
  84. package/dist/examples/mexc-order-update-test.d.ts.map +1 -0
  85. package/dist/examples/mexc-order-update-test.js +186 -0
  86. package/dist/examples/mexc-order-update-test.js.map +1 -0
  87. package/dist/examples/mexc-test.d.ts +9 -0
  88. package/dist/examples/mexc-test.d.ts.map +1 -0
  89. package/dist/examples/mexc-test.js +218 -0
  90. package/dist/examples/mexc-test.js.map +1 -0
  91. package/dist/examples/mexc-trades-debug.d.ts +2 -0
  92. package/dist/examples/mexc-trades-debug.d.ts.map +1 -0
  93. package/dist/examples/mexc-trades-debug.js +101 -0
  94. package/dist/examples/mexc-trades-debug.js.map +1 -0
  95. package/dist/examples/mexc-trades-subscription-debug.d.ts +2 -0
  96. package/dist/examples/mexc-trades-subscription-debug.d.ts.map +1 -0
  97. package/dist/examples/mexc-trades-subscription-debug.js +150 -0
  98. package/dist/examples/mexc-trades-subscription-debug.js.map +1 -0
  99. package/dist/examples/mexc-websocket-test.d.ts +8 -0
  100. package/dist/examples/mexc-websocket-test.d.ts.map +1 -0
  101. package/dist/examples/mexc-websocket-test.js +115 -0
  102. package/dist/examples/mexc-websocket-test.js.map +1 -0
  103. package/dist/examples/test-protobuf-status-detection.d.ts +9 -0
  104. package/dist/examples/test-protobuf-status-detection.d.ts.map +1 -0
  105. package/dist/examples/test-protobuf-status-detection.js +83 -0
  106. package/dist/examples/test-protobuf-status-detection.js.map +1 -0
  107. package/dist/exchanges/base-exchange-connector.d.ts +33 -0
  108. package/dist/exchanges/base-exchange-connector.d.ts.map +1 -0
  109. package/dist/exchanges/base-exchange-connector.js +55 -0
  110. package/dist/exchanges/base-exchange-connector.js.map +1 -0
  111. package/dist/exchanges/kraken/test-kraken-websocket.d.ts +19 -0
  112. package/dist/exchanges/kraken/test-kraken-websocket.d.ts.map +1 -0
  113. package/dist/exchanges/kraken/test-kraken-websocket.js +413 -0
  114. package/dist/exchanges/kraken/test-kraken-websocket.js.map +1 -0
  115. package/dist/index.d.ts +1 -0
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +2 -0
  118. package/dist/index.js.map +1 -1
  119. package/dist/mcp/resources/index.d.ts +3 -0
  120. package/dist/mcp/resources/index.d.ts.map +1 -0
  121. package/dist/mcp/resources/index.js +11 -0
  122. package/dist/mcp/resources/index.js.map +1 -0
  123. package/dist/mcp/server.d.ts +4 -0
  124. package/dist/mcp/server.d.ts.map +1 -0
  125. package/dist/mcp/server.js +29 -0
  126. package/dist/mcp/server.js.map +1 -0
  127. package/dist/mcp/tools/index.d.ts +3 -0
  128. package/dist/mcp/tools/index.d.ts.map +1 -0
  129. package/dist/mcp/tools/index.js +12 -0
  130. package/dist/mcp/tools/index.js.map +1 -0
  131. package/dist/tests/fixtures/test-helpers.d.ts +5 -0
  132. package/dist/tests/fixtures/test-helpers.d.ts.map +1 -0
  133. package/dist/tests/fixtures/test-helpers.js +8 -0
  134. package/dist/tests/fixtures/test-helpers.js.map +1 -0
  135. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts +2 -0
  136. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts.map +1 -0
  137. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js +237 -0
  138. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js.map +1 -0
  139. package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts +2 -0
  140. package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts.map +1 -0
  141. package/dist/tests/integration/price-aggregation/cardano-price-service.test.js +57 -0
  142. package/dist/tests/integration/price-aggregation/cardano-price-service.test.js.map +1 -0
  143. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts +2 -0
  144. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts.map +1 -0
  145. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js +141 -0
  146. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js.map +1 -0
  147. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts +2 -0
  148. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts.map +1 -0
  149. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js +375 -0
  150. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js.map +1 -0
  151. package/dist/tests/unit/cli/exchange-factory.test.d.ts +2 -0
  152. package/dist/tests/unit/cli/exchange-factory.test.d.ts.map +1 -0
  153. package/dist/tests/unit/cli/exchange-factory.test.js +148 -0
  154. package/dist/tests/unit/cli/exchange-factory.test.js.map +1 -0
  155. package/dist/tests/unit/config/environment.test.d.ts +2 -0
  156. package/dist/tests/unit/config/environment.test.d.ts.map +1 -0
  157. package/dist/tests/unit/config/environment.test.js +158 -0
  158. package/dist/tests/unit/config/environment.test.js.map +1 -0
  159. package/dist/tests/unit/config/launcher-config.test.d.ts +2 -0
  160. package/dist/tests/unit/config/launcher-config.test.d.ts.map +1 -0
  161. package/dist/tests/unit/config/launcher-config.test.js +117 -0
  162. package/dist/tests/unit/config/launcher-config.test.js.map +1 -0
  163. package/dist/tests/unit/config/price-aggregation.test.d.ts +2 -0
  164. package/dist/tests/unit/config/price-aggregation.test.d.ts.map +1 -0
  165. package/dist/tests/unit/config/price-aggregation.test.js +144 -0
  166. package/dist/tests/unit/config/price-aggregation.test.js.map +1 -0
  167. package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts +2 -0
  168. package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts.map +1 -0
  169. package/dist/tests/unit/core/exchange/base-exchange-connector.test.js +191 -0
  170. package/dist/tests/unit/core/exchange/base-exchange-connector.test.js.map +1 -0
  171. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts +2 -0
  172. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts.map +1 -0
  173. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js +324 -0
  174. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js.map +1 -0
  175. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts +2 -0
  176. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts.map +1 -0
  177. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js +177 -0
  178. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js.map +1 -0
  179. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts +2 -0
  180. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts.map +1 -0
  181. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js +168 -0
  182. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js.map +1 -0
  183. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts +2 -0
  184. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts.map +1 -0
  185. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js +217 -0
  186. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js.map +1 -0
  187. package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts +2 -0
  188. package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts.map +1 -0
  189. package/dist/tests/unit/core/price-aggregation/price-calculator.test.js +229 -0
  190. package/dist/tests/unit/core/price-aggregation/price-calculator.test.js.map +1 -0
  191. package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts +2 -0
  192. package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts.map +1 -0
  193. package/dist/tests/unit/core/risk-management/risk-manager.test.js +194 -0
  194. package/dist/tests/unit/core/risk-management/risk-manager.test.js.map +1 -0
  195. package/dist/tests/unit/core/strategy/base-strategy.test.d.ts +2 -0
  196. package/dist/tests/unit/core/strategy/base-strategy.test.d.ts.map +1 -0
  197. package/dist/tests/unit/core/strategy/base-strategy.test.js +254 -0
  198. package/dist/tests/unit/core/strategy/base-strategy.test.js.map +1 -0
  199. package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts +2 -0
  200. package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts.map +1 -0
  201. package/dist/tests/unit/core/strategy/strategy-factory.test.js +213 -0
  202. package/dist/tests/unit/core/strategy/strategy-factory.test.js.map +1 -0
  203. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts +2 -0
  204. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts.map +1 -0
  205. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js +452 -0
  206. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js.map +1 -0
  207. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts +2 -0
  208. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts.map +1 -0
  209. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js +1419 -0
  210. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js.map +1 -0
  211. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts +2 -0
  212. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts.map +1 -0
  213. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js +435 -0
  214. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js.map +1 -0
  215. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts +2 -0
  216. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts.map +1 -0
  217. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js +314 -0
  218. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js.map +1 -0
  219. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts +2 -0
  220. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts.map +1 -0
  221. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js +178 -0
  222. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js.map +1 -0
  223. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts +2 -0
  224. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts.map +1 -0
  225. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js +502 -0
  226. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js.map +1 -0
  227. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts +2 -0
  228. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts.map +1 -0
  229. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js +317 -0
  230. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js.map +1 -0
  231. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts +2 -0
  232. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts.map +1 -0
  233. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js +843 -0
  234. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js.map +1 -0
  235. package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts +2 -0
  236. package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts.map +1 -0
  237. package/dist/tests/unit/strategies/grid/grid-calculator.test.js +67 -0
  238. package/dist/tests/unit/strategies/grid/grid-calculator.test.js.map +1 -0
  239. package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts +2 -0
  240. package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts.map +1 -0
  241. package/dist/tests/unit/strategies/grid/grid-order-manager.test.js +211 -0
  242. package/dist/tests/unit/strategies/grid/grid-order-manager.test.js.map +1 -0
  243. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts +2 -0
  244. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts.map +1 -0
  245. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js +197 -0
  246. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js.map +1 -0
  247. package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts +2 -0
  248. package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts.map +1 -0
  249. package/dist/tests/unit/strategies/grid/grid-strategy.test.js +429 -0
  250. package/dist/tests/unit/strategies/grid/grid-strategy.test.js.map +1 -0
  251. package/dist/tests/unit/utils/logger.test.d.ts +2 -0
  252. package/dist/tests/unit/utils/logger.test.d.ts.map +1 -0
  253. package/dist/tests/unit/utils/logger.test.js +260 -0
  254. package/dist/tests/unit/utils/logger.test.js.map +1 -0
  255. package/dist/tests/unit/utils/symbol-utils.test.d.ts +2 -0
  256. package/dist/tests/unit/utils/symbol-utils.test.d.ts.map +1 -0
  257. package/dist/tests/unit/utils/symbol-utils.test.js +178 -0
  258. package/dist/tests/unit/utils/symbol-utils.test.js.map +1 -0
  259. package/dist/types/price-aggregation.d.ts +31 -0
  260. package/dist/types/price-aggregation.d.ts.map +1 -0
  261. package/dist/types/price-aggregation.js +6 -0
  262. package/dist/types/price-aggregation.js.map +1 -0
  263. package/dist/utils/crypto.d.ts +15 -0
  264. package/dist/utils/crypto.d.ts.map +1 -0
  265. package/dist/utils/crypto.js +50 -0
  266. package/dist/utils/crypto.js.map +1 -0
  267. package/dist/utils/validation.d.ts +36 -0
  268. package/dist/utils/validation.d.ts.map +1 -0
  269. package/dist/utils/validation.js +174 -0
  270. package/dist/utils/validation.js.map +1 -0
  271. package/package.json +6 -2
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.serveCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const api_1 = require("../../api");
10
+ exports.serveCommand = new commander_1.Command('serve')
11
+ .description('Start the OpenMM REST API server')
12
+ .option('-p, --port <port>', 'Port to listen on', '3000')
13
+ .option('-h, --host <host>', 'Host to bind to', '0.0.0.0')
14
+ .option('--no-swagger', 'Disable Swagger/OpenAPI docs')
15
+ .option('--no-cors', 'Disable CORS')
16
+ .action(async (options) => {
17
+ const port = parseInt(options.port, 10);
18
+ const host = options.host;
19
+ console.log(chalk_1.default.cyan('🚀 Starting OpenMM API Server...'));
20
+ console.log(chalk_1.default.gray(` Host: ${host}`));
21
+ console.log(chalk_1.default.gray(` Port: ${port}`));
22
+ console.log(chalk_1.default.gray(` Swagger: ${options.swagger ? 'enabled' : 'disabled'}`));
23
+ console.log(chalk_1.default.gray(` CORS: ${options.cors ? 'enabled' : 'disabled'}`));
24
+ console.log();
25
+ try {
26
+ await (0, api_1.startApiServer)({
27
+ host,
28
+ port,
29
+ enableSwagger: options.swagger,
30
+ enableCors: options.cors,
31
+ });
32
+ console.log(chalk_1.default.green(`✓ API server running at http://${host}:${port}`));
33
+ if (options.swagger) {
34
+ console.log(chalk_1.default.blue(`📚 OpenAPI docs: http://${host}:${port}/docs`));
35
+ }
36
+ console.log();
37
+ console.log(chalk_1.default.gray('Press Ctrl+C to stop'));
38
+ // Keep process running
39
+ process.on('SIGINT', () => {
40
+ console.log(chalk_1.default.yellow('\n👋 Shutting down...'));
41
+ process.exit(0);
42
+ });
43
+ process.on('SIGTERM', () => {
44
+ console.log(chalk_1.default.yellow('\n👋 Shutting down...'));
45
+ process.exit(0);
46
+ });
47
+ }
48
+ catch (error) {
49
+ console.error(chalk_1.default.red('Failed to start server:'), error);
50
+ process.exit(1);
51
+ }
52
+ });
53
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,mCAA2C;AAE9B,QAAA,YAAY,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,CAAC;KACxD,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,SAAS,CAAC;KACzD,MAAM,CAAC,cAAc,EAAE,8BAA8B,CAAC;KACtD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC;KACnC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC;QACH,MAAM,IAAA,oBAAc,EAAC;YACnB,IAAI;YACJ,IAAI;YACJ,aAAa,EAAE,OAAO,CAAC,OAAO;YAC9B,UAAU,EAAE,OAAO,CAAC,IAAI;SACzB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kCAAkC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAEhD,uBAAuB;QACvB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Pool Discovery CLI
4
+ * Command-line tool to discover Cardano liquidity pool identifiers and metrics
5
+ * for any native token to be used in Market Making strategies
6
+ */
7
+ import { CardanoTokenConfig } from '../types/price';
8
+ interface PoolInfo {
9
+ identifier: string;
10
+ dex: string;
11
+ tvl: number;
12
+ reserveA: number;
13
+ reserveB: number;
14
+ address: string;
15
+ isActive: boolean;
16
+ }
17
+ interface DiscoveryResult {
18
+ token: string;
19
+ policyId: string;
20
+ assetName: string;
21
+ totalPools: number;
22
+ totalLiquidity: number;
23
+ pools: PoolInfo[];
24
+ recommendedIdentifiers: string[];
25
+ }
26
+ declare class PoolDiscoveryCLI {
27
+ private poolDiscovery;
28
+ private irisClient;
29
+ constructor();
30
+ /**
31
+ * Main discovery function for any Cardano native token
32
+ */
33
+ discoverTokenPools(tokenSymbol: string, options?: {
34
+ limit?: number;
35
+ minLiquidity?: number;
36
+ showAll?: boolean;
37
+ }): Promise<DiscoveryResult>;
38
+ /**
39
+ * Display discovery results in a formatted table
40
+ */
41
+ displayResults(result: DiscoveryResult): void;
42
+ /**
43
+ * Get live price information for discovered pools
44
+ */
45
+ getPoolPrices(identifiers: string[]): Promise<void>;
46
+ /**
47
+ * Format currency with K/M suffixes
48
+ */
49
+ private formatCurrency;
50
+ /**
51
+ * Add a new token configuration (for advanced users)
52
+ */
53
+ suggestTokenConfig(policyId: string, assetNameHex: string, symbol: string): CardanoTokenConfig;
54
+ }
55
+ export { PoolDiscoveryCLI, DiscoveryResult, PoolInfo };
56
+ //# sourceMappingURL=pool-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-discovery.d.ts","sourceRoot":"","sources":["../../src/cli/pool-discovery.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAKH,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,UAAU,QAAQ;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,sBAAsB,EAAE,MAAM,EAAE,CAAC;CAClC;AAED,cAAM,gBAAgB;IACpB,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,UAAU,CAAgB;;IAOlC;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE;QACrD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,OAAO,CAAC;KACd,GAAG,OAAO,CAAC,eAAe,CAAC;IAgEjC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAkD7C;;OAEG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BzD;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB;CAsB/F;AAiHD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,283 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Pool Discovery CLI
5
+ * Command-line tool to discover Cardano liquidity pool identifiers and metrics
6
+ * for any native token to be used in Market Making strategies
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.PoolDiscoveryCLI = void 0;
10
+ const iris_pool_discovery_1 = require("../core/price-aggregation/iris-pool-discovery");
11
+ const iris_api_client_1 = require("../core/price-aggregation/iris-api-client");
12
+ const price_aggregation_1 = require("../config/price-aggregation");
13
+ class PoolDiscoveryCLI {
14
+ constructor() {
15
+ this.poolDiscovery = new iris_pool_discovery_1.IrisPoolDiscovery();
16
+ this.irisClient = new iris_api_client_1.IrisApiClient();
17
+ }
18
+ /**
19
+ * Main discovery function for any Cardano native token
20
+ */
21
+ async discoverTokenPools(tokenSymbol, options = {}) {
22
+ const symbol = tokenSymbol.toUpperCase();
23
+ if (!(0, price_aggregation_1.isTokenSupported)(symbol)) {
24
+ throw new Error(`Unsupported token: ${symbol}. Supported tokens: ${(0, price_aggregation_1.getSupportedTokens)().join(', ')}`);
25
+ }
26
+ const tokenConfig = (0, price_aggregation_1.getTokenConfig)(symbol);
27
+ const { limit = 10, minLiquidity, showAll = false } = options;
28
+ console.log(`🔍 Discovering liquidity pools for ${symbol} token...`);
29
+ console.log(`Policy ID: ${tokenConfig.policyId}`);
30
+ console.log(`Asset Name (hex): ${tokenConfig.assetName}`);
31
+ console.log('─'.repeat(80));
32
+ try {
33
+ // Discover all pools for the token
34
+ const pools = await this.poolDiscovery.discoverPools('lovelace', tokenConfig);
35
+ // Filter by minimum liquidity if specified
36
+ const filteredPools = minLiquidity
37
+ ? pools.filter(pool => Number(pool.state?.tvl || 0) >= minLiquidity)
38
+ : pools;
39
+ // Sort by TVL (highest first) and apply limit
40
+ const sortedPools = filteredPools
41
+ .sort((a, b) => Number(b.state?.tvl || 0) - Number(a.state?.tvl || 0))
42
+ .slice(0, showAll ? filteredPools.length : limit);
43
+ const totalLiquidity = pools.reduce((sum, pool) => sum + Number(pool.state?.tvl || 0), 0);
44
+ // Convert to CLI-friendly format
45
+ const poolInfos = sortedPools.map(pool => ({
46
+ identifier: pool.identifier || 'N/A',
47
+ dex: pool.dex || 'Unknown',
48
+ tvl: Number(pool.state?.tvl || 0),
49
+ reserveA: Number(pool.state?.reserveA || 0),
50
+ reserveB: Number(pool.state?.reserveB || 0),
51
+ address: pool.address || 'N/A',
52
+ isActive: pool.isActive || false
53
+ }));
54
+ // Get recommended identifiers (top 3 by TVL)
55
+ const recommendedIdentifiers = poolInfos
56
+ .slice(0, 3)
57
+ .filter(pool => pool.isActive)
58
+ .map(pool => pool.identifier);
59
+ return {
60
+ token: symbol,
61
+ policyId: tokenConfig.policyId,
62
+ assetName: tokenConfig.assetName,
63
+ totalPools: pools.length,
64
+ totalLiquidity,
65
+ pools: poolInfos,
66
+ recommendedIdentifiers
67
+ };
68
+ }
69
+ catch (error) {
70
+ throw new Error(`Pool discovery failed for ${symbol}: ${error}`);
71
+ }
72
+ }
73
+ /**
74
+ * Display discovery results in a formatted table
75
+ */
76
+ displayResults(result) {
77
+ console.log(`\n📊 ${result.token} Liquidity Pool Discovery Results`);
78
+ console.log('═'.repeat(80));
79
+ console.log(`Total Pools Found: ${result.totalPools}`);
80
+ console.log(`Total Liquidity: ${this.formatCurrency(result.totalLiquidity)}`);
81
+ console.log(`Token Policy ID: ${result.policyId}`);
82
+ console.log(`Asset Name (hex): ${result.assetName}`);
83
+ if (result.pools.length === 0) {
84
+ console.log('\n❌ No liquidity pools found for this token.');
85
+ return;
86
+ }
87
+ console.log('\n🏊 Pool Details:');
88
+ console.log('─'.repeat(80));
89
+ console.log('Rank | DEX | TVL | Identifier | Active');
90
+ console.log('─'.repeat(80));
91
+ result.pools.forEach((pool, index) => {
92
+ const rank = `${index + 1}`.padStart(4);
93
+ const dex = pool.dex.substring(0, 12).padEnd(12);
94
+ const tvl = this.formatCurrency(pool.tvl).padStart(12);
95
+ const identifier = pool.identifier.substring(0, 29).padEnd(29);
96
+ const status = pool.isActive ? '✅' : '❌';
97
+ console.log(`${rank} | ${dex} | ${tvl} | ${identifier} | ${status}`);
98
+ });
99
+ console.log('\n🎯 Recommended Pool Identifiers for Market Making:');
100
+ console.log('─'.repeat(60));
101
+ if (result.recommendedIdentifiers.length === 0) {
102
+ console.log('❌ No active pools with sufficient liquidity found.');
103
+ }
104
+ else {
105
+ result.recommendedIdentifiers.forEach((id, index) => {
106
+ const pool = result.pools.find(p => p.identifier === id);
107
+ console.log(`${index + 1}. ${id}`);
108
+ console.log(` DEX: ${pool?.dex}, TVL: ${this.formatCurrency(pool?.tvl || 0)}`);
109
+ });
110
+ }
111
+ console.log('\n💡 Usage Instructions:');
112
+ console.log('─'.repeat(40));
113
+ console.log('1. Use the recommended pool identifiers in your market making strategy');
114
+ console.log('2. Higher TVL pools typically offer better price stability');
115
+ console.log('3. Monitor multiple pools for price aggregation and arbitrage opportunities');
116
+ console.log(`4. Current minimum liquidity threshold: ${this.formatCurrency((0, price_aggregation_1.getTokenConfig)(result.token).minLiquidityThreshold || 0)}`);
117
+ }
118
+ /**
119
+ * Get live price information for discovered pools
120
+ */
121
+ async getPoolPrices(identifiers) {
122
+ if (identifiers.length === 0) {
123
+ console.log('❌ No pool identifiers provided');
124
+ return;
125
+ }
126
+ console.log('\n💰 Getting live prices from Iris API...');
127
+ try {
128
+ const prices = await this.irisClient.fetchPrices(identifiers, 'OpenMM-PoolDiscovery/1.0');
129
+ console.log('─'.repeat(50));
130
+ console.log('Pool ID | Price (ADA)');
131
+ console.log('─'.repeat(50));
132
+ identifiers.forEach((id, index) => {
133
+ const price = prices[index] || 0;
134
+ const shortId = id.substring(0, 33).padEnd(33);
135
+ console.log(`${shortId} | ${price.toFixed(8)}`);
136
+ });
137
+ const avgPrice = prices.reduce((sum, p) => sum + p, 0) / prices.length;
138
+ console.log('─'.repeat(50));
139
+ console.log(`Average Price: ${avgPrice.toFixed(8)} ADA per token`);
140
+ }
141
+ catch (error) {
142
+ console.log(`❌ Failed to fetch prices: ${error}`);
143
+ }
144
+ }
145
+ /**
146
+ * Format currency with K/M suffixes
147
+ */
148
+ formatCurrency(amount) {
149
+ if (amount === 0)
150
+ return '$0';
151
+ if (amount >= 1000000) {
152
+ return `$${(amount / 1000000).toFixed(1)}M`;
153
+ }
154
+ if (amount >= 1000) {
155
+ return `$${(amount / 1000).toFixed(1)}K`;
156
+ }
157
+ return `$${amount.toFixed(0)}`;
158
+ }
159
+ /**
160
+ * Add a new token configuration (for advanced users)
161
+ */
162
+ suggestTokenConfig(policyId, assetNameHex, symbol) {
163
+ console.log('\n🔧 Token Configuration for Custom Token:');
164
+ console.log('─'.repeat(50));
165
+ console.log(`Symbol: ${symbol.toUpperCase()}`);
166
+ console.log(`Policy ID: ${policyId}`);
167
+ console.log(`Asset Name (hex): ${assetNameHex}`);
168
+ console.log('\nAdd this to your src/config/price-aggregation.ts:');
169
+ console.log('─'.repeat(50));
170
+ console.log(`'${symbol.toUpperCase()}': {`);
171
+ console.log(` symbol: '${symbol.toUpperCase()}',`);
172
+ console.log(` policyId: '${policyId}',`);
173
+ console.log(` assetName: '${assetNameHex}',`);
174
+ console.log(` minLiquidityThreshold: 25000 // Adjust as needed`);
175
+ console.log(`}`);
176
+ return {
177
+ symbol: symbol.toUpperCase(),
178
+ policyId,
179
+ assetName: assetNameHex,
180
+ minLiquidityThreshold: 25000
181
+ };
182
+ }
183
+ }
184
+ exports.PoolDiscoveryCLI = PoolDiscoveryCLI;
185
+ /**
186
+ * CLI Entry Point
187
+ */
188
+ async function main() {
189
+ const args = process.argv.slice(2);
190
+ const cli = new PoolDiscoveryCLI();
191
+ if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
192
+ console.log('🔍 OpenMM Pool Discovery CLI');
193
+ console.log('═'.repeat(40));
194
+ console.log('Usage: npm run pool-discovery <command> [options]');
195
+ console.log('\nCommands:');
196
+ console.log(' discover <TOKEN> Discover pools for a supported token');
197
+ console.log(' supported List all supported tokens');
198
+ console.log(' prices <TOKEN> Get live prices for token pools');
199
+ console.log(' custom <POLICY> <HEX> <SYMBOL> Generate config for custom token');
200
+ console.log('\nOptions:');
201
+ console.log(' --limit <N> Limit number of pools shown (default: 10)');
202
+ console.log(' --min-liquidity <N> Filter pools by minimum TVL');
203
+ console.log(' --show-all Show all pools (ignore limit)');
204
+ console.log('\nExamples:');
205
+ console.log(' npm run pool-discovery discover NIGHT');
206
+ console.log(' npm run pool-discovery discover SNEK --limit 5');
207
+ console.log(' npm run pool-discovery discover INDY --min-liquidity 100000');
208
+ console.log(' npm run pool-discovery prices NIGHT');
209
+ console.log(' npm run pool-discovery supported');
210
+ return;
211
+ }
212
+ const command = args[0];
213
+ try {
214
+ switch (command) {
215
+ case 'discover': {
216
+ if (args.length < 2) {
217
+ console.log('❌ Token symbol required. Usage: npm run pool-discovery discover <TOKEN>');
218
+ return;
219
+ }
220
+ const token = args[1];
221
+ const options = {};
222
+ // Parse options
223
+ for (let i = 2; i < args.length; i += 2) {
224
+ switch (args[i]) {
225
+ case '--limit':
226
+ options.limit = parseInt(args[i + 1]);
227
+ break;
228
+ case '--min-liquidity':
229
+ options.minLiquidity = parseInt(args[i + 1]);
230
+ break;
231
+ case '--show-all':
232
+ options.showAll = true;
233
+ i--; // No value to consume
234
+ break;
235
+ }
236
+ }
237
+ const result = await cli.discoverTokenPools(token, options);
238
+ cli.displayResults(result);
239
+ break;
240
+ }
241
+ case 'supported': {
242
+ console.log('🎯 Supported Tokens:');
243
+ console.log('─'.repeat(20));
244
+ (0, price_aggregation_1.getSupportedTokens)().forEach(token => {
245
+ const config = (0, price_aggregation_1.getTokenConfig)(token);
246
+ console.log(`${token} (Min Liquidity: ${cli['formatCurrency'](config.minLiquidityThreshold || 0)})`);
247
+ });
248
+ break;
249
+ }
250
+ case 'prices': {
251
+ if (args.length < 2) {
252
+ console.log('❌ Token symbol required. Usage: npm run pool-discovery prices <TOKEN>');
253
+ return;
254
+ }
255
+ const token = args[1];
256
+ const result = await cli.discoverTokenPools(token, { limit: 3 });
257
+ await cli.getPoolPrices(result.recommendedIdentifiers);
258
+ break;
259
+ }
260
+ case 'custom': {
261
+ if (args.length < 4) {
262
+ console.log('❌ Usage: npm run pool-discovery custom <POLICY_ID> <ASSET_NAME_HEX> <SYMBOL>');
263
+ return;
264
+ }
265
+ const [, policyId, assetNameHex, symbol] = args;
266
+ cli.suggestTokenConfig(policyId, assetNameHex, symbol);
267
+ break;
268
+ }
269
+ default:
270
+ console.log(`❌ Unknown command: ${command}`);
271
+ console.log('Run "npm run pool-discovery --help" for usage information.');
272
+ }
273
+ }
274
+ catch (error) {
275
+ console.error('❌ Error:', error.message);
276
+ process.exit(1);
277
+ }
278
+ }
279
+ // Run CLI if this file is executed directly
280
+ if (require.main === module) {
281
+ main().catch(console.error);
282
+ }
283
+ //# sourceMappingURL=pool-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-discovery.js","sourceRoot":"","sources":["../../src/cli/pool-discovery.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,25 @@ interface EnvironmentConfig {
20
20
  logLevel: string;
21
21
  nodeEnv: string;
22
22
  }
23
+ declare class EnvironmentValidator {
24
+ private static validateOptional;
25
+ /**
26
+ * Validate environment configuration.
27
+ *
28
+ * IMPORTANT: This method throws errors instead of calling process.exit()
29
+ * to allow callers (like MCP servers) to handle errors gracefully.
30
+ *
31
+ * All exchange credentials are now optional - validation happens at
32
+ * runtime when a specific exchange is used.
33
+ */
34
+ static validate(): EnvironmentConfig;
35
+ /**
36
+ * Validate that a specific exchange is configured.
37
+ * Call this at runtime when an exchange is actually used.
38
+ */
39
+ static validateExchange(exchange: 'mexc' | 'gateio' | 'bitget' | 'kraken'): void;
40
+ }
23
41
  export declare const config: EnvironmentConfig;
42
+ export { EnvironmentValidator };
24
43
  export default config;
25
44
  //# sourceMappingURL=environment.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAyED,eAAO,MAAM,MAAM,mBAAkC,CAAC;AACtD,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAI/B;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,IAAI,iBAAiB;IAoDpC;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI;CAiBjF;AAMD,eAAO,MAAM,MAAM,EAAE,iBAoBnB,CAAC;AAGH,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAChC,eAAe,MAAM,CAAC"}
@@ -3,72 +3,108 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.config = void 0;
6
+ exports.EnvironmentValidator = exports.config = void 0;
7
7
  const dotenv_1 = __importDefault(require("dotenv"));
8
8
  const utils_1 = require("../utils");
9
9
  dotenv_1.default.config();
10
10
  const logger = (0, utils_1.createLogger)('environment-validator');
11
11
  class EnvironmentValidator {
12
- static validateRequired(key, value) {
13
- if (!value || value.trim() === '') {
14
- throw new Error(`Required environment variable ${key} is missing or empty`);
15
- }
16
- return value.trim();
17
- }
18
12
  static validateOptional(value) {
19
13
  return value && value.trim() !== '' ? value.trim() : undefined;
20
14
  }
15
+ /**
16
+ * Validate environment configuration.
17
+ *
18
+ * IMPORTANT: This method throws errors instead of calling process.exit()
19
+ * to allow callers (like MCP servers) to handle errors gracefully.
20
+ *
21
+ * All exchange credentials are now optional - validation happens at
22
+ * runtime when a specific exchange is used.
23
+ */
21
24
  static validate() {
22
- try {
23
- const config = {
24
- mexc: {
25
- apiKey: this.validateRequired('MEXC_API_KEY', process.env.MEXC_API_KEY),
26
- secret: this.validateRequired('MEXC_SECRET', process.env.MEXC_SECRET),
25
+ const config = {
26
+ // MEXC is now optional like other exchanges
27
+ mexc: process.env.MEXC_API_KEY && process.env.MEXC_SECRET
28
+ ? {
29
+ apiKey: process.env.MEXC_API_KEY.trim(),
30
+ secret: process.env.MEXC_SECRET.trim(),
27
31
  uid: this.validateOptional(process.env.MEXC_UID),
28
- },
29
- logLevel: process.env.LOG_LEVEL || 'info',
30
- nodeEnv: process.env.NODE_ENV || 'development',
32
+ }
33
+ : { apiKey: '', secret: '' }, // Empty config - will fail at runtime if used
34
+ logLevel: process.env.LOG_LEVEL || 'info',
35
+ nodeEnv: process.env.NODE_ENV || 'development',
36
+ };
37
+ if (process.env.GATEIO_API_KEY && process.env.GATEIO_SECRET) {
38
+ config.gateio = {
39
+ apiKey: process.env.GATEIO_API_KEY.trim(),
40
+ secret: process.env.GATEIO_SECRET.trim(),
31
41
  };
32
- if (process.env.GATEIO_API_KEY && process.env.GATEIO_SECRET) {
33
- config.gateio = {
34
- apiKey: process.env.GATEIO_API_KEY,
35
- secret: process.env.GATEIO_SECRET,
36
- };
42
+ }
43
+ if (process.env.BITGET_API_KEY &&
44
+ process.env.BITGET_SECRET &&
45
+ process.env.BITGET_PASSPHRASE) {
46
+ config.bitget = {
47
+ apiKey: process.env.BITGET_API_KEY.trim(),
48
+ secret: process.env.BITGET_SECRET.trim(),
49
+ passphrase: process.env.BITGET_PASSPHRASE.trim(),
50
+ };
51
+ }
52
+ if (process.env.KRAKEN_API_KEY && process.env.KRAKEN_SECRET) {
53
+ config.kraken = {
54
+ apiKey: process.env.KRAKEN_API_KEY.trim(),
55
+ secret: process.env.KRAKEN_SECRET.trim(),
56
+ };
57
+ }
58
+ const validLogLevels = ['error', 'warn', 'info', 'debug'];
59
+ if (!validLogLevels.includes(config.logLevel)) {
60
+ // Throw instead of process.exit - let caller handle it
61
+ throw new Error(`Invalid LOG_LEVEL: ${config.logLevel}. Must be one of: ${validLogLevels.join(', ')}`);
62
+ }
63
+ return config;
64
+ }
65
+ /**
66
+ * Validate that a specific exchange is configured.
67
+ * Call this at runtime when an exchange is actually used.
68
+ */
69
+ static validateExchange(exchange) {
70
+ const cfg = exports.config[exchange];
71
+ if (!cfg || !cfg.apiKey || !cfg.secret) {
72
+ throw new Error(`Exchange ${exchange.toUpperCase()} is not configured. ` +
73
+ `Please set ${exchange.toUpperCase()}_API_KEY and ${exchange.toUpperCase()}_SECRET environment variables.`);
74
+ }
75
+ if (exchange === 'bitget') {
76
+ const bitgetCfg = exports.config.bitget;
77
+ if (!bitgetCfg?.passphrase) {
78
+ throw new Error(`Bitget requires BITGET_PASSPHRASE environment variable.`);
37
79
  }
38
- if (process.env.BITGET_API_KEY &&
39
- process.env.BITGET_SECRET &&
40
- process.env.BITGET_PASSPHRASE) {
41
- config.bitget = {
42
- apiKey: process.env.BITGET_API_KEY,
43
- secret: process.env.BITGET_SECRET,
44
- passphrase: process.env.BITGET_PASSPHRASE,
45
- };
80
+ }
81
+ }
82
+ }
83
+ exports.EnvironmentValidator = EnvironmentValidator;
84
+ // Lazy validation - validates at import but doesn't call process.exit()
85
+ // Errors are thrown and can be caught by the caller
86
+ let _config = null;
87
+ exports.config = new Proxy({}, {
88
+ get(_, prop) {
89
+ if (!_config) {
90
+ try {
91
+ _config = EnvironmentValidator.validate();
46
92
  }
47
- if (process.env.KRAKEN_API_KEY && process.env.KRAKEN_SECRET) {
48
- config.kraken = {
49
- apiKey: process.env.KRAKEN_API_KEY,
50
- secret: process.env.KRAKEN_SECRET,
93
+ catch (error) {
94
+ // Log the error but don't exit - let the caller handle it
95
+ const errorMessage = error instanceof Error ? error.message : String(error);
96
+ logger.warn('Environment validation warning', { error: errorMessage });
97
+ logger.warn('Some exchanges may not be available. Set credentials to enable them.');
98
+ // Return a minimal config so the module can still load
99
+ _config = {
100
+ mexc: { apiKey: '', secret: '' },
101
+ logLevel: 'info',
102
+ nodeEnv: process.env.NODE_ENV || 'development',
51
103
  };
52
104
  }
53
- const validLogLevels = ['error', 'warn', 'info', 'debug'];
54
- if (!validLogLevels.includes(config.logLevel)) {
55
- const errorMessage = `Invalid LOG_LEVEL: ${config.logLevel}. Must be one of: ${validLogLevels.join(', ')}`;
56
- logger.error('Environment validation failed', { error: errorMessage });
57
- logger.error('Please check your .env file and ensure all required variables are set');
58
- logger.error('See .env.example for reference');
59
- process.exit(1);
60
- }
61
- return config;
62
- }
63
- catch (error) {
64
- const errorMessage = error instanceof Error ? error.message : String(error);
65
- logger.error('Environment validation failed', { error: errorMessage });
66
- logger.error('Please check your .env file and ensure all required variables are set');
67
- logger.error('See .env.example for reference');
68
- process.exit(1);
69
105
  }
70
- }
71
- }
72
- exports.config = EnvironmentValidator.validate();
106
+ return _config[prop];
107
+ },
108
+ });
73
109
  exports.default = exports.config;
74
110
  //# sourceMappingURL=environment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"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"}