@metamask-previews/perps-controller 2.0.0-preview-a37be9342 → 2.0.0-preview-26cb9fc
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 +10 -0
- package/dist/PerpsController.cjs.map +1 -1
- package/dist/PerpsController.d.cts.map +1 -1
- package/dist/PerpsController.d.mts.map +1 -1
- package/dist/PerpsController.mjs.map +1 -1
- package/dist/constants/eventNames.cjs +1 -0
- package/dist/constants/eventNames.cjs.map +1 -1
- package/dist/constants/eventNames.d.cts +1 -0
- package/dist/constants/eventNames.d.cts.map +1 -1
- package/dist/constants/eventNames.d.mts +1 -0
- package/dist/constants/eventNames.d.mts.map +1 -1
- package/dist/constants/eventNames.mjs +1 -0
- package/dist/constants/eventNames.mjs.map +1 -1
- package/dist/constants/perpsConfig.cjs +3 -0
- package/dist/constants/perpsConfig.cjs.map +1 -1
- package/dist/constants/perpsConfig.d.cts +1 -0
- package/dist/constants/perpsConfig.d.cts.map +1 -1
- package/dist/constants/perpsConfig.d.mts +1 -0
- package/dist/constants/perpsConfig.d.mts.map +1 -1
- package/dist/constants/perpsConfig.mjs +3 -0
- package/dist/constants/perpsConfig.mjs.map +1 -1
- package/dist/index.cjs +50 -56
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/providers/HyperLiquidProvider.cjs +18 -6
- package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
- package/dist/providers/HyperLiquidProvider.mjs +18 -6
- package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
- package/dist/services/HyperLiquidClientService.cjs +39 -16
- package/dist/services/HyperLiquidClientService.cjs.map +1 -1
- package/dist/services/HyperLiquidClientService.d.cts +2 -0
- package/dist/services/HyperLiquidClientService.d.cts.map +1 -1
- package/dist/services/HyperLiquidClientService.d.mts +2 -0
- package/dist/services/HyperLiquidClientService.d.mts.map +1 -1
- package/dist/services/HyperLiquidClientService.mjs +39 -16
- package/dist/services/HyperLiquidClientService.mjs.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.cjs +78 -13
- package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.mjs +78 -13
- package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -1
- package/dist/services/TradingService.cjs +0 -1
- package/dist/services/TradingService.cjs.map +1 -1
- package/dist/services/TradingService.d.cts.map +1 -1
- package/dist/services/TradingService.d.mts.map +1 -1
- package/dist/services/TradingService.mjs +0 -1
- package/dist/services/TradingService.mjs.map +1 -1
- package/dist/types/index.cjs +3 -2
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.mts.map +1 -1
- package/dist/types/index.mjs +3 -2
- package/dist/types/index.mjs.map +1 -1
- package/dist/types/transactionTypes.cjs +5 -4
- package/dist/types/transactionTypes.cjs.map +1 -1
- package/dist/types/transactionTypes.d.cts +0 -4
- package/dist/types/transactionTypes.d.cts.map +1 -1
- package/dist/types/transactionTypes.d.mts +0 -4
- package/dist/types/transactionTypes.d.mts.map +1 -1
- package/dist/types/transactionTypes.mjs +3 -2
- package/dist/types/transactionTypes.mjs.map +1 -1
- package/dist/utils/errorUtils.cjs +4 -3
- package/dist/utils/errorUtils.cjs.map +1 -1
- package/dist/utils/errorUtils.d.cts +0 -4
- package/dist/utils/errorUtils.d.cts.map +1 -1
- package/dist/utils/errorUtils.d.mts +0 -4
- package/dist/utils/errorUtils.d.mts.map +1 -1
- package/dist/utils/errorUtils.mjs +2 -1
- package/dist/utils/errorUtils.mjs.map +1 -1
- package/dist/utils/hyperLiquidAdapter.cjs +3 -2
- package/dist/utils/hyperLiquidAdapter.cjs.map +1 -1
- package/dist/utils/hyperLiquidAdapter.d.cts.map +1 -1
- package/dist/utils/hyperLiquidAdapter.d.mts.map +1 -1
- package/dist/utils/hyperLiquidAdapter.mjs +4 -3
- package/dist/utils/hyperLiquidAdapter.mjs.map +1 -1
- package/dist/utils/hyperLiquidValidation.cjs +4 -0
- package/dist/utils/hyperLiquidValidation.cjs.map +1 -1
- package/dist/utils/hyperLiquidValidation.d.cts.map +1 -1
- package/dist/utils/hyperLiquidValidation.d.mts.map +1 -1
- package/dist/utils/hyperLiquidValidation.mjs +4 -0
- package/dist/utils/hyperLiquidValidation.mjs.map +1 -1
- package/dist/utils/index.cjs +0 -1
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +0 -1
- package/dist/utils/index.d.cts.map +1 -1
- package/dist/utils/index.d.mts +0 -1
- package/dist/utils/index.d.mts.map +1 -1
- package/dist/utils/index.mjs +0 -1
- package/dist/utils/index.mjs.map +1 -1
- package/dist/utils/marketDataTransform.cjs +2 -1
- package/dist/utils/marketDataTransform.cjs.map +1 -1
- package/dist/utils/marketDataTransform.d.cts.map +1 -1
- package/dist/utils/marketDataTransform.d.mts.map +1 -1
- package/dist/utils/marketDataTransform.mjs +2 -1
- package/dist/utils/marketDataTransform.mjs.map +1 -1
- package/dist/utils/perpsConnectionAttemptContext.cjs +20 -0
- package/dist/utils/perpsConnectionAttemptContext.cjs.map +1 -0
- package/dist/utils/perpsConnectionAttemptContext.d.cts +7 -0
- package/dist/utils/perpsConnectionAttemptContext.d.cts.map +1 -0
- package/dist/utils/perpsConnectionAttemptContext.d.mts +7 -0
- package/dist/utils/perpsConnectionAttemptContext.d.mts.map +1 -0
- package/dist/utils/perpsConnectionAttemptContext.mjs +15 -0
- package/dist/utils/perpsConnectionAttemptContext.mjs.map +1 -0
- package/package.json +4 -2
|
@@ -689,7 +689,6 @@ class TradingService {
|
|
|
689
689
|
});
|
|
690
690
|
__classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('[closePositions] Batch method check', {
|
|
691
691
|
providerType: provider.protocolId,
|
|
692
|
-
hasBatchMethod: 'closePositions' in provider,
|
|
693
692
|
providerKeys: Object.keys(provider).filter((key) => key.includes('close')),
|
|
694
693
|
});
|
|
695
694
|
// Use batch close if provider supports it (provider handles filtering)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TradingService.cjs","sourceRoot":"","sources":["../../src/services/TradingService.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as uuidv4 } from 'uuid';\n\nimport type { RewardsIntegrationService } from './RewardsIntegrationService';\nimport type { ServiceContext } from './ServiceContext';\nimport {\n PERPS_EVENT_PROPERTY,\n PERPS_EVENT_VALUE,\n} from '../constants/eventNames';\nimport { ESTIMATED_FEE_RATE } from '../constants/hyperLiquidConfig';\nimport { isTPSLOrder } from '../constants/orderTypes';\nimport { PerpsMeasurementName } from '../constants/performanceMetrics';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport {\n PerpsAnalyticsEvent,\n PerpsTraceNames,\n PerpsTraceOperations,\n} from '../types';\nimport type {\n PerpsProvider,\n OrderParams,\n OrderResult,\n EditOrderParams,\n CancelOrderParams,\n CancelOrderResult,\n CancelOrdersParams,\n CancelOrdersResult,\n ClosePositionParams,\n ClosePositionsParams,\n ClosePositionsResult,\n Position,\n UpdatePositionTPSLParams,\n PerpsAnalyticsProperties,\n PerpsPlatformDependencies,\n} from '../types';\nimport { ensureError } from '../utils/errorUtils';\n\n/**\n * Controller-level dependencies for TradingService.\n * These are singletons that don't change per-call, injected once via setControllerDependencies().\n */\nexport type TradingServiceControllerDeps = {\n rewardsIntegrationService: RewardsIntegrationService;\n};\n\n/**\n * TradingService\n *\n * Handles trading operations with fee discount management.\n * Controller is responsible for analytics, state management, and tracing.\n *\n * Instance-based service with constructor injection of platform dependencies.\n * Controller-level dependencies (RewardsController, NetworkController, etc.)\n * are injected via setControllerDependencies() after construction.\n */\nexport class TradingService {\n /**\n * Platform dependencies for logging, metrics, etc.\n */\n readonly #deps: PerpsPlatformDependencies;\n\n /**\n * Controller-level dependencies for fee discount calculation.\n * Set via setControllerDependencies() after construction.\n */\n #controllerDeps: TradingServiceControllerDeps | null = null;\n\n /**\n * Create a new TradingService instance\n *\n * @param deps - Platform dependencies for logging, metrics, etc.\n */\n constructor(deps: PerpsPlatformDependencies) {\n this.#deps = deps;\n }\n\n /**\n * Set controller-level dependencies for fee discount calculation.\n * Called by PerpsController after construction to inject singleton dependencies.\n *\n * @param controllerDeps - Controller-level dependencies (RewardsController, etc.)\n */\n setControllerDependencies(\n controllerDeps: TradingServiceControllerDeps,\n ): void {\n this.#controllerDeps = controllerDeps;\n }\n\n /**\n * Error context helper for consistent logging\n *\n * @param method - The method name.\n * @param additionalContext - The additional context value.\n * @returns The resulting string value.\n */\n #getErrorContext(\n method: string,\n additionalContext?: Record<string, unknown>,\n ): Record<string, unknown> {\n return {\n controller: 'TradingService',\n method,\n ...additionalContext,\n };\n }\n\n /**\n * Track order result analytics event (success or failure)\n *\n * @param options - The configuration options.\n * @param options.result - The transaction result to check.\n * @param options.error - The error that occurred.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.duration - Optional time duration.\n */\n #trackOrderResult(options: {\n result: OrderResult | null;\n error?: Error;\n params: OrderParams;\n context: ServiceContext;\n duration: number;\n }): void {\n const { result, error, params, duration } = options;\n\n const status =\n result?.success === true\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED;\n\n // Build base properties\n const properties: PerpsAnalyticsProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]: status,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: params.isBuy\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.orderType,\n [PERPS_EVENT_PROPERTY.LEVERAGE]: parseFloat(String(params.leverage ?? 1)),\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: parseFloat(\n result?.filledSize ?? params.size,\n ),\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,\n };\n\n // Add optional properties\n if (params.trackingData?.marginUsed !== undefined) {\n properties[PERPS_EVENT_PROPERTY.MARGIN_USED] =\n params.trackingData.marginUsed;\n }\n if (params.trackingData?.totalFee !== undefined) {\n properties[PERPS_EVENT_PROPERTY.FEES] = params.trackingData.totalFee;\n }\n if (result?.averagePrice ?? params.trackingData?.marketPrice) {\n properties[PERPS_EVENT_PROPERTY.ASSET_PRICE] = result?.averagePrice\n ? parseFloat(result.averagePrice)\n : params.trackingData?.marketPrice;\n }\n if (params.orderType === 'limit' && params.price) {\n properties[PERPS_EVENT_PROPERTY.LIMIT_PRICE] = parseFloat(params.price);\n }\n if (params.trackingData?.source) {\n properties[PERPS_EVENT_PROPERTY.SOURCE] = params.trackingData.source;\n }\n if (params.trackingData?.tradeAction) {\n properties[PERPS_EVENT_PROPERTY.ACTION] = params.trackingData.tradeAction;\n }\n // Pay with any token: trade_with_token (boolean); when true, include mm_pay_token_selected and mm_pay_network_selected; when false (Perps balance), include mm_pay_token_selected: \"Perps Balance\"\n properties[PERPS_EVENT_PROPERTY.TRADE_WITH_TOKEN] =\n params.trackingData?.tradeWithToken === true;\n if (params.trackingData?.tradeWithToken === true) {\n if (params.trackingData.mmPayTokenSelected !== undefined) {\n properties[PERPS_EVENT_PROPERTY.MM_PAY_TOKEN_SELECTED] =\n params.trackingData.mmPayTokenSelected;\n }\n if (params.trackingData.mmPayNetworkSelected !== undefined) {\n properties[PERPS_EVENT_PROPERTY.MM_PAY_NETWORK_SELECTED] =\n params.trackingData.mmPayNetworkSelected;\n }\n } else if (params.trackingData !== undefined) {\n properties[PERPS_EVENT_PROPERTY.MM_PAY_TOKEN_SELECTED] =\n PERPS_EVENT_VALUE.MM_PAY_TOKEN.PERPS_BALANCE;\n }\n\n // Calculate order value in USD (size * price)\n const orderSize = parseFloat(result?.filledSize ?? params.size);\n const assetPrice = result?.averagePrice\n ? parseFloat(result.averagePrice)\n : params.trackingData?.marketPrice;\n if (assetPrice && orderSize) {\n properties[PERPS_EVENT_PROPERTY.ORDER_VALUE] = orderSize * assetPrice;\n }\n\n // Add success-specific properties\n if (status === PERPS_EVENT_VALUE.STATUS.EXECUTED) {\n if (params.trackingData?.metamaskFee !== undefined) {\n properties[PERPS_EVENT_PROPERTY.METAMASK_FEE] =\n params.trackingData.metamaskFee;\n }\n if (params.trackingData?.metamaskFeeRate !== undefined) {\n properties[PERPS_EVENT_PROPERTY.METAMASK_FEE_RATE] =\n params.trackingData.metamaskFeeRate;\n }\n if (params.trackingData?.feeDiscountPercentage !== undefined) {\n properties[PERPS_EVENT_PROPERTY.DISCOUNT_PERCENTAGE] =\n params.trackingData.feeDiscountPercentage;\n }\n if (params.trackingData?.estimatedPoints !== undefined) {\n properties[PERPS_EVENT_PROPERTY.ESTIMATED_REWARDS] =\n params.trackingData.estimatedPoints;\n }\n if (params.takeProfitPrice) {\n properties[PERPS_EVENT_PROPERTY.TAKE_PROFIT_PRICE] = parseFloat(\n params.takeProfitPrice,\n );\n }\n if (params.stopLossPrice) {\n properties[PERPS_EVENT_PROPERTY.STOP_LOSS_PRICE] = parseFloat(\n params.stopLossPrice,\n );\n }\n } else {\n // Add failure-specific properties\n properties[PERPS_EVENT_PROPERTY.ERROR_MESSAGE] =\n error?.message ?? result?.error ?? 'Unknown error';\n }\n\n if (\n params.trackingData?.abTests &&\n Object.keys(params.trackingData.abTests).length > 0\n ) {\n properties[PERPS_EVENT_PROPERTY.AB_TESTS] = params.trackingData.abTests;\n }\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.TradeTransaction,\n properties,\n );\n }\n\n /**\n * Handle successful order placement (state updates, analytics, data lake reporting)\n *\n * @param options - The configuration options.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.reportOrderToDataLake - The report order to data lake value.\n */\n async #handleOrderSuccess(options: {\n params: OrderParams;\n context: ServiceContext;\n reportOrderToDataLake: (params: {\n action: 'open' | 'close';\n symbol: string;\n slPrice?: number;\n tpPrice?: number;\n }) => Promise<{ success: boolean; error?: string }>;\n }): Promise<void> {\n const { params, context, reportOrderToDataLake } = options;\n\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Save executed trade configuration for this market\n if (params.leverage && context.saveTradeConfiguration) {\n context.saveTradeConfiguration(params.symbol, params.leverage);\n }\n\n // Report to data lake (fire-and-forget with retry)\n reportOrderToDataLake({\n action: 'open',\n symbol: params.symbol,\n slPrice: params.stopLossPrice\n ? parseFloat(params.stopLossPrice)\n : undefined,\n tpPrice: params.takeProfitPrice\n ? parseFloat(params.takeProfitPrice)\n : undefined,\n }).catch((error) => {\n this.#deps.logger.error(\n ensureError(error, 'TradingService.handleOrderSuccess'),\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: 'reportOrderToDataLake',\n symbol: params.symbol,\n },\n },\n },\n );\n });\n }\n\n /**\n * Execute a trading operation with fee discount context\n * Ensures fee discount is always cleared after operation (success or failure)\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.feeDiscountBips - The fee discount bips value.\n * @param options.operation - The operation value.\n * @returns The result of the operation.\n */\n async #withFeeDiscount<TResult>(options: {\n provider: PerpsProvider;\n feeDiscountBips?: number;\n operation: () => Promise<TResult>;\n }): Promise<TResult> {\n const { provider, feeDiscountBips, operation } = options;\n\n try {\n // Set discount context in provider for this operation\n if (feeDiscountBips !== undefined && provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(feeDiscountBips);\n this.#deps.debugLogger.log(\n 'TradingService: Fee discount set in provider',\n {\n feeDiscountBips,\n },\n );\n }\n\n // Execute the operation\n return await operation();\n } finally {\n // Always clear discount context, even on exception\n if (provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(undefined);\n this.#deps.debugLogger.log(\n 'TradingService: Fee discount cleared from provider',\n );\n }\n }\n }\n\n /**\n * Place a new order with full orchestration\n * Handles tracing, fee discounts, state management, analytics, and data lake reporting\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.reportOrderToDataLake - The report order to data lake value.\n * @returns The result of the operation.\n */\n async placeOrder(options: {\n provider: PerpsProvider;\n params: OrderParams;\n context: ServiceContext;\n reportOrderToDataLake: (params: {\n action: 'open' | 'close';\n symbol: string;\n slPrice?: number;\n tpPrice?: number;\n }) => Promise<{ success: boolean; error?: string }>;\n }): Promise<OrderResult> {\n const { provider, params, context, reportOrderToDataLake } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let traceData:\n | { success: boolean; error?: string; orderId?: string }\n | undefined;\n\n const paymentToken =\n params.trackingData?.tradeWithToken === true\n ? (params.trackingData.mmPayTokenSelected ?? 'unknown_token')\n : 'perps_balance';\n\n try {\n this.#deps.tracer.addBreadcrumb({\n category: 'perps',\n message: 'Order execution started',\n level: 'info',\n data: {\n payment_token: paymentToken,\n market: params.symbol,\n orderType: params.orderType,\n },\n });\n\n // Start trace for the entire operation\n this.#deps.tracer.trace({\n name: PerpsTraceNames.PlaceOrder,\n id: traceId,\n op: PerpsTraceOperations.OrderSubmission,\n tags: {\n provider: context.tracingContext.provider,\n orderType: params.orderType,\n market: params.symbol,\n leverage: String(params.leverage ?? 1),\n isTestnet: String(context.tracingContext.isTestnet),\n payment_token: paymentToken,\n },\n data: {\n isBuy: params.isBuy,\n orderPrice: params.price ?? '',\n payment_token: paymentToken,\n },\n });\n\n // Calculate fee discount at execution time (fresh, secure)\n const feeDiscountBips = await this.#calculateFeeDiscountWithMeasurement();\n\n this.#deps.debugLogger.log('TradingService: Fee discount calculated', {\n feeDiscountBips,\n hasDiscount: feeDiscountBips !== undefined,\n });\n\n this.#deps.debugLogger.log(\n 'TradingService: Submitting order to provider',\n {\n symbol: params.symbol,\n orderType: params.orderType,\n isBuy: params.isBuy,\n size: params.size,\n leverage: params.leverage,\n hasTP: Boolean(params.takeProfitPrice),\n hasSL: Boolean(params.stopLossPrice),\n },\n );\n\n // Execute order with fee discount management\n const result = await this.#withFeeDiscount({\n provider,\n feeDiscountBips,\n operation: () => provider.placeOrder(params),\n });\n\n this.#deps.debugLogger.log('TradingService: Provider response received', {\n success: result.success,\n orderId: result.orderId,\n error: result.error,\n });\n\n // Update state and handle success/failure\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Handle success: state updates, data lake reporting\n await this.#handleOrderSuccess({\n params,\n context,\n reportOrderToDataLake,\n });\n traceData = { success: true, orderId: result.orderId ?? '' };\n\n // Invalidate standalone caches so external hooks (e.g., usePerpsPositionForAsset) refresh\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'positions' });\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'accountState' });\n } else {\n traceData = { success: false, error: result.error ?? 'Unknown error' };\n }\n\n // Track analytics (success or failure)\n this.#trackOrderResult({\n result,\n params,\n context,\n duration: completionDuration,\n });\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Track analytics for exception\n this.#trackOrderResult({\n result: null,\n error: error instanceof Error ? error : undefined,\n params,\n context,\n duration: completionDuration,\n });\n\n // withFeeDiscount handles fee discount cleanup automatically\n\n this.#deps.logger.error(ensureError(error, 'TradingService.placeOrder'), {\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: params.symbol,\n orderType: params.orderType,\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 // Always end trace on exit (success or failure)\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.PlaceOrder,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Load position data with performance measurement\n *\n * @param options - The configuration options.\n * @param options.symbol - The trading pair symbol.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async #loadPositionData(options: {\n symbol: string;\n context: ServiceContext;\n }): Promise<Position | undefined> {\n const { symbol, context } = options;\n\n const positionLoadStart = this.#deps.performance.now();\n try {\n const positions = context.getPositions\n ? await context.getPositions()\n : [];\n const position = positions.find((pos) => pos.symbol === symbol);\n\n this.#deps.tracer.setMeasurement(\n PerpsMeasurementName.PerpsGetPositionsOperation,\n this.#deps.performance.now() - positionLoadStart,\n 'millisecond',\n );\n\n return position;\n } catch (error) {\n this.#deps.debugLogger.log(\n 'TradingService: Could not get position data for tracking',\n error instanceof Error ? error.message : String(error),\n );\n return undefined;\n }\n }\n\n /**\n * Calculate close position metrics\n *\n * @param position - The position value.\n * @param params - The operation parameters.\n * @param result - The transaction result to check.\n * @returns The result of the operation.\n */\n #calculateCloseMetrics(\n position: Position,\n params: ClosePositionParams,\n result: OrderResult,\n ): {\n direction: string;\n closePercentage: number;\n closeType: string;\n orderType: string;\n filledSize: number;\n requestedSize: number;\n isPartiallyFilled: boolean;\n } {\n const direction =\n parseFloat(position.size) > 0\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT;\n\n const filledSize = result.filledSize ? parseFloat(result.filledSize) : 0;\n const requestedSize = params.size\n ? parseFloat(params.size)\n : Math.abs(parseFloat(position.size));\n const isPartiallyFilled = filledSize > 0 && filledSize < requestedSize;\n\n const orderType = params.orderType ?? PERPS_EVENT_VALUE.ORDER_TYPE.MARKET;\n const closePercentage = params.size\n ? (parseFloat(params.size) / Math.abs(parseFloat(position.size))) * 100\n : 100;\n const closeType =\n closePercentage === 100\n ? PERPS_EVENT_VALUE.CLOSE_TYPE.FULL\n : PERPS_EVENT_VALUE.CLOSE_TYPE.PARTIAL;\n\n return {\n direction,\n closePercentage,\n closeType,\n orderType,\n filledSize,\n requestedSize,\n isPartiallyFilled,\n };\n }\n\n /**\n * Build event properties for position close analytics\n *\n * @param position - The position value.\n * @param params - The operation parameters.\n * @param metrics - The metrics value.\n * @param metrics.direction - The sort direction.\n * @param metrics.closePercentage - The close percentage value.\n * @param metrics.closeType - The close type value.\n * @param metrics.orderType - The order type value.\n * @param metrics.requestedSize - The requested size value.\n * @param result - The transaction result to check.\n * @param status - The status value.\n * @param error - The error that occurred.\n * @returns The result of the operation.\n */\n #buildCloseEventProperties(\n position: Position,\n params: ClosePositionParams,\n metrics: {\n direction: string;\n closePercentage: number;\n closeType: string;\n orderType: string;\n requestedSize: number;\n },\n result: OrderResult | null,\n status: string,\n error?: string,\n ): Record<string, unknown> {\n const baseProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]: status,\n [PERPS_EVENT_PROPERTY.ASSET]: position.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: metrics.direction,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: metrics.orderType,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: metrics.requestedSize,\n [PERPS_EVENT_PROPERTY.OPEN_POSITION_SIZE]: Math.abs(\n parseFloat(position.size),\n ),\n [PERPS_EVENT_PROPERTY.PERCENTAGE_CLOSED]: metrics.closePercentage,\n ...(position.unrealizedPnl && {\n [PERPS_EVENT_PROPERTY.PNL_DOLLAR]: parseFloat(position.unrealizedPnl),\n }),\n ...(position.returnOnEquity && {\n [PERPS_EVENT_PROPERTY.PNL_PERCENT]:\n parseFloat(position.returnOnEquity) * 100,\n }),\n ...(params.trackingData?.totalFee !== undefined && {\n [PERPS_EVENT_PROPERTY.FEE]: params.trackingData.totalFee,\n }),\n ...(params.trackingData?.metamaskFee !== undefined && {\n [PERPS_EVENT_PROPERTY.METAMASK_FEE]: params.trackingData.metamaskFee,\n }),\n ...(params.trackingData?.metamaskFeeRate !== undefined && {\n [PERPS_EVENT_PROPERTY.METAMASK_FEE_RATE]:\n params.trackingData.metamaskFeeRate,\n }),\n ...(params.trackingData?.feeDiscountPercentage !== undefined && {\n [PERPS_EVENT_PROPERTY.DISCOUNT_PERCENTAGE]:\n params.trackingData.feeDiscountPercentage,\n }),\n ...(params.trackingData?.estimatedPoints !== undefined && {\n [PERPS_EVENT_PROPERTY.ESTIMATED_REWARDS]:\n params.trackingData.estimatedPoints,\n }),\n ...((params.trackingData?.marketPrice ?? result?.averagePrice) && {\n [PERPS_EVENT_PROPERTY.ASSET_PRICE]: result?.averagePrice\n ? parseFloat(result.averagePrice)\n : params.trackingData?.marketPrice,\n }),\n ...(params.orderType === 'limit' &&\n params.price && {\n [PERPS_EVENT_PROPERTY.LIMIT_PRICE]: parseFloat(params.price),\n }),\n ...(params.trackingData?.receivedAmount !== undefined && {\n [PERPS_EVENT_PROPERTY.RECEIVED_AMOUNT]:\n params.trackingData.receivedAmount,\n }),\n ...(params.trackingData?.source && {\n [PERPS_EVENT_PROPERTY.SOURCE]: params.trackingData.source,\n }),\n };\n\n // Calculate and add order value in USD (size * price)\n const closeAssetPrice = result?.averagePrice\n ? parseFloat(result.averagePrice)\n : params.trackingData?.marketPrice;\n const orderValue =\n closeAssetPrice && metrics.requestedSize\n ? metrics.requestedSize * closeAssetPrice\n : undefined;\n\n // Add success-specific properties\n if (status === PERPS_EVENT_VALUE.STATUS.EXECUTED) {\n return {\n ...baseProperties,\n [PERPS_EVENT_PROPERTY.CLOSE_TYPE]: metrics.closeType,\n ...(orderValue !== undefined && {\n [PERPS_EVENT_PROPERTY.ORDER_VALUE]: orderValue,\n }),\n };\n }\n\n // Add error for failures\n return {\n ...baseProperties,\n ...(error && { [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: error }),\n ...(orderValue !== undefined && {\n [PERPS_EVENT_PROPERTY.ORDER_VALUE]: orderValue,\n }),\n };\n }\n\n /**\n * Track position close result analytics (consolidates all tracking logic)\n *\n * @param options - The configuration options.\n * @param options.position - The position value.\n * @param options.result - The transaction result to check.\n * @param options.error - The error that occurred.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.duration - Optional time duration.\n */\n #trackPositionCloseResult(options: {\n position: Position | undefined;\n result: OrderResult | null;\n error?: Error;\n params: ClosePositionParams;\n context: ServiceContext;\n duration: number;\n }): void {\n const { position, result, error, params, duration } = options;\n\n if (!position) {\n return;\n }\n\n const metrics = result\n ? this.#calculateCloseMetrics(position, params, result)\n : {\n direction:\n parseFloat(position.size) > 0\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n closePercentage: params.size\n ? (parseFloat(params.size) / Math.abs(parseFloat(position.size))) *\n 100\n : 100,\n closeType: PERPS_EVENT_VALUE.CLOSE_TYPE.FULL,\n orderType: params.orderType ?? PERPS_EVENT_VALUE.ORDER_TYPE.MARKET,\n requestedSize: params.size\n ? parseFloat(params.size)\n : Math.abs(parseFloat(position.size)),\n filledSize: 0,\n isPartiallyFilled: false,\n };\n\n // Track partially filled event if applicable\n if (result?.success && metrics.isPartiallyFilled) {\n const partialProperties = this.#buildCloseEventProperties(\n position,\n params,\n metrics,\n result,\n PERPS_EVENT_VALUE.STATUS.PARTIALLY_FILLED,\n );\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.PositionCloseTransaction,\n {\n ...partialProperties,\n [PERPS_EVENT_PROPERTY.AMOUNT_FILLED]: metrics.filledSize,\n [PERPS_EVENT_PROPERTY.REMAINING_AMOUNT]:\n metrics.requestedSize - metrics.filledSize,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,\n },\n );\n }\n\n // Determine status\n const status =\n result?.success === true\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED;\n\n const errorMessage = error?.message ?? result?.error;\n\n // Track main close event\n const eventProperties = this.#buildCloseEventProperties(\n position,\n params,\n metrics,\n result,\n status,\n errorMessage,\n );\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.PositionCloseTransaction,\n {\n ...eventProperties,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,\n },\n );\n }\n\n /**\n * Handle data lake reporting (fire-and-forget)\n *\n * @param reportOrderToDataLake - The report order to data lake value.\n * @param symbol - The trading pair symbol.\n * @param context - The service context for dependencies.\n */\n #handleDataLakeReporting(\n reportOrderToDataLake: (params: {\n action: 'open' | 'close';\n symbol: string;\n }) => Promise<{ success: boolean; error?: string }>,\n symbol: string,\n context: ServiceContext,\n ): void {\n reportOrderToDataLake({\n action: 'close',\n symbol,\n }).catch((error) => {\n this.#deps.logger.error(\n ensureError(error, 'TradingService.handleDataLakeReporting'),\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: 'reportOrderToDataLake',\n symbol,\n },\n },\n },\n );\n });\n }\n\n /**\n * Calculate fee discount with performance measurement\n * Uses controller dependencies injected via setControllerDependencies()\n * Helper method for placeOrder orchestration\n *\n * @returns The result of the operation.\n */\n async #calculateFeeDiscountWithMeasurement(): Promise<number | undefined> {\n // Check if controller dependencies are available\n if (!this.#controllerDeps) {\n this.#deps.debugLogger.log(\n 'TradingService: Controller dependencies not set, skipping fee discount',\n );\n return undefined;\n }\n\n const { rewardsIntegrationService } = this.#controllerDeps;\n\n const orderExecutionFeeDiscountStartTime = this.#deps.performance.now();\n\n // Calculate fee discount using messenger pattern (service handles controller access internally)\n const discountBips =\n await rewardsIntegrationService.calculateUserFeeDiscount();\n\n const orderExecutionFeeDiscountDuration =\n this.#deps.performance.now() - orderExecutionFeeDiscountStartTime;\n\n // Record measurement\n this.#deps.tracer.setMeasurement(\n PerpsMeasurementName.PerpsRewardsOrderExecutionFeeDiscountApiCall,\n orderExecutionFeeDiscountDuration,\n 'millisecond',\n );\n\n this.#deps.debugLogger.log(\n 'TradingService: Fee discount API call completed',\n {\n discountBips,\n duration: `${orderExecutionFeeDiscountDuration.toFixed(0)}ms`,\n },\n );\n\n return discountBips;\n }\n\n /**\n * Edit an existing order with full orchestration\n * Handles tracing, fee discounts, state management, and analytics\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 editOrder(options: {\n provider: PerpsProvider;\n params: EditOrderParams;\n context: ServiceContext;\n }): Promise<OrderResult> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let traceData:\n | { success: boolean; error?: string; orderId?: string }\n | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.EditOrder,\n id: traceId,\n op: PerpsTraceOperations.OrderSubmission,\n tags: {\n provider: context.tracingContext.provider,\n orderType: params.newOrder.orderType,\n market: params.newOrder.symbol,\n leverage: String(params.newOrder.leverage ?? 1),\n isTestnet: String(context.tracingContext.isTestnet),\n },\n data: {\n isBuy: params.newOrder.isBuy,\n orderPrice: params.newOrder.price ?? '',\n },\n });\n\n // Calculate fee discount only if required dependencies are available\n const feeDiscountBips = await this.#calculateFeeDiscountWithMeasurement();\n\n // Execute order edit with fee discount management\n const result = await this.#withFeeDiscount({\n provider,\n feeDiscountBips,\n operation: () => provider.editOrder(params),\n });\n\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Track order edit executed\n const editExecutedProps: PerpsAnalyticsProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.EXECUTED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.newOrder.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: params.newOrder.isBuy\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.newOrder.orderType,\n [PERPS_EVENT_PROPERTY.LEVERAGE]: params.newOrder.leverage ?? 1,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: params.newOrder.size,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n };\n if (params.newOrder.price) {\n editExecutedProps[PERPS_EVENT_PROPERTY.LIMIT_PRICE] = parseFloat(\n params.newOrder.price,\n );\n }\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.TradeTransaction,\n editExecutedProps,\n );\n\n traceData = { success: true, orderId: result.orderId ?? '' };\n } else {\n // Track order edit failed\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.TradeTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.newOrder.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: params.newOrder.isBuy\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.newOrder.orderType,\n [PERPS_EVENT_PROPERTY.LEVERAGE]: params.newOrder.leverage ?? 1,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: params.newOrder.size,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n result.error ?? 'Unknown error',\n },\n );\n\n traceData = { success: false, error: result.error ?? 'Unknown error' };\n }\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Track order edit exception\n this.#deps.metrics.trackPerpsEvent(PerpsAnalyticsEvent.TradeTransaction, {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.newOrder.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: params.newOrder.isBuy\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.newOrder.orderType,\n [PERPS_EVENT_PROPERTY.LEVERAGE]: params.newOrder.leverage ?? 1,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: params.newOrder.size,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n error instanceof Error ? error.message : 'Unknown error',\n });\n\n this.#deps.logger.error(ensureError(error, 'TradingService.editOrder'), {\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 orderId: params.orderId,\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.EditOrder,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Cancel a single order with full orchestration\n * Handles tracing, state management, and analytics\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 cancelOrder(options: {\n provider: PerpsProvider;\n params: CancelOrderParams;\n context: ServiceContext;\n }): Promise<CancelOrderResult> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let traceData:\n | { success: boolean; error?: string; orderId?: string }\n | undefined;\n\n try {\n // Start trace for the entire operation\n this.#deps.tracer.trace({\n name: PerpsTraceNames.CancelOrder,\n id: traceId,\n op: PerpsTraceOperations.OrderSubmission,\n tags: {\n provider: context.tracingContext.provider,\n market: params.symbol,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n data: {\n orderId: params.orderId,\n },\n });\n\n // Execute order cancellation\n const result = await provider.cancelOrder(params);\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Track order cancel executed\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.OrderCancelTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.EXECUTED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n },\n );\n\n traceData = { success: true, orderId: params.orderId };\n } else {\n // Track order cancel failed\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.OrderCancelTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n result.error ?? 'Unknown error',\n },\n );\n\n traceData = { success: false, error: result.error ?? 'Unknown error' };\n }\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Track order cancel exception\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.OrderCancelTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n error instanceof Error ? error.message : 'Unknown error',\n },\n );\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.cancelOrder'),\n this.#getErrorContext('cancelOrder', { symbol: params.symbol }),\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.CancelOrder,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Cancel multiple orders with full orchestration\n * Handles tracing, stream pausing, filtering, batch operations, and analytics\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.withStreamPause - The with stream pause value.\n * @returns The result of the operation.\n */\n async cancelOrders(options: {\n provider: PerpsProvider;\n params: CancelOrdersParams;\n context: ServiceContext;\n withStreamPause: <TResult>(\n operation: () => Promise<TResult>,\n channels: string[],\n ) => Promise<TResult>;\n }): Promise<CancelOrdersResult> {\n const { provider, params, context, withStreamPause } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let operationResult: CancelOrdersResult | null = null;\n let operationError: Error | null = null;\n\n try {\n // Start trace for batch operation\n this.#deps.tracer.trace({\n name: PerpsTraceNames.CancelOrder,\n id: traceId,\n op: PerpsTraceOperations.OrderSubmission,\n tags: {\n provider: context.tracingContext.provider,\n isBatch: 'true',\n isTestnet: String(context.tracingContext.isTestnet),\n },\n data: {\n cancelAll: params.cancelAll ? 'true' : 'false',\n symbolCount: params.symbols?.length ?? 0,\n orderIdCount: params.orderIds?.length ?? 0,\n },\n });\n\n // Pause orders stream to prevent WebSocket updates during cancellation\n operationResult = await withStreamPause(async () => {\n // Get all open orders\n if (!context.getOpenOrders) {\n throw new Error('getOpenOrders callback not provided in context');\n }\n const orders = await context.getOpenOrders();\n\n // Filter orders based on params\n let ordersToCancel = orders;\n if (\n params.cancelAll === true ||\n (!params.symbols && !params.orderIds)\n ) {\n // Cancel all orders (excluding TP/SL orders for positions)\n ordersToCancel = orders.filter(\n (order) => !isTPSLOrder(order.detailedOrderType),\n );\n } else if (params.orderIds && params.orderIds.length > 0) {\n // Cancel specific order IDs\n ordersToCancel = orders.filter((order) =>\n params.orderIds?.includes(order.orderId),\n );\n } else if (params.symbols && params.symbols.length > 0) {\n // Cancel orders for specific symbols\n ordersToCancel = orders.filter((order) =>\n params.symbols?.includes(order.symbol),\n );\n }\n\n if (ordersToCancel.length === 0) {\n return {\n success: false,\n successCount: 0,\n failureCount: 0,\n results: [],\n };\n }\n\n // Use batch cancel if provider supports it\n if (provider.cancelOrders) {\n return await provider.cancelOrders(\n ordersToCancel.map((order) => ({\n symbol: order.symbol,\n orderId: order.orderId,\n })),\n );\n }\n\n // Fallback: Cancel orders in parallel (for providers without batch support)\n const results = await Promise.allSettled(\n ordersToCancel.map((order) =>\n this.cancelOrder({\n provider,\n params: { symbol: order.symbol, orderId: order.orderId },\n context,\n }),\n ),\n );\n\n // Aggregate results\n const successCount = results.filter(\n (res) => res.status === 'fulfilled' && res.value.success,\n ).length;\n const failureCount = results.length - successCount;\n\n return {\n success: successCount > 0,\n successCount,\n failureCount,\n results: results.map((result, index) => {\n let error: string | undefined;\n if (result.status === 'rejected') {\n error =\n result.reason instanceof Error\n ? result.reason.message\n : 'Unknown error';\n } else if (result.status === 'fulfilled' && !result.value.success) {\n error = result.value.error;\n }\n\n return {\n orderId: ordersToCancel[index].orderId,\n symbol: ordersToCancel[index].symbol,\n success: Boolean(\n result.status === 'fulfilled' && result.value.success,\n ),\n error,\n };\n }),\n };\n }, ['orders']); // Disconnect orders stream during operation\n\n return operationResult;\n } catch (error) {\n operationError =\n error instanceof Error ? error : new Error(String(error));\n this.#deps.logger.error(\n ensureError(error, 'TradingService.cancelOrders'),\n this.#getErrorContext('cancelOrders'),\n );\n throw error;\n } finally {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Track batch cancel event (success or failure)\n const batchCancelProps: PerpsAnalyticsProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]:\n operationResult?.success && operationResult.successCount > 0\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n };\n if (operationError) {\n batchCancelProps[PERPS_EVENT_PROPERTY.ERROR_MESSAGE] =\n operationError.message;\n }\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.OrderCancelTransaction,\n batchCancelProps,\n );\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.CancelOrder,\n id: traceId,\n });\n }\n }\n\n /**\n * Close a single position with full orchestration\n * Handles tracing, fee discounts, state management, analytics, and data lake reporting\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.reportOrderToDataLake - The report order to data lake value.\n * @returns The result of the operation.\n */\n async closePosition(options: {\n provider: PerpsProvider;\n params: ClosePositionParams;\n context: ServiceContext;\n reportOrderToDataLake: (params: {\n action: 'open' | 'close';\n symbol: string;\n }) => Promise<{ success: boolean; error?: string }>;\n }): Promise<OrderResult> {\n const { provider, params, context, reportOrderToDataLake } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let position: Position | undefined;\n let result: OrderResult | undefined;\n let traceData:\n | { success: boolean; error?: string; filledSize?: string }\n | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.ClosePosition,\n id: traceId,\n op: PerpsTraceOperations.PositionManagement,\n tags: {\n provider: context.tracingContext.provider,\n symbol: params.symbol,\n closeSize: params.size ?? 'full',\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n // Load position data with measurement\n position = await this.#loadPositionData({\n symbol: params.symbol,\n context,\n });\n\n // Calculate fee discount with measurement\n const feeDiscountBips = await this.#calculateFeeDiscountWithMeasurement();\n\n // Execute position close with fee discount management\n result = await this.#withFeeDiscount({\n provider,\n feeDiscountBips,\n operation: () => provider.closePosition(params),\n });\n\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Report to data lake (fire-and-forget)\n this.#handleDataLakeReporting(\n reportOrderToDataLake,\n params.symbol,\n context,\n );\n\n traceData = { success: true, filledSize: result.filledSize ?? '' };\n\n // Invalidate standalone caches so external hooks (e.g., usePerpsPositionForAsset) refresh\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'positions' });\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'accountState' });\n } else {\n traceData = { success: false, error: result.error ?? 'Unknown error' };\n }\n\n // Track analytics (success or failure, includes partial fills)\n this.#trackPositionCloseResult({\n position,\n result,\n params,\n context,\n duration: completionDuration,\n });\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n traceData = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n\n // Track analytics for exception\n this.#trackPositionCloseResult({\n position,\n result: null,\n error: error instanceof Error ? error : undefined,\n params,\n context,\n duration: completionDuration,\n });\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.closePosition'),\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: params.symbol,\n },\n },\n },\n );\n\n throw error;\n } finally {\n // Always end trace on exit (success or failure)\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.ClosePosition,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Close multiple positions with full orchestration\n * Handles tracing, fee discounts, batch operations, and analytics\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 closePositions(options: {\n provider: PerpsProvider;\n params: ClosePositionsParams;\n context: ServiceContext;\n }): Promise<ClosePositionsResult> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let operationResult: ClosePositionsResult | null = null;\n let operationError: Error | null = null;\n\n try {\n // Start trace for batch operation\n this.#deps.tracer.trace({\n name: PerpsTraceNames.ClosePosition,\n id: traceId,\n op: PerpsTraceOperations.PositionManagement,\n tags: {\n provider: context.tracingContext.provider,\n isBatch: 'true',\n isTestnet: String(context.tracingContext.isTestnet),\n },\n data: {\n closeAll: params.closeAll ? 'true' : 'false',\n symbolCount: params.symbols?.length ?? 0,\n },\n });\n\n this.#deps.debugLogger.log('[closePositions] Batch method check', {\n providerType: provider.protocolId,\n hasBatchMethod: 'closePositions' in provider,\n providerKeys: Object.keys(provider).filter((key) =>\n key.includes('close'),\n ),\n });\n\n // Use batch close if provider supports it (provider handles filtering)\n if (provider.closePositions) {\n const feeDiscountBips =\n await this.#calculateFeeDiscountWithMeasurement();\n\n operationResult = await this.#withFeeDiscount({\n provider,\n feeDiscountBips,\n operation: async () => {\n if (!provider.closePositions) {\n throw new Error('closePositions method not available');\n }\n return provider.closePositions(params);\n },\n });\n } else {\n // Fallback: Get positions, filter, and close in parallel\n if (!context.getPositions) {\n throw new Error('getPositions callback not provided in context');\n }\n const positions = await context.getPositions();\n\n const positionsToClose =\n params.closeAll === true ||\n !params.symbols ||\n params.symbols.length === 0\n ? positions\n : positions.filter((pos) => params.symbols?.includes(pos.symbol));\n\n if (positionsToClose.length === 0) {\n operationResult = {\n success: false,\n successCount: 0,\n failureCount: 0,\n results: [],\n };\n return operationResult;\n }\n\n const results = await Promise.allSettled(\n positionsToClose.map((position) =>\n this.closePosition({\n provider,\n params: { symbol: position.symbol },\n context,\n reportOrderToDataLake: () => Promise.resolve({ success: true }), // No-op for batch fallback\n }),\n ),\n );\n\n // Aggregate results\n const successCount = results.filter(\n (res) => res.status === 'fulfilled' && res.value.success,\n ).length;\n const failureCount = results.length - successCount;\n\n operationResult = {\n success: successCount > 0,\n successCount,\n failureCount,\n results: results.map((result, index) => {\n let error: string | undefined;\n if (result.status === 'rejected') {\n error =\n result.reason instanceof Error\n ? result.reason.message\n : 'Unknown error';\n } else if (result.status === 'fulfilled' && !result.value.success) {\n error = result.value.error;\n }\n\n return {\n symbol: positionsToClose[index].symbol,\n success: Boolean(\n result.status === 'fulfilled' && result.value.success,\n ),\n error,\n };\n }),\n };\n }\n\n return operationResult;\n } catch (error) {\n operationError =\n error instanceof Error ? error : new Error(String(error));\n this.#deps.logger.error(\n ensureError(error, 'TradingService.closePositions'),\n this.#getErrorContext('closePositions', {\n symbols: params.symbols?.length ?? 0,\n closeAll: params.closeAll,\n }),\n );\n throw error;\n } finally {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Track batch close event (success or failure)\n const batchCloseProps: PerpsAnalyticsProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]:\n operationResult?.success && operationResult.successCount > 0\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n };\n if (operationError) {\n batchCloseProps[PERPS_EVENT_PROPERTY.ERROR_MESSAGE] =\n operationError.message;\n }\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.PositionCloseTransaction,\n batchCloseProps,\n );\n\n // Invalidate standalone caches on successful batch close\n if (operationResult?.success && operationResult.successCount > 0) {\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'positions' });\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'accountState' });\n }\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.ClosePosition,\n id: traceId,\n });\n }\n }\n\n /**\n * Update TP/SL for an existing position with full orchestration\n * Handles tracing, fee discounts, state management, and analytics\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 updatePositionTPSL(options: {\n provider: PerpsProvider;\n params: UpdatePositionTPSLParams;\n context: ServiceContext;\n }): Promise<OrderResult> {\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 let result: OrderResult | undefined;\n let errorMessage: string | undefined;\n\n // Extract tracking data with defaults\n const direction = params.trackingData?.direction;\n const positionSize = params.trackingData?.positionSize;\n const source =\n params.trackingData?.source ?? PERPS_EVENT_VALUE.SOURCE.TP_SL_VIEW;\n const takeProfitPercentage = params.trackingData?.takeProfitPercentage;\n const stopLossPercentage = params.trackingData?.stopLossPercentage;\n const isEditingExistingPosition =\n params.trackingData?.isEditingExistingPosition ?? false;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.UpdateTpsl,\n id: traceId,\n op: PerpsTraceOperations.PositionManagement,\n tags: {\n provider: context.tracingContext.provider,\n market: params.symbol,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n data: {\n takeProfitPrice: params.takeProfitPrice ?? '',\n stopLossPrice: params.stopLossPrice ?? '',\n },\n });\n\n // Get fee discount from rewards\n const feeDiscountBips = await this.#calculateFeeDiscountWithMeasurement();\n\n // Execute with fee discount management\n result = await this.#withFeeDiscount({\n provider,\n feeDiscountBips,\n operation: () => provider.updatePositionTPSL(params),\n });\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n traceData = { success: true };\n } else {\n errorMessage = result.error ?? 'Unknown error';\n traceData = { success: false, error: errorMessage };\n }\n\n return result;\n } catch (error) {\n errorMessage = error instanceof Error ? error.message : 'Unknown error';\n traceData = { success: false, error: errorMessage };\n throw error;\n } finally {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Determine screen type based on whether editing existing position\n const screenType = isEditingExistingPosition\n ? PERPS_EVENT_VALUE.SCREEN_TYPE.EDIT_TPSL\n : PERPS_EVENT_VALUE.SCREEN_TYPE.CREATE_TPSL;\n\n // Determine if TP/SL are set\n const hasTakeProfit = Boolean(params.takeProfitPrice);\n const hasStopLoss = Boolean(params.stopLossPrice);\n\n // Determine TP/SL action type\n let tpslAction: string | undefined;\n if (hasTakeProfit && hasStopLoss) {\n tpslAction = PERPS_EVENT_VALUE.ACTION.TPSL;\n } else if (hasTakeProfit) {\n tpslAction = PERPS_EVENT_VALUE.ACTION.TP;\n } else if (hasStopLoss) {\n tpslAction = PERPS_EVENT_VALUE.ACTION.SL;\n }\n\n // Build comprehensive event properties\n const eventProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]: result?.success\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.SOURCE]: source,\n [PERPS_EVENT_PROPERTY.SCREEN_TYPE]: screenType,\n [PERPS_EVENT_PROPERTY.HAS_TAKE_PROFIT]: hasTakeProfit,\n [PERPS_EVENT_PROPERTY.HAS_STOP_LOSS]: hasStopLoss,\n ...(tpslAction && {\n [PERPS_EVENT_PROPERTY.ACTION]: tpslAction,\n }),\n ...(direction && {\n [PERPS_EVENT_PROPERTY.DIRECTION]:\n direction === 'long'\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n }),\n ...(positionSize !== undefined && {\n [PERPS_EVENT_PROPERTY.POSITION_SIZE]: positionSize,\n }),\n ...(params.takeProfitPrice && {\n [PERPS_EVENT_PROPERTY.TAKE_PROFIT_PRICE]: parseFloat(\n params.takeProfitPrice,\n ),\n }),\n ...(params.stopLossPrice && {\n [PERPS_EVENT_PROPERTY.STOP_LOSS_PRICE]: parseFloat(\n params.stopLossPrice,\n ),\n }),\n ...(takeProfitPercentage !== undefined && {\n [PERPS_EVENT_PROPERTY.TAKE_PROFIT_PERCENTAGE]: takeProfitPercentage,\n }),\n ...(stopLossPercentage !== undefined && {\n [PERPS_EVENT_PROPERTY.STOP_LOSS_PERCENTAGE]: stopLossPercentage,\n }),\n ...(errorMessage && {\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,\n }),\n };\n\n // Track event once with all properties\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.RiskManagement,\n eventProperties,\n );\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.UpdateTpsl,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Update margin for an existing position (add or remove)\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.amount - The amount value.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async updateMargin(options: {\n provider: PerpsProvider;\n symbol: string;\n amount: string;\n context: ServiceContext;\n }): Promise<{ success: boolean; error?: string }> {\n const { provider, symbol, amount, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.UpdateMargin,\n id: traceId,\n op: PerpsTraceOperations.PositionManagement,\n tags: {\n provider: context.tracingContext.provider,\n symbol,\n isAdd: String(parseFloat(amount) > 0),\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n // Call provider method\n const result = await provider.updateMargin?.({ symbol, amount });\n\n if (!result) {\n throw new Error('Provider does not support margin adjustment');\n }\n\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Track success analytics\n this.#deps.metrics.trackPerpsEvent(PerpsAnalyticsEvent.RiskManagement, {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.EXECUTED,\n [PERPS_EVENT_PROPERTY.ASSET]: symbol,\n [PERPS_EVENT_PROPERTY.ACTION]:\n parseFloat(amount) > 0 ? 'add_margin' : 'remove_margin',\n [PERPS_EVENT_PROPERTY.MARGIN_USED]: Math.abs(parseFloat(amount)),\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n });\n\n // Invalidate standalone caches so external hooks refresh\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'positions' });\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'accountState' });\n }\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.UpdateMargin,\n id: traceId,\n data: { success: result.success, error: result.error ?? '' },\n });\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.updateMargin'),\n this.#getErrorContext('updateMargin', { symbol, amount }),\n );\n\n // Track failure analytics\n this.#deps.metrics.trackPerpsEvent(PerpsAnalyticsEvent.RiskManagement, {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: symbol,\n [PERPS_EVENT_PROPERTY.ACTION]:\n parseFloat(amount) > 0 ? 'add_margin' : 'remove_margin',\n [PERPS_EVENT_PROPERTY.MARGIN_USED]: Math.abs(parseFloat(amount)),\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,\n });\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.UpdateMargin,\n id: traceId,\n data: { success: false, error: errorMessage },\n });\n\n throw error;\n }\n }\n\n /**\n * Flip position (reverse direction while keeping size and leverage)\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.position - The position data.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async flipPosition(options: {\n provider: PerpsProvider;\n position: Position;\n context: ServiceContext;\n }): Promise<OrderResult> {\n const { provider, position, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.FlipPosition,\n id: traceId,\n op: PerpsTraceOperations.PositionManagement,\n tags: {\n provider: context.tracingContext.provider,\n symbol: position.symbol,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n // Calculate flip parameters\n const positionSize = Math.abs(parseFloat(position.size));\n const isCurrentlyLong = parseFloat(position.size) > 0;\n const oppositeDirection = !isCurrentlyLong;\n\n // Validate available balance for fees\n const accountState = await provider.getAccountState?.();\n if (!accountState) {\n throw new Error('Failed to get account state');\n }\n\n const availableBalance = parseFloat(accountState.availableBalance);\n\n // Estimate fees: ESTIMATED_FEE_RATE (0.09%) already accounts for both legs\n // (close at 0.045% + open at 0.045% = 0.09% of position notional).\n // Apply to 1x notional (positionSize * entryPrice), not 2x (flipSize * entryPrice).\n const entryPrice = parseFloat(position.entryPrice);\n const flipSize = positionSize * 2;\n const notionalValue = positionSize * entryPrice;\n const estimatedFees = notionalValue * ESTIMATED_FEE_RATE;\n\n if (estimatedFees > availableBalance) {\n throw new Error(\n `Insufficient balance for flip fees. Need $${estimatedFees.toFixed(2)}, have $${availableBalance.toFixed(2)}`,\n );\n }\n\n // Create order params for flip\n // Use 2x position size: 1x to close current position + 1x to open opposite position\n const orderParams: OrderParams = {\n symbol: position.symbol,\n isBuy: oppositeDirection,\n size: flipSize.toString(),\n orderType: 'market',\n leverage: position.leverage?.value,\n currentPrice: entryPrice,\n };\n\n // Place flip order (HyperLiquid handles margin transfer automatically)\n const result = await provider.placeOrder(orderParams);\n\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Track success analytics with direction-specific flip action\n const flipAction = isCurrentlyLong\n ? PERPS_EVENT_VALUE.ACTION.FLIP_LONG_TO_SHORT\n : PERPS_EVENT_VALUE.ACTION.FLIP_SHORT_TO_LONG;\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.TradeTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.EXECUTED,\n [PERPS_EVENT_PROPERTY.ASSET]: position.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: oppositeDirection\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: 'market',\n [PERPS_EVENT_PROPERTY.LEVERAGE]: position.leverage?.value || 1,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: positionSize,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ACTION]: flipAction,\n [PERPS_EVENT_PROPERTY.ORDER_VALUE]:\n positionSize * parseFloat(position.entryPrice),\n },\n );\n\n // Invalidate standalone caches so external hooks refresh\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'positions' });\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'accountState' });\n }\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FlipPosition,\n id: traceId,\n data: { success: result.success ?? false, error: result.error ?? '' },\n });\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.flipPosition'),\n this.#getErrorContext('flipPosition', { symbol: position.symbol }),\n );\n\n // Track failure analytics with direction-specific flip action\n const wasLong = parseFloat(position.size) > 0;\n const failFlipAction = wasLong\n ? PERPS_EVENT_VALUE.ACTION.FLIP_LONG_TO_SHORT\n : PERPS_EVENT_VALUE.ACTION.FLIP_SHORT_TO_LONG;\n\n this.#deps.metrics.trackPerpsEvent(PerpsAnalyticsEvent.TradeTransaction, {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: position.symbol,\n [PERPS_EVENT_PROPERTY.ACTION]: failFlipAction,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,\n });\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FlipPosition,\n id: traceId,\n data: { success: false, error: errorMessage },\n });\n\n throw error;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TradingService.cjs","sourceRoot":"","sources":["../../src/services/TradingService.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as uuidv4 } from 'uuid';\n\nimport type { RewardsIntegrationService } from './RewardsIntegrationService';\nimport type { ServiceContext } from './ServiceContext';\nimport {\n PERPS_EVENT_PROPERTY,\n PERPS_EVENT_VALUE,\n} from '../constants/eventNames';\nimport { ESTIMATED_FEE_RATE } from '../constants/hyperLiquidConfig';\nimport { isTPSLOrder } from '../constants/orderTypes';\nimport { PerpsMeasurementName } from '../constants/performanceMetrics';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport {\n PerpsAnalyticsEvent,\n PerpsTraceNames,\n PerpsTraceOperations,\n} from '../types';\nimport type {\n PerpsProvider,\n OrderParams,\n OrderResult,\n EditOrderParams,\n CancelOrderParams,\n CancelOrderResult,\n CancelOrdersParams,\n CancelOrdersResult,\n ClosePositionParams,\n ClosePositionsParams,\n ClosePositionsResult,\n Position,\n UpdatePositionTPSLParams,\n PerpsAnalyticsProperties,\n PerpsPlatformDependencies,\n} from '../types';\nimport { ensureError } from '../utils/errorUtils';\n\n/**\n * Controller-level dependencies for TradingService.\n * These are singletons that don't change per-call, injected once via setControllerDependencies().\n */\nexport type TradingServiceControllerDeps = {\n rewardsIntegrationService: RewardsIntegrationService;\n};\n\n/**\n * TradingService\n *\n * Handles trading operations with fee discount management.\n * Controller is responsible for analytics, state management, and tracing.\n *\n * Instance-based service with constructor injection of platform dependencies.\n * Controller-level dependencies (RewardsController, NetworkController, etc.)\n * are injected via setControllerDependencies() after construction.\n */\nexport class TradingService {\n /**\n * Platform dependencies for logging, metrics, etc.\n */\n readonly #deps: PerpsPlatformDependencies;\n\n /**\n * Controller-level dependencies for fee discount calculation.\n * Set via setControllerDependencies() after construction.\n */\n #controllerDeps: TradingServiceControllerDeps | null = null;\n\n /**\n * Create a new TradingService instance\n *\n * @param deps - Platform dependencies for logging, metrics, etc.\n */\n constructor(deps: PerpsPlatformDependencies) {\n this.#deps = deps;\n }\n\n /**\n * Set controller-level dependencies for fee discount calculation.\n * Called by PerpsController after construction to inject singleton dependencies.\n *\n * @param controllerDeps - Controller-level dependencies (RewardsController, etc.)\n */\n setControllerDependencies(\n controllerDeps: TradingServiceControllerDeps,\n ): void {\n this.#controllerDeps = controllerDeps;\n }\n\n /**\n * Error context helper for consistent logging\n *\n * @param method - The method name.\n * @param additionalContext - The additional context value.\n * @returns The resulting string value.\n */\n #getErrorContext(\n method: string,\n additionalContext?: Record<string, unknown>,\n ): Record<string, unknown> {\n return {\n controller: 'TradingService',\n method,\n ...additionalContext,\n };\n }\n\n /**\n * Track order result analytics event (success or failure)\n *\n * @param options - The configuration options.\n * @param options.result - The transaction result to check.\n * @param options.error - The error that occurred.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.duration - Optional time duration.\n */\n #trackOrderResult(options: {\n result: OrderResult | null;\n error?: Error;\n params: OrderParams;\n context: ServiceContext;\n duration: number;\n }): void {\n const { result, error, params, duration } = options;\n\n const status =\n result?.success === true\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED;\n\n // Build base properties\n const properties: PerpsAnalyticsProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]: status,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: params.isBuy\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.orderType,\n [PERPS_EVENT_PROPERTY.LEVERAGE]: parseFloat(String(params.leverage ?? 1)),\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: parseFloat(\n result?.filledSize ?? params.size,\n ),\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,\n };\n\n // Add optional properties\n if (params.trackingData?.marginUsed !== undefined) {\n properties[PERPS_EVENT_PROPERTY.MARGIN_USED] =\n params.trackingData.marginUsed;\n }\n if (params.trackingData?.totalFee !== undefined) {\n properties[PERPS_EVENT_PROPERTY.FEES] = params.trackingData.totalFee;\n }\n if (result?.averagePrice ?? params.trackingData?.marketPrice) {\n properties[PERPS_EVENT_PROPERTY.ASSET_PRICE] = result?.averagePrice\n ? parseFloat(result.averagePrice)\n : params.trackingData?.marketPrice;\n }\n if (params.orderType === 'limit' && params.price) {\n properties[PERPS_EVENT_PROPERTY.LIMIT_PRICE] = parseFloat(params.price);\n }\n if (params.trackingData?.source) {\n properties[PERPS_EVENT_PROPERTY.SOURCE] = params.trackingData.source;\n }\n if (params.trackingData?.tradeAction) {\n properties[PERPS_EVENT_PROPERTY.ACTION] = params.trackingData.tradeAction;\n }\n // Pay with any token: trade_with_token (boolean); when true, include mm_pay_token_selected and mm_pay_network_selected; when false (Perps balance), include mm_pay_token_selected: \"Perps Balance\"\n properties[PERPS_EVENT_PROPERTY.TRADE_WITH_TOKEN] =\n params.trackingData?.tradeWithToken === true;\n if (params.trackingData?.tradeWithToken === true) {\n if (params.trackingData.mmPayTokenSelected !== undefined) {\n properties[PERPS_EVENT_PROPERTY.MM_PAY_TOKEN_SELECTED] =\n params.trackingData.mmPayTokenSelected;\n }\n if (params.trackingData.mmPayNetworkSelected !== undefined) {\n properties[PERPS_EVENT_PROPERTY.MM_PAY_NETWORK_SELECTED] =\n params.trackingData.mmPayNetworkSelected;\n }\n } else if (params.trackingData !== undefined) {\n properties[PERPS_EVENT_PROPERTY.MM_PAY_TOKEN_SELECTED] =\n PERPS_EVENT_VALUE.MM_PAY_TOKEN.PERPS_BALANCE;\n }\n\n // Calculate order value in USD (size * price)\n const orderSize = parseFloat(result?.filledSize ?? params.size);\n const assetPrice = result?.averagePrice\n ? parseFloat(result.averagePrice)\n : params.trackingData?.marketPrice;\n if (assetPrice && orderSize) {\n properties[PERPS_EVENT_PROPERTY.ORDER_VALUE] = orderSize * assetPrice;\n }\n\n // Add success-specific properties\n if (status === PERPS_EVENT_VALUE.STATUS.EXECUTED) {\n if (params.trackingData?.metamaskFee !== undefined) {\n properties[PERPS_EVENT_PROPERTY.METAMASK_FEE] =\n params.trackingData.metamaskFee;\n }\n if (params.trackingData?.metamaskFeeRate !== undefined) {\n properties[PERPS_EVENT_PROPERTY.METAMASK_FEE_RATE] =\n params.trackingData.metamaskFeeRate;\n }\n if (params.trackingData?.feeDiscountPercentage !== undefined) {\n properties[PERPS_EVENT_PROPERTY.DISCOUNT_PERCENTAGE] =\n params.trackingData.feeDiscountPercentage;\n }\n if (params.trackingData?.estimatedPoints !== undefined) {\n properties[PERPS_EVENT_PROPERTY.ESTIMATED_REWARDS] =\n params.trackingData.estimatedPoints;\n }\n if (params.takeProfitPrice) {\n properties[PERPS_EVENT_PROPERTY.TAKE_PROFIT_PRICE] = parseFloat(\n params.takeProfitPrice,\n );\n }\n if (params.stopLossPrice) {\n properties[PERPS_EVENT_PROPERTY.STOP_LOSS_PRICE] = parseFloat(\n params.stopLossPrice,\n );\n }\n } else {\n // Add failure-specific properties\n properties[PERPS_EVENT_PROPERTY.ERROR_MESSAGE] =\n error?.message ?? result?.error ?? 'Unknown error';\n }\n\n if (\n params.trackingData?.abTests &&\n Object.keys(params.trackingData.abTests).length > 0\n ) {\n properties[PERPS_EVENT_PROPERTY.AB_TESTS] = params.trackingData.abTests;\n }\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.TradeTransaction,\n properties,\n );\n }\n\n /**\n * Handle successful order placement (state updates, analytics, data lake reporting)\n *\n * @param options - The configuration options.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.reportOrderToDataLake - The report order to data lake value.\n */\n async #handleOrderSuccess(options: {\n params: OrderParams;\n context: ServiceContext;\n reportOrderToDataLake: (params: {\n action: 'open' | 'close';\n symbol: string;\n slPrice?: number;\n tpPrice?: number;\n }) => Promise<{ success: boolean; error?: string }>;\n }): Promise<void> {\n const { params, context, reportOrderToDataLake } = options;\n\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Save executed trade configuration for this market\n if (params.leverage && context.saveTradeConfiguration) {\n context.saveTradeConfiguration(params.symbol, params.leverage);\n }\n\n // Report to data lake (fire-and-forget with retry)\n reportOrderToDataLake({\n action: 'open',\n symbol: params.symbol,\n slPrice: params.stopLossPrice\n ? parseFloat(params.stopLossPrice)\n : undefined,\n tpPrice: params.takeProfitPrice\n ? parseFloat(params.takeProfitPrice)\n : undefined,\n }).catch((error) => {\n this.#deps.logger.error(\n ensureError(error, 'TradingService.handleOrderSuccess'),\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: 'reportOrderToDataLake',\n symbol: params.symbol,\n },\n },\n },\n );\n });\n }\n\n /**\n * Execute a trading operation with fee discount context\n * Ensures fee discount is always cleared after operation (success or failure)\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.feeDiscountBips - The fee discount bips value.\n * @param options.operation - The operation value.\n * @returns The result of the operation.\n */\n async #withFeeDiscount<TResult>(options: {\n provider: PerpsProvider;\n feeDiscountBips?: number;\n operation: () => Promise<TResult>;\n }): Promise<TResult> {\n const { provider, feeDiscountBips, operation } = options;\n\n try {\n // Set discount context in provider for this operation\n if (feeDiscountBips !== undefined && provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(feeDiscountBips);\n this.#deps.debugLogger.log(\n 'TradingService: Fee discount set in provider',\n {\n feeDiscountBips,\n },\n );\n }\n\n // Execute the operation\n return await operation();\n } finally {\n // Always clear discount context, even on exception\n if (provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(undefined);\n this.#deps.debugLogger.log(\n 'TradingService: Fee discount cleared from provider',\n );\n }\n }\n }\n\n /**\n * Place a new order with full orchestration\n * Handles tracing, fee discounts, state management, analytics, and data lake reporting\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.reportOrderToDataLake - The report order to data lake value.\n * @returns The result of the operation.\n */\n async placeOrder(options: {\n provider: PerpsProvider;\n params: OrderParams;\n context: ServiceContext;\n reportOrderToDataLake: (params: {\n action: 'open' | 'close';\n symbol: string;\n slPrice?: number;\n tpPrice?: number;\n }) => Promise<{ success: boolean; error?: string }>;\n }): Promise<OrderResult> {\n const { provider, params, context, reportOrderToDataLake } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let traceData:\n | { success: boolean; error?: string; orderId?: string }\n | undefined;\n\n const paymentToken =\n params.trackingData?.tradeWithToken === true\n ? (params.trackingData.mmPayTokenSelected ?? 'unknown_token')\n : 'perps_balance';\n\n try {\n this.#deps.tracer.addBreadcrumb({\n category: 'perps',\n message: 'Order execution started',\n level: 'info',\n data: {\n payment_token: paymentToken,\n market: params.symbol,\n orderType: params.orderType,\n },\n });\n\n // Start trace for the entire operation\n this.#deps.tracer.trace({\n name: PerpsTraceNames.PlaceOrder,\n id: traceId,\n op: PerpsTraceOperations.OrderSubmission,\n tags: {\n provider: context.tracingContext.provider,\n orderType: params.orderType,\n market: params.symbol,\n leverage: String(params.leverage ?? 1),\n isTestnet: String(context.tracingContext.isTestnet),\n payment_token: paymentToken,\n },\n data: {\n isBuy: params.isBuy,\n orderPrice: params.price ?? '',\n payment_token: paymentToken,\n },\n });\n\n // Calculate fee discount at execution time (fresh, secure)\n const feeDiscountBips = await this.#calculateFeeDiscountWithMeasurement();\n\n this.#deps.debugLogger.log('TradingService: Fee discount calculated', {\n feeDiscountBips,\n hasDiscount: feeDiscountBips !== undefined,\n });\n\n this.#deps.debugLogger.log(\n 'TradingService: Submitting order to provider',\n {\n symbol: params.symbol,\n orderType: params.orderType,\n isBuy: params.isBuy,\n size: params.size,\n leverage: params.leverage,\n hasTP: Boolean(params.takeProfitPrice),\n hasSL: Boolean(params.stopLossPrice),\n },\n );\n\n // Execute order with fee discount management\n const result = await this.#withFeeDiscount({\n provider,\n feeDiscountBips,\n operation: () => provider.placeOrder(params),\n });\n\n this.#deps.debugLogger.log('TradingService: Provider response received', {\n success: result.success,\n orderId: result.orderId,\n error: result.error,\n });\n\n // Update state and handle success/failure\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Handle success: state updates, data lake reporting\n await this.#handleOrderSuccess({\n params,\n context,\n reportOrderToDataLake,\n });\n traceData = { success: true, orderId: result.orderId ?? '' };\n\n // Invalidate standalone caches so external hooks (e.g., usePerpsPositionForAsset) refresh\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'positions' });\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'accountState' });\n } else {\n traceData = { success: false, error: result.error ?? 'Unknown error' };\n }\n\n // Track analytics (success or failure)\n this.#trackOrderResult({\n result,\n params,\n context,\n duration: completionDuration,\n });\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Track analytics for exception\n this.#trackOrderResult({\n result: null,\n error: error instanceof Error ? error : undefined,\n params,\n context,\n duration: completionDuration,\n });\n\n // withFeeDiscount handles fee discount cleanup automatically\n\n this.#deps.logger.error(ensureError(error, 'TradingService.placeOrder'), {\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: params.symbol,\n orderType: params.orderType,\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 // Always end trace on exit (success or failure)\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.PlaceOrder,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Load position data with performance measurement\n *\n * @param options - The configuration options.\n * @param options.symbol - The trading pair symbol.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async #loadPositionData(options: {\n symbol: string;\n context: ServiceContext;\n }): Promise<Position | undefined> {\n const { symbol, context } = options;\n\n const positionLoadStart = this.#deps.performance.now();\n try {\n const positions = context.getPositions\n ? await context.getPositions()\n : [];\n const position = positions.find((pos) => pos.symbol === symbol);\n\n this.#deps.tracer.setMeasurement(\n PerpsMeasurementName.PerpsGetPositionsOperation,\n this.#deps.performance.now() - positionLoadStart,\n 'millisecond',\n );\n\n return position;\n } catch (error) {\n this.#deps.debugLogger.log(\n 'TradingService: Could not get position data for tracking',\n error instanceof Error ? error.message : String(error),\n );\n return undefined;\n }\n }\n\n /**\n * Calculate close position metrics\n *\n * @param position - The position value.\n * @param params - The operation parameters.\n * @param result - The transaction result to check.\n * @returns The result of the operation.\n */\n #calculateCloseMetrics(\n position: Position,\n params: ClosePositionParams,\n result: OrderResult,\n ): {\n direction: string;\n closePercentage: number;\n closeType: string;\n orderType: string;\n filledSize: number;\n requestedSize: number;\n isPartiallyFilled: boolean;\n } {\n const direction =\n parseFloat(position.size) > 0\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT;\n\n const filledSize = result.filledSize ? parseFloat(result.filledSize) : 0;\n const requestedSize = params.size\n ? parseFloat(params.size)\n : Math.abs(parseFloat(position.size));\n const isPartiallyFilled = filledSize > 0 && filledSize < requestedSize;\n\n const orderType = params.orderType ?? PERPS_EVENT_VALUE.ORDER_TYPE.MARKET;\n const closePercentage = params.size\n ? (parseFloat(params.size) / Math.abs(parseFloat(position.size))) * 100\n : 100;\n const closeType =\n closePercentage === 100\n ? PERPS_EVENT_VALUE.CLOSE_TYPE.FULL\n : PERPS_EVENT_VALUE.CLOSE_TYPE.PARTIAL;\n\n return {\n direction,\n closePercentage,\n closeType,\n orderType,\n filledSize,\n requestedSize,\n isPartiallyFilled,\n };\n }\n\n /**\n * Build event properties for position close analytics\n *\n * @param position - The position value.\n * @param params - The operation parameters.\n * @param metrics - The metrics value.\n * @param metrics.direction - The sort direction.\n * @param metrics.closePercentage - The close percentage value.\n * @param metrics.closeType - The close type value.\n * @param metrics.orderType - The order type value.\n * @param metrics.requestedSize - The requested size value.\n * @param result - The transaction result to check.\n * @param status - The status value.\n * @param error - The error that occurred.\n * @returns The result of the operation.\n */\n #buildCloseEventProperties(\n position: Position,\n params: ClosePositionParams,\n metrics: {\n direction: string;\n closePercentage: number;\n closeType: string;\n orderType: string;\n requestedSize: number;\n },\n result: OrderResult | null,\n status: string,\n error?: string,\n ): Record<string, unknown> {\n const baseProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]: status,\n [PERPS_EVENT_PROPERTY.ASSET]: position.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: metrics.direction,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: metrics.orderType,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: metrics.requestedSize,\n [PERPS_EVENT_PROPERTY.OPEN_POSITION_SIZE]: Math.abs(\n parseFloat(position.size),\n ),\n [PERPS_EVENT_PROPERTY.PERCENTAGE_CLOSED]: metrics.closePercentage,\n ...(position.unrealizedPnl && {\n [PERPS_EVENT_PROPERTY.PNL_DOLLAR]: parseFloat(position.unrealizedPnl),\n }),\n ...(position.returnOnEquity && {\n [PERPS_EVENT_PROPERTY.PNL_PERCENT]:\n parseFloat(position.returnOnEquity) * 100,\n }),\n ...(params.trackingData?.totalFee !== undefined && {\n [PERPS_EVENT_PROPERTY.FEE]: params.trackingData.totalFee,\n }),\n ...(params.trackingData?.metamaskFee !== undefined && {\n [PERPS_EVENT_PROPERTY.METAMASK_FEE]: params.trackingData.metamaskFee,\n }),\n ...(params.trackingData?.metamaskFeeRate !== undefined && {\n [PERPS_EVENT_PROPERTY.METAMASK_FEE_RATE]:\n params.trackingData.metamaskFeeRate,\n }),\n ...(params.trackingData?.feeDiscountPercentage !== undefined && {\n [PERPS_EVENT_PROPERTY.DISCOUNT_PERCENTAGE]:\n params.trackingData.feeDiscountPercentage,\n }),\n ...(params.trackingData?.estimatedPoints !== undefined && {\n [PERPS_EVENT_PROPERTY.ESTIMATED_REWARDS]:\n params.trackingData.estimatedPoints,\n }),\n ...((params.trackingData?.marketPrice ?? result?.averagePrice) && {\n [PERPS_EVENT_PROPERTY.ASSET_PRICE]: result?.averagePrice\n ? parseFloat(result.averagePrice)\n : params.trackingData?.marketPrice,\n }),\n ...(params.orderType === 'limit' &&\n params.price && {\n [PERPS_EVENT_PROPERTY.LIMIT_PRICE]: parseFloat(params.price),\n }),\n ...(params.trackingData?.receivedAmount !== undefined && {\n [PERPS_EVENT_PROPERTY.RECEIVED_AMOUNT]:\n params.trackingData.receivedAmount,\n }),\n ...(params.trackingData?.source && {\n [PERPS_EVENT_PROPERTY.SOURCE]: params.trackingData.source,\n }),\n };\n\n // Calculate and add order value in USD (size * price)\n const closeAssetPrice = result?.averagePrice\n ? parseFloat(result.averagePrice)\n : params.trackingData?.marketPrice;\n const orderValue =\n closeAssetPrice && metrics.requestedSize\n ? metrics.requestedSize * closeAssetPrice\n : undefined;\n\n // Add success-specific properties\n if (status === PERPS_EVENT_VALUE.STATUS.EXECUTED) {\n return {\n ...baseProperties,\n [PERPS_EVENT_PROPERTY.CLOSE_TYPE]: metrics.closeType,\n ...(orderValue !== undefined && {\n [PERPS_EVENT_PROPERTY.ORDER_VALUE]: orderValue,\n }),\n };\n }\n\n // Add error for failures\n return {\n ...baseProperties,\n ...(error && { [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: error }),\n ...(orderValue !== undefined && {\n [PERPS_EVENT_PROPERTY.ORDER_VALUE]: orderValue,\n }),\n };\n }\n\n /**\n * Track position close result analytics (consolidates all tracking logic)\n *\n * @param options - The configuration options.\n * @param options.position - The position value.\n * @param options.result - The transaction result to check.\n * @param options.error - The error that occurred.\n * @param options.params - The operation parameters.\n * @param options.context - The service context for dependencies.\n * @param options.duration - Optional time duration.\n */\n #trackPositionCloseResult(options: {\n position: Position | undefined;\n result: OrderResult | null;\n error?: Error;\n params: ClosePositionParams;\n context: ServiceContext;\n duration: number;\n }): void {\n const { position, result, error, params, duration } = options;\n\n if (!position) {\n return;\n }\n\n const metrics = result\n ? this.#calculateCloseMetrics(position, params, result)\n : {\n direction:\n parseFloat(position.size) > 0\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n closePercentage: params.size\n ? (parseFloat(params.size) / Math.abs(parseFloat(position.size))) *\n 100\n : 100,\n closeType: PERPS_EVENT_VALUE.CLOSE_TYPE.FULL,\n orderType: params.orderType ?? PERPS_EVENT_VALUE.ORDER_TYPE.MARKET,\n requestedSize: params.size\n ? parseFloat(params.size)\n : Math.abs(parseFloat(position.size)),\n filledSize: 0,\n isPartiallyFilled: false,\n };\n\n // Track partially filled event if applicable\n if (result?.success && metrics.isPartiallyFilled) {\n const partialProperties = this.#buildCloseEventProperties(\n position,\n params,\n metrics,\n result,\n PERPS_EVENT_VALUE.STATUS.PARTIALLY_FILLED,\n );\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.PositionCloseTransaction,\n {\n ...partialProperties,\n [PERPS_EVENT_PROPERTY.AMOUNT_FILLED]: metrics.filledSize,\n [PERPS_EVENT_PROPERTY.REMAINING_AMOUNT]:\n metrics.requestedSize - metrics.filledSize,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,\n },\n );\n }\n\n // Determine status\n const status =\n result?.success === true\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED;\n\n const errorMessage = error?.message ?? result?.error;\n\n // Track main close event\n const eventProperties = this.#buildCloseEventProperties(\n position,\n params,\n metrics,\n result,\n status,\n errorMessage,\n );\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.PositionCloseTransaction,\n {\n ...eventProperties,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,\n },\n );\n }\n\n /**\n * Handle data lake reporting (fire-and-forget)\n *\n * @param reportOrderToDataLake - The report order to data lake value.\n * @param symbol - The trading pair symbol.\n * @param context - The service context for dependencies.\n */\n #handleDataLakeReporting(\n reportOrderToDataLake: (params: {\n action: 'open' | 'close';\n symbol: string;\n }) => Promise<{ success: boolean; error?: string }>,\n symbol: string,\n context: ServiceContext,\n ): void {\n reportOrderToDataLake({\n action: 'close',\n symbol,\n }).catch((error) => {\n this.#deps.logger.error(\n ensureError(error, 'TradingService.handleDataLakeReporting'),\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: 'reportOrderToDataLake',\n symbol,\n },\n },\n },\n );\n });\n }\n\n /**\n * Calculate fee discount with performance measurement\n * Uses controller dependencies injected via setControllerDependencies()\n * Helper method for placeOrder orchestration\n *\n * @returns The result of the operation.\n */\n async #calculateFeeDiscountWithMeasurement(): Promise<number | undefined> {\n // Check if controller dependencies are available\n if (!this.#controllerDeps) {\n this.#deps.debugLogger.log(\n 'TradingService: Controller dependencies not set, skipping fee discount',\n );\n return undefined;\n }\n\n const { rewardsIntegrationService } = this.#controllerDeps;\n\n const orderExecutionFeeDiscountStartTime = this.#deps.performance.now();\n\n // Calculate fee discount using messenger pattern (service handles controller access internally)\n const discountBips =\n await rewardsIntegrationService.calculateUserFeeDiscount();\n\n const orderExecutionFeeDiscountDuration =\n this.#deps.performance.now() - orderExecutionFeeDiscountStartTime;\n\n // Record measurement\n this.#deps.tracer.setMeasurement(\n PerpsMeasurementName.PerpsRewardsOrderExecutionFeeDiscountApiCall,\n orderExecutionFeeDiscountDuration,\n 'millisecond',\n );\n\n this.#deps.debugLogger.log(\n 'TradingService: Fee discount API call completed',\n {\n discountBips,\n duration: `${orderExecutionFeeDiscountDuration.toFixed(0)}ms`,\n },\n );\n\n return discountBips;\n }\n\n /**\n * Edit an existing order with full orchestration\n * Handles tracing, fee discounts, state management, and analytics\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 editOrder(options: {\n provider: PerpsProvider;\n params: EditOrderParams;\n context: ServiceContext;\n }): Promise<OrderResult> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let traceData:\n | { success: boolean; error?: string; orderId?: string }\n | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.EditOrder,\n id: traceId,\n op: PerpsTraceOperations.OrderSubmission,\n tags: {\n provider: context.tracingContext.provider,\n orderType: params.newOrder.orderType,\n market: params.newOrder.symbol,\n leverage: String(params.newOrder.leverage ?? 1),\n isTestnet: String(context.tracingContext.isTestnet),\n },\n data: {\n isBuy: params.newOrder.isBuy,\n orderPrice: params.newOrder.price ?? '',\n },\n });\n\n // Calculate fee discount only if required dependencies are available\n const feeDiscountBips = await this.#calculateFeeDiscountWithMeasurement();\n\n // Execute order edit with fee discount management\n const result = await this.#withFeeDiscount({\n provider,\n feeDiscountBips,\n operation: () => provider.editOrder(params),\n });\n\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Track order edit executed\n const editExecutedProps: PerpsAnalyticsProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.EXECUTED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.newOrder.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: params.newOrder.isBuy\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.newOrder.orderType,\n [PERPS_EVENT_PROPERTY.LEVERAGE]: params.newOrder.leverage ?? 1,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: params.newOrder.size,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n };\n if (params.newOrder.price) {\n editExecutedProps[PERPS_EVENT_PROPERTY.LIMIT_PRICE] = parseFloat(\n params.newOrder.price,\n );\n }\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.TradeTransaction,\n editExecutedProps,\n );\n\n traceData = { success: true, orderId: result.orderId ?? '' };\n } else {\n // Track order edit failed\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.TradeTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.newOrder.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: params.newOrder.isBuy\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.newOrder.orderType,\n [PERPS_EVENT_PROPERTY.LEVERAGE]: params.newOrder.leverage ?? 1,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: params.newOrder.size,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n result.error ?? 'Unknown error',\n },\n );\n\n traceData = { success: false, error: result.error ?? 'Unknown error' };\n }\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Track order edit exception\n this.#deps.metrics.trackPerpsEvent(PerpsAnalyticsEvent.TradeTransaction, {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.newOrder.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: params.newOrder.isBuy\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.newOrder.orderType,\n [PERPS_EVENT_PROPERTY.LEVERAGE]: params.newOrder.leverage ?? 1,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: params.newOrder.size,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n error instanceof Error ? error.message : 'Unknown error',\n });\n\n this.#deps.logger.error(ensureError(error, 'TradingService.editOrder'), {\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 orderId: params.orderId,\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.EditOrder,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Cancel a single order with full orchestration\n * Handles tracing, state management, and analytics\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 cancelOrder(options: {\n provider: PerpsProvider;\n params: CancelOrderParams;\n context: ServiceContext;\n }): Promise<CancelOrderResult> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let traceData:\n | { success: boolean; error?: string; orderId?: string }\n | undefined;\n\n try {\n // Start trace for the entire operation\n this.#deps.tracer.trace({\n name: PerpsTraceNames.CancelOrder,\n id: traceId,\n op: PerpsTraceOperations.OrderSubmission,\n tags: {\n provider: context.tracingContext.provider,\n market: params.symbol,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n data: {\n orderId: params.orderId,\n },\n });\n\n // Execute order cancellation\n const result = await provider.cancelOrder(params);\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Track order cancel executed\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.OrderCancelTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.EXECUTED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n },\n );\n\n traceData = { success: true, orderId: params.orderId };\n } else {\n // Track order cancel failed\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.OrderCancelTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n result.error ?? 'Unknown error',\n },\n );\n\n traceData = { success: false, error: result.error ?? 'Unknown error' };\n }\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Track order cancel exception\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.OrderCancelTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n error instanceof Error ? error.message : 'Unknown error',\n },\n );\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.cancelOrder'),\n this.#getErrorContext('cancelOrder', { symbol: params.symbol }),\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.CancelOrder,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Cancel multiple orders with full orchestration\n * Handles tracing, stream pausing, filtering, batch operations, and analytics\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.withStreamPause - The with stream pause value.\n * @returns The result of the operation.\n */\n async cancelOrders(options: {\n provider: PerpsProvider;\n params: CancelOrdersParams;\n context: ServiceContext;\n withStreamPause: <TResult>(\n operation: () => Promise<TResult>,\n channels: string[],\n ) => Promise<TResult>;\n }): Promise<CancelOrdersResult> {\n const { provider, params, context, withStreamPause } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let operationResult: CancelOrdersResult | null = null;\n let operationError: Error | null = null;\n\n try {\n // Start trace for batch operation\n this.#deps.tracer.trace({\n name: PerpsTraceNames.CancelOrder,\n id: traceId,\n op: PerpsTraceOperations.OrderSubmission,\n tags: {\n provider: context.tracingContext.provider,\n isBatch: 'true',\n isTestnet: String(context.tracingContext.isTestnet),\n },\n data: {\n cancelAll: params.cancelAll ? 'true' : 'false',\n symbolCount: params.symbols?.length ?? 0,\n orderIdCount: params.orderIds?.length ?? 0,\n },\n });\n\n // Pause orders stream to prevent WebSocket updates during cancellation\n operationResult = await withStreamPause(async () => {\n // Get all open orders\n if (!context.getOpenOrders) {\n throw new Error('getOpenOrders callback not provided in context');\n }\n const orders = await context.getOpenOrders();\n\n // Filter orders based on params\n let ordersToCancel = orders;\n if (\n params.cancelAll === true ||\n (!params.symbols && !params.orderIds)\n ) {\n // Cancel all orders (excluding TP/SL orders for positions)\n ordersToCancel = orders.filter(\n (order) => !isTPSLOrder(order.detailedOrderType),\n );\n } else if (params.orderIds && params.orderIds.length > 0) {\n // Cancel specific order IDs\n ordersToCancel = orders.filter((order) =>\n params.orderIds?.includes(order.orderId),\n );\n } else if (params.symbols && params.symbols.length > 0) {\n // Cancel orders for specific symbols\n ordersToCancel = orders.filter((order) =>\n params.symbols?.includes(order.symbol),\n );\n }\n\n if (ordersToCancel.length === 0) {\n return {\n success: false,\n successCount: 0,\n failureCount: 0,\n results: [],\n };\n }\n\n // Use batch cancel if provider supports it\n if (provider.cancelOrders) {\n return await provider.cancelOrders(\n ordersToCancel.map((order) => ({\n symbol: order.symbol,\n orderId: order.orderId,\n })),\n );\n }\n\n // Fallback: Cancel orders in parallel (for providers without batch support)\n const results = await Promise.allSettled(\n ordersToCancel.map((order) =>\n this.cancelOrder({\n provider,\n params: { symbol: order.symbol, orderId: order.orderId },\n context,\n }),\n ),\n );\n\n // Aggregate results\n const successCount = results.filter(\n (res) => res.status === 'fulfilled' && res.value.success,\n ).length;\n const failureCount = results.length - successCount;\n\n return {\n success: successCount > 0,\n successCount,\n failureCount,\n results: results.map((result, index) => {\n let error: string | undefined;\n if (result.status === 'rejected') {\n error =\n result.reason instanceof Error\n ? result.reason.message\n : 'Unknown error';\n } else if (result.status === 'fulfilled' && !result.value.success) {\n error = result.value.error;\n }\n\n return {\n orderId: ordersToCancel[index].orderId,\n symbol: ordersToCancel[index].symbol,\n success: Boolean(\n result.status === 'fulfilled' && result.value.success,\n ),\n error,\n };\n }),\n };\n }, ['orders']); // Disconnect orders stream during operation\n\n return operationResult;\n } catch (error) {\n operationError =\n error instanceof Error ? error : new Error(String(error));\n this.#deps.logger.error(\n ensureError(error, 'TradingService.cancelOrders'),\n this.#getErrorContext('cancelOrders'),\n );\n throw error;\n } finally {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Track batch cancel event (success or failure)\n const batchCancelProps: PerpsAnalyticsProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]:\n operationResult?.success && operationResult.successCount > 0\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n };\n if (operationError) {\n batchCancelProps[PERPS_EVENT_PROPERTY.ERROR_MESSAGE] =\n operationError.message;\n }\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.OrderCancelTransaction,\n batchCancelProps,\n );\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.CancelOrder,\n id: traceId,\n });\n }\n }\n\n /**\n * Close a single position with full orchestration\n * Handles tracing, fee discounts, state management, analytics, and data lake reporting\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.reportOrderToDataLake - The report order to data lake value.\n * @returns The result of the operation.\n */\n async closePosition(options: {\n provider: PerpsProvider;\n params: ClosePositionParams;\n context: ServiceContext;\n reportOrderToDataLake: (params: {\n action: 'open' | 'close';\n symbol: string;\n }) => Promise<{ success: boolean; error?: string }>;\n }): Promise<OrderResult> {\n const { provider, params, context, reportOrderToDataLake } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let position: Position | undefined;\n let result: OrderResult | undefined;\n let traceData:\n | { success: boolean; error?: string; filledSize?: string }\n | undefined;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.ClosePosition,\n id: traceId,\n op: PerpsTraceOperations.PositionManagement,\n tags: {\n provider: context.tracingContext.provider,\n symbol: params.symbol,\n closeSize: params.size ?? 'full',\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n // Load position data with measurement\n position = await this.#loadPositionData({\n symbol: params.symbol,\n context,\n });\n\n // Calculate fee discount with measurement\n const feeDiscountBips = await this.#calculateFeeDiscountWithMeasurement();\n\n // Execute position close with fee discount management\n result = await this.#withFeeDiscount({\n provider,\n feeDiscountBips,\n operation: () => provider.closePosition(params),\n });\n\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Report to data lake (fire-and-forget)\n this.#handleDataLakeReporting(\n reportOrderToDataLake,\n params.symbol,\n context,\n );\n\n traceData = { success: true, filledSize: result.filledSize ?? '' };\n\n // Invalidate standalone caches so external hooks (e.g., usePerpsPositionForAsset) refresh\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'positions' });\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'accountState' });\n } else {\n traceData = { success: false, error: result.error ?? 'Unknown error' };\n }\n\n // Track analytics (success or failure, includes partial fills)\n this.#trackPositionCloseResult({\n position,\n result,\n params,\n context,\n duration: completionDuration,\n });\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n traceData = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n\n // Track analytics for exception\n this.#trackPositionCloseResult({\n position,\n result: null,\n error: error instanceof Error ? error : undefined,\n params,\n context,\n duration: completionDuration,\n });\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.closePosition'),\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: params.symbol,\n },\n },\n },\n );\n\n throw error;\n } finally {\n // Always end trace on exit (success or failure)\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.ClosePosition,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Close multiple positions with full orchestration\n * Handles tracing, fee discounts, batch operations, and analytics\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 closePositions(options: {\n provider: PerpsProvider;\n params: ClosePositionsParams;\n context: ServiceContext;\n }): Promise<ClosePositionsResult> {\n const { provider, params, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let operationResult: ClosePositionsResult | null = null;\n let operationError: Error | null = null;\n\n try {\n // Start trace for batch operation\n this.#deps.tracer.trace({\n name: PerpsTraceNames.ClosePosition,\n id: traceId,\n op: PerpsTraceOperations.PositionManagement,\n tags: {\n provider: context.tracingContext.provider,\n isBatch: 'true',\n isTestnet: String(context.tracingContext.isTestnet),\n },\n data: {\n closeAll: params.closeAll ? 'true' : 'false',\n symbolCount: params.symbols?.length ?? 0,\n },\n });\n\n this.#deps.debugLogger.log('[closePositions] Batch method check', {\n providerType: provider.protocolId,\n providerKeys: Object.keys(provider).filter((key) =>\n key.includes('close'),\n ),\n });\n\n // Use batch close if provider supports it (provider handles filtering)\n if (provider.closePositions) {\n const feeDiscountBips =\n await this.#calculateFeeDiscountWithMeasurement();\n\n operationResult = await this.#withFeeDiscount({\n provider,\n feeDiscountBips,\n operation: async () => {\n if (!provider.closePositions) {\n throw new Error('closePositions method not available');\n }\n return provider.closePositions(params);\n },\n });\n } else {\n // Fallback: Get positions, filter, and close in parallel\n if (!context.getPositions) {\n throw new Error('getPositions callback not provided in context');\n }\n const positions = await context.getPositions();\n\n const positionsToClose =\n params.closeAll === true ||\n !params.symbols ||\n params.symbols.length === 0\n ? positions\n : positions.filter((pos) => params.symbols?.includes(pos.symbol));\n\n if (positionsToClose.length === 0) {\n operationResult = {\n success: false,\n successCount: 0,\n failureCount: 0,\n results: [],\n };\n return operationResult;\n }\n\n const results = await Promise.allSettled(\n positionsToClose.map((position) =>\n this.closePosition({\n provider,\n params: { symbol: position.symbol },\n context,\n reportOrderToDataLake: () => Promise.resolve({ success: true }), // No-op for batch fallback\n }),\n ),\n );\n\n // Aggregate results\n const successCount = results.filter(\n (res) => res.status === 'fulfilled' && res.value.success,\n ).length;\n const failureCount = results.length - successCount;\n\n operationResult = {\n success: successCount > 0,\n successCount,\n failureCount,\n results: results.map((result, index) => {\n let error: string | undefined;\n if (result.status === 'rejected') {\n error =\n result.reason instanceof Error\n ? result.reason.message\n : 'Unknown error';\n } else if (result.status === 'fulfilled' && !result.value.success) {\n error = result.value.error;\n }\n\n return {\n symbol: positionsToClose[index].symbol,\n success: Boolean(\n result.status === 'fulfilled' && result.value.success,\n ),\n error,\n };\n }),\n };\n }\n\n return operationResult;\n } catch (error) {\n operationError =\n error instanceof Error ? error : new Error(String(error));\n this.#deps.logger.error(\n ensureError(error, 'TradingService.closePositions'),\n this.#getErrorContext('closePositions', {\n symbols: params.symbols?.length ?? 0,\n closeAll: params.closeAll,\n }),\n );\n throw error;\n } finally {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Track batch close event (success or failure)\n const batchCloseProps: PerpsAnalyticsProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]:\n operationResult?.success && operationResult.successCount > 0\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n };\n if (operationError) {\n batchCloseProps[PERPS_EVENT_PROPERTY.ERROR_MESSAGE] =\n operationError.message;\n }\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.PositionCloseTransaction,\n batchCloseProps,\n );\n\n // Invalidate standalone caches on successful batch close\n if (operationResult?.success && operationResult.successCount > 0) {\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'positions' });\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'accountState' });\n }\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.ClosePosition,\n id: traceId,\n });\n }\n }\n\n /**\n * Update TP/SL for an existing position with full orchestration\n * Handles tracing, fee discounts, state management, and analytics\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 updatePositionTPSL(options: {\n provider: PerpsProvider;\n params: UpdatePositionTPSLParams;\n context: ServiceContext;\n }): Promise<OrderResult> {\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 let result: OrderResult | undefined;\n let errorMessage: string | undefined;\n\n // Extract tracking data with defaults\n const direction = params.trackingData?.direction;\n const positionSize = params.trackingData?.positionSize;\n const source =\n params.trackingData?.source ?? PERPS_EVENT_VALUE.SOURCE.TP_SL_VIEW;\n const takeProfitPercentage = params.trackingData?.takeProfitPercentage;\n const stopLossPercentage = params.trackingData?.stopLossPercentage;\n const isEditingExistingPosition =\n params.trackingData?.isEditingExistingPosition ?? false;\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.UpdateTpsl,\n id: traceId,\n op: PerpsTraceOperations.PositionManagement,\n tags: {\n provider: context.tracingContext.provider,\n market: params.symbol,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n data: {\n takeProfitPrice: params.takeProfitPrice ?? '',\n stopLossPrice: params.stopLossPrice ?? '',\n },\n });\n\n // Get fee discount from rewards\n const feeDiscountBips = await this.#calculateFeeDiscountWithMeasurement();\n\n // Execute with fee discount management\n result = await this.#withFeeDiscount({\n provider,\n feeDiscountBips,\n operation: () => provider.updatePositionTPSL(params),\n });\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n traceData = { success: true };\n } else {\n errorMessage = result.error ?? 'Unknown error';\n traceData = { success: false, error: errorMessage };\n }\n\n return result;\n } catch (error) {\n errorMessage = error instanceof Error ? error.message : 'Unknown error';\n traceData = { success: false, error: errorMessage };\n throw error;\n } finally {\n const completionDuration = this.#deps.performance.now() - startTime;\n\n // Determine screen type based on whether editing existing position\n const screenType = isEditingExistingPosition\n ? PERPS_EVENT_VALUE.SCREEN_TYPE.EDIT_TPSL\n : PERPS_EVENT_VALUE.SCREEN_TYPE.CREATE_TPSL;\n\n // Determine if TP/SL are set\n const hasTakeProfit = Boolean(params.takeProfitPrice);\n const hasStopLoss = Boolean(params.stopLossPrice);\n\n // Determine TP/SL action type\n let tpslAction: string | undefined;\n if (hasTakeProfit && hasStopLoss) {\n tpslAction = PERPS_EVENT_VALUE.ACTION.TPSL;\n } else if (hasTakeProfit) {\n tpslAction = PERPS_EVENT_VALUE.ACTION.TP;\n } else if (hasStopLoss) {\n tpslAction = PERPS_EVENT_VALUE.ACTION.SL;\n }\n\n // Build comprehensive event properties\n const eventProperties = {\n [PERPS_EVENT_PROPERTY.STATUS]: result?.success\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.SOURCE]: source,\n [PERPS_EVENT_PROPERTY.SCREEN_TYPE]: screenType,\n [PERPS_EVENT_PROPERTY.HAS_TAKE_PROFIT]: hasTakeProfit,\n [PERPS_EVENT_PROPERTY.HAS_STOP_LOSS]: hasStopLoss,\n ...(tpslAction && {\n [PERPS_EVENT_PROPERTY.ACTION]: tpslAction,\n }),\n ...(direction && {\n [PERPS_EVENT_PROPERTY.DIRECTION]:\n direction === 'long'\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n }),\n ...(positionSize !== undefined && {\n [PERPS_EVENT_PROPERTY.POSITION_SIZE]: positionSize,\n }),\n ...(params.takeProfitPrice && {\n [PERPS_EVENT_PROPERTY.TAKE_PROFIT_PRICE]: parseFloat(\n params.takeProfitPrice,\n ),\n }),\n ...(params.stopLossPrice && {\n [PERPS_EVENT_PROPERTY.STOP_LOSS_PRICE]: parseFloat(\n params.stopLossPrice,\n ),\n }),\n ...(takeProfitPercentage !== undefined && {\n [PERPS_EVENT_PROPERTY.TAKE_PROFIT_PERCENTAGE]: takeProfitPercentage,\n }),\n ...(stopLossPercentage !== undefined && {\n [PERPS_EVENT_PROPERTY.STOP_LOSS_PERCENTAGE]: stopLossPercentage,\n }),\n ...(errorMessage && {\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,\n }),\n };\n\n // Track event once with all properties\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.RiskManagement,\n eventProperties,\n );\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.UpdateTpsl,\n id: traceId,\n data: traceData,\n });\n }\n }\n\n /**\n * Update margin for an existing position (add or remove)\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.amount - The amount value.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async updateMargin(options: {\n provider: PerpsProvider;\n symbol: string;\n amount: string;\n context: ServiceContext;\n }): Promise<{ success: boolean; error?: string }> {\n const { provider, symbol, amount, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.UpdateMargin,\n id: traceId,\n op: PerpsTraceOperations.PositionManagement,\n tags: {\n provider: context.tracingContext.provider,\n symbol,\n isAdd: String(parseFloat(amount) > 0),\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n // Call provider method\n const result = await provider.updateMargin?.({ symbol, amount });\n\n if (!result) {\n throw new Error('Provider does not support margin adjustment');\n }\n\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Track success analytics\n this.#deps.metrics.trackPerpsEvent(PerpsAnalyticsEvent.RiskManagement, {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.EXECUTED,\n [PERPS_EVENT_PROPERTY.ASSET]: symbol,\n [PERPS_EVENT_PROPERTY.ACTION]:\n parseFloat(amount) > 0 ? 'add_margin' : 'remove_margin',\n [PERPS_EVENT_PROPERTY.MARGIN_USED]: Math.abs(parseFloat(amount)),\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n });\n\n // Invalidate standalone caches so external hooks refresh\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'positions' });\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'accountState' });\n }\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.UpdateMargin,\n id: traceId,\n data: { success: result.success, error: result.error ?? '' },\n });\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.updateMargin'),\n this.#getErrorContext('updateMargin', { symbol, amount }),\n );\n\n // Track failure analytics\n this.#deps.metrics.trackPerpsEvent(PerpsAnalyticsEvent.RiskManagement, {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: symbol,\n [PERPS_EVENT_PROPERTY.ACTION]:\n parseFloat(amount) > 0 ? 'add_margin' : 'remove_margin',\n [PERPS_EVENT_PROPERTY.MARGIN_USED]: Math.abs(parseFloat(amount)),\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,\n });\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.UpdateMargin,\n id: traceId,\n data: { success: false, error: errorMessage },\n });\n\n throw error;\n }\n }\n\n /**\n * Flip position (reverse direction while keeping size and leverage)\n *\n * @param options - The configuration options.\n * @param options.provider - The perps provider instance.\n * @param options.position - The position data.\n * @param options.context - The service context for dependencies.\n * @returns The result of the operation.\n */\n async flipPosition(options: {\n provider: PerpsProvider;\n position: Position;\n context: ServiceContext;\n }): Promise<OrderResult> {\n const { provider, position, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n\n try {\n this.#deps.tracer.trace({\n name: PerpsTraceNames.FlipPosition,\n id: traceId,\n op: PerpsTraceOperations.PositionManagement,\n tags: {\n provider: context.tracingContext.provider,\n symbol: position.symbol,\n isTestnet: String(context.tracingContext.isTestnet),\n },\n });\n\n // Calculate flip parameters\n const positionSize = Math.abs(parseFloat(position.size));\n const isCurrentlyLong = parseFloat(position.size) > 0;\n const oppositeDirection = !isCurrentlyLong;\n\n // Validate available balance for fees\n const accountState = await provider.getAccountState?.();\n if (!accountState) {\n throw new Error('Failed to get account state');\n }\n\n const availableBalance = parseFloat(accountState.availableBalance);\n\n // Estimate fees: ESTIMATED_FEE_RATE (0.09%) already accounts for both legs\n // (close at 0.045% + open at 0.045% = 0.09% of position notional).\n // Apply to 1x notional (positionSize * entryPrice), not 2x (flipSize * entryPrice).\n const entryPrice = parseFloat(position.entryPrice);\n const flipSize = positionSize * 2;\n const notionalValue = positionSize * entryPrice;\n const estimatedFees = notionalValue * ESTIMATED_FEE_RATE;\n\n if (estimatedFees > availableBalance) {\n throw new Error(\n `Insufficient balance for flip fees. Need $${estimatedFees.toFixed(2)}, have $${availableBalance.toFixed(2)}`,\n );\n }\n\n // Create order params for flip\n // Use 2x position size: 1x to close current position + 1x to open opposite position\n const orderParams: OrderParams = {\n symbol: position.symbol,\n isBuy: oppositeDirection,\n size: flipSize.toString(),\n orderType: 'market',\n leverage: position.leverage?.value,\n currentPrice: entryPrice,\n };\n\n // Place flip order (HyperLiquid handles margin transfer automatically)\n const result = await provider.placeOrder(orderParams);\n\n const completionDuration = this.#deps.performance.now() - startTime;\n\n if (result.success) {\n // Update state on success\n if (context.stateManager) {\n context.stateManager.update((state) => {\n state.lastUpdateTimestamp = Date.now();\n });\n }\n\n // Track success analytics with direction-specific flip action\n const flipAction = isCurrentlyLong\n ? PERPS_EVENT_VALUE.ACTION.FLIP_LONG_TO_SHORT\n : PERPS_EVENT_VALUE.ACTION.FLIP_SHORT_TO_LONG;\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.TradeTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.EXECUTED,\n [PERPS_EVENT_PROPERTY.ASSET]: position.symbol,\n [PERPS_EVENT_PROPERTY.DIRECTION]: oppositeDirection\n ? PERPS_EVENT_VALUE.DIRECTION.LONG\n : PERPS_EVENT_VALUE.DIRECTION.SHORT,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: 'market',\n [PERPS_EVENT_PROPERTY.LEVERAGE]: position.leverage?.value || 1,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: positionSize,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ACTION]: flipAction,\n [PERPS_EVENT_PROPERTY.ORDER_VALUE]:\n positionSize * parseFloat(position.entryPrice),\n },\n );\n\n // Invalidate standalone caches so external hooks refresh\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'positions' });\n this.#deps.cacheInvalidator.invalidate({ cacheType: 'accountState' });\n }\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FlipPosition,\n id: traceId,\n data: { success: result.success ?? false, error: result.error ?? '' },\n });\n\n return result;\n } catch (error) {\n const completionDuration = this.#deps.performance.now() - startTime;\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.flipPosition'),\n this.#getErrorContext('flipPosition', { symbol: position.symbol }),\n );\n\n // Track failure analytics with direction-specific flip action\n const wasLong = parseFloat(position.size) > 0;\n const failFlipAction = wasLong\n ? PERPS_EVENT_VALUE.ACTION.FLIP_LONG_TO_SHORT\n : PERPS_EVENT_VALUE.ACTION.FLIP_SHORT_TO_LONG;\n\n this.#deps.metrics.trackPerpsEvent(PerpsAnalyticsEvent.TradeTransaction, {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.ASSET]: position.symbol,\n [PERPS_EVENT_PROPERTY.ACTION]: failFlipAction,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,\n });\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FlipPosition,\n id: traceId,\n data: { success: false, error: errorMessage },\n });\n\n throw error;\n }\n }\n}\n"]}
|