@luxfi/dex 1.2.1
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.
- package/dist/index.d.ts +116 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +225 -0
- package/dist/marketData.d.ts +152 -0
- package/dist/marketData.d.ts.map +1 -0
- package/dist/marketData.js +253 -0
- package/package.json +41 -0
- package/src/index.ts +309 -0
- package/src/marketData.ts +351 -0
- package/tsconfig.json +19 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { MarketDataClient, LiquidationMonitor } from './marketData';
|
|
2
|
+
export declare enum OrderType {
|
|
3
|
+
LIMIT = 0,
|
|
4
|
+
MARKET = 1,
|
|
5
|
+
STOP = 2,
|
|
6
|
+
STOP_LIMIT = 3,
|
|
7
|
+
ICEBERG = 4,
|
|
8
|
+
PEG = 5
|
|
9
|
+
}
|
|
10
|
+
export declare enum OrderSide {
|
|
11
|
+
BUY = 0,
|
|
12
|
+
SELL = 1
|
|
13
|
+
}
|
|
14
|
+
export declare enum OrderStatus {
|
|
15
|
+
OPEN = "open",
|
|
16
|
+
PARTIAL = "partial",
|
|
17
|
+
FILLED = "filled",
|
|
18
|
+
CANCELLED = "cancelled",
|
|
19
|
+
REJECTED = "rejected"
|
|
20
|
+
}
|
|
21
|
+
export declare enum TimeInForce {
|
|
22
|
+
GTC = "GTC",
|
|
23
|
+
IOC = "IOC",
|
|
24
|
+
FOK = "FOK",
|
|
25
|
+
DAY = "DAY"
|
|
26
|
+
}
|
|
27
|
+
export interface Order {
|
|
28
|
+
orderId?: number;
|
|
29
|
+
symbol: string;
|
|
30
|
+
type: OrderType;
|
|
31
|
+
side: OrderSide;
|
|
32
|
+
price: number;
|
|
33
|
+
size: number;
|
|
34
|
+
userID?: string;
|
|
35
|
+
clientID?: string;
|
|
36
|
+
timeInForce?: TimeInForce;
|
|
37
|
+
postOnly?: boolean;
|
|
38
|
+
reduceOnly?: boolean;
|
|
39
|
+
status?: OrderStatus;
|
|
40
|
+
filled?: number;
|
|
41
|
+
remaining?: number;
|
|
42
|
+
timestamp?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface Trade {
|
|
45
|
+
tradeId: number;
|
|
46
|
+
symbol: string;
|
|
47
|
+
price: number;
|
|
48
|
+
size: number;
|
|
49
|
+
side: OrderSide;
|
|
50
|
+
buyOrderId: number;
|
|
51
|
+
sellOrderId: number;
|
|
52
|
+
buyerId: string;
|
|
53
|
+
sellerId: string;
|
|
54
|
+
timestamp: number;
|
|
55
|
+
}
|
|
56
|
+
export interface OrderBookLevel {
|
|
57
|
+
price: number;
|
|
58
|
+
size: number;
|
|
59
|
+
count?: number;
|
|
60
|
+
}
|
|
61
|
+
export interface OrderBook {
|
|
62
|
+
symbol: string;
|
|
63
|
+
bids: OrderBookLevel[];
|
|
64
|
+
asks: OrderBookLevel[];
|
|
65
|
+
timestamp: number;
|
|
66
|
+
}
|
|
67
|
+
export interface NodeInfo {
|
|
68
|
+
version: string;
|
|
69
|
+
network: string;
|
|
70
|
+
orderCount: number;
|
|
71
|
+
tradeCount: number;
|
|
72
|
+
timestamp: number;
|
|
73
|
+
}
|
|
74
|
+
export interface LXDexConfig {
|
|
75
|
+
jsonRpcUrl?: string;
|
|
76
|
+
wsUrl?: string;
|
|
77
|
+
grpcUrl?: string;
|
|
78
|
+
apiKey?: string;
|
|
79
|
+
}
|
|
80
|
+
export declare class LXDexClient {
|
|
81
|
+
private jsonRpc;
|
|
82
|
+
private ws;
|
|
83
|
+
private wsCallbacks;
|
|
84
|
+
private config;
|
|
85
|
+
marketData: MarketDataClient;
|
|
86
|
+
liquidationMonitor: LiquidationMonitor;
|
|
87
|
+
constructor(config?: LXDexConfig);
|
|
88
|
+
connect(): Promise<void>;
|
|
89
|
+
disconnect(): void;
|
|
90
|
+
placeOrder(order: Partial<Order>): Promise<{
|
|
91
|
+
orderId: number;
|
|
92
|
+
status: string;
|
|
93
|
+
}>;
|
|
94
|
+
cancelOrder(orderId: number): Promise<{
|
|
95
|
+
success: boolean;
|
|
96
|
+
message: string;
|
|
97
|
+
}>;
|
|
98
|
+
getOrder(orderId: number): Promise<Order>;
|
|
99
|
+
getOrderBook(symbol?: string, depth?: number): Promise<OrderBook>;
|
|
100
|
+
getBestBid(symbol?: string): Promise<number>;
|
|
101
|
+
getBestAsk(symbol?: string): Promise<number>;
|
|
102
|
+
getTrades(symbol?: string, limit?: number): Promise<Trade[]>;
|
|
103
|
+
getInfo(): Promise<NodeInfo>;
|
|
104
|
+
ping(): Promise<string>;
|
|
105
|
+
subscribe(channel: string, callback: Function): void;
|
|
106
|
+
unsubscribe(channel: string, callback?: Function): void;
|
|
107
|
+
subscribeOrderBook(symbol: string, callback: (book: OrderBook) => void): void;
|
|
108
|
+
subscribeTrades(symbol: string, callback: (trade: Trade) => void): void;
|
|
109
|
+
private handleWebSocketMessage;
|
|
110
|
+
static formatPrice(price: number, decimals?: number): string;
|
|
111
|
+
static formatSize(size: number, decimals?: number): string;
|
|
112
|
+
static calculateTotal(price: number, size: number): number;
|
|
113
|
+
}
|
|
114
|
+
export default LXDexClient;
|
|
115
|
+
export * from './marketData';
|
|
116
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.LXDexClient = exports.TimeInForce = exports.OrderStatus = exports.OrderSide = exports.OrderType = void 0;
|
|
21
|
+
const axios_1 = __importDefault(require("axios"));
|
|
22
|
+
const ws_1 = __importDefault(require("ws"));
|
|
23
|
+
const marketData_1 = require("./marketData");
|
|
24
|
+
// Types
|
|
25
|
+
var OrderType;
|
|
26
|
+
(function (OrderType) {
|
|
27
|
+
OrderType[OrderType["LIMIT"] = 0] = "LIMIT";
|
|
28
|
+
OrderType[OrderType["MARKET"] = 1] = "MARKET";
|
|
29
|
+
OrderType[OrderType["STOP"] = 2] = "STOP";
|
|
30
|
+
OrderType[OrderType["STOP_LIMIT"] = 3] = "STOP_LIMIT";
|
|
31
|
+
OrderType[OrderType["ICEBERG"] = 4] = "ICEBERG";
|
|
32
|
+
OrderType[OrderType["PEG"] = 5] = "PEG";
|
|
33
|
+
})(OrderType || (exports.OrderType = OrderType = {}));
|
|
34
|
+
var OrderSide;
|
|
35
|
+
(function (OrderSide) {
|
|
36
|
+
OrderSide[OrderSide["BUY"] = 0] = "BUY";
|
|
37
|
+
OrderSide[OrderSide["SELL"] = 1] = "SELL";
|
|
38
|
+
})(OrderSide || (exports.OrderSide = OrderSide = {}));
|
|
39
|
+
var OrderStatus;
|
|
40
|
+
(function (OrderStatus) {
|
|
41
|
+
OrderStatus["OPEN"] = "open";
|
|
42
|
+
OrderStatus["PARTIAL"] = "partial";
|
|
43
|
+
OrderStatus["FILLED"] = "filled";
|
|
44
|
+
OrderStatus["CANCELLED"] = "cancelled";
|
|
45
|
+
OrderStatus["REJECTED"] = "rejected";
|
|
46
|
+
})(OrderStatus || (exports.OrderStatus = OrderStatus = {}));
|
|
47
|
+
var TimeInForce;
|
|
48
|
+
(function (TimeInForce) {
|
|
49
|
+
TimeInForce["GTC"] = "GTC";
|
|
50
|
+
TimeInForce["IOC"] = "IOC";
|
|
51
|
+
TimeInForce["FOK"] = "FOK";
|
|
52
|
+
TimeInForce["DAY"] = "DAY";
|
|
53
|
+
})(TimeInForce || (exports.TimeInForce = TimeInForce = {}));
|
|
54
|
+
// JSON-RPC Client
|
|
55
|
+
class JSONRPCClient {
|
|
56
|
+
constructor(baseURL) {
|
|
57
|
+
this.idCounter = 1;
|
|
58
|
+
this.axios = axios_1.default.create({
|
|
59
|
+
baseURL,
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'application/json'
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async call(method, params = {}) {
|
|
66
|
+
const response = await this.axios.post('/rpc', {
|
|
67
|
+
jsonrpc: '2.0',
|
|
68
|
+
method,
|
|
69
|
+
params,
|
|
70
|
+
id: this.idCounter++
|
|
71
|
+
});
|
|
72
|
+
if (response.data.error) {
|
|
73
|
+
throw new Error(response.data.error.message);
|
|
74
|
+
}
|
|
75
|
+
return response.data.result;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Main SDK Client
|
|
79
|
+
class LXDexClient {
|
|
80
|
+
constructor(config = {}) {
|
|
81
|
+
this.ws = null;
|
|
82
|
+
this.wsCallbacks = new Map();
|
|
83
|
+
this.config = {
|
|
84
|
+
jsonRpcUrl: config.jsonRpcUrl || 'http://localhost:8080',
|
|
85
|
+
wsUrl: config.wsUrl || 'ws://localhost:8081',
|
|
86
|
+
...config
|
|
87
|
+
};
|
|
88
|
+
this.jsonRpc = new JSONRPCClient(this.config.jsonRpcUrl);
|
|
89
|
+
// Initialize sub-clients
|
|
90
|
+
this.marketData = new marketData_1.MarketDataClient(this.jsonRpc);
|
|
91
|
+
this.liquidationMonitor = new marketData_1.LiquidationMonitor(null);
|
|
92
|
+
}
|
|
93
|
+
// Connection Management
|
|
94
|
+
async connect() {
|
|
95
|
+
if (this.ws)
|
|
96
|
+
return;
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
this.ws = new ws_1.default(this.config.wsUrl);
|
|
99
|
+
this.ws.on('open', () => {
|
|
100
|
+
console.log('WebSocket connected');
|
|
101
|
+
// Set WebSocket for liquidation monitor
|
|
102
|
+
this.liquidationMonitor.setWebSocket(this.ws);
|
|
103
|
+
resolve();
|
|
104
|
+
});
|
|
105
|
+
this.ws.on('message', (data) => {
|
|
106
|
+
try {
|
|
107
|
+
const msg = JSON.parse(data);
|
|
108
|
+
this.handleWebSocketMessage(msg);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
console.error('Failed to parse WebSocket message:', err);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
this.ws.on('error', (err) => {
|
|
115
|
+
console.error('WebSocket error:', err);
|
|
116
|
+
reject(err);
|
|
117
|
+
});
|
|
118
|
+
this.ws.on('close', () => {
|
|
119
|
+
console.log('WebSocket disconnected');
|
|
120
|
+
this.ws = null;
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
disconnect() {
|
|
125
|
+
if (this.ws) {
|
|
126
|
+
this.ws.close();
|
|
127
|
+
this.ws = null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Order Management
|
|
131
|
+
async placeOrder(order) {
|
|
132
|
+
return this.jsonRpc.call('lx_placeOrder', order);
|
|
133
|
+
}
|
|
134
|
+
async cancelOrder(orderId) {
|
|
135
|
+
return this.jsonRpc.call('lx_cancelOrder', { orderId });
|
|
136
|
+
}
|
|
137
|
+
async getOrder(orderId) {
|
|
138
|
+
return this.jsonRpc.call('lx_getOrder', { orderId });
|
|
139
|
+
}
|
|
140
|
+
// Market Data
|
|
141
|
+
async getOrderBook(symbol = 'BTC-USD', depth = 10) {
|
|
142
|
+
return this.jsonRpc.call('lx_getOrderBook', { symbol, depth });
|
|
143
|
+
}
|
|
144
|
+
async getBestBid(symbol = 'BTC-USD') {
|
|
145
|
+
const result = await this.jsonRpc.call('lx_getBestBid', { symbol });
|
|
146
|
+
return result.price;
|
|
147
|
+
}
|
|
148
|
+
async getBestAsk(symbol = 'BTC-USD') {
|
|
149
|
+
const result = await this.jsonRpc.call('lx_getBestAsk', { symbol });
|
|
150
|
+
return result.price;
|
|
151
|
+
}
|
|
152
|
+
async getTrades(symbol = 'BTC-USD', limit = 100) {
|
|
153
|
+
return this.jsonRpc.call('lx_getTrades', { symbol, limit });
|
|
154
|
+
}
|
|
155
|
+
// Node Information
|
|
156
|
+
async getInfo() {
|
|
157
|
+
return this.jsonRpc.call('lx_getInfo');
|
|
158
|
+
}
|
|
159
|
+
async ping() {
|
|
160
|
+
return this.jsonRpc.call('lx_ping');
|
|
161
|
+
}
|
|
162
|
+
// WebSocket Subscriptions
|
|
163
|
+
subscribe(channel, callback) {
|
|
164
|
+
if (!this.wsCallbacks.has(channel)) {
|
|
165
|
+
this.wsCallbacks.set(channel, []);
|
|
166
|
+
}
|
|
167
|
+
this.wsCallbacks.get(channel).push(callback);
|
|
168
|
+
// Send subscription message
|
|
169
|
+
if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
|
|
170
|
+
this.ws.send(JSON.stringify({
|
|
171
|
+
type: 'subscribe',
|
|
172
|
+
channel
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
unsubscribe(channel, callback) {
|
|
177
|
+
if (callback) {
|
|
178
|
+
const callbacks = this.wsCallbacks.get(channel);
|
|
179
|
+
if (callbacks) {
|
|
180
|
+
const index = callbacks.indexOf(callback);
|
|
181
|
+
if (index > -1) {
|
|
182
|
+
callbacks.splice(index, 1);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
this.wsCallbacks.delete(channel);
|
|
188
|
+
}
|
|
189
|
+
// Send unsubscribe message
|
|
190
|
+
if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
|
|
191
|
+
this.ws.send(JSON.stringify({
|
|
192
|
+
type: 'unsubscribe',
|
|
193
|
+
channel
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
subscribeOrderBook(symbol, callback) {
|
|
198
|
+
this.subscribe(`orderbook:${symbol}`, callback);
|
|
199
|
+
}
|
|
200
|
+
subscribeTrades(symbol, callback) {
|
|
201
|
+
this.subscribe(`trades:${symbol}`, callback);
|
|
202
|
+
}
|
|
203
|
+
// Private methods
|
|
204
|
+
handleWebSocketMessage(msg) {
|
|
205
|
+
const { channel, data } = msg;
|
|
206
|
+
const callbacks = this.wsCallbacks.get(channel);
|
|
207
|
+
if (callbacks) {
|
|
208
|
+
callbacks.forEach(cb => cb(data));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Utility methods
|
|
212
|
+
static formatPrice(price, decimals = 2) {
|
|
213
|
+
return price.toFixed(decimals);
|
|
214
|
+
}
|
|
215
|
+
static formatSize(size, decimals = 8) {
|
|
216
|
+
return size.toFixed(decimals);
|
|
217
|
+
}
|
|
218
|
+
static calculateTotal(price, size) {
|
|
219
|
+
return price * size;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
exports.LXDexClient = LXDexClient;
|
|
223
|
+
// Export everything
|
|
224
|
+
exports.default = LXDexClient;
|
|
225
|
+
__exportStar(require("./marketData"), exports);
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Market data, liquidation, and settlement features for LX TypeScript SDK
|
|
3
|
+
*/
|
|
4
|
+
import WebSocket from 'ws';
|
|
5
|
+
export interface MarketDataSource {
|
|
6
|
+
name: string;
|
|
7
|
+
symbol: string;
|
|
8
|
+
price: number;
|
|
9
|
+
bid: number;
|
|
10
|
+
ask: number;
|
|
11
|
+
volume: number;
|
|
12
|
+
latencyNs: number;
|
|
13
|
+
provider: string;
|
|
14
|
+
}
|
|
15
|
+
export interface LiquidationInfo {
|
|
16
|
+
userId: string;
|
|
17
|
+
positionId: string;
|
|
18
|
+
symbol: string;
|
|
19
|
+
size: number;
|
|
20
|
+
liquidationPrice: number;
|
|
21
|
+
markPrice: number;
|
|
22
|
+
status: string;
|
|
23
|
+
timestamp: Date;
|
|
24
|
+
}
|
|
25
|
+
export interface SettlementBatch {
|
|
26
|
+
batchId: number;
|
|
27
|
+
orderIds: number[];
|
|
28
|
+
status: string;
|
|
29
|
+
txHash?: string;
|
|
30
|
+
gasUsed?: number;
|
|
31
|
+
timestamp: Date;
|
|
32
|
+
}
|
|
33
|
+
export interface MarginInfo {
|
|
34
|
+
userId: string;
|
|
35
|
+
initialMargin: number;
|
|
36
|
+
maintenanceMargin: number;
|
|
37
|
+
marginRatio: number;
|
|
38
|
+
freeMargin: number;
|
|
39
|
+
marginLevel: number;
|
|
40
|
+
}
|
|
41
|
+
export interface InsuranceFundStatus {
|
|
42
|
+
totalFund: number;
|
|
43
|
+
availableFund: number;
|
|
44
|
+
usedFund: number;
|
|
45
|
+
pendingClaims: number;
|
|
46
|
+
lastUpdate: Date;
|
|
47
|
+
}
|
|
48
|
+
export interface MarketStats {
|
|
49
|
+
symbol: string;
|
|
50
|
+
volume24h: number;
|
|
51
|
+
high24h: number;
|
|
52
|
+
low24h: number;
|
|
53
|
+
priceChange24h: number;
|
|
54
|
+
priceChangePercent24h: number;
|
|
55
|
+
openInterest: number;
|
|
56
|
+
fundingRate: number;
|
|
57
|
+
nextFundingTime: Date;
|
|
58
|
+
}
|
|
59
|
+
export interface LiquidationRisk {
|
|
60
|
+
userId: string;
|
|
61
|
+
riskLevel: 'low' | 'medium' | 'high' | 'critical';
|
|
62
|
+
marginLevel: number;
|
|
63
|
+
liquidationPrice: number;
|
|
64
|
+
timeToLiquidation: number | null;
|
|
65
|
+
recommendations: string[];
|
|
66
|
+
}
|
|
67
|
+
export declare class MarketDataClient {
|
|
68
|
+
private jsonRpc;
|
|
69
|
+
constructor(jsonRpcClient: any);
|
|
70
|
+
/**
|
|
71
|
+
* Get market data from a specific source
|
|
72
|
+
*/
|
|
73
|
+
getMarketData(symbol: string, source: string): Promise<MarketDataSource>;
|
|
74
|
+
/**
|
|
75
|
+
* Get aggregated market data from all sources
|
|
76
|
+
*/
|
|
77
|
+
getAggregatedMarketData(symbol: string): Promise<MarketDataSource[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Get recent liquidations
|
|
80
|
+
*/
|
|
81
|
+
getLiquidations(symbol: string, limit?: number): Promise<LiquidationInfo[]>;
|
|
82
|
+
/**
|
|
83
|
+
* Get settlement batch information
|
|
84
|
+
*/
|
|
85
|
+
getSettlementBatch(batchId: number): Promise<SettlementBatch>;
|
|
86
|
+
/**
|
|
87
|
+
* Get margin information for a user
|
|
88
|
+
*/
|
|
89
|
+
getMarginInfo(userId: string): Promise<MarginInfo>;
|
|
90
|
+
/**
|
|
91
|
+
* Check liquidation risk for a user
|
|
92
|
+
*/
|
|
93
|
+
checkLiquidationRisk(userId: string): Promise<LiquidationRisk>;
|
|
94
|
+
/**
|
|
95
|
+
* Get insurance fund status
|
|
96
|
+
*/
|
|
97
|
+
getInsuranceFundStatus(): Promise<InsuranceFundStatus>;
|
|
98
|
+
/**
|
|
99
|
+
* Get list of available market data sources
|
|
100
|
+
*/
|
|
101
|
+
getMarketDataSources(): Promise<string[]>;
|
|
102
|
+
/**
|
|
103
|
+
* Get comprehensive market statistics
|
|
104
|
+
*/
|
|
105
|
+
getMarketStats(symbol: string): Promise<MarketStats>;
|
|
106
|
+
}
|
|
107
|
+
export declare class LiquidationMonitor {
|
|
108
|
+
private ws;
|
|
109
|
+
private callbacks;
|
|
110
|
+
constructor(wsConnection: WebSocket | null);
|
|
111
|
+
/**
|
|
112
|
+
* Set WebSocket connection
|
|
113
|
+
*/
|
|
114
|
+
setWebSocket(ws: WebSocket): void;
|
|
115
|
+
/**
|
|
116
|
+
* Subscribe to liquidation events
|
|
117
|
+
*/
|
|
118
|
+
subscribeLiquidations(callback: (liquidation: LiquidationInfo) => void): void;
|
|
119
|
+
/**
|
|
120
|
+
* Subscribe to settlement events
|
|
121
|
+
*/
|
|
122
|
+
subscribeSettlements(callback: (settlement: SettlementBatch) => void): void;
|
|
123
|
+
/**
|
|
124
|
+
* Subscribe to margin call events for a user
|
|
125
|
+
*/
|
|
126
|
+
subscribeMarginCalls(userId: string, callback: (marginCall: any) => void): void;
|
|
127
|
+
/**
|
|
128
|
+
* Unsubscribe from a channel
|
|
129
|
+
*/
|
|
130
|
+
unsubscribe(channel: string): void;
|
|
131
|
+
/**
|
|
132
|
+
* Handle incoming message
|
|
133
|
+
*/
|
|
134
|
+
handleMessage(channel: string, data: any): void;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Market data sources supported by LX
|
|
138
|
+
*/
|
|
139
|
+
export declare const MarketDataProviders: {
|
|
140
|
+
readonly ALPACA: "alpaca";
|
|
141
|
+
readonly NYSE_ARCA: "nyse_arca";
|
|
142
|
+
readonly IEX_CLOUD: "iex";
|
|
143
|
+
readonly POLYGON: "polygon";
|
|
144
|
+
readonly CME_GROUP: "cme";
|
|
145
|
+
readonly REFINITIV: "refinitiv";
|
|
146
|
+
readonly ICE_DATA: "ice";
|
|
147
|
+
readonly BLOOMBERG: "bloomberg";
|
|
148
|
+
readonly NASDAQ_TOTALVIEW: "nasdaq";
|
|
149
|
+
readonly COINBASE_PRO: "coinbase";
|
|
150
|
+
};
|
|
151
|
+
export type MarketDataProvider = typeof MarketDataProviders[keyof typeof MarketDataProviders];
|
|
152
|
+
//# sourceMappingURL=marketData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketData.d.ts","sourceRoot":"","sources":["../src/marketData.ts"],"names":[],"mappings":"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"}
|