@metamask-previews/assets-controller 14.0.3-preview-fe4b3be11 → 14.0.3-preview-8bfa290fb
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 +6 -4
- package/dist/AssetsController.cjs +273 -592
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +10 -7
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +10 -7
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +273 -592
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AbstractDataSource.cjs +0 -23
- package/dist/data-sources/AbstractDataSource.cjs.map +1 -1
- package/dist/data-sources/AbstractDataSource.d.cts +1 -13
- package/dist/data-sources/AbstractDataSource.d.cts.map +1 -1
- package/dist/data-sources/AbstractDataSource.d.mts +1 -13
- package/dist/data-sources/AbstractDataSource.d.mts.map +1 -1
- package/dist/data-sources/AbstractDataSource.mjs +0 -23
- package/dist/data-sources/AbstractDataSource.mjs.map +1 -1
- package/dist/data-sources/AccountActivityDataSource.cjs +0 -2
- package/dist/data-sources/AccountActivityDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountActivityDataSource.d.cts.map +1 -1
- package/dist/data-sources/AccountActivityDataSource.d.mts.map +1 -1
- package/dist/data-sources/AccountActivityDataSource.mjs +0 -2
- package/dist/data-sources/AccountActivityDataSource.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +31 -144
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.cts +2 -18
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.mts +2 -18
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs +32 -145
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +24 -163
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +0 -17
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +0 -17
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +25 -164
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +12 -21
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +2 -7
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +2 -7
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs +12 -21
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.d.cts +2 -3
- package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.d.mts +2 -3
- package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -1
- package/dist/middlewares/ParallelMiddleware.cjs +0 -9
- package/dist/middlewares/ParallelMiddleware.cjs.map +1 -1
- package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -1
- package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -1
- package/dist/middlewares/ParallelMiddleware.mjs +0 -9
- package/dist/middlewares/ParallelMiddleware.mjs.map +1 -1
- package/dist/middlewares/RpcFallbackMiddleware.cjs +128 -158
- package/dist/middlewares/RpcFallbackMiddleware.cjs.map +1 -1
- package/dist/middlewares/RpcFallbackMiddleware.d.cts +14 -10
- package/dist/middlewares/RpcFallbackMiddleware.d.cts.map +1 -1
- package/dist/middlewares/RpcFallbackMiddleware.d.mts +14 -10
- package/dist/middlewares/RpcFallbackMiddleware.d.mts.map +1 -1
- package/dist/middlewares/RpcFallbackMiddleware.mjs +128 -158
- package/dist/middlewares/RpcFallbackMiddleware.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +26 -28
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +26 -28
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -13,7 +13,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
13
13
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
|
-
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _AssetsController_captureException, _AssetsController_firstInitFetchReported, _AssetsController_stateSizeReported, _AssetsController_emitStateSizeTrace, _AssetsController_controllerMutex, _AssetsController_accountRefreshMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_getSelectedAccounts, _AssetsController_isAccountTreeInitialized, _AssetsController_isUiOpen, _AssetsController_isKeyringUnlocked, _AssetsController_accountActivityDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_customAssetGraduationMiddleware, _AssetsController_rpcFallbackMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_queryApiClient, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeNativeAssetsMap, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_refreshAssetsForTransaction, _AssetsController_runSpamCleanup, _AssetsController_updateActive, _AssetsController_runStartupRefresh, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares,
|
|
16
|
+
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _AssetsController_captureException, _AssetsController_firstInitFetchReported, _AssetsController_stateSizeReported, _AssetsController_emitStateSizeTrace, _AssetsController_controllerMutex, _AssetsController_accountRefreshMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_getSelectedAccounts, _AssetsController_isAccountTreeInitialized, _AssetsController_isUiOpen, _AssetsController_isKeyringUnlocked, _AssetsController_accountActivityDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_customAssetGraduationMiddleware, _AssetsController_rpcFallbackMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_queryApiClient, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeNativeAssetsMap, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_refreshAssetsForTransaction, _AssetsController_runSpamCleanup, _AssetsController_updateActive, _AssetsController_runStartupRefresh, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_assertNonEmptyAccountId, _AssetsController_normalizeAssetIdOrThrow, _AssetsController_fetchMissingPricesWithoutCache, _AssetsController_getNativeAssetMap, _AssetsController_isNativeAsset, _AssetsController_getAssetType, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_getSlowPipelineChainIds, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_ensureDefaultTrackedAssetsSeeded, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_getAssetFromState, _AssetsController_shouldHideNativeToken, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeRpcCustomAssetsSupplement, _AssetsController_unsubscribeBySubscriptionKey, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged, _AssetsController_handleNetworkAdded, _AssetsController_refreshActiveChainsOnNetworkSwitch, _AssetsController_getSelectedEvmChainIdFromNetworkState, _AssetsController_handleNetworkDidChange, _AssetsController_refreshAssetsAfterNetworkChange, _AssetsController_refreshAssetsAfterNetworkAdded;
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.AssetsController = exports.getDefaultAssetsControllerState = void 0;
|
|
19
19
|
const base_controller_1 = require("@metamask/base-controller");
|
|
@@ -208,10 +208,6 @@ function normalizeResponse(response) {
|
|
|
208
208
|
if (response.replaceCoveredChainBalances) {
|
|
209
209
|
normalized.replaceCoveredChainBalances = true;
|
|
210
210
|
}
|
|
211
|
-
if (response.unprocessedCustomAssets &&
|
|
212
|
-
response.unprocessedCustomAssets.length > 0) {
|
|
213
|
-
normalized.unprocessedCustomAssets = response.unprocessedCustomAssets.map((assetId) => (0, index_js_2.normalizeAssetId)(assetId));
|
|
214
|
-
}
|
|
215
211
|
return normalized;
|
|
216
212
|
}
|
|
217
213
|
/**
|
|
@@ -219,13 +215,12 @@ function normalizeResponse(response) {
|
|
|
219
215
|
*
|
|
220
216
|
* @param previousBalances - Balances already in state for this account.
|
|
221
217
|
* @param accountBalances - Balances from the incoming response.
|
|
222
|
-
* @param customAssetIds - Custom assets to preserve when replacing covered chains
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
* on chains present in the response before applying it, then restore custom assets.
|
|
218
|
+
* @param customAssetIds - Custom assets to preserve when replacing covered chains.
|
|
219
|
+
* @param replaceCoveredChains - When true, drop prior balances on chains present
|
|
220
|
+
* in the response before applying it (authoritative chain slice).
|
|
226
221
|
* @returns The merged balance map for the account.
|
|
227
222
|
*/
|
|
228
|
-
function
|
|
223
|
+
function mergeAccountBalances(previousBalances, accountBalances, customAssetIds, replaceCoveredChains) {
|
|
229
224
|
if (!replaceCoveredChains) {
|
|
230
225
|
return { ...previousBalances, ...accountBalances };
|
|
231
226
|
}
|
|
@@ -239,8 +234,8 @@ function mergeAccountBalancesV5(previousBalances, accountBalances, customAssetId
|
|
|
239
234
|
Object.assign(next, accountBalances);
|
|
240
235
|
for (const customId of customAssetIds) {
|
|
241
236
|
if (!Object.prototype.hasOwnProperty.call(next, customId)) {
|
|
242
|
-
const
|
|
243
|
-
next[customId] =
|
|
237
|
+
const prev = previousBalances[customId];
|
|
238
|
+
next[customId] = prev ?? { amount: '0' };
|
|
244
239
|
}
|
|
245
240
|
}
|
|
246
241
|
// Staked vault balances are owned by StakedBalanceDataSource. When an
|
|
@@ -254,38 +249,6 @@ function mergeAccountBalancesV5(previousBalances, accountBalances, customAssetId
|
|
|
254
249
|
}
|
|
255
250
|
return next;
|
|
256
251
|
}
|
|
257
|
-
/**
|
|
258
|
-
* Apply an Accounts API v6 authoritative chain snapshot.
|
|
259
|
-
*
|
|
260
|
-
* @param previousBalances - Balances already in state for this account.
|
|
261
|
-
* @param accountBalances - Balances from the incoming response.
|
|
262
|
-
* @param unprocessedCustomAssets - Pins that v6 and RPC could not resolve.
|
|
263
|
-
* @returns The merged balance map for the account.
|
|
264
|
-
*/
|
|
265
|
-
function mergeAccountBalancesV6(previousBalances, accountBalances, unprocessedCustomAssets = []) {
|
|
266
|
-
const coveredChains = new Set(Object.keys(accountBalances).map((assetId) => assetId.split('/')[0]));
|
|
267
|
-
const next = {};
|
|
268
|
-
for (const [assetId, balance] of Object.entries(previousBalances)) {
|
|
269
|
-
if (!coveredChains.has(assetId.split('/')[0])) {
|
|
270
|
-
next[assetId] = balance;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
Object.assign(next, accountBalances);
|
|
274
|
-
const unprocessedSet = new Set(unprocessedCustomAssets.map((assetId) => (0, index_js_2.normalizeAssetId)(assetId)));
|
|
275
|
-
for (const [assetId, balance] of Object.entries(previousBalances)) {
|
|
276
|
-
if (unprocessedSet.has((0, index_js_2.normalizeAssetId)(assetId)) &&
|
|
277
|
-
!Object.prototype.hasOwnProperty.call(next, assetId)) {
|
|
278
|
-
next[assetId] = balance;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
for (const [assetId, balance] of Object.entries(previousBalances)) {
|
|
282
|
-
if ((0, index_js_1.isStakingContractAssetId)(assetId) &&
|
|
283
|
-
!Object.prototype.hasOwnProperty.call(next, assetId)) {
|
|
284
|
-
next[assetId] = balance;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
return next;
|
|
288
|
-
}
|
|
289
252
|
// ============================================================================
|
|
290
253
|
// CONTROLLER IMPLEMENTATION
|
|
291
254
|
// ============================================================================
|
|
@@ -406,7 +369,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
406
369
|
queryApiClient,
|
|
407
370
|
onActiveChainsUpdated: __classPrivateFieldGet(this, _AssetsController_onActiveChainsUpdated, "f"),
|
|
408
371
|
...accountsApiDataSourceConfig,
|
|
409
|
-
isBalanceV6Enabled: () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this),
|
|
410
372
|
}), "f");
|
|
411
373
|
__classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource_js_1.SnapDataSource({
|
|
412
374
|
messenger: this.messenger,
|
|
@@ -426,7 +388,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
426
388
|
...rpcConfig,
|
|
427
389
|
isOnboarded: rpcConfig.isOnboarded ?? isOnboarded,
|
|
428
390
|
getAssetType: (assetId) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetType).call(this, assetId),
|
|
429
|
-
isBalanceV6Enabled: () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this),
|
|
430
391
|
}), "f");
|
|
431
392
|
__classPrivateFieldSet(this, _AssetsController_stakedBalanceDataSource, new StakedBalanceDataSource_js_1.StakedBalanceDataSource({
|
|
432
393
|
messenger: this.messenger,
|
|
@@ -459,7 +420,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
459
420
|
}), "f");
|
|
460
421
|
__classPrivateFieldSet(this, _AssetsController_rpcFallbackMiddleware, new RpcFallbackMiddleware_js_1.RpcFallbackMiddleware({
|
|
461
422
|
rpcDataSource: __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
462
|
-
isBalanceV6Enabled: () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this),
|
|
463
423
|
}), "f");
|
|
464
424
|
log('Initializing AssetsController', {
|
|
465
425
|
defaultUpdateInterval: __classPrivateFieldGet(this, _AssetsController_defaultUpdateInterval, "f"),
|
|
@@ -496,34 +456,147 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
496
456
|
if (accounts.length === 0 || chainIds.length === 0) {
|
|
497
457
|
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
|
|
498
458
|
}
|
|
459
|
+
// Collect custom assets for all requested accounts
|
|
460
|
+
const customAssets = [];
|
|
461
|
+
for (const account of accounts) {
|
|
462
|
+
const accountCustomAssets = this.getCustomAssets(account.id);
|
|
463
|
+
customAssets.push(...accountCustomAssets);
|
|
464
|
+
}
|
|
499
465
|
if (options?.forceUpdate) {
|
|
466
|
+
// Pipeline spans only on unlock/first-init fetch; later forceUpdates pass
|
|
467
|
+
// `undefined` so `emitTrace` / `withTrace` no-op without call-site if/else.
|
|
500
468
|
const pipelineTrace = __classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")
|
|
501
469
|
? undefined
|
|
502
470
|
: __classPrivateFieldGet(this, _AssetsController_trace, "f");
|
|
503
|
-
const
|
|
471
|
+
const request = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
|
|
504
472
|
assetTypes,
|
|
505
473
|
dataTypes,
|
|
474
|
+
customAssets: customAssets.length > 0 ? customAssets : undefined,
|
|
506
475
|
forceUpdate: true,
|
|
476
|
+
bypassServerCache: options?.bypassServerCache,
|
|
507
477
|
assetsForPriceUpdate: options?.assetsForPriceUpdate,
|
|
508
|
-
};
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
478
|
+
});
|
|
479
|
+
// Fast pipeline: accountsApi + stakedBalance → detection → token + price.
|
|
480
|
+
// Snap and RPC are excluded here due to their latency (snap triggers account
|
|
481
|
+
// creation, RPC is slow on many chains). Results are committed to state
|
|
482
|
+
// immediately so the UI can display balances without waiting for them.
|
|
483
|
+
//
|
|
484
|
+
// Fast/slow pipelines use merge so partial API snapshots cannot wipe
|
|
485
|
+
// tokens missing from the response (e.g. USDC when only native balance
|
|
486
|
+
// is returned). Balances present in the response are still refreshed.
|
|
487
|
+
const fastSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
488
|
+
? [
|
|
489
|
+
(0, ParallelMiddleware_js_1.createParallelBalanceMiddleware)([
|
|
490
|
+
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
491
|
+
__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
|
|
492
|
+
]),
|
|
493
|
+
// Graduation must run BEFORE the RPC fallback so it only sees
|
|
494
|
+
// AccountsApi/Websocket balances. RPC intentionally carries
|
|
495
|
+
// custom assets and must never trigger graduation.
|
|
496
|
+
__classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f"),
|
|
497
|
+
__classPrivateFieldGet(this, _AssetsController_rpcFallbackMiddleware, "f"),
|
|
498
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
499
|
+
(0, ParallelMiddleware_js_1.createParallelMiddleware)([
|
|
500
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
501
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
502
|
+
]),
|
|
503
|
+
]
|
|
504
|
+
: [__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
|
|
505
|
+
const { response } = await (0, trace_js_1.withTrace)({
|
|
506
|
+
name: TRACE_FETCH_PIPELINE,
|
|
507
|
+
trace: pipelineTrace,
|
|
508
|
+
data: {
|
|
509
|
+
chain_count: chainIds.length,
|
|
510
|
+
account_count: accounts.length,
|
|
511
|
+
basic_functionality: __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this),
|
|
512
|
+
},
|
|
513
|
+
fn: async (parentContext) => {
|
|
514
|
+
const startTime = performance.now();
|
|
515
|
+
const result = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
|
|
516
|
+
sources: fastSources,
|
|
517
|
+
request,
|
|
518
|
+
parentContext,
|
|
519
|
+
trace: pipelineTrace,
|
|
520
|
+
});
|
|
521
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
|
|
522
|
+
...result.response,
|
|
523
|
+
updateMode: 'merge',
|
|
524
|
+
replaceCoveredChainBalances: true,
|
|
525
|
+
});
|
|
526
|
+
const durationMs = performance.now() - startTime;
|
|
527
|
+
// Summary fields for Assets Health (nested under the parent span).
|
|
528
|
+
(0, trace_js_1.emitTrace)({
|
|
529
|
+
name: TRACE_FULL_FETCH,
|
|
530
|
+
trace: pipelineTrace,
|
|
531
|
+
data: {
|
|
532
|
+
duration_ms: durationMs,
|
|
533
|
+
chain_count: chainIds.length,
|
|
534
|
+
account_count: accounts.length,
|
|
535
|
+
basic_functionality: __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this),
|
|
536
|
+
asset_count: result.response.assetsBalance
|
|
537
|
+
? Object.values(result.response.assetsBalance).reduce((sum, acct) => sum + Object.keys(acct).length, 0)
|
|
538
|
+
: 0,
|
|
539
|
+
price_count: result.response.assetsPrice
|
|
540
|
+
? Object.keys(result.response.assetsPrice).length
|
|
541
|
+
: 0,
|
|
542
|
+
...result.durationByDataSource,
|
|
543
|
+
},
|
|
544
|
+
parentContext,
|
|
545
|
+
});
|
|
546
|
+
(0, trace_js_1.emitTrace)({
|
|
547
|
+
name: TRACE_FIRST_INIT_FETCH,
|
|
548
|
+
trace: pipelineTrace,
|
|
549
|
+
data: {
|
|
550
|
+
duration_ms: durationMs,
|
|
551
|
+
chain_ids: JSON.stringify(chainIds),
|
|
552
|
+
...result.durationByDataSource,
|
|
553
|
+
},
|
|
554
|
+
parentContext,
|
|
555
|
+
});
|
|
556
|
+
return result;
|
|
557
|
+
},
|
|
558
|
+
});
|
|
559
|
+
// Mark after the unlock/first forceUpdate so later polls skip pipeline spans.
|
|
560
|
+
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
|
|
561
|
+
// Background (slow) lane — flattened sibling of the fast lane (not nested
|
|
562
|
+
// inside its withTrace callback). Still fire-and-forget so UI is not blocked.
|
|
563
|
+
const slowPipelineChainIds = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSlowPipelineChainIds).call(this, chainIds, response);
|
|
564
|
+
if (slowPipelineChainIds.length > 0) {
|
|
565
|
+
const slowSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
566
|
+
? [__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")]
|
|
567
|
+
: [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
|
|
568
|
+
const slowRequest = { ...request, chainIds: slowPipelineChainIds };
|
|
569
|
+
(0, trace_js_1.withTrace)({
|
|
570
|
+
name: TRACE_BACKGROUND_FETCH,
|
|
571
|
+
trace: pipelineTrace,
|
|
572
|
+
data: {
|
|
573
|
+
chain_count: slowPipelineChainIds.length,
|
|
574
|
+
account_count: accounts.length,
|
|
575
|
+
},
|
|
576
|
+
fn: async (slowParentContext) => {
|
|
577
|
+
const { response: slowResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
|
|
578
|
+
sources: [
|
|
579
|
+
(0, ParallelMiddleware_js_1.createParallelBalanceMiddleware)(slowSources),
|
|
580
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
581
|
+
...(__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
582
|
+
? [
|
|
583
|
+
(0, ParallelMiddleware_js_1.createParallelMiddleware)([
|
|
584
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
585
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
586
|
+
]),
|
|
587
|
+
]
|
|
588
|
+
: []),
|
|
589
|
+
],
|
|
590
|
+
request: slowRequest,
|
|
591
|
+
parentContext: slowParentContext,
|
|
592
|
+
trace: pipelineTrace,
|
|
593
|
+
});
|
|
594
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
|
|
595
|
+
...slowResponse,
|
|
596
|
+
updateMode: 'merge',
|
|
597
|
+
});
|
|
598
|
+
},
|
|
599
|
+
}).catch((error) => log('Background pipeline failed', { error }));
|
|
527
600
|
}
|
|
528
601
|
}
|
|
529
602
|
const result = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
|
|
@@ -770,28 +843,20 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
770
843
|
balances[accountId] ?? (balances[accountId] = {});
|
|
771
844
|
(_a = balances[accountId])[normalizedAssetId] ?? (_a[normalizedAssetId] = { amount: '0' });
|
|
772
845
|
});
|
|
846
|
+
// Fetch data for the newly added custom asset (merge to preserve other chains)
|
|
773
847
|
const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.id === accountId);
|
|
774
848
|
if (account) {
|
|
775
849
|
const chainId = extractChainId(normalizedAssetId);
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
});
|
|
784
|
-
}
|
|
785
|
-
else {
|
|
786
|
-
await this.getAssets([account], {
|
|
787
|
-
chainIds: [chainId],
|
|
788
|
-
dataTypes: ['balance', 'metadata', 'price'],
|
|
789
|
-
assetTypes: ['fungible'],
|
|
790
|
-
forceUpdate: true,
|
|
791
|
-
});
|
|
792
|
-
}
|
|
850
|
+
await this.getAssets([account], {
|
|
851
|
+
chainIds: [chainId],
|
|
852
|
+
dataTypes: ['balance', 'metadata', 'price'],
|
|
853
|
+
assetTypes: ['fungible'],
|
|
854
|
+
forceUpdate: true,
|
|
855
|
+
updateMode: 'merge',
|
|
856
|
+
});
|
|
793
857
|
}
|
|
794
|
-
// Re-evaluate subscriptions so
|
|
858
|
+
// Re-evaluate subscriptions so the supplemental RPC poll picks up the
|
|
859
|
+
// new customAsset on chains another data source already owns.
|
|
795
860
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
796
861
|
}
|
|
797
862
|
/**
|
|
@@ -812,7 +877,8 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
812
877
|
}
|
|
813
878
|
}
|
|
814
879
|
});
|
|
815
|
-
// Re-evaluate subscriptions so
|
|
880
|
+
// Re-evaluate subscriptions so the supplemental RPC poll for that chain
|
|
881
|
+
// is torn down when no more customAssets remain there.
|
|
816
882
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
817
883
|
}
|
|
818
884
|
/**
|
|
@@ -843,8 +909,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
843
909
|
}
|
|
844
910
|
state.assetPreferences[normalizedAssetId].hidden = true;
|
|
845
911
|
});
|
|
846
|
-
// Re-evaluate subscriptions so polls exclude the newly hidden asset.
|
|
847
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
848
912
|
}
|
|
849
913
|
/**
|
|
850
914
|
* Unhide an asset globally.
|
|
@@ -863,8 +927,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
863
927
|
}
|
|
864
928
|
}
|
|
865
929
|
});
|
|
866
|
-
// Re-evaluate subscriptions so polls stop excluding the asset.
|
|
867
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
868
930
|
}
|
|
869
931
|
// ============================================================================
|
|
870
932
|
// CURRENT CURRENCY MANAGEMENT
|
|
@@ -976,14 +1038,101 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
976
1038
|
async handleAssetsUpdate(response, sourceId, request) {
|
|
977
1039
|
log('Assets updated from data source', {
|
|
978
1040
|
sourceId,
|
|
979
|
-
|
|
980
|
-
|
|
1041
|
+
hasBalance: Boolean(response.assetsBalance),
|
|
1042
|
+
hasPrice: Boolean(response.assetsPrice),
|
|
1043
|
+
});
|
|
1044
|
+
// Enrichment spans only before unlock/first-init fetch completes.
|
|
1045
|
+
const pipelineTrace = __classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")
|
|
1046
|
+
? undefined
|
|
1047
|
+
: __classPrivateFieldGet(this, _AssetsController_trace, "f");
|
|
1048
|
+
await (0, trace_js_1.withTrace)({
|
|
1049
|
+
name: TRACE_UPDATE_PARENT,
|
|
1050
|
+
trace: pipelineTrace,
|
|
1051
|
+
data: {
|
|
1052
|
+
source: sourceId,
|
|
1053
|
+
has_balance: Boolean(response.assetsBalance),
|
|
1054
|
+
has_price: Boolean(response.assetsPrice),
|
|
1055
|
+
balance_account_count: response.assetsBalance
|
|
1056
|
+
? Object.keys(response.assetsBalance).length
|
|
1057
|
+
: 0,
|
|
1058
|
+
},
|
|
1059
|
+
fn: async (parentContext) => {
|
|
1060
|
+
const updateStart = performance.now();
|
|
1061
|
+
const resolvedRequest = request ?? {
|
|
1062
|
+
accountsWithSupportedChains: [],
|
|
1063
|
+
chainIds: [],
|
|
1064
|
+
dataTypes: ['balance', 'metadata', 'price'],
|
|
1065
|
+
};
|
|
1066
|
+
// RPC-only mode (basic functionality off): never run token/price APIs. Strip
|
|
1067
|
+
// those data types so downstream middleware cannot treat them as requested.
|
|
1068
|
+
const pipelineRequest = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
1069
|
+
? resolvedRequest
|
|
1070
|
+
: {
|
|
1071
|
+
...resolvedRequest,
|
|
1072
|
+
dataTypes: resolvedRequest.dataTypes.filter((dt) => dt !== 'metadata' && dt !== 'price'),
|
|
1073
|
+
};
|
|
1074
|
+
// Graduate custom assets only when AccountsAPI / AccountActivity reports
|
|
1075
|
+
// them. RPC already fetches custom assets on purpose, and Snap handles
|
|
1076
|
+
// non-EVM chains the rule does not apply to, so skip the middleware for
|
|
1077
|
+
// those.
|
|
1078
|
+
const shouldGraduateCustomAssets = sourceId === 'AccountsApiDataSource' ||
|
|
1079
|
+
sourceId === 'AccountActivityDataSource';
|
|
1080
|
+
// Websocket updates can carry brand-new spam airdrops: enrich them
|
|
1081
|
+
// with Token API occurrences and drop below-floor tokens BEFORE
|
|
1082
|
+
// detection, so spam is never detected, enriched, priced or persisted.
|
|
1083
|
+
const shouldFilterOccurrences = sourceId === 'AccountActivityDataSource' &&
|
|
1084
|
+
__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
|
|
1085
|
+
const shouldRunRpcFallback = sourceId === 'AccountsApiDataSource';
|
|
1086
|
+
const enrichmentSources = [
|
|
1087
|
+
...(shouldGraduateCustomAssets
|
|
1088
|
+
? [__classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f")]
|
|
1089
|
+
: []),
|
|
1090
|
+
...(shouldFilterOccurrences
|
|
1091
|
+
? [
|
|
1092
|
+
{
|
|
1093
|
+
getName: () => 'OccurrenceFloorFilter',
|
|
1094
|
+
assetsMiddleware: __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").occurrenceFilterMiddleware,
|
|
1095
|
+
},
|
|
1096
|
+
]
|
|
1097
|
+
: []),
|
|
1098
|
+
...(shouldRunRpcFallback ? [__classPrivateFieldGet(this, _AssetsController_rpcFallbackMiddleware, "f")] : []),
|
|
1099
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
1100
|
+
];
|
|
1101
|
+
if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
|
|
1102
|
+
enrichmentSources.push((0, ParallelMiddleware_js_1.createParallelMiddleware)([
|
|
1103
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
1104
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
1105
|
+
]));
|
|
1106
|
+
}
|
|
1107
|
+
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
|
|
1108
|
+
sources: enrichmentSources,
|
|
1109
|
+
request: pipelineRequest,
|
|
1110
|
+
initialResponse: response,
|
|
1111
|
+
parentContext,
|
|
1112
|
+
trace: pipelineTrace,
|
|
1113
|
+
});
|
|
1114
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
|
|
1115
|
+
...enrichedResponse,
|
|
1116
|
+
replaceCoveredChainBalances: response.replaceCoveredChainBalances,
|
|
1117
|
+
});
|
|
1118
|
+
// Summary fields for Assets Health (nested under the parent span).
|
|
1119
|
+
(0, trace_js_1.emitTrace)({
|
|
1120
|
+
name: TRACE_UPDATE_PIPELINE,
|
|
1121
|
+
trace: pipelineTrace,
|
|
1122
|
+
data: {
|
|
1123
|
+
source: sourceId,
|
|
1124
|
+
duration_ms: performance.now() - updateStart,
|
|
1125
|
+
has_balance: Boolean(response.assetsBalance),
|
|
1126
|
+
has_price: Boolean(response.assetsPrice),
|
|
1127
|
+
has_metadata: Boolean(enrichedResponse.assetsInfo),
|
|
1128
|
+
balance_account_count: response.assetsBalance
|
|
1129
|
+
? Object.keys(response.assetsBalance).length
|
|
1130
|
+
: 0,
|
|
1131
|
+
},
|
|
1132
|
+
parentContext,
|
|
1133
|
+
});
|
|
1134
|
+
},
|
|
981
1135
|
});
|
|
982
|
-
if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this)) {
|
|
983
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleAssetsUpdateV6).call(this, response, sourceId, request);
|
|
984
|
-
return;
|
|
985
|
-
}
|
|
986
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleAssetsUpdateV5).call(this, response, sourceId, request);
|
|
987
1136
|
}
|
|
988
1137
|
// ============================================================================
|
|
989
1138
|
// CLEANUP
|
|
@@ -1226,6 +1375,7 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1226
1375
|
this.getAssets([matchedAccount], {
|
|
1227
1376
|
chainIds: [caipChainId],
|
|
1228
1377
|
forceUpdate: true,
|
|
1378
|
+
bypassServerCache: true,
|
|
1229
1379
|
}).catch((error) => {
|
|
1230
1380
|
log('Failed to refresh assets after transaction event', { error });
|
|
1231
1381
|
});
|
|
@@ -1434,236 +1584,6 @@ async function _AssetsController_executeMiddlewares(params) {
|
|
|
1434
1584
|
});
|
|
1435
1585
|
}
|
|
1436
1586
|
return { response: result.response, durationByDataSource };
|
|
1437
|
-
}, _AssetsController_buildForceUpdateRequestV5 = function _AssetsController_buildForceUpdateRequestV5(accounts, chainIds, requestOptions) {
|
|
1438
|
-
const customAssets = [];
|
|
1439
|
-
for (const account of accounts) {
|
|
1440
|
-
customAssets.push(...this.getCustomAssets(account.id));
|
|
1441
|
-
}
|
|
1442
|
-
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
|
|
1443
|
-
...requestOptions,
|
|
1444
|
-
customAssets: customAssets.length > 0 ? customAssets : undefined,
|
|
1445
|
-
});
|
|
1446
|
-
}, _AssetsController_buildForceUpdateRequestV6 = function _AssetsController_buildForceUpdateRequestV6(accounts, chainIds, requestOptions) {
|
|
1447
|
-
const requestedChains = new Set(chainIds);
|
|
1448
|
-
const candidateCustomAssets = requestOptions.customAssetsOverride ??
|
|
1449
|
-
accounts.flatMap((account) => this.getCustomAssets(account.id));
|
|
1450
|
-
const customAssetsSet = new Set();
|
|
1451
|
-
for (const assetId of candidateCustomAssets) {
|
|
1452
|
-
try {
|
|
1453
|
-
const normalizedAssetId = (0, index_js_2.normalizeAssetId)(assetId);
|
|
1454
|
-
if (requestedChains.has((0, utils_1.parseCaipAssetType)(normalizedAssetId).chainId)) {
|
|
1455
|
-
customAssetsSet.add(normalizedAssetId);
|
|
1456
|
-
}
|
|
1457
|
-
}
|
|
1458
|
-
catch {
|
|
1459
|
-
// Skip unparseable asset IDs
|
|
1460
|
-
}
|
|
1461
|
-
}
|
|
1462
|
-
const customAssets = [...customAssetsSet];
|
|
1463
|
-
const hiddenAssets = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getHiddenAssetIds).call(this);
|
|
1464
|
-
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
|
|
1465
|
-
assetTypes: requestOptions.assetTypes,
|
|
1466
|
-
dataTypes: requestOptions.dataTypes,
|
|
1467
|
-
forceUpdate: requestOptions.forceUpdate,
|
|
1468
|
-
assetsForPriceUpdate: requestOptions.assetsForPriceUpdate,
|
|
1469
|
-
customAssets: customAssets.length > 0 ? customAssets : undefined,
|
|
1470
|
-
excludeAssetIds: hiddenAssets.length > 0 ? hiddenAssets : undefined,
|
|
1471
|
-
});
|
|
1472
|
-
}, _AssetsController_forceUpdateAssetsV5 = async function _AssetsController_forceUpdateAssetsV5({ accounts, chainIds, request, pipelineTrace, }) {
|
|
1473
|
-
const isBasicFunctionality = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
|
|
1474
|
-
const fastSources = isBasicFunctionality
|
|
1475
|
-
? [
|
|
1476
|
-
(0, ParallelMiddleware_js_1.createParallelBalanceMiddleware)([
|
|
1477
|
-
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
1478
|
-
__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
|
|
1479
|
-
]),
|
|
1480
|
-
__classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f"),
|
|
1481
|
-
__classPrivateFieldGet(this, _AssetsController_rpcFallbackMiddleware, "f"),
|
|
1482
|
-
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
1483
|
-
(0, ParallelMiddleware_js_1.createParallelMiddleware)([
|
|
1484
|
-
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
1485
|
-
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
1486
|
-
]),
|
|
1487
|
-
]
|
|
1488
|
-
: [__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
|
|
1489
|
-
const fastResponse = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runFastFetchV5).call(this, {
|
|
1490
|
-
accounts,
|
|
1491
|
-
chainIds,
|
|
1492
|
-
request,
|
|
1493
|
-
pipelineTrace,
|
|
1494
|
-
fastSources,
|
|
1495
|
-
isBasicFunctionality,
|
|
1496
|
-
});
|
|
1497
|
-
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
|
|
1498
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runBackgroundFetch).call(this, {
|
|
1499
|
-
accounts,
|
|
1500
|
-
request,
|
|
1501
|
-
pipelineTrace,
|
|
1502
|
-
chainIds: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSlowPipelineChainIds).call(this, chainIds, fastResponse),
|
|
1503
|
-
isBasicFunctionality,
|
|
1504
|
-
});
|
|
1505
|
-
}, _AssetsController_forceUpdateAssetsV6 = async function _AssetsController_forceUpdateAssetsV6({ accounts, chainIds, request, pipelineTrace, }) {
|
|
1506
|
-
const isBasicFunctionality = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
|
|
1507
|
-
const fastSources = isBasicFunctionality
|
|
1508
|
-
? [
|
|
1509
|
-
(0, ParallelMiddleware_js_1.createParallelBalanceMiddleware)([
|
|
1510
|
-
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
1511
|
-
__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
|
|
1512
|
-
]),
|
|
1513
|
-
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
1514
|
-
(0, ParallelMiddleware_js_1.createParallelMiddleware)([
|
|
1515
|
-
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
1516
|
-
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
1517
|
-
]),
|
|
1518
|
-
]
|
|
1519
|
-
: [__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
|
|
1520
|
-
const fastResponse = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runFastFetchV6).call(this, {
|
|
1521
|
-
accounts,
|
|
1522
|
-
chainIds,
|
|
1523
|
-
request,
|
|
1524
|
-
pipelineTrace,
|
|
1525
|
-
fastSources,
|
|
1526
|
-
isBasicFunctionality,
|
|
1527
|
-
});
|
|
1528
|
-
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
|
|
1529
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runBackgroundFetch).call(this, {
|
|
1530
|
-
accounts,
|
|
1531
|
-
request,
|
|
1532
|
-
pipelineTrace,
|
|
1533
|
-
chainIds: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSlowPipelineChainIds).call(this, chainIds, fastResponse),
|
|
1534
|
-
isBasicFunctionality,
|
|
1535
|
-
});
|
|
1536
|
-
}, _AssetsController_runFastFetchV5 = async function _AssetsController_runFastFetchV5({ accounts, chainIds, request, pipelineTrace, fastSources, isBasicFunctionality, }) {
|
|
1537
|
-
const { response } = await (0, trace_js_1.withTrace)({
|
|
1538
|
-
name: TRACE_FETCH_PIPELINE,
|
|
1539
|
-
trace: pipelineTrace,
|
|
1540
|
-
data: {
|
|
1541
|
-
chain_count: chainIds.length,
|
|
1542
|
-
account_count: accounts.length,
|
|
1543
|
-
basic_functionality: isBasicFunctionality,
|
|
1544
|
-
},
|
|
1545
|
-
fn: async (parentContext) => {
|
|
1546
|
-
const startTime = performance.now();
|
|
1547
|
-
const result = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
|
|
1548
|
-
sources: fastSources,
|
|
1549
|
-
request,
|
|
1550
|
-
parentContext,
|
|
1551
|
-
trace: pipelineTrace,
|
|
1552
|
-
});
|
|
1553
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
|
|
1554
|
-
...result.response,
|
|
1555
|
-
updateMode: 'merge',
|
|
1556
|
-
replaceCoveredChainBalances: true,
|
|
1557
|
-
});
|
|
1558
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitFastFetchTraces).call(this, {
|
|
1559
|
-
accounts,
|
|
1560
|
-
chainIds,
|
|
1561
|
-
result,
|
|
1562
|
-
durationMs: performance.now() - startTime,
|
|
1563
|
-
isBasicFunctionality,
|
|
1564
|
-
parentContext,
|
|
1565
|
-
pipelineTrace,
|
|
1566
|
-
});
|
|
1567
|
-
return result;
|
|
1568
|
-
},
|
|
1569
|
-
});
|
|
1570
|
-
return response;
|
|
1571
|
-
}, _AssetsController_runFastFetchV6 = async function _AssetsController_runFastFetchV6({ accounts, chainIds, request, pipelineTrace, fastSources, isBasicFunctionality, }) {
|
|
1572
|
-
const { response } = await (0, trace_js_1.withTrace)({
|
|
1573
|
-
name: TRACE_FETCH_PIPELINE,
|
|
1574
|
-
trace: pipelineTrace,
|
|
1575
|
-
data: {
|
|
1576
|
-
chain_count: chainIds.length,
|
|
1577
|
-
account_count: accounts.length,
|
|
1578
|
-
basic_functionality: isBasicFunctionality,
|
|
1579
|
-
},
|
|
1580
|
-
fn: async (parentContext) => {
|
|
1581
|
-
const startTime = performance.now();
|
|
1582
|
-
const result = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
|
|
1583
|
-
sources: fastSources,
|
|
1584
|
-
request,
|
|
1585
|
-
parentContext,
|
|
1586
|
-
trace: pipelineTrace,
|
|
1587
|
-
});
|
|
1588
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, result.response);
|
|
1589
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitFastFetchTraces).call(this, {
|
|
1590
|
-
accounts,
|
|
1591
|
-
chainIds,
|
|
1592
|
-
result,
|
|
1593
|
-
durationMs: performance.now() - startTime,
|
|
1594
|
-
isBasicFunctionality,
|
|
1595
|
-
parentContext,
|
|
1596
|
-
pipelineTrace,
|
|
1597
|
-
});
|
|
1598
|
-
return result;
|
|
1599
|
-
},
|
|
1600
|
-
});
|
|
1601
|
-
return response;
|
|
1602
|
-
}, _AssetsController_runBackgroundFetch = function _AssetsController_runBackgroundFetch({ accounts, chainIds, request, pipelineTrace, isBasicFunctionality, }) {
|
|
1603
|
-
if (chainIds.length === 0) {
|
|
1604
|
-
return;
|
|
1605
|
-
}
|
|
1606
|
-
const slowSources = isBasicFunctionality
|
|
1607
|
-
? [__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")]
|
|
1608
|
-
: [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
|
|
1609
|
-
const slowRequest = { ...request, chainIds };
|
|
1610
|
-
(0, trace_js_1.withTrace)({
|
|
1611
|
-
name: TRACE_BACKGROUND_FETCH,
|
|
1612
|
-
trace: pipelineTrace,
|
|
1613
|
-
data: {
|
|
1614
|
-
chain_count: chainIds.length,
|
|
1615
|
-
account_count: accounts.length,
|
|
1616
|
-
},
|
|
1617
|
-
fn: async (parentContext) => {
|
|
1618
|
-
const { response } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
|
|
1619
|
-
sources: [
|
|
1620
|
-
(0, ParallelMiddleware_js_1.createParallelBalanceMiddleware)(slowSources),
|
|
1621
|
-
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
1622
|
-
...(isBasicFunctionality
|
|
1623
|
-
? [
|
|
1624
|
-
(0, ParallelMiddleware_js_1.createParallelMiddleware)([
|
|
1625
|
-
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
1626
|
-
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
1627
|
-
]),
|
|
1628
|
-
]
|
|
1629
|
-
: []),
|
|
1630
|
-
],
|
|
1631
|
-
request: slowRequest,
|
|
1632
|
-
parentContext,
|
|
1633
|
-
trace: pipelineTrace,
|
|
1634
|
-
});
|
|
1635
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'merge' });
|
|
1636
|
-
},
|
|
1637
|
-
}).catch((error) => log('Background pipeline failed', { error }));
|
|
1638
|
-
}, _AssetsController_emitFastFetchTraces = function _AssetsController_emitFastFetchTraces({ accounts, chainIds, result, durationMs, isBasicFunctionality, parentContext, pipelineTrace, }) {
|
|
1639
|
-
(0, trace_js_1.emitTrace)({
|
|
1640
|
-
name: TRACE_FULL_FETCH,
|
|
1641
|
-
trace: pipelineTrace,
|
|
1642
|
-
data: {
|
|
1643
|
-
duration_ms: durationMs,
|
|
1644
|
-
chain_count: chainIds.length,
|
|
1645
|
-
account_count: accounts.length,
|
|
1646
|
-
basic_functionality: isBasicFunctionality,
|
|
1647
|
-
asset_count: result.response.assetsBalance
|
|
1648
|
-
? Object.values(result.response.assetsBalance).reduce((sum, account) => sum + Object.keys(account).length, 0)
|
|
1649
|
-
: 0,
|
|
1650
|
-
price_count: result.response.assetsPrice
|
|
1651
|
-
? Object.keys(result.response.assetsPrice).length
|
|
1652
|
-
: 0,
|
|
1653
|
-
...result.durationByDataSource,
|
|
1654
|
-
},
|
|
1655
|
-
parentContext,
|
|
1656
|
-
});
|
|
1657
|
-
(0, trace_js_1.emitTrace)({
|
|
1658
|
-
name: TRACE_FIRST_INIT_FETCH,
|
|
1659
|
-
trace: pipelineTrace,
|
|
1660
|
-
data: {
|
|
1661
|
-
duration_ms: durationMs,
|
|
1662
|
-
chain_ids: JSON.stringify(chainIds),
|
|
1663
|
-
...result.durationByDataSource,
|
|
1664
|
-
},
|
|
1665
|
-
parentContext,
|
|
1666
|
-
});
|
|
1667
1587
|
}, _AssetsController_assertNonEmptyAccountId = function _AssetsController_assertNonEmptyAccountId(accountId, methodName) {
|
|
1668
1588
|
if (typeof accountId !== 'string' || accountId.length === 0) {
|
|
1669
1589
|
throw new Error(`AssetsController.${methodName}: accountId must be a non-empty string`);
|
|
@@ -1675,25 +1595,6 @@ async function _AssetsController_executeMiddlewares(params) {
|
|
|
1675
1595
|
catch {
|
|
1676
1596
|
throw new Error(`AssetsController.${methodName}: invalid CAIP-19 assetId "${assetId}"`);
|
|
1677
1597
|
}
|
|
1678
|
-
}, _AssetsController_getHiddenAssetIds = function _AssetsController_getHiddenAssetIds() {
|
|
1679
|
-
const hidden = [];
|
|
1680
|
-
for (const [assetId, prefs] of Object.entries(this.state.assetPreferences)) {
|
|
1681
|
-
if (prefs.hidden) {
|
|
1682
|
-
hidden.push(assetId);
|
|
1683
|
-
}
|
|
1684
|
-
}
|
|
1685
|
-
return hidden;
|
|
1686
|
-
}, _AssetsController_isBalanceV6Enabled = function _AssetsController_isBalanceV6Enabled() {
|
|
1687
|
-
try {
|
|
1688
|
-
const { remoteFeatureFlags } = this.messenger.call('RemoteFeatureFlagController:getState');
|
|
1689
|
-
const flag = remoteFeatureFlags?.assetsAccountsApiV6;
|
|
1690
|
-
return (typeof flag === 'object' &&
|
|
1691
|
-
flag !== null &&
|
|
1692
|
-
Boolean(flag.value));
|
|
1693
|
-
}
|
|
1694
|
-
catch {
|
|
1695
|
-
return false;
|
|
1696
|
-
}
|
|
1697
1598
|
}, _AssetsController_fetchMissingPricesWithoutCache = function _AssetsController_fetchMissingPricesWithoutCache(accounts, chainIds) {
|
|
1698
1599
|
if (!__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this) || accounts.length === 0) {
|
|
1699
1600
|
return;
|
|
@@ -1775,16 +1676,10 @@ async function _AssetsController_executeMiddlewares(params) {
|
|
|
1775
1676
|
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_resolveNativeAssetIds).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account));
|
|
1776
1677
|
}, _AssetsController_getSlowPipelineChainIds = function _AssetsController_getSlowPipelineChainIds(chainIds, fastResponse) {
|
|
1777
1678
|
const accountsApiChains = new Set(__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f").getActiveChainsSync());
|
|
1778
|
-
// Chains whose pins went unresolved (`unprocessedCustomAssets`): route
|
|
1779
|
-
// them to the slow pipeline so RPC fetches the pins.
|
|
1780
|
-
const unprocessedCustomAssetChains = new Set((fastResponse.unprocessedCustomAssets ?? []).map((assetId) => assetId.split('/')[0]));
|
|
1781
1679
|
return chainIds.filter((chainId) => {
|
|
1782
1680
|
if (fastResponse.errors?.[chainId]) {
|
|
1783
1681
|
return true;
|
|
1784
1682
|
}
|
|
1785
|
-
if (unprocessedCustomAssetChains.has(chainId)) {
|
|
1786
|
-
return true;
|
|
1787
|
-
}
|
|
1788
1683
|
if (!accountsApiChains.has(chainId)) {
|
|
1789
1684
|
return true;
|
|
1790
1685
|
}
|
|
@@ -1924,9 +1819,9 @@ async function _AssetsController_executeMiddlewares(params) {
|
|
|
1924
1819
|
for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
|
|
1925
1820
|
const previousBalances = previousState.assetsBalance[accountId] ?? {};
|
|
1926
1821
|
const customAssetIds = state.customAssets[accountId] ?? [];
|
|
1927
|
-
const
|
|
1928
|
-
|
|
1929
|
-
|
|
1822
|
+
const replaceCoveredChains = mode === 'full' ||
|
|
1823
|
+
normalizedResponse.replaceCoveredChainBalances === true;
|
|
1824
|
+
const effective = mergeAccountBalances(previousBalances, accountBalances, customAssetIds, replaceCoveredChains);
|
|
1930
1825
|
// Ensure native tokens have an entry (0 if missing) for chains this account supports
|
|
1931
1826
|
const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.id === accountId);
|
|
1932
1827
|
const nativeAssetIdsForAccount = account
|
|
@@ -1983,8 +1878,10 @@ async function _AssetsController_executeMiddlewares(params) {
|
|
|
1983
1878
|
changedPriceAssets.length > 0) {
|
|
1984
1879
|
log('State updated', {
|
|
1985
1880
|
changedBalances: changedBalances.length > 0 ? changedBalances : undefined,
|
|
1986
|
-
|
|
1987
|
-
|
|
1881
|
+
changedMetadataCount: changedMetadata.length > 0 ? changedMetadata.length : undefined,
|
|
1882
|
+
changedPricesCount: changedPriceAssets.length > 0
|
|
1883
|
+
? changedPriceAssets.length
|
|
1884
|
+
: undefined,
|
|
1988
1885
|
newAssets: Object.keys(detectedAssets).length > 0
|
|
1989
1886
|
? Object.entries(detectedAssets).map(([accountId, assets]) => ({
|
|
1990
1887
|
accountId,
|
|
@@ -2157,10 +2054,16 @@ async function _AssetsController_executeMiddlewares(params) {
|
|
|
2157
2054
|
if (!subscriptionKey.startsWith('ds:')) {
|
|
2158
2055
|
continue;
|
|
2159
2056
|
}
|
|
2160
|
-
// Subscription keys take the form `ds:<SourceName
|
|
2057
|
+
// Subscription keys take the form `ds:<SourceName>` for the regular
|
|
2058
|
+
// subscription or `ds:<SourceName>:<suffix>` for supplemental
|
|
2059
|
+
// subscriptions (e.g. `ds:RpcDataSource:custom`). Split on `:` and
|
|
2060
|
+
// pick the source-name segment so both shapes resolve correctly.
|
|
2161
2061
|
const [, sourceId] = subscriptionKey.split(':');
|
|
2162
2062
|
const source = allSources.find((ds) => ds.getName() === sourceId);
|
|
2163
2063
|
if (source) {
|
|
2064
|
+
// Unsubscribe by the actual key — `#unsubscribeDataSource` only
|
|
2065
|
+
// knows the regular `ds:<SourceName>` shape and would miss
|
|
2066
|
+
// supplemental subscriptions, leaking their polling timers.
|
|
2164
2067
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeBySubscriptionKey).call(this, source, subscriptionKey);
|
|
2165
2068
|
}
|
|
2166
2069
|
}
|
|
@@ -2178,15 +2081,12 @@ async function _AssetsController_executeMiddlewares(params) {
|
|
|
2178
2081
|
// Subscribe to price updates for all assets held by selected accounts
|
|
2179
2082
|
this.subscribeAssetsPrice(accounts, enabledChains);
|
|
2180
2083
|
}, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds, options) {
|
|
2181
|
-
if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this)) {
|
|
2182
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalanceV6).call(this, accounts, chainIds, options);
|
|
2183
|
-
return;
|
|
2184
|
-
}
|
|
2185
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalanceV5).call(this, accounts, chainIds, options);
|
|
2186
|
-
}, _AssetsController_subscribeAssetsBalanceV5 = function _AssetsController_subscribeAssetsBalanceV5(accounts, chainIds, options) {
|
|
2187
2084
|
const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
|
|
2188
2085
|
const remainingChains = new Set(chainToAccounts.keys());
|
|
2189
|
-
|
|
2086
|
+
// When basic functionality is on, use all balance data sources; when off,
|
|
2087
|
+
// RPC only.
|
|
2088
|
+
const isBasicFunctionality = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
|
|
2089
|
+
const balanceDataSources = isBasicFunctionality
|
|
2190
2090
|
? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
|
|
2191
2091
|
: [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
|
|
2192
2092
|
let rpcAssignedChains = new Set();
|
|
@@ -2225,81 +2125,13 @@ async function _AssetsController_executeMiddlewares(params) {
|
|
|
2225
2125
|
});
|
|
2226
2126
|
}
|
|
2227
2127
|
}
|
|
2128
|
+
// Supplemental RPC subscription for customAssets on chains another data
|
|
2129
|
+
// source claimed during regular handoff. RPC is the sole balance fetcher
|
|
2130
|
+
// for customAssets, so we must always poll them — even when (e.g.)
|
|
2131
|
+
// AccountsApi is already covering the chain for normal balances. The
|
|
2132
|
+
// supplemental subscription runs in `customAssetsOnly` mode so it does
|
|
2133
|
+
// NOT double-poll the regular tracked balances.
|
|
2228
2134
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeRpcCustomAssetsSupplement).call(this, accounts, chainToAccounts, rpcAssignedChains);
|
|
2229
|
-
}, _AssetsController_subscribeAssetsBalanceV6 = function _AssetsController_subscribeAssetsBalanceV6(accounts, chainIds, options) {
|
|
2230
|
-
const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
|
|
2231
|
-
const remainingChains = new Set(chainToAccounts.keys());
|
|
2232
|
-
const remainingCustomAssets = new Set();
|
|
2233
|
-
for (const account of accounts) {
|
|
2234
|
-
for (const assetId of this.getCustomAssets(account.id)) {
|
|
2235
|
-
try {
|
|
2236
|
-
if (remainingChains.has((0, utils_1.parseCaipAssetType)(assetId).chainId)) {
|
|
2237
|
-
remainingCustomAssets.add(assetId);
|
|
2238
|
-
}
|
|
2239
|
-
}
|
|
2240
|
-
catch {
|
|
2241
|
-
// Skip unparseable asset IDs
|
|
2242
|
-
}
|
|
2243
|
-
}
|
|
2244
|
-
}
|
|
2245
|
-
const balanceDataSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
2246
|
-
? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
|
|
2247
|
-
: [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
|
|
2248
|
-
for (const source of balanceDataSources) {
|
|
2249
|
-
const availableChains = new Set(source.getActiveChainsSync());
|
|
2250
|
-
const assignedChains = [];
|
|
2251
|
-
for (const chainId of remainingChains) {
|
|
2252
|
-
if (availableChains.has(chainId)) {
|
|
2253
|
-
assignedChains.push(chainId);
|
|
2254
|
-
remainingChains.delete(chainId);
|
|
2255
|
-
}
|
|
2256
|
-
}
|
|
2257
|
-
const claimedAssets = source.claimCustomAssets([...remainingCustomAssets], assignedChains);
|
|
2258
|
-
for (const assetId of claimedAssets) {
|
|
2259
|
-
remainingCustomAssets.delete(assetId);
|
|
2260
|
-
}
|
|
2261
|
-
if (assignedChains.length === 0 && claimedAssets.length === 0) {
|
|
2262
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
2263
|
-
continue;
|
|
2264
|
-
}
|
|
2265
|
-
const claimedAssetsSet = new Set(claimedAssets);
|
|
2266
|
-
const seenIds = new Set();
|
|
2267
|
-
const accountsForSource = assignedChains
|
|
2268
|
-
.flatMap((chainId) => chainToAccounts.get(chainId) ?? [])
|
|
2269
|
-
.filter((account) => {
|
|
2270
|
-
if (seenIds.has(account.id)) {
|
|
2271
|
-
return false;
|
|
2272
|
-
}
|
|
2273
|
-
seenIds.add(account.id);
|
|
2274
|
-
return true;
|
|
2275
|
-
});
|
|
2276
|
-
for (const account of accounts) {
|
|
2277
|
-
if (!seenIds.has(account.id) &&
|
|
2278
|
-
this.getCustomAssets(account.id).some((assetId) => claimedAssetsSet.has(assetId))) {
|
|
2279
|
-
seenIds.add(account.id);
|
|
2280
|
-
accountsForSource.push(account);
|
|
2281
|
-
}
|
|
2282
|
-
}
|
|
2283
|
-
if (accountsForSource.length > 0) {
|
|
2284
|
-
const hiddenAssets = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getHiddenAssetIds).call(this);
|
|
2285
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains, {
|
|
2286
|
-
customAssets: claimedAssets,
|
|
2287
|
-
excludeAssetIds: hiddenAssets.length > 0 ? hiddenAssets : undefined,
|
|
2288
|
-
...(options?.skipInitialFetch &&
|
|
2289
|
-
source === __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f")
|
|
2290
|
-
? { skipInitialFetch: true }
|
|
2291
|
-
: {}),
|
|
2292
|
-
});
|
|
2293
|
-
}
|
|
2294
|
-
else {
|
|
2295
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
2296
|
-
}
|
|
2297
|
-
}
|
|
2298
|
-
if (remainingCustomAssets.size > 0) {
|
|
2299
|
-
log('Custom assets unclaimed by any data source', {
|
|
2300
|
-
assetIds: [...remainingCustomAssets],
|
|
2301
|
-
});
|
|
2302
|
-
}
|
|
2303
2135
|
}, _AssetsController_subscribeRpcCustomAssetsSupplement = function _AssetsController_subscribeRpcCustomAssetsSupplement(accounts, chainToAccounts, rpcAssignedChains) {
|
|
2304
2136
|
const rpc = __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f");
|
|
2305
2137
|
const supplementalKey = `ds:${rpc.getName()}:custom`;
|
|
@@ -2362,14 +2194,12 @@ async function _AssetsController_executeMiddlewares(params) {
|
|
|
2362
2194
|
const subscriptionKey = options.subscriptionKey ?? `ds:${sourceId}`;
|
|
2363
2195
|
const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
|
|
2364
2196
|
const isUpdate = existingSubscription !== undefined;
|
|
2365
|
-
const customAssets = options.customAssets ?? [];
|
|
2366
2197
|
log('Subscribe to data source', {
|
|
2367
2198
|
sourceId,
|
|
2368
2199
|
subscriptionKey,
|
|
2369
2200
|
isUpdate,
|
|
2370
2201
|
accountCount: accounts.length,
|
|
2371
2202
|
chainCount: chains.length,
|
|
2372
|
-
customAssetCount: customAssets.length,
|
|
2373
2203
|
customAssetsOnly: options.customAssetsOnly === true,
|
|
2374
2204
|
skipInitialFetch: options.skipInitialFetch === true,
|
|
2375
2205
|
});
|
|
@@ -2378,10 +2208,6 @@ async function _AssetsController_executeMiddlewares(params) {
|
|
|
2378
2208
|
assetTypes: ['fungible'],
|
|
2379
2209
|
dataTypes: ['balance'],
|
|
2380
2210
|
updateInterval: __classPrivateFieldGet(this, _AssetsController_defaultUpdateInterval, "f"),
|
|
2381
|
-
customAssets: customAssets.length > 0 ? customAssets : undefined,
|
|
2382
|
-
excludeAssetIds: options.excludeAssetIds && options.excludeAssetIds.length > 0
|
|
2383
|
-
? options.excludeAssetIds
|
|
2384
|
-
: undefined,
|
|
2385
2211
|
...(options.customAssetsOnly === true
|
|
2386
2212
|
? { customAssetsOnly: true }
|
|
2387
2213
|
: {}),
|
|
@@ -2545,13 +2371,13 @@ async function _AssetsController_handleAccountGroupChanged(groupId, previousGrou
|
|
|
2545
2371
|
// The data will simply not be updated until the network is re-enabled.
|
|
2546
2372
|
// Refresh subscriptions for new chain set
|
|
2547
2373
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
2548
|
-
//
|
|
2549
|
-
// those chains; existing balances on other chains are left untouched.
|
|
2374
|
+
// Do one-time fetch for newly enabled chains; merge so we keep existing chain balances
|
|
2550
2375
|
const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
|
|
2551
2376
|
if (addedChains.length > 0 && accounts.length > 0) {
|
|
2552
2377
|
await this.getAssets(accounts, {
|
|
2553
2378
|
chainIds: addedChains,
|
|
2554
2379
|
forceUpdate: true,
|
|
2380
|
+
updateMode: 'merge',
|
|
2555
2381
|
});
|
|
2556
2382
|
}
|
|
2557
2383
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
|
|
@@ -2674,150 +2500,5 @@ async function _AssetsController_refreshAssetsAfterNetworkAdded(hexChainId) {
|
|
|
2674
2500
|
});
|
|
2675
2501
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
|
|
2676
2502
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [caipChainId]);
|
|
2677
|
-
}, _AssetsController_handleAssetsUpdateV5 = async function _AssetsController_handleAssetsUpdateV5(response, sourceId, request) {
|
|
2678
|
-
const pipelineTrace = __classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")
|
|
2679
|
-
? undefined
|
|
2680
|
-
: __classPrivateFieldGet(this, _AssetsController_trace, "f");
|
|
2681
|
-
await (0, trace_js_1.withTrace)({
|
|
2682
|
-
name: TRACE_UPDATE_PARENT,
|
|
2683
|
-
trace: pipelineTrace,
|
|
2684
|
-
data: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getUpdateTraceData).call(this, response, sourceId),
|
|
2685
|
-
fn: async (parentContext) => {
|
|
2686
|
-
const updateStart = performance.now();
|
|
2687
|
-
const pipelineRequest = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getUpdatePipelineRequest).call(this, request);
|
|
2688
|
-
const shouldGraduateCustomAssets = sourceId === 'AccountsApiDataSource' ||
|
|
2689
|
-
sourceId === 'AccountActivityDataSource';
|
|
2690
|
-
const shouldFilterOccurrences = sourceId === 'AccountActivityDataSource' &&
|
|
2691
|
-
__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
|
|
2692
|
-
const enrichmentSources = [
|
|
2693
|
-
...(shouldGraduateCustomAssets
|
|
2694
|
-
? [__classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f")]
|
|
2695
|
-
: []),
|
|
2696
|
-
...(shouldFilterOccurrences
|
|
2697
|
-
? [
|
|
2698
|
-
{
|
|
2699
|
-
getName: () => 'OccurrenceFloorFilter',
|
|
2700
|
-
assetsMiddleware: __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").occurrenceFilterMiddleware,
|
|
2701
|
-
},
|
|
2702
|
-
]
|
|
2703
|
-
: []),
|
|
2704
|
-
];
|
|
2705
|
-
enrichmentSources.push(__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"));
|
|
2706
|
-
if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
|
|
2707
|
-
enrichmentSources.push((0, ParallelMiddleware_js_1.createParallelMiddleware)([
|
|
2708
|
-
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
2709
|
-
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
2710
|
-
]));
|
|
2711
|
-
}
|
|
2712
|
-
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
|
|
2713
|
-
sources: enrichmentSources,
|
|
2714
|
-
request: pipelineRequest,
|
|
2715
|
-
initialResponse: response,
|
|
2716
|
-
parentContext,
|
|
2717
|
-
trace: pipelineTrace,
|
|
2718
|
-
});
|
|
2719
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
|
|
2720
|
-
...enrichedResponse,
|
|
2721
|
-
replaceCoveredChainBalances: response.replaceCoveredChainBalances,
|
|
2722
|
-
});
|
|
2723
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitUpdateTrace).call(this, {
|
|
2724
|
-
response,
|
|
2725
|
-
sourceId,
|
|
2726
|
-
enrichedResponse,
|
|
2727
|
-
updateStart,
|
|
2728
|
-
pipelineTrace,
|
|
2729
|
-
parentContext,
|
|
2730
|
-
});
|
|
2731
|
-
},
|
|
2732
|
-
});
|
|
2733
|
-
}, _AssetsController_handleAssetsUpdateV6 = async function _AssetsController_handleAssetsUpdateV6(response, sourceId, request) {
|
|
2734
|
-
const pipelineTrace = __classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")
|
|
2735
|
-
? undefined
|
|
2736
|
-
: __classPrivateFieldGet(this, _AssetsController_trace, "f");
|
|
2737
|
-
await (0, trace_js_1.withTrace)({
|
|
2738
|
-
name: TRACE_UPDATE_PARENT,
|
|
2739
|
-
trace: pipelineTrace,
|
|
2740
|
-
data: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getUpdateTraceData).call(this, response, sourceId),
|
|
2741
|
-
fn: async (parentContext) => {
|
|
2742
|
-
const updateStart = performance.now();
|
|
2743
|
-
const pipelineRequest = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getUpdatePipelineRequest).call(this, request);
|
|
2744
|
-
const shouldFilterOccurrences = sourceId === 'AccountActivityDataSource' &&
|
|
2745
|
-
__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
|
|
2746
|
-
const enrichmentSources = [
|
|
2747
|
-
...(shouldFilterOccurrences
|
|
2748
|
-
? [
|
|
2749
|
-
{
|
|
2750
|
-
getName: () => 'OccurrenceFloorFilter',
|
|
2751
|
-
assetsMiddleware: __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").occurrenceFilterMiddleware,
|
|
2752
|
-
},
|
|
2753
|
-
]
|
|
2754
|
-
: []),
|
|
2755
|
-
];
|
|
2756
|
-
if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
|
|
2757
|
-
enrichmentSources.push(__classPrivateFieldGet(this, _AssetsController_rpcFallbackMiddleware, "f"));
|
|
2758
|
-
}
|
|
2759
|
-
enrichmentSources.push(__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"));
|
|
2760
|
-
if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
|
|
2761
|
-
enrichmentSources.push((0, ParallelMiddleware_js_1.createParallelMiddleware)([
|
|
2762
|
-
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
2763
|
-
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
2764
|
-
]));
|
|
2765
|
-
}
|
|
2766
|
-
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
|
|
2767
|
-
sources: enrichmentSources,
|
|
2768
|
-
request: pipelineRequest,
|
|
2769
|
-
initialResponse: response,
|
|
2770
|
-
parentContext,
|
|
2771
|
-
trace: pipelineTrace,
|
|
2772
|
-
});
|
|
2773
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, enrichedResponse);
|
|
2774
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitUpdateTrace).call(this, {
|
|
2775
|
-
response,
|
|
2776
|
-
sourceId,
|
|
2777
|
-
enrichedResponse,
|
|
2778
|
-
updateStart,
|
|
2779
|
-
pipelineTrace,
|
|
2780
|
-
parentContext,
|
|
2781
|
-
});
|
|
2782
|
-
},
|
|
2783
|
-
});
|
|
2784
|
-
}, _AssetsController_getUpdatePipelineRequest = function _AssetsController_getUpdatePipelineRequest(request) {
|
|
2785
|
-
const resolvedRequest = request ?? {
|
|
2786
|
-
accountsWithSupportedChains: [],
|
|
2787
|
-
chainIds: [],
|
|
2788
|
-
dataTypes: ['balance', 'metadata', 'price'],
|
|
2789
|
-
};
|
|
2790
|
-
if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
|
|
2791
|
-
return resolvedRequest;
|
|
2792
|
-
}
|
|
2793
|
-
return {
|
|
2794
|
-
...resolvedRequest,
|
|
2795
|
-
dataTypes: resolvedRequest.dataTypes.filter((dataType) => dataType !== 'metadata' && dataType !== 'price'),
|
|
2796
|
-
};
|
|
2797
|
-
}, _AssetsController_getUpdateTraceData = function _AssetsController_getUpdateTraceData(response, sourceId) {
|
|
2798
|
-
return {
|
|
2799
|
-
source: sourceId,
|
|
2800
|
-
has_balance: Boolean(response.assetsBalance),
|
|
2801
|
-
has_price: Boolean(response.assetsPrice),
|
|
2802
|
-
balance_account_count: response.assetsBalance
|
|
2803
|
-
? Object.keys(response.assetsBalance).length
|
|
2804
|
-
: 0,
|
|
2805
|
-
};
|
|
2806
|
-
}, _AssetsController_emitUpdateTrace = function _AssetsController_emitUpdateTrace({ response, sourceId, enrichedResponse, updateStart, pipelineTrace, parentContext, }) {
|
|
2807
|
-
(0, trace_js_1.emitTrace)({
|
|
2808
|
-
name: TRACE_UPDATE_PIPELINE,
|
|
2809
|
-
trace: pipelineTrace,
|
|
2810
|
-
data: {
|
|
2811
|
-
source: sourceId,
|
|
2812
|
-
duration_ms: performance.now() - updateStart,
|
|
2813
|
-
has_balance: Boolean(response.assetsBalance),
|
|
2814
|
-
has_price: Boolean(response.assetsPrice),
|
|
2815
|
-
has_metadata: Boolean(enrichedResponse.assetsInfo),
|
|
2816
|
-
balance_account_count: response.assetsBalance
|
|
2817
|
-
? Object.keys(response.assetsBalance).length
|
|
2818
|
-
: 0,
|
|
2819
|
-
},
|
|
2820
|
-
parentContext,
|
|
2821
|
-
});
|
|
2822
2503
|
};
|
|
2823
2504
|
//# sourceMappingURL=AssetsController.cjs.map
|