@lifi/perps-sdk-provider-lighter 9.0.0 → 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 (66) hide show
  1. package/dist/cjs/LighterProvider.d.ts.map +1 -1
  2. package/dist/cjs/LighterProvider.js +4 -0
  3. package/dist/cjs/LighterProvider.js.map +1 -1
  4. package/dist/cjs/signers/LighterSigner.d.ts.map +1 -1
  5. package/dist/cjs/signers/LighterSigner.js +25 -5
  6. package/dist/cjs/signers/LighterSigner.js.map +1 -1
  7. package/dist/cjs/types/account.d.ts +4 -1
  8. package/dist/cjs/types/account.d.ts.map +1 -1
  9. package/dist/cjs/types/action.d.ts +4 -1
  10. package/dist/cjs/types/action.d.ts.map +1 -1
  11. package/dist/cjs/types/action.js.map +1 -1
  12. package/dist/cjs/utils/assetCollateral.d.ts +2 -1
  13. package/dist/cjs/utils/assetCollateral.d.ts.map +1 -1
  14. package/dist/cjs/utils/assetCollateral.js +1 -1
  15. package/dist/cjs/utils/assetCollateral.js.map +1 -1
  16. package/dist/cjs/utils/index.d.ts +1 -0
  17. package/dist/cjs/utils/index.d.ts.map +1 -1
  18. package/dist/cjs/utils/index.js +3 -1
  19. package/dist/cjs/utils/index.js.map +1 -1
  20. package/dist/cjs/utils/withdrawableBalances.d.ts +4 -0
  21. package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -0
  22. package/dist/cjs/utils/withdrawableBalances.js +21 -0
  23. package/dist/cjs/utils/withdrawableBalances.js.map +1 -0
  24. package/dist/esm/LighterProvider.d.ts.map +1 -1
  25. package/dist/esm/LighterProvider.js +5 -1
  26. package/dist/esm/LighterProvider.js.map +1 -1
  27. package/dist/esm/signers/LighterSigner.d.ts.map +1 -1
  28. package/dist/esm/signers/LighterSigner.js +25 -11
  29. package/dist/esm/signers/LighterSigner.js.map +1 -1
  30. package/dist/esm/types/account.d.ts +17 -6
  31. package/dist/esm/types/account.d.ts.map +1 -1
  32. package/dist/esm/types/action.d.ts +14 -2
  33. package/dist/esm/types/action.d.ts.map +1 -1
  34. package/dist/esm/types/action.js.map +1 -1
  35. package/dist/esm/utils/assetCollateral.d.ts +3 -2
  36. package/dist/esm/utils/assetCollateral.d.ts.map +1 -1
  37. package/dist/esm/utils/assetCollateral.js +5 -5
  38. package/dist/esm/utils/assetCollateral.js.map +1 -1
  39. package/dist/esm/utils/index.d.ts +1 -0
  40. package/dist/esm/utils/index.d.ts.map +1 -1
  41. package/dist/esm/utils/index.js +1 -0
  42. package/dist/esm/utils/index.js.map +1 -1
  43. package/dist/esm/utils/withdrawableBalances.d.ts +12 -0
  44. package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -0
  45. package/dist/esm/utils/withdrawableBalances.js +25 -0
  46. package/dist/esm/utils/withdrawableBalances.js.map +1 -0
  47. package/dist/types/LighterProvider.d.ts.map +1 -1
  48. package/dist/types/signers/LighterSigner.d.ts.map +1 -1
  49. package/dist/types/types/account.d.ts +17 -6
  50. package/dist/types/types/account.d.ts.map +1 -1
  51. package/dist/types/types/action.d.ts +14 -2
  52. package/dist/types/types/action.d.ts.map +1 -1
  53. package/dist/types/utils/assetCollateral.d.ts +3 -2
  54. package/dist/types/utils/assetCollateral.d.ts.map +1 -1
  55. package/dist/types/utils/index.d.ts +1 -0
  56. package/dist/types/utils/index.d.ts.map +1 -1
  57. package/dist/types/utils/withdrawableBalances.d.ts +12 -0
  58. package/dist/types/utils/withdrawableBalances.d.ts.map +1 -0
  59. package/package.json +3 -3
  60. package/src/LighterProvider.ts +14 -0
  61. package/src/signers/LighterSigner.ts +32 -15
  62. package/src/types/account.ts +18 -6
  63. package/src/types/action.ts +14 -2
  64. package/src/utils/assetCollateral.ts +8 -6
  65. package/src/utils/index.ts +1 -0
  66. package/src/utils/withdrawableBalances.ts +31 -0
@@ -1 +1 @@
1
- {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/types/account.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uBAAuB,EAAE,MAAM,CAAA;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,yBAAyB,EAAE,MAAM,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;CACvB,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG,iBAAiB,CAAA;AAEzD;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,mBAAmB,EAAE,MAAM,CAAA;IAC3B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,eAAe,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,0BAA0B,EAAE,MAAM,CAAA;IAClC,mBAAmB,EAAE,MAAM,CAAA;IAC3B,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,yBAAyB,EAAE,CAAA;IACtC,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;IACzB;+CAC2C;IAC3C,gCAAgC,EAAE,MAAM,CAAA;IACxC,oBAAoB,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAC9C;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,sBAAsB,EAAE,OAAO,CAAA;IAC/B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,0BAA0B,EAAE,MAAM,CAAA;IAClC,mBAAmB,EAAE,MAAM,CAAA;IAC3B,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,YAAY,EAAE,CAAA;CAC7B"}
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/types/account.ts"],"names":[],"mappings":"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"}
@@ -63,14 +63,26 @@ export type LtUpdateMarginWasmParams = {
63
63
  direction: number;
64
64
  };
65
65
  /**
66
- * Backend-provided params for SignWithdraw.
66
+ * Backend-provided params for SignWithdraw. The asset and route are the
67
+ * caller's selection, not a signer default, and the remaining fields are the
68
+ * venue metadata the signer needs to scale and bounds-check `amount` without
69
+ * an asset registry of its own.
67
70
  *
68
71
  * @public
69
72
  */
70
73
  export type LtWithdrawWasmParams = {
74
+ /** Lighter L2 `asset_id` being withdrawn. */
71
75
  asset_index: number;
76
+ /** {@link LT_ROUTE_PERP} or {@link LT_ROUTE_SPOT}; anything else is rejected. */
72
77
  route_type: number;
73
- amount: number;
78
+ /** Decimal amount in the asset's own units, unscaled. */
79
+ amount: string;
80
+ /** The asset's L2 precision — the exponent `amount` is scaled by. */
81
+ decimals: number;
82
+ /** Venue minimum for a single withdrawal, in the asset's own units. */
83
+ min_withdrawal_amount: string;
84
+ /** Asset symbol, named in a sub-minimum rejection. */
85
+ symbol: string;
74
86
  };
75
87
  /**
76
88
  * Backend-provided params for SignCancelAllOrders.
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/types/action.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/types/action.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
+ import type { LtAssetMarginMode } from '../types/account.js';
1
2
  /** Map the user-facing `enabled` flag to Lighter's `AssetMarginMode` wire int. */
2
3
  export declare function assetMarginModeInt(enabled: boolean): number;
3
- /** Decode Lighter's `margin_mode` int on an account asset back to `enabled`. */
4
- export declare function isAssetMarginEnabled(marginMode: number): boolean;
4
+ /** Decode Lighter's `margin_mode` on an account asset back to `enabled`. */
5
+ export declare function isAssetMarginEnabled(marginMode: LtAssetMarginMode): boolean;
5
6
  //# sourceMappingURL=assetCollateral.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assetCollateral.d.ts","sourceRoot":"","sources":["../../../src/utils/assetCollateral.ts"],"names":[],"mappings":"AAOA,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAE3D;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEhE"}
1
+ {"version":3,"file":"assetCollateral.d.ts","sourceRoot":"","sources":["../../../src/utils/assetCollateral.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAS5D,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAE3D;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAE3E"}
@@ -16,4 +16,5 @@ export { formatOrderPrice, formatOrderSize } from './orderFormatting.js';
16
16
  export { toIsoFromMs, toIsoFromSeconds } from './time.js';
17
17
  export { positionMarginConstraints } from './transferMargin.js';
18
18
  export { leverageToFraction, mapOrderTypeToInt, mapTimeInForceToInt, marginFractionToMaxLeverage, orderExpiryForTif, resolveTimeInForce, } from './wireEncoding.js';
19
+ export { lighterWithdrawableBalances } from './withdrawableBalances.js';
19
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,QAAQ,EACR,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,QAAQ,EACR,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { ProviderWithdrawableBalance } from '@lifi/perps-sdk';
2
+ import type { LtAccountAsset } from '../types/account.js';
3
+ /**
4
+ * Split each held asset into the two routes a Lighter withdrawal can name:
5
+ * spot draws on `balance` net of `locked_balance`, perps draws on
6
+ * `margin_balance`. Routes with nothing left to draw are dropped; the
7
+ * per-asset venue minimum is applied by the caller holding the asset registry.
8
+ *
9
+ * @public
10
+ */
11
+ export declare const lighterWithdrawableBalances: (assets: LtAccountAsset[]) => ProviderWithdrawableBalance[];
12
+ //# sourceMappingURL=withdrawableBalances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAGzD;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,GACtC,QAAQ,cAAc,EAAE,KACvB,2BAA2B,EAgB7B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/perps-sdk-provider-lighter",
3
- "version": "9.0.0",
3
+ "version": "10.0.0",
4
4
  "description": "Lighter provider plugin for @lifi/perps-sdk",
5
5
  "homepage": "https://github.com/lifinance/perps-sdk",
6
6
  "bugs": {
@@ -44,10 +44,10 @@
44
44
  "dependencies": {
45
45
  "big.js": "^7.0.1",
46
46
  "viem": "^2.48.8",
47
- "@lifi/perps-types": "^5.0.0"
47
+ "@lifi/perps-types": "^5.1.0"
48
48
  },
49
49
  "peerDependencies": {
50
- "@lifi/perps-sdk": "^6.2.1"
50
+ "@lifi/perps-sdk": "^6.3.0"
51
51
  },
52
52
  "publishConfig": {
53
53
  "access": "public"
@@ -18,6 +18,8 @@ import {
18
18
  type ProviderGetOrdersParams,
19
19
  type ProviderGetPositionsParams,
20
20
  type ProviderGetQuoteParams,
21
+ type ProviderGetWithdrawableBalancesParams,
22
+ type ProviderWithdrawableBalance,
21
23
  resolveQuote,
22
24
  resolveRetryPolicy,
23
25
  type SDKRequestOptions,
@@ -105,6 +107,7 @@ import {
105
107
  formatOrderSize,
106
108
  leverageFromImf,
107
109
  lighterAsset,
110
+ lighterWithdrawableBalances,
108
111
  mapFill,
109
112
  mapOpenPositions,
110
113
  mapOrderDetail,
@@ -846,6 +849,17 @@ export const createLighterProvider = (
846
849
  )
847
850
  },
848
851
 
852
+ async getWithdrawableBalances(
853
+ params: ProviderGetWithdrawableBalancesParams,
854
+ opts?: SDKRequestOptions
855
+ ): Promise<ProviderWithdrawableBalance[]> {
856
+ const account = await fetchDetailedAccount(
857
+ apiClient(opts),
858
+ params.address
859
+ )
860
+ return lighterWithdrawableBalances(account.assets)
861
+ },
862
+
849
863
  async getPositions(
850
864
  params: ProviderGetPositionsParams,
851
865
  opts?: SDKRequestOptions
@@ -1,4 +1,6 @@
1
+ import { scaleToInteger } from '@lifi/perps-sdk'
1
2
  import { ActionType } from '@lifi/perps-types'
3
+ import Big from 'big.js'
2
4
  import { LT_ROUTE_PERP, LT_ROUTE_SPOT } from '../types/action.js'
3
5
  import { assetMarginModeInt } from '../utils/assetCollateral.js'
4
6
  import {
@@ -99,10 +101,6 @@ const SKIP_NONCE_DISABLED = 0
99
101
  // CancelAll across every market (lighter-go `NilMarketIndex`); a real index
100
102
  // scopes the cancel to a single market.
101
103
  const NIL_MARKET_INDEX = 255
102
- // Collateral withdrawals and transfers ride the perps route (lighter-go
103
- // `AssetRouteType_Perps`). The signer rejects an asset index < 1.
104
- const ASSET_ROUTE_TYPE_PERPS = 0
105
-
106
104
  // SEND_ASSET is a same-account route→route collateral move (spot↔perp): no
107
105
  // fee, and no memo. `SignTransfer` requires a 32-byte memo, so we pass 32 zero
108
106
  // bytes in the `0x`-prefixed 64-hex form the WASM signer decodes.
@@ -483,29 +481,45 @@ export class LighterSigner {
483
481
  ctx.apiKeyIndex,
484
482
  ctx.accountIndex
485
483
  )
486
- 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
+ }
487
501
  return wasm.SignWithdraw(
488
- this.collateralAssetIndex,
489
- ASSET_ROUTE_TYPE_PERPS,
490
- numberField(p, 'amount'),
502
+ numberField(p, 'asset_index'),
503
+ routeType,
504
+ scaleToInteger(amount, numberField(p, 'decimals'), 'truncate'),
491
505
  SKIP_NONCE_DISABLED,
492
506
  nonce,
493
507
  ctx.apiKeyIndex,
494
508
  ctx.accountIndex
495
509
  )
510
+ }
496
511
  case ActionType.TRANSFER:
497
512
  // SignTransfer's positional args follow the Go binding order:
498
513
  // `toAccountIndex, assetIndex, fromRouteType, toRouteType, amount,
499
514
  // usdcFee, memo, skipNonce, nonce, apiKeyIndex, accountIndex`. `memo`
500
- // is copied directly into a `[32]byte`, so the backend MUST send a JS
501
- // string whose UTF-8 byte length is exactly 32 (in practice: 32 ASCII
502
- // characters) — anything else fails with "memo expected to be 32 bytes
503
- // 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".
504
518
  return wasm.SignTransfer(
505
519
  numberField(p, 'to_account'),
506
520
  this.collateralAssetIndex,
507
- ASSET_ROUTE_TYPE_PERPS,
508
- ASSET_ROUTE_TYPE_PERPS,
521
+ LT_ROUTE_PERP,
522
+ LT_ROUTE_PERP,
509
523
  numberField(p, 'usdc_amount'),
510
524
  numberField(p, 'fee'),
511
525
  stringField(p, 'memo'),
@@ -648,7 +662,10 @@ function routeFromDex(dex: string): number {
648
662
 
649
663
  function stringField(p: Record<string, unknown>, key: string): string {
650
664
  const v = p[key]
651
- 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') {
652
669
  return v
653
670
  }
654
671
  throw new Error(
@@ -33,24 +33,36 @@ export type LtAccountPosition = {
33
33
  }
34
34
 
35
35
  /**
36
- * Collateral asset row returned in a Lighter account response. `balance` and
37
- * `locked_balance` are decimal strings in the asset's native precision.
38
- * `margin_mode`, when present, is Lighter's cross-margin flag: `0` disables
39
- * margin use for the asset and `1` enables it.
36
+ * Cross-margin collateral flag Lighter reports on an account asset row.
37
+ *
38
+ * @public
39
+ */
40
+ export type LtAssetMarginMode = 'enabled' | 'disabled'
41
+
42
+ /**
43
+ * Held asset row returned in a Lighter account response. The two balances are
44
+ * the asset's two withdrawal routes: `balance` is the spot route
45
+ * (`AssetRouteType_Spot`) and `margin_balance` the perps route
46
+ * (`AssetRouteType_Perps`). All amounts are decimal strings.
40
47
  *
41
48
  * @public
42
49
  */
43
50
  export type LtAccountAsset = {
44
51
  symbol: string
45
52
  asset_id: number
53
+ /** Spot-route balance, `locked_balance` included. */
46
54
  balance: string
55
+ /** Portion of `balance` reserved by pending activity and not withdrawable. */
47
56
  locked_balance: string
57
+ /** Perps-route balance — the asset's collateral leg. */
58
+ margin_balance: string
59
+ /** Collateral weighting Lighter applies to the asset, as a decimal factor. */
60
+ multiplier: string
48
61
  /**
49
- * Cross-margin collateral flag: 0 = MarginDisabled, 1 = MarginEnabled.
50
62
  * Lighter surfaces it via `additional_properties`, so it may be absent —
51
63
  * chiefly outside Unified Trading Account mode.
52
64
  */
53
- margin_mode?: number
65
+ margin_mode?: LtAssetMarginMode
54
66
  }
55
67
 
56
68
  /**
@@ -72,14 +72,26 @@ export type LtUpdateMarginWasmParams = {
72
72
  }
73
73
 
74
74
  /**
75
- * Backend-provided params for SignWithdraw.
75
+ * Backend-provided params for SignWithdraw. The asset and route are the
76
+ * caller's selection, not a signer default, and the remaining fields are the
77
+ * venue metadata the signer needs to scale and bounds-check `amount` without
78
+ * an asset registry of its own.
76
79
  *
77
80
  * @public
78
81
  */
79
82
  export type LtWithdrawWasmParams = {
83
+ /** Lighter L2 `asset_id` being withdrawn. */
80
84
  asset_index: number
85
+ /** {@link LT_ROUTE_PERP} or {@link LT_ROUTE_SPOT}; anything else is rejected. */
81
86
  route_type: number
82
- amount: number
87
+ /** Decimal amount in the asset's own units, unscaled. */
88
+ amount: string
89
+ /** The asset's L2 precision — the exponent `amount` is scaled by. */
90
+ decimals: number
91
+ /** Venue minimum for a single withdrawal, in the asset's own units. */
92
+ min_withdrawal_amount: string
93
+ /** Asset symbol, named in a sub-minimum rejection. */
94
+ symbol: string
83
95
  }
84
96
 
85
97
  /**
@@ -1,7 +1,9 @@
1
+ import type { LtAssetMarginMode } from '../types/account.js'
2
+
1
3
  // Lighter's `AssetMarginMode` wire ints (lighter-go
2
- // `types/txtypes/update_account_asset_config.go`), used for both the write
3
- // direction (signing `L2UpdateAccountAssetConfigTx`, tx type 42) and decoding
4
- // an account asset's `margin_mode` on the read side.
4
+ // `types/txtypes/update_account_asset_config.go`), used to sign
5
+ // `L2UpdateAccountAssetConfigTx` (tx type 42). The read side is not symmetric:
6
+ // `/api/v1/account` reports the same flag as a string.
5
7
  const ASSET_MARGIN_DISABLED = 0
6
8
  const ASSET_MARGIN_ENABLED = 1
7
9
 
@@ -10,7 +12,7 @@ export function assetMarginModeInt(enabled: boolean): number {
10
12
  return enabled ? ASSET_MARGIN_ENABLED : ASSET_MARGIN_DISABLED
11
13
  }
12
14
 
13
- /** Decode Lighter's `margin_mode` int on an account asset back to `enabled`. */
14
- export function isAssetMarginEnabled(marginMode: number): boolean {
15
- return marginMode === ASSET_MARGIN_ENABLED
15
+ /** Decode Lighter's `margin_mode` on an account asset back to `enabled`. */
16
+ export function isAssetMarginEnabled(marginMode: LtAssetMarginMode): boolean {
17
+ return marginMode === 'enabled'
16
18
  }
@@ -38,3 +38,4 @@ export {
38
38
  orderExpiryForTif,
39
39
  resolveTimeInForce,
40
40
  } from './wireEncoding.js'
41
+ export { lighterWithdrawableBalances } from './withdrawableBalances.js'
@@ -0,0 +1,31 @@
1
+ import type { ProviderWithdrawableBalance } from '@lifi/perps-sdk'
2
+ import type { LtAccountAsset } from '../types/account.js'
3
+ import { toRequiredBig } from './decimal.js'
4
+
5
+ /**
6
+ * Split each held asset into the two routes a Lighter withdrawal can name:
7
+ * spot draws on `balance` net of `locked_balance`, perps draws on
8
+ * `margin_balance`. Routes with nothing left to draw are dropped; the
9
+ * per-asset venue minimum is applied by the caller holding the asset registry.
10
+ *
11
+ * @public
12
+ */
13
+ export const lighterWithdrawableBalances = (
14
+ assets: LtAccountAsset[]
15
+ ): ProviderWithdrawableBalance[] => {
16
+ const rows: ProviderWithdrawableBalance[] = []
17
+ for (const asset of assets) {
18
+ const assetId = String(asset.asset_id)
19
+ const spot = toRequiredBig(asset.balance, 'balance').minus(
20
+ toRequiredBig(asset.locked_balance, 'locked_balance')
21
+ )
22
+ if (spot.gt(0)) {
23
+ rows.push({ assetId, route: 'spot', available: spot.toFixed() })
24
+ }
25
+ const perps = toRequiredBig(asset.margin_balance, 'margin_balance')
26
+ if (perps.gt(0)) {
27
+ rows.push({ assetId, route: 'perps', available: perps.toFixed() })
28
+ }
29
+ }
30
+ return rows
31
+ }