lighter-ts-sdk 1.0.0 → 1.0.2
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/README.md +62 -49
- package/dist/api/transaction-api.d.ts +5 -1
- package/dist/api/transaction-api.d.ts.map +1 -1
- package/dist/api/transaction-api.js.map +1 -1
- package/dist/api/ws-order-client.d.ts +82 -0
- package/dist/api/ws-order-client.d.ts.map +1 -0
- package/dist/api/ws-order-client.js +281 -0
- package/dist/api/ws-order-client.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/signer/signer-client.d.ts.map +1 -1
- package/dist/signer/signer-client.js +5 -3
- package/dist/signer/signer-client.js.map +1 -1
- package/dist/signer/wasm-signer-client.d.ts +104 -10
- package/dist/signer/wasm-signer-client.d.ts.map +1 -1
- package/dist/signer/wasm-signer-client.js +643 -356
- package/dist/signer/wasm-signer-client.js.map +1 -1
- package/dist/utils/advanced-cache.d.ts +66 -0
- package/dist/utils/advanced-cache.d.ts.map +1 -0
- package/dist/utils/advanced-cache.js +204 -0
- package/dist/utils/advanced-cache.js.map +1 -0
- package/dist/utils/exceptions.d.ts +24 -0
- package/dist/utils/exceptions.d.ts.map +1 -1
- package/dist/utils/exceptions.js +48 -1
- package/dist/utils/exceptions.js.map +1 -1
- package/dist/utils/logger.d.ts +35 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +96 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/memory-pool.d.ts +98 -0
- package/dist/utils/memory-pool.d.ts.map +1 -0
- package/dist/utils/memory-pool.js +190 -0
- package/dist/utils/memory-pool.js.map +1 -0
- package/dist/utils/node-wasm-signer.d.ts +8 -0
- package/dist/utils/node-wasm-signer.d.ts.map +1 -1
- package/dist/utils/node-wasm-signer.js +84 -29
- package/dist/utils/node-wasm-signer.js.map +1 -1
- package/dist/utils/nonce-cache.d.ts +29 -0
- package/dist/utils/nonce-cache.d.ts.map +1 -0
- package/dist/utils/nonce-cache.js +111 -0
- package/dist/utils/nonce-cache.js.map +1 -0
- package/dist/utils/optimized-http-client.d.ts +29 -0
- package/dist/utils/optimized-http-client.d.ts.map +1 -0
- package/dist/utils/optimized-http-client.js +142 -0
- package/dist/utils/optimized-http-client.js.map +1 -0
- package/dist/utils/performance-monitor.d.ts +41 -0
- package/dist/utils/performance-monitor.d.ts.map +1 -0
- package/dist/utils/performance-monitor.js +183 -0
- package/dist/utils/performance-monitor.js.map +1 -0
- package/dist/utils/request-batcher.d.ts +45 -0
- package/dist/utils/request-batcher.d.ts.map +1 -0
- package/dist/utils/request-batcher.js +177 -0
- package/dist/utils/request-batcher.js.map +1 -0
- package/dist/utils/wasm-manager.d.ts +30 -0
- package/dist/utils/wasm-manager.d.ts.map +1 -0
- package/dist/utils/wasm-manager.js +115 -0
- package/dist/utils/wasm-manager.js.map +1 -0
- package/docs/AccountApi.md +1 -1
- package/docs/GettingStarted.md +8 -8
- package/docs/OrderApi.md +1 -1
- package/docs/SignerClient.md +1 -1
- package/docs/TransactionApi.md +1 -1
- package/docs/WsClient.md +1 -1
- package/docs/types/Account.md +1 -1
- package/docs/types/ApiKeyPair.md +1 -1
- package/docs/types/CreateOrderParams.md +1 -1
- package/docs/types/MarketOrderParams.md +1 -1
- package/docs/types/SignerConfig.md +1 -1
- package/docs/types/WasmSignerConfig.md +1 -1
- package/examples/README.md +1 -1
- package/examples/account_info.ts +5 -2
- package/examples/cancel_all_orders.ts +77 -0
- package/examples/close_all_positions.ts +69 -0
- package/examples/create_cancel_order.ts +48 -8
- package/examples/create_market_order.ts +42 -1
- package/examples/create_market_order_if_slippage.ts +69 -0
- package/examples/create_market_order_max_slippage.ts +43 -43
- package/examples/create_sl_tp.ts +114 -29
- package/examples/create_with_multiple_keys.ts +77 -58
- package/examples/get_info.ts +1 -1
- package/examples/market_data_json.ts +80 -0
- package/examples/wait_for_transaction.ts +101 -0
- package/examples/ws.ts +64 -24
- package/examples/ws_async.ts +40 -39
- package/package.json +70 -70
- package/dist/utils/signer.d.ts +0 -15
- package/dist/utils/signer.d.ts.map +0 -1
- package/dist/utils/signer.js +0 -68
- package/dist/utils/signer.js.map +0 -1
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createGeneralBatcher = exports.createHFTBatcher = exports.createOrderBatcher = exports.RequestBatcher = void 0;
|
|
4
|
+
// Request batching system for multiple operations in single API call
|
|
5
|
+
const performance_monitor_1 = require("./performance-monitor");
|
|
6
|
+
class RequestBatcher {
|
|
7
|
+
constructor(batchProcessor, config) {
|
|
8
|
+
this.batchProcessor = batchProcessor;
|
|
9
|
+
this.pendingRequests = new Map();
|
|
10
|
+
this.batchQueue = [];
|
|
11
|
+
this.flushTimer = null;
|
|
12
|
+
this.isProcessing = false;
|
|
13
|
+
this.config = {
|
|
14
|
+
maxBatchSize: 10,
|
|
15
|
+
maxWaitTime: 50, // 50ms max wait time
|
|
16
|
+
flushInterval: 25, // 25ms flush interval
|
|
17
|
+
...config
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
async addRequest(type, params) {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
const requestId = `${type.toLowerCase()}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
23
|
+
const request = {
|
|
24
|
+
id: requestId,
|
|
25
|
+
type,
|
|
26
|
+
params,
|
|
27
|
+
timestamp: Date.now()
|
|
28
|
+
};
|
|
29
|
+
// Store pending request
|
|
30
|
+
this.pendingRequests.set(requestId, {
|
|
31
|
+
resolve,
|
|
32
|
+
reject,
|
|
33
|
+
timestamp: Date.now()
|
|
34
|
+
});
|
|
35
|
+
// Add to batch queue
|
|
36
|
+
this.batchQueue.push(request);
|
|
37
|
+
// Check if we should flush immediately
|
|
38
|
+
if (this.batchQueue.length >= this.config.maxBatchSize) {
|
|
39
|
+
this.flush();
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Schedule flush if not already scheduled
|
|
43
|
+
this.scheduleFlush();
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
scheduleFlush() {
|
|
48
|
+
if (this.flushTimer) {
|
|
49
|
+
return; // Already scheduled
|
|
50
|
+
}
|
|
51
|
+
this.flushTimer = setTimeout(() => {
|
|
52
|
+
this.flush();
|
|
53
|
+
}, this.config.flushInterval);
|
|
54
|
+
}
|
|
55
|
+
async flush() {
|
|
56
|
+
if (this.isProcessing || this.batchQueue.length === 0) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this.isProcessing = true;
|
|
60
|
+
// Clear flush timer
|
|
61
|
+
if (this.flushTimer) {
|
|
62
|
+
clearTimeout(this.flushTimer);
|
|
63
|
+
this.flushTimer = null;
|
|
64
|
+
}
|
|
65
|
+
// Get current batch
|
|
66
|
+
const currentBatch = [...this.batchQueue];
|
|
67
|
+
this.batchQueue = [];
|
|
68
|
+
if (currentBatch.length === 0) {
|
|
69
|
+
this.isProcessing = false;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const endTimer = performance_monitor_1.performanceMonitor.startTimer('batch_process', {
|
|
73
|
+
count: currentBatch.length.toString()
|
|
74
|
+
});
|
|
75
|
+
try {
|
|
76
|
+
if (process.env["NODE_ENV"] === 'development') {
|
|
77
|
+
console.log(`📦 Processing batch of ${currentBatch.length} requests`);
|
|
78
|
+
}
|
|
79
|
+
// Process batch
|
|
80
|
+
const responses = await this.batchProcessor(currentBatch);
|
|
81
|
+
// Handle responses
|
|
82
|
+
for (const response of responses) {
|
|
83
|
+
const pending = this.pendingRequests.get(response.id);
|
|
84
|
+
if (pending) {
|
|
85
|
+
this.pendingRequests.delete(response.id);
|
|
86
|
+
if (response.success) {
|
|
87
|
+
pending.resolve(response.result);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
pending.reject(new Error(response.error || 'Batch request failed'));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Handle any requests that didn't get responses (shouldn't happen)
|
|
95
|
+
for (const request of currentBatch) {
|
|
96
|
+
const pending = this.pendingRequests.get(request.id);
|
|
97
|
+
if (pending) {
|
|
98
|
+
this.pendingRequests.delete(request.id);
|
|
99
|
+
pending.reject(new Error('No response received for batch request'));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (process.env["NODE_ENV"] === 'development') {
|
|
103
|
+
console.log(`✅ Batch processed: ${responses.length} responses`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error('❌ Batch processing failed:', error);
|
|
108
|
+
// Reject all pending requests in this batch
|
|
109
|
+
for (const request of currentBatch) {
|
|
110
|
+
const pending = this.pendingRequests.get(request.id);
|
|
111
|
+
if (pending) {
|
|
112
|
+
this.pendingRequests.delete(request.id);
|
|
113
|
+
pending.reject(error instanceof Error ? error : new Error('Batch processing failed'));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
this.isProcessing = false;
|
|
119
|
+
endTimer();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async flushAll() {
|
|
123
|
+
// Clear any pending timer
|
|
124
|
+
if (this.flushTimer) {
|
|
125
|
+
clearTimeout(this.flushTimer);
|
|
126
|
+
this.flushTimer = null;
|
|
127
|
+
}
|
|
128
|
+
// Process any remaining requests
|
|
129
|
+
await this.flush();
|
|
130
|
+
}
|
|
131
|
+
getStats() {
|
|
132
|
+
return {
|
|
133
|
+
pendingRequests: this.pendingRequests.size,
|
|
134
|
+
batchQueue: this.batchQueue.length,
|
|
135
|
+
isProcessing: this.isProcessing
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async destroy() {
|
|
139
|
+
// Clear timer
|
|
140
|
+
if (this.flushTimer) {
|
|
141
|
+
clearTimeout(this.flushTimer);
|
|
142
|
+
this.flushTimer = null;
|
|
143
|
+
}
|
|
144
|
+
// Reject all pending requests
|
|
145
|
+
for (const [, pending] of this.pendingRequests.entries()) {
|
|
146
|
+
pending.reject(new Error('RequestBatcher destroyed'));
|
|
147
|
+
}
|
|
148
|
+
this.pendingRequests.clear();
|
|
149
|
+
// Clear batch queue
|
|
150
|
+
this.batchQueue = [];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
exports.RequestBatcher = RequestBatcher;
|
|
154
|
+
// Factory function for creating batchers with common configurations
|
|
155
|
+
function createOrderBatcher(batchProcessor, options) {
|
|
156
|
+
return new RequestBatcher(batchProcessor, options);
|
|
157
|
+
}
|
|
158
|
+
exports.createOrderBatcher = createOrderBatcher;
|
|
159
|
+
// High-frequency trading optimized batcher
|
|
160
|
+
function createHFTBatcher(batchProcessor) {
|
|
161
|
+
return new RequestBatcher(batchProcessor, {
|
|
162
|
+
maxBatchSize: 5, // Smaller batches for lower latency
|
|
163
|
+
maxWaitTime: 10, // 10ms max wait
|
|
164
|
+
flushInterval: 5 // 5ms flush interval
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
exports.createHFTBatcher = createHFTBatcher;
|
|
168
|
+
// General trading optimized batcher
|
|
169
|
+
function createGeneralBatcher(batchProcessor) {
|
|
170
|
+
return new RequestBatcher(batchProcessor, {
|
|
171
|
+
maxBatchSize: 20, // Larger batches for efficiency
|
|
172
|
+
maxWaitTime: 100, // 100ms max wait
|
|
173
|
+
flushInterval: 50 // 50ms flush interval
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
exports.createGeneralBatcher = createGeneralBatcher;
|
|
177
|
+
//# sourceMappingURL=request-batcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-batcher.js","sourceRoot":"","sources":["../../src/utils/request-batcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { NodeWasmSignerClient } from './node-wasm-signer';
|
|
2
|
+
import { WasmSignerClient } from './wasm-signer';
|
|
3
|
+
export interface WasmConfig {
|
|
4
|
+
wasmPath: string;
|
|
5
|
+
wasmExecPath?: string;
|
|
6
|
+
}
|
|
7
|
+
export type WasmClientType = 'browser' | 'node';
|
|
8
|
+
export declare class WasmManager {
|
|
9
|
+
private static instance;
|
|
10
|
+
private wasmClient;
|
|
11
|
+
private isInitialized;
|
|
12
|
+
private initializationPromise;
|
|
13
|
+
private config;
|
|
14
|
+
private constructor();
|
|
15
|
+
static getInstance(): WasmManager;
|
|
16
|
+
initialize(config: WasmConfig, clientType?: WasmClientType): Promise<void>;
|
|
17
|
+
private doInitialize;
|
|
18
|
+
getWasmClient(): WasmSignerClient | NodeWasmSignerClient;
|
|
19
|
+
isReady(): boolean;
|
|
20
|
+
ensureReady(): Promise<void>;
|
|
21
|
+
static preInitialize(config: WasmConfig, clientType?: WasmClientType): Promise<void>;
|
|
22
|
+
getStatus(): {
|
|
23
|
+
isInitialized: boolean;
|
|
24
|
+
hasClient: boolean;
|
|
25
|
+
config: WasmConfig | null;
|
|
26
|
+
};
|
|
27
|
+
destroy(): void;
|
|
28
|
+
static reset(): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=wasm-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-manager.d.ts","sourceRoot":"","sources":["../../src/utils/wasm-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAA8B,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAA0B,MAAM,eAAe,CAAC;AAEzE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,MAAM,CAAC;AAEhD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IACnD,OAAO,CAAC,UAAU,CAAwD;IAC1E,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,MAAM,CAA2B;IAEzC,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,WAAW;IAO3B,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,GAAE,cAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;YAkB1E,YAAY;IA+B1B,aAAa,IAAI,gBAAgB,GAAG,oBAAoB;IAOxD,OAAO,IAAI,OAAO;IAIZ,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;WAUrB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,GAAE,cAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlG,SAAS,IAAI;QACX,aAAa,EAAE,OAAO,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;KAC3B;IASD,OAAO,IAAI,IAAI;IAcf,MAAM,CAAC,KAAK,IAAI,IAAI;CAMrB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WasmManager = void 0;
|
|
4
|
+
// WASM manager for pre-initialization and singleton pattern
|
|
5
|
+
const node_wasm_signer_1 = require("./node-wasm-signer");
|
|
6
|
+
const wasm_signer_1 = require("./wasm-signer");
|
|
7
|
+
class WasmManager {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.wasmClient = null;
|
|
10
|
+
this.isInitialized = false;
|
|
11
|
+
this.initializationPromise = null;
|
|
12
|
+
this.config = null;
|
|
13
|
+
}
|
|
14
|
+
static getInstance() {
|
|
15
|
+
if (!WasmManager.instance) {
|
|
16
|
+
WasmManager.instance = new WasmManager();
|
|
17
|
+
}
|
|
18
|
+
return WasmManager.instance;
|
|
19
|
+
}
|
|
20
|
+
async initialize(config, clientType = 'node') {
|
|
21
|
+
if (this.isInitialized && this.wasmClient) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (this.initializationPromise) {
|
|
25
|
+
return this.initializationPromise;
|
|
26
|
+
}
|
|
27
|
+
this.initializationPromise = this.doInitialize(config, clientType);
|
|
28
|
+
try {
|
|
29
|
+
await this.initializationPromise;
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
this.initializationPromise = null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async doInitialize(config, clientType) {
|
|
36
|
+
try {
|
|
37
|
+
if (process.env['NODE_ENV'] === 'development') {
|
|
38
|
+
console.log('🚀 Initializing WASM client...');
|
|
39
|
+
}
|
|
40
|
+
const startTime = Date.now();
|
|
41
|
+
this.config = config;
|
|
42
|
+
if (clientType === 'browser' && typeof window !== 'undefined') {
|
|
43
|
+
this.wasmClient = (0, wasm_signer_1.createWasmSignerClient)(config);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
this.wasmClient = (0, node_wasm_signer_1.createNodeWasmSignerClient)(config);
|
|
47
|
+
}
|
|
48
|
+
// Initialize the WASM client
|
|
49
|
+
await this.wasmClient.initialize();
|
|
50
|
+
const initTime = Date.now() - startTime;
|
|
51
|
+
if (process.env['NODE_ENV'] === 'development') {
|
|
52
|
+
console.log(`✅ WASM client initialized in ${initTime.toFixed(2)}ms`);
|
|
53
|
+
}
|
|
54
|
+
this.isInitialized = true;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
// Always log initialization errors for debugging
|
|
58
|
+
console.error('❌ Failed to initialize WASM client:', error instanceof Error ? error.message : String(error));
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
getWasmClient() {
|
|
63
|
+
if (!this.isInitialized || !this.wasmClient) {
|
|
64
|
+
throw new Error('WASM client not initialized. Call initialize() first.');
|
|
65
|
+
}
|
|
66
|
+
return this.wasmClient;
|
|
67
|
+
}
|
|
68
|
+
isReady() {
|
|
69
|
+
return this.isInitialized && this.wasmClient !== null;
|
|
70
|
+
}
|
|
71
|
+
async ensureReady() {
|
|
72
|
+
if (!this.isReady()) {
|
|
73
|
+
if (!this.config) {
|
|
74
|
+
throw new Error('WASM manager not configured. Call initialize() first.');
|
|
75
|
+
}
|
|
76
|
+
await this.initialize(this.config);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Pre-initialize with default config for faster startup
|
|
80
|
+
static async preInitialize(config, clientType = 'node') {
|
|
81
|
+
const manager = WasmManager.getInstance();
|
|
82
|
+
await manager.initialize(config, clientType);
|
|
83
|
+
}
|
|
84
|
+
// Get initialization status for monitoring
|
|
85
|
+
getStatus() {
|
|
86
|
+
return {
|
|
87
|
+
isInitialized: this.isInitialized,
|
|
88
|
+
hasClient: this.wasmClient !== null,
|
|
89
|
+
config: this.config
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Cleanup method
|
|
93
|
+
destroy() {
|
|
94
|
+
if (this.wasmClient) {
|
|
95
|
+
// Call cleanup method if available
|
|
96
|
+
if (typeof this.wasmClient.destroy === 'function') {
|
|
97
|
+
this.wasmClient.destroy();
|
|
98
|
+
}
|
|
99
|
+
this.wasmClient = null;
|
|
100
|
+
}
|
|
101
|
+
this.isInitialized = false;
|
|
102
|
+
this.config = null;
|
|
103
|
+
WasmManager.instance = null;
|
|
104
|
+
}
|
|
105
|
+
// Reset instance for testing
|
|
106
|
+
static reset() {
|
|
107
|
+
if (WasmManager.instance) {
|
|
108
|
+
WasmManager.instance.destroy();
|
|
109
|
+
}
|
|
110
|
+
WasmManager.instance = null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.WasmManager = WasmManager;
|
|
114
|
+
WasmManager.instance = null;
|
|
115
|
+
//# sourceMappingURL=wasm-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-manager.js","sourceRoot":"","sources":["../../src/utils/wasm-manager.ts"],"names":[],"mappings":"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"}
|
package/docs/AccountApi.md
CHANGED
|
@@ -180,7 +180,7 @@ try {
|
|
|
180
180
|
## Complete Example
|
|
181
181
|
|
|
182
182
|
```typescript
|
|
183
|
-
import { ApiClient, AccountApi } from '
|
|
183
|
+
import { ApiClient, AccountApi } from 'lighter-ts-sdk';
|
|
184
184
|
|
|
185
185
|
async function main() {
|
|
186
186
|
const client = new ApiClient({ host: 'https://mainnet.zklighter.elliot.ai' });
|
package/docs/GettingStarted.md
CHANGED
|
@@ -13,13 +13,13 @@ This guide will help you get up and running with the Lighter TypeScript SDK quic
|
|
|
13
13
|
### Using npm
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
npm install
|
|
16
|
+
npm install lighter-ts-sdk
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
### Using yarn
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
yarn add
|
|
22
|
+
yarn add lighter-ts-sdk
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
## Quick Start
|
|
@@ -27,7 +27,7 @@ yarn add @lighter/typescript-sdk
|
|
|
27
27
|
### 1. Basic API Usage
|
|
28
28
|
|
|
29
29
|
```typescript
|
|
30
|
-
import { ApiClient, AccountApi } from '
|
|
30
|
+
import { ApiClient, AccountApi } from 'lighter-ts-sdk';
|
|
31
31
|
|
|
32
32
|
async function main() {
|
|
33
33
|
const client = new ApiClient({ host: 'https://mainnet.zklighter.elliot.ai' });
|
|
@@ -49,7 +49,7 @@ main().catch(console.error);
|
|
|
49
49
|
### 2. Trading with SignerClient
|
|
50
50
|
|
|
51
51
|
```typescript
|
|
52
|
-
import { SignerClient } from '
|
|
52
|
+
import { SignerClient } from 'lighter-ts-sdk';
|
|
53
53
|
|
|
54
54
|
async function main() {
|
|
55
55
|
const client = new SignerClient({
|
|
@@ -104,7 +104,7 @@ npx ts-node examples/system_setup.ts
|
|
|
104
104
|
This will output something like:
|
|
105
105
|
```
|
|
106
106
|
BASE_URL = 'https://mainnet.zklighter.elliot.ai'
|
|
107
|
-
API_KEY_PRIVATE_KEY = '
|
|
107
|
+
API_KEY_PRIVATE_KEY = '0x...' # Your generated API private key
|
|
108
108
|
ACCOUNT_INDEX = 595
|
|
109
109
|
API_KEY_INDEX = 1
|
|
110
110
|
```
|
|
@@ -115,7 +115,7 @@ Create a `.env` file in your project root:
|
|
|
115
115
|
|
|
116
116
|
```env
|
|
117
117
|
BASE_URL=https://mainnet.zklighter.elliot.ai
|
|
118
|
-
|
|
118
|
+
API_PRIVATE_KEY=0x... # Your generated API private key
|
|
119
119
|
ACCOUNT_INDEX=595
|
|
120
120
|
API_KEY_INDEX=1
|
|
121
121
|
```
|
|
@@ -125,7 +125,7 @@ API_KEY_INDEX=1
|
|
|
125
125
|
Now you can use the SDK to create orders:
|
|
126
126
|
|
|
127
127
|
```typescript
|
|
128
|
-
import { SignerClient } from '
|
|
128
|
+
import { SignerClient } from 'lighter-ts-sdk';
|
|
129
129
|
import * as dotenv from 'dotenv';
|
|
130
130
|
|
|
131
131
|
dotenv.config();
|
|
@@ -203,7 +203,7 @@ npx ts-node examples/[example-name].ts
|
|
|
203
203
|
For real-time data, use the WebSocket client:
|
|
204
204
|
|
|
205
205
|
```typescript
|
|
206
|
-
import { WsClient } from '
|
|
206
|
+
import { WsClient } from 'lighter-ts-sdk';
|
|
207
207
|
|
|
208
208
|
const wsClient = new WsClient({
|
|
209
209
|
url: 'wss://mainnet.zklighter.elliot.ai/ws',
|
package/docs/OrderApi.md
CHANGED
|
@@ -157,7 +157,7 @@ try {
|
|
|
157
157
|
## Complete Example
|
|
158
158
|
|
|
159
159
|
```typescript
|
|
160
|
-
import { ApiClient, OrderApi } from '
|
|
160
|
+
import { ApiClient, OrderApi } from 'lighter-ts-sdk';
|
|
161
161
|
|
|
162
162
|
async function main() {
|
|
163
163
|
const client = new ApiClient({ host: 'https://mainnet.zklighter.elliot.ai' });
|
package/docs/SignerClient.md
CHANGED
|
@@ -275,7 +275,7 @@ console.log('Order created successfully:', txHash);
|
|
|
275
275
|
## Complete Example
|
|
276
276
|
|
|
277
277
|
```typescript
|
|
278
|
-
import { SignerClient } from '
|
|
278
|
+
import { SignerClient } from 'lighter-ts-sdk';
|
|
279
279
|
|
|
280
280
|
async function main() {
|
|
281
281
|
const client = new SignerClient({
|
package/docs/TransactionApi.md
CHANGED
|
@@ -261,7 +261,7 @@ try {
|
|
|
261
261
|
## Complete Example
|
|
262
262
|
|
|
263
263
|
```typescript
|
|
264
|
-
import { ApiClient, TransactionApi, SignerClient } from '
|
|
264
|
+
import { ApiClient, TransactionApi, SignerClient } from 'lighter-ts-sdk';
|
|
265
265
|
|
|
266
266
|
async function main() {
|
|
267
267
|
const client = new ApiClient({ host: 'https://mainnet.zklighter.elliot.ai' });
|
package/docs/WsClient.md
CHANGED
|
@@ -180,7 +180,7 @@ interface PriceLevel {
|
|
|
180
180
|
## Complete Example
|
|
181
181
|
|
|
182
182
|
```typescript
|
|
183
|
-
import { WsClient, SignerClient } from '
|
|
183
|
+
import { WsClient, SignerClient } from 'lighter-ts-sdk';
|
|
184
184
|
|
|
185
185
|
async function main() {
|
|
186
186
|
const wsClient = new WsClient({
|
package/docs/types/Account.md
CHANGED
|
@@ -16,7 +16,7 @@ Account information returned by the `AccountApi.getAccount()` method.
|
|
|
16
16
|
## Example
|
|
17
17
|
|
|
18
18
|
```typescript
|
|
19
|
-
import { AccountApi } from '
|
|
19
|
+
import { AccountApi } from 'lighter-ts-sdk';
|
|
20
20
|
|
|
21
21
|
const accountApi = new AccountApi(client);
|
|
22
22
|
const account = await accountApi.getAccount({ by: 'index', value: '123' });
|
package/docs/types/ApiKeyPair.md
CHANGED
|
@@ -12,7 +12,7 @@ Structure representing a generated API key pair.
|
|
|
12
12
|
## Example
|
|
13
13
|
|
|
14
14
|
```typescript
|
|
15
|
-
import { SignerClient } from '
|
|
15
|
+
import { SignerClient } from 'lighter-ts-sdk';
|
|
16
16
|
|
|
17
17
|
const client = new SignerClient(config);
|
|
18
18
|
await client.initialize();
|
|
@@ -20,7 +20,7 @@ Parameters for creating a limit order using the `SignerClient.createOrder()` met
|
|
|
20
20
|
## Example
|
|
21
21
|
|
|
22
22
|
```typescript
|
|
23
|
-
import { SignerClient } from '
|
|
23
|
+
import { SignerClient } from 'lighter-ts-sdk';
|
|
24
24
|
|
|
25
25
|
const orderParams: CreateOrderParams = {
|
|
26
26
|
marketIndex: 0, // ETH/USDC
|
|
@@ -15,7 +15,7 @@ Parameters for creating a market order using the `SignerClient.createMarketOrder
|
|
|
15
15
|
## Example
|
|
16
16
|
|
|
17
17
|
```typescript
|
|
18
|
-
import { SignerClient } from '
|
|
18
|
+
import { SignerClient } from 'lighter-ts-sdk';
|
|
19
19
|
|
|
20
20
|
const marketOrderParams: MarketOrderParams = {
|
|
21
21
|
marketIndex: 0, // ETH/USDC
|
|
@@ -16,7 +16,7 @@ Configuration object for the `SignerClient` class.
|
|
|
16
16
|
## Example
|
|
17
17
|
|
|
18
18
|
```typescript
|
|
19
|
-
import { SignerClient } from '
|
|
19
|
+
import { SignerClient } from 'lighter-ts-sdk';
|
|
20
20
|
|
|
21
21
|
const config: SignerConfig = {
|
|
22
22
|
url: 'https://mainnet.zklighter.elliot.ai',
|
|
@@ -12,7 +12,7 @@ Configuration object for the WASM signer client.
|
|
|
12
12
|
## Example
|
|
13
13
|
|
|
14
14
|
```typescript
|
|
15
|
-
import { WasmSignerClient } from '
|
|
15
|
+
import { WasmSignerClient } from 'lighter-ts-sdk';
|
|
16
16
|
|
|
17
17
|
const config: WasmSignerConfig = {
|
|
18
18
|
wasmPath: 'wasm/lighter-signer.wasm',
|
package/examples/README.md
CHANGED
|
@@ -16,7 +16,7 @@ This directory contains comprehensive examples demonstrating how to use the Ligh
|
|
|
16
16
|
- The output should look like:
|
|
17
17
|
```
|
|
18
18
|
BASE_URL = 'https://testnet.zklighter.elliot.ai'
|
|
19
|
-
API_KEY_PRIVATE_KEY = '
|
|
19
|
+
API_KEY_PRIVATE_KEY = '0x...' # Your generated API private key
|
|
20
20
|
ACCOUNT_INDEX = 595
|
|
21
21
|
API_KEY_INDEX = 1
|
|
22
22
|
```
|
package/examples/account_info.ts
CHANGED
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
import { Account } from "../src/api/account-api";
|
|
4
4
|
import { ApiClient } from "../src/api/api-client";
|
|
5
|
+
import dotenv from 'dotenv';
|
|
6
|
+
dotenv.config();
|
|
5
7
|
|
|
6
8
|
async function main(): Promise<void> {
|
|
9
|
+
console.log(process.env['L1_ADDRESS']);
|
|
7
10
|
const client = new ApiClient();
|
|
8
|
-
const
|
|
9
|
-
console.log(
|
|
11
|
+
const response = await client.get<Account>('/api/v1/account', { by: 'l1_address', value: process.env['L1_ADDRESS'] });
|
|
12
|
+
console.log(response.data);
|
|
10
13
|
}
|
|
11
14
|
|
|
12
15
|
main();
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Cancel all orders for an account
|
|
2
|
+
// This example shows how to cancel all open orders
|
|
3
|
+
|
|
4
|
+
import { SignerClient } from '../src/signer/wasm-signer-client';
|
|
5
|
+
import * as dotenv from 'dotenv';
|
|
6
|
+
|
|
7
|
+
dotenv.config();
|
|
8
|
+
|
|
9
|
+
const BASE_URL = process.env['BASE_URL'] || 'https://mainnet.zklighter.elliot.ai';
|
|
10
|
+
const API_KEY_PRIVATE_KEY = process.env['API_PRIVATE_KEY'];
|
|
11
|
+
const ACCOUNT_INDEX = parseInt(process.env['ACCOUNT_INDEX'] || '0', 10);
|
|
12
|
+
const API_KEY_INDEX = parseInt(process.env['API_KEY_INDEX'] || '0', 10);
|
|
13
|
+
|
|
14
|
+
async function main(): Promise<void> {
|
|
15
|
+
if (!API_KEY_PRIVATE_KEY) {
|
|
16
|
+
console.error('API_KEY_PRIVATE_KEY environment variable is required');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const client = new SignerClient({
|
|
21
|
+
url: BASE_URL,
|
|
22
|
+
privateKey: API_KEY_PRIVATE_KEY,
|
|
23
|
+
accountIndex: ACCOUNT_INDEX,
|
|
24
|
+
apiKeyIndex: API_KEY_INDEX,
|
|
25
|
+
wasmConfig: { wasmPath: 'wasm/lighter-signer.wasm' }
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
await client.initialize();
|
|
29
|
+
await (client as any).ensureWasmClient();
|
|
30
|
+
|
|
31
|
+
const err = client.checkClient();
|
|
32
|
+
if (err) {
|
|
33
|
+
console.error('CheckClient error:', err);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Cancel all orders
|
|
38
|
+
// timeInForce: 0 = immediate, 1 = scheduled, 2 = abort
|
|
39
|
+
// time: timestamp for scheduled cancellation (0 for immediate)
|
|
40
|
+
const [tx, apiResponse, cancelErr] = await client.cancelAllOrders(
|
|
41
|
+
SignerClient.CANCEL_ALL_TIF_IMMEDIATE, // Immediate cancellation
|
|
42
|
+
0 // No scheduled time
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
console.log('Cancel All Orders:', { tx, apiResponse, err: cancelErr });
|
|
46
|
+
|
|
47
|
+
if (cancelErr) {
|
|
48
|
+
console.log('❌ Cancel all orders error:', cancelErr);
|
|
49
|
+
} else {
|
|
50
|
+
console.log('✅ All orders cancelled successfully!');
|
|
51
|
+
console.log('📋 Transaction Details:');
|
|
52
|
+
console.log(` Time In Force: ${tx.TimeInForce}`);
|
|
53
|
+
console.log(` Time: ${tx.Time}`);
|
|
54
|
+
console.log(` Nonce: ${tx.Nonce}`);
|
|
55
|
+
console.log(` API Response: ${JSON.stringify(apiResponse)}`);
|
|
56
|
+
|
|
57
|
+
// Wait for cancellation transaction confirmation if we have a hash
|
|
58
|
+
if (apiResponse && apiResponse.hash) {
|
|
59
|
+
console.log('\n⏳ Waiting for cancellation transaction confirmation...');
|
|
60
|
+
try {
|
|
61
|
+
const confirmedTx = await client.waitForTransaction(apiResponse.hash, 30000, 1000);
|
|
62
|
+
console.log('✅ Cancellation transaction confirmed!');
|
|
63
|
+
console.log(` Hash: ${confirmedTx.hash}`);
|
|
64
|
+
console.log(` Status: ${confirmedTx.status}`);
|
|
65
|
+
console.log(` Block Height: ${confirmedTx.block_height}`);
|
|
66
|
+
} catch (waitError) {
|
|
67
|
+
console.log('⚠️ Cancellation transaction confirmation timeout:', waitError instanceof Error ? waitError.message : 'Unknown error');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
await client.close();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (require.main === module) {
|
|
76
|
+
main().catch(console.error);
|
|
77
|
+
}
|