@drift-labs/common 1.0.20 → 1.0.22
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/lib/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.d.ts +6 -2
- package/lib/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.js +3 -3
- package/lib/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/types/UIMarket.js +2 -1
- package/lib/types/UIMarket.js.map +1 -1
- package/lib/utils/markets/precisions.d.ts +14 -0
- package/lib/utils/markets/precisions.js +35 -0
- package/lib/utils/markets/precisions.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BN, DriftClient, User, PositionDirection } from '@drift-labs/sdk';
|
|
2
2
|
import { PublicKey, TransactionInstruction } from '@solana/web3.js';
|
|
3
|
-
export declare const ISOLATED_POSITION_DEPOSIT_BUFFER_BPS =
|
|
3
|
+
export declare const ISOLATED_POSITION_DEPOSIT_BUFFER_BPS = 20;
|
|
4
4
|
export interface ComputeIsolatedPositionDepositParams {
|
|
5
5
|
driftClient: DriftClient;
|
|
6
6
|
user: User;
|
|
@@ -25,10 +25,14 @@ export interface ComputeIsolatedPositionDepositParams {
|
|
|
25
25
|
* If greater than 0, we will consider the trade as entering high leverage mode.
|
|
26
26
|
*/
|
|
27
27
|
numOfOpenHighLeverageSpots?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Whether to use the buffer for the isolated position deposit.
|
|
30
|
+
*/
|
|
31
|
+
bufferBpsDenominator?: number;
|
|
28
32
|
}
|
|
29
33
|
/**
|
|
30
34
|
* Computes the isolated position deposit required for opening an isolated perp position.
|
|
31
35
|
* Returns a BN in QUOTE_PRECISION (USDC).
|
|
32
36
|
*/
|
|
33
|
-
export declare function computeIsolatedPositionDepositForTrade({ driftClient, user, marketIndex, baseAssetAmount, direction, marginRatio, entryPrice, numOfOpenHighLeverageSpots, }: ComputeIsolatedPositionDepositParams): BN | null;
|
|
37
|
+
export declare function computeIsolatedPositionDepositForTrade({ driftClient, user, marketIndex, baseAssetAmount, direction, marginRatio, entryPrice, numOfOpenHighLeverageSpots, bufferBpsDenominator, }: ComputeIsolatedPositionDepositParams): BN | null;
|
|
34
38
|
export declare function getIsolatedPositionDepositIxIfNeeded(driftClient: DriftClient, user: User, marketIndex: number, isolatedPositionDeposit?: BN, signingAuthority?: PublicKey): Promise<TransactionInstruction | undefined>;
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getIsolatedPositionDepositIxIfNeeded = exports.computeIsolatedPositionDepositForTrade = exports.ISOLATED_POSITION_DEPOSIT_BUFFER_BPS = void 0;
|
|
4
4
|
const sdk_1 = require("@drift-labs/sdk");
|
|
5
|
-
exports.ISOLATED_POSITION_DEPOSIT_BUFFER_BPS =
|
|
5
|
+
exports.ISOLATED_POSITION_DEPOSIT_BUFFER_BPS = 20;
|
|
6
6
|
/**
|
|
7
7
|
* Computes the isolated position deposit required for opening an isolated perp position.
|
|
8
8
|
* Returns a BN in QUOTE_PRECISION (USDC).
|
|
9
9
|
*/
|
|
10
|
-
function computeIsolatedPositionDepositForTrade({ driftClient, user, marketIndex, baseAssetAmount, direction, marginRatio, entryPrice, numOfOpenHighLeverageSpots, }) {
|
|
10
|
+
function computeIsolatedPositionDepositForTrade({ driftClient, user, marketIndex, baseAssetAmount, direction, marginRatio, entryPrice, numOfOpenHighLeverageSpots, bufferBpsDenominator, }) {
|
|
11
11
|
var _a;
|
|
12
12
|
// Only require isolated deposit if the order will increase the position (when direction is provided)
|
|
13
13
|
if (direction !== undefined) {
|
|
@@ -28,7 +28,7 @@ function computeIsolatedPositionDepositForTrade({ driftClient, user, marketIndex
|
|
|
28
28
|
const hasOpenHighLeverageSpots = numOfOpenHighLeverageSpots !== undefined && numOfOpenHighLeverageSpots > 0;
|
|
29
29
|
const enteringHighLeverageMode = userIsInHighLeverageMode || hasOpenHighLeverageSpots;
|
|
30
30
|
const marginRequired = (0, sdk_1.calculateMarginUSDCRequiredForTrade)(driftClient, marketIndex, baseAssetAmount, marginRatio, enteringHighLeverageMode, entryPrice);
|
|
31
|
-
return marginRequired.add(marginRequired.div(new sdk_1.BN(exports.ISOLATED_POSITION_DEPOSIT_BUFFER_BPS))); // buffer in basis points
|
|
31
|
+
return marginRequired.add(marginRequired.div(new sdk_1.BN(bufferBpsDenominator !== null && bufferBpsDenominator !== void 0 ? bufferBpsDenominator : exports.ISOLATED_POSITION_DEPOSIT_BUFFER_BPS))); // buffer in basis points
|
|
32
32
|
}
|
|
33
33
|
exports.computeIsolatedPositionDepositForTrade = computeIsolatedPositionDepositForTrade;
|
|
34
34
|
async function getIsolatedPositionDepositIxIfNeeded(driftClient, user, marketIndex, isolatedPositionDeposit, signingAuthority) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolatedPositionDeposit.js","sourceRoot":"","sources":["../../../../../../src/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.ts"],"names":[],"mappings":";;;AAAA,yCASyB;AAGZ,QAAA,oCAAoC,GAAG,
|
|
1
|
+
{"version":3,"file":"isolatedPositionDeposit.js","sourceRoot":"","sources":["../../../../../../src/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.ts"],"names":[],"mappings":";;;AAAA,yCASyB;AAGZ,QAAA,oCAAoC,GAAG,EAAE,CAAC;AAgCvD;;;GAGG;AACH,SAAgB,sCAAsC,CAAC,EACtD,WAAW,EACX,IAAI,EACJ,WAAW,EACX,eAAe,EACf,SAAS,EACT,WAAW,EACX,UAAU,EACV,0BAA0B,EAC1B,oBAAoB,GACkB;;IACtC,qGAAqG;IACrG,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,gBAAgB,GAAwB;YAC7C,WAAW;YACX,UAAU,EAAE,gBAAU,CAAC,IAAI;YAC3B,SAAS,EAAE,eAAS,CAAC,MAAM;YAC3B,SAAS;YACT,eAAe;SACf,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,YAAY,CAAC;QACxD,MAAM,YAAY,GAAG,WAAW,CAAC,yBAAyB,CACzD,gBAAgB,EAChB,YAAY,CACZ,CAAC;QACF,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,MAAM,wBAAwB,GAAG,MAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,mCAAI,KAAK,CAAC;IAC7E,MAAM,wBAAwB,GAC7B,0BAA0B,KAAK,SAAS,IAAI,0BAA0B,GAAG,CAAC,CAAC;IAC5E,MAAM,wBAAwB,GAC7B,wBAAwB,IAAI,wBAAwB,CAAC;IAEtD,MAAM,cAAc,GAAG,IAAA,yCAAmC,EACzD,WAAW,EACX,WAAW,EACX,eAAe,EACf,WAAW,EACX,wBAAwB,EACxB,UAAU,CACV,CAAC;IAEF,OAAO,cAAc,CAAC,GAAG,CACxB,cAAc,CAAC,GAAG,CACjB,IAAI,QAAE,CAAC,oBAAoB,aAApB,oBAAoB,cAApB,oBAAoB,GAAI,4CAAoC,CAAC,CACpE,CACD,CAAC,CAAC,yBAAyB;AAC7B,CAAC;AAlDD,wFAkDC;AAEM,KAAK,UAAU,oCAAoC,CACzD,WAAwB,EACxB,IAAU,EACV,WAAmB,EACnB,uBAA4B,EAC5B,gBAA4B;IAE5B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,uBAAuB,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,OAAO,WAAW,CAAC,wCAAwC,CAC1D,uBAAuB,EACvB,WAAW,EACX,IAAI,CAAC,cAAc,EAAE,CAAC,YAAY,EAClC,SAAS,EAAE,iBAAiB;IAC5B,gBAAgB,CAChB,CAAC;AACH,CAAC;AArBD,oFAqBC","sourcesContent":["import {\n\tBN,\n\tDriftClient,\n\tUser,\n\tcalculateMarginUSDCRequiredForTrade,\n\tOptionalOrderParams,\n\tPositionDirection,\n\tMarketType,\n\tOrderType,\n} from '@drift-labs/sdk';\nimport { PublicKey, TransactionInstruction } from '@solana/web3.js';\n\nexport const ISOLATED_POSITION_DEPOSIT_BUFFER_BPS = 20;\n\nexport interface ComputeIsolatedPositionDepositParams {\n\tdriftClient: DriftClient;\n\tuser: User;\n\tmarketIndex: number;\n\tbaseAssetAmount: BN;\n\t/**\n\t * Optional direction of the order.\n\t * If provided, we will check if the order will increase the position.\n\t * If the order will not increase the position, we will return 0.\n\t */\n\tdirection?: PositionDirection;\n\t/**\n\t * Margin ratio to use for the position (e.g. 2000 for 5x leverage).\n\t */\n\tmarginRatio: number;\n\t/**\n\t * Optional estimated entry price to use for the margin calculation.\n\t */\n\tentryPrice?: BN;\n\t/**\n\t * Number of open high leverage spots available to the user (if any).\n\t * If greater than 0, we will consider the trade as entering high leverage mode.\n\t */\n\tnumOfOpenHighLeverageSpots?: number;\n\t/**\n\t * Whether to use the buffer for the isolated position deposit.\n\t */\n\tbufferBpsDenominator?: number;\n}\n\n/**\n * Computes the isolated position deposit required for opening an isolated perp position.\n * Returns a BN in QUOTE_PRECISION (USDC).\n */\nexport function computeIsolatedPositionDepositForTrade({\n\tdriftClient,\n\tuser,\n\tmarketIndex,\n\tbaseAssetAmount,\n\tdirection,\n\tmarginRatio,\n\tentryPrice,\n\tnumOfOpenHighLeverageSpots,\n\tbufferBpsDenominator,\n}: ComputeIsolatedPositionDepositParams): BN | null {\n\t// Only require isolated deposit if the order will increase the position (when direction is provided)\n\tif (direction !== undefined) {\n\t\tconst maybeOrderParams: OptionalOrderParams = {\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\torderType: OrderType.MARKET,\n\t\t\tdirection,\n\t\t\tbaseAssetAmount,\n\t\t};\n\t\tconst subAccountId = user.getUserAccount().subAccountId;\n\t\tconst isIncreasing = driftClient.isOrderIncreasingPosition(\n\t\t\tmaybeOrderParams,\n\t\t\tsubAccountId\n\t\t);\n\t\tif (!isIncreasing) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tconst userIsInHighLeverageMode = user.isHighLeverageMode('Initial') ?? false;\n\tconst hasOpenHighLeverageSpots =\n\t\tnumOfOpenHighLeverageSpots !== undefined && numOfOpenHighLeverageSpots > 0;\n\tconst enteringHighLeverageMode =\n\t\tuserIsInHighLeverageMode || hasOpenHighLeverageSpots;\n\n\tconst marginRequired = calculateMarginUSDCRequiredForTrade(\n\t\tdriftClient,\n\t\tmarketIndex,\n\t\tbaseAssetAmount,\n\t\tmarginRatio,\n\t\tenteringHighLeverageMode,\n\t\tentryPrice\n\t);\n\n\treturn marginRequired.add(\n\t\tmarginRequired.div(\n\t\t\tnew BN(bufferBpsDenominator ?? ISOLATED_POSITION_DEPOSIT_BUFFER_BPS)\n\t\t)\n\t); // buffer in basis points\n}\n\nexport async function getIsolatedPositionDepositIxIfNeeded(\n\tdriftClient: DriftClient,\n\tuser: User,\n\tmarketIndex: number,\n\tisolatedPositionDeposit?: BN,\n\tsigningAuthority?: PublicKey\n): Promise<TransactionInstruction | undefined> {\n\tif (!isolatedPositionDeposit) {\n\t\treturn undefined;\n\t}\n\tif (isolatedPositionDeposit.isZero()) {\n\t\treturn undefined;\n\t}\n\n\treturn driftClient.getTransferIsolatedPerpPositionDepositIx(\n\t\tisolatedPositionDeposit,\n\t\tmarketIndex,\n\t\tuser.getUserAccount().subAccountId,\n\t\tundefined, // noAmountBuffer\n\t\tsigningAuthority\n\t);\n}\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -40,6 +40,7 @@ export * from './utils/CircularBuffers';
|
|
|
40
40
|
export * from './utils/rxjs';
|
|
41
41
|
export * from './utils/priorityFees';
|
|
42
42
|
export * from './utils/NumLib';
|
|
43
|
+
export * from './utils/markets/precisions';
|
|
43
44
|
export * from './drift';
|
|
44
45
|
import JupV4Errors from './constants/autogenerated/jup-v4-error-codes.json';
|
|
45
46
|
import JupV6Errors from './constants/autogenerated/jup-v6-error-codes.json';
|
package/lib/index.js
CHANGED
|
@@ -60,6 +60,7 @@ __exportStar(require("./utils/CircularBuffers"), exports);
|
|
|
60
60
|
__exportStar(require("./utils/rxjs"), exports);
|
|
61
61
|
__exportStar(require("./utils/priorityFees"), exports);
|
|
62
62
|
__exportStar(require("./utils/NumLib"), exports);
|
|
63
|
+
__exportStar(require("./utils/markets/precisions"), exports);
|
|
63
64
|
__exportStar(require("./drift"), exports);
|
|
64
65
|
// External Program Errors
|
|
65
66
|
const jup_v4_error_codes_json_1 = __importDefault(require("./constants/autogenerated/jup-v4-error-codes.json"));
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,mDAAiC;AACjC,0CAAwB;AACxB,yDAAuC;AACvC,0CAAwB;AACxB,gDAA8B;AAC9B,oDAAkC;AAClC,sDAAoC;AACpC,yDAAuC;AACvC,uDAAqC;AACrC,gEAA8C;AAC9C,qDAAmC;AACnC,gDAA8B;AAC9B,+CAA6B;AAC7B,iDAA+B;AAC/B,yDAAuC;AACvC,oDAAkC;AAClC,8CAA4B;AAC5B,wEAAsD;AACtD,yDAAuC;AACvC,oDAAkC;AAClC,wDAAsC;AACtC,qDAAmC;AACnC,gDAA8B;AAC9B,sDAAoC;AACpC,+EAA6D;AAC7D,sEAAoD;AACpD,wDAAsC;AACtC,oDAAkC;AAClC,yDAAuC;AACvC,2DAAyC;AACzC,wDAAsC;AACtC,mDAAiC;AACjC,gEAA8C;AAC9C,+DAA6C;AAC7C,sDAAoC;AACpC,6DAA2C;AAC3C,mEAAiD;AACjD,0DAAwC;AACxC,+CAA6B;AAC7B,uDAAqC;AACrC,iDAA+B;AAC/B,0CAAwB;AAExB,0BAA0B;AAC1B,gHAA4E;AAEnE,sBAFF,iCAAW,CAEE;AADpB,gHAA4E;AACtD,sBADf,iCAAW,CACe;AAEjC,kGAAqE;AAC5D,sBADF,0BAAW,CACE","sourcesContent":["export * from './Config';\nexport * from './chartConstants';\nexport * from './types';\nexport * from './EnvironmentConstants';\nexport * from './utils';\nexport * from './utils/index';\nexport * from './utils/s3Buckets';\nexport * from './serializableTypes';\nexport * from './utils/candles/Candle';\nexport * from './utils/featureFlags';\nexport * from './utils/WalletConnectionState';\nexport * from './utils/rpcLatency';\nexport * from './utils/token';\nexport * from './utils/math';\nexport * from './utils/logger';\nexport * from './utils/equalityChecks';\nexport * from './common-ui-utils';\nexport * from './constants';\nexport * from './actions/actionHelpers/actionHelpers';\nexport * from './utils/SharedInterval';\nexport * from './utils/Stopwatch';\nexport * from './utils/priority-fees';\nexport * from './utils/superstake';\nexport * from './utils/fetch';\nexport * from './utils/priceImpact';\nexport * from './utils/dlob-server/DlobServerWebsocketUtils';\nexport * from './common-ui-utils/settings/settings';\nexport * from './utils/priority-fees';\nexport * from './utils/orderbook';\nexport * from './clients/candleClient';\nexport * from './clients/marketDataFeed';\nexport * from './clients/swiftClient';\nexport * from './clients/tvFeed';\nexport * from './clients/DlobWebsocketClient';\nexport * from './utils/pollingSequenceGuard';\nexport * from './utils/driftEvents';\nexport * from './utils/MultiplexWebSocket';\nexport * from './utils/SlotBasedResultValidator';\nexport * from './utils/CircularBuffers';\nexport * from './utils/rxjs';\nexport * from './utils/priorityFees';\nexport * from './utils/NumLib';\nexport * from './drift';\n\n// External Program Errors\nimport JupV4Errors from './constants/autogenerated/jup-v4-error-codes.json';\nimport JupV6Errors from './constants/autogenerated/jup-v6-error-codes.json';\nexport { JupV4Errors, JupV6Errors };\n\nimport DriftErrors from './constants/autogenerated/driftErrors.json';\nexport { DriftErrors };\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,mDAAiC;AACjC,0CAAwB;AACxB,yDAAuC;AACvC,0CAAwB;AACxB,gDAA8B;AAC9B,oDAAkC;AAClC,sDAAoC;AACpC,yDAAuC;AACvC,uDAAqC;AACrC,gEAA8C;AAC9C,qDAAmC;AACnC,gDAA8B;AAC9B,+CAA6B;AAC7B,iDAA+B;AAC/B,yDAAuC;AACvC,oDAAkC;AAClC,8CAA4B;AAC5B,wEAAsD;AACtD,yDAAuC;AACvC,oDAAkC;AAClC,wDAAsC;AACtC,qDAAmC;AACnC,gDAA8B;AAC9B,sDAAoC;AACpC,+EAA6D;AAC7D,sEAAoD;AACpD,wDAAsC;AACtC,oDAAkC;AAClC,yDAAuC;AACvC,2DAAyC;AACzC,wDAAsC;AACtC,mDAAiC;AACjC,gEAA8C;AAC9C,+DAA6C;AAC7C,sDAAoC;AACpC,6DAA2C;AAC3C,mEAAiD;AACjD,0DAAwC;AACxC,+CAA6B;AAC7B,uDAAqC;AACrC,iDAA+B;AAC/B,6DAA2C;AAC3C,0CAAwB;AAExB,0BAA0B;AAC1B,gHAA4E;AAEnE,sBAFF,iCAAW,CAEE;AADpB,gHAA4E;AACtD,sBADf,iCAAW,CACe;AAEjC,kGAAqE;AAC5D,sBADF,0BAAW,CACE","sourcesContent":["export * from './Config';\nexport * from './chartConstants';\nexport * from './types';\nexport * from './EnvironmentConstants';\nexport * from './utils';\nexport * from './utils/index';\nexport * from './utils/s3Buckets';\nexport * from './serializableTypes';\nexport * from './utils/candles/Candle';\nexport * from './utils/featureFlags';\nexport * from './utils/WalletConnectionState';\nexport * from './utils/rpcLatency';\nexport * from './utils/token';\nexport * from './utils/math';\nexport * from './utils/logger';\nexport * from './utils/equalityChecks';\nexport * from './common-ui-utils';\nexport * from './constants';\nexport * from './actions/actionHelpers/actionHelpers';\nexport * from './utils/SharedInterval';\nexport * from './utils/Stopwatch';\nexport * from './utils/priority-fees';\nexport * from './utils/superstake';\nexport * from './utils/fetch';\nexport * from './utils/priceImpact';\nexport * from './utils/dlob-server/DlobServerWebsocketUtils';\nexport * from './common-ui-utils/settings/settings';\nexport * from './utils/priority-fees';\nexport * from './utils/orderbook';\nexport * from './clients/candleClient';\nexport * from './clients/marketDataFeed';\nexport * from './clients/swiftClient';\nexport * from './clients/tvFeed';\nexport * from './clients/DlobWebsocketClient';\nexport * from './utils/pollingSequenceGuard';\nexport * from './utils/driftEvents';\nexport * from './utils/MultiplexWebSocket';\nexport * from './utils/SlotBasedResultValidator';\nexport * from './utils/CircularBuffers';\nexport * from './utils/rxjs';\nexport * from './utils/priorityFees';\nexport * from './utils/NumLib';\nexport * from './utils/markets/precisions';\nexport * from './drift';\n\n// External Program Errors\nimport JupV4Errors from './constants/autogenerated/jup-v4-error-codes.json';\nimport JupV6Errors from './constants/autogenerated/jup-v6-error-codes.json';\nexport { JupV4Errors, JupV6Errors };\n\nimport DriftErrors from './constants/autogenerated/driftErrors.json';\nexport { DriftErrors };\n"]}
|
package/lib/types/UIMarket.js
CHANGED
|
@@ -63,10 +63,11 @@ class UIMarket {
|
|
|
63
63
|
return UIMarket.getOrCreate(marketId.marketIndex, marketId.marketType);
|
|
64
64
|
}
|
|
65
65
|
static checkIsPredictionMarket(marketConfig) {
|
|
66
|
+
var _a, _b;
|
|
66
67
|
if (!marketConfig.category) {
|
|
67
68
|
return false;
|
|
68
69
|
}
|
|
69
|
-
return marketConfig.category.includes('Prediction');
|
|
70
|
+
return (_b = (_a = marketConfig.category) === null || _a === void 0 ? void 0 : _a.includes('Prediction')) !== null && _b !== void 0 ? _b : false;
|
|
70
71
|
}
|
|
71
72
|
get isSpot() {
|
|
72
73
|
return this.marketId.isSpot;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UIMarket.js","sourceRoot":"","sources":["../../src/types/UIMarket.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tMarketType,\n\tOracleSource,\n\tPerpMarketConfig,\n\tPerpMarkets,\n\tSpotMarkets,\n\tSpotMarketConfig,\n\tBASE_PRECISION,\n\tBASE_PRECISION_EXP,\n} from '@drift-labs/sdk';\nimport { MarketId } from './MarketId';\nimport invariant from 'tiny-invariant';\nimport {\n\tEXPONENT_POOL_ID,\n\tJLP_POOL_ID,\n\tLST_POOL_ID,\n\tMAIN_POOL_ID,\n\tSACRED_POOL_ID,\n} from '../constants/pools';\nimport { USDC_SPOT_MARKET_INDEX } from '../constants/markets';\nimport { ENUM_UTILS } from '../utils';\nimport { Config } from '../Config';\nimport { Opaque } from './utility';\n\nconst useAsyncMarketConfigs =\n\tprocess.env.NEXT_PUBLIC_USE_ASYNC_MARKET_CONFIGS === 'true';\n\n/**\n * MarketSymbol will uniquely identify a market\n */\nexport type MarketSymbol = Opaque<string, 'MarketSymbol'>;\n/**\n * MarketDisplaySymbol is the label for a market that we display to a user\n */\nexport type MarketDisplaySymbol = Opaque<string, 'MarketDisplaySymbol'>;\n/**\n * BaseAssetSymbol is the symbol for the underlying asset for a market\n */\nexport type BaseAssetSymbol = Opaque<string, 'BaseAssetSymbol'>;\n/**\n * BaseAssetDisplaySymbol is the label for the underlying asset for a market that we display to a user\n */\nexport type BaseAssetDisplaySymbol = Opaque<string, 'BaseAssetDisplaySymbol'>;\n\n/**\n * # Examples and explanations of the symbol types:\n *\n * ## MarketSymbol:\n * These are basically just the raw symbols in the market configs.\n * - 1KWEN-PERP\n * - JitoSOL-3\n * - PT-fragSOL-15JUN25-3\n *\n * ## MarketDisplaySymbol:\n * This is the symbol we use to display the market to the user. For SPOT markets it should be the exact same as the BaseAssetDisplaySymbol, but for PERP markets they might be different which is why we have this separate type.\n *\n * - 1KWEN-PERP => 1KWEN-PERP\n * - JitoSOL-3 => JitoSOL\n * - PT-fragSOL-15JUN25-3 => PT-fragSOL-15JUN25\n *\n * ## BaseAssetDisplaySymbol:\n * This is the symbol we use to communicate \"what asset they are holding\". For SPOT markets it should be the same as the MarketDisplaySymbol, but for PERP markets it may be different, for example we show open interest denominated in \"1KWEN\", while the market is \"1KWEN-PERP\".\n *\n * - 1KWEN-PERP => 1KWEN\n * - JitoSOL-3 => JitoSOL\n * - PT-fragSOL-15JUN25-3 => fragSOL\n *\n * ## BaseAssetSymbol:\n * This is the symbol for the underlying asset for a market. I don't believe we will display this anywhere but we use these for example when looking up the market icon to use.\n *\n * - 1KWEN-PERP => WEN\n * - JitoSOL-3 => JitoSOL\n * - PT-fragSOL-15JUN25-3 => PT-fragSOL-15JUN25 (note: PT-fragSOL has an icon different to regular fragSOL, otherwise we would use 'fragSOL' for the base asset symbol)\n */\n\ntype UISymbols = {\n\tmarketSymbol: MarketSymbol;\n\tmarketDisplaySymbol: MarketDisplaySymbol;\n\tbaseAssetSymbol: BaseAssetSymbol;\n\tbaseAssetDisplaySymbol: BaseAssetDisplaySymbol;\n};\n\nexport class UIMarket {\n\tstatic perpMarkets = PerpMarkets['mainnet-beta'];\n\tstatic spotMarkets = SpotMarkets['mainnet-beta'];\n\tprivate static cache = new Map<string, UIMarket>();\n\n\treadonly market: SpotMarketConfig | PerpMarketConfig;\n\treadonly marketId: MarketId;\n\n\tprivate _uiSymbols: UISymbols;\n\n\tget uiSymbols() {\n\t\treturn this._uiSymbols;\n\t}\n\n\tprivate set uiSymbols(uiSymbols: UISymbols) {\n\t\tthis._uiSymbols = uiSymbols;\n\t}\n\n\tconstructor(readonly marketIndex: number, readonly marketType: MarketType) {\n\t\tconst marketId = new MarketId(marketIndex, marketType);\n\t\tconst perpMarkets = useAsyncMarketConfigs\n\t\t\t? UIMarket.perpMarkets\n\t\t\t: Config.perpMarketsLookup;\n\t\tconst spotMarkets = useAsyncMarketConfigs\n\t\t\t? UIMarket.spotMarkets\n\t\t\t: Config.spotMarketsLookup;\n\t\tconst markets = marketId.isPerp ? perpMarkets : spotMarkets;\n\n\t\t//@ts-ignore\n\t\tconst market = markets.find((m) => m.marketIndex === marketIndex);\n\n\t\t// TODO: should we purposely throw an error here? Or construct a default market?\n\t\tinvariant(\n\t\t\tmarket,\n\t\t\t`Market not found for type: ${marketId.marketTypeStr}, market index: ${marketIndex}`\n\t\t);\n\n\t\tthis.marketId = marketId;\n\t\tthis.market = market;\n\n\t\tthis.setUiSymbols();\n\t}\n\n\tstatic setPerpMarkets(perpMarkets: PerpMarketConfig[]) {\n\t\tthis.perpMarkets = perpMarkets;\n\t}\n\n\tstatic setSpotMarkets(spotMarkets: SpotMarketConfig[]) {\n\t\tthis.spotMarkets = spotMarkets;\n\t}\n\n\tprivate static getOrCreate(marketIndex: number, marketType: MarketType) {\n\t\tconst key = MarketId.key(marketIndex, marketType);\n\t\tif (UIMarket.cache.has(key)) {\n\t\t\treturn UIMarket.cache.get(key)!;\n\t\t}\n\t\tconst market = new UIMarket(marketIndex, marketType);\n\t\tUIMarket.cache.set(key, market);\n\t\treturn market;\n\t}\n\n\tstatic createSpotMarket(marketIndex: number) {\n\t\treturn UIMarket.getOrCreate(marketIndex, MarketType.SPOT);\n\t}\n\n\tstatic createPerpMarket(marketIndex: number) {\n\t\treturn UIMarket.getOrCreate(marketIndex, MarketType.PERP);\n\t}\n\n\tstatic fromMarketId(marketId: MarketId) {\n\t\treturn UIMarket.getOrCreate(marketId.marketIndex, marketId.marketType);\n\t}\n\n\tstatic checkIsPredictionMarket(marketConfig: PerpMarketConfig) {\n\t\tif (!(marketConfig as PerpMarketConfig).category) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn (marketConfig as PerpMarketConfig).category.includes('Prediction');\n\t}\n\n\tget isSpot() {\n\t\treturn this.marketId.isSpot;\n\t}\n\n\tget isPerp() {\n\t\treturn this.marketId.isPerp;\n\t}\n\n\tget marketTypeStr() {\n\t\treturn this.marketId.marketTypeStr;\n\t}\n\n\tget key() {\n\t\treturn this.marketId.key;\n\t}\n\n\t// @deprecated : Use uiSymbols.marketDisplaySymbol instead\n\tget marketName() {\n\t\treturn `${this.market.symbol}${this.isSpot ? '/USDC' : ''}`;\n\t}\n\n\t// @deprecated : Use uiSymbols.marketSymbol instead\n\tget symbol() {\n\t\treturn this.market.symbol;\n\t}\n\n\tget isUsdcMarket() {\n\t\treturn this.isSpot && this.marketIndex === USDC_SPOT_MARKET_INDEX;\n\t}\n\n\tget isStableCoinMarket() {\n\t\treturn (\n\t\t\tthis.isSpot &&\n\t\t\tENUM_UTILS.match(this.market.oracleSource, OracleSource.PYTH_STABLE_COIN)\n\t\t);\n\t}\n\n\tget isPredictionMarket() {\n\t\treturn (\n\t\t\tthis.isPerp &&\n\t\t\tUIMarket.checkIsPredictionMarket(this.market as PerpMarketConfig)\n\t\t);\n\t}\n\n\tget precision() {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn BASE_PRECISION;\n\t\t} else {\n\t\t\treturn (this.market as SpotMarketConfig).precision;\n\t\t}\n\t}\n\n\tget precisionExp() {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn BASE_PRECISION_EXP;\n\t\t} else {\n\t\t\treturn (this.market as SpotMarketConfig).precisionExp;\n\t\t}\n\t}\n\n\tequals(other: UIMarket) {\n\t\treturn this.marketId.equals(other.marketId);\n\t}\n\n\t// @deprecated : Use uiSymbols.baseAssetSymbol instead\n\tbaseAssetSymbol(removePrefix = false) {\n\t\tlet baseAssetSymbol = this.isPerp\n\t\t\t? (this.market as PerpMarketConfig).baseAssetSymbol\n\t\t\t: this.market.symbol;\n\n\t\tif (removePrefix) {\n\t\t\tbaseAssetSymbol = baseAssetSymbol.replace('1K', '').replace('1M', '');\n\t\t}\n\n\t\treturn baseAssetSymbol;\n\t}\n\n\tprotected setUiSymbols() {\n\t\tinvariant(this.marketId, 'MarketId not set');\n\n\t\tconst marketSymbol = this.getMarketSymbol();\n\t\tconst marketDisplaySymbol = this.getMarketDisplaySymbol();\n\t\tconst baseAssetSymbol = this.getBaseAssetSymbol();\n\t\tconst baseAssetDisplaySymbol = this.getBaseAssetDisplaySymbol();\n\n\t\tthis.uiSymbols = {\n\t\t\tmarketSymbol,\n\t\t\tmarketDisplaySymbol,\n\t\t\tbaseAssetSymbol,\n\t\t\tbaseAssetDisplaySymbol,\n\t\t};\n\t}\n\n\tprivate getMarketSymbol(): MarketSymbol {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn this.market.symbol as MarketSymbol;\n\t\t} else {\n\t\t\treturn this.market.symbol as MarketSymbol;\n\t\t}\n\t}\n\n\tprivate getMarketDisplaySymbol(): MarketDisplaySymbol {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn this.market.symbol as MarketDisplaySymbol;\n\t\t} else {\n\t\t\tconst marketConfig = this.market as SpotMarketConfig;\n\t\t\tswitch (marketConfig.poolId) {\n\t\t\t\tcase MAIN_POOL_ID:\n\t\t\t\t\treturn marketConfig.symbol as MarketDisplaySymbol;\n\t\t\t\tcase JLP_POOL_ID:\n\t\t\t\t\treturn `${marketConfig.symbol.split('-')[0]}` as MarketDisplaySymbol;\n\t\t\t\tcase LST_POOL_ID:\n\t\t\t\t\treturn `${marketConfig.symbol.split('-')[0]}` as MarketDisplaySymbol;\n\t\t\t\tcase EXPONENT_POOL_ID: {\n\t\t\t\t\t/*\n\t\t\t\t\tExample market symbol conversions:\n\t\t\t\t\tPT-fragSOL-15JUN25-3 => PT-fragSOL-15JUN25\n\t\t\t\t\tPT-kySOL-10JUL25-3 => PT-kySOL-10JUL25\n\t\t\t\t\tJitoSOL-3 => JitoSOL\n\t\t\t\t\tJTO-3 => JTO\n\t\t\t\t*/\n\t\t\t\t\treturn (\n\t\t\t\t\t\tmarketConfig.symbol.startsWith('PT-')\n\t\t\t\t\t\t\t? marketConfig.symbol.slice(\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\tmarketConfig.symbol.lastIndexOf('-')\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: marketConfig.symbol.split('-')[0]\n\t\t\t\t\t) as MarketDisplaySymbol;\n\t\t\t\t}\n\t\t\t\tcase SACRED_POOL_ID:\n\t\t\t\t\treturn `${marketConfig.symbol.split('-')[0]}` as MarketDisplaySymbol;\n\t\t\t\tdefault:\n\t\t\t\t\treturn marketConfig.symbol as MarketDisplaySymbol;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getBaseAssetSymbol(): BaseAssetSymbol {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn (this.market as PerpMarketConfig).baseAssetSymbol\n\t\t\t\t.replace('1K', '')\n\t\t\t\t.replace('1M', '') as BaseAssetSymbol;\n\t\t} else {\n\t\t\treturn this.getMarketDisplaySymbol() as unknown as BaseAssetSymbol; // Currently no cases where SPOT baseAssetSymbol is different from marketDisplaySymbol\n\t\t}\n\t}\n\n\tprivate getBaseAssetDisplaySymbol(): BaseAssetDisplaySymbol {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn (this.market as PerpMarketConfig)\n\t\t\t\t.baseAssetSymbol as BaseAssetDisplaySymbol;\n\t\t} else {\n\t\t\tconst marketConfig = this.market as SpotMarketConfig;\n\t\t\tswitch (marketConfig.poolId) {\n\t\t\t\tcase EXPONENT_POOL_ID: {\n\t\t\t\t\t/*\n\t\t\t\t\tExample market symbol conversions:\n\t\t\t\t\tPT-fragSOL-15JUN25-3 => fragSOL\n\t\t\t\t\tPT-kySOL-10JUL25-3 => kySOL\n\t\t\t\t\tJitoSOL-3 => JitoSOL\n\t\t\t\t\tJTO-3 => JTO\n\t\t\t\t*/\n\t\t\t\t\treturn (\n\t\t\t\t\t\tmarketConfig.symbol.startsWith('PT-')\n\t\t\t\t\t\t\t? marketConfig.symbol.split('-')[1]\n\t\t\t\t\t\t\t: marketConfig.symbol.split('-')[0]\n\t\t\t\t\t) as BaseAssetDisplaySymbol;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\treturn marketConfig.symbol as BaseAssetDisplaySymbol;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"UIMarket.js","sourceRoot":"","sources":["../../src/types/UIMarket.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tMarketType,\n\tOracleSource,\n\tPerpMarketConfig,\n\tPerpMarkets,\n\tSpotMarkets,\n\tSpotMarketConfig,\n\tBASE_PRECISION,\n\tBASE_PRECISION_EXP,\n} from '@drift-labs/sdk';\nimport { MarketId } from './MarketId';\nimport invariant from 'tiny-invariant';\nimport {\n\tEXPONENT_POOL_ID,\n\tJLP_POOL_ID,\n\tLST_POOL_ID,\n\tMAIN_POOL_ID,\n\tSACRED_POOL_ID,\n} from '../constants/pools';\nimport { USDC_SPOT_MARKET_INDEX } from '../constants/markets';\nimport { ENUM_UTILS } from '../utils';\nimport { Config } from '../Config';\nimport { Opaque } from './utility';\n\nconst useAsyncMarketConfigs =\n\tprocess.env.NEXT_PUBLIC_USE_ASYNC_MARKET_CONFIGS === 'true';\n\n/**\n * MarketSymbol will uniquely identify a market\n */\nexport type MarketSymbol = Opaque<string, 'MarketSymbol'>;\n/**\n * MarketDisplaySymbol is the label for a market that we display to a user\n */\nexport type MarketDisplaySymbol = Opaque<string, 'MarketDisplaySymbol'>;\n/**\n * BaseAssetSymbol is the symbol for the underlying asset for a market\n */\nexport type BaseAssetSymbol = Opaque<string, 'BaseAssetSymbol'>;\n/**\n * BaseAssetDisplaySymbol is the label for the underlying asset for a market that we display to a user\n */\nexport type BaseAssetDisplaySymbol = Opaque<string, 'BaseAssetDisplaySymbol'>;\n\n/**\n * # Examples and explanations of the symbol types:\n *\n * ## MarketSymbol:\n * These are basically just the raw symbols in the market configs.\n * - 1KWEN-PERP\n * - JitoSOL-3\n * - PT-fragSOL-15JUN25-3\n *\n * ## MarketDisplaySymbol:\n * This is the symbol we use to display the market to the user. For SPOT markets it should be the exact same as the BaseAssetDisplaySymbol, but for PERP markets they might be different which is why we have this separate type.\n *\n * - 1KWEN-PERP => 1KWEN-PERP\n * - JitoSOL-3 => JitoSOL\n * - PT-fragSOL-15JUN25-3 => PT-fragSOL-15JUN25\n *\n * ## BaseAssetDisplaySymbol:\n * This is the symbol we use to communicate \"what asset they are holding\". For SPOT markets it should be the same as the MarketDisplaySymbol, but for PERP markets it may be different, for example we show open interest denominated in \"1KWEN\", while the market is \"1KWEN-PERP\".\n *\n * - 1KWEN-PERP => 1KWEN\n * - JitoSOL-3 => JitoSOL\n * - PT-fragSOL-15JUN25-3 => fragSOL\n *\n * ## BaseAssetSymbol:\n * This is the symbol for the underlying asset for a market. I don't believe we will display this anywhere but we use these for example when looking up the market icon to use.\n *\n * - 1KWEN-PERP => WEN\n * - JitoSOL-3 => JitoSOL\n * - PT-fragSOL-15JUN25-3 => PT-fragSOL-15JUN25 (note: PT-fragSOL has an icon different to regular fragSOL, otherwise we would use 'fragSOL' for the base asset symbol)\n */\n\ntype UISymbols = {\n\tmarketSymbol: MarketSymbol;\n\tmarketDisplaySymbol: MarketDisplaySymbol;\n\tbaseAssetSymbol: BaseAssetSymbol;\n\tbaseAssetDisplaySymbol: BaseAssetDisplaySymbol;\n};\n\nexport class UIMarket {\n\tstatic perpMarkets = PerpMarkets['mainnet-beta'];\n\tstatic spotMarkets = SpotMarkets['mainnet-beta'];\n\tprivate static cache = new Map<string, UIMarket>();\n\n\treadonly market: SpotMarketConfig | PerpMarketConfig;\n\treadonly marketId: MarketId;\n\n\tprivate _uiSymbols: UISymbols;\n\n\tget uiSymbols() {\n\t\treturn this._uiSymbols;\n\t}\n\n\tprivate set uiSymbols(uiSymbols: UISymbols) {\n\t\tthis._uiSymbols = uiSymbols;\n\t}\n\n\tconstructor(readonly marketIndex: number, readonly marketType: MarketType) {\n\t\tconst marketId = new MarketId(marketIndex, marketType);\n\t\tconst perpMarkets = useAsyncMarketConfigs\n\t\t\t? UIMarket.perpMarkets\n\t\t\t: Config.perpMarketsLookup;\n\t\tconst spotMarkets = useAsyncMarketConfigs\n\t\t\t? UIMarket.spotMarkets\n\t\t\t: Config.spotMarketsLookup;\n\t\tconst markets = marketId.isPerp ? perpMarkets : spotMarkets;\n\n\t\t//@ts-ignore\n\t\tconst market = markets.find((m) => m.marketIndex === marketIndex);\n\n\t\t// TODO: should we purposely throw an error here? Or construct a default market?\n\t\tinvariant(\n\t\t\tmarket,\n\t\t\t`Market not found for type: ${marketId.marketTypeStr}, market index: ${marketIndex}`\n\t\t);\n\n\t\tthis.marketId = marketId;\n\t\tthis.market = market;\n\n\t\tthis.setUiSymbols();\n\t}\n\n\tstatic setPerpMarkets(perpMarkets: PerpMarketConfig[]) {\n\t\tthis.perpMarkets = perpMarkets;\n\t}\n\n\tstatic setSpotMarkets(spotMarkets: SpotMarketConfig[]) {\n\t\tthis.spotMarkets = spotMarkets;\n\t}\n\n\tprivate static getOrCreate(marketIndex: number, marketType: MarketType) {\n\t\tconst key = MarketId.key(marketIndex, marketType);\n\t\tif (UIMarket.cache.has(key)) {\n\t\t\treturn UIMarket.cache.get(key)!;\n\t\t}\n\t\tconst market = new UIMarket(marketIndex, marketType);\n\t\tUIMarket.cache.set(key, market);\n\t\treturn market;\n\t}\n\n\tstatic createSpotMarket(marketIndex: number) {\n\t\treturn UIMarket.getOrCreate(marketIndex, MarketType.SPOT);\n\t}\n\n\tstatic createPerpMarket(marketIndex: number) {\n\t\treturn UIMarket.getOrCreate(marketIndex, MarketType.PERP);\n\t}\n\n\tstatic fromMarketId(marketId: MarketId) {\n\t\treturn UIMarket.getOrCreate(marketId.marketIndex, marketId.marketType);\n\t}\n\n\tstatic checkIsPredictionMarket(marketConfig: PerpMarketConfig) {\n\t\tif (!(marketConfig as PerpMarketConfig).category) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn (marketConfig as PerpMarketConfig).category?.includes('Prediction') ?? false;\n\t}\n\n\tget isSpot() {\n\t\treturn this.marketId.isSpot;\n\t}\n\n\tget isPerp() {\n\t\treturn this.marketId.isPerp;\n\t}\n\n\tget marketTypeStr() {\n\t\treturn this.marketId.marketTypeStr;\n\t}\n\n\tget key() {\n\t\treturn this.marketId.key;\n\t}\n\n\t// @deprecated : Use uiSymbols.marketDisplaySymbol instead\n\tget marketName() {\n\t\treturn `${this.market.symbol}${this.isSpot ? '/USDC' : ''}`;\n\t}\n\n\t// @deprecated : Use uiSymbols.marketSymbol instead\n\tget symbol() {\n\t\treturn this.market.symbol;\n\t}\n\n\tget isUsdcMarket() {\n\t\treturn this.isSpot && this.marketIndex === USDC_SPOT_MARKET_INDEX;\n\t}\n\n\tget isStableCoinMarket() {\n\t\treturn (\n\t\t\tthis.isSpot &&\n\t\t\tENUM_UTILS.match(this.market.oracleSource, OracleSource.PYTH_STABLE_COIN)\n\t\t);\n\t}\n\n\tget isPredictionMarket() {\n\t\treturn (\n\t\t\tthis.isPerp &&\n\t\t\tUIMarket.checkIsPredictionMarket(this.market as PerpMarketConfig)\n\t\t);\n\t}\n\n\tget precision() {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn BASE_PRECISION;\n\t\t} else {\n\t\t\treturn (this.market as SpotMarketConfig).precision;\n\t\t}\n\t}\n\n\tget precisionExp() {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn BASE_PRECISION_EXP;\n\t\t} else {\n\t\t\treturn (this.market as SpotMarketConfig).precisionExp;\n\t\t}\n\t}\n\n\tequals(other: UIMarket) {\n\t\treturn this.marketId.equals(other.marketId);\n\t}\n\n\t// @deprecated : Use uiSymbols.baseAssetSymbol instead\n\tbaseAssetSymbol(removePrefix = false) {\n\t\tlet baseAssetSymbol = this.isPerp\n\t\t\t? (this.market as PerpMarketConfig).baseAssetSymbol\n\t\t\t: this.market.symbol;\n\n\t\tif (removePrefix) {\n\t\t\tbaseAssetSymbol = baseAssetSymbol.replace('1K', '').replace('1M', '');\n\t\t}\n\n\t\treturn baseAssetSymbol;\n\t}\n\n\tprotected setUiSymbols() {\n\t\tinvariant(this.marketId, 'MarketId not set');\n\n\t\tconst marketSymbol = this.getMarketSymbol();\n\t\tconst marketDisplaySymbol = this.getMarketDisplaySymbol();\n\t\tconst baseAssetSymbol = this.getBaseAssetSymbol();\n\t\tconst baseAssetDisplaySymbol = this.getBaseAssetDisplaySymbol();\n\n\t\tthis.uiSymbols = {\n\t\t\tmarketSymbol,\n\t\t\tmarketDisplaySymbol,\n\t\t\tbaseAssetSymbol,\n\t\t\tbaseAssetDisplaySymbol,\n\t\t};\n\t}\n\n\tprivate getMarketSymbol(): MarketSymbol {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn this.market.symbol as MarketSymbol;\n\t\t} else {\n\t\t\treturn this.market.symbol as MarketSymbol;\n\t\t}\n\t}\n\n\tprivate getMarketDisplaySymbol(): MarketDisplaySymbol {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn this.market.symbol as MarketDisplaySymbol;\n\t\t} else {\n\t\t\tconst marketConfig = this.market as SpotMarketConfig;\n\t\t\tswitch (marketConfig.poolId) {\n\t\t\t\tcase MAIN_POOL_ID:\n\t\t\t\t\treturn marketConfig.symbol as MarketDisplaySymbol;\n\t\t\t\tcase JLP_POOL_ID:\n\t\t\t\t\treturn `${marketConfig.symbol.split('-')[0]}` as MarketDisplaySymbol;\n\t\t\t\tcase LST_POOL_ID:\n\t\t\t\t\treturn `${marketConfig.symbol.split('-')[0]}` as MarketDisplaySymbol;\n\t\t\t\tcase EXPONENT_POOL_ID: {\n\t\t\t\t\t/*\n\t\t\t\t\tExample market symbol conversions:\n\t\t\t\t\tPT-fragSOL-15JUN25-3 => PT-fragSOL-15JUN25\n\t\t\t\t\tPT-kySOL-10JUL25-3 => PT-kySOL-10JUL25\n\t\t\t\t\tJitoSOL-3 => JitoSOL\n\t\t\t\t\tJTO-3 => JTO\n\t\t\t\t*/\n\t\t\t\t\treturn (\n\t\t\t\t\t\tmarketConfig.symbol.startsWith('PT-')\n\t\t\t\t\t\t\t? marketConfig.symbol.slice(\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\tmarketConfig.symbol.lastIndexOf('-')\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: marketConfig.symbol.split('-')[0]\n\t\t\t\t\t) as MarketDisplaySymbol;\n\t\t\t\t}\n\t\t\t\tcase SACRED_POOL_ID:\n\t\t\t\t\treturn `${marketConfig.symbol.split('-')[0]}` as MarketDisplaySymbol;\n\t\t\t\tdefault:\n\t\t\t\t\treturn marketConfig.symbol as MarketDisplaySymbol;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getBaseAssetSymbol(): BaseAssetSymbol {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn (this.market as PerpMarketConfig).baseAssetSymbol\n\t\t\t\t.replace('1K', '')\n\t\t\t\t.replace('1M', '') as BaseAssetSymbol;\n\t\t} else {\n\t\t\treturn this.getMarketDisplaySymbol() as unknown as BaseAssetSymbol; // Currently no cases where SPOT baseAssetSymbol is different from marketDisplaySymbol\n\t\t}\n\t}\n\n\tprivate getBaseAssetDisplaySymbol(): BaseAssetDisplaySymbol {\n\t\tif (this.marketId.isPerp) {\n\t\t\treturn (this.market as PerpMarketConfig)\n\t\t\t\t.baseAssetSymbol as BaseAssetDisplaySymbol;\n\t\t} else {\n\t\t\tconst marketConfig = this.market as SpotMarketConfig;\n\t\t\tswitch (marketConfig.poolId) {\n\t\t\t\tcase EXPONENT_POOL_ID: {\n\t\t\t\t\t/*\n\t\t\t\t\tExample market symbol conversions:\n\t\t\t\t\tPT-fragSOL-15JUN25-3 => fragSOL\n\t\t\t\t\tPT-kySOL-10JUL25-3 => kySOL\n\t\t\t\t\tJitoSOL-3 => JitoSOL\n\t\t\t\t\tJTO-3 => JTO\n\t\t\t\t*/\n\t\t\t\t\treturn (\n\t\t\t\t\t\tmarketConfig.symbol.startsWith('PT-')\n\t\t\t\t\t\t\t? marketConfig.symbol.split('-')[1]\n\t\t\t\t\t\t\t: marketConfig.symbol.split('-')[0]\n\t\t\t\t\t) as BaseAssetDisplaySymbol;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\treturn marketConfig.symbol as BaseAssetDisplaySymbol;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PerpMarketAccount, SpotMarketAccount } from "@drift-labs/sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Converts a size and precision exponent to the number of decimals in the size.
|
|
4
|
+
* Size can refer to the step size or the tick size of a market.
|
|
5
|
+
*/
|
|
6
|
+
export declare const getDecimalsFromSize: (size: BN, precisionExp: BN) => number;
|
|
7
|
+
export declare const getPerpMarketSizes: (perpMarketAccount: PerpMarketAccount) => {
|
|
8
|
+
stepSizeDecimals: number;
|
|
9
|
+
tickSizeDecimals: number;
|
|
10
|
+
};
|
|
11
|
+
export declare const getSpotMarketSizes: (spotMarketAccount: SpotMarketAccount) => {
|
|
12
|
+
stepSizeDecimals: number;
|
|
13
|
+
tickSizeDecimals: number;
|
|
14
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSpotMarketSizes = exports.getPerpMarketSizes = exports.getDecimalsFromSize = void 0;
|
|
4
|
+
const sdk_1 = require("@drift-labs/sdk");
|
|
5
|
+
/**
|
|
6
|
+
* Converts a size and precision exponent to the number of decimals in the size.
|
|
7
|
+
* Size can refer to the step size or the tick size of a market.
|
|
8
|
+
*/
|
|
9
|
+
const getDecimalsFromSize = (size, precisionExp) => {
|
|
10
|
+
const formattedSize = sdk_1.BigNum.from(size, precisionExp).prettyPrint();
|
|
11
|
+
if (formattedSize.includes('.')) {
|
|
12
|
+
return formattedSize.split('.')[1].length;
|
|
13
|
+
}
|
|
14
|
+
return 0;
|
|
15
|
+
};
|
|
16
|
+
exports.getDecimalsFromSize = getDecimalsFromSize;
|
|
17
|
+
const getPerpMarketSizes = (perpMarketAccount) => {
|
|
18
|
+
const stepSize = perpMarketAccount.amm.orderStepSize;
|
|
19
|
+
const tickSize = perpMarketAccount.amm.orderTickSize;
|
|
20
|
+
return {
|
|
21
|
+
stepSizeDecimals: (0, exports.getDecimalsFromSize)(stepSize, sdk_1.BASE_PRECISION_EXP),
|
|
22
|
+
tickSizeDecimals: (0, exports.getDecimalsFromSize)(tickSize, sdk_1.QUOTE_PRECISION_EXP),
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
exports.getPerpMarketSizes = getPerpMarketSizes;
|
|
26
|
+
const getSpotMarketSizes = (spotMarketAccount) => {
|
|
27
|
+
const stepSize = spotMarketAccount.orderStepSize;
|
|
28
|
+
const tickSize = spotMarketAccount.orderTickSize;
|
|
29
|
+
return {
|
|
30
|
+
stepSizeDecimals: (0, exports.getDecimalsFromSize)(stepSize, sdk_1.BASE_PRECISION_EXP),
|
|
31
|
+
tickSizeDecimals: (0, exports.getDecimalsFromSize)(tickSize, sdk_1.QUOTE_PRECISION_EXP),
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
exports.getSpotMarketSizes = getSpotMarketSizes;
|
|
35
|
+
//# sourceMappingURL=precisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"precisions.js","sourceRoot":"","sources":["../../../src/utils/markets/precisions.ts"],"names":[],"mappings":";;;AAAA,yCAA4H;AAE5H;;;GAGG;AACI,MAAM,mBAAmB,GAAG,CAAC,IAAQ,EAAE,YAAgB,EAAE,EAAE;IAChE,MAAM,aAAa,GAAG,YAAM,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;IACpE,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AANW,QAAA,mBAAmB,uBAM9B;AAEK,MAAM,kBAAkB,GAAG,CAAC,iBAAoC,EAAE,EAAE;IACzE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,aAAa,CAAC;IACrD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,aAAa,CAAC;IAErD,OAAO;QACL,gBAAgB,EAAE,IAAA,2BAAmB,EAAC,QAAQ,EAAE,wBAAkB,CAAC;QACnE,gBAAgB,EAAE,IAAA,2BAAmB,EAAC,QAAQ,EAAE,yBAAmB,CAAC;KACrE,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B;AAEK,MAAM,kBAAkB,GAAG,CAAC,iBAAoC,EAAE,EAAE;IACzE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,CAAC;IACjD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,CAAC;IAEjD,OAAO;QACL,gBAAgB,EAAE,IAAA,2BAAmB,EAAC,QAAQ,EAAE,wBAAkB,CAAC;QACnE,gBAAgB,EAAE,IAAA,2BAAmB,EAAC,QAAQ,EAAE,yBAAmB,CAAC;KACrE,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B","sourcesContent":["import { BASE_PRECISION_EXP, BigNum, BN, PerpMarketAccount, QUOTE_PRECISION_EXP, SpotMarketAccount } from \"@drift-labs/sdk\";\n\n/**\n * Converts a size and precision exponent to the number of decimals in the size.\n * Size can refer to the step size or the tick size of a market.\n */\nexport const getDecimalsFromSize = (size: BN, precisionExp: BN) => {\n const formattedSize = BigNum.from(size, precisionExp).prettyPrint();\n if (formattedSize.includes('.')) {\n return formattedSize.split('.')[1].length;\n }\n return 0;\n};\n\nexport const getPerpMarketSizes = (perpMarketAccount: PerpMarketAccount) => {\n const stepSize = perpMarketAccount.amm.orderStepSize;\n const tickSize = perpMarketAccount.amm.orderTickSize;\n\n return {\n stepSizeDecimals: getDecimalsFromSize(stepSize, BASE_PRECISION_EXP),\n tickSizeDecimals: getDecimalsFromSize(tickSize, QUOTE_PRECISION_EXP),\n };\n};\n\nexport const getSpotMarketSizes = (spotMarketAccount: SpotMarketAccount) => {\n const stepSize = spotMarketAccount.orderStepSize;\n const tickSize = spotMarketAccount.orderTickSize;\n\n return {\n stepSizeDecimals: getDecimalsFromSize(stepSize, BASE_PRECISION_EXP),\n tickSizeDecimals: getDecimalsFromSize(tickSize, QUOTE_PRECISION_EXP),\n };\n};"]}
|