@drift-labs/common 1.0.53 → 1.0.55

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.
@@ -1,4 +1,6 @@
1
- import { MarketId, deserializeL2Response, OrderbookGrouping, DlobServerChannel } from '..';
1
+ import { MarketId } from '../types/MarketId';
2
+ import { deserializeL2Response } from '../utils/orderbook';
3
+ import { OrderbookGrouping, DlobServerChannel } from '../utils/dlob-server/DlobServerWebsocketUtils';
2
4
  import { Observable } from 'rxjs';
3
5
  import { ResultSlotIncrementer } from '../utils/ResultSlotIncrementer';
4
6
  import { RawL2Output } from '../utils/orderbook/types';
@@ -2,7 +2,8 @@
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.DlobWebsocketClient = void 0;
5
- const __1 = require("..");
5
+ const orderbook_1 = require("../utils/orderbook");
6
+ const DlobServerWebsocketUtils_1 = require("../utils/dlob-server/DlobServerWebsocketUtils");
6
7
  const rxjs_1 = require("rxjs");
7
8
  const operators_1 = require("rxjs/operators");
8
9
  const ResultSlotIncrementer_1 = require("../utils/ResultSlotIncrementer");
@@ -152,12 +153,12 @@ class DlobWebsocketClient {
152
153
  wsUrl: this.config.websocketUrl,
153
154
  enableHeartbeatMonitoring: true,
154
155
  subscriptionId: this.getCachedString(`${this.config.websocketUrl}_dlob_liquidity_${marketId.key}`, 'subscription'),
155
- subscribeMessage: JSON.stringify(__1.DLOB_SERVER_WEBSOCKET_UTILS.getSubscriptionProps({
156
+ subscribeMessage: JSON.stringify(DlobServerWebsocketUtils_1.DLOB_SERVER_WEBSOCKET_UTILS.getSubscriptionProps({
156
157
  type: channel,
157
158
  market: marketId,
158
159
  grouping,
159
160
  })),
160
- unsubscribeMessage: JSON.stringify(__1.DLOB_SERVER_WEBSOCKET_UTILS.getUnsubscriptionProps({
161
+ unsubscribeMessage: JSON.stringify(DlobServerWebsocketUtils_1.DLOB_SERVER_WEBSOCKET_UTILS.getUnsubscriptionProps({
161
162
  type: channel,
162
163
  market: marketId,
163
164
  grouping,
@@ -170,7 +171,7 @@ class DlobWebsocketClient {
170
171
  });
171
172
  },
172
173
  messageFilter: (message) => {
173
- return __1.DLOB_SERVER_WEBSOCKET_UTILS.getMessageFilter({
174
+ return DlobServerWebsocketUtils_1.DLOB_SERVER_WEBSOCKET_UTILS.getMessageFilter({
174
175
  type: channel,
175
176
  market: marketId,
176
177
  grouping,
@@ -205,7 +206,7 @@ class DlobWebsocketClient {
205
206
  if (!validResult) {
206
207
  return null; // Skip results which aren't slot-increasing or are filtered due to tab return
207
208
  }
208
- const deserializedData = (0, __1.deserializeL2Response)(parsed);
209
+ const deserializedData = (0, orderbook_1.deserializeL2Response)(parsed);
209
210
  return {
210
211
  marketId,
211
212
  rawData: parsed,
@@ -1 +1 @@
1
- {"version":3,"file":"DlobWebsocketClient.js","sourceRoot":"","sources":["../../src/clients/DlobWebsocketClient.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport {\n\tMarketId,\n\tdeserializeL2Response,\n\tOrderbookGrouping,\n\tDLOB_SERVER_WEBSOCKET_UTILS,\n\tDlobServerChannel,\n} from '..';\nimport { Observable, Subject, BehaviorSubject, EMPTY } from 'rxjs';\nimport {\n\tmap,\n\tfilter,\n\tcatchError,\n\ttakeUntil,\n\tshare,\n\tdistinctUntilChanged,\n\tswitchMap,\n} from 'rxjs/operators';\nimport { ResultSlotIncrementer } from '../utils/ResultSlotIncrementer';\nimport { MultiplexWebSocket } from '../utils/MultiplexWebSocket';\nimport { RawL2Output } from '../utils/orderbook/types';\n\nexport type OrderbookChannelTypes = Extract<\n\tDlobServerChannel,\n\t'orderbook' | 'orderbook_indicative'\n>;\n\nexport interface DlobWebsocketClientConfig {\n\twebsocketUrl: string;\n\tenableIndicativeOrderbook?: boolean;\n\tresultSlotIncrementer?: ResultSlotIncrementer;\n\tonFallback?: (marketId: MarketId) => void;\n}\n\nexport interface MarketSubscription {\n\tmarketId: MarketId;\n\tchannel: OrderbookChannelTypes;\n\tgrouping?: OrderbookGrouping;\n}\n\nexport interface ProcessedMarketData {\n\tmarketId: MarketId;\n\trawData: RawL2Output;\n\tdeserializedData: ReturnType<typeof deserializeL2Response>;\n\tslot: number;\n}\n\nexport class DlobWebsocketClient {\n\tprivate config: DlobWebsocketClientConfig;\n\tprivate subscriptions = new Map<string, { unsubscribe: () => void }>();\n\tprivate resultIncrementer: ResultSlotIncrementer;\n\tprivate destroy$ = new Subject<void>();\n\n\t// String caches to prevent repeated string concatenation\n\tprivate static readonly stringCache = new Map<string, string>();\n\tprivate static readonly maxCacheSize = 1000;\n\n\t// Subjects for reactive streams\n\tprivate marketSubscriptions$ = new BehaviorSubject<MarketSubscription[]>([]);\n\tprivate rawMessages$ = new Subject<{\n\t\tmarketId: MarketId;\n\t\tchannel: string;\n\t\tdata: string;\n\t}>();\n\n\tconstructor(config: DlobWebsocketClientConfig) {\n\t\tthis.config = config;\n\t\tthis.resultIncrementer =\n\t\t\tconfig.resultSlotIncrementer || new ResultSlotIncrementer();\n\n\t\tthis.setupSubscriptionManagement();\n\t}\n\n\t/**\n\t * Get an observable stream of processed market data for specific markets\n\t */\n\tgetMarketDataStream(marketIds: MarketId[]): Observable<ProcessedMarketData> {\n\t\treturn this.rawMessages$.pipe(\n\t\t\tfilter(({ marketId }) => marketIds.some((id) => id.key === marketId.key)),\n\t\t\tmap(({ marketId, channel, data }) =>\n\t\t\t\tthis.processRawMessage(marketId, channel, data)\n\t\t\t),\n\t\t\tfilter((result): result is ProcessedMarketData => result !== null),\n\t\t\tcatchError((error) => {\n\t\t\t\tconsole.error('Caught error in getMarketDataStream', error);\n\t\t\t\treturn EMPTY;\n\t\t\t}),\n\t\t\ttakeUntil(this.destroy$),\n\t\t\tshare()\n\t\t);\n\t}\n\n\t/**\n\t * Subscribe to market data for given markets\n\t */\n\tsubscribeToMarkets(\n\t\tmarkets: {\n\t\t\tmarketId: MarketId;\n\t\t\tgrouping?: OrderbookGrouping;\n\t\t}[]\n\t): void {\n\t\tconst subscriptions: MarketSubscription[] = markets.map(\n\t\t\t({ marketId, grouping }) => ({\n\t\t\t\tmarketId,\n\t\t\t\tchannel: this.config.enableIndicativeOrderbook\n\t\t\t\t\t? 'orderbook_indicative'\n\t\t\t\t\t: 'orderbook',\n\t\t\t\tgrouping,\n\t\t\t})\n\t\t);\n\n\t\tthis.marketSubscriptions$.next(subscriptions);\n\t}\n\n\t/**\n\t * Unsubscribe from all markets\n\t */\n\tunsubscribeAll(): void {\n\t\tthis.marketSubscriptions$.next([]);\n\t}\n\n\t/**\n\t * Handle tab return to prevent \"speed run\" through queued messages\n\t */\n\thandleTabReturn(): void {\n\t\tthis.resultIncrementer.handleTabReturn();\n\t}\n\n\t/**\n\t * Reset slot tracking for clean state on reconnection\n\t */\n\tresetSlotTracking(): void {\n\t\t// Get all current subscription keys and reset their slot tracking\n\t\tfor (const subscriptionKey of this.subscriptions.keys()) {\n\t\t\t// Extract marketId and channel from subscription key\n\t\t\tconst [marketKey, channel] = subscriptionKey.split('_');\n\t\t\tconst resultKey = this.getCachedString(\n\t\t\t\t`${channel}_${marketKey}`,\n\t\t\t\t'result'\n\t\t\t);\n\t\t\tthis.resultIncrementer.resetKey(resultKey);\n\t\t}\n\t}\n\n\t/**\n\t * Cache frequently used strings to reduce memory allocation\n\t */\n\tprivate getCachedString(baseString: string, type: string): string {\n\t\tconst cacheKey = `${type}:${baseString}`;\n\n\t\tif (DlobWebsocketClient.stringCache.has(cacheKey)) {\n\t\t\treturn DlobWebsocketClient.stringCache.get(cacheKey)!;\n\t\t}\n\n\t\t// If cache is getting too large, clear oldest entries\n\t\tif (\n\t\t\tDlobWebsocketClient.stringCache.size >= DlobWebsocketClient.maxCacheSize\n\t\t) {\n\t\t\tconst firstKey = DlobWebsocketClient.stringCache.keys().next().value;\n\t\t\tDlobWebsocketClient.stringCache.delete(firstKey);\n\t\t}\n\n\t\tDlobWebsocketClient.stringCache.set(cacheKey, baseString);\n\t\treturn baseString;\n\t}\n\n\t/**\n\t * Destroy the client and clean up all subscriptions\n\t */\n\tdestroy(): void {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t\tthis.subscriptions.forEach(({ unsubscribe }) => unsubscribe());\n\t\tthis.subscriptions.clear();\n\t}\n\n\t/**\n\t * Sets up the subscription management pipeline that handles market data subscriptions.\n\t * This pipeline:\n\t * 1. Watches for changes in market subscriptions\n\t * 2. Only processes changes when the subscription list actually changes\n\t * 3. Manages the lifecycle of websocket subscriptions\n\t * 4. Cleans up when the client is destroyed\n\t */\n\tprivate setupSubscriptionManagement(): void {\n\t\tthis.marketSubscriptions$\n\t\t\t.pipe(\n\t\t\t\t// Only emit when the subscription list actually changes\n\t\t\t\t// Uses JSON.stringify for deep comparison of subscription arrays\n\t\t\t\tdistinctUntilChanged(\n\t\t\t\t\t(prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)\n\t\t\t\t),\n\t\t\t\t// Switch to managing the new set of subscriptions\n\t\t\t\t// This will cancel any previous subscription management\n\t\t\t\tswitchMap((subscriptions) =>\n\t\t\t\t\tthis.manageNewSubscriptions(subscriptions)\n\t\t\t\t),\n\t\t\t\t// Clean up when the client is destroyed\n\t\t\t\ttakeUntil(this.destroy$)\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\t/**\n\t * Manages the lifecycle of websocket subscriptions by:\n\t * 1. Comparing current subscriptions with new subscriptions\n\t * 2. Unsubscribing from any subscriptions that are no longer needed\n\t * 3. Creating new subscriptions for markets that weren't previously subscribed\n\t *\n\t * @param newSubscriptions - The new set of market subscriptions to maintain\n\t * @returns An empty observable since this is a side-effect operation\n\t */\n\tprivate manageNewSubscriptions(\n\t\tnewSubscriptions: MarketSubscription[]\n\t): Observable<never> {\n\t\t// Get sets of subscription keys for efficient comparison\n\t\tconst currentKeys = new Set(this.subscriptions.keys());\n\t\tconst newKeys = new Set(\n\t\t\tnewSubscriptions.map((sub) => this.getSubscriptionKey(sub))\n\t\t);\n\n\t\t// Unsubscribe from removed subscriptions\n\t\tfor (const key of currentKeys) {\n\t\t\tif (!newKeys.has(key)) {\n\t\t\t\tconst subscription = this.subscriptions.get(key);\n\t\t\t\tif (subscription) {\n\t\t\t\t\tsubscription.unsubscribe();\n\t\t\t\t\tthis.subscriptions.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Subscribe to new subscriptions\n\t\tfor (const subscription of newSubscriptions) {\n\t\t\tconst key = this.getSubscriptionKey(subscription);\n\t\t\tif (!currentKeys.has(key)) {\n\t\t\t\tthis.createSubscription(subscription);\n\t\t\t}\n\t\t}\n\n\t\treturn EMPTY;\n\t}\n\n\tprivate createSubscription(subscription: MarketSubscription): void {\n\t\tconst { marketId, channel, grouping } = subscription;\n\t\tconst subscriptionKey = this.getSubscriptionKey(subscription);\n\n\t\ttry {\n\t\t\tconst { unsubscribe } = MultiplexWebSocket.createWebSocketSubscription<{\n\t\t\t\tchannel: string;\n\t\t\t\tdata: string;\n\t\t\t}>({\n\t\t\t\twsUrl: this.config.websocketUrl,\n\t\t\t\tenableHeartbeatMonitoring: true,\n\t\t\t\tsubscriptionId: this.getCachedString(\n\t\t\t\t\t`${this.config.websocketUrl}_dlob_liquidity_${marketId.key}`,\n\t\t\t\t\t'subscription'\n\t\t\t\t),\n\t\t\t\tsubscribeMessage: JSON.stringify(\n\t\t\t\t\tDLOB_SERVER_WEBSOCKET_UTILS.getSubscriptionProps({\n\t\t\t\t\t\ttype: channel,\n\t\t\t\t\t\tmarket: marketId,\n\t\t\t\t\t\tgrouping,\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t\tunsubscribeMessage: JSON.stringify(\n\t\t\t\t\tDLOB_SERVER_WEBSOCKET_UTILS.getUnsubscriptionProps({\n\t\t\t\t\t\ttype: channel,\n\t\t\t\t\t\tmarket: marketId,\n\t\t\t\t\t\tgrouping,\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t\tonMessage: (message: { channel: string; data: string }) => {\n\t\t\t\t\tthis.rawMessages$.next({\n\t\t\t\t\t\tmarketId,\n\t\t\t\t\t\tchannel: message.channel,\n\t\t\t\t\t\tdata: message.data,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tmessageFilter: (message: { channel: string; data: string }) => {\n\t\t\t\t\treturn DLOB_SERVER_WEBSOCKET_UTILS.getMessageFilter({\n\t\t\t\t\t\ttype: channel,\n\t\t\t\t\t\tmarket: marketId,\n\t\t\t\t\t\tgrouping,\n\t\t\t\t\t})(message);\n\t\t\t\t},\n\t\t\t\tonError: (error?: any) => {\n\t\t\t\t\tconsole.error('Caught error in createSubscription', error);\n\t\t\t\t\tthis.config.onFallback?.(marketId);\n\t\t\t\t},\n\t\t\t\terrorMessageFilter: (message?: any) => {\n\t\t\t\t\tif (message?.error) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.subscriptions.set(subscriptionKey, { unsubscribe });\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to create subscription:', error);\n\t\t\tthis.config.onFallback?.(marketId);\n\t\t}\n\t}\n\n\tprivate processRawMessage(\n\t\tmarketId: MarketId,\n\t\tchannel: string,\n\t\tdata: string\n\t): ProcessedMarketData | null {\n\t\ttry {\n\t\t\tconst parsed = this.tryParse(data) as RawL2Output;\n\t\t\tconst resultKey = this.getCachedString(\n\t\t\t\t`${channel}_${marketId.key}`,\n\t\t\t\t'result'\n\t\t\t);\n\t\t\tconst messageTimestamp = Date.now(); // Capture when we received this message\n\n\t\t\tconst validResult = this.resultIncrementer.handleResult(\n\t\t\t\tresultKey,\n\t\t\t\tparsed.slot ?? 0,\n\t\t\t\tmessageTimestamp\n\t\t\t);\n\n\t\t\tif (!validResult) {\n\t\t\t\treturn null; // Skip results which aren't slot-increasing or are filtered due to tab return\n\t\t\t}\n\n\t\t\tconst deserializedData = deserializeL2Response(parsed);\n\n\t\t\treturn {\n\t\t\t\tmarketId,\n\t\t\t\trawData: parsed,\n\t\t\t\tdeserializedData,\n\t\t\t\tslot: parsed.slot ?? 0,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate tryParse(data: unknown): unknown {\n\t\ttry {\n\t\t\treturn JSON.parse(data as string, (key, value) => {\n\t\t\t\t// If the value is a number and it's too large to be safely represented as a JavaScript number,\n\t\t\t\t// convert it to a string to prevent precision loss\n\t\t\t\tif (typeof value === 'number' && !Number.isSafeInteger(value)) {\n\t\t\t\t\treturn value.toString();\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t});\n\t\t} catch (e) {\n\t\t\treturn data;\n\t\t}\n\t}\n\n\tprivate getSubscriptionKey(subscription: MarketSubscription): string {\n\t\tconst { marketId, channel, grouping } = subscription;\n\t\tconst baseKey = `${marketId.key}_${channel}${\n\t\t\tgrouping ? `_${grouping}` : ''\n\t\t}`;\n\t\treturn this.getCachedString(baseKey, 'subscription_key');\n\t}\n}\n\nexport default DlobWebsocketClient;\n"]}
1
+ {"version":3,"file":"DlobWebsocketClient.js","sourceRoot":"","sources":["../../src/clients/DlobWebsocketClient.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { MarketId } from '../types/MarketId';\nimport { deserializeL2Response } from '../utils/orderbook';\nimport {\n\tOrderbookGrouping,\n\tDLOB_SERVER_WEBSOCKET_UTILS,\n\tDlobServerChannel,\n} from '../utils/dlob-server/DlobServerWebsocketUtils';\nimport { Observable, Subject, BehaviorSubject, EMPTY } from 'rxjs';\nimport {\n\tmap,\n\tfilter,\n\tcatchError,\n\ttakeUntil,\n\tshare,\n\tdistinctUntilChanged,\n\tswitchMap,\n} from 'rxjs/operators';\nimport { ResultSlotIncrementer } from '../utils/ResultSlotIncrementer';\nimport { MultiplexWebSocket } from '../utils/MultiplexWebSocket';\nimport { RawL2Output } from '../utils/orderbook/types';\n\nexport type OrderbookChannelTypes = Extract<\n\tDlobServerChannel,\n\t'orderbook' | 'orderbook_indicative'\n>;\n\nexport interface DlobWebsocketClientConfig {\n\twebsocketUrl: string;\n\tenableIndicativeOrderbook?: boolean;\n\tresultSlotIncrementer?: ResultSlotIncrementer;\n\tonFallback?: (marketId: MarketId) => void;\n}\n\nexport interface MarketSubscription {\n\tmarketId: MarketId;\n\tchannel: OrderbookChannelTypes;\n\tgrouping?: OrderbookGrouping;\n}\n\nexport interface ProcessedMarketData {\n\tmarketId: MarketId;\n\trawData: RawL2Output;\n\tdeserializedData: ReturnType<typeof deserializeL2Response>;\n\tslot: number;\n}\n\nexport class DlobWebsocketClient {\n\tprivate config: DlobWebsocketClientConfig;\n\tprivate subscriptions = new Map<string, { unsubscribe: () => void }>();\n\tprivate resultIncrementer: ResultSlotIncrementer;\n\tprivate destroy$ = new Subject<void>();\n\n\t// String caches to prevent repeated string concatenation\n\tprivate static readonly stringCache = new Map<string, string>();\n\tprivate static readonly maxCacheSize = 1000;\n\n\t// Subjects for reactive streams\n\tprivate marketSubscriptions$ = new BehaviorSubject<MarketSubscription[]>([]);\n\tprivate rawMessages$ = new Subject<{\n\t\tmarketId: MarketId;\n\t\tchannel: string;\n\t\tdata: string;\n\t}>();\n\n\tconstructor(config: DlobWebsocketClientConfig) {\n\t\tthis.config = config;\n\t\tthis.resultIncrementer =\n\t\t\tconfig.resultSlotIncrementer || new ResultSlotIncrementer();\n\n\t\tthis.setupSubscriptionManagement();\n\t}\n\n\t/**\n\t * Get an observable stream of processed market data for specific markets\n\t */\n\tgetMarketDataStream(marketIds: MarketId[]): Observable<ProcessedMarketData> {\n\t\treturn this.rawMessages$.pipe(\n\t\t\tfilter(({ marketId }) => marketIds.some((id) => id.key === marketId.key)),\n\t\t\tmap(({ marketId, channel, data }) =>\n\t\t\t\tthis.processRawMessage(marketId, channel, data)\n\t\t\t),\n\t\t\tfilter((result): result is ProcessedMarketData => result !== null),\n\t\t\tcatchError((error) => {\n\t\t\t\tconsole.error('Caught error in getMarketDataStream', error);\n\t\t\t\treturn EMPTY;\n\t\t\t}),\n\t\t\ttakeUntil(this.destroy$),\n\t\t\tshare()\n\t\t);\n\t}\n\n\t/**\n\t * Subscribe to market data for given markets\n\t */\n\tsubscribeToMarkets(\n\t\tmarkets: {\n\t\t\tmarketId: MarketId;\n\t\t\tgrouping?: OrderbookGrouping;\n\t\t}[]\n\t): void {\n\t\tconst subscriptions: MarketSubscription[] = markets.map(\n\t\t\t({ marketId, grouping }) => ({\n\t\t\t\tmarketId,\n\t\t\t\tchannel: this.config.enableIndicativeOrderbook\n\t\t\t\t\t? 'orderbook_indicative'\n\t\t\t\t\t: 'orderbook',\n\t\t\t\tgrouping,\n\t\t\t})\n\t\t);\n\n\t\tthis.marketSubscriptions$.next(subscriptions);\n\t}\n\n\t/**\n\t * Unsubscribe from all markets\n\t */\n\tunsubscribeAll(): void {\n\t\tthis.marketSubscriptions$.next([]);\n\t}\n\n\t/**\n\t * Handle tab return to prevent \"speed run\" through queued messages\n\t */\n\thandleTabReturn(): void {\n\t\tthis.resultIncrementer.handleTabReturn();\n\t}\n\n\t/**\n\t * Reset slot tracking for clean state on reconnection\n\t */\n\tresetSlotTracking(): void {\n\t\t// Get all current subscription keys and reset their slot tracking\n\t\tfor (const subscriptionKey of this.subscriptions.keys()) {\n\t\t\t// Extract marketId and channel from subscription key\n\t\t\tconst [marketKey, channel] = subscriptionKey.split('_');\n\t\t\tconst resultKey = this.getCachedString(\n\t\t\t\t`${channel}_${marketKey}`,\n\t\t\t\t'result'\n\t\t\t);\n\t\t\tthis.resultIncrementer.resetKey(resultKey);\n\t\t}\n\t}\n\n\t/**\n\t * Cache frequently used strings to reduce memory allocation\n\t */\n\tprivate getCachedString(baseString: string, type: string): string {\n\t\tconst cacheKey = `${type}:${baseString}`;\n\n\t\tif (DlobWebsocketClient.stringCache.has(cacheKey)) {\n\t\t\treturn DlobWebsocketClient.stringCache.get(cacheKey)!;\n\t\t}\n\n\t\t// If cache is getting too large, clear oldest entries\n\t\tif (\n\t\t\tDlobWebsocketClient.stringCache.size >= DlobWebsocketClient.maxCacheSize\n\t\t) {\n\t\t\tconst firstKey = DlobWebsocketClient.stringCache.keys().next().value;\n\t\t\tDlobWebsocketClient.stringCache.delete(firstKey);\n\t\t}\n\n\t\tDlobWebsocketClient.stringCache.set(cacheKey, baseString);\n\t\treturn baseString;\n\t}\n\n\t/**\n\t * Destroy the client and clean up all subscriptions\n\t */\n\tdestroy(): void {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t\tthis.subscriptions.forEach(({ unsubscribe }) => unsubscribe());\n\t\tthis.subscriptions.clear();\n\t}\n\n\t/**\n\t * Sets up the subscription management pipeline that handles market data subscriptions.\n\t * This pipeline:\n\t * 1. Watches for changes in market subscriptions\n\t * 2. Only processes changes when the subscription list actually changes\n\t * 3. Manages the lifecycle of websocket subscriptions\n\t * 4. Cleans up when the client is destroyed\n\t */\n\tprivate setupSubscriptionManagement(): void {\n\t\tthis.marketSubscriptions$\n\t\t\t.pipe(\n\t\t\t\t// Only emit when the subscription list actually changes\n\t\t\t\t// Uses JSON.stringify for deep comparison of subscription arrays\n\t\t\t\tdistinctUntilChanged(\n\t\t\t\t\t(prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)\n\t\t\t\t),\n\t\t\t\t// Switch to managing the new set of subscriptions\n\t\t\t\t// This will cancel any previous subscription management\n\t\t\t\tswitchMap((subscriptions) =>\n\t\t\t\t\tthis.manageNewSubscriptions(subscriptions)\n\t\t\t\t),\n\t\t\t\t// Clean up when the client is destroyed\n\t\t\t\ttakeUntil(this.destroy$)\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\t/**\n\t * Manages the lifecycle of websocket subscriptions by:\n\t * 1. Comparing current subscriptions with new subscriptions\n\t * 2. Unsubscribing from any subscriptions that are no longer needed\n\t * 3. Creating new subscriptions for markets that weren't previously subscribed\n\t *\n\t * @param newSubscriptions - The new set of market subscriptions to maintain\n\t * @returns An empty observable since this is a side-effect operation\n\t */\n\tprivate manageNewSubscriptions(\n\t\tnewSubscriptions: MarketSubscription[]\n\t): Observable<never> {\n\t\t// Get sets of subscription keys for efficient comparison\n\t\tconst currentKeys = new Set(this.subscriptions.keys());\n\t\tconst newKeys = new Set(\n\t\t\tnewSubscriptions.map((sub) => this.getSubscriptionKey(sub))\n\t\t);\n\n\t\t// Unsubscribe from removed subscriptions\n\t\tfor (const key of currentKeys) {\n\t\t\tif (!newKeys.has(key)) {\n\t\t\t\tconst subscription = this.subscriptions.get(key);\n\t\t\t\tif (subscription) {\n\t\t\t\t\tsubscription.unsubscribe();\n\t\t\t\t\tthis.subscriptions.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Subscribe to new subscriptions\n\t\tfor (const subscription of newSubscriptions) {\n\t\t\tconst key = this.getSubscriptionKey(subscription);\n\t\t\tif (!currentKeys.has(key)) {\n\t\t\t\tthis.createSubscription(subscription);\n\t\t\t}\n\t\t}\n\n\t\treturn EMPTY;\n\t}\n\n\tprivate createSubscription(subscription: MarketSubscription): void {\n\t\tconst { marketId, channel, grouping } = subscription;\n\t\tconst subscriptionKey = this.getSubscriptionKey(subscription);\n\n\t\ttry {\n\t\t\tconst { unsubscribe } = MultiplexWebSocket.createWebSocketSubscription<{\n\t\t\t\tchannel: string;\n\t\t\t\tdata: string;\n\t\t\t}>({\n\t\t\t\twsUrl: this.config.websocketUrl,\n\t\t\t\tenableHeartbeatMonitoring: true,\n\t\t\t\tsubscriptionId: this.getCachedString(\n\t\t\t\t\t`${this.config.websocketUrl}_dlob_liquidity_${marketId.key}`,\n\t\t\t\t\t'subscription'\n\t\t\t\t),\n\t\t\t\tsubscribeMessage: JSON.stringify(\n\t\t\t\t\tDLOB_SERVER_WEBSOCKET_UTILS.getSubscriptionProps({\n\t\t\t\t\t\ttype: channel,\n\t\t\t\t\t\tmarket: marketId,\n\t\t\t\t\t\tgrouping,\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t\tunsubscribeMessage: JSON.stringify(\n\t\t\t\t\tDLOB_SERVER_WEBSOCKET_UTILS.getUnsubscriptionProps({\n\t\t\t\t\t\ttype: channel,\n\t\t\t\t\t\tmarket: marketId,\n\t\t\t\t\t\tgrouping,\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t\tonMessage: (message: { channel: string; data: string }) => {\n\t\t\t\t\tthis.rawMessages$.next({\n\t\t\t\t\t\tmarketId,\n\t\t\t\t\t\tchannel: message.channel,\n\t\t\t\t\t\tdata: message.data,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tmessageFilter: (message: { channel: string; data: string }) => {\n\t\t\t\t\treturn DLOB_SERVER_WEBSOCKET_UTILS.getMessageFilter({\n\t\t\t\t\t\ttype: channel,\n\t\t\t\t\t\tmarket: marketId,\n\t\t\t\t\t\tgrouping,\n\t\t\t\t\t})(message);\n\t\t\t\t},\n\t\t\t\tonError: (error?: any) => {\n\t\t\t\t\tconsole.error('Caught error in createSubscription', error);\n\t\t\t\t\tthis.config.onFallback?.(marketId);\n\t\t\t\t},\n\t\t\t\terrorMessageFilter: (message?: any) => {\n\t\t\t\t\tif (message?.error) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.subscriptions.set(subscriptionKey, { unsubscribe });\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to create subscription:', error);\n\t\t\tthis.config.onFallback?.(marketId);\n\t\t}\n\t}\n\n\tprivate processRawMessage(\n\t\tmarketId: MarketId,\n\t\tchannel: string,\n\t\tdata: string\n\t): ProcessedMarketData | null {\n\t\ttry {\n\t\t\tconst parsed = this.tryParse(data) as RawL2Output;\n\t\t\tconst resultKey = this.getCachedString(\n\t\t\t\t`${channel}_${marketId.key}`,\n\t\t\t\t'result'\n\t\t\t);\n\t\t\tconst messageTimestamp = Date.now(); // Capture when we received this message\n\n\t\t\tconst validResult = this.resultIncrementer.handleResult(\n\t\t\t\tresultKey,\n\t\t\t\tparsed.slot ?? 0,\n\t\t\t\tmessageTimestamp\n\t\t\t);\n\n\t\t\tif (!validResult) {\n\t\t\t\treturn null; // Skip results which aren't slot-increasing or are filtered due to tab return\n\t\t\t}\n\n\t\t\tconst deserializedData = deserializeL2Response(parsed);\n\n\t\t\treturn {\n\t\t\t\tmarketId,\n\t\t\t\trawData: parsed,\n\t\t\t\tdeserializedData,\n\t\t\t\tslot: parsed.slot ?? 0,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate tryParse(data: unknown): unknown {\n\t\ttry {\n\t\t\treturn JSON.parse(data as string, (key, value) => {\n\t\t\t\t// If the value is a number and it's too large to be safely represented as a JavaScript number,\n\t\t\t\t// convert it to a string to prevent precision loss\n\t\t\t\tif (typeof value === 'number' && !Number.isSafeInteger(value)) {\n\t\t\t\t\treturn value.toString();\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t});\n\t\t} catch (e) {\n\t\t\treturn data;\n\t\t}\n\t}\n\n\tprivate getSubscriptionKey(subscription: MarketSubscription): string {\n\t\tconst { marketId, channel, grouping } = subscription;\n\t\tconst baseKey = `${marketId.key}_${channel}${\n\t\t\tgrouping ? `_${grouping}` : ''\n\t\t}`;\n\t\treturn this.getCachedString(baseKey, 'subscription_key');\n\t}\n}\n\nexport default DlobWebsocketClient;\n"]}
@@ -21,16 +21,10 @@ exports.HIDDEN_PERP_MARKET_INDEXES = new Map([
21
21
  [14, 1772625600], // HNT — 4 Mar 2026, 12:00 UTC
22
22
  [19, 1772625600], // TIA — 4 Mar 2026, 12:00 UTC
23
23
  [21, 1772625600], // SEI — 4 Mar 2026, 12:00 UTC
24
- [27, 1772625600], // W — 4 Mar 2026, 12:00 UTC
25
- [31, 1772625600], // CLOUD — 4 Mar 2026, 12:00 UTC
26
24
  [34, 1772625600], // POPCAT — 4 Mar 2026, 12:00 UTC
27
25
  [42, 1772625600], // TON — 4 Mar 2026, 12:00 UTC
28
- [61, 1772625600], // ME — 4 Mar 2026, 12:00 UTC
29
26
  [62, 1772625600], // PENGU — 4 Mar 2026, 12:00 UTC
30
27
  [64, 1772625600], // TRUMP — 4 Mar 2026, 12:00 UTC
31
- [66, 1772625600], // BERA — 4 Mar 2026, 12:00 UTC
32
- [69, 1772625600], // KAITO — 4 Mar 2026, 12:00 UTC
33
- [70, 1772625600], // IP — 4 Mar 2026, 12:00 UTC
34
28
  [72, 1772625600], // ADA — 4 Mar 2026, 12:00 UTC
35
29
  [77, 1772625600], // XPL — 4 Mar 2026, 12:00 UTC
36
30
  [78, 1772625600], // 2Z — 4 Mar 2026, 12:00 UTC
@@ -1 +1 @@
1
- {"version":3,"file":"markets.js","sourceRoot":"","sources":["../../src/constants/markets.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAC1B,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,uBAAuB,GAAG,EAAE,CAAC;AAE7B,QAAA,2BAA2B,GAAG,EAAE,CAAC;AAE9C;;;;;;GAMG;AACU,QAAA,0BAA0B,GAAgC,IAAI,GAAG,CAAC;IAC9E,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAC/C,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,iCAAiC;IACnD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,6BAA6B;IAC/C,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,4BAA4B;IAC9C,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,gCAAgC;IAClD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,iCAAiC;IACnD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,6BAA6B;IAC/C,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,gCAAgC;IAClD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,gCAAgC;IAClD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,+BAA+B;IACjD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,gCAAgC;IAClD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,6BAA6B;IAC/C,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,6BAA6B;IAC/C,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;CAChD,CAAC,CAAC","sourcesContent":["export const USDC_SPOT_MARKET_INDEX = 0;\nexport const SOL_SPOT_MARKET_INDEX = 1;\nexport const WBTC_SPOT_MARKET_INDEX = 3;\nexport const WETH_SPOT_MARKET_INDEX = 4;\nexport const CBBTC_SPOT_MARKET_INDEX = 27;\n\nexport const DEFAULT_MAX_MARKET_LEVERAGE = 10;\n\n/**\n * Low-activity perp markets to hide from the UI.\n * Key = perp market index, Value = Unix timestamp (seconds) after which the market is hidden.\n * Before the timestamp: market is visible but a warning banner is shown.\n * After the timestamp: market is hidden from dropdowns (unless user has positions/orders/unsettled PnL).\n * Direct URL navigation (e.g. /TIA-PERP) is unaffected.\n */\nexport const HIDDEN_PERP_MARKET_INDEXES: ReadonlyMap<number, number> = new Map([\n\t[5, 1772625600], // POL — 4 Mar 2026, 12:00 UTC\n\t[10, 1772625600], // 1MPEPE — 4 Mar 2026, 12:00 UTC\n\t[11, 1772625600], // OP — 4 Mar 2026, 12:00 UTC\n\t[14, 1772625600], // HNT — 4 Mar 2026, 12:00 UTC\n\t[19, 1772625600], // TIA — 4 Mar 2026, 12:00 UTC\n\t[21, 1772625600], // SEI — 4 Mar 2026, 12:00 UTC\n\t[27, 1772625600], // W — 4 Mar 2026, 12:00 UTC\n\t[31, 1772625600], // CLOUD — 4 Mar 2026, 12:00 UTC\n\t[34, 1772625600], // POPCAT — 4 Mar 2026, 12:00 UTC\n\t[42, 1772625600], // TON — 4 Mar 2026, 12:00 UTC\n\t[61, 1772625600], // ME — 4 Mar 2026, 12:00 UTC\n\t[62, 1772625600], // PENGU — 4 Mar 2026, 12:00 UTC\n\t[64, 1772625600], // TRUMP — 4 Mar 2026, 12:00 UTC\n\t[66, 1772625600], // BERA — 4 Mar 2026, 12:00 UTC\n\t[69, 1772625600], // KAITO — 4 Mar 2026, 12:00 UTC\n\t[70, 1772625600], // IP — 4 Mar 2026, 12:00 UTC\n\t[72, 1772625600], // ADA — 4 Mar 2026, 12:00 UTC\n\t[77, 1772625600], // XPL — 4 Mar 2026, 12:00 UTC\n\t[78, 1772625600], // 2Z — 4 Mar 2026, 12:00 UTC\n\t[80, 1772625600], // MNT — 4 Mar 2026, 12:00 UTC\n\t[82, 1772625600], // MET — 4 Mar 2026, 12:00 UTC\n]);\n"]}
1
+ {"version":3,"file":"markets.js","sourceRoot":"","sources":["../../src/constants/markets.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAC1B,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,uBAAuB,GAAG,EAAE,CAAC;AAE7B,QAAA,2BAA2B,GAAG,EAAE,CAAC;AAE9C;;;;;;GAMG;AACU,QAAA,0BAA0B,GAAgC,IAAI,GAAG,CAAC;IAC9E,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAC/C,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,iCAAiC;IACnD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,6BAA6B;IAC/C,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,iCAAiC;IACnD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,gCAAgC;IAClD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,gCAAgC;IAClD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,6BAA6B;IAC/C,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;IAChD,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,8BAA8B;CAChD,CAAC,CAAC","sourcesContent":["export const USDC_SPOT_MARKET_INDEX = 0;\nexport const SOL_SPOT_MARKET_INDEX = 1;\nexport const WBTC_SPOT_MARKET_INDEX = 3;\nexport const WETH_SPOT_MARKET_INDEX = 4;\nexport const CBBTC_SPOT_MARKET_INDEX = 27;\n\nexport const DEFAULT_MAX_MARKET_LEVERAGE = 10;\n\n/**\n * Low-activity perp markets to hide from the UI.\n * Key = perp market index, Value = Unix timestamp (seconds) after which the market is hidden.\n * Before the timestamp: market is visible but a warning banner is shown.\n * After the timestamp: market is hidden from dropdowns (unless user has positions/orders/unsettled PnL).\n * Direct URL navigation (e.g. /TIA-PERP) is unaffected.\n */\nexport const HIDDEN_PERP_MARKET_INDEXES: ReadonlyMap<number, number> = new Map([\n\t[5, 1772625600], // POL — 4 Mar 2026, 12:00 UTC\n\t[10, 1772625600], // 1MPEPE — 4 Mar 2026, 12:00 UTC\n\t[11, 1772625600], // OP — 4 Mar 2026, 12:00 UTC\n\t[14, 1772625600], // HNT — 4 Mar 2026, 12:00 UTC\n\t[19, 1772625600], // TIA — 4 Mar 2026, 12:00 UTC\n\t[21, 1772625600], // SEI — 4 Mar 2026, 12:00 UTC\n\t[34, 1772625600], // POPCAT — 4 Mar 2026, 12:00 UTC\n\t[42, 1772625600], // TON — 4 Mar 2026, 12:00 UTC\n\t[62, 1772625600], // PENGU — 4 Mar 2026, 12:00 UTC\n\t[64, 1772625600], // TRUMP — 4 Mar 2026, 12:00 UTC\n\t[72, 1772625600], // ADA — 4 Mar 2026, 12:00 UTC\n\t[77, 1772625600], // XPL — 4 Mar 2026, 12:00 UTC\n\t[78, 1772625600], // 2Z — 4 Mar 2026, 12:00 UTC\n\t[80, 1772625600], // MNT — 4 Mar 2026, 12:00 UTC\n\t[82, 1772625600], // MET — 4 Mar 2026, 12:00 UTC\n]);\n"]}
@@ -2,15 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MarketId = void 0;
4
4
  const sdk_1 = require("@drift-labs/sdk");
5
- const utils_1 = require("../utils");
5
+ const enum_1 = require("../utils/enum");
6
6
  class MarketId {
7
7
  constructor(marketIndex, marketType) {
8
8
  this.marketIndex = marketIndex;
9
9
  this.marketType = marketType;
10
10
  this._key = MarketId.key(marketIndex, marketType);
11
- this._isSpot = utils_1.ENUM_UTILS.match(marketType, sdk_1.MarketType.SPOT);
12
- this._isPerp = utils_1.ENUM_UTILS.match(marketType, sdk_1.MarketType.PERP);
13
- this._marketTypeStr = utils_1.ENUM_UTILS.toStr(marketType);
11
+ this._isSpot = enum_1.ENUM_UTILS.match(marketType, sdk_1.MarketType.SPOT);
12
+ this._isPerp = enum_1.ENUM_UTILS.match(marketType, sdk_1.MarketType.PERP);
13
+ this._marketTypeStr = enum_1.ENUM_UTILS.toStr(marketType);
14
14
  }
15
15
  static getOrCreate(marketIndex, marketType) {
16
16
  const key = MarketId.key(marketIndex, marketType);
@@ -32,7 +32,7 @@ class MarketId {
32
32
  return MarketId.cache.get(key);
33
33
  }
34
34
  const [marketType, marketIndex] = key.split('_');
35
- const marketId = new MarketId(parseInt(marketIndex), utils_1.ENUM_UTILS.toObj(marketType));
35
+ const marketId = new MarketId(parseInt(marketIndex), enum_1.ENUM_UTILS.toObj(marketType));
36
36
  MarketId.cache.set(key, marketId);
37
37
  return marketId;
38
38
  }
@@ -46,7 +46,7 @@ class MarketId {
46
46
  return this._marketTypeStr;
47
47
  }
48
48
  static key(marketIndex, marketType) {
49
- return `${utils_1.ENUM_UTILS.toStr(marketType)}_${marketIndex}`;
49
+ return `${enum_1.ENUM_UTILS.toStr(marketType)}_${marketIndex}`;
50
50
  }
51
51
  /**
52
52
  * Returns a unique string that can be used as a key in a map.
@@ -55,7 +55,7 @@ class MarketId {
55
55
  return this._key; // Micro-optimisation to avoid string concatenation every time the key is accessed
56
56
  }
57
57
  equals(other) {
58
- return (utils_1.ENUM_UTILS.match(this.marketType, other.marketType) &&
58
+ return (enum_1.ENUM_UTILS.match(this.marketType, other.marketType) &&
59
59
  this.marketIndex === other.marketIndex);
60
60
  }
61
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MarketId.js","sourceRoot":"","sources":["../../src/types/MarketId.ts"],"names":[],"mappings":"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","sourcesContent":["import { MarketType } from '@drift-labs/sdk';\nimport { ENUM_UTILS } from '../utils';\nimport { Opaque } from './utility';\n\n// Define MarketKey as an opaque type\nexport type MarketKey = Opaque<'MarketKey', string>;\n\nexport class MarketId {\n\tprivate static cache = new Map<MarketKey, MarketId>();\n\tprivate _key: MarketKey;\n\tprivate _isSpot: boolean;\n\tprivate _isPerp: boolean;\n\tprivate _marketTypeStr: string;\n\n\tconstructor(readonly marketIndex: number, readonly marketType: MarketType) {\n\t\tthis._key = MarketId.key(marketIndex, marketType);\n\t\tthis._isSpot = ENUM_UTILS.match(marketType, MarketType.SPOT);\n\t\tthis._isPerp = ENUM_UTILS.match(marketType, MarketType.PERP);\n\t\tthis._marketTypeStr = ENUM_UTILS.toStr(marketType);\n\t}\n\n\tprivate static getOrCreate(marketIndex: number, marketType: MarketType) {\n\t\tconst key = MarketId.key(marketIndex, marketType);\n\t\tif (MarketId.cache.has(key)) {\n\t\t\treturn MarketId.cache.get(key)!;\n\t\t}\n\t\tconst marketId = new MarketId(marketIndex, marketType);\n\t\tMarketId.cache.set(key, marketId);\n\t\treturn marketId;\n\t}\n\n\tstatic createPerpMarket(marketIndex: number) {\n\t\treturn MarketId.getOrCreate(marketIndex, MarketType.PERP);\n\t}\n\n\tstatic createSpotMarket(marketIndex: number) {\n\t\treturn MarketId.getOrCreate(marketIndex, MarketType.SPOT);\n\t}\n\n\tstatic getMarketIdFromKey(key: MarketKey) {\n\t\tif (MarketId.cache.has(key)) {\n\t\t\treturn MarketId.cache.get(key)!;\n\t\t}\n\t\tconst [marketType, marketIndex] = key.split('_');\n\t\tconst marketId = new MarketId(\n\t\t\tparseInt(marketIndex),\n\t\t\tENUM_UTILS.toObj(marketType)\n\t\t);\n\t\tMarketId.cache.set(key, marketId);\n\t\treturn marketId;\n\t}\n\n\tget isSpot() {\n\t\treturn this._isSpot;\n\t}\n\n\tget isPerp() {\n\t\treturn this._isPerp;\n\t}\n\n\tget marketTypeStr() {\n\t\treturn this._marketTypeStr;\n\t}\n\n\tstatic key(marketIndex: number, marketType: MarketType): MarketKey {\n\t\treturn `${ENUM_UTILS.toStr(marketType)}_${marketIndex}` as MarketKey;\n\t}\n\n\t/**\n\t * Returns a unique string that can be used as a key in a map.\n\t */\n\tget key(): MarketKey {\n\t\treturn this._key; // Micro-optimisation to avoid string concatenation every time the key is accessed\n\t}\n\n\tequals(other: MarketId) {\n\t\treturn (\n\t\t\tENUM_UTILS.match(this.marketType, other.marketType) &&\n\t\t\tthis.marketIndex === other.marketIndex\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"file":"MarketId.js","sourceRoot":"","sources":["../../src/types/MarketId.ts"],"names":[],"mappings":"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","sourcesContent":["import { MarketType } from '@drift-labs/sdk';\nimport { ENUM_UTILS } from '../utils/enum';\nimport { Opaque } from './utility';\n\n// Define MarketKey as an opaque type\nexport type MarketKey = Opaque<'MarketKey', string>;\n\nexport class MarketId {\n\tprivate static cache = new Map<MarketKey, MarketId>();\n\tprivate _key: MarketKey;\n\tprivate _isSpot: boolean;\n\tprivate _isPerp: boolean;\n\tprivate _marketTypeStr: string;\n\n\tconstructor(readonly marketIndex: number, readonly marketType: MarketType) {\n\t\tthis._key = MarketId.key(marketIndex, marketType);\n\t\tthis._isSpot = ENUM_UTILS.match(marketType, MarketType.SPOT);\n\t\tthis._isPerp = ENUM_UTILS.match(marketType, MarketType.PERP);\n\t\tthis._marketTypeStr = ENUM_UTILS.toStr(marketType);\n\t}\n\n\tprivate static getOrCreate(marketIndex: number, marketType: MarketType) {\n\t\tconst key = MarketId.key(marketIndex, marketType);\n\t\tif (MarketId.cache.has(key)) {\n\t\t\treturn MarketId.cache.get(key)!;\n\t\t}\n\t\tconst marketId = new MarketId(marketIndex, marketType);\n\t\tMarketId.cache.set(key, marketId);\n\t\treturn marketId;\n\t}\n\n\tstatic createPerpMarket(marketIndex: number) {\n\t\treturn MarketId.getOrCreate(marketIndex, MarketType.PERP);\n\t}\n\n\tstatic createSpotMarket(marketIndex: number) {\n\t\treturn MarketId.getOrCreate(marketIndex, MarketType.SPOT);\n\t}\n\n\tstatic getMarketIdFromKey(key: MarketKey) {\n\t\tif (MarketId.cache.has(key)) {\n\t\t\treturn MarketId.cache.get(key)!;\n\t\t}\n\t\tconst [marketType, marketIndex] = key.split('_');\n\t\tconst marketId = new MarketId(\n\t\t\tparseInt(marketIndex),\n\t\t\tENUM_UTILS.toObj(marketType)\n\t\t);\n\t\tMarketId.cache.set(key, marketId);\n\t\treturn marketId;\n\t}\n\n\tget isSpot() {\n\t\treturn this._isSpot;\n\t}\n\n\tget isPerp() {\n\t\treturn this._isPerp;\n\t}\n\n\tget marketTypeStr() {\n\t\treturn this._marketTypeStr;\n\t}\n\n\tstatic key(marketIndex: number, marketType: MarketType): MarketKey {\n\t\treturn `${ENUM_UTILS.toStr(marketType)}_${marketIndex}` as MarketKey;\n\t}\n\n\t/**\n\t * Returns a unique string that can be used as a key in a map.\n\t */\n\tget key(): MarketKey {\n\t\treturn this._key; // Micro-optimisation to avoid string concatenation every time the key is accessed\n\t}\n\n\tequals(other: MarketId) {\n\t\treturn (\n\t\t\tENUM_UTILS.match(this.marketType, other.marketType) &&\n\t\t\tthis.marketIndex === other.marketIndex\n\t\t);\n\t}\n}\n"]}
@@ -9,7 +9,7 @@ const MarketId_1 = require("./MarketId");
9
9
  const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
10
10
  const pools_1 = require("../constants/pools");
11
11
  const markets_1 = require("../constants/markets");
12
- const utils_1 = require("../utils");
12
+ const enum_1 = require("../utils/enum");
13
13
  const Config_1 = require("../Config");
14
14
  const useAsyncMarketConfigs = process.env.NEXT_PUBLIC_USE_ASYNC_MARKET_CONFIGS === 'true';
15
15
  class UIMarket {
@@ -94,7 +94,7 @@ class UIMarket {
94
94
  }
95
95
  get isStableCoinMarket() {
96
96
  return (this.isSpot &&
97
- utils_1.ENUM_UTILS.match(this.market.oracleSource, sdk_1.OracleSource.PYTH_STABLE_COIN));
97
+ enum_1.ENUM_UTILS.match(this.market.oracleSource, sdk_1.OracleSource.PYTH_STABLE_COIN));
98
98
  }
99
99
  get isPredictionMarket() {
100
100
  return (this.isPerp &&
@@ -1 +1 @@
1
- {"version":3,"file":"UIMarket.js","sourceRoot":"","sources":["../../src/types/UIMarket.ts"],"names":[],"mappings":";;;;;;AAAA,yCASyB;AACzB,yCAAsC;AACtC,oEAAuC;AACvC,8CAM4B;AAC5B,kDAA8D;AAC9D,oCAAsC;AACtC,sCAAmC;AAGnC,MAAM,qBAAqB,GAC1B,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,MAAM,CAAC;AAyD7D,MAAa,QAAQ;IAUpB,IAAI,SAAS;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,IAAY,SAAS,CAAC,SAAoB;QACzC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,YAAqB,WAAmB,EAAW,UAAsB;QAApD,gBAAW,GAAX,WAAW,CAAQ;QAAW,eAAU,GAAV,UAAU,CAAY;QACxE,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,qBAAqB;YACxC,CAAC,CAAC,QAAQ,CAAC,WAAW;YACtB,CAAC,CAAC,eAAM,CAAC,iBAAiB,CAAC;QAC5B,MAAM,WAAW,GAAG,qBAAqB;YACxC,CAAC,CAAC,QAAQ,CAAC,WAAW;YACtB,CAAC,CAAC,eAAM,CAAC,iBAAiB,CAAC;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;QAE5D,YAAY;QACZ,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;QAElE,gFAAgF;QAChF,IAAA,wBAAS,EACR,MAAM,EACN,8BAA8B,QAAQ,CAAC,aAAa,mBAAmB,WAAW,EAAE,CACpF,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,CAAC,YAAY,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,WAA+B;QACpD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,WAA+B;QACpD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,WAAmB,EAAE,UAAsB;QACrE,MAAM,GAAG,GAAG,mBAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QACjC,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACrD,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC;IACf,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,WAAmB;QAC1C,OAAO,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,gBAAU,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,WAAmB;QAC1C,OAAO,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,gBAAU,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,QAAkB;QACrC,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,CAAC,uBAAuB,CAAC,YAA8B;;QAC5D,IAAI,CAAE,YAAiC,CAAC,QAAQ,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACd,CAAC;QAED,OAAO,CACN,MAAA,MAAC,YAAiC,CAAC,QAAQ,0CAAE,QAAQ,CAAC,YAAY,CAAC,mCACnE,KAAK,CACL,CAAC;IACH,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,aAAa;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;IACpC,CAAC;IAED,IAAI,GAAG;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC1B,CAAC;IAED,0DAA0D;IAC1D,IAAI,UAAU;QACb,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC7D,CAAC;IAED,mDAAmD;IACnD,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,YAAY;QACf,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,gCAAsB,CAAC;IACnE,CAAC;IAED,IAAI,kBAAkB;QACrB,OAAO,CACN,IAAI,CAAC,MAAM;YACX,kBAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,kBAAY,CAAC,gBAAgB,CAAC,CACzE,CAAC;IACH,CAAC;IAED,IAAI,kBAAkB;QACrB,OAAO,CACN,IAAI,CAAC,MAAM;YACX,QAAQ,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAA0B,CAAC,CACjE,CAAC;IACH,CAAC;IAED,IAAI,SAAS;QACZ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,oBAAc,CAAC;QACvB,CAAC;aAAM,CAAC;YACP,OAAQ,IAAI,CAAC,MAA2B,CAAC,SAAS,CAAC;QACpD,CAAC;IACF,CAAC;IAED,IAAI,YAAY;QACf,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,wBAAkB,CAAC;QAC3B,CAAC;aAAM,CAAC;YACP,OAAQ,IAAI,CAAC,MAA2B,CAAC,YAAY,CAAC;QACvD,CAAC;IACF,CAAC;IAED,MAAM,CAAC,KAAe;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,sDAAsD;IACtD,eAAe,CAAC,YAAY,GAAG,KAAK;QACnC,IAAI,eAAe,GAAG,IAAI,CAAC,MAAM;YAChC,CAAC,CAAE,IAAI,CAAC,MAA2B,CAAC,eAAe;YACnD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAEtB,IAAI,YAAY,EAAE,CAAC;YAClB,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,eAAe,CAAC;IACxB,CAAC;IAES,YAAY;QACrB,IAAA,wBAAS,EAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAE7C,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC1D,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAClD,MAAM,sBAAsB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAEhE,IAAI,CAAC,SAAS,GAAG;YAChB,YAAY;YACZ,mBAAmB;YACnB,eAAe;YACf,sBAAsB;SACtB,CAAC;IACH,CAAC;IAEO,eAAe;QACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAsB,CAAC;QAC3C,CAAC;aAAM,CAAC;YACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAsB,CAAC;QAC3C,CAAC;IACF,CAAC;IAEO,sBAAsB;QAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,MAA6B,CAAC;QAClD,CAAC;aAAM,CAAC;YACP,MAAM,YAAY,GAAG,IAAI,CAAC,MAA0B,CAAC;YACrD,QAAQ,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC7B,KAAK,oBAAY;oBAChB,OAAO,YAAY,CAAC,MAA6B,CAAC;gBACnD,KAAK,mBAAW;oBACf,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAyB,CAAC;gBACtE,KAAK,mBAAW;oBACf,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAyB,CAAC;gBACtE,KAAK,wBAAgB,CAAC,CAAC,CAAC;oBACvB;;;;;;kBAMC;oBACD,OAAO,CACN,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;wBACpC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CACzB,CAAC,EACD,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CACnC;wBACH,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACb,CAAC;gBAC1B,CAAC;gBACD,KAAK,sBAAc;oBAClB,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAyB,CAAC;gBACtE;oBACC,OAAO,YAAY,CAAC,MAA6B,CAAC;YACpD,CAAC;QACF,CAAC;IACF,CAAC;IAEO,kBAAkB;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAQ,IAAI,CAAC,MAA2B,CAAC,eAAe;iBACtD,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;iBACjB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAoB,CAAC;QACxC,CAAC;aAAM,CAAC;YACP,OAAO,IAAI,CAAC,sBAAsB,EAAgC,CAAC,CAAC,sFAAsF;QAC3J,CAAC;IACF,CAAC;IAEO,yBAAyB;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAQ,IAAI,CAAC,MAA2B;iBACtC,eAAyC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,MAAM,YAAY,GAAG,IAAI,CAAC,MAA0B,CAAC;YACrD,QAAQ,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC7B,KAAK,wBAAgB,CAAC,CAAC,CAAC;oBACvB;;;;;;kBAMC;oBACD,OAAO,CACN,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;wBACpC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACnC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACV,CAAC;gBAC7B,CAAC;gBACD;oBACC,OAAO,YAAY,CAAC,MAAgC,CAAC;YACvD,CAAC;QACF,CAAC;IACF,CAAC;;AAjQF,4BAkQC;AAjQO,oBAAW,GAAG,iBAAW,CAAC,cAAc,CAAC,CAAC;AAC1C,oBAAW,GAAG,iBAAW,CAAC,cAAc,CAAC,CAAC;AAClC,cAAK,GAAG,IAAI,GAAG,EAAoB,CAAC","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 (\n\t\t\t(marketConfig as PerpMarketConfig).category?.includes('Prediction') ??\n\t\t\tfalse\n\t\t);\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/enum';\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 (\n\t\t\t(marketConfig as PerpMarketConfig).category?.includes('Prediction') ??\n\t\t\tfalse\n\t\t);\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,11 @@
1
+ export declare const matchEnum: (enum1: any, enum2: any) => boolean;
2
+ declare function enumToObj(enumStr: string): {
3
+ [x: string]: {};
4
+ };
5
+ declare function enumToStr(enumStr: Record<string, any>): string;
6
+ export declare const ENUM_UTILS: {
7
+ match: (enum1: any, enum2: any) => boolean;
8
+ toObj: typeof enumToObj;
9
+ toStr: typeof enumToStr;
10
+ };
11
+ export {};
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ENUM_UTILS = exports.matchEnum = void 0;
4
+ const matchEnum = (enum1, enum2) => {
5
+ return JSON.stringify(enum1) === JSON.stringify(enum2);
6
+ };
7
+ exports.matchEnum = matchEnum;
8
+ function enumToObj(enumStr) {
9
+ if (!enumStr)
10
+ return undefined;
11
+ return {
12
+ [enumStr !== null && enumStr !== void 0 ? enumStr : '']: {},
13
+ };
14
+ }
15
+ function enumToStr(enumStr) {
16
+ var _a;
17
+ return (_a = Object.keys(enumStr !== null && enumStr !== void 0 ? enumStr : {})) === null || _a === void 0 ? void 0 : _a[0];
18
+ }
19
+ exports.ENUM_UTILS = {
20
+ match: exports.matchEnum,
21
+ toObj: enumToObj,
22
+ toStr: enumToStr,
23
+ };
24
+ //# sourceMappingURL=enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum.js","sourceRoot":"","sources":["../../src/utils/enum.ts"],"names":[],"mappings":";;;AAAO,MAAM,SAAS,GAAG,CAAC,KAAU,EAAE,KAAK,EAAE,EAAE;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC,CAAC;AAFW,QAAA,SAAS,aAEpB;AAEF,SAAS,SAAS,CAAC,OAAe;IACjC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,OAAO;QACN,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,EAAE,EAAE;KACnB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,OAA4B;;IAC9C,OAAO,MAAA,MAAM,CAAC,IAAI,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,0CAAG,CAAC,CAAC,CAAC;AACxC,CAAC;AAEY,QAAA,UAAU,GAAG;IACzB,KAAK,EAAE,iBAAS;IAChB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;CAChB,CAAC","sourcesContent":["export const matchEnum = (enum1: any, enum2) => {\n\treturn JSON.stringify(enum1) === JSON.stringify(enum2);\n};\n\nfunction enumToObj(enumStr: string) {\n\tif (!enumStr) return undefined;\n\n\treturn {\n\t\t[enumStr ?? '']: {},\n\t};\n}\n\nfunction enumToStr(enumStr: Record<string, any>) {\n\treturn Object.keys(enumStr ?? {})?.[0];\n}\n\nexport const ENUM_UTILS = {\n\tmatch: matchEnum,\n\ttoObj: enumToObj,\n\ttoStr: enumToStr,\n};\n"]}
@@ -3,16 +3,8 @@
3
3
  import { BN, Event, OrderActionRecord, OrderRecord, PublicKey, BigNum, MarketType, DriftClient, SpotMarketConfig } from '@drift-labs/sdk';
4
4
  import { UIMatchedOrderRecordAndAction, UISerializableOrderActionRecord } from '../serializableTypes';
5
5
  import { AccountInfo, Connection } from '@solana/web3.js';
6
- export declare const matchEnum: (enum1: any, enum2: any) => boolean;
7
- declare function enumToObj(enumStr: string): {
8
- [x: string]: {};
9
- };
10
- declare function enumToStr(enumStr: Record<string, any>): string;
11
- export declare const ENUM_UTILS: {
12
- match: (enum1: any, enum2: any) => boolean;
13
- toObj: typeof enumToObj;
14
- toStr: typeof enumToStr;
15
- };
6
+ import { matchEnum, ENUM_UTILS } from './enum';
7
+ export { matchEnum, ENUM_UTILS };
16
8
  export declare function sleep(ms: any): Promise<unknown>;
17
9
  /**
18
10
  * Converts an objects with potential Pubkeys and BNs in it into a form that can be JSON stringified. When pubkeys get converted a _pbky_ suffix will be added to their key, and _bgnm_ for BNs.
@@ -3,26 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MultiplexWebSocket = exports.ResultSlotIncrementer = exports.getSwiftConfirmationTimeoutMs = exports.COMMON_UTILS = exports.getTieredSortScore = exports.aprFromApy = exports.MultiSwitch = exports.Counter = exports.Ref = exports.getAnchorEnumString = exports.orderIsNull = exports.getPriceForUIOrderRecord = exports.getPriceForOrderRecord = exports.getPriceForBaseAndQuoteAmount = exports.filterTradeRecordsFromUIOrderRecords = exports.filterTradeRecordsFromOrderActionRecords = exports.uiOrderActionRecordIsTrade = exports.orderActionRecordIsTrade = exports.getUIOrderRecordsLaterThanTarget = exports.getLatestOfTwoOrderRecords = exports.getLatestOfTwoUIOrderRecords = exports.sortOrderRecords = exports.sortUIOrderRecords = exports.sortUIOrderActionRecords = exports.sortUIMatchedOrderRecordAndAction = exports.getSortScoreForOrderActionRecords = exports.getTradeInfoFromActionRecord = exports.getSortScoreForOrderRecords = exports.decodeStringifiableObject = exports.encodeStringifiableObject = exports.sleep = exports.ENUM_UTILS = exports.matchEnum = void 0;
4
4
  const sdk_1 = require("@drift-labs/sdk");
5
5
  const insuranceFund_1 = require("./insuranceFund");
6
- const matchEnum = (enum1, enum2) => {
7
- return JSON.stringify(enum1) === JSON.stringify(enum2);
8
- };
9
- exports.matchEnum = matchEnum;
10
- function enumToObj(enumStr) {
11
- if (!enumStr)
12
- return undefined;
13
- return {
14
- [enumStr !== null && enumStr !== void 0 ? enumStr : '']: {},
15
- };
16
- }
17
- function enumToStr(enumStr) {
18
- var _a;
19
- return (_a = Object.keys(enumStr !== null && enumStr !== void 0 ? enumStr : {})) === null || _a === void 0 ? void 0 : _a[0];
20
- }
21
- exports.ENUM_UTILS = {
22
- match: exports.matchEnum,
23
- toObj: enumToObj,
24
- toStr: enumToStr,
25
- };
6
+ const enum_1 = require("./enum");
7
+ Object.defineProperty(exports, "matchEnum", { enumerable: true, get: function () { return enum_1.matchEnum; } });
8
+ Object.defineProperty(exports, "ENUM_UTILS", { enumerable: true, get: function () { return enum_1.ENUM_UTILS; } });
26
9
  async function sleep(ms) {
27
10
  return new Promise((resolve) => setTimeout(resolve, ms));
28
11
  }
@@ -115,9 +98,9 @@ const decodeStringifiableObject = (value) => {
115
98
  };
116
99
  exports.decodeStringifiableObject = decodeStringifiableObject;
117
100
  const getChronologicalValueForOrderAction = (action) => {
118
- return (0, exports.matchEnum)(action, sdk_1.OrderAction.PLACE)
101
+ return (0, enum_1.matchEnum)(action, sdk_1.OrderAction.PLACE)
119
102
  ? 0
120
- : (0, exports.matchEnum)(action, sdk_1.OrderAction.FILL)
103
+ : (0, enum_1.matchEnum)(action, sdk_1.OrderAction.FILL)
121
104
  ? 1
122
105
  : 2;
123
106
  };
@@ -159,7 +142,7 @@ const getSortScoreForOrderActionRecords = (orderA, orderB) => {
159
142
  if (orderA.slot !== orderB.slot) {
160
143
  return orderA.slot > orderB.slot ? 1 : -1;
161
144
  }
162
- if (!(0, exports.matchEnum)(orderA.action, orderB.action)) {
145
+ if (!(0, enum_1.matchEnum)(orderA.action, orderB.action)) {
163
146
  // @ts-ignore
164
147
  const orderAActionVal = getChronologicalValueForOrderAction(orderA.action);
165
148
  // @ts-ignore
@@ -209,11 +192,11 @@ exports.getUIOrderRecordsLaterThanTarget = getUIOrderRecordsLaterThanTarget;
209
192
  // Trade records are order records which have been filled
210
193
  const orderActionRecordIsTrade = (orderRecord) => orderRecord.baseAssetAmountFilled.gt(sdk_1.ZERO) &&
211
194
  // @ts-ignore
212
- (0, exports.matchEnum)(orderRecord.action, sdk_1.OrderAction.FILL) &&
195
+ (0, enum_1.matchEnum)(orderRecord.action, sdk_1.OrderAction.FILL) &&
213
196
  true;
214
197
  exports.orderActionRecordIsTrade = orderActionRecordIsTrade;
215
198
  const uiOrderActionRecordIsTrade = (orderRecord) => orderRecord.baseAssetAmountFilled.gtZero() &&
216
- (0, exports.matchEnum)(orderRecord.action, sdk_1.OrderAction.FILL) &&
199
+ (0, enum_1.matchEnum)(orderRecord.action, sdk_1.OrderAction.FILL) &&
217
200
  true;
218
201
  exports.uiOrderActionRecordIsTrade = uiOrderActionRecordIsTrade;
219
202
  // Trade records are order records which have been filled
@@ -348,7 +331,7 @@ exports.MultiSwitch = MultiSwitch;
348
331
  * @returns
349
332
  */
350
333
  const getCurrentOpenInterestForMarket = (marketIndex, marketType, driftClient) => {
351
- if (exports.ENUM_UTILS.match(marketType, sdk_1.MarketType.PERP)) {
334
+ if (enum_1.ENUM_UTILS.match(marketType, sdk_1.MarketType.PERP)) {
352
335
  const market = driftClient.getPerpMarketAccount(marketIndex);
353
336
  const OI = sdk_1.BigNum.from(market.amm.baseAssetAmountLong.add(market.amm.baseAssetAmountShort.abs()), sdk_1.BASE_PRECISION_EXP);
354
337
  const priceData = driftClient.getOraclePriceDataAndSlot(market.amm.oracle, market.amm.oracleSource);
@@ -368,7 +351,7 @@ const getCurrentOpenInterestForMarket = (marketIndex, marketType, driftClient) =
368
351
  * @returns
369
352
  */
370
353
  const getDepositAprForMarket = (marketIndex, marketType, driftClient) => {
371
- if (exports.ENUM_UTILS.match(marketType, sdk_1.MarketType.SPOT)) {
354
+ if (enum_1.ENUM_UTILS.match(marketType, sdk_1.MarketType.SPOT)) {
372
355
  const marketAccount = driftClient.getSpotMarketAccount(marketIndex);
373
356
  const depositApr = sdk_1.BigNum.from((0, sdk_1.calculateDepositRate)(marketAccount), sdk_1.SPOT_MARKET_RATE_PRECISION_EXP);
374
357
  const depositAprPct = depositApr.toNum() * 100;
@@ -386,7 +369,7 @@ const getDepositAprForMarket = (marketIndex, marketType, driftClient) => {
386
369
  * @returns
387
370
  */
388
371
  const getBorrowAprForMarket = (marketIndex, marketType, driftClient) => {
389
- if (exports.ENUM_UTILS.match(marketType, sdk_1.MarketType.SPOT)) {
372
+ if (enum_1.ENUM_UTILS.match(marketType, sdk_1.MarketType.SPOT)) {
390
373
  const marketAccount = driftClient.getSpotMarketAccount(marketIndex);
391
374
  const depositApr = sdk_1.BigNum.from((0, sdk_1.calculateBorrowRate)(marketAccount), sdk_1.SPOT_MARKET_RATE_PRECISION_EXP);
392
375
  const depositAprPct = depositApr.toNum() * 100;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,yCAuByB;AAKzB,mDAA0E;AAGnE,MAAM,SAAS,GAAG,CAAC,KAAU,EAAE,KAAK,EAAE,EAAE;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC,CAAC;AAFW,QAAA,SAAS,aAEpB;AAEF,SAAS,SAAS,CAAC,OAAe;IACjC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,OAAO;QACN,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,EAAE,EAAE;KACnB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,OAA4B;;IAC9C,OAAO,MAAA,MAAM,CAAC,IAAI,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,0CAAG,CAAC,CAAC,CAAC;AACxC,CAAC;AAEY,QAAA,UAAU,GAAG;IACzB,KAAK,EAAE,iBAAS;IAChB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;CAChB,CAAC;AAEK,KAAK,UAAU,KAAK,CAAC,EAAE;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAFD,sBAEC;AACD,MAAM,2BAA2B,GAAG,CAAC,KAAU,EAAiB,EAAE;IACjE,QAAQ;IACR,kLAAkL;IAClL,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,2BAA2B,EAAE,CAAC;QACzE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,eAAe;IACf,2LAA2L;IAC3L,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAA,iCAAyB,EAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACI,MAAM,yBAAyB,GAAG,CAAC,KAAU,EAAE,EAAE;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,iCAAyB,EAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,eAAe,GAAG,EAAE,CAAC;IAE3B,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;QAC5C,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC;QAChE,eAAe,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAjBW,QAAA,yBAAyB,6BAiBpC;AAEF;;;;;;;;;;;;;GAaG;AACI,MAAM,yBAAyB,GAAG,CAAC,KAAU,EAAE,EAAE;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,iCAAyB,EAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,eAAe,GAAG,EAAE,CAAC;IAE3B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACnB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,SAAS,IAAI,GAAG,IAAI,IAAI,CAAC;SAChD,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,eAAS,CAAC,GAAG,CAAC,CAAC;YAChE,OAAO;QACR,CAAC;QAED,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,QAAE,CAAC,GAAa,CAAC,CAAC;YACnE,OAAO;QACR,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChE,eAAe,CAAC,GAAG,CAAC,GAAG,IAAA,iCAAyB,EAAC,GAAG,CAAC,CAAC;YACtD,OAAO;QACR,CAAC;QAED,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEJ,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AA/BW,QAAA,yBAAyB,6BA+BpC;AAEF,MAAM,mCAAmC,GAAG,CAAC,MAAmB,EAAE,EAAE;IACnE,OAAO,IAAA,iBAAS,EAAC,MAAM,EAAE,iBAAW,CAAC,KAAK,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,IAAA,iBAAS,EAAC,MAAM,EAAE,iBAAW,CAAC,IAAI,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAEF;;;;;GAKG;AACI,MAAM,2BAA2B,GAAG,CAC1C,MAAwB,EACxB,MAAwB,EACvB,EAAE;IACH,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,CAAC;AACV,CAAC,CAAC;AATW,QAAA,2BAA2B,+BAStC;AAEK,MAAM,4BAA4B,GAAG,CAC3C,YAAoD,EACnD,EAAE;IACH,OAAO;QACN,EAAE,EAAE,YAAY,CAAC,EAAE;QACnB,eAAe,EAAE,YAAY,CAAC,KAAK;YAClC,CAAC,CAAC,YAAY,CAAC,yBAAyB;YACxC,CAAC,CAAC,YAAY,CAAC,yBAAyB;QACzC,qBAAqB,EAAE,YAAY,CAAC,KAAK;YACxC,CAAC,CAAC,YAAY,CAAC,yCAAyC;YACxD,CAAC,CAAC,YAAY,CAAC,yCAAyC;QACzD,sBAAsB,EAAE,YAAY,CAAC,KAAK;YACzC,CAAC,CAAC,YAAY,CAAC,0CAA0C;YACzD,CAAC,CAAC,YAAY,CAAC,0CAA0C;KAC1D,CAAC;AACH,CAAC,CAAC;AAfW,QAAA,4BAA4B,gCAevC;AAyCF;;;;;GAKG;AACI,MAAM,iCAAiC,GAAG,CAChD,MAAgC,EAChC,MAAgC,EAC/B,EAAE;IACH,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,IAAA,iBAAS,EAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,aAAa;QACb,MAAM,eAAe,GAAG,mCAAmC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3E,aAAa;QACb,MAAM,eAAe,GAAG,mCAAmC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3E,OAAO,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,aAAa;IACb,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAClD,aAAa;YACb,OAAO,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC;IAED,OAAO,CAAC,CAAC;AACV,CAAC,CAAC;AAzBW,QAAA,iCAAiC,qCAyB5C;AAEK,MAAM,iCAAiC,GAAG,CAChD,OAAwC,EACxC,YAA4B,MAAM,EACjC,EAAE;IACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9C,IAAA,yCAAiC,EAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,CACjE,CAAC;IAEF,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC7E,CAAC,CAAC;AATW,QAAA,iCAAiC,qCAS5C;AAEK,MAAM,wBAAwB,GAAG,CACvC,OAAiD,EACjD,YAA4B,MAAM,EACjC,EAAE;IACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,yCAAiC,CAAC,CAAC;IAEzE,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC7E,CAAC,CAAC;AAPW,QAAA,wBAAwB,4BAOnC;AAEK,MAAM,kBAAkB,GAAG,CACjC,OAAY,EACZ,YAA4B,MAAM,EACjC,EAAE;IACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,mCAA2B,CAAC,CAAC;IAEnE,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC7E,CAAC,CAAC;AAPW,QAAA,kBAAkB,sBAO7B;AAEK,MAAM,gBAAgB,GAAG,CAC/B,OAA6B,EAC7B,YAA4B,MAAM,EACjC,EAAE;IACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,mCAA2B,CAAC,CAAC;IAEnE,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC7E,CAAC,CAAC;AAPW,QAAA,gBAAgB,oBAO3B;AAEK,MAAM,4BAA4B,GAAG,CAC3C,MAAS,EACT,MAAS,EACR,EAAE;IACH,OAAO,IAAA,mCAA2B,EAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5E,CAAC,CAAC;AALW,QAAA,4BAA4B,gCAKvC;AAEK,MAAM,0BAA0B,GAAG,CACzC,MAAS,EACT,MAAS,EACR,EAAE;IACH,OAAO,IAAA,mCAA2B,EAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5E,CAAC,CAAC;AALW,QAAA,0BAA0B,8BAKrC;AAEK,MAAM,gCAAgC,GAAG,CAC/C,MAAS,EACT,OAAY,EACX,EAAE,CACH,OAAO,CAAC,MAAM,CACb,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,oCAA4B,EAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CACnE,CAAC;AANU,QAAA,gCAAgC,oCAM1C;AAEH,yDAAyD;AAClD,MAAM,wBAAwB,GAAG,CAAC,WAA8B,EAAE,EAAE,CAC1E,WAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAI,CAAC;IAC1C,aAAa;IACb,IAAA,iBAAS,EAAC,WAAW,CAAC,MAAM,EAAE,iBAAW,CAAC,IAAI,CAAC;IAC/C,IAAI,CAAC;AAJO,QAAA,wBAAwB,4BAI/B;AAEC,MAAM,0BAA0B,GAAG,CACzC,WAA4C,EAC3C,EAAE,CACH,WAAW,CAAC,qBAAqB,CAAC,MAAM,EAAE;IAC1C,IAAA,iBAAS,EAAC,WAAW,CAAC,MAAM,EAAE,iBAAW,CAAC,IAAI,CAAC;IAC/C,IAAI,CAAC;AALO,QAAA,0BAA0B,8BAKjC;AAEN,yDAAyD;AAClD,MAAM,wCAAwC,GAAG,CACvD,YAAiC,EACX,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,gCAAwB,CAAC,CAAC;AAF3D,QAAA,wCAAwC,4CAEmB;AAExE,yDAAyD;AAClD,MAAM,oCAAoC,GAAG,CACnD,YAA+C,EACX,EAAE,CACtC,YAAY,CAAC,MAAM,CAAC,kCAA0B,CAAC,CAAC;AAHpC,QAAA,oCAAoC,wCAGA;AAEjD;;;;;GAKG;AACI,MAAM,6BAA6B,GAAG,CAC5C,WAAe,EACf,UAAc,EACb,EAAE;IACH,OAAO,WAAW;SAChB,GAAG,CAAC,qBAAe,CAAC;SACpB,GAAG,CAAC,oBAAc,CAAC;SACnB,GAAG,CAAC,qBAAe,CAAC;SACpB,GAAG,CAAC,YAAM,CAAC,IAAI,CAAC,UAAU,EAAE,wBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC,CAAC;AATW,QAAA,6BAA6B,iCASxC;AAEK,MAAM,sBAAsB,GAAG,CACrC,WAGC,EACA,EAAE;IACH,OAAO,IAAA,qCAA6B;IACnC,aAAa;IACb,WAAW,CAAC,sBAAsB;IAClC,aAAa;IACb,WAAW,CAAC,qBAAqB,CACjC,CAAC;AACH,CAAC,CAAC;AAZW,QAAA,sBAAsB,0BAYjC;AAEK,MAAM,wBAAwB,GAAG,CACvC,WAGC,EACA,EAAE;IACH,OAAO,WAAW,CAAC,sBAAsB;SACvC,OAAO,CAAC,+BAAyB,CAAC;SAClC,KAAK,CAAC,yBAAmB,CAAC;SAC1B,GAAG,CAAC,WAAW,CAAC,qBAAqB,CAAC,OAAO,CAAC,wBAAkB,CAAC,CAAC;SAClE,OAAO,CAAC,yBAAmB,CAAC,CAAC;AAChC,CAAC,CAAC;AAXW,QAAA,wBAAwB,4BAWnC;AAEK,MAAM,WAAW,GAAG,CAC1B,KAAiE,EACjE,IAAuB,EACtB,EAAE;IACH,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;AACvD,CAAC,CAAC;AALW,QAAA,WAAW,eAKtB;AAEK,MAAM,mBAAmB,GAAG,CAAC,OAAgC,EAAE,EAAE;IACvE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B;AACF,MAAa,GAAG;IAGf,YAAY,GAAM;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,GAAM;QACT,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC;IAED,GAAG;QACF,OAAO,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC;CACD;AAdD,kBAcC;AAED,MAAa,OAAO;IAApB;QACS,QAAG,GAAG,CAAC,CAAC;IAajB,CAAC;IAXA,GAAG;QACF,OAAO,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC;IAED,SAAS,CAAC,KAAK,GAAG,CAAC;QAClB,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC;IACnB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACd,CAAC;CACD;AAdD,0BAcC;AAED;;;;;GAKG;AACH,MAAa,WAAW;IAIvB,YAAoB,YAA0B,KAAK;QAA/B,cAAS,GAAT,SAAS,CAAsB;QAH3C,aAAQ,GAAa,EAAE,CAAC;QACxB,gBAAW,GAAG,CAAC,CAAC;IAE8B,CAAC;IAE/C,YAAY,CAAC,GAAW;QAC/B,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE/C,OAAO,CAAC,IAAI,WAAW,CAAC;IACzB,CAAC;IAEM,QAAQ,CAAC,GAAW;QAC1B,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAEM,SAAS,CAAC,GAAW;QAC3B,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAEO,UAAU,CAAC,GAAW;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC;IAChC,CAAC;IAEO,SAAS,CAAC,GAAW;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC;IAC/B,CAAC;IAED,IAAW,IAAI;QACd,8EAA8E;QAC9E,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;CACD;AAvDD,kCAuDC;AAED;;;;;;GAMG;AACH,MAAM,+BAA+B,GAAG,CACvC,WAAmB,EACnB,UAAsB,EACtB,WAAwB,EACvB,EAAE;IACH,IAAI,kBAAU,CAAC,KAAK,CAAC,UAAU,EAAE,gBAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,WAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,YAAM,CAAC,IAAI,CACrB,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,EACzE,wBAAkB,CAClB,CAAC;QAEF,MAAM,SAAS,GAAG,WAAW,CAAC,yBAAyB,CACtD,MAAM,CAAC,GAAG,CAAC,MAAM,EACjB,MAAM,CAAC,GAAG,CAAC,YAAY,CACvB,CAAC;QAEF,MAAM,KAAK,GAAG,YAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAmB,CAAC,CAAC;QAErE,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QAEpD,OAAO,gBAAgB,CAAC;IACzB,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACtE,CAAC;AACF,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,sBAAsB,GAAG,CAC9B,WAAmB,EACnB,UAAsB,EACtB,WAAwB,EACvB,EAAE;IACH,IAAI,kBAAU,CAAC,KAAK,CAAC,UAAU,EAAE,gBAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,aAAa,GAAG,WAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,YAAM,CAAC,IAAI,CAC7B,IAAA,0BAAoB,EAAC,aAAa,CAAC,EACnC,oCAA8B,CAC9B,CAAC;QAEF,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC;QAE/C,OAAO,aAAa,CAAC;IACtB,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACpE,CAAC;AACF,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,qBAAqB,GAAG,CAC7B,WAAmB,EACnB,UAAsB,EACtB,WAAwB,EACvB,EAAE;IACH,IAAI,kBAAU,CAAC,KAAK,CAAC,UAAU,EAAE,gBAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,aAAa,GAAG,WAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,YAAM,CAAC,IAAI,CAC7B,IAAA,yBAAmB,EAAC,aAAa,CAAC,EAClC,oCAA8B,CAC9B,CAAC;QAEF,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC;QAE/C,OAAO,aAAa,CAAC;IACtB,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACnE,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAChC,MAAwB,EACxB,WAAwB,EACvB,EAAE;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE3E,MAAM,uBAAuB,GAAG,IAAA,oBAAc,EAC7C,aAAa,CAAC,aAAa,EAC3B,WAAW,CAAC,oBAAoB,CAAC,aAAa,CAAC,WAAW,CAAC,EAC3D,qBAAe,CAAC,MAAM,CACtB,CAAC;IAEF,MAAM,wBAAwB,GAAG,YAAM,CAAC,IAAI,CAC3C,uBAAuB,EACvB,MAAM,CAAC,YAAY,CACnB,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,yBAAyB,CACtD,aAAa,CAAC,MAAM,EACpB,aAAa,CAAC,YAAY,CAC1B,CAAC;IAEF,MAAM,KAAK,GAAG,YAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAmB,CAAC,CAAC;IAErE,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,wBAAwB,CAAC,KAAK,EAAE,CAAC;IAE3E,OAAO,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CACjC,MAAwB,EACxB,WAAwB,EACvB,EAAE;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE3E,MAAM,wBAAwB,GAAG,IAAA,oBAAc,EAC9C,aAAa,CAAC,cAAc,EAC5B,aAAa,EACb,qBAAe,CAAC,OAAO,CACvB,CAAC;IAEF,MAAM,8BAA8B,GAAG,YAAM,CAAC,IAAI,CACjD,wBAAwB,EACxB,MAAM,CAAC,YAAY,CACnB,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,yBAAyB,CACtD,aAAa,CAAC,MAAM,EACpB,aAAa,CAAC,YAAY,CAC1B,CAAC;IAEF,MAAM,KAAK,GAAG,YAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAmB,CAAC,CAAC;IAErE,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,KAAK,EAAE,CAAC;IACjE,MAAM,kBAAkB,GACvB,KAAK,CAAC,KAAK,EAAE,GAAG,8BAA8B,CAAC,KAAK,EAAE,CAAC;IAExD,OAAO;QACN,iBAAiB;QACjB,kBAAkB;KAClB,CAAC;AACH,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAE,WAAmB,EAAE,EAAE;IACjE,MAAM,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IACzC,MAAM,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC;IAE/B,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjC,8JAA8J;IAC9J,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE,CAC3C,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAE1C,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,4CAA4C;IACjF,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,KAAK;SACrB,KAAK,CAAC,CAAC,CAAC;SACR,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEK,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,gBAAwB,EAAE,EAAE;IACnE,MAAM,gBAAgB,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;IACxC,MAAM,YAAY,GACjB,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC;IAE3E,OAAO,YAAY,GAAG,GAAG,CAAC;AAC3B,CAAC,CAAC;AANW,QAAA,UAAU,cAMrB;AAEF;;;;;;;;GAQG;AACI,MAAM,kBAAkB,GAAG,CAAC,OAAiB,EAAE,OAAiB,EAAE,EAAE;;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,CAAC,CAAC,mCAAI,MAAM,CAAC,gBAAgB,CAAC;QACrD,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,CAAC,CAAC,mCAAI,MAAM,CAAC,gBAAgB,CAAC;QAErD,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,GAAG,MAAM,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,CAAC;AACV,CAAC,CAAC;AAXW,QAAA,kBAAkB,sBAW7B;AAEF,MAAM,wBAAwB,GAAG,CAAC,MAAc,EAAE,EAAE;IACnD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,cAAwB,EAAU,EAAE;IAC5E,MAAM,SAAS,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,sBAAsB,GAAG,0BAA0B,CACxD,cAAc,EACd,SAAS,CACT,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,sBAAsB,CAAC;IAC7D,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAiB,EAAU,EAAE;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3D,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,OAAiB,EAAU,EAAE;IACrD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,aAAa,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACP,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAClC,OAAiB,EACjB,IAAY,EACH,EAAE;IACX,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,qBAAqB,GAAG,kBAAkB,CAAC,MAAM,CACtD,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,EAC7B,CAAC,CACD,CAAC;IACF,MAAM,QAAQ,GAAG,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IACxD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAI,IAAY,EAAE,QAAa,EAAS,EAAE;IAC3D,MAAM,aAAa,GAAU,EAAE,CAAC;IAEhC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QAC5C,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACP,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,OAAa,EAAM,EAAE;IACnC,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,OAAa,EAAM,EAAE;IACnC,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,OAAa,EAAM,EAAE;IACtC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,aAAa,CAAC,WAAW,GAAG,CAAC,CAAC;aACnC,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;aAC/B,GAAG,CAAC,IAAI,QAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACP,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,OAAa,EAAM,EAAE;IACpC,IAAI,GAAG,GAAG,IAAI,QAAE,CAAC,CAAC,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,QAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAK,OAAU,EAAE,EAAE;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;IAEpC,OAAO;QACN,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;QAC/B,aAAa;KACb,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAI,KAAmB,EAAE,IAAY,EAAS,EAAE;IAC9D,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;SAC9C,IAAI,CAAC,IAAI,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;SAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG,KAAK,EAC3C,UAAsB,EACtB,QAAqB,EACqB,EAAE;IAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,2CAA2C;IACxF,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CACvE,CAAC;IACF,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC,CAAC;AAEW,QAAA,YAAY,GAAG;IAC3B,iBAAiB,EAAjB,iCAAiB;IACjB,oBAAoB,EAApB,oCAAoB;IACpB,+BAA+B;IAC/B,sBAAsB;IACtB,qBAAqB;IACrB,wBAAwB;IACxB,yBAAyB;IACzB,cAAc;IACd,WAAW;IACX,WAAW;IACX,kBAAkB,EAAlB,0BAAkB;IAClB,wBAAwB;IACxB,eAAe;IACf,SAAS;IACT,YAAY;IACZ,MAAM;IACN,8BAA8B;IAC9B,IAAI,EAAE;QACL,GAAG,EAAE;YACJ,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,eAAe;SACvB;QACD,EAAE,EAAE;YACH,KAAK;YACL,KAAK;YACL,MAAM;YACN,QAAQ;SACR;KACD;CACD,CAAC;AACF,2CAA6D;AAApD,2HAAA,6BAA6B,OAAA;AACtC,iEAAgE;AAAvD,8HAAA,qBAAqB,OAAA;AAC9B,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA","sourcesContent":["import {\n\tAMM_RESERVE_PRECISION_EXP,\n\tBASE_PRECISION,\n\tBN,\n\tEvent,\n\tPRICE_PRECISION,\n\tOrderAction,\n\tOrderActionRecord,\n\tOrderRecord,\n\tPublicKey,\n\tQUOTE_PRECISION,\n\tZERO,\n\tPRICE_PRECISION_EXP,\n\tBASE_PRECISION_EXP,\n\tBigNum,\n\tMarketType,\n\tDriftClient,\n\tSPOT_MARKET_RATE_PRECISION_EXP,\n\tcalculateDepositRate,\n\tcalculateBorrowRate,\n\tgetTokenAmount,\n\tSpotBalanceType,\n\tSpotMarketConfig,\n} from '@drift-labs/sdk';\nimport {\n\tUIMatchedOrderRecordAndAction,\n\tUISerializableOrderActionRecord,\n} from '../serializableTypes';\nimport { getIfStakingVaultApr, getIfVaultBalance } from './insuranceFund';\nimport { AccountInfo, Connection } from '@solana/web3.js';\n\nexport const matchEnum = (enum1: any, enum2) => {\n\treturn JSON.stringify(enum1) === JSON.stringify(enum2);\n};\n\nfunction enumToObj(enumStr: string) {\n\tif (!enumStr) return undefined;\n\n\treturn {\n\t\t[enumStr ?? '']: {},\n\t};\n}\n\nfunction enumToStr(enumStr: Record<string, any>) {\n\treturn Object.keys(enumStr ?? {})?.[0];\n}\n\nexport const ENUM_UTILS = {\n\tmatch: matchEnum,\n\ttoObj: enumToObj,\n\ttoStr: enumToStr,\n};\n\nexport async function sleep(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\nconst getStringifiableObjectEntry = (value: any): [any, string] => {\n\t// If BN\n\t// if (value instanceof BN) { /* This method would be much safer but don't think it's possible to ensure that instances of classes match when they're in different npm packages */\n\tif (Object.keys(value).sort().join(',') === 'length,negative,red,words') {\n\t\treturn [value.toString(), '_bgnm_'];\n\t}\n\n\t// If PublicKey\n\t// if (value instanceof PublicKey) { { /* This method would be much safer but don't think it's possible to ensure that instances of classes match when they're in different npm packages */\n\tif (Object.keys(value).sort().join(',') === '_bn') {\n\t\treturn [value.toString(), '_pbky_'];\n\t}\n\n\tif (typeof value === 'object') {\n\t\treturn [encodeStringifiableObject(value), ''];\n\t}\n\n\treturn [value, ''];\n};\n\n/**\n * Converts an objects with potential Pubkeys and BNs in it into a form that can be JSON stringified. When pubkeys get converted a _pbky_ suffix will be added to their key, and _bgnm_ for BNs.\n *\n * e.g.\n * input : {\n * QuoteAmount: BN\n * }\n *\n * output: {\n * _bgnm_QuoteAmount: string\n * }\n * @param value\n * @returns\n */\nexport const encodeStringifiableObject = (value: any) => {\n\tif (typeof value !== 'object') return value;\n\n\tif (Array.isArray(value)) {\n\t\treturn value.map((entry) => encodeStringifiableObject(entry));\n\t}\n\n\tconst buildJsonObject = {};\n\n\tif (!value) return value;\n\n\tObject.entries(value).forEach(([key, val]) => {\n\t\tconst [convertedVal, keyTag] = getStringifiableObjectEntry(val);\n\t\tbuildJsonObject[`${keyTag}${key}`] = convertedVal;\n\t});\n\n\treturn buildJsonObject;\n};\n\n/**\n * Converts a parsed object with potential Pubkeys and BNs in it (in string form) to their proper form. Pubkey values must have a key starting in _pbky_ and BN values must have a key starting in _bnnm_\n *\n * * e.g.\n * input : {\n * _bgnm_QuoteAmount: string\n * }\n *\n * output: {\n * QuoteAmount: BN\n * }\n * @param value\n * @returns\n */\nexport const decodeStringifiableObject = (value: any) => {\n\tif (typeof value !== 'object') return value;\n\n\tif (Array.isArray(value)) {\n\t\treturn value.map((entry) => decodeStringifiableObject(entry));\n\t}\n\n\tconst buildJsonObject = {};\n\n\tObject.entries(value)\n\t\t.filter((val) => val != undefined && val != null)\n\t\t.forEach(([key, val]) => {\n\t\t\tif (key.match(/^_pbky_/)) {\n\t\t\t\tbuildJsonObject[key.replace('_pbky_', '')] = new PublicKey(val);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (key.match(/^_bgnm_/)) {\n\t\t\t\tbuildJsonObject[key.replace('_bgnm_', '')] = new BN(val as string);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof val === 'object' && val != undefined && val != null) {\n\t\t\t\tbuildJsonObject[key] = decodeStringifiableObject(val);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tbuildJsonObject[key] = val;\n\t\t});\n\n\treturn buildJsonObject;\n};\n\nconst getChronologicalValueForOrderAction = (action: OrderAction) => {\n\treturn matchEnum(action, OrderAction.PLACE)\n\t\t? 0\n\t\t: matchEnum(action, OrderAction.FILL)\n\t\t? 1\n\t\t: 2;\n};\n\n/**\n * Returns 1 if the first Order is chronologically later than the second Order, -1 if before, 0 if equal\n * @param orderA\n * @param orderB\n * @returns\n */\nexport const getSortScoreForOrderRecords = (\n\torderA: { slot: number },\n\torderB: { slot: number }\n) => {\n\tif (orderA.slot !== orderB.slot) {\n\t\treturn orderA.slot > orderB.slot ? 1 : -1;\n\t}\n\n\treturn 0;\n};\n\nexport const getTradeInfoFromActionRecord = (\n\tactionRecord: PartialUISerializableOrderActionRecord\n) => {\n\treturn {\n\t\tts: actionRecord.ts,\n\t\tbaseAssetAmount: actionRecord.taker\n\t\t\t? actionRecord.takerOrderBaseAssetAmount\n\t\t\t: actionRecord.makerOrderBaseAssetAmount,\n\t\tbaseAssetAmountFilled: actionRecord.taker\n\t\t\t? actionRecord.takerOrderCumulativeBaseAssetAmountFilled\n\t\t\t: actionRecord.makerOrderCumulativeBaseAssetAmountFilled,\n\t\tquoteAssetAmountFilled: actionRecord.taker\n\t\t\t? actionRecord.takerOrderCumulativeQuoteAssetAmountFilled\n\t\t\t: actionRecord.makerOrderCumulativeQuoteAssetAmountFilled,\n\t};\n};\n\nexport type PartialOrderActionRecord =\n\t| PartialUISerializableOrderActionRecord\n\t| PartialOrderActionEventRecord;\n\nexport type PartialUISerializableOrderActionRecord = Pick<\n\tUISerializableOrderActionRecord,\n\t| 'quoteAssetAmountFilled'\n\t| 'baseAssetAmountFilled'\n\t| 'ts'\n\t| 'slot'\n\t| 'action'\n\t| 'fillRecordId'\n\t| 'taker'\n\t| 'takerOrderBaseAssetAmount'\n\t| 'makerOrderBaseAssetAmount'\n\t| 'takerOrderCumulativeBaseAssetAmountFilled'\n\t| 'makerOrderCumulativeBaseAssetAmountFilled'\n\t| 'takerOrderCumulativeQuoteAssetAmountFilled'\n\t| 'makerOrderCumulativeQuoteAssetAmountFilled'\n\t| 'oraclePrice'\n>;\n\nexport type PartialOrderActionEventRecord = Pick<\n\tEvent<OrderActionRecord>,\n\t| 'quoteAssetAmountFilled'\n\t| 'baseAssetAmountFilled'\n\t| 'ts'\n\t| 'slot'\n\t| 'action'\n\t| 'fillRecordId'\n\t| 'taker'\n\t| 'takerOrderBaseAssetAmount'\n\t| 'makerOrderBaseAssetAmount'\n\t| 'takerOrderCumulativeBaseAssetAmountFilled'\n\t| 'makerOrderCumulativeBaseAssetAmountFilled'\n\t| 'takerOrderCumulativeQuoteAssetAmountFilled'\n\t| 'makerOrderCumulativeQuoteAssetAmountFilled'\n>;\n\n/**\n * Returns 1 if the first Order is chronologically later than the second Order, -1 if before, 0 if equal\n * @param orderA\n * @param orderB\n * @returns\n */\nexport const getSortScoreForOrderActionRecords = (\n\torderA: PartialOrderActionRecord,\n\torderB: PartialOrderActionRecord\n) => {\n\tif (orderA.slot !== orderB.slot) {\n\t\treturn orderA.slot > orderB.slot ? 1 : -1;\n\t}\n\n\tif (!matchEnum(orderA.action, orderB.action)) {\n\t\t// @ts-ignore\n\t\tconst orderAActionVal = getChronologicalValueForOrderAction(orderA.action);\n\t\t// @ts-ignore\n\t\tconst orderBActionVal = getChronologicalValueForOrderAction(orderB.action);\n\n\t\treturn orderAActionVal > orderBActionVal ? 1 : -1;\n\t}\n\t// @ts-ignore\n\tif (orderA.fillRecordId && orderB.fillRecordId) {\n\t\tif (!orderA.fillRecordId.eq(orderB.fillRecordId)) {\n\t\t\t// @ts-ignore\n\t\t\treturn orderA.fillRecordId.gt(orderB.fillRecordId) ? 1 : -1;\n\t\t}\n\t}\n\n\treturn 0;\n};\n\nexport const sortUIMatchedOrderRecordAndAction = (\n\trecords: UIMatchedOrderRecordAndAction[],\n\tdirection: 'asc' | 'desc' = 'desc'\n) => {\n\tconst ascSortedRecords = records.sort((a, b) =>\n\t\tgetSortScoreForOrderActionRecords(a.actionRecord, b.actionRecord)\n\t);\n\n\treturn direction === 'desc' ? ascSortedRecords.reverse() : ascSortedRecords;\n};\n\nexport const sortUIOrderActionRecords = (\n\trecords: PartialUISerializableOrderActionRecord[],\n\tdirection: 'asc' | 'desc' = 'desc'\n) => {\n\tconst ascSortedRecords = records.sort(getSortScoreForOrderActionRecords);\n\n\treturn direction === 'desc' ? ascSortedRecords.reverse() : ascSortedRecords;\n};\n\nexport const sortUIOrderRecords = <T extends { slot: number }>(\n\trecords: T[],\n\tdirection: 'asc' | 'desc' = 'desc'\n) => {\n\tconst ascSortedRecords = records.sort(getSortScoreForOrderRecords);\n\n\treturn direction === 'desc' ? ascSortedRecords.reverse() : ascSortedRecords;\n};\n\nexport const sortOrderRecords = (\n\trecords: Event<OrderRecord>[],\n\tdirection: 'asc' | 'desc' = 'desc'\n) => {\n\tconst ascSortedRecords = records.sort(getSortScoreForOrderRecords);\n\n\treturn direction === 'desc' ? ascSortedRecords.reverse() : ascSortedRecords;\n};\n\nexport const getLatestOfTwoUIOrderRecords = <T extends { slot: number }>(\n\torderA: T,\n\torderB: T\n) => {\n\treturn getSortScoreForOrderRecords(orderA, orderB) === 1 ? orderA : orderB;\n};\n\nexport const getLatestOfTwoOrderRecords = <T extends { slot: number }>(\n\torderA: T,\n\torderB: T\n) => {\n\treturn getSortScoreForOrderRecords(orderA, orderB) === 1 ? orderA : orderB;\n};\n\nexport const getUIOrderRecordsLaterThanTarget = <T extends { slot: number }>(\n\ttarget: T,\n\trecords: T[]\n) =>\n\trecords.filter(\n\t\t(record) => getLatestOfTwoUIOrderRecords(record, target) === record\n\t);\n\n// Trade records are order records which have been filled\nexport const orderActionRecordIsTrade = (orderRecord: OrderActionRecord) =>\n\torderRecord.baseAssetAmountFilled.gt(ZERO) &&\n\t// @ts-ignore\n\tmatchEnum(orderRecord.action, OrderAction.FILL) &&\n\ttrue;\n\nexport const uiOrderActionRecordIsTrade = (\n\torderRecord: UISerializableOrderActionRecord\n) =>\n\torderRecord.baseAssetAmountFilled.gtZero() &&\n\tmatchEnum(orderRecord.action, OrderAction.FILL) &&\n\ttrue;\n\n// Trade records are order records which have been filled\nexport const filterTradeRecordsFromOrderActionRecords = (\n\torderRecords: OrderActionRecord[]\n): OrderActionRecord[] => orderRecords.filter(orderActionRecordIsTrade);\n\n// Trade records are order records which have been filled\nexport const filterTradeRecordsFromUIOrderRecords = (\n\torderRecords: UISerializableOrderActionRecord[]\n): UISerializableOrderActionRecord[] =>\n\torderRecords.filter(uiOrderActionRecordIsTrade);\n\n/**\n * Returns the average price for a given base amount and quote amount.\n * @param quoteAmount\n * @param baseAmount\n * @returns PRICE_PRECISION\n */\nexport const getPriceForBaseAndQuoteAmount = (\n\tquoteAmount: BN,\n\tbaseAmount: BN\n) => {\n\treturn quoteAmount\n\t\t.mul(PRICE_PRECISION)\n\t\t.mul(BASE_PRECISION)\n\t\t.div(QUOTE_PRECISION)\n\t\t.div(BigNum.from(baseAmount, BASE_PRECISION_EXP).val);\n};\n\nexport const getPriceForOrderRecord = (\n\torderRecord: Pick<\n\t\tOrderActionRecord,\n\t\t'quoteAssetAmountFilled' | 'baseAssetAmountFilled'\n\t>\n) => {\n\treturn getPriceForBaseAndQuoteAmount(\n\t\t// @ts-ignore\n\t\torderRecord.quoteAssetAmountFilled,\n\t\t// @ts-ignore\n\t\torderRecord.baseAssetAmountFilled\n\t);\n};\n\nexport const getPriceForUIOrderRecord = (\n\torderRecord: Pick<\n\t\tUISerializableOrderActionRecord,\n\t\t'quoteAssetAmountFilled' | 'baseAssetAmountFilled'\n\t>\n) => {\n\treturn orderRecord.quoteAssetAmountFilled\n\t\t.shiftTo(AMM_RESERVE_PRECISION_EXP)\n\t\t.shift(PRICE_PRECISION_EXP)\n\t\t.div(orderRecord.baseAssetAmountFilled.shiftTo(BASE_PRECISION_EXP))\n\t\t.shiftTo(PRICE_PRECISION_EXP);\n};\n\nexport const orderIsNull = (\n\torder: UISerializableOrderActionRecord | Event<OrderActionRecord>,\n\tside: 'taker' | 'maker'\n) => {\n\treturn side === 'taker' ? !order.taker : !order.maker;\n};\n\nexport const getAnchorEnumString = (enumVal: Record<string, unknown>) => {\n\treturn Object.keys(enumVal)[0];\n};\nexport class Ref<T> {\n\tpublic val: T;\n\n\tconstructor(val: T) {\n\t\tthis.val = val;\n\t}\n\n\tset(val: T) {\n\t\tthis.val = val;\n\t}\n\n\tget() {\n\t\treturn this.val;\n\t}\n}\n\nexport class Counter {\n\tprivate val = 0;\n\n\tget() {\n\t\treturn this.val;\n\t}\n\n\tincrement(value = 1) {\n\t\tthis.val += value;\n\t}\n\n\treset() {\n\t\tthis.val = 0;\n\t}\n}\n\n/**\n * A class which allows a group of switches to seperately turn a multiswitch on or off. The base state is the state of the \"multiswitch\" when all of the constituent switches are off. When any of the switches are \"on\" then the multiswitch flips to the opposite state\n *\n * If baseState is on => any switch being \"on\" will turn the multiswitch off.\n * If baseState is off => any switch being \"off\" will turn the multiswitch off.\n */\nexport class MultiSwitch {\n\tprivate switches: string[] = [];\n\tprivate switchValue = 0;\n\n\tconstructor(private baseState: 'on' | 'off' = 'off') {}\n\n\tprivate getSwitchKey(key: string) {\n\t\t// If first time using switch, add to list of switches\n\t\tif (!this.switches.includes(key)) {\n\t\t\tthis.switches.push(key);\n\t\t}\n\n\t\tconst switchIndex = this.switches.indexOf(key);\n\n\t\treturn 2 ** switchIndex;\n\t}\n\n\tpublic switchOn(key: string) {\n\t\tif (this.baseState === 'on') {\n\t\t\tthis._switchOff(key);\n\t\t\treturn;\n\t\t}\n\t\tthis._switchOn(key);\n\t}\n\n\tpublic switchOff(key: string) {\n\t\tif (this.baseState === 'on') {\n\t\t\tthis._switchOn(key);\n\t\t\treturn;\n\t\t}\n\t\tthis._switchOff(key);\n\t}\n\n\tprivate _switchOff(key: string) {\n\t\tconst switchKey = this.getSwitchKey(key);\n\n\t\tthis.switchValue &= ~switchKey;\n\t}\n\n\tprivate _switchOn(key: string) {\n\t\tconst switchKey = this.getSwitchKey(key);\n\n\t\tthis.switchValue |= switchKey;\n\t}\n\n\tpublic get isOn() {\n\t\t// When the base state is on, then if any switch is on the multi-switch is off\n\t\tif (this.baseState === 'on') {\n\t\t\treturn this.switchValue === 0;\n\t\t}\n\n\t\tif (this.baseState === 'off') {\n\t\t\treturn this.switchValue > 0;\n\t\t}\n\t}\n}\n\n/**\n * Returns the quote amount of the current open interest for a market, using the current oracle price\n * @param marketIndex\n * @param marketType\n * @param driftClient\n * @returns\n */\nconst getCurrentOpenInterestForMarket = (\n\tmarketIndex: number,\n\tmarketType: MarketType,\n\tdriftClient: DriftClient\n) => {\n\tif (ENUM_UTILS.match(marketType, MarketType.PERP)) {\n\t\tconst market = driftClient.getPerpMarketAccount(marketIndex);\n\t\tconst OI = BigNum.from(\n\t\t\tmarket.amm.baseAssetAmountLong.add(market.amm.baseAssetAmountShort.abs()),\n\t\t\tBASE_PRECISION_EXP\n\t\t);\n\n\t\tconst priceData = driftClient.getOraclePriceDataAndSlot(\n\t\t\tmarket.amm.oracle,\n\t\t\tmarket.amm.oracleSource\n\t\t);\n\n\t\tconst price = BigNum.from(priceData.data.price, PRICE_PRECISION_EXP);\n\n\t\tconst quoteOIforMarket = price.toNum() * OI.toNum();\n\n\t\treturn quoteOIforMarket;\n\t} else {\n\t\tthrow new Error('Invalid market type for Open Interest calculation');\n\t}\n};\n\n/**\n * Gets the deposit APR for a spot market, in percent\n * @param marketIndex\n * @param marketType\n * @param driftClient\n * @returns\n */\nconst getDepositAprForMarket = (\n\tmarketIndex: number,\n\tmarketType: MarketType,\n\tdriftClient: DriftClient\n) => {\n\tif (ENUM_UTILS.match(marketType, MarketType.SPOT)) {\n\t\tconst marketAccount = driftClient.getSpotMarketAccount(marketIndex);\n\n\t\tconst depositApr = BigNum.from(\n\t\t\tcalculateDepositRate(marketAccount),\n\t\t\tSPOT_MARKET_RATE_PRECISION_EXP\n\t\t);\n\n\t\tconst depositAprPct = depositApr.toNum() * 100;\n\n\t\treturn depositAprPct;\n\t} else {\n\t\tthrow new Error('Invalid market type for Deposit APR calculation');\n\t}\n};\n\n/**\n * Get's the borrow APR for a spot market, in percent\n * @param marketIndex\n * @param marketType\n * @param driftClient\n * @returns\n */\nconst getBorrowAprForMarket = (\n\tmarketIndex: number,\n\tmarketType: MarketType,\n\tdriftClient: DriftClient\n) => {\n\tif (ENUM_UTILS.match(marketType, MarketType.SPOT)) {\n\t\tconst marketAccount = driftClient.getSpotMarketAccount(marketIndex);\n\n\t\tconst depositApr = BigNum.from(\n\t\t\tcalculateBorrowRate(marketAccount),\n\t\t\tSPOT_MARKET_RATE_PRECISION_EXP\n\t\t);\n\n\t\tconst depositAprPct = depositApr.toNum() * 100;\n\n\t\treturn depositAprPct;\n\t} else {\n\t\tthrow new Error('Invalid market type for Borrow APR calculation');\n\t}\n};\n\nconst getTotalBorrowsForMarket = (\n\tmarket: SpotMarketConfig,\n\tdriftClient: DriftClient\n) => {\n\tconst marketAccount = driftClient.getSpotMarketAccount(market.marketIndex);\n\n\tconst totalBorrowsTokenAmount = getTokenAmount(\n\t\tmarketAccount.borrowBalance,\n\t\tdriftClient.getSpotMarketAccount(marketAccount.marketIndex),\n\t\tSpotBalanceType.BORROW\n\t);\n\n\tconst totalBorrowsAmountBigNum = BigNum.from(\n\t\ttotalBorrowsTokenAmount,\n\t\tmarket.precisionExp\n\t);\n\n\tconst priceData = driftClient.getOraclePriceDataAndSlot(\n\t\tmarketAccount.oracle,\n\t\tmarketAccount.oracleSource\n\t);\n\n\tconst price = BigNum.from(priceData.data.price, PRICE_PRECISION_EXP);\n\n\tconst totalBorrowsQuote = price.toNum() * totalBorrowsAmountBigNum.toNum();\n\n\treturn Number(totalBorrowsQuote.toFixed(2));\n};\n\nconst getTotalDepositsForMarket = (\n\tmarket: SpotMarketConfig,\n\tdriftClient: DriftClient\n) => {\n\tconst marketAccount = driftClient.getSpotMarketAccount(market.marketIndex);\n\n\tconst totalDepositsTokenAmount = getTokenAmount(\n\t\tmarketAccount.depositBalance,\n\t\tmarketAccount,\n\t\tSpotBalanceType.DEPOSIT\n\t);\n\n\tconst totalDepositsTokenAmountBigNum = BigNum.from(\n\t\ttotalDepositsTokenAmount,\n\t\tmarket.precisionExp\n\t);\n\n\tconst priceData = driftClient.getOraclePriceDataAndSlot(\n\t\tmarketAccount.oracle,\n\t\tmarketAccount.oracleSource\n\t);\n\n\tconst price = BigNum.from(priceData.data.price, PRICE_PRECISION_EXP);\n\n\tconst totalDepositsBase = totalDepositsTokenAmountBigNum.toNum();\n\tconst totalDepositsQuote =\n\t\tprice.toNum() * totalDepositsTokenAmountBigNum.toNum();\n\n\treturn {\n\t\ttotalDepositsBase,\n\t\ttotalDepositsQuote,\n\t};\n};\n\n/**\n * Check if numbers divide exactly, accounting for floating point division annoyingness\n * @param numerator\n * @param denominator\n * @returns\n */\nconst dividesExactly = (numerator: number, denominator: number) => {\n\tconst division = numerator / denominator;\n\tconst remainder = division % 1;\n\n\tif (remainder === 0) return true;\n\n\t// Because of floating point weirdness, we're just going to assume that if the remainder after dividing is less than 1/10^6 then the numbers do divide exactly\n\tif (Math.abs(remainder - 1) < 1 / 10 ** 6) return true;\n\n\treturn false;\n};\n\nconst toSnakeCase = (str: string): string =>\n\tstr.replace(/[^\\w]/g, '_').toLowerCase();\n\nconst toCamelCase = (str: string): string => {\n\tconst words = str.split(/[_\\-\\s]+/); // split on underscores, hyphens, and spaces\n\tconst firstWord = words[0].toLowerCase();\n\tconst restWords = words\n\t\t.slice(1)\n\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase());\n\treturn [firstWord, ...restWords].join('');\n};\n\nexport const aprFromApy = (apy: number, compoundsPerYear: number) => {\n\tconst compoundedAmount = 1 + apy * 0.01;\n\tconst estimatedApr =\n\t\t(Math.pow(compoundedAmount, 1 / compoundsPerYear) - 1) * compoundsPerYear;\n\n\treturn estimatedApr * 100;\n};\n\n/**\n * Helper utility to get a sort score for \"tiered\" parameters.\n *\n * Example: Want to sort students by Grade, but fall back to using Age if they are equal. This method will accept an array for each student of [grade, age] and return the appropriate sort score for each.\n *\n * @param aScores\n * @param bScores\n * @returns\n */\nexport const getTieredSortScore = (aScores: number[], bScores: number[]) => {\n\tconst maxIndex = Math.max(aScores.length, bScores.length);\n\n\tfor (let i = 0; i < maxIndex; i++) {\n\t\tconst aScore = aScores[i] ?? Number.MIN_SAFE_INTEGER;\n\t\tconst bScore = bScores[i] ?? Number.MIN_SAFE_INTEGER;\n\n\t\tif (aScore !== bScore) return aScore - bScore;\n\t}\n\n\treturn 0;\n};\n\nconst normalizeBaseAssetSymbol = (symbol: string) => {\n\treturn symbol.replace(/^1M/, '');\n};\n\n/**\n * Returns the number of standard deviations between a target value and the history of values to compare it to.\n * @param target\n * @param previousValues\n * @returns\n */\nconst calculateZScore = (target: number, previousValues: number[]): number => {\n\tconst meanValue = calculateMean(previousValues);\n\tconst standardDeviationValue = calculateStandardDeviation(\n\t\tpreviousValues,\n\t\tmeanValue\n\t);\n\n\tconst zScore = (target - meanValue) / standardDeviationValue;\n\treturn zScore;\n};\n\nconst calculateMean = (numbers: number[]): number => {\n\tconst sum = numbers.reduce((total, num) => total + num, 0);\n\treturn sum / numbers.length;\n};\n\nconst calculateMedian = (numbers: number[]): number => {\n\tconst sortedNumbers = numbers.sort();\n\tconst middleIndex = Math.floor(sortedNumbers.length / 2);\n\tif (sortedNumbers.length % 2 === 0) {\n\t\treturn (sortedNumbers[middleIndex - 1] + sortedNumbers[middleIndex]) / 2;\n\t} else {\n\t\treturn sortedNumbers[middleIndex];\n\t}\n};\n\nconst calculateStandardDeviation = (\n\tnumbers: number[],\n\tmean: number\n): number => {\n\tconst squaredDifferences = numbers.map((num) => Math.pow(num - mean, 2));\n\tconst sumSquaredDifferences = squaredDifferences.reduce(\n\t\t(total, diff) => total + diff,\n\t\t0\n\t);\n\tconst variance = sumSquaredDifferences / numbers.length;\n\treturn Math.sqrt(variance);\n};\n\nconst glueArray = <T>(size: number, elements: T[]): T[][] => {\n\tconst gluedElements: T[][] = [];\n\n\telements.forEach((element, index) => {\n\t\tconst gluedIndex = Math.floor(index / size);\n\t\tif (gluedElements[gluedIndex]) {\n\t\t\tgluedElements[gluedIndex].push(element);\n\t\t} else {\n\t\t\tgluedElements[gluedIndex] = [element];\n\t\t}\n\t});\n\n\treturn gluedElements;\n};\n\nconst bnMin = (numbers: BN[]): BN => {\n\tlet min = numbers[0];\n\tfor (let i = 1; i < numbers.length; i++) {\n\t\tif (numbers[i].lt(min)) {\n\t\t\tmin = numbers[i];\n\t\t}\n\t}\n\treturn min;\n};\n\nconst bnMax = (numbers: BN[]): BN => {\n\tlet max = numbers[0];\n\tfor (let i = 1; i < numbers.length; i++) {\n\t\tif (numbers[i].gt(max)) {\n\t\t\tmax = numbers[i];\n\t\t}\n\t}\n\treturn max;\n};\n\nconst bnMedian = (numbers: BN[]): BN => {\n\tconst sortedNumbers = numbers.sort((a, b) => a.cmp(b));\n\tconst middleIndex = Math.floor(sortedNumbers.length / 2);\n\tif (sortedNumbers.length % 2 === 0) {\n\t\treturn sortedNumbers[middleIndex - 1]\n\t\t\t.add(sortedNumbers[middleIndex])\n\t\t\t.div(new BN(2));\n\t} else {\n\t\treturn sortedNumbers[middleIndex];\n\t}\n};\n\nconst bnMean = (numbers: BN[]): BN => {\n\tlet sum = new BN(0);\n\tfor (let i = 0; i < numbers.length; i++) {\n\t\tsum = sum.add(numbers[i]);\n\t}\n\treturn sum.div(new BN(numbers.length));\n};\n\nconst timedPromise = async <T>(promise: T) => {\n\tconst start = Date.now();\n\tconst promiseResult = await promise;\n\n\treturn {\n\t\tpromiseTime: Date.now() - start,\n\t\tpromiseResult,\n\t};\n};\n\nconst chunks = <T>(array: readonly T[], size: number): T[][] => {\n\treturn new Array(Math.ceil(array.length / size))\n\t\t.fill(null)\n\t\t.map((_, index) => index * size)\n\t\t.map((begin) => array.slice(begin, begin + size));\n};\n\nconst getMultipleAccountsInfoChunked = async (\n\tconnection: Connection,\n\taccounts: PublicKey[]\n): Promise<(AccountInfo<Buffer> | null)[]> => {\n\tconst accountChunks = chunks(accounts, 100); // 100 is limit for getMultipleAccountsInfo\n\tconst responses = await Promise.all(\n\t\taccountChunks.map((chunk) => connection.getMultipleAccountsInfo(chunk))\n\t);\n\treturn responses.flat();\n};\n\nexport const COMMON_UTILS = {\n\tgetIfVaultBalance,\n\tgetIfStakingVaultApr,\n\tgetCurrentOpenInterestForMarket,\n\tgetDepositAprForMarket,\n\tgetBorrowAprForMarket,\n\tgetTotalBorrowsForMarket,\n\tgetTotalDepositsForMarket,\n\tdividesExactly,\n\ttoSnakeCase,\n\ttoCamelCase,\n\tgetTieredSortScore,\n\tnormalizeBaseAssetSymbol,\n\tcalculateZScore,\n\tglueArray,\n\ttimedPromise,\n\tchunks,\n\tgetMultipleAccountsInfoChunked,\n\tMATH: {\n\t\tNUM: {\n\t\t\tmean: calculateMean,\n\t\t\tmedian: calculateMedian,\n\t\t},\n\t\tBN: {\n\t\t\tbnMax,\n\t\t\tbnMin,\n\t\t\tbnMean,\n\t\t\tbnMedian,\n\t\t},\n\t},\n};\nexport { getSwiftConfirmationTimeoutMs } from './signedMsgs';\nexport { ResultSlotIncrementer } from './ResultSlotIncrementer';\nexport { MultiplexWebSocket } from './MultiplexWebSocket';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,yCAuByB;AAKzB,mDAA0E;AAG1E,iCAA+C;AACtC,0FADA,gBAAS,OACA;AAAE,2FADA,iBAAU,OACA;AAEvB,KAAK,UAAU,KAAK,CAAC,EAAE;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAFD,sBAEC;AACD,MAAM,2BAA2B,GAAG,CAAC,KAAU,EAAiB,EAAE;IACjE,QAAQ;IACR,kLAAkL;IAClL,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,2BAA2B,EAAE,CAAC;QACzE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,eAAe;IACf,2LAA2L;IAC3L,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAA,iCAAyB,EAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACI,MAAM,yBAAyB,GAAG,CAAC,KAAU,EAAE,EAAE;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,iCAAyB,EAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,eAAe,GAAG,EAAE,CAAC;IAE3B,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;QAC5C,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC;QAChE,eAAe,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAjBW,QAAA,yBAAyB,6BAiBpC;AAEF;;;;;;;;;;;;;GAaG;AACI,MAAM,yBAAyB,GAAG,CAAC,KAAU,EAAE,EAAE;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,iCAAyB,EAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,eAAe,GAAG,EAAE,CAAC;IAE3B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACnB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,SAAS,IAAI,GAAG,IAAI,IAAI,CAAC;SAChD,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,eAAS,CAAC,GAAG,CAAC,CAAC;YAChE,OAAO;QACR,CAAC;QAED,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,QAAE,CAAC,GAAa,CAAC,CAAC;YACnE,OAAO;QACR,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChE,eAAe,CAAC,GAAG,CAAC,GAAG,IAAA,iCAAyB,EAAC,GAAG,CAAC,CAAC;YACtD,OAAO;QACR,CAAC;QAED,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEJ,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AA/BW,QAAA,yBAAyB,6BA+BpC;AAEF,MAAM,mCAAmC,GAAG,CAAC,MAAmB,EAAE,EAAE;IACnE,OAAO,IAAA,gBAAS,EAAC,MAAM,EAAE,iBAAW,CAAC,KAAK,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,IAAA,gBAAS,EAAC,MAAM,EAAE,iBAAW,CAAC,IAAI,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAEF;;;;;GAKG;AACI,MAAM,2BAA2B,GAAG,CAC1C,MAAwB,EACxB,MAAwB,EACvB,EAAE;IACH,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,CAAC;AACV,CAAC,CAAC;AATW,QAAA,2BAA2B,+BAStC;AAEK,MAAM,4BAA4B,GAAG,CAC3C,YAAoD,EACnD,EAAE;IACH,OAAO;QACN,EAAE,EAAE,YAAY,CAAC,EAAE;QACnB,eAAe,EAAE,YAAY,CAAC,KAAK;YAClC,CAAC,CAAC,YAAY,CAAC,yBAAyB;YACxC,CAAC,CAAC,YAAY,CAAC,yBAAyB;QACzC,qBAAqB,EAAE,YAAY,CAAC,KAAK;YACxC,CAAC,CAAC,YAAY,CAAC,yCAAyC;YACxD,CAAC,CAAC,YAAY,CAAC,yCAAyC;QACzD,sBAAsB,EAAE,YAAY,CAAC,KAAK;YACzC,CAAC,CAAC,YAAY,CAAC,0CAA0C;YACzD,CAAC,CAAC,YAAY,CAAC,0CAA0C;KAC1D,CAAC;AACH,CAAC,CAAC;AAfW,QAAA,4BAA4B,gCAevC;AAyCF;;;;;GAKG;AACI,MAAM,iCAAiC,GAAG,CAChD,MAAgC,EAChC,MAAgC,EAC/B,EAAE;IACH,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,IAAA,gBAAS,EAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,aAAa;QACb,MAAM,eAAe,GAAG,mCAAmC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3E,aAAa;QACb,MAAM,eAAe,GAAG,mCAAmC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3E,OAAO,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,aAAa;IACb,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAClD,aAAa;YACb,OAAO,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC;IAED,OAAO,CAAC,CAAC;AACV,CAAC,CAAC;AAzBW,QAAA,iCAAiC,qCAyB5C;AAEK,MAAM,iCAAiC,GAAG,CAChD,OAAwC,EACxC,YAA4B,MAAM,EACjC,EAAE;IACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9C,IAAA,yCAAiC,EAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,CACjE,CAAC;IAEF,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC7E,CAAC,CAAC;AATW,QAAA,iCAAiC,qCAS5C;AAEK,MAAM,wBAAwB,GAAG,CACvC,OAAiD,EACjD,YAA4B,MAAM,EACjC,EAAE;IACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,yCAAiC,CAAC,CAAC;IAEzE,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC7E,CAAC,CAAC;AAPW,QAAA,wBAAwB,4BAOnC;AAEK,MAAM,kBAAkB,GAAG,CACjC,OAAY,EACZ,YAA4B,MAAM,EACjC,EAAE;IACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,mCAA2B,CAAC,CAAC;IAEnE,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC7E,CAAC,CAAC;AAPW,QAAA,kBAAkB,sBAO7B;AAEK,MAAM,gBAAgB,GAAG,CAC/B,OAA6B,EAC7B,YAA4B,MAAM,EACjC,EAAE;IACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,mCAA2B,CAAC,CAAC;IAEnE,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC7E,CAAC,CAAC;AAPW,QAAA,gBAAgB,oBAO3B;AAEK,MAAM,4BAA4B,GAAG,CAC3C,MAAS,EACT,MAAS,EACR,EAAE;IACH,OAAO,IAAA,mCAA2B,EAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5E,CAAC,CAAC;AALW,QAAA,4BAA4B,gCAKvC;AAEK,MAAM,0BAA0B,GAAG,CACzC,MAAS,EACT,MAAS,EACR,EAAE;IACH,OAAO,IAAA,mCAA2B,EAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5E,CAAC,CAAC;AALW,QAAA,0BAA0B,8BAKrC;AAEK,MAAM,gCAAgC,GAAG,CAC/C,MAAS,EACT,OAAY,EACX,EAAE,CACH,OAAO,CAAC,MAAM,CACb,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,oCAA4B,EAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CACnE,CAAC;AANU,QAAA,gCAAgC,oCAM1C;AAEH,yDAAyD;AAClD,MAAM,wBAAwB,GAAG,CAAC,WAA8B,EAAE,EAAE,CAC1E,WAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAI,CAAC;IAC1C,aAAa;IACb,IAAA,gBAAS,EAAC,WAAW,CAAC,MAAM,EAAE,iBAAW,CAAC,IAAI,CAAC;IAC/C,IAAI,CAAC;AAJO,QAAA,wBAAwB,4BAI/B;AAEC,MAAM,0BAA0B,GAAG,CACzC,WAA4C,EAC3C,EAAE,CACH,WAAW,CAAC,qBAAqB,CAAC,MAAM,EAAE;IAC1C,IAAA,gBAAS,EAAC,WAAW,CAAC,MAAM,EAAE,iBAAW,CAAC,IAAI,CAAC;IAC/C,IAAI,CAAC;AALO,QAAA,0BAA0B,8BAKjC;AAEN,yDAAyD;AAClD,MAAM,wCAAwC,GAAG,CACvD,YAAiC,EACX,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,gCAAwB,CAAC,CAAC;AAF3D,QAAA,wCAAwC,4CAEmB;AAExE,yDAAyD;AAClD,MAAM,oCAAoC,GAAG,CACnD,YAA+C,EACX,EAAE,CACtC,YAAY,CAAC,MAAM,CAAC,kCAA0B,CAAC,CAAC;AAHpC,QAAA,oCAAoC,wCAGA;AAEjD;;;;;GAKG;AACI,MAAM,6BAA6B,GAAG,CAC5C,WAAe,EACf,UAAc,EACb,EAAE;IACH,OAAO,WAAW;SAChB,GAAG,CAAC,qBAAe,CAAC;SACpB,GAAG,CAAC,oBAAc,CAAC;SACnB,GAAG,CAAC,qBAAe,CAAC;SACpB,GAAG,CAAC,YAAM,CAAC,IAAI,CAAC,UAAU,EAAE,wBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC,CAAC;AATW,QAAA,6BAA6B,iCASxC;AAEK,MAAM,sBAAsB,GAAG,CACrC,WAGC,EACA,EAAE;IACH,OAAO,IAAA,qCAA6B;IACnC,aAAa;IACb,WAAW,CAAC,sBAAsB;IAClC,aAAa;IACb,WAAW,CAAC,qBAAqB,CACjC,CAAC;AACH,CAAC,CAAC;AAZW,QAAA,sBAAsB,0BAYjC;AAEK,MAAM,wBAAwB,GAAG,CACvC,WAGC,EACA,EAAE;IACH,OAAO,WAAW,CAAC,sBAAsB;SACvC,OAAO,CAAC,+BAAyB,CAAC;SAClC,KAAK,CAAC,yBAAmB,CAAC;SAC1B,GAAG,CAAC,WAAW,CAAC,qBAAqB,CAAC,OAAO,CAAC,wBAAkB,CAAC,CAAC;SAClE,OAAO,CAAC,yBAAmB,CAAC,CAAC;AAChC,CAAC,CAAC;AAXW,QAAA,wBAAwB,4BAWnC;AAEK,MAAM,WAAW,GAAG,CAC1B,KAAiE,EACjE,IAAuB,EACtB,EAAE;IACH,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;AACvD,CAAC,CAAC;AALW,QAAA,WAAW,eAKtB;AAEK,MAAM,mBAAmB,GAAG,CAAC,OAAgC,EAAE,EAAE;IACvE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B;AACF,MAAa,GAAG;IAGf,YAAY,GAAM;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,GAAM;QACT,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC;IAED,GAAG;QACF,OAAO,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC;CACD;AAdD,kBAcC;AAED,MAAa,OAAO;IAApB;QACS,QAAG,GAAG,CAAC,CAAC;IAajB,CAAC;IAXA,GAAG;QACF,OAAO,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC;IAED,SAAS,CAAC,KAAK,GAAG,CAAC;QAClB,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC;IACnB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACd,CAAC;CACD;AAdD,0BAcC;AAED;;;;;GAKG;AACH,MAAa,WAAW;IAIvB,YAAoB,YAA0B,KAAK;QAA/B,cAAS,GAAT,SAAS,CAAsB;QAH3C,aAAQ,GAAa,EAAE,CAAC;QACxB,gBAAW,GAAG,CAAC,CAAC;IAE8B,CAAC;IAE/C,YAAY,CAAC,GAAW;QAC/B,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE/C,OAAO,CAAC,IAAI,WAAW,CAAC;IACzB,CAAC;IAEM,QAAQ,CAAC,GAAW;QAC1B,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAEM,SAAS,CAAC,GAAW;QAC3B,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAEO,UAAU,CAAC,GAAW;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC;IAChC,CAAC;IAEO,SAAS,CAAC,GAAW;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC;IAC/B,CAAC;IAED,IAAW,IAAI;QACd,8EAA8E;QAC9E,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;CACD;AAvDD,kCAuDC;AAED;;;;;;GAMG;AACH,MAAM,+BAA+B,GAAG,CACvC,WAAmB,EACnB,UAAsB,EACtB,WAAwB,EACvB,EAAE;IACH,IAAI,iBAAU,CAAC,KAAK,CAAC,UAAU,EAAE,gBAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,WAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,YAAM,CAAC,IAAI,CACrB,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,EACzE,wBAAkB,CAClB,CAAC;QAEF,MAAM,SAAS,GAAG,WAAW,CAAC,yBAAyB,CACtD,MAAM,CAAC,GAAG,CAAC,MAAM,EACjB,MAAM,CAAC,GAAG,CAAC,YAAY,CACvB,CAAC;QAEF,MAAM,KAAK,GAAG,YAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAmB,CAAC,CAAC;QAErE,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QAEpD,OAAO,gBAAgB,CAAC;IACzB,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACtE,CAAC;AACF,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,sBAAsB,GAAG,CAC9B,WAAmB,EACnB,UAAsB,EACtB,WAAwB,EACvB,EAAE;IACH,IAAI,iBAAU,CAAC,KAAK,CAAC,UAAU,EAAE,gBAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,aAAa,GAAG,WAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,YAAM,CAAC,IAAI,CAC7B,IAAA,0BAAoB,EAAC,aAAa,CAAC,EACnC,oCAA8B,CAC9B,CAAC;QAEF,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC;QAE/C,OAAO,aAAa,CAAC;IACtB,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACpE,CAAC;AACF,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,qBAAqB,GAAG,CAC7B,WAAmB,EACnB,UAAsB,EACtB,WAAwB,EACvB,EAAE;IACH,IAAI,iBAAU,CAAC,KAAK,CAAC,UAAU,EAAE,gBAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,aAAa,GAAG,WAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,YAAM,CAAC,IAAI,CAC7B,IAAA,yBAAmB,EAAC,aAAa,CAAC,EAClC,oCAA8B,CAC9B,CAAC;QAEF,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC;QAE/C,OAAO,aAAa,CAAC;IACtB,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACnE,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAChC,MAAwB,EACxB,WAAwB,EACvB,EAAE;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE3E,MAAM,uBAAuB,GAAG,IAAA,oBAAc,EAC7C,aAAa,CAAC,aAAa,EAC3B,WAAW,CAAC,oBAAoB,CAAC,aAAa,CAAC,WAAW,CAAC,EAC3D,qBAAe,CAAC,MAAM,CACtB,CAAC;IAEF,MAAM,wBAAwB,GAAG,YAAM,CAAC,IAAI,CAC3C,uBAAuB,EACvB,MAAM,CAAC,YAAY,CACnB,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,yBAAyB,CACtD,aAAa,CAAC,MAAM,EACpB,aAAa,CAAC,YAAY,CAC1B,CAAC;IAEF,MAAM,KAAK,GAAG,YAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAmB,CAAC,CAAC;IAErE,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,wBAAwB,CAAC,KAAK,EAAE,CAAC;IAE3E,OAAO,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CACjC,MAAwB,EACxB,WAAwB,EACvB,EAAE;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE3E,MAAM,wBAAwB,GAAG,IAAA,oBAAc,EAC9C,aAAa,CAAC,cAAc,EAC5B,aAAa,EACb,qBAAe,CAAC,OAAO,CACvB,CAAC;IAEF,MAAM,8BAA8B,GAAG,YAAM,CAAC,IAAI,CACjD,wBAAwB,EACxB,MAAM,CAAC,YAAY,CACnB,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,yBAAyB,CACtD,aAAa,CAAC,MAAM,EACpB,aAAa,CAAC,YAAY,CAC1B,CAAC;IAEF,MAAM,KAAK,GAAG,YAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAmB,CAAC,CAAC;IAErE,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,KAAK,EAAE,CAAC;IACjE,MAAM,kBAAkB,GACvB,KAAK,CAAC,KAAK,EAAE,GAAG,8BAA8B,CAAC,KAAK,EAAE,CAAC;IAExD,OAAO;QACN,iBAAiB;QACjB,kBAAkB;KAClB,CAAC;AACH,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAE,WAAmB,EAAE,EAAE;IACjE,MAAM,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IACzC,MAAM,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC;IAE/B,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjC,8JAA8J;IAC9J,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE,CAC3C,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAE1C,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,4CAA4C;IACjF,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,KAAK;SACrB,KAAK,CAAC,CAAC,CAAC;SACR,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEK,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,gBAAwB,EAAE,EAAE;IACnE,MAAM,gBAAgB,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;IACxC,MAAM,YAAY,GACjB,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC;IAE3E,OAAO,YAAY,GAAG,GAAG,CAAC;AAC3B,CAAC,CAAC;AANW,QAAA,UAAU,cAMrB;AAEF;;;;;;;;GAQG;AACI,MAAM,kBAAkB,GAAG,CAAC,OAAiB,EAAE,OAAiB,EAAE,EAAE;;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,CAAC,CAAC,mCAAI,MAAM,CAAC,gBAAgB,CAAC;QACrD,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,CAAC,CAAC,mCAAI,MAAM,CAAC,gBAAgB,CAAC;QAErD,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,GAAG,MAAM,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,CAAC;AACV,CAAC,CAAC;AAXW,QAAA,kBAAkB,sBAW7B;AAEF,MAAM,wBAAwB,GAAG,CAAC,MAAc,EAAE,EAAE;IACnD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,cAAwB,EAAU,EAAE;IAC5E,MAAM,SAAS,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,sBAAsB,GAAG,0BAA0B,CACxD,cAAc,EACd,SAAS,CACT,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,sBAAsB,CAAC;IAC7D,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAiB,EAAU,EAAE;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3D,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,OAAiB,EAAU,EAAE;IACrD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,aAAa,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACP,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAClC,OAAiB,EACjB,IAAY,EACH,EAAE;IACX,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,qBAAqB,GAAG,kBAAkB,CAAC,MAAM,CACtD,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,EAC7B,CAAC,CACD,CAAC;IACF,MAAM,QAAQ,GAAG,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IACxD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAI,IAAY,EAAE,QAAa,EAAS,EAAE;IAC3D,MAAM,aAAa,GAAU,EAAE,CAAC;IAEhC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QAC5C,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACP,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,OAAa,EAAM,EAAE;IACnC,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,OAAa,EAAM,EAAE;IACnC,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,OAAa,EAAM,EAAE;IACtC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,aAAa,CAAC,WAAW,GAAG,CAAC,CAAC;aACnC,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;aAC/B,GAAG,CAAC,IAAI,QAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACP,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,OAAa,EAAM,EAAE;IACpC,IAAI,GAAG,GAAG,IAAI,QAAE,CAAC,CAAC,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,QAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAK,OAAU,EAAE,EAAE;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;IAEpC,OAAO;QACN,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;QAC/B,aAAa;KACb,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAI,KAAmB,EAAE,IAAY,EAAS,EAAE;IAC9D,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;SAC9C,IAAI,CAAC,IAAI,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;SAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG,KAAK,EAC3C,UAAsB,EACtB,QAAqB,EACqB,EAAE;IAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,2CAA2C;IACxF,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CACvE,CAAC;IACF,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC,CAAC;AAEW,QAAA,YAAY,GAAG;IAC3B,iBAAiB,EAAjB,iCAAiB;IACjB,oBAAoB,EAApB,oCAAoB;IACpB,+BAA+B;IAC/B,sBAAsB;IACtB,qBAAqB;IACrB,wBAAwB;IACxB,yBAAyB;IACzB,cAAc;IACd,WAAW;IACX,WAAW;IACX,kBAAkB,EAAlB,0BAAkB;IAClB,wBAAwB;IACxB,eAAe;IACf,SAAS;IACT,YAAY;IACZ,MAAM;IACN,8BAA8B;IAC9B,IAAI,EAAE;QACL,GAAG,EAAE;YACJ,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,eAAe;SACvB;QACD,EAAE,EAAE;YACH,KAAK;YACL,KAAK;YACL,MAAM;YACN,QAAQ;SACR;KACD;CACD,CAAC;AACF,2CAA6D;AAApD,2HAAA,6BAA6B,OAAA;AACtC,iEAAgE;AAAvD,8HAAA,qBAAqB,OAAA;AAC9B,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA","sourcesContent":["import {\n\tAMM_RESERVE_PRECISION_EXP,\n\tBASE_PRECISION,\n\tBN,\n\tEvent,\n\tPRICE_PRECISION,\n\tOrderAction,\n\tOrderActionRecord,\n\tOrderRecord,\n\tPublicKey,\n\tQUOTE_PRECISION,\n\tZERO,\n\tPRICE_PRECISION_EXP,\n\tBASE_PRECISION_EXP,\n\tBigNum,\n\tMarketType,\n\tDriftClient,\n\tSPOT_MARKET_RATE_PRECISION_EXP,\n\tcalculateDepositRate,\n\tcalculateBorrowRate,\n\tgetTokenAmount,\n\tSpotBalanceType,\n\tSpotMarketConfig,\n} from '@drift-labs/sdk';\nimport {\n\tUIMatchedOrderRecordAndAction,\n\tUISerializableOrderActionRecord,\n} from '../serializableTypes';\nimport { getIfStakingVaultApr, getIfVaultBalance } from './insuranceFund';\nimport { AccountInfo, Connection } from '@solana/web3.js';\n\nimport { matchEnum, ENUM_UTILS } from './enum';\nexport { matchEnum, ENUM_UTILS };\n\nexport async function sleep(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\nconst getStringifiableObjectEntry = (value: any): [any, string] => {\n\t// If BN\n\t// if (value instanceof BN) { /* This method would be much safer but don't think it's possible to ensure that instances of classes match when they're in different npm packages */\n\tif (Object.keys(value).sort().join(',') === 'length,negative,red,words') {\n\t\treturn [value.toString(), '_bgnm_'];\n\t}\n\n\t// If PublicKey\n\t// if (value instanceof PublicKey) { { /* This method would be much safer but don't think it's possible to ensure that instances of classes match when they're in different npm packages */\n\tif (Object.keys(value).sort().join(',') === '_bn') {\n\t\treturn [value.toString(), '_pbky_'];\n\t}\n\n\tif (typeof value === 'object') {\n\t\treturn [encodeStringifiableObject(value), ''];\n\t}\n\n\treturn [value, ''];\n};\n\n/**\n * Converts an objects with potential Pubkeys and BNs in it into a form that can be JSON stringified. When pubkeys get converted a _pbky_ suffix will be added to their key, and _bgnm_ for BNs.\n *\n * e.g.\n * input : {\n * QuoteAmount: BN\n * }\n *\n * output: {\n * _bgnm_QuoteAmount: string\n * }\n * @param value\n * @returns\n */\nexport const encodeStringifiableObject = (value: any) => {\n\tif (typeof value !== 'object') return value;\n\n\tif (Array.isArray(value)) {\n\t\treturn value.map((entry) => encodeStringifiableObject(entry));\n\t}\n\n\tconst buildJsonObject = {};\n\n\tif (!value) return value;\n\n\tObject.entries(value).forEach(([key, val]) => {\n\t\tconst [convertedVal, keyTag] = getStringifiableObjectEntry(val);\n\t\tbuildJsonObject[`${keyTag}${key}`] = convertedVal;\n\t});\n\n\treturn buildJsonObject;\n};\n\n/**\n * Converts a parsed object with potential Pubkeys and BNs in it (in string form) to their proper form. Pubkey values must have a key starting in _pbky_ and BN values must have a key starting in _bnnm_\n *\n * * e.g.\n * input : {\n * _bgnm_QuoteAmount: string\n * }\n *\n * output: {\n * QuoteAmount: BN\n * }\n * @param value\n * @returns\n */\nexport const decodeStringifiableObject = (value: any) => {\n\tif (typeof value !== 'object') return value;\n\n\tif (Array.isArray(value)) {\n\t\treturn value.map((entry) => decodeStringifiableObject(entry));\n\t}\n\n\tconst buildJsonObject = {};\n\n\tObject.entries(value)\n\t\t.filter((val) => val != undefined && val != null)\n\t\t.forEach(([key, val]) => {\n\t\t\tif (key.match(/^_pbky_/)) {\n\t\t\t\tbuildJsonObject[key.replace('_pbky_', '')] = new PublicKey(val);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (key.match(/^_bgnm_/)) {\n\t\t\t\tbuildJsonObject[key.replace('_bgnm_', '')] = new BN(val as string);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof val === 'object' && val != undefined && val != null) {\n\t\t\t\tbuildJsonObject[key] = decodeStringifiableObject(val);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tbuildJsonObject[key] = val;\n\t\t});\n\n\treturn buildJsonObject;\n};\n\nconst getChronologicalValueForOrderAction = (action: OrderAction) => {\n\treturn matchEnum(action, OrderAction.PLACE)\n\t\t? 0\n\t\t: matchEnum(action, OrderAction.FILL)\n\t\t? 1\n\t\t: 2;\n};\n\n/**\n * Returns 1 if the first Order is chronologically later than the second Order, -1 if before, 0 if equal\n * @param orderA\n * @param orderB\n * @returns\n */\nexport const getSortScoreForOrderRecords = (\n\torderA: { slot: number },\n\torderB: { slot: number }\n) => {\n\tif (orderA.slot !== orderB.slot) {\n\t\treturn orderA.slot > orderB.slot ? 1 : -1;\n\t}\n\n\treturn 0;\n};\n\nexport const getTradeInfoFromActionRecord = (\n\tactionRecord: PartialUISerializableOrderActionRecord\n) => {\n\treturn {\n\t\tts: actionRecord.ts,\n\t\tbaseAssetAmount: actionRecord.taker\n\t\t\t? actionRecord.takerOrderBaseAssetAmount\n\t\t\t: actionRecord.makerOrderBaseAssetAmount,\n\t\tbaseAssetAmountFilled: actionRecord.taker\n\t\t\t? actionRecord.takerOrderCumulativeBaseAssetAmountFilled\n\t\t\t: actionRecord.makerOrderCumulativeBaseAssetAmountFilled,\n\t\tquoteAssetAmountFilled: actionRecord.taker\n\t\t\t? actionRecord.takerOrderCumulativeQuoteAssetAmountFilled\n\t\t\t: actionRecord.makerOrderCumulativeQuoteAssetAmountFilled,\n\t};\n};\n\nexport type PartialOrderActionRecord =\n\t| PartialUISerializableOrderActionRecord\n\t| PartialOrderActionEventRecord;\n\nexport type PartialUISerializableOrderActionRecord = Pick<\n\tUISerializableOrderActionRecord,\n\t| 'quoteAssetAmountFilled'\n\t| 'baseAssetAmountFilled'\n\t| 'ts'\n\t| 'slot'\n\t| 'action'\n\t| 'fillRecordId'\n\t| 'taker'\n\t| 'takerOrderBaseAssetAmount'\n\t| 'makerOrderBaseAssetAmount'\n\t| 'takerOrderCumulativeBaseAssetAmountFilled'\n\t| 'makerOrderCumulativeBaseAssetAmountFilled'\n\t| 'takerOrderCumulativeQuoteAssetAmountFilled'\n\t| 'makerOrderCumulativeQuoteAssetAmountFilled'\n\t| 'oraclePrice'\n>;\n\nexport type PartialOrderActionEventRecord = Pick<\n\tEvent<OrderActionRecord>,\n\t| 'quoteAssetAmountFilled'\n\t| 'baseAssetAmountFilled'\n\t| 'ts'\n\t| 'slot'\n\t| 'action'\n\t| 'fillRecordId'\n\t| 'taker'\n\t| 'takerOrderBaseAssetAmount'\n\t| 'makerOrderBaseAssetAmount'\n\t| 'takerOrderCumulativeBaseAssetAmountFilled'\n\t| 'makerOrderCumulativeBaseAssetAmountFilled'\n\t| 'takerOrderCumulativeQuoteAssetAmountFilled'\n\t| 'makerOrderCumulativeQuoteAssetAmountFilled'\n>;\n\n/**\n * Returns 1 if the first Order is chronologically later than the second Order, -1 if before, 0 if equal\n * @param orderA\n * @param orderB\n * @returns\n */\nexport const getSortScoreForOrderActionRecords = (\n\torderA: PartialOrderActionRecord,\n\torderB: PartialOrderActionRecord\n) => {\n\tif (orderA.slot !== orderB.slot) {\n\t\treturn orderA.slot > orderB.slot ? 1 : -1;\n\t}\n\n\tif (!matchEnum(orderA.action, orderB.action)) {\n\t\t// @ts-ignore\n\t\tconst orderAActionVal = getChronologicalValueForOrderAction(orderA.action);\n\t\t// @ts-ignore\n\t\tconst orderBActionVal = getChronologicalValueForOrderAction(orderB.action);\n\n\t\treturn orderAActionVal > orderBActionVal ? 1 : -1;\n\t}\n\t// @ts-ignore\n\tif (orderA.fillRecordId && orderB.fillRecordId) {\n\t\tif (!orderA.fillRecordId.eq(orderB.fillRecordId)) {\n\t\t\t// @ts-ignore\n\t\t\treturn orderA.fillRecordId.gt(orderB.fillRecordId) ? 1 : -1;\n\t\t}\n\t}\n\n\treturn 0;\n};\n\nexport const sortUIMatchedOrderRecordAndAction = (\n\trecords: UIMatchedOrderRecordAndAction[],\n\tdirection: 'asc' | 'desc' = 'desc'\n) => {\n\tconst ascSortedRecords = records.sort((a, b) =>\n\t\tgetSortScoreForOrderActionRecords(a.actionRecord, b.actionRecord)\n\t);\n\n\treturn direction === 'desc' ? ascSortedRecords.reverse() : ascSortedRecords;\n};\n\nexport const sortUIOrderActionRecords = (\n\trecords: PartialUISerializableOrderActionRecord[],\n\tdirection: 'asc' | 'desc' = 'desc'\n) => {\n\tconst ascSortedRecords = records.sort(getSortScoreForOrderActionRecords);\n\n\treturn direction === 'desc' ? ascSortedRecords.reverse() : ascSortedRecords;\n};\n\nexport const sortUIOrderRecords = <T extends { slot: number }>(\n\trecords: T[],\n\tdirection: 'asc' | 'desc' = 'desc'\n) => {\n\tconst ascSortedRecords = records.sort(getSortScoreForOrderRecords);\n\n\treturn direction === 'desc' ? ascSortedRecords.reverse() : ascSortedRecords;\n};\n\nexport const sortOrderRecords = (\n\trecords: Event<OrderRecord>[],\n\tdirection: 'asc' | 'desc' = 'desc'\n) => {\n\tconst ascSortedRecords = records.sort(getSortScoreForOrderRecords);\n\n\treturn direction === 'desc' ? ascSortedRecords.reverse() : ascSortedRecords;\n};\n\nexport const getLatestOfTwoUIOrderRecords = <T extends { slot: number }>(\n\torderA: T,\n\torderB: T\n) => {\n\treturn getSortScoreForOrderRecords(orderA, orderB) === 1 ? orderA : orderB;\n};\n\nexport const getLatestOfTwoOrderRecords = <T extends { slot: number }>(\n\torderA: T,\n\torderB: T\n) => {\n\treturn getSortScoreForOrderRecords(orderA, orderB) === 1 ? orderA : orderB;\n};\n\nexport const getUIOrderRecordsLaterThanTarget = <T extends { slot: number }>(\n\ttarget: T,\n\trecords: T[]\n) =>\n\trecords.filter(\n\t\t(record) => getLatestOfTwoUIOrderRecords(record, target) === record\n\t);\n\n// Trade records are order records which have been filled\nexport const orderActionRecordIsTrade = (orderRecord: OrderActionRecord) =>\n\torderRecord.baseAssetAmountFilled.gt(ZERO) &&\n\t// @ts-ignore\n\tmatchEnum(orderRecord.action, OrderAction.FILL) &&\n\ttrue;\n\nexport const uiOrderActionRecordIsTrade = (\n\torderRecord: UISerializableOrderActionRecord\n) =>\n\torderRecord.baseAssetAmountFilled.gtZero() &&\n\tmatchEnum(orderRecord.action, OrderAction.FILL) &&\n\ttrue;\n\n// Trade records are order records which have been filled\nexport const filterTradeRecordsFromOrderActionRecords = (\n\torderRecords: OrderActionRecord[]\n): OrderActionRecord[] => orderRecords.filter(orderActionRecordIsTrade);\n\n// Trade records are order records which have been filled\nexport const filterTradeRecordsFromUIOrderRecords = (\n\torderRecords: UISerializableOrderActionRecord[]\n): UISerializableOrderActionRecord[] =>\n\torderRecords.filter(uiOrderActionRecordIsTrade);\n\n/**\n * Returns the average price for a given base amount and quote amount.\n * @param quoteAmount\n * @param baseAmount\n * @returns PRICE_PRECISION\n */\nexport const getPriceForBaseAndQuoteAmount = (\n\tquoteAmount: BN,\n\tbaseAmount: BN\n) => {\n\treturn quoteAmount\n\t\t.mul(PRICE_PRECISION)\n\t\t.mul(BASE_PRECISION)\n\t\t.div(QUOTE_PRECISION)\n\t\t.div(BigNum.from(baseAmount, BASE_PRECISION_EXP).val);\n};\n\nexport const getPriceForOrderRecord = (\n\torderRecord: Pick<\n\t\tOrderActionRecord,\n\t\t'quoteAssetAmountFilled' | 'baseAssetAmountFilled'\n\t>\n) => {\n\treturn getPriceForBaseAndQuoteAmount(\n\t\t// @ts-ignore\n\t\torderRecord.quoteAssetAmountFilled,\n\t\t// @ts-ignore\n\t\torderRecord.baseAssetAmountFilled\n\t);\n};\n\nexport const getPriceForUIOrderRecord = (\n\torderRecord: Pick<\n\t\tUISerializableOrderActionRecord,\n\t\t'quoteAssetAmountFilled' | 'baseAssetAmountFilled'\n\t>\n) => {\n\treturn orderRecord.quoteAssetAmountFilled\n\t\t.shiftTo(AMM_RESERVE_PRECISION_EXP)\n\t\t.shift(PRICE_PRECISION_EXP)\n\t\t.div(orderRecord.baseAssetAmountFilled.shiftTo(BASE_PRECISION_EXP))\n\t\t.shiftTo(PRICE_PRECISION_EXP);\n};\n\nexport const orderIsNull = (\n\torder: UISerializableOrderActionRecord | Event<OrderActionRecord>,\n\tside: 'taker' | 'maker'\n) => {\n\treturn side === 'taker' ? !order.taker : !order.maker;\n};\n\nexport const getAnchorEnumString = (enumVal: Record<string, unknown>) => {\n\treturn Object.keys(enumVal)[0];\n};\nexport class Ref<T> {\n\tpublic val: T;\n\n\tconstructor(val: T) {\n\t\tthis.val = val;\n\t}\n\n\tset(val: T) {\n\t\tthis.val = val;\n\t}\n\n\tget() {\n\t\treturn this.val;\n\t}\n}\n\nexport class Counter {\n\tprivate val = 0;\n\n\tget() {\n\t\treturn this.val;\n\t}\n\n\tincrement(value = 1) {\n\t\tthis.val += value;\n\t}\n\n\treset() {\n\t\tthis.val = 0;\n\t}\n}\n\n/**\n * A class which allows a group of switches to seperately turn a multiswitch on or off. The base state is the state of the \"multiswitch\" when all of the constituent switches are off. When any of the switches are \"on\" then the multiswitch flips to the opposite state\n *\n * If baseState is on => any switch being \"on\" will turn the multiswitch off.\n * If baseState is off => any switch being \"off\" will turn the multiswitch off.\n */\nexport class MultiSwitch {\n\tprivate switches: string[] = [];\n\tprivate switchValue = 0;\n\n\tconstructor(private baseState: 'on' | 'off' = 'off') {}\n\n\tprivate getSwitchKey(key: string) {\n\t\t// If first time using switch, add to list of switches\n\t\tif (!this.switches.includes(key)) {\n\t\t\tthis.switches.push(key);\n\t\t}\n\n\t\tconst switchIndex = this.switches.indexOf(key);\n\n\t\treturn 2 ** switchIndex;\n\t}\n\n\tpublic switchOn(key: string) {\n\t\tif (this.baseState === 'on') {\n\t\t\tthis._switchOff(key);\n\t\t\treturn;\n\t\t}\n\t\tthis._switchOn(key);\n\t}\n\n\tpublic switchOff(key: string) {\n\t\tif (this.baseState === 'on') {\n\t\t\tthis._switchOn(key);\n\t\t\treturn;\n\t\t}\n\t\tthis._switchOff(key);\n\t}\n\n\tprivate _switchOff(key: string) {\n\t\tconst switchKey = this.getSwitchKey(key);\n\n\t\tthis.switchValue &= ~switchKey;\n\t}\n\n\tprivate _switchOn(key: string) {\n\t\tconst switchKey = this.getSwitchKey(key);\n\n\t\tthis.switchValue |= switchKey;\n\t}\n\n\tpublic get isOn() {\n\t\t// When the base state is on, then if any switch is on the multi-switch is off\n\t\tif (this.baseState === 'on') {\n\t\t\treturn this.switchValue === 0;\n\t\t}\n\n\t\tif (this.baseState === 'off') {\n\t\t\treturn this.switchValue > 0;\n\t\t}\n\t}\n}\n\n/**\n * Returns the quote amount of the current open interest for a market, using the current oracle price\n * @param marketIndex\n * @param marketType\n * @param driftClient\n * @returns\n */\nconst getCurrentOpenInterestForMarket = (\n\tmarketIndex: number,\n\tmarketType: MarketType,\n\tdriftClient: DriftClient\n) => {\n\tif (ENUM_UTILS.match(marketType, MarketType.PERP)) {\n\t\tconst market = driftClient.getPerpMarketAccount(marketIndex);\n\t\tconst OI = BigNum.from(\n\t\t\tmarket.amm.baseAssetAmountLong.add(market.amm.baseAssetAmountShort.abs()),\n\t\t\tBASE_PRECISION_EXP\n\t\t);\n\n\t\tconst priceData = driftClient.getOraclePriceDataAndSlot(\n\t\t\tmarket.amm.oracle,\n\t\t\tmarket.amm.oracleSource\n\t\t);\n\n\t\tconst price = BigNum.from(priceData.data.price, PRICE_PRECISION_EXP);\n\n\t\tconst quoteOIforMarket = price.toNum() * OI.toNum();\n\n\t\treturn quoteOIforMarket;\n\t} else {\n\t\tthrow new Error('Invalid market type for Open Interest calculation');\n\t}\n};\n\n/**\n * Gets the deposit APR for a spot market, in percent\n * @param marketIndex\n * @param marketType\n * @param driftClient\n * @returns\n */\nconst getDepositAprForMarket = (\n\tmarketIndex: number,\n\tmarketType: MarketType,\n\tdriftClient: DriftClient\n) => {\n\tif (ENUM_UTILS.match(marketType, MarketType.SPOT)) {\n\t\tconst marketAccount = driftClient.getSpotMarketAccount(marketIndex);\n\n\t\tconst depositApr = BigNum.from(\n\t\t\tcalculateDepositRate(marketAccount),\n\t\t\tSPOT_MARKET_RATE_PRECISION_EXP\n\t\t);\n\n\t\tconst depositAprPct = depositApr.toNum() * 100;\n\n\t\treturn depositAprPct;\n\t} else {\n\t\tthrow new Error('Invalid market type for Deposit APR calculation');\n\t}\n};\n\n/**\n * Get's the borrow APR for a spot market, in percent\n * @param marketIndex\n * @param marketType\n * @param driftClient\n * @returns\n */\nconst getBorrowAprForMarket = (\n\tmarketIndex: number,\n\tmarketType: MarketType,\n\tdriftClient: DriftClient\n) => {\n\tif (ENUM_UTILS.match(marketType, MarketType.SPOT)) {\n\t\tconst marketAccount = driftClient.getSpotMarketAccount(marketIndex);\n\n\t\tconst depositApr = BigNum.from(\n\t\t\tcalculateBorrowRate(marketAccount),\n\t\t\tSPOT_MARKET_RATE_PRECISION_EXP\n\t\t);\n\n\t\tconst depositAprPct = depositApr.toNum() * 100;\n\n\t\treturn depositAprPct;\n\t} else {\n\t\tthrow new Error('Invalid market type for Borrow APR calculation');\n\t}\n};\n\nconst getTotalBorrowsForMarket = (\n\tmarket: SpotMarketConfig,\n\tdriftClient: DriftClient\n) => {\n\tconst marketAccount = driftClient.getSpotMarketAccount(market.marketIndex);\n\n\tconst totalBorrowsTokenAmount = getTokenAmount(\n\t\tmarketAccount.borrowBalance,\n\t\tdriftClient.getSpotMarketAccount(marketAccount.marketIndex),\n\t\tSpotBalanceType.BORROW\n\t);\n\n\tconst totalBorrowsAmountBigNum = BigNum.from(\n\t\ttotalBorrowsTokenAmount,\n\t\tmarket.precisionExp\n\t);\n\n\tconst priceData = driftClient.getOraclePriceDataAndSlot(\n\t\tmarketAccount.oracle,\n\t\tmarketAccount.oracleSource\n\t);\n\n\tconst price = BigNum.from(priceData.data.price, PRICE_PRECISION_EXP);\n\n\tconst totalBorrowsQuote = price.toNum() * totalBorrowsAmountBigNum.toNum();\n\n\treturn Number(totalBorrowsQuote.toFixed(2));\n};\n\nconst getTotalDepositsForMarket = (\n\tmarket: SpotMarketConfig,\n\tdriftClient: DriftClient\n) => {\n\tconst marketAccount = driftClient.getSpotMarketAccount(market.marketIndex);\n\n\tconst totalDepositsTokenAmount = getTokenAmount(\n\t\tmarketAccount.depositBalance,\n\t\tmarketAccount,\n\t\tSpotBalanceType.DEPOSIT\n\t);\n\n\tconst totalDepositsTokenAmountBigNum = BigNum.from(\n\t\ttotalDepositsTokenAmount,\n\t\tmarket.precisionExp\n\t);\n\n\tconst priceData = driftClient.getOraclePriceDataAndSlot(\n\t\tmarketAccount.oracle,\n\t\tmarketAccount.oracleSource\n\t);\n\n\tconst price = BigNum.from(priceData.data.price, PRICE_PRECISION_EXP);\n\n\tconst totalDepositsBase = totalDepositsTokenAmountBigNum.toNum();\n\tconst totalDepositsQuote =\n\t\tprice.toNum() * totalDepositsTokenAmountBigNum.toNum();\n\n\treturn {\n\t\ttotalDepositsBase,\n\t\ttotalDepositsQuote,\n\t};\n};\n\n/**\n * Check if numbers divide exactly, accounting for floating point division annoyingness\n * @param numerator\n * @param denominator\n * @returns\n */\nconst dividesExactly = (numerator: number, denominator: number) => {\n\tconst division = numerator / denominator;\n\tconst remainder = division % 1;\n\n\tif (remainder === 0) return true;\n\n\t// Because of floating point weirdness, we're just going to assume that if the remainder after dividing is less than 1/10^6 then the numbers do divide exactly\n\tif (Math.abs(remainder - 1) < 1 / 10 ** 6) return true;\n\n\treturn false;\n};\n\nconst toSnakeCase = (str: string): string =>\n\tstr.replace(/[^\\w]/g, '_').toLowerCase();\n\nconst toCamelCase = (str: string): string => {\n\tconst words = str.split(/[_\\-\\s]+/); // split on underscores, hyphens, and spaces\n\tconst firstWord = words[0].toLowerCase();\n\tconst restWords = words\n\t\t.slice(1)\n\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase());\n\treturn [firstWord, ...restWords].join('');\n};\n\nexport const aprFromApy = (apy: number, compoundsPerYear: number) => {\n\tconst compoundedAmount = 1 + apy * 0.01;\n\tconst estimatedApr =\n\t\t(Math.pow(compoundedAmount, 1 / compoundsPerYear) - 1) * compoundsPerYear;\n\n\treturn estimatedApr * 100;\n};\n\n/**\n * Helper utility to get a sort score for \"tiered\" parameters.\n *\n * Example: Want to sort students by Grade, but fall back to using Age if they are equal. This method will accept an array for each student of [grade, age] and return the appropriate sort score for each.\n *\n * @param aScores\n * @param bScores\n * @returns\n */\nexport const getTieredSortScore = (aScores: number[], bScores: number[]) => {\n\tconst maxIndex = Math.max(aScores.length, bScores.length);\n\n\tfor (let i = 0; i < maxIndex; i++) {\n\t\tconst aScore = aScores[i] ?? Number.MIN_SAFE_INTEGER;\n\t\tconst bScore = bScores[i] ?? Number.MIN_SAFE_INTEGER;\n\n\t\tif (aScore !== bScore) return aScore - bScore;\n\t}\n\n\treturn 0;\n};\n\nconst normalizeBaseAssetSymbol = (symbol: string) => {\n\treturn symbol.replace(/^1M/, '');\n};\n\n/**\n * Returns the number of standard deviations between a target value and the history of values to compare it to.\n * @param target\n * @param previousValues\n * @returns\n */\nconst calculateZScore = (target: number, previousValues: number[]): number => {\n\tconst meanValue = calculateMean(previousValues);\n\tconst standardDeviationValue = calculateStandardDeviation(\n\t\tpreviousValues,\n\t\tmeanValue\n\t);\n\n\tconst zScore = (target - meanValue) / standardDeviationValue;\n\treturn zScore;\n};\n\nconst calculateMean = (numbers: number[]): number => {\n\tconst sum = numbers.reduce((total, num) => total + num, 0);\n\treturn sum / numbers.length;\n};\n\nconst calculateMedian = (numbers: number[]): number => {\n\tconst sortedNumbers = numbers.sort();\n\tconst middleIndex = Math.floor(sortedNumbers.length / 2);\n\tif (sortedNumbers.length % 2 === 0) {\n\t\treturn (sortedNumbers[middleIndex - 1] + sortedNumbers[middleIndex]) / 2;\n\t} else {\n\t\treturn sortedNumbers[middleIndex];\n\t}\n};\n\nconst calculateStandardDeviation = (\n\tnumbers: number[],\n\tmean: number\n): number => {\n\tconst squaredDifferences = numbers.map((num) => Math.pow(num - mean, 2));\n\tconst sumSquaredDifferences = squaredDifferences.reduce(\n\t\t(total, diff) => total + diff,\n\t\t0\n\t);\n\tconst variance = sumSquaredDifferences / numbers.length;\n\treturn Math.sqrt(variance);\n};\n\nconst glueArray = <T>(size: number, elements: T[]): T[][] => {\n\tconst gluedElements: T[][] = [];\n\n\telements.forEach((element, index) => {\n\t\tconst gluedIndex = Math.floor(index / size);\n\t\tif (gluedElements[gluedIndex]) {\n\t\t\tgluedElements[gluedIndex].push(element);\n\t\t} else {\n\t\t\tgluedElements[gluedIndex] = [element];\n\t\t}\n\t});\n\n\treturn gluedElements;\n};\n\nconst bnMin = (numbers: BN[]): BN => {\n\tlet min = numbers[0];\n\tfor (let i = 1; i < numbers.length; i++) {\n\t\tif (numbers[i].lt(min)) {\n\t\t\tmin = numbers[i];\n\t\t}\n\t}\n\treturn min;\n};\n\nconst bnMax = (numbers: BN[]): BN => {\n\tlet max = numbers[0];\n\tfor (let i = 1; i < numbers.length; i++) {\n\t\tif (numbers[i].gt(max)) {\n\t\t\tmax = numbers[i];\n\t\t}\n\t}\n\treturn max;\n};\n\nconst bnMedian = (numbers: BN[]): BN => {\n\tconst sortedNumbers = numbers.sort((a, b) => a.cmp(b));\n\tconst middleIndex = Math.floor(sortedNumbers.length / 2);\n\tif (sortedNumbers.length % 2 === 0) {\n\t\treturn sortedNumbers[middleIndex - 1]\n\t\t\t.add(sortedNumbers[middleIndex])\n\t\t\t.div(new BN(2));\n\t} else {\n\t\treturn sortedNumbers[middleIndex];\n\t}\n};\n\nconst bnMean = (numbers: BN[]): BN => {\n\tlet sum = new BN(0);\n\tfor (let i = 0; i < numbers.length; i++) {\n\t\tsum = sum.add(numbers[i]);\n\t}\n\treturn sum.div(new BN(numbers.length));\n};\n\nconst timedPromise = async <T>(promise: T) => {\n\tconst start = Date.now();\n\tconst promiseResult = await promise;\n\n\treturn {\n\t\tpromiseTime: Date.now() - start,\n\t\tpromiseResult,\n\t};\n};\n\nconst chunks = <T>(array: readonly T[], size: number): T[][] => {\n\treturn new Array(Math.ceil(array.length / size))\n\t\t.fill(null)\n\t\t.map((_, index) => index * size)\n\t\t.map((begin) => array.slice(begin, begin + size));\n};\n\nconst getMultipleAccountsInfoChunked = async (\n\tconnection: Connection,\n\taccounts: PublicKey[]\n): Promise<(AccountInfo<Buffer> | null)[]> => {\n\tconst accountChunks = chunks(accounts, 100); // 100 is limit for getMultipleAccountsInfo\n\tconst responses = await Promise.all(\n\t\taccountChunks.map((chunk) => connection.getMultipleAccountsInfo(chunk))\n\t);\n\treturn responses.flat();\n};\n\nexport const COMMON_UTILS = {\n\tgetIfVaultBalance,\n\tgetIfStakingVaultApr,\n\tgetCurrentOpenInterestForMarket,\n\tgetDepositAprForMarket,\n\tgetBorrowAprForMarket,\n\tgetTotalBorrowsForMarket,\n\tgetTotalDepositsForMarket,\n\tdividesExactly,\n\ttoSnakeCase,\n\ttoCamelCase,\n\tgetTieredSortScore,\n\tnormalizeBaseAssetSymbol,\n\tcalculateZScore,\n\tglueArray,\n\ttimedPromise,\n\tchunks,\n\tgetMultipleAccountsInfoChunked,\n\tMATH: {\n\t\tNUM: {\n\t\t\tmean: calculateMean,\n\t\t\tmedian: calculateMedian,\n\t\t},\n\t\tBN: {\n\t\t\tbnMax,\n\t\t\tbnMin,\n\t\t\tbnMean,\n\t\t\tbnMedian,\n\t\t},\n\t},\n};\nexport { getSwiftConfirmationTimeoutMs } from './signedMsgs';\nexport { ResultSlotIncrementer } from './ResultSlotIncrementer';\nexport { MultiplexWebSocket } from './MultiplexWebSocket';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/common",
3
- "version": "1.0.53",
3
+ "version": "1.0.55",
4
4
  "description": "Common functions for Drift",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",