@metamask-previews/perps-controller 3.0.0-preview-e61cfa5 → 3.1.0-preview-548bdd1d9

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 (90) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/dist/PerpsController-method-action-types.cjs.map +1 -1
  3. package/dist/PerpsController-method-action-types.d.cts +8 -0
  4. package/dist/PerpsController-method-action-types.d.cts.map +1 -1
  5. package/dist/PerpsController-method-action-types.d.mts +8 -0
  6. package/dist/PerpsController-method-action-types.d.mts.map +1 -1
  7. package/dist/PerpsController-method-action-types.mjs.map +1 -1
  8. package/dist/PerpsController.cjs +117 -29
  9. package/dist/PerpsController.cjs.map +1 -1
  10. package/dist/PerpsController.d.cts +14 -2
  11. package/dist/PerpsController.d.cts.map +1 -1
  12. package/dist/PerpsController.d.mts +14 -2
  13. package/dist/PerpsController.d.mts.map +1 -1
  14. package/dist/PerpsController.mjs +118 -30
  15. package/dist/PerpsController.mjs.map +1 -1
  16. package/dist/constants/eventNames.cjs +1 -0
  17. package/dist/constants/eventNames.cjs.map +1 -1
  18. package/dist/constants/eventNames.d.cts +1 -0
  19. package/dist/constants/eventNames.d.cts.map +1 -1
  20. package/dist/constants/eventNames.d.mts +1 -0
  21. package/dist/constants/eventNames.d.mts.map +1 -1
  22. package/dist/constants/eventNames.mjs +1 -0
  23. package/dist/constants/eventNames.mjs.map +1 -1
  24. package/dist/constants/perpsConfig.cjs +46 -1
  25. package/dist/constants/perpsConfig.cjs.map +1 -1
  26. package/dist/constants/perpsConfig.d.cts +35 -0
  27. package/dist/constants/perpsConfig.d.cts.map +1 -1
  28. package/dist/constants/perpsConfig.d.mts +35 -0
  29. package/dist/constants/perpsConfig.d.mts.map +1 -1
  30. package/dist/constants/perpsConfig.mjs +43 -0
  31. package/dist/constants/perpsConfig.mjs.map +1 -1
  32. package/dist/constants/transactionsHistoryConfig.cjs +23 -4
  33. package/dist/constants/transactionsHistoryConfig.cjs.map +1 -1
  34. package/dist/constants/transactionsHistoryConfig.d.cts +23 -4
  35. package/dist/constants/transactionsHistoryConfig.d.cts.map +1 -1
  36. package/dist/constants/transactionsHistoryConfig.d.mts +23 -4
  37. package/dist/constants/transactionsHistoryConfig.d.mts.map +1 -1
  38. package/dist/constants/transactionsHistoryConfig.mjs +23 -4
  39. package/dist/constants/transactionsHistoryConfig.mjs.map +1 -1
  40. package/dist/index.cjs +14 -3
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.cts +3 -1
  43. package/dist/index.d.cts.map +1 -1
  44. package/dist/index.d.mts +3 -1
  45. package/dist/index.d.mts.map +1 -1
  46. package/dist/index.mjs +2 -1
  47. package/dist/index.mjs.map +1 -1
  48. package/dist/providers/HyperLiquidProvider.cjs +83 -27
  49. package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
  50. package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
  51. package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
  52. package/dist/providers/HyperLiquidProvider.mjs +83 -27
  53. package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
  54. package/dist/services/HyperLiquidSubscriptionService.cjs +6 -0
  55. package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -1
  56. package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -1
  57. package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -1
  58. package/dist/services/HyperLiquidSubscriptionService.mjs +6 -0
  59. package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -1
  60. package/dist/types/index.cjs.map +1 -1
  61. package/dist/types/index.d.cts +6 -0
  62. package/dist/types/index.d.cts.map +1 -1
  63. package/dist/types/index.d.mts +6 -0
  64. package/dist/types/index.d.mts.map +1 -1
  65. package/dist/types/index.mjs.map +1 -1
  66. package/dist/utils/index.cjs +2 -0
  67. package/dist/utils/index.cjs.map +1 -1
  68. package/dist/utils/index.d.cts +2 -0
  69. package/dist/utils/index.d.cts.map +1 -1
  70. package/dist/utils/index.d.mts +2 -0
  71. package/dist/utils/index.d.mts.map +1 -1
  72. package/dist/utils/index.mjs +2 -0
  73. package/dist/utils/index.mjs.map +1 -1
  74. package/dist/utils/perpsDiskPersistence.cjs +252 -0
  75. package/dist/utils/perpsDiskPersistence.cjs.map +1 -0
  76. package/dist/utils/perpsDiskPersistence.d.cts +108 -0
  77. package/dist/utils/perpsDiskPersistence.d.cts.map +1 -0
  78. package/dist/utils/perpsDiskPersistence.d.mts +108 -0
  79. package/dist/utils/perpsDiskPersistence.d.mts.map +1 -0
  80. package/dist/utils/perpsDiskPersistence.mjs +244 -0
  81. package/dist/utils/perpsDiskPersistence.mjs.map +1 -0
  82. package/dist/utils/perpsFormatters.cjs +498 -0
  83. package/dist/utils/perpsFormatters.cjs.map +1 -0
  84. package/dist/utils/perpsFormatters.d.cts +202 -0
  85. package/dist/utils/perpsFormatters.d.cts.map +1 -0
  86. package/dist/utils/perpsFormatters.d.mts +202 -0
  87. package/dist/utils/perpsFormatters.d.mts.map +1 -0
  88. package/dist/utils/perpsFormatters.mjs +489 -0
  89. package/dist/utils/perpsFormatters.mjs.map +1 -0
  90. package/package.json +3 -3
@@ -10,7 +10,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
11
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
12
  };
13
- var _PerpsController_instances, _a, _PerpsController_initializationPromise, _PerpsController_isReinitializing, _PerpsController_myxRegistrationPromise, _PerpsController_blockedRegionListVersion, _PerpsController_hip3Enabled, _PerpsController_hip3AllowlistMarkets, _PerpsController_hip3BlocklistMarkets, _PerpsController_hip3ConfigSource, _PerpsController_isMYXProviderEnabled, _PerpsController_standaloneProvider, _PerpsController_handlersRegistered, _PerpsController_standaloneProviderIsTestnet, _PerpsController_standaloneProviderHip3Version, _PerpsController_eligibilityCheckDeferred, _PerpsController_options, _PerpsController_tradingService, _PerpsController_marketDataService, _PerpsController_accountService, _PerpsController_eligibilityService, _PerpsController_dataLakeService, _PerpsController_depositService, _PerpsController_featureFlagConfigurationService, _PerpsController_rewardsIntegrationService, _PerpsController_logError, _PerpsController_debugLog, _PerpsController_marketCacheKey, _PerpsController_providerIsTestnet, _PerpsController_getOrCreateStandaloneProvider, _PerpsController_cleanupStandaloneProvider, _PerpsController_getMetrics, _PerpsController_findNetworkClientIdForChain, _PerpsController_submitTransaction, _PerpsController_migrateRequestsIfNeeded, _PerpsController_withStreamPause, _PerpsController_performInitialization, _PerpsController_createProviders, _PerpsController_assignActiveProvider, _PerpsController_getErrorContext, _PerpsController_getControllerState, _PerpsController_createServiceContext, _PerpsController_ensureTradingServiceDeps, _PerpsController_preloadWatchedPaths, _PerpsController_preloadTimer, _PerpsController_isPreloading, _PerpsController_isPreloadingUserData, _PerpsController_preloadStateUnsubscribe, _PerpsController_accountChangeUnsubscribe, _PerpsController_previousIsTestnet, _PerpsController_previousHip3ConfigVersion, _PerpsController_preloadRefreshMs, _PerpsController_preloadGuardMs, _PerpsController_performMarketDataPreload, _PerpsController_performUserDataPreload;
13
+ var _PerpsController_instances, _a, _PerpsController_initializationPromise, _PerpsController_isReinitializing, _PerpsController_myxRegistrationPromise, _PerpsController_blockedRegionListVersion, _PerpsController_hip3Enabled, _PerpsController_hip3AllowlistMarkets, _PerpsController_hip3BlocklistMarkets, _PerpsController_hip3ConfigSource, _PerpsController_isMYXProviderEnabled, _PerpsController_standaloneProvider, _PerpsController_handlersRegistered, _PerpsController_standaloneProviderIsTestnet, _PerpsController_standaloneProviderHip3Version, _PerpsController_eligibilityCheckDeferred, _PerpsController_options, _PerpsController_tradingService, _PerpsController_marketDataService, _PerpsController_accountService, _PerpsController_eligibilityService, _PerpsController_dataLakeService, _PerpsController_depositService, _PerpsController_featureFlagConfigurationService, _PerpsController_rewardsIntegrationService, _PerpsController_logError, _PerpsController_debugLog, _PerpsController_getAggregatedCacheProviderIds, _PerpsController_getOrCreateStandaloneProvider, _PerpsController_cleanupStandaloneProvider, _PerpsController_getMetrics, _PerpsController_findNetworkClientIdForChain, _PerpsController_submitTransaction, _PerpsController_migrateRequestsIfNeeded, _PerpsController_withStreamPause, _PerpsController_performInitialization, _PerpsController_createProviders, _PerpsController_assignActiveProvider, _PerpsController_getErrorContext, _PerpsController_getControllerState, _PerpsController_createServiceContext, _PerpsController_ensureTradingServiceDeps, _PerpsController_preloadWatchedPaths, _PerpsController_preloadTimer, _PerpsController_isPreloading, _PerpsController_isPreloadingUserData, _PerpsController_preloadStateUnsubscribe, _PerpsController_accountChangeUnsubscribe, _PerpsController_previousIsTestnet, _PerpsController_previousHip3ConfigVersion, _PerpsController_preloadRefreshMs, _PerpsController_preloadGuardMs, _PerpsController_hydrateCacheFromDiskSync, _PerpsController_performMarketDataPreload, _PerpsController_performUserDataPreload;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.PerpsController = exports.getDefaultPerpsControllerState = exports.InitializationState = exports.PERPS_ERROR_CODES = exports.resolveMyxAuthConfig = exports.firstNonEmpty = void 0;
16
16
  const base_controller_1 = require("@metamask/base-controller");
@@ -36,6 +36,7 @@ const TradingService_1 = require("./services/TradingService.cjs");
36
36
  const types_1 = require("./types/index.cjs");
37
37
  const accountUtils_1 = require("./utils/accountUtils.cjs");
38
38
  const errorUtils_1 = require("./utils/errorUtils.cjs");
39
+ const perpsDiskPersistence_1 = require("./utils/perpsDiskPersistence.cjs");
39
40
  const wait_1 = require("./utils/wait.cjs");
40
41
  /**
41
42
  * Returns the first non-empty string from the given values.
@@ -535,22 +536,29 @@ class PerpsController extends base_controller_1.BaseController {
535
536
  this.providers = new Map();
536
537
  // Migrate old persisted data without accountAddress
537
538
  __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_migrateRequestsIfNeeded).call(this);
539
+ // Eagerly hydrate in-memory caches from disk so hooks see data on first render.
540
+ // Must happen at construction time — before any React component mounts.
541
+ __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_hydrateCacheFromDiskSync).call(this);
538
542
  }
539
543
  /**
540
544
  * Read cached market data for the currently active provider (or aggregated).
541
545
  * Returns null when no valid cache exists or when cache has expired.
542
546
  *
547
+ * @param options - Optional settings.
548
+ * @param options.skipTTL - When true, bypass the 5-minute TTL check.
549
+ * Used during initial render so disk-hydrated structural data (with
550
+ * placeholder prices) is returned regardless of age.
543
551
  * @returns The cached market data array, or null if no valid cache.
544
552
  */
545
- getCachedMarketDataForActiveProvider() {
553
+ getCachedMarketDataForActiveProvider(options) {
546
554
  const { activeProvider } = this.state;
547
555
  const cache = this.state.cachedMarketDataByProvider;
548
556
  if (activeProvider === 'aggregated') {
549
557
  // Assemble from all registered provider entries
550
558
  const assembled = [];
551
559
  let oldestTimestamp = Infinity;
552
- for (const [providerId] of this.providers) {
553
- const key = __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_marketCacheKey).call(this, providerId, __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_providerIsTestnet).call(this, providerId));
560
+ for (const providerId of __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_getAggregatedCacheProviderIds).call(this, Object.keys(cache))) {
561
+ const key = (0, perpsConfig_1.buildProviderCacheKey)(providerId, this.state.isTestnet);
554
562
  const entry = cache[key];
555
563
  if (!entry || entry.data.length === 0) {
556
564
  continue;
@@ -562,18 +570,20 @@ class PerpsController extends base_controller_1.BaseController {
562
570
  return null;
563
571
  }
564
572
  // Check TTL against the oldest entry
565
- if (Date.now() - oldestTimestamp > __classPrivateFieldGet(_a, _a, "f", _PerpsController_preloadGuardMs) * 10) {
573
+ if (!options?.skipTTL &&
574
+ Date.now() - oldestTimestamp > __classPrivateFieldGet(_a, _a, "f", _PerpsController_preloadGuardMs) * 10) {
566
575
  return null;
567
576
  }
568
577
  return assembled;
569
578
  }
570
579
  // Single provider mode
571
- const key = __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_marketCacheKey).call(this, activeProvider, __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_providerIsTestnet).call(this, activeProvider));
580
+ const key = (0, perpsConfig_1.buildProviderCacheKey)(activeProvider, this.state.isTestnet);
572
581
  const entry = cache[key];
573
582
  if (!entry || entry.data.length === 0) {
574
583
  return null;
575
584
  }
576
- if (Date.now() - entry.timestamp > __classPrivateFieldGet(_a, _a, "f", _PerpsController_preloadGuardMs) * 10) {
585
+ if (!options?.skipTTL &&
586
+ Date.now() - entry.timestamp > __classPrivateFieldGet(_a, _a, "f", _PerpsController_preloadGuardMs) * 10) {
577
587
  return null;
578
588
  }
579
589
  return entry.data;
@@ -583,9 +593,13 @@ class PerpsController extends base_controller_1.BaseController {
583
593
  * Returns null when no valid cache exists, cache has expired, or address
584
594
  * does not match the currently selected EVM account.
585
595
  *
596
+ * @param options - Optional settings.
597
+ * @param options.skipTTL - When true, bypass the 60s staleness check.
598
+ * Used during initial render so disk-hydrated user data (positions/orders)
599
+ * is returned regardless of age, avoiding a skeleton flash.
586
600
  * @returns The cached user data, or null if no valid cache.
587
601
  */
588
- getCachedUserDataForActiveProvider() {
602
+ getCachedUserDataForActiveProvider(options) {
589
603
  const { activeProvider } = this.state;
590
604
  const cache = this.state.cachedUserDataByProvider;
591
605
  const staleCutoff = __classPrivateFieldGet(_a, _a, "f", _PerpsController_preloadGuardMs) * 2; // 60s
@@ -598,11 +612,12 @@ class PerpsController extends base_controller_1.BaseController {
598
612
  catch {
599
613
  // Can't determine current account — trust the cache
600
614
  }
615
+ const skipTTL = options?.skipTTL ?? false;
601
616
  const isValidEntry = (entry) => {
602
617
  if (!entry) {
603
618
  return false;
604
619
  }
605
- if (Date.now() - entry.timestamp >= staleCutoff) {
620
+ if (!skipTTL && Date.now() - entry.timestamp >= staleCutoff) {
606
621
  return false;
607
622
  }
608
623
  if (currentAddress &&
@@ -617,8 +632,8 @@ class PerpsController extends base_controller_1.BaseController {
617
632
  const allOrders = [];
618
633
  let defaultAccountState = null;
619
634
  let hasValidEntry = false;
620
- for (const [providerId] of this.providers) {
621
- const key = __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_marketCacheKey).call(this, providerId, __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_providerIsTestnet).call(this, providerId));
635
+ for (const providerId of __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_getAggregatedCacheProviderIds).call(this, Object.keys(cache))) {
636
+ const key = (0, perpsConfig_1.buildProviderCacheKey)(providerId, this.state.isTestnet);
622
637
  const entry = cache[key];
623
638
  if (!isValidEntry(entry)) {
624
639
  continue;
@@ -641,7 +656,7 @@ class PerpsController extends base_controller_1.BaseController {
641
656
  };
642
657
  }
643
658
  // Single provider mode
644
- const key = __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_marketCacheKey).call(this, activeProvider, __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_providerIsTestnet).call(this, activeProvider));
659
+ const key = (0, perpsConfig_1.buildProviderCacheKey)(activeProvider, this.state.isTestnet);
645
660
  const entry = cache[key];
646
661
  if (!entry || !isValidEntry(entry)) {
647
662
  return null;
@@ -1659,6 +1674,12 @@ class PerpsController extends base_controller_1.BaseController {
1659
1674
  this.update((state) => {
1660
1675
  state.cachedUserDataByProvider = {};
1661
1676
  });
1677
+ // Invalidate disk-cached user data for the old account
1678
+ __classPrivateFieldGet(this, _PerpsController_options, "f").infrastructure.diskCache
1679
+ .removeItem(perpsConfig_1.PERPS_DISK_CACHE_USER_DATA)
1680
+ .catch(() => {
1681
+ /* fire-and-forget */
1682
+ });
1662
1683
  // Only preload if the new account is an EVM account
1663
1684
  if (currentAddress) {
1664
1685
  __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_performUserDataPreload).call(this).catch(() => {
@@ -2949,13 +2970,26 @@ _a = PerpsController, _PerpsController_initializationPromise = new WeakMap(), _P
2949
2970
  __classPrivateFieldGet(this, _PerpsController_options, "f").infrastructure.logger.error(error, options);
2950
2971
  }, _PerpsController_debugLog = function _PerpsController_debugLog(...args) {
2951
2972
  __classPrivateFieldGet(this, _PerpsController_options, "f").infrastructure.debugLogger.log(...args);
2952
- }, _PerpsController_marketCacheKey = function _PerpsController_marketCacheKey(providerId, isTestnet) {
2953
- return `${providerId}:${isTestnet ? 'testnet' : 'mainnet'}`;
2954
- }, _PerpsController_providerIsTestnet = function _PerpsController_providerIsTestnet(providerId) {
2955
- if (providerId === 'myx') {
2956
- return perpsConfig_1.PROVIDER_CONFIG.MYX_TESTNET_ONLY || this.state.isTestnet;
2957
- }
2958
- return this.state.isTestnet;
2973
+ }, _PerpsController_getAggregatedCacheProviderIds = function _PerpsController_getAggregatedCacheProviderIds(cacheKeys) {
2974
+ const providerIds = new Set();
2975
+ const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';
2976
+ for (const [providerId] of this.providers) {
2977
+ providerIds.add(providerId);
2978
+ }
2979
+ for (const key of cacheKeys) {
2980
+ const [providerId, network] = key.split(':');
2981
+ if (!providerId ||
2982
+ network !== currentNetwork ||
2983
+ providerId === 'aggregated') {
2984
+ continue;
2985
+ }
2986
+ if (providerId === 'hyperliquid' ||
2987
+ (providerId === 'myx' && __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_isMYXProviderEnabled).call(this)) ||
2988
+ this.providers.has(providerId)) {
2989
+ providerIds.add(providerId);
2990
+ }
2991
+ }
2992
+ return Array.from(providerIds);
2959
2993
  }, _PerpsController_getOrCreateStandaloneProvider = function _PerpsController_getOrCreateStandaloneProvider() {
2960
2994
  const currentIsTestnet = this.state.isTestnet;
2961
2995
  const currentHip3Version = this.state.hip3ConfigVersion ?? 0;
@@ -3227,11 +3261,7 @@ async function _PerpsController_performInitialization() {
3227
3261
  // IMPORTANT: Must use import() — NOT require() — for core/extension tree-shaking.
3228
3262
  // require() is synchronous and bundlers include it in the main bundle.
3229
3263
  // import() enables true code splitting so MYX is excluded when not enabled.
3230
- // NOTE: Uses a variable so ts-bridge does not rewrite the import
3231
- // specifier (which would strip the webpackIgnore magic comment).
3232
- const myxModulePath = './providers/MYXProvider';
3233
- __classPrivateFieldSet(this, _PerpsController_myxRegistrationPromise, import(
3234
- /* webpackIgnore: true */ myxModulePath)
3264
+ __classPrivateFieldSet(this, _PerpsController_myxRegistrationPromise, import("./providers/MYXProvider.cjs")
3235
3265
  .then(({ MYXProvider }) => {
3236
3266
  this.registerMYXProvider(MYXProvider);
3237
3267
  return undefined;
@@ -3312,6 +3342,26 @@ async function _PerpsController_performInitialization() {
3312
3342
  __classPrivateFieldGet(this, _PerpsController_tradingService, "f").setControllerDependencies({
3313
3343
  rewardsIntegrationService: __classPrivateFieldGet(this, _PerpsController_rewardsIntegrationService, "f"),
3314
3344
  });
3345
+ }, _PerpsController_hydrateCacheFromDiskSync = function _PerpsController_hydrateCacheFromDiskSync() {
3346
+ const { marketUpdates, userUpdates, stats } = (0, perpsDiskPersistence_1.hydrateFromDiskSync)(__classPrivateFieldGet(this, _PerpsController_options, "f").infrastructure.diskCache, this.state.cachedMarketDataByProvider, this.state.cachedUserDataByProvider, __classPrivateFieldGet(_a, _a, "f", _PerpsController_preloadGuardMs));
3347
+ const hasMarketUpdates = Object.keys(marketUpdates).length > 0;
3348
+ const hasUserUpdates = Object.keys(userUpdates).length > 0;
3349
+ if (hasMarketUpdates || hasUserUpdates) {
3350
+ this.update((state) => {
3351
+ if (hasMarketUpdates) {
3352
+ Object.assign(state.cachedMarketDataByProvider, marketUpdates);
3353
+ }
3354
+ if (hasUserUpdates) {
3355
+ Object.assign(state.cachedUserDataByProvider, userUpdates);
3356
+ }
3357
+ });
3358
+ }
3359
+ __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_debugLog).call(this, 'PerpsController: Disk cache hydrated (sync)', {
3360
+ markets: stats.marketCount,
3361
+ positions: stats.userPositions,
3362
+ orders: stats.userOrders,
3363
+ duration_ms: stats.durationMs,
3364
+ });
3315
3365
  }, _PerpsController_performMarketDataPreload =
3316
3366
  /**
3317
3367
  * Perform a single market data preload (best-effort, no throw).
@@ -3331,7 +3381,7 @@ async function _PerpsController_performMarketDataPreload() {
3331
3381
  const actualProviderId = this.activeProviderInstance
3332
3382
  ? this.state.activeProvider // includes 'aggregated'
3333
3383
  : 'hyperliquid';
3334
- const cacheKey = __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_marketCacheKey).call(this, actualProviderId, __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_providerIsTestnet).call(this, actualProviderId));
3384
+ const cacheKey = (0, perpsConfig_1.buildProviderCacheKey)(actualProviderId, this.state.isTestnet);
3335
3385
  const now = Date.now();
3336
3386
  const existingEntry = this.state.cachedMarketDataByProvider[cacheKey];
3337
3387
  if (existingEntry &&
@@ -3353,9 +3403,15 @@ async function _PerpsController_performMarketDataPreload() {
3353
3403
  },
3354
3404
  });
3355
3405
  __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_debugLog).call(this, 'PerpsController: Fetching market data in background');
3406
+ __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_debugLog).call(this, 'PerpsController: rest_preload_start');
3356
3407
  const data = await this.getMarketDataWithPrices({ standalone: true });
3408
+ __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_debugLog).call(this, 'PerpsController: rest_preload_end', {
3409
+ duration_ms: Math.round(performance.now() - preloadStart),
3410
+ markets: data.length,
3411
+ });
3357
3412
  // Store under per-provider key(s)
3358
3413
  const ts = Date.now();
3414
+ const marketDiskEntries = [];
3359
3415
  if (this.state.activeProvider === 'aggregated' &&
3360
3416
  this.activeProviderInstance) {
3361
3417
  // Split returned data by providerId and store each slice
@@ -3373,7 +3429,12 @@ async function _PerpsController_performMarketDataPreload() {
3373
3429
  }
3374
3430
  this.update((state) => {
3375
3431
  for (const [pid, slice] of byProvider) {
3376
- const key = __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_marketCacheKey).call(this, pid, __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_providerIsTestnet).call(this, pid));
3432
+ const key = (0, perpsConfig_1.buildProviderCacheKey)(pid, this.state.isTestnet);
3433
+ marketDiskEntries.push({
3434
+ providerNetworkKey: key,
3435
+ data: slice,
3436
+ timestamp: ts,
3437
+ });
3377
3438
  state.cachedMarketDataByProvider[key] = {
3378
3439
  data: slice,
3379
3440
  timestamp: ts,
@@ -3387,6 +3448,11 @@ async function _PerpsController_performMarketDataPreload() {
3387
3448
  });
3388
3449
  }
3389
3450
  else {
3451
+ marketDiskEntries.push({
3452
+ providerNetworkKey: cacheKey,
3453
+ data,
3454
+ timestamp: ts,
3455
+ });
3390
3456
  this.update((state) => {
3391
3457
  state.cachedMarketDataByProvider[cacheKey] = {
3392
3458
  data,
@@ -3394,6 +3460,7 @@ async function _PerpsController_performMarketDataPreload() {
3394
3460
  };
3395
3461
  });
3396
3462
  }
3463
+ (0, perpsDiskPersistence_1.persistMarketEntriesToDisk)(__classPrivateFieldGet(this, _PerpsController_options, "f").infrastructure.diskCache, marketDiskEntries);
3397
3464
  __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_debugLog).call(this, 'PerpsController: Market data preloaded', {
3398
3465
  marketCount: data.length,
3399
3466
  });
@@ -3441,7 +3508,7 @@ async function _PerpsController_performUserDataPreload() {
3441
3508
  const actualProviderId = this.activeProviderInstance
3442
3509
  ? this.state.activeProvider // includes 'aggregated'
3443
3510
  : 'hyperliquid';
3444
- const userCacheKey = __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_marketCacheKey).call(this, actualProviderId, __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_providerIsTestnet).call(this, actualProviderId));
3511
+ const userCacheKey = (0, perpsConfig_1.buildProviderCacheKey)(actualProviderId, this.state.isTestnet);
3445
3512
  // Skip if cache is fresh and for same account
3446
3513
  const now = Date.now();
3447
3514
  const existingEntry = this.state.cachedUserDataByProvider[userCacheKey];
@@ -3500,9 +3567,18 @@ async function _PerpsController_performUserDataPreload() {
3500
3567
  }
3501
3568
  // AccountState — assign to its provider bucket
3502
3569
  ensureBucket(accountState.providerId ?? fallbackProviderId).accountState = accountState;
3570
+ const diskEntries = [];
3503
3571
  this.update((state) => {
3504
3572
  for (const [pid, data] of byProvider) {
3505
- const key = __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_marketCacheKey).call(this, pid, __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_providerIsTestnet).call(this, pid));
3573
+ const key = (0, perpsConfig_1.buildProviderCacheKey)(pid, this.state.isTestnet);
3574
+ diskEntries.push({
3575
+ providerNetworkKey: key,
3576
+ address: userAddress,
3577
+ positions: data.positions,
3578
+ orders: data.orders,
3579
+ accountState: data.accountState,
3580
+ timestamp: ts,
3581
+ });
3506
3582
  state.cachedUserDataByProvider[key] = {
3507
3583
  ...data,
3508
3584
  timestamp: ts,
@@ -3518,18 +3594,30 @@ async function _PerpsController_performUserDataPreload() {
3518
3594
  address: userAddress,
3519
3595
  };
3520
3596
  });
3597
+ (0, perpsDiskPersistence_1.persistUserEntriesToDisk)(__classPrivateFieldGet(this, _PerpsController_options, "f").infrastructure.diskCache, diskEntries);
3521
3598
  }
3522
3599
  else {
3523
3600
  // Single provider — store directly under its key
3601
+ const ts = Date.now();
3524
3602
  this.update((state) => {
3525
3603
  state.cachedUserDataByProvider[userCacheKey] = {
3526
3604
  positions,
3527
3605
  orders,
3528
3606
  accountState,
3529
- timestamp: Date.now(),
3607
+ timestamp: ts,
3530
3608
  address: userAddress,
3531
3609
  };
3532
3610
  });
3611
+ (0, perpsDiskPersistence_1.persistUserEntriesToDisk)(__classPrivateFieldGet(this, _PerpsController_options, "f").infrastructure.diskCache, [
3612
+ {
3613
+ providerNetworkKey: userCacheKey,
3614
+ address: userAddress,
3615
+ positions,
3616
+ orders,
3617
+ accountState,
3618
+ timestamp: ts,
3619
+ },
3620
+ ]);
3533
3621
  }
3534
3622
  __classPrivateFieldGet(this, _PerpsController_instances, "m", _PerpsController_debugLog).call(this, 'PerpsController: User data preloaded', {
3535
3623
  positionCount: positions.length,