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,80 @@
|
|
|
1
|
+
// Get all market data and output as JSON
|
|
2
|
+
// Simple example to get market information without validation
|
|
3
|
+
|
|
4
|
+
import { ApiClient } from '../src/api/api-client';
|
|
5
|
+
import { OrderApi } from '../src/api/order-api';
|
|
6
|
+
import * as dotenv from 'dotenv';
|
|
7
|
+
|
|
8
|
+
dotenv.config();
|
|
9
|
+
|
|
10
|
+
const BASE_URL = process.env['BASE_URL'] || 'https://mainnet.zklighter.elliot.ai';
|
|
11
|
+
|
|
12
|
+
async function getMarketData(marketId: number, orderApi: OrderApi): Promise<any> {
|
|
13
|
+
try {
|
|
14
|
+
const details = await orderApi.getOrderBookDetails({ market_id: marketId, depth: 1 }) as any;
|
|
15
|
+
|
|
16
|
+
if (details.order_book_details && details.order_book_details.length > 0) {
|
|
17
|
+
const marketInfo = details.order_book_details[0];
|
|
18
|
+
return {
|
|
19
|
+
market_id: marketId,
|
|
20
|
+
symbol: marketInfo.symbol,
|
|
21
|
+
price: marketInfo.last_trade_price,
|
|
22
|
+
volume_24h: parseFloat(marketInfo.daily_quote_token_volume),
|
|
23
|
+
trades_24h: marketInfo.daily_trades_count,
|
|
24
|
+
price_change_24h: marketInfo.daily_price_change,
|
|
25
|
+
min_size: marketInfo.min_base_amount,
|
|
26
|
+
status: marketInfo.status
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
} catch (error) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function main(): Promise<void> {
|
|
37
|
+
const client = new ApiClient({ host: BASE_URL });
|
|
38
|
+
const orderApi = new OrderApi(client);
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
console.log('🔍 Fetching all market data...\n');
|
|
42
|
+
|
|
43
|
+
const markets: any = {};
|
|
44
|
+
|
|
45
|
+
// Get market data for IDs 0-50
|
|
46
|
+
for (let marketId = 0; marketId <= 50; marketId++) {
|
|
47
|
+
const marketData = await getMarketData(marketId, orderApi);
|
|
48
|
+
|
|
49
|
+
if (marketData) {
|
|
50
|
+
markets[marketData.symbol] = {
|
|
51
|
+
market_id: marketData.market_id,
|
|
52
|
+
price: marketData.price,
|
|
53
|
+
volume_24h: marketData.volume_24h,
|
|
54
|
+
trades_24h: marketData.trades_24h,
|
|
55
|
+
price_change_24h: marketData.price_change_24h,
|
|
56
|
+
min_size: marketData.min_size,
|
|
57
|
+
status: marketData.status
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Output as JSON
|
|
63
|
+
console.log('📊 Market Data JSON:');
|
|
64
|
+
console.log(JSON.stringify(markets, null, 2));
|
|
65
|
+
|
|
66
|
+
// Also save to file
|
|
67
|
+
const fs = require('fs');
|
|
68
|
+
fs.writeFileSync('examples/market_data.json', JSON.stringify(markets, null, 2));
|
|
69
|
+
console.log('\n💾 Market data saved to market_data.json');
|
|
70
|
+
|
|
71
|
+
} catch (error: any) {
|
|
72
|
+
console.error('❌ Error:', error.message);
|
|
73
|
+
} finally {
|
|
74
|
+
await client.close();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (require.main === module) {
|
|
79
|
+
main().catch(console.error);
|
|
80
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Example showing how to wait for transaction confirmation
|
|
2
|
+
// This demonstrates waiting for a transaction hash to be confirmed before proceeding
|
|
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['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('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
|
+
console.log('🚀 Creating an order and waiting for transaction confirmation...\n');
|
|
38
|
+
|
|
39
|
+
// Create a market order (more likely to succeed)
|
|
40
|
+
const [tx, txHash, createErr] = await client.createMarketOrder({
|
|
41
|
+
marketIndex: 0, // ETH/USDC
|
|
42
|
+
clientOrderIndex: Date.now(),
|
|
43
|
+
baseAmount: 1000000, // 0.001 ETH
|
|
44
|
+
avgExecutionPrice: 400000000, // $4000 max price
|
|
45
|
+
isAsk: true, // Sell order
|
|
46
|
+
reduceOnly: false,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
if (createErr) {
|
|
50
|
+
console.error('❌ Order creation failed:', createErr);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
console.log('📝 Order created successfully!');
|
|
55
|
+
console.log(` Order Index: ${tx.ClientOrderIndex}`);
|
|
56
|
+
console.log(` Transaction Hash: ${txHash}`);
|
|
57
|
+
console.log(` Market Index: ${tx.MarketIndex}`);
|
|
58
|
+
console.log(` Amount: ${tx.BaseAmount}`);
|
|
59
|
+
console.log(` Price: $${tx.Price / 100000}\n`);
|
|
60
|
+
|
|
61
|
+
// Wait for transaction confirmation
|
|
62
|
+
if (txHash) {
|
|
63
|
+
console.log('⏳ Waiting for transaction confirmation...');
|
|
64
|
+
try {
|
|
65
|
+
const confirmedTx = await client.waitForTransaction(txHash, 60000, 2000);
|
|
66
|
+
|
|
67
|
+
console.log('\n✅ Transaction confirmed!');
|
|
68
|
+
console.log(` Hash: ${confirmedTx.hash}`);
|
|
69
|
+
console.log(` Status: ${confirmedTx.status}`);
|
|
70
|
+
console.log(` Block Height: ${confirmedTx.block_height}`);
|
|
71
|
+
console.log(` Type: ${confirmedTx.type}`);
|
|
72
|
+
console.log(` Created At: ${confirmedTx.created_at}`);
|
|
73
|
+
|
|
74
|
+
} catch (waitError) {
|
|
75
|
+
console.error('❌ Failed to wait for transaction confirmation:', waitError);
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
console.log('⚠️ No transaction hash returned, cannot wait for confirmation');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Wait for order confirmation (this is a placeholder - would need order book checking)
|
|
82
|
+
console.log('\n⏳ Waiting for order to appear in order book...');
|
|
83
|
+
const orderConfirmed = await client.waitForOrderConfirmation(
|
|
84
|
+
tx.MarketIndex,
|
|
85
|
+
tx.ClientOrderIndex,
|
|
86
|
+
30000, // 30 seconds max wait
|
|
87
|
+
1000 // 1 second polling interval
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
if (orderConfirmed) {
|
|
91
|
+
console.log('✅ Order confirmed in order book!');
|
|
92
|
+
} else {
|
|
93
|
+
console.log('⚠️ Order confirmation timeout or not found');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
await client.close();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (require.main === module) {
|
|
100
|
+
main().catch(console.error);
|
|
101
|
+
}
|
package/examples/ws.ts
CHANGED
|
@@ -1,24 +1,64 @@
|
|
|
1
|
-
import { WsClient } from '../src/api/ws-client';
|
|
2
|
-
import * as dotenv from 'dotenv';
|
|
3
|
-
|
|
4
|
-
dotenv.config();
|
|
5
|
-
|
|
6
|
-
const BASE_URL = process.env['BASE_URL'] || '
|
|
7
|
-
|
|
8
|
-
function
|
|
9
|
-
console.log(
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function
|
|
13
|
-
console.
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
import { WsClient } from '../src/api/ws-client';
|
|
2
|
+
import * as dotenv from 'dotenv';
|
|
3
|
+
|
|
4
|
+
dotenv.config();
|
|
5
|
+
|
|
6
|
+
const BASE_URL = process.env['BASE_URL'] || 'wss://mainnet.zklighter.elliot.ai';
|
|
7
|
+
|
|
8
|
+
function onMessage(data: any): void {
|
|
9
|
+
console.log('WebSocket message received:', JSON.stringify(data, null, 2));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function onError(error: Error): void {
|
|
13
|
+
console.error('WebSocket error:', error);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function onOpen(): void {
|
|
17
|
+
console.log('WebSocket connected');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function onClose(): void {
|
|
21
|
+
console.log('WebSocket disconnected');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function main(): Promise<void> {
|
|
25
|
+
const client = new WsClient({
|
|
26
|
+
url: BASE_URL.replace('https://', 'wss://'),
|
|
27
|
+
onMessage,
|
|
28
|
+
onError,
|
|
29
|
+
onOpen,
|
|
30
|
+
onClose,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
await client.connect();
|
|
35
|
+
|
|
36
|
+
// Subscribe to order book updates for market 0
|
|
37
|
+
client.subscribe({
|
|
38
|
+
channel: 'orderbook',
|
|
39
|
+
params: { marketIndex: 0 }
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Subscribe to account updates for account 1
|
|
43
|
+
client.subscribe({
|
|
44
|
+
channel: 'account',
|
|
45
|
+
params: { accountIndex: 1 }
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Keep the connection alive
|
|
49
|
+
console.log('WebSocket client running. Press Ctrl+C to exit.');
|
|
50
|
+
|
|
51
|
+
// Keep the process alive
|
|
52
|
+
process.on('SIGINT', () => {
|
|
53
|
+
console.log('\nShutting down...');
|
|
54
|
+
client.disconnect();
|
|
55
|
+
process.exit(0);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.error('Failed to connect:', error);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
main();
|
package/examples/ws_async.ts
CHANGED
|
@@ -1,39 +1,40 @@
|
|
|
1
|
-
import { WsClient } from '../src/api/ws-client';
|
|
2
|
-
import * as dotenv from 'dotenv';
|
|
3
|
-
|
|
4
|
-
dotenv.config();
|
|
5
|
-
|
|
6
|
-
const BASE_URL = process.env['BASE_URL'] || 'https://mainnet.zklighter.elliot.ai';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
client.subscribe({ channel: 'orderbook', params: { market_id:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
client.subscribe({ channel: 'account', params: { account_index:
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
1
|
+
import { WsClient } from '../src/api/ws-client';
|
|
2
|
+
import * as dotenv from 'dotenv';
|
|
3
|
+
|
|
4
|
+
dotenv.config();
|
|
5
|
+
|
|
6
|
+
const BASE_URL = process.env['BASE_URL'] || 'https://mainnet.zklighter.elliot.ai';
|
|
7
|
+
|
|
8
|
+
// Unused functions - keeping for reference
|
|
9
|
+
// function onOrderBookUpdate(marketId: number, orderBook: any): void {
|
|
10
|
+
// console.log(`Order book ${marketId}:`, JSON.stringify(orderBook, null, 2));
|
|
11
|
+
// }
|
|
12
|
+
|
|
13
|
+
// function onAccountUpdate(accountId: number, account: any): void {
|
|
14
|
+
// console.log(`Account ${accountId}:`, JSON.stringify(account, null, 2));
|
|
15
|
+
// }
|
|
16
|
+
|
|
17
|
+
async function main() {
|
|
18
|
+
const client = new WsClient({
|
|
19
|
+
url: BASE_URL,
|
|
20
|
+
onOpen: () => console.log('WebSocket connected'),
|
|
21
|
+
onMessage: (message) => {
|
|
22
|
+
console.log('Received message:', message);
|
|
23
|
+
// Handle different message types here
|
|
24
|
+
},
|
|
25
|
+
onClose: () => console.log('WebSocket closed'),
|
|
26
|
+
onError: (error) => console.error('WebSocket error:', error)
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
await client.connect();
|
|
30
|
+
|
|
31
|
+
// Subscribe to order book updates
|
|
32
|
+
client.subscribe({ channel: 'orderbook', params: { market_id: 0 } });
|
|
33
|
+
client.subscribe({ channel: 'orderbook', params: { market_id: 1 } });
|
|
34
|
+
|
|
35
|
+
// Subscribe to account updates
|
|
36
|
+
client.subscribe({ channel: 'account', params: { account_index: 1 } });
|
|
37
|
+
client.subscribe({ channel: 'account', params: { account_index: 2 } });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
main().catch(console.error);
|
package/package.json
CHANGED
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "lighter-ts-sdk",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "TypeScript SDK for Lighter Protocol Unofficial - Trade perpetuals with unmatched efficiency and fairness",
|
|
5
|
-
"type": "commonjs",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
8
|
-
"files": [
|
|
9
|
-
"dist",
|
|
10
|
-
"wasm",
|
|
11
|
-
"examples",
|
|
12
|
-
"docs",
|
|
13
|
-
"README.md"
|
|
14
|
-
],
|
|
15
|
-
"scripts": {
|
|
16
|
-
"build": "tsc",
|
|
17
|
-
"build:wasm": "cd temp-lighter-go && go build -o ../wasm/lighter-signer.wasm -target wasm ./wasm",
|
|
18
|
-
"build:wasm:nodejs": "cd temp-lighter-go && GOOS=js GOARCH=wasm go build -o ../wasm/lighter-signer.wasm ./wasm",
|
|
19
|
-
"dev": "tsc --watch",
|
|
20
|
-
"test": "jest",
|
|
21
|
-
"lint": "eslint src/**/*.ts",
|
|
22
|
-
"lint:fix": "eslint src/**/*.ts --fix",
|
|
23
|
-
"docs": "typedoc src --out docs/api",
|
|
24
|
-
"examples": "ts-node examples/get_info.ts"
|
|
25
|
-
},
|
|
26
|
-
"keywords": [
|
|
27
|
-
"lighter",
|
|
28
|
-
"protocol",
|
|
29
|
-
"typescript",
|
|
30
|
-
"sdk",
|
|
31
|
-
"defi",
|
|
32
|
-
"perpetual",
|
|
33
|
-
"exchange",
|
|
34
|
-
"
|
|
35
|
-
"wasm"
|
|
36
|
-
],
|
|
37
|
-
"author": "Community Contributor",
|
|
38
|
-
"license": "MIT",
|
|
39
|
-
"repository": {
|
|
40
|
-
"type": "git",
|
|
41
|
-
"url": "https://github.com/bvvvp009/lighter-ts
|
|
42
|
-
},
|
|
43
|
-
"bugs": {
|
|
44
|
-
"url": "https://github.com/bvvvp009/lighter-ts
|
|
45
|
-
},
|
|
46
|
-
"homepage": "https://lighter
|
|
47
|
-
"dependencies": {
|
|
48
|
-
"axios": "^1.6.0",
|
|
49
|
-
"dotenv": "^17.2.0",
|
|
50
|
-
"ethers": "^6.8.0",
|
|
51
|
-
"ws": "^8.14.0"
|
|
52
|
-
},
|
|
53
|
-
"devDependencies": {
|
|
54
|
-
"@types/node": "^20.0.0",
|
|
55
|
-
"@types/ws": "^8.5.0",
|
|
56
|
-
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
57
|
-
"@typescript-eslint/parser": "^6.0.0",
|
|
58
|
-
"eslint": "^8.0.0",
|
|
59
|
-
"jest": "^29.0.0",
|
|
60
|
-
"ts-jest": "^29.0.0",
|
|
61
|
-
"ts-node": "^10.9.0",
|
|
62
|
-
"typedoc": "^0.25.0",
|
|
63
|
-
"typescript": "^5.0.0"
|
|
64
|
-
},
|
|
65
|
-
"peerDependencies": {
|
|
66
|
-
"typescript": ">=4.5.0"
|
|
67
|
-
},
|
|
68
|
-
"engines": {
|
|
69
|
-
"node": ">=16.0.0"
|
|
70
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "lighter-ts-sdk",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "TypeScript SDK for Lighter Protocol Unofficial - Trade perpetuals with unmatched efficiency and fairness on Lighter ",
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"wasm",
|
|
11
|
+
"examples",
|
|
12
|
+
"docs",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"build:wasm": "cd temp-lighter-go && go build -o ../wasm/lighter-signer.wasm -target wasm ./wasm",
|
|
18
|
+
"build:wasm:nodejs": "cd temp-lighter-go && GOOS=js GOARCH=wasm go build -o ../wasm/lighter-signer.wasm ./wasm",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"test": "jest",
|
|
21
|
+
"lint": "eslint src/**/*.ts",
|
|
22
|
+
"lint:fix": "eslint src/**/*.ts --fix",
|
|
23
|
+
"docs": "typedoc src --out docs/api",
|
|
24
|
+
"examples": "ts-node examples/get_info.ts"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"lighter",
|
|
28
|
+
"protocol",
|
|
29
|
+
"typescript",
|
|
30
|
+
"sdk",
|
|
31
|
+
"defi",
|
|
32
|
+
"perpetual",
|
|
33
|
+
"exchange",
|
|
34
|
+
"zkwasm",
|
|
35
|
+
"wasm"
|
|
36
|
+
],
|
|
37
|
+
"author": "Community Contributor",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "https://github.com/bvvvp009/lighter-ts.git"
|
|
42
|
+
},
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/bvvvp009/lighter-ts/issues"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/bvvvp009/lighter-ts#readme",
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"axios": "^1.6.0",
|
|
49
|
+
"dotenv": "^17.2.0",
|
|
50
|
+
"ethers": "^6.8.0",
|
|
51
|
+
"ws": "^8.14.0"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@types/node": "^20.0.0",
|
|
55
|
+
"@types/ws": "^8.5.0",
|
|
56
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
57
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
58
|
+
"eslint": "^8.0.0",
|
|
59
|
+
"jest": "^29.0.0",
|
|
60
|
+
"ts-jest": "^29.0.0",
|
|
61
|
+
"ts-node": "^10.9.0",
|
|
62
|
+
"typedoc": "^0.25.0",
|
|
63
|
+
"typescript": "^5.0.0"
|
|
64
|
+
},
|
|
65
|
+
"peerDependencies": {
|
|
66
|
+
"typescript": ">=4.5.0"
|
|
67
|
+
},
|
|
68
|
+
"engines": {
|
|
69
|
+
"node": ">=16.0.0"
|
|
70
|
+
}
|
|
71
71
|
}
|
package/dist/utils/signer.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export interface LighterSigner {
|
|
2
|
-
signTransaction(transaction: any): Promise<string>;
|
|
3
|
-
getPublicKey(): string;
|
|
4
|
-
}
|
|
5
|
-
export declare class LighterSignerImpl implements LighterSigner {
|
|
6
|
-
private privateKey;
|
|
7
|
-
private publicKey;
|
|
8
|
-
constructor(privateKeyHex: string);
|
|
9
|
-
signTransaction(transaction: any): Promise<string>;
|
|
10
|
-
getPublicKey(): string;
|
|
11
|
-
private serializeTransaction;
|
|
12
|
-
private hashMessage;
|
|
13
|
-
}
|
|
14
|
-
export declare function createLighterSigner(privateKeyHex: string): LighterSigner;
|
|
15
|
-
//# sourceMappingURL=signer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/utils/signer.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,YAAY,IAAI,MAAM,CAAC;CACxB;AAED,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAS;gBAEd,aAAa,EAAE,MAAM;IAU3B,eAAe,CAAC,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAcxD,YAAY,IAAI,MAAM;IAItB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,WAAW;CA2BpB;AAGD,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,CAExE"}
|
package/dist/utils/signer.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.LighterSignerImpl = void 0;
|
|
4
|
-
exports.createLighterSigner = createLighterSigner;
|
|
5
|
-
const poseidon_goldilocks_lite_1 = require("poseidon-goldilocks-lite");
|
|
6
|
-
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
7
|
-
const utils_1 = require("@noble/curves/abstract/utils");
|
|
8
|
-
class LighterSignerImpl {
|
|
9
|
-
constructor(privateKeyHex) {
|
|
10
|
-
// Remove 0x prefix if present
|
|
11
|
-
const cleanKey = privateKeyHex.startsWith('0x') ? privateKeyHex.slice(2) : privateKeyHex;
|
|
12
|
-
this.privateKey = (0, utils_1.hexToBytes)(cleanKey);
|
|
13
|
-
// Generate public key from private key
|
|
14
|
-
const pubKeyPoint = secp256k1_1.schnorr.getPublicKey(this.privateKey);
|
|
15
|
-
this.publicKey = (0, utils_1.bytesToHex)(pubKeyPoint);
|
|
16
|
-
}
|
|
17
|
-
async signTransaction(transaction) {
|
|
18
|
-
// 1. Serialize transaction to canonical JSON
|
|
19
|
-
const txString = this.serializeTransaction(transaction);
|
|
20
|
-
// 2. Hash the transaction using Poseidon-Goldilocks
|
|
21
|
-
const messageHash = this.hashMessage(txString);
|
|
22
|
-
// 3. Sign the hash using Schnorr
|
|
23
|
-
const signature = await secp256k1_1.schnorr.sign(messageHash, this.privateKey);
|
|
24
|
-
// 4. Return signature as hex string
|
|
25
|
-
return (0, utils_1.bytesToHex)(signature);
|
|
26
|
-
}
|
|
27
|
-
getPublicKey() {
|
|
28
|
-
return this.publicKey;
|
|
29
|
-
}
|
|
30
|
-
serializeTransaction(transaction) {
|
|
31
|
-
// Sort keys to ensure canonical order
|
|
32
|
-
const sortedKeys = Object.keys(transaction).sort();
|
|
33
|
-
const canonicalTx = {};
|
|
34
|
-
for (const key of sortedKeys) {
|
|
35
|
-
canonicalTx[key] = transaction[key];
|
|
36
|
-
}
|
|
37
|
-
// Convert to JSON with no extra whitespace
|
|
38
|
-
return JSON.stringify(canonicalTx);
|
|
39
|
-
}
|
|
40
|
-
hashMessage(message) {
|
|
41
|
-
// Convert message string to bytes
|
|
42
|
-
const messageBytes = new TextEncoder().encode(message);
|
|
43
|
-
// Convert bytes to hex string for poseidon-goldilocks
|
|
44
|
-
const messageHex = (0, utils_1.bytesToHex)(messageBytes);
|
|
45
|
-
// Use Poseidon-Goldilocks to hash the message
|
|
46
|
-
// Convert hex to hash input format
|
|
47
|
-
const hashInput = (0, poseidon_goldilocks_lite_1.hexToHashOut)(messageHex);
|
|
48
|
-
const hashOutput = (0, poseidon_goldilocks_lite_1.hashNoPad)([...hashInput]); // Spread IHashOut to bigint[]
|
|
49
|
-
// Convert hash output (IHashOut) to bytes
|
|
50
|
-
// IHashOut is [bigint, bigint, bigint, bigint]
|
|
51
|
-
const hashBytes = new Uint8Array(32); // 4 * 8 bytes = 32 bytes
|
|
52
|
-
let offset = 0;
|
|
53
|
-
for (const bigintValue of hashOutput) {
|
|
54
|
-
const valueBytes = new Uint8Array(8);
|
|
55
|
-
const view = new DataView(valueBytes.buffer);
|
|
56
|
-
view.setBigUint64(0, bigintValue, true); // little-endian
|
|
57
|
-
hashBytes.set(valueBytes, offset);
|
|
58
|
-
offset += 8;
|
|
59
|
-
}
|
|
60
|
-
return hashBytes;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
exports.LighterSignerImpl = LighterSignerImpl;
|
|
64
|
-
// Factory function to create a signer
|
|
65
|
-
function createLighterSigner(privateKeyHex) {
|
|
66
|
-
return new LighterSignerImpl(privateKeyHex);
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=signer.js.map
|
package/dist/utils/signer.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/utils/signer.ts"],"names":[],"mappings":"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"}
|