@metamask-previews/perps-controller 8.1.0-preview-9de5a25 → 8.1.0-preview-e4b456ca8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -7
- package/dist/PerpsController.cjs +17 -3
- package/dist/PerpsController.cjs.map +1 -1
- package/dist/PerpsController.d.cts.map +1 -1
- package/dist/PerpsController.d.mts.map +1 -1
- package/dist/PerpsController.mjs +17 -3
- package/dist/PerpsController.mjs.map +1 -1
- package/dist/constants/eventNames.cjs +0 -51
- package/dist/constants/eventNames.cjs.map +1 -1
- package/dist/constants/eventNames.d.cts +0 -46
- package/dist/constants/eventNames.d.cts.map +1 -1
- package/dist/constants/eventNames.d.mts +0 -46
- package/dist/constants/eventNames.d.mts.map +1 -1
- package/dist/constants/eventNames.mjs +0 -51
- package/dist/constants/eventNames.mjs.map +1 -1
- package/dist/constants/perpsConfig.cjs +16 -1
- package/dist/constants/perpsConfig.cjs.map +1 -1
- package/dist/constants/perpsConfig.d.cts +15 -0
- package/dist/constants/perpsConfig.d.cts.map +1 -1
- package/dist/constants/perpsConfig.d.mts +15 -0
- package/dist/constants/perpsConfig.d.mts.map +1 -1
- package/dist/constants/perpsConfig.mjs +15 -0
- package/dist/constants/perpsConfig.mjs.map +1 -1
- package/dist/services/MarketDataService.cjs +77 -9
- package/dist/services/MarketDataService.cjs.map +1 -1
- package/dist/services/MarketDataService.d.cts +13 -2
- package/dist/services/MarketDataService.d.cts.map +1 -1
- package/dist/services/MarketDataService.d.mts +13 -2
- package/dist/services/MarketDataService.d.mts.map +1 -1
- package/dist/services/MarketDataService.mjs +77 -9
- package/dist/services/MarketDataService.mjs.map +1 -1
- package/dist/services/TerminalMarketService.cjs +176 -0
- package/dist/services/TerminalMarketService.cjs.map +1 -0
- package/dist/services/TerminalMarketService.d.cts +48 -0
- package/dist/services/TerminalMarketService.d.cts.map +1 -0
- package/dist/services/TerminalMarketService.d.mts +48 -0
- package/dist/services/TerminalMarketService.d.mts.map +1 -0
- package/dist/services/TerminalMarketService.mjs +172 -0
- package/dist/services/TerminalMarketService.mjs.map +1 -0
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.cts +18 -0
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.mts +18 -0
- package/dist/types/index.d.mts.map +1 -1
- package/dist/types/index.mjs.map +1 -1
- package/dist/utils/marketDataTransform.cjs +14 -8
- package/dist/utils/marketDataTransform.cjs.map +1 -1
- package/dist/utils/marketDataTransform.d.cts +5 -1
- package/dist/utils/marketDataTransform.d.cts.map +1 -1
- package/dist/utils/marketDataTransform.d.mts +5 -1
- package/dist/utils/marketDataTransform.d.mts.map +1 -1
- package/dist/utils/marketDataTransform.mjs +14 -8
- package/dist/utils/marketDataTransform.mjs.map +1 -1
- package/dist/utils/marketSearch.cjs +28 -2
- package/dist/utils/marketSearch.cjs.map +1 -1
- package/dist/utils/marketSearch.d.cts +4 -3
- package/dist/utils/marketSearch.d.cts.map +1 -1
- package/dist/utils/marketSearch.d.mts +4 -3
- package/dist/utils/marketSearch.d.mts.map +1 -1
- package/dist/utils/marketSearch.mjs +28 -2
- package/dist/utils/marketSearch.mjs.map +1 -1
- package/package.json +2 -1
|
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _MarketDataService_deps;
|
|
13
|
+
var _MarketDataService_instances, _MarketDataService_deps, _MarketDataService_terminalMarketService, _MarketDataService_enrichWithTerminalMetadata;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.MarketDataService = void 0;
|
|
16
16
|
const uuid_1 = require("uuid");
|
|
@@ -35,10 +35,15 @@ class MarketDataService {
|
|
|
35
35
|
* Create a new MarketDataService instance
|
|
36
36
|
*
|
|
37
37
|
* @param deps - Platform dependencies for logging, metrics, etc.
|
|
38
|
+
* @param terminalMarketService - Optional terminal market service for
|
|
39
|
+
* fetching market data from the Terminal API.
|
|
38
40
|
*/
|
|
39
|
-
constructor(deps) {
|
|
41
|
+
constructor(deps, terminalMarketService) {
|
|
42
|
+
_MarketDataService_instances.add(this);
|
|
40
43
|
_MarketDataService_deps.set(this, void 0);
|
|
44
|
+
_MarketDataService_terminalMarketService.set(this, void 0);
|
|
41
45
|
__classPrivateFieldSet(this, _MarketDataService_deps, deps, "f");
|
|
46
|
+
__classPrivateFieldSet(this, _MarketDataService_terminalMarketService, terminalMarketService, "f");
|
|
42
47
|
}
|
|
43
48
|
/**
|
|
44
49
|
* Get current positions
|
|
@@ -564,16 +569,19 @@ class MarketDataService {
|
|
|
564
569
|
}
|
|
565
570
|
/**
|
|
566
571
|
* Get available markets
|
|
567
|
-
* Handles full orchestration: tracing, error logging, state management, and provider delegation
|
|
572
|
+
* Handles full orchestration: tracing, error logging, state management, and provider delegation.
|
|
573
|
+
* When `useTerminalApi` is true, attempts the Terminal API first; on failure or empty
|
|
574
|
+
* response, falls back silently to the HyperLiquid provider path.
|
|
568
575
|
*
|
|
569
576
|
* @param options - The configuration options.
|
|
570
577
|
* @param options.provider - The perps provider instance.
|
|
571
578
|
* @param options.params - The operation parameters.
|
|
572
579
|
* @param options.context - The service context for dependencies.
|
|
580
|
+
* @param options.useTerminalApi - When true, attempt Terminal API before provider.
|
|
573
581
|
* @returns The result of the operation.
|
|
574
582
|
*/
|
|
575
583
|
async getMarkets(options) {
|
|
576
|
-
const { provider, params, context } = options;
|
|
584
|
+
const { provider, params, context, useTerminalApi } = options;
|
|
577
585
|
const traceId = (0, uuid_1.v4)();
|
|
578
586
|
let traceData;
|
|
579
587
|
try {
|
|
@@ -588,10 +596,31 @@ class MarketDataService {
|
|
|
588
596
|
symbolCount: String(params.symbols.length),
|
|
589
597
|
}),
|
|
590
598
|
...(params?.dex !== undefined && { dex: params.dex }),
|
|
599
|
+
...(useTerminalApi !== undefined && {
|
|
600
|
+
useTerminalApi: String(useTerminalApi),
|
|
601
|
+
}),
|
|
591
602
|
},
|
|
592
603
|
});
|
|
604
|
+
// Terminal API path: attempt first when flag is enabled
|
|
605
|
+
if (useTerminalApi && __classPrivateFieldGet(this, _MarketDataService_terminalMarketService, "f")) {
|
|
606
|
+
try {
|
|
607
|
+
const { markets: terminalMarkets } = await __classPrivateFieldGet(this, _MarketDataService_terminalMarketService, "f").fetchMarkets();
|
|
608
|
+
if (terminalMarkets.length > 0) {
|
|
609
|
+
if (context.stateManager) {
|
|
610
|
+
context.stateManager.update((state) => {
|
|
611
|
+
state.lastError = null;
|
|
612
|
+
state.lastUpdateTimestamp = Date.now();
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
traceData = { success: true };
|
|
616
|
+
return terminalMarkets;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
catch (terminalError) {
|
|
620
|
+
__classPrivateFieldGet(this, _MarketDataService_terminalMarketService, "f").logError(terminalError, 'getMarkets');
|
|
621
|
+
}
|
|
622
|
+
}
|
|
593
623
|
const markets = await provider.getMarkets(params);
|
|
594
|
-
// Clear any previous errors on successful call (if stateManager is provided)
|
|
595
624
|
if (context.stateManager) {
|
|
596
625
|
context.stateManager.update((state) => {
|
|
597
626
|
state.lastError = null;
|
|
@@ -619,7 +648,6 @@ class MarketDataService {
|
|
|
619
648
|
},
|
|
620
649
|
},
|
|
621
650
|
});
|
|
622
|
-
// Update error state (if stateManager is provided)
|
|
623
651
|
if (context.stateManager) {
|
|
624
652
|
context.stateManager.update((state) => {
|
|
625
653
|
state.lastError = errorMessage;
|
|
@@ -643,15 +671,18 @@ class MarketDataService {
|
|
|
643
671
|
/**
|
|
644
672
|
* Get market data with prices (includes price, volume, 24h change).
|
|
645
673
|
* Applies optional category filtering, sorting, and limit after fetching.
|
|
674
|
+
* When `useTerminalApi` is true, enriches provider data with Terminal API metadata
|
|
675
|
+
* (name, keywords, tags, categories). On Terminal API failure, falls back silently.
|
|
646
676
|
*
|
|
647
677
|
* @param options - The configuration options.
|
|
648
678
|
* @param options.provider - The perps provider instance.
|
|
649
679
|
* @param options.params - Optional filter/sort/limit params.
|
|
650
680
|
* @param options.context - The service context for dependencies.
|
|
681
|
+
* @param options.useTerminalApi - When true, enrich with Terminal API metadata.
|
|
651
682
|
* @returns The result of the operation.
|
|
652
683
|
*/
|
|
653
684
|
async getMarketDataWithPrices(options) {
|
|
654
|
-
const { provider, params, context } = options;
|
|
685
|
+
const { provider, params, context, useTerminalApi } = options;
|
|
655
686
|
const traceId = (0, uuid_1.v4)();
|
|
656
687
|
let traceData;
|
|
657
688
|
try {
|
|
@@ -665,10 +696,32 @@ class MarketDataService {
|
|
|
665
696
|
...(params?.categories && {
|
|
666
697
|
categoryCount: String(params.categories.length),
|
|
667
698
|
}),
|
|
699
|
+
...(useTerminalApi !== undefined && {
|
|
700
|
+
useTerminalApi: String(useTerminalApi),
|
|
701
|
+
}),
|
|
668
702
|
},
|
|
669
703
|
});
|
|
704
|
+
// Fetch Terminal API metadata in parallel with provider data when enabled.
|
|
705
|
+
// Terminal metadata enriches the provider result (name, keywords, tags,
|
|
706
|
+
// categories) but never replaces live pricing / funding data.
|
|
707
|
+
let terminalMetadata;
|
|
708
|
+
if (useTerminalApi && __classPrivateFieldGet(this, _MarketDataService_terminalMarketService, "f")) {
|
|
709
|
+
try {
|
|
710
|
+
const result = await __classPrivateFieldGet(this, _MarketDataService_terminalMarketService, "f").fetchMarkets();
|
|
711
|
+
if (result.metadata.size > 0) {
|
|
712
|
+
terminalMetadata = result.metadata;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
catch (terminalError) {
|
|
716
|
+
__classPrivateFieldGet(this, _MarketDataService_terminalMarketService, "f").logError(terminalError, 'getMarketDataWithPrices');
|
|
717
|
+
}
|
|
718
|
+
}
|
|
670
719
|
const markets = await provider.getMarketDataWithPrices();
|
|
671
|
-
|
|
720
|
+
// Enrich with terminal metadata when available
|
|
721
|
+
const enriched = terminalMetadata
|
|
722
|
+
? __classPrivateFieldGet(this, _MarketDataService_instances, "m", _MarketDataService_enrichWithTerminalMetadata).call(this, markets, terminalMetadata)
|
|
723
|
+
: markets;
|
|
724
|
+
const filtered = (0, marketUtils_1.applyMarketFilters)(enriched, params);
|
|
672
725
|
traceData = { success: true };
|
|
673
726
|
return filtered;
|
|
674
727
|
}
|
|
@@ -993,5 +1046,20 @@ class MarketDataService {
|
|
|
993
1046
|
}
|
|
994
1047
|
}
|
|
995
1048
|
exports.MarketDataService = MarketDataService;
|
|
996
|
-
_MarketDataService_deps = new WeakMap()
|
|
1049
|
+
_MarketDataService_deps = new WeakMap(), _MarketDataService_terminalMarketService = new WeakMap(), _MarketDataService_instances = new WeakSet(), _MarketDataService_enrichWithTerminalMetadata = function _MarketDataService_enrichWithTerminalMetadata(markets, metadata) {
|
|
1050
|
+
return markets.map((market) => {
|
|
1051
|
+
const meta = metadata.get(market.symbol);
|
|
1052
|
+
if (!meta) {
|
|
1053
|
+
return market;
|
|
1054
|
+
}
|
|
1055
|
+
return {
|
|
1056
|
+
...market,
|
|
1057
|
+
name: meta.name,
|
|
1058
|
+
...(meta.marketType !== undefined && { marketType: meta.marketType }),
|
|
1059
|
+
...(meta.keywords !== undefined && { keywords: meta.keywords }),
|
|
1060
|
+
...(meta.tags !== undefined && { tags: meta.tags }),
|
|
1061
|
+
...(meta.categories !== undefined && { categories: meta.categories }),
|
|
1062
|
+
};
|
|
1063
|
+
});
|
|
1064
|
+
};
|
|
997
1065
|
//# sourceMappingURL=MarketDataService.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketDataService.cjs","sourceRoot":"","sources":["../../src/services/MarketDataService.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as uuidv4 } from 'uuid';\n\nimport type { CandlePeriod } from '../constants/chartConfig';\nimport { PerpsMeasurementName } from '../constants/performanceMetrics';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes';\nimport { PerpsTraceNames, PerpsTraceOperations } from '../types';\nimport type {\n PerpsProvider,\n Position,\n GetPositionsParams,\n AccountState,\n GetAccountStateParams,\n HistoricalPortfolioResult,\n GetHistoricalPortfolioParams,\n OrderFill,\n GetOrderFillsParams,\n Funding,\n GetFundingParams,\n Order,\n GetOrdersParams,\n MarketInfo,\n GetMarketDataWithPricesParams,\n GetMarketsParams,\n GetAvailableDexsParams,\n LiquidationPriceParams,\n MaintenanceMarginParams,\n FeeCalculationParams,\n FeeCalculationResult,\n OrderParams,\n ClosePositionParams,\n AssetRoute,\n PerpsPlatformDependencies,\n PerpsMarketData,\n} from '../types';\nimport type { CandleData } from '../types/perps-types';\nimport { coalescePerpsRestRequest } from '../utils/coalescePerpsRestRequest';\nimport { ensureError, isAbortError } from '../utils/errorUtils';\nimport { applyMarketFilters } from '../utils/marketUtils';\nimport type { ServiceContext } from './ServiceContext';\n\n/**\n * MarketDataService\n *\n * Handles all read-only data-fetching operations for the Perps controller.\n * This service is stateless and delegates to the provider.\n * The controller is responsible for tracing and state management.\n *\n * Instance-based service with constructor injection of platform dependencies.\n */\nexport class MarketDataService {\n readonly #deps: PerpsPlatformDependencies;\n\n /**\n * Create a new MarketDataService instance\n *\n * @param deps - Platform dependencies for logging, metrics, etc.\n */\n constructor(deps: PerpsPlatformDependencies) {\n this.#deps = deps;\n }\n\n /**\n * Get current positions\n * Handles full orchestration: tracing, error logging, state management, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getPositions(options: {\n provider: PerpsProvider;\n params?: GetPositionsParams;\n context: ServiceContext;\n }): Promise<Position[]> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.GetPositions,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n const positions = await provider.getPositions(params);\n\n // Update state on success (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n state.lastError = null;\n });\n }\n\n traceData = { success: true };\n return positions;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : PERPS_ERROR_CODES.POSITIONS_FAILED;\n\n // Update error state (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.GetPositions,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get order fills for a specific user or order\n * Handles full orchestration: tracing, error logging, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.forceRefresh - Bypass the request-coalesce cache end-to-end\n * (user-initiated refresh).\n * @returns The result of the operation.\n */\n async getOrderFills(options: {\n provider: PerpsProvider;\n params?: GetOrderFillsParams;\n context: ServiceContext;\n /**\n * Bypass the request-coalesce cache. Use for user-initiated refresh\n * (pull-to-refresh, polling tick) so the fetch runs fresh.\n */\n forceRefresh?: boolean;\n }): Promise<OrderFill[]> {\n const { provider, params, context, forceRefresh } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.OrderFillsFetch,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n // Pagination / explicit end-window callers bypass the shared cache so\n // their specific page never collides with the default \"recent fills\"\n // bucket. Day-granular startTime bucket prevents a ~90d caller from\n // sharing payloads with an all-history caller.\n const isPaginated =\n params?.limit !== undefined || params?.endTime !== undefined;\n\n if (isPaginated) {\n const result = await provider.getOrderFills(params, { forceRefresh });\n traceData = { success: true };\n return result;\n }\n\n // Non-paginated: resolve the caller's account so the cache key is\n // account-scoped. Without this, callers that omit params.accountId\n // (the common hook path) would collide on a shared \"default\" bucket —\n // after an account switch, account B could receive account A's\n // still-fresh payload until the TTL expired. Pin the resolved id onto\n // the forwarded params so the provider cannot re-resolve to a different\n // account between our resolve() and its fetch (TOCTOU guard).\n const resolvedAccountId =\n params?.accountId ?? (await provider.getCurrentAccountId());\n const pinnedParams: GetOrderFillsParams = {\n ...params,\n accountId: resolvedAccountId,\n };\n const result = await coalescePerpsRestRequest(\n [\n context.tracingContext.provider,\n context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n 'getOrderFills',\n resolvedAccountId,\n params?.aggregateByTime === true ? 'agg' : 'raw',\n params?.startTime === undefined\n ? 'unbounded'\n : `s${Math.floor(params.startTime / 86_400_000)}`,\n ].join('|'),\n () => provider.getOrderFills(pinnedParams, { forceRefresh }),\n { forceRefresh },\n );\n\n traceData = { success: true };\n return result;\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getOrderFills'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n traceData = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.OrderFillsFetch,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get historical user orders (order lifecycle)\n * Handles full orchestration: tracing, error logging, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.forceRefresh - Bypass the request-coalesce cache end-to-end\n * (user-initiated refresh).\n * @returns The result of the operation.\n */\n async getOrders(options: {\n provider: PerpsProvider;\n params?: GetOrdersParams;\n context: ServiceContext;\n /**\n * Bypass the request-coalesce cache. Use for user-initiated refresh.\n */\n forceRefresh?: boolean;\n }): Promise<Order[]> {\n const { provider, params, context, forceRefresh } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.OrdersFetch,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n const isPaginated =\n params?.limit !== undefined ||\n params?.offset !== undefined ||\n params?.endTime !== undefined;\n\n if (isPaginated) {\n const result = await provider.getOrders(params, { forceRefresh });\n traceData = { success: true };\n return result;\n }\n\n // Non-paginated: resolve the caller's account so the cache key is\n // account-scoped (see getOrderFills for rationale). Pin the resolved\n // id onto the forwarded params so the provider cannot re-resolve to a\n // different account between our resolve() and its fetch.\n const resolvedAccountId =\n params?.accountId ?? (await provider.getCurrentAccountId());\n const pinnedParams: GetOrdersParams = {\n ...params,\n accountId: resolvedAccountId,\n };\n const result = await coalescePerpsRestRequest(\n [\n context.tracingContext.provider,\n context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n 'getOrders',\n resolvedAccountId,\n ].join('|'),\n () => provider.getOrders(pinnedParams, { forceRefresh }),\n { forceRefresh },\n );\n\n traceData = { success: true };\n return result;\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getOrders'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n traceData = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.OrdersFetch,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get current open orders\n * Handles full orchestration: tracing, error logging, performance measurement, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getOpenOrders(options: {\n provider: PerpsProvider;\n params?: GetOrdersParams;\n context: ServiceContext;\n }): Promise<Order[]> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.OrdersFetch,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n const result = await provider.getOpenOrders(params);\n\n const completionDuration = this.#deps.performance.now() - startTime;\n this.#deps.tracer.setMeasurement(\n PerpsMeasurementName.PerpsGetOpenOrdersOperation,\n completionDuration,\n 'millisecond',\n );\n\n traceData = { success: true };\n return result;\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getOpenOrders'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n traceData = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.OrdersFetch,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get funding rates\n * Handles full orchestration: tracing, error logging, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.forceRefresh - Bypass the request-coalesce cache end-to-end\n * (user-initiated refresh).\n * @returns The result of the operation.\n */\n async getFunding(options: {\n provider: PerpsProvider;\n params?: GetFundingParams;\n context: ServiceContext;\n /**\n * Bypass the request-coalesce cache. Use for user-initiated refresh.\n */\n forceRefresh?: boolean;\n }): Promise<Funding[]> {\n const { provider, params, context, forceRefresh } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.FundingFetch,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n const isPaginated =\n params?.limit !== undefined ||\n params?.offset !== undefined ||\n params?.startTime !== undefined ||\n params?.endTime !== undefined;\n\n if (isPaginated) {\n const result = await provider.getFunding(params, { forceRefresh });\n traceData = { success: true };\n return result;\n }\n\n // Non-paginated: resolve the caller's account so the cache key is\n // account-scoped (see getOrderFills for rationale). Pin the resolved\n // id onto the forwarded params so the provider cannot re-resolve to a\n // different account between our resolve() and its fetch.\n const resolvedAccountId =\n params?.accountId ?? (await provider.getCurrentAccountId());\n const pinnedParams: GetFundingParams = {\n ...params,\n accountId: resolvedAccountId,\n };\n const result = await coalescePerpsRestRequest(\n [\n context.tracingContext.provider,\n context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n 'getFunding',\n resolvedAccountId,\n ].join('|'),\n () => provider.getFunding(pinnedParams, { forceRefresh }),\n { forceRefresh },\n );\n\n traceData = { success: true };\n return result;\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getFunding'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n traceData = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FundingFetch,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get account state\n * Handles full orchestration: tracing, error logging, state management, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getAccountState(options: {\n provider: PerpsProvider;\n params?: GetAccountStateParams;\n context: ServiceContext;\n }): Promise<AccountState> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.GetAccountState,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n source: params?.source ?? 'unknown',\n },\n });\n\n const accountState = await provider.getAccountState(params);\n\n // Safety check for accountState\n if (!accountState) {\n const error = new Error(\n 'Failed to get account state: received null/undefined response',\n );\n\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getAccountState'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n operation: 'nullAccountStateCheck',\n },\n },\n },\n );\n\n throw error;\n }\n\n // Update state on success (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.accountState = accountState;\n state.lastUpdateTimestamp = Date.now();\n state.lastError = null;\n });\n }\n\n traceData = { success: true };\n return accountState;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Account state fetch failed';\n\n // Update error state (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.GetAccountState,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get historical portfolio data\n * Handles full orchestration: tracing, error logging, state management, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getHistoricalPortfolio(options: {\n provider: PerpsProvider;\n params?: GetHistoricalPortfolioParams;\n context: ServiceContext;\n }): Promise<HistoricalPortfolioResult> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.GetHistoricalPortfolio,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n if (!provider.getHistoricalPortfolio) {\n throw new Error('Historical portfolio not supported by provider');\n }\n\n const result = await provider.getHistoricalPortfolio(params);\n\n traceData = { success: true };\n return result;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to get historical portfolio';\n\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getHistoricalPortfolio'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n // Update error state (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.GetHistoricalPortfolio,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get available markets\n * Handles full orchestration: tracing, error logging, state management, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getMarkets(options: {\n provider: PerpsProvider;\n params?: GetMarketsParams;\n context: ServiceContext;\n }): Promise<MarketInfo[]> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.GetMarkets,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n ...(params?.symbols && {\n symbolCount: String(params.symbols.length),\n }),\n ...(params?.dex !== undefined && { dex: params.dex }),\n },\n });\n\n const markets = await provider.getMarkets(params);\n\n // Clear any previous errors on successful call (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = null;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n traceData = { success: true };\n return markets;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : PERPS_ERROR_CODES.MARKETS_FAILED;\n\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getMarkets'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n // Update error state (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.GetMarkets,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get market data with prices (includes price, volume, 24h change).\n * Applies optional category filtering, sorting, and limit after fetching.\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - Optional filter/sort/limit params.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getMarketDataWithPrices(options: {\n provider: PerpsProvider;\n params?: GetMarketDataWithPricesParams;\n context: ServiceContext;\n }): Promise<PerpsMarketData[]> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.GetMarketDataWithPrices,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n ...(params?.categories && {\n categoryCount: String(params.categories.length),\n }),\n },\n });\n\n const markets = await provider.getMarketDataWithPrices();\n const filtered = applyMarketFilters(markets, params);\n\n traceData = { success: true };\n return filtered;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : PERPS_ERROR_CODES.MARKETS_FAILED;\n\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getMarketDataWithPrices'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.GetMarketDataWithPrices,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get available DEXs (HIP-3 support required)\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getAvailableDexs(options: {\n provider: PerpsProvider;\n params?: GetAvailableDexsParams;\n context: ServiceContext;\n }): Promise<string[]> {\n const { provider, params } = options;\n\n try {\n if (!provider.getAvailableDexs) {\n throw new Error('Provider does not support HIP-3 DEXs');\n }\n\n return await provider.getAvailableDexs(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getAvailableDexs'),\n {\n context: {\n name: 'MarketDataService.getAvailableDexs',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Fetch historical candle data for charting\n * Handles full orchestration: tracing, error logging, state management, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.symbol - The trading pair symbol.\n * @param options.interval - The candle interval period.\n * @param options.limit - Maximum number of items to fetch.\n * @param options.endTime - End timestamp in milliseconds.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async fetchHistoricalCandles(options: {\n provider: PerpsProvider;\n symbol: string;\n interval: CandlePeriod;\n limit?: number;\n endTime?: number;\n context: ServiceContext;\n }): Promise<CandleData> {\n const {\n provider,\n symbol,\n interval,\n limit = 100,\n endTime,\n context,\n } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.FetchHistoricalCandles,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n symbol,\n interval,\n },\n });\n\n if (!provider.fetchHistoricalCandles) {\n throw new Error('Historical candles not supported by provider');\n }\n\n const result = await provider.fetchHistoricalCandles({\n symbol,\n interval,\n limit,\n endTime,\n });\n\n traceData = { success: true };\n return result;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to fetch historical candles';\n\n // Expected cancellation — skip Sentry and state updates\n if (!isAbortError(error)) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.fetchHistoricalCandles'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n symbol,\n interval,\n limit,\n endTime,\n },\n },\n },\n );\n\n // Update error state (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n }\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FetchHistoricalCandles,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Calculate liquidation price for a position\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async calculateLiquidationPrice(options: {\n provider: PerpsProvider;\n params: LiquidationPriceParams;\n context: ServiceContext;\n }): Promise<string> {\n const { provider, params } = options;\n\n try {\n return await provider.calculateLiquidationPrice(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.calculateLiquidationPrice'),\n {\n context: {\n name: 'MarketDataService.calculateLiquidationPrice',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Calculate maintenance margin for a position\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async calculateMaintenanceMargin(options: {\n provider: PerpsProvider;\n params: MaintenanceMarginParams;\n context: ServiceContext;\n }): Promise<number> {\n const { provider, params } = options;\n\n try {\n return await provider.calculateMaintenanceMargin(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.calculateMaintenanceMargin'),\n {\n context: {\n name: 'MarketDataService.calculateMaintenanceMargin',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Get maximum leverage for an asset\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.asset - The asset identifier.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getMaxLeverage(options: {\n provider: PerpsProvider;\n asset: string;\n context: ServiceContext;\n }): Promise<number> {\n const { provider, asset } = options;\n\n try {\n return await provider.getMaxLeverage(asset);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getMaxLeverage'),\n {\n context: {\n name: 'MarketDataService.getMaxLeverage',\n data: { asset },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Calculate fees for an order\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async calculateFees(options: {\n provider: PerpsProvider;\n params: FeeCalculationParams;\n context: ServiceContext;\n }): Promise<FeeCalculationResult> {\n const { provider, params } = options;\n\n try {\n return await provider.calculateFees(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.calculateFees'),\n {\n context: {\n name: 'MarketDataService.calculateFees',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Validate an order before placement\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async validateOrder(options: {\n provider: PerpsProvider;\n params: OrderParams;\n context: ServiceContext;\n }): Promise<{ isValid: boolean; error?: string }> {\n const { provider, params } = options;\n\n try {\n return await provider.validateOrder(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.validateOrder'),\n {\n context: {\n name: 'MarketDataService.validateOrder',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Validate a position close request\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async validateClosePosition(options: {\n provider: PerpsProvider;\n params: ClosePositionParams;\n context: ServiceContext;\n }): Promise<{ isValid: boolean; error?: string }> {\n const { provider, params } = options;\n\n try {\n return await provider.validateClosePosition(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.validateClosePosition'),\n {\n context: {\n name: 'MarketDataService.validateClosePosition',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Get supported withdrawal routes (synchronous)\n * Note: This method doesn't log errors to avoid needing context for a synchronous getter\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @returns The result of the operation.\n */\n getWithdrawalRoutes(options: { provider: PerpsProvider }): AssetRoute[] {\n const { provider } = options;\n\n try {\n return provider.getWithdrawalRoutes();\n } catch {\n // Silent fail - withdrawal routes are not critical\n return [];\n }\n }\n\n /**\n * Get block explorer URL (synchronous)\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.address - The wallet address.\n * @returns The result of the operation.\n */\n getBlockExplorerUrl(options: {\n provider: PerpsProvider;\n address?: string;\n }): string {\n const { provider, address } = options;\n return provider.getBlockExplorerUrl(address);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MarketDataService.cjs","sourceRoot":"","sources":["../../src/services/MarketDataService.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as uuidv4 } from 'uuid';\n\nimport type { CandlePeriod } from '../constants/chartConfig';\nimport { PerpsMeasurementName } from '../constants/performanceMetrics';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes';\nimport { PerpsTraceNames, PerpsTraceOperations } from '../types';\nimport type {\n PerpsProvider,\n Position,\n GetPositionsParams,\n AccountState,\n GetAccountStateParams,\n HistoricalPortfolioResult,\n GetHistoricalPortfolioParams,\n OrderFill,\n GetOrderFillsParams,\n Funding,\n GetFundingParams,\n Order,\n GetOrdersParams,\n MarketInfo,\n GetMarketDataWithPricesParams,\n GetMarketsParams,\n GetAvailableDexsParams,\n LiquidationPriceParams,\n MaintenanceMarginParams,\n FeeCalculationParams,\n FeeCalculationResult,\n OrderParams,\n ClosePositionParams,\n AssetRoute,\n PerpsPlatformDependencies,\n PerpsMarketData,\n} from '../types';\nimport type { CandleData } from '../types/perps-types';\nimport { coalescePerpsRestRequest } from '../utils/coalescePerpsRestRequest';\nimport { ensureError, isAbortError } from '../utils/errorUtils';\nimport { applyMarketFilters } from '../utils/marketUtils';\nimport type { ServiceContext } from './ServiceContext';\nimport type { TerminalMarketService } from './TerminalMarketService';\nimport type { TerminalAssetMetadata } from './TerminalMarketService';\n\n/**\n * MarketDataService\n *\n * Handles all read-only data-fetching operations for the Perps controller.\n * This service is stateless and delegates to the provider.\n * The controller is responsible for tracing and state management.\n *\n * Instance-based service with constructor injection of platform dependencies.\n */\nexport class MarketDataService {\n readonly #deps: PerpsPlatformDependencies;\n\n readonly #terminalMarketService: TerminalMarketService | undefined;\n\n /**\n * Create a new MarketDataService instance\n *\n * @param deps - Platform dependencies for logging, metrics, etc.\n * @param terminalMarketService - Optional terminal market service for\n * fetching market data from the Terminal API.\n */\n constructor(\n deps: PerpsPlatformDependencies,\n terminalMarketService?: TerminalMarketService,\n ) {\n this.#deps = deps;\n this.#terminalMarketService = terminalMarketService;\n }\n\n /**\n * Get current positions\n * Handles full orchestration: tracing, error logging, state management, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getPositions(options: {\n provider: PerpsProvider;\n params?: GetPositionsParams;\n context: ServiceContext;\n }): Promise<Position[]> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.GetPositions,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n const positions = await provider.getPositions(params);\n\n // Update state on success (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n state.lastError = null;\n });\n }\n\n traceData = { success: true };\n return positions;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : PERPS_ERROR_CODES.POSITIONS_FAILED;\n\n // Update error state (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.GetPositions,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get order fills for a specific user or order\n * Handles full orchestration: tracing, error logging, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.forceRefresh - Bypass the request-coalesce cache end-to-end\n * (user-initiated refresh).\n * @returns The result of the operation.\n */\n async getOrderFills(options: {\n provider: PerpsProvider;\n params?: GetOrderFillsParams;\n context: ServiceContext;\n /**\n * Bypass the request-coalesce cache. Use for user-initiated refresh\n * (pull-to-refresh, polling tick) so the fetch runs fresh.\n */\n forceRefresh?: boolean;\n }): Promise<OrderFill[]> {\n const { provider, params, context, forceRefresh } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.OrderFillsFetch,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n // Pagination / explicit end-window callers bypass the shared cache so\n // their specific page never collides with the default \"recent fills\"\n // bucket. Day-granular startTime bucket prevents a ~90d caller from\n // sharing payloads with an all-history caller.\n const isPaginated =\n params?.limit !== undefined || params?.endTime !== undefined;\n\n if (isPaginated) {\n const result = await provider.getOrderFills(params, { forceRefresh });\n traceData = { success: true };\n return result;\n }\n\n // Non-paginated: resolve the caller's account so the cache key is\n // account-scoped. Without this, callers that omit params.accountId\n // (the common hook path) would collide on a shared \"default\" bucket —\n // after an account switch, account B could receive account A's\n // still-fresh payload until the TTL expired. Pin the resolved id onto\n // the forwarded params so the provider cannot re-resolve to a different\n // account between our resolve() and its fetch (TOCTOU guard).\n const resolvedAccountId =\n params?.accountId ?? (await provider.getCurrentAccountId());\n const pinnedParams: GetOrderFillsParams = {\n ...params,\n accountId: resolvedAccountId,\n };\n const result = await coalescePerpsRestRequest(\n [\n context.tracingContext.provider,\n context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n 'getOrderFills',\n resolvedAccountId,\n params?.aggregateByTime === true ? 'agg' : 'raw',\n params?.startTime === undefined\n ? 'unbounded'\n : `s${Math.floor(params.startTime / 86_400_000)}`,\n ].join('|'),\n () => provider.getOrderFills(pinnedParams, { forceRefresh }),\n { forceRefresh },\n );\n\n traceData = { success: true };\n return result;\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getOrderFills'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n traceData = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.OrderFillsFetch,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get historical user orders (order lifecycle)\n * Handles full orchestration: tracing, error logging, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.forceRefresh - Bypass the request-coalesce cache end-to-end\n * (user-initiated refresh).\n * @returns The result of the operation.\n */\n async getOrders(options: {\n provider: PerpsProvider;\n params?: GetOrdersParams;\n context: ServiceContext;\n /**\n * Bypass the request-coalesce cache. Use for user-initiated refresh.\n */\n forceRefresh?: boolean;\n }): Promise<Order[]> {\n const { provider, params, context, forceRefresh } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.OrdersFetch,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n const isPaginated =\n params?.limit !== undefined ||\n params?.offset !== undefined ||\n params?.endTime !== undefined;\n\n if (isPaginated) {\n const result = await provider.getOrders(params, { forceRefresh });\n traceData = { success: true };\n return result;\n }\n\n // Non-paginated: resolve the caller's account so the cache key is\n // account-scoped (see getOrderFills for rationale). Pin the resolved\n // id onto the forwarded params so the provider cannot re-resolve to a\n // different account between our resolve() and its fetch.\n const resolvedAccountId =\n params?.accountId ?? (await provider.getCurrentAccountId());\n const pinnedParams: GetOrdersParams = {\n ...params,\n accountId: resolvedAccountId,\n };\n const result = await coalescePerpsRestRequest(\n [\n context.tracingContext.provider,\n context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n 'getOrders',\n resolvedAccountId,\n ].join('|'),\n () => provider.getOrders(pinnedParams, { forceRefresh }),\n { forceRefresh },\n );\n\n traceData = { success: true };\n return result;\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getOrders'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n traceData = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.OrdersFetch,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get current open orders\n * Handles full orchestration: tracing, error logging, performance measurement, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getOpenOrders(options: {\n provider: PerpsProvider;\n params?: GetOrdersParams;\n context: ServiceContext;\n }): Promise<Order[]> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.OrdersFetch,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n const result = await provider.getOpenOrders(params);\n\n const completionDuration = this.#deps.performance.now() - startTime;\n this.#deps.tracer.setMeasurement(\n PerpsMeasurementName.PerpsGetOpenOrdersOperation,\n completionDuration,\n 'millisecond',\n );\n\n traceData = { success: true };\n return result;\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getOpenOrders'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n traceData = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.OrdersFetch,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get funding rates\n * Handles full orchestration: tracing, error logging, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.forceRefresh - Bypass the request-coalesce cache end-to-end\n * (user-initiated refresh).\n * @returns The result of the operation.\n */\n async getFunding(options: {\n provider: PerpsProvider;\n params?: GetFundingParams;\n context: ServiceContext;\n /**\n * Bypass the request-coalesce cache. Use for user-initiated refresh.\n */\n forceRefresh?: boolean;\n }): Promise<Funding[]> {\n const { provider, params, context, forceRefresh } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.FundingFetch,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n const isPaginated =\n params?.limit !== undefined ||\n params?.offset !== undefined ||\n params?.startTime !== undefined ||\n params?.endTime !== undefined;\n\n if (isPaginated) {\n const result = await provider.getFunding(params, { forceRefresh });\n traceData = { success: true };\n return result;\n }\n\n // Non-paginated: resolve the caller's account so the cache key is\n // account-scoped (see getOrderFills for rationale). Pin the resolved\n // id onto the forwarded params so the provider cannot re-resolve to a\n // different account between our resolve() and its fetch.\n const resolvedAccountId =\n params?.accountId ?? (await provider.getCurrentAccountId());\n const pinnedParams: GetFundingParams = {\n ...params,\n accountId: resolvedAccountId,\n };\n const result = await coalescePerpsRestRequest(\n [\n context.tracingContext.provider,\n context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n 'getFunding',\n resolvedAccountId,\n ].join('|'),\n () => provider.getFunding(pinnedParams, { forceRefresh }),\n { forceRefresh },\n );\n\n traceData = { success: true };\n return result;\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getFunding'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n traceData = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FundingFetch,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get account state\n * Handles full orchestration: tracing, error logging, state management, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getAccountState(options: {\n provider: PerpsProvider;\n params?: GetAccountStateParams;\n context: ServiceContext;\n }): Promise<AccountState> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.GetAccountState,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n source: params?.source ?? 'unknown',\n },\n });\n\n const accountState = await provider.getAccountState(params);\n\n // Safety check for accountState\n if (!accountState) {\n const error = new Error(\n 'Failed to get account state: received null/undefined response',\n );\n\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getAccountState'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n operation: 'nullAccountStateCheck',\n },\n },\n },\n );\n\n throw error;\n }\n\n // Update state on success (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.accountState = accountState;\n state.lastUpdateTimestamp = Date.now();\n state.lastError = null;\n });\n }\n\n traceData = { success: true };\n return accountState;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Account state fetch failed';\n\n // Update error state (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.GetAccountState,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get historical portfolio data\n * Handles full orchestration: tracing, error logging, state management, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getHistoricalPortfolio(options: {\n provider: PerpsProvider;\n params?: GetHistoricalPortfolioParams;\n context: ServiceContext;\n }): Promise<HistoricalPortfolioResult> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.GetHistoricalPortfolio,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n if (!provider.getHistoricalPortfolio) {\n throw new Error('Historical portfolio not supported by provider');\n }\n\n const result = await provider.getHistoricalPortfolio(params);\n\n traceData = { success: true };\n return result;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to get historical portfolio';\n\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getHistoricalPortfolio'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n // Update error state (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.GetHistoricalPortfolio,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get available markets\n * Handles full orchestration: tracing, error logging, state management, and provider delegation.\n * When `useTerminalApi` is true, attempts the Terminal API first; on failure or empty\n * response, falls back silently to the HyperLiquid provider path.\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.useTerminalApi - When true, attempt Terminal API before provider.\n * @returns The result of the operation.\n */\n async getMarkets(options: {\n provider: PerpsProvider;\n params?: GetMarketsParams;\n context: ServiceContext;\n useTerminalApi?: boolean;\n }): Promise<MarketInfo[]> {\n const { provider, params, context, useTerminalApi } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.GetMarkets,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n ...(params?.symbols && {\n symbolCount: String(params.symbols.length),\n }),\n ...(params?.dex !== undefined && { dex: params.dex }),\n ...(useTerminalApi !== undefined && {\n useTerminalApi: String(useTerminalApi),\n }),\n },\n });\n\n // Terminal API path: attempt first when flag is enabled\n if (useTerminalApi && this.#terminalMarketService) {\n try {\n const { markets: terminalMarkets } =\n await this.#terminalMarketService.fetchMarkets();\n if (terminalMarkets.length > 0) {\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = null;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n traceData = { success: true };\n return terminalMarkets;\n }\n } catch (terminalError) {\n this.#terminalMarketService.logError(terminalError, 'getMarkets');\n }\n }\n\n const markets = await provider.getMarkets(params);\n\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = null;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n traceData = { success: true };\n return markets;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : PERPS_ERROR_CODES.MARKETS_FAILED;\n\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getMarkets'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.GetMarkets,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get market data with prices (includes price, volume, 24h change).\n * Applies optional category filtering, sorting, and limit after fetching.\n * When `useTerminalApi` is true, enriches provider data with Terminal API metadata\n * (name, keywords, tags, categories). On Terminal API failure, falls back silently.\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - Optional filter/sort/limit params.\n * @param options.context - The service context for dependencies.\n * @param options.useTerminalApi - When true, enrich with Terminal API metadata.\n * @returns The result of the operation.\n */\n async getMarketDataWithPrices(options: {\n provider: PerpsProvider;\n params?: GetMarketDataWithPricesParams;\n context: ServiceContext;\n useTerminalApi?: boolean;\n }): Promise<PerpsMarketData[]> {\n const { provider, params, context, useTerminalApi } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.GetMarketDataWithPrices,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n ...(params?.categories && {\n categoryCount: String(params.categories.length),\n }),\n ...(useTerminalApi !== undefined && {\n useTerminalApi: String(useTerminalApi),\n }),\n },\n });\n\n // Fetch Terminal API metadata in parallel with provider data when enabled.\n // Terminal metadata enriches the provider result (name, keywords, tags,\n // categories) but never replaces live pricing / funding data.\n let terminalMetadata: Map<string, TerminalAssetMetadata> | undefined;\n if (useTerminalApi && this.#terminalMarketService) {\n try {\n const result = await this.#terminalMarketService.fetchMarkets();\n if (result.metadata.size > 0) {\n terminalMetadata = result.metadata;\n }\n } catch (terminalError) {\n this.#terminalMarketService.logError(\n terminalError,\n 'getMarketDataWithPrices',\n );\n }\n }\n\n const markets = await provider.getMarketDataWithPrices();\n\n // Enrich with terminal metadata when available\n const enriched = terminalMetadata\n ? this.#enrichWithTerminalMetadata(markets, terminalMetadata)\n : markets;\n\n const filtered = applyMarketFilters(enriched, params);\n\n traceData = { success: true };\n return filtered;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : PERPS_ERROR_CODES.MARKETS_FAILED;\n\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getMarketDataWithPrices'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n params,\n },\n },\n },\n );\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.GetMarketDataWithPrices,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Get available DEXs (HIP-3 support required)\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getAvailableDexs(options: {\n provider: PerpsProvider;\n params?: GetAvailableDexsParams;\n context: ServiceContext;\n }): Promise<string[]> {\n const { provider, params } = options;\n\n try {\n if (!provider.getAvailableDexs) {\n throw new Error('Provider does not support HIP-3 DEXs');\n }\n\n return await provider.getAvailableDexs(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getAvailableDexs'),\n {\n context: {\n name: 'MarketDataService.getAvailableDexs',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Fetch historical candle data for charting\n * Handles full orchestration: tracing, error logging, state management, and provider delegation\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.symbol - The trading pair symbol.\n * @param options.interval - The candle interval period.\n * @param options.limit - Maximum number of items to fetch.\n * @param options.endTime - End timestamp in milliseconds.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async fetchHistoricalCandles(options: {\n provider: PerpsProvider;\n symbol: string;\n interval: CandlePeriod;\n limit?: number;\n endTime?: number;\n context: ServiceContext;\n }): Promise<CandleData> {\n const {\n provider,\n symbol,\n interval,\n limit = 100,\n endTime,\n context,\n } = options;\n const traceId = uuidv4();\n let traceData: { success: boolean; error?: string } | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.FetchHistoricalCandles,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: context.tracingContext.provider,\n isTestnet: String(context.tracingContext.isTestnet),\n symbol,\n interval,\n },\n });\n\n if (!provider.fetchHistoricalCandles) {\n throw new Error('Historical candles not supported by provider');\n }\n\n const result = await provider.fetchHistoricalCandles({\n symbol,\n interval,\n limit,\n endTime,\n });\n\n traceData = { success: true };\n return result;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to fetch historical candles';\n\n // Expected cancellation — skip Sentry and state updates\n if (!isAbortError(error)) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.fetchHistoricalCandles'),\n {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: context.errorContext.controller,\n data: {\n method: context.errorContext.method,\n symbol,\n interval,\n limit,\n endTime,\n },\n },\n },\n );\n\n // Update error state (if stateManager is provided)\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastError = errorMessage;\n state.lastUpdateTimestamp = Date.now();\n });\n }\n }\n\n traceData = {\n success: false,\n error: errorMessage,\n };\n\n throw error;\n } finally {\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FetchHistoricalCandles,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Calculate liquidation price for a position\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async calculateLiquidationPrice(options: {\n provider: PerpsProvider;\n params: LiquidationPriceParams;\n context: ServiceContext;\n }): Promise<string> {\n const { provider, params } = options;\n\n try {\n return await provider.calculateLiquidationPrice(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.calculateLiquidationPrice'),\n {\n context: {\n name: 'MarketDataService.calculateLiquidationPrice',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Calculate maintenance margin for a position\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async calculateMaintenanceMargin(options: {\n provider: PerpsProvider;\n params: MaintenanceMarginParams;\n context: ServiceContext;\n }): Promise<number> {\n const { provider, params } = options;\n\n try {\n return await provider.calculateMaintenanceMargin(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.calculateMaintenanceMargin'),\n {\n context: {\n name: 'MarketDataService.calculateMaintenanceMargin',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Get maximum leverage for an asset\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.asset - The asset identifier.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async getMaxLeverage(options: {\n provider: PerpsProvider;\n asset: string;\n context: ServiceContext;\n }): Promise<number> {\n const { provider, asset } = options;\n\n try {\n return await provider.getMaxLeverage(asset);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.getMaxLeverage'),\n {\n context: {\n name: 'MarketDataService.getMaxLeverage',\n data: { asset },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Calculate fees for an order\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async calculateFees(options: {\n provider: PerpsProvider;\n params: FeeCalculationParams;\n context: ServiceContext;\n }): Promise<FeeCalculationResult> {\n const { provider, params } = options;\n\n try {\n return await provider.calculateFees(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.calculateFees'),\n {\n context: {\n name: 'MarketDataService.calculateFees',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Validate an order before placement\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async validateOrder(options: {\n provider: PerpsProvider;\n params: OrderParams;\n context: ServiceContext;\n }): Promise<{ isValid: boolean; error?: string }> {\n const { provider, params } = options;\n\n try {\n return await provider.validateOrder(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.validateOrder'),\n {\n context: {\n name: 'MarketDataService.validateOrder',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Validate a position close request\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async validateClosePosition(options: {\n provider: PerpsProvider;\n params: ClosePositionParams;\n context: ServiceContext;\n }): Promise<{ isValid: boolean; error?: string }> {\n const { provider, params } = options;\n\n try {\n return await provider.validateClosePosition(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.validateClosePosition'),\n {\n context: {\n name: 'MarketDataService.validateClosePosition',\n data: { params },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Get supported withdrawal routes (synchronous)\n * Note: This method doesn't log errors to avoid needing context for a synchronous getter\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @returns The result of the operation.\n */\n getWithdrawalRoutes(options: { provider: PerpsProvider }): AssetRoute[] {\n const { provider } = options;\n\n try {\n return provider.getWithdrawalRoutes();\n } catch {\n // Silent fail - withdrawal routes are not critical\n return [];\n }\n }\n\n /**\n * Get block explorer URL (synchronous)\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.address - The wallet address.\n * @returns The result of the operation.\n */\n getBlockExplorerUrl(options: {\n provider: PerpsProvider;\n address?: string;\n }): string {\n const { provider, address } = options;\n return provider.getBlockExplorerUrl(address);\n }\n\n /**\n * Merge Terminal API metadata into provider-sourced PerpsMarketData.\n * For each market, if the terminal metadata map contains an entry for its\n * symbol, override name/marketType and attach keywords/tags/categories.\n * Unmatched markets keep their provider-sourced values.\n *\n * @param markets - Markets from the provider.\n * @param metadata - Per-symbol metadata from the Terminal API.\n * @returns Enriched market data array.\n */\n #enrichWithTerminalMetadata(\n markets: PerpsMarketData[],\n metadata: Map<string, TerminalAssetMetadata>,\n ): PerpsMarketData[] {\n return markets.map((market) => {\n const meta = metadata.get(market.symbol);\n if (!meta) {\n return market;\n }\n\n return {\n ...market,\n name: meta.name,\n ...(meta.marketType !== undefined && { marketType: meta.marketType }),\n ...(meta.keywords !== undefined && { keywords: meta.keywords }),\n ...(meta.tags !== undefined && { tags: meta.tags }),\n ...(meta.categories !== undefined && { categories: meta.categories }),\n };\n });\n }\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import type { CandlePeriod } from "../constants/chartConfig.cjs";
|
|
|
2
2
|
import type { PerpsProvider, Position, GetPositionsParams, AccountState, GetAccountStateParams, HistoricalPortfolioResult, GetHistoricalPortfolioParams, OrderFill, GetOrderFillsParams, Funding, GetFundingParams, Order, GetOrdersParams, MarketInfo, GetMarketDataWithPricesParams, GetMarketsParams, GetAvailableDexsParams, LiquidationPriceParams, MaintenanceMarginParams, FeeCalculationParams, FeeCalculationResult, OrderParams, ClosePositionParams, AssetRoute, PerpsPlatformDependencies, PerpsMarketData } from "../types/index.cjs";
|
|
3
3
|
import type { CandleData } from "../types/perps-types.cjs";
|
|
4
4
|
import type { ServiceContext } from "./ServiceContext.cjs";
|
|
5
|
+
import type { TerminalMarketService } from "./TerminalMarketService.cjs";
|
|
5
6
|
/**
|
|
6
7
|
* MarketDataService
|
|
7
8
|
*
|
|
@@ -17,8 +18,10 @@ export declare class MarketDataService {
|
|
|
17
18
|
* Create a new MarketDataService instance
|
|
18
19
|
*
|
|
19
20
|
* @param deps - Platform dependencies for logging, metrics, etc.
|
|
21
|
+
* @param terminalMarketService - Optional terminal market service for
|
|
22
|
+
* fetching market data from the Terminal API.
|
|
20
23
|
*/
|
|
21
|
-
constructor(deps: PerpsPlatformDependencies);
|
|
24
|
+
constructor(deps: PerpsPlatformDependencies, terminalMarketService?: TerminalMarketService);
|
|
22
25
|
/**
|
|
23
26
|
* Get current positions
|
|
24
27
|
* Handles full orchestration: tracing, error logging, state management, and provider delegation
|
|
@@ -145,33 +148,41 @@ export declare class MarketDataService {
|
|
|
145
148
|
}): Promise<HistoricalPortfolioResult>;
|
|
146
149
|
/**
|
|
147
150
|
* Get available markets
|
|
148
|
-
* Handles full orchestration: tracing, error logging, state management, and provider delegation
|
|
151
|
+
* Handles full orchestration: tracing, error logging, state management, and provider delegation.
|
|
152
|
+
* When `useTerminalApi` is true, attempts the Terminal API first; on failure or empty
|
|
153
|
+
* response, falls back silently to the HyperLiquid provider path.
|
|
149
154
|
*
|
|
150
155
|
* @param options - The configuration options.
|
|
151
156
|
* @param options.provider - The perps provider instance.
|
|
152
157
|
* @param options.params - The operation parameters.
|
|
153
158
|
* @param options.context - The service context for dependencies.
|
|
159
|
+
* @param options.useTerminalApi - When true, attempt Terminal API before provider.
|
|
154
160
|
* @returns The result of the operation.
|
|
155
161
|
*/
|
|
156
162
|
getMarkets(options: {
|
|
157
163
|
provider: PerpsProvider;
|
|
158
164
|
params?: GetMarketsParams;
|
|
159
165
|
context: ServiceContext;
|
|
166
|
+
useTerminalApi?: boolean;
|
|
160
167
|
}): Promise<MarketInfo[]>;
|
|
161
168
|
/**
|
|
162
169
|
* Get market data with prices (includes price, volume, 24h change).
|
|
163
170
|
* Applies optional category filtering, sorting, and limit after fetching.
|
|
171
|
+
* When `useTerminalApi` is true, enriches provider data with Terminal API metadata
|
|
172
|
+
* (name, keywords, tags, categories). On Terminal API failure, falls back silently.
|
|
164
173
|
*
|
|
165
174
|
* @param options - The configuration options.
|
|
166
175
|
* @param options.provider - The perps provider instance.
|
|
167
176
|
* @param options.params - Optional filter/sort/limit params.
|
|
168
177
|
* @param options.context - The service context for dependencies.
|
|
178
|
+
* @param options.useTerminalApi - When true, enrich with Terminal API metadata.
|
|
169
179
|
* @returns The result of the operation.
|
|
170
180
|
*/
|
|
171
181
|
getMarketDataWithPrices(options: {
|
|
172
182
|
provider: PerpsProvider;
|
|
173
183
|
params?: GetMarketDataWithPricesParams;
|
|
174
184
|
context: ServiceContext;
|
|
185
|
+
useTerminalApi?: boolean;
|
|
175
186
|
}): Promise<PerpsMarketData[]>;
|
|
176
187
|
/**
|
|
177
188
|
* Get available DEXs (HIP-3 support required)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketDataService.d.cts","sourceRoot":"","sources":["../../src/services/MarketDataService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAiC;AAK7D,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,EAC5B,SAAS,EACT,mBAAmB,EACnB,OAAO,EACP,gBAAgB,EAChB,KAAK,EACL,eAAe,EACf,UAAU,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,yBAAyB,EACzB,eAAe,EAChB,2BAAiB;AAClB,OAAO,KAAK,EAAE,UAAU,EAAE,iCAA6B;AAIvD,OAAO,KAAK,EAAE,cAAc,EAAE,6BAAyB;
|
|
1
|
+
{"version":3,"file":"MarketDataService.d.cts","sourceRoot":"","sources":["../../src/services/MarketDataService.ts"],"names":[],"mappings":"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"}
|