@metamask-previews/perps-controller 17.3.0-preview-d3f9964be → 17.4.0-preview-aecbce4ff
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 +72 -1
- package/dist/PerpsController-method-action-types.d.ts +10 -3
- package/dist/PerpsController-method-action-types.d.ts.map +1 -1
- package/dist/PerpsController-method-action-types.js.map +1 -1
- package/dist/PerpsController.d.ts +10 -3
- package/dist/PerpsController.d.ts.map +1 -1
- package/dist/PerpsController.js +62 -8
- package/dist/PerpsController.js.map +1 -1
- package/dist/constants/perpsConfig.d.ts +55 -0
- package/dist/constants/perpsConfig.d.ts.map +1 -1
- package/dist/constants/perpsConfig.js +55 -0
- package/dist/constants/perpsConfig.js.map +1 -1
- package/dist/providers/AggregatedPerpsProvider.d.ts +19 -0
- package/dist/providers/AggregatedPerpsProvider.d.ts.map +1 -1
- package/dist/providers/AggregatedPerpsProvider.js +21 -0
- package/dist/providers/AggregatedPerpsProvider.js.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.ts +7 -0
- package/dist/providers/HyperLiquidProvider.d.ts.map +1 -1
- package/dist/providers/HyperLiquidProvider.js +133 -34
- package/dist/providers/HyperLiquidProvider.js.map +1 -1
- package/dist/providers/LighterProvider.d.ts.map +1 -1
- package/dist/providers/LighterProvider.js +2 -0
- package/dist/providers/LighterProvider.js.map +1 -1
- package/dist/services/MarketDataService.d.ts.map +1 -1
- package/dist/services/MarketDataService.js +16 -4
- package/dist/services/MarketDataService.js.map +1 -1
- package/dist/services/RewardsIntegrationService.d.ts +47 -2
- package/dist/services/RewardsIntegrationService.d.ts.map +1 -1
- package/dist/services/RewardsIntegrationService.js +400 -19
- package/dist/services/RewardsIntegrationService.js.map +1 -1
- package/dist/services/ServiceContext.d.ts +9 -1
- package/dist/services/ServiceContext.d.ts.map +1 -1
- package/dist/services/ServiceContext.js.map +1 -1
- package/dist/services/TerminalMarketService.d.ts +1 -1
- package/dist/services/TerminalMarketService.d.ts.map +1 -1
- package/dist/services/TerminalMarketService.js +11 -2
- package/dist/services/TerminalMarketService.js.map +1 -1
- package/dist/services/TradingService.d.ts.map +1 -1
- package/dist/services/TradingService.js +291 -18
- package/dist/services/TradingService.js.map +1 -1
- package/dist/types/index.d.ts +65 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/messenger.d.ts +17 -1
- package/dist/types/messenger.d.ts.map +1 -1
- package/dist/types/messenger.js.map +1 -1
- package/dist/utils/hyperLiquidAdapter.d.ts +7 -0
- package/dist/utils/hyperLiquidAdapter.d.ts.map +1 -1
- package/dist/utils/hyperLiquidAdapter.js +1 -1
- package/dist/utils/hyperLiquidAdapter.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/subscriptionFeeWaiver.d.ts +201 -0
- package/dist/utils/subscriptionFeeWaiver.d.ts.map +1 -0
- package/dist/utils/subscriptionFeeWaiver.js +334 -0
- package/dist/utils/subscriptionFeeWaiver.js.map +1 -0
- package/package.json +11 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketDataService.d.ts","sourceRoot":"","sources":["../../src/services/MarketDataService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,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,2BAA2B,EAC3B,2BAA2B,EAC3B,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EAElB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"MarketDataService.d.ts","sourceRoot":"","sources":["../../src/services/MarketDataService.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { PerpsTraceNames, PerpsTraceOperations } from '../types/index.js';
|
|
|
6
6
|
import { coalescePerpsRestRequest } from '../utils/coalescePerpsRestRequest.js';
|
|
7
7
|
import { ensureError, isAbortError } from '../utils/errorUtils.js';
|
|
8
8
|
import { applyMarketFilters } from '../utils/marketUtils.js';
|
|
9
|
+
import { applyFeeResolution } from '../utils/subscriptionFeeWaiver.js';
|
|
9
10
|
/**
|
|
10
11
|
* MarketDataService
|
|
11
12
|
*
|
|
@@ -1035,12 +1036,23 @@ export class MarketDataService {
|
|
|
1035
1036
|
const { provider, params, context } = options;
|
|
1036
1037
|
try {
|
|
1037
1038
|
const fees = await provider.calculateFees(params);
|
|
1039
|
+
// Re-price the MetaMask component from the unified resolution, which the
|
|
1040
|
+
// controller computed against this quote's own order notional. The
|
|
1041
|
+
// provider only knows the discount the last submit pushed into it, so
|
|
1042
|
+
// without this a partial subscription blend would be quoted at a rate the
|
|
1043
|
+
// order does not actually pay.
|
|
1044
|
+
const priced = applyFeeResolution({
|
|
1045
|
+
fees,
|
|
1046
|
+
resolution: context.feeResolution,
|
|
1047
|
+
amount: params.amount,
|
|
1048
|
+
chargesBuilderFee: fees.chargesMetamaskBuilderFee,
|
|
1049
|
+
});
|
|
1038
1050
|
// Read-only preview of the same cached benefits snapshot the fee resolver
|
|
1039
|
-
// reads.
|
|
1040
|
-
// the
|
|
1051
|
+
// reads. Surfacing eligibility and the remaining notional must not mutate
|
|
1052
|
+
// the cap or the cache.
|
|
1041
1053
|
return context.subscriptionFeeWaiver
|
|
1042
|
-
? { ...
|
|
1043
|
-
:
|
|
1054
|
+
? { ...priced, subscription: context.subscriptionFeeWaiver }
|
|
1055
|
+
: priced;
|
|
1044
1056
|
}
|
|
1045
1057
|
catch (error) {
|
|
1046
1058
|
this.#deps.logger.error(ensureError(error, 'MarketDataService.calculateFees'), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketDataService.js","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.js';\nimport { PerpsMeasurementName } from '../constants/performanceMetrics.js';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig.js';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes.js';\nimport { PerpsTraceNames, PerpsTraceOperations } from '../types/index.js';\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 PositionModifyPreviewParams,\n PositionModifyPreviewResult,\n FeeCalculationParams,\n FeeCalculationResult,\n OrderParams,\n ClosePositionParams,\n AssetRoute,\n PerpsPlatformDependencies,\n PerpsMarketData,\n PerpsProviderType,\n TerminalAssetMetadata,\n} from '../types/index.js';\nimport type { CandleData } from '../types/perps-types.js';\nimport { coalescePerpsRestRequest } from '../utils/coalescePerpsRestRequest.js';\nimport { ensureError, isAbortError } from '../utils/errorUtils.js';\nimport { applyMarketFilters } from '../utils/marketUtils.js';\nimport type { ServiceContext } from './ServiceContext.js';\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 * When `useTerminalApi` is true, attempts the Terminal API first; on failure or empty\n * response, falls back silently to the 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.isMarketAllowed - Optional filter callback applied to\n * Terminal API results so that allowlist/blocklist rules from the provider\n * layer are enforced even when the provider is bypassed. Skipped when\n * `params.skipFilters` is true.\n * @returns The result of the operation.\n */\n async getMarkets(options: {\n provider: PerpsProvider;\n params?: GetMarketsParams;\n context: ServiceContext;\n isMarketAllowed?: (symbol: string) => boolean;\n }): Promise<MarketInfo[]> {\n const { provider, params, context, isMarketAllowed } = options;\n // The Terminal API describes HYPERLIQUID markets only: serving its\n // metadata (minimums, leverage caps) while another venue is active\n // would hand the UI the wrong venue's trading rules — found on\n // device as a Lighter order form defaulting below the venue floor.\n const useTerminalApi =\n params?.useTerminalApi && provider.protocolId === 'hyperliquid';\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.#deps.terminalMarketService) {\n try {\n const { markets: terminalMarkets } =\n await this.#deps.terminalMarketService.fetchMarkets();\n if (terminalMarkets.length > 0) {\n let filtered = terminalMarkets;\n\n // Apply allowlist/blocklist filtering (same as provider path)\n if (!params?.skipFilters && isMarketAllowed) {\n filtered = filtered.filter((market) =>\n isMarketAllowed(market.name),\n );\n }\n\n // Filter by specific DEX when requested\n if (params?.dex !== undefined) {\n const dexPrefix = params.dex ? `${params.dex}:` : '';\n filtered = filtered.filter((market) =>\n dexPrefix\n ? market.name.startsWith(dexPrefix)\n : !market.name.includes(':'),\n );\n }\n\n // Filter by symbols when requested\n if (params?.symbols?.length) {\n filtered = filtered.filter((market) =>\n (params.symbols as string[]).some(\n (sym) => market.name.toLowerCase() === sym.toLowerCase(),\n ),\n );\n }\n\n // Fall back to provider when a constrained query (symbols or dex)\n // yields no matches — Terminal partial coverage should not hide\n // valid provider-backed markets.\n const isConstrainedQuery =\n (params?.symbols?.length ?? 0) > 0 || params?.dex !== undefined;\n if (filtered.length === 0 && isConstrainedQuery) {\n // Let execution continue to the provider path below.\n } else {\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 filtered;\n }\n }\n } catch (terminalError) {\n this.#deps.terminalMarketService.logError(\n terminalError,\n 'getMarkets',\n );\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 * An explicitly configured global snapshot is the preferred complete source.\n * `useTerminalApi` controls only legacy metadata enrichment of provider data.\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 { globalSnapshot } = context;\n // Legacy Terminal metadata is HyperLiquid-specific. Aggregated and\n // direct non-HyperLiquid results must retain their own venue metadata.\n const useTerminalApi =\n params?.useTerminalApi && provider.protocolId === 'hyperliquid';\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 // Prefer a separately configured atomic snapshot only for an exact,\n // still-current provider/network/DEX identity. A rejected snapshot has\n // one lexical fallback to the provider below and is not followed by a\n // second legacy Terminal request.\n let snapshotAttempted = false;\n if (\n globalSnapshot &&\n this.#deps.terminalMarketService?.fetchGlobalSnapshot\n ) {\n snapshotAttempted = true;\n if (!globalSnapshot.isCurrent()) {\n throw new Error('Terminal global snapshot context changed');\n }\n try {\n const snapshot =\n await this.#deps.terminalMarketService.fetchGlobalSnapshot(\n globalSnapshot.request,\n );\n if (!globalSnapshot.isCurrent()) {\n throw new Error('Terminal global snapshot context changed');\n }\n if (Date.now() >= snapshot.expiresAt) {\n throw new Error('Terminal global snapshot expired');\n }\n if (snapshot.markets.length > 0) {\n traceData = { success: true };\n const allowedMarkets = snapshot.markets.filter((market) =>\n globalSnapshot.isMarketAllowed(market.symbol),\n );\n return applyMarketFilters(allowedMarkets, params);\n }\n } catch (snapshotError) {\n if (!globalSnapshot.isCurrent()) {\n throw new Error('Terminal global snapshot context changed');\n }\n this.#deps.terminalMarketService.logError(\n snapshotError,\n 'getMarketDataWithPrices.globalSnapshot',\n );\n }\n }\n\n // Fetch Terminal API metadata before 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 (\n !snapshotAttempted &&\n useTerminalApi &&\n this.#deps.terminalMarketService\n ) {\n try {\n const result = await this.#deps.terminalMarketService.fetchMarkets();\n if (result.metadata.size > 0) {\n terminalMetadata = result.metadata;\n }\n } catch (terminalError) {\n this.#deps.terminalMarketService.logError(\n terminalError,\n 'getMarketDataWithPrices',\n );\n }\n }\n\n const markets = await provider.getMarketDataWithPrices();\n if (snapshotAttempted && globalSnapshot && !globalSnapshot.isCurrent()) {\n throw new Error('Terminal global snapshot context changed');\n }\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 * Project the position that would remain after a proposed order.\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - Live position plus the proposed order.\n * @param options.context - The service context for dependencies.\n * @returns Discriminated preview of the resulting position.\n */\n async previewPositionModify(options: {\n provider: PerpsProvider;\n params: PositionModifyPreviewParams;\n context: ServiceContext;\n }): Promise<PositionModifyPreviewResult> {\n const { provider, params } = options;\n\n try {\n return await provider.previewPositionModify(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.previewPositionModify'),\n {\n context: {\n name: 'MarketDataService.previewPositionModify',\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.providerId - Optional route for an aggregated provider.\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 providerId?: PerpsProviderType;\n context: ServiceContext;\n }): Promise<number> {\n const { provider, asset, providerId } = options;\n\n try {\n return providerId === undefined\n ? await provider.getMaxLeverage(asset)\n : await provider.getMaxLeverage(asset, providerId);\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, context } = options;\n\n try {\n const fees = await provider.calculateFees(params);\n\n // Read-only preview of the same cached benefits snapshot the fee resolver\n // reads. The quoted rates are left untouched: surfacing eligibility and\n // the remaining notional must not mutate the cap or the cache.\n return context.subscriptionFeeWaiver\n ? { ...fees, subscription: context.subscriptionFeeWaiver }\n : fees;\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/description/marketType and attach\n * keywords/tags/categories. Unmatched markets keep their provider-sourced\n * 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 ...(meta.name !== undefined && { name: meta.name }),\n ...(meta.description !== undefined && {\n description: meta.description,\n }),\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 ...(meta.listedAt !== undefined && { listedAt: meta.listedAt }),\n };\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MarketDataService.js","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.js';\nimport { PerpsMeasurementName } from '../constants/performanceMetrics.js';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig.js';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes.js';\nimport { PerpsTraceNames, PerpsTraceOperations } from '../types/index.js';\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 PositionModifyPreviewParams,\n PositionModifyPreviewResult,\n FeeCalculationParams,\n FeeCalculationResult,\n OrderParams,\n ClosePositionParams,\n AssetRoute,\n PerpsPlatformDependencies,\n PerpsMarketData,\n PerpsProviderType,\n TerminalAssetMetadata,\n} from '../types/index.js';\nimport type { CandleData } from '../types/perps-types.js';\nimport { coalescePerpsRestRequest } from '../utils/coalescePerpsRestRequest.js';\nimport { ensureError, isAbortError } from '../utils/errorUtils.js';\nimport { applyMarketFilters } from '../utils/marketUtils.js';\nimport { applyFeeResolution } from '../utils/subscriptionFeeWaiver.js';\nimport type { ServiceContext } from './ServiceContext.js';\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 * When `useTerminalApi` is true, attempts the Terminal API first; on failure or empty\n * response, falls back silently to the 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.isMarketAllowed - Optional filter callback applied to\n * Terminal API results so that allowlist/blocklist rules from the provider\n * layer are enforced even when the provider is bypassed. Skipped when\n * `params.skipFilters` is true.\n * @returns The result of the operation.\n */\n async getMarkets(options: {\n provider: PerpsProvider;\n params?: GetMarketsParams;\n context: ServiceContext;\n isMarketAllowed?: (symbol: string) => boolean;\n }): Promise<MarketInfo[]> {\n const { provider, params, context, isMarketAllowed } = options;\n // The Terminal API describes HYPERLIQUID markets only: serving its\n // metadata (minimums, leverage caps) while another venue is active\n // would hand the UI the wrong venue's trading rules — found on\n // device as a Lighter order form defaulting below the venue floor.\n const useTerminalApi =\n params?.useTerminalApi && provider.protocolId === 'hyperliquid';\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.#deps.terminalMarketService) {\n try {\n const { markets: terminalMarkets } =\n await this.#deps.terminalMarketService.fetchMarkets();\n if (terminalMarkets.length > 0) {\n let filtered = terminalMarkets;\n\n // Apply allowlist/blocklist filtering (same as provider path)\n if (!params?.skipFilters && isMarketAllowed) {\n filtered = filtered.filter((market) =>\n isMarketAllowed(market.name),\n );\n }\n\n // Filter by specific DEX when requested\n if (params?.dex !== undefined) {\n const dexPrefix = params.dex ? `${params.dex}:` : '';\n filtered = filtered.filter((market) =>\n dexPrefix\n ? market.name.startsWith(dexPrefix)\n : !market.name.includes(':'),\n );\n }\n\n // Filter by symbols when requested\n if (params?.symbols?.length) {\n filtered = filtered.filter((market) =>\n (params.symbols as string[]).some(\n (sym) => market.name.toLowerCase() === sym.toLowerCase(),\n ),\n );\n }\n\n // Fall back to provider when a constrained query (symbols or dex)\n // yields no matches — Terminal partial coverage should not hide\n // valid provider-backed markets.\n const isConstrainedQuery =\n (params?.symbols?.length ?? 0) > 0 || params?.dex !== undefined;\n if (filtered.length === 0 && isConstrainedQuery) {\n // Let execution continue to the provider path below.\n } else {\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 filtered;\n }\n }\n } catch (terminalError) {\n this.#deps.terminalMarketService.logError(\n terminalError,\n 'getMarkets',\n );\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 * An explicitly configured global snapshot is the preferred complete source.\n * `useTerminalApi` controls only legacy metadata enrichment of provider data.\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 { globalSnapshot } = context;\n // Legacy Terminal metadata is HyperLiquid-specific. Aggregated and\n // direct non-HyperLiquid results must retain their own venue metadata.\n const useTerminalApi =\n params?.useTerminalApi && provider.protocolId === 'hyperliquid';\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 // Prefer a separately configured atomic snapshot only for an exact,\n // still-current provider/network/DEX identity. A rejected snapshot has\n // one lexical fallback to the provider below and is not followed by a\n // second legacy Terminal request.\n let snapshotAttempted = false;\n if (\n globalSnapshot &&\n this.#deps.terminalMarketService?.fetchGlobalSnapshot\n ) {\n snapshotAttempted = true;\n if (!globalSnapshot.isCurrent()) {\n throw new Error('Terminal global snapshot context changed');\n }\n try {\n const snapshot =\n await this.#deps.terminalMarketService.fetchGlobalSnapshot(\n globalSnapshot.request,\n );\n if (!globalSnapshot.isCurrent()) {\n throw new Error('Terminal global snapshot context changed');\n }\n if (Date.now() >= snapshot.expiresAt) {\n throw new Error('Terminal global snapshot expired');\n }\n if (snapshot.markets.length > 0) {\n traceData = { success: true };\n const allowedMarkets = snapshot.markets.filter((market) =>\n globalSnapshot.isMarketAllowed(market.symbol),\n );\n return applyMarketFilters(allowedMarkets, params);\n }\n } catch (snapshotError) {\n if (!globalSnapshot.isCurrent()) {\n throw new Error('Terminal global snapshot context changed');\n }\n this.#deps.terminalMarketService.logError(\n snapshotError,\n 'getMarketDataWithPrices.globalSnapshot',\n );\n }\n }\n\n // Fetch Terminal API metadata before 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 (\n !snapshotAttempted &&\n useTerminalApi &&\n this.#deps.terminalMarketService\n ) {\n try {\n const result = await this.#deps.terminalMarketService.fetchMarkets();\n if (result.metadata.size > 0) {\n terminalMetadata = result.metadata;\n }\n } catch (terminalError) {\n this.#deps.terminalMarketService.logError(\n terminalError,\n 'getMarketDataWithPrices',\n );\n }\n }\n\n const markets = await provider.getMarketDataWithPrices();\n if (snapshotAttempted && globalSnapshot && !globalSnapshot.isCurrent()) {\n throw new Error('Terminal global snapshot context changed');\n }\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 * Project the position that would remain after a proposed order.\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.params - Live position plus the proposed order.\n * @param options.context - The service context for dependencies.\n * @returns Discriminated preview of the resulting position.\n */\n async previewPositionModify(options: {\n provider: PerpsProvider;\n params: PositionModifyPreviewParams;\n context: ServiceContext;\n }): Promise<PositionModifyPreviewResult> {\n const { provider, params } = options;\n\n try {\n return await provider.previewPositionModify(params);\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'MarketDataService.previewPositionModify'),\n {\n context: {\n name: 'MarketDataService.previewPositionModify',\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.providerId - Optional route for an aggregated provider.\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 providerId?: PerpsProviderType;\n context: ServiceContext;\n }): Promise<number> {\n const { provider, asset, providerId } = options;\n\n try {\n return providerId === undefined\n ? await provider.getMaxLeverage(asset)\n : await provider.getMaxLeverage(asset, providerId);\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, context } = options;\n\n try {\n const fees = await provider.calculateFees(params);\n\n // Re-price the MetaMask component from the unified resolution, which the\n // controller computed against this quote's own order notional. The\n // provider only knows the discount the last submit pushed into it, so\n // without this a partial subscription blend would be quoted at a rate the\n // order does not actually pay.\n const priced = applyFeeResolution({\n fees,\n resolution: context.feeResolution,\n amount: params.amount,\n chargesBuilderFee: fees.chargesMetamaskBuilderFee,\n });\n\n // Read-only preview of the same cached benefits snapshot the fee resolver\n // reads. Surfacing eligibility and the remaining notional must not mutate\n // the cap or the cache.\n return context.subscriptionFeeWaiver\n ? { ...priced, subscription: context.subscriptionFeeWaiver }\n : priced;\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/description/marketType and attach\n * keywords/tags/categories. Unmatched markets keep their provider-sourced\n * 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 ...(meta.name !== undefined && { name: meta.name }),\n ...(meta.description !== undefined && {\n description: meta.description,\n }),\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 ...(meta.listedAt !== undefined && { listedAt: meta.listedAt }),\n };\n });\n }\n}\n"]}
|
|
@@ -38,9 +38,10 @@ export declare class RewardsIntegrationService {
|
|
|
38
38
|
* Calculate user fee discount from the unified fee resolver.
|
|
39
39
|
* Returns discount in basis points (e.g., 6500 = 65% discount)
|
|
40
40
|
*
|
|
41
|
+
* @param orderNotionalUsd - Order notional (USD), when the caller knows it.
|
|
41
42
|
* @returns The fee discount in basis points, or undefined if no source resolved.
|
|
42
43
|
*/
|
|
43
|
-
calculateUserFeeDiscount(): Promise<number | undefined>;
|
|
44
|
+
calculateUserFeeDiscount(orderNotionalUsd?: number): Promise<number | undefined>;
|
|
44
45
|
/**
|
|
45
46
|
* Resolve the MetaMask builder fee across every source and return the lowest.
|
|
46
47
|
*
|
|
@@ -48,9 +49,22 @@ export declare class RewardsIntegrationService {
|
|
|
48
49
|
* unresolved cached source simply drops out of the comparison, so the worst
|
|
49
50
|
* case is the default fee rather than an error or an over-granted waiver.
|
|
50
51
|
*
|
|
52
|
+
* The subscription source contributes an effective rate rather than a flat
|
|
53
|
+
* zero (ADR 0064): the allowance may cover only part of the order, and the
|
|
54
|
+
* blend that results has to be able to lose to a deeper VIP or season
|
|
55
|
+
* discount. Passing the order notional is what makes that blend possible.
|
|
56
|
+
*
|
|
57
|
+
* Without a notional the outcome depends on whether the backend bounded the
|
|
58
|
+
* allowance. An unbounded allowance still resolves to the full waiver — there
|
|
59
|
+
* is no cap to over-consume. A *bounded* one is withheld entirely rather than
|
|
60
|
+
* quoted as a full waiver, because charging nothing on an order of unknown
|
|
61
|
+
* size would silently spend the cap; such a caller gets the next-lowest
|
|
62
|
+
* source instead.
|
|
63
|
+
*
|
|
64
|
+
* @param orderNotionalUsd - Order notional (USD), when the caller knows it.
|
|
51
65
|
* @returns The winning fee, its source, and the subscription gate outcome.
|
|
52
66
|
*/
|
|
53
|
-
resolveFee(): Promise<PerpsFeeResolution>;
|
|
67
|
+
resolveFee(orderNotionalUsd?: number): Promise<PerpsFeeResolution>;
|
|
54
68
|
/**
|
|
55
69
|
* Read the subscription fee-waiver gate from the cached benefits snapshot.
|
|
56
70
|
*
|
|
@@ -80,5 +94,36 @@ export declare class RewardsIntegrationService {
|
|
|
80
94
|
* waiver is withheld until a preview or lifecycle caller hydrates it.
|
|
81
95
|
*/
|
|
82
96
|
invalidateSubscriptionBenefits(): void;
|
|
97
|
+
/**
|
|
98
|
+
* Register the current HyperLiquid trading address with the subscription
|
|
99
|
+
* profile, so a later fill decoded off the HL fan-out can be attributed.
|
|
100
|
+
*
|
|
101
|
+
* ADR 0064 calls for this at preview time and again whenever the selected
|
|
102
|
+
* account changes. Registration is idempotent backend-side and deliberately
|
|
103
|
+
* never throws: it is observability plumbing, and a failure here must not
|
|
104
|
+
* block a fee preview.
|
|
105
|
+
*
|
|
106
|
+
* New clients may route this through the structural
|
|
107
|
+
* `SubscriptionController:registerAddress` action. Older clients continue to
|
|
108
|
+
* use the injected `subscription` hook as a compatibility fallback.
|
|
109
|
+
*
|
|
110
|
+
* @param address - The EVM trading address to register.
|
|
111
|
+
* @param options - Registration options.
|
|
112
|
+
* @param options.isTestnet - Whether the caller is trading against the
|
|
113
|
+
* HyperLiquid testnet. Selects which HyperLiquid chain the CAIP-10 names;
|
|
114
|
+
* defaults to mainnet.
|
|
115
|
+
* @returns A promise that resolves once the attempt settles.
|
|
116
|
+
*/
|
|
117
|
+
registerTradingAddress(address: string, options?: {
|
|
118
|
+
isTestnet?: boolean;
|
|
119
|
+
}): Promise<void>;
|
|
120
|
+
/**
|
|
121
|
+
* Forget which trading addresses were registered this session.
|
|
122
|
+
*
|
|
123
|
+
* Called when the selected account changes, so the next preview re-sends the
|
|
124
|
+
* registration for the new address rather than assuming the previous one
|
|
125
|
+
* still stands.
|
|
126
|
+
*/
|
|
127
|
+
resetRegisteredTradingAddresses(): void;
|
|
83
128
|
}
|
|
84
129
|
//# sourceMappingURL=RewardsIntegrationService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RewardsIntegrationService.d.ts","sourceRoot":"","sources":["../../src/services/RewardsIntegrationService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RewardsIntegrationService.d.ts","sourceRoot":"","sources":["../../src/services/RewardsIntegrationService.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,kBAAkB,EAElB,yBAAyB,EAEzB,gCAAgC,EACjC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AA2B1E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,yBAAyB;;IA6CpC;;;;;OAKG;IACH,YACE,IAAI,EAAE,yBAAyB,EAC/B,SAAS,EAAE,4BAA4B,EAIxC;IAqBD;;;;;;OAMG;IACG,wBAAwB,CAC5B,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAG7B;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,UAAU,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2FvE;IAED;;;;;;;OAOG;IACH,8BAA8B,IAAI,gCAAgC,CA2BjE;IAuDD;;;;;;;;OAQG;IACG,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCjD;IAED;;;;;;;;OAQG;IACH,8BAA8B,IAAI,IAAI,CAkBrC;IAyID;;;;;;;;;;;;;;;;;;;OAmBG;IACG,sBAAsB,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAChC,OAAO,CAAC,IAAI,CAAC,CAmGf;IAED;;;;;;OAMG;IACH,+BAA+B,IAAI,IAAI,CAEtC;CA8GF"}
|