@metamask-previews/assets-controller 0.0.0-preview-52f4a2ca → 0.0.0-preview-2d06693a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +0 -3
  2. package/dist/AssetsController.cjs +19 -7
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts.map +1 -1
  5. package/dist/AssetsController.d.mts.map +1 -1
  6. package/dist/AssetsController.mjs +19 -7
  7. package/dist/AssetsController.mjs.map +1 -1
  8. package/dist/data-sources/RpcDataSource.cjs +42 -232
  9. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  10. package/dist/data-sources/RpcDataSource.d.cts +1 -5
  11. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  12. package/dist/data-sources/RpcDataSource.d.mts +1 -5
  13. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  14. package/dist/data-sources/RpcDataSource.mjs +42 -229
  15. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  16. package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -1
  17. package/dist/data-sources/evm-rpc-services/index.d.cts +1 -1
  18. package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -1
  19. package/dist/data-sources/evm-rpc-services/index.d.mts +1 -1
  20. package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -1
  21. package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -1
  22. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +27 -32
  23. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -1
  24. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +5 -12
  25. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -1
  26. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +5 -12
  27. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -1
  28. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs +27 -32
  29. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -1
  30. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +12 -23
  31. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -1
  32. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +3 -8
  33. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -1
  34. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +3 -8
  35. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -1
  36. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +12 -23
  37. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -1
  38. package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -1
  39. package/dist/data-sources/evm-rpc-services/services/index.d.cts +2 -2
  40. package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -1
  41. package/dist/data-sources/evm-rpc-services/services/index.d.mts +2 -2
  42. package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -1
  43. package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -1
  44. package/dist/data-sources/evm-rpc-services/types/index.cjs.map +1 -1
  45. package/dist/data-sources/evm-rpc-services/types/index.d.cts +1 -1
  46. package/dist/data-sources/evm-rpc-services/types/index.d.cts.map +1 -1
  47. package/dist/data-sources/evm-rpc-services/types/index.d.mts +1 -1
  48. package/dist/data-sources/evm-rpc-services/types/index.d.mts.map +1 -1
  49. package/dist/data-sources/evm-rpc-services/types/index.mjs.map +1 -1
  50. package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -1
  51. package/dist/data-sources/evm-rpc-services/types/state.d.cts +24 -9
  52. package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -1
  53. package/dist/data-sources/evm-rpc-services/types/state.d.mts +24 -9
  54. package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -1
  55. package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -1
  56. package/package.json +1 -1
@@ -9,12 +9,11 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _RpcDataSource_instances, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector, _RpcDataSource_convertToHumanReadable, _RpcDataSource_collectMetadataForBalances, _RpcDataSource_handleBalanceUpdate, _RpcDataSource_handleDetectionUpdate, _RpcDataSource_registerActionHandlers, _RpcDataSource_subscribeToNetworkController, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_getMulticallProvider, _RpcDataSource_clearProviderCache, _RpcDataSource_accountSupportsChain, _RpcDataSource_buildNativeAssetId, _RpcDataSource_getExistingAssetsMetadata, _RpcDataSource_getTokenMetadataFromTokenList;
12
+ var _RpcDataSource_instances, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector, _RpcDataSource_handleBalanceUpdate, _RpcDataSource_handleDetectionUpdate, _RpcDataSource_registerActionHandlers, _RpcDataSource_subscribeToNetworkController, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_getMulticallProvider, _RpcDataSource_clearProviderCache, _RpcDataSource_accountSupportsChain, _RpcDataSource_buildNativeAssetId;
13
13
  import { Web3Provider } from "@ethersproject/providers";
14
14
  import { BaseController } from "@metamask/base-controller";
15
15
  import { toHex } from "@metamask/controller-utils";
16
16
  import { isStrictHexString, isCaipChainId, parseCaipChainId } from "@metamask/utils";
17
- import BigNumberJS from "bignumber.js";
18
17
  import { BalanceFetcher, MulticallClient, TokenDetector } from "./evm-rpc-services/index.mjs";
19
18
  import { projectLogger, createModuleLogger } from "../logger.mjs";
20
19
  const CONTROLLER_NAME = 'RpcDataSource';
@@ -91,25 +90,24 @@ export class RpcDataSource extends BaseController {
91
90
  __classPrivateFieldSet(this, _RpcDataSource_multicallClient, new MulticallClient((hexChainId) => {
92
91
  return __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getMulticallProvider).call(this, hexChainId);
93
92
  }), "f");
94
- // Create messenger adapters for BalanceFetcher and TokenDetector
95
- const balanceFetcherMessenger = {
96
- call: (_action) => {
97
- const state = this.messenger.call('AssetsController:getState');
98
- return {
99
- assetsBalance: (state.assetsBalance ?? {}),
100
- };
101
- },
93
+ // Create state getters using messenger
94
+ const getTokenListState = () => {
95
+ return this.messenger.call('TokenListController:getState');
102
96
  };
103
- const tokenDetectorMessenger = {
104
- call: (_action) => {
105
- return this.messenger.call('TokenListController:getState');
106
- },
97
+ const getUserTokensState = () => {
98
+ return this.messenger.call('AssetsController:getState');
107
99
  };
108
100
  // Initialize BalanceFetcher with polling interval
109
- __classPrivateFieldSet(this, _RpcDataSource_balanceFetcher, new BalanceFetcher(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), balanceFetcherMessenger, { pollingInterval: balanceInterval }), "f");
101
+ __classPrivateFieldSet(this, _RpcDataSource_balanceFetcher, new BalanceFetcher(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), {
102
+ pollingInterval: balanceInterval,
103
+ }), "f");
104
+ __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setUserTokensStateGetter(getUserTokensState);
110
105
  __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setOnBalanceUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleBalanceUpdate).bind(this));
111
106
  // Initialize TokenDetector with polling interval
112
- __classPrivateFieldSet(this, _RpcDataSource_tokenDetector, new TokenDetector(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), tokenDetectorMessenger, { pollingInterval: detectionInterval }), "f");
107
+ __classPrivateFieldSet(this, _RpcDataSource_tokenDetector, new TokenDetector(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), {
108
+ pollingInterval: detectionInterval,
109
+ }), "f");
110
+ __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setTokenListStateGetter(getTokenListState);
113
111
  __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setOnDetectionUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleDetectionUpdate).bind(this));
114
112
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_registerActionHandlers).call(this);
115
113
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_subscribeToNetworkController).call(this);
@@ -195,7 +193,6 @@ export class RpcDataSource extends BaseController {
195
193
  return response;
196
194
  }
197
195
  const assetsBalance = {};
198
- const assetsMetadata = {};
199
196
  const failedChains = [];
200
197
  // Fetch balances for each chain using BalanceFetcher
201
198
  for (const chainId of chainsToFetch) {
@@ -212,17 +209,10 @@ export class RpcDataSource extends BaseController {
212
209
  if (!assetsBalance[accountId]) {
213
210
  assetsBalance[accountId] = {};
214
211
  }
215
- // Collect metadata for all balances
216
- const balanceMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, chainId);
217
- Object.assign(assetsMetadata, balanceMetadata);
218
- // Convert balances to human-readable format
212
+ // Convert balances to response format
219
213
  for (const balance of result.balances) {
220
- const metadata = assetsMetadata[balance.assetId];
221
- // Default to 18 decimals (ERC20 standard) for consistent human-readable format
222
- const decimals = metadata?.decimals ?? 18;
223
- const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
224
214
  assetsBalance[accountId][balance.assetId] = {
225
- amount: humanReadableAmount,
215
+ amount: balance.balance,
226
216
  };
227
217
  }
228
218
  }
@@ -233,16 +223,6 @@ export class RpcDataSource extends BaseController {
233
223
  }
234
224
  const nativeAssetId = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_buildNativeAssetId).call(this, chainId);
235
225
  assetsBalance[accountId][nativeAssetId] = { amount: '0' };
236
- // Even on error, include native token metadata
237
- const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
238
- if (chainStatus) {
239
- assetsMetadata[nativeAssetId] = {
240
- type: 'native',
241
- symbol: chainStatus.nativeCurrency,
242
- name: chainStatus.nativeCurrency,
243
- decimals: 18,
244
- };
245
- }
246
226
  if (!failedChains.includes(chainId)) {
247
227
  failedChains.push(chainId);
248
228
  }
@@ -266,10 +246,6 @@ export class RpcDataSource extends BaseController {
266
246
  });
267
247
  }
268
248
  response.assetsBalance = assetsBalance;
269
- // Include metadata for native tokens if we have any
270
- if (Object.keys(assetsMetadata).length > 0) {
271
- response.assetsMetadata = assetsMetadata;
272
- }
273
249
  return response;
274
250
  }
275
251
  /**
@@ -299,27 +275,10 @@ export class RpcDataSource extends BaseController {
299
275
  });
300
276
  // Convert detected assets to DataResponse format
301
277
  const balances = {};
302
- const assetsMetadata = {};
303
- // Build metadata from detected assets
304
- for (const asset of result.detectedAssets) {
305
- if (asset.symbol && asset.decimals !== undefined) {
306
- assetsMetadata[asset.assetId] = {
307
- type: 'erc20',
308
- symbol: asset.symbol,
309
- name: asset.name ?? asset.symbol,
310
- decimals: asset.decimals,
311
- image: asset.image,
312
- };
313
- }
314
- }
315
- // Add balances for detected tokens (converted to human-readable format)
278
+ // Add balances for detected tokens
316
279
  for (const balance of result.detectedBalances) {
317
- const detectedAsset = result.detectedAssets.find((asset) => asset.assetId === balance.assetId);
318
- // Default to 18 decimals (ERC20 standard) for consistent human-readable format
319
- const decimals = detectedAsset?.decimals ?? 18;
320
- const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
321
280
  balances[balance.assetId] = {
322
- amount: humanReadableAmount,
281
+ amount: balance.balance,
323
282
  };
324
283
  }
325
284
  const response = {
@@ -330,10 +289,6 @@ export class RpcDataSource extends BaseController {
330
289
  [accountId]: balances,
331
290
  },
332
291
  };
333
- // Include metadata if we have any
334
- if (Object.keys(assetsMetadata).length > 0) {
335
- response.assetsMetadata = assetsMetadata;
336
- }
337
292
  return response;
338
293
  }
339
294
  catch (error) {
@@ -343,7 +298,7 @@ export class RpcDataSource extends BaseController {
343
298
  }
344
299
  get assetsMiddleware() {
345
300
  return async (context, next) => {
346
- var _a, _b, _c;
301
+ var _a, _b;
347
302
  const { request } = context;
348
303
  const supportedChains = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
349
304
  if (supportedChains.length === 0) {
@@ -368,13 +323,6 @@ export class RpcDataSource extends BaseController {
368
323
  };
369
324
  }
370
325
  }
371
- if (response.assetsMetadata) {
372
- (_c = context.response).assetsMetadata ?? (_c.assetsMetadata = {});
373
- context.response.assetsMetadata = {
374
- ...context.response.assetsMetadata,
375
- ...response.assetsMetadata,
376
- };
377
- }
378
326
  const failedChains = new Set(Object.keys(response.errors ?? {}));
379
327
  successfullyHandledChains = supportedChains.filter((chainId) => !failedChains.has(chainId));
380
328
  if (successfullyHandledChains.length > 0) {
@@ -409,19 +357,20 @@ export class RpcDataSource extends BaseController {
409
357
  log('No active chains to subscribe');
410
358
  return;
411
359
  }
412
- // Handle subscription update - restart polling for new chains
360
+ // Handle subscription update
413
361
  if (isUpdate) {
414
362
  const existing = __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").get(subscriptionId);
415
363
  if (existing) {
416
- log('Updating existing subscription - restarting polling', {
364
+ log('Updating existing subscription', {
417
365
  subscriptionId,
418
- existingChains: existing.chains,
419
- newChains: chainsToSubscribe,
366
+ chainsToSubscribe,
420
367
  });
421
- // Don't return early - continue to unsubscribe and restart polling
368
+ existing.chains = chainsToSubscribe;
369
+ existing.accounts = request.accounts;
370
+ return;
422
371
  }
423
372
  }
424
- // Clean up existing subscription (stops old polling)
373
+ // Clean up existing subscription
425
374
  await this.unsubscribe(subscriptionId);
426
375
  // Start polling through BalanceFetcher and TokenDetector
427
376
  const balancePollingTokens = [];
@@ -501,82 +450,18 @@ export class RpcDataSource extends BaseController {
501
450
  __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").clear();
502
451
  }
503
452
  }
504
- _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = new WeakMap(), _RpcDataSource_activeChains = new WeakMap(), _RpcDataSource_chainStatuses = new WeakMap(), _RpcDataSource_providerCache = new WeakMap(), _RpcDataSource_activeSubscriptions = new WeakMap(), _RpcDataSource_multicallClient = new WeakMap(), _RpcDataSource_balanceFetcher = new WeakMap(), _RpcDataSource_tokenDetector = new WeakMap(), _RpcDataSource_instances = new WeakSet(), _RpcDataSource_convertToHumanReadable = function _RpcDataSource_convertToHumanReadable(rawBalance, decimals) {
505
- const rawAmount = new BigNumberJS(rawBalance);
506
- const divisor = new BigNumberJS(10).pow(decimals);
507
- return rawAmount.dividedBy(divisor).toString();
508
- }, _RpcDataSource_collectMetadataForBalances = function _RpcDataSource_collectMetadataForBalances(balances, chainId) {
509
- const assetsMetadata = {};
510
- const existingMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getExistingAssetsMetadata).call(this);
511
- for (const balance of balances) {
512
- const isNative = balance.assetId.includes('/slip44:');
513
- if (isNative) {
514
- const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
515
- if (chainStatus) {
516
- assetsMetadata[balance.assetId] = {
517
- type: 'native',
518
- symbol: chainStatus.nativeCurrency,
519
- name: chainStatus.nativeCurrency,
520
- decimals: 18,
521
- };
522
- }
523
- }
524
- else {
525
- // For ERC20 tokens, try existing metadata from state first
526
- const existingMeta = existingMetadata[balance.assetId];
527
- if (existingMeta) {
528
- assetsMetadata[balance.assetId] = existingMeta;
529
- }
530
- else {
531
- // Fallback to token list if not in state
532
- const tokenListMeta = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getTokenMetadataFromTokenList).call(this, balance.assetId);
533
- if (tokenListMeta) {
534
- assetsMetadata[balance.assetId] = tokenListMeta;
535
- }
536
- else {
537
- // Default metadata for unknown ERC20 tokens.
538
- // Use 18 decimals (the standard for most ERC20 tokens)
539
- // to ensure consistent human-readable balance format.
540
- assetsMetadata[balance.assetId] = {
541
- type: 'erc20',
542
- symbol: '',
543
- name: '',
544
- decimals: 18,
545
- };
546
- }
547
- }
548
- }
549
- }
550
- return assetsMetadata;
551
- }, _RpcDataSource_handleBalanceUpdate = function _RpcDataSource_handleBalanceUpdate(result) {
552
- const newBalances = {};
553
- // Convert hex chain ID to CAIP-2 format
554
- const chainIdDecimal = parseInt(result.chainId, 16);
555
- const caipChainId = `eip155:${chainIdDecimal}`;
556
- // Collect metadata for all balances
557
- const assetsMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, caipChainId);
558
- // Convert balances to human-readable format using metadata
453
+ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = new WeakMap(), _RpcDataSource_activeChains = new WeakMap(), _RpcDataSource_chainStatuses = new WeakMap(), _RpcDataSource_providerCache = new WeakMap(), _RpcDataSource_activeSubscriptions = new WeakMap(), _RpcDataSource_multicallClient = new WeakMap(), _RpcDataSource_balanceFetcher = new WeakMap(), _RpcDataSource_tokenDetector = new WeakMap(), _RpcDataSource_instances = new WeakSet(), _RpcDataSource_handleBalanceUpdate = function _RpcDataSource_handleBalanceUpdate(result) {
454
+ const accountBalances = {};
559
455
  for (const balance of result.balances) {
560
- const metadata = assetsMetadata[balance.assetId];
561
- // Default to 18 decimals (ERC20 standard) for consistent human-readable format
562
- const decimals = metadata?.decimals ?? 18;
563
- const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
564
- newBalances[balance.assetId] = {
565
- amount: humanReadableAmount,
456
+ accountBalances[balance.assetId] = {
457
+ amount: balance.balance,
566
458
  };
567
459
  }
568
- // Only send new data to AssetsController - it handles merging atomically
569
- // to avoid race conditions when concurrent updates occur for the same account
570
460
  const response = {
571
461
  assetsBalance: {
572
- [result.accountId]: newBalances,
462
+ [result.accountId]: accountBalances,
573
463
  },
574
- assetsMetadata,
575
464
  };
576
- log('Balance update response', {
577
- accountId: result.accountId,
578
- newBalanceCount: Object.keys(newBalances).length,
579
- });
580
465
  this.messenger
581
466
  .call('AssetsController:assetsUpdate', response, CONTROLLER_NAME)
582
467
  .catch((error) => {
@@ -586,47 +471,22 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
586
471
  log('Detected new tokens', {
587
472
  count: result.detectedAssets.length,
588
473
  });
589
- // Build new metadata from detected assets
590
- const newMetadata = {};
591
- if (result.detectedAssets.length > 0) {
592
- for (const asset of result.detectedAssets) {
593
- // Only include if we have metadata (symbol and decimals at minimum)
594
- if (asset.symbol && asset.decimals !== undefined) {
595
- newMetadata[asset.assetId] = {
596
- type: 'erc20',
597
- symbol: asset.symbol,
598
- name: asset.name ?? asset.symbol,
599
- decimals: asset.decimals,
600
- image: asset.image,
601
- };
602
- }
603
- }
604
- }
605
- // Build new balances from detected tokens
606
- const newBalances = {};
607
- if (result.detectedBalances.length > 0) {
608
- for (const balance of result.detectedBalances) {
609
- // Get decimals from the detected asset metadata
610
- const detectedAsset = result.detectedAssets.find((asset) => asset.assetId === balance.assetId);
611
- // Default to 18 decimals (ERC20 standard) for consistent human-readable format
612
- const decimals = detectedAsset?.decimals ?? 18;
613
- const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
614
- newBalances[balance.assetId] = {
615
- amount: humanReadableAmount,
616
- };
617
- }
618
- }
619
- // Only send new data to AssetsController - it handles merging atomically
620
- // to avoid race conditions when concurrent updates occur for the same account
621
474
  const response = {
622
475
  detectedAssets: {
623
476
  [result.accountId]: result.detectedAssets.map((asset) => asset.assetId),
624
477
  },
625
- assetsMetadata: newMetadata,
626
- assetsBalance: {
627
- [result.accountId]: newBalances,
628
- },
629
478
  };
479
+ // Add balances for detected tokens
480
+ if (result.detectedBalances.length > 0) {
481
+ response.assetsBalance = {
482
+ [result.accountId]: {},
483
+ };
484
+ for (const balance of result.detectedBalances) {
485
+ response.assetsBalance[result.accountId][balance.assetId] = {
486
+ amount: balance.balance,
487
+ };
488
+ }
489
+ }
630
490
  this.messenger
631
491
  .call('AssetsController:assetsUpdate', response, CONTROLLER_NAME)
632
492
  .catch((error) => {
@@ -766,53 +626,6 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
766
626
  const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');
767
627
  return (nativeAssetIdentifiers[chainId] ??
768
628
  `${chainId}/slip44:60`);
769
- }, _RpcDataSource_getExistingAssetsMetadata = function _RpcDataSource_getExistingAssetsMetadata() {
770
- try {
771
- const state = this.messenger.call('AssetsController:getState');
772
- return (state.assetsMetadata ?? {});
773
- }
774
- catch {
775
- // If AssetsController:getState fails, return empty metadata
776
- return {};
777
- }
778
- }, _RpcDataSource_getTokenMetadataFromTokenList = function _RpcDataSource_getTokenMetadataFromTokenList(assetId) {
779
- try {
780
- // Parse asset ID to get chain and token address
781
- // Format: eip155:{chainId}/erc20:{address}
782
- const [chainPart, assetPart] = assetId.split('/');
783
- if (!assetPart?.startsWith('erc20:')) {
784
- return undefined;
785
- }
786
- const tokenAddress = assetPart.slice(6); // Remove 'erc20:' prefix
787
- const chainIdDecimal = chainPart.split(':')[1];
788
- const hexChainId = `0x${parseInt(chainIdDecimal, 10).toString(16)}`;
789
- const tokenListState = this.messenger.call('TokenListController:getState');
790
- const chainCacheEntry = tokenListState.tokensChainsCache[hexChainId];
791
- const chainTokenList = chainCacheEntry?.data;
792
- if (!chainTokenList) {
793
- return undefined;
794
- }
795
- // Look up token by address (case-insensitive)
796
- const lowerAddress = tokenAddress.toLowerCase();
797
- for (const [address, tokenData] of Object.entries(chainTokenList)) {
798
- if (address.toLowerCase() === lowerAddress) {
799
- const token = tokenData;
800
- if (token.symbol && token.decimals !== undefined) {
801
- return {
802
- type: 'erc20',
803
- symbol: token.symbol,
804
- name: token.name ?? token.symbol,
805
- decimals: token.decimals,
806
- image: token.iconUrl,
807
- };
808
- }
809
- }
810
- }
811
- return undefined;
812
- }
813
- catch {
814
- return undefined;
815
- }
816
629
  };
817
630
  export function createRpcDataSource(options) {
818
631
  return new RpcDataSource(options);