@123456btc/123456btc-cli 1.0.5 → 1.0.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 (99) hide show
  1. package/dist/api/signals.d.ts +3 -3
  2. package/dist/api/signals.d.ts.map +1 -1
  3. package/dist/api/signals.js +3 -3
  4. package/dist/api/signals.js.map +1 -1
  5. package/dist/api/strategy-stream.d.ts +4 -9
  6. package/dist/api/strategy-stream.d.ts.map +1 -1
  7. package/dist/api/strategy-stream.js +14 -13
  8. package/dist/api/strategy-stream.js.map +1 -1
  9. package/dist/api/strategy.d.ts +3 -1
  10. package/dist/api/strategy.d.ts.map +1 -1
  11. package/dist/api/strategy.js +3 -1
  12. package/dist/api/strategy.js.map +1 -1
  13. package/dist/commands/exchange.d.ts +3 -0
  14. package/dist/commands/exchange.d.ts.map +1 -0
  15. package/dist/commands/exchange.js +141 -0
  16. package/dist/commands/exchange.js.map +1 -0
  17. package/dist/commands/signals.js +7 -7
  18. package/dist/commands/signals.js.map +1 -1
  19. package/dist/commands/strategy.d.ts.map +1 -1
  20. package/dist/commands/strategy.js +181 -8
  21. package/dist/commands/strategy.js.map +1 -1
  22. package/dist/commands/vault.d.ts.map +1 -1
  23. package/dist/commands/vault.js +5 -3
  24. package/dist/commands/vault.js.map +1 -1
  25. package/dist/config/strategy-exchange.d.ts +30 -0
  26. package/dist/config/strategy-exchange.d.ts.map +1 -0
  27. package/dist/config/strategy-exchange.js +130 -0
  28. package/dist/config/strategy-exchange.js.map +1 -0
  29. package/dist/exchange/index.d.ts +106 -0
  30. package/dist/exchange/index.d.ts.map +1 -0
  31. package/dist/exchange/index.js +43 -0
  32. package/dist/exchange/index.js.map +1 -0
  33. package/dist/exchange/v2/adapters/base.d.ts +130 -0
  34. package/dist/exchange/v2/adapters/base.d.ts.map +1 -0
  35. package/dist/exchange/v2/adapters/base.js +296 -0
  36. package/dist/exchange/v2/adapters/base.js.map +1 -0
  37. package/dist/exchange/v2/adapters/binance.d.ts +51 -0
  38. package/dist/exchange/v2/adapters/binance.d.ts.map +1 -0
  39. package/dist/exchange/v2/adapters/binance.js +549 -0
  40. package/dist/exchange/v2/adapters/binance.js.map +1 -0
  41. package/dist/exchange/v2/adapters/bitget.d.ts +43 -0
  42. package/dist/exchange/v2/adapters/bitget.d.ts.map +1 -0
  43. package/dist/exchange/v2/adapters/bitget.js +524 -0
  44. package/dist/exchange/v2/adapters/bitget.js.map +1 -0
  45. package/dist/exchange/v2/adapters/hyperliquid.d.ts +102 -0
  46. package/dist/exchange/v2/adapters/hyperliquid.d.ts.map +1 -0
  47. package/dist/exchange/v2/adapters/hyperliquid.js +536 -0
  48. package/dist/exchange/v2/adapters/hyperliquid.js.map +1 -0
  49. package/dist/exchange/v2/adapters/okx.d.ts +38 -0
  50. package/dist/exchange/v2/adapters/okx.d.ts.map +1 -0
  51. package/dist/exchange/v2/adapters/okx.js +437 -0
  52. package/dist/exchange/v2/adapters/okx.js.map +1 -0
  53. package/dist/exchange/v2/algorithms/index.d.ts +78 -0
  54. package/dist/exchange/v2/algorithms/index.d.ts.map +1 -0
  55. package/dist/exchange/v2/algorithms/index.js +441 -0
  56. package/dist/exchange/v2/algorithms/index.js.map +1 -0
  57. package/dist/exchange/v2/executor/circuit-breaker.d.ts +44 -0
  58. package/dist/exchange/v2/executor/circuit-breaker.d.ts.map +1 -0
  59. package/dist/exchange/v2/executor/circuit-breaker.js +90 -0
  60. package/dist/exchange/v2/executor/circuit-breaker.js.map +1 -0
  61. package/dist/exchange/v2/executor/core.d.ts +64 -0
  62. package/dist/exchange/v2/executor/core.d.ts.map +1 -0
  63. package/dist/exchange/v2/executor/core.js +458 -0
  64. package/dist/exchange/v2/executor/core.js.map +1 -0
  65. package/dist/exchange/v2/executor/risk.d.ts +29 -0
  66. package/dist/exchange/v2/executor/risk.d.ts.map +1 -0
  67. package/dist/exchange/v2/executor/risk.js +144 -0
  68. package/dist/exchange/v2/executor/risk.js.map +1 -0
  69. package/dist/exchange/v2/executor/state.d.ts +29 -0
  70. package/dist/exchange/v2/executor/state.d.ts.map +1 -0
  71. package/dist/exchange/v2/executor/state.js +171 -0
  72. package/dist/exchange/v2/executor/state.js.map +1 -0
  73. package/dist/exchange/v2/index.d.ts +50 -0
  74. package/dist/exchange/v2/index.d.ts.map +1 -0
  75. package/dist/exchange/v2/index.js +82 -0
  76. package/dist/exchange/v2/index.js.map +1 -0
  77. package/dist/exchange/v2/registry.d.ts +50 -0
  78. package/dist/exchange/v2/registry.d.ts.map +1 -0
  79. package/dist/exchange/v2/registry.js +101 -0
  80. package/dist/exchange/v2/registry.js.map +1 -0
  81. package/dist/exchange/v2/types.d.ts +413 -0
  82. package/dist/exchange/v2/types.d.ts.map +1 -0
  83. package/dist/exchange/v2/types.js +3 -0
  84. package/dist/exchange/v2/types.js.map +1 -0
  85. package/dist/index.d.ts +105 -22
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +40 -37
  88. package/dist/index.js.map +1 -1
  89. package/dist/types/financial.d.ts +14 -0
  90. package/dist/types/financial.d.ts.map +1 -0
  91. package/dist/types/financial.js +6 -0
  92. package/dist/types/financial.js.map +1 -0
  93. package/dist/vault/crypto.js +3 -3
  94. package/dist/vault/crypto.js.map +1 -1
  95. package/dist/vault/index.d.ts +28 -0
  96. package/dist/vault/index.d.ts.map +1 -1
  97. package/dist/vault/index.js +70 -0
  98. package/dist/vault/index.js.map +1 -1
  99. package/package.json +1 -1
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ /**
3
+ * Risk Guard — Pre-execution checks
4
+ * Validates every order against configurable risk limits before sending to exchange.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RiskGuard = void 0;
8
+ class RiskGuard {
9
+ limits;
10
+ dailyLoss = 0;
11
+ openOrderCount = 0;
12
+ persistence;
13
+ constructor(limits, persistence) {
14
+ this.limits = limits;
15
+ this.persistence = persistence;
16
+ // Load persisted state asynchronously
17
+ if (persistence) {
18
+ Promise.resolve(persistence.load()).then((state) => {
19
+ this.dailyLoss = state.dailyLoss;
20
+ this.openOrderCount = state.openOrders;
21
+ }).catch((err) => {
22
+ console.error('[RiskGuard] failed to load persisted state:', err);
23
+ });
24
+ }
25
+ }
26
+ _save() {
27
+ if (this.persistence) {
28
+ Promise.resolve(this.persistence.save({ dailyLoss: this.dailyLoss, openOrders: this.openOrderCount }))
29
+ .catch((err) => console.error('[RiskGuard] failed to persist state:', err));
30
+ }
31
+ }
32
+ /** Update running daily loss tracker (call on each filled order PnL) */
33
+ recordPnl(pnl) {
34
+ if (pnl < 0)
35
+ this.dailyLoss += Math.abs(pnl);
36
+ this._save();
37
+ }
38
+ recordOrderOpened() { this.openOrderCount++; this._save(); }
39
+ recordOrderClosed() { this.openOrderCount = Math.max(0, this.openOrderCount - 1); this._save(); }
40
+ resetDailyStats() {
41
+ this.dailyLoss = 0;
42
+ this._save();
43
+ }
44
+ async check(order, ticker) {
45
+ const results = [];
46
+ let worstAction = 'allow';
47
+ let adjustedRequest;
48
+ // ── 1. Symbol Whitelist / Blacklist ──────────────────────────────────
49
+ if (this.limits.allowedSymbols && this.limits.allowedSymbols.length > 0) {
50
+ const allowed = this.limits.allowedSymbols.includes(order.symbol);
51
+ if (!allowed) {
52
+ results.push({ rule: 'symbol_whitelist', action: 'block', message: `Symbol ${order.symbol} not in whitelist` });
53
+ worstAction = 'block';
54
+ }
55
+ }
56
+ if (this.limits.blockedSymbols?.includes(order.symbol)) {
57
+ results.push({ rule: 'symbol_blacklist', action: 'block', message: `Symbol ${order.symbol} is blocked` });
58
+ worstAction = 'block';
59
+ }
60
+ // ── 2. Daily Loss Limit ───────────────────────────────────────────────
61
+ if (this.limits.maxDailyLoss !== undefined && this.dailyLoss >= this.limits.maxDailyLoss) {
62
+ results.push({
63
+ rule: 'daily_loss', action: 'block',
64
+ message: `Daily loss limit reached: $${this.dailyLoss.toFixed(2)} >= $${this.limits.maxDailyLoss}`,
65
+ });
66
+ worstAction = 'block';
67
+ }
68
+ // ── 3. Max Open Orders ────────────────────────────────────────────────
69
+ if (this.limits.maxOpenOrders !== undefined && this.openOrderCount >= this.limits.maxOpenOrders) {
70
+ results.push({
71
+ rule: 'max_open_orders', action: 'block',
72
+ message: `Open order limit reached: ${this.openOrderCount} >= ${this.limits.maxOpenOrders}`,
73
+ });
74
+ worstAction = 'block';
75
+ }
76
+ // ── 4. Order Size / Notional ──────────────────────────────────────────
77
+ if (ticker && this.limits.maxOrderSize !== undefined) {
78
+ const qty = getQuantity(order);
79
+ if (qty !== null) {
80
+ const price = getPrice(order) ?? ticker.last;
81
+ const notional = qty * price;
82
+ if (notional > this.limits.maxOrderSize) {
83
+ const cappedQty = this.limits.maxOrderSize / price;
84
+ results.push({
85
+ rule: 'max_order_size', action: 'reduce',
86
+ message: `Order notional $${notional.toFixed(2)} > limit $${this.limits.maxOrderSize}`,
87
+ adjustedQuantity: cappedQty,
88
+ });
89
+ if (worstAction === 'allow')
90
+ worstAction = 'reduce';
91
+ // Build adjusted request
92
+ adjustedRequest = adjustQty(order, cappedQty);
93
+ }
94
+ }
95
+ }
96
+ // ── 5. Max Leverage ───────────────────────────────────────────────────
97
+ if (this.limits.maxLeverage !== undefined && order.leverage !== undefined) {
98
+ if (order.leverage > this.limits.maxLeverage) {
99
+ results.push({
100
+ rule: 'max_leverage', action: 'block',
101
+ message: `Leverage ${order.leverage}x exceeds limit ${this.limits.maxLeverage}x`,
102
+ });
103
+ worstAction = 'block';
104
+ }
105
+ }
106
+ // ── 6. Slippage Guard (market orders) ─────────────────────────────────
107
+ if (this.limits.maxSlippage !== undefined && order.type === 'market' && ticker) {
108
+ const mid = (ticker.bid + ticker.ask) / 2;
109
+ const spread = Math.abs(ticker.ask - ticker.bid) / mid * 100;
110
+ if (spread > this.limits.maxSlippage) {
111
+ results.push({
112
+ rule: 'slippage_guard', action: 'block',
113
+ message: `Spread ${spread.toFixed(3)}% > slippage limit ${this.limits.maxSlippage}%`,
114
+ });
115
+ worstAction = 'block';
116
+ }
117
+ }
118
+ const passed = worstAction !== 'block';
119
+ return {
120
+ passed,
121
+ action: worstAction,
122
+ results,
123
+ adjustedRequest: adjustedRequest ?? (worstAction === 'reduce' ? undefined : undefined),
124
+ };
125
+ }
126
+ }
127
+ exports.RiskGuard = RiskGuard;
128
+ // ─── Helpers ──────────────────────────────────────────────────────────────
129
+ function getQuantity(order) {
130
+ if ('quantity' in order)
131
+ return order.quantity ?? null;
132
+ return null;
133
+ }
134
+ function getPrice(order) {
135
+ if ('price' in order)
136
+ return order.price ?? null;
137
+ if ('entryPrice' in order)
138
+ return order.entryPrice ?? null;
139
+ return null;
140
+ }
141
+ function adjustQty(order, newQty) {
142
+ return { ...order, quantity: newQty };
143
+ }
144
+ //# sourceMappingURL=risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.js","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/risk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Order State Manager
3
+ * Tracks every order through its lifecycle with a complete transition log.
4
+ * In-memory by default; can be extended to persist to D1/KV.
5
+ */
6
+ import type { OrderStatus, OrderEvent, TrackedOrder, OrderRequest, OrderResponse, ExchangeId } from '../types';
7
+ export declare function applyTransition(current: OrderStatus, event: OrderEvent): OrderStatus | null;
8
+ export declare class OrderStateManager {
9
+ private orders;
10
+ private clientIdMap;
11
+ register(clientOrderId: string, exchange: ExchangeId, request: OrderRequest): TrackedOrder;
12
+ bind(clientOrderId: string, orderId: string): TrackedOrder | null;
13
+ transition(id: string, event: OrderEvent, detail?: string): TrackedOrder | null;
14
+ applyResponse(id: string, response: OrderResponse): TrackedOrder | null;
15
+ markError(id: string, error: string): TrackedOrder | null;
16
+ incrementRetry(id: string): number;
17
+ bindParentChild(parentId: string, childIds: string[]): void;
18
+ get(id: string): TrackedOrder | undefined;
19
+ getByClientId(clientOrderId: string): TrackedOrder | undefined;
20
+ list(filter?: {
21
+ status?: OrderStatus;
22
+ exchange?: ExchangeId;
23
+ }): TrackedOrder[];
24
+ remove(id: string): void;
25
+ /** Purge terminal orders older than maxAgeMs */
26
+ purge(maxAgeMs?: number): number;
27
+ size(): number;
28
+ }
29
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,WAAW,EACX,UAAU,EAEV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EACV,MAAM,UAAU,CAAC;AAgBlB,wBAAgB,eAAe,CAC9B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,UAAU,GACf,WAAW,GAAG,IAAI,CAEpB;AAID,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,WAAW,CAAkC;IAErD,QAAQ,CACP,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,YAAY,GACnB,YAAY;IAoBf,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAUjE,UAAU,CACT,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,MAAM,GACb,YAAY,GAAG,IAAI;IAqBtB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI;IAqBvE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAQzD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAQlC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAe3D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIzC,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAK9D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,YAAY,EAAE;IAU9E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMxB,gDAAgD;IAChD,KAAK,CAAC,QAAQ,GAAE,MAA4B,GAAG,MAAM;IAcrD,IAAI,IAAI,MAAM;CACd"}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ /**
3
+ * Order State Manager
4
+ * Tracks every order through its lifecycle with a complete transition log.
5
+ * In-memory by default; can be extended to persist to D1/KV.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OrderStateManager = void 0;
9
+ exports.applyTransition = applyTransition;
10
+ // ─── State Machine ────────────────────────────────────────────────────────
11
+ /** Legal state transitions */
12
+ const TRANSITIONS = {
13
+ pending: { submit: 'pending', ack: 'open', reject: 'rejected', error: 'failed' },
14
+ open: { partial_fill: 'partially_filled', fill: 'filled', cancel_request: 'open', cancelled: 'cancelled', reject: 'rejected', expire: 'expired', error: 'failed' },
15
+ partially_filled: { partial_fill: 'partially_filled', fill: 'filled', cancel_request: 'partially_filled', cancelled: 'cancelled', error: 'failed' },
16
+ filled: {},
17
+ cancelled: {},
18
+ rejected: {},
19
+ expired: {},
20
+ failed: { submit: 'pending' }, // allow retry
21
+ };
22
+ function applyTransition(current, event) {
23
+ return TRANSITIONS[current]?.[event] ?? null;
24
+ }
25
+ // ─── In-Memory Store ──────────────────────────────────────────────────────
26
+ class OrderStateManager {
27
+ orders = new Map();
28
+ clientIdMap = new Map(); // clientOrderId → orderId
29
+ register(clientOrderId, exchange, request) {
30
+ const order = {
31
+ orderId: '',
32
+ clientOrderId,
33
+ runId: request.runId,
34
+ exchange,
35
+ request,
36
+ status: 'pending',
37
+ transitions: [],
38
+ retryCount: 0,
39
+ createdAt: Date.now(),
40
+ updatedAt: Date.now(),
41
+ parentOrderId: undefined,
42
+ childOrderIds: undefined,
43
+ };
44
+ this.orders.set(clientOrderId, order);
45
+ this.clientIdMap.set(clientOrderId, clientOrderId);
46
+ return order;
47
+ }
48
+ bind(clientOrderId, orderId) {
49
+ const order = this.orders.get(clientOrderId);
50
+ if (!order)
51
+ return null;
52
+ order.orderId = orderId;
53
+ this.orders.delete(clientOrderId);
54
+ this.orders.set(orderId, order);
55
+ this.clientIdMap.set(clientOrderId, orderId);
56
+ return order;
57
+ }
58
+ transition(id, event, detail) {
59
+ const order = this.get(id);
60
+ if (!order)
61
+ return null;
62
+ const next = applyTransition(order.status, event);
63
+ if (!next) {
64
+ // Illegal transition — log and ignore
65
+ console.warn(`[OrderState] Illegal transition: ${order.status} + ${event} (order ${id})`);
66
+ return order;
67
+ }
68
+ const t = {
69
+ from: order.status, event, to: next,
70
+ timestamp: Date.now(), detail,
71
+ };
72
+ order.transitions.push(t);
73
+ order.status = next;
74
+ order.updatedAt = Date.now();
75
+ return order;
76
+ }
77
+ applyResponse(id, response) {
78
+ const order = this.get(id);
79
+ if (!order)
80
+ return null;
81
+ order.response = response;
82
+ order.updatedAt = Date.now();
83
+ // Map response status to event
84
+ const eventMap = {
85
+ open: 'ack', pending: 'submit',
86
+ partially_filled: 'partial_fill',
87
+ filled: 'fill',
88
+ cancelled: 'cancelled',
89
+ rejected: 'reject',
90
+ expired: 'expire',
91
+ failed: 'error',
92
+ };
93
+ const event = eventMap[response.status];
94
+ if (event)
95
+ this.transition(id, event);
96
+ return order;
97
+ }
98
+ markError(id, error) {
99
+ const order = this.get(id);
100
+ if (!order)
101
+ return null;
102
+ order.error = error;
103
+ this.transition(id, 'error', error);
104
+ return order;
105
+ }
106
+ incrementRetry(id) {
107
+ const order = this.get(id);
108
+ if (!order)
109
+ return 0;
110
+ order.retryCount++;
111
+ order.updatedAt = Date.now();
112
+ return order.retryCount;
113
+ }
114
+ bindParentChild(parentId, childIds) {
115
+ const parent = this.get(parentId);
116
+ if (parent) {
117
+ parent.childOrderIds = [...(parent.childOrderIds ?? []), ...childIds];
118
+ parent.updatedAt = Date.now();
119
+ }
120
+ for (const childId of childIds) {
121
+ const child = this.get(childId);
122
+ if (child) {
123
+ child.parentOrderId = parentId;
124
+ child.updatedAt = Date.now();
125
+ }
126
+ }
127
+ }
128
+ get(id) {
129
+ return this.orders.get(id) ?? this.orders.get(this.clientIdMap.get(id) ?? '');
130
+ }
131
+ getByClientId(clientOrderId) {
132
+ const realId = this.clientIdMap.get(clientOrderId);
133
+ return realId ? this.orders.get(realId) : undefined;
134
+ }
135
+ list(filter) {
136
+ const all = Array.from(this.orders.values());
137
+ if (!filter)
138
+ return all;
139
+ return all.filter(o => {
140
+ if (filter.status && o.status !== filter.status)
141
+ return false;
142
+ if (filter.exchange && o.exchange !== filter.exchange)
143
+ return false;
144
+ return true;
145
+ });
146
+ }
147
+ remove(id) {
148
+ const order = this.get(id);
149
+ if (order?.clientOrderId)
150
+ this.clientIdMap.delete(order.clientOrderId);
151
+ this.orders.delete(id);
152
+ }
153
+ /** Purge terminal orders older than maxAgeMs */
154
+ purge(maxAgeMs = 24 * 60 * 60 * 1000) {
155
+ const terminal = ['filled', 'cancelled', 'rejected', 'expired', 'failed'];
156
+ const cutoff = Date.now() - maxAgeMs;
157
+ let count = 0;
158
+ for (const [id, order] of this.orders) {
159
+ if (terminal.includes(order.status) && order.updatedAt < cutoff) {
160
+ if (order.clientOrderId)
161
+ this.clientIdMap.delete(order.clientOrderId);
162
+ this.orders.delete(id);
163
+ count++;
164
+ }
165
+ }
166
+ return count;
167
+ }
168
+ size() { return this.orders.size; }
169
+ }
170
+ exports.OrderStateManager = OrderStateManager;
171
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Institutional Order Execution Module — Public API Surface
3
+ * ============================================================
4
+ * Usage:
5
+ *
6
+ * import { createEngine, ExchangeRegistry } from './exchange/v2';
7
+ *
8
+ * // Single exchange
9
+ * const engine = createEngine({
10
+ * exchange: 'okx',
11
+ * credentials: { apiKey: '...', apiSecret: '...', passphrase: '...' },
12
+ * }, {
13
+ * riskLimits: { maxOrderSize: 10_000, maxDailyLoss: 500 },
14
+ * onOrderUpdate: (order) => console.log('Order update:', order.orderId, order.status),
15
+ * });
16
+ *
17
+ * // Place a limit order
18
+ * const tracked = await engine.submitOrder({
19
+ * symbol: 'BTC-USDT', side: 'buy', type: 'limit',
20
+ * quantity: 0.01, price: 65000, timeInForce: 'GTC',
21
+ * });
22
+ *
23
+ * // Place TWAP
24
+ * const result = await engine.executeTWAP({
25
+ * symbol: 'ETH-USDT', side: 'buy',
26
+ * totalQuantity: 1.0, durationMs: 60_000, intervals: 6,
27
+ * });
28
+ *
29
+ * // Multi-exchange arbitrage
30
+ * const registry = new ExchangeRegistry();
31
+ * registry.add('okx', { exchange: 'okx', credentials: okxCreds });
32
+ * registry.add('binance', { exchange: 'binance', credentials: bnbCreds });
33
+ * const { bestBid, bestAsk } = await registry.bestBidAsk('BTCUSDT');
34
+ */
35
+ export type { ExchangeId, MarketType, OrderSide, PositionSide, OrderType, TimeInForce, OrderStatus, MarginMode, ExchangeCredentials, TickerInfo, SymbolInfo, OHLCVBar, OrderBook, FundingInfo, AssetBalance, AccountSnapshot, PositionInfo, BaseOrderRequest, MarketOrderRequest, LimitOrderRequest, StopOrderRequest, TrailingStopRequest, BracketOrderRequest, OCOOrderRequest, OrderRequest, OrderResponse, RawOrderParams, TwapParams, VwapParams, IcebergParams, AlgoSlice, AlgoOrderResult, RiskAction, RiskRuleResult, RiskCheckResult, RiskLimits, OrderEvent, OrderStateTransition, TrackedOrder, EngineConfig, RetryPolicy, } from './types';
36
+ export type { IExchangeAdapter } from './adapters/base';
37
+ export { BaseExchangeAdapter, ExchangeError, InsufficientFundsError, RateLimitError, InvalidSymbolError, OrderNotFoundError, hmacSha256Hex, hmacSha256Base64, buildQueryString, buildQueryStringOrdered, genClientOrderId, roundToStep, roundToTick, TIMEFRAME_MS, } from './adapters/base';
38
+ export { OKXAdapter } from './adapters/okx';
39
+ export { BinanceAdapter } from './adapters/binance';
40
+ export { BitgetAdapter } from './adapters/bitget';
41
+ export { HyperliquidAdapter } from './adapters/hyperliquid';
42
+ export type { HyperliquidSignerFn } from './adapters/hyperliquid';
43
+ export { TWAPExecutor, VWAPExecutor, IcebergExecutor, BracketOrchestrator, TrailingStopMonitor, } from './algorithms/index';
44
+ export type { TrailingStopState, BracketResult } from './algorithms/index';
45
+ export { OrderEngine } from './executor/core';
46
+ export { RiskGuard } from './executor/risk';
47
+ export { OrderStateManager, applyTransition } from './executor/state';
48
+ export { createAdapter, createEngine, ExchangeRegistry, } from './registry';
49
+ export type { AdapterOptions } from './registry';
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/exchange/v2/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,YAAY,EAEX,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EACvE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAE5C,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAExD,YAAY,EAAE,eAAe,EAAE,YAAY,EAE3C,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EACzE,mBAAmB,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EACvE,aAAa,EAAE,cAAc,EAE7B,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAEjE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAEvD,UAAU,EAAE,oBAAoB,EAAE,YAAY,EAE9C,YAAY,EAAE,WAAW,GACzB,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACN,mBAAmB,EACnB,aAAa,EAAE,sBAAsB,EAAE,cAAc,EACrD,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,gBAAgB,EAC/B,gBAAgB,EAAE,uBAAuB,EACzC,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,GACxD,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGlE,OAAO,EACN,YAAY,EAAE,YAAY,EAAE,eAAe,EAC3C,mBAAmB,EAAE,mBAAmB,GACxC,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EACN,aAAa,EAAE,YAAY,EAC3B,gBAAgB,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ /**
3
+ * Institutional Order Execution Module — Public API Surface
4
+ * ============================================================
5
+ * Usage:
6
+ *
7
+ * import { createEngine, ExchangeRegistry } from './exchange/v2';
8
+ *
9
+ * // Single exchange
10
+ * const engine = createEngine({
11
+ * exchange: 'okx',
12
+ * credentials: { apiKey: '...', apiSecret: '...', passphrase: '...' },
13
+ * }, {
14
+ * riskLimits: { maxOrderSize: 10_000, maxDailyLoss: 500 },
15
+ * onOrderUpdate: (order) => console.log('Order update:', order.orderId, order.status),
16
+ * });
17
+ *
18
+ * // Place a limit order
19
+ * const tracked = await engine.submitOrder({
20
+ * symbol: 'BTC-USDT', side: 'buy', type: 'limit',
21
+ * quantity: 0.01, price: 65000, timeInForce: 'GTC',
22
+ * });
23
+ *
24
+ * // Place TWAP
25
+ * const result = await engine.executeTWAP({
26
+ * symbol: 'ETH-USDT', side: 'buy',
27
+ * totalQuantity: 1.0, durationMs: 60_000, intervals: 6,
28
+ * });
29
+ *
30
+ * // Multi-exchange arbitrage
31
+ * const registry = new ExchangeRegistry();
32
+ * registry.add('okx', { exchange: 'okx', credentials: okxCreds });
33
+ * registry.add('binance', { exchange: 'binance', credentials: bnbCreds });
34
+ * const { bestBid, bestAsk } = await registry.bestBidAsk('BTCUSDT');
35
+ */
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ExchangeRegistry = exports.createEngine = exports.createAdapter = exports.applyTransition = exports.OrderStateManager = exports.RiskGuard = exports.OrderEngine = exports.TrailingStopMonitor = exports.BracketOrchestrator = exports.IcebergExecutor = exports.VWAPExecutor = exports.TWAPExecutor = exports.HyperliquidAdapter = exports.BitgetAdapter = exports.BinanceAdapter = exports.OKXAdapter = exports.TIMEFRAME_MS = exports.roundToTick = exports.roundToStep = exports.genClientOrderId = exports.buildQueryStringOrdered = exports.buildQueryString = exports.hmacSha256Base64 = exports.hmacSha256Hex = exports.OrderNotFoundError = exports.InvalidSymbolError = exports.RateLimitError = exports.InsufficientFundsError = exports.ExchangeError = exports.BaseExchangeAdapter = void 0;
38
+ var base_1 = require("./adapters/base");
39
+ Object.defineProperty(exports, "BaseExchangeAdapter", { enumerable: true, get: function () { return base_1.BaseExchangeAdapter; } });
40
+ Object.defineProperty(exports, "ExchangeError", { enumerable: true, get: function () { return base_1.ExchangeError; } });
41
+ Object.defineProperty(exports, "InsufficientFundsError", { enumerable: true, get: function () { return base_1.InsufficientFundsError; } });
42
+ Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return base_1.RateLimitError; } });
43
+ Object.defineProperty(exports, "InvalidSymbolError", { enumerable: true, get: function () { return base_1.InvalidSymbolError; } });
44
+ Object.defineProperty(exports, "OrderNotFoundError", { enumerable: true, get: function () { return base_1.OrderNotFoundError; } });
45
+ Object.defineProperty(exports, "hmacSha256Hex", { enumerable: true, get: function () { return base_1.hmacSha256Hex; } });
46
+ Object.defineProperty(exports, "hmacSha256Base64", { enumerable: true, get: function () { return base_1.hmacSha256Base64; } });
47
+ Object.defineProperty(exports, "buildQueryString", { enumerable: true, get: function () { return base_1.buildQueryString; } });
48
+ Object.defineProperty(exports, "buildQueryStringOrdered", { enumerable: true, get: function () { return base_1.buildQueryStringOrdered; } });
49
+ Object.defineProperty(exports, "genClientOrderId", { enumerable: true, get: function () { return base_1.genClientOrderId; } });
50
+ Object.defineProperty(exports, "roundToStep", { enumerable: true, get: function () { return base_1.roundToStep; } });
51
+ Object.defineProperty(exports, "roundToTick", { enumerable: true, get: function () { return base_1.roundToTick; } });
52
+ Object.defineProperty(exports, "TIMEFRAME_MS", { enumerable: true, get: function () { return base_1.TIMEFRAME_MS; } });
53
+ // ─── Adapters ─────────────────────────────────────────────────────────────
54
+ var okx_1 = require("./adapters/okx");
55
+ Object.defineProperty(exports, "OKXAdapter", { enumerable: true, get: function () { return okx_1.OKXAdapter; } });
56
+ var binance_1 = require("./adapters/binance");
57
+ Object.defineProperty(exports, "BinanceAdapter", { enumerable: true, get: function () { return binance_1.BinanceAdapter; } });
58
+ var bitget_1 = require("./adapters/bitget");
59
+ Object.defineProperty(exports, "BitgetAdapter", { enumerable: true, get: function () { return bitget_1.BitgetAdapter; } });
60
+ var hyperliquid_1 = require("./adapters/hyperliquid");
61
+ Object.defineProperty(exports, "HyperliquidAdapter", { enumerable: true, get: function () { return hyperliquid_1.HyperliquidAdapter; } });
62
+ // ─── Algorithms ───────────────────────────────────────────────────────────
63
+ var index_1 = require("./algorithms/index");
64
+ Object.defineProperty(exports, "TWAPExecutor", { enumerable: true, get: function () { return index_1.TWAPExecutor; } });
65
+ Object.defineProperty(exports, "VWAPExecutor", { enumerable: true, get: function () { return index_1.VWAPExecutor; } });
66
+ Object.defineProperty(exports, "IcebergExecutor", { enumerable: true, get: function () { return index_1.IcebergExecutor; } });
67
+ Object.defineProperty(exports, "BracketOrchestrator", { enumerable: true, get: function () { return index_1.BracketOrchestrator; } });
68
+ Object.defineProperty(exports, "TrailingStopMonitor", { enumerable: true, get: function () { return index_1.TrailingStopMonitor; } });
69
+ // ─── Executor ────────────────────────────────────────────────────────────
70
+ var core_1 = require("./executor/core");
71
+ Object.defineProperty(exports, "OrderEngine", { enumerable: true, get: function () { return core_1.OrderEngine; } });
72
+ var risk_1 = require("./executor/risk");
73
+ Object.defineProperty(exports, "RiskGuard", { enumerable: true, get: function () { return risk_1.RiskGuard; } });
74
+ var state_1 = require("./executor/state");
75
+ Object.defineProperty(exports, "OrderStateManager", { enumerable: true, get: function () { return state_1.OrderStateManager; } });
76
+ Object.defineProperty(exports, "applyTransition", { enumerable: true, get: function () { return state_1.applyTransition; } });
77
+ // ─── Registry / Factory ──────────────────────────────────────────────────
78
+ var registry_1 = require("./registry");
79
+ Object.defineProperty(exports, "createAdapter", { enumerable: true, get: function () { return registry_1.createAdapter; } });
80
+ Object.defineProperty(exports, "createEngine", { enumerable: true, get: function () { return registry_1.createEngine; } });
81
+ Object.defineProperty(exports, "ExchangeRegistry", { enumerable: true, get: function () { return registry_1.ExchangeRegistry; } });
82
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/exchange/v2/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;;;AA2BH,wCAOyB;AANxB,2GAAA,mBAAmB,OAAA;AACnB,qGAAA,aAAa,OAAA;AAAE,8GAAA,sBAAsB,OAAA;AAAE,sGAAA,cAAc,OAAA;AACrD,0GAAA,kBAAkB,OAAA;AAAE,0GAAA,kBAAkB,OAAA;AACtC,qGAAA,aAAa,OAAA;AAAE,wGAAA,gBAAgB,OAAA;AAC/B,wGAAA,gBAAgB,OAAA;AAAE,+GAAA,uBAAuB,OAAA;AACzC,wGAAA,gBAAgB,OAAA;AAAE,mGAAA,WAAW,OAAA;AAAE,mGAAA,WAAW,OAAA;AAAE,oGAAA,YAAY,OAAA;AAGzD,6EAA6E;AAC7E,sCAA4C;AAAnC,iGAAA,UAAU,OAAA;AACnB,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AACvB,4CAAkD;AAAzC,uGAAA,aAAa,OAAA;AACtB,sDAA4D;AAAnD,iHAAA,kBAAkB,OAAA;AAG3B,6EAA6E;AAC7E,4CAG4B;AAF3B,qGAAA,YAAY,OAAA;AAAE,qGAAA,YAAY,OAAA;AAAE,wGAAA,eAAe,OAAA;AAC3C,4GAAA,mBAAmB,OAAA;AAAE,4GAAA,mBAAmB,OAAA;AAIzC,4EAA4E;AAC5E,wCAA8C;AAArC,mGAAA,WAAW,OAAA;AACpB,wCAA4C;AAAnC,iGAAA,SAAS,OAAA;AAClB,0CAAsE;AAA7D,0GAAA,iBAAiB,OAAA;AAAE,wGAAA,eAAe,OAAA;AAE3C,4EAA4E;AAC5E,uCAGoB;AAFnB,yGAAA,aAAa,OAAA;AAAE,wGAAA,YAAY,OAAA;AAC3B,4GAAA,gBAAgB,OAAA"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Adapter Registry / Factory
3
+ * Creates exchange adapters and fully-configured OrderEngines.
4
+ */
5
+ import { type HyperliquidSignerFn } from './adapters/hyperliquid';
6
+ import { OrderEngine } from './executor/core';
7
+ import type { IExchangeAdapter } from './adapters/base';
8
+ import type { ExchangeId, ExchangeCredentials, EngineConfig } from './types';
9
+ import type { Price } from '../../types/financial';
10
+ export interface AdapterOptions {
11
+ exchange: ExchangeId;
12
+ credentials: ExchangeCredentials;
13
+ /** Required for Hyperliquid — inject your EIP-712 signer */
14
+ hyperliquidSignerFn?: HyperliquidSignerFn;
15
+ }
16
+ export declare function createAdapter(options: AdapterOptions): IExchangeAdapter;
17
+ export declare function createEngine(adapterOptions: AdapterOptions, engineConfig?: Partial<Omit<EngineConfig, 'exchange' | 'credentials'>>): OrderEngine;
18
+ /**
19
+ * Manages multiple exchange engines in one registry.
20
+ * Useful for cross-exchange strategies and arbitrage.
21
+ */
22
+ export declare class ExchangeRegistry {
23
+ private engines;
24
+ /** Add or replace an engine by key (e.g. 'okx_main', 'binance_futures') */
25
+ add(key: string, options: AdapterOptions, engineConfig?: Partial<Omit<EngineConfig, 'exchange' | 'credentials'>>): OrderEngine;
26
+ get(key: string): OrderEngine;
27
+ has(key: string): boolean;
28
+ keys(): string[];
29
+ remove(key: string): void;
30
+ /**
31
+ * Fetch the same ticker from all registered engines in parallel.
32
+ * Useful for finding the best bid/ask across exchanges.
33
+ */
34
+ fetchTickers(symbol: string): Promise<Map<string, import('./types').TickerInfo>>;
35
+ /**
36
+ * Find the best bid (sell into) and ask (buy from) across all registered exchanges.
37
+ * Returns: { bestBid: { key, price }, bestAsk: { key, price } }
38
+ */
39
+ bestBidAsk(symbol: string): Promise<{
40
+ bestBid: {
41
+ key: string;
42
+ price: Price;
43
+ } | null;
44
+ bestAsk: {
45
+ key: string;
46
+ price: Price;
47
+ } | null;
48
+ }>;
49
+ }
50
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/exchange/v2/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAInD,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,UAAU,CAAC;IACrB,WAAW,EAAE,mBAAmB,CAAC;IACjC,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC1C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,gBAAgB,CAcvE;AAID,wBAAgB,YAAY,CAC3B,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,aAAa,CAAC,CAAC,GACpE,WAAW,CAQb;AAID;;;GAGG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,OAAO,CAAuC;IAEtD,2EAA2E;IAC3E,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,aAAa,CAAC,CAAC,GAAG,WAAW;IAM9H,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAM7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,IAAI,IAAI,MAAM,EAAE;IAIhB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,SAAS,EAAE,UAAU,CAAC,CAAC;IAatF;;;OAGG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QACzC,OAAO,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,KAAK,CAAA;SAAE,GAAG,IAAI,CAAC;QAC9C,OAAO,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,KAAK,CAAA;SAAE,GAAG,IAAI,CAAC;KAC9C,CAAC;CAWF"}