@lifi/perps-sdk-provider-lighter 7.0.0 → 8.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 (94) hide show
  1. package/dist/cjs/LighterProvider.d.ts.map +1 -1
  2. package/dist/cjs/LighterProvider.js +60 -27
  3. package/dist/cjs/LighterProvider.js.map +1 -1
  4. package/dist/cjs/accountSummary.d.ts.map +1 -1
  5. package/dist/cjs/accountSummary.js +33 -2
  6. package/dist/cjs/accountSummary.js.map +1 -1
  7. package/dist/cjs/types/account.d.ts +1 -0
  8. package/dist/cjs/types/account.d.ts.map +1 -1
  9. package/dist/cjs/types/ws.d.ts +5 -0
  10. package/dist/cjs/types/ws.d.ts.map +1 -1
  11. package/dist/cjs/utils/decimal.d.ts +5 -0
  12. package/dist/cjs/utils/decimal.d.ts.map +1 -0
  13. package/dist/cjs/utils/decimal.js +38 -0
  14. package/dist/cjs/utils/decimal.js.map +1 -0
  15. package/dist/cjs/utils/index.d.ts +3 -1
  16. package/dist/cjs/utils/index.d.ts.map +1 -1
  17. package/dist/cjs/utils/index.js +7 -1
  18. package/dist/cjs/utils/index.js.map +1 -1
  19. package/dist/cjs/utils/mapOpenPositions.d.ts +2 -2
  20. package/dist/cjs/utils/mapOpenPositions.d.ts.map +1 -1
  21. package/dist/cjs/utils/mapOpenPositions.js.map +1 -1
  22. package/dist/cjs/utils/mapPosition.d.ts +3 -2
  23. package/dist/cjs/utils/mapPosition.d.ts.map +1 -1
  24. package/dist/cjs/utils/mapPosition.js +30 -9
  25. package/dist/cjs/utils/mapPosition.js.map +1 -1
  26. package/dist/cjs/utils/transferMargin.d.ts +3 -0
  27. package/dist/cjs/utils/transferMargin.d.ts.map +1 -0
  28. package/dist/cjs/utils/transferMargin.js +17 -0
  29. package/dist/cjs/utils/transferMargin.js.map +1 -0
  30. package/dist/cjs/websocket/LighterWsProvider.d.ts.map +1 -1
  31. package/dist/cjs/websocket/LighterWsProvider.js +20 -9
  32. package/dist/cjs/websocket/LighterWsProvider.js.map +1 -1
  33. package/dist/esm/LighterProvider.d.ts.map +1 -1
  34. package/dist/esm/LighterProvider.js +49 -11
  35. package/dist/esm/LighterProvider.js.map +1 -1
  36. package/dist/esm/accountSummary.d.ts +5 -4
  37. package/dist/esm/accountSummary.d.ts.map +1 -1
  38. package/dist/esm/accountSummary.js +35 -6
  39. package/dist/esm/accountSummary.js.map +1 -1
  40. package/dist/esm/types/account.d.ts +3 -0
  41. package/dist/esm/types/account.d.ts.map +1 -1
  42. package/dist/esm/types/ws.d.ts +9 -1
  43. package/dist/esm/types/ws.d.ts.map +1 -1
  44. package/dist/esm/utils/decimal.d.ts +15 -0
  45. package/dist/esm/utils/decimal.d.ts.map +1 -0
  46. package/dist/esm/utils/decimal.js +39 -0
  47. package/dist/esm/utils/decimal.js.map +1 -0
  48. package/dist/esm/utils/index.d.ts +3 -1
  49. package/dist/esm/utils/index.d.ts.map +1 -1
  50. package/dist/esm/utils/index.js +3 -1
  51. package/dist/esm/utils/index.js.map +1 -1
  52. package/dist/esm/utils/mapOpenPositions.d.ts +2 -2
  53. package/dist/esm/utils/mapOpenPositions.d.ts.map +1 -1
  54. package/dist/esm/utils/mapOpenPositions.js.map +1 -1
  55. package/dist/esm/utils/mapPosition.d.ts +10 -2
  56. package/dist/esm/utils/mapPosition.d.ts.map +1 -1
  57. package/dist/esm/utils/mapPosition.js +32 -11
  58. package/dist/esm/utils/mapPosition.js.map +1 -1
  59. package/dist/esm/utils/transferMargin.d.ts +11 -0
  60. package/dist/esm/utils/transferMargin.d.ts.map +1 -0
  61. package/dist/esm/utils/transferMargin.js +22 -0
  62. package/dist/esm/utils/transferMargin.js.map +1 -0
  63. package/dist/esm/websocket/LighterWsProvider.d.ts.map +1 -1
  64. package/dist/esm/websocket/LighterWsProvider.js +24 -13
  65. package/dist/esm/websocket/LighterWsProvider.js.map +1 -1
  66. package/dist/types/LighterProvider.d.ts.map +1 -1
  67. package/dist/types/accountSummary.d.ts +5 -4
  68. package/dist/types/accountSummary.d.ts.map +1 -1
  69. package/dist/types/types/account.d.ts +3 -0
  70. package/dist/types/types/account.d.ts.map +1 -1
  71. package/dist/types/types/ws.d.ts +9 -1
  72. package/dist/types/types/ws.d.ts.map +1 -1
  73. package/dist/types/utils/decimal.d.ts +15 -0
  74. package/dist/types/utils/decimal.d.ts.map +1 -0
  75. package/dist/types/utils/index.d.ts +3 -1
  76. package/dist/types/utils/index.d.ts.map +1 -1
  77. package/dist/types/utils/mapOpenPositions.d.ts +2 -2
  78. package/dist/types/utils/mapOpenPositions.d.ts.map +1 -1
  79. package/dist/types/utils/mapPosition.d.ts +10 -2
  80. package/dist/types/utils/mapPosition.d.ts.map +1 -1
  81. package/dist/types/utils/transferMargin.d.ts +11 -0
  82. package/dist/types/utils/transferMargin.d.ts.map +1 -0
  83. package/dist/types/websocket/LighterWsProvider.d.ts.map +1 -1
  84. package/package.json +3 -3
  85. package/src/LighterProvider.ts +75 -9
  86. package/src/accountSummary.ts +38 -6
  87. package/src/types/account.ts +3 -0
  88. package/src/types/ws.ts +9 -1
  89. package/src/utils/decimal.ts +52 -0
  90. package/src/utils/index.ts +3 -1
  91. package/src/utils/mapOpenPositions.ts +2 -2
  92. package/src/utils/mapPosition.ts +40 -14
  93. package/src/utils/transferMargin.ts +35 -0
  94. package/src/websocket/LighterWsProvider.ts +41 -11
@@ -1,10 +1,11 @@
1
1
  import type { AccountResponse, AccountSummary, Position } from '@lifi/perps-types';
2
2
  /**
3
3
  * Roll a Lighter {@link AccountResponse} up into an {@link AccountSummary}.
4
- * Lighter has a single flat collateral model with no abstraction modes: the
5
- * collateral rows hold `available_balance`, which nets locked margin out but
6
- * marks unrealized PnL in — so only the positions' `marginUsed` is added
7
- * back for the portfolio value, never their PnL.
4
+ *
5
+ * Lighter's cross available balance is already marked to market, while an
6
+ * isolated position's unrealized PnL remains inside that position's isolated
7
+ * sub-account. Reconciliation therefore adds every position's locked margin,
8
+ * but adds unrealized PnL only for isolated positions.
8
9
  *
9
10
  * @public
10
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"accountSummary.d.ts","sourceRoot":"","sources":["../../src/accountSummary.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,QAAQ,EACT,MAAM,mBAAmB,CAAA;AAE1B;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,QAAQ,EAAE,GACpB,cAAc,CAEhB"}
1
+ {"version":3,"file":"accountSummary.d.ts","sourceRoot":"","sources":["../../src/accountSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,QAAQ,EACT,MAAM,mBAAmB,CAAA;AAI1B;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,QAAQ,EAAE,GACpB,cAAc,CAgChB"}
@@ -1,14 +1,43 @@
1
- import { summarizeAccount } from '@lifi/perps-sdk';
1
+ import { MarginMode } from '@lifi/perps-types';
2
+ import Big from 'big.js';
2
3
  /**
3
4
  * Roll a Lighter {@link AccountResponse} up into an {@link AccountSummary}.
4
- * Lighter has a single flat collateral model with no abstraction modes: the
5
- * collateral rows hold `available_balance`, which nets locked margin out but
6
- * marks unrealized PnL in — so only the positions' `marginUsed` is added
7
- * back for the portfolio value, never their PnL.
5
+ *
6
+ * Lighter's cross available balance is already marked to market, while an
7
+ * isolated position's unrealized PnL remains inside that position's isolated
8
+ * sub-account. Reconciliation therefore adds every position's locked margin,
9
+ * but adds unrealized PnL only for isolated positions.
8
10
  *
9
11
  * @public
10
12
  */
11
13
  export function getAccountSummary(account, positions) {
12
- return summarizeAccount(account, positions, 'net');
14
+ let availableMargin = new Big(0);
15
+ for (const balance of account.collateralBalances) {
16
+ availableMargin = availableMargin.plus(balance.valueUsd);
17
+ }
18
+ let nonCollateralValue = new Big(0);
19
+ for (const balance of account.balances) {
20
+ nonCollateralValue = nonCollateralValue.plus(balance.valueUsd);
21
+ }
22
+ let marginUsed = new Big(0);
23
+ let unrealizedPnl = new Big(0);
24
+ let isolatedUnrealizedPnl = new Big(0);
25
+ for (const position of positions) {
26
+ marginUsed = marginUsed.plus(position.marginUsed);
27
+ unrealizedPnl = unrealizedPnl.plus(position.unrealizedPnl);
28
+ if (position.marginMode === MarginMode.ISOLATED) {
29
+ isolatedUnrealizedPnl = isolatedUnrealizedPnl.plus(position.unrealizedPnl);
30
+ }
31
+ }
32
+ return {
33
+ portfolioValue: nonCollateralValue
34
+ .plus(availableMargin)
35
+ .plus(marginUsed)
36
+ .plus(isolatedUnrealizedPnl)
37
+ .toString(),
38
+ availableMargin: availableMargin.toString(),
39
+ marginUsed: marginUsed.toString(),
40
+ unrealizedPnl: unrealizedPnl.toString(),
41
+ };
13
42
  }
14
43
  //# sourceMappingURL=accountSummary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"accountSummary.js","sourceRoot":"","sources":["../../src/accountSummary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAOlD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAwB,EACxB,SAAqB;IAErB,OAAO,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;AACpD,CAAC"}
1
+ {"version":3,"file":"accountSummary.js","sourceRoot":"","sources":["../../src/accountSummary.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAwB,EACxB,SAAqB;IAErB,IAAI,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IAChC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACjD,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1D,CAAC;IAED,IAAI,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IACnC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,kBAAkB,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChE,CAAC;IAED,IAAI,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IAC3B,IAAI,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9B,IAAI,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IACtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACjD,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;QAC1D,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,CAAC,QAAQ,EAAE,CAAC;YAChD,qBAAqB,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC;IAED,OAAO;QACL,cAAc,EAAE,kBAAkB;aAC/B,IAAI,CAAC,eAAe,CAAC;aACrB,IAAI,CAAC,UAAU,CAAC;aAChB,IAAI,CAAC,qBAAqB,CAAC;aAC3B,QAAQ,EAAE;QACb,eAAe,EAAE,eAAe,CAAC,QAAQ,EAAE;QAC3C,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE;QACjC,aAAa,EAAE,aAAa,CAAC,QAAQ,EAAE;KACxC,CAAA;AACH,CAAC"}
@@ -72,6 +72,9 @@ export interface LtDetailedAccount {
72
72
  assets: LtAccountAsset[];
73
73
  total_asset_value: string;
74
74
  cross_asset_value: string;
75
+ /** Initial margin locked by cross positions; isolated positions carry
76
+ * their own `allocated_margin` instead. */
77
+ cross_initial_margin_requirement: string;
75
78
  approved_integrators?: LtApprovedIntegrator[];
76
79
  }
77
80
  /** @public */
@@ -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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"}
@@ -131,7 +131,10 @@ export type LtWsAccountAllTradesMessage = LtWsMessage & {
131
131
  };
132
132
  };
133
133
  /**
134
- * `user_stats/{account_index}` frame; decimal strings in USD.
134
+ * `user_stats/{account_index}` frame; decimal strings in USD. The top-level
135
+ * figures span the whole account (`available_balance` = total withdrawable,
136
+ * including isolated positions' excess margin); `cross_stats` scopes them to
137
+ * the cross pool, whose `available_balance` is the free tradable collateral.
135
138
  * @public
136
139
  */
137
140
  export type LtWsUserStatsMessage = LtWsMessage & {
@@ -139,6 +142,11 @@ export type LtWsUserStatsMessage = LtWsMessage & {
139
142
  collateral?: string;
140
143
  portfolio_value?: string;
141
144
  available_balance?: string;
145
+ cross_stats?: {
146
+ collateral: string;
147
+ portfolio_value: string;
148
+ available_balance: string;
149
+ };
142
150
  };
143
151
  };
144
152
  export type LtWsAccountAllPositionsMessage = LtWsMessage & {
@@ -1 +1 @@
1
- {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../../src/types/ws.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../../src/types/ws.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import Big from 'big.js';
2
+ /**
3
+ * Exact-decimal parse of a venue decimal string; null when absent or
4
+ * unparsable, so callers can gate on presence before deriving.
5
+ * @public
6
+ */
7
+ export declare const toBigOrNull: (value: string | undefined) => Big | null;
8
+ /**
9
+ * Parse a required venue decimal and identify the bad field on failure.
10
+ * @public
11
+ */
12
+ export declare const toRequiredBig: (value: string | undefined, field: string) => Big;
13
+ /** Parse a required venue decimal that must be greater than zero. */
14
+ export declare const toPositiveRequiredBig: (value: string | undefined, field: string) => Big;
15
+ //# sourceMappingURL=decimal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decimal.d.ts","sourceRoot":"","sources":["../../../src/utils/decimal.ts"],"names":[],"mappings":"AAEA,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,GAAG,SAAS,KAAG,GAAG,GAAG,IAS7D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,GAAG,SAAS,EACzB,OAAO,MAAM,KACZ,GASF,CAAA;AAED,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,GAChC,OAAO,MAAM,GAAG,SAAS,EACzB,OAAO,MAAM,KACZ,GASF,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { PerpsError } from '@lifi/perps-sdk';
2
+ import { PerpsErrorCode } from '@lifi/perps-types';
3
+ import Big from 'big.js';
4
+ /**
5
+ * Exact-decimal parse of a venue decimal string; null when absent or
6
+ * unparsable, so callers can gate on presence before deriving.
7
+ * @public
8
+ */
9
+ export const toBigOrNull = (value) => {
10
+ if (value === undefined) {
11
+ return null;
12
+ }
13
+ try {
14
+ return new Big(value);
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ };
20
+ /**
21
+ * Parse a required venue decimal and identify the bad field on failure.
22
+ * @public
23
+ */
24
+ export const toRequiredBig = (value, field) => {
25
+ const parsed = toBigOrNull(value);
26
+ if (parsed !== null) {
27
+ return parsed;
28
+ }
29
+ throw new PerpsError(PerpsErrorCode.SDKError, `Lighter field \`${field}\` is not a valid decimal.`);
30
+ };
31
+ /** Parse a required venue decimal that must be greater than zero. */
32
+ export const toPositiveRequiredBig = (value, field) => {
33
+ const parsed = toRequiredBig(value, field);
34
+ if (parsed.lte(0)) {
35
+ throw new PerpsError(PerpsErrorCode.SDKError, `Lighter field \`${field}\` must be greater than zero.`);
36
+ }
37
+ return parsed;
38
+ };
39
+ //# sourceMappingURL=decimal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decimal.js","sourceRoot":"","sources":["../../../src/utils/decimal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAyB,EAAc,EAAE;IACnE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAAyB,EACzB,KAAa,EACR,EAAE;IACP,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IACjC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,MAAM,CAAA;IACf,CAAC;IACD,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,QAAQ,EACvB,mBAAmB,KAAK,4BAA4B,CACrD,CAAA;AACH,CAAC,CAAA;AAED,qEAAqE;AACrE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAyB,EACzB,KAAa,EACR,EAAE;IACP,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC1C,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,QAAQ,EACvB,mBAAmB,KAAK,+BAA+B,CACxD,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
@@ -2,6 +2,7 @@ export type { LighterActivityCursor } from './activityCursor.js';
2
2
  export { decodeActivityCursor, encodeActivityCursor, } from './activityCursor.js';
3
3
  export { LighterApiClient } from './apiClient.js';
4
4
  export { assetMarginModeInt, isAssetMarginEnabled } from './assetCollateral.js';
5
+ export { toBigOrNull, toRequiredBig } from './decimal.js';
5
6
  export { fetchDetailedAccount } from './fetchDetailedAccount.js';
6
7
  export { lighterAsset } from './lighterAsset.js';
7
8
  export { estimateLiquidationPrice } from './liquidation.js';
@@ -9,9 +10,10 @@ export { mapFill } from './mapFill.js';
9
10
  export { mapMarketContext } from './mapMarketContext.js';
10
11
  export { mapOpenPositions } from './mapOpenPositions.js';
11
12
  export { classifyAndMapOrders, isTriggerOrder, isTriggerType, mapOrder, mapOrderDetail, mapStatusReason, mapTriggerOrder, } from './mapOrder.js';
12
- export { mapPosition } from './mapPosition.js';
13
+ export { leverageFromImf, mapPosition } from './mapPosition.js';
13
14
  export { mapInterval } from './ohlcvInterval.js';
14
15
  export { formatOrderPrice, formatOrderSize } from './orderFormatting.js';
15
16
  export { toIsoFromMs, toIsoFromSeconds } from './time.js';
17
+ export { positionMarginConstraints } from './transferMargin.js';
16
18
  export { leverageToFraction, mapOrderTypeToInt, mapTimeInForceToInt, marginFractionToMaxLeverage, orderExpiryForTif, resolveTimeInForce, } from './wireEncoding.js';
17
19
  //# 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,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,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,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,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"}
@@ -4,6 +4,7 @@
4
4
  export { decodeActivityCursor, encodeActivityCursor, } from './activityCursor.js';
5
5
  export { LighterApiClient } from './apiClient.js';
6
6
  export { assetMarginModeInt, isAssetMarginEnabled } from './assetCollateral.js';
7
+ export { toBigOrNull, toRequiredBig } from './decimal.js';
7
8
  export { fetchDetailedAccount } from './fetchDetailedAccount.js';
8
9
  export { lighterAsset } from './lighterAsset.js';
9
10
  export { estimateLiquidationPrice } from './liquidation.js';
@@ -11,9 +12,10 @@ export { mapFill } from './mapFill.js';
11
12
  export { mapMarketContext } from './mapMarketContext.js';
12
13
  export { mapOpenPositions } from './mapOpenPositions.js';
13
14
  export { classifyAndMapOrders, isTriggerOrder, isTriggerType, mapOrder, mapOrderDetail, mapStatusReason, mapTriggerOrder, } from './mapOrder.js';
14
- export { mapPosition } from './mapPosition.js';
15
+ export { leverageFromImf, mapPosition } from './mapPosition.js';
15
16
  export { mapInterval } from './ohlcvInterval.js';
16
17
  export { formatOrderPrice, formatOrderSize } from './orderFormatting.js';
17
18
  export { toIsoFromMs, toIsoFromSeconds } from './time.js';
19
+ export { positionMarginConstraints } from './transferMargin.js';
18
20
  export { leverageToFraction, mapOrderTypeToInt, mapTimeInForceToInt, marginFractionToMaxLeverage, orderExpiryForTif, resolveTimeInForce, } from './wireEncoding.js';
19
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,oDAAoD;AAGpD,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,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,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,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,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,oDAAoD;AAGpD,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,4 +1,4 @@
1
- import type { MarketDisplay, Position } from '@lifi/perps-types';
1
+ import type { PerpsMarketDisplay, Position } from '@lifi/perps-types';
2
2
  import type { LtAccountPosition } from '../types/index.js';
3
3
  /**
4
4
  * Map raw Lighter account positions to open {@link Position}s, dropping
@@ -7,5 +7,5 @@ import type { LtAccountPosition } from '../types/index.js';
7
7
  *
8
8
  * @public
9
9
  */
10
- export declare const mapOpenPositions: (positions: LtAccountPosition[], resolveMarket: (marketId: number) => MarketDisplay) => Position[];
10
+ export declare const mapOpenPositions: (positions: LtAccountPosition[], resolveMarket: (marketId: number) => PerpsMarketDisplay) => Position[];
11
11
  //# sourceMappingURL=mapOpenPositions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapOpenPositions.d.ts","sourceRoot":"","sources":["../../../src/utils/mapOpenPositions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAG1D;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,iBAAiB,EAAE,EAC9B,eAAe,CAAC,QAAQ,EAAE,MAAM,KAAK,aAAa,KACjD,QAAQ,EAGgD,CAAA"}
1
+ {"version":3,"file":"mapOpenPositions.d.ts","sourceRoot":"","sources":["../../../src/utils/mapOpenPositions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAG1D;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,iBAAiB,EAAE,EAC9B,eAAe,CAAC,QAAQ,EAAE,MAAM,KAAK,kBAAkB,KACtD,QAAQ,EAGgD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"mapOpenPositions.js","sourceRoot":"","sources":["../../../src/utils/mapOpenPositions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,SAA8B,EAC9B,aAAkD,EACtC,EAAE,CACd,SAAS;KACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"mapOpenPositions.js","sourceRoot":"","sources":["../../../src/utils/mapOpenPositions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,SAA8B,EAC9B,aAAuD,EAC3C,EAAE,CACd,SAAS;KACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA"}
@@ -1,9 +1,17 @@
1
- import type { MarketDisplay, Position } from '@lifi/perps-types';
1
+ import type { PerpsMarketDisplay, Position } from '@lifi/perps-types';
2
2
  import type { LtAccountPosition } from '../types/index.js';
3
+ /**
4
+ * Display leverage from an IMF percent string: `100 / IMF` in exact decimal
5
+ * arithmetic before conversion to `number`. This value is for displaying the
6
+ * venue setting; provider risk calculations consume the original decimal IMF
7
+ * instead. `undefined` for a non-positive or unparsable IMF.
8
+ * @public
9
+ */
10
+ export declare const leverageFromImf: (imf: string) => number | undefined;
3
11
  /**
4
12
  * Map a raw Lighter account position to the generic Position type.
5
13
  * @param market - Backend-resolved market identity for `pos.market_id`.
6
14
  * @public
7
15
  */
8
- export declare const mapPosition: (pos: LtAccountPosition, market: MarketDisplay) => Position;
16
+ export declare const mapPosition: (pos: LtAccountPosition, market: PerpsMarketDisplay) => Position;
9
17
  //# sourceMappingURL=mapPosition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapPosition.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEhE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAG1D;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,iBAAiB,EACtB,QAAQ,aAAa,KACpB,QA4BF,CAAA"}
1
+ {"version":3,"file":"mapPosition.d.ts","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAI1D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAWtD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,iBAAiB,EACtB,QAAQ,kBAAkB,KACzB,QAgCF,CAAA"}
@@ -1,33 +1,54 @@
1
1
  import { MarginMode, PositionSide } from '@lifi/perps-types';
2
+ import Big from 'big.js';
2
3
  import { LT_MARGIN_MODE_ISOLATED } from '../types/index.js';
4
+ import { toPositiveRequiredBig, toRequiredBig } from './decimal.js';
5
+ /**
6
+ * Display leverage from an IMF percent string: `100 / IMF` in exact decimal
7
+ * arithmetic before conversion to `number`. This value is for displaying the
8
+ * venue setting; provider risk calculations consume the original decimal IMF
9
+ * instead. `undefined` for a non-positive or unparsable IMF.
10
+ * @public
11
+ */
12
+ export const leverageFromImf = (imf) => {
13
+ let parsed;
14
+ try {
15
+ parsed = new Big(imf);
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ if (parsed.lte(0)) {
21
+ return undefined;
22
+ }
23
+ return new Big(100).div(parsed).toNumber();
24
+ };
3
25
  /**
4
26
  * Map a raw Lighter account position to the generic Position type.
5
27
  * @param market - Backend-resolved market identity for `pos.market_id`.
6
28
  * @public
7
29
  */
8
30
  export const mapPosition = (pos, market) => {
9
- const size = parseFloat(pos.position);
31
+ const size = toRequiredBig(pos.position, 'position');
10
32
  const isIsolated = pos.margin_mode === LT_MARGIN_MODE_ISOLATED;
11
- // `allocated_margin` is only populated for isolated positions (always "0"
12
- // on cross accounts). For cross, derive margin as
13
- // `position_value × initial_margin_fraction / 100` (IMF is in percent).
14
- const positionValue = Math.abs(parseFloat(pos.position_value));
15
- const imf = parseFloat(pos.initial_margin_fraction);
33
+ const positionValue = toRequiredBig(pos.position_value, 'position_value').abs();
34
+ const imf = toPositiveRequiredBig(pos.initial_margin_fraction, 'initial_margin_fraction');
35
+ const initialMarginRequirement = positionValue.times(imf).div(100);
16
36
  const marginUsed = isIsolated
17
37
  ? pos.allocated_margin
18
- : ((positionValue * imf) / 100).toString();
38
+ : initialMarginRequirement.toFixed();
19
39
  return {
20
40
  market,
21
41
  side: pos.sign >= 0 ? PositionSide.LONG : PositionSide.SHORT,
22
- size: Math.abs(size).toString(),
42
+ size: size.abs().toFixed(),
23
43
  entryPrice: pos.avg_entry_price,
24
- markPrice: pos.position_value === '0' || size === 0
44
+ markPrice: positionValue.eq(0) || size.eq(0)
25
45
  ? '0'
26
- : (parseFloat(pos.position_value) / Math.abs(size)).toString(),
46
+ : positionValue.div(size.abs()).toFixed(),
27
47
  liquidationPrice: pos.liquidation_price,
28
48
  unrealizedPnl: pos.unrealized_pnl,
29
- leverage: imf > 0 ? Math.round(100 / imf) : 1,
49
+ leverage: leverageFromImf(pos.initial_margin_fraction) ?? 1,
30
50
  marginUsed,
51
+ initialMarginRequirement: initialMarginRequirement.toFixed(),
31
52
  marginMode: isIsolated ? MarginMode.ISOLATED : MarginMode.CROSS,
32
53
  };
33
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mapPosition.js","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAE3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,GAAsB,EACtB,MAAqB,EACX,EAAE;IACZ,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,KAAK,uBAAuB,CAAA;IAE9D,0EAA0E;IAC1E,kDAAkD;IAClD,wEAAwE;IACxE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAA;IAC9D,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IACnD,MAAM,UAAU,GAAG,UAAU;QAC3B,CAAC,CAAC,GAAG,CAAC,gBAAgB;QACtB,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;IAE5C,OAAO;QACL,MAAM;QACN,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK;QAC5D,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QAC/B,UAAU,EAAE,GAAG,CAAC,eAAe;QAC/B,SAAS,EACP,GAAG,CAAC,cAAc,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC;YACtC,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClE,gBAAgB,EAAE,GAAG,CAAC,iBAAiB;QACvC,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,UAAU;QACV,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK;KAChE,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"mapPosition.js","sourceRoot":"","sources":["../../../src/utils/mapPosition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,GAAG,MAAM,QAAQ,CAAA;AAExB,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEnE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAW,EAAsB,EAAE;IACjE,IAAI,MAAW,CAAA;IACf,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC5C,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,GAAsB,EACtB,MAA0B,EAChB,EAAE;IACZ,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IACpD,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,KAAK,uBAAuB,CAAA;IAC9D,MAAM,aAAa,GAAG,aAAa,CACjC,GAAG,CAAC,cAAc,EAClB,gBAAgB,CACjB,CAAC,GAAG,EAAE,CAAA;IACP,MAAM,GAAG,GAAG,qBAAqB,CAC/B,GAAG,CAAC,uBAAuB,EAC3B,yBAAyB,CAC1B,CAAA;IACD,MAAM,wBAAwB,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAClE,MAAM,UAAU,GAAG,UAAU;QAC3B,CAAC,CAAC,GAAG,CAAC,gBAAgB;QACtB,CAAC,CAAC,wBAAwB,CAAC,OAAO,EAAE,CAAA;IAEtC,OAAO;QACL,MAAM;QACN,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK;QAC5D,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;QAC1B,UAAU,EAAE,GAAG,CAAC,eAAe;QAC/B,SAAS,EACP,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;QAC7C,gBAAgB,EAAE,GAAG,CAAC,iBAAiB;QACvC,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC;QAC3D,UAAU;QACV,wBAAwB,EAAE,wBAAwB,CAAC,OAAO,EAAE;QAC5D,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK;KAChE,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { type Position, type PositionMarginConstraints } from '@lifi/perps-types';
2
+ /**
3
+ * Lighter's exact isolated-margin requirement. Lighter publishes no separate
4
+ * notional floor, so the provider-normalized initial-margin requirement is
5
+ * the retained amount.
6
+ *
7
+ * @see https://docs.lighter.xyz/trading/liquidations-and-llp-insurance-fund
8
+ * @public
9
+ */
10
+ export declare function positionMarginConstraints(position: Position): PositionMarginConstraints | undefined;
11
+ //# sourceMappingURL=transferMargin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferMargin.d.ts","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEb,KAAK,yBAAyB,EAC/B,MAAM,mBAAmB,CAAA;AAK1B;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,GACjB,yBAAyB,GAAG,SAAS,CAcvC"}
@@ -0,0 +1,22 @@
1
+ import { MarginMode, PositionMarginAdjustment, } from '@lifi/perps-types';
2
+ import { toPositiveRequiredBig } from './decimal.js';
3
+ const AMOUNT_INCREMENT = '0.000001';
4
+ /**
5
+ * Lighter's exact isolated-margin requirement. Lighter publishes no separate
6
+ * notional floor, so the provider-normalized initial-margin requirement is
7
+ * the retained amount.
8
+ *
9
+ * @see https://docs.lighter.xyz/trading/liquidations-and-llp-insurance-fund
10
+ * @public
11
+ */
12
+ export function positionMarginConstraints(position) {
13
+ if (position.marginMode !== MarginMode.ISOLATED ||
14
+ position.market.positionMarginAdjustment === PositionMarginAdjustment.NONE) {
15
+ return undefined;
16
+ }
17
+ return {
18
+ minimumMarginRequirement: toPositiveRequiredBig(position.initialMarginRequirement, 'initialMarginRequirement').toFixed(),
19
+ amountIncrement: AMOUNT_INCREMENT,
20
+ };
21
+ }
22
+ //# sourceMappingURL=transferMargin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferMargin.js","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,wBAAwB,GAEzB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,MAAM,gBAAgB,GAAG,UAAU,CAAA;AAEnC;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAAkB;IAElB,IACE,QAAQ,CAAC,UAAU,KAAK,UAAU,CAAC,QAAQ;QAC3C,QAAQ,CAAC,MAAM,CAAC,wBAAwB,KAAK,wBAAwB,CAAC,IAAI,EAC1E,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO;QACL,wBAAwB,EAAE,qBAAqB,CAC7C,QAAQ,CAAC,wBAAwB,EACjC,0BAA0B,CAC3B,CAAC,OAAO,EAAE;QACX,eAAe,EAAE,gBAAgB;KAClC,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"LighterWsProvider.d.ts","sourceRoot":"","sources":["../../../src/websocket/LighterWsProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAIlB,cAAc,EACd,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAIV,YAAY,EACb,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AA2EnC;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;AAEhC,UAAU,QAAQ;IAChB,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yEAAyE;IACzE,SAAS,EAAE,OAAO,CAAA;CACnB;AAkBD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,wBAAwB,CAAA;CAC5C;AAED;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,QAAQ,CAAC;IAC7D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAE5B;IACb,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IAEnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,cAAc,CAAoC;IAE1D;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2C;IAE9E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAErD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAqC;gBAGxE,KAAK,GAAE,MAA+B,EACtC,WAAW,GAAE,MAA6B,EAC1C,OAAO,GAAE,wBAA6B,EACtC,MAAM,CAAC,EAAE,cAAc;IAsBzB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAWnB,cAAc,CAClB,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,IAAI,CAAC;cAkBN,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;cA4ChD,OAAO,IAAI,IAAI;cAMlB,aAAa,CAAC,EAC5B,OAAO,EACP,SAAS,EACT,OAAO,GACR,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB3B,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;YA2B5B,cAAc;YAsFd,mBAAmB;YAqBnB,iBAAiB;IAK/B,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAqB1C,OAAO,CAAC,QAAQ;IAkFhB,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,sBAAsB;IAiC9B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,iBAAiB;IAuCzB,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,mBAAmB;CAc5B;AAkID;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAC3B,UAAU,wBAAwB,KAAG,iBAEmB,CAAA"}
1
+ {"version":3,"file":"LighterWsProvider.d.ts","sourceRoot":"","sources":["../../../src/websocket/LighterWsProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAKlB,cAAc,EACd,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAIV,YAAY,EACb,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AA4EnC;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;AAEhC,UAAU,QAAQ;IAChB,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yEAAyE;IACzE,SAAS,EAAE,OAAO,CAAA;CACnB;AAkBD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,wBAAwB,CAAA;CAC5C;AAED;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,QAAQ,CAAC;IAC7D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAE5B;IACb,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IAEnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,cAAc,CAAoC;IAE1D;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2C;IAE9E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAErD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAqC;gBAGxE,KAAK,GAAE,MAA+B,EACtC,WAAW,GAAE,MAA6B,EAC1C,OAAO,GAAE,wBAA6B,EACtC,MAAM,CAAC,EAAE,cAAc;IAsBzB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAWnB,cAAc,CAClB,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,IAAI,CAAC;cAkBN,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;cA4ChD,OAAO,IAAI,IAAI;cAMlB,aAAa,CAAC,EAC5B,OAAO,EACP,SAAS,EACT,OAAO,GACR,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB3B,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;YA2B5B,cAAc;YAsFd,mBAAmB;YAqBnB,iBAAiB;IAK/B,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAqB1C,OAAO,CAAC,QAAQ;IAkFhB,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,eAAe;IAuDvB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,sBAAsB;IAiC9B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,iBAAiB;IAuCzB,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,mBAAmB;CAc5B;AAkID;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAC3B,UAAU,wBAAwB,KAAG,iBAEmB,CAAA"}
@@ -1,7 +1,7 @@
1
- import { cachePromise, getMarketRegistry, ReconnectingWebSocket, resolveRetryPolicy, resolveSubscribeQuote, WsProviderBase, wsLog, } from '@lifi/perps-sdk';
1
+ import { cachePromise, getMarketRegistry, ReconnectingWebSocket, resolveRetryPolicy, resolveSubscribeQuote, toPerpsMarketDisplay, WsProviderBase, wsLog, } from '@lifi/perps-sdk';
2
2
  import { DEFAULT_LIGHTER_REST_URL, DEFAULT_LIGHTER_WS_URL, LIGHTER_BASE_FEE_TIER, LIGHTER_PROVIDER_KEY, } from '../constants.js';
3
3
  import { LIGHTER_RETRY_DEFAULTS, LighterApiClient } from '../utils/apiClient.js';
4
- import { classifyAndMapOrders, fetchDetailedAccount, mapFill, mapMarketContext, mapPosition, } from '../utils/index.js';
4
+ import { classifyAndMapOrders, fetchDetailedAccount, mapFill, mapMarketContext, mapPosition, toRequiredBig, } from '../utils/index.js';
5
5
  // Public channels: `marketsContext` (market_stats/all + spot_market_stats/all),
6
6
  // `marketContext` (market_stats/N or spot_market_stats/N), `orderbook`
7
7
  // (order_book/N), `trades` (trade/N).
@@ -354,23 +354,34 @@ export class LighterWsProvider extends WsProviderBase {
354
354
  return;
355
355
  }
356
356
  const stats = msg.stats;
357
- const portfolio = Number.parseFloat(stats?.portfolio_value ?? '');
358
- const available = Number.parseFloat(stats?.available_balance ?? '');
359
- if (!Number.isFinite(portfolio) || !Number.isFinite(available)) {
357
+ if (stats === undefined) {
360
358
  return;
361
359
  }
362
- // Identities of the REST 'net' semantics: `available_balance` nets locked
363
- // margin out with PnL marked in, and `collateral` is gross, PnL-exclusive.
364
- const collateral = Number.parseFloat(stats?.collateral ?? '');
360
+ const portfolio = toRequiredBig(stats.portfolio_value, 'stats.portfolio_value');
361
+ const collateral = toRequiredBig(stats.collateral, 'stats.collateral');
362
+ let available;
363
+ let marginUsed;
364
+ if (stats.cross_stats === undefined) {
365
+ // Compatibility with legacy gateways that omitted the entire
366
+ // cross_stats object.
367
+ available = toRequiredBig(stats.available_balance, 'stats.available_balance');
368
+ marginUsed = portfolio.minus(available);
369
+ }
370
+ else {
371
+ const crossCollateral = toRequiredBig(stats.cross_stats.collateral, 'stats.cross_stats.collateral');
372
+ const crossPortfolio = toRequiredBig(stats.cross_stats.portfolio_value, 'stats.cross_stats.portfolio_value');
373
+ available = toRequiredBig(stats.cross_stats.available_balance, 'stats.cross_stats.available_balance');
374
+ const isolatedMargin = collateral.minus(crossCollateral);
375
+ const crossMargin = crossPortfolio.minus(available);
376
+ marginUsed = isolatedMargin.plus(crossMargin);
377
+ }
365
378
  this.emit(`accountSummary:${address}`, {
366
379
  channel: 'accountSummary',
367
380
  data: {
368
381
  portfolioValue: portfolio.toString(),
369
382
  availableMargin: available.toString(),
370
- marginUsed: Math.max(portfolio - available, 0).toString(),
371
- unrealizedPnl: Number.isFinite(collateral)
372
- ? (portfolio - collateral).toString()
373
- : '0',
383
+ marginUsed: marginUsed.toString(),
384
+ unrealizedPnl: portfolio.minus(collateral).toString(),
374
385
  },
375
386
  });
376
387
  }
@@ -408,7 +419,7 @@ export class LighterWsProvider extends WsProviderBase {
408
419
  else {
409
420
  const market = this.registry?.get(String(p.market_id));
410
421
  if (market) {
411
- state.set(p.market_id, mapPosition(p, market));
422
+ state.set(p.market_id, mapPosition(p, toPerpsMarketDisplay(market)));
412
423
  }
413
424
  }
414
425
  }