@lifi/perps-sdk-provider-lighter 8.2.1 → 10.0.0

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 (145) hide show
  1. package/README.md +14 -10
  2. package/dist/cjs/LighterProvider.d.ts +5 -10
  3. package/dist/cjs/LighterProvider.d.ts.map +1 -1
  4. package/dist/cjs/LighterProvider.js +31 -26
  5. package/dist/cjs/LighterProvider.js.map +1 -1
  6. package/dist/cjs/constants.d.ts +5 -8
  7. package/dist/cjs/constants.d.ts.map +1 -1
  8. package/dist/cjs/constants.js +15 -12
  9. package/dist/cjs/constants.js.map +1 -1
  10. package/dist/cjs/index.d.ts +3 -4
  11. package/dist/cjs/index.d.ts.map +1 -1
  12. package/dist/cjs/index.js +6 -5
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/signers/LighterSigner.d.ts +5 -7
  15. package/dist/cjs/signers/LighterSigner.d.ts.map +1 -1
  16. package/dist/cjs/signers/LighterSigner.js +30 -17
  17. package/dist/cjs/signers/LighterSigner.js.map +1 -1
  18. package/dist/cjs/signers/generated/wasmExecRuntime.d.ts +2 -0
  19. package/dist/cjs/signers/generated/wasmExecRuntime.d.ts.map +1 -0
  20. package/dist/cjs/signers/generated/wasmExecRuntime.js +569 -0
  21. package/dist/cjs/signers/generated/wasmExecRuntime.js.map +1 -0
  22. package/dist/cjs/signers/signActions.d.ts +2 -2
  23. package/dist/cjs/signers/signActions.d.ts.map +1 -1
  24. package/dist/cjs/signers/signActions.js +4 -10
  25. package/dist/cjs/signers/signActions.js.map +1 -1
  26. package/dist/cjs/signers/wasmBinaryUrl.js +11 -0
  27. package/dist/cjs/signers/wasmLoader.d.ts +1 -6
  28. package/dist/cjs/signers/wasmLoader.d.ts.map +1 -1
  29. package/dist/cjs/signers/wasmLoader.js +15 -69
  30. package/dist/cjs/signers/wasmLoader.js.map +1 -1
  31. package/dist/cjs/types/account.d.ts +4 -1
  32. package/dist/cjs/types/account.d.ts.map +1 -1
  33. package/dist/cjs/types/action.d.ts +4 -1
  34. package/dist/cjs/types/action.d.ts.map +1 -1
  35. package/dist/cjs/types/action.js.map +1 -1
  36. package/dist/cjs/utils/assetCollateral.d.ts +2 -1
  37. package/dist/cjs/utils/assetCollateral.d.ts.map +1 -1
  38. package/dist/cjs/utils/assetCollateral.js +1 -1
  39. package/dist/cjs/utils/assetCollateral.js.map +1 -1
  40. package/dist/cjs/utils/index.d.ts +1 -0
  41. package/dist/cjs/utils/index.d.ts.map +1 -1
  42. package/dist/cjs/utils/index.js +3 -1
  43. package/dist/cjs/utils/index.js.map +1 -1
  44. package/dist/cjs/utils/withdrawableBalances.d.ts +4 -0
  45. package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -0
  46. package/dist/cjs/utils/withdrawableBalances.js +21 -0
  47. package/dist/cjs/utils/withdrawableBalances.js.map +1 -0
  48. package/dist/esm/LighterProvider.d.ts +53 -56
  49. package/dist/esm/LighterProvider.d.ts.map +1 -1
  50. package/dist/esm/LighterProvider.js +74 -49
  51. package/dist/esm/LighterProvider.js.map +1 -1
  52. package/dist/esm/constants.d.ts +25 -36
  53. package/dist/esm/constants.d.ts.map +1 -1
  54. package/dist/esm/constants.js +31 -18
  55. package/dist/esm/constants.js.map +1 -1
  56. package/dist/esm/index.d.ts +6 -7
  57. package/dist/esm/index.d.ts.map +1 -1
  58. package/dist/esm/index.js +5 -6
  59. package/dist/esm/index.js.map +1 -1
  60. package/dist/esm/signers/LighterSigner.d.ts +10 -18
  61. package/dist/esm/signers/LighterSigner.d.ts.map +1 -1
  62. package/dist/esm/signers/LighterSigner.js +32 -25
  63. package/dist/esm/signers/LighterSigner.js.map +1 -1
  64. package/dist/esm/signers/generated/wasmExecRuntime.d.ts +8 -0
  65. package/dist/esm/signers/generated/wasmExecRuntime.d.ts.map +1 -0
  66. package/dist/esm/signers/generated/wasmExecRuntime.js +574 -0
  67. package/dist/esm/signers/generated/wasmExecRuntime.js.map +1 -0
  68. package/dist/esm/signers/signActions.d.ts +3 -5
  69. package/dist/esm/signers/signActions.d.ts.map +1 -1
  70. package/dist/esm/signers/signActions.js +4 -10
  71. package/dist/esm/signers/signActions.js.map +1 -1
  72. package/dist/esm/signers/wasmBinaryUrl.js +10 -0
  73. package/dist/esm/signers/wasmLoader.d.ts +7 -31
  74. package/dist/esm/signers/wasmLoader.d.ts.map +1 -1
  75. package/dist/esm/signers/wasmLoader.js +32 -108
  76. package/dist/esm/signers/wasmLoader.js.map +1 -1
  77. package/dist/esm/types/account.d.ts +17 -6
  78. package/dist/esm/types/account.d.ts.map +1 -1
  79. package/dist/esm/types/action.d.ts +14 -2
  80. package/dist/esm/types/action.d.ts.map +1 -1
  81. package/dist/esm/types/action.js.map +1 -1
  82. package/dist/esm/utils/assetCollateral.d.ts +3 -2
  83. package/dist/esm/utils/assetCollateral.d.ts.map +1 -1
  84. package/dist/esm/utils/assetCollateral.js +5 -5
  85. package/dist/esm/utils/assetCollateral.js.map +1 -1
  86. package/dist/esm/utils/index.d.ts +1 -0
  87. package/dist/esm/utils/index.d.ts.map +1 -1
  88. package/dist/esm/utils/index.js +1 -0
  89. package/dist/esm/utils/index.js.map +1 -1
  90. package/dist/esm/utils/withdrawableBalances.d.ts +12 -0
  91. package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -0
  92. package/dist/esm/utils/withdrawableBalances.js +25 -0
  93. package/dist/esm/utils/withdrawableBalances.js.map +1 -0
  94. package/dist/types/LighterProvider.d.ts +53 -56
  95. package/dist/types/LighterProvider.d.ts.map +1 -1
  96. package/dist/types/constants.d.ts +25 -36
  97. package/dist/types/constants.d.ts.map +1 -1
  98. package/dist/types/index.d.ts +6 -7
  99. package/dist/types/index.d.ts.map +1 -1
  100. package/dist/types/signers/LighterSigner.d.ts +10 -18
  101. package/dist/types/signers/LighterSigner.d.ts.map +1 -1
  102. package/dist/types/signers/generated/wasmExecRuntime.d.ts +8 -0
  103. package/dist/types/signers/generated/wasmExecRuntime.d.ts.map +1 -0
  104. package/dist/types/signers/signActions.d.ts +3 -5
  105. package/dist/types/signers/signActions.d.ts.map +1 -1
  106. package/dist/types/signers/wasmLoader.d.ts +7 -31
  107. package/dist/types/signers/wasmLoader.d.ts.map +1 -1
  108. package/dist/types/types/account.d.ts +17 -6
  109. package/dist/types/types/account.d.ts.map +1 -1
  110. package/dist/types/types/action.d.ts +14 -2
  111. package/dist/types/types/action.d.ts.map +1 -1
  112. package/dist/types/utils/assetCollateral.d.ts +3 -2
  113. package/dist/types/utils/assetCollateral.d.ts.map +1 -1
  114. package/dist/types/utils/index.d.ts +1 -0
  115. package/dist/types/utils/index.d.ts.map +1 -1
  116. package/dist/types/utils/withdrawableBalances.d.ts +12 -0
  117. package/dist/types/utils/withdrawableBalances.d.ts.map +1 -0
  118. package/package.json +3 -6
  119. package/src/LighterProvider.ts +112 -101
  120. package/src/constants.ts +35 -45
  121. package/src/index.ts +13 -10
  122. package/src/signers/LighterSigner.ts +47 -51
  123. package/src/signers/generated/wasmExecRuntime.ts +575 -0
  124. package/src/signers/signActions.ts +12 -30
  125. package/src/signers/wasmBinaryUrl.d.ts +7 -0
  126. package/src/signers/wasmLoader.ts +33 -152
  127. package/src/types/account.ts +18 -6
  128. package/src/types/action.ts +14 -2
  129. package/src/utils/assetCollateral.ts +8 -6
  130. package/src/utils/index.ts +1 -0
  131. package/src/utils/withdrawableBalances.ts +31 -0
  132. package/dist/cjs/signers/index.d.ts +0 -11
  133. package/dist/cjs/signers/index.d.ts.map +0 -1
  134. package/dist/cjs/signers/index.js +0 -18
  135. package/dist/cjs/signers/index.js.map +0 -1
  136. package/dist/esm/signers/index.d.ts +0 -11
  137. package/dist/esm/signers/index.d.ts.map +0 -1
  138. package/dist/esm/signers/index.js +0 -7
  139. package/dist/esm/signers/index.js.map +0 -1
  140. package/dist/types/signers/index.d.ts +0 -11
  141. package/dist/types/signers/index.d.ts.map +0 -1
  142. package/dist/wasm/wasm_exec.js +0 -561
  143. package/src/signers/index.ts +0 -35
  144. package/wasm/lighter-signer.wasm +0 -0
  145. package/wasm/wasm_exec.js +0 -561
@@ -1,17 +1,10 @@
1
+ import { scaleToInteger } from '@lifi/perps-sdk'
1
2
  import { ActionType } from '@lifi/perps-types'
2
- import {
3
- DEFAULT_LIGHTER_REST_URL,
4
- DEFAULT_LIGHTER_SIGNER_CHAIN_ID,
5
- } from '../constants.js'
6
- import {
7
- LT_ASSET_ID_USDC,
8
- LT_ROUTE_PERP,
9
- LT_ROUTE_SPOT,
10
- } from '../types/action.js'
3
+ import Big from 'big.js'
4
+ import { LT_ROUTE_PERP, LT_ROUTE_SPOT } from '../types/action.js'
11
5
  import { assetMarginModeInt } from '../utils/assetCollateral.js'
12
6
  import {
13
7
  type LighterWasmExports,
14
- type LoadLighterWasmOptions,
15
8
  loadLighterWasm,
16
9
  type SignResult,
17
10
  } from './wasmLoader.js'
@@ -38,22 +31,16 @@ export interface LighterSignerContext {
38
31
  }
39
32
 
40
33
  /**
41
- * Configuration for {@link LighterSigner}: optional WASM asset overrides plus
42
- * the per-instance REST base URL, signing chain id and collateral asset index.
34
+ * Deployment facts {@link LighterSigner} signs against: the venue's REST base
35
+ * URL, its zkLighter L2 signing chain id, and the L2 asset index its
36
+ * withdrawals and transfers settle in.
43
37
  *
44
- * @public
38
+ * @internal
45
39
  */
46
- export interface LighterSignerConfig extends LoadLighterWasmOptions {
47
- /** Lighter REST API base URL. */
48
- apiUrl?: string
49
- /** Lighter chain ID (304 = mainnet). */
50
- chainId?: number
51
- /**
52
- * L2 asset index this instance's withdrawals and transfers are signed
53
- * against — pass the instance's `collateral.assetIndex`. Defaults to
54
- * mainnet's USDC slot.
55
- */
56
- collateralAssetIndex?: number
40
+ export interface LighterSignerConfig {
41
+ apiUrl: string
42
+ signerChainId: number
43
+ collateralAssetIndex: number
57
44
  }
58
45
 
59
46
  /**
@@ -114,10 +101,6 @@ const SKIP_NONCE_DISABLED = 0
114
101
  // CancelAll across every market (lighter-go `NilMarketIndex`); a real index
115
102
  // scopes the cancel to a single market.
116
103
  const NIL_MARKET_INDEX = 255
117
- // Collateral withdrawals and transfers ride the perps route (lighter-go
118
- // `AssetRouteType_Perps`). The signer rejects an asset index < 1.
119
- const ASSET_ROUTE_TYPE_PERPS = 0
120
-
121
104
  // SEND_ASSET is a same-account route→route collateral move (spot↔perp): no
122
105
  // fee, and no memo. `SignTransfer` requires a 32-byte memo, so we pass 32 zero
123
106
  // bytes in the `0x`-prefixed 64-hex form the WASM signer decodes.
@@ -136,25 +119,19 @@ const LIGHTER_ROUTE_BY_DEX: Record<string, number> = {
136
119
  * hybrid flows. The instance memoizes WASM initialization and registered
137
120
  * `(apiKeyIndex, accountIndex)` clients.
138
121
  *
139
- * @public
122
+ * @internal
140
123
  */
141
124
  export class LighterSigner {
142
125
  private readonly apiUrl: string
143
126
  private readonly chainId: number
144
127
  private readonly collateralAssetIndex: number
145
- private readonly loaderOptions: LoadLighterWasmOptions
146
128
  private wasm: LighterWasmExports | undefined
147
129
  private readonly registeredClients = new Set<string>()
148
130
 
149
- constructor(config: LighterSignerConfig = {}) {
150
- this.apiUrl = config.apiUrl ?? DEFAULT_LIGHTER_REST_URL
151
- this.chainId = config.chainId ?? DEFAULT_LIGHTER_SIGNER_CHAIN_ID
152
- this.collateralAssetIndex = config.collateralAssetIndex ?? LT_ASSET_ID_USDC
153
- this.loaderOptions = {
154
- wasmBinaryUrl: config.wasmBinaryUrl,
155
- wasmExecJsUrl: config.wasmExecJsUrl,
156
- wasmExecJsSource: config.wasmExecJsSource,
157
- }
131
+ constructor(config: LighterSignerConfig) {
132
+ this.apiUrl = config.apiUrl
133
+ this.chainId = config.signerChainId
134
+ this.collateralAssetIndex = config.collateralAssetIndex
158
135
  }
159
136
 
160
137
  /**
@@ -163,7 +140,7 @@ export class LighterSigner {
163
140
  */
164
141
  async initialize(): Promise<void> {
165
142
  if (!this.wasm) {
166
- this.wasm = await loadLighterWasm(this.loaderOptions)
143
+ this.wasm = await loadLighterWasm()
167
144
  }
168
145
  }
169
146
 
@@ -504,29 +481,45 @@ export class LighterSigner {
504
481
  ctx.apiKeyIndex,
505
482
  ctx.accountIndex
506
483
  )
507
- case ActionType.WITHDRAWAL:
484
+ case ActionType.WITHDRAWAL: {
485
+ const routeType = numberField(p, 'route_type')
486
+ if (routeType !== LT_ROUTE_PERP && routeType !== LT_ROUTE_SPOT) {
487
+ throw new Error(
488
+ `Lighter WITHDRAWAL route_type ${routeType} is invalid: expected ` +
489
+ `${LT_ROUTE_PERP} (perps) or ${LT_ROUTE_SPOT} (spot)`
490
+ )
491
+ }
492
+ const symbol = stringField(p, 'symbol')
493
+ const amount = stringField(p, 'amount')
494
+ const minimum = stringField(p, 'min_withdrawal_amount')
495
+ if (new Big(amount).lt(new Big(minimum))) {
496
+ throw new Error(
497
+ `Lighter WITHDRAWAL of ${amount} ${symbol} is below the venue ` +
498
+ `minimum of ${minimum} ${symbol}`
499
+ )
500
+ }
508
501
  return wasm.SignWithdraw(
509
- this.collateralAssetIndex,
510
- ASSET_ROUTE_TYPE_PERPS,
511
- numberField(p, 'amount'),
502
+ numberField(p, 'asset_index'),
503
+ routeType,
504
+ scaleToInteger(amount, numberField(p, 'decimals'), 'truncate'),
512
505
  SKIP_NONCE_DISABLED,
513
506
  nonce,
514
507
  ctx.apiKeyIndex,
515
508
  ctx.accountIndex
516
509
  )
510
+ }
517
511
  case ActionType.TRANSFER:
518
512
  // SignTransfer's positional args follow the Go binding order:
519
513
  // `toAccountIndex, assetIndex, fromRouteType, toRouteType, amount,
520
514
  // usdcFee, memo, skipNonce, nonce, apiKeyIndex, accountIndex`. `memo`
521
- // is copied directly into a `[32]byte`, so the backend MUST send a JS
522
- // string whose UTF-8 byte length is exactly 32 (in practice: 32 ASCII
523
- // characters) — anything else fails with "memo expected to be 32 bytes
524
- // long".
515
+ // is decoded as a 66-char `0x`-prefixed hex string, a bare 64-char hex
516
+ // string, or 32 raw bytes — anything else fails with "memo expected to
517
+ // be 32 bytes or 64 hex encoded or 66 if 0x hex encoded".
525
518
  return wasm.SignTransfer(
526
519
  numberField(p, 'to_account'),
527
520
  this.collateralAssetIndex,
528
- ASSET_ROUTE_TYPE_PERPS,
529
- ASSET_ROUTE_TYPE_PERPS,
521
+ LT_ROUTE_PERP,
522
+ LT_ROUTE_PERP,
530
523
  numberField(p, 'usdc_amount'),
531
524
  numberField(p, 'fee'),
532
525
  stringField(p, 'memo'),
@@ -669,7 +662,10 @@ function routeFromDex(dex: string): number {
669
662
 
670
663
  function stringField(p: Record<string, unknown>, key: string): string {
671
664
  const v = p[key]
672
- if (typeof v === 'string' && v !== '') {
665
+ if (v === '') {
666
+ throw new Error(`Lighter sign params string field '${key}' is empty`)
667
+ }
668
+ if (typeof v === 'string') {
673
669
  return v
674
670
  }
675
671
  throw new Error(