@metamask-previews/perps-controller 20.0.0-preview-4fa35a45a → 20.0.0-preview-92e2f53

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.
Files changed (36) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/constants/eventNames.d.ts +2 -0
  3. package/dist/constants/eventNames.d.ts.map +1 -1
  4. package/dist/constants/eventNames.js +1 -0
  5. package/dist/constants/eventNames.js.map +1 -1
  6. package/dist/errors.d.ts +50 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +39 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/index.d.ts +3 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/perpsErrorCodes.d.ts +8 -0
  15. package/dist/perpsErrorCodes.d.ts.map +1 -1
  16. package/dist/perpsErrorCodes.js +11 -0
  17. package/dist/perpsErrorCodes.js.map +1 -1
  18. package/dist/providers/HyperLiquidProvider.d.ts.map +1 -1
  19. package/dist/providers/HyperLiquidProvider.js +11 -2
  20. package/dist/providers/HyperLiquidProvider.js.map +1 -1
  21. package/dist/selectors.d.ts.map +1 -1
  22. package/dist/selectors.js.map +1 -1
  23. package/dist/services/TradingService.d.ts.map +1 -1
  24. package/dist/services/TradingService.js +52 -21
  25. package/dist/services/TradingService.js.map +1 -1
  26. package/dist/types/index.d.ts +10 -0
  27. package/dist/types/index.d.ts.map +1 -1
  28. package/dist/types/index.js.map +1 -1
  29. package/dist/utils/hyperLiquidValidation.d.ts +2 -1
  30. package/dist/utils/hyperLiquidValidation.d.ts.map +1 -1
  31. package/dist/utils/hyperLiquidValidation.js +14 -1
  32. package/dist/utils/hyperLiquidValidation.js.map +1 -1
  33. package/dist/utils/orderCalculations.d.ts.map +1 -1
  34. package/dist/utils/orderCalculations.js +18 -7
  35. package/dist/utils/orderCalculations.js.map +1 -1
  36. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"TradingService.js","sourceRoot":"","sources":["../../src/services/TradingService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from 'bignumber.js';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n PERPS_EVENT_PROPERTY,\n PERPS_EVENT_VALUE,\n} from '../constants/eventNames.js';\nimport { isTPSLOrder } from '../constants/orderTypes.js';\nimport { PerpsMeasurementName } from '../constants/performanceMetrics.js';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig.js';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes.js';\nimport {\n PerpsAnalyticsEvent,\n PerpsTraceNames,\n PerpsTraceOperations,\n} from '../types/index.js';\nimport type {\n PerpsProvider,\n PerpsProviderType,\n OrderParams,\n OrderResult,\n EditOrderParams,\n CancelOrderParams,\n CancelOrderResult,\n CancelOrdersParams,\n CancelOrdersResult,\n ClosePositionParams,\n ClosePositionsParams,\n ClosePositionsResult,\n Position,\n TrackingData,\n UpdatePositionTPSLParams,\n PerpsAnalyticsProperties,\n PerpsPlatformDependencies,\n PerpsFeeResolution,\n PerpsTraceStatus,\n} from '../types/index.js';\nimport {\n PERPS_ERROR_ACTION,\n PERPS_ERROR_OPERATION,\n createPerpsErrorContext,\n wasProviderErrorReported,\n} from '../utils/errorContext.js';\nimport type {\n PerpsErrorTags,\n PerpsLoggerOptions,\n} from '../utils/errorContext.js';\nimport { ensureError } from '../utils/errorUtils.js';\nimport { captureScaleOrderParams } from '../utils/lighterScaleOrders.js';\nimport {\n isLimitExecutionOrderType,\n SCALE_ORDER_COUNT,\n} from '../utils/orderTypes.js';\nimport type { RewardsIntegrationService } from './RewardsIntegrationService.js';\nimport type { ServiceContext } from './ServiceContext.js';\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 * Subset of tracking data carrying discovery attribution + hl_fee_rate that is\n * shared across trade/close/cancel/risk events. Both\n * {@link TrackingData} and {@link TPSLTrackingData} satisfy this shape.\n */\ntype AttributionTrackingData = Pick<\n TrackingData,\n 'entryPoint' | 'discoverySource' | 'perpDiscoverySource' | 'hlFeeRate'\n>;\n\n/**\n * Whether a write failed because the signer could not sign it (a locked\n * keyring or account signer, or an unavailable or rejected agent). The user\n * retries it; it is not an error to report.\n *\n * @param error - The provider result error.\n * @returns True for `KEYRING_LOCKED`.\n */\nfunction isSignerUnavailable(error: string | undefined): boolean {\n return error === PERPS_ERROR_CODES.KEYRING_LOCKED;\n}\n\n/**\n * Flip results that are expected account or signer states, not defects.\n * A locked keyring is retried by the user. A missing exchange account is the\n * pre-account state already kept out of error reporting by the provider.\n *\n * @param error - The provider result error.\n * @returns True for `KEYRING_LOCKED` and `EXCHANGE_ACCOUNT_NOT_FOUND`.\n */\nfunction isSilentFlipResult(error: string | undefined): boolean {\n return (\n isSignerUnavailable(error) ||\n error === PERPS_ERROR_CODES.EXCHANGE_ACCOUNT_NOT_FOUND\n );\n}\n\n/**\n * Convert an operation result into the bounded terminal trace status that\n * platform adapters map to their tracing SDK.\n *\n * @param success - Whether the traced operation completed successfully.\n * @returns The terminal trace status.\n */\nfunction getTraceStatus(success: boolean | undefined): PerpsTraceStatus {\n return success === true ? 'ok' : 'error';\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 /** Serializes provider fee context so concurrent orders cannot share it. */\n #feeContextTail: Promise<void> = Promise.resolve();\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 context - The active service context.\n * @param method - The method name.\n * @param errorTags - Bounded tags used by error dashboards.\n * @param additionalContext - The additional context value.\n * @returns The resulting string value.\n */\n #getErrorContext(\n context: ServiceContext,\n method: string,\n errorTags: PerpsErrorTags,\n additionalContext?: Record<string, unknown>,\n ): PerpsLoggerOptions {\n return createPerpsErrorContext({\n contextName: 'TradingService',\n method,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n errorTags,\n data: additionalContext,\n });\n }\n\n /**\n * Build discovery/attribution properties shared across trade/close/cancel/risk\n * events. Each property is only included when present so\n * that, in particular, hl_fee_rate is omitted entirely when unavailable.\n *\n * @param trackingData - Optional tracking data carried on the operation params.\n * @returns The attribution properties to merge into an analytics event.\n */\n #buildAttributionProperties(\n trackingData?: AttributionTrackingData,\n ): PerpsAnalyticsProperties {\n const properties: PerpsAnalyticsProperties = {};\n if (trackingData?.entryPoint !== undefined) {\n properties[PERPS_EVENT_PROPERTY.ENTRY_POINT] = trackingData.entryPoint;\n }\n if (trackingData?.discoverySource !== undefined) {\n properties[PERPS_EVENT_PROPERTY.DISCOVERY_SOURCE] =\n trackingData.discoverySource;\n }\n if (trackingData?.perpDiscoverySource !== undefined) {\n properties[PERPS_EVENT_PROPERTY.PERP_DISCOVERY_SOURCE] =\n trackingData.perpDiscoverySource;\n }\n if (trackingData?.hlFeeRate !== undefined) {\n properties[PERPS_EVENT_PROPERTY.HL_FEE_RATE] = trackingData.hlFeeRate;\n }\n return properties;\n }\n\n /**\n * Build properties that identify the submitted order intent.\n *\n * @param params - Order parameters containing placement type and reduce-only intent.\n * @returns Properties shared by every trade lifecycle event.\n */\n #buildTradeIntentProperties(\n params: Pick<OrderParams, 'orderType' | 'reduceOnly'>,\n ): PerpsAnalyticsProperties {\n return {\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.orderType,\n [PERPS_EVENT_PROPERTY.REDUCE_ONLY]: params.reduceOnly === true,\n };\n }\n\n /**\n * Emit a transaction event with status=submitted before the provider round-trip.\n * Fired for trade, close, cancel and risk-management operations.\n *\n * @param event - The analytics event name to emit.\n * @param properties - Additional event properties (asset, attribution, etc.).\n */\n #trackSubmitted(\n event: PerpsAnalyticsEvent,\n properties: PerpsAnalyticsProperties,\n ): void {\n this.#deps.metrics.trackPerpsEvent(event, {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.SUBMITTED,\n ...properties,\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 // A known zero fill can still represent accepted resting exposure.\n // Keep execution quantities intact on the receipt and partial-fill event.\n const trackedFillSize =\n result?.filledSize !== undefined &&\n new BigNumber(result.filledSize).isZero()\n ? (result.acceptedSize ?? result.filledSize)\n : result?.filledSize;\n const trackedOrderSize = parseFloat(\n trackedFillSize ??\n result?.acceptedSize ??\n result?.submittedSize ??\n params.size,\n );\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 ...this.#buildTradeIntentProperties(params),\n [PERPS_EVENT_PROPERTY.LEVERAGE]: parseFloat(String(params.leverage ?? 1)),\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: trackedOrderSize,\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 // Trigger limit placements carry a real limit price too, so the companion\n // property must not go missing when order_type is stop_limit/take_profit_limit.\n const limitPrice = result?.weightedAverageLimitPrice ?? params.price;\n if (\n limitPrice &&\n (result?.weightedAverageLimitPrice ||\n isLimitExecutionOrderType(params.orderType))\n ) {\n properties[PERPS_EVENT_PROPERTY.LIMIT_PRICE] = parseFloat(limitPrice);\n }\n if (params.trackingData?.source) {\n properties[PERPS_EVENT_PROPERTY.SOURCE] = params.trackingData.source;\n }\n if (params.trackingData?.chartLibrary) {\n properties[PERPS_EVENT_PROPERTY.CHART_LIBRARY] =\n params.trackingData.chartLibrary;\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 assetPrice = result?.averagePrice\n ? parseFloat(result.averagePrice)\n : params.trackingData?.marketPrice;\n let orderValuePrice = assetPrice;\n if (!result?.averagePrice && result?.weightedAverageLimitPrice) {\n orderValuePrice = parseFloat(result.weightedAverageLimitPrice);\n }\n if (orderValuePrice && trackedOrderSize) {\n properties[PERPS_EVENT_PROPERTY.ORDER_VALUE] =\n trackedOrderSize * orderValuePrice;\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 (params.trackingData?.vipTier !== undefined) {\n properties[PERPS_EVENT_PROPERTY.VIP_TIER] = params.trackingData.vipTier;\n }\n if (params.trackingData?.vipDiscount !== undefined) {\n properties[PERPS_EVENT_PROPERTY.VIP_DISCOUNT] =\n params.trackingData.vipDiscount;\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 // Propagate discovery attribution + hl_fee_rate\n Object.assign(\n properties,\n this.#buildAttributionProperties(params.trackingData),\n );\n\n // Emit an additional partially filled trade event when the fill is partial,\n // mirroring the close path so the fill's partiality is visible in analytics\n // rather than hidden behind a status=executed event. Classification is based\n // on the provider's accepted size, falling back to its final submitted size\n // when no accepted-size distinction applies. This avoids counting rejected\n // Scale rungs as unfilled exposure. Both values are post-normalization, so a\n // complete fill of the normalized size must not look partial. When the\n // provider reports neither value we do not classify rather than guess from\n // params.size. The partial event mirrors the close schema: order_size =\n // accepted size, amount_filled = filled, remaining = the rest.\n // Compare and subtract the decimal size strings with arbitrary-precision\n // math (BigNumber): routing them through parseFloat can introduce\n // binary-float artifacts that collapse distinct values (misclassifying the\n // fill) or leave e-17 dust in remaining_amount. Only convert to Number for\n // the emitted analytics values, after the exact decimal subtraction.\n const acceptedSizeString = result?.acceptedSize ?? result?.submittedSize;\n const acceptedSize =\n acceptedSizeString === undefined\n ? undefined\n : new BigNumber(acceptedSizeString);\n const filledSize =\n result?.filledSize === undefined\n ? undefined\n : new BigNumber(result.filledSize);\n if (\n result?.success === true &&\n acceptedSize !== undefined &&\n filledSize !== undefined &&\n acceptedSize.isFinite() &&\n filledSize.isFinite() &&\n filledSize.gt(0) &&\n filledSize.lt(acceptedSize)\n ) {\n const partialProperties: PerpsAnalyticsProperties = {\n ...properties,\n [PERPS_EVENT_PROPERTY.STATUS]:\n PERPS_EVENT_VALUE.STATUS.PARTIALLY_FILLED,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: acceptedSize.toNumber(),\n [PERPS_EVENT_PROPERTY.AMOUNT_FILLED]: filledSize.toNumber(),\n [PERPS_EVENT_PROPERTY.REMAINING_AMOUNT]: acceptedSize\n .minus(filledSize)\n .toNumber(),\n };\n if (result.weightedAverageLimitPrice !== undefined) {\n const acceptedOrderValue = acceptedSize.times(\n result.weightedAverageLimitPrice,\n );\n if (acceptedOrderValue.isFinite()) {\n partialProperties[PERPS_EVENT_PROPERTY.ORDER_VALUE] =\n acceptedOrderValue.toNumber();\n }\n }\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.TradeTransaction,\n partialProperties,\n );\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 this.#getErrorContext(\n context,\n context.errorContext.method,\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.PlaceOrder,\n },\n {\n operation: 'reportOrderToDataLake',\n symbol: params.symbol,\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.feeResolution - The resolved fee and attribution source.\n * @param options.operation - The operation value.\n * @returns The result of the operation.\n */\n async #withFeeDiscount<TResult>(options: {\n provider: PerpsProvider;\n feeResolution?: PerpsFeeResolution;\n operation: () => Promise<TResult>;\n }): Promise<TResult> {\n const { provider, feeResolution, operation } = options;\n const previous = this.#feeContextTail;\n let release: () => void = () => undefined;\n this.#feeContextTail = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous;\n\n try {\n if (provider.setUserFeeResolution) {\n provider.setUserFeeResolution(feeResolution);\n } else if (provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(feeResolution?.discountBips);\n }\n if (feeResolution) {\n this.#deps.debugLogger.log(\n 'TradingService: Fee resolution set in provider',\n {\n feeDiscountBips: feeResolution.discountBips,\n feeSource: feeResolution.source,\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.setUserFeeResolution) {\n provider.setUserFeeResolution(undefined);\n } else if (provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(undefined);\n }\n this.#deps.debugLogger.log(\n 'TradingService: Fee resolution cleared from provider',\n );\n release();\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, context, reportOrderToDataLake } = options;\n let params = { ...options.params };\n try {\n params = captureScaleOrderParams(params);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message === PERPS_ERROR_CODES.ORDER_SCALE_PREVIEW_STALE\n ) {\n return {\n success: false,\n error: PERPS_ERROR_CODES.ORDER_SCALE_PREVIEW_STALE,\n };\n }\n throw error;\n }\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let traceData:\n | {\n success: boolean;\n error?: string;\n orderId?: string;\n reason?: 'error' | 'late_success' | 'late_error';\n }\n | undefined;\n let orderSubmissionThresholdTimeoutId:\n | ReturnType<typeof setTimeout>\n | undefined;\n let didExceedOrderSubmissionThreshold = false;\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 pay_token_symbol: 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 pay_token_symbol: paymentToken,\n },\n data: {\n isBuy: params.isBuy,\n orderPrice: params.price ?? '',\n pay_token_symbol: paymentToken,\n },\n });\n\n // Calculate fee discount at execution time (fresh, secure)\n const feeResolution = await this.#calculateFeeDiscountWithMeasurement(\n this.#resolveOrderNotionalUsd(params),\n );\n\n this.#deps.debugLogger.log('TradingService: Fee resolution calculated', {\n feeDiscountBips: feeResolution?.discountBips,\n feeSource: feeResolution?.source,\n hasDiscount: feeResolution?.discountBips !== 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 // Emit submitted event before the provider round-trip\n this.#trackSubmitted(PerpsAnalyticsEvent.TradeTransaction, {\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 ...this.#buildTradeIntentProperties(params),\n [PERPS_EVENT_PROPERTY.LEVERAGE]: parseFloat(\n String(params.leverage ?? 1),\n ),\n ...this.#buildAttributionProperties(params.trackingData),\n });\n\n // Observational threshold: when the provider round-trip exceeds\n // PlaceOrderTimeoutMs we tag the trace and emit a breadcrumb, but we\n // intentionally do NOT cancel the in-flight order. Cancelling client-side\n // (e.g. Promise.race rejection) does not stop the provider request, so a\n // race-based timeout would let the UI mark an order as failed while\n // HyperLiquid could still accept it. Instead, we always await\n // provider.placeOrder(params) to terminal completion and surface\n // late completions via trace `reason: 'late_success' | 'late_error'`.\n orderSubmissionThresholdTimeoutId = setTimeout(() => {\n didExceedOrderSubmissionThreshold = true;\n this.#deps.tracer.addBreadcrumb({\n category: 'perps',\n message: 'Order submission exceeded threshold (still pending)',\n level: 'warning',\n data: {\n thresholdMs: PERPS_CONSTANTS.PlaceOrderTimeoutMs,\n pay_token_symbol: paymentToken,\n market: params.symbol,\n orderType: params.orderType,\n },\n });\n this.#deps.debugLogger.log(\n 'TradingService: Order submission exceeded threshold (still pending)',\n {\n thresholdMs: PERPS_CONSTANTS.PlaceOrderTimeoutMs,\n symbol: params.symbol,\n orderType: params.orderType,\n },\n );\n }, PERPS_CONSTANTS.PlaceOrderTimeoutMs);\n const result = await this.#withFeeDiscount({\n provider,\n feeResolution,\n operation: () => provider.placeOrder(params),\n });\n if (orderSubmissionThresholdTimeoutId !== undefined) {\n clearTimeout(orderSubmissionThresholdTimeoutId);\n orderSubmissionThresholdTimeoutId = undefined;\n }\n\n this.#deps.debugLogger.log('TradingService: Provider response received', {\n success: result.success,\n orderId: result.orderId,\n error: result.error,\n didExceedOrderSubmissionThreshold,\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 = {\n success: true,\n orderId: result.orderId ?? '',\n ...(didExceedOrderSubmissionThreshold\n ? { reason: 'late_success' as const }\n : {}),\n };\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 = {\n success: false,\n reason: didExceedOrderSubmissionThreshold ? 'late_error' : 'error',\n error: result.error ?? 'Unknown error',\n };\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(\n ensureError(error, 'TradingService.placeOrder'),\n this.#getErrorContext(\n context,\n context.errorContext.method,\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.PlaceOrder,\n },\n {\n symbol: params.symbol,\n orderType: params.orderType,\n },\n ),\n );\n\n traceData = {\n success: false,\n reason: didExceedOrderSubmissionThreshold ? 'late_error' : 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n throw error;\n } finally {\n if (orderSubmissionThresholdTimeoutId !== undefined) {\n clearTimeout(orderSubmissionThresholdTimeoutId);\n }\n // Always end trace on exit (success or failure)\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.PlaceOrder,\n id: traceId,\n status: getTraceStatus(traceData?.success),\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 * @param options.provider - The provider the write will be submitted through,\n * used to narrow the read to positions that route can reach. Omit for a\n * read-only lookup that does not precede a write.\n * @param options.providerId - Explicit route, when the caller supplied one.\n * @returns The result of the operation.\n */\n async #loadPositionData(options: {\n symbol: string;\n context: ServiceContext;\n provider?: PerpsProvider;\n providerId?: PerpsProviderType;\n }): Promise<Position | undefined> {\n const { symbol, context, provider, providerId } = options;\n\n const positionLoadStart = this.#deps.performance.now();\n try {\n const positions = context.getPositions\n ? await context.getPositions()\n : [];\n // Matching on symbol alone can pick another provider's position when two\n // providers list the same market, so a routed write narrows first.\n const candidates = provider\n ? this.#positionsForWriteRoute({ positions, provider, providerId })\n : positions;\n const position = candidates.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 // Effective leverage = positionUSD / marginUSD, rounded to 1 decimal place.\n // Computed from the live position rather than the configured leverage so it's\n // populated for every close, including TP/SL triggers.\n const positionUSD = Math.abs(parseFloat(position.positionValue));\n const marginUSD = parseFloat(position.marginUsed);\n const effectiveLeverage =\n Number.isFinite(positionUSD) &&\n Number.isFinite(marginUSD) &&\n marginUSD > 0\n ? Math.round((positionUSD / marginUSD) * 10) / 10\n : undefined;\n\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 &&\n isLimitExecutionOrderType(params.orderType) &&\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 ...(params.trackingData?.vipTier !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_TIER]: params.trackingData.vipTier,\n }),\n ...(params.trackingData?.vipDiscount !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_DISCOUNT]: params.trackingData.vipDiscount,\n }),\n // Effective leverage on close events\n ...(effectiveLeverage !== undefined && {\n [PERPS_EVENT_PROPERTY.LEVERAGE]: effectiveLeverage,\n }),\n // Discovery attribution + hl_fee_rate\n ...this.#buildAttributionProperties(params.trackingData),\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 * @param options.bulkActionId - Optional batch correlation id.\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 bulkActionId?: string;\n }): void {\n const { position, result, error, params, duration, bulkActionId } = options;\n\n // Bulk action correlation id for batch close events\n const bulkActionProps: PerpsAnalyticsProperties = bulkActionId\n ? { [PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId }\n : {};\n\n if (!position) {\n // No local position record, yet closePosition already emitted a\n // submitted event and the close may still complete at the provider.\n // Emit a terminal (executed/failed) event so every submitted close has a\n // matching outcome, even without position-derived metrics.\n const status =\n result?.success === true\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED;\n const errorMessage = error?.message ?? result?.error;\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.PositionCloseTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: status,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]:\n params.orderType ?? PERPS_EVENT_VALUE.ORDER_TYPE.MARKET,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,\n ...(errorMessage && {\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,\n }),\n ...this.#buildAttributionProperties(params.trackingData),\n ...bulkActionProps,\n },\n );\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 ...bulkActionProps,\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 ...bulkActionProps,\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 this.#getErrorContext(\n context,\n context.errorContext.method,\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.ClosePosition,\n },\n {\n operation: 'reportOrderToDataLake',\n symbol,\n },\n ),\n );\n });\n }\n\n /**\n * Resolve the total USD notional a batch close will submit.\n *\n * HyperLiquid takes one builder context for the whole batch, so the fee is\n * resolved once against everything it closes rather than per position.\n * Positions are read through the service context; when that read is\n * unavailable or empty the notional is undefined, which the resolver reads as\n * \"no notional to blend against\".\n *\n * @param options - The configuration options.\n * @param options.params - Which positions the batch will close.\n * @param options.provider - The provider that will submit the batch, and so\n * the only one whose positions it can close.\n * @returns The summed notional in USD, or undefined when it cannot be read.\n */\n async #resolveBatchCloseNotionalUsd(options: {\n params: ClosePositionsParams;\n provider: PerpsProvider;\n }): Promise<number | undefined> {\n const { params, provider } = options;\n\n try {\n // Read through the provider that will actually submit the batch, then\n // keep only what that route can close: an aggregating provider's\n // `getPositions` still spans every active provider, so summing the rest\n // would inflate the notional and shrink the waiver for positions this\n // call never touches.\n const positions = this.#positionsForWriteRoute({\n positions: await provider.getPositions(),\n provider,\n });\n // `closeAll`, or an omitted/empty symbol list, means every position.\n // `closeAll` is checked first because the provider gives it precedence\n // over a symbol list: pricing a filtered subset while the batch closes\n // everything would resolve the fee against too small a notional and\n // over-grant the waiver.\n const selected =\n params.closeAll !== true && params.symbols && params.symbols.length > 0\n ? positions.filter((position) =>\n params.symbols?.includes(position.symbol),\n )\n : positions;\n\n const total = selected.reduce((sum, position) => {\n const value = Math.abs(Number.parseFloat(position.positionValue));\n return Number.isFinite(value) ? sum + value : sum;\n }, 0);\n\n return total > 0 ? total : undefined;\n } catch (error) {\n // Pricing the batch must never fail the close. Without a notional the\n // resolver quotes the full waiver, which is what it did before.\n this.#deps.debugLogger.log(\n 'TradingService: Could not price batch close for the fee resolver',\n {\n error: ensureError(\n error,\n 'TradingService.resolveBatchCloseNotionalUsd',\n ).message,\n },\n );\n return undefined;\n }\n }\n\n /**\n * Keep only the positions a write through this route can actually touch.\n *\n * An aggregating provider reads positions from every active provider while a\n * write goes to one, so pricing a close against the unfiltered list can bill\n * against positions the call cannot close — and, when two providers list the\n * same symbol, can price one provider's position for a write submitted to\n * another. A provider that does not aggregate reports no write route and its\n * positions are all its own.\n *\n * @param options - The configuration options.\n * @param options.positions - Positions as read, possibly across providers.\n * @param options.provider - The provider the write will be submitted through.\n * @param options.providerId - Explicit route, when the caller supplied one.\n * @returns The positions that route can reach.\n */\n #positionsForWriteRoute(options: {\n positions: Position[];\n provider: PerpsProvider;\n providerId?: PerpsProviderType;\n }): Position[] {\n const { positions, provider, providerId } = options;\n const route = provider.getWriteProviderId?.(providerId);\n if (route === undefined) {\n return positions;\n }\n // A position carries its provider only when an aggregator injected one;\n // without that attribution there is nothing to filter on.\n return positions.filter(\n (position) =>\n position.providerId === undefined || position.providerId === route,\n );\n }\n\n /**\n * The position's USD value per unit of size.\n *\n * Used to price a partial close, which names a size but usually no price.\n *\n * @param position - The loaded position, when one was found.\n * @returns The per-unit price, or undefined when it cannot be derived.\n */\n #resolvePositionUnitPrice(\n position: Position | undefined,\n ): number | undefined {\n if (!position) {\n return undefined;\n }\n const value = Math.abs(Number.parseFloat(position.positionValue));\n const size = Math.abs(Number.parseFloat(position.size));\n if (!Number.isFinite(value) || !Number.isFinite(size) || size <= 0) {\n return undefined;\n }\n return value / size;\n }\n\n /**\n * Resolve an order's USD notional for the fee resolver.\n *\n * `usdAmount` is the hybrid model's source of truth and is preferred whenever\n * the caller supplied it. Otherwise the notional is `size × price`, taking the\n * best price available: an explicit limit price, then the caller's price\n * snapshot, then the live market price it was quoted against.\n *\n * Returns undefined when no price is available rather than guessing. The\n * resolver reads that as \"no notional to blend against\" and quotes the full\n * waiver rate — the same answer it gave before the notional was threaded\n * through, so an unpriceable order is no worse off than it was.\n *\n * @param params - The order-shaped parameters in scope at the call site.\n * @param params.size - Order size in base units, when known.\n * @param params.usdAmount - Order notional in USD, when the caller supplied it.\n * @param params.price - Limit price, when the placement carries one.\n * @param params.triggerPrice - Trigger level, for a placement that has no\n * limit price of its own.\n * @param params.currentPrice - Live market price the order was quoted against.\n * @param params.priceAtCalculation - Price snapshot taken when size was derived.\n * @param params.scaleMinPrice - Lowest rung of a Scale ladder, when the\n * placement is one.\n * @param params.scaleMaxPrice - Highest rung of a Scale ladder, when the\n * placement is one.\n * @param params.scaleNumOrders - Number of rungs in a Scale ladder, when\n * the placement supplies it.\n * @param params.scaleSkew - Optional linear size weighting across a Scale\n * ladder. A value above 1 puts more size on the highest-price rungs.\n * @returns The order notional in USD, or undefined when it cannot be priced.\n */\n #resolveOrderNotionalUsd(params: {\n size?: string;\n usdAmount?: string;\n price?: string;\n triggerPrice?: string;\n currentPrice?: number;\n priceAtCalculation?: number;\n scaleMinPrice?: string;\n scaleMaxPrice?: string;\n scaleNumOrders?: number;\n scaleSkew?: number;\n }): number | undefined {\n const usdAmount =\n params.usdAmount === undefined\n ? undefined\n : Number.parseFloat(params.usdAmount);\n if (\n usdAmount !== undefined &&\n Number.isFinite(usdAmount) &&\n usdAmount > 0\n ) {\n return usdAmount;\n }\n\n const size =\n params.size === undefined ? undefined : Number.parseFloat(params.size);\n if (size === undefined || !Number.isFinite(size) || size <= 0) {\n return undefined;\n }\n\n const limitPrice =\n params.price === undefined ? undefined : Number.parseFloat(params.price);\n // A trigger placement carries no limit price; the level it activates at is\n // the only price it states, so it prices the order.\n const triggerPrice =\n params.triggerPrice === undefined\n ? undefined\n : Number.parseFloat(params.triggerPrice);\n // A Scale ladder states no single price. For an even ladder the midpoint\n // is its average price, but a skew weights the rung sizes, so the midpoint\n // is no longer the ladder's notional price. Use the same linear weights as\n // `splitScaleSizes` when the caller supplies the rung count. The provider\n // rounds each rung onto its venue size grid later; this is the equivalent\n // weighted calculation before that bounded rounding, without making the\n // service depend on provider-specific market metadata.\n const scaleMinPrice =\n params.scaleMinPrice === undefined\n ? undefined\n : Number.parseFloat(params.scaleMinPrice);\n const scaleMaxPrice =\n params.scaleMaxPrice === undefined\n ? undefined\n : Number.parseFloat(params.scaleMaxPrice);\n const scaleWeightedPrice =\n scaleMinPrice !== undefined &&\n scaleMaxPrice !== undefined &&\n Number.isFinite(scaleMinPrice) &&\n Number.isFinite(scaleMaxPrice) &&\n scaleMinPrice > 0 &&\n scaleMaxPrice > 0\n ? ((): number => {\n const count = params.scaleNumOrders;\n const skew = params.scaleSkew;\n if (\n count === undefined ||\n !Number.isInteger(count) ||\n count < SCALE_ORDER_COUNT.min ||\n count > SCALE_ORDER_COUNT.max ||\n (skew !== undefined && (!Number.isFinite(skew) || skew <= 0))\n ) {\n return (scaleMinPrice + scaleMaxPrice) / 2;\n }\n\n let weightedPrice = 0;\n let weightSum = 0;\n for (let index = 0; index < count; index++) {\n const weight = 1 + (((skew ?? 1) - 1) * index) / (count - 1);\n const price =\n scaleMinPrice +\n ((scaleMaxPrice - scaleMinPrice) * index) / (count - 1);\n weightedPrice += price * weight;\n weightSum += weight;\n }\n return weightedPrice / weightSum;\n })()\n : undefined;\n\n const price = [\n limitPrice,\n triggerPrice,\n scaleWeightedPrice,\n params.priceAtCalculation,\n params.currentPrice,\n ]\n .filter(\n (candidate): candidate is number =>\n candidate !== undefined &&\n Number.isFinite(candidate) &&\n candidate > 0,\n )\n .at(0);\n\n return price === undefined ? undefined : size * price;\n }\n\n /**\n * Resolve the fee discount for a submission, measuring the call.\n *\n * Uses controller dependencies injected via `setControllerDependencies()`;\n * without them there is no resolver to ask and the caller pays the\n * undiscounted fee. Helper method for the placement orchestration paths.\n *\n * @param orderNotionalUsd - The order's notional in USD, when it can be\n * priced. This is what lets the subscription source resolve to a blended\n * rate: omitting it resolves every bounded allowance as a full waiver,\n * charging 0 bips on an order the preview quoted a blend for.\n * @returns The resolved fee, or undefined when controller dependencies are\n * unavailable.\n */\n async #calculateFeeDiscountWithMeasurement(\n orderNotionalUsd?: number,\n ): Promise<PerpsFeeResolution | 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 // The notional is what lets the subscription source resolve to a blended\n // rate. Submitting without it would resolve every bounded allowance as a\n // full waiver, charging 0 bips on an order the preview quoted a blend for.\n const resolution =\n await rewardsIntegrationService.resolveFee(orderNotionalUsd);\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: resolution.discountBips,\n source: resolution.source,\n orderNotionalUsd,\n subscriptionWaiverKind: resolution.subscriptionWaiverKind,\n duration: `${orderExecutionFeeDiscountDuration.toFixed(0)}ms`,\n },\n );\n\n return resolution;\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 feeResolution = await this.#calculateFeeDiscountWithMeasurement(\n this.#resolveOrderNotionalUsd(params.newOrder),\n );\n\n // Execute order edit with fee discount management\n const result = await this.#withFeeDiscount({\n provider,\n feeResolution,\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 ...this.#buildTradeIntentProperties(params.newOrder),\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 ...this.#buildTradeIntentProperties(params.newOrder),\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 ...this.#buildTradeIntentProperties(params.newOrder),\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(\n ensureError(error, 'TradingService.editOrder'),\n this.#getErrorContext(\n context,\n context.errorContext.method,\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.EditOrder,\n },\n {\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 status: getTraceStatus(traceData?.success),\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 * @param options.bulkActionId - Optional batch correlation id.\n * @returns The result of the operation.\n */\n async cancelOrder(options: {\n provider: PerpsProvider;\n params: CancelOrderParams;\n context: ServiceContext;\n bulkActionId?: string;\n }): Promise<CancelOrderResult> {\n const { provider, params, context, bulkActionId } = 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 // Shared attribution + bulk correlation props\n const cancelExtraProps: PerpsAnalyticsProperties = {\n ...this.#buildAttributionProperties(params.trackingData),\n ...(bulkActionId && {\n [PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId,\n }),\n };\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 // Emit submitted event before the provider round-trip\n this.#trackSubmitted(PerpsAnalyticsEvent.OrderCancelTransaction, {\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n ...cancelExtraProps,\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 ...cancelExtraProps,\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 ...cancelExtraProps,\n },\n );\n\n if (!isSignerUnavailable(result.error)) {\n this.#deps.logger.error(\n ensureError(result.error, 'TradingService.cancelOrder'),\n this.#getErrorContext(\n context,\n 'cancelOrder',\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.CancelOrder,\n },\n {\n symbol: params.symbol,\n orderId: params.orderId,\n providerError: result.error ?? 'Unknown error',\n },\n ),\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 ...cancelExtraProps,\n },\n );\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.cancelOrder'),\n this.#getErrorContext(\n context,\n 'cancelOrder',\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.CancelOrder,\n },\n { symbol: params.symbol },\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.CancelOrder,\n id: traceId,\n status: getTraceStatus(traceData?.success),\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 // Correlation id linking every per-item event to the batch summary\n const bulkActionId = 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 bulkActionId,\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 // Signer failures are retryable, so only the other failures are reported.\n const reportedFailures = operationResult.results.filter(\n (result) => !result.success && !isSignerUnavailable(result.error),\n );\n if (provider.cancelOrders && reportedFailures.length > 0) {\n const failureSummary = reportedFailures\n .map(\n (result) =>\n `${result.symbol}/${result.orderId}: ${result.error ?? 'Unknown error'}`,\n )\n .join('; ');\n\n this.#deps.logger.error(\n new Error(\n `cancelOrders batch failure: ${operationResult.failureCount}/${operationResult.results.length} failed (${reportedFailures.length} reported) - ${failureSummary}`,\n ),\n this.#getErrorContext(\n context,\n 'cancelOrders',\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.CancelOrder,\n },\n {\n successCount: operationResult.successCount,\n failureCount: operationResult.failureCount,\n reportedFailureCount: reportedFailures.length,\n cancelAll: params.cancelAll,\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.cancelOrders'),\n this.#getErrorContext(context, 'cancelOrders', {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.CancelOrder,\n }),\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 [PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId,\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 status: getTraceStatus(operationResult?.success),\n data: {\n success: operationResult?.success === true,\n ...(operationError ? { error: operationError.message } : {}),\n },\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 * @param options.bulkActionId - Optional batch correlation id.\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 bulkActionId?: string;\n }): Promise<OrderResult> {\n const { provider, params, context, reportOrderToDataLake, bulkActionId } =\n 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 provider,\n providerId: params.providerId,\n });\n\n // Emit submitted event before the provider round-trip\n this.#trackSubmitted(PerpsAnalyticsEvent.PositionCloseTransaction, {\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]:\n params.orderType ?? PERPS_EVENT_VALUE.ORDER_TYPE.MARKET,\n ...this.#buildAttributionProperties(params.trackingData),\n ...(bulkActionId && {\n [PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId,\n }),\n });\n\n // Calculate fee discount with measurement. A full close commonly carries\n // only a symbol, so `params` alone prices it as undefined and the resolver\n // would quote a full waiver on an order the preview blended. The position\n // loaded above is the authoritative notional for exactly that case.\n const feeResolution = await this.#calculateFeeDiscountWithMeasurement(\n this.#resolveOrderNotionalUsd({\n ...params,\n // A partial close names a size but often no price; the position's own\n // value per unit prices it. A full close names neither, and falls back\n // to the whole position value below.\n currentPrice:\n params.currentPrice ?? this.#resolvePositionUnitPrice(position),\n }) ??\n this.#resolveOrderNotionalUsd({\n usdAmount: position?.positionValue,\n }),\n );\n\n // Execute position close with fee discount management\n result = await this.#withFeeDiscount({\n provider,\n feeResolution,\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 if (!isSignerUnavailable(result.error)) {\n this.#deps.logger.error(\n ensureError(result.error, 'TradingService.closePosition'),\n this.#getErrorContext(\n context,\n 'closePosition',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.ClosePosition,\n },\n {\n symbol: params.symbol,\n providerError: result.error ?? 'Unknown error',\n },\n ),\n );\n }\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 bulkActionId,\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 bulkActionId,\n });\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.closePosition'),\n this.#getErrorContext(\n context,\n context.errorContext.method,\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.ClosePosition,\n },\n {\n symbol: params.symbol,\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 status: getTraceStatus(traceData?.success),\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 // Correlation id linking every per-item event to the batch summary\n const bulkActionId = 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 // The batch submits under one builder context, so its notional is the\n // sum of the positions it will close, not any single one of them.\n const feeResolution = await this.#calculateFeeDiscountWithMeasurement(\n await this.#resolveBatchCloseNotionalUsd({ params, provider }),\n );\n\n operationResult = await this.#withFeeDiscount({\n provider,\n feeResolution,\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 bulkActionId,\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 // Signer failures are retryable, so only the other failures are reported.\n const reportedFailures = operationResult.results.filter(\n (result) => !result.success && !isSignerUnavailable(result.error),\n );\n if (provider.closePositions && reportedFailures.length > 0) {\n const failureSummary = reportedFailures\n .map(\n (result) => `${result.symbol}: ${result.error ?? 'Unknown error'}`,\n )\n .join('; ');\n\n this.#deps.logger.error(\n new Error(\n `closePositions batch failure: ${operationResult.failureCount}/${operationResult.results.length} failed (${reportedFailures.length} reported) - ${failureSummary}`,\n ),\n this.#getErrorContext(\n context,\n 'closePositions',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.ClosePosition,\n },\n {\n successCount: operationResult.successCount,\n failureCount: operationResult.failureCount,\n reportedFailureCount: reportedFailures.length,\n symbols: params.symbols?.length ?? 0,\n closeAll: params.closeAll,\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(\n context,\n 'closePositions',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.ClosePosition,\n },\n {\n symbols: params.symbols?.length ?? 0,\n closeAll: params.closeAll,\n },\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 [PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId,\n [PERPS_EVENT_PROPERTY.NUMBER_POSITIONS_CLOSED]:\n operationResult?.successCount ?? 0,\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 status: getTraceStatus(operationResult?.success),\n data: {\n success: operationResult?.success === true,\n ...(operationError ? { error: operationError.message } : {}),\n },\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 // Emit submitted event before the provider round-trip\n this.#trackSubmitted(PerpsAnalyticsEvent.RiskManagement, {\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.SOURCE]: source,\n ...this.#buildAttributionProperties(params.trackingData),\n });\n\n // The batch shares one builder fee. Price each included trigger at its\n // own level and size, then use the largest notional. An omitted size\n // covers the absolute position size, including for short positions.\n let positionPromise: Promise<Position | undefined> | undefined;\n const getPosition = (): Promise<Position | undefined> =>\n (positionPromise ??= params.position\n ? Promise.resolve(params.position)\n : this.#loadPositionData({\n symbol: params.symbol,\n context,\n provider,\n providerId: params.providerId,\n }));\n\n const triggerNotionalsUsd = await Promise.all(\n [\n { price: params.takeProfitPrice, size: params.takeProfitSize },\n { price: params.stopLossPrice, size: params.stopLossSize },\n ]\n .filter(\n (trigger): trigger is { price: string; size: string | undefined } =>\n trigger.price !== undefined,\n )\n .map(async ({ price, size }) => {\n const triggerSize = size ?? (await getPosition())?.size;\n return this.#resolveOrderNotionalUsd({\n size:\n triggerSize === undefined\n ? undefined\n : Math.abs(Number.parseFloat(triggerSize)).toString(),\n price,\n });\n }),\n );\n\n // A known sibling cannot stand in for a trigger whose size is unknown.\n // Passing undefined withholds a bounded waiver for the entire batch.\n const pricedTriggerNotionalsUsd = triggerNotionalsUsd.filter(\n (notional): notional is number =>\n notional !== undefined && Number.isFinite(notional) && notional > 0,\n );\n const tpslNotionalUsd =\n pricedTriggerNotionalsUsd.length > 0 &&\n pricedTriggerNotionalsUsd.length === triggerNotionalsUsd.length\n ? Math.max(...pricedTriggerNotionalsUsd)\n : undefined;\n const feeResolution =\n await this.#calculateFeeDiscountWithMeasurement(tpslNotionalUsd);\n\n // Execute with fee discount management\n result = await this.#withFeeDiscount({\n provider,\n feeResolution,\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\n this.#deps.logger.error(\n ensureError(error, 'TradingService.updatePositionTPSL'),\n this.#getErrorContext(\n context,\n 'updatePositionTPSL',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.PositionTpslUpdate,\n },\n {\n symbol: params.symbol,\n hasTakeProfit: Boolean(params.takeProfitPrice),\n hasStopLoss: Boolean(params.stopLossPrice),\n },\n ),\n );\n\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 // Discovery attribution\n ...this.#buildAttributionProperties(params.trackingData),\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 status: getTraceStatus(traceData?.success),\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 } else {\n // Track failure analytics for a non-throwing provider failure so the\n // terminal Risk Management event is emitted exactly once here (the\n // thrown path below handles exceptions).\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]: result.error ?? 'Unknown error',\n });\n }\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.UpdateMargin,\n id: traceId,\n status: getTraceStatus(result.success),\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(\n context,\n 'updateMargin',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.UpdateMargin,\n },\n { symbol, amount },\n ),\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 status: 'error',\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.trackingData - Optional tracking data for analytics events.\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 trackingData?: TrackingData;\n context: ServiceContext;\n }): Promise<OrderResult> {\n const { provider, position, trackingData, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n const flipIntentProperties = this.#buildTradeIntentProperties({\n orderType: 'market',\n });\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 const flipSize = positionSize * 2;\n\n // Direction-specific flip action, shared by the submitted and terminal events\n const flipAction = isCurrentlyLong\n ? PERPS_EVENT_VALUE.ACTION.FLIP_LONG_TO_SHORT\n : PERPS_EVENT_VALUE.ACTION.FLIP_SHORT_TO_LONG;\n\n // Create order params for flip\n // Use 2x position size: 1x to close current position + 1x to open opposite position.\n // Do not pass the position entry price as currentPrice: the provider must fetch\n // live market data for validation and IOC pricing.\n const orderParams: OrderParams = {\n symbol: position.symbol,\n isBuy: oppositeDirection,\n size: flipSize.toString(),\n orderType: 'market',\n leverage: position.leverage?.value,\n // Lighter placeOrder otherwise logs order_management/place_order and\n // marks the result reported, which drops this flip from flip filters.\n // Close already suppresses that provider report. One Sentry event remains.\n deferProviderErrorReport: true,\n };\n\n // Emit submitted event before the provider round-trip, keeping flip\n // trades aligned with the consolidated placeOrder pipeline.\n this.#trackSubmitted(PerpsAnalyticsEvent.TradeTransaction, {\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 ...flipIntentProperties,\n [PERPS_EVENT_PROPERTY.LEVERAGE]: position.leverage?.value || 1,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: positionSize,\n [PERPS_EVENT_PROPERTY.ACTION]: flipAction,\n ...this.#buildAttributionProperties(trackingData),\n });\n\n // The flip order is 2x the position: one leg closes it, one opens the\n // opposite. `orderParams` deliberately carries no price, so the notional\n // comes from the position's own reported USD value.\n const flipNotionalUsd = this.#resolveOrderNotionalUsd({\n usdAmount: position.positionValue,\n });\n const feeResolution = await this.#calculateFeeDiscountWithMeasurement(\n flipNotionalUsd === undefined ? undefined : flipNotionalUsd * 2,\n );\n // Place flip order (HyperLiquid handles margin transfer automatically)\n const result = await this.#withFeeDiscount({\n provider,\n feeResolution,\n operation: () => provider.placeOrder(orderParams),\n });\n\n const completionDuration = this.#deps.performance.now() - startTime;\n\n const executedPrice = parseFloat(\n result.averagePrice ?? position.entryPrice,\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\n // Track success analytics with direction-specific flip action\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 ...flipIntentProperties,\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]: positionSize * executedPrice,\n // MetaMask fee on flip trades\n ...(trackingData?.metamaskFee !== undefined && {\n [PERPS_EVENT_PROPERTY.METAMASK_FEE]: trackingData.metamaskFee,\n }),\n ...(trackingData?.vipTier !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_TIER]: trackingData.vipTier,\n }),\n ...(trackingData?.vipDiscount !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_DISCOUNT]: trackingData.vipDiscount,\n }),\n ...this.#buildAttributionProperties(trackingData),\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 } else {\n // Provider rejected the flip without throwing: emit a terminal failed\n // event so every submitted flip is paired with executed or 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]: position.symbol,\n ...flipIntentProperties,\n [PERPS_EVENT_PROPERTY.ACTION]: flipAction,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n result.error ?? 'Unknown error',\n ...(trackingData?.vipTier !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_TIER]: trackingData.vipTier,\n }),\n ...(trackingData?.vipDiscount !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_DISCOUNT]: trackingData.vipDiscount,\n }),\n ...this.#buildAttributionProperties(trackingData),\n },\n );\n\n if (\n !isSilentFlipResult(result.error) &&\n !wasProviderErrorReported(result)\n ) {\n this.#deps.logger.error(\n ensureError(result.error, 'TradingService.flipPosition'),\n this.#getErrorContext(\n context,\n 'flipPosition',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.FlipPosition,\n },\n {\n symbol: position.symbol,\n providerError: result.error ?? 'Unknown error',\n },\n ),\n );\n }\n }\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FlipPosition,\n id: traceId,\n status: getTraceStatus(result.success),\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(\n context,\n 'flipPosition',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.FlipPosition,\n },\n { symbol: position.symbol },\n ),\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 ...flipIntentProperties,\n [PERPS_EVENT_PROPERTY.ACTION]: failFlipAction,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,\n ...(trackingData?.vipTier !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_TIER]: trackingData.vipTier,\n }),\n ...(trackingData?.vipDiscount !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_DISCOUNT]: trackingData.vipDiscount,\n }),\n ...this.#buildAttributionProperties(trackingData),\n });\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FlipPosition,\n id: traceId,\n status: 'error',\n data: { success: false, error: errorMessage },\n });\n\n throw error;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"TradingService.js","sourceRoot":"","sources":["../../src/services/TradingService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from 'bignumber.js';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n PERPS_EVENT_PROPERTY,\n PERPS_EVENT_VALUE,\n} from '../constants/eventNames.js';\nimport { isTPSLOrder } from '../constants/orderTypes.js';\nimport { PerpsMeasurementName } from '../constants/performanceMetrics.js';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig.js';\nimport { PerpsControllerError } from '../errors.js';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes.js';\nimport {\n PerpsAnalyticsEvent,\n PerpsTraceNames,\n PerpsTraceOperations,\n} from '../types/index.js';\nimport type {\n PerpsProvider,\n PerpsProviderType,\n OrderParams,\n OrderResult,\n EditOrderParams,\n CancelOrderParams,\n CancelOrderResult,\n CancelOrdersParams,\n CancelOrdersResult,\n ClosePositionParams,\n ClosePositionsParams,\n ClosePositionsResult,\n Position,\n TrackingData,\n UpdatePositionTPSLParams,\n PerpsAnalyticsProperties,\n PerpsPlatformDependencies,\n PerpsFeeResolution,\n PerpsTraceStatus,\n} from '../types/index.js';\nimport {\n PERPS_ERROR_ACTION,\n PERPS_ERROR_OPERATION,\n createPerpsErrorContext,\n wasProviderErrorReported,\n} from '../utils/errorContext.js';\nimport type {\n PerpsErrorTags,\n PerpsLoggerOptions,\n} from '../utils/errorContext.js';\nimport { ensureError } from '../utils/errorUtils.js';\nimport { captureScaleOrderParams } from '../utils/lighterScaleOrders.js';\nimport {\n isLimitExecutionOrderType,\n SCALE_ORDER_COUNT,\n} from '../utils/orderTypes.js';\nimport type { RewardsIntegrationService } from './RewardsIntegrationService.js';\nimport type { ServiceContext } from './ServiceContext.js';\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 * Subset of tracking data carrying discovery attribution + hl_fee_rate that is\n * shared across trade/close/cancel/risk events. Both\n * {@link TrackingData} and {@link TPSLTrackingData} satisfy this shape.\n */\ntype AttributionTrackingData = Pick<\n TrackingData,\n 'entryPoint' | 'discoverySource' | 'perpDiscoverySource' | 'hlFeeRate'\n>;\n\n/**\n * Whether a write failed because the signer could not sign it (a locked\n * keyring or account signer, or an unavailable or rejected agent). The user\n * retries it; it is not an error to report.\n *\n * @param error - The provider result error.\n * @returns True for `KEYRING_LOCKED`.\n */\nfunction isSignerUnavailable(error: string | undefined): boolean {\n return error === PERPS_ERROR_CODES.KEYRING_LOCKED;\n}\n\n/**\n * Flip results that are expected account or signer states, not defects.\n * A locked keyring is retried by the user. A missing exchange account is the\n * pre-account state already kept out of error reporting by the provider.\n *\n * @param error - The provider result error.\n * @returns True for `KEYRING_LOCKED` and `EXCHANGE_ACCOUNT_NOT_FOUND`.\n */\nfunction isSilentFlipResult(error: string | undefined): boolean {\n return (\n isSignerUnavailable(error) ||\n error === PERPS_ERROR_CODES.EXCHANGE_ACCOUNT_NOT_FOUND\n );\n}\n\n/**\n * Convert an operation result into the bounded terminal trace status that\n * platform adapters map to their tracing SDK.\n *\n * @param success - Whether the traced operation completed successfully.\n * @returns The terminal trace status.\n */\nfunction getTraceStatus(success: boolean | undefined): PerpsTraceStatus {\n return success === true ? 'ok' : 'error';\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 /** Serializes provider fee context so concurrent orders cannot share it. */\n #feeContextTail: Promise<void> = Promise.resolve();\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 context - The active service context.\n * @param method - The method name.\n * @param errorTags - Bounded tags used by error dashboards.\n * @param additionalContext - The additional context value.\n * @returns The resulting string value.\n */\n #getErrorContext(\n context: ServiceContext,\n method: string,\n errorTags: PerpsErrorTags,\n additionalContext?: Record<string, unknown>,\n ): PerpsLoggerOptions {\n return createPerpsErrorContext({\n contextName: 'TradingService',\n method,\n provider: context.tracingContext.provider,\n network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',\n errorTags,\n data: additionalContext,\n });\n }\n\n /**\n * Build discovery/attribution properties shared across trade/close/cancel/risk\n * events. Each property is only included when present so\n * that, in particular, hl_fee_rate is omitted entirely when unavailable.\n *\n * @param trackingData - Optional tracking data carried on the operation params.\n * @returns The attribution properties to merge into an analytics event.\n */\n #buildAttributionProperties(\n trackingData?: AttributionTrackingData,\n ): PerpsAnalyticsProperties {\n const properties: PerpsAnalyticsProperties = {};\n if (trackingData?.entryPoint !== undefined) {\n properties[PERPS_EVENT_PROPERTY.ENTRY_POINT] = trackingData.entryPoint;\n }\n if (trackingData?.discoverySource !== undefined) {\n properties[PERPS_EVENT_PROPERTY.DISCOVERY_SOURCE] =\n trackingData.discoverySource;\n }\n if (trackingData?.perpDiscoverySource !== undefined) {\n properties[PERPS_EVENT_PROPERTY.PERP_DISCOVERY_SOURCE] =\n trackingData.perpDiscoverySource;\n }\n if (trackingData?.hlFeeRate !== undefined) {\n properties[PERPS_EVENT_PROPERTY.HL_FEE_RATE] = trackingData.hlFeeRate;\n }\n return properties;\n }\n\n /**\n * Build normalized slippage and failure properties without removing the\n * existing raw error message used by current analytics dashboards.\n *\n * @param trackingData - Optional caller-provided slippage context.\n * @param result - Provider result, when available.\n * @param error - Thrown provider error, when available.\n * @returns Slippage and normalized failure properties.\n */\n #buildSlippageProperties(\n trackingData?: TrackingData,\n result?: OrderResult | null,\n error?: Error,\n ): PerpsAnalyticsProperties {\n const properties: PerpsAnalyticsProperties = {};\n\n if (trackingData?.maxSlippageBps !== undefined) {\n properties[PERPS_EVENT_PROPERTY.MAX_SLIPPAGE_PCT] =\n trackingData.maxSlippageBps / 100;\n }\n if (trackingData?.maxSlippageSource !== undefined) {\n properties[PERPS_EVENT_PROPERTY.MAX_SLIPPAGE_SOURCE] =\n trackingData.maxSlippageSource;\n }\n if (trackingData?.estimatedSlippageBps !== undefined) {\n properties[PERPS_EVENT_PROPERTY.ESTIMATED_SLIPPAGE_PCT] =\n trackingData.estimatedSlippageBps / 100;\n }\n\n const errorCode =\n result?.errorCode ??\n (error instanceof PerpsControllerError ? error.errorCode : undefined);\n const errorDetails =\n result?.errorDetails ??\n (error instanceof PerpsControllerError ? error.errorDetails : undefined);\n\n if (errorCode !== undefined) {\n properties[PERPS_EVENT_PROPERTY.FAILURE_REASON] = errorCode;\n }\n if (\n errorDetails?.code === PERPS_ERROR_CODES.PRICE_MOVED &&\n Number.isFinite(errorDetails.priceDeltaBps)\n ) {\n properties[PERPS_EVENT_PROPERTY.PRICE_DELTA_BPS] =\n errorDetails.priceDeltaBps;\n }\n\n return properties;\n }\n\n /**\n * Build properties that identify the submitted order intent.\n *\n * @param params - Order parameters containing placement type and reduce-only intent.\n * @returns Properties shared by every trade lifecycle event.\n */\n #buildTradeIntentProperties(\n params: Pick<OrderParams, 'orderType' | 'reduceOnly'>,\n ): PerpsAnalyticsProperties {\n return {\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.orderType,\n [PERPS_EVENT_PROPERTY.REDUCE_ONLY]: params.reduceOnly === true,\n };\n }\n\n /**\n * Emit a transaction event with status=submitted before the provider round-trip.\n * Fired for trade, close, cancel and risk-management operations.\n *\n * @param event - The analytics event name to emit.\n * @param properties - Additional event properties (asset, attribution, etc.).\n */\n #trackSubmitted(\n event: PerpsAnalyticsEvent,\n properties: PerpsAnalyticsProperties,\n ): void {\n this.#deps.metrics.trackPerpsEvent(event, {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.SUBMITTED,\n ...properties,\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 // A known zero fill can still represent accepted resting exposure.\n // Keep execution quantities intact on the receipt and partial-fill event.\n const trackedFillSize =\n result?.filledSize !== undefined &&\n new BigNumber(result.filledSize).isZero()\n ? (result.acceptedSize ?? result.filledSize)\n : result?.filledSize;\n const trackedOrderSize = parseFloat(\n trackedFillSize ??\n result?.acceptedSize ??\n result?.submittedSize ??\n params.size,\n );\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 ...this.#buildTradeIntentProperties(params),\n ...this.#buildSlippageProperties(params.trackingData, result, error),\n [PERPS_EVENT_PROPERTY.LEVERAGE]: parseFloat(String(params.leverage ?? 1)),\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: trackedOrderSize,\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 // Trigger limit placements carry a real limit price too, so the companion\n // property must not go missing when order_type is stop_limit/take_profit_limit.\n const limitPrice = result?.weightedAverageLimitPrice ?? params.price;\n if (\n limitPrice &&\n (result?.weightedAverageLimitPrice ||\n isLimitExecutionOrderType(params.orderType))\n ) {\n properties[PERPS_EVENT_PROPERTY.LIMIT_PRICE] = parseFloat(limitPrice);\n }\n if (params.trackingData?.source) {\n properties[PERPS_EVENT_PROPERTY.SOURCE] = params.trackingData.source;\n }\n if (params.trackingData?.chartLibrary) {\n properties[PERPS_EVENT_PROPERTY.CHART_LIBRARY] =\n params.trackingData.chartLibrary;\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 assetPrice = result?.averagePrice\n ? parseFloat(result.averagePrice)\n : params.trackingData?.marketPrice;\n let orderValuePrice = assetPrice;\n if (!result?.averagePrice && result?.weightedAverageLimitPrice) {\n orderValuePrice = parseFloat(result.weightedAverageLimitPrice);\n }\n if (orderValuePrice && trackedOrderSize) {\n properties[PERPS_EVENT_PROPERTY.ORDER_VALUE] =\n trackedOrderSize * orderValuePrice;\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 (params.trackingData?.vipTier !== undefined) {\n properties[PERPS_EVENT_PROPERTY.VIP_TIER] = params.trackingData.vipTier;\n }\n if (params.trackingData?.vipDiscount !== undefined) {\n properties[PERPS_EVENT_PROPERTY.VIP_DISCOUNT] =\n params.trackingData.vipDiscount;\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 // Propagate discovery attribution + hl_fee_rate\n Object.assign(\n properties,\n this.#buildAttributionProperties(params.trackingData),\n );\n\n // Emit an additional partially filled trade event when the fill is partial,\n // mirroring the close path so the fill's partiality is visible in analytics\n // rather than hidden behind a status=executed event. Classification is based\n // on the provider's accepted size, falling back to its final submitted size\n // when no accepted-size distinction applies. This avoids counting rejected\n // Scale rungs as unfilled exposure. Both values are post-normalization, so a\n // complete fill of the normalized size must not look partial. When the\n // provider reports neither value we do not classify rather than guess from\n // params.size. The partial event mirrors the close schema: order_size =\n // accepted size, amount_filled = filled, remaining = the rest.\n // Compare and subtract the decimal size strings with arbitrary-precision\n // math (BigNumber): routing them through parseFloat can introduce\n // binary-float artifacts that collapse distinct values (misclassifying the\n // fill) or leave e-17 dust in remaining_amount. Only convert to Number for\n // the emitted analytics values, after the exact decimal subtraction.\n const acceptedSizeString = result?.acceptedSize ?? result?.submittedSize;\n const acceptedSize =\n acceptedSizeString === undefined\n ? undefined\n : new BigNumber(acceptedSizeString);\n const filledSize =\n result?.filledSize === undefined\n ? undefined\n : new BigNumber(result.filledSize);\n if (\n result?.success === true &&\n acceptedSize !== undefined &&\n filledSize !== undefined &&\n acceptedSize.isFinite() &&\n filledSize.isFinite() &&\n filledSize.gt(0) &&\n filledSize.lt(acceptedSize)\n ) {\n const partialProperties: PerpsAnalyticsProperties = {\n ...properties,\n [PERPS_EVENT_PROPERTY.STATUS]:\n PERPS_EVENT_VALUE.STATUS.PARTIALLY_FILLED,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: acceptedSize.toNumber(),\n [PERPS_EVENT_PROPERTY.AMOUNT_FILLED]: filledSize.toNumber(),\n [PERPS_EVENT_PROPERTY.REMAINING_AMOUNT]: acceptedSize\n .minus(filledSize)\n .toNumber(),\n };\n if (result.weightedAverageLimitPrice !== undefined) {\n const acceptedOrderValue = acceptedSize.times(\n result.weightedAverageLimitPrice,\n );\n if (acceptedOrderValue.isFinite()) {\n partialProperties[PERPS_EVENT_PROPERTY.ORDER_VALUE] =\n acceptedOrderValue.toNumber();\n }\n }\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.TradeTransaction,\n partialProperties,\n );\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 this.#getErrorContext(\n context,\n context.errorContext.method,\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.PlaceOrder,\n },\n {\n operation: 'reportOrderToDataLake',\n symbol: params.symbol,\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.feeResolution - The resolved fee and attribution source.\n * @param options.operation - The operation value.\n * @returns The result of the operation.\n */\n async #withFeeDiscount<TResult>(options: {\n provider: PerpsProvider;\n feeResolution?: PerpsFeeResolution;\n operation: () => Promise<TResult>;\n }): Promise<TResult> {\n const { provider, feeResolution, operation } = options;\n const previous = this.#feeContextTail;\n let release: () => void = () => undefined;\n this.#feeContextTail = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous;\n\n try {\n if (provider.setUserFeeResolution) {\n provider.setUserFeeResolution(feeResolution);\n } else if (provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(feeResolution?.discountBips);\n }\n if (feeResolution) {\n this.#deps.debugLogger.log(\n 'TradingService: Fee resolution set in provider',\n {\n feeDiscountBips: feeResolution.discountBips,\n feeSource: feeResolution.source,\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.setUserFeeResolution) {\n provider.setUserFeeResolution(undefined);\n } else if (provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(undefined);\n }\n this.#deps.debugLogger.log(\n 'TradingService: Fee resolution cleared from provider',\n );\n release();\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, context, reportOrderToDataLake } = options;\n let params = { ...options.params };\n try {\n params = captureScaleOrderParams(params);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message === PERPS_ERROR_CODES.ORDER_SCALE_PREVIEW_STALE\n ) {\n return {\n success: false,\n error: PERPS_ERROR_CODES.ORDER_SCALE_PREVIEW_STALE,\n };\n }\n throw error;\n }\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n let traceData:\n | {\n success: boolean;\n error?: string;\n orderId?: string;\n reason?: 'error' | 'late_success' | 'late_error';\n }\n | undefined;\n let orderSubmissionThresholdTimeoutId:\n | ReturnType<typeof setTimeout>\n | undefined;\n let didExceedOrderSubmissionThreshold = false;\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 pay_token_symbol: 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 pay_token_symbol: paymentToken,\n },\n data: {\n isBuy: params.isBuy,\n orderPrice: params.price ?? '',\n pay_token_symbol: paymentToken,\n },\n });\n\n // Calculate fee discount at execution time (fresh, secure)\n const feeResolution = await this.#calculateFeeDiscountWithMeasurement(\n this.#resolveOrderNotionalUsd(params),\n );\n\n this.#deps.debugLogger.log('TradingService: Fee resolution calculated', {\n feeDiscountBips: feeResolution?.discountBips,\n feeSource: feeResolution?.source,\n hasDiscount: feeResolution?.discountBips !== 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 // Emit submitted event before the provider round-trip\n this.#trackSubmitted(PerpsAnalyticsEvent.TradeTransaction, {\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 ...this.#buildTradeIntentProperties(params),\n [PERPS_EVENT_PROPERTY.LEVERAGE]: parseFloat(\n String(params.leverage ?? 1),\n ),\n ...this.#buildSlippageProperties(params.trackingData),\n ...this.#buildAttributionProperties(params.trackingData),\n });\n\n // Observational threshold: when the provider round-trip exceeds\n // PlaceOrderTimeoutMs we tag the trace and emit a breadcrumb, but we\n // intentionally do NOT cancel the in-flight order. Cancelling client-side\n // (e.g. Promise.race rejection) does not stop the provider request, so a\n // race-based timeout would let the UI mark an order as failed while\n // HyperLiquid could still accept it. Instead, we always await\n // provider.placeOrder(params) to terminal completion and surface\n // late completions via trace `reason: 'late_success' | 'late_error'`.\n orderSubmissionThresholdTimeoutId = setTimeout(() => {\n didExceedOrderSubmissionThreshold = true;\n this.#deps.tracer.addBreadcrumb({\n category: 'perps',\n message: 'Order submission exceeded threshold (still pending)',\n level: 'warning',\n data: {\n thresholdMs: PERPS_CONSTANTS.PlaceOrderTimeoutMs,\n pay_token_symbol: paymentToken,\n market: params.symbol,\n orderType: params.orderType,\n },\n });\n this.#deps.debugLogger.log(\n 'TradingService: Order submission exceeded threshold (still pending)',\n {\n thresholdMs: PERPS_CONSTANTS.PlaceOrderTimeoutMs,\n symbol: params.symbol,\n orderType: params.orderType,\n },\n );\n }, PERPS_CONSTANTS.PlaceOrderTimeoutMs);\n const result = await this.#withFeeDiscount({\n provider,\n feeResolution,\n operation: () => provider.placeOrder(params),\n });\n if (orderSubmissionThresholdTimeoutId !== undefined) {\n clearTimeout(orderSubmissionThresholdTimeoutId);\n orderSubmissionThresholdTimeoutId = undefined;\n }\n\n this.#deps.debugLogger.log('TradingService: Provider response received', {\n success: result.success,\n orderId: result.orderId,\n error: result.error,\n didExceedOrderSubmissionThreshold,\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 = {\n success: true,\n orderId: result.orderId ?? '',\n ...(didExceedOrderSubmissionThreshold\n ? { reason: 'late_success' as const }\n : {}),\n };\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 = {\n success: false,\n reason: didExceedOrderSubmissionThreshold ? 'late_error' : 'error',\n error: result.error ?? 'Unknown error',\n };\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(\n ensureError(error, 'TradingService.placeOrder'),\n this.#getErrorContext(\n context,\n context.errorContext.method,\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.PlaceOrder,\n },\n {\n symbol: params.symbol,\n orderType: params.orderType,\n },\n ),\n );\n\n traceData = {\n success: false,\n reason: didExceedOrderSubmissionThreshold ? 'late_error' : 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n throw error;\n } finally {\n if (orderSubmissionThresholdTimeoutId !== undefined) {\n clearTimeout(orderSubmissionThresholdTimeoutId);\n }\n // Always end trace on exit (success or failure)\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.PlaceOrder,\n id: traceId,\n status: getTraceStatus(traceData?.success),\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 * @param options.provider - The provider the write will be submitted through,\n * used to narrow the read to positions that route can reach. Omit for a\n * read-only lookup that does not precede a write.\n * @param options.providerId - Explicit route, when the caller supplied one.\n * @returns The result of the operation.\n */\n async #loadPositionData(options: {\n symbol: string;\n context: ServiceContext;\n provider?: PerpsProvider;\n providerId?: PerpsProviderType;\n }): Promise<Position | undefined> {\n const { symbol, context, provider, providerId } = options;\n\n const positionLoadStart = this.#deps.performance.now();\n try {\n const positions = context.getPositions\n ? await context.getPositions()\n : [];\n // Matching on symbol alone can pick another provider's position when two\n // providers list the same market, so a routed write narrows first.\n const candidates = provider\n ? this.#positionsForWriteRoute({ positions, provider, providerId })\n : positions;\n const position = candidates.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?: Error | string,\n ): Record<string, unknown> {\n // Effective leverage = positionUSD / marginUSD, rounded to 1 decimal place.\n // Computed from the live position rather than the configured leverage so it's\n // populated for every close, including TP/SL triggers.\n const positionUSD = Math.abs(parseFloat(position.positionValue));\n const marginUSD = parseFloat(position.marginUsed);\n const effectiveLeverage =\n Number.isFinite(positionUSD) &&\n Number.isFinite(marginUSD) &&\n marginUSD > 0\n ? Math.round((positionUSD / marginUSD) * 10) / 10\n : undefined;\n\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.CLOSE_TYPE]: metrics.closeType,\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 &&\n isLimitExecutionOrderType(params.orderType) &&\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 ...(params.trackingData?.vipTier !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_TIER]: params.trackingData.vipTier,\n }),\n ...(params.trackingData?.vipDiscount !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_DISCOUNT]: params.trackingData.vipDiscount,\n }),\n ...this.#buildSlippageProperties(\n params.trackingData,\n result,\n error instanceof Error ? error : undefined,\n ),\n // Effective leverage on close events\n ...(effectiveLeverage !== undefined && {\n [PERPS_EVENT_PROPERTY.LEVERAGE]: effectiveLeverage,\n }),\n // Discovery attribution + hl_fee_rate\n ...this.#buildAttributionProperties(params.trackingData),\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 ...(orderValue !== undefined && {\n [PERPS_EVENT_PROPERTY.ORDER_VALUE]: orderValue,\n }),\n };\n }\n\n // Add error for failures\n return {\n ...baseProperties,\n ...(error && {\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n error instanceof Error ? error.message : error,\n }),\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 * @param options.bulkActionId - Optional batch correlation id.\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 bulkActionId?: string;\n }): void {\n const { position, result, error, params, duration, bulkActionId } = options;\n\n // Bulk action correlation id for batch close events\n const bulkActionProps: PerpsAnalyticsProperties = bulkActionId\n ? { [PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId }\n : {};\n\n if (!position) {\n // No local position record, yet closePosition already emitted a\n // submitted event and the close may still complete at the provider.\n // Emit a terminal (executed/failed) event so every submitted close has a\n // matching outcome, even without position-derived metrics.\n const status =\n result?.success === true\n ? PERPS_EVENT_VALUE.STATUS.EXECUTED\n : PERPS_EVENT_VALUE.STATUS.FAILED;\n const errorMessage = error?.message ?? result?.error;\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.PositionCloseTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: status,\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]:\n params.orderType ?? PERPS_EVENT_VALUE.ORDER_TYPE.MARKET,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,\n ...(errorMessage && {\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,\n }),\n ...this.#buildSlippageProperties(params.trackingData, result, error),\n ...this.#buildAttributionProperties(params.trackingData),\n ...bulkActionProps,\n },\n );\n return;\n }\n\n // A thrown close has no OrderResult. Classify it from the requested size\n // the same way a returned failure is classified, so a partial request is\n // not reported as a full close.\n const metrics = this.#calculateCloseMetrics(\n position,\n params,\n result ?? { success: 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 ...bulkActionProps,\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 error ?? errorMessage,\n );\n\n this.#deps.metrics.trackPerpsEvent(\n PerpsAnalyticsEvent.PositionCloseTransaction,\n {\n ...eventProperties,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,\n ...bulkActionProps,\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 this.#getErrorContext(\n context,\n context.errorContext.method,\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.ClosePosition,\n },\n {\n operation: 'reportOrderToDataLake',\n symbol,\n },\n ),\n );\n });\n }\n\n /**\n * Resolve the total USD notional a batch close will submit.\n *\n * HyperLiquid takes one builder context for the whole batch, so the fee is\n * resolved once against everything it closes rather than per position.\n * Positions are read through the service context; when that read is\n * unavailable or empty the notional is undefined, which the resolver reads as\n * \"no notional to blend against\".\n *\n * @param options - The configuration options.\n * @param options.params - Which positions the batch will close.\n * @param options.provider - The provider that will submit the batch, and so\n * the only one whose positions it can close.\n * @returns The summed notional in USD, or undefined when it cannot be read.\n */\n async #resolveBatchCloseNotionalUsd(options: {\n params: ClosePositionsParams;\n provider: PerpsProvider;\n }): Promise<number | undefined> {\n const { params, provider } = options;\n\n try {\n // Read through the provider that will actually submit the batch, then\n // keep only what that route can close: an aggregating provider's\n // `getPositions` still spans every active provider, so summing the rest\n // would inflate the notional and shrink the waiver for positions this\n // call never touches.\n const positions = this.#positionsForWriteRoute({\n positions: await provider.getPositions(),\n provider,\n });\n // `closeAll`, or an omitted/empty symbol list, means every position.\n // `closeAll` is checked first because the provider gives it precedence\n // over a symbol list: pricing a filtered subset while the batch closes\n // everything would resolve the fee against too small a notional and\n // over-grant the waiver.\n const selected =\n params.closeAll !== true && params.symbols && params.symbols.length > 0\n ? positions.filter((position) =>\n params.symbols?.includes(position.symbol),\n )\n : positions;\n\n const total = selected.reduce((sum, position) => {\n const value = Math.abs(Number.parseFloat(position.positionValue));\n return Number.isFinite(value) ? sum + value : sum;\n }, 0);\n\n return total > 0 ? total : undefined;\n } catch (error) {\n // Pricing the batch must never fail the close. Without a notional the\n // resolver quotes the full waiver, which is what it did before.\n this.#deps.debugLogger.log(\n 'TradingService: Could not price batch close for the fee resolver',\n {\n error: ensureError(\n error,\n 'TradingService.resolveBatchCloseNotionalUsd',\n ).message,\n },\n );\n return undefined;\n }\n }\n\n /**\n * Keep only the positions a write through this route can actually touch.\n *\n * An aggregating provider reads positions from every active provider while a\n * write goes to one, so pricing a close against the unfiltered list can bill\n * against positions the call cannot close — and, when two providers list the\n * same symbol, can price one provider's position for a write submitted to\n * another. A provider that does not aggregate reports no write route and its\n * positions are all its own.\n *\n * @param options - The configuration options.\n * @param options.positions - Positions as read, possibly across providers.\n * @param options.provider - The provider the write will be submitted through.\n * @param options.providerId - Explicit route, when the caller supplied one.\n * @returns The positions that route can reach.\n */\n #positionsForWriteRoute(options: {\n positions: Position[];\n provider: PerpsProvider;\n providerId?: PerpsProviderType;\n }): Position[] {\n const { positions, provider, providerId } = options;\n const route = provider.getWriteProviderId?.(providerId);\n if (route === undefined) {\n return positions;\n }\n // A position carries its provider only when an aggregator injected one;\n // without that attribution there is nothing to filter on.\n return positions.filter(\n (position) =>\n position.providerId === undefined || position.providerId === route,\n );\n }\n\n /**\n * The position's USD value per unit of size.\n *\n * Used to price a partial close, which names a size but usually no price.\n *\n * @param position - The loaded position, when one was found.\n * @returns The per-unit price, or undefined when it cannot be derived.\n */\n #resolvePositionUnitPrice(\n position: Position | undefined,\n ): number | undefined {\n if (!position) {\n return undefined;\n }\n const value = Math.abs(Number.parseFloat(position.positionValue));\n const size = Math.abs(Number.parseFloat(position.size));\n if (!Number.isFinite(value) || !Number.isFinite(size) || size <= 0) {\n return undefined;\n }\n return value / size;\n }\n\n /**\n * Resolve an order's USD notional for the fee resolver.\n *\n * `usdAmount` is the hybrid model's source of truth and is preferred whenever\n * the caller supplied it. Otherwise the notional is `size × price`, taking the\n * best price available: an explicit limit price, then the caller's price\n * snapshot, then the live market price it was quoted against.\n *\n * Returns undefined when no price is available rather than guessing. The\n * resolver reads that as \"no notional to blend against\" and quotes the full\n * waiver rate — the same answer it gave before the notional was threaded\n * through, so an unpriceable order is no worse off than it was.\n *\n * @param params - The order-shaped parameters in scope at the call site.\n * @param params.size - Order size in base units, when known.\n * @param params.usdAmount - Order notional in USD, when the caller supplied it.\n * @param params.price - Limit price, when the placement carries one.\n * @param params.triggerPrice - Trigger level, for a placement that has no\n * limit price of its own.\n * @param params.currentPrice - Live market price the order was quoted against.\n * @param params.priceAtCalculation - Price snapshot taken when size was derived.\n * @param params.scaleMinPrice - Lowest rung of a Scale ladder, when the\n * placement is one.\n * @param params.scaleMaxPrice - Highest rung of a Scale ladder, when the\n * placement is one.\n * @param params.scaleNumOrders - Number of rungs in a Scale ladder, when\n * the placement supplies it.\n * @param params.scaleSkew - Optional linear size weighting across a Scale\n * ladder. A value above 1 puts more size on the highest-price rungs.\n * @returns The order notional in USD, or undefined when it cannot be priced.\n */\n #resolveOrderNotionalUsd(params: {\n size?: string;\n usdAmount?: string;\n price?: string;\n triggerPrice?: string;\n currentPrice?: number;\n priceAtCalculation?: number;\n scaleMinPrice?: string;\n scaleMaxPrice?: string;\n scaleNumOrders?: number;\n scaleSkew?: number;\n }): number | undefined {\n const usdAmount =\n params.usdAmount === undefined\n ? undefined\n : Number.parseFloat(params.usdAmount);\n if (\n usdAmount !== undefined &&\n Number.isFinite(usdAmount) &&\n usdAmount > 0\n ) {\n return usdAmount;\n }\n\n const size =\n params.size === undefined ? undefined : Number.parseFloat(params.size);\n if (size === undefined || !Number.isFinite(size) || size <= 0) {\n return undefined;\n }\n\n const limitPrice =\n params.price === undefined ? undefined : Number.parseFloat(params.price);\n // A trigger placement carries no limit price; the level it activates at is\n // the only price it states, so it prices the order.\n const triggerPrice =\n params.triggerPrice === undefined\n ? undefined\n : Number.parseFloat(params.triggerPrice);\n // A Scale ladder states no single price. For an even ladder the midpoint\n // is its average price, but a skew weights the rung sizes, so the midpoint\n // is no longer the ladder's notional price. Use the same linear weights as\n // `splitScaleSizes` when the caller supplies the rung count. The provider\n // rounds each rung onto its venue size grid later; this is the equivalent\n // weighted calculation before that bounded rounding, without making the\n // service depend on provider-specific market metadata.\n const scaleMinPrice =\n params.scaleMinPrice === undefined\n ? undefined\n : Number.parseFloat(params.scaleMinPrice);\n const scaleMaxPrice =\n params.scaleMaxPrice === undefined\n ? undefined\n : Number.parseFloat(params.scaleMaxPrice);\n const scaleWeightedPrice =\n scaleMinPrice !== undefined &&\n scaleMaxPrice !== undefined &&\n Number.isFinite(scaleMinPrice) &&\n Number.isFinite(scaleMaxPrice) &&\n scaleMinPrice > 0 &&\n scaleMaxPrice > 0\n ? ((): number => {\n const count = params.scaleNumOrders;\n const skew = params.scaleSkew;\n if (\n count === undefined ||\n !Number.isInteger(count) ||\n count < SCALE_ORDER_COUNT.min ||\n count > SCALE_ORDER_COUNT.max ||\n (skew !== undefined && (!Number.isFinite(skew) || skew <= 0))\n ) {\n return (scaleMinPrice + scaleMaxPrice) / 2;\n }\n\n let weightedPrice = 0;\n let weightSum = 0;\n for (let index = 0; index < count; index++) {\n const weight = 1 + (((skew ?? 1) - 1) * index) / (count - 1);\n const price =\n scaleMinPrice +\n ((scaleMaxPrice - scaleMinPrice) * index) / (count - 1);\n weightedPrice += price * weight;\n weightSum += weight;\n }\n return weightedPrice / weightSum;\n })()\n : undefined;\n\n const price = [\n limitPrice,\n triggerPrice,\n scaleWeightedPrice,\n params.priceAtCalculation,\n params.currentPrice,\n ]\n .filter(\n (candidate): candidate is number =>\n candidate !== undefined &&\n Number.isFinite(candidate) &&\n candidate > 0,\n )\n .at(0);\n\n return price === undefined ? undefined : size * price;\n }\n\n /**\n * Resolve the fee discount for a submission, measuring the call.\n *\n * Uses controller dependencies injected via `setControllerDependencies()`;\n * without them there is no resolver to ask and the caller pays the\n * undiscounted fee. Helper method for the placement orchestration paths.\n *\n * @param orderNotionalUsd - The order's notional in USD, when it can be\n * priced. This is what lets the subscription source resolve to a blended\n * rate: omitting it resolves every bounded allowance as a full waiver,\n * charging 0 bips on an order the preview quoted a blend for.\n * @returns The resolved fee, or undefined when controller dependencies are\n * unavailable.\n */\n async #calculateFeeDiscountWithMeasurement(\n orderNotionalUsd?: number,\n ): Promise<PerpsFeeResolution | 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 // The notional is what lets the subscription source resolve to a blended\n // rate. Submitting without it would resolve every bounded allowance as a\n // full waiver, charging 0 bips on an order the preview quoted a blend for.\n const resolution =\n await rewardsIntegrationService.resolveFee(orderNotionalUsd);\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: resolution.discountBips,\n source: resolution.source,\n orderNotionalUsd,\n subscriptionWaiverKind: resolution.subscriptionWaiverKind,\n duration: `${orderExecutionFeeDiscountDuration.toFixed(0)}ms`,\n },\n );\n\n return resolution;\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 feeResolution = await this.#calculateFeeDiscountWithMeasurement(\n this.#resolveOrderNotionalUsd(params.newOrder),\n );\n\n // Execute order edit with fee discount management\n const result = await this.#withFeeDiscount({\n provider,\n feeResolution,\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 ...this.#buildTradeIntentProperties(params.newOrder),\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 ...this.#buildTradeIntentProperties(params.newOrder),\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 ...this.#buildTradeIntentProperties(params.newOrder),\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(\n ensureError(error, 'TradingService.editOrder'),\n this.#getErrorContext(\n context,\n context.errorContext.method,\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.EditOrder,\n },\n {\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 status: getTraceStatus(traceData?.success),\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 * @param options.bulkActionId - Optional batch correlation id.\n * @returns The result of the operation.\n */\n async cancelOrder(options: {\n provider: PerpsProvider;\n params: CancelOrderParams;\n context: ServiceContext;\n bulkActionId?: string;\n }): Promise<CancelOrderResult> {\n const { provider, params, context, bulkActionId } = 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 // Shared attribution + bulk correlation props\n const cancelExtraProps: PerpsAnalyticsProperties = {\n ...this.#buildAttributionProperties(params.trackingData),\n ...(bulkActionId && {\n [PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId,\n }),\n };\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 // Emit submitted event before the provider round-trip\n this.#trackSubmitted(PerpsAnalyticsEvent.OrderCancelTransaction, {\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n ...cancelExtraProps,\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 ...cancelExtraProps,\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 ...cancelExtraProps,\n },\n );\n\n if (!isSignerUnavailable(result.error)) {\n this.#deps.logger.error(\n ensureError(result.error, 'TradingService.cancelOrder'),\n this.#getErrorContext(\n context,\n 'cancelOrder',\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.CancelOrder,\n },\n {\n symbol: params.symbol,\n orderId: params.orderId,\n providerError: result.error ?? 'Unknown error',\n },\n ),\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 ...cancelExtraProps,\n },\n );\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.cancelOrder'),\n this.#getErrorContext(\n context,\n 'cancelOrder',\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.CancelOrder,\n },\n { symbol: params.symbol },\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.CancelOrder,\n id: traceId,\n status: getTraceStatus(traceData?.success),\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 // Correlation id linking every per-item event to the batch summary\n const bulkActionId = 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 bulkActionId,\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 // Signer failures are retryable, so only the other failures are reported.\n const reportedFailures = operationResult.results.filter(\n (result) => !result.success && !isSignerUnavailable(result.error),\n );\n if (provider.cancelOrders && reportedFailures.length > 0) {\n const failureSummary = reportedFailures\n .map(\n (result) =>\n `${result.symbol}/${result.orderId}: ${result.error ?? 'Unknown error'}`,\n )\n .join('; ');\n\n this.#deps.logger.error(\n new Error(\n `cancelOrders batch failure: ${operationResult.failureCount}/${operationResult.results.length} failed (${reportedFailures.length} reported) - ${failureSummary}`,\n ),\n this.#getErrorContext(\n context,\n 'cancelOrders',\n {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.CancelOrder,\n },\n {\n successCount: operationResult.successCount,\n failureCount: operationResult.failureCount,\n reportedFailureCount: reportedFailures.length,\n cancelAll: params.cancelAll,\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.cancelOrders'),\n this.#getErrorContext(context, 'cancelOrders', {\n operation: PERPS_ERROR_OPERATION.OrderManagement,\n action: PERPS_ERROR_ACTION.CancelOrder,\n }),\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 [PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId,\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 status: getTraceStatus(operationResult?.success),\n data: {\n success: operationResult?.success === true,\n ...(operationError ? { error: operationError.message } : {}),\n },\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 * @param options.bulkActionId - Optional batch correlation id.\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 bulkActionId?: string;\n }): Promise<OrderResult> {\n const { provider, params, context, reportOrderToDataLake, bulkActionId } =\n 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 provider,\n providerId: params.providerId,\n });\n\n // Emit submitted event before the provider round-trip\n this.#trackSubmitted(PerpsAnalyticsEvent.PositionCloseTransaction, {\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.ORDER_TYPE]:\n params.orderType ?? PERPS_EVENT_VALUE.ORDER_TYPE.MARKET,\n ...this.#buildSlippageProperties(params.trackingData),\n ...this.#buildAttributionProperties(params.trackingData),\n ...(bulkActionId && {\n [PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId,\n }),\n });\n\n // Calculate fee discount with measurement. A full close commonly carries\n // only a symbol, so `params` alone prices it as undefined and the resolver\n // would quote a full waiver on an order the preview blended. The position\n // loaded above is the authoritative notional for exactly that case.\n const feeResolution = await this.#calculateFeeDiscountWithMeasurement(\n this.#resolveOrderNotionalUsd({\n ...params,\n // A partial close names a size but often no price; the position's own\n // value per unit prices it. A full close names neither, and falls back\n // to the whole position value below.\n currentPrice:\n params.currentPrice ?? this.#resolvePositionUnitPrice(position),\n }) ??\n this.#resolveOrderNotionalUsd({\n usdAmount: position?.positionValue,\n }),\n );\n\n // Execute position close with fee discount management\n result = await this.#withFeeDiscount({\n provider,\n feeResolution,\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 if (!isSignerUnavailable(result.error)) {\n this.#deps.logger.error(\n ensureError(result.error, 'TradingService.closePosition'),\n this.#getErrorContext(\n context,\n 'closePosition',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.ClosePosition,\n },\n {\n symbol: params.symbol,\n providerError: result.error ?? 'Unknown error',\n },\n ),\n );\n }\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 bulkActionId,\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 bulkActionId,\n });\n\n this.#deps.logger.error(\n ensureError(error, 'TradingService.closePosition'),\n this.#getErrorContext(\n context,\n context.errorContext.method,\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.ClosePosition,\n },\n {\n symbol: params.symbol,\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 status: getTraceStatus(traceData?.success),\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 // Correlation id linking every per-item event to the batch summary\n const bulkActionId = 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 // The batch submits under one builder context, so its notional is the\n // sum of the positions it will close, not any single one of them.\n const feeResolution = await this.#calculateFeeDiscountWithMeasurement(\n await this.#resolveBatchCloseNotionalUsd({ params, provider }),\n );\n\n operationResult = await this.#withFeeDiscount({\n provider,\n feeResolution,\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 bulkActionId,\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 // Signer failures are retryable, so only the other failures are reported.\n const reportedFailures = operationResult.results.filter(\n (result) => !result.success && !isSignerUnavailable(result.error),\n );\n if (provider.closePositions && reportedFailures.length > 0) {\n const failureSummary = reportedFailures\n .map(\n (result) => `${result.symbol}: ${result.error ?? 'Unknown error'}`,\n )\n .join('; ');\n\n this.#deps.logger.error(\n new Error(\n `closePositions batch failure: ${operationResult.failureCount}/${operationResult.results.length} failed (${reportedFailures.length} reported) - ${failureSummary}`,\n ),\n this.#getErrorContext(\n context,\n 'closePositions',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.ClosePosition,\n },\n {\n successCount: operationResult.successCount,\n failureCount: operationResult.failureCount,\n reportedFailureCount: reportedFailures.length,\n symbols: params.symbols?.length ?? 0,\n closeAll: params.closeAll,\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(\n context,\n 'closePositions',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.ClosePosition,\n },\n {\n symbols: params.symbols?.length ?? 0,\n closeAll: params.closeAll,\n },\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 [PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId,\n [PERPS_EVENT_PROPERTY.NUMBER_POSITIONS_CLOSED]:\n operationResult?.successCount ?? 0,\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 status: getTraceStatus(operationResult?.success),\n data: {\n success: operationResult?.success === true,\n ...(operationError ? { error: operationError.message } : {}),\n },\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 // Emit submitted event before the provider round-trip\n this.#trackSubmitted(PerpsAnalyticsEvent.RiskManagement, {\n [PERPS_EVENT_PROPERTY.ASSET]: params.symbol,\n [PERPS_EVENT_PROPERTY.SOURCE]: source,\n ...this.#buildAttributionProperties(params.trackingData),\n });\n\n // The batch shares one builder fee. Price each included trigger at its\n // own level and size, then use the largest notional. An omitted size\n // covers the absolute position size, including for short positions.\n let positionPromise: Promise<Position | undefined> | undefined;\n const getPosition = (): Promise<Position | undefined> =>\n (positionPromise ??= params.position\n ? Promise.resolve(params.position)\n : this.#loadPositionData({\n symbol: params.symbol,\n context,\n provider,\n providerId: params.providerId,\n }));\n\n const triggerNotionalsUsd = await Promise.all(\n [\n { price: params.takeProfitPrice, size: params.takeProfitSize },\n { price: params.stopLossPrice, size: params.stopLossSize },\n ]\n .filter(\n (trigger): trigger is { price: string; size: string | undefined } =>\n trigger.price !== undefined,\n )\n .map(async ({ price, size }) => {\n const triggerSize = size ?? (await getPosition())?.size;\n return this.#resolveOrderNotionalUsd({\n size:\n triggerSize === undefined\n ? undefined\n : Math.abs(Number.parseFloat(triggerSize)).toString(),\n price,\n });\n }),\n );\n\n // A known sibling cannot stand in for a trigger whose size is unknown.\n // Passing undefined withholds a bounded waiver for the entire batch.\n const pricedTriggerNotionalsUsd = triggerNotionalsUsd.filter(\n (notional): notional is number =>\n notional !== undefined && Number.isFinite(notional) && notional > 0,\n );\n const tpslNotionalUsd =\n pricedTriggerNotionalsUsd.length > 0 &&\n pricedTriggerNotionalsUsd.length === triggerNotionalsUsd.length\n ? Math.max(...pricedTriggerNotionalsUsd)\n : undefined;\n const feeResolution =\n await this.#calculateFeeDiscountWithMeasurement(tpslNotionalUsd);\n\n // Execute with fee discount management\n result = await this.#withFeeDiscount({\n provider,\n feeResolution,\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\n this.#deps.logger.error(\n ensureError(error, 'TradingService.updatePositionTPSL'),\n this.#getErrorContext(\n context,\n 'updatePositionTPSL',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.PositionTpslUpdate,\n },\n {\n symbol: params.symbol,\n hasTakeProfit: Boolean(params.takeProfitPrice),\n hasStopLoss: Boolean(params.stopLossPrice),\n },\n ),\n );\n\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 // Discovery attribution\n ...this.#buildAttributionProperties(params.trackingData),\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 status: getTraceStatus(traceData?.success),\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 } else {\n // Track failure analytics for a non-throwing provider failure so the\n // terminal Risk Management event is emitted exactly once here (the\n // thrown path below handles exceptions).\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]: result.error ?? 'Unknown error',\n });\n }\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.UpdateMargin,\n id: traceId,\n status: getTraceStatus(result.success),\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(\n context,\n 'updateMargin',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.UpdateMargin,\n },\n { symbol, amount },\n ),\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 status: 'error',\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.trackingData - Optional tracking data for analytics events.\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 trackingData?: TrackingData;\n context: ServiceContext;\n }): Promise<OrderResult> {\n const { provider, position, trackingData, context } = options;\n const traceId = uuidv4();\n const startTime = this.#deps.performance.now();\n const flipIntentProperties = this.#buildTradeIntentProperties({\n orderType: 'market',\n });\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 const flipSize = positionSize * 2;\n\n // Direction-specific flip action, shared by the submitted and terminal events\n const flipAction = isCurrentlyLong\n ? PERPS_EVENT_VALUE.ACTION.FLIP_LONG_TO_SHORT\n : PERPS_EVENT_VALUE.ACTION.FLIP_SHORT_TO_LONG;\n\n // Create order params for flip\n // Use 2x position size: 1x to close current position + 1x to open opposite position.\n // Do not pass the position entry price as currentPrice: the provider must fetch\n // live market data for validation and IOC pricing.\n const orderParams: OrderParams = {\n symbol: position.symbol,\n isBuy: oppositeDirection,\n size: flipSize.toString(),\n orderType: 'market',\n leverage: position.leverage?.value,\n // Lighter placeOrder otherwise logs order_management/place_order and\n // marks the result reported, which drops this flip from flip filters.\n // Close already suppresses that provider report. One Sentry event remains.\n deferProviderErrorReport: true,\n };\n\n // Emit submitted event before the provider round-trip, keeping flip\n // trades aligned with the consolidated placeOrder pipeline.\n this.#trackSubmitted(PerpsAnalyticsEvent.TradeTransaction, {\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 ...flipIntentProperties,\n [PERPS_EVENT_PROPERTY.LEVERAGE]: position.leverage?.value || 1,\n [PERPS_EVENT_PROPERTY.ORDER_SIZE]: positionSize,\n [PERPS_EVENT_PROPERTY.ACTION]: flipAction,\n ...this.#buildAttributionProperties(trackingData),\n });\n\n // The flip order is 2x the position: one leg closes it, one opens the\n // opposite. `orderParams` deliberately carries no price, so the notional\n // comes from the position's own reported USD value.\n const flipNotionalUsd = this.#resolveOrderNotionalUsd({\n usdAmount: position.positionValue,\n });\n const feeResolution = await this.#calculateFeeDiscountWithMeasurement(\n flipNotionalUsd === undefined ? undefined : flipNotionalUsd * 2,\n );\n // Place flip order (HyperLiquid handles margin transfer automatically)\n const result = await this.#withFeeDiscount({\n provider,\n feeResolution,\n operation: () => provider.placeOrder(orderParams),\n });\n\n const completionDuration = this.#deps.performance.now() - startTime;\n\n const executedPrice = parseFloat(\n result.averagePrice ?? position.entryPrice,\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\n // Track success analytics with direction-specific flip action\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 ...flipIntentProperties,\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]: positionSize * executedPrice,\n // MetaMask fee on flip trades\n ...(trackingData?.metamaskFee !== undefined && {\n [PERPS_EVENT_PROPERTY.METAMASK_FEE]: trackingData.metamaskFee,\n }),\n ...(trackingData?.vipTier !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_TIER]: trackingData.vipTier,\n }),\n ...(trackingData?.vipDiscount !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_DISCOUNT]: trackingData.vipDiscount,\n }),\n ...this.#buildAttributionProperties(trackingData),\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 } else {\n // Provider rejected the flip without throwing: emit a terminal failed\n // event so every submitted flip is paired with executed or 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]: position.symbol,\n ...flipIntentProperties,\n [PERPS_EVENT_PROPERTY.ACTION]: flipAction,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]:\n result.error ?? 'Unknown error',\n ...(trackingData?.vipTier !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_TIER]: trackingData.vipTier,\n }),\n ...(trackingData?.vipDiscount !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_DISCOUNT]: trackingData.vipDiscount,\n }),\n ...this.#buildAttributionProperties(trackingData),\n },\n );\n\n if (\n !isSilentFlipResult(result.error) &&\n !wasProviderErrorReported(result)\n ) {\n this.#deps.logger.error(\n ensureError(result.error, 'TradingService.flipPosition'),\n this.#getErrorContext(\n context,\n 'flipPosition',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.FlipPosition,\n },\n {\n symbol: position.symbol,\n providerError: result.error ?? 'Unknown error',\n },\n ),\n );\n }\n }\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FlipPosition,\n id: traceId,\n status: getTraceStatus(result.success),\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(\n context,\n 'flipPosition',\n {\n operation: PERPS_ERROR_OPERATION.PositionManagement,\n action: PERPS_ERROR_ACTION.FlipPosition,\n },\n { symbol: position.symbol },\n ),\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 ...flipIntentProperties,\n [PERPS_EVENT_PROPERTY.ACTION]: failFlipAction,\n [PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,\n [PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,\n ...(trackingData?.vipTier !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_TIER]: trackingData.vipTier,\n }),\n ...(trackingData?.vipDiscount !== undefined && {\n [PERPS_EVENT_PROPERTY.VIP_DISCOUNT]: trackingData.vipDiscount,\n }),\n ...this.#buildAttributionProperties(trackingData),\n });\n\n this.#deps.tracer.endTrace({\n name: PerpsTraceNames.FlipPosition,\n id: traceId,\n status: 'error',\n data: { success: false, error: errorMessage },\n });\n\n throw error;\n }\n }\n}\n"]}