@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
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.healthRoutes = healthRoutes;
4
+ async function healthRoutes(app) {
5
+ // Basic health check
6
+ app.get('/health', {
7
+ schema: {
8
+ tags: ['Health'],
9
+ summary: 'Health check',
10
+ description: 'Returns the health status of the API server',
11
+ response: {
12
+ 200: {
13
+ type: 'object',
14
+ properties: {
15
+ status: { type: 'string', enum: ['ok', 'degraded', 'error'] },
16
+ timestamp: { type: 'number' },
17
+ version: { type: 'string' },
18
+ uptime: { type: 'number', description: 'Uptime in seconds' },
19
+ },
20
+ },
21
+ },
22
+ },
23
+ }, async (_request, _reply) => {
24
+ return {
25
+ status: 'ok',
26
+ timestamp: Date.now(),
27
+ version: process.env.npm_package_version || '1.0.0',
28
+ uptime: process.uptime(),
29
+ };
30
+ });
31
+ // Detailed health check with exchange status
32
+ app.get('/health/detailed', {
33
+ schema: {
34
+ tags: ['Health'],
35
+ summary: 'Detailed health check',
36
+ description: 'Returns detailed health status including exchange connectivity',
37
+ response: {
38
+ 200: {
39
+ type: 'object',
40
+ properties: {
41
+ status: { type: 'string', enum: ['ok', 'degraded', 'error'] },
42
+ timestamp: { type: 'number' },
43
+ version: { type: 'string' },
44
+ uptime: { type: 'number' },
45
+ exchanges: {
46
+ type: 'object',
47
+ additionalProperties: {
48
+ type: 'object',
49
+ properties: {
50
+ configured: { type: 'boolean' },
51
+ connected: { type: 'boolean' },
52
+ },
53
+ },
54
+ },
55
+ },
56
+ },
57
+ },
58
+ },
59
+ }, async (_request, _reply) => {
60
+ const exchanges = {
61
+ mexc: {
62
+ configured: !!(process.env.MEXC_API_KEY && process.env.MEXC_SECRET_KEY),
63
+ },
64
+ gateio: {
65
+ configured: !!(process.env.GATEIO_API_KEY && process.env.GATEIO_SECRET_KEY),
66
+ },
67
+ bitget: {
68
+ configured: !!(process.env.BITGET_API_KEY && process.env.BITGET_SECRET_KEY),
69
+ },
70
+ kraken: {
71
+ configured: !!(process.env.KRAKEN_API_KEY && process.env.KRAKEN_SECRET_KEY),
72
+ },
73
+ };
74
+ const configuredCount = Object.values(exchanges).filter(e => e.configured).length;
75
+ const status = configuredCount > 0 ? 'ok' : 'degraded';
76
+ return {
77
+ status,
78
+ timestamp: Date.now(),
79
+ version: process.env.npm_package_version || '1.0.0',
80
+ uptime: process.uptime(),
81
+ exchanges,
82
+ };
83
+ });
84
+ // Ready check for load balancers
85
+ app.get('/ready', {
86
+ schema: {
87
+ tags: ['Health'],
88
+ summary: 'Readiness check',
89
+ description: 'Returns whether the server is ready to accept traffic',
90
+ response: {
91
+ 200: {
92
+ type: 'object',
93
+ properties: {
94
+ ready: { type: 'boolean' },
95
+ },
96
+ },
97
+ 503: {
98
+ type: 'object',
99
+ properties: {
100
+ ready: { type: 'boolean' },
101
+ reason: { type: 'string' },
102
+ },
103
+ },
104
+ },
105
+ },
106
+ }, async (_request, reply) => {
107
+ // Add any readiness checks here (database, cache, etc.)
108
+ const ready = true;
109
+ if (!ready) {
110
+ return reply.status(503).send({ ready: false, reason: 'Service not ready' });
111
+ }
112
+ return { ready: true };
113
+ });
114
+ }
115
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ export declare function registerRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAW1C,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCxE"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerRoutes = registerRoutes;
4
+ const health_1 = require("./health");
5
+ const ticker_1 = require("./ticker");
6
+ const orderbook_1 = require("./orderbook");
7
+ const trades_1 = require("./trades");
8
+ const balance_1 = require("./balance");
9
+ const orders_1 = require("./orders");
10
+ const cardano_1 = require("./cardano");
11
+ const price_1 = require("./price");
12
+ const strategy_1 = require("./strategy");
13
+ async function registerRoutes(app) {
14
+ // Health check routes
15
+ await app.register(health_1.healthRoutes, { prefix: '/api/v1' });
16
+ // Market data routes
17
+ await app.register(ticker_1.tickerRoutes, { prefix: '/api/v1' });
18
+ await app.register(orderbook_1.orderbookRoutes, { prefix: '/api/v1' });
19
+ await app.register(trades_1.tradesRoutes, { prefix: '/api/v1' });
20
+ // Account routes
21
+ await app.register(balance_1.balanceRoutes, { prefix: '/api/v1' });
22
+ // Order management routes
23
+ await app.register(orders_1.ordersRoutes, { prefix: '/api/v1' });
24
+ // Cardano DEX routes
25
+ await app.register(cardano_1.cardanoRoutes, { prefix: '/api/v1' });
26
+ // Price comparison routes
27
+ await app.register(price_1.priceRoutes, { prefix: '/api/v1' });
28
+ // Strategy routes
29
+ await app.register(strategy_1.strategyRoutes, { prefix: '/api/v1' });
30
+ // Future route registrations:
31
+ // await app.register(balanceRoutes, { prefix: '/api/v1' });
32
+ // await app.register(orderbookRoutes, { prefix: '/api/v1' });
33
+ // await app.register(tradesRoutes, { prefix: '/api/v1' });
34
+ // await app.register(ordersRoutes, { prefix: '/api/v1' });
35
+ // await app.register(strategyRoutes, { prefix: '/api/v1' });
36
+ // await app.register(cardanoRoutes, { prefix: '/api/v1' });
37
+ // await app.register(priceRoutes, { prefix: '/api/v1' });
38
+ }
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/routes/index.ts"],"names":[],"mappings":";;AAWA,wCAgCC;AA1CD,qCAAwC;AACxC,qCAAwC;AACxC,2CAA8C;AAC9C,qCAAwC;AACxC,uCAA0C;AAC1C,qCAAwC;AACxC,uCAA0C;AAC1C,mCAAsC;AACtC,yCAA4C;AAErC,KAAK,UAAU,cAAc,CAAC,GAAoB;IACvD,sBAAsB;IACtB,MAAM,GAAG,CAAC,QAAQ,CAAC,qBAAY,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAExD,qBAAqB;IACrB,MAAM,GAAG,CAAC,QAAQ,CAAC,qBAAY,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACxD,MAAM,GAAG,CAAC,QAAQ,CAAC,2BAAe,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,CAAC,QAAQ,CAAC,qBAAY,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAExD,iBAAiB;IACjB,MAAM,GAAG,CAAC,QAAQ,CAAC,uBAAa,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzD,0BAA0B;IAC1B,MAAM,GAAG,CAAC,QAAQ,CAAC,qBAAY,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAExD,qBAAqB;IACrB,MAAM,GAAG,CAAC,QAAQ,CAAC,uBAAa,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzD,0BAA0B;IAC1B,MAAM,GAAG,CAAC,QAAQ,CAAC,mBAAW,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAEvD,kBAAkB;IAClB,MAAM,GAAG,CAAC,QAAQ,CAAC,yBAAc,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAE1D,8BAA8B;IAC9B,4DAA4D;IAC5D,8DAA8D;IAC9D,2DAA2D;IAC3D,2DAA2D;IAC3D,6DAA6D;IAC7D,4DAA4D;IAC5D,0DAA0D;AAC5D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ export declare function orderbookRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=orderbook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderbook.d.ts","sourceRoot":"","sources":["../../../src/api/routes/orderbook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AA2BxE,wBAAsB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2HzE"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.orderbookRoutes = orderbookRoutes;
4
+ const exchange_factory_1 = require("../../cli/exchange-factory");
5
+ async function orderbookRoutes(app) {
6
+ app.get('/orderbook', {
7
+ schema: {
8
+ tags: ['Market Data'],
9
+ summary: 'Get order book depth',
10
+ description: 'Returns the order book (bids and asks) for a trading pair with cumulative totals.',
11
+ querystring: {
12
+ type: 'object',
13
+ required: ['exchange', 'symbol'],
14
+ properties: {
15
+ exchange: {
16
+ type: 'string',
17
+ enum: ['mexc', 'gateio', 'bitget', 'kraken'],
18
+ description: 'Exchange to query',
19
+ },
20
+ symbol: {
21
+ type: 'string',
22
+ description: 'Trading pair (e.g., BTC/USDT)',
23
+ example: 'BTC/USDT',
24
+ },
25
+ limit: {
26
+ type: 'integer',
27
+ minimum: 1,
28
+ maximum: 100,
29
+ default: 10,
30
+ description: 'Number of price levels to return (max 100)',
31
+ },
32
+ },
33
+ },
34
+ response: {
35
+ 200: {
36
+ type: 'object',
37
+ properties: {
38
+ exchange: { type: 'string' },
39
+ symbol: { type: 'string' },
40
+ bids: {
41
+ type: 'array',
42
+ items: {
43
+ type: 'object',
44
+ properties: {
45
+ price: { type: 'number' },
46
+ amount: { type: 'number' },
47
+ total: { type: 'number', description: 'Cumulative amount' },
48
+ },
49
+ },
50
+ },
51
+ asks: {
52
+ type: 'array',
53
+ items: {
54
+ type: 'object',
55
+ properties: {
56
+ price: { type: 'number' },
57
+ amount: { type: 'number' },
58
+ total: { type: 'number', description: 'Cumulative amount' },
59
+ },
60
+ },
61
+ },
62
+ spread: { type: 'number', description: 'Best ask - best bid' },
63
+ spreadPercent: { type: 'number', description: 'Spread as percentage of mid price' },
64
+ midPrice: { type: 'number', description: '(Best bid + best ask) / 2' },
65
+ timestamp: { type: 'number' },
66
+ },
67
+ },
68
+ 400: {
69
+ type: 'object',
70
+ properties: { error: { type: 'string' } },
71
+ },
72
+ 500: {
73
+ type: 'object',
74
+ properties: { error: { type: 'string' } },
75
+ },
76
+ },
77
+ },
78
+ }, async (request, reply) => {
79
+ const { exchange, symbol, limit = 10 } = request.query;
80
+ if (!exchange || !symbol) {
81
+ return reply.status(400).send({ error: 'Missing required parameters: exchange and symbol' });
82
+ }
83
+ const validExchanges = ['mexc', 'gateio', 'bitget', 'kraken'];
84
+ if (!validExchanges.includes(exchange)) {
85
+ return reply.status(400).send({ error: `Invalid exchange. Must be one of: ${validExchanges.join(', ')}` });
86
+ }
87
+ try {
88
+ const connector = await exchange_factory_1.ExchangeFactory.getExchange(exchange);
89
+ const orderbook = await connector.getOrderBook(symbol);
90
+ // Add cumulative totals and limit results
91
+ const processEntries = (entries) => {
92
+ let cumulative = 0;
93
+ return entries.slice(0, limit).map((entry) => {
94
+ cumulative += entry.amount;
95
+ return { price: entry.price, amount: entry.amount, total: cumulative };
96
+ });
97
+ };
98
+ const bids = processEntries(orderbook.bids);
99
+ const asks = processEntries(orderbook.asks);
100
+ // Calculate spread
101
+ const bestBid = bids.length > 0 ? bids[0].price : 0;
102
+ const bestAsk = asks.length > 0 ? asks[0].price : 0;
103
+ const spread = bestAsk - bestBid;
104
+ const midPrice = (bestBid + bestAsk) / 2;
105
+ const spreadPercent = midPrice > 0 ? (spread / midPrice) * 100 : 0;
106
+ return {
107
+ exchange,
108
+ symbol: orderbook.symbol,
109
+ bids,
110
+ asks,
111
+ spread,
112
+ spreadPercent: Math.round(spreadPercent * 10000) / 10000,
113
+ midPrice,
114
+ timestamp: orderbook.timestamp || Date.now(),
115
+ };
116
+ }
117
+ catch (error) {
118
+ const message = error instanceof Error ? error.message : 'Unknown error';
119
+ return reply.status(500).send({ error: `Failed to fetch orderbook: ${message}` });
120
+ }
121
+ });
122
+ }
123
+ //# sourceMappingURL=orderbook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderbook.js","sourceRoot":"","sources":["../../../src/api/routes/orderbook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ export declare function ordersRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=orders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../../src/api/routes/orders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AA0CxE,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkMtE"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ordersRoutes = ordersRoutes;
4
+ const exchange_factory_1 = require("../../cli/exchange-factory");
5
+ async function ordersRoutes(app) {
6
+ // GET /orders - List open orders (QBT-357)
7
+ app.get('/orders', {
8
+ schema: {
9
+ tags: ['Orders'],
10
+ summary: 'List open orders',
11
+ description: 'Returns all open orders, optionally filtered by symbol.',
12
+ querystring: {
13
+ type: 'object',
14
+ required: ['exchange'],
15
+ properties: {
16
+ exchange: { type: 'string', enum: ['mexc', 'gateio', 'bitget', 'kraken'] },
17
+ symbol: { type: 'string', description: 'Filter by trading pair' },
18
+ },
19
+ },
20
+ response: {
21
+ 200: {
22
+ type: 'object',
23
+ properties: {
24
+ exchange: { type: 'string' },
25
+ orders: {
26
+ type: 'array',
27
+ items: {
28
+ type: 'object',
29
+ properties: {
30
+ id: { type: 'string' },
31
+ symbol: { type: 'string' },
32
+ side: { type: 'string' },
33
+ type: { type: 'string' },
34
+ price: { type: 'number' },
35
+ amount: { type: 'number' },
36
+ filled: { type: 'number' },
37
+ remaining: { type: 'number' },
38
+ status: { type: 'string' },
39
+ timestamp: { type: 'number' },
40
+ },
41
+ },
42
+ },
43
+ count: { type: 'number' },
44
+ },
45
+ },
46
+ },
47
+ },
48
+ }, async (request, reply) => {
49
+ const { exchange, symbol } = request.query;
50
+ try {
51
+ const connector = await exchange_factory_1.ExchangeFactory.getExchange(exchange);
52
+ const orders = await connector.getOpenOrders(symbol);
53
+ return {
54
+ exchange,
55
+ orders: orders.map(transformOrder),
56
+ count: orders.length,
57
+ };
58
+ }
59
+ catch (error) {
60
+ const message = error instanceof Error ? error.message : 'Unknown error';
61
+ return reply.status(500).send({ error: `Failed to fetch orders: ${message}` });
62
+ }
63
+ });
64
+ // GET /orders/:id - Get order by ID (QBT-358)
65
+ app.get('/orders/:id', {
66
+ schema: {
67
+ tags: ['Orders'],
68
+ summary: 'Get order by ID',
69
+ description: 'Returns details of a specific order.',
70
+ params: {
71
+ type: 'object',
72
+ required: ['id'],
73
+ properties: {
74
+ id: { type: 'string', description: 'Order ID' },
75
+ },
76
+ },
77
+ querystring: {
78
+ type: 'object',
79
+ required: ['exchange', 'symbol'],
80
+ properties: {
81
+ exchange: { type: 'string', enum: ['mexc', 'gateio', 'bitget', 'kraken'] },
82
+ symbol: { type: 'string', description: 'Trading pair (required for most exchanges)' },
83
+ },
84
+ },
85
+ },
86
+ }, async (request, reply) => {
87
+ const { id } = request.params;
88
+ const { exchange, symbol } = request.query;
89
+ if (!symbol) {
90
+ return reply.status(400).send({ error: 'symbol is required' });
91
+ }
92
+ try {
93
+ const connector = await exchange_factory_1.ExchangeFactory.getExchange(exchange);
94
+ const order = await connector.getOrder(id, symbol);
95
+ return { exchange, order: transformOrder(order) };
96
+ }
97
+ catch (error) {
98
+ const message = error instanceof Error ? error.message : 'Unknown error';
99
+ return reply.status(500).send({ error: `Failed to fetch order: ${message}` });
100
+ }
101
+ });
102
+ // POST /orders - Create order (QBT-359)
103
+ app.post('/orders', {
104
+ schema: {
105
+ tags: ['Orders'],
106
+ summary: 'Create a new order',
107
+ description: 'Places a limit or market order on the specified exchange.',
108
+ body: {
109
+ type: 'object',
110
+ required: ['exchange', 'symbol', 'side', 'amount'],
111
+ properties: {
112
+ exchange: { type: 'string', enum: ['mexc', 'gateio', 'bitget', 'kraken'] },
113
+ symbol: { type: 'string', example: 'BTC/USDT' },
114
+ side: { type: 'string', enum: ['buy', 'sell'] },
115
+ type: { type: 'string', enum: ['limit', 'market'], default: 'limit' },
116
+ amount: { type: 'number', minimum: 0 },
117
+ price: { type: 'number', minimum: 0, description: 'Required for limit orders' },
118
+ },
119
+ },
120
+ },
121
+ }, async (request, reply) => {
122
+ const { exchange, symbol, side, type = 'limit', amount, price } = request.body;
123
+ if (type === 'limit' && !price) {
124
+ return reply.status(400).send({ error: 'price is required for limit orders' });
125
+ }
126
+ try {
127
+ const connector = await exchange_factory_1.ExchangeFactory.getExchange(exchange);
128
+ const order = await connector.createOrder(symbol, type, side, amount, price);
129
+ return { exchange, order: transformOrder(order), message: 'Order created successfully' };
130
+ }
131
+ catch (error) {
132
+ const message = error instanceof Error ? error.message : 'Unknown error';
133
+ return reply.status(500).send({ error: `Failed to create order: ${message}` });
134
+ }
135
+ });
136
+ // DELETE /orders/:id - Cancel order (QBT-360)
137
+ app.delete('/orders/:id', {
138
+ schema: {
139
+ tags: ['Orders'],
140
+ summary: 'Cancel an order',
141
+ description: 'Cancels a specific order by ID.',
142
+ params: {
143
+ type: 'object',
144
+ required: ['id'],
145
+ properties: {
146
+ id: { type: 'string' },
147
+ },
148
+ },
149
+ body: {
150
+ type: 'object',
151
+ required: ['exchange', 'symbol'],
152
+ properties: {
153
+ exchange: { type: 'string', enum: ['mexc', 'gateio', 'bitget', 'kraken'] },
154
+ symbol: { type: 'string' },
155
+ },
156
+ },
157
+ },
158
+ }, async (request, reply) => {
159
+ const { id } = request.params;
160
+ const { exchange, symbol } = request.body;
161
+ try {
162
+ const connector = await exchange_factory_1.ExchangeFactory.getExchange(exchange);
163
+ await connector.cancelOrder(id, symbol);
164
+ return { success: true, message: `Order ${id} cancelled` };
165
+ }
166
+ catch (error) {
167
+ const message = error instanceof Error ? error.message : 'Unknown error';
168
+ return reply.status(500).send({ error: `Failed to cancel order: ${message}` });
169
+ }
170
+ });
171
+ // DELETE /orders - Cancel all orders (QBT-361)
172
+ app.delete('/orders', {
173
+ schema: {
174
+ tags: ['Orders'],
175
+ summary: 'Cancel all orders',
176
+ description: 'Cancels all open orders for a symbol.',
177
+ body: {
178
+ type: 'object',
179
+ required: ['exchange', 'symbol'],
180
+ properties: {
181
+ exchange: { type: 'string', enum: ['mexc', 'gateio', 'bitget', 'kraken'] },
182
+ symbol: { type: 'string' },
183
+ },
184
+ },
185
+ },
186
+ }, async (request, reply) => {
187
+ const { exchange, symbol } = request.body;
188
+ try {
189
+ const connector = await exchange_factory_1.ExchangeFactory.getExchange(exchange);
190
+ await connector.cancelAllOrders(symbol);
191
+ return { success: true, message: `All orders for ${symbol} cancelled` };
192
+ }
193
+ catch (error) {
194
+ const message = error instanceof Error ? error.message : 'Unknown error';
195
+ return reply.status(500).send({ error: `Failed to cancel orders: ${message}` });
196
+ }
197
+ });
198
+ }
199
+ // Helper to transform Order to response format
200
+ function transformOrder(order) {
201
+ return {
202
+ id: order.id,
203
+ symbol: order.symbol,
204
+ side: order.side,
205
+ type: order.type,
206
+ price: order.price ?? 0,
207
+ amount: order.amount,
208
+ filled: order.filled,
209
+ remaining: order.remaining,
210
+ status: order.status,
211
+ timestamp: order.timestamp,
212
+ };
213
+ }
214
+ //# sourceMappingURL=orders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orders.js","sourceRoot":"","sources":["../../../src/api/routes/orders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ export declare function priceRoutes(app: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=price.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"price.d.ts","sourceRoot":"","sources":["../../../src/api/routes/price.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AA2BxE,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgIrE"}