@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.
- package/dist/cjs/LighterProvider.d.ts.map +1 -1
- package/dist/cjs/LighterProvider.js +10 -7
- package/dist/cjs/LighterProvider.js.map +1 -1
- package/dist/cjs/constants.d.ts.map +1 -1
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/signers/LighterSigner.js +1 -1
- package/dist/cjs/signers/LighterSigner.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +1 -1
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +3 -3
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/liquidation.js +1 -1
- package/dist/cjs/utils/liquidation.js.map +1 -1
- package/dist/cjs/utils/mapMarketContext.d.ts.map +1 -1
- package/dist/cjs/utils/mapMarketContext.js +12 -4
- package/dist/cjs/utils/mapMarketContext.js.map +1 -1
- package/dist/cjs/utils/orderFormatting.d.ts +3 -3
- package/dist/cjs/utils/orderFormatting.d.ts.map +1 -1
- package/dist/cjs/utils/orderFormatting.js +5 -5
- package/dist/cjs/utils/orderFormatting.js.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.js +16 -5
- package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
- package/dist/esm/LighterProvider.d.ts.map +1 -1
- package/dist/esm/LighterProvider.js +13 -10
- package/dist/esm/LighterProvider.js.map +1 -1
- package/dist/esm/constants.d.ts +4 -2
- package/dist/esm/constants.d.ts.map +1 -1
- package/dist/esm/constants.js +4 -2
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/signers/LighterSigner.js +2 -2
- package/dist/esm/signers/LighterSigner.js.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -1
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +1 -1
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/liquidation.js +1 -1
- package/dist/esm/utils/liquidation.js.map +1 -1
- package/dist/esm/utils/mapMarketContext.d.ts.map +1 -1
- package/dist/esm/utils/mapMarketContext.js +18 -4
- package/dist/esm/utils/mapMarketContext.js.map +1 -1
- package/dist/esm/utils/orderFormatting.d.ts +11 -11
- package/dist/esm/utils/orderFormatting.d.ts.map +1 -1
- package/dist/esm/utils/orderFormatting.js +12 -12
- package/dist/esm/utils/orderFormatting.js.map +1 -1
- package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/esm/utils/withdrawableBalances.js +17 -6
- package/dist/esm/utils/withdrawableBalances.js.map +1 -1
- package/dist/types/LighterProvider.d.ts.map +1 -1
- package/dist/types/constants.d.ts +4 -2
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +1 -1
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/mapMarketContext.d.ts.map +1 -1
- package/dist/types/utils/orderFormatting.d.ts +11 -11
- package/dist/types/utils/orderFormatting.d.ts.map +1 -1
- package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/LighterProvider.ts +19 -19
- package/src/constants.ts +4 -2
- package/src/signers/LighterSigner.ts +2 -2
- package/src/utils/index.ts +1 -1
- package/src/utils/liquidation.ts +1 -1
- package/src/utils/mapMarketContext.ts +24 -4
- package/src/utils/orderFormatting.ts +22 -12
- package/src/utils/withdrawableBalances.ts +26 -11
|
@@ -1,40 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Lighter order size and price
|
|
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
|
|
7
|
-
* the tick grid; sizes truncate
|
|
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
|
-
*
|
|
14
|
-
* `priceDecimals` (Lighter's `supported_price_decimals`), trailing
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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,
|
|
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,
|
|
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 {
|
|
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
|
-
|
|
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
|
-
?
|
|
30
|
-
: marginBalance;
|
|
31
|
-
if (perps.gt(0)) {
|
|
32
|
-
rows.push({
|
|
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,
|
|
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,
|
|
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.
|
|
18
|
-
*
|
|
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
|
|
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 {
|
|
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,
|
|
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":"
|
|
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
|
|
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
|
|
7
|
-
* the tick grid; sizes truncate
|
|
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
|
-
*
|
|
12
|
-
* `priceDecimals` (Lighter's `supported_price_decimals`), trailing
|
|
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
|
|
19
|
+
export declare function snapOrderPrice(market: Market, price: DecimalString): DecimalString;
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
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
|
|
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,
|
|
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,
|
|
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": "
|
|
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": "^
|
|
47
|
+
"@lifi/perps-types": "^19.0.0"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@lifi/perps-sdk": "^
|
|
50
|
+
"@lifi/perps-sdk": "^21.0.0"
|
|
51
51
|
},
|
|
52
52
|
"publishConfig": {
|
|
53
53
|
"access": "public"
|
package/src/LighterProvider.ts
CHANGED
|
@@ -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
|
-
?
|
|
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 =
|
|
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:
|
|
1070
|
-
maxOf(
|
|
1071
|
-
balance.minus(toRequiredBig(a.locked_balance, 'locked_balance')),
|
|
1072
|
-
new Big(0)
|
|
1073
|
-
),
|
|
1070
|
+
transferable: calculateTransferable(
|
|
1074
1071
|
balance
|
|
1075
|
-
|
|
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
|
-
|
|
1817
|
+
snapOrderPrice,
|
|
1818
1818
|
|
|
1819
|
-
|
|
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.
|
|
22
|
-
*
|
|
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 {
|
|
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
|
-
|
|
635
|
+
decimalToBaseUnits(amount, numberField(p, 'decimals'), 'truncate'),
|
|
636
636
|
SKIP_NONCE_DISABLED,
|
|
637
637
|
nonce,
|
|
638
638
|
ctx.apiKeyIndex,
|
package/src/utils/index.ts
CHANGED
|
@@ -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 {
|
|
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 {
|
package/src/utils/liquidation.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
7
|
-
* the tick grid; sizes truncate
|
|
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 {
|
|
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
|
-
*
|
|
16
|
-
* `priceDecimals` (Lighter's `supported_price_decimals`), trailing
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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 {
|
|
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
|
-
|
|
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
|
-
?
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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({
|
|
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
|