@lifi/perps-sdk-provider-lighter 35.1.0 → 36.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 +101 -58
- package/dist/cjs/LighterProvider.js.map +1 -1
- package/dist/cjs/accountSummary.d.ts +1 -2
- package/dist/cjs/accountSummary.d.ts.map +1 -1
- package/dist/cjs/accountSummary.js +9 -16
- package/dist/cjs/accountSummary.js.map +1 -1
- package/dist/cjs/availableToTrade.d.ts +1 -2
- package/dist/cjs/availableToTrade.d.ts.map +1 -1
- package/dist/cjs/availableToTrade.js +8 -12
- package/dist/cjs/availableToTrade.js.map +1 -1
- package/dist/cjs/signers/LighterSigner.d.ts.map +1 -1
- package/dist/cjs/signers/LighterSigner.js +2 -6
- package/dist/cjs/signers/LighterSigner.js.map +1 -1
- package/dist/cjs/types/submit.d.ts +5 -0
- package/dist/cjs/types/submit.d.ts.map +1 -1
- package/dist/cjs/utils/index.d.ts +3 -3
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +5 -6
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/mapFill.d.ts +1 -1
- package/dist/cjs/utils/mapFill.d.ts.map +1 -1
- package/dist/cjs/utils/mapFill.js +44 -31
- package/dist/cjs/utils/mapFill.js.map +1 -1
- package/dist/cjs/utils/mapOpenPositions.d.ts +3 -1
- package/dist/cjs/utils/mapOpenPositions.d.ts.map +1 -1
- package/dist/cjs/utils/mapOpenPositions.js +20 -4
- package/dist/cjs/utils/mapOpenPositions.js.map +1 -1
- package/dist/cjs/utils/mapOrder.d.ts +1 -1
- package/dist/cjs/utils/mapOrder.d.ts.map +1 -1
- package/dist/cjs/utils/mapOrder.js +64 -26
- package/dist/cjs/utils/mapOrder.js.map +1 -1
- package/dist/cjs/utils/mapPortfolioHistory.d.ts +1 -2
- package/dist/cjs/utils/mapPortfolioHistory.d.ts.map +1 -1
- package/dist/cjs/utils/mapPortfolioHistory.js +29 -21
- package/dist/cjs/utils/mapPortfolioHistory.js.map +1 -1
- package/dist/cjs/utils/mapPosition.d.ts +3 -3
- package/dist/cjs/utils/mapPosition.d.ts.map +1 -1
- package/dist/cjs/utils/mapPosition.js +35 -38
- package/dist/cjs/utils/mapPosition.js.map +1 -1
- package/dist/cjs/utils/rowTimestamp.d.ts +2 -0
- package/dist/cjs/utils/rowTimestamp.d.ts.map +1 -0
- package/dist/cjs/utils/rowTimestamp.js +14 -0
- package/dist/cjs/utils/rowTimestamp.js.map +1 -0
- package/dist/cjs/utils/settlementPool.d.ts +2 -3
- package/dist/cjs/utils/settlementPool.d.ts.map +1 -1
- package/dist/cjs/utils/settlementPool.js +8 -7
- package/dist/cjs/utils/settlementPool.js.map +1 -1
- package/dist/cjs/utils/spotPrice.d.ts +3 -4
- package/dist/cjs/utils/spotPrice.d.ts.map +1 -1
- package/dist/cjs/utils/spotPrice.js +6 -11
- package/dist/cjs/utils/spotPrice.js.map +1 -1
- package/dist/cjs/utils/time.d.ts.map +1 -1
- package/dist/cjs/utils/time.js +3 -2
- package/dist/cjs/utils/time.js.map +1 -1
- package/dist/cjs/utils/transferMargin.d.ts.map +1 -1
- package/dist/cjs/utils/transferMargin.js +8 -11
- package/dist/cjs/utils/transferMargin.js.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.d.ts +1 -1
- package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.js +12 -17
- package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
- package/dist/cjs/utils/withdrawalTypes.d.ts +17 -0
- package/dist/cjs/utils/withdrawalTypes.d.ts.map +1 -0
- package/dist/cjs/utils/withdrawalTypes.js +58 -0
- package/dist/cjs/utils/withdrawalTypes.js.map +1 -0
- package/dist/cjs/websocket/LighterWsProvider.d.ts.map +1 -1
- package/dist/cjs/websocket/LighterWsProvider.js +46 -58
- package/dist/cjs/websocket/LighterWsProvider.js.map +1 -1
- package/dist/cjs/websocket/orderBookSide.d.ts +19 -0
- package/dist/cjs/websocket/orderBookSide.d.ts.map +1 -0
- package/dist/cjs/websocket/orderBookSide.js +71 -0
- package/dist/cjs/websocket/orderBookSide.js.map +1 -0
- package/dist/esm/LighterProvider.d.ts.map +1 -1
- package/dist/esm/LighterProvider.js +116 -62
- package/dist/esm/LighterProvider.js.map +1 -1
- package/dist/esm/accountSummary.d.ts +1 -2
- package/dist/esm/accountSummary.d.ts.map +1 -1
- package/dist/esm/accountSummary.js +10 -14
- package/dist/esm/accountSummary.js.map +1 -1
- package/dist/esm/availableToTrade.d.ts +1 -2
- package/dist/esm/availableToTrade.d.ts.map +1 -1
- package/dist/esm/availableToTrade.js +9 -10
- package/dist/esm/availableToTrade.js.map +1 -1
- package/dist/esm/signers/LighterSigner.d.ts.map +1 -1
- package/dist/esm/signers/LighterSigner.js +3 -4
- package/dist/esm/signers/LighterSigner.js.map +1 -1
- package/dist/esm/types/submit.d.ts +14 -0
- package/dist/esm/types/submit.d.ts.map +1 -1
- package/dist/esm/utils/index.d.ts +3 -3
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +2 -3
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/mapFill.d.ts +1 -1
- package/dist/esm/utils/mapFill.d.ts.map +1 -1
- package/dist/esm/utils/mapFill.js +51 -35
- package/dist/esm/utils/mapFill.js.map +1 -1
- package/dist/esm/utils/mapOpenPositions.d.ts +17 -3
- package/dist/esm/utils/mapOpenPositions.d.ts.map +1 -1
- package/dist/esm/utils/mapOpenPositions.js +31 -5
- package/dist/esm/utils/mapOpenPositions.js.map +1 -1
- package/dist/esm/utils/mapOrder.d.ts +6 -2
- package/dist/esm/utils/mapOrder.d.ts.map +1 -1
- package/dist/esm/utils/mapOrder.js +70 -25
- package/dist/esm/utils/mapOrder.js.map +1 -1
- package/dist/esm/utils/mapPortfolioHistory.d.ts +6 -3
- package/dist/esm/utils/mapPortfolioHistory.d.ts.map +1 -1
- package/dist/esm/utils/mapPortfolioHistory.js +34 -19
- package/dist/esm/utils/mapPortfolioHistory.js.map +1 -1
- package/dist/esm/utils/mapPosition.d.ts +12 -9
- package/dist/esm/utils/mapPosition.d.ts.map +1 -1
- package/dist/esm/utils/mapPosition.js +45 -42
- package/dist/esm/utils/mapPosition.js.map +1 -1
- package/dist/esm/utils/rowTimestamp.d.ts +6 -0
- package/dist/esm/utils/rowTimestamp.d.ts.map +1 -0
- package/dist/esm/utils/rowTimestamp.js +14 -0
- package/dist/esm/utils/rowTimestamp.js.map +1 -0
- package/dist/esm/utils/settlementPool.d.ts +2 -3
- package/dist/esm/utils/settlementPool.d.ts.map +1 -1
- package/dist/esm/utils/settlementPool.js +8 -7
- package/dist/esm/utils/settlementPool.js.map +1 -1
- package/dist/esm/utils/spotPrice.d.ts +3 -4
- package/dist/esm/utils/spotPrice.d.ts.map +1 -1
- package/dist/esm/utils/spotPrice.js +6 -8
- package/dist/esm/utils/spotPrice.js.map +1 -1
- package/dist/esm/utils/time.d.ts +10 -2
- package/dist/esm/utils/time.d.ts.map +1 -1
- package/dist/esm/utils/time.js +13 -4
- package/dist/esm/utils/time.js.map +1 -1
- package/dist/esm/utils/transferMargin.d.ts.map +1 -1
- package/dist/esm/utils/transferMargin.js +9 -9
- package/dist/esm/utils/transferMargin.js.map +1 -1
- package/dist/esm/utils/withdrawableBalances.d.ts +5 -3
- package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/esm/utils/withdrawableBalances.js +17 -17
- package/dist/esm/utils/withdrawableBalances.js.map +1 -1
- package/dist/esm/utils/withdrawalTypes.d.ts +45 -0
- package/dist/esm/utils/withdrawalTypes.d.ts.map +1 -0
- package/dist/esm/utils/withdrawalTypes.js +68 -0
- package/dist/esm/utils/withdrawalTypes.js.map +1 -0
- package/dist/esm/websocket/LighterWsProvider.d.ts.map +1 -1
- package/dist/esm/websocket/LighterWsProvider.js +48 -57
- package/dist/esm/websocket/LighterWsProvider.js.map +1 -1
- package/dist/esm/websocket/orderBookSide.d.ts +33 -0
- package/dist/esm/websocket/orderBookSide.d.ts.map +1 -0
- package/dist/esm/websocket/orderBookSide.js +76 -0
- package/dist/esm/websocket/orderBookSide.js.map +1 -0
- package/dist/types/LighterProvider.d.ts.map +1 -1
- package/dist/types/accountSummary.d.ts +1 -2
- package/dist/types/accountSummary.d.ts.map +1 -1
- package/dist/types/availableToTrade.d.ts +1 -2
- package/dist/types/availableToTrade.d.ts.map +1 -1
- package/dist/types/signers/LighterSigner.d.ts.map +1 -1
- package/dist/types/types/submit.d.ts +14 -0
- package/dist/types/types/submit.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +3 -3
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/mapFill.d.ts +1 -1
- package/dist/types/utils/mapFill.d.ts.map +1 -1
- package/dist/types/utils/mapOpenPositions.d.ts +17 -3
- package/dist/types/utils/mapOpenPositions.d.ts.map +1 -1
- package/dist/types/utils/mapOrder.d.ts +6 -2
- package/dist/types/utils/mapOrder.d.ts.map +1 -1
- package/dist/types/utils/mapPortfolioHistory.d.ts +6 -3
- package/dist/types/utils/mapPortfolioHistory.d.ts.map +1 -1
- package/dist/types/utils/mapPosition.d.ts +12 -9
- package/dist/types/utils/mapPosition.d.ts.map +1 -1
- package/dist/types/utils/rowTimestamp.d.ts +6 -0
- package/dist/types/utils/rowTimestamp.d.ts.map +1 -0
- package/dist/types/utils/settlementPool.d.ts +2 -3
- package/dist/types/utils/settlementPool.d.ts.map +1 -1
- package/dist/types/utils/spotPrice.d.ts +3 -4
- package/dist/types/utils/spotPrice.d.ts.map +1 -1
- package/dist/types/utils/time.d.ts +10 -2
- package/dist/types/utils/time.d.ts.map +1 -1
- package/dist/types/utils/transferMargin.d.ts.map +1 -1
- package/dist/types/utils/withdrawableBalances.d.ts +5 -3
- package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/types/utils/withdrawalTypes.d.ts +45 -0
- package/dist/types/utils/withdrawalTypes.d.ts.map +1 -0
- package/dist/types/websocket/LighterWsProvider.d.ts.map +1 -1
- package/dist/types/websocket/orderBookSide.d.ts +33 -0
- package/dist/types/websocket/orderBookSide.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/LighterProvider.ts +236 -100
- package/src/accountSummary.ts +41 -22
- package/src/availableToTrade.ts +38 -15
- package/src/signers/LighterSigner.ts +11 -4
- package/src/types/submit.ts +15 -0
- package/src/utils/index.ts +9 -3
- package/src/utils/mapFill.ts +82 -43
- package/src/utils/mapOpenPositions.ts +45 -6
- package/src/utils/mapOrder.ts +99 -28
- package/src/utils/mapPortfolioHistory.ts +78 -24
- package/src/utils/mapPosition.ts +63 -47
- package/src/utils/rowTimestamp.ts +15 -0
- package/src/utils/settlementPool.ts +36 -12
- package/src/utils/spotPrice.ts +18 -12
- package/src/utils/time.ts +14 -4
- package/src/utils/transferMargin.ts +32 -15
- package/src/utils/withdrawableBalances.ts +34 -20
- package/src/utils/withdrawalTypes.ts +125 -0
- package/src/websocket/LighterWsProvider.ts +75 -92
- package/src/websocket/orderBookSide.ts +106 -0
- package/dist/cjs/utils/decimal.d.ts +0 -5
- package/dist/cjs/utils/decimal.d.ts.map +0 -1
- package/dist/cjs/utils/decimal.js +0 -38
- package/dist/cjs/utils/decimal.js.map +0 -1
- package/dist/cjs/utils/liquidation.d.ts +0 -4
- package/dist/cjs/utils/liquidation.d.ts.map +0 -1
- package/dist/cjs/utils/liquidation.js +0 -16
- package/dist/cjs/utils/liquidation.js.map +0 -1
- package/dist/esm/utils/decimal.d.ts +0 -15
- package/dist/esm/utils/decimal.d.ts.map +0 -1
- package/dist/esm/utils/decimal.js +0 -39
- package/dist/esm/utils/decimal.js.map +0 -1
- package/dist/esm/utils/liquidation.d.ts +0 -22
- package/dist/esm/utils/liquidation.d.ts.map +0 -1
- package/dist/esm/utils/liquidation.js +0 -31
- package/dist/esm/utils/liquidation.js.map +0 -1
- package/dist/types/utils/decimal.d.ts +0 -15
- package/dist/types/utils/decimal.d.ts.map +0 -1
- package/dist/types/utils/liquidation.d.ts +0 -22
- package/dist/types/utils/liquidation.d.ts.map +0 -1
- package/src/utils/decimal.ts +0 -52
- package/src/utils/liquidation.ts +0 -39
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OrderBookSide = exports.askOrder = exports.bidOrder = void 0;
|
|
4
|
+
const perps_sdk_1 = require("@lifi/perps-sdk");
|
|
5
|
+
const bidOrder = (a, b) => (0, perps_sdk_1.compareDecimalStrings)(b, a);
|
|
6
|
+
exports.bidOrder = bidOrder;
|
|
7
|
+
const askOrder = (a, b) => (0, perps_sdk_1.compareDecimalStrings)(a, b);
|
|
8
|
+
exports.askOrder = askOrder;
|
|
9
|
+
class OrderBookSide {
|
|
10
|
+
order;
|
|
11
|
+
providerKey;
|
|
12
|
+
byPrice = new Map();
|
|
13
|
+
levels = [];
|
|
14
|
+
constructor(order, providerKey) {
|
|
15
|
+
this.order = order;
|
|
16
|
+
this.providerKey = providerKey;
|
|
17
|
+
}
|
|
18
|
+
apply(updates) {
|
|
19
|
+
for (const { price, size } of updates) {
|
|
20
|
+
if (!(0, perps_sdk_1.isDecimalString)(price)) {
|
|
21
|
+
perps_sdk_1.wsLog.skippedRow(this.providerKey, 'order book level', 'price', price);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (!(0, perps_sdk_1.isDecimalString)(size)) {
|
|
25
|
+
perps_sdk_1.wsLog.skippedRow(this.providerKey, 'order book level', 'size', size);
|
|
26
|
+
this.remove(price);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if ((0, perps_sdk_1.isDecimalStringZero)(size)) {
|
|
30
|
+
this.remove(price);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const existing = this.byPrice.get(price);
|
|
34
|
+
if (existing) {
|
|
35
|
+
existing.size = size;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const level = { price, size };
|
|
39
|
+
this.byPrice.set(price, level);
|
|
40
|
+
this.levels.splice(this.bound(level.price, (c) => c > 0), 0, level);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
toLevels() {
|
|
45
|
+
return this.levels.map(({ price, size }) => ({ price, size }));
|
|
46
|
+
}
|
|
47
|
+
remove(price) {
|
|
48
|
+
const existing = this.byPrice.get(price);
|
|
49
|
+
if (existing === undefined) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.byPrice.delete(price);
|
|
53
|
+
this.levels.splice(this.levels.indexOf(existing, this.bound(existing.price, (c) => c >= 0)), 1);
|
|
54
|
+
}
|
|
55
|
+
bound(price, isPast) {
|
|
56
|
+
let lo = 0;
|
|
57
|
+
let hi = this.levels.length;
|
|
58
|
+
while (lo < hi) {
|
|
59
|
+
const mid = (lo + hi) >>> 1;
|
|
60
|
+
if (isPast(this.order(this.levels[mid].price, price))) {
|
|
61
|
+
hi = mid;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
lo = mid + 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return lo;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.OrderBookSide = OrderBookSide;
|
|
71
|
+
//# sourceMappingURL=orderBookSide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orderBookSide.js","sourceRoot":"","sources":["../../../src/websocket/orderBookSide.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,EAgBL,KAAK,mBAAmB,EAsBxB,KAAK,cAAc,EAQpB,MAAM,iBAAiB,CAAA;AAkCxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAQnC,OAAO,EAUL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAA;AA4LvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,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;;;;OAIG;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,oBA8nDF,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,6 +1,5 @@
|
|
|
1
|
-
import { ACTIVE_ORDER_STATUSES, calculateTransferable, explorerTxUrl, explorerTxUrlFromBase, getAssetRegistry, getMarketRegistry, getMarketsContext, getProviders, isActiveOrderStatus,
|
|
1
|
+
import { ACTIVE_ORDER_STATUSES, calculateTransferable, estimateLiquidationPriceAtMarketRate, explorerTxUrl, explorerTxUrlFromBase, getAssetRegistry, getMarketRegistry, getMarketsContext, getProviders, isActiveOrderStatus, isDecimalStringGreaterThan, localStorageAdapter, numberToDecimalString, PerpsError, paginateActivity, resolveQuote, resolveRetryPolicy, safeAbsDecimalString, safeAddDecimalString, safeMultiplyDecimalString, subtractDecimalString, toPerpsMarketDisplay, unknownToDecimalString, } from '@lifi/perps-sdk';
|
|
2
2
|
import { ActionType, ActivityType, MarginMode, PerpsErrorCode, } from '@lifi/perps-types';
|
|
3
|
-
import Big from 'big.js';
|
|
4
3
|
import { boundAccountTiers, projectLighterConfigSettings, resolveAccountTier, } from './accountConfig.js';
|
|
5
4
|
import { getAccountSummary, lighterConfig } from './accountSummary.js';
|
|
6
5
|
import { lighterAvailableToTrade } from './availableToTrade.js';
|
|
@@ -15,13 +14,16 @@ import { LT_ACCOUNT_TRADING_MODE_SIMPLE, LT_ACCOUNT_TRADING_MODE_UNIFIED, LT_MAR
|
|
|
15
14
|
import { decodeActivityCursor, encodeActivityCursor, } from './utils/activityCursor.js';
|
|
16
15
|
import { LIGHTER_RETRY_DEFAULTS, LighterApiClient, LighterAuthRejectedError, LighterTokenRevokedError, } from './utils/apiClient.js';
|
|
17
16
|
import { isAssetMarginEnabled } from './utils/assetCollateral.js';
|
|
18
|
-
import {
|
|
17
|
+
import { fetchDetailedAccount, leverageFromImf, lighterAsset, lighterFastWithdrawal, lighterWithdrawableBalances, lighterWithdrawalTypes, mapFill, mapOpenPositions, mapOrder, mapPortfolioHistory, positionRemovableMargin, snapOrderPrice, snapOrderSize, toIsoFromMs, toIsoFromSeconds, } from './utils/index.js';
|
|
18
|
+
import { requireOpenPositions } from './utils/mapOpenPositions.js';
|
|
19
19
|
import { fetchRegisteredApiKey, normalizeLighterPublicKey, } from './utils/registeredApiKey.js';
|
|
20
20
|
import { collateralSpotBalance, pooledSettlementSpendable, pooledSettlementUnits, } from './utils/settlementPool.js';
|
|
21
21
|
import { spotPriceByAssetId, spotValuation } from './utils/spotPrice.js';
|
|
22
22
|
import { isPlaceholderTxHash } from './utils/txHash.js';
|
|
23
23
|
import { wireList } from './utils/wireList.js';
|
|
24
24
|
const ZERO_FEE_TIER = { maker: '0', taker: '0' };
|
|
25
|
+
/** The sum of `values`, or `undefined` when any term is not a decimal string. */
|
|
26
|
+
const safeSum = (values) => values.reduce((sum, value) => sum === undefined ? undefined : safeAddDecimalString(sum, value), '0');
|
|
25
27
|
const tickToFeeString = (tick) => numberToDecimalString(tick / LIGHTER_FEE_TICK_SCALE);
|
|
26
28
|
const projectFeeTier = (limits) => ({
|
|
27
29
|
maker: tickToFeeString(limits.current_maker_fee_tick),
|
|
@@ -306,6 +308,54 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
306
308
|
return await run(fresh);
|
|
307
309
|
}
|
|
308
310
|
};
|
|
311
|
+
/**
|
|
312
|
+
* {@link retryOnRevoked}, then one retry with the standard token when the
|
|
313
|
+
* venue rejects the read-only one. The fallback sits outside
|
|
314
|
+
* `retryOnRevoked`, so a revocation the standard token reports never
|
|
315
|
+
* replaces the read-only one. The key is re-read at retry time because
|
|
316
|
+
* `REGISTER_API_KEY` can rotate it.
|
|
317
|
+
*/
|
|
318
|
+
const retryWithStandardToken = (address, apiKey, token, run) => retryOnRevoked(address, token, run).catch(async (err) => {
|
|
319
|
+
if (!(err instanceof LighterAuthRejectedError) || apiKey === null) {
|
|
320
|
+
throw err;
|
|
321
|
+
}
|
|
322
|
+
const current = (await keyStore.get(address)) ?? apiKey;
|
|
323
|
+
return run(await getStandardAuthToken(address, current.apiKeyPrivateKey, {
|
|
324
|
+
apiKeyIndex: current.apiKeyIndex,
|
|
325
|
+
accountIndex: current.accountIndex,
|
|
326
|
+
}));
|
|
327
|
+
});
|
|
328
|
+
const perpsCategoryId = async () => {
|
|
329
|
+
const { providers } = await getProviders(requireClient());
|
|
330
|
+
return (providers
|
|
331
|
+
.find((p) => p.key === providerKey)
|
|
332
|
+
?.categories.find((c) => c.quoteAsset !== null)?.id ?? providerKey);
|
|
333
|
+
};
|
|
334
|
+
/**
|
|
335
|
+
* The fast-withdraw terms for `accountIndex`, or `undefined` when no token
|
|
336
|
+
* resolves, a read fails, or Lighter offers no fast withdrawal.
|
|
337
|
+
*/
|
|
338
|
+
const readFastWithdrawal = async (client, address, accountIndex) => {
|
|
339
|
+
try {
|
|
340
|
+
const apiKey = await keyStore.get(address);
|
|
341
|
+
const token = await resolveAuthToken(address, apiKey ?? undefined);
|
|
342
|
+
if (token === undefined) {
|
|
343
|
+
return undefined;
|
|
344
|
+
}
|
|
345
|
+
const info = await retryWithStandardToken(address, apiKey, token, (t) => client.getAuthed('/api/v1/fastwithdraw/info', t, { account_index: accountIndex }));
|
|
346
|
+
if (info.code !== 200 || !(info.to_account_index > 0)) {
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
349
|
+
const feeInfo = await retryWithStandardToken(address, apiKey, token, (t) => client.getAuthed('/api/v1/transferFeeInfo', t, {
|
|
350
|
+
account_index: accountIndex,
|
|
351
|
+
to_account_index: info.to_account_index,
|
|
352
|
+
}));
|
|
353
|
+
return lighterFastWithdrawal(info, feeInfo);
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
return undefined;
|
|
357
|
+
}
|
|
358
|
+
};
|
|
309
359
|
const fetchAccountLimits = (client, accountIndex, authToken) => client.getAuthed('/api/v1/accountLimits', authToken, {
|
|
310
360
|
account_index: accountIndex,
|
|
311
361
|
});
|
|
@@ -409,7 +459,10 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
409
459
|
if (leverage === undefined || !(leverage > 0)) {
|
|
410
460
|
throw new PerpsError(PerpsErrorCode.SDKError, `The backend market '${marketId}' carries no positive Lighter default leverage`);
|
|
411
461
|
}
|
|
412
|
-
return {
|
|
462
|
+
return {
|
|
463
|
+
marginMode: MarginMode.CROSS,
|
|
464
|
+
leverage: numberToDecimalString(leverage),
|
|
465
|
+
};
|
|
413
466
|
};
|
|
414
467
|
const resolveAccountExists = async (address, opts) => (await fetchAccountIfExists(apiClient(opts), address)) !== undefined;
|
|
415
468
|
let setupPromise;
|
|
@@ -518,24 +571,24 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
518
571
|
? readOnlyTokenManager.get(params.address, localKey.accountIndex)
|
|
519
572
|
: Promise.resolve(undefined),
|
|
520
573
|
]);
|
|
521
|
-
const positions =
|
|
522
|
-
const totalMarginUsed = positions.
|
|
523
|
-
const totalUnrealizedPnl = positions.
|
|
574
|
+
const positions = requireOpenPositions(account.positions, (id) => toPerpsMarketDisplay(registry.require(String(id))));
|
|
575
|
+
const totalMarginUsed = safeSum(positions.map((p) => p.marginUsed));
|
|
576
|
+
const totalUnrealizedPnl = safeSum(positions.map((p) => p.unrealizedPnl));
|
|
524
577
|
const instanceMeta = providers.find((p) => p.key === providerKey);
|
|
525
578
|
const categories = instanceMeta?.categories ?? [];
|
|
526
579
|
const perpsCategory = categories.find((c) => c.quoteAsset !== null);
|
|
527
|
-
const availableBalance =
|
|
580
|
+
const availableBalance = unknownToDecimalString(account.available_balance, 'available_balance', providerKey);
|
|
528
581
|
// Each asset has a spot route (`balance`) and a perps route
|
|
529
582
|
// (`margin_balance`). The instance's settlement asset is valued 1:1; an
|
|
530
583
|
// asset no spot market prices keeps a zero USD value. A unified account
|
|
531
584
|
// pools both settlement routes into one spot row.
|
|
532
585
|
const isPooled = (asset) => account.account_trading_mode === LT_ACCOUNT_TRADING_MODE_UNIFIED &&
|
|
533
586
|
asset.asset_id === collateral.assetIndex;
|
|
534
|
-
const heldAssets = account.assets.filter((asset) => (isPooled(asset)
|
|
587
|
+
const heldAssets = account.assets.filter((asset) => isDecimalStringGreaterThan(isPooled(asset)
|
|
535
588
|
? pooledSettlementUnits(asset)
|
|
536
|
-
:
|
|
589
|
+
: unknownToDecimalString(asset.balance, 'balance', providerKey), '0'));
|
|
537
590
|
const marginAssets = account.assets.filter((asset) => !isPooled(asset) &&
|
|
538
|
-
|
|
591
|
+
isDecimalStringGreaterThan(unknownToDecimalString(asset.margin_balance, 'margin_balance', providerKey), '0'));
|
|
539
592
|
const spotPrices = spotPriceByAssetId(registry.markets, LIGHTER_SPOT_CATEGORY_ID, prices, new Set([...heldAssets, ...marginAssets]
|
|
540
593
|
.filter((a) => a.asset_id !== collateral.assetIndex)
|
|
541
594
|
.map((a) => String(a.asset_id))));
|
|
@@ -546,7 +599,7 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
546
599
|
asset,
|
|
547
600
|
units,
|
|
548
601
|
valueUsd,
|
|
549
|
-
...(price === undefined ? {} : { price
|
|
602
|
+
...(price === undefined ? {} : { price }),
|
|
550
603
|
};
|
|
551
604
|
};
|
|
552
605
|
const registryAsset = (a) => assetRegistry.get(String(a.asset_id)) ??
|
|
@@ -559,28 +612,26 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
559
612
|
// account's free margin; every other perps-route asset releases none.
|
|
560
613
|
const collateralBalances = marginAssets.map((a) => {
|
|
561
614
|
const isSettlement = a.asset_id === collateral.assetIndex;
|
|
562
|
-
const marginBalance =
|
|
615
|
+
const marginBalance = unknownToDecimalString(a.margin_balance, 'margin_balance', providerKey);
|
|
563
616
|
return {
|
|
564
|
-
...toBalance(a, perpsCategory?.id ?? providerKey, isSettlement ? settlementAsset : registryAsset(a),
|
|
617
|
+
...toBalance(a, perpsCategory?.id ?? providerKey, isSettlement ? settlementAsset : registryAsset(a), marginBalance),
|
|
565
618
|
transferable: isSettlement
|
|
566
|
-
? calculateTransferable(availableBalance
|
|
619
|
+
? calculateTransferable(availableBalance, marginBalance)
|
|
567
620
|
: '0',
|
|
568
621
|
};
|
|
569
622
|
});
|
|
570
623
|
const balances = heldAssets.map((a) => {
|
|
571
624
|
if (isPooled(a)) {
|
|
572
|
-
const units = pooledSettlementUnits(a)
|
|
625
|
+
const units = pooledSettlementUnits(a);
|
|
573
626
|
return {
|
|
574
627
|
...toBalance(a, LIGHTER_SPOT_CATEGORY_ID, registryAsset(a), units),
|
|
575
|
-
transferable: calculateTransferable(pooledSettlementSpendable(a, availableBalance)
|
|
628
|
+
transferable: calculateTransferable(pooledSettlementSpendable(a, availableBalance), units),
|
|
576
629
|
};
|
|
577
630
|
}
|
|
578
|
-
const balance =
|
|
631
|
+
const balance = unknownToDecimalString(a.balance, 'balance', providerKey);
|
|
579
632
|
return {
|
|
580
|
-
...toBalance(a, LIGHTER_SPOT_CATEGORY_ID, registryAsset(a),
|
|
581
|
-
transferable: calculateTransferable(balance
|
|
582
|
-
.minus(toRequiredBig(a.locked_balance, 'locked_balance'))
|
|
583
|
-
.toFixed(), balance.toFixed()),
|
|
633
|
+
...toBalance(a, LIGHTER_SPOT_CATEGORY_ID, registryAsset(a), balance),
|
|
634
|
+
transferable: calculateTransferable(subtractDecimalString(balance, unknownToDecimalString(a.locked_balance, 'locked_balance', providerKey)), balance),
|
|
584
635
|
};
|
|
585
636
|
});
|
|
586
637
|
const assetCollateral = account.assets.flatMap((a) => a.margin_mode === undefined
|
|
@@ -620,8 +671,12 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
620
671
|
balances,
|
|
621
672
|
collateralBalances,
|
|
622
673
|
positions,
|
|
623
|
-
|
|
624
|
-
|
|
674
|
+
...(totalMarginUsed === undefined
|
|
675
|
+
? {}
|
|
676
|
+
: { marginUsed: totalMarginUsed }),
|
|
677
|
+
...(totalUnrealizedPnl === undefined
|
|
678
|
+
? {}
|
|
679
|
+
: { unrealizedPnl: totalUnrealizedPnl }),
|
|
625
680
|
feeTier: limitsResult === undefined
|
|
626
681
|
? ZERO_FEE_TIER
|
|
627
682
|
: projectFeeTier(limitsResult),
|
|
@@ -635,8 +690,21 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
635
690
|
return lighterDepositFlow(providerKey, await resolveAccountExists(params.address, opts));
|
|
636
691
|
},
|
|
637
692
|
async getWithdrawableBalances(params, opts) {
|
|
638
|
-
const account = await
|
|
639
|
-
|
|
693
|
+
const [account, categoryId] = await Promise.all([
|
|
694
|
+
fetchDetailedAccount(apiClient(opts), params.address),
|
|
695
|
+
perpsCategoryId(),
|
|
696
|
+
]);
|
|
697
|
+
return lighterWithdrawableBalances(account, collateral.assetIndex, categoryId);
|
|
698
|
+
},
|
|
699
|
+
async getWithdrawalTypes(params, opts) {
|
|
700
|
+
const client = apiClient(opts);
|
|
701
|
+
const [account, categoryId] = await Promise.all([
|
|
702
|
+
fetchDetailedAccount(client, params.address),
|
|
703
|
+
perpsCategoryId(),
|
|
704
|
+
]);
|
|
705
|
+
const rows = lighterWithdrawableBalances(account, collateral.assetIndex, categoryId);
|
|
706
|
+
const fast = await readFastWithdrawal(client, params.address, account.index);
|
|
707
|
+
return lighterWithdrawalTypes(rows, { categoryId, asset: { id: String(collateral.assetIndex) } }, fast);
|
|
640
708
|
},
|
|
641
709
|
async getPositions(params, opts) {
|
|
642
710
|
const client = apiClient(opts);
|
|
@@ -668,8 +736,7 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
668
736
|
}
|
|
669
737
|
const account = await plugin.getAccount({ address: params.address }, opts);
|
|
670
738
|
const config = lighterConfig(account);
|
|
671
|
-
|
|
672
|
-
return lighterAvailableToTrade(market, crossFreeCollateral.toFixed(), account.positions);
|
|
739
|
+
return lighterAvailableToTrade(market, subtractDecimalString(unknownToDecimalString(config.crossAssetValue, 'crossAssetValue', providerKey), unknownToDecimalString(config.crossInitialMarginRequirement, 'crossInitialMarginRequirement', providerKey)), account.positions);
|
|
673
740
|
},
|
|
674
741
|
/**
|
|
675
742
|
* Lighter reports a market's margin mode and leverage on the account's
|
|
@@ -687,7 +754,7 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
687
754
|
// An unparsable IMF throws; a non-positive one means no stored setting.
|
|
688
755
|
const leverage = row === undefined
|
|
689
756
|
? undefined
|
|
690
|
-
: leverageFromImf(
|
|
757
|
+
: leverageFromImf(unknownToDecimalString(row.initial_margin_fraction, 'initial_margin_fraction', providerKey));
|
|
691
758
|
if (row === undefined || leverage === undefined) {
|
|
692
759
|
return resolveDefaultMarketSettings(marketId);
|
|
693
760
|
}
|
|
@@ -755,7 +822,7 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
755
822
|
continue;
|
|
756
823
|
}
|
|
757
824
|
const order = mapOrder(raw, market);
|
|
758
|
-
if (statuses.has(order.status)) {
|
|
825
|
+
if (order !== undefined && statuses.has(order.status)) {
|
|
759
826
|
orders.push(order);
|
|
760
827
|
}
|
|
761
828
|
}
|
|
@@ -790,7 +857,14 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
790
857
|
registry.sync(),
|
|
791
858
|
]);
|
|
792
859
|
const notFound = () => new PerpsError(PerpsErrorCode.OrderNotFound, `Lighter order ${params.id} not found for ${params.address}`);
|
|
793
|
-
const
|
|
860
|
+
const mapDetail = (order) => mapOrder(order, registry.require(String(order.market_index)));
|
|
861
|
+
const detail = (order) => {
|
|
862
|
+
const mapped = mapDetail(order);
|
|
863
|
+
if (mapped === undefined) {
|
|
864
|
+
throw notFound();
|
|
865
|
+
}
|
|
866
|
+
return mapped;
|
|
867
|
+
};
|
|
794
868
|
// A tx-hash route would require mapping the caller's executeAction tx
|
|
795
869
|
// hash → wasm nonce → matching order, which the LI.FI backend did via
|
|
796
870
|
// its `UserAction` table; the SDK has no equivalent persistence, so we
|
|
@@ -813,7 +887,7 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
813
887
|
// client order index can match more than one row. Prefer the live one.
|
|
814
888
|
const matches = orders
|
|
815
889
|
.filter((o) => String(o.client_order_index) === clientOrderIndex)
|
|
816
|
-
.
|
|
890
|
+
.flatMap((o) => mapDetail(o) ?? []);
|
|
817
891
|
const hit = matches.find((o) => isActiveOrderStatus(o.status)) ?? matches[0];
|
|
818
892
|
if (hit === undefined) {
|
|
819
893
|
throw notFound();
|
|
@@ -861,10 +935,8 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
861
935
|
// resolves, so its rows stay.
|
|
862
936
|
const items = wireList(response.trades).flatMap((t) => {
|
|
863
937
|
const market = registry.get(String(t.market_id));
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
}
|
|
867
|
-
return [mapFill(t, account.index, market)];
|
|
938
|
+
const mapped = market && mapFill(t, account.index, market);
|
|
939
|
+
return mapped ? [mapped] : [];
|
|
868
940
|
});
|
|
869
941
|
return {
|
|
870
942
|
provider: providerKey,
|
|
@@ -895,22 +967,9 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
895
967
|
ignore_transfers: false,
|
|
896
968
|
};
|
|
897
969
|
const read = (tok) => client.getAuthed('/api/v1/pnl', tok, queryParams);
|
|
898
|
-
// The read-only token may not be accepted on `/pnl`; the standard token
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
// token reports never replaces the read-only one. The key is re-read at
|
|
902
|
-
// retry time because `REGISTER_API_KEY` can rotate it.
|
|
903
|
-
const response = await retryOnRevoked(params.address, token, read).catch(async (err) => {
|
|
904
|
-
if (!(err instanceof LighterAuthRejectedError) || apiKey === null) {
|
|
905
|
-
throw err;
|
|
906
|
-
}
|
|
907
|
-
const current = (await keyStore.get(params.address)) ?? apiKey;
|
|
908
|
-
return read(await getStandardAuthToken(params.address, current.apiKeyPrivateKey, {
|
|
909
|
-
apiKeyIndex: current.apiKeyIndex,
|
|
910
|
-
accountIndex: current.accountIndex,
|
|
911
|
-
}));
|
|
912
|
-
});
|
|
913
|
-
return mapPortfolioHistory(params.range, wireList(response.pnl), new Big(getAccountSummary(account, account.positions).portfolioValue));
|
|
970
|
+
// The read-only token may not be accepted on `/pnl`; the standard token is.
|
|
971
|
+
const response = await retryWithStandardToken(params.address, apiKey, token, read);
|
|
972
|
+
return mapPortfolioHistory(params.range, wireList(response.pnl), getAccountSummary(account, account.positions).portfolioValue);
|
|
914
973
|
},
|
|
915
974
|
async getActivity(params, opts) {
|
|
916
975
|
const token = await requireAuthToken('activity read', params.address);
|
|
@@ -986,8 +1045,8 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
986
1045
|
if (market === undefined) {
|
|
987
1046
|
return [];
|
|
988
1047
|
}
|
|
989
|
-
const
|
|
990
|
-
const
|
|
1048
|
+
const notional = safeMultiplyDecimalString(l.trade.price, l.trade.size);
|
|
1049
|
+
const liquidatedNotionalPosition = notional === undefined ? undefined : safeAbsDecimalString(notional);
|
|
991
1050
|
const marginMode = wireList(l.info.positions).find((p) => p.market_id === l.market_id)?.margin_mode;
|
|
992
1051
|
// Lighter reports the margin mode as an integer, so the venue
|
|
993
1052
|
// vocabulary the contract asks for is the SDK's own literal. An
|
|
@@ -1004,14 +1063,9 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
1004
1063
|
provider: providerKey,
|
|
1005
1064
|
timestamp: toIsoFromMs(l.executed_at),
|
|
1006
1065
|
type: ActivityType.LIQUIDATION,
|
|
1007
|
-
...(
|
|
1066
|
+
...(liquidatedNotionalPosition === undefined
|
|
1008
1067
|
? {}
|
|
1009
|
-
: {
|
|
1010
|
-
liquidatedNotionalPosition: price
|
|
1011
|
-
.times(size)
|
|
1012
|
-
.abs()
|
|
1013
|
-
.toFixed(),
|
|
1014
|
-
}),
|
|
1068
|
+
: { liquidatedNotionalPosition }),
|
|
1015
1069
|
// The account value at liquidation time is the pre-trade
|
|
1016
1070
|
// snapshot, not the settled one Lighter also reports.
|
|
1017
1071
|
...(accountValue === undefined ? {} : { accountValue }),
|
|
@@ -1075,7 +1129,7 @@ export const createLighterProvider = (deployment, options = {}) => {
|
|
|
1075
1129
|
},
|
|
1076
1130
|
snapOrderPrice,
|
|
1077
1131
|
snapOrderSize,
|
|
1078
|
-
estimateLiquidationPrice,
|
|
1132
|
+
estimateLiquidationPrice: estimateLiquidationPriceAtMarketRate,
|
|
1079
1133
|
positionRemovableMargin,
|
|
1080
1134
|
projectConfig(config, setup) {
|
|
1081
1135
|
if (config.provider !== providerKey) {
|