@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.
- package/CHANGELOG.md +19 -1
- package/dist/PerpsController-method-action-types.cjs.map +1 -1
- package/dist/PerpsController-method-action-types.d.cts +8 -0
- package/dist/PerpsController-method-action-types.d.cts.map +1 -1
- package/dist/PerpsController-method-action-types.d.mts +8 -0
- package/dist/PerpsController-method-action-types.d.mts.map +1 -1
- package/dist/PerpsController-method-action-types.mjs.map +1 -1
- package/dist/PerpsController.cjs +117 -29
- package/dist/PerpsController.cjs.map +1 -1
- package/dist/PerpsController.d.cts +14 -2
- package/dist/PerpsController.d.cts.map +1 -1
- package/dist/PerpsController.d.mts +14 -2
- package/dist/PerpsController.d.mts.map +1 -1
- package/dist/PerpsController.mjs +118 -30
- package/dist/PerpsController.mjs.map +1 -1
- package/dist/constants/eventNames.cjs +1 -0
- package/dist/constants/eventNames.cjs.map +1 -1
- package/dist/constants/eventNames.d.cts +1 -0
- package/dist/constants/eventNames.d.cts.map +1 -1
- package/dist/constants/eventNames.d.mts +1 -0
- package/dist/constants/eventNames.d.mts.map +1 -1
- package/dist/constants/eventNames.mjs +1 -0
- package/dist/constants/eventNames.mjs.map +1 -1
- package/dist/constants/perpsConfig.cjs +46 -1
- package/dist/constants/perpsConfig.cjs.map +1 -1
- package/dist/constants/perpsConfig.d.cts +35 -0
- package/dist/constants/perpsConfig.d.cts.map +1 -1
- package/dist/constants/perpsConfig.d.mts +35 -0
- package/dist/constants/perpsConfig.d.mts.map +1 -1
- package/dist/constants/perpsConfig.mjs +43 -0
- package/dist/constants/perpsConfig.mjs.map +1 -1
- package/dist/constants/transactionsHistoryConfig.cjs +23 -4
- package/dist/constants/transactionsHistoryConfig.cjs.map +1 -1
- package/dist/constants/transactionsHistoryConfig.d.cts +23 -4
- package/dist/constants/transactionsHistoryConfig.d.cts.map +1 -1
- package/dist/constants/transactionsHistoryConfig.d.mts +23 -4
- package/dist/constants/transactionsHistoryConfig.d.mts.map +1 -1
- package/dist/constants/transactionsHistoryConfig.mjs +23 -4
- package/dist/constants/transactionsHistoryConfig.mjs.map +1 -1
- package/dist/index.cjs +14 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/dist/providers/HyperLiquidProvider.cjs +83 -27
- package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
- package/dist/providers/HyperLiquidProvider.mjs +83 -27
- package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.cjs +6 -0
- package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.mjs +6 -0
- package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -1
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.cts +6 -0
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.mts +6 -0
- package/dist/types/index.d.mts.map +1 -1
- package/dist/types/index.mjs.map +1 -1
- package/dist/utils/index.cjs +2 -0
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +2 -0
- package/dist/utils/index.d.cts.map +1 -1
- package/dist/utils/index.d.mts +2 -0
- package/dist/utils/index.d.mts.map +1 -1
- package/dist/utils/index.mjs +2 -0
- package/dist/utils/index.mjs.map +1 -1
- package/dist/utils/perpsDiskPersistence.cjs +252 -0
- package/dist/utils/perpsDiskPersistence.cjs.map +1 -0
- package/dist/utils/perpsDiskPersistence.d.cts +108 -0
- package/dist/utils/perpsDiskPersistence.d.cts.map +1 -0
- package/dist/utils/perpsDiskPersistence.d.mts +108 -0
- package/dist/utils/perpsDiskPersistence.d.mts.map +1 -0
- package/dist/utils/perpsDiskPersistence.mjs +244 -0
- package/dist/utils/perpsDiskPersistence.mjs.map +1 -0
- package/dist/utils/perpsFormatters.cjs +498 -0
- package/dist/utils/perpsFormatters.cjs.map +1 -0
- package/dist/utils/perpsFormatters.d.cts +202 -0
- package/dist/utils/perpsFormatters.d.cts.map +1 -0
- package/dist/utils/perpsFormatters.d.mts +202 -0
- package/dist/utils/perpsFormatters.d.mts.map +1 -0
- package/dist/utils/perpsFormatters.mjs +489 -0
- package/dist/utils/perpsFormatters.mjs.map +1 -0
- package/package.json +3 -3
package/dist/PerpsController.cjs
CHANGED
|
@@ -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,
|
|
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
|
|
553
|
-
const key =
|
|
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 (
|
|
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 =
|
|
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 (
|
|
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
|
|
621
|
-
const key =
|
|
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 =
|
|
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
|
-
},
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
}
|
|
2958
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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:
|
|
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,
|