@3rd-eye-labs/openmm 0.1.4 โ†’ 0.1.6

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 (67) hide show
  1. package/README.md +5 -3
  2. package/dist/api/index.d.ts +3 -0
  3. package/dist/api/index.d.ts.map +1 -0
  4. package/dist/api/index.js +9 -0
  5. package/dist/api/index.js.map +1 -0
  6. package/dist/api/openapi.d.ts +3 -0
  7. package/dist/api/openapi.d.ts.map +1 -0
  8. package/dist/api/openapi.js +214 -0
  9. package/dist/api/openapi.js.map +1 -0
  10. package/dist/api/routes/balance.d.ts +3 -0
  11. package/dist/api/routes/balance.d.ts.map +1 -0
  12. package/dist/api/routes/balance.js +101 -0
  13. package/dist/api/routes/balance.js.map +1 -0
  14. package/dist/api/routes/cardano.d.ts +3 -0
  15. package/dist/api/routes/cardano.d.ts.map +1 -0
  16. package/dist/api/routes/cardano.js +177 -0
  17. package/dist/api/routes/cardano.js.map +1 -0
  18. package/dist/api/routes/health.d.ts +3 -0
  19. package/dist/api/routes/health.d.ts.map +1 -0
  20. package/dist/api/routes/health.js +115 -0
  21. package/dist/api/routes/health.js.map +1 -0
  22. package/dist/api/routes/index.d.ts +3 -0
  23. package/dist/api/routes/index.d.ts.map +1 -0
  24. package/dist/api/routes/index.js +39 -0
  25. package/dist/api/routes/index.js.map +1 -0
  26. package/dist/api/routes/orderbook.d.ts +3 -0
  27. package/dist/api/routes/orderbook.d.ts.map +1 -0
  28. package/dist/api/routes/orderbook.js +123 -0
  29. package/dist/api/routes/orderbook.js.map +1 -0
  30. package/dist/api/routes/orders.d.ts +3 -0
  31. package/dist/api/routes/orders.d.ts.map +1 -0
  32. package/dist/api/routes/orders.js +214 -0
  33. package/dist/api/routes/orders.js.map +1 -0
  34. package/dist/api/routes/price.d.ts +3 -0
  35. package/dist/api/routes/price.d.ts.map +1 -0
  36. package/dist/api/routes/price.js +124 -0
  37. package/dist/api/routes/price.js.map +1 -0
  38. package/dist/api/routes/strategy.d.ts +3 -0
  39. package/dist/api/routes/strategy.d.ts.map +1 -0
  40. package/dist/api/routes/strategy.js +345 -0
  41. package/dist/api/routes/strategy.js.map +1 -0
  42. package/dist/api/routes/ticker.d.ts +3 -0
  43. package/dist/api/routes/ticker.d.ts.map +1 -0
  44. package/dist/api/routes/ticker.js +91 -0
  45. package/dist/api/routes/ticker.js.map +1 -0
  46. package/dist/api/routes/trades.d.ts +3 -0
  47. package/dist/api/routes/trades.d.ts.map +1 -0
  48. package/dist/api/routes/trades.js +129 -0
  49. package/dist/api/routes/trades.js.map +1 -0
  50. package/dist/api/server.d.ts +11 -0
  51. package/dist/api/server.d.ts.map +1 -0
  52. package/dist/api/server.js +65 -0
  53. package/dist/api/server.js.map +1 -0
  54. package/dist/cli/cli.js +3 -1
  55. package/dist/cli/cli.js.map +1 -1
  56. package/dist/cli/commands/serve.d.ts +3 -0
  57. package/dist/cli/commands/serve.d.ts.map +1 -0
  58. package/dist/cli/commands/serve.js +53 -0
  59. package/dist/cli/commands/serve.js.map +1 -0
  60. package/dist/config/environment.d.ts.map +1 -1
  61. package/dist/config/environment.js +8 -1
  62. package/dist/config/environment.js.map +1 -1
  63. package/dist/index.d.ts +1 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +2 -0
  66. package/dist/index.js.map +1 -1
  67. package/package.json +6 -2
package/README.md CHANGED
@@ -5,6 +5,8 @@
5
5
  [![license](https://img.shields.io/npm/l/@3rd-eye-labs/openmm)](https://github.com/3rd-Eye-Labs/OpenMM/blob/main/LICENSE)
6
6
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/3rd-Eye-Labs/OpenMM)
7
7
 
8
+ **๐Ÿ“š [Documentation](https://docs.openmm.io)** ยท **๐Ÿค– [AI Skills Portal](https://agents.openmm.io)** ยท **๐Ÿ”Œ [API Reference](https://api.openmm.io)**
9
+
8
10
  OpenMM is an open-source SDK designed to democratize market-making for Cardano projects. It provides a unified interface for trading Cardano Native Tokens (CNTs) across multiple centralized exchanges.
9
11
 
10
12
  ## What is OpenMM?
@@ -23,8 +25,8 @@ This toolkit aims to improve liquidity for Cardano projects, reduce trading spre
23
25
 
24
26
  ```bash
25
27
  # 1. Install & Setup OpenMM
26
- npm install -g openmm
27
- npx openmm setup
28
+ npm install -g @3rd-eye-labs/openmm
29
+ npx @3rd-eye-labs/openmm setup
28
30
  ```
29
31
 
30
32
  The setup wizard will:
@@ -45,7 +47,7 @@ Configures Claude Desktop, Claude Code, Cursor, or Windsurf to use OpenMM tools.
45
47
  ### Verify Installation
46
48
 
47
49
  ```bash
48
- openmm balance --exchange mexc
50
+ npx @3rd-eye-labs/openmm balance --exchange mexc
49
51
  ```
50
52
 
51
53
  Or ask your AI agent: *"What is my balance on MEXC?"*
@@ -0,0 +1,3 @@
1
+ export { createApiServer, startApiServer, ApiServerOptions, FastifyInstance } from './server';
2
+ export { openApiConfig } from './openapi';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openApiConfig = exports.startApiServer = exports.createApiServer = void 0;
4
+ var server_1 = require("./server");
5
+ Object.defineProperty(exports, "createApiServer", { enumerable: true, get: function () { return server_1.createApiServer; } });
6
+ Object.defineProperty(exports, "startApiServer", { enumerable: true, get: function () { return server_1.startApiServer; } });
7
+ var openapi_1 = require("./openapi");
8
+ Object.defineProperty(exports, "openApiConfig", { enumerable: true, get: function () { return openapi_1.openApiConfig; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";;;AAAA,mCAA8F;AAArF,yGAAA,eAAe,OAAA;AAAE,wGAAA,cAAc,OAAA;AACxC,qCAA0C;AAAjC,wGAAA,aAAa,OAAA"}
@@ -0,0 +1,3 @@
1
+ import { FastifyDynamicSwaggerOptions } from '@fastify/swagger';
2
+ export declare const openApiConfig: FastifyDynamicSwaggerOptions;
3
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/api/openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAEhE,eAAO,MAAM,aAAa,EAAE,4BAiN3B,CAAC"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openApiConfig = void 0;
4
+ exports.openApiConfig = {
5
+ openapi: {
6
+ info: {
7
+ title: 'OpenMM API',
8
+ description: `
9
+ OpenMM - Universal Market Making Toolkit API
10
+
11
+ A powerful REST API for automated trading, market making, and portfolio management across multiple exchanges.
12
+
13
+ ## Features
14
+ - **Multi-Exchange Support**: MEXC, Gate.io, Bitget, Kraken
15
+ - **Order Management**: Place, cancel, and track orders
16
+ - **Market Data**: Real-time ticker, orderbook, and trades
17
+ - **Grid Strategies**: Automated grid trading strategies
18
+ - **Cardano DEX**: Token prices and pool discovery via Iris Protocol
19
+ - **Cross-Exchange**: Price comparison and arbitrage detection
20
+
21
+ ## Authentication
22
+ All trading endpoints require exchange API credentials configured in the server environment.
23
+
24
+ ## Rate Limits
25
+ Rate limits are inherited from the underlying exchanges. The API implements intelligent rate limiting and caching.
26
+ `,
27
+ version: '1.0.0',
28
+ contact: {
29
+ name: 'QBT Labs',
30
+ url: 'https://qbtlabs.io',
31
+ email: 'support@qbtlabs.io',
32
+ },
33
+ license: {
34
+ name: 'MIT',
35
+ url: 'https://opensource.org/licenses/MIT',
36
+ },
37
+ },
38
+ servers: [
39
+ {
40
+ url: 'http://localhost:3000',
41
+ description: 'Local development server',
42
+ },
43
+ {
44
+ url: 'https://api.openmm.io',
45
+ description: 'Production server',
46
+ },
47
+ ],
48
+ tags: [
49
+ { name: 'Health', description: 'Health check and status endpoints' },
50
+ { name: 'Account', description: 'Account balances and information' },
51
+ { name: 'Market Data', description: 'Ticker, orderbook, and trade data' },
52
+ { name: 'Orders', description: 'Order management (place, cancel, list)' },
53
+ { name: 'Strategy', description: 'Grid and other trading strategies' },
54
+ { name: 'Cardano', description: 'Cardano DEX prices and pool discovery' },
55
+ { name: 'Price', description: 'Cross-exchange price comparison' },
56
+ ],
57
+ components: {
58
+ schemas: {
59
+ Error: {
60
+ type: 'object',
61
+ properties: {
62
+ error: { type: 'string', description: 'Error message' },
63
+ code: { type: 'string', description: 'Error code' },
64
+ },
65
+ required: ['error'],
66
+ },
67
+ Exchange: {
68
+ type: 'string',
69
+ enum: ['mexc', 'gateio', 'bitget', 'kraken'],
70
+ description: 'Supported exchange identifier',
71
+ },
72
+ Balance: {
73
+ type: 'object',
74
+ properties: {
75
+ asset: { type: 'string', example: 'BTC' },
76
+ free: { type: 'string', example: '1.5' },
77
+ locked: { type: 'string', example: '0.5' },
78
+ total: { type: 'string', example: '2.0' },
79
+ },
80
+ required: ['asset', 'free', 'locked', 'total'],
81
+ },
82
+ Ticker: {
83
+ type: 'object',
84
+ properties: {
85
+ symbol: { type: 'string', example: 'BTC/USDT' },
86
+ last: { type: 'number', example: 42000.5 },
87
+ bid: { type: 'number', example: 42000.0 },
88
+ ask: { type: 'number', example: 42001.0 },
89
+ high24h: { type: 'number', example: 43000.0 },
90
+ low24h: { type: 'number', example: 41000.0 },
91
+ volume24h: { type: 'number', example: 1234.56 },
92
+ change24h: { type: 'number', example: 2.5 },
93
+ timestamp: { type: 'number', example: 1699900000000 },
94
+ },
95
+ required: ['symbol', 'last', 'bid', 'ask'],
96
+ },
97
+ OrderBookEntry: {
98
+ type: 'object',
99
+ properties: {
100
+ price: { type: 'number', example: 42000.0 },
101
+ amount: { type: 'number', example: 1.5 },
102
+ },
103
+ required: ['price', 'amount'],
104
+ },
105
+ OrderBook: {
106
+ type: 'object',
107
+ properties: {
108
+ symbol: { type: 'string', example: 'BTC/USDT' },
109
+ bids: {
110
+ type: 'array',
111
+ items: { $ref: '#/components/schemas/OrderBookEntry' },
112
+ },
113
+ asks: {
114
+ type: 'array',
115
+ items: { $ref: '#/components/schemas/OrderBookEntry' },
116
+ },
117
+ timestamp: { type: 'number', example: 1699900000000 },
118
+ },
119
+ required: ['symbol', 'bids', 'asks'],
120
+ },
121
+ Trade: {
122
+ type: 'object',
123
+ properties: {
124
+ id: { type: 'string', example: '123456' },
125
+ symbol: { type: 'string', example: 'BTC/USDT' },
126
+ side: { type: 'string', enum: ['buy', 'sell'] },
127
+ price: { type: 'number', example: 42000.0 },
128
+ amount: { type: 'number', example: 0.1 },
129
+ timestamp: { type: 'number', example: 1699900000000 },
130
+ },
131
+ required: ['id', 'symbol', 'side', 'price', 'amount', 'timestamp'],
132
+ },
133
+ Order: {
134
+ type: 'object',
135
+ properties: {
136
+ id: { type: 'string', example: 'order-123' },
137
+ symbol: { type: 'string', example: 'BTC/USDT' },
138
+ side: { type: 'string', enum: ['buy', 'sell'] },
139
+ type: { type: 'string', enum: ['limit', 'market'] },
140
+ price: { type: 'number', example: 42000.0 },
141
+ amount: { type: 'number', example: 0.1 },
142
+ filled: { type: 'number', example: 0.05 },
143
+ status: { type: 'string', enum: ['open', 'filled', 'cancelled', 'partial'] },
144
+ timestamp: { type: 'number', example: 1699900000000 },
145
+ },
146
+ required: ['id', 'symbol', 'side', 'type', 'amount', 'status'],
147
+ },
148
+ CreateOrderRequest: {
149
+ type: 'object',
150
+ properties: {
151
+ exchange: { $ref: '#/components/schemas/Exchange' },
152
+ symbol: { type: 'string', example: 'BTC/USDT' },
153
+ side: { type: 'string', enum: ['buy', 'sell'] },
154
+ type: { type: 'string', enum: ['limit', 'market'], default: 'limit' },
155
+ price: { type: 'number', example: 42000.0 },
156
+ amount: { type: 'number', example: 0.1 },
157
+ },
158
+ required: ['exchange', 'symbol', 'side', 'amount'],
159
+ },
160
+ GridStrategyConfig: {
161
+ type: 'object',
162
+ properties: {
163
+ exchange: { $ref: '#/components/schemas/Exchange' },
164
+ symbol: { type: 'string', example: 'BTC/USDT' },
165
+ lowerPrice: { type: 'number', example: 40000 },
166
+ upperPrice: { type: 'number', example: 44000 },
167
+ gridCount: { type: 'integer', example: 10 },
168
+ totalAmount: { type: 'number', example: 1.0 },
169
+ },
170
+ required: ['exchange', 'symbol', 'lowerPrice', 'upperPrice', 'gridCount', 'totalAmount'],
171
+ },
172
+ GridStrategyStatus: {
173
+ type: 'object',
174
+ properties: {
175
+ id: { type: 'string', example: 'grid-123' },
176
+ status: { type: 'string', enum: ['running', 'stopped', 'error'] },
177
+ symbol: { type: 'string', example: 'BTC/USDT' },
178
+ openOrders: { type: 'integer', example: 8 },
179
+ filledOrders: { type: 'integer', example: 12 },
180
+ profit: { type: 'number', example: 150.25 },
181
+ createdAt: { type: 'number', example: 1699900000000 },
182
+ },
183
+ required: ['id', 'status', 'symbol'],
184
+ },
185
+ CardanoPrice: {
186
+ type: 'object',
187
+ properties: {
188
+ symbol: { type: 'string', example: 'SNEK' },
189
+ priceAda: { type: 'number', example: 0.00012 },
190
+ priceUsdt: { type: 'number', example: 0.000045 },
191
+ adaPrice: { type: 'number', example: 0.38 },
192
+ source: { type: 'string', example: 'iris' },
193
+ },
194
+ required: ['symbol', 'priceAda', 'priceUsdt'],
195
+ },
196
+ DexPool: {
197
+ type: 'object',
198
+ properties: {
199
+ dex: { type: 'string', example: 'minswap' },
200
+ poolId: { type: 'string' },
201
+ tokenA: { type: 'string', example: 'ADA' },
202
+ tokenB: { type: 'string', example: 'SNEK' },
203
+ reserveA: { type: 'number' },
204
+ reserveB: { type: 'number' },
205
+ tvl: { type: 'number', example: 1500000 },
206
+ volume24h: { type: 'number', example: 250000 },
207
+ },
208
+ required: ['dex', 'poolId', 'tokenA', 'tokenB'],
209
+ },
210
+ },
211
+ },
212
+ },
213
+ };
214
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/api/openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ export declare function balanceRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=balance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../../src/api/routes/balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAuBxE,wBAAsB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGvE"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.balanceRoutes = balanceRoutes;
4
+ const exchange_factory_1 = require("../../cli/exchange-factory");
5
+ async function balanceRoutes(app) {
6
+ app.get('/balance', {
7
+ schema: {
8
+ tags: ['Account'],
9
+ summary: 'Get account balances',
10
+ description: 'Returns account balances for all assets or a specific asset on an exchange.',
11
+ querystring: {
12
+ type: 'object',
13
+ required: ['exchange'],
14
+ properties: {
15
+ exchange: {
16
+ type: 'string',
17
+ enum: ['mexc', 'gateio', 'bitget', 'kraken'],
18
+ description: 'Exchange to query',
19
+ },
20
+ asset: {
21
+ type: 'string',
22
+ description: 'Filter by specific asset (e.g., BTC, USDT)',
23
+ example: 'BTC',
24
+ },
25
+ },
26
+ },
27
+ response: {
28
+ 200: {
29
+ type: 'object',
30
+ properties: {
31
+ exchange: { type: 'string' },
32
+ balances: {
33
+ type: 'array',
34
+ items: {
35
+ type: 'object',
36
+ properties: {
37
+ asset: { type: 'string' },
38
+ free: { type: 'number', description: 'Free balance' },
39
+ used: { type: 'number', description: 'Used in orders' },
40
+ total: { type: 'number', description: 'Total balance' },
41
+ available: { type: 'number', description: 'Available balance' },
42
+ },
43
+ },
44
+ },
45
+ timestamp: { type: 'number' },
46
+ },
47
+ },
48
+ 400: {
49
+ type: 'object',
50
+ properties: { error: { type: 'string' } },
51
+ },
52
+ 500: {
53
+ type: 'object',
54
+ properties: { error: { type: 'string' } },
55
+ },
56
+ },
57
+ },
58
+ }, async (request, reply) => {
59
+ const { exchange, asset } = request.query;
60
+ if (!exchange) {
61
+ return reply.status(400).send({ error: 'Missing required parameter: exchange' });
62
+ }
63
+ const validExchanges = ['mexc', 'gateio', 'bitget', 'kraken'];
64
+ if (!validExchanges.includes(exchange)) {
65
+ return reply.status(400).send({ error: `Invalid exchange. Must be one of: ${validExchanges.join(', ')}` });
66
+ }
67
+ try {
68
+ const connector = await exchange_factory_1.ExchangeFactory.getExchange(exchange);
69
+ const rawBalances = await connector.getBalance();
70
+ // Transform and optionally filter balances
71
+ let balances = Object.entries(rawBalances).map(([assetName, balance]) => ({
72
+ asset: assetName,
73
+ free: balance.free,
74
+ used: balance.used,
75
+ total: balance.total,
76
+ available: balance.available,
77
+ }));
78
+ // Filter by asset if specified
79
+ if (asset) {
80
+ const assetUpper = asset.toUpperCase();
81
+ balances = balances.filter(b => b.asset.toUpperCase() === assetUpper);
82
+ }
83
+ // Filter out zero balances unless specific asset requested
84
+ if (!asset) {
85
+ balances = balances.filter(b => b.total > 0);
86
+ }
87
+ // Sort by total balance (descending)
88
+ balances.sort((a, b) => b.total - a.total);
89
+ return {
90
+ exchange,
91
+ balances,
92
+ timestamp: Date.now(),
93
+ };
94
+ }
95
+ catch (error) {
96
+ const message = error instanceof Error ? error.message : 'Unknown error';
97
+ return reply.status(500).send({ error: `Failed to fetch balance: ${message}` });
98
+ }
99
+ });
100
+ }
101
+ //# sourceMappingURL=balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.js","sourceRoot":"","sources":["../../../src/api/routes/balance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ export declare function cardanoRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=cardano.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardano.d.ts","sourceRoot":"","sources":["../../../src/api/routes/cardano.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAkBxE,wBAAsB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkLvE"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cardanoRoutes = cardanoRoutes;
4
+ const cardano_price_service_1 = require("../../core/price-aggregation/cardano-price-service");
5
+ const iris_pool_discovery_1 = require("../../core/price-aggregation/iris-pool-discovery");
6
+ const price_aggregation_1 = require("../../config/price-aggregation");
7
+ async function cardanoRoutes(app) {
8
+ const priceService = new cardano_price_service_1.CardanoPriceService();
9
+ const poolDiscovery = new iris_pool_discovery_1.IrisPoolDiscovery();
10
+ // GET /cardano/price/:symbol - Get Cardano token price (QBT-365)
11
+ app.get('/cardano/price/:symbol', {
12
+ schema: {
13
+ tags: ['Cardano'],
14
+ summary: 'Get Cardano DEX token price',
15
+ description: 'Returns aggregated price for a Cardano token from DEX pools via Iris Protocol. Price is TOKEN/USDT calculated via ADA bridge.',
16
+ params: {
17
+ type: 'object',
18
+ required: ['symbol'],
19
+ properties: {
20
+ symbol: { type: 'string', description: 'Token symbol (e.g., SNEK, INDY, MIN)', example: 'SNEK' },
21
+ },
22
+ },
23
+ response: {
24
+ 200: {
25
+ type: 'object',
26
+ properties: {
27
+ symbol: { type: 'string', description: 'Trading pair' },
28
+ price: { type: 'number', description: 'Price in USDT' },
29
+ confidence: { type: 'number', description: 'Confidence score (0-1)' },
30
+ sources: {
31
+ type: 'array',
32
+ items: {
33
+ type: 'object',
34
+ properties: {
35
+ id: { type: 'string' },
36
+ name: { type: 'string' },
37
+ exchange: { type: 'string' },
38
+ },
39
+ },
40
+ },
41
+ timestamp: { type: 'string' },
42
+ },
43
+ },
44
+ 400: {
45
+ type: 'object',
46
+ properties: { error: { type: 'string' } },
47
+ },
48
+ 500: {
49
+ type: 'object',
50
+ properties: { error: { type: 'string' } },
51
+ },
52
+ },
53
+ },
54
+ }, async (request, reply) => {
55
+ const { symbol } = request.params;
56
+ try {
57
+ const result = await priceService.getTokenPrice(symbol.toUpperCase());
58
+ return {
59
+ symbol: result.symbol,
60
+ price: result.price,
61
+ confidence: result.confidence,
62
+ sources: result.sources.map(s => ({
63
+ id: s.id,
64
+ name: s.name,
65
+ exchange: s.exchange,
66
+ })),
67
+ timestamp: result.timestamp.toISOString(),
68
+ };
69
+ }
70
+ catch (error) {
71
+ const message = error instanceof Error ? error.message : 'Unknown error';
72
+ if (message.includes('Unsupported token')) {
73
+ return reply.status(400).send({ error: message });
74
+ }
75
+ return reply.status(500).send({ error: `Failed to fetch price: ${message}` });
76
+ }
77
+ });
78
+ // GET /cardano/pools/:symbol - Discover liquidity pools for a token (QBT-366)
79
+ app.get('/cardano/pools/:symbol', {
80
+ schema: {
81
+ tags: ['Cardano'],
82
+ summary: 'Discover liquidity pools for a Cardano token',
83
+ description: 'Returns a list of DEX liquidity pools for a token, sorted by TVL. Uses Iris Protocol for pool discovery.',
84
+ params: {
85
+ type: 'object',
86
+ required: ['symbol'],
87
+ properties: {
88
+ symbol: { type: 'string', description: 'Token symbol (e.g., SNEK, INDY, MIN)', example: 'INDY' },
89
+ },
90
+ },
91
+ querystring: {
92
+ type: 'object',
93
+ properties: {
94
+ minLiquidity: { type: 'number', description: 'Minimum TVL filter (in ADA)', default: 0 },
95
+ limit: { type: 'number', minimum: 1, maximum: 50, default: 10, description: 'Max pools to return' },
96
+ },
97
+ },
98
+ response: {
99
+ 200: {
100
+ type: 'object',
101
+ properties: {
102
+ symbol: { type: 'string' },
103
+ pools: {
104
+ type: 'array',
105
+ items: {
106
+ type: 'object',
107
+ properties: {
108
+ dex: { type: 'string', description: 'DEX name (e.g., Minswap, SundaeSwap)' },
109
+ identifier: { type: 'string', description: 'Pool identifier' },
110
+ tvl: { type: 'number', description: 'Total value locked (ADA)' },
111
+ price: { type: 'number', description: 'Token price in ADA' },
112
+ reserveA: { type: 'number', description: 'Reserve of token A' },
113
+ reserveB: { type: 'number', description: 'Reserve of token B' },
114
+ tokenA: { type: 'string', description: 'Token A symbol' },
115
+ tokenB: { type: 'string', description: 'Token B symbol' },
116
+ },
117
+ },
118
+ },
119
+ count: { type: 'number' },
120
+ timestamp: { type: 'string' },
121
+ },
122
+ },
123
+ 400: {
124
+ type: 'object',
125
+ properties: { error: { type: 'string' } },
126
+ },
127
+ 500: {
128
+ type: 'object',
129
+ properties: { error: { type: 'string' } },
130
+ },
131
+ },
132
+ },
133
+ }, async (request, reply) => {
134
+ const { symbol } = request.params;
135
+ const { minLiquidity = 0, limit = 10 } = request.query;
136
+ const upperSymbol = symbol.toUpperCase();
137
+ // Check if token is supported
138
+ if (!(0, price_aggregation_1.isTokenSupported)(upperSymbol)) {
139
+ return reply.status(400).send({
140
+ error: `Unsupported token: ${symbol}. Supported: INDY, SNEK, NIGHT, MIN`
141
+ });
142
+ }
143
+ try {
144
+ const tokenConfig = (0, price_aggregation_1.getTokenConfig)(upperSymbol);
145
+ // Override minLiquidity if provided in query
146
+ const configWithOverride = {
147
+ ...tokenConfig,
148
+ minLiquidityThreshold: minLiquidity > 0 ? minLiquidity : tokenConfig.minLiquidityThreshold,
149
+ };
150
+ const pools = await poolDiscovery.discoverPools('ADA', configWithOverride);
151
+ // Apply limit
152
+ const limitedPools = pools.slice(0, limit);
153
+ // Format response
154
+ const formattedPools = limitedPools.map(pool => ({
155
+ dex: pool.dex,
156
+ identifier: pool.identifier,
157
+ tvl: pool.state?.tvl ?? 0,
158
+ price: pool.state?.price ?? 0,
159
+ reserveA: pool.state?.reserveA ?? 0,
160
+ reserveB: pool.state?.reserveB ?? 0,
161
+ tokenA: pool.pair?.tokenA?.ticker ?? pool.pair?.tokenA?.name ?? 'ADA',
162
+ tokenB: pool.pair?.tokenB?.ticker ?? pool.pair?.tokenB?.name ?? upperSymbol,
163
+ }));
164
+ return {
165
+ symbol: upperSymbol,
166
+ pools: formattedPools,
167
+ count: formattedPools.length,
168
+ timestamp: new Date().toISOString(),
169
+ };
170
+ }
171
+ catch (error) {
172
+ const message = error instanceof Error ? error.message : 'Unknown error';
173
+ return reply.status(500).send({ error: `Failed to discover pools: ${message}` });
174
+ }
175
+ });
176
+ }
177
+ //# sourceMappingURL=cardano.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardano.js","sourceRoot":"","sources":["../../../src/api/routes/cardano.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ export declare function healthRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAexE,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoHtE"}