@metamask-previews/assets-controller 0.0.0-preview-3ec2a74 → 0.0.0-preview-6ae8a59c

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 (206) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/data-sources/RpcDataSource.cjs +415 -186
  3. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  4. package/dist/data-sources/RpcDataSource.d.cts +115 -30
  5. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  6. package/dist/data-sources/RpcDataSource.d.mts +115 -30
  7. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  8. package/dist/data-sources/RpcDataSource.mjs +413 -185
  9. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  10. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs.map +1 -0
  11. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.cts.map +1 -0
  12. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.mts.map +1 -0
  13. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.mjs.map +1 -0
  14. package/dist/data-sources/evm-rpc-services/clients/index.cjs.map +1 -0
  15. package/dist/data-sources/evm-rpc-services/clients/index.d.cts.map +1 -0
  16. package/dist/data-sources/evm-rpc-services/clients/index.d.mts.map +1 -0
  17. package/dist/data-sources/evm-rpc-services/clients/index.mjs.map +1 -0
  18. package/dist/data-sources/{rpc-datasource → evm-rpc-services}/index.cjs +4 -1
  19. package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -0
  20. package/dist/data-sources/evm-rpc-services/index.d.cts +5 -0
  21. package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -0
  22. package/dist/data-sources/evm-rpc-services/index.d.mts +5 -0
  23. package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -0
  24. package/dist/data-sources/{rpc-datasource → evm-rpc-services}/index.mjs +1 -0
  25. package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -0
  26. package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/BalanceFetcher.cjs +33 -3
  27. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -0
  28. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +68 -0
  29. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -0
  30. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +68 -0
  31. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -0
  32. package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/BalanceFetcher.mjs +33 -3
  33. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -0
  34. package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/TokenDetector.cjs +33 -3
  35. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -0
  36. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +66 -0
  37. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -0
  38. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +66 -0
  39. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -0
  40. package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/TokenDetector.mjs +33 -3
  41. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -0
  42. package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -0
  43. package/dist/data-sources/evm-rpc-services/services/index.d.cts +3 -0
  44. package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -0
  45. package/dist/data-sources/evm-rpc-services/services/index.d.mts +3 -0
  46. package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -0
  47. package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -0
  48. package/dist/data-sources/evm-rpc-services/types/assets.cjs.map +1 -0
  49. package/dist/data-sources/evm-rpc-services/types/assets.d.cts.map +1 -0
  50. package/dist/data-sources/evm-rpc-services/types/assets.d.mts.map +1 -0
  51. package/dist/data-sources/evm-rpc-services/types/assets.mjs.map +1 -0
  52. package/dist/data-sources/evm-rpc-services/types/config.cjs.map +1 -0
  53. package/dist/data-sources/evm-rpc-services/types/config.d.cts.map +1 -0
  54. package/dist/data-sources/evm-rpc-services/types/config.d.mts.map +1 -0
  55. package/dist/data-sources/evm-rpc-services/types/config.mjs.map +1 -0
  56. package/dist/data-sources/evm-rpc-services/types/core.cjs.map +1 -0
  57. package/dist/data-sources/evm-rpc-services/types/core.d.cts.map +1 -0
  58. package/dist/data-sources/evm-rpc-services/types/core.d.mts.map +1 -0
  59. package/dist/data-sources/evm-rpc-services/types/core.mjs.map +1 -0
  60. package/dist/data-sources/evm-rpc-services/types/index.cjs.map +1 -0
  61. package/dist/data-sources/evm-rpc-services/types/index.d.cts.map +1 -0
  62. package/dist/data-sources/evm-rpc-services/types/index.d.mts.map +1 -0
  63. package/dist/data-sources/evm-rpc-services/types/index.mjs.map +1 -0
  64. package/dist/data-sources/evm-rpc-services/types/multicall.cjs.map +1 -0
  65. package/dist/data-sources/evm-rpc-services/types/multicall.d.cts.map +1 -0
  66. package/dist/data-sources/evm-rpc-services/types/multicall.d.mts.map +1 -0
  67. package/dist/data-sources/evm-rpc-services/types/multicall.mjs.map +1 -0
  68. package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -0
  69. package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -0
  70. package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -0
  71. package/dist/data-sources/evm-rpc-services/types/services.mjs.map +1 -0
  72. package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -0
  73. package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -0
  74. package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -0
  75. package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -0
  76. package/dist/data-sources/evm-rpc-services/utils/batch.cjs.map +1 -0
  77. package/dist/data-sources/evm-rpc-services/utils/batch.d.cts.map +1 -0
  78. package/dist/data-sources/evm-rpc-services/utils/batch.d.mts.map +1 -0
  79. package/dist/data-sources/evm-rpc-services/utils/batch.mjs.map +1 -0
  80. package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -0
  81. package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -0
  82. package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -0
  83. package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -0
  84. package/dist/data-sources/initDataSources.cjs +5 -1
  85. package/dist/data-sources/initDataSources.cjs.map +1 -1
  86. package/dist/data-sources/initDataSources.d.cts +15 -0
  87. package/dist/data-sources/initDataSources.d.cts.map +1 -1
  88. package/dist/data-sources/initDataSources.d.mts +15 -0
  89. package/dist/data-sources/initDataSources.d.mts.map +1 -1
  90. package/dist/data-sources/initDataSources.mjs +5 -1
  91. package/dist/data-sources/initDataSources.mjs.map +1 -1
  92. package/package.json +5 -2
  93. package/dist/data-sources/rpc-datasource/clients/MulticallClient.cjs.map +0 -1
  94. package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.cts.map +0 -1
  95. package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.mts.map +0 -1
  96. package/dist/data-sources/rpc-datasource/clients/MulticallClient.mjs.map +0 -1
  97. package/dist/data-sources/rpc-datasource/clients/index.cjs.map +0 -1
  98. package/dist/data-sources/rpc-datasource/clients/index.d.cts.map +0 -1
  99. package/dist/data-sources/rpc-datasource/clients/index.d.mts.map +0 -1
  100. package/dist/data-sources/rpc-datasource/clients/index.mjs.map +0 -1
  101. package/dist/data-sources/rpc-datasource/index.cjs.map +0 -1
  102. package/dist/data-sources/rpc-datasource/index.d.cts +0 -4
  103. package/dist/data-sources/rpc-datasource/index.d.cts.map +0 -1
  104. package/dist/data-sources/rpc-datasource/index.d.mts +0 -4
  105. package/dist/data-sources/rpc-datasource/index.d.mts.map +0 -1
  106. package/dist/data-sources/rpc-datasource/index.mjs.map +0 -1
  107. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.cjs.map +0 -1
  108. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts +0 -16
  109. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts.map +0 -1
  110. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts +0 -16
  111. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts.map +0 -1
  112. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.mjs.map +0 -1
  113. package/dist/data-sources/rpc-datasource/services/TokenDetector.cjs.map +0 -1
  114. package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts +0 -14
  115. package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts.map +0 -1
  116. package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts +0 -14
  117. package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts.map +0 -1
  118. package/dist/data-sources/rpc-datasource/services/TokenDetector.mjs.map +0 -1
  119. package/dist/data-sources/rpc-datasource/services/index.cjs.map +0 -1
  120. package/dist/data-sources/rpc-datasource/services/index.d.cts +0 -3
  121. package/dist/data-sources/rpc-datasource/services/index.d.cts.map +0 -1
  122. package/dist/data-sources/rpc-datasource/services/index.d.mts +0 -3
  123. package/dist/data-sources/rpc-datasource/services/index.d.mts.map +0 -1
  124. package/dist/data-sources/rpc-datasource/services/index.mjs.map +0 -1
  125. package/dist/data-sources/rpc-datasource/types/assets.cjs.map +0 -1
  126. package/dist/data-sources/rpc-datasource/types/assets.d.cts.map +0 -1
  127. package/dist/data-sources/rpc-datasource/types/assets.d.mts.map +0 -1
  128. package/dist/data-sources/rpc-datasource/types/assets.mjs.map +0 -1
  129. package/dist/data-sources/rpc-datasource/types/config.cjs.map +0 -1
  130. package/dist/data-sources/rpc-datasource/types/config.d.cts.map +0 -1
  131. package/dist/data-sources/rpc-datasource/types/config.d.mts.map +0 -1
  132. package/dist/data-sources/rpc-datasource/types/config.mjs.map +0 -1
  133. package/dist/data-sources/rpc-datasource/types/core.cjs.map +0 -1
  134. package/dist/data-sources/rpc-datasource/types/core.d.cts.map +0 -1
  135. package/dist/data-sources/rpc-datasource/types/core.d.mts.map +0 -1
  136. package/dist/data-sources/rpc-datasource/types/core.mjs.map +0 -1
  137. package/dist/data-sources/rpc-datasource/types/index.cjs.map +0 -1
  138. package/dist/data-sources/rpc-datasource/types/index.d.cts.map +0 -1
  139. package/dist/data-sources/rpc-datasource/types/index.d.mts.map +0 -1
  140. package/dist/data-sources/rpc-datasource/types/index.mjs.map +0 -1
  141. package/dist/data-sources/rpc-datasource/types/multicall.cjs.map +0 -1
  142. package/dist/data-sources/rpc-datasource/types/multicall.d.cts.map +0 -1
  143. package/dist/data-sources/rpc-datasource/types/multicall.d.mts.map +0 -1
  144. package/dist/data-sources/rpc-datasource/types/multicall.mjs.map +0 -1
  145. package/dist/data-sources/rpc-datasource/types/services.cjs.map +0 -1
  146. package/dist/data-sources/rpc-datasource/types/services.d.cts.map +0 -1
  147. package/dist/data-sources/rpc-datasource/types/services.d.mts.map +0 -1
  148. package/dist/data-sources/rpc-datasource/types/services.mjs.map +0 -1
  149. package/dist/data-sources/rpc-datasource/types/state.cjs.map +0 -1
  150. package/dist/data-sources/rpc-datasource/types/state.d.cts.map +0 -1
  151. package/dist/data-sources/rpc-datasource/types/state.d.mts.map +0 -1
  152. package/dist/data-sources/rpc-datasource/types/state.mjs.map +0 -1
  153. package/dist/data-sources/rpc-datasource/utils/batch.cjs.map +0 -1
  154. package/dist/data-sources/rpc-datasource/utils/batch.d.cts.map +0 -1
  155. package/dist/data-sources/rpc-datasource/utils/batch.d.mts.map +0 -1
  156. package/dist/data-sources/rpc-datasource/utils/batch.mjs.map +0 -1
  157. package/dist/data-sources/rpc-datasource/utils/index.cjs.map +0 -1
  158. package/dist/data-sources/rpc-datasource/utils/index.d.cts.map +0 -1
  159. package/dist/data-sources/rpc-datasource/utils/index.d.mts.map +0 -1
  160. package/dist/data-sources/rpc-datasource/utils/index.mjs.map +0 -1
  161. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.cjs +0 -0
  162. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.d.cts +0 -0
  163. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.d.mts +0 -0
  164. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/MulticallClient.mjs +0 -0
  165. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.cjs +0 -0
  166. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.d.cts +0 -0
  167. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.d.mts +0 -0
  168. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/clients/index.mjs +0 -0
  169. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/index.cjs +0 -0
  170. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/services/index.mjs +0 -0
  171. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.cjs +0 -0
  172. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.d.cts +0 -0
  173. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.d.mts +0 -0
  174. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/assets.mjs +0 -0
  175. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.cjs +0 -0
  176. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.d.cts +0 -0
  177. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.d.mts +0 -0
  178. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/config.mjs +0 -0
  179. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.cjs +0 -0
  180. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.d.cts +0 -0
  181. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.d.mts +0 -0
  182. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/core.mjs +0 -0
  183. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.cjs +0 -0
  184. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.d.cts +0 -0
  185. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.d.mts +0 -0
  186. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/index.mjs +0 -0
  187. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.cjs +0 -0
  188. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.d.cts +0 -0
  189. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.d.mts +0 -0
  190. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/multicall.mjs +0 -0
  191. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.cjs +0 -0
  192. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.d.cts +0 -0
  193. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.d.mts +0 -0
  194. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/services.mjs +0 -0
  195. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.cjs +0 -0
  196. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.d.cts +0 -0
  197. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.d.mts +0 -0
  198. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/types/state.mjs +0 -0
  199. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.cjs +0 -0
  200. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.d.cts +0 -0
  201. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.d.mts +0 -0
  202. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/batch.mjs +0 -0
  203. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.cjs +0 -0
  204. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.d.cts +0 -0
  205. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.d.mts +0 -0
  206. /package/dist/data-sources/{rpc-datasource → evm-rpc-services}/utils/index.mjs +0 -0
@@ -10,35 +10,40 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _RpcDataSource_instances, _RpcDataSource_messenger, _RpcDataSource_timeout, _RpcDataSource_pollInterval, _RpcDataSource_providerCache, _RpcDataSource_registerActionHandlers, _RpcDataSource_subscribeToNetworkController, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_clearProviderCache, _RpcDataSource_accountSupportsChain;
13
+ var _RpcDataSource_instances, _RpcDataSource_timeout, _RpcDataSource_tokenDetectionEnabled, _RpcDataSource_activeChains, _RpcDataSource_chainStatuses, _RpcDataSource_providerCache, _RpcDataSource_activeSubscriptions, _RpcDataSource_multicallClient, _RpcDataSource_balanceFetcher, _RpcDataSource_tokenDetector, _RpcDataSource_handleBalanceUpdate, _RpcDataSource_handleDetectionUpdate, _RpcDataSource_registerActionHandlers, _RpcDataSource_subscribeToNetworkController, _RpcDataSource_initializeFromNetworkController, _RpcDataSource_updateFromNetworkState, _RpcDataSource_getProvider, _RpcDataSource_getMulticallProvider, _RpcDataSource_clearProviderCache, _RpcDataSource_accountSupportsChain, _RpcDataSource_buildNativeAssetId;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.createRpcDataSource = exports.RpcDataSource = void 0;
15
+ exports.createRpcDataSource = exports.RpcDataSource = exports.caipChainIdToHex = void 0;
16
16
  const providers_1 = require("@ethersproject/providers");
17
- const AbstractDataSource_1 = require("./AbstractDataSource.cjs");
17
+ const base_controller_1 = require("@metamask/base-controller");
18
+ const controller_utils_1 = require("@metamask/controller-utils");
19
+ const utils_1 = require("@metamask/utils");
20
+ const evm_rpc_services_1 = require("./evm-rpc-services/index.cjs");
18
21
  const logger_1 = require("../logger.cjs");
19
- // ============================================================================
20
- // CONSTANTS
21
- // ============================================================================
22
22
  const CONTROLLER_NAME = 'RpcDataSource';
23
- const DEFAULT_POLL_INTERVAL = 30000;
23
+ const DEFAULT_BALANCE_INTERVAL = 30000; // 30 seconds
24
+ const DEFAULT_DETECTION_INTERVAL = 180000; // 3 minutes
24
25
  const log = (0, logger_1.createModuleLogger)(logger_1.projectLogger, CONTROLLER_NAME);
25
- const defaultState = {
26
- activeChains: [],
27
- chainStatuses: {},
26
+ /**
27
+ * Convert CAIP chain ID or hex chain ID to hex chain ID.
28
+ *
29
+ * @param chainId - CAIP chain ID or hex chain ID.
30
+ * @returns Hex chain ID.
31
+ */
32
+ const caipChainIdToHex = (chainId) => {
33
+ if ((0, utils_1.isStrictHexString)(chainId)) {
34
+ return chainId;
35
+ }
36
+ if ((0, utils_1.isCaipChainId)(chainId)) {
37
+ return (0, controller_utils_1.toHex)((0, utils_1.parseCaipChainId)(chainId).reference);
38
+ }
39
+ throw new Error('caipChainIdToHex - Failed to provide CAIP-2 or Hex chainId');
28
40
  };
29
- // ============================================================================
30
- // HELPER FUNCTIONS
31
- // ============================================================================
32
- function buildNativeAssetId(chainId) {
33
- return `${chainId}/slip44:60`;
34
- }
35
- // ============================================================================
36
- // RPC DATA SOURCE
37
- // ============================================================================
41
+ exports.caipChainIdToHex = caipChainIdToHex;
38
42
  /**
39
43
  * Data source for fetching balances via RPC calls.
40
44
  *
41
- * Used as a fallback when the Accounts API doesn't support a chain.
45
+ * Orchestrates polling through BalanceFetcher and TokenDetector,
46
+ * each of which handle their own polling intervals.
42
47
  *
43
48
  * Communicates with AssetsController via Messenger:
44
49
  *
@@ -52,88 +57,176 @@ function buildNativeAssetId(chainId) {
52
57
  * - RpcDataSource:activeChainsUpdated
53
58
  * - RpcDataSource:assetsUpdated
54
59
  */
55
- class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
60
+ class RpcDataSource extends base_controller_1.BaseController {
56
61
  constructor(options) {
57
- super(CONTROLLER_NAME, {
58
- ...defaultState,
59
- ...options.state,
62
+ super({
63
+ name: CONTROLLER_NAME,
64
+ metadata: {},
65
+ state: {},
66
+ messenger: options.messenger,
60
67
  });
61
68
  _RpcDataSource_instances.add(this);
62
- _RpcDataSource_messenger.set(this, void 0);
63
69
  _RpcDataSource_timeout.set(this, void 0);
64
- _RpcDataSource_pollInterval.set(this, void 0);
70
+ _RpcDataSource_tokenDetectionEnabled.set(this, void 0);
71
+ /** Currently active chains */
72
+ _RpcDataSource_activeChains.set(this, []);
73
+ /** Network status for each active chain */
74
+ _RpcDataSource_chainStatuses.set(this, {});
65
75
  /** Cache of Web3Provider instances by chainId */
66
76
  _RpcDataSource_providerCache.set(this, new Map());
67
- __classPrivateFieldSet(this, _RpcDataSource_messenger, options.messenger, "f");
77
+ /** Active subscriptions by ID */
78
+ _RpcDataSource_activeSubscriptions.set(this, new Map());
79
+ // Rpc-datasource components
80
+ _RpcDataSource_multicallClient.set(this, void 0);
81
+ _RpcDataSource_balanceFetcher.set(this, void 0);
82
+ _RpcDataSource_tokenDetector.set(this, void 0);
68
83
  __classPrivateFieldSet(this, _RpcDataSource_timeout, options.timeout ?? 10000, "f");
69
- __classPrivateFieldSet(this, _RpcDataSource_pollInterval, options.pollInterval ?? DEFAULT_POLL_INTERVAL, "f");
84
+ __classPrivateFieldSet(this, _RpcDataSource_tokenDetectionEnabled, options.tokenDetectionEnabled ?? false, "f");
85
+ const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL;
86
+ const detectionInterval = options.detectionInterval ?? DEFAULT_DETECTION_INTERVAL;
87
+ log('Initializing RpcDataSource', {
88
+ timeout: __classPrivateFieldGet(this, _RpcDataSource_timeout, "f"),
89
+ balanceInterval,
90
+ detectionInterval,
91
+ tokenDetectionEnabled: __classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f"),
92
+ });
93
+ // Initialize MulticallClient with a provider getter
94
+ __classPrivateFieldSet(this, _RpcDataSource_multicallClient, new evm_rpc_services_1.MulticallClient((hexChainId) => {
95
+ return __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getMulticallProvider).call(this, hexChainId);
96
+ }), "f");
97
+ // Create state getters using messenger
98
+ const getTokenListState = () => {
99
+ return this.messenger.call('TokenListController:getState');
100
+ };
101
+ const getUserTokensState = () => {
102
+ return this.messenger.call('AssetsController:getState');
103
+ };
104
+ // Initialize BalanceFetcher with polling interval
105
+ __classPrivateFieldSet(this, _RpcDataSource_balanceFetcher, new evm_rpc_services_1.BalanceFetcher(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), {
106
+ pollingInterval: balanceInterval,
107
+ }), "f");
108
+ __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setUserTokensStateGetter(getUserTokensState);
109
+ __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setOnBalanceUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleBalanceUpdate).bind(this));
110
+ // Initialize TokenDetector with polling interval
111
+ __classPrivateFieldSet(this, _RpcDataSource_tokenDetector, new evm_rpc_services_1.TokenDetector(__classPrivateFieldGet(this, _RpcDataSource_multicallClient, "f"), {
112
+ pollingInterval: detectionInterval,
113
+ }), "f");
114
+ __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setTokenListStateGetter(getTokenListState);
115
+ __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setOnDetectionUpdate(__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_handleDetectionUpdate).bind(this));
70
116
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_registerActionHandlers).call(this);
71
117
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_subscribeToNetworkController).call(this);
72
118
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_initializeFromNetworkController).call(this);
73
119
  }
74
- // ============================================================================
75
- // CHAIN STATUS
76
- // ============================================================================
120
+ /**
121
+ * Get the data source name.
122
+ *
123
+ * @returns The name of this data source.
124
+ */
125
+ getName() {
126
+ return this.name;
127
+ }
128
+ /**
129
+ * Get currently active chains.
130
+ *
131
+ * @returns Promise resolving to array of active chain IDs.
132
+ */
133
+ async getActiveChains() {
134
+ return __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f");
135
+ }
77
136
  /**
78
137
  * Get the status of all configured chains.
79
138
  *
80
139
  * @returns Record of chain statuses keyed by chain ID.
81
140
  */
82
141
  getChainStatuses() {
83
- return { ...this.state.chainStatuses };
142
+ return { ...__classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f") };
84
143
  }
85
144
  /**
86
145
  * Get the status of a specific chain.
87
146
  *
88
- * @param chainId - The CAIP-2 chain ID to check.
89
- * @returns The chain status, or undefined if not configured.
147
+ * @param chainId - The chain ID to get status for.
148
+ * @returns The chain status or undefined if not found.
90
149
  */
91
150
  getChainStatus(chainId) {
92
- return this.state.chainStatuses[chainId];
151
+ return __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
152
+ }
153
+ /**
154
+ * Set the balance polling interval.
155
+ *
156
+ * @param interval - The polling interval in milliseconds.
157
+ */
158
+ setBalancePollingInterval(interval) {
159
+ log('Setting balance polling interval', { interval });
160
+ __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").setIntervalLength(interval);
161
+ }
162
+ /**
163
+ * Get the current balance polling interval.
164
+ *
165
+ * @returns The polling interval in milliseconds, or undefined if not set.
166
+ */
167
+ getBalancePollingInterval() {
168
+ return __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").getIntervalLength();
169
+ }
170
+ /**
171
+ * Set the token detection polling interval.
172
+ *
173
+ * @param interval - The polling interval in milliseconds.
174
+ */
175
+ setDetectionPollingInterval(interval) {
176
+ log('Setting detection polling interval', { interval });
177
+ __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").setIntervalLength(interval);
178
+ }
179
+ /**
180
+ * Get the current token detection polling interval.
181
+ *
182
+ * @returns The polling interval in milliseconds, or undefined if not set.
183
+ */
184
+ getDetectionPollingInterval() {
185
+ return __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").getIntervalLength();
93
186
  }
94
- // ============================================================================
95
- // FETCH
96
- // ============================================================================
97
187
  async fetch(request) {
98
188
  const response = {};
99
- // Filter to active chains
100
- const chainsToFetch = request.chainIds.filter((chainId) => this.state.activeChains.includes(chainId));
189
+ const chainsToFetch = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
190
+ log('Fetch requested', {
191
+ accounts: request.accounts.map((a) => a.id),
192
+ requestedChains: request.chainIds,
193
+ chainsToFetch,
194
+ });
101
195
  if (chainsToFetch.length === 0) {
196
+ log('No active chains to fetch');
102
197
  return response;
103
198
  }
104
199
  const assetsBalance = {};
105
200
  const failedChains = [];
106
- // Fetch native balance for each chain
201
+ // Fetch balances for each chain using BalanceFetcher
107
202
  for (const chainId of chainsToFetch) {
108
- const provider = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getProvider).call(this, chainId);
109
- if (!provider) {
110
- continue;
111
- }
112
- const assetId = buildNativeAssetId(chainId);
113
- // Fetch balance for each account that supports this chain
203
+ const hexChainId = (0, exports.caipChainIdToHex)(chainId);
114
204
  for (const account of request.accounts) {
115
- // Check if account supports this chain based on its scopes
116
205
  if (!__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_accountSupportsChain).call(this, account, chainId)) {
117
206
  continue;
118
207
  }
119
208
  const { address, id: accountId } = account;
120
209
  try {
121
- const balancePromise = provider.getBalance(address);
122
- const timeoutPromise = new Promise((_resolve, reject) => setTimeout(() => reject(new Error('RPC timeout')), __classPrivateFieldGet(this, _RpcDataSource_timeout, "f")));
123
- const balance = await Promise.race([balancePromise, timeoutPromise]);
210
+ // Use BalanceFetcher for batched balance fetching
211
+ const result = await __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").fetchBalancesForTokens(hexChainId, accountId, address, [], // Empty array means just native token
212
+ { includeNative: true });
124
213
  if (!assetsBalance[accountId]) {
125
214
  assetsBalance[accountId] = {};
126
215
  }
127
- assetsBalance[accountId][assetId] = {
128
- amount: balance.toString(),
129
- };
216
+ // Convert balances to response format
217
+ for (const balance of result.balances) {
218
+ assetsBalance[accountId][balance.assetId] = {
219
+ amount: balance.balance,
220
+ };
221
+ }
130
222
  }
131
223
  catch (error) {
132
224
  log('Failed to fetch balance', { address, chainId, error });
133
225
  if (!assetsBalance[accountId]) {
134
226
  assetsBalance[accountId] = {};
135
227
  }
136
- assetsBalance[accountId][assetId] = { amount: '0' };
228
+ const nativeAssetId = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_buildNativeAssetId).call(this, chainId);
229
+ assetsBalance[accountId][nativeAssetId] = { amount: '0' };
137
230
  if (!failedChains.includes(chainId)) {
138
231
  failedChains.push(chainId);
139
232
  }
@@ -141,68 +234,101 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
141
234
  }
142
235
  }
143
236
  if (failedChains.length > 0) {
144
- // Add failed chains to errors so they can fallback to other data sources
237
+ log('Fetch PARTIAL - some chains failed', {
238
+ successChains: chainsToFetch.filter((chain) => !failedChains.includes(chain)),
239
+ failedChains,
240
+ });
145
241
  response.errors = {};
146
242
  for (const chainId of failedChains) {
147
243
  response.errors[chainId] = 'RPC fetch failed';
148
244
  }
149
245
  }
246
+ else {
247
+ log('Fetch SUCCESS', {
248
+ chains: chainsToFetch,
249
+ accountCount: Object.keys(assetsBalance).length,
250
+ });
251
+ }
150
252
  response.assetsBalance = assetsBalance;
151
253
  return response;
152
254
  }
153
- // ============================================================================
154
- // MIDDLEWARE
155
- // ============================================================================
156
255
  /**
157
- * Get the middleware for fetching balances via RPC.
158
- * This middleware:
159
- * - Supports multiple accounts in a single request
160
- * - Filters request to only chains this data source supports
161
- * - Fetches balances for those chains for all accounts
162
- * - Merges response into context
163
- * - Removes handled chains from request for next middleware
256
+ * Run token detection for an account on a chain.
164
257
  *
165
- * @returns The middleware function for the assets pipeline.
258
+ * @param chainId - The chain ID to detect tokens on.
259
+ * @param account - The account to detect tokens for.
260
+ * @returns Promise resolving to a DataResponse with detected assets.
166
261
  */
262
+ async detectTokens(chainId, account) {
263
+ if (!__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f")) {
264
+ return {};
265
+ }
266
+ const hexChainId = (0, exports.caipChainIdToHex)(chainId);
267
+ const { address, id: accountId } = account;
268
+ log('Running token detection', { chainId, accountId });
269
+ try {
270
+ const result = await __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").detectTokens(hexChainId, accountId, address);
271
+ if (result.detectedAssets.length === 0) {
272
+ log('No new tokens detected');
273
+ return {};
274
+ }
275
+ log('Detected new tokens', {
276
+ count: result.detectedAssets.length,
277
+ chainId,
278
+ accountId,
279
+ });
280
+ // Convert detected assets to DataResponse format
281
+ const balances = {};
282
+ // Add balances for detected tokens
283
+ for (const balance of result.detectedBalances) {
284
+ balances[balance.assetId] = {
285
+ amount: balance.balance,
286
+ };
287
+ }
288
+ const response = {
289
+ detectedAssets: {
290
+ [accountId]: result.detectedAssets.map((asset) => asset.assetId),
291
+ },
292
+ assetsBalance: {
293
+ [accountId]: balances,
294
+ },
295
+ };
296
+ return response;
297
+ }
298
+ catch (error) {
299
+ log('Token detection failed', { chainId, accountId, error });
300
+ return {};
301
+ }
302
+ }
167
303
  get assetsMiddleware() {
168
304
  return async (context, next) => {
169
- var _a;
305
+ var _a, _b;
170
306
  const { request } = context;
171
- // Filter to chains this data source supports
172
- const supportedChains = request.chainIds.filter((chainId) => this.state.activeChains.includes(chainId));
173
- // If no supported chains, skip and pass to next middleware
307
+ const supportedChains = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
174
308
  if (supportedChains.length === 0) {
175
309
  return next(context);
176
310
  }
177
311
  let successfullyHandledChains = [];
178
- try {
179
- // Fetch for supported chains
180
- const response = await this.fetch({
181
- ...request,
182
- chainIds: supportedChains,
183
- });
184
- // Merge response into context
185
- if (response.assetsBalance) {
186
- (_a = context.response).assetsBalance ?? (_a.assetsBalance = {});
187
- for (const [accountId, accountBalances] of Object.entries(response.assetsBalance)) {
188
- if (!context.response.assetsBalance[accountId]) {
189
- context.response.assetsBalance[accountId] = {};
190
- }
191
- context.response.assetsBalance[accountId] = {
192
- ...context.response.assetsBalance[accountId],
193
- ...accountBalances,
194
- };
195
- }
312
+ log('Middleware fetching', {
313
+ chains: supportedChains,
314
+ accounts: request.accounts.map((a) => a.id),
315
+ });
316
+ const response = await this.fetch({
317
+ ...request,
318
+ chainIds: supportedChains,
319
+ });
320
+ if (response.assetsBalance) {
321
+ (_a = context.response).assetsBalance ?? (_a.assetsBalance = {});
322
+ for (const [accountId, accountBalances] of Object.entries(response.assetsBalance)) {
323
+ (_b = context.response.assetsBalance)[accountId] ?? (_b[accountId] = {});
324
+ context.response.assetsBalance[accountId] = {
325
+ ...context.response.assetsBalance[accountId],
326
+ ...accountBalances,
327
+ };
196
328
  }
197
- // Determine successfully handled chains (exclude errors)
198
- const failedChains = new Set(Object.keys(response.errors ?? {}));
199
- successfullyHandledChains = supportedChains.filter((chainId) => !failedChains.has(chainId));
200
329
  }
201
- catch (error) {
202
- log('Middleware fetch failed', { error });
203
- successfullyHandledChains = [];
204
- }
205
- // Remove successfully handled chains from request for next middleware
330
+ const failedChains = new Set(Object.keys(response.errors ?? {}));
331
+ successfullyHandledChains = supportedChains.filter((chainId) => !failedChains.has(chainId));
206
332
  if (successfullyHandledChains.length > 0) {
207
333
  const remainingChains = request.chainIds.filter((chainId) => !successfullyHandledChains.includes(chainId));
208
334
  return next({
@@ -213,88 +339,185 @@ class RpcDataSource extends AbstractDataSource_1.AbstractDataSource {
213
339
  },
214
340
  });
215
341
  }
216
- // No chains handled - pass context unchanged
217
342
  return next(context);
218
343
  };
219
344
  }
220
- // ============================================================================
221
- // SUBSCRIBE
222
- // ============================================================================
345
+ /**
346
+ * Subscribe to updates for the given request.
347
+ * Starts polling through BalanceFetcher and TokenDetector.
348
+ *
349
+ * @param subscriptionRequest - The subscription request details.
350
+ */
223
351
  async subscribe(subscriptionRequest) {
224
352
  const { request, subscriptionId, isUpdate } = subscriptionRequest;
225
- // Filter to active chains
226
- const chainsToSubscribe = request.chainIds.filter((chainId) => this.state.activeChains.includes(chainId));
353
+ const chainsToSubscribe = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _RpcDataSource_activeChains, "f").includes(chainId));
354
+ log('Subscribe requested', {
355
+ subscriptionId,
356
+ isUpdate,
357
+ accounts: request.accounts.map((a) => a.id),
358
+ chainsToSubscribe,
359
+ });
227
360
  if (chainsToSubscribe.length === 0) {
361
+ log('No active chains to subscribe');
228
362
  return;
229
363
  }
230
- // Handle subscription update - update both chains AND request (for accounts)
364
+ // Handle subscription update
231
365
  if (isUpdate) {
232
- const existing = this.activeSubscriptions.get(subscriptionId);
366
+ const existing = __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").get(subscriptionId);
233
367
  if (existing) {
368
+ log('Updating existing subscription', {
369
+ subscriptionId,
370
+ chainsToSubscribe,
371
+ });
234
372
  existing.chains = chainsToSubscribe;
235
- existing.request = request;
373
+ existing.accounts = request.accounts;
236
374
  return;
237
375
  }
238
376
  }
239
377
  // Clean up existing subscription
240
378
  await this.unsubscribe(subscriptionId);
241
- const pollInterval = request.updateInterval ?? __classPrivateFieldGet(this, _RpcDataSource_pollInterval, "f");
242
- // Create poll function
243
- const pollFn = async () => {
244
- try {
245
- const subscription = this.activeSubscriptions.get(subscriptionId);
246
- if (!subscription?.request) {
247
- return;
379
+ // Start polling through BalanceFetcher and TokenDetector
380
+ const balancePollingTokens = [];
381
+ const detectionPollingTokens = [];
382
+ for (const chainId of chainsToSubscribe) {
383
+ const hexChainId = (0, exports.caipChainIdToHex)(chainId);
384
+ for (const account of request.accounts) {
385
+ if (!__classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_accountSupportsChain).call(this, account, chainId)) {
386
+ continue;
387
+ }
388
+ const { address, id: accountId } = account;
389
+ // Start balance polling
390
+ const balanceInput = {
391
+ chainId: hexChainId,
392
+ accountId,
393
+ accountAddress: address,
394
+ };
395
+ const balanceToken = __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").startPolling(balanceInput);
396
+ balancePollingTokens.push(balanceToken);
397
+ // Start detection polling if enabled
398
+ if (__classPrivateFieldGet(this, _RpcDataSource_tokenDetectionEnabled, "f")) {
399
+ const detectionInput = {
400
+ chainId: hexChainId,
401
+ accountId,
402
+ accountAddress: address,
403
+ };
404
+ const detectionToken = __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").startPolling(detectionInput);
405
+ detectionPollingTokens.push(detectionToken);
248
406
  }
249
- // Use stored request (which gets updated on account changes)
250
- const fetchResponse = await this.fetch({
251
- ...subscription.request,
252
- chainIds: subscription.chains,
253
- });
254
- // Report update to AssetsController
255
- await __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:assetsUpdate', fetchResponse, CONTROLLER_NAME);
256
- }
257
- catch (error) {
258
- log('Subscription poll failed', { subscriptionId, error });
259
407
  }
260
- };
261
- // Set up polling
262
- const timer = setInterval(() => {
263
- pollFn().catch(console.error);
264
- }, pollInterval);
265
- // Store subscription with request for account updates
266
- this.activeSubscriptions.set(subscriptionId, {
267
- cleanup: () => {
268
- clearInterval(timer);
269
- },
408
+ }
409
+ // Store subscription data
410
+ __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").set(subscriptionId, {
411
+ balancePollingTokens,
412
+ detectionPollingTokens,
413
+ chains: chainsToSubscribe,
414
+ accounts: request.accounts,
415
+ });
416
+ log('Subscription SUCCESS', {
417
+ subscriptionId,
270
418
  chains: chainsToSubscribe,
271
- request,
419
+ balancePollingCount: balancePollingTokens.length,
420
+ detectionPollingCount: detectionPollingTokens.length,
272
421
  });
273
- // Initial fetch
274
- await pollFn();
422
+ }
423
+ /**
424
+ * Unsubscribe from updates and stop polling.
425
+ *
426
+ * @param subscriptionId - The subscription ID to unsubscribe.
427
+ */
428
+ async unsubscribe(subscriptionId) {
429
+ const subscription = __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").get(subscriptionId);
430
+ if (subscription) {
431
+ // Stop balance polling
432
+ for (const token of subscription.balancePollingTokens) {
433
+ __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").stopPollingByPollingToken(token);
434
+ }
435
+ // Stop detection polling
436
+ for (const token of subscription.detectionPollingTokens) {
437
+ __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").stopPollingByPollingToken(token);
438
+ }
439
+ __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").delete(subscriptionId);
440
+ log('Unsubscribed and stopped polling', { subscriptionId });
441
+ }
442
+ }
443
+ /**
444
+ * Destroy the data source and clean up resources.
445
+ */
446
+ destroy() {
447
+ log('Destroying RpcDataSource');
448
+ // Stop all polling
449
+ __classPrivateFieldGet(this, _RpcDataSource_balanceFetcher, "f").stopAllPolling();
450
+ __classPrivateFieldGet(this, _RpcDataSource_tokenDetector, "f").stopAllPolling();
451
+ // Clear subscriptions
452
+ __classPrivateFieldGet(this, _RpcDataSource_activeSubscriptions, "f").clear();
453
+ // Clear caches
454
+ __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").clear();
275
455
  }
276
456
  }
277
457
  exports.RpcDataSource = RpcDataSource;
278
- _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_pollInterval = new WeakMap(), _RpcDataSource_providerCache = new WeakMap(), _RpcDataSource_instances = new WeakSet(), _RpcDataSource_registerActionHandlers = function _RpcDataSource_registerActionHandlers() {
458
+ _RpcDataSource_timeout = new WeakMap(), _RpcDataSource_tokenDetectionEnabled = new WeakMap(), _RpcDataSource_activeChains = new WeakMap(), _RpcDataSource_chainStatuses = new WeakMap(), _RpcDataSource_providerCache = new WeakMap(), _RpcDataSource_activeSubscriptions = new WeakMap(), _RpcDataSource_multicallClient = new WeakMap(), _RpcDataSource_balanceFetcher = new WeakMap(), _RpcDataSource_tokenDetector = new WeakMap(), _RpcDataSource_instances = new WeakSet(), _RpcDataSource_handleBalanceUpdate = function _RpcDataSource_handleBalanceUpdate(result) {
459
+ const accountBalances = {};
460
+ for (const balance of result.balances) {
461
+ accountBalances[balance.assetId] = {
462
+ amount: balance.balance,
463
+ };
464
+ }
465
+ const response = {
466
+ assetsBalance: {
467
+ [result.accountId]: accountBalances,
468
+ },
469
+ };
470
+ this.messenger
471
+ .call('AssetsController:assetsUpdate', response, CONTROLLER_NAME)
472
+ .catch((error) => {
473
+ log('Failed to update assets', { error });
474
+ });
475
+ }, _RpcDataSource_handleDetectionUpdate = function _RpcDataSource_handleDetectionUpdate(result) {
476
+ log('Detected new tokens', {
477
+ count: result.detectedAssets.length,
478
+ });
479
+ const response = {
480
+ detectedAssets: {
481
+ [result.accountId]: result.detectedAssets.map((asset) => asset.assetId),
482
+ },
483
+ };
484
+ // Add balances for detected tokens
485
+ if (result.detectedBalances.length > 0) {
486
+ response.assetsBalance = {
487
+ [result.accountId]: {},
488
+ };
489
+ for (const balance of result.detectedBalances) {
490
+ response.assetsBalance[result.accountId][balance.assetId] = {
491
+ amount: balance.balance,
492
+ };
493
+ }
494
+ }
495
+ this.messenger
496
+ .call('AssetsController:assetsUpdate', response, CONTROLLER_NAME)
497
+ .catch((error) => {
498
+ log('Failed to update detected assets', { error });
499
+ });
500
+ }, _RpcDataSource_registerActionHandlers = function _RpcDataSource_registerActionHandlers() {
279
501
  const getAssetsMiddlewareHandler = () => this.assetsMiddleware;
280
502
  const getActiveChainsHandler = async () => this.getActiveChains();
281
503
  const fetchHandler = async (request) => this.fetch(request);
282
504
  const subscribeHandler = async (request) => this.subscribe(request);
283
505
  const unsubscribeHandler = async (subscriptionId) => this.unsubscribe(subscriptionId);
284
- __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").registerActionHandler('RpcDataSource:getAssetsMiddleware', getAssetsMiddlewareHandler);
285
- __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").registerActionHandler('RpcDataSource:getActiveChains', getActiveChainsHandler);
286
- __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").registerActionHandler('RpcDataSource:fetch', fetchHandler);
287
- __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").registerActionHandler('RpcDataSource:subscribe', subscribeHandler);
288
- __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").registerActionHandler('RpcDataSource:unsubscribe', unsubscribeHandler);
506
+ this.messenger.registerActionHandler('RpcDataSource:getAssetsMiddleware', getAssetsMiddlewareHandler);
507
+ this.messenger.registerActionHandler('RpcDataSource:getActiveChains', getActiveChainsHandler);
508
+ this.messenger.registerActionHandler('RpcDataSource:fetch', fetchHandler);
509
+ this.messenger.registerActionHandler('RpcDataSource:subscribe', subscribeHandler);
510
+ this.messenger.registerActionHandler('RpcDataSource:unsubscribe', unsubscribeHandler);
289
511
  }, _RpcDataSource_subscribeToNetworkController = function _RpcDataSource_subscribeToNetworkController() {
290
- __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").subscribe('NetworkController:stateChange', (networkState) => {
291
- // Clear provider cache since network configurations may have changed
512
+ this.messenger.subscribe('NetworkController:stateChange', (networkState) => {
513
+ log('NetworkController state changed');
292
514
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_clearProviderCache).call(this);
293
515
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_updateFromNetworkState).call(this, networkState);
294
516
  });
295
517
  }, _RpcDataSource_initializeFromNetworkController = function _RpcDataSource_initializeFromNetworkController() {
518
+ log('Initializing from NetworkController');
296
519
  try {
297
- const networkState = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('NetworkController:getState');
520
+ const networkState = this.messenger.call('NetworkController:getState');
298
521
  __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_updateFromNetworkState).call(this, networkState);
299
522
  }
300
523
  catch (error) {
@@ -304,19 +527,15 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_timeout = new WeakMap()
304
527
  const { networkConfigurationsByChainId, networksMetadata } = networkState;
305
528
  const chainStatuses = {};
306
529
  const activeChains = [];
307
- // Iterate through all configured networks
308
530
  for (const [hexChainId, config] of Object.entries(networkConfigurationsByChainId)) {
309
- // Convert hex chainId to CAIP-2 format (eip155:decimal)
310
531
  const decimalChainId = parseInt(hexChainId, 16);
311
532
  const caip2ChainId = `eip155:${decimalChainId}`;
312
- // Get the default RPC endpoint's network client ID
313
533
  const defaultRpcEndpoint = config.rpcEndpoints[config.defaultRpcEndpointIndex];
314
534
  if (!defaultRpcEndpoint) {
315
535
  continue;
316
536
  }
317
537
  const { networkClientId } = defaultRpcEndpoint;
318
538
  const metadata = networksMetadata[networkClientId];
319
- // Determine status - default to 'unknown' if not in metadata
320
539
  const status = metadata?.status ?? 'unknown';
321
540
  chainStatuses[caip2ChainId] = {
322
541
  chainId: caip2ChainId,
@@ -325,84 +544,94 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_timeout = new WeakMap()
325
544
  nativeCurrency: config.nativeCurrency,
326
545
  networkClientId,
327
546
  };
328
- // Only include chains that have an available status
329
- // (not degraded/unavailable/blocked)
330
547
  if (status === 'available' || status === 'unknown') {
331
548
  activeChains.push(caip2ChainId);
332
549
  }
333
550
  }
334
- // Update state
335
- this.state.chainStatuses = chainStatuses;
336
- // Update active chains and report to AssetsController
337
- this.updateActiveChains(activeChains, (chains) => __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:activeChainsUpdate', CONTROLLER_NAME, chains));
551
+ log('Network state updated', {
552
+ configuredChains: Object.keys(chainStatuses),
553
+ activeChains,
554
+ });
555
+ // Check if chains changed
556
+ const previousChains = new Set(__classPrivateFieldGet(this, _RpcDataSource_activeChains, "f"));
557
+ const hasChanges = previousChains.size !== activeChains.length ||
558
+ activeChains.some((chain) => !previousChains.has(chain));
559
+ // Update internal state
560
+ __classPrivateFieldSet(this, _RpcDataSource_chainStatuses, chainStatuses, "f");
561
+ __classPrivateFieldSet(this, _RpcDataSource_activeChains, activeChains, "f");
562
+ if (hasChanges) {
563
+ this.messenger.call('AssetsController:activeChainsUpdate', CONTROLLER_NAME, activeChains);
564
+ }
338
565
  }, _RpcDataSource_getProvider = function _RpcDataSource_getProvider(chainId) {
339
- // Check cache first
340
566
  const cached = __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").get(chainId);
341
567
  if (cached) {
342
568
  return cached;
343
569
  }
344
- // Get chain status to find networkClientId
345
- const chainStatus = this.state.chainStatuses[chainId];
570
+ const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
346
571
  if (!chainStatus) {
347
572
  return undefined;
348
573
  }
349
574
  try {
350
- // Get network client from NetworkController (like TokenBalancesController)
351
- const networkClient = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('NetworkController:getNetworkClientById', chainStatus.networkClientId);
352
- // Create Web3Provider directly
575
+ const networkClient = this.messenger.call('NetworkController:getNetworkClientById', chainStatus.networkClientId);
353
576
  const web3Provider = new providers_1.Web3Provider(networkClient.provider);
354
- // Cache for reuse
355
577
  __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").set(chainId, web3Provider);
356
578
  return web3Provider;
357
579
  }
358
580
  catch (error) {
359
- console.error(`[RpcDataSource] Failed to get provider for chain ${chainId}:`, error);
581
+ log('Failed to get provider for chain', { chainId, error });
360
582
  return undefined;
361
583
  }
584
+ }, _RpcDataSource_getMulticallProvider = function _RpcDataSource_getMulticallProvider(hexChainId) {
585
+ const decimalChainId = parseInt(hexChainId, 16);
586
+ const caip2ChainId = `eip155:${decimalChainId}`;
587
+ const web3Provider = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getProvider).call(this, caip2ChainId);
588
+ if (!web3Provider) {
589
+ throw new Error(`No provider available for chain ${hexChainId}`);
590
+ }
591
+ return {
592
+ call: async (params) => {
593
+ return web3Provider.call({
594
+ to: params.to,
595
+ data: params.data,
596
+ });
597
+ },
598
+ getBalance: async (address) => {
599
+ const balance = await web3Provider.getBalance(address);
600
+ return balance;
601
+ },
602
+ };
362
603
  }, _RpcDataSource_clearProviderCache = function _RpcDataSource_clearProviderCache() {
363
604
  __classPrivateFieldGet(this, _RpcDataSource_providerCache, "f").clear();
364
605
  }, _RpcDataSource_accountSupportsChain = function _RpcDataSource_accountSupportsChain(account, chainId) {
365
606
  const scopes = account.scopes ?? [];
366
- // If no scopes defined, assume it supports the chain (backward compatibility)
367
607
  if (scopes.length === 0) {
368
608
  return true;
369
609
  }
370
- // Extract namespace and reference from chainId (e.g., "eip155:1" -> ["eip155", "1"])
371
610
  const [chainNamespace, chainReference] = chainId.split(':');
372
611
  for (const scope of scopes) {
373
612
  const [scopeNamespace, scopeReference] = scope.split(':');
374
- // Check if namespaces match
375
613
  if (scopeNamespace !== chainNamespace) {
376
614
  continue;
377
615
  }
378
- // Wildcard scope (e.g., "eip155:0" means all chains in that namespace)
616
+ // Wildcard scope (e.g., eip155:0) matches all chains in the namespace
379
617
  if (scopeReference === '0') {
380
618
  return true;
381
619
  }
382
- // Exact match check - normalize hex to decimal for EIP155
383
- if (chainNamespace === 'eip155') {
384
- const normalizedScopeRef = scopeReference?.startsWith('0x')
385
- ? parseInt(scopeReference, 16).toString()
386
- : scopeReference;
387
- if (normalizedScopeRef === chainReference) {
388
- return true;
389
- }
390
- }
391
- else if (scopeReference === chainReference) {
620
+ // RpcDataSource only handles eip155 (EVM) chains
621
+ // Normalize hex chain references (e.g., 0x1 -> 1) for comparison
622
+ const normalizedScopeRef = scopeReference?.startsWith('0x')
623
+ ? parseInt(scopeReference, 16).toString()
624
+ : scopeReference;
625
+ if (normalizedScopeRef === chainReference) {
392
626
  return true;
393
627
  }
394
628
  }
395
629
  return false;
630
+ }, _RpcDataSource_buildNativeAssetId = function _RpcDataSource_buildNativeAssetId(chainId) {
631
+ const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');
632
+ return (nativeAssetIdentifiers[chainId] ??
633
+ `${chainId}/slip44:60`);
396
634
  };
397
- // ============================================================================
398
- // FACTORY FUNCTION
399
- // ============================================================================
400
- /**
401
- * Creates an RpcDataSource instance.
402
- *
403
- * @param options - Configuration options for the data source.
404
- * @returns A new RpcDataSource instance.
405
- */
406
635
  function createRpcDataSource(options) {
407
636
  return new RpcDataSource(options);
408
637
  }