@metamask-previews/perps-controller 8.0.0-preview-51b287c55 → 8.1.0-preview-3af52b79c

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 (78) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/dist/constants/hyperLiquidConfig.cjs +166 -1
  3. package/dist/constants/hyperLiquidConfig.cjs.map +1 -1
  4. package/dist/constants/hyperLiquidConfig.d.cts +33 -0
  5. package/dist/constants/hyperLiquidConfig.d.cts.map +1 -1
  6. package/dist/constants/hyperLiquidConfig.d.mts +33 -0
  7. package/dist/constants/hyperLiquidConfig.d.mts.map +1 -1
  8. package/dist/constants/hyperLiquidConfig.mjs +163 -0
  9. package/dist/constants/hyperLiquidConfig.mjs.map +1 -1
  10. package/dist/constants/perpsConfig.cjs +2 -0
  11. package/dist/constants/perpsConfig.cjs.map +1 -1
  12. package/dist/constants/perpsConfig.d.cts +1 -0
  13. package/dist/constants/perpsConfig.d.cts.map +1 -1
  14. package/dist/constants/perpsConfig.d.mts +1 -0
  15. package/dist/constants/perpsConfig.d.mts.map +1 -1
  16. package/dist/constants/perpsConfig.mjs +2 -0
  17. package/dist/constants/perpsConfig.mjs.map +1 -1
  18. package/dist/index.cjs +48 -44
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +2 -1
  21. package/dist/index.d.cts.map +1 -1
  22. package/dist/index.d.mts +2 -1
  23. package/dist/index.d.mts.map +1 -1
  24. package/dist/index.mjs +2 -1
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/providers/HyperLiquidProvider.cjs +2 -2
  27. package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
  28. package/dist/providers/HyperLiquidProvider.d.cts +1 -1
  29. package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
  30. package/dist/providers/HyperLiquidProvider.d.mts +1 -1
  31. package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
  32. package/dist/providers/HyperLiquidProvider.mjs +3 -3
  33. package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
  34. package/dist/services/HyperLiquidSubscriptionService.cjs +109 -185
  35. package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -1
  36. package/dist/services/HyperLiquidSubscriptionService.d.cts +3 -3
  37. package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -1
  38. package/dist/services/HyperLiquidSubscriptionService.d.mts +3 -3
  39. package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -1
  40. package/dist/services/HyperLiquidSubscriptionService.mjs +109 -185
  41. package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -1
  42. package/dist/services/TradingService.cjs +50 -3
  43. package/dist/services/TradingService.cjs.map +1 -1
  44. package/dist/services/TradingService.d.cts.map +1 -1
  45. package/dist/services/TradingService.d.mts.map +1 -1
  46. package/dist/services/TradingService.mjs +50 -3
  47. package/dist/services/TradingService.mjs.map +1 -1
  48. package/dist/types/index.cjs.map +1 -1
  49. package/dist/types/index.d.cts +1 -1
  50. package/dist/types/index.d.cts.map +1 -1
  51. package/dist/types/index.d.mts +1 -1
  52. package/dist/types/index.d.mts.map +1 -1
  53. package/dist/types/index.mjs.map +1 -1
  54. package/dist/utils/index.cjs +1 -0
  55. package/dist/utils/index.cjs.map +1 -1
  56. package/dist/utils/index.d.cts +1 -0
  57. package/dist/utils/index.d.cts.map +1 -1
  58. package/dist/utils/index.d.mts +1 -0
  59. package/dist/utils/index.d.mts.map +1 -1
  60. package/dist/utils/index.mjs +1 -0
  61. package/dist/utils/index.mjs.map +1 -1
  62. package/dist/utils/marketDataTransform.cjs +5 -2
  63. package/dist/utils/marketDataTransform.cjs.map +1 -1
  64. package/dist/utils/marketDataTransform.d.cts +4 -1
  65. package/dist/utils/marketDataTransform.d.cts.map +1 -1
  66. package/dist/utils/marketDataTransform.d.mts +4 -1
  67. package/dist/utils/marketDataTransform.d.mts.map +1 -1
  68. package/dist/utils/marketDataTransform.mjs +6 -3
  69. package/dist/utils/marketDataTransform.mjs.map +1 -1
  70. package/dist/utils/marketSearch.cjs +85 -0
  71. package/dist/utils/marketSearch.cjs.map +1 -0
  72. package/dist/utils/marketSearch.d.cts +47 -0
  73. package/dist/utils/marketSearch.d.cts.map +1 -0
  74. package/dist/utils/marketSearch.d.mts +47 -0
  75. package/dist/utils/marketSearch.d.mts.map +1 -0
  76. package/dist/utils/marketSearch.mjs +80 -0
  77. package/dist/utils/marketSearch.mjs.map +1 -0
  78. package/package.json +2 -2
@@ -74,6 +74,8 @@ class TradingService {
74
74
  const traceId = (0, uuid_1.v4)();
75
75
  const startTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
76
76
  let traceData;
77
+ let orderSubmissionThresholdTimeoutId;
78
+ let didExceedOrderSubmissionThreshold = false;
77
79
  const paymentToken = params.trackingData?.tradeWithToken === true
78
80
  ? (params.trackingData.mmPayTokenSelected ?? 'unknown_token')
79
81
  : 'perps_balance';
@@ -122,16 +124,47 @@ class TradingService {
122
124
  hasTP: Boolean(params.takeProfitPrice),
123
125
  hasSL: Boolean(params.stopLossPrice),
124
126
  });
125
- // Execute order with fee discount management
127
+ // Observational threshold: when the provider round-trip exceeds
128
+ // PlaceOrderTimeoutMs we tag the trace and emit a breadcrumb, but we
129
+ // intentionally do NOT cancel the in-flight order. Cancelling client-side
130
+ // (e.g. Promise.race rejection) does not stop the provider request, so a
131
+ // race-based timeout would let the UI mark an order as failed while
132
+ // HyperLiquid could still accept it. Instead, we always await
133
+ // provider.placeOrder(params) to terminal completion and surface
134
+ // late completions via trace `reason: 'late_success' | 'late_error'`.
135
+ orderSubmissionThresholdTimeoutId = setTimeout(() => {
136
+ didExceedOrderSubmissionThreshold = true;
137
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.addBreadcrumb({
138
+ category: 'perps',
139
+ message: 'Order submission exceeded threshold (still pending)',
140
+ level: 'warning',
141
+ data: {
142
+ thresholdMs: perpsConfig_1.PERPS_CONSTANTS.PlaceOrderTimeoutMs,
143
+ payment_token: paymentToken,
144
+ market: params.symbol,
145
+ orderType: params.orderType,
146
+ },
147
+ });
148
+ __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('TradingService: Order submission exceeded threshold (still pending)', {
149
+ thresholdMs: perpsConfig_1.PERPS_CONSTANTS.PlaceOrderTimeoutMs,
150
+ symbol: params.symbol,
151
+ orderType: params.orderType,
152
+ });
153
+ }, perpsConfig_1.PERPS_CONSTANTS.PlaceOrderTimeoutMs);
126
154
  const result = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_withFeeDiscount).call(this, {
127
155
  provider,
128
156
  feeDiscountBips,
129
157
  operation: () => provider.placeOrder(params),
130
158
  });
159
+ if (orderSubmissionThresholdTimeoutId !== undefined) {
160
+ clearTimeout(orderSubmissionThresholdTimeoutId);
161
+ orderSubmissionThresholdTimeoutId = undefined;
162
+ }
131
163
  __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('TradingService: Provider response received', {
132
164
  success: result.success,
133
165
  orderId: result.orderId,
134
166
  error: result.error,
167
+ didExceedOrderSubmissionThreshold,
135
168
  });
136
169
  // Update state and handle success/failure
137
170
  const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
@@ -142,13 +175,23 @@ class TradingService {
142
175
  context,
143
176
  reportOrderToDataLake,
144
177
  });
145
- traceData = { success: true, orderId: result.orderId ?? '' };
178
+ traceData = {
179
+ success: true,
180
+ orderId: result.orderId ?? '',
181
+ ...(didExceedOrderSubmissionThreshold
182
+ ? { reason: 'late_success' }
183
+ : {}),
184
+ };
146
185
  // Invalidate standalone caches so external hooks (e.g., usePerpsPositionForAsset) refresh
147
186
  __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'positions' });
148
187
  __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'accountState' });
149
188
  }
150
189
  else {
151
- traceData = { success: false, error: result.error ?? 'Unknown error' };
190
+ traceData = {
191
+ success: false,
192
+ reason: didExceedOrderSubmissionThreshold ? 'late_error' : 'error',
193
+ error: result.error ?? 'Unknown error',
194
+ };
152
195
  }
153
196
  // Track analytics (success or failure)
154
197
  __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_trackOrderResult).call(this, {
@@ -187,11 +230,15 @@ class TradingService {
187
230
  });
188
231
  traceData = {
189
232
  success: false,
233
+ reason: didExceedOrderSubmissionThreshold ? 'late_error' : 'error',
190
234
  error: error instanceof Error ? error.message : 'Unknown error',
191
235
  };
192
236
  throw error;
193
237
  }
194
238
  finally {
239
+ if (orderSubmissionThresholdTimeoutId !== undefined) {
240
+ clearTimeout(orderSubmissionThresholdTimeoutId);
241
+ }
195
242
  // Always end trace on exit (success or failure)
196
243
  __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
197
244
  name: types_1.PerpsTraceNames.PlaceOrder,