@metamask-previews/assets-controller 14.0.3-preview-e12b5ece6 → 14.0.3-preview-fe4b3be11

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 (80) hide show
  1. package/CHANGELOG.md +5 -10
  2. package/dist/AssetsController.cjs +592 -273
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +7 -10
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +7 -10
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +592 -273
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/AbstractDataSource.cjs +23 -0
  11. package/dist/data-sources/AbstractDataSource.cjs.map +1 -1
  12. package/dist/data-sources/AbstractDataSource.d.cts +13 -1
  13. package/dist/data-sources/AbstractDataSource.d.cts.map +1 -1
  14. package/dist/data-sources/AbstractDataSource.d.mts +13 -1
  15. package/dist/data-sources/AbstractDataSource.d.mts.map +1 -1
  16. package/dist/data-sources/AbstractDataSource.mjs +23 -0
  17. package/dist/data-sources/AbstractDataSource.mjs.map +1 -1
  18. package/dist/data-sources/AccountActivityDataSource.cjs +2 -0
  19. package/dist/data-sources/AccountActivityDataSource.cjs.map +1 -1
  20. package/dist/data-sources/AccountActivityDataSource.d.cts.map +1 -1
  21. package/dist/data-sources/AccountActivityDataSource.d.mts.map +1 -1
  22. package/dist/data-sources/AccountActivityDataSource.mjs +2 -0
  23. package/dist/data-sources/AccountActivityDataSource.mjs.map +1 -1
  24. package/dist/data-sources/AccountsApiDataSource.cjs +144 -31
  25. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
  26. package/dist/data-sources/AccountsApiDataSource.d.cts +18 -2
  27. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
  28. package/dist/data-sources/AccountsApiDataSource.d.mts +18 -2
  29. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
  30. package/dist/data-sources/AccountsApiDataSource.mjs +145 -32
  31. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
  32. package/dist/data-sources/RpcDataSource.cjs +163 -24
  33. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  34. package/dist/data-sources/RpcDataSource.d.cts +17 -0
  35. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  36. package/dist/data-sources/RpcDataSource.d.mts +17 -0
  37. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  38. package/dist/data-sources/RpcDataSource.mjs +164 -25
  39. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  40. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +21 -12
  41. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -1
  42. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +7 -2
  43. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -1
  44. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +7 -2
  45. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -1
  46. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs +21 -12
  47. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -1
  48. package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -1
  49. package/dist/data-sources/evm-rpc-services/types/state.d.cts +3 -2
  50. package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -1
  51. package/dist/data-sources/evm-rpc-services/types/state.d.mts +3 -2
  52. package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -1
  53. package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -1
  54. package/dist/middlewares/ParallelMiddleware.cjs +9 -0
  55. package/dist/middlewares/ParallelMiddleware.cjs.map +1 -1
  56. package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -1
  57. package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -1
  58. package/dist/middlewares/ParallelMiddleware.mjs +9 -0
  59. package/dist/middlewares/ParallelMiddleware.mjs.map +1 -1
  60. package/dist/middlewares/RpcFallbackMiddleware.cjs +158 -128
  61. package/dist/middlewares/RpcFallbackMiddleware.cjs.map +1 -1
  62. package/dist/middlewares/RpcFallbackMiddleware.d.cts +10 -14
  63. package/dist/middlewares/RpcFallbackMiddleware.d.cts.map +1 -1
  64. package/dist/middlewares/RpcFallbackMiddleware.d.mts +10 -14
  65. package/dist/middlewares/RpcFallbackMiddleware.d.mts.map +1 -1
  66. package/dist/middlewares/RpcFallbackMiddleware.mjs +158 -128
  67. package/dist/middlewares/RpcFallbackMiddleware.mjs.map +1 -1
  68. package/dist/selectors/balance.cjs +4 -9
  69. package/dist/selectors/balance.cjs.map +1 -1
  70. package/dist/selectors/balance.d.cts.map +1 -1
  71. package/dist/selectors/balance.d.mts.map +1 -1
  72. package/dist/selectors/balance.mjs +4 -9
  73. package/dist/selectors/balance.mjs.map +1 -1
  74. package/dist/types.cjs.map +1 -1
  75. package/dist/types.d.cts +28 -26
  76. package/dist/types.d.cts.map +1 -1
  77. package/dist/types.d.mts +28 -26
  78. package/dist/types.d.mts.map +1 -1
  79. package/dist/types.mjs.map +1 -1
  80. package/package.json +4 -4
@@ -13,7 +13,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _RpcDataSource_instances, _RpcDataSource_messenger, _RpcDataSource_onActiveChainsUpdated, _RpcDataSource_getNativeAssetForChain, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_useExternalService, _RpcDataSource_isOnboarded, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_unsubscribeTransactionConfirmed, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector, _RpcDataSource_getAssetType, _RpcDataSource_convertToHumanReadable, _RpcDataSource_collectMetadataForBalances, _RpcDataSource_hasValidDecimals, _RpcDataSource_pickValidDecimals, _RpcDataSource_handleBalanceUpdate, _RpcDataSource_handleDetectionUpdate, _RpcDataSource_subscribeToNetworkController, _RpcDataSource_subscribeToTransactionEvents, _RpcDataSource_onTransactionConfirmed, _RpcDataSource_refreshBalanceForChains, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_getMulticallProvider, _RpcDataSource_clearProviderCache, _RpcDataSource_fetchDecimalsViaRpc, _RpcDataSource_getExistingAssetsMetadata;
16
+ var _RpcDataSource_instances, _RpcDataSource_messenger, _RpcDataSource_onActiveChainsUpdated, _RpcDataSource_getNativeAssetForChain, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_useExternalService, _RpcDataSource_isOnboarded, _RpcDataSource_isBalanceV6Enabled, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_unsubscribeTransactionConfirmed, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector, _RpcDataSource_getAssetType, _RpcDataSource_convertToHumanReadable, _RpcDataSource_collectMetadataForBalances, _RpcDataSource_hasValidDecimals, _RpcDataSource_pickValidDecimals, _RpcDataSource_handleBalanceUpdate, _RpcDataSource_handleDetectionUpdate, _RpcDataSource_subscribeToNetworkController, _RpcDataSource_subscribeToTransactionEvents, _RpcDataSource_onTransactionConfirmed, _RpcDataSource_refreshBalanceForChains, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_getMulticallProvider, _RpcDataSource_clearProviderCache, _RpcDataSource_fetchDecimalsViaRpc, _RpcDataSource_getSupplementalCustomAssetChains, _RpcDataSource_appendRequestCustomErc20sV5, _RpcDataSource_appendRequestCustomErc20sV6, _RpcDataSource_getCustomAssetsByAccount, _RpcDataSource_getExistingAssetsMetadata;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.createRpcDataSource = exports.RpcDataSource = exports.caipChainIdToHex = void 0;
19
19
  const providers_1 = require("@ethersproject/providers");
@@ -75,6 +75,7 @@ class RpcDataSource extends AbstractDataSource_js_1.AbstractDataSource {
75
75
  _RpcDataSource_tokenDetectionEnabled.set(this, void 0);
76
76
  _RpcDataSource_useExternalService.set(this, void 0);
77
77
  _RpcDataSource_isOnboarded.set(this, void 0);
78
+ _RpcDataSource_isBalanceV6Enabled.set(this, void 0);
78
79
  /** Currently active chains */
79
80
  _RpcDataSource_activeChains.set(this, []);
80
81
  /** Network status for each active chain */
@@ -97,6 +98,7 @@ class RpcDataSource extends AbstractDataSource_js_1.AbstractDataSource {
97
98
  __classPrivateFieldSet(this, _RpcDataSource_tokenDetectionEnabled, options.tokenDetectionEnabled ?? (() => true), "f");
98
99
  __classPrivateFieldSet(this, _RpcDataSource_useExternalService, options.useExternalService ?? (() => true), "f");
99
100
  __classPrivateFieldSet(this, _RpcDataSource_isOnboarded, options.isOnboarded ?? (() => true), "f");
101
+ __classPrivateFieldSet(this, _RpcDataSource_isBalanceV6Enabled, options.isBalanceV6Enabled ?? (() => false), "f");
100
102
  const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL;
101
103
  const detectionInterval = options.detectionInterval ?? DEFAULT_DETECTION_INTERVAL;
102
104
  log('Initializing RpcDataSource', {
@@ -253,6 +255,11 @@ class RpcDataSource extends AbstractDataSource_js_1.AbstractDataSource {
253
255
  const assetsBalance = {};
254
256
  const assetsInfo = {};
255
257
  const failedChains = [];
258
+ // request.customAssets is flat. v6 resolves pin ownership from state so
259
+ // each account only fetches its own pins; v5 applies the flat list as on main.
260
+ const customAssetsByAccount = request.customAssets
261
+ ? __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getCustomAssetsByAccount).call(this)
262
+ : {};
256
263
  // Fetch balances for each account and its supported chains (pre-computed in request)
257
264
  for (const { account, supportedChains, } of request.accountsWithSupportedChains) {
258
265
  const chainsForAccount = chainsToFetch.filter((chain) => supportedChains.includes(chain));
@@ -271,25 +278,11 @@ class RpcDataSource extends AbstractDataSource_js_1.AbstractDataSource {
271
278
  }
272
279
  if (request.customAssets) {
273
280
  const existingMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getExistingAssetsMetadata).call(this);
274
- for (const assetId of request.customAssets) {
275
- try {
276
- const parsed = (0, utils_1.parseCaipAssetType)(assetId);
277
- const assetChainId = `${parsed.chain.namespace}:${parsed.chain.reference}`;
278
- if (assetChainId === chainId &&
279
- __classPrivateFieldGet(this, _RpcDataSource_getAssetType, "f").call(this, assetId) === 'erc20') {
280
- const tokenAddress = parsed.assetReference.toLowerCase();
281
- const normalizedId = (0, index_js_1.normalizeAssetId)(assetId);
282
- const decimals = existingMetadata[normalizedId]?.decimals;
283
- assetsToFetch.push({
284
- assetId,
285
- address: tokenAddress,
286
- decimals,
287
- });
288
- }
289
- }
290
- catch {
291
- // Skip unparseable asset IDs
292
- }
281
+ if (__classPrivateFieldGet(this, _RpcDataSource_isBalanceV6Enabled, "f").call(this)) {
282
+ __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_appendRequestCustomErc20sV6).call(this, assetsToFetch, request.customAssets, chainId, existingMetadata, new Set((customAssetsByAccount[accountId] ?? []).map(index_js_1.normalizeAssetId)));
283
+ }
284
+ else {
285
+ __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_appendRequestCustomErc20sV5).call(this, assetsToFetch, request.customAssets, chainId, existingMetadata);
293
286
  }
294
287
  }
295
288
  try {
@@ -513,6 +506,30 @@ class RpcDataSource extends AbstractDataSource_js_1.AbstractDataSource {
513
506
  return next(context);
514
507
  };
515
508
  }
509
+ /**
510
+ * RPC is the terminal claimer on the asset axis: it claims every EVM pin it
511
+ * has a provider for, even on chains claimed by higher-priority sources.
512
+ * Pins outside the regular RPC assignment get an asset-scoped poll (see
513
+ * `subscribe`).
514
+ *
515
+ * @param customAssets - Candidate CAIP-19 asset IDs still unclaimed.
516
+ * @param assignedChains - Chains assigned to RPC; availability fallback
517
+ * before network state is applied.
518
+ * @returns The claimed subset of `customAssets`.
519
+ */
520
+ claimCustomAssets(customAssets, assignedChains) {
521
+ const available = new Set(__classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").length > 0 ? __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f") : assignedChains);
522
+ return customAssets.filter((assetId) => {
523
+ try {
524
+ const parsed = (0, utils_1.parseCaipAssetType)(assetId);
525
+ return (parsed.chain.namespace === utils_1.KnownCaipNamespace.Eip155 &&
526
+ available.has(parsed.chainId));
527
+ }
528
+ catch {
529
+ return false;
530
+ }
531
+ });
532
+ }
516
533
  /**
517
534
  * Subscribe to updates for the given request.
518
535
  * Starts polling through BalanceFetcher and TokenDetector.
@@ -530,14 +547,18 @@ class RpcDataSource extends AbstractDataSource_js_1.AbstractDataSource {
530
547
  const chainsToSubscribe = __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").length > 0
531
548
  ? request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId))
532
549
  : request.chainIds;
550
+ // Pins claimed on chains outside the regular RPC assignment get an
551
+ // asset-scoped poll below.
552
+ const supplementalChains = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getSupplementalCustomAssetChains).call(this, request, chainsToSubscribe);
533
553
  log('Subscribe requested', {
534
554
  subscriptionId,
535
555
  isUpdate,
536
556
  accounts: request.accountsWithSupportedChains.map((a) => a.account.id),
537
557
  chainsToSubscribe,
558
+ supplementalChains,
538
559
  activeChainsFallback: __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").length === 0,
539
560
  });
540
- if (chainsToSubscribe.length === 0) {
561
+ if (chainsToSubscribe.length === 0 && supplementalChains.length === 0) {
541
562
  log('No active chains to subscribe');
542
563
  return;
543
564
  }
@@ -577,8 +598,6 @@ class RpcDataSource extends AbstractDataSource_js_1.AbstractDataSource {
577
598
  };
578
599
  const balanceToken = __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").startPolling(balanceInput);
579
600
  balancePollingTokens.push(balanceToken);
580
- // Token detection is only relevant for "regular" subscriptions —
581
- // a customAssetsOnly subscription should never run detection.
582
601
  if (request.customAssetsOnly !== true &&
583
602
  __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this) &&
584
603
  __classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this)) {
@@ -592,6 +611,51 @@ class RpcDataSource extends AbstractDataSource_js_1.AbstractDataSource {
592
611
  }
593
612
  }
594
613
  }
614
+ // Asset-scoped polls on chains another source claimed: poll ONLY the
615
+ // claimed pins to avoid double-polling tracked balances. Pin changes
616
+ // re-run the subscription pass, which rebuilds these polls.
617
+ // Asset-scoped polls on chains another source claimed (v6 only).
618
+ if (__classPrivateFieldGet(this, _RpcDataSource_isBalanceV6Enabled, "f").call(this) && supplementalChains.length > 0) {
619
+ const supplemental = new Set(supplementalChains);
620
+ const claimedAssetsByChain = new Map();
621
+ for (const assetId of request.customAssets ?? []) {
622
+ try {
623
+ const { chainId } = (0, utils_1.parseCaipAssetType)(assetId);
624
+ if (supplemental.has(chainId)) {
625
+ const chainAssets = claimedAssetsByChain.get(chainId) ?? [];
626
+ chainAssets.push(assetId);
627
+ claimedAssetsByChain.set(chainId, chainAssets);
628
+ }
629
+ }
630
+ catch {
631
+ // Skip unparseable asset IDs
632
+ }
633
+ }
634
+ // request.customAssets is flat; ownership comes from controller state.
635
+ const customAssetsByAccount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getCustomAssetsByAccount).call(this);
636
+ for (const { account } of request.accountsWithSupportedChains) {
637
+ const pinned = new Set(customAssetsByAccount[account.id] ?? []);
638
+ if (pinned.size === 0) {
639
+ continue;
640
+ }
641
+ for (const [chainId, chainAssets] of claimedAssetsByChain) {
642
+ // Sorted so the polling input (the dedupe key) is deterministic.
643
+ const assetIds = chainAssets
644
+ .filter((assetId) => pinned.has(assetId))
645
+ .sort();
646
+ if (assetIds.length === 0) {
647
+ continue;
648
+ }
649
+ const balanceInput = {
650
+ chainId: (0, exports.caipChainIdToHex)(chainId),
651
+ accountId: account.id,
652
+ accountAddress: account.address,
653
+ assetIds,
654
+ };
655
+ balancePollingTokens.push(__classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").startPolling(balanceInput));
656
+ }
657
+ }
658
+ }
595
659
  // Store subscription data
596
660
  const accounts = request.accountsWithSupportedChains.map((entry) => entry.account);
597
661
  __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").set(subscriptionId, {
@@ -644,7 +708,7 @@ class RpcDataSource extends AbstractDataSource_js_1.AbstractDataSource {
644
708
  }
645
709
  }
646
710
  exports.RpcDataSource = RpcDataSource;
647
- _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated = new WeakMap(), _RpcDataSource_getNativeAssetForChain = new WeakMap(), _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = new WeakMap(), _RpcDataSource_useExternalService = new WeakMap(), _RpcDataSource_isOnboarded = new WeakMap(), _RpcDataSource_activeChains = new WeakMap(), _RpcDataSource_chainStatuses = new WeakMap(), _RpcDataSource_providerCache = new WeakMap(), _RpcDataSource_activeSubscriptions = new WeakMap(), _RpcDataSource_unsubscribeTransactionConfirmed = new WeakMap(), _RpcDataSource_multicallClient = new WeakMap(), _RpcDataSource_balanceFetcher = new WeakMap(), _RpcDataSource_tokenDetector = new WeakMap(), _RpcDataSource_getAssetType = new WeakMap(), _RpcDataSource_instances = new WeakSet(), _RpcDataSource_convertToHumanReadable = function _RpcDataSource_convertToHumanReadable(rawBalance, decimals) {
711
+ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated = new WeakMap(), _RpcDataSource_getNativeAssetForChain = new WeakMap(), _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = new WeakMap(), _RpcDataSource_useExternalService = new WeakMap(), _RpcDataSource_isOnboarded = new WeakMap(), _RpcDataSource_isBalanceV6Enabled = new WeakMap(), _RpcDataSource_activeChains = new WeakMap(), _RpcDataSource_chainStatuses = new WeakMap(), _RpcDataSource_providerCache = new WeakMap(), _RpcDataSource_activeSubscriptions = new WeakMap(), _RpcDataSource_unsubscribeTransactionConfirmed = new WeakMap(), _RpcDataSource_multicallClient = new WeakMap(), _RpcDataSource_balanceFetcher = new WeakMap(), _RpcDataSource_tokenDetector = new WeakMap(), _RpcDataSource_getAssetType = new WeakMap(), _RpcDataSource_instances = new WeakSet(), _RpcDataSource_convertToHumanReadable = function _RpcDataSource_convertToHumanReadable(rawBalance, decimals) {
648
712
  if (!Number.isFinite(decimals) || decimals < 0) {
649
713
  log('Invalid decimals — defaulting balance to "0"', {
650
714
  rawBalance,
@@ -1013,6 +1077,81 @@ async function _RpcDataSource_fetchDecimalsViaRpc(chainId, tokenAddress) {
1013
1077
  catch {
1014
1078
  return undefined;
1015
1079
  }
1080
+ }, _RpcDataSource_getSupplementalCustomAssetChains = function _RpcDataSource_getSupplementalCustomAssetChains(request, chainsToSubscribe) {
1081
+ if (!request.customAssets || request.customAssets.length === 0) {
1082
+ return [];
1083
+ }
1084
+ const covered = new Set(chainsToSubscribe);
1085
+ const chains = new Set();
1086
+ for (const assetId of request.customAssets) {
1087
+ let parsed;
1088
+ try {
1089
+ parsed = (0, utils_1.parseCaipAssetType)(assetId);
1090
+ }
1091
+ catch {
1092
+ continue;
1093
+ }
1094
+ const { chainId } = parsed;
1095
+ if (parsed.chain.namespace === utils_1.KnownCaipNamespace.Eip155 &&
1096
+ !covered.has(chainId) &&
1097
+ (__classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").length === 0 ||
1098
+ __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId))) {
1099
+ chains.add(chainId);
1100
+ }
1101
+ }
1102
+ return [...chains];
1103
+ }, _RpcDataSource_appendRequestCustomErc20sV5 = function _RpcDataSource_appendRequestCustomErc20sV5(assetsToFetch, customAssets, chainId, existingMetadata) {
1104
+ for (const assetId of customAssets) {
1105
+ try {
1106
+ const parsed = (0, utils_1.parseCaipAssetType)(assetId);
1107
+ const assetChainId = `${parsed.chain.namespace}:${parsed.chain.reference}`;
1108
+ if (assetChainId === chainId &&
1109
+ __classPrivateFieldGet(this, _RpcDataSource_getAssetType, "f").call(this, assetId) === 'erc20') {
1110
+ const tokenAddress = parsed.assetReference.toLowerCase();
1111
+ const normalizedId = (0, index_js_1.normalizeAssetId)(assetId);
1112
+ const decimals = existingMetadata[normalizedId]?.decimals;
1113
+ assetsToFetch.push({
1114
+ assetId,
1115
+ address: tokenAddress,
1116
+ decimals,
1117
+ });
1118
+ }
1119
+ }
1120
+ catch {
1121
+ // Skip unparseable asset IDs
1122
+ }
1123
+ }
1124
+ }, _RpcDataSource_appendRequestCustomErc20sV6 = function _RpcDataSource_appendRequestCustomErc20sV6(assetsToFetch, customAssets, chainId, existingMetadata, pinnedByAccount) {
1125
+ for (const assetId of customAssets) {
1126
+ try {
1127
+ const parsed = (0, utils_1.parseCaipAssetType)(assetId);
1128
+ const assetChainId = `${parsed.chain.namespace}:${parsed.chain.reference}`;
1129
+ const normalizedId = (0, index_js_1.normalizeAssetId)(assetId);
1130
+ if (assetChainId === chainId &&
1131
+ pinnedByAccount.has(normalizedId) &&
1132
+ __classPrivateFieldGet(this, _RpcDataSource_getAssetType, "f").call(this, assetId) === 'erc20') {
1133
+ const tokenAddress = parsed.assetReference.toLowerCase();
1134
+ const decimals = existingMetadata[normalizedId]?.decimals;
1135
+ assetsToFetch.push({
1136
+ assetId,
1137
+ address: tokenAddress,
1138
+ decimals,
1139
+ });
1140
+ }
1141
+ }
1142
+ catch {
1143
+ // Skip unparseable asset IDs
1144
+ }
1145
+ }
1146
+ }, _RpcDataSource_getCustomAssetsByAccount = function _RpcDataSource_getCustomAssetsByAccount() {
1147
+ try {
1148
+ const state = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:getState');
1149
+ return (state.customAssets ?? {});
1150
+ }
1151
+ catch (error) {
1152
+ log('Failed to get customAssets from state', { error });
1153
+ return {};
1154
+ }
1016
1155
  }, _RpcDataSource_getExistingAssetsMetadata = function _RpcDataSource_getExistingAssetsMetadata() {
1017
1156
  try {
1018
1157
  const state = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:getState');