@metamask/assets-controller 1.0.0 → 2.0.1

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 (166) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/dist/AssetsController.cjs +175 -64
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +68 -9
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +68 -9
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +176 -65
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/AccountsApiDataSource.cjs +70 -15
  11. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
  12. package/dist/data-sources/AccountsApiDataSource.d.cts +22 -3
  13. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
  14. package/dist/data-sources/AccountsApiDataSource.d.mts +22 -3
  15. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
  16. package/dist/data-sources/AccountsApiDataSource.mjs +66 -12
  17. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
  18. package/dist/data-sources/BackendWebsocketDataSource.cjs +7 -5
  19. package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
  20. package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
  21. package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
  22. package/dist/data-sources/BackendWebsocketDataSource.mjs +7 -5
  23. package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
  24. package/dist/data-sources/PriceDataSource.cjs +17 -4
  25. package/dist/data-sources/PriceDataSource.cjs.map +1 -1
  26. package/dist/data-sources/PriceDataSource.d.cts +8 -4
  27. package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
  28. package/dist/data-sources/PriceDataSource.d.mts +8 -4
  29. package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
  30. package/dist/data-sources/PriceDataSource.mjs +17 -4
  31. package/dist/data-sources/PriceDataSource.mjs.map +1 -1
  32. package/dist/data-sources/RpcDataSource.cjs +123 -44
  33. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  34. package/dist/data-sources/RpcDataSource.d.cts +16 -62
  35. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  36. package/dist/data-sources/RpcDataSource.d.mts +16 -62
  37. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  38. package/dist/data-sources/RpcDataSource.mjs +124 -45
  39. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  40. package/dist/data-sources/SnapDataSource.cjs +22 -10
  41. package/dist/data-sources/SnapDataSource.cjs.map +1 -1
  42. package/dist/data-sources/SnapDataSource.d.cts +2 -1
  43. package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
  44. package/dist/data-sources/SnapDataSource.d.mts +2 -1
  45. package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
  46. package/dist/data-sources/SnapDataSource.mjs +22 -10
  47. package/dist/data-sources/SnapDataSource.mjs.map +1 -1
  48. package/dist/data-sources/StakedBalanceDataSource.cjs +597 -0
  49. package/dist/data-sources/StakedBalanceDataSource.cjs.map +1 -0
  50. package/dist/data-sources/StakedBalanceDataSource.d.cts +72 -0
  51. package/dist/data-sources/StakedBalanceDataSource.d.cts.map +1 -0
  52. package/dist/data-sources/StakedBalanceDataSource.d.mts +72 -0
  53. package/dist/data-sources/StakedBalanceDataSource.d.mts.map +1 -0
  54. package/dist/data-sources/StakedBalanceDataSource.mjs +593 -0
  55. package/dist/data-sources/StakedBalanceDataSource.mjs.map +1 -0
  56. package/dist/data-sources/TokenDataSource.cjs +12 -5
  57. package/dist/data-sources/TokenDataSource.cjs.map +1 -1
  58. package/dist/data-sources/TokenDataSource.d.cts +1 -0
  59. package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
  60. package/dist/data-sources/TokenDataSource.d.mts +1 -0
  61. package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
  62. package/dist/data-sources/TokenDataSource.mjs +12 -5
  63. package/dist/data-sources/TokenDataSource.mjs.map +1 -1
  64. package/dist/data-sources/evm-rpc-services/index.cjs +5 -1
  65. package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -1
  66. package/dist/data-sources/evm-rpc-services/index.d.cts +1 -1
  67. package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -1
  68. package/dist/data-sources/evm-rpc-services/index.d.mts +1 -1
  69. package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -1
  70. package/dist/data-sources/evm-rpc-services/index.mjs +1 -1
  71. package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -1
  72. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs +132 -0
  73. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs.map +1 -0
  74. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts +80 -0
  75. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts.map +1 -0
  76. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts +80 -0
  77. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts.map +1 -0
  78. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs +126 -0
  79. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs.map +1 -0
  80. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +16 -0
  81. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -1
  82. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +5 -1
  83. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -1
  84. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +5 -1
  85. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -1
  86. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +16 -0
  87. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -1
  88. package/dist/data-sources/evm-rpc-services/services/index.cjs +6 -1
  89. package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -1
  90. package/dist/data-sources/evm-rpc-services/services/index.d.cts +1 -0
  91. package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -1
  92. package/dist/data-sources/evm-rpc-services/services/index.d.mts +1 -0
  93. package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -1
  94. package/dist/data-sources/evm-rpc-services/services/index.mjs +1 -0
  95. package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -1
  96. package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -1
  97. package/dist/data-sources/evm-rpc-services/types/services.d.cts +4 -0
  98. package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -1
  99. package/dist/data-sources/evm-rpc-services/types/services.d.mts +4 -0
  100. package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -1
  101. package/dist/data-sources/evm-rpc-services/types/services.mjs.map +1 -1
  102. package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -1
  103. package/dist/data-sources/evm-rpc-services/types/state.d.cts +3 -3
  104. package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -1
  105. package/dist/data-sources/evm-rpc-services/types/state.d.mts +3 -3
  106. package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -1
  107. package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -1
  108. package/dist/data-sources/evm-rpc-services/utils/index.cjs +9 -1
  109. package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -1
  110. package/dist/data-sources/evm-rpc-services/utils/index.d.cts +2 -0
  111. package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -1
  112. package/dist/data-sources/evm-rpc-services/utils/index.d.mts +2 -0
  113. package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -1
  114. package/dist/data-sources/evm-rpc-services/utils/index.mjs +2 -0
  115. package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -1
  116. package/dist/data-sources/evm-rpc-services/utils/parsing.cjs +47 -0
  117. package/dist/data-sources/evm-rpc-services/utils/parsing.cjs.map +1 -0
  118. package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts +25 -0
  119. package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts.map +1 -0
  120. package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts +25 -0
  121. package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts.map +1 -0
  122. package/dist/data-sources/evm-rpc-services/utils/parsing.mjs +39 -0
  123. package/dist/data-sources/evm-rpc-services/utils/parsing.mjs.map +1 -0
  124. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs +68 -0
  125. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs.map +1 -0
  126. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts +25 -0
  127. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts.map +1 -0
  128. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts +25 -0
  129. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts.map +1 -0
  130. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs +62 -0
  131. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs.map +1 -0
  132. package/dist/data-sources/index.cjs +3 -1
  133. package/dist/data-sources/index.cjs.map +1 -1
  134. package/dist/data-sources/index.d.cts +3 -2
  135. package/dist/data-sources/index.d.cts.map +1 -1
  136. package/dist/data-sources/index.d.mts +3 -2
  137. package/dist/data-sources/index.d.mts.map +1 -1
  138. package/dist/data-sources/index.mjs +1 -0
  139. package/dist/data-sources/index.mjs.map +1 -1
  140. package/dist/index.cjs.map +1 -1
  141. package/dist/index.d.cts +3 -3
  142. package/dist/index.d.cts.map +1 -1
  143. package/dist/index.d.mts +3 -3
  144. package/dist/index.d.mts.map +1 -1
  145. package/dist/index.mjs.map +1 -1
  146. package/dist/middlewares/DetectionMiddleware.cjs +4 -1
  147. package/dist/middlewares/DetectionMiddleware.cjs.map +1 -1
  148. package/dist/middlewares/DetectionMiddleware.d.cts +1 -0
  149. package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -1
  150. package/dist/middlewares/DetectionMiddleware.d.mts +1 -0
  151. package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -1
  152. package/dist/middlewares/DetectionMiddleware.mjs +4 -1
  153. package/dist/middlewares/DetectionMiddleware.mjs.map +1 -1
  154. package/dist/selectors/balance.cjs +2 -2
  155. package/dist/selectors/balance.cjs.map +1 -1
  156. package/dist/selectors/balance.d.cts.map +1 -1
  157. package/dist/selectors/balance.d.mts.map +1 -1
  158. package/dist/selectors/balance.mjs +2 -2
  159. package/dist/selectors/balance.mjs.map +1 -1
  160. package/dist/types.cjs.map +1 -1
  161. package/dist/types.d.cts +3 -3
  162. package/dist/types.d.cts.map +1 -1
  163. package/dist/types.d.mts +3 -3
  164. package/dist/types.d.mts.map +1 -1
  165. package/dist/types.mjs.map +1 -1
  166. package/package.json +17 -12
@@ -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_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_subscribeToNetworkController, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_getMulticallProvider, _RpcDataSource_clearProviderCache, _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");
@@ -69,6 +69,7 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
69
69
  _RpcDataSource_onActiveChainsUpdated.set(this, void 0);
70
70
  _RpcDataSource_timeout.set(this, void 0);
71
71
  _RpcDataSource_tokenDetectionEnabled.set(this, void 0);
72
+ _RpcDataSource_useExternalService.set(this, void 0);
72
73
  /** Currently active chains */
73
74
  _RpcDataSource_activeChains.set(this, []);
74
75
  /** Network status for each active chain */
@@ -77,6 +78,8 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
77
78
  _RpcDataSource_providerCache.set(this, new Map());
78
79
  /** Active subscriptions by ID */
79
80
  _RpcDataSource_activeSubscriptions.set(this, new Map());
81
+ _RpcDataSource_unsubscribeTransactionConfirmed.set(this, undefined);
82
+ _RpcDataSource_unsubscribeIncomingTransactions.set(this, undefined);
80
83
  // Rpc-datasource components
81
84
  _RpcDataSource_multicallClient.set(this, void 0);
82
85
  _RpcDataSource_balanceFetcher.set(this, void 0);
@@ -84,14 +87,16 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
84
87
  __classPrivateFieldSet(this, _RpcDataSource_messenger, options.messenger, "f");
85
88
  __classPrivateFieldSet(this, _RpcDataSource_onActiveChainsUpdated, options.onActiveChainsUpdated, "f");
86
89
  __classPrivateFieldSet(this, _RpcDataSource_timeout, options.timeout ?? 10000, "f");
87
- __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");
88
92
  const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL;
89
93
  const detectionInterval = options.detectionInterval ?? DEFAULT_DETECTION_INTERVAL;
90
94
  log('Initializing RpcDataSource', {
91
95
  timeout: __classPrivateFieldGet(this, _RpcDataSource_timeout, "f"),
92
96
  balanceInterval,
93
97
  detectionInterval,
94
- tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f"),
98
+ tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this),
99
+ useExternalService: __classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this),
95
100
  });
96
101
  // Initialize MulticallClient with a provider getter
97
102
  __classPrivateFieldSet(this, _RpcDataSource_multicallClient, new evm_rpc_services_1.MulticallClient((hexChainId) => {
@@ -115,9 +120,14 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
115
120
  __classPrivateFieldSet(this, _RpcDataSource_balanceFetcher, new evm_rpc_services_1.BalanceFetcher(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), balanceFetcherMessenger, { pollingInterval: balanceInterval }), "f");
116
121
  __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setOnBalanceUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleBalanceUpdate).bind(this));
117
122
  // Initialize TokenDetector with polling interval
118
- __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");
119
128
  __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setOnDetectionUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleDetectionUpdate).bind(this));
120
129
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_subscribeToNetworkController).call(this);
130
+ __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_subscribeToTransactionEvents).call(this);
121
131
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_initializeFromNetworkController).call(this);
122
132
  }
123
133
  /**
@@ -189,7 +199,7 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
189
199
  return response;
190
200
  }
191
201
  const assetsBalance = {};
192
- const assetsMetadata = {};
202
+ const assetsInfo = {};
193
203
  const failedChains = [];
194
204
  // Fetch balances for each account and its supported chains (pre-computed in request)
195
205
  for (const { account, supportedChains, } of request.accountsWithSupportedChains) {
@@ -209,10 +219,10 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
209
219
  }
210
220
  // Collect metadata for all balances
211
221
  const balanceMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, chainId);
212
- Object.assign(assetsMetadata, balanceMetadata);
222
+ Object.assign(assetsInfo, balanceMetadata);
213
223
  // Convert balances to human-readable format
214
224
  for (const balance of result.balances) {
215
- const metadata = assetsMetadata[balance.assetId];
225
+ const metadata = assetsInfo[balance.assetId];
216
226
  // Default to 18 decimals (ERC20 standard) for consistent human-readable format
217
227
  const decimals = metadata?.decimals ?? 18;
218
228
  const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
@@ -231,7 +241,7 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
231
241
  // Even on error, include native token metadata
232
242
  const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
233
243
  if (chainStatus) {
234
- assetsMetadata[nativeAssetId] = {
244
+ assetsInfo[nativeAssetId] = {
235
245
  type: 'native',
236
246
  symbol: chainStatus.nativeCurrency,
237
247
  name: chainStatus.nativeCurrency,
@@ -262,8 +272,8 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
262
272
  }
263
273
  response.assetsBalance = assetsBalance;
264
274
  // Include metadata for native tokens if we have any
265
- if (Object.keys(assetsMetadata).length > 0) {
266
- response.assetsMetadata = assetsMetadata;
275
+ if (Object.keys(assetsInfo).length > 0) {
276
+ response.assetsInfo = assetsInfo;
267
277
  }
268
278
  return response;
269
279
  }
@@ -275,14 +285,17 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
275
285
  * @returns Promise resolving to a DataResponse with detected assets.
276
286
  */
277
287
  async detectTokens(chainId, account) {
278
- if (!__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f")) {
288
+ if (!__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f").call(this) || !__classPrivateFieldGet(this, _RpcDataSource_useExternalService, "f").call(this)) {
279
289
  return {};
280
290
  }
281
291
  const hexChainId = (0, exports.caipChainIdToHex)(chainId);
282
292
  const { address, id: accountId } = account;
283
293
  log('Running token detection', { chainId, accountId });
284
294
  try {
285
- 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
+ });
286
299
  if (result.detectedAssets.length === 0) {
287
300
  log('No new tokens detected');
288
301
  return {};
@@ -294,11 +307,11 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
294
307
  });
295
308
  // Convert detected assets to DataResponse format
296
309
  const balances = {};
297
- const assetsMetadata = {};
310
+ const assetsInfo = {};
298
311
  // Build metadata from detected assets
299
312
  for (const asset of result.detectedAssets) {
300
313
  if (asset.symbol && asset.decimals !== undefined) {
301
- assetsMetadata[asset.assetId] = {
314
+ assetsInfo[asset.assetId] = {
302
315
  type: 'erc20',
303
316
  symbol: asset.symbol,
304
317
  name: asset.name ?? asset.symbol,
@@ -326,8 +339,8 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
326
339
  },
327
340
  };
328
341
  // Include metadata if we have any
329
- if (Object.keys(assetsMetadata).length > 0) {
330
- response.assetsMetadata = assetsMetadata;
342
+ if (Object.keys(assetsInfo).length > 0) {
343
+ response.assetsInfo = assetsInfo;
331
344
  }
332
345
  return response;
333
346
  }
@@ -363,11 +376,11 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
363
376
  };
364
377
  }
365
378
  }
366
- if (response.assetsMetadata) {
367
- (_c = context.response).assetsMetadata ?? (_c.assetsMetadata = {});
368
- context.response.assetsMetadata = {
369
- ...context.response.assetsMetadata,
370
- ...response.assetsMetadata,
379
+ if (response.assetsInfo) {
380
+ (_c = context.response).assetsInfo ?? (_c.assetsInfo = {});
381
+ context.response.assetsInfo = {
382
+ ...context.response.assetsInfo,
383
+ ...response.assetsInfo,
371
384
  };
372
385
  }
373
386
  const failedChains = new Set(Object.keys(response.errors ?? {}));
@@ -437,8 +450,8 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
437
450
  };
438
451
  const balanceToken = __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").startPolling(balanceInput);
439
452
  balancePollingTokens.push(balanceToken);
440
- // Start detection polling if enabled
441
- 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)) {
442
455
  const detectionInput = {
443
456
  chainId: hexChainId,
444
457
  accountId,
@@ -490,6 +503,8 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
490
503
  */
491
504
  destroy() {
492
505
  log('Destroying RpcDataSource');
506
+ __classPrivateFieldGet(this, _RpcDataSource_unsubscribeTransactionConfirmed, "f")?.call(this);
507
+ __classPrivateFieldGet(this, _RpcDataSource_unsubscribeIncomingTransactions, "f")?.call(this);
493
508
  // Stop all polling
494
509
  __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").stopAllPolling();
495
510
  __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").stopAllPolling();
@@ -500,19 +515,19 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
500
515
  }
501
516
  }
502
517
  exports.RpcDataSource = RpcDataSource;
503
- _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated = new WeakMap(), _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) {
504
519
  const rawAmount = new bignumber_js_1.default(rawBalance);
505
520
  const divisor = new bignumber_js_1.default(10).pow(decimals);
506
521
  return rawAmount.dividedBy(divisor).toString();
507
522
  }, _RpcDataSource_collectMetadataForBalances = function _RpcDataSource_collectMetadataForBalances(balances, chainId) {
508
- const assetsMetadata = {};
523
+ const assetsInfo = {};
509
524
  const existingMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getExistingAssetsMetadata).call(this);
510
525
  for (const balance of balances) {
511
526
  const isNative = balance.assetId.includes('/slip44:');
512
527
  if (isNative) {
513
528
  const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
514
529
  if (chainStatus) {
515
- assetsMetadata[balance.assetId] = {
530
+ assetsInfo[balance.assetId] = {
516
531
  type: 'native',
517
532
  symbol: chainStatus.nativeCurrency,
518
533
  name: chainStatus.nativeCurrency,
@@ -524,19 +539,19 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
524
539
  // For ERC20 tokens, try existing metadata from state first
525
540
  const existingMeta = existingMetadata[balance.assetId];
526
541
  if (existingMeta) {
527
- assetsMetadata[balance.assetId] = existingMeta;
542
+ assetsInfo[balance.assetId] = existingMeta;
528
543
  }
529
544
  else {
530
545
  // Fallback to token list if not in state
531
546
  const tokenListMeta = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getTokenMetadataFromTokenList).call(this, balance.assetId);
532
547
  if (tokenListMeta) {
533
- assetsMetadata[balance.assetId] = tokenListMeta;
548
+ assetsInfo[balance.assetId] = tokenListMeta;
534
549
  }
535
550
  else {
536
551
  // Default metadata for unknown ERC20 tokens.
537
552
  // Use 18 decimals (the standard for most ERC20 tokens)
538
553
  // to ensure consistent human-readable balance format.
539
- assetsMetadata[balance.assetId] = {
554
+ assetsInfo[balance.assetId] = {
540
555
  type: 'erc20',
541
556
  symbol: '',
542
557
  name: '',
@@ -546,17 +561,17 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
546
561
  }
547
562
  }
548
563
  }
549
- return assetsMetadata;
564
+ return assetsInfo;
550
565
  }, _RpcDataSource_handleBalanceUpdate = function _RpcDataSource_handleBalanceUpdate(result) {
551
566
  const newBalances = {};
552
567
  // Convert hex chain ID to CAIP-2 format
553
568
  const chainIdDecimal = parseInt(result.chainId, 16);
554
569
  const caipChainId = `eip155:${chainIdDecimal}`;
555
570
  // Collect metadata for all balances
556
- 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);
557
572
  // Convert balances to human-readable format using metadata
558
573
  for (const balance of result.balances) {
559
- const metadata = assetsMetadata[balance.assetId];
574
+ const metadata = assetsInfo[balance.assetId];
560
575
  // Default to 18 decimals (ERC20 standard) for consistent human-readable format
561
576
  const decimals = metadata?.decimals ?? 18;
562
577
  const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
@@ -570,7 +585,7 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
570
585
  assetsBalance: {
571
586
  [result.accountId]: newBalances,
572
587
  },
573
- assetsMetadata,
588
+ assetsInfo,
574
589
  };
575
590
  log('Balance update response', {
576
591
  accountId: result.accountId,
@@ -621,7 +636,7 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
621
636
  detectedAssets: {
622
637
  [result.accountId]: result.detectedAssets.map((asset) => asset.assetId),
623
638
  },
624
- assetsMetadata: newMetadata,
639
+ assetsInfo: newMetadata,
625
640
  assetsBalance: {
626
641
  [result.accountId]: newBalances,
627
642
  },
@@ -637,6 +652,73 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
637
652
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_clearProviderCache).call(this);
638
653
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_updateFromNetworkState).call(this, networkState);
639
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
+ }
640
722
  }, _RpcDataSource_initializeFromNetworkController = function _RpcDataSource_initializeFromNetworkController() {
641
723
  log('Initializing from NetworkController');
642
724
  try {
@@ -734,12 +816,11 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
734
816
  __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").clear();
735
817
  }, _RpcDataSource_buildNativeAssetId = function _RpcDataSource_buildNativeAssetId(chainId) {
736
818
  const { nativeAssetIdentifiers } = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('NetworkEnablementController:getState');
737
- return (nativeAssetIdentifiers[chainId] ??
738
- `${chainId}/slip44:60`);
819
+ return nativeAssetIdentifiers[chainId] ?? `${chainId}/slip44:60`;
739
820
  }, _RpcDataSource_getExistingAssetsMetadata = function _RpcDataSource_getExistingAssetsMetadata() {
740
821
  try {
741
822
  const state = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:getState');
742
- return (state.assetsMetadata ?? {});
823
+ return state.assetsInfo ?? {};
743
824
  }
744
825
  catch {
745
826
  // If AssetsController:getState fails, return empty metadata
@@ -747,15 +828,13 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
747
828
  }
748
829
  }, _RpcDataSource_getTokenMetadataFromTokenList = function _RpcDataSource_getTokenMetadataFromTokenList(assetId) {
749
830
  try {
750
- // Parse asset ID to get chain and token address
751
- // Format: eip155:{chainId}/erc20:{address}
752
- const [chainPart, assetPart] = assetId.split('/');
753
- if (!assetPart?.startsWith('erc20:')) {
831
+ const parsed = (0, utils_1.parseCaipAssetType)(assetId);
832
+ if (parsed.assetNamespace !== 'erc20') {
754
833
  return undefined;
755
834
  }
756
- const tokenAddress = assetPart.slice(6); // Remove 'erc20:' prefix
757
- const chainIdDecimal = chainPart.split(':')[1];
758
- const hexChainId = `0x${parseInt(chainIdDecimal, 10).toString(16)}`;
835
+ const tokenAddress = parsed.assetReference;
836
+ const { reference } = (0, utils_1.parseCaipChainId)(parsed.chainId);
837
+ const hexChainId = (0, utils_1.numberToHex)(parseInt(reference, 10));
759
838
  const tokenListState = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('TokenListController:getState');
760
839
  const chainCacheEntry = tokenListState?.tokensChainsCache?.[hexChainId];
761
840
  const chainTokenList = chainCacheEntry?.data;