@metamask/assets-controller 0.2.0 → 2.0.0

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 (202) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/dist/AssetsController-method-action-types.cjs +7 -0
  3. package/dist/AssetsController-method-action-types.cjs.map +1 -0
  4. package/dist/AssetsController-method-action-types.d.cts +78 -0
  5. package/dist/AssetsController-method-action-types.d.cts.map +1 -0
  6. package/dist/AssetsController-method-action-types.d.mts +78 -0
  7. package/dist/AssetsController-method-action-types.d.mts.map +1 -0
  8. package/dist/AssetsController-method-action-types.mjs +6 -0
  9. package/dist/AssetsController-method-action-types.mjs.map +1 -0
  10. package/dist/AssetsController.cjs +346 -271
  11. package/dist/AssetsController.cjs.map +1 -1
  12. package/dist/AssetsController.d.cts +92 -96
  13. package/dist/AssetsController.d.cts.map +1 -1
  14. package/dist/AssetsController.d.mts +92 -96
  15. package/dist/AssetsController.d.mts.map +1 -1
  16. package/dist/AssetsController.mjs +347 -272
  17. package/dist/AssetsController.mjs.map +1 -1
  18. package/dist/data-sources/AbstractDataSource.cjs +8 -0
  19. package/dist/data-sources/AbstractDataSource.cjs.map +1 -1
  20. package/dist/data-sources/AbstractDataSource.d.cts +16 -1
  21. package/dist/data-sources/AbstractDataSource.d.cts.map +1 -1
  22. package/dist/data-sources/AbstractDataSource.d.mts +16 -1
  23. package/dist/data-sources/AbstractDataSource.d.mts.map +1 -1
  24. package/dist/data-sources/AbstractDataSource.mjs +8 -0
  25. package/dist/data-sources/AbstractDataSource.mjs.map +1 -1
  26. package/dist/data-sources/AccountsApiDataSource.cjs +92 -111
  27. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
  28. package/dist/data-sources/AccountsApiDataSource.d.cts +27 -70
  29. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
  30. package/dist/data-sources/AccountsApiDataSource.d.mts +27 -70
  31. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
  32. package/dist/data-sources/AccountsApiDataSource.mjs +88 -107
  33. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
  34. package/dist/data-sources/BackendWebsocketDataSource.cjs +141 -46
  35. package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
  36. package/dist/data-sources/BackendWebsocketDataSource.d.cts +19 -66
  37. package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
  38. package/dist/data-sources/BackendWebsocketDataSource.d.mts +19 -66
  39. package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
  40. package/dist/data-sources/BackendWebsocketDataSource.mjs +141 -46
  41. package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
  42. package/dist/data-sources/PriceDataSource.cjs +39 -48
  43. package/dist/data-sources/PriceDataSource.cjs.map +1 -1
  44. package/dist/data-sources/PriceDataSource.d.cts +13 -92
  45. package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
  46. package/dist/data-sources/PriceDataSource.d.mts +13 -92
  47. package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
  48. package/dist/data-sources/PriceDataSource.mjs +39 -48
  49. package/dist/data-sources/PriceDataSource.mjs.map +1 -1
  50. package/dist/data-sources/RpcDataSource.cjs +184 -142
  51. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  52. package/dist/data-sources/RpcDataSource.d.cts +29 -114
  53. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  54. package/dist/data-sources/RpcDataSource.d.mts +29 -114
  55. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  56. package/dist/data-sources/RpcDataSource.mjs +185 -143
  57. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  58. package/dist/data-sources/SnapDataSource.cjs +53 -39
  59. package/dist/data-sources/SnapDataSource.cjs.map +1 -1
  60. package/dist/data-sources/SnapDataSource.d.cts +9 -45
  61. package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
  62. package/dist/data-sources/SnapDataSource.d.mts +9 -45
  63. package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
  64. package/dist/data-sources/SnapDataSource.mjs +53 -39
  65. package/dist/data-sources/SnapDataSource.mjs.map +1 -1
  66. package/dist/data-sources/StakedBalanceDataSource.cjs +609 -0
  67. package/dist/data-sources/StakedBalanceDataSource.cjs.map +1 -0
  68. package/dist/data-sources/StakedBalanceDataSource.d.cts +72 -0
  69. package/dist/data-sources/StakedBalanceDataSource.d.cts.map +1 -0
  70. package/dist/data-sources/StakedBalanceDataSource.d.mts +72 -0
  71. package/dist/data-sources/StakedBalanceDataSource.d.mts.map +1 -0
  72. package/dist/data-sources/StakedBalanceDataSource.mjs +605 -0
  73. package/dist/data-sources/StakedBalanceDataSource.mjs.map +1 -0
  74. package/dist/data-sources/TokenDataSource.cjs +15 -21
  75. package/dist/data-sources/TokenDataSource.cjs.map +1 -1
  76. package/dist/data-sources/TokenDataSource.d.cts +3 -25
  77. package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
  78. package/dist/data-sources/TokenDataSource.d.mts +3 -25
  79. package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
  80. package/dist/data-sources/TokenDataSource.mjs +15 -21
  81. package/dist/data-sources/TokenDataSource.mjs.map +1 -1
  82. package/dist/data-sources/evm-rpc-services/index.cjs +5 -1
  83. package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -1
  84. package/dist/data-sources/evm-rpc-services/index.d.cts +1 -1
  85. package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -1
  86. package/dist/data-sources/evm-rpc-services/index.d.mts +1 -1
  87. package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -1
  88. package/dist/data-sources/evm-rpc-services/index.mjs +1 -1
  89. package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -1
  90. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs +132 -0
  91. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs.map +1 -0
  92. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts +78 -0
  93. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts.map +1 -0
  94. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts +78 -0
  95. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts.map +1 -0
  96. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs +126 -0
  97. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs.map +1 -0
  98. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +16 -0
  99. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -1
  100. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +5 -1
  101. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -1
  102. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +5 -1
  103. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -1
  104. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +16 -0
  105. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -1
  106. package/dist/data-sources/evm-rpc-services/services/index.cjs +6 -1
  107. package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -1
  108. package/dist/data-sources/evm-rpc-services/services/index.d.cts +1 -0
  109. package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -1
  110. package/dist/data-sources/evm-rpc-services/services/index.d.mts +1 -0
  111. package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -1
  112. package/dist/data-sources/evm-rpc-services/services/index.mjs +1 -0
  113. package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -1
  114. package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -1
  115. package/dist/data-sources/evm-rpc-services/types/services.d.cts +4 -0
  116. package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -1
  117. package/dist/data-sources/evm-rpc-services/types/services.d.mts +4 -0
  118. package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -1
  119. package/dist/data-sources/evm-rpc-services/types/services.mjs.map +1 -1
  120. package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -1
  121. package/dist/data-sources/evm-rpc-services/types/state.d.cts +3 -3
  122. package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -1
  123. package/dist/data-sources/evm-rpc-services/types/state.d.mts +3 -3
  124. package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -1
  125. package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -1
  126. package/dist/data-sources/evm-rpc-services/utils/index.cjs +9 -1
  127. package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -1
  128. package/dist/data-sources/evm-rpc-services/utils/index.d.cts +2 -0
  129. package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -1
  130. package/dist/data-sources/evm-rpc-services/utils/index.d.mts +2 -0
  131. package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -1
  132. package/dist/data-sources/evm-rpc-services/utils/index.mjs +2 -0
  133. package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -1
  134. package/dist/data-sources/evm-rpc-services/utils/parsing.cjs +47 -0
  135. package/dist/data-sources/evm-rpc-services/utils/parsing.cjs.map +1 -0
  136. package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts +25 -0
  137. package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts.map +1 -0
  138. package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts +25 -0
  139. package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts.map +1 -0
  140. package/dist/data-sources/evm-rpc-services/utils/parsing.mjs +39 -0
  141. package/dist/data-sources/evm-rpc-services/utils/parsing.mjs.map +1 -0
  142. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs +68 -0
  143. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs.map +1 -0
  144. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts +25 -0
  145. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts.map +1 -0
  146. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts +25 -0
  147. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts.map +1 -0
  148. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs +62 -0
  149. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs.map +1 -0
  150. package/dist/data-sources/index.cjs +3 -6
  151. package/dist/data-sources/index.cjs.map +1 -1
  152. package/dist/data-sources/index.d.cts +7 -7
  153. package/dist/data-sources/index.d.cts.map +1 -1
  154. package/dist/data-sources/index.d.mts +7 -7
  155. package/dist/data-sources/index.d.mts.map +1 -1
  156. package/dist/data-sources/index.mjs +2 -3
  157. package/dist/data-sources/index.mjs.map +1 -1
  158. package/dist/index.cjs +6 -6
  159. package/dist/index.cjs.map +1 -1
  160. package/dist/index.d.cts +11 -11
  161. package/dist/index.d.cts.map +1 -1
  162. package/dist/index.d.mts +11 -11
  163. package/dist/index.d.mts.map +1 -1
  164. package/dist/index.mjs +3 -3
  165. package/dist/index.mjs.map +1 -1
  166. package/dist/middlewares/DetectionMiddleware.cjs +8 -28
  167. package/dist/middlewares/DetectionMiddleware.cjs.map +1 -1
  168. package/dist/middlewares/DetectionMiddleware.d.cts +4 -26
  169. package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -1
  170. package/dist/middlewares/DetectionMiddleware.d.mts +4 -26
  171. package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -1
  172. package/dist/middlewares/DetectionMiddleware.mjs +8 -28
  173. package/dist/middlewares/DetectionMiddleware.mjs.map +1 -1
  174. package/dist/middlewares/index.cjs.map +1 -1
  175. package/dist/middlewares/index.d.cts +1 -1
  176. package/dist/middlewares/index.d.cts.map +1 -1
  177. package/dist/middlewares/index.d.mts +1 -1
  178. package/dist/middlewares/index.d.mts.map +1 -1
  179. package/dist/middlewares/index.mjs.map +1 -1
  180. package/dist/selectors/balance.cjs +306 -0
  181. package/dist/selectors/balance.cjs.map +1 -0
  182. package/dist/selectors/balance.d.cts +22 -0
  183. package/dist/selectors/balance.d.cts.map +1 -0
  184. package/dist/selectors/balance.d.mts +22 -0
  185. package/dist/selectors/balance.d.mts.map +1 -0
  186. package/dist/selectors/balance.mjs +297 -0
  187. package/dist/selectors/balance.mjs.map +1 -0
  188. package/dist/types.cjs.map +1 -1
  189. package/dist/types.d.cts +56 -21
  190. package/dist/types.d.cts.map +1 -1
  191. package/dist/types.d.mts +56 -21
  192. package/dist/types.d.mts.map +1 -1
  193. package/dist/types.mjs.map +1 -1
  194. package/package.json +13 -10
  195. package/dist/data-sources/initDataSources.cjs +0 -215
  196. package/dist/data-sources/initDataSources.cjs.map +0 -1
  197. package/dist/data-sources/initDataSources.d.cts +0 -140
  198. package/dist/data-sources/initDataSources.d.cts.map +0 -1
  199. package/dist/data-sources/initDataSources.d.mts +0 -140
  200. package/dist/data-sources/initDataSources.d.mts.map +0 -1
  201. package/dist/data-sources/initDataSources.mjs +0 -210
  202. package/dist/data-sources/initDataSources.mjs.map +0 -1
@@ -13,14 +13,14 @@ 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_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;
16
+ var _RpcDataSource_instances, _RpcDataSource_messenger, _RpcDataSource_onActiveChainsUpdated, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_useExternalService, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_unsubscribeTransactionConfirmed, _RpcDataSource_unsubscribeIncomingTransactions, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector, _RpcDataSource_convertToHumanReadable, _RpcDataSource_collectMetadataForBalances, _RpcDataSource_handleBalanceUpdate, _RpcDataSource_handleDetectionUpdate, _RpcDataSource_subscribeToNetworkController, _RpcDataSource_subscribeToTransactionEvents, _RpcDataSource_onTransactionConfirmed, _RpcDataSource_onIncomingTransactions, _RpcDataSource_refreshBalanceForChains, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_getMulticallProvider, _RpcDataSource_clearProviderCache, _RpcDataSource_buildNativeAssetId, _RpcDataSource_getExistingAssetsMetadata, _RpcDataSource_getTokenMetadataFromTokenList;
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");
20
- const base_controller_1 = require("@metamask/base-controller");
21
20
  const controller_utils_1 = require("@metamask/controller-utils");
22
21
  const utils_1 = require("@metamask/utils");
23
22
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
23
+ const AbstractDataSource_1 = require("./AbstractDataSource.cjs");
24
24
  const evm_rpc_services_1 = require("./evm-rpc-services/index.cjs");
25
25
  const logger_1 = require("../logger.cjs");
26
26
  const CONTROLLER_NAME = 'RpcDataSource';
@@ -61,17 +61,15 @@ exports.caipChainIdToHex = caipChainIdToHex;
61
61
  * - RpcDataSource:activeChainsUpdated
62
62
  * - RpcDataSource:assetsUpdated
63
63
  */
64
- class RpcDataSource extends base_controller_1.BaseController {
64
+ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
65
65
  constructor(options) {
66
- super({
67
- name: CONTROLLER_NAME,
68
- metadata: {},
69
- state: {},
70
- messenger: options.messenger,
71
- });
66
+ super(CONTROLLER_NAME, { activeChains: [] });
72
67
  _RpcDataSource_instances.add(this);
68
+ _RpcDataSource_messenger.set(this, void 0);
69
+ _RpcDataSource_onActiveChainsUpdated.set(this, void 0);
73
70
  _RpcDataSource_timeout.set(this, void 0);
74
71
  _RpcDataSource_tokenDetectionEnabled.set(this, void 0);
72
+ _RpcDataSource_useExternalService.set(this, void 0);
75
73
  /** Currently active chains */
76
74
  _RpcDataSource_activeChains.set(this, []);
77
75
  /** Network status for each active chain */
@@ -80,19 +78,25 @@ class RpcDataSource extends base_controller_1.BaseController {
80
78
  _RpcDataSource_providerCache.set(this, new Map());
81
79
  /** Active subscriptions by ID */
82
80
  _RpcDataSource_activeSubscriptions.set(this, new Map());
81
+ _RpcDataSource_unsubscribeTransactionConfirmed.set(this, undefined);
82
+ _RpcDataSource_unsubscribeIncomingTransactions.set(this, undefined);
83
83
  // Rpc-datasource components
84
84
  _RpcDataSource_multicallClient.set(this, void 0);
85
85
  _RpcDataSource_balanceFetcher.set(this, void 0);
86
86
  _RpcDataSource_tokenDetector.set(this, void 0);
87
+ __classPrivateFieldSet(this, _RpcDataSource_messenger, options.messenger, "f");
88
+ __classPrivateFieldSet(this, _RpcDataSource_onActiveChainsUpdated, options.onActiveChainsUpdated, "f");
87
89
  __classPrivateFieldSet(this, _RpcDataSource_timeout, options.timeout ?? 10000, "f");
88
- __classPrivateFieldSet(this, _RpcDataSource_tokenDetectionEnabled, options.tokenDetectionEnabled ?? false, "f");
90
+ __classPrivateFieldSet(this, _RpcDataSource_tokenDetectionEnabled, options.tokenDetectionEnabled ?? (() => true), "f");
91
+ __classPrivateFieldSet(this, _RpcDataSource_useExternalService, options.useExternalService ?? (() => true), "f");
89
92
  const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL;
90
93
  const detectionInterval = options.detectionInterval ?? DEFAULT_DETECTION_INTERVAL;
91
94
  log('Initializing RpcDataSource', {
92
95
  timeout: __classPrivateFieldGet(this, _RpcDataSource_timeout, "f"),
93
96
  balanceInterval,
94
97
  detectionInterval,
95
- tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f"),
98
+ tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this),
99
+ useExternalService: __classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this),
96
100
  });
97
101
  // Initialize MulticallClient with a provider getter
98
102
  __classPrivateFieldSet(this, _RpcDataSource_multicallClient, new evm_rpc_services_1.MulticallClient((hexChainId) => {
@@ -101,7 +105,7 @@ class RpcDataSource extends base_controller_1.BaseController {
101
105
  // Create messenger adapters for BalanceFetcher and TokenDetector
102
106
  const balanceFetcherMessenger = {
103
107
  call: (_action) => {
104
- const state = this.messenger.call('AssetsController:getState');
108
+ const state = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:getState');
105
109
  return {
106
110
  assetsBalance: (state.assetsBalance ?? {}),
107
111
  };
@@ -109,17 +113,21 @@ class RpcDataSource extends base_controller_1.BaseController {
109
113
  };
110
114
  const tokenDetectorMessenger = {
111
115
  call: (_action) => {
112
- return this.messenger.call('TokenListController:getState');
116
+ return __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('TokenListController:getState');
113
117
  },
114
118
  };
115
119
  // Initialize BalanceFetcher with polling interval
116
120
  __classPrivateFieldSet(this, _RpcDataSource_balanceFetcher, new evm_rpc_services_1.BalanceFetcher(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), balanceFetcherMessenger, { pollingInterval: balanceInterval }), "f");
117
121
  __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setOnBalanceUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleBalanceUpdate).bind(this));
118
122
  // Initialize TokenDetector with polling interval
119
- __classPrivateFieldSet(this, _RpcDataSource_tokenDetector, new evm_rpc_services_1.TokenDetector(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), tokenDetectorMessenger, { pollingInterval: detectionInterval }), "f");
123
+ __classPrivateFieldSet(this, _RpcDataSource_tokenDetector, new evm_rpc_services_1.TokenDetector(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), tokenDetectorMessenger, {
124
+ pollingInterval: detectionInterval,
125
+ tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f"),
126
+ useExternalService: __classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f"),
127
+ }), "f");
120
128
  __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setOnDetectionUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleDetectionUpdate).bind(this));
121
- __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_registerActionHandlers).call(this);
122
129
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_subscribeToNetworkController).call(this);
130
+ __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_subscribeToTransactionEvents).call(this);
123
131
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_initializeFromNetworkController).call(this);
124
132
  }
125
133
  /**
@@ -127,17 +135,6 @@ class RpcDataSource extends base_controller_1.BaseController {
127
135
  *
128
136
  * @returns The name of this data source.
129
137
  */
130
- getName() {
131
- return this.name;
132
- }
133
- /**
134
- * Get currently active chains.
135
- *
136
- * @returns Promise resolving to array of active chain IDs.
137
- */
138
- async getActiveChains() {
139
- return __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f");
140
- }
141
138
  /**
142
139
  * Get the status of all configured chains.
143
140
  *
@@ -193,7 +190,7 @@ class RpcDataSource extends base_controller_1.BaseController {
193
190
  const response = {};
194
191
  const chainsToFetch = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
195
192
  log('Fetch requested', {
196
- accounts: request.accounts.map((a) => a.id),
193
+ accounts: request.accountsWithSupportedChains.map((a) => a.account.id),
197
194
  requestedChains: request.chainIds,
198
195
  chainsToFetch,
199
196
  });
@@ -202,16 +199,17 @@ class RpcDataSource extends base_controller_1.BaseController {
202
199
  return response;
203
200
  }
204
201
  const assetsBalance = {};
205
- const assetsMetadata = {};
202
+ const assetsInfo = {};
206
203
  const failedChains = [];
207
- // Fetch balances for each chain using BalanceFetcher
208
- for (const chainId of chainsToFetch) {
209
- const hexChainId = (0, exports.caipChainIdToHex)(chainId);
210
- for (const account of request.accounts) {
211
- if (!__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_accountSupportsChain).call(this, account, chainId)) {
212
- continue;
213
- }
214
- const { address, id: accountId } = account;
204
+ // Fetch balances for each account and its supported chains (pre-computed in request)
205
+ for (const { account, supportedChains, } of request.accountsWithSupportedChains) {
206
+ const chainsForAccount = chainsToFetch.filter((chain) => supportedChains.includes(chain));
207
+ if (chainsForAccount.length === 0) {
208
+ continue;
209
+ }
210
+ const { address, id: accountId } = account;
211
+ for (const chainId of chainsForAccount) {
212
+ const hexChainId = (0, exports.caipChainIdToHex)(chainId);
215
213
  try {
216
214
  // Use BalanceFetcher for batched balance fetching
217
215
  const result = await __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").fetchBalancesForTokens(hexChainId, accountId, address, [], // Empty array means just native token
@@ -221,10 +219,10 @@ class RpcDataSource extends base_controller_1.BaseController {
221
219
  }
222
220
  // Collect metadata for all balances
223
221
  const balanceMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, chainId);
224
- Object.assign(assetsMetadata, balanceMetadata);
222
+ Object.assign(assetsInfo, balanceMetadata);
225
223
  // Convert balances to human-readable format
226
224
  for (const balance of result.balances) {
227
- const metadata = assetsMetadata[balance.assetId];
225
+ const metadata = assetsInfo[balance.assetId];
228
226
  // Default to 18 decimals (ERC20 standard) for consistent human-readable format
229
227
  const decimals = metadata?.decimals ?? 18;
230
228
  const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
@@ -243,7 +241,7 @@ class RpcDataSource extends base_controller_1.BaseController {
243
241
  // Even on error, include native token metadata
244
242
  const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
245
243
  if (chainStatus) {
246
- assetsMetadata[nativeAssetId] = {
244
+ assetsInfo[nativeAssetId] = {
247
245
  type: 'native',
248
246
  symbol: chainStatus.nativeCurrency,
249
247
  name: chainStatus.nativeCurrency,
@@ -274,8 +272,8 @@ class RpcDataSource extends base_controller_1.BaseController {
274
272
  }
275
273
  response.assetsBalance = assetsBalance;
276
274
  // Include metadata for native tokens if we have any
277
- if (Object.keys(assetsMetadata).length > 0) {
278
- response.assetsMetadata = assetsMetadata;
275
+ if (Object.keys(assetsInfo).length > 0) {
276
+ response.assetsInfo = assetsInfo;
279
277
  }
280
278
  return response;
281
279
  }
@@ -287,14 +285,17 @@ class RpcDataSource extends base_controller_1.BaseController {
287
285
  * @returns Promise resolving to a DataResponse with detected assets.
288
286
  */
289
287
  async detectTokens(chainId, account) {
290
- if (!__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f")) {
288
+ if (!__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this) || !__classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this)) {
291
289
  return {};
292
290
  }
293
291
  const hexChainId = (0, exports.caipChainIdToHex)(chainId);
294
292
  const { address, id: accountId } = account;
295
293
  log('Running token detection', { chainId, accountId });
296
294
  try {
297
- const result = await __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").detectTokens(hexChainId, accountId, address);
295
+ const result = await __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").detectTokens(hexChainId, accountId, address, {
296
+ tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this),
297
+ useExternalService: __classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this),
298
+ });
298
299
  if (result.detectedAssets.length === 0) {
299
300
  log('No new tokens detected');
300
301
  return {};
@@ -306,11 +307,11 @@ class RpcDataSource extends base_controller_1.BaseController {
306
307
  });
307
308
  // Convert detected assets to DataResponse format
308
309
  const balances = {};
309
- const assetsMetadata = {};
310
+ const assetsInfo = {};
310
311
  // Build metadata from detected assets
311
312
  for (const asset of result.detectedAssets) {
312
313
  if (asset.symbol && asset.decimals !== undefined) {
313
- assetsMetadata[asset.assetId] = {
314
+ assetsInfo[asset.assetId] = {
314
315
  type: 'erc20',
315
316
  symbol: asset.symbol,
316
317
  name: asset.name ?? asset.symbol,
@@ -338,8 +339,8 @@ class RpcDataSource extends base_controller_1.BaseController {
338
339
  },
339
340
  };
340
341
  // Include metadata if we have any
341
- if (Object.keys(assetsMetadata).length > 0) {
342
- response.assetsMetadata = assetsMetadata;
342
+ if (Object.keys(assetsInfo).length > 0) {
343
+ response.assetsInfo = assetsInfo;
343
344
  }
344
345
  return response;
345
346
  }
@@ -359,7 +360,7 @@ class RpcDataSource extends base_controller_1.BaseController {
359
360
  let successfullyHandledChains = [];
360
361
  log('Middleware fetching', {
361
362
  chains: supportedChains,
362
- accounts: request.accounts.map((a) => a.id),
363
+ accounts: request.accountsWithSupportedChains.map((a) => a.account.id),
363
364
  });
364
365
  const response = await this.fetch({
365
366
  ...request,
@@ -375,11 +376,11 @@ class RpcDataSource extends base_controller_1.BaseController {
375
376
  };
376
377
  }
377
378
  }
378
- if (response.assetsMetadata) {
379
- (_c = context.response).assetsMetadata ?? (_c.assetsMetadata = {});
380
- context.response.assetsMetadata = {
381
- ...context.response.assetsMetadata,
382
- ...response.assetsMetadata,
379
+ if (response.assetsInfo) {
380
+ (_c = context.response).assetsInfo ?? (_c.assetsInfo = {});
381
+ context.response.assetsInfo = {
382
+ ...context.response.assetsInfo,
383
+ ...response.assetsInfo,
383
384
  };
384
385
  }
385
386
  const failedChains = new Set(Object.keys(response.errors ?? {}));
@@ -409,7 +410,7 @@ class RpcDataSource extends base_controller_1.BaseController {
409
410
  log('Subscribe requested', {
410
411
  subscriptionId,
411
412
  isUpdate,
412
- accounts: request.accounts.map((a) => a.id),
413
+ accounts: request.accountsWithSupportedChains.map((a) => a.account.id),
413
414
  chainsToSubscribe,
414
415
  });
415
416
  if (chainsToSubscribe.length === 0) {
@@ -430,16 +431,17 @@ class RpcDataSource extends base_controller_1.BaseController {
430
431
  }
431
432
  // Clean up existing subscription (stops old polling)
432
433
  await this.unsubscribe(subscriptionId);
433
- // Start polling through BalanceFetcher and TokenDetector
434
+ // Start polling through BalanceFetcher and TokenDetector (use pre-computed supportedChains per account)
434
435
  const balancePollingTokens = [];
435
436
  const detectionPollingTokens = [];
436
- for (const chainId of chainsToSubscribe) {
437
- const hexChainId = (0, exports.caipChainIdToHex)(chainId);
438
- for (const account of request.accounts) {
439
- if (!__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_accountSupportsChain).call(this, account, chainId)) {
440
- continue;
441
- }
442
- const { address, id: accountId } = account;
437
+ for (const { account, supportedChains, } of request.accountsWithSupportedChains) {
438
+ const chainsForAccount = chainsToSubscribe.filter((chain) => supportedChains.includes(chain));
439
+ if (chainsForAccount.length === 0) {
440
+ continue;
441
+ }
442
+ const { address, id: accountId } = account;
443
+ for (const chainId of chainsForAccount) {
444
+ const hexChainId = (0, exports.caipChainIdToHex)(chainId);
443
445
  // Start balance polling
444
446
  const balanceInput = {
445
447
  chainId: hexChainId,
@@ -448,8 +450,8 @@ class RpcDataSource extends base_controller_1.BaseController {
448
450
  };
449
451
  const balanceToken = __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").startPolling(balanceInput);
450
452
  balancePollingTokens.push(balanceToken);
451
- // Start detection polling if enabled
452
- if (__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f")) {
453
+ // Start detection polling if enabled and external services allowed
454
+ if (__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this) && __classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this)) {
453
455
  const detectionInput = {
454
456
  chainId: hexChainId,
455
457
  accountId,
@@ -461,11 +463,13 @@ class RpcDataSource extends base_controller_1.BaseController {
461
463
  }
462
464
  }
463
465
  // Store subscription data
466
+ const accounts = request.accountsWithSupportedChains.map((entry) => entry.account);
464
467
  __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").set(subscriptionId, {
465
468
  balancePollingTokens,
466
469
  detectionPollingTokens,
467
470
  chains: chainsToSubscribe,
468
- accounts: request.accounts,
471
+ accounts,
472
+ onAssetsUpdate: subscriptionRequest.onAssetsUpdate,
469
473
  });
470
474
  log('Subscription SUCCESS', {
471
475
  subscriptionId,
@@ -499,6 +503,8 @@ class RpcDataSource extends base_controller_1.BaseController {
499
503
  */
500
504
  destroy() {
501
505
  log('Destroying RpcDataSource');
506
+ __classPrivateFieldGet(this, _RpcDataSource_unsubscribeTransactionConfirmed, "f")?.call(this);
507
+ __classPrivateFieldGet(this, _RpcDataSource_unsubscribeIncomingTransactions, "f")?.call(this);
502
508
  // Stop all polling
503
509
  __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").stopAllPolling();
504
510
  __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").stopAllPolling();
@@ -509,19 +515,19 @@ class RpcDataSource extends base_controller_1.BaseController {
509
515
  }
510
516
  }
511
517
  exports.RpcDataSource = RpcDataSource;
512
- _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) {
518
+ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated = new WeakMap(), _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = new WeakMap(), _RpcDataSource_useExternalService = new WeakMap(), _RpcDataSource_activeChains = new WeakMap(), _RpcDataSource_chainStatuses = new WeakMap(), _RpcDataSource_providerCache = new WeakMap(), _RpcDataSource_activeSubscriptions = new WeakMap(), _RpcDataSource_unsubscribeTransactionConfirmed = new WeakMap(), _RpcDataSource_unsubscribeIncomingTransactions = 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) {
513
519
  const rawAmount = new bignumber_js_1.default(rawBalance);
514
520
  const divisor = new bignumber_js_1.default(10).pow(decimals);
515
521
  return rawAmount.dividedBy(divisor).toString();
516
522
  }, _RpcDataSource_collectMetadataForBalances = function _RpcDataSource_collectMetadataForBalances(balances, chainId) {
517
- const assetsMetadata = {};
523
+ const assetsInfo = {};
518
524
  const existingMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getExistingAssetsMetadata).call(this);
519
525
  for (const balance of balances) {
520
526
  const isNative = balance.assetId.includes('/slip44:');
521
527
  if (isNative) {
522
528
  const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
523
529
  if (chainStatus) {
524
- assetsMetadata[balance.assetId] = {
530
+ assetsInfo[balance.assetId] = {
525
531
  type: 'native',
526
532
  symbol: chainStatus.nativeCurrency,
527
533
  name: chainStatus.nativeCurrency,
@@ -533,19 +539,19 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
533
539
  // For ERC20 tokens, try existing metadata from state first
534
540
  const existingMeta = existingMetadata[balance.assetId];
535
541
  if (existingMeta) {
536
- assetsMetadata[balance.assetId] = existingMeta;
542
+ assetsInfo[balance.assetId] = existingMeta;
537
543
  }
538
544
  else {
539
545
  // Fallback to token list if not in state
540
546
  const tokenListMeta = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getTokenMetadataFromTokenList).call(this, balance.assetId);
541
547
  if (tokenListMeta) {
542
- assetsMetadata[balance.assetId] = tokenListMeta;
548
+ assetsInfo[balance.assetId] = tokenListMeta;
543
549
  }
544
550
  else {
545
551
  // Default metadata for unknown ERC20 tokens.
546
552
  // Use 18 decimals (the standard for most ERC20 tokens)
547
553
  // to ensure consistent human-readable balance format.
548
- assetsMetadata[balance.assetId] = {
554
+ assetsInfo[balance.assetId] = {
549
555
  type: 'erc20',
550
556
  symbol: '',
551
557
  name: '',
@@ -555,17 +561,17 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
555
561
  }
556
562
  }
557
563
  }
558
- return assetsMetadata;
564
+ return assetsInfo;
559
565
  }, _RpcDataSource_handleBalanceUpdate = function _RpcDataSource_handleBalanceUpdate(result) {
560
566
  const newBalances = {};
561
567
  // Convert hex chain ID to CAIP-2 format
562
568
  const chainIdDecimal = parseInt(result.chainId, 16);
563
569
  const caipChainId = `eip155:${chainIdDecimal}`;
564
570
  // Collect metadata for all balances
565
- const assetsMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, caipChainId);
571
+ const assetsInfo = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, caipChainId);
566
572
  // Convert balances to human-readable format using metadata
567
573
  for (const balance of result.balances) {
568
- const metadata = assetsMetadata[balance.assetId];
574
+ const metadata = assetsInfo[balance.assetId];
569
575
  // Default to 18 decimals (ERC20 standard) for consistent human-readable format
570
576
  const decimals = metadata?.decimals ?? 18;
571
577
  const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
@@ -579,17 +585,17 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
579
585
  assetsBalance: {
580
586
  [result.accountId]: newBalances,
581
587
  },
582
- assetsMetadata,
588
+ assetsInfo,
583
589
  };
584
590
  log('Balance update response', {
585
591
  accountId: result.accountId,
586
592
  newBalanceCount: Object.keys(newBalances).length,
587
593
  });
588
- this.messenger
589
- .call('AssetsController:assetsUpdate', response, CONTROLLER_NAME)
590
- .catch((error) => {
591
- log('Failed to update assets', { error });
592
- });
594
+ for (const subscription of __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").values()) {
595
+ subscription.onAssetsUpdate(response)?.catch((error) => {
596
+ log('Failed to update assets', { error });
597
+ });
598
+ }
593
599
  }, _RpcDataSource_handleDetectionUpdate = function _RpcDataSource_handleDetectionUpdate(result) {
594
600
  log('Detected new tokens', {
595
601
  count: result.detectedAssets.length,
@@ -630,37 +636,93 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
630
636
  detectedAssets: {
631
637
  [result.accountId]: result.detectedAssets.map((asset) => asset.assetId),
632
638
  },
633
- assetsMetadata: newMetadata,
639
+ assetsInfo: newMetadata,
634
640
  assetsBalance: {
635
641
  [result.accountId]: newBalances,
636
642
  },
637
643
  };
638
- this.messenger
639
- .call('AssetsController:assetsUpdate', response, CONTROLLER_NAME)
640
- .catch((error) => {
641
- log('Failed to update detected assets', { error });
642
- });
643
- }, _RpcDataSource_registerActionHandlers = function _RpcDataSource_registerActionHandlers() {
644
- const getAssetsMiddlewareHandler = () => this.assetsMiddleware;
645
- const getActiveChainsHandler = async () => this.getActiveChains();
646
- const fetchHandler = async (request) => this.fetch(request);
647
- const subscribeHandler = async (request) => this.subscribe(request);
648
- const unsubscribeHandler = async (subscriptionId) => this.unsubscribe(subscriptionId);
649
- this.messenger.registerActionHandler('RpcDataSource:getAssetsMiddleware', getAssetsMiddlewareHandler);
650
- this.messenger.registerActionHandler('RpcDataSource:getActiveChains', getActiveChainsHandler);
651
- this.messenger.registerActionHandler('RpcDataSource:fetch', fetchHandler);
652
- this.messenger.registerActionHandler('RpcDataSource:subscribe', subscribeHandler);
653
- this.messenger.registerActionHandler('RpcDataSource:unsubscribe', unsubscribeHandler);
644
+ for (const subscription of __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").values()) {
645
+ subscription.onAssetsUpdate(response)?.catch((error) => {
646
+ log('Failed to update detected assets', { error });
647
+ });
648
+ }
654
649
  }, _RpcDataSource_subscribeToNetworkController = function _RpcDataSource_subscribeToNetworkController() {
655
- this.messenger.subscribe('NetworkController:stateChange', (networkState) => {
650
+ __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").subscribe('NetworkController:stateChange', (networkState) => {
656
651
  log('NetworkController state changed');
657
652
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_clearProviderCache).call(this);
658
653
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_updateFromNetworkState).call(this, networkState);
659
654
  });
655
+ }, _RpcDataSource_subscribeToTransactionEvents = function _RpcDataSource_subscribeToTransactionEvents() {
656
+ const unsubConfirmed = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").subscribe('TransactionController:transactionConfirmed', __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_onTransactionConfirmed).bind(this));
657
+ __classPrivateFieldSet(this, _RpcDataSource_unsubscribeTransactionConfirmed, typeof unsubConfirmed === 'function' ? unsubConfirmed : undefined, "f");
658
+ const unsubIncoming = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").subscribe('TransactionController:incomingTransactionsReceived', __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_onIncomingTransactions).bind(this));
659
+ __classPrivateFieldSet(this, _RpcDataSource_unsubscribeIncomingTransactions, typeof unsubIncoming === 'function' ? unsubIncoming : undefined, "f");
660
+ }, _RpcDataSource_onTransactionConfirmed = function _RpcDataSource_onTransactionConfirmed(payload) {
661
+ const hexChainId = payload?.chainId;
662
+ if (!hexChainId) {
663
+ return;
664
+ }
665
+ const caipChainId = `eip155:${parseInt(hexChainId, 16)}`;
666
+ __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_refreshBalanceForChains).call(this, [caipChainId]).catch((error) => {
667
+ log('Failed to refresh balance after transaction confirmed', { error });
668
+ });
669
+ }, _RpcDataSource_onIncomingTransactions = function _RpcDataSource_onIncomingTransactions(payload) {
670
+ const chainIds = Array.from(new Set((payload ?? [])
671
+ .map((item) => item?.chainId)
672
+ .filter((id) => Boolean(id))));
673
+ const caipChainIds = chainIds.map((hexChainId) => `eip155:${parseInt(hexChainId, 16)}`);
674
+ const toRefresh = caipChainIds.length > 0 ? caipChainIds : [...__classPrivateFieldGet(this, _RpcDataSource_activeChains, "f")];
675
+ __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_refreshBalanceForChains).call(this, toRefresh).catch((error) => {
676
+ log('Failed to refresh balance after incoming transactions', { error });
677
+ });
678
+ }, _RpcDataSource_refreshBalanceForChains =
679
+ /**
680
+ * Fetch balances for the given chains across all active subscriptions and
681
+ * push updates to the controller.
682
+ *
683
+ * @param chainIds - CAIP-2 chain IDs to refresh.
684
+ */
685
+ async function _RpcDataSource_refreshBalanceForChains(chainIds) {
686
+ const chainIdsSet = new Set(chainIds);
687
+ const chainsToFetch = chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
688
+ if (chainsToFetch.length === 0) {
689
+ return;
690
+ }
691
+ for (const subscription of __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").values()) {
692
+ const subscriptionChains = subscription.chains.filter((chainId) => chainIdsSet.has(chainId));
693
+ if (subscriptionChains.length === 0) {
694
+ continue;
695
+ }
696
+ const request = {
697
+ accountsWithSupportedChains: subscription.accounts.map((account) => ({
698
+ account,
699
+ supportedChains: subscriptionChains,
700
+ })),
701
+ chainIds: subscriptionChains,
702
+ dataTypes: ['balance'],
703
+ };
704
+ try {
705
+ const response = await this.fetch(request);
706
+ if (response.assetsBalance &&
707
+ Object.keys(response.assetsBalance).length > 0) {
708
+ subscription.onAssetsUpdate(response)?.catch((error) => {
709
+ log('Failed to report balance update after transaction', {
710
+ error,
711
+ });
712
+ });
713
+ }
714
+ }
715
+ catch (error) {
716
+ log('Failed to fetch balance after transaction', {
717
+ chains: subscriptionChains,
718
+ error,
719
+ });
720
+ }
721
+ }
660
722
  }, _RpcDataSource_initializeFromNetworkController = function _RpcDataSource_initializeFromNetworkController() {
661
723
  log('Initializing from NetworkController');
662
724
  try {
663
- const networkState = this.messenger.call('NetworkController:getState');
725
+ const networkState = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('NetworkController:getState');
664
726
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_updateFromNetworkState).call(this, networkState);
665
727
  }
666
728
  catch (error) {
@@ -696,14 +758,18 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
696
758
  activeChains,
697
759
  });
698
760
  // Check if chains changed
699
- const previousChains = new Set(__classPrivateFieldGet(this, _RpcDataSource_activeChains, "f"));
700
- const hasChanges = previousChains.size !== activeChains.length ||
701
- activeChains.some((chain) => !previousChains.has(chain));
702
- // Update internal state
761
+ const previousChains = [...__classPrivateFieldGet(this, _RpcDataSource_activeChains, "f")];
762
+ const previousSet = new Set(previousChains);
763
+ const hasChanges = previousChains.length !== activeChains.length ||
764
+ activeChains.some((chain) => !previousSet.has(chain));
765
+ // Update internal state and data source state before notifying, so that
766
+ // when the controller handles the callback and calls getActiveChainsSync(),
767
+ // it receives the updated chains (same order as AbstractDataSource.updateActiveChains).
703
768
  __classPrivateFieldSet(this, _RpcDataSource_chainStatuses, chainStatuses, "f");
704
769
  __classPrivateFieldSet(this, _RpcDataSource_activeChains, activeChains, "f");
770
+ this.state.activeChains = activeChains;
705
771
  if (hasChanges) {
706
- this.messenger.call('AssetsController:activeChainsUpdate', CONTROLLER_NAME, activeChains);
772
+ __classPrivateFieldGet(this, _RpcDataSource_onActiveChainsUpdated, "f").call(this, this.getName(), activeChains, previousChains);
707
773
  }
708
774
  }, _RpcDataSource_getProvider = function _RpcDataSource_getProvider(chainId) {
709
775
  const cached = __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").get(chainId);
@@ -715,7 +781,10 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
715
781
  return undefined;
716
782
  }
717
783
  try {
718
- const networkClient = this.messenger.call('NetworkController:getNetworkClientById', chainStatus.networkClientId);
784
+ const networkClient = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('NetworkController:getNetworkClientById', chainStatus.networkClientId);
785
+ if (!networkClient?.provider) {
786
+ return undefined;
787
+ }
719
788
  const web3Provider = new providers_1.Web3Provider(networkClient.provider);
720
789
  __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").set(chainId, web3Provider);
721
790
  return web3Provider;
@@ -745,39 +814,14 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
745
814
  };
746
815
  }, _RpcDataSource_clearProviderCache = function _RpcDataSource_clearProviderCache() {
747
816
  __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").clear();
748
- }, _RpcDataSource_accountSupportsChain = function _RpcDataSource_accountSupportsChain(account, chainId) {
749
- const scopes = account.scopes ?? [];
750
- if (scopes.length === 0) {
751
- return true;
752
- }
753
- const [chainNamespace, chainReference] = chainId.split(':');
754
- for (const scope of scopes) {
755
- const [scopeNamespace, scopeReference] = scope.split(':');
756
- if (scopeNamespace !== chainNamespace) {
757
- continue;
758
- }
759
- // Wildcard scope (e.g., eip155:0) matches all chains in the namespace
760
- if (scopeReference === '0') {
761
- return true;
762
- }
763
- // RpcDataSource only handles eip155 (EVM) chains
764
- // Normalize hex chain references (e.g., 0x1 -> 1) for comparison
765
- const normalizedScopeRef = scopeReference?.startsWith('0x')
766
- ? parseInt(scopeReference, 16).toString()
767
- : scopeReference;
768
- if (normalizedScopeRef === chainReference) {
769
- return true;
770
- }
771
- }
772
- return false;
773
817
  }, _RpcDataSource_buildNativeAssetId = function _RpcDataSource_buildNativeAssetId(chainId) {
774
- const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');
818
+ const { nativeAssetIdentifiers } = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('NetworkEnablementController:getState');
775
819
  return (nativeAssetIdentifiers[chainId] ??
776
820
  `${chainId}/slip44:60`);
777
821
  }, _RpcDataSource_getExistingAssetsMetadata = function _RpcDataSource_getExistingAssetsMetadata() {
778
822
  try {
779
- const state = this.messenger.call('AssetsController:getState');
780
- return (state.assetsMetadata ?? {});
823
+ const state = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:getState');
824
+ return state.assetsInfo ?? {};
781
825
  }
782
826
  catch {
783
827
  // If AssetsController:getState fails, return empty metadata
@@ -785,17 +829,15 @@ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = n
785
829
  }
786
830
  }, _RpcDataSource_getTokenMetadataFromTokenList = function _RpcDataSource_getTokenMetadataFromTokenList(assetId) {
787
831
  try {
788
- // Parse asset ID to get chain and token address
789
- // Format: eip155:{chainId}/erc20:{address}
790
- const [chainPart, assetPart] = assetId.split('/');
791
- if (!assetPart?.startsWith('erc20:')) {
832
+ const parsed = (0, utils_1.parseCaipAssetType)(assetId);
833
+ if (parsed.assetNamespace !== 'erc20') {
792
834
  return undefined;
793
835
  }
794
- const tokenAddress = assetPart.slice(6); // Remove 'erc20:' prefix
795
- const chainIdDecimal = chainPart.split(':')[1];
796
- const hexChainId = `0x${parseInt(chainIdDecimal, 10).toString(16)}`;
797
- const tokenListState = this.messenger.call('TokenListController:getState');
798
- const chainCacheEntry = tokenListState.tokensChainsCache[hexChainId];
836
+ const tokenAddress = parsed.assetReference;
837
+ const { reference } = (0, utils_1.parseCaipChainId)(parsed.chainId);
838
+ const hexChainId = (0, utils_1.numberToHex)(parseInt(reference, 10));
839
+ const tokenListState = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('TokenListController:getState');
840
+ const chainCacheEntry = tokenListState?.tokensChainsCache?.[hexChainId];
799
841
  const chainTokenList = chainCacheEntry?.data;
800
842
  if (!chainTokenList) {
801
843
  return undefined;