@lifi/perps-sdk-provider-lighter 31.0.1 → 32.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 +10 -7
  3. package/dist/cjs/LighterProvider.js.map +1 -1
  4. package/dist/cjs/constants.d.ts.map +1 -1
  5. package/dist/cjs/constants.js.map +1 -1
  6. package/dist/cjs/signers/LighterSigner.js +1 -1
  7. package/dist/cjs/signers/LighterSigner.js.map +1 -1
  8. package/dist/cjs/utils/index.d.ts +1 -1
  9. package/dist/cjs/utils/index.d.ts.map +1 -1
  10. package/dist/cjs/utils/index.js +3 -3
  11. package/dist/cjs/utils/index.js.map +1 -1
  12. package/dist/cjs/utils/liquidation.js +1 -1
  13. package/dist/cjs/utils/liquidation.js.map +1 -1
  14. package/dist/cjs/utils/mapMarketContext.d.ts.map +1 -1
  15. package/dist/cjs/utils/mapMarketContext.js +12 -4
  16. package/dist/cjs/utils/mapMarketContext.js.map +1 -1
  17. package/dist/cjs/utils/orderFormatting.d.ts +3 -3
  18. package/dist/cjs/utils/orderFormatting.d.ts.map +1 -1
  19. package/dist/cjs/utils/orderFormatting.js +5 -5
  20. package/dist/cjs/utils/orderFormatting.js.map +1 -1
  21. package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
  22. package/dist/cjs/utils/withdrawableBalances.js +16 -5
  23. package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
  24. package/dist/esm/LighterProvider.d.ts.map +1 -1
  25. package/dist/esm/LighterProvider.js +13 -10
  26. package/dist/esm/LighterProvider.js.map +1 -1
  27. package/dist/esm/constants.d.ts +4 -2
  28. package/dist/esm/constants.d.ts.map +1 -1
  29. package/dist/esm/constants.js +4 -2
  30. package/dist/esm/constants.js.map +1 -1
  31. package/dist/esm/signers/LighterSigner.js +2 -2
  32. package/dist/esm/signers/LighterSigner.js.map +1 -1
  33. package/dist/esm/utils/index.d.ts +1 -1
  34. package/dist/esm/utils/index.d.ts.map +1 -1
  35. package/dist/esm/utils/index.js +1 -1
  36. package/dist/esm/utils/index.js.map +1 -1
  37. package/dist/esm/utils/liquidation.js +1 -1
  38. package/dist/esm/utils/liquidation.js.map +1 -1
  39. package/dist/esm/utils/mapMarketContext.d.ts.map +1 -1
  40. package/dist/esm/utils/mapMarketContext.js +18 -4
  41. package/dist/esm/utils/mapMarketContext.js.map +1 -1
  42. package/dist/esm/utils/orderFormatting.d.ts +11 -11
  43. package/dist/esm/utils/orderFormatting.d.ts.map +1 -1
  44. package/dist/esm/utils/orderFormatting.js +12 -12
  45. package/dist/esm/utils/orderFormatting.js.map +1 -1
  46. package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
  47. package/dist/esm/utils/withdrawableBalances.js +17 -6
  48. package/dist/esm/utils/withdrawableBalances.js.map +1 -1
  49. package/dist/types/LighterProvider.d.ts.map +1 -1
  50. package/dist/types/constants.d.ts +4 -2
  51. package/dist/types/constants.d.ts.map +1 -1
  52. package/dist/types/utils/index.d.ts +1 -1
  53. package/dist/types/utils/index.d.ts.map +1 -1
  54. package/dist/types/utils/mapMarketContext.d.ts.map +1 -1
  55. package/dist/types/utils/orderFormatting.d.ts +11 -11
  56. package/dist/types/utils/orderFormatting.d.ts.map +1 -1
  57. package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
  58. package/package.json +3 -3
  59. package/src/LighterProvider.ts +19 -19
  60. package/src/constants.ts +4 -2
  61. package/src/signers/LighterSigner.ts +2 -2
  62. package/src/utils/index.ts +1 -1
  63. package/src/utils/liquidation.ts +1 -1
  64. package/src/utils/mapMarketContext.ts +24 -4
  65. package/src/utils/orderFormatting.ts +22 -12
  66. package/src/utils/withdrawableBalances.ts +26 -11
@@ -1,40 +1,40 @@
1
1
  /**
2
- * Lighter order size and price formatting for exchange submission.
2
+ * Lighter order size and price snapping for exchange submission.
3
3
  *
4
4
  * Lighter publishes a flat per-market decimal budget on its order books
5
5
  * (`supported_price_decimals` / `supported_size_decimals`), surfaced on the
6
- * generic {@link Market} as `priceDecimals` / `szDecimals`. Prices round to
7
- * the tick grid; sizes truncate to the lot grid.
6
+ * generic {@link Market} as `priceDecimals` / `szDecimals`. Prices round onto
7
+ * the tick grid; sizes truncate onto the lot grid.
8
8
  */
9
9
  import { PerpsError } from '@lifi/perps-sdk';
10
- import { PerpsErrorCode } from '@lifi/perps-types';
10
+ import { PerpsErrorCode, } from '@lifi/perps-types';
11
11
  import Big from 'big.js';
12
12
  /**
13
- * Format a price onto a Lighter market's tick grid: rounded to the market's
14
- * `priceDecimals` (Lighter's `supported_price_decimals`), trailing zeros
15
- * stripped.
13
+ * Snap a price onto a Lighter market's tick grid: rounded half-up to the
14
+ * market's `priceDecimals` (Lighter's `supported_price_decimals`), trailing
15
+ * zeros stripped.
16
16
  *
17
17
  * @throws {PerpsError} `ValidationError` when `market.priceDecimals` is
18
18
  * absent — without the venue's tick grid no correct price can be produced.
19
19
  * @public
20
20
  */
21
- export function formatOrderPrice(market, price) {
21
+ export function snapOrderPrice(market, price) {
22
22
  if (market.priceDecimals === undefined) {
23
23
  throw new PerpsError(PerpsErrorCode.ValidationError, `Market '${market.id}' carries no priceDecimals; Lighter order prices ` +
24
- `cannot be formatted without the market's tick grid.`);
24
+ `cannot be snapped without the market's tick grid.`);
25
25
  }
26
26
  const rounded = new Big(price).round(market.priceDecimals, Big.roundHalfUp);
27
27
  return rounded.eq(0) ? '0' : rounded.toFixed();
28
28
  }
29
29
  /**
30
- * Format a size onto a Lighter market's lot grid: truncated (never rounded
31
- * up, so the size cannot exceed the user's balance) to the market's
30
+ * Snap a size onto a Lighter market's lot grid: truncated toward zero (never
31
+ * rounded up, so the size cannot exceed the user's balance) to the market's
32
32
  * `szDecimals` (Lighter's `supported_size_decimals`), trailing zeros stripped.
33
33
  *
34
34
  * @param size - Size in base-asset units as a non-negative magnitude.
35
35
  * @public
36
36
  */
37
- export function formatOrderSize(market, size) {
37
+ export function snapOrderSize(market, size) {
38
38
  const truncated = new Big(size).round(market.szDecimals, Big.roundDown);
39
39
  return truncated.eq(0) ? '0' : truncated.toFixed();
40
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"orderFormatting.js","sourceRoot":"","sources":["../../../src/utils/orderFormatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAe,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,KAAa;IAC5D,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,WAAW,MAAM,CAAC,EAAE,mDAAmD;YACrE,qDAAqD,CACxD,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;IAC3E,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,IAAY;IAC1D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IACvE,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAA;AACpD,CAAC"}
1
+ {"version":3,"file":"orderFormatting.js","sourceRoot":"","sources":["../../../src/utils/orderFormatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAGL,cAAc,GACf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,KAAoB;IAEpB,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,WAAW,MAAM,CAAC,EAAE,mDAAmD;YACrE,mDAAmD,CACtD,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;IAC3E,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,IAAmB;IAEnB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IACvE,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAA;AACpD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAEhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGpD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,GACtC,SAAS,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,mBAAmB,CAAC,EACxD,sBAAsB,MAAM,KAC3B,2BAA2B,EA0B7B,CAAA"}
1
+ {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGpD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,GACtC,SAAS,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,mBAAmB,CAAC,EACxD,sBAAsB,MAAM,KAC3B,2BAA2B,EAqC7B,CAAA"}
@@ -1,4 +1,4 @@
1
- import { maxOf, minOf } from '@lifi/perps-sdk';
1
+ import { calculateTransferable, calculateWithdrawMax, } from '@lifi/perps-sdk';
2
2
  import Big from 'big.js';
3
3
  import { toRequiredBig } from './decimal.js';
4
4
  /**
@@ -22,14 +22,25 @@ export const lighterWithdrawableBalances = (account, settlementAssetIndex) => {
22
22
  const assetId = String(asset.asset_id);
23
23
  const spot = toRequiredBig(asset.balance, 'balance').minus(toRequiredBig(asset.locked_balance, 'locked_balance'));
24
24
  if (spot.gt(0)) {
25
- rows.push({ assetId, route: 'spot', available: spot.toFixed() });
25
+ const available = spot.toFixed();
26
+ rows.push({
27
+ assetId,
28
+ route: 'spot',
29
+ available,
30
+ max: calculateWithdrawMax({ available }),
31
+ });
26
32
  }
27
33
  const marginBalance = toRequiredBig(asset.margin_balance, 'margin_balance');
28
34
  const perps = asset.asset_id === settlementAssetIndex
29
- ? minOf(maxOf(toRequiredBig(account.available_balance, 'available_balance'), new Big(0)), marginBalance)
30
- : marginBalance;
31
- if (perps.gt(0)) {
32
- rows.push({ assetId, route: 'perps', available: perps.toFixed() });
35
+ ? calculateTransferable(toRequiredBig(account.available_balance, 'available_balance').toFixed(), marginBalance.toFixed())
36
+ : marginBalance.toFixed();
37
+ if (new Big(perps).gt(0)) {
38
+ rows.push({
39
+ assetId,
40
+ route: 'perps',
41
+ available: perps,
42
+ max: calculateWithdrawMax({ available: perps }),
43
+ });
33
44
  }
34
45
  }
35
46
  return rows;
@@ -1 +1 @@
1
- {"version":3,"file":"withdrawableBalances.js","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAoC,MAAM,iBAAiB,CAAA;AAChF,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAwD,EACxD,oBAA4B,EACG,EAAE;IACjC,MAAM,IAAI,GAAkC,EAAE,CAAA;IAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,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,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;QAC3E,MAAM,KAAK,GACT,KAAK,CAAC,QAAQ,KAAK,oBAAoB;YACrC,CAAC,CAAC,KAAK,CACH,KAAK,CACH,aAAa,CAAC,OAAO,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,EAC7D,IAAI,GAAG,CAAC,CAAC,CAAC,CACX,EACD,aAAa,CACd;YACH,CAAC,CAAC,aAAa,CAAA;QACnB,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"}
1
+ {"version":3,"file":"withdrawableBalances.js","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,iBAAiB,CAAA;AACxB,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAwD,EACxD,oBAA4B,EACG,EAAE;IACjC,MAAM,IAAI,GAAkC,EAAE,CAAA;IAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,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,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;YAChC,IAAI,CAAC,IAAI,CAAC;gBACR,OAAO;gBACP,KAAK,EAAE,MAAM;gBACb,SAAS;gBACT,GAAG,EAAE,oBAAoB,CAAC,EAAE,SAAS,EAAE,CAAC;aACzC,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;QAC3E,MAAM,KAAK,GACT,KAAK,CAAC,QAAQ,KAAK,oBAAoB;YACrC,CAAC,CAAC,qBAAqB,CACnB,aAAa,CACX,OAAO,CAAC,iBAAiB,EACzB,mBAAmB,CACpB,CAAC,OAAO,EAAE,EACX,aAAa,CAAC,OAAO,EAAE,CACxB;YACH,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,CAAA;QAC7B,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC;gBACR,OAAO;gBACP,KAAK,EAAE,OAAO;gBACd,SAAS,EAAE,KAAK;gBAChB,GAAG,EAAE,oBAAoB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;aAChD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"LighterProvider.d.ts","sourceRoot":"","sources":["../../src/LighterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAcL,KAAK,mBAAmB,EAqBxB,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAA;AAmCxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAQnC,OAAO,EAUL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAA;AA2KvB;;;;;;;;;;;;;;;;;;;;;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;AAcD;;;;;;;;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+gDF,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,EAaL,KAAK,mBAAmB,EAqBxB,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAA;AAoCxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAQnC,OAAO,EAUL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAA;AA2KvB;;;;;;;;;;;;;;;;;;;;;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;AAcD;;;;;;;;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+gDF,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"}
@@ -14,8 +14,10 @@ export declare const LIGHTER_PROVIDER_KEY = "lighter";
14
14
  export declare const LIGHTER_RH_PROVIDER_KEY = "lighter-rh";
15
15
  /**
16
16
  * Category id for Lighter spot token holdings, matching the backend's Lighter
17
- * spot asset category. The perps category id is not a constant — it is read
18
- * from the fetched markets so it tracks the backend taxonomy.
17
+ * spot asset category. Every Lighter call site, REST and WebSocket, uses this
18
+ * constant for the spot category. The perps category id is not a constant:
19
+ * `LighterProvider.getAccount` reads it from the `/providers` category whose
20
+ * `quoteAsset` is not null.
19
21
  *
20
22
  * @public
21
23
  */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAGpE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,YAAY,CAAA;AAE7C;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,eAAe,CAAA;AAEnD;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,SAAS,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,wCAAwC,CAAA;AAC7E;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,6CAA6C,CAAA;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,MAAM,CAAA;AAElD;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,2CACP,CAAA;AAE1C;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,kBAAkB,EAClB,sBAAsB,CAUvB,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,WAAW,EAAE,kBAAkB,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,uFAAuF;IACvF,aAAa,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,UAAU,EAAE,sBAAsB,CAAA;IAClC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;OAGG;IACH,aAAa,EAAE,eAAe,CAAA;CAC/B;AAED;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,iBAQvC,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,+BAA+B,CAAA;AAC/D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,oCAAoC,CAAA;AAElE;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,SAAS,CAAA;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,iBAQlC,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,UAAY,CAAA;AAE/C;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,OAAoC,CAAA;AAExE;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAA;AAE/C;;;;;;;;;GASG;AACH,eAAO,MAAM,oCAAoC,wBAAwB,CAAA;AAEzE;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C,gBAAgB;AAChB,QAAA,MAAM,8BAA8B,QAAQ,CAAA;AAE5C;;;;GAIG;AACH,QAAA,MAAM,yBAAyB,QAAQ,CAAA;AAEvC;;;;GAIG;AACH,QAAA,MAAM,0BAA0B,QAAQ,CAAA;AAExC;;;;;;;GAOG;AACH,QAAA,MAAM,8BAA8B,QAAQ,CAAA;AAE5C;;;;;;GAMG;AACH,QAAA,MAAM,qBAAqB,aAAoB,CAAA;AAE/C;;;;;;GAMG;AACH,QAAA,MAAM,6BAA6B,MAAM,CAAA;AAEzC;;;;;;;GAOG;AACH,QAAA,MAAM,kCAAkC,QAAQ,CAAA;AAEhD,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,kCAAkC,EAClC,qBAAqB,EACrB,0BAA0B,GAC3B,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAGpE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,YAAY,CAAA;AAE7C;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,eAAe,CAAA;AAEnD;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,SAAS,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,wCAAwC,CAAA;AAC7E;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,6CAA6C,CAAA;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,MAAM,CAAA;AAElD;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,2CACP,CAAA;AAE1C;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,kBAAkB,EAClB,sBAAsB,CAUvB,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,WAAW,EAAE,kBAAkB,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,uFAAuF;IACvF,aAAa,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,UAAU,EAAE,sBAAsB,CAAA;IAClC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;OAGG;IACH,aAAa,EAAE,eAAe,CAAA;CAC/B;AAED;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,iBAQvC,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,+BAA+B,CAAA;AAC/D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,oCAAoC,CAAA;AAElE;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,SAAS,CAAA;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,iBAQlC,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,UAAY,CAAA;AAE/C;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,OAAoC,CAAA;AAExE;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAA;AAE/C;;;;;;;;;GASG;AACH,eAAO,MAAM,oCAAoC,wBAAwB,CAAA;AAEzE;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C,gBAAgB;AAChB,QAAA,MAAM,8BAA8B,QAAQ,CAAA;AAE5C;;;;GAIG;AACH,QAAA,MAAM,yBAAyB,QAAQ,CAAA;AAEvC;;;;GAIG;AACH,QAAA,MAAM,0BAA0B,QAAQ,CAAA;AAExC;;;;;;;GAOG;AACH,QAAA,MAAM,8BAA8B,QAAQ,CAAA;AAE5C;;;;;;GAMG;AACH,QAAA,MAAM,qBAAqB,aAAoB,CAAA;AAE/C;;;;;;GAMG;AACH,QAAA,MAAM,6BAA6B,MAAM,CAAA;AAEzC;;;;;;;GAOG;AACH,QAAA,MAAM,kCAAkC,QAAQ,CAAA;AAEhD,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,kCAAkC,EAClC,qBAAqB,EACrB,0BAA0B,GAC3B,CAAA"}
@@ -14,7 +14,7 @@ export { mapPortfolioHistory } from './mapPortfolioHistory.js';
14
14
  export { leverageFromImf, mapPosition } from './mapPosition.js';
15
15
  export { mapMarketOrderLimits } from './marketLimits.js';
16
16
  export { mapInterval } from './ohlcvInterval.js';
17
- export { formatOrderPrice, formatOrderSize } from './orderFormatting.js';
17
+ export { snapOrderPrice, snapOrderSize } from './orderFormatting.js';
18
18
  export { toIsoFromMs, toIsoFromSeconds } from './time.js';
19
19
  export { positionRemovableMargin } from './transferMargin.js';
20
20
  export { leverageToFraction, mapOrderTypeToInt, mapTimeInForceToInt, marginFractionToMaxLeverage, orderExpiryForTif, resolveTimeInForce, } from './wireEncoding.js';
@@ -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,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,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,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,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"}
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,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mapMarketContext.d.ts","sourceRoot":"","sources":["../../../src/utils/mapMarketContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAQ7E;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,eAAe,GAAG,mBAAmB,KAC3C,aAyBF,CAAA"}
1
+ {"version":3,"file":"mapMarketContext.d.ts","sourceRoot":"","sources":["../../../src/utils/mapMarketContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AA6B7E;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,eAAe,GAAG,mBAAmB,KAC3C,aAuBF,CAAA"}
@@ -1,29 +1,29 @@
1
1
  /**
2
- * Lighter order size and price formatting for exchange submission.
2
+ * Lighter order size and price snapping for exchange submission.
3
3
  *
4
4
  * Lighter publishes a flat per-market decimal budget on its order books
5
5
  * (`supported_price_decimals` / `supported_size_decimals`), surfaced on the
6
- * generic {@link Market} as `priceDecimals` / `szDecimals`. Prices round to
7
- * the tick grid; sizes truncate to the lot grid.
6
+ * generic {@link Market} as `priceDecimals` / `szDecimals`. Prices round onto
7
+ * the tick grid; sizes truncate onto the lot grid.
8
8
  */
9
- import { type Market } from '@lifi/perps-types';
9
+ import { type DecimalString, type Market } from '@lifi/perps-types';
10
10
  /**
11
- * Format a price onto a Lighter market's tick grid: rounded to the market's
12
- * `priceDecimals` (Lighter's `supported_price_decimals`), trailing zeros
13
- * stripped.
11
+ * Snap a price onto a Lighter market's tick grid: rounded half-up to the
12
+ * market's `priceDecimals` (Lighter's `supported_price_decimals`), trailing
13
+ * zeros stripped.
14
14
  *
15
15
  * @throws {PerpsError} `ValidationError` when `market.priceDecimals` is
16
16
  * absent — without the venue's tick grid no correct price can be produced.
17
17
  * @public
18
18
  */
19
- export declare function formatOrderPrice(market: Market, price: number): string;
19
+ export declare function snapOrderPrice(market: Market, price: DecimalString): DecimalString;
20
20
  /**
21
- * Format a size onto a Lighter market's lot grid: truncated (never rounded
22
- * up, so the size cannot exceed the user's balance) to the market's
21
+ * Snap a size onto a Lighter market's lot grid: truncated toward zero (never
22
+ * rounded up, so the size cannot exceed the user's balance) to the market's
23
23
  * `szDecimals` (Lighter's `supported_size_decimals`), trailing zeros stripped.
24
24
  *
25
25
  * @param size - Size in base-asset units as a non-negative magnitude.
26
26
  * @public
27
27
  */
28
- export declare function formatOrderSize(market: Market, size: number): string;
28
+ export declare function snapOrderSize(market: Market, size: DecimalString): DecimalString;
29
29
  //# sourceMappingURL=orderFormatting.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"orderFormatting.d.ts","sourceRoot":"","sources":["../../../src/utils/orderFormatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,KAAK,MAAM,EAAkB,MAAM,mBAAmB,CAAA;AAG/D;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUtE;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpE"}
1
+ {"version":3,"file":"orderFormatting.d.ts","sourceRoot":"","sources":["../../../src/utils/orderFormatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,MAAM,EAEZ,MAAM,mBAAmB,CAAA;AAG1B;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,GACnB,aAAa,CAUf;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,aAAa,GAClB,aAAa,CAGf"}
@@ -1 +1 @@
1
- {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAEhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGpD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,GACtC,SAAS,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,mBAAmB,CAAC,EACxD,sBAAsB,MAAM,KAC3B,2BAA2B,EA0B7B,CAAA"}
1
+ {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGpD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,GACtC,SAAS,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,mBAAmB,CAAC,EACxD,sBAAsB,MAAM,KAC3B,2BAA2B,EAqC7B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/perps-sdk-provider-lighter",
3
- "version": "31.0.1",
3
+ "version": "32.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.55.18",
47
- "@lifi/perps-types": "^18.0.0"
47
+ "@lifi/perps-types": "^19.0.0"
48
48
  },
49
49
  "peerDependencies": {
50
- "@lifi/perps-sdk": "^20.1.0"
50
+ "@lifi/perps-sdk": "^21.0.0"
51
51
  },
52
52
  "publishConfig": {
53
53
  "access": "public"
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  ACTIVE_ORDER_STATUSES,
3
+ calculateTransferable,
3
4
  type DepositFlow,
4
5
  explorerTxUrl,
5
6
  explorerTxUrlFromBase,
@@ -9,8 +10,6 @@ import {
9
10
  getProviders,
10
11
  isActiveOrderStatus,
11
12
  localStorageAdapter,
12
- maxOf,
13
- minOf,
14
13
  PerpsError,
15
14
  type PerpsProviderPlugin,
16
15
  type PerpsSDKClient,
@@ -66,6 +65,7 @@ import type {
66
65
  import {
67
66
  ActionType,
68
67
  ActivityType,
68
+ isDecimalString,
69
69
  MarginMode,
70
70
  PerpsErrorCode,
71
71
  } from '@lifi/perps-types'
@@ -142,8 +142,6 @@ import { isAssetMarginEnabled } from './utils/assetCollateral.js'
142
142
  import {
143
143
  estimateLiquidationPrice,
144
144
  fetchDetailedAccount,
145
- formatOrderPrice,
146
- formatOrderSize,
147
145
  leverageFromImf,
148
146
  lighterAsset,
149
147
  lighterWithdrawableBalances,
@@ -152,6 +150,8 @@ import {
152
150
  mapOrder,
153
151
  mapPortfolioHistory,
154
152
  positionRemovableMargin,
153
+ snapOrderPrice,
154
+ snapOrderSize,
155
155
  toBigOrNull,
156
156
  toIsoFromMs,
157
157
  toIsoFromSeconds,
@@ -1042,37 +1042,37 @@ export const createLighterProvider = (
1042
1042
  // account's free margin; every other perps-route asset releases none.
1043
1043
  const collateralBalances: Balance[] = marginAssets.map((a) => {
1044
1044
  const isSettlement = a.asset_id === collateral.assetIndex
1045
+ const marginBalance = toRequiredBig(
1046
+ a.margin_balance,
1047
+ 'margin_balance'
1048
+ ).toFixed()
1045
1049
  return {
1046
1050
  ...toBalance(
1047
1051
  a,
1048
1052
  perpsCategory?.id ?? providerKey,
1049
1053
  isSettlement ? settlementAsset : registryAsset(a),
1050
- a.margin_balance
1054
+ isDecimalString(a.margin_balance) ? a.margin_balance : marginBalance
1051
1055
  ),
1052
1056
  transferable: isSettlement
1053
- ? minOf(
1054
- maxOf(availableBalance, new Big(0)),
1055
- new Big(a.margin_balance)
1056
- ).toFixed()
1057
+ ? calculateTransferable(availableBalance.toFixed(), marginBalance)
1057
1058
  : '0',
1058
1059
  }
1059
1060
  })
1060
1061
  const balances: Balance[] = heldAssets.map((a) => {
1061
- const balance = new Big(a.balance)
1062
+ const balance = toRequiredBig(a.balance, 'balance')
1062
1063
  return {
1063
1064
  ...toBalance(
1064
1065
  a,
1065
1066
  LIGHTER_SPOT_CATEGORY_ID,
1066
1067
  registryAsset(a),
1067
- a.balance
1068
+ isDecimalString(a.balance) ? a.balance : balance.toFixed()
1068
1069
  ),
1069
- transferable: minOf(
1070
- maxOf(
1071
- balance.minus(toRequiredBig(a.locked_balance, 'locked_balance')),
1072
- new Big(0)
1073
- ),
1070
+ transferable: calculateTransferable(
1074
1071
  balance
1075
- ).toFixed(),
1072
+ .minus(toRequiredBig(a.locked_balance, 'locked_balance'))
1073
+ .toFixed(),
1074
+ balance.toFixed()
1075
+ ),
1076
1076
  }
1077
1077
  })
1078
1078
 
@@ -1814,9 +1814,9 @@ export const createLighterProvider = (
1814
1814
  return getAccountSummary(account, positions)
1815
1815
  },
1816
1816
 
1817
- formatOrderPrice,
1817
+ snapOrderPrice,
1818
1818
 
1819
- formatOrderSize,
1819
+ snapOrderSize,
1820
1820
 
1821
1821
  estimateLiquidationPrice,
1822
1822
 
package/src/constants.ts CHANGED
@@ -18,8 +18,10 @@ export const LIGHTER_RH_PROVIDER_KEY = 'lighter-rh'
18
18
 
19
19
  /**
20
20
  * Category id for Lighter spot token holdings, matching the backend's Lighter
21
- * spot asset category. The perps category id is not a constant — it is read
22
- * from the fetched markets so it tracks the backend taxonomy.
21
+ * spot asset category. Every Lighter call site, REST and WebSocket, uses this
22
+ * constant for the spot category. The perps category id is not a constant:
23
+ * `LighterProvider.getAccount` reads it from the `/providers` category whose
24
+ * `quoteAsset` is not null.
23
25
  *
24
26
  * @public
25
27
  */
@@ -1,4 +1,4 @@
1
- import { PerpsError, scaleToInteger } from '@lifi/perps-sdk'
1
+ import { decimalToBaseUnits, PerpsError } from '@lifi/perps-sdk'
2
2
  import { ActionType, PerpsErrorCode } from '@lifi/perps-types'
3
3
  import Big from 'big.js'
4
4
  import { LT_ROUTE_PERP, LT_ROUTE_SPOT } from '../types/action.js'
@@ -632,7 +632,7 @@ export class LighterSigner {
632
632
  return wasm.SignWithdraw(
633
633
  numberField(p, 'asset_index'),
634
634
  routeType,
635
- scaleToInteger(amount, numberField(p, 'decimals'), 'truncate'),
635
+ decimalToBaseUnits(amount, numberField(p, 'decimals'), 'truncate'),
636
636
  SKIP_NONCE_DISABLED,
637
637
  nonce,
638
638
  ctx.apiKeyIndex,
@@ -21,7 +21,7 @@ export { mapPortfolioHistory } from './mapPortfolioHistory.js'
21
21
  export { leverageFromImf, mapPosition } from './mapPosition.js'
22
22
  export { mapMarketOrderLimits } from './marketLimits.js'
23
23
  export { mapInterval } from './ohlcvInterval.js'
24
- export { formatOrderPrice, formatOrderSize } from './orderFormatting.js'
24
+ export { snapOrderPrice, snapOrderSize } from './orderFormatting.js'
25
25
  export { toIsoFromMs, toIsoFromSeconds } from './time.js'
26
26
  export { positionRemovableMargin } from './transferMargin.js'
27
27
  export {
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import {
11
- estimateIsolatedLiquidationPrice,
11
+ estimateLiquidationPrice as estimateIsolatedLiquidationPrice,
12
12
  type LiquidationEstimateParams,
13
13
  } from '@lifi/perps-sdk'
14
14
  import type { PerpsMarket } from '@lifi/perps-types'
@@ -1,3 +1,4 @@
1
+ import { numberToDecimalString } from '@lifi/perps-sdk'
1
2
  import type { MarketContext } from '@lifi/perps-types'
2
3
  import type { LtWsMarketStats, LtWsSpotMarketStats } from '../types/index.js'
3
4
 
@@ -7,6 +8,27 @@ const isPerpStats = (
7
8
  stats: LtWsMarketStats | LtWsSpotMarketStats
8
9
  ): stats is LtWsMarketStats => 'mark_price' in stats
9
10
 
11
+ const isFiniteFigure = (value: number | null | undefined): value is number =>
12
+ typeof value === 'number' && Number.isFinite(value)
13
+
14
+ /**
15
+ * The 24h figures of one record, omitted where the frame carries no finite
16
+ * number. The venue publishes them as unvalidated JSON, and `market_stats/all`
17
+ * maps every market in one pass, so a single absent figure must not cost the
18
+ * whole frame.
19
+ */
20
+ const dailyFigures = (stats: {
21
+ daily_price_change?: number | null
22
+ daily_quote_token_volume?: number | null
23
+ }): Pick<MarketContext, 'priceChange24h' | 'volume24h'> => ({
24
+ ...(isFiniteFigure(stats.daily_price_change)
25
+ ? { priceChange24h: numberToDecimalString(stats.daily_price_change) }
26
+ : {}),
27
+ ...(isFiniteFigure(stats.daily_quote_token_volume)
28
+ ? { volume24h: numberToDecimalString(stats.daily_quote_token_volume) }
29
+ : {}),
30
+ })
31
+
10
32
  /**
11
33
  * Map a Lighter market-stats record to a {@link MarketContext}: `index_price`
12
34
  * is the oracle, `mid_price` the mid. Perp records carry the venue
@@ -24,8 +46,7 @@ export const mapMarketContext = (
24
46
  midPrice: stats.mid_price,
25
47
  markPrice: stats.mark_price,
26
48
  oraclePrice: stats.index_price,
27
- priceChange24h: String(stats.daily_price_change),
28
- volume24h: String(stats.daily_quote_token_volume),
49
+ ...dailyFigures(stats),
29
50
  openInterest: stats.open_interest,
30
51
  funding: {
31
52
  rate: stats.current_funding_rate,
@@ -38,7 +59,6 @@ export const mapMarketContext = (
38
59
  midPrice: stats.mid_price,
39
60
  markPrice: stats.mid_price,
40
61
  oraclePrice: stats.index_price,
41
- priceChange24h: String(stats.daily_price_change),
42
- volume24h: String(stats.daily_quote_token_volume),
62
+ ...dailyFigures(stats),
43
63
  }
44
64
  }
@@ -1,31 +1,38 @@
1
1
  /**
2
- * Lighter order size and price formatting for exchange submission.
2
+ * Lighter order size and price snapping for exchange submission.
3
3
  *
4
4
  * Lighter publishes a flat per-market decimal budget on its order books
5
5
  * (`supported_price_decimals` / `supported_size_decimals`), surfaced on the
6
- * generic {@link Market} as `priceDecimals` / `szDecimals`. Prices round to
7
- * the tick grid; sizes truncate to the lot grid.
6
+ * generic {@link Market} as `priceDecimals` / `szDecimals`. Prices round onto
7
+ * the tick grid; sizes truncate onto the lot grid.
8
8
  */
9
9
 
10
10
  import { PerpsError } from '@lifi/perps-sdk'
11
- import { type Market, PerpsErrorCode } from '@lifi/perps-types'
11
+ import {
12
+ type DecimalString,
13
+ type Market,
14
+ PerpsErrorCode,
15
+ } from '@lifi/perps-types'
12
16
  import Big from 'big.js'
13
17
 
14
18
  /**
15
- * Format a price onto a Lighter market's tick grid: rounded to the market's
16
- * `priceDecimals` (Lighter's `supported_price_decimals`), trailing zeros
17
- * stripped.
19
+ * Snap a price onto a Lighter market's tick grid: rounded half-up to the
20
+ * market's `priceDecimals` (Lighter's `supported_price_decimals`), trailing
21
+ * zeros stripped.
18
22
  *
19
23
  * @throws {PerpsError} `ValidationError` when `market.priceDecimals` is
20
24
  * absent — without the venue's tick grid no correct price can be produced.
21
25
  * @public
22
26
  */
23
- export function formatOrderPrice(market: Market, price: number): string {
27
+ export function snapOrderPrice(
28
+ market: Market,
29
+ price: DecimalString
30
+ ): DecimalString {
24
31
  if (market.priceDecimals === undefined) {
25
32
  throw new PerpsError(
26
33
  PerpsErrorCode.ValidationError,
27
34
  `Market '${market.id}' carries no priceDecimals; Lighter order prices ` +
28
- `cannot be formatted without the market's tick grid.`
35
+ `cannot be snapped without the market's tick grid.`
29
36
  )
30
37
  }
31
38
  const rounded = new Big(price).round(market.priceDecimals, Big.roundHalfUp)
@@ -33,14 +40,17 @@ export function formatOrderPrice(market: Market, price: number): string {
33
40
  }
34
41
 
35
42
  /**
36
- * Format a size onto a Lighter market's lot grid: truncated (never rounded
37
- * up, so the size cannot exceed the user's balance) to the market's
43
+ * Snap a size onto a Lighter market's lot grid: truncated toward zero (never
44
+ * rounded up, so the size cannot exceed the user's balance) to the market's
38
45
  * `szDecimals` (Lighter's `supported_size_decimals`), trailing zeros stripped.
39
46
  *
40
47
  * @param size - Size in base-asset units as a non-negative magnitude.
41
48
  * @public
42
49
  */
43
- export function formatOrderSize(market: Market, size: number): string {
50
+ export function snapOrderSize(
51
+ market: Market,
52
+ size: DecimalString
53
+ ): DecimalString {
44
54
  const truncated = new Big(size).round(market.szDecimals, Big.roundDown)
45
55
  return truncated.eq(0) ? '0' : truncated.toFixed()
46
56
  }
@@ -1,4 +1,8 @@
1
- import { maxOf, minOf, type ProviderWithdrawableBalance } from '@lifi/perps-sdk'
1
+ import {
2
+ calculateTransferable,
3
+ calculateWithdrawMax,
4
+ type ProviderWithdrawableBalance,
5
+ } from '@lifi/perps-sdk'
2
6
  import Big from 'big.js'
3
7
  import type { LtAccount } from '../types/account.js'
4
8
  import { toRequiredBig } from './decimal.js'
@@ -29,21 +33,32 @@ export const lighterWithdrawableBalances = (
29
33
  toRequiredBig(asset.locked_balance, 'locked_balance')
30
34
  )
31
35
  if (spot.gt(0)) {
32
- rows.push({ assetId, route: 'spot', available: spot.toFixed() })
36
+ const available = spot.toFixed()
37
+ rows.push({
38
+ assetId,
39
+ route: 'spot',
40
+ available,
41
+ max: calculateWithdrawMax({ available }),
42
+ })
33
43
  }
34
44
  const marginBalance = toRequiredBig(asset.margin_balance, 'margin_balance')
35
45
  const perps =
36
46
  asset.asset_id === settlementAssetIndex
37
- ? minOf(
38
- maxOf(
39
- toRequiredBig(account.available_balance, 'available_balance'),
40
- new Big(0)
41
- ),
42
- marginBalance
47
+ ? calculateTransferable(
48
+ toRequiredBig(
49
+ account.available_balance,
50
+ 'available_balance'
51
+ ).toFixed(),
52
+ marginBalance.toFixed()
43
53
  )
44
- : marginBalance
45
- if (perps.gt(0)) {
46
- rows.push({ assetId, route: 'perps', available: perps.toFixed() })
54
+ : marginBalance.toFixed()
55
+ if (new Big(perps).gt(0)) {
56
+ rows.push({
57
+ assetId,
58
+ route: 'perps',
59
+ available: perps,
60
+ max: calculateWithdrawMax({ available: perps }),
61
+ })
47
62
  }
48
63
  }
49
64
  return rows