@metamask-previews/assets-controller 0.0.0-preview-903db2da → 0.0.0-preview-3ec2a74

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 (250) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/AssetsController.cjs +1028 -61
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +229 -83
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +229 -83
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +1024 -59
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/AbstractDataSource.cjs +103 -0
  11. package/dist/data-sources/AbstractDataSource.cjs.map +1 -0
  12. package/dist/data-sources/AbstractDataSource.d.cts +92 -0
  13. package/dist/data-sources/AbstractDataSource.d.cts.map +1 -0
  14. package/dist/data-sources/AbstractDataSource.d.mts +92 -0
  15. package/dist/data-sources/AbstractDataSource.d.mts.map +1 -0
  16. package/dist/data-sources/AbstractDataSource.mjs +99 -0
  17. package/dist/data-sources/AbstractDataSource.mjs.map +1 -0
  18. package/dist/data-sources/AccountsApiDataSource.cjs +421 -0
  19. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -0
  20. package/dist/data-sources/AccountsApiDataSource.d.cts +103 -0
  21. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -0
  22. package/dist/data-sources/AccountsApiDataSource.d.mts +103 -0
  23. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -0
  24. package/dist/data-sources/AccountsApiDataSource.mjs +416 -0
  25. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -0
  26. package/dist/data-sources/BackendWebsocketDataSource.cjs +388 -0
  27. package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -0
  28. package/dist/data-sources/BackendWebsocketDataSource.d.cts +95 -0
  29. package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -0
  30. package/dist/data-sources/BackendWebsocketDataSource.d.mts +95 -0
  31. package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -0
  32. package/dist/data-sources/BackendWebsocketDataSource.mjs +383 -0
  33. package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -0
  34. package/dist/data-sources/PriceDataSource.cjs +350 -0
  35. package/dist/data-sources/PriceDataSource.cjs.map +1 -0
  36. package/dist/data-sources/PriceDataSource.d.cts +153 -0
  37. package/dist/data-sources/PriceDataSource.d.cts.map +1 -0
  38. package/dist/data-sources/PriceDataSource.d.mts +153 -0
  39. package/dist/data-sources/PriceDataSource.d.mts.map +1 -0
  40. package/dist/data-sources/PriceDataSource.mjs +346 -0
  41. package/dist/data-sources/PriceDataSource.mjs.map +1 -0
  42. package/dist/data-sources/RpcDataSource.cjs +410 -0
  43. package/dist/data-sources/RpcDataSource.cjs.map +1 -0
  44. package/dist/data-sources/RpcDataSource.d.cts +154 -0
  45. package/dist/data-sources/RpcDataSource.d.cts.map +1 -0
  46. package/dist/data-sources/RpcDataSource.d.mts +154 -0
  47. package/dist/data-sources/RpcDataSource.d.mts.map +1 -0
  48. package/dist/data-sources/RpcDataSource.mjs +405 -0
  49. package/dist/data-sources/RpcDataSource.mjs.map +1 -0
  50. package/dist/data-sources/SnapDataSource.cjs +734 -0
  51. package/dist/data-sources/SnapDataSource.cjs.map +1 -0
  52. package/dist/data-sources/SnapDataSource.d.cts +217 -0
  53. package/dist/data-sources/SnapDataSource.d.cts.map +1 -0
  54. package/dist/data-sources/SnapDataSource.d.mts +217 -0
  55. package/dist/data-sources/SnapDataSource.d.mts.map +1 -0
  56. package/dist/data-sources/SnapDataSource.mjs +723 -0
  57. package/dist/data-sources/SnapDataSource.mjs.map +1 -0
  58. package/dist/data-sources/TokenDataSource.cjs +179 -0
  59. package/dist/data-sources/TokenDataSource.cjs.map +1 -0
  60. package/dist/data-sources/TokenDataSource.d.cts +62 -0
  61. package/dist/data-sources/TokenDataSource.d.cts.map +1 -0
  62. package/dist/data-sources/TokenDataSource.d.mts +62 -0
  63. package/dist/data-sources/TokenDataSource.d.mts.map +1 -0
  64. package/dist/data-sources/TokenDataSource.mjs +175 -0
  65. package/dist/data-sources/TokenDataSource.mjs.map +1 -0
  66. package/dist/data-sources/index.cjs +62 -0
  67. package/dist/data-sources/index.cjs.map +1 -0
  68. package/dist/data-sources/index.d.cts +9 -0
  69. package/dist/data-sources/index.d.cts.map +1 -0
  70. package/dist/data-sources/index.d.mts +9 -0
  71. package/dist/data-sources/index.d.mts.map +1 -0
  72. package/dist/data-sources/index.mjs +23 -0
  73. package/dist/data-sources/index.mjs.map +1 -0
  74. package/dist/data-sources/initDataSources.cjs +199 -0
  75. package/dist/data-sources/initDataSources.cjs.map +1 -0
  76. package/dist/data-sources/initDataSources.d.cts +123 -0
  77. package/dist/data-sources/initDataSources.d.cts.map +1 -0
  78. package/dist/data-sources/initDataSources.d.mts +123 -0
  79. package/dist/data-sources/initDataSources.d.mts.map +1 -0
  80. package/dist/data-sources/initDataSources.mjs +194 -0
  81. package/dist/data-sources/initDataSources.mjs.map +1 -0
  82. package/dist/data-sources/rpc-datasource/clients/MulticallClient.cjs +638 -0
  83. package/dist/data-sources/rpc-datasource/clients/MulticallClient.cjs.map +1 -0
  84. package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.cts +47 -0
  85. package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.cts.map +1 -0
  86. package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.mts +47 -0
  87. package/dist/data-sources/rpc-datasource/clients/MulticallClient.d.mts.map +1 -0
  88. package/dist/data-sources/rpc-datasource/clients/MulticallClient.mjs +632 -0
  89. package/dist/data-sources/rpc-datasource/clients/MulticallClient.mjs.map +1 -0
  90. package/dist/data-sources/rpc-datasource/clients/index.cjs +8 -0
  91. package/dist/data-sources/rpc-datasource/clients/index.cjs.map +1 -0
  92. package/dist/data-sources/rpc-datasource/clients/index.d.cts +3 -0
  93. package/dist/data-sources/rpc-datasource/clients/index.d.cts.map +1 -0
  94. package/dist/data-sources/rpc-datasource/clients/index.d.mts +3 -0
  95. package/dist/data-sources/rpc-datasource/clients/index.d.mts.map +1 -0
  96. package/dist/data-sources/rpc-datasource/clients/index.mjs +2 -0
  97. package/dist/data-sources/rpc-datasource/clients/index.mjs.map +1 -0
  98. package/dist/data-sources/rpc-datasource/index.cjs +9 -0
  99. package/dist/data-sources/rpc-datasource/index.cjs.map +1 -0
  100. package/dist/data-sources/rpc-datasource/index.d.cts +4 -0
  101. package/dist/data-sources/rpc-datasource/index.d.cts.map +1 -0
  102. package/dist/data-sources/rpc-datasource/index.d.mts +4 -0
  103. package/dist/data-sources/rpc-datasource/index.d.mts.map +1 -0
  104. package/dist/data-sources/rpc-datasource/index.mjs +3 -0
  105. package/dist/data-sources/rpc-datasource/index.mjs.map +1 -0
  106. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.cjs +167 -0
  107. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.cjs.map +1 -0
  108. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts +16 -0
  109. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.cts.map +1 -0
  110. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts +16 -0
  111. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.d.mts.map +1 -0
  112. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.mjs +163 -0
  113. package/dist/data-sources/rpc-datasource/services/BalanceFetcher.mjs.map +1 -0
  114. package/dist/data-sources/rpc-datasource/services/TokenDetector.cjs +173 -0
  115. package/dist/data-sources/rpc-datasource/services/TokenDetector.cjs.map +1 -0
  116. package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts +14 -0
  117. package/dist/data-sources/rpc-datasource/services/TokenDetector.d.cts.map +1 -0
  118. package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts +14 -0
  119. package/dist/data-sources/rpc-datasource/services/TokenDetector.d.mts.map +1 -0
  120. package/dist/data-sources/rpc-datasource/services/TokenDetector.mjs +169 -0
  121. package/dist/data-sources/rpc-datasource/services/TokenDetector.mjs.map +1 -0
  122. package/dist/data-sources/rpc-datasource/services/index.cjs +8 -0
  123. package/dist/data-sources/rpc-datasource/services/index.cjs.map +1 -0
  124. package/dist/data-sources/rpc-datasource/services/index.d.cts +3 -0
  125. package/dist/data-sources/rpc-datasource/services/index.d.cts.map +1 -0
  126. package/dist/data-sources/rpc-datasource/services/index.d.mts +3 -0
  127. package/dist/data-sources/rpc-datasource/services/index.d.mts.map +1 -0
  128. package/dist/data-sources/rpc-datasource/services/index.mjs +3 -0
  129. package/dist/data-sources/rpc-datasource/services/index.mjs.map +1 -0
  130. package/dist/data-sources/rpc-datasource/types/assets.cjs +3 -0
  131. package/dist/data-sources/rpc-datasource/types/assets.cjs.map +1 -0
  132. package/dist/data-sources/rpc-datasource/types/assets.d.cts +53 -0
  133. package/dist/data-sources/rpc-datasource/types/assets.d.cts.map +1 -0
  134. package/dist/data-sources/rpc-datasource/types/assets.d.mts +53 -0
  135. package/dist/data-sources/rpc-datasource/types/assets.d.mts.map +1 -0
  136. package/dist/data-sources/rpc-datasource/types/assets.mjs +2 -0
  137. package/dist/data-sources/rpc-datasource/types/assets.mjs.map +1 -0
  138. package/dist/data-sources/rpc-datasource/types/config.cjs +3 -0
  139. package/dist/data-sources/rpc-datasource/types/config.cjs.map +1 -0
  140. package/dist/data-sources/rpc-datasource/types/config.d.cts +18 -0
  141. package/dist/data-sources/rpc-datasource/types/config.d.cts.map +1 -0
  142. package/dist/data-sources/rpc-datasource/types/config.d.mts +18 -0
  143. package/dist/data-sources/rpc-datasource/types/config.d.mts.map +1 -0
  144. package/dist/data-sources/rpc-datasource/types/config.mjs +2 -0
  145. package/dist/data-sources/rpc-datasource/types/config.mjs.map +1 -0
  146. package/dist/data-sources/rpc-datasource/types/core.cjs +3 -0
  147. package/dist/data-sources/rpc-datasource/types/core.cjs.map +1 -0
  148. package/dist/data-sources/rpc-datasource/types/core.d.cts +19 -0
  149. package/dist/data-sources/rpc-datasource/types/core.d.cts.map +1 -0
  150. package/dist/data-sources/rpc-datasource/types/core.d.mts +19 -0
  151. package/dist/data-sources/rpc-datasource/types/core.d.mts.map +1 -0
  152. package/dist/data-sources/rpc-datasource/types/core.mjs +2 -0
  153. package/dist/data-sources/rpc-datasource/types/core.mjs.map +1 -0
  154. package/dist/data-sources/rpc-datasource/types/index.cjs +3 -0
  155. package/dist/data-sources/rpc-datasource/types/index.cjs.map +1 -0
  156. package/dist/data-sources/rpc-datasource/types/index.d.cts +7 -0
  157. package/dist/data-sources/rpc-datasource/types/index.d.cts.map +1 -0
  158. package/dist/data-sources/rpc-datasource/types/index.d.mts +7 -0
  159. package/dist/data-sources/rpc-datasource/types/index.d.mts.map +1 -0
  160. package/dist/data-sources/rpc-datasource/types/index.mjs +2 -0
  161. package/dist/data-sources/rpc-datasource/types/index.mjs.map +1 -0
  162. package/dist/data-sources/rpc-datasource/types/multicall.cjs +3 -0
  163. package/dist/data-sources/rpc-datasource/types/multicall.cjs.map +1 -0
  164. package/dist/data-sources/rpc-datasource/types/multicall.d.cts +24 -0
  165. package/dist/data-sources/rpc-datasource/types/multicall.d.cts.map +1 -0
  166. package/dist/data-sources/rpc-datasource/types/multicall.d.mts +24 -0
  167. package/dist/data-sources/rpc-datasource/types/multicall.d.mts.map +1 -0
  168. package/dist/data-sources/rpc-datasource/types/multicall.mjs +2 -0
  169. package/dist/data-sources/rpc-datasource/types/multicall.mjs.map +1 -0
  170. package/dist/data-sources/rpc-datasource/types/services.cjs +3 -0
  171. package/dist/data-sources/rpc-datasource/types/services.cjs.map +1 -0
  172. package/dist/data-sources/rpc-datasource/types/services.d.cts +74 -0
  173. package/dist/data-sources/rpc-datasource/types/services.d.cts.map +1 -0
  174. package/dist/data-sources/rpc-datasource/types/services.d.mts +74 -0
  175. package/dist/data-sources/rpc-datasource/types/services.d.mts.map +1 -0
  176. package/dist/data-sources/rpc-datasource/types/services.mjs +2 -0
  177. package/dist/data-sources/rpc-datasource/types/services.mjs.map +1 -0
  178. package/dist/data-sources/rpc-datasource/types/state.cjs +3 -0
  179. package/dist/data-sources/rpc-datasource/types/state.cjs.map +1 -0
  180. package/dist/data-sources/rpc-datasource/types/state.d.cts +67 -0
  181. package/dist/data-sources/rpc-datasource/types/state.d.cts.map +1 -0
  182. package/dist/data-sources/rpc-datasource/types/state.d.mts +67 -0
  183. package/dist/data-sources/rpc-datasource/types/state.d.mts.map +1 -0
  184. package/dist/data-sources/rpc-datasource/types/state.mjs +2 -0
  185. package/dist/data-sources/rpc-datasource/types/state.mjs.map +1 -0
  186. package/dist/data-sources/rpc-datasource/utils/batch.cjs +45 -0
  187. package/dist/data-sources/rpc-datasource/utils/batch.cjs.map +1 -0
  188. package/dist/data-sources/rpc-datasource/utils/batch.d.cts +28 -0
  189. package/dist/data-sources/rpc-datasource/utils/batch.d.cts.map +1 -0
  190. package/dist/data-sources/rpc-datasource/utils/batch.d.mts +28 -0
  191. package/dist/data-sources/rpc-datasource/utils/batch.d.mts.map +1 -0
  192. package/dist/data-sources/rpc-datasource/utils/batch.mjs +40 -0
  193. package/dist/data-sources/rpc-datasource/utils/batch.mjs.map +1 -0
  194. package/dist/data-sources/rpc-datasource/utils/index.cjs +7 -0
  195. package/dist/data-sources/rpc-datasource/utils/index.cjs.map +1 -0
  196. package/dist/data-sources/rpc-datasource/utils/index.d.cts +2 -0
  197. package/dist/data-sources/rpc-datasource/utils/index.d.cts.map +1 -0
  198. package/dist/data-sources/rpc-datasource/utils/index.d.mts +2 -0
  199. package/dist/data-sources/rpc-datasource/utils/index.d.mts.map +1 -0
  200. package/dist/data-sources/rpc-datasource/utils/index.mjs +2 -0
  201. package/dist/data-sources/rpc-datasource/utils/index.mjs.map +1 -0
  202. package/dist/index.cjs +70 -1
  203. package/dist/index.cjs.map +1 -1
  204. package/dist/index.d.cts +19 -1
  205. package/dist/index.d.cts.map +1 -1
  206. package/dist/index.d.mts +19 -1
  207. package/dist/index.d.mts.map +1 -1
  208. package/dist/index.mjs +31 -0
  209. package/dist/index.mjs.map +1 -1
  210. package/dist/logger.cjs +7 -0
  211. package/dist/logger.cjs.map +1 -0
  212. package/dist/logger.d.cts +5 -0
  213. package/dist/logger.d.cts.map +1 -0
  214. package/dist/logger.d.mts +5 -0
  215. package/dist/logger.d.mts.map +1 -0
  216. package/dist/logger.mjs +4 -0
  217. package/dist/logger.mjs.map +1 -0
  218. package/dist/middlewares/DetectionMiddleware.cjs +101 -0
  219. package/dist/middlewares/DetectionMiddleware.cjs.map +1 -0
  220. package/dist/middlewares/DetectionMiddleware.d.cts +54 -0
  221. package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -0
  222. package/dist/middlewares/DetectionMiddleware.d.mts +54 -0
  223. package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -0
  224. package/dist/middlewares/DetectionMiddleware.mjs +97 -0
  225. package/dist/middlewares/DetectionMiddleware.mjs.map +1 -0
  226. package/dist/middlewares/index.cjs +6 -0
  227. package/dist/middlewares/index.cjs.map +1 -0
  228. package/dist/middlewares/index.d.cts +2 -0
  229. package/dist/middlewares/index.d.cts.map +1 -0
  230. package/dist/middlewares/index.d.mts +2 -0
  231. package/dist/middlewares/index.d.mts.map +1 -0
  232. package/dist/middlewares/index.mjs +2 -0
  233. package/dist/middlewares/index.mjs.map +1 -0
  234. package/dist/types.cjs +39 -0
  235. package/dist/types.cjs.map +1 -0
  236. package/dist/types.d.cts +360 -0
  237. package/dist/types.d.cts.map +1 -0
  238. package/dist/types.d.mts +360 -0
  239. package/dist/types.d.mts.map +1 -0
  240. package/dist/types.mjs +35 -0
  241. package/dist/types.mjs.map +1 -0
  242. package/dist/utils.cjs +28 -0
  243. package/dist/utils.cjs.map +1 -0
  244. package/dist/utils.d.cts +13 -0
  245. package/dist/utils.d.cts.map +1 -0
  246. package/dist/utils.d.mts +13 -0
  247. package/dist/utils.d.mts.map +1 -0
  248. package/dist/utils.mjs +24 -0
  249. package/dist/utils.mjs.map +1 -0
  250. package/package.json +15 -2
@@ -0,0 +1,734 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _SnapDataSource_instances, _SnapDataSource_messenger, _SnapDataSource_snapProvider, _SnapDataSource_subscribeToSnapKeyringEvents, _SnapDataSource_handleSnapBalancesUpdated, _SnapDataSource_registerActionHandlers, _SnapDataSource_getInstalledSnaps, _SnapDataSource_checkSnapAvailabilityOnDemand, _SnapDataSource_checkAllSnapsAvailability, _SnapDataSource_accountSupportsChain, _SnapDataSource_groupChainsBySnap, _SnapDataSource_fetchFromSnap;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.createSnapDataSource = exports.SnapDataSource = exports.isTronChain = exports.isBitcoinChain = exports.isSolanaChain = exports.extractChainFromAssetId = exports.isSnapSupportedChain = exports.getSnapTypeForChain = exports.SNAP_REGISTRY = exports.ALL_DEFAULT_NETWORKS = exports.DEFAULT_SNAP_POLL_INTERVAL = exports.DEFAULT_TRON_POLL_INTERVAL = exports.DEFAULT_BITCOIN_POLL_INTERVAL = exports.DEFAULT_SOLANA_POLL_INTERVAL = exports.TRON_NILE_HEX = exports.TRON_SHASTA_HEX = exports.TRON_MAINNET_HEX = exports.TRON_NILE = exports.TRON_SHASTA = exports.TRON_MAINNET = exports.BITCOIN_TESTNET = exports.BITCOIN_MAINNET = exports.SOLANA_TESTNET = exports.SOLANA_DEVNET = exports.SOLANA_MAINNET = exports.TRON_CHAIN_PREFIX = exports.BITCOIN_CHAIN_PREFIX = exports.SOLANA_CHAIN_PREFIX = exports.TRON_SNAP_ID = exports.BITCOIN_SNAP_ID = exports.SOLANA_SNAP_ID = exports.SNAP_DATA_SOURCE_NAME = void 0;
16
+ const AbstractDataSource_1 = require("./AbstractDataSource.cjs");
17
+ const logger_1 = require("../logger.cjs");
18
+ const log = (0, logger_1.createModuleLogger)(logger_1.projectLogger, 'SnapDataSource');
19
+ // ============================================================================
20
+ // CONSTANTS
21
+ // ============================================================================
22
+ exports.SNAP_DATA_SOURCE_NAME = 'SnapDataSource';
23
+ // Snap IDs
24
+ exports.SOLANA_SNAP_ID = 'npm:@metamask/solana-wallet-snap';
25
+ exports.BITCOIN_SNAP_ID = 'npm:@metamask/bitcoin-wallet-snap';
26
+ exports.TRON_SNAP_ID = 'npm:@metamask/tron-wallet-snap';
27
+ // Chain prefixes for detection
28
+ exports.SOLANA_CHAIN_PREFIX = 'solana:';
29
+ exports.BITCOIN_CHAIN_PREFIX = 'bip122:';
30
+ exports.TRON_CHAIN_PREFIX = 'tron:';
31
+ // Default networks
32
+ exports.SOLANA_MAINNET = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';
33
+ exports.SOLANA_DEVNET = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1';
34
+ exports.SOLANA_TESTNET = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z';
35
+ exports.BITCOIN_MAINNET = 'bip122:000000000019d6689c085ae165831e93';
36
+ exports.BITCOIN_TESTNET = 'bip122:000000000933ea01ad0ee984209779ba';
37
+ exports.TRON_MAINNET = 'tron:728126428';
38
+ exports.TRON_SHASTA = 'tron:2494104990';
39
+ exports.TRON_NILE = 'tron:3448148188';
40
+ // Hex format alternatives for Tron
41
+ exports.TRON_MAINNET_HEX = 'tron:0x2b6653dc';
42
+ exports.TRON_SHASTA_HEX = 'tron:0x94a9059e';
43
+ exports.TRON_NILE_HEX = 'tron:0xcd8690dc';
44
+ // Default poll intervals
45
+ exports.DEFAULT_SOLANA_POLL_INTERVAL = 30000; // 30 seconds
46
+ exports.DEFAULT_BITCOIN_POLL_INTERVAL = 60000; // 1 minute
47
+ exports.DEFAULT_TRON_POLL_INTERVAL = 30000; // 30 seconds
48
+ exports.DEFAULT_SNAP_POLL_INTERVAL = 30000; // Default for unknown snaps
49
+ // All default networks
50
+ exports.ALL_DEFAULT_NETWORKS = [
51
+ exports.SOLANA_MAINNET,
52
+ exports.SOLANA_DEVNET,
53
+ exports.SOLANA_TESTNET,
54
+ exports.BITCOIN_MAINNET,
55
+ exports.BITCOIN_TESTNET,
56
+ exports.TRON_MAINNET,
57
+ exports.TRON_SHASTA,
58
+ exports.TRON_NILE,
59
+ exports.TRON_MAINNET_HEX,
60
+ exports.TRON_SHASTA_HEX,
61
+ exports.TRON_NILE_HEX,
62
+ ];
63
+ exports.SNAP_REGISTRY = {
64
+ solana: {
65
+ snapId: exports.SOLANA_SNAP_ID,
66
+ chainPrefix: exports.SOLANA_CHAIN_PREFIX,
67
+ pollInterval: exports.DEFAULT_SOLANA_POLL_INTERVAL,
68
+ },
69
+ bitcoin: {
70
+ snapId: exports.BITCOIN_SNAP_ID,
71
+ chainPrefix: exports.BITCOIN_CHAIN_PREFIX,
72
+ pollInterval: exports.DEFAULT_BITCOIN_POLL_INTERVAL,
73
+ },
74
+ tron: {
75
+ snapId: exports.TRON_SNAP_ID,
76
+ chainPrefix: exports.TRON_CHAIN_PREFIX,
77
+ pollInterval: exports.DEFAULT_TRON_POLL_INTERVAL,
78
+ },
79
+ };
80
+ /**
81
+ * Get the snap type for a chain ID based on its prefix.
82
+ *
83
+ * @param chainId - The CAIP-2 chain ID to check.
84
+ * @returns The snap type for the chain, or null if not supported.
85
+ */
86
+ function getSnapTypeForChain(chainId) {
87
+ if (chainId.startsWith(exports.SOLANA_CHAIN_PREFIX)) {
88
+ return 'solana';
89
+ }
90
+ if (chainId.startsWith(exports.BITCOIN_CHAIN_PREFIX)) {
91
+ return 'bitcoin';
92
+ }
93
+ if (chainId.startsWith(exports.TRON_CHAIN_PREFIX)) {
94
+ return 'tron';
95
+ }
96
+ return null;
97
+ }
98
+ exports.getSnapTypeForChain = getSnapTypeForChain;
99
+ /**
100
+ * Check if a chain ID is supported by a snap.
101
+ *
102
+ * @param chainId - The CAIP-2 chain ID to check.
103
+ * @returns True if the chain is supported by a snap.
104
+ */
105
+ function isSnapSupportedChain(chainId) {
106
+ return getSnapTypeForChain(chainId) !== null;
107
+ }
108
+ exports.isSnapSupportedChain = isSnapSupportedChain;
109
+ /**
110
+ * Extract chain ID from a CAIP-19 asset ID.
111
+ * e.g., "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501" -> "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
112
+ *
113
+ * @param assetId - The CAIP-19 asset ID to extract chain from.
114
+ * @returns The CAIP-2 chain ID portion of the asset ID.
115
+ */
116
+ function extractChainFromAssetId(assetId) {
117
+ const parts = assetId.split('/');
118
+ return parts[0];
119
+ }
120
+ exports.extractChainFromAssetId = extractChainFromAssetId;
121
+ // Helper functions for specific chain types
122
+ function isSolanaChain(chainId) {
123
+ return chainId.startsWith(exports.SOLANA_CHAIN_PREFIX);
124
+ }
125
+ exports.isSolanaChain = isSolanaChain;
126
+ function isBitcoinChain(chainId) {
127
+ return chainId.startsWith(exports.BITCOIN_CHAIN_PREFIX);
128
+ }
129
+ exports.isBitcoinChain = isBitcoinChain;
130
+ function isTronChain(chainId) {
131
+ return chainId.startsWith(exports.TRON_CHAIN_PREFIX);
132
+ }
133
+ exports.isTronChain = isTronChain;
134
+ const defaultSnapState = {
135
+ activeChains: exports.ALL_DEFAULT_NETWORKS,
136
+ snaps: {
137
+ solana: { version: null, available: false },
138
+ bitcoin: { version: null, available: false },
139
+ tron: { version: null, available: false },
140
+ },
141
+ };
142
+ // ============================================================================
143
+ // SNAP DATA SOURCE
144
+ // ============================================================================
145
+ /**
146
+ * Unified Snap data source that routes requests to the appropriate wallet snap
147
+ * based on the chain ID prefix.
148
+ *
149
+ * Supports:
150
+ * - Solana chains (solana:*) → @metamask/solana-wallet-snap
151
+ * - Bitcoin chains (bip122:*) → @metamask/bitcoin-wallet-snap
152
+ * - Tron chains (tron:*) → @metamask/tron-wallet-snap
153
+ *
154
+ * @example
155
+ * ```typescript
156
+ * const snapDataSource = new SnapDataSource({
157
+ * messenger,
158
+ * snapProvider: metamaskProvider,
159
+ * });
160
+ *
161
+ * // Fetch will automatically route to the correct snap
162
+ * await snapDataSource.fetch({
163
+ * chainIds: ['solana:mainnet', 'bip122:000000000019d6689c085ae165831e93'],
164
+ * accountIds: ['account1'],
165
+ * });
166
+ * ```
167
+ */
168
+ class SnapDataSource extends AbstractDataSource_1.AbstractDataSource {
169
+ constructor(options) {
170
+ const configuredNetworks = options.configuredNetworks ?? exports.ALL_DEFAULT_NETWORKS;
171
+ super(exports.SNAP_DATA_SOURCE_NAME, {
172
+ ...defaultSnapState,
173
+ ...options.state,
174
+ activeChains: configuredNetworks,
175
+ });
176
+ _SnapDataSource_instances.add(this);
177
+ _SnapDataSource_messenger.set(this, void 0);
178
+ _SnapDataSource_snapProvider.set(this, void 0);
179
+ __classPrivateFieldSet(this, _SnapDataSource_messenger, options.messenger, "f");
180
+ __classPrivateFieldSet(this, _SnapDataSource_snapProvider, options.snapProvider, "f");
181
+ __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_registerActionHandlers).call(this);
182
+ __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_subscribeToSnapKeyringEvents).call(this);
183
+ // Check availability for all snaps on initialization
184
+ __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_checkAllSnapsAvailability).call(this).catch(() => {
185
+ // Silently ignore availability check failures on init
186
+ });
187
+ }
188
+ /**
189
+ * Get info about all snaps.
190
+ *
191
+ * @returns Record of snap info keyed by snap type.
192
+ */
193
+ getSnapsInfo() {
194
+ const result = {};
195
+ for (const [snapType, config] of Object.entries(exports.SNAP_REGISTRY)) {
196
+ const state = this.state.snaps[snapType];
197
+ result[snapType] = {
198
+ ...config,
199
+ version: state.version,
200
+ available: state.available,
201
+ };
202
+ }
203
+ return result;
204
+ }
205
+ /**
206
+ * Check if a specific snap is available.
207
+ *
208
+ * @param snapType - The snap type to check (solana, bitcoin, tron).
209
+ * @returns True if the snap is available.
210
+ */
211
+ isSnapAvailable(snapType) {
212
+ return this.state.snaps[snapType]?.available ?? false;
213
+ }
214
+ /**
215
+ * Force refresh snap availability check.
216
+ */
217
+ async refreshSnapsStatus() {
218
+ await __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_checkAllSnapsAvailability).call(this);
219
+ }
220
+ // ============================================================================
221
+ // CHAIN MANAGEMENT
222
+ // ============================================================================
223
+ addNetworks(chainIds) {
224
+ const snapChains = chainIds.filter(isSnapSupportedChain);
225
+ const newChains = snapChains.filter((chain) => !this.state.activeChains.includes(chain));
226
+ if (newChains.length > 0) {
227
+ const updated = [...this.state.activeChains, ...newChains];
228
+ this.updateActiveChains(updated, (updatedChains) => __classPrivateFieldGet(this, _SnapDataSource_messenger, "f").call('AssetsController:activeChainsUpdate', exports.SNAP_DATA_SOURCE_NAME, updatedChains));
229
+ }
230
+ }
231
+ removeNetworks(chainIds) {
232
+ const chainSet = new Set(chainIds);
233
+ const updated = this.state.activeChains.filter((chain) => !chainSet.has(chain));
234
+ if (updated.length !== this.state.activeChains.length) {
235
+ this.updateActiveChains(updated, (updatedChains) => __classPrivateFieldGet(this, _SnapDataSource_messenger, "f").call('AssetsController:activeChainsUpdate', exports.SNAP_DATA_SOURCE_NAME, updatedChains));
236
+ }
237
+ }
238
+ // ============================================================================
239
+ // FETCH - Routes to appropriate snap(s)
240
+ // ============================================================================
241
+ async fetch(request) {
242
+ // Guard against undefined request or chainIds
243
+ if (!request?.chainIds) {
244
+ return {};
245
+ }
246
+ // Filter to only snap-supported chains
247
+ const snapChains = request.chainIds.filter(isSnapSupportedChain);
248
+ if (snapChains.length === 0) {
249
+ return {};
250
+ }
251
+ // Group chains by snap type
252
+ const chainsBySnap = __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_groupChainsBySnap).call(this, snapChains);
253
+ // Fetch from each snap in parallel
254
+ const results = await Promise.all(Object.entries(chainsBySnap).map(async ([snapType, chains]) => {
255
+ return __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_fetchFromSnap).call(this, snapType, {
256
+ ...request,
257
+ chainIds: chains,
258
+ });
259
+ }));
260
+ // Merge all results
261
+ const mergedResponse = {};
262
+ for (const result of results) {
263
+ if (result.assetsBalance) {
264
+ mergedResponse.assetsBalance = {
265
+ ...mergedResponse.assetsBalance,
266
+ ...result.assetsBalance,
267
+ };
268
+ }
269
+ if (result.assetsMetadata) {
270
+ mergedResponse.assetsMetadata = {
271
+ ...mergedResponse.assetsMetadata,
272
+ ...result.assetsMetadata,
273
+ };
274
+ }
275
+ if (result.assetsPrice) {
276
+ mergedResponse.assetsPrice = {
277
+ ...mergedResponse.assetsPrice,
278
+ ...result.assetsPrice,
279
+ };
280
+ }
281
+ if (result.errors) {
282
+ mergedResponse.errors = { ...mergedResponse.errors, ...result.errors };
283
+ }
284
+ }
285
+ return mergedResponse;
286
+ }
287
+ // ============================================================================
288
+ // MIDDLEWARE
289
+ // ============================================================================
290
+ /**
291
+ * Get the middleware for fetching balances via Snaps.
292
+ * This middleware:
293
+ * - Supports multiple accounts in a single request
294
+ * - Filters request to only chains this data source supports
295
+ * - Fetches balances for those chains for all accounts
296
+ * - Merges response into context
297
+ * - Removes handled chains from request for next middleware
298
+ *
299
+ * @returns The middleware function for the assets pipeline.
300
+ */
301
+ get assetsMiddleware() {
302
+ return async (context, next) => {
303
+ var _a;
304
+ const { request } = context;
305
+ // Filter to chains this data source supports
306
+ const supportedChains = request.chainIds.filter((chainId) => this.state.activeChains.includes(chainId));
307
+ // If no supported chains, skip and pass to next middleware
308
+ if (supportedChains.length === 0) {
309
+ return next(context);
310
+ }
311
+ let successfullyHandledChains = [];
312
+ try {
313
+ // Fetch for supported chains
314
+ const response = await this.fetch({
315
+ ...request,
316
+ chainIds: supportedChains,
317
+ });
318
+ // Merge response into context
319
+ if (response.assetsBalance) {
320
+ (_a = context.response).assetsBalance ?? (_a.assetsBalance = {});
321
+ for (const [accountId, accountBalances] of Object.entries(response.assetsBalance)) {
322
+ context.response.assetsBalance[accountId] = {
323
+ ...context.response.assetsBalance[accountId],
324
+ ...accountBalances,
325
+ };
326
+ }
327
+ }
328
+ if (response.assetsMetadata) {
329
+ context.response.assetsMetadata = {
330
+ ...context.response.assetsMetadata,
331
+ ...response.assetsMetadata,
332
+ };
333
+ }
334
+ if (response.assetsPrice) {
335
+ context.response.assetsPrice = {
336
+ ...context.response.assetsPrice,
337
+ ...response.assetsPrice,
338
+ };
339
+ }
340
+ // Determine successfully handled chains (exclude errors)
341
+ const failedChains = new Set(Object.keys(response.errors ?? {}));
342
+ successfullyHandledChains = supportedChains.filter((chainId) => !failedChains.has(chainId));
343
+ }
344
+ catch (error) {
345
+ log('Middleware fetch failed', { error });
346
+ successfullyHandledChains = [];
347
+ }
348
+ // Prepare context for next middleware
349
+ let nextContext = context;
350
+ if (successfullyHandledChains.length > 0) {
351
+ const remainingChains = request.chainIds.filter((chainId) => !successfullyHandledChains.includes(chainId));
352
+ nextContext = {
353
+ ...context,
354
+ request: {
355
+ ...request,
356
+ chainIds: remainingChains,
357
+ },
358
+ };
359
+ }
360
+ // Call next middleware
361
+ return next(nextContext);
362
+ };
363
+ }
364
+ // ============================================================================
365
+ // SUBSCRIBE - Routes to appropriate snap(s)
366
+ // ============================================================================
367
+ async subscribe(subscriptionRequest) {
368
+ const { request, subscriptionId, isUpdate } = subscriptionRequest;
369
+ // Guard against undefined request or chainIds
370
+ if (!request?.chainIds) {
371
+ return;
372
+ }
373
+ // Filter to only snap-supported chains
374
+ const snapChains = request.chainIds.filter(isSnapSupportedChain);
375
+ if (snapChains.length === 0) {
376
+ return;
377
+ }
378
+ if (isUpdate) {
379
+ const existing = this.activeSubscriptions.get(subscriptionId);
380
+ if (existing) {
381
+ existing.chains = snapChains;
382
+ // Do a fetch to get latest data on subscription update
383
+ this.fetch({
384
+ ...request,
385
+ chainIds: snapChains,
386
+ })
387
+ .then(async (fetchResponse) => {
388
+ if (Object.keys(fetchResponse.assetsBalance ?? {}).length > 0) {
389
+ await __classPrivateFieldGet(this, _SnapDataSource_messenger, "f").call('AssetsController:assetsUpdate', fetchResponse, exports.SNAP_DATA_SOURCE_NAME);
390
+ }
391
+ return fetchResponse;
392
+ })
393
+ .catch((error) => {
394
+ log('Subscription update fetch failed', { subscriptionId, error });
395
+ });
396
+ return;
397
+ }
398
+ }
399
+ await this.unsubscribe(subscriptionId);
400
+ // Snaps provide real-time updates via AccountsController:accountBalancesUpdated
401
+ // We only need to track the subscription and do an initial fetch
402
+ // No polling needed - updates come through #handleSnapBalancesUpdated
403
+ this.activeSubscriptions.set(subscriptionId, {
404
+ cleanup: () => {
405
+ // No timer to clear - we use event-based updates
406
+ },
407
+ chains: snapChains,
408
+ });
409
+ // Initial fetch to get current balances
410
+ try {
411
+ const fetchResponse = await this.fetch({
412
+ ...request,
413
+ chainIds: snapChains,
414
+ });
415
+ if (Object.keys(fetchResponse.assetsBalance ?? {}).length > 0) {
416
+ await __classPrivateFieldGet(this, _SnapDataSource_messenger, "f").call('AssetsController:assetsUpdate', fetchResponse, exports.SNAP_DATA_SOURCE_NAME);
417
+ }
418
+ }
419
+ catch (error) {
420
+ log('Initial fetch failed', { subscriptionId, error });
421
+ }
422
+ }
423
+ // ============================================================================
424
+ // CLEANUP
425
+ // ============================================================================
426
+ destroy() {
427
+ for (const [subscriptionId] of this.activeSubscriptions) {
428
+ this.unsubscribe(subscriptionId).catch(() => {
429
+ // Ignore cleanup errors
430
+ });
431
+ }
432
+ }
433
+ }
434
+ exports.SnapDataSource = SnapDataSource;
435
+ _SnapDataSource_messenger = new WeakMap(), _SnapDataSource_snapProvider = new WeakMap(), _SnapDataSource_instances = new WeakSet(), _SnapDataSource_subscribeToSnapKeyringEvents = function _SnapDataSource_subscribeToSnapKeyringEvents() {
436
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
437
+ const messenger = __classPrivateFieldGet(this, _SnapDataSource_messenger, "f");
438
+ try {
439
+ messenger.subscribe('AccountsController:accountBalancesUpdated', (payload) => {
440
+ __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_handleSnapBalancesUpdated).call(this, payload);
441
+ });
442
+ }
443
+ catch (error) {
444
+ log('Failed to subscribe to snap keyring events', { error });
445
+ }
446
+ }, _SnapDataSource_handleSnapBalancesUpdated = function _SnapDataSource_handleSnapBalancesUpdated(payload) {
447
+ // Transform the snap keyring payload to DataResponse format
448
+ const response = {
449
+ assetsBalance: {},
450
+ };
451
+ for (const [accountId, assets] of Object.entries(payload.balances)) {
452
+ if (response.assetsBalance) {
453
+ response.assetsBalance[accountId] = {};
454
+ for (const [assetId, balance] of Object.entries(assets)) {
455
+ // Only include snap-supported assets (solana, bitcoin, tron)
456
+ if (isSnapSupportedChain(extractChainFromAssetId(assetId))) {
457
+ response.assetsBalance[accountId][assetId] = {
458
+ amount: balance.amount,
459
+ };
460
+ }
461
+ }
462
+ // Remove account if no snap assets
463
+ if (Object.keys(response.assetsBalance[accountId]).length === 0) {
464
+ delete response.assetsBalance[accountId];
465
+ }
466
+ }
467
+ }
468
+ // Only report if we have snap-related updates
469
+ if (Object.keys(response.assetsBalance ?? {}).length > 0) {
470
+ __classPrivateFieldGet(this, _SnapDataSource_messenger, "f")
471
+ .call('AssetsController:assetsUpdate', response, exports.SNAP_DATA_SOURCE_NAME)
472
+ .catch(console.error);
473
+ }
474
+ }, _SnapDataSource_registerActionHandlers = function _SnapDataSource_registerActionHandlers() {
475
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
476
+ const messenger = __classPrivateFieldGet(this, _SnapDataSource_messenger, "f");
477
+ messenger.registerActionHandler('SnapDataSource:getAssetsMiddleware', () => this.assetsMiddleware);
478
+ messenger.registerActionHandler('SnapDataSource:getActiveChains', async () => this.getActiveChains());
479
+ messenger.registerActionHandler('SnapDataSource:fetch', async (request) => this.fetch(request));
480
+ messenger.registerActionHandler('SnapDataSource:subscribe', async (request) => this.subscribe(request));
481
+ messenger.registerActionHandler('SnapDataSource:unsubscribe', async (subscriptionId) => this.unsubscribe(subscriptionId));
482
+ }, _SnapDataSource_getInstalledSnaps =
483
+ // ============================================================================
484
+ // SNAP AVAILABILITY
485
+ // ============================================================================
486
+ /**
487
+ * Get all installed snaps from the snap provider.
488
+ *
489
+ * @returns A map of snap IDs to their versions.
490
+ */
491
+ async function _SnapDataSource_getInstalledSnaps() {
492
+ try {
493
+ const snaps = await __classPrivateFieldGet(this, _SnapDataSource_snapProvider, "f").request({
494
+ method: 'wallet_getSnaps',
495
+ params: {},
496
+ });
497
+ return snaps;
498
+ }
499
+ catch (error) {
500
+ log('Failed to get installed snaps', error);
501
+ return {};
502
+ }
503
+ }, _SnapDataSource_checkSnapAvailabilityOnDemand =
504
+ /**
505
+ * Check availability for a single snap type on-demand.
506
+ * This is called before each fetch to ensure we have the latest availability status.
507
+ *
508
+ * @param snapType - The snap type to check (solana, bitcoin, tron)
509
+ * @returns True if the snap is available, false otherwise
510
+ */
511
+ async function _SnapDataSource_checkSnapAvailabilityOnDemand(snapType) {
512
+ const config = exports.SNAP_REGISTRY[snapType];
513
+ const currentState = this.state.snaps[snapType];
514
+ // If already marked as available, return true (snap was found previously)
515
+ if (currentState.available) {
516
+ return true;
517
+ }
518
+ // Check if snap is now available (handles timing issues where snap wasn't ready at init)
519
+ try {
520
+ const snaps = await __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_getInstalledSnaps).call(this);
521
+ const snap = snaps[config.snapId];
522
+ if (snap) {
523
+ // Snap is now available - update state
524
+ this.state.snaps[snapType] = {
525
+ version: snap.version,
526
+ available: true,
527
+ };
528
+ return true;
529
+ }
530
+ return false;
531
+ }
532
+ catch {
533
+ return false;
534
+ }
535
+ }, _SnapDataSource_checkAllSnapsAvailability = async function _SnapDataSource_checkAllSnapsAvailability() {
536
+ try {
537
+ const snaps = await __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_getInstalledSnaps).call(this);
538
+ for (const [snapType, config] of Object.entries(exports.SNAP_REGISTRY)) {
539
+ const snap = snaps[config.snapId];
540
+ if (snap) {
541
+ this.state.snaps[snapType] = {
542
+ version: snap.version,
543
+ available: true,
544
+ };
545
+ }
546
+ else {
547
+ this.state.snaps[snapType] = {
548
+ version: null,
549
+ available: false,
550
+ };
551
+ }
552
+ }
553
+ }
554
+ catch {
555
+ // Mark all snaps as unavailable on error
556
+ for (const snapType of Object.keys(exports.SNAP_REGISTRY)) {
557
+ this.state.snaps[snapType] = {
558
+ version: null,
559
+ available: false,
560
+ };
561
+ }
562
+ }
563
+ }, _SnapDataSource_accountSupportsChain = function _SnapDataSource_accountSupportsChain(account, chainId) {
564
+ const scopes = account.scopes ?? [];
565
+ // If no scopes defined, assume it supports the chain (backward compatibility)
566
+ if (scopes.length === 0) {
567
+ return true;
568
+ }
569
+ // Extract namespace and reference from chainId
570
+ const [chainNamespace, chainReference] = chainId.split(':');
571
+ for (const scope of scopes) {
572
+ const [scopeNamespace, scopeReference] = scope.split(':');
573
+ // Check if namespaces match
574
+ if (scopeNamespace !== chainNamespace) {
575
+ continue;
576
+ }
577
+ // Wildcard scope (e.g., "solana:0" means all chains in that namespace)
578
+ if (scopeReference === '0') {
579
+ return true;
580
+ }
581
+ // Exact match check
582
+ if (scopeReference === chainReference) {
583
+ return true;
584
+ }
585
+ }
586
+ return false;
587
+ }, _SnapDataSource_groupChainsBySnap = function _SnapDataSource_groupChainsBySnap(chainIds) {
588
+ const groups = {};
589
+ for (const chainId of chainIds) {
590
+ const snapType = getSnapTypeForChain(chainId);
591
+ if (snapType) {
592
+ groups[snapType] ?? (groups[snapType] = []);
593
+ const snapChains = groups[snapType];
594
+ if (snapChains) {
595
+ snapChains.push(chainId);
596
+ }
597
+ }
598
+ }
599
+ return groups;
600
+ }, _SnapDataSource_fetchFromSnap = async function _SnapDataSource_fetchFromSnap(snapType, request) {
601
+ var _a;
602
+ const config = exports.SNAP_REGISTRY[snapType];
603
+ // Check snap availability on-demand - handles timing issues where snap
604
+ // wasn't ready during initialization but is now available
605
+ const isAvailable = await __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_checkSnapAvailabilityOnDemand).call(this, snapType);
606
+ if (!isAvailable) {
607
+ log(`${snapType} snap not available, skipping fetch`);
608
+ // Return errors for these chains so they can fallback to other data sources
609
+ const errors = {};
610
+ for (const chainId of request.chainIds) {
611
+ errors[chainId] = `${snapType} snap not available`;
612
+ }
613
+ return { errors };
614
+ }
615
+ const results = {
616
+ assetsBalance: {},
617
+ assetsMetadata: {},
618
+ };
619
+ // Fetch balances for each account using Keyring API
620
+ // Important: Must first get account assets, then request balances for those specific assets
621
+ for (const account of request.accounts) {
622
+ // Filter to only process accounts that support the chains being fetched
623
+ const accountSupportedChains = request.chainIds.filter((chainId) => __classPrivateFieldGet(this, _SnapDataSource_instances, "m", _SnapDataSource_accountSupportsChain).call(this, account, chainId));
624
+ // Skip accounts that don't support any of the requested chains
625
+ if (accountSupportedChains.length === 0) {
626
+ continue;
627
+ }
628
+ const accountId = account.id;
629
+ try {
630
+ // Step 1: Get the list of assets for this account
631
+ log(`${snapType} snap calling keyring_listAccountAssets`, {
632
+ snapId: config.snapId,
633
+ accountId,
634
+ });
635
+ const accountAssets = await __classPrivateFieldGet(this, _SnapDataSource_snapProvider, "f").request({
636
+ method: 'wallet_invokeSnap',
637
+ params: {
638
+ snapId: config.snapId,
639
+ request: {
640
+ method: 'keyring_listAccountAssets',
641
+ params: {
642
+ id: accountId, // Account UUID
643
+ },
644
+ },
645
+ },
646
+ });
647
+ log(`${snapType} snap keyring_listAccountAssets response`, {
648
+ accountId,
649
+ assetCount: accountAssets?.length ?? 0,
650
+ assets: accountAssets,
651
+ });
652
+ // If no assets, skip to next account
653
+ if (!accountAssets || accountAssets.length === 0) {
654
+ log(`${snapType} snap: account has no assets, skipping balance fetch`, {
655
+ accountId,
656
+ });
657
+ continue;
658
+ }
659
+ // Step 2: Get balances for those specific assets
660
+ log(`${snapType} snap calling keyring_getAccountBalances`, {
661
+ snapId: config.snapId,
662
+ accountId,
663
+ requestedAssets: accountAssets.length,
664
+ });
665
+ const balances = await __classPrivateFieldGet(this, _SnapDataSource_snapProvider, "f").request({
666
+ method: 'wallet_invokeSnap',
667
+ params: {
668
+ snapId: config.snapId,
669
+ request: {
670
+ method: 'keyring_getAccountBalances',
671
+ params: {
672
+ id: accountId, // Account UUID (the keyring API uses 'id' not 'accountId')
673
+ assets: accountAssets, // Must pass specific asset types from listAccountAssets
674
+ },
675
+ },
676
+ },
677
+ });
678
+ log(`${snapType} snap keyring_getAccountBalances response`, {
679
+ accountId,
680
+ balances,
681
+ balancesType: typeof balances,
682
+ isNull: balances === null,
683
+ isUndefined: balances === undefined,
684
+ assetCount: balances ? Object.keys(balances).length : 0,
685
+ });
686
+ // Transform keyring response to DataResponse format
687
+ // Note: snap may return null/undefined if account doesn't belong to this snap
688
+ if (balances && typeof balances === 'object' && results.assetsBalance) {
689
+ const balanceEntries = Object.entries(balances);
690
+ log(`${snapType} snap processing ${balanceEntries.length} balances for account ${accountId}`);
691
+ for (const [assetId, balance] of balanceEntries) {
692
+ // Initialize account balances if not exists
693
+ (_a = results.assetsBalance)[accountId] ?? (_a[accountId] = {});
694
+ // Store raw balance for this asset
695
+ // Use rawAmount if available (preferred - smallest unit), fall back to amount
696
+ // Note: Snaps should return rawAmount in smallest unit (satoshis, lamports, etc.)
697
+ const accountBalances = results.assetsBalance[accountId];
698
+ if (accountBalances) {
699
+ accountBalances[assetId] = {
700
+ amount: balance.rawAmount ?? balance.amount,
701
+ };
702
+ }
703
+ }
704
+ }
705
+ else if (!balances) {
706
+ log(`${snapType} snap returned empty/null for account (account may not belong to this snap)`, {
707
+ accountId,
708
+ balances,
709
+ });
710
+ }
711
+ }
712
+ catch (error) {
713
+ // This is expected when querying a snap with an account it doesn't manage
714
+ log(`${snapType} snap fetch FAILED for account`, {
715
+ accountId,
716
+ error: error instanceof Error ? error.message : String(error),
717
+ errorStack: error instanceof Error ? error.stack : undefined,
718
+ });
719
+ }
720
+ }
721
+ log(`${snapType} snap fetch completed`, {
722
+ chains: request.chainIds.length,
723
+ accountsWithBalances: Object.keys(results.assetsBalance ?? {}).length,
724
+ });
725
+ return results;
726
+ };
727
+ // ============================================================================
728
+ // FACTORY
729
+ // ============================================================================
730
+ function createSnapDataSource(options) {
731
+ return new SnapDataSource(options);
732
+ }
733
+ exports.createSnapDataSource = createSnapDataSource;
734
+ //# sourceMappingURL=SnapDataSource.cjs.map