@lifi/perps-sdk-provider-lighter 9.0.0 → 11.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 (69) hide show
  1. package/dist/cjs/LighterProvider.d.ts +0 -1
  2. package/dist/cjs/LighterProvider.d.ts.map +1 -1
  3. package/dist/cjs/LighterProvider.js +14 -6
  4. package/dist/cjs/LighterProvider.js.map +1 -1
  5. package/dist/cjs/signers/LighterSigner.d.ts.map +1 -1
  6. package/dist/cjs/signers/LighterSigner.js +25 -5
  7. package/dist/cjs/signers/LighterSigner.js.map +1 -1
  8. package/dist/cjs/types/account.d.ts +4 -1
  9. package/dist/cjs/types/account.d.ts.map +1 -1
  10. package/dist/cjs/types/action.d.ts +4 -1
  11. package/dist/cjs/types/action.d.ts.map +1 -1
  12. package/dist/cjs/types/action.js.map +1 -1
  13. package/dist/cjs/utils/assetCollateral.d.ts +2 -1
  14. package/dist/cjs/utils/assetCollateral.d.ts.map +1 -1
  15. package/dist/cjs/utils/assetCollateral.js +1 -1
  16. package/dist/cjs/utils/assetCollateral.js.map +1 -1
  17. package/dist/cjs/utils/index.d.ts +1 -0
  18. package/dist/cjs/utils/index.d.ts.map +1 -1
  19. package/dist/cjs/utils/index.js +3 -1
  20. package/dist/cjs/utils/index.js.map +1 -1
  21. package/dist/cjs/utils/withdrawableBalances.d.ts +4 -0
  22. package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -0
  23. package/dist/cjs/utils/withdrawableBalances.js +21 -0
  24. package/dist/cjs/utils/withdrawableBalances.js.map +1 -0
  25. package/dist/esm/LighterProvider.d.ts +0 -7
  26. package/dist/esm/LighterProvider.d.ts.map +1 -1
  27. package/dist/esm/LighterProvider.js +26 -9
  28. package/dist/esm/LighterProvider.js.map +1 -1
  29. package/dist/esm/signers/LighterSigner.d.ts.map +1 -1
  30. package/dist/esm/signers/LighterSigner.js +25 -11
  31. package/dist/esm/signers/LighterSigner.js.map +1 -1
  32. package/dist/esm/types/account.d.ts +17 -6
  33. package/dist/esm/types/account.d.ts.map +1 -1
  34. package/dist/esm/types/action.d.ts +14 -2
  35. package/dist/esm/types/action.d.ts.map +1 -1
  36. package/dist/esm/types/action.js.map +1 -1
  37. package/dist/esm/utils/assetCollateral.d.ts +3 -2
  38. package/dist/esm/utils/assetCollateral.d.ts.map +1 -1
  39. package/dist/esm/utils/assetCollateral.js +5 -5
  40. package/dist/esm/utils/assetCollateral.js.map +1 -1
  41. package/dist/esm/utils/index.d.ts +1 -0
  42. package/dist/esm/utils/index.d.ts.map +1 -1
  43. package/dist/esm/utils/index.js +1 -0
  44. package/dist/esm/utils/index.js.map +1 -1
  45. package/dist/esm/utils/withdrawableBalances.d.ts +12 -0
  46. package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -0
  47. package/dist/esm/utils/withdrawableBalances.js +25 -0
  48. package/dist/esm/utils/withdrawableBalances.js.map +1 -0
  49. package/dist/types/LighterProvider.d.ts +0 -7
  50. package/dist/types/LighterProvider.d.ts.map +1 -1
  51. package/dist/types/signers/LighterSigner.d.ts.map +1 -1
  52. package/dist/types/types/account.d.ts +17 -6
  53. package/dist/types/types/account.d.ts.map +1 -1
  54. package/dist/types/types/action.d.ts +14 -2
  55. package/dist/types/types/action.d.ts.map +1 -1
  56. package/dist/types/utils/assetCollateral.d.ts +3 -2
  57. package/dist/types/utils/assetCollateral.d.ts.map +1 -1
  58. package/dist/types/utils/index.d.ts +1 -0
  59. package/dist/types/utils/index.d.ts.map +1 -1
  60. package/dist/types/utils/withdrawableBalances.d.ts +12 -0
  61. package/dist/types/utils/withdrawableBalances.d.ts.map +1 -0
  62. package/package.json +3 -3
  63. package/src/LighterProvider.ts +38 -17
  64. package/src/signers/LighterSigner.ts +32 -15
  65. package/src/types/account.ts +18 -6
  66. package/src/types/action.ts +14 -2
  67. package/src/utils/assetCollateral.ts +8 -6
  68. package/src/utils/index.ts +1 -0
  69. package/src/utils/withdrawableBalances.ts +31 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdrawableBalances.js","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,MAAwB,EACO,EAAE;IACjC,MAAM,IAAI,GAAkC,EAAE,CAAA;IAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,KAAK,CACxD,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CACtD,CAAA;QACD,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;QACnE,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -42,13 +42,6 @@ export interface LighterProviderOptions {
42
42
  tokenLifetimeSeconds?: number;
43
43
  /** Re-create when the cached standard token's remaining life is below this. Default 60s. */
44
44
  tokenRenewBufferSeconds?: number;
45
- /**
46
- * LI.FI's Lighter referral code — the code `getAccount` compares the account's
47
- * applied referral against to populate `LighterAccountConfig.referralPresent`.
48
- * Must match the backend's configured `LIGHTER_REFERRAL_CODE`; when omitted,
49
- * `referralPresent` is always `false` (the SDK has nothing to compare against).
50
- */
51
- referralCode?: string;
52
45
  }
53
46
  /**
54
47
  * Lighter provider plugin extended with a public `resolveAuthToken` so the
@@ -1 +1 @@
1
- {"version":3,"file":"LighterProvider.d.ts","sourceRoot":"","sources":["../../src/LighterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,mBAAmB,EAgBxB,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAA;AA4BxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAGnC,OAAO,EAUL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAA;AAsGvB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IACrD,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,4FAA4F;IAC5F,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAQD;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAChE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,YAAY,iBAAiB,EAC7B,UAAS,sBAA2B,KACnC,oBA+kCF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAS,sBAA2B,KACnC,oBACyD,CAAA;AAE5D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAS,sBAA2B,KACnC,oBAA6E,CAAA;AAEhF;;;;GAIG;AACH,eAAO,MAAM,OAAO,aA7BT,sBAAsB,KAC9B,oBA4BmC,CAAA"}
1
+ {"version":3,"file":"LighterProvider.d.ts","sourceRoot":"","sources":["../../src/LighterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,mBAAmB,EAkBxB,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAA;AA4BxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAGnC,OAAO,EAUL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAA;AAuGvB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IACrD,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,4FAA4F;IAC5F,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC;AAQD;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAChE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,YAAY,iBAAiB,EAC7B,UAAS,sBAA2B,KACnC,oBAwmCF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAS,sBAA2B,KACnC,oBACyD,CAAA;AAE5D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAS,sBAA2B,KACnC,oBAA6E,CAAA;AAEhF;;;;GAIG;AACH,eAAO,MAAM,OAAO,aA7BT,sBAAsB,KAC9B,oBA4BmC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"LighterSigner.d.ts","sourceRoot":"","sources":["../../../src/signers/LighterSigner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAc9C;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,CAAA;IACxB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAA;IACnB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,sFAAsF;IACtF,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,qHAAqH;IACrH,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AA+BD;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;IAC7C,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;gBAE1C,MAAM,EAAE,mBAAmB;IAMvC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;IAY3C;;;;;;;;;OASG;IACG,IAAI,CACR,MAAM,EAAE,UAAU,EAClB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,iBAAiB,CAAC;IAmB7B;;;;;;;;;;;OAWG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,CAAC,GAAG,CAAK,GACnB,OAAO,CAAC,kBAAkB,CAAC;IAsC9B;;;;;;;OAOG;IACG,qBAAqB,CACzB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,uBAAuB,CAAC;IA8BnC;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAa7D;;;OAGG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC;YAiBJ,YAAY;YAOZ,YAAY;IAmB1B;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;CA+MjB"}
1
+ {"version":3,"file":"LighterSigner.d.ts","sourceRoot":"","sources":["../../../src/signers/LighterSigner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAe9C;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,CAAA;IACxB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAA;IACnB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,sFAAsF;IACtF,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,qHAAqH;IACrH,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AA2BD;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;IAC7C,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;gBAE1C,MAAM,EAAE,mBAAmB;IAMvC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;IAY3C;;;;;;;;;OASG;IACG,IAAI,CACR,MAAM,EAAE,UAAU,EAClB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,iBAAiB,CAAC;IAmB7B;;;;;;;;;;;OAWG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,CAAC,GAAG,CAAK,GACnB,OAAO,CAAC,kBAAkB,CAAC;IAsC9B;;;;;;;OAOG;IACG,qBAAqB,CACzB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,uBAAuB,CAAC;IA8BnC;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAa7D;;;OAGG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC;YAiBJ,YAAY;YAOZ,YAAY;IAmB1B;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;CA+NjB"}
@@ -29,24 +29,35 @@ export type LtAccountPosition = {
29
29
  total_discount: string;
30
30
  };
31
31
  /**
32
- * Collateral asset row returned in a Lighter account response. `balance` and
33
- * `locked_balance` are decimal strings in the asset's native precision.
34
- * `margin_mode`, when present, is Lighter's cross-margin flag: `0` disables
35
- * margin use for the asset and `1` enables it.
32
+ * Cross-margin collateral flag Lighter reports on an account asset row.
33
+ *
34
+ * @public
35
+ */
36
+ export type LtAssetMarginMode = 'enabled' | 'disabled';
37
+ /**
38
+ * Held asset row returned in a Lighter account response. The two balances are
39
+ * the asset's two withdrawal routes: `balance` is the spot route
40
+ * (`AssetRouteType_Spot`) and `margin_balance` the perps route
41
+ * (`AssetRouteType_Perps`). All amounts are decimal strings.
36
42
  *
37
43
  * @public
38
44
  */
39
45
  export type LtAccountAsset = {
40
46
  symbol: string;
41
47
  asset_id: number;
48
+ /** Spot-route balance, `locked_balance` included. */
42
49
  balance: string;
50
+ /** Portion of `balance` reserved by pending activity and not withdrawable. */
43
51
  locked_balance: string;
52
+ /** Perps-route balance — the asset's collateral leg. */
53
+ margin_balance: string;
54
+ /** Collateral weighting Lighter applies to the asset, as a decimal factor. */
55
+ multiplier: string;
44
56
  /**
45
- * Cross-margin collateral flag: 0 = MarginDisabled, 1 = MarginEnabled.
46
57
  * Lighter surfaces it via `additional_properties`, so it may be absent —
47
58
  * chiefly outside Unified Trading Account mode.
48
59
  */
49
- margin_mode?: number;
60
+ margin_mode?: LtAssetMarginMode;
50
61
  };
51
62
  /**
52
63
  * Account-position row from `/api/v1/account`. Identical shape to
@@ -1 +1 @@
1
- {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/types/account.ts"],"names":[],"mappings":"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"}
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": "11.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.1"
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,
@@ -209,13 +212,6 @@ export interface LighterProviderOptions {
209
212
  tokenLifetimeSeconds?: number
210
213
  /** Re-create when the cached standard token's remaining life is below this. Default 60s. */
211
214
  tokenRenewBufferSeconds?: number
212
- /**
213
- * LI.FI's Lighter referral code — the code `getAccount` compares the account's
214
- * applied referral against to populate `LighterAccountConfig.referralPresent`.
215
- * Must match the backend's configured `LIGHTER_REFERRAL_CODE`; when omitted,
216
- * `referralPresent` is always `false` (the SDK has nothing to compare against).
217
- */
218
- referralCode?: string
219
215
  }
220
216
 
221
217
  interface CachedStandardToken {
@@ -293,7 +289,6 @@ export const createLighterProvider = (
293
289
  })
294
290
  const tokenLifetimeSeconds = options.tokenLifetimeSeconds ?? 60 * 60
295
291
  const tokenRenewBufferSeconds = options.tokenRenewBufferSeconds ?? 60
296
- const referralCode = options.referralCode
297
292
  const standardTokenByAddress: Map<string, CachedStandardToken> = new Map()
298
293
  // Single-flight + backoff for lazy read-only token creation. Without these,
299
294
  // concurrent reads on first load all race `tokens/create`, and any sustained
@@ -681,6 +676,9 @@ export const createLighterProvider = (
681
676
 
682
677
  const registry = getMarketRegistry(requireClient(), providerKey)
683
678
  const assetRegistry = getAssetRegistry(requireClient(), providerKey)
679
+ // Shared promise: the referral read below awaits this instance's runtime
680
+ // metadata off the same `/providers` fetch — no second request.
681
+ const providersPromise = getProviders(requireClient())
684
682
  const [
685
683
  { providers },
686
684
  ,
@@ -691,7 +689,7 @@ export const createLighterProvider = (
691
689
  storedReadOnlyToken,
692
690
  appliedReferralCode,
693
691
  ] = await Promise.all([
694
- getProviders(requireClient()),
692
+ providersPromise,
695
693
  registry.sync(),
696
694
  assetRegistry.sync(),
697
695
  fetchRegisteredApiKey(client, account.index, DEFAULT_API_KEY_INDEX),
@@ -705,12 +703,21 @@ export const createLighterProvider = (
705
703
  ),
706
704
  keyStore.get(params.address),
707
705
  readOnlyTokenManager.get(params.address, account.index),
708
- // No referral code to compare against, or no token to authenticate the
709
- // read → undefined → `referralPresent: false`.
710
- !referralCode || token === undefined
706
+ // The expected code is backend-owned runtime metadata on this
707
+ // instance's own provider descriptor (keyed by `providerKey`, so the
708
+ // RH instance never compares against mainnet attribution). Metadata
709
+ // without a code, or no token to authenticate the read → undefined →
710
+ // `referralPresent: false`. The read stays SDK-direct: the token only
711
+ // ever goes to Lighter, never to the LI.FI backend.
712
+ token === undefined
711
713
  ? Promise.resolve(undefined)
712
- : retryOnRevoked(opts, params.address, token, (t) =>
713
- fetchAppliedReferralCode(client, params.address, t)
714
+ : providersPromise.then((response) =>
715
+ response.providers.find((p) => p.key === providerKey)
716
+ ?.referralCode
717
+ ? retryOnRevoked(opts, params.address, token, (t) =>
718
+ fetchAppliedReferralCode(client, params.address, t)
719
+ )
720
+ : undefined
714
721
  ),
715
722
  ])
716
723
 
@@ -736,8 +743,8 @@ export const createLighterProvider = (
736
743
  0
737
744
  )
738
745
 
739
- const categories =
740
- providers.find((p) => p.key === providerKey)?.categories ?? []
746
+ const instanceMeta = providers.find((p) => p.key === providerKey)
747
+ const categories = instanceMeta?.categories ?? []
741
748
  const perpsCategory = categories.find((c) => c.quoteAsset !== null)
742
749
  const spotCategoryId =
743
750
  categories.find((c) => c.quoteAsset === null)?.id ??
@@ -808,9 +815,12 @@ export const createLighterProvider = (
808
815
  readOnlyTokenApproved: storedReadOnlyToken !== undefined,
809
816
  readOnlyTokenExpiry: storedReadOnlyToken?.expiry,
810
817
  readOnlyTokenScope: storedReadOnlyToken?.scope,
818
+ // True only when the authenticated `used_code` equals the backend-owned
819
+ // code for this instance; `appliedReferralCode` is only ever fetched
820
+ // when that code exists.
811
821
  referralPresent:
812
822
  appliedReferralCode !== undefined &&
813
- appliedReferralCode === referralCode,
823
+ appliedReferralCode === instanceMeta?.referralCode,
814
824
  }
815
825
 
816
826
  return {
@@ -846,6 +856,17 @@ export const createLighterProvider = (
846
856
  )
847
857
  },
848
858
 
859
+ async getWithdrawableBalances(
860
+ params: ProviderGetWithdrawableBalancesParams,
861
+ opts?: SDKRequestOptions
862
+ ): Promise<ProviderWithdrawableBalance[]> {
863
+ const account = await fetchDetailedAccount(
864
+ apiClient(opts),
865
+ params.address
866
+ )
867
+ return lighterWithdrawableBalances(account.assets)
868
+ },
869
+
849
870
  async getPositions(
850
871
  params: ProviderGetPositionsParams,
851
872
  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
+ }