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.
Files changed (89) hide show
  1. package/README.md +62 -49
  2. package/dist/api/transaction-api.d.ts +5 -1
  3. package/dist/api/transaction-api.d.ts.map +1 -1
  4. package/dist/api/transaction-api.js.map +1 -1
  5. package/dist/api/ws-order-client.d.ts +82 -0
  6. package/dist/api/ws-order-client.d.ts.map +1 -0
  7. package/dist/api/ws-order-client.js +281 -0
  8. package/dist/api/ws-order-client.js.map +1 -0
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/signer/signer-client.d.ts.map +1 -1
  12. package/dist/signer/signer-client.js +5 -3
  13. package/dist/signer/signer-client.js.map +1 -1
  14. package/dist/signer/wasm-signer-client.d.ts +104 -10
  15. package/dist/signer/wasm-signer-client.d.ts.map +1 -1
  16. package/dist/signer/wasm-signer-client.js +643 -356
  17. package/dist/signer/wasm-signer-client.js.map +1 -1
  18. package/dist/utils/advanced-cache.d.ts +66 -0
  19. package/dist/utils/advanced-cache.d.ts.map +1 -0
  20. package/dist/utils/advanced-cache.js +204 -0
  21. package/dist/utils/advanced-cache.js.map +1 -0
  22. package/dist/utils/exceptions.d.ts +24 -0
  23. package/dist/utils/exceptions.d.ts.map +1 -1
  24. package/dist/utils/exceptions.js +48 -1
  25. package/dist/utils/exceptions.js.map +1 -1
  26. package/dist/utils/logger.d.ts +35 -0
  27. package/dist/utils/logger.d.ts.map +1 -0
  28. package/dist/utils/logger.js +96 -0
  29. package/dist/utils/logger.js.map +1 -0
  30. package/dist/utils/memory-pool.d.ts +98 -0
  31. package/dist/utils/memory-pool.d.ts.map +1 -0
  32. package/dist/utils/memory-pool.js +190 -0
  33. package/dist/utils/memory-pool.js.map +1 -0
  34. package/dist/utils/node-wasm-signer.d.ts +8 -0
  35. package/dist/utils/node-wasm-signer.d.ts.map +1 -1
  36. package/dist/utils/node-wasm-signer.js +84 -29
  37. package/dist/utils/node-wasm-signer.js.map +1 -1
  38. package/dist/utils/nonce-cache.d.ts +29 -0
  39. package/dist/utils/nonce-cache.d.ts.map +1 -0
  40. package/dist/utils/nonce-cache.js +111 -0
  41. package/dist/utils/nonce-cache.js.map +1 -0
  42. package/dist/utils/optimized-http-client.d.ts +29 -0
  43. package/dist/utils/optimized-http-client.d.ts.map +1 -0
  44. package/dist/utils/optimized-http-client.js +142 -0
  45. package/dist/utils/optimized-http-client.js.map +1 -0
  46. package/dist/utils/performance-monitor.d.ts +41 -0
  47. package/dist/utils/performance-monitor.d.ts.map +1 -0
  48. package/dist/utils/performance-monitor.js +183 -0
  49. package/dist/utils/performance-monitor.js.map +1 -0
  50. package/dist/utils/request-batcher.d.ts +45 -0
  51. package/dist/utils/request-batcher.d.ts.map +1 -0
  52. package/dist/utils/request-batcher.js +177 -0
  53. package/dist/utils/request-batcher.js.map +1 -0
  54. package/dist/utils/wasm-manager.d.ts +30 -0
  55. package/dist/utils/wasm-manager.d.ts.map +1 -0
  56. package/dist/utils/wasm-manager.js +115 -0
  57. package/dist/utils/wasm-manager.js.map +1 -0
  58. package/docs/AccountApi.md +1 -1
  59. package/docs/GettingStarted.md +8 -8
  60. package/docs/OrderApi.md +1 -1
  61. package/docs/SignerClient.md +1 -1
  62. package/docs/TransactionApi.md +1 -1
  63. package/docs/WsClient.md +1 -1
  64. package/docs/types/Account.md +1 -1
  65. package/docs/types/ApiKeyPair.md +1 -1
  66. package/docs/types/CreateOrderParams.md +1 -1
  67. package/docs/types/MarketOrderParams.md +1 -1
  68. package/docs/types/SignerConfig.md +1 -1
  69. package/docs/types/WasmSignerConfig.md +1 -1
  70. package/examples/README.md +1 -1
  71. package/examples/account_info.ts +5 -2
  72. package/examples/cancel_all_orders.ts +77 -0
  73. package/examples/close_all_positions.ts +69 -0
  74. package/examples/create_cancel_order.ts +48 -8
  75. package/examples/create_market_order.ts +42 -1
  76. package/examples/create_market_order_if_slippage.ts +69 -0
  77. package/examples/create_market_order_max_slippage.ts +43 -43
  78. package/examples/create_sl_tp.ts +114 -29
  79. package/examples/create_with_multiple_keys.ts +77 -58
  80. package/examples/get_info.ts +1 -1
  81. package/examples/market_data_json.ts +80 -0
  82. package/examples/wait_for_transaction.ts +101 -0
  83. package/examples/ws.ts +64 -24
  84. package/examples/ws_async.ts +40 -39
  85. package/package.json +70 -70
  86. package/dist/utils/signer.d.ts +0 -15
  87. package/dist/utils/signer.d.ts.map +0 -1
  88. package/dist/utils/signer.js +0 -68
  89. 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'] || 'https://mainnet.zklighter.elliot.ai';
7
-
8
- function onOrderBookUpdate(marketId: number, orderBook: any): void {
9
- console.log(`Order book ${marketId}:`, JSON.stringify(orderBook, null, 2));
10
- }
11
-
12
- function onAccountUpdate(accountId: number, account: any): void {
13
- console.log(`Account ${accountId}:`, JSON.stringify(account, null, 2));
14
- }
15
-
16
- const client = new WsClient({
17
- url: BASE_URL,
18
- orderBookIds: [0, 1],
19
- accountIds: [1, 2],
20
- onOrderBookUpdate,
21
- onAccountUpdate,
22
- });
23
-
24
- client.run();
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();
@@ -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
- function onOrderBookUpdate(marketId: number, orderBook: any): void {
9
- console.log(`Order book ${marketId}:`, JSON.stringify(orderBook, null, 2));
10
- }
11
-
12
- function onAccountUpdate(accountId: number, account: any): void {
13
- console.log(`Account ${accountId}:`, JSON.stringify(account, null, 2));
14
- }
15
-
16
- async function main() {
17
- const client = new WsClient({
18
- url: BASE_URL,
19
- onOpen: () => console.log('WebSocket connected'),
20
- onMessage: (message) => {
21
- console.log('Received message:', message);
22
- // Handle different message types here
23
- },
24
- onClose: () => console.log('WebSocket closed'),
25
- onError: (error) => console.error('WebSocket error:', error)
26
- });
27
-
28
- await client.connect();
29
-
30
- // Subscribe to order book updates
31
- client.subscribe({ channel: 'orderbook', params: { market_id: 0 } });
32
- client.subscribe({ channel: 'orderbook', params: { market_id: 1 } });
33
-
34
- // Subscribe to account updates
35
- client.subscribe({ channel: 'account', params: { account_index: 1 } });
36
- client.subscribe({ channel: 'account', params: { account_index: 2 } });
37
- }
38
-
39
- main().catch(console.error);
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.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
- "zksync",
35
- "wasm"
36
- ],
37
- "author": "Community Contributor",
38
- "license": "MIT",
39
- "repository": {
40
- "type": "git",
41
- "url": "https://github.com/bvvvp009/lighter-ts-sdk.git"
42
- },
43
- "bugs": {
44
- "url": "https://github.com/bvvvp009/lighter-ts-sdk/issues"
45
- },
46
- "homepage": "https://lighter.xyz",
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
  }
@@ -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"}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/utils/signer.ts"],"names":[],"mappings":"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"}