@metamask-previews/assets-controller 14.0.2-preview-3866c0ff1 → 14.0.2-preview-e3275932a

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 (583) hide show
  1. package/CHANGELOG.md +0 -1
  2. package/dist/AssetsController-method-action-types.cjs +7 -0
  3. package/dist/AssetsController-method-action-types.cjs.map +1 -0
  4. package/dist/{AssetsController-method-action-types.d.ts → AssetsController-method-action-types.d.cts} +2 -2
  5. package/dist/AssetsController-method-action-types.d.cts.map +1 -0
  6. package/dist/AssetsController-method-action-types.d.mts +181 -0
  7. package/dist/AssetsController-method-action-types.d.mts.map +1 -0
  8. package/dist/{AssetsController-method-action-types.js → AssetsController-method-action-types.mjs} +1 -1
  9. package/dist/AssetsController-method-action-types.mjs.map +1 -0
  10. package/dist/AssetsController.cjs +2596 -0
  11. package/dist/AssetsController.cjs.map +1 -0
  12. package/dist/{AssetsController.d.ts → AssetsController.d.cts} +30 -30
  13. package/dist/AssetsController.d.cts.map +1 -0
  14. package/dist/AssetsController.d.mts +395 -0
  15. package/dist/AssetsController.d.mts.map +1 -0
  16. package/dist/AssetsController.mjs +2589 -0
  17. package/dist/AssetsController.mjs.map +1 -0
  18. package/dist/data-sources/AbstractDataSource.cjs +111 -0
  19. package/dist/data-sources/AbstractDataSource.cjs.map +1 -0
  20. package/dist/data-sources/{AbstractDataSource.d.ts → AbstractDataSource.d.cts} +2 -2
  21. package/dist/data-sources/AbstractDataSource.d.cts.map +1 -0
  22. package/dist/data-sources/AbstractDataSource.d.mts +113 -0
  23. package/dist/data-sources/AbstractDataSource.d.mts.map +1 -0
  24. package/dist/data-sources/{AbstractDataSource.js → AbstractDataSource.mjs} +3 -5
  25. package/dist/data-sources/AbstractDataSource.mjs.map +1 -0
  26. package/dist/data-sources/AccountActivityDataSource.cjs +267 -0
  27. package/dist/data-sources/AccountActivityDataSource.cjs.map +1 -0
  28. package/dist/data-sources/{AccountActivityDataSource.d.ts → AccountActivityDataSource.d.cts} +6 -6
  29. package/dist/data-sources/AccountActivityDataSource.d.cts.map +1 -0
  30. package/dist/data-sources/AccountActivityDataSource.d.mts +80 -0
  31. package/dist/data-sources/AccountActivityDataSource.d.mts.map +1 -0
  32. package/dist/data-sources/AccountActivityDataSource.mjs +259 -0
  33. package/dist/data-sources/AccountActivityDataSource.mjs.map +1 -0
  34. package/dist/data-sources/AccountsApiDataSource.cjs +586 -0
  35. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -0
  36. package/dist/data-sources/{AccountsApiDataSource.d.ts → AccountsApiDataSource.d.cts} +7 -7
  37. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -0
  38. package/dist/data-sources/AccountsApiDataSource.d.mts +82 -0
  39. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -0
  40. package/dist/data-sources/AccountsApiDataSource.mjs +581 -0
  41. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -0
  42. package/dist/data-sources/PriceDataSource.cjs +466 -0
  43. package/dist/data-sources/PriceDataSource.cjs.map +1 -0
  44. package/dist/data-sources/{PriceDataSource.d.ts → PriceDataSource.d.cts} +5 -5
  45. package/dist/data-sources/PriceDataSource.d.cts.map +1 -0
  46. package/dist/data-sources/PriceDataSource.d.mts +100 -0
  47. package/dist/data-sources/PriceDataSource.d.mts.map +1 -0
  48. package/dist/data-sources/{PriceDataSource.js → PriceDataSource.mjs} +185 -179
  49. package/dist/data-sources/PriceDataSource.mjs.map +1 -0
  50. package/dist/data-sources/RpcDataSource.cjs +1021 -0
  51. package/dist/data-sources/RpcDataSource.cjs.map +1 -0
  52. package/dist/data-sources/{RpcDataSource.d.ts → RpcDataSource.d.cts} +10 -10
  53. package/dist/data-sources/RpcDataSource.d.cts.map +1 -0
  54. package/dist/data-sources/RpcDataSource.d.mts +174 -0
  55. package/dist/data-sources/RpcDataSource.d.mts.map +1 -0
  56. package/dist/data-sources/RpcDataSource.mjs +1012 -0
  57. package/dist/data-sources/RpcDataSource.mjs.map +1 -0
  58. package/dist/data-sources/SnapDataSource.cjs +443 -0
  59. package/dist/data-sources/SnapDataSource.cjs.map +1 -0
  60. package/dist/data-sources/{SnapDataSource.d.ts → SnapDataSource.d.cts} +8 -8
  61. package/dist/data-sources/SnapDataSource.d.cts.map +1 -0
  62. package/dist/data-sources/SnapDataSource.d.mts +127 -0
  63. package/dist/data-sources/SnapDataSource.d.mts.map +1 -0
  64. package/dist/data-sources/{SnapDataSource.js → SnapDataSource.mjs} +177 -225
  65. package/dist/data-sources/SnapDataSource.mjs.map +1 -0
  66. package/dist/data-sources/StakedBalanceDataSource.cjs +616 -0
  67. package/dist/data-sources/StakedBalanceDataSource.cjs.map +1 -0
  68. package/dist/data-sources/{StakedBalanceDataSource.d.ts → StakedBalanceDataSource.d.cts} +5 -5
  69. package/dist/data-sources/StakedBalanceDataSource.d.cts.map +1 -0
  70. package/dist/data-sources/StakedBalanceDataSource.d.mts +72 -0
  71. package/dist/data-sources/StakedBalanceDataSource.d.mts.map +1 -0
  72. package/dist/data-sources/StakedBalanceDataSource.mjs +612 -0
  73. package/dist/data-sources/StakedBalanceDataSource.mjs.map +1 -0
  74. package/dist/data-sources/TokenDataSource.cjs +583 -0
  75. package/dist/data-sources/TokenDataSource.cjs.map +1 -0
  76. package/dist/data-sources/{TokenDataSource.d.ts → TokenDataSource.d.cts} +5 -5
  77. package/dist/data-sources/TokenDataSource.d.cts.map +1 -0
  78. package/dist/data-sources/TokenDataSource.d.mts +81 -0
  79. package/dist/data-sources/TokenDataSource.d.mts.map +1 -0
  80. package/dist/data-sources/{TokenDataSource.js → TokenDataSource.mjs} +164 -157
  81. package/dist/data-sources/TokenDataSource.mjs.map +1 -0
  82. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs +705 -0
  83. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs.map +1 -0
  84. package/dist/data-sources/evm-rpc-services/clients/{MulticallClient.d.ts → MulticallClient.d.cts} +3 -3
  85. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.cts.map +1 -0
  86. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.mts +65 -0
  87. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.mts.map +1 -0
  88. package/dist/data-sources/evm-rpc-services/clients/{MulticallClient.js → MulticallClient.mjs} +160 -148
  89. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.mjs.map +1 -0
  90. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.cjs +312 -0
  91. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.cjs.map +1 -0
  92. package/dist/data-sources/evm-rpc-services/clients/{TokensApiClient.d.ts → TokensApiClient.d.cts} +2 -2
  93. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.cts.map +1 -0
  94. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.mts +61 -0
  95. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.mts.map +1 -0
  96. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.mjs +308 -0
  97. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.mjs.map +1 -0
  98. package/dist/data-sources/evm-rpc-services/clients/index.cjs +10 -0
  99. package/dist/data-sources/evm-rpc-services/clients/index.cjs.map +1 -0
  100. package/dist/data-sources/evm-rpc-services/clients/index.d.cts +4 -0
  101. package/dist/data-sources/evm-rpc-services/clients/index.d.cts.map +1 -0
  102. package/dist/data-sources/evm-rpc-services/clients/index.d.mts +4 -0
  103. package/dist/data-sources/evm-rpc-services/clients/index.d.mts.map +1 -0
  104. package/dist/data-sources/evm-rpc-services/clients/index.mjs +3 -0
  105. package/dist/data-sources/evm-rpc-services/clients/index.mjs.map +1 -0
  106. package/dist/data-sources/evm-rpc-services/index.cjs +17 -0
  107. package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -0
  108. package/dist/data-sources/evm-rpc-services/{index.d.ts → index.d.cts} +5 -5
  109. package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -0
  110. package/dist/data-sources/evm-rpc-services/index.d.mts +5 -0
  111. package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -0
  112. package/dist/data-sources/evm-rpc-services/index.mjs +4 -0
  113. package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -0
  114. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +247 -0
  115. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -0
  116. package/dist/data-sources/evm-rpc-services/services/{BalanceFetcher.d.ts → BalanceFetcher.d.cts} +11 -11
  117. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -0
  118. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +96 -0
  119. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -0
  120. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs +243 -0
  121. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -0
  122. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs +132 -0
  123. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs.map +1 -0
  124. package/dist/data-sources/evm-rpc-services/services/{StakedBalanceFetcher.d.ts → StakedBalanceFetcher.d.cts} +14 -13
  125. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts.map +1 -0
  126. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts +81 -0
  127. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts.map +1 -0
  128. package/dist/data-sources/evm-rpc-services/services/{StakedBalanceFetcher.js → StakedBalanceFetcher.mjs} +27 -13
  129. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs.map +1 -0
  130. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +230 -0
  131. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -0
  132. package/dist/data-sources/evm-rpc-services/services/{TokenDetector.d.ts → TokenDetector.d.cts} +12 -12
  133. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -0
  134. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +78 -0
  135. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -0
  136. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +226 -0
  137. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -0
  138. package/dist/data-sources/evm-rpc-services/services/index.cjs +13 -0
  139. package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -0
  140. package/dist/data-sources/evm-rpc-services/services/{index.d.ts → index.d.cts} +4 -4
  141. package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -0
  142. package/dist/data-sources/evm-rpc-services/services/index.d.mts +4 -0
  143. package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -0
  144. package/dist/data-sources/evm-rpc-services/services/index.mjs +4 -0
  145. package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -0
  146. package/dist/data-sources/evm-rpc-services/types/assets.cjs +3 -0
  147. package/dist/data-sources/evm-rpc-services/types/assets.cjs.map +1 -0
  148. package/dist/data-sources/evm-rpc-services/types/{assets.d.ts → assets.d.cts} +3 -3
  149. package/dist/data-sources/evm-rpc-services/types/assets.d.cts.map +1 -0
  150. package/dist/data-sources/evm-rpc-services/types/assets.d.mts +53 -0
  151. package/dist/data-sources/evm-rpc-services/types/assets.d.mts.map +1 -0
  152. package/dist/data-sources/evm-rpc-services/types/assets.mjs +2 -0
  153. package/dist/data-sources/evm-rpc-services/types/assets.mjs.map +1 -0
  154. package/dist/data-sources/evm-rpc-services/types/config.cjs +3 -0
  155. package/dist/data-sources/evm-rpc-services/types/config.cjs.map +1 -0
  156. package/dist/data-sources/evm-rpc-services/types/{config.d.ts → config.d.cts} +2 -2
  157. package/dist/data-sources/evm-rpc-services/types/config.d.cts.map +1 -0
  158. package/dist/data-sources/evm-rpc-services/types/config.d.mts +18 -0
  159. package/dist/data-sources/evm-rpc-services/types/config.d.mts.map +1 -0
  160. package/dist/data-sources/evm-rpc-services/types/config.mjs +2 -0
  161. package/dist/data-sources/evm-rpc-services/types/config.mjs.map +1 -0
  162. package/dist/data-sources/evm-rpc-services/types/core.cjs +3 -0
  163. package/dist/data-sources/evm-rpc-services/types/core.cjs.map +1 -0
  164. package/dist/data-sources/evm-rpc-services/types/{core.d.ts → core.d.cts} +2 -2
  165. package/dist/data-sources/evm-rpc-services/types/core.d.cts.map +1 -0
  166. package/dist/data-sources/evm-rpc-services/types/core.d.mts +19 -0
  167. package/dist/data-sources/evm-rpc-services/types/core.d.mts.map +1 -0
  168. package/dist/data-sources/evm-rpc-services/types/core.mjs +2 -0
  169. package/dist/data-sources/evm-rpc-services/types/core.mjs.map +1 -0
  170. package/dist/data-sources/evm-rpc-services/types/index.cjs +3 -0
  171. package/dist/data-sources/evm-rpc-services/types/index.cjs.map +1 -0
  172. package/dist/data-sources/evm-rpc-services/types/index.d.cts +7 -0
  173. package/dist/data-sources/evm-rpc-services/types/index.d.cts.map +1 -0
  174. package/dist/data-sources/evm-rpc-services/types/index.d.mts +7 -0
  175. package/dist/data-sources/evm-rpc-services/types/index.d.mts.map +1 -0
  176. package/dist/data-sources/evm-rpc-services/types/index.mjs +2 -0
  177. package/dist/data-sources/evm-rpc-services/types/index.mjs.map +1 -0
  178. package/dist/data-sources/evm-rpc-services/types/multicall.cjs +3 -0
  179. package/dist/data-sources/evm-rpc-services/types/multicall.cjs.map +1 -0
  180. package/dist/data-sources/evm-rpc-services/types/{multicall.d.ts → multicall.d.cts} +2 -2
  181. package/dist/data-sources/evm-rpc-services/types/multicall.d.cts.map +1 -0
  182. package/dist/data-sources/evm-rpc-services/types/multicall.d.mts +24 -0
  183. package/dist/data-sources/evm-rpc-services/types/multicall.d.mts.map +1 -0
  184. package/dist/data-sources/evm-rpc-services/types/multicall.mjs +2 -0
  185. package/dist/data-sources/evm-rpc-services/types/multicall.mjs.map +1 -0
  186. package/dist/data-sources/evm-rpc-services/types/services.cjs +3 -0
  187. package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -0
  188. package/dist/data-sources/evm-rpc-services/types/{services.d.ts → services.d.cts} +3 -3
  189. package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -0
  190. package/dist/data-sources/evm-rpc-services/types/services.d.mts +70 -0
  191. package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -0
  192. package/dist/data-sources/evm-rpc-services/types/services.mjs +2 -0
  193. package/dist/data-sources/evm-rpc-services/types/services.mjs.map +1 -0
  194. package/dist/data-sources/evm-rpc-services/types/state.cjs +3 -0
  195. package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -0
  196. package/dist/data-sources/evm-rpc-services/types/{state.d.ts → state.d.cts} +2 -2
  197. package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -0
  198. package/dist/data-sources/evm-rpc-services/types/state.d.mts +58 -0
  199. package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -0
  200. package/dist/data-sources/evm-rpc-services/types/state.mjs +2 -0
  201. package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -0
  202. package/dist/data-sources/evm-rpc-services/utils/assets.cjs +9 -0
  203. package/dist/data-sources/evm-rpc-services/utils/assets.cjs.map +1 -0
  204. package/dist/data-sources/evm-rpc-services/utils/{assets.d.ts → assets.d.cts} +2 -2
  205. package/dist/data-sources/evm-rpc-services/utils/assets.d.cts.map +1 -0
  206. package/dist/data-sources/evm-rpc-services/utils/assets.d.mts +3 -0
  207. package/dist/data-sources/evm-rpc-services/utils/assets.d.mts.map +1 -0
  208. package/dist/data-sources/evm-rpc-services/utils/{assets.js → assets.mjs} +2 -2
  209. package/dist/data-sources/evm-rpc-services/utils/assets.mjs.map +1 -0
  210. package/dist/data-sources/evm-rpc-services/utils/batch.cjs +45 -0
  211. package/dist/data-sources/evm-rpc-services/utils/batch.cjs.map +1 -0
  212. package/dist/data-sources/evm-rpc-services/utils/{batch.d.ts → batch.d.cts} +1 -1
  213. package/dist/data-sources/evm-rpc-services/utils/batch.d.cts.map +1 -0
  214. package/dist/data-sources/evm-rpc-services/utils/batch.d.mts +28 -0
  215. package/dist/data-sources/evm-rpc-services/utils/batch.d.mts.map +1 -0
  216. package/dist/data-sources/evm-rpc-services/utils/{batch.js → batch.mjs} +1 -1
  217. package/dist/data-sources/evm-rpc-services/utils/batch.mjs.map +1 -0
  218. package/dist/data-sources/evm-rpc-services/utils/index.cjs +15 -0
  219. package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -0
  220. package/dist/data-sources/evm-rpc-services/utils/index.d.cts +4 -0
  221. package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -0
  222. package/dist/data-sources/evm-rpc-services/utils/index.d.mts +4 -0
  223. package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -0
  224. package/dist/data-sources/evm-rpc-services/utils/index.mjs +4 -0
  225. package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -0
  226. package/dist/data-sources/evm-rpc-services/utils/parsing.cjs +47 -0
  227. package/dist/data-sources/evm-rpc-services/utils/parsing.cjs.map +1 -0
  228. package/dist/data-sources/evm-rpc-services/utils/{parsing.d.ts → parsing.d.cts} +3 -3
  229. package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts.map +1 -0
  230. package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts +25 -0
  231. package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts.map +1 -0
  232. package/dist/data-sources/evm-rpc-services/utils/{parsing.js → parsing.mjs} +3 -3
  233. package/dist/data-sources/evm-rpc-services/utils/parsing.mjs.map +1 -0
  234. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs +68 -0
  235. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs.map +1 -0
  236. package/dist/data-sources/evm-rpc-services/utils/{staking-contracts.d.ts → staking-contracts.d.cts} +1 -1
  237. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts.map +1 -0
  238. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts +25 -0
  239. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts.map +1 -0
  240. package/dist/data-sources/evm-rpc-services/utils/{staking-contracts.js → staking-contracts.mjs} +3 -3
  241. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs.map +1 -0
  242. package/dist/data-sources/index.cjs +30 -0
  243. package/dist/data-sources/index.cjs.map +1 -0
  244. package/dist/data-sources/{index.d.ts → index.d.cts} +9 -9
  245. package/dist/data-sources/index.d.cts.map +1 -0
  246. package/dist/data-sources/index.d.mts +9 -0
  247. package/dist/data-sources/index.d.mts.map +1 -0
  248. package/dist/data-sources/index.mjs +14 -0
  249. package/dist/data-sources/index.mjs.map +1 -0
  250. package/dist/defaults.cjs +125 -0
  251. package/dist/defaults.cjs.map +1 -0
  252. package/dist/{defaults.d.ts → defaults.d.cts} +2 -2
  253. package/dist/defaults.d.cts.map +1 -0
  254. package/dist/defaults.d.mts +50 -0
  255. package/dist/defaults.d.mts.map +1 -0
  256. package/dist/{defaults.js → defaults.mjs} +1 -1
  257. package/dist/defaults.mjs.map +1 -0
  258. package/dist/errors.cjs +25 -0
  259. package/dist/errors.cjs.map +1 -0
  260. package/dist/{errors.d.ts → errors.d.cts} +1 -1
  261. package/dist/errors.d.cts.map +1 -0
  262. package/dist/errors.d.mts +25 -0
  263. package/dist/errors.d.mts.map +1 -0
  264. package/dist/{errors.js → errors.mjs} +1 -7
  265. package/dist/errors.mjs.map +1 -0
  266. package/dist/index.cjs +67 -0
  267. package/dist/index.cjs.map +1 -0
  268. package/dist/{index.d.ts → index.d.cts} +26 -26
  269. package/dist/index.d.cts.map +1 -0
  270. package/dist/index.d.mts +26 -0
  271. package/dist/index.d.mts.map +1 -0
  272. package/dist/{index.js → index.mjs} +13 -13
  273. package/dist/index.mjs.map +1 -0
  274. package/dist/logger.cjs +7 -0
  275. package/dist/logger.cjs.map +1 -0
  276. package/dist/logger.d.cts +5 -0
  277. package/dist/logger.d.cts.map +1 -0
  278. package/dist/logger.d.mts +5 -0
  279. package/dist/logger.d.mts.map +1 -0
  280. package/dist/logger.mjs +4 -0
  281. package/dist/logger.mjs.map +1 -0
  282. package/dist/middlewares/CustomAssetGraduationMiddleware.cjs +132 -0
  283. package/dist/middlewares/CustomAssetGraduationMiddleware.cjs.map +1 -0
  284. package/dist/middlewares/{CustomAssetGraduationMiddleware.d.ts → CustomAssetGraduationMiddleware.d.cts} +2 -2
  285. package/dist/middlewares/CustomAssetGraduationMiddleware.d.cts.map +1 -0
  286. package/dist/middlewares/CustomAssetGraduationMiddleware.d.mts +32 -0
  287. package/dist/middlewares/CustomAssetGraduationMiddleware.d.mts.map +1 -0
  288. package/dist/middlewares/{CustomAssetGraduationMiddleware.js → CustomAssetGraduationMiddleware.mjs} +25 -12
  289. package/dist/middlewares/CustomAssetGraduationMiddleware.mjs.map +1 -0
  290. package/dist/middlewares/DetectionMiddleware.cjs +154 -0
  291. package/dist/middlewares/DetectionMiddleware.cjs.map +1 -0
  292. package/dist/middlewares/{DetectionMiddleware.d.ts → DetectionMiddleware.d.cts} +2 -2
  293. package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -0
  294. package/dist/middlewares/DetectionMiddleware.d.mts +40 -0
  295. package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -0
  296. package/dist/middlewares/{DetectionMiddleware.js → DetectionMiddleware.mjs} +7 -5
  297. package/dist/middlewares/DetectionMiddleware.mjs.map +1 -0
  298. package/dist/middlewares/ParallelMiddleware.cjs +263 -0
  299. package/dist/middlewares/ParallelMiddleware.cjs.map +1 -0
  300. package/dist/middlewares/{ParallelMiddleware.d.ts → ParallelMiddleware.d.cts} +2 -2
  301. package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -0
  302. package/dist/middlewares/ParallelMiddleware.d.mts +41 -0
  303. package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -0
  304. package/dist/middlewares/{ParallelMiddleware.js → ParallelMiddleware.mjs} +11 -4
  305. package/dist/middlewares/ParallelMiddleware.mjs.map +1 -0
  306. package/dist/middlewares/RpcFallbackMiddleware.cjs +90 -0
  307. package/dist/middlewares/RpcFallbackMiddleware.cjs.map +1 -0
  308. package/dist/middlewares/{RpcFallbackMiddleware.d.ts → RpcFallbackMiddleware.d.cts} +2 -2
  309. package/dist/middlewares/RpcFallbackMiddleware.d.cts.map +1 -0
  310. package/dist/middlewares/RpcFallbackMiddleware.d.mts +23 -0
  311. package/dist/middlewares/RpcFallbackMiddleware.d.mts.map +1 -0
  312. package/dist/middlewares/{RpcFallbackMiddleware.js → RpcFallbackMiddleware.mjs} +21 -8
  313. package/dist/middlewares/RpcFallbackMiddleware.mjs.map +1 -0
  314. package/dist/middlewares/index.cjs +14 -0
  315. package/dist/middlewares/index.cjs.map +1 -0
  316. package/dist/middlewares/index.d.cts +9 -0
  317. package/dist/middlewares/index.d.cts.map +1 -0
  318. package/dist/middlewares/index.d.mts +9 -0
  319. package/dist/middlewares/index.d.mts.map +1 -0
  320. package/dist/middlewares/index.mjs +5 -0
  321. package/dist/middlewares/index.mjs.map +1 -0
  322. package/dist/migrations/healAssetsInfoMetadata.cjs +539 -0
  323. package/dist/migrations/healAssetsInfoMetadata.cjs.map +1 -0
  324. package/dist/migrations/{healAssetsInfoMetadata.d.ts → healAssetsInfoMetadata.d.cts} +5 -5
  325. package/dist/migrations/healAssetsInfoMetadata.d.cts.map +1 -0
  326. package/dist/migrations/healAssetsInfoMetadata.d.mts +140 -0
  327. package/dist/migrations/healAssetsInfoMetadata.d.mts.map +1 -0
  328. package/dist/migrations/{healAssetsInfoMetadata.js → healAssetsInfoMetadata.mjs} +11 -9
  329. package/dist/migrations/healAssetsInfoMetadata.mjs.map +1 -0
  330. package/dist/selectors/balance.cjs +532 -0
  331. package/dist/selectors/balance.cjs.map +1 -0
  332. package/dist/selectors/{balance.d.ts → balance.d.cts} +6 -6
  333. package/dist/selectors/balance.d.cts.map +1 -0
  334. package/dist/selectors/balance.d.mts +103 -0
  335. package/dist/selectors/balance.d.mts.map +1 -0
  336. package/dist/selectors/{balance.js → balance.mjs} +5 -5
  337. package/dist/selectors/balance.mjs.map +1 -0
  338. package/dist/types.cjs +39 -0
  339. package/dist/types.cjs.map +1 -0
  340. package/dist/{types.d.ts → types.d.cts} +4 -4
  341. package/dist/types.d.cts.map +1 -0
  342. package/dist/types.d.mts +533 -0
  343. package/dist/types.d.mts.map +1 -0
  344. package/dist/{types.js → types.mjs} +1 -1
  345. package/dist/types.mjs.map +1 -0
  346. package/dist/utils/constants.cjs +5 -0
  347. package/dist/utils/constants.cjs.map +1 -0
  348. package/dist/utils/constants.d.cts +2 -0
  349. package/dist/utils/constants.d.cts.map +1 -0
  350. package/dist/utils/constants.d.mts +2 -0
  351. package/dist/utils/constants.d.mts.map +1 -0
  352. package/dist/utils/{constants.js → constants.mjs} +1 -1
  353. package/dist/utils/constants.mjs.map +1 -0
  354. package/dist/utils/customAssetsRpcSupplement.cjs +72 -0
  355. package/dist/utils/customAssetsRpcSupplement.cjs.map +1 -0
  356. package/dist/utils/{customAssetsRpcSupplement.d.ts → customAssetsRpcSupplement.d.cts} +2 -2
  357. package/dist/utils/customAssetsRpcSupplement.d.cts.map +1 -0
  358. package/dist/utils/customAssetsRpcSupplement.d.mts +60 -0
  359. package/dist/utils/customAssetsRpcSupplement.d.mts.map +1 -0
  360. package/dist/utils/{customAssetsRpcSupplement.js → customAssetsRpcSupplement.mjs} +2 -2
  361. package/dist/utils/customAssetsRpcSupplement.mjs.map +1 -0
  362. package/dist/utils/dedupingBatchFetcher.cjs +168 -0
  363. package/dist/utils/dedupingBatchFetcher.cjs.map +1 -0
  364. package/dist/utils/{dedupingBatchFetcher.d.ts → dedupingBatchFetcher.d.cts} +1 -1
  365. package/dist/utils/dedupingBatchFetcher.d.cts.map +1 -0
  366. package/dist/utils/dedupingBatchFetcher.d.mts +72 -0
  367. package/dist/utils/dedupingBatchFetcher.d.mts.map +1 -0
  368. package/dist/utils/dedupingBatchFetcher.mjs +164 -0
  369. package/dist/utils/dedupingBatchFetcher.mjs.map +1 -0
  370. package/dist/utils/fetchWithTimeout.cjs +30 -0
  371. package/dist/utils/fetchWithTimeout.cjs.map +1 -0
  372. package/dist/utils/{fetchWithTimeout.d.ts → fetchWithTimeout.d.cts} +1 -1
  373. package/dist/utils/fetchWithTimeout.d.cts.map +1 -0
  374. package/dist/utils/fetchWithTimeout.d.mts +11 -0
  375. package/dist/utils/fetchWithTimeout.d.mts.map +1 -0
  376. package/dist/utils/{fetchWithTimeout.js → fetchWithTimeout.mjs} +1 -1
  377. package/dist/utils/fetchWithTimeout.mjs.map +1 -0
  378. package/dist/utils/formatExchangeRatesForBridge.cjs +161 -0
  379. package/dist/utils/formatExchangeRatesForBridge.cjs.map +1 -0
  380. package/dist/utils/{formatExchangeRatesForBridge.d.ts → formatExchangeRatesForBridge.d.cts} +3 -3
  381. package/dist/utils/formatExchangeRatesForBridge.d.cts.map +1 -0
  382. package/dist/utils/formatExchangeRatesForBridge.d.mts +43 -0
  383. package/dist/utils/formatExchangeRatesForBridge.d.mts.map +1 -0
  384. package/dist/utils/{formatExchangeRatesForBridge.js → formatExchangeRatesForBridge.mjs} +7 -6
  385. package/dist/utils/formatExchangeRatesForBridge.mjs.map +1 -0
  386. package/dist/utils/formatStateForTransactionPay.cjs +174 -0
  387. package/dist/utils/formatStateForTransactionPay.cjs.map +1 -0
  388. package/dist/utils/{formatStateForTransactionPay.d.ts → formatStateForTransactionPay.d.cts} +3 -3
  389. package/dist/utils/formatStateForTransactionPay.d.cts.map +1 -0
  390. package/dist/utils/formatStateForTransactionPay.d.mts +72 -0
  391. package/dist/utils/formatStateForTransactionPay.d.mts.map +1 -0
  392. package/dist/utils/{formatStateForTransactionPay.js → formatStateForTransactionPay.mjs} +15 -13
  393. package/dist/utils/formatStateForTransactionPay.mjs.map +1 -0
  394. package/dist/utils/index.cjs +21 -0
  395. package/dist/utils/index.cjs.map +1 -0
  396. package/dist/utils/index.d.cts +9 -0
  397. package/dist/utils/index.d.cts.map +1 -0
  398. package/dist/utils/index.d.mts +9 -0
  399. package/dist/utils/index.d.mts.map +1 -0
  400. package/dist/utils/index.mjs +7 -0
  401. package/dist/utils/index.mjs.map +1 -0
  402. package/dist/utils/native-assets.cjs +64 -0
  403. package/dist/utils/native-assets.cjs.map +1 -0
  404. package/dist/utils/{native-assets.d.ts → native-assets.d.cts} +2 -2
  405. package/dist/utils/native-assets.d.cts.map +1 -0
  406. package/dist/utils/native-assets.d.mts +19 -0
  407. package/dist/utils/native-assets.d.mts.map +1 -0
  408. package/dist/utils/{native-assets.js → native-assets.mjs} +6 -6
  409. package/dist/utils/native-assets.mjs.map +1 -0
  410. package/dist/utils/normalizeAmountString.cjs +64 -0
  411. package/dist/utils/normalizeAmountString.cjs.map +1 -0
  412. package/dist/utils/{normalizeAmountString.d.ts → normalizeAmountString.d.cts} +1 -1
  413. package/dist/utils/normalizeAmountString.d.cts.map +1 -0
  414. package/dist/utils/normalizeAmountString.d.mts +35 -0
  415. package/dist/utils/normalizeAmountString.d.mts.map +1 -0
  416. package/dist/utils/{normalizeAmountString.js → normalizeAmountString.mjs} +2 -2
  417. package/dist/utils/normalizeAmountString.mjs.map +1 -0
  418. package/dist/utils/normalizeAssetId.cjs +60 -0
  419. package/dist/utils/normalizeAssetId.cjs.map +1 -0
  420. package/dist/utils/{normalizeAssetId.d.ts → normalizeAssetId.d.cts} +3 -3
  421. package/dist/utils/normalizeAssetId.d.cts.map +1 -0
  422. package/dist/utils/normalizeAssetId.d.mts +32 -0
  423. package/dist/utils/normalizeAssetId.d.mts.map +1 -0
  424. package/dist/utils/{normalizeAssetId.js → normalizeAssetId.mjs} +11 -4
  425. package/dist/utils/normalizeAssetId.mjs.map +1 -0
  426. package/dist/utils/snaps-assets-migration.cjs +171 -0
  427. package/dist/utils/snaps-assets-migration.cjs.map +1 -0
  428. package/dist/utils/{snaps-assets-migration.d.ts → snaps-assets-migration.d.cts} +5 -5
  429. package/dist/utils/snaps-assets-migration.d.cts.map +1 -0
  430. package/dist/utils/snaps-assets-migration.d.mts +113 -0
  431. package/dist/utils/snaps-assets-migration.d.mts.map +1 -0
  432. package/dist/utils/{snaps-assets-migration.js → snaps-assets-migration.mjs} +2 -2
  433. package/dist/utils/snaps-assets-migration.mjs.map +1 -0
  434. package/dist/utils/trace.cjs +120 -0
  435. package/dist/utils/trace.cjs.map +1 -0
  436. package/dist/utils/{trace.d.ts → trace.d.cts} +2 -2
  437. package/dist/utils/trace.d.cts.map +1 -0
  438. package/dist/utils/trace.d.mts +52 -0
  439. package/dist/utils/trace.d.mts.map +1 -0
  440. package/dist/utils/{trace.js → trace.mjs} +1 -1
  441. package/dist/utils/trace.mjs.map +1 -0
  442. package/package.json +17 -14
  443. package/dist/AssetsController-method-action-types.d.ts.map +0 -1
  444. package/dist/AssetsController-method-action-types.js.map +0 -1
  445. package/dist/AssetsController.d.ts.map +0 -1
  446. package/dist/AssetsController.js +0 -2934
  447. package/dist/AssetsController.js.map +0 -1
  448. package/dist/data-sources/AbstractDataSource.d.ts.map +0 -1
  449. package/dist/data-sources/AbstractDataSource.js.map +0 -1
  450. package/dist/data-sources/AccountActivityDataSource.d.ts.map +0 -1
  451. package/dist/data-sources/AccountActivityDataSource.js +0 -272
  452. package/dist/data-sources/AccountActivityDataSource.js.map +0 -1
  453. package/dist/data-sources/AccountsApiDataSource.d.ts.map +0 -1
  454. package/dist/data-sources/AccountsApiDataSource.js +0 -609
  455. package/dist/data-sources/AccountsApiDataSource.js.map +0 -1
  456. package/dist/data-sources/PriceDataSource.d.ts.map +0 -1
  457. package/dist/data-sources/PriceDataSource.js.map +0 -1
  458. package/dist/data-sources/RpcDataSource.d.ts.map +0 -1
  459. package/dist/data-sources/RpcDataSource.js +0 -1077
  460. package/dist/data-sources/RpcDataSource.js.map +0 -1
  461. package/dist/data-sources/SnapDataSource.d.ts.map +0 -1
  462. package/dist/data-sources/SnapDataSource.js.map +0 -1
  463. package/dist/data-sources/StakedBalanceDataSource.d.ts.map +0 -1
  464. package/dist/data-sources/StakedBalanceDataSource.js +0 -675
  465. package/dist/data-sources/StakedBalanceDataSource.js.map +0 -1
  466. package/dist/data-sources/TokenDataSource.d.ts.map +0 -1
  467. package/dist/data-sources/TokenDataSource.js.map +0 -1
  468. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.ts.map +0 -1
  469. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.js.map +0 -1
  470. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.ts.map +0 -1
  471. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.js +0 -297
  472. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.js.map +0 -1
  473. package/dist/data-sources/evm-rpc-services/clients/index.d.ts +0 -4
  474. package/dist/data-sources/evm-rpc-services/clients/index.d.ts.map +0 -1
  475. package/dist/data-sources/evm-rpc-services/clients/index.js +0 -3
  476. package/dist/data-sources/evm-rpc-services/clients/index.js.map +0 -1
  477. package/dist/data-sources/evm-rpc-services/index.d.ts.map +0 -1
  478. package/dist/data-sources/evm-rpc-services/index.js +0 -4
  479. package/dist/data-sources/evm-rpc-services/index.js.map +0 -1
  480. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.ts.map +0 -1
  481. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.js +0 -241
  482. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.js.map +0 -1
  483. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.ts.map +0 -1
  484. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.js.map +0 -1
  485. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.ts.map +0 -1
  486. package/dist/data-sources/evm-rpc-services/services/TokenDetector.js +0 -217
  487. package/dist/data-sources/evm-rpc-services/services/TokenDetector.js.map +0 -1
  488. package/dist/data-sources/evm-rpc-services/services/index.d.ts.map +0 -1
  489. package/dist/data-sources/evm-rpc-services/services/index.js +0 -4
  490. package/dist/data-sources/evm-rpc-services/services/index.js.map +0 -1
  491. package/dist/data-sources/evm-rpc-services/types/assets.d.ts.map +0 -1
  492. package/dist/data-sources/evm-rpc-services/types/assets.js +0 -2
  493. package/dist/data-sources/evm-rpc-services/types/assets.js.map +0 -1
  494. package/dist/data-sources/evm-rpc-services/types/config.d.ts.map +0 -1
  495. package/dist/data-sources/evm-rpc-services/types/config.js +0 -2
  496. package/dist/data-sources/evm-rpc-services/types/config.js.map +0 -1
  497. package/dist/data-sources/evm-rpc-services/types/core.d.ts.map +0 -1
  498. package/dist/data-sources/evm-rpc-services/types/core.js +0 -2
  499. package/dist/data-sources/evm-rpc-services/types/core.js.map +0 -1
  500. package/dist/data-sources/evm-rpc-services/types/index.d.ts +0 -7
  501. package/dist/data-sources/evm-rpc-services/types/index.d.ts.map +0 -1
  502. package/dist/data-sources/evm-rpc-services/types/index.js +0 -2
  503. package/dist/data-sources/evm-rpc-services/types/index.js.map +0 -1
  504. package/dist/data-sources/evm-rpc-services/types/multicall.d.ts.map +0 -1
  505. package/dist/data-sources/evm-rpc-services/types/multicall.js +0 -2
  506. package/dist/data-sources/evm-rpc-services/types/multicall.js.map +0 -1
  507. package/dist/data-sources/evm-rpc-services/types/services.d.ts.map +0 -1
  508. package/dist/data-sources/evm-rpc-services/types/services.js +0 -2
  509. package/dist/data-sources/evm-rpc-services/types/services.js.map +0 -1
  510. package/dist/data-sources/evm-rpc-services/types/state.d.ts.map +0 -1
  511. package/dist/data-sources/evm-rpc-services/types/state.js +0 -2
  512. package/dist/data-sources/evm-rpc-services/types/state.js.map +0 -1
  513. package/dist/data-sources/evm-rpc-services/utils/assets.d.ts.map +0 -1
  514. package/dist/data-sources/evm-rpc-services/utils/assets.js.map +0 -1
  515. package/dist/data-sources/evm-rpc-services/utils/batch.d.ts.map +0 -1
  516. package/dist/data-sources/evm-rpc-services/utils/batch.js.map +0 -1
  517. package/dist/data-sources/evm-rpc-services/utils/index.d.ts +0 -4
  518. package/dist/data-sources/evm-rpc-services/utils/index.d.ts.map +0 -1
  519. package/dist/data-sources/evm-rpc-services/utils/index.js +0 -4
  520. package/dist/data-sources/evm-rpc-services/utils/index.js.map +0 -1
  521. package/dist/data-sources/evm-rpc-services/utils/parsing.d.ts.map +0 -1
  522. package/dist/data-sources/evm-rpc-services/utils/parsing.js.map +0 -1
  523. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.ts.map +0 -1
  524. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.js.map +0 -1
  525. package/dist/data-sources/index.d.ts.map +0 -1
  526. package/dist/data-sources/index.js +0 -14
  527. package/dist/data-sources/index.js.map +0 -1
  528. package/dist/defaults.d.ts.map +0 -1
  529. package/dist/defaults.js.map +0 -1
  530. package/dist/errors.d.ts.map +0 -1
  531. package/dist/errors.js.map +0 -1
  532. package/dist/index.d.ts.map +0 -1
  533. package/dist/index.js.map +0 -1
  534. package/dist/logger.d.ts +0 -4
  535. package/dist/logger.d.ts.map +0 -1
  536. package/dist/logger.js +0 -4
  537. package/dist/logger.js.map +0 -1
  538. package/dist/middlewares/CustomAssetGraduationMiddleware.d.ts.map +0 -1
  539. package/dist/middlewares/CustomAssetGraduationMiddleware.js.map +0 -1
  540. package/dist/middlewares/DetectionMiddleware.d.ts.map +0 -1
  541. package/dist/middlewares/DetectionMiddleware.js.map +0 -1
  542. package/dist/middlewares/ParallelMiddleware.d.ts.map +0 -1
  543. package/dist/middlewares/ParallelMiddleware.js.map +0 -1
  544. package/dist/middlewares/RpcFallbackMiddleware.d.ts.map +0 -1
  545. package/dist/middlewares/RpcFallbackMiddleware.js.map +0 -1
  546. package/dist/middlewares/index.d.ts +0 -9
  547. package/dist/middlewares/index.d.ts.map +0 -1
  548. package/dist/middlewares/index.js +0 -5
  549. package/dist/middlewares/index.js.map +0 -1
  550. package/dist/migrations/healAssetsInfoMetadata.d.ts.map +0 -1
  551. package/dist/migrations/healAssetsInfoMetadata.js.map +0 -1
  552. package/dist/selectors/balance.d.ts.map +0 -1
  553. package/dist/selectors/balance.js.map +0 -1
  554. package/dist/types.d.ts.map +0 -1
  555. package/dist/types.js.map +0 -1
  556. package/dist/utils/constants.d.ts +0 -2
  557. package/dist/utils/constants.d.ts.map +0 -1
  558. package/dist/utils/constants.js.map +0 -1
  559. package/dist/utils/customAssetsRpcSupplement.d.ts.map +0 -1
  560. package/dist/utils/customAssetsRpcSupplement.js.map +0 -1
  561. package/dist/utils/dedupingBatchFetcher.d.ts.map +0 -1
  562. package/dist/utils/dedupingBatchFetcher.js +0 -177
  563. package/dist/utils/dedupingBatchFetcher.js.map +0 -1
  564. package/dist/utils/fetchWithTimeout.d.ts.map +0 -1
  565. package/dist/utils/fetchWithTimeout.js.map +0 -1
  566. package/dist/utils/formatExchangeRatesForBridge.d.ts.map +0 -1
  567. package/dist/utils/formatExchangeRatesForBridge.js.map +0 -1
  568. package/dist/utils/formatStateForTransactionPay.d.ts.map +0 -1
  569. package/dist/utils/formatStateForTransactionPay.js.map +0 -1
  570. package/dist/utils/index.d.ts +0 -9
  571. package/dist/utils/index.d.ts.map +0 -1
  572. package/dist/utils/index.js +0 -7
  573. package/dist/utils/index.js.map +0 -1
  574. package/dist/utils/native-assets.d.ts.map +0 -1
  575. package/dist/utils/native-assets.js.map +0 -1
  576. package/dist/utils/normalizeAmountString.d.ts.map +0 -1
  577. package/dist/utils/normalizeAmountString.js.map +0 -1
  578. package/dist/utils/normalizeAssetId.d.ts.map +0 -1
  579. package/dist/utils/normalizeAssetId.js.map +0 -1
  580. package/dist/utils/snaps-assets-migration.d.ts.map +0 -1
  581. package/dist/utils/snaps-assets-migration.js.map +0 -1
  582. package/dist/utils/trace.d.ts.map +0 -1
  583. package/dist/utils/trace.js.map +0 -1
@@ -1,1077 +0,0 @@
1
- import { Web3Provider } from '@ethersproject/providers';
2
- import { toHex } from '@metamask/controller-utils';
3
- import { isStrictHexString, isCaipChainId, parseCaipAssetType, parseCaipChainId, hexToNumber, toCaipChainId, KnownCaipNamespace, } from '@metamask/utils';
4
- import { BigNumber as BigNumberJS } from 'bignumber.js';
5
- import { projectLogger, createModuleLogger } from '../logger.js';
6
- import { ZERO_ADDRESS } from '../utils/constants.js';
7
- import { normalizeAssetId } from '../utils/index.js';
8
- import { AbstractDataSource } from './AbstractDataSource.js';
9
- import { BalanceFetcher, MulticallClient, TokenDetector, TokensApiClient, } from './evm-rpc-services/index.js';
10
- import { shouldSkipNativeForCaipChainId } from './evm-rpc-services/utils/assets.js';
11
- const CONTROLLER_NAME = 'RpcDataSource';
12
- const DEFAULT_BALANCE_INTERVAL = 30_000; // 30 seconds
13
- const DEFAULT_DETECTION_INTERVAL = 180_000; // 3 minutes
14
- const log = createModuleLogger(projectLogger, CONTROLLER_NAME);
15
- /**
16
- * Convert CAIP chain ID or hex chain ID to hex chain ID.
17
- *
18
- * @param chainId - CAIP chain ID or hex chain ID.
19
- * @returns Hex chain ID.
20
- */
21
- export const caipChainIdToHex = (chainId) => {
22
- if (isStrictHexString(chainId)) {
23
- return chainId;
24
- }
25
- if (isCaipChainId(chainId)) {
26
- return toHex(parseCaipChainId(chainId).reference);
27
- }
28
- throw new Error('caipChainIdToHex - Failed to provide CAIP-2 or Hex chainId');
29
- };
30
- /**
31
- * Data source for fetching balances via RPC calls.
32
- *
33
- * Orchestrates polling through BalanceFetcher and TokenDetector,
34
- * each of which handle their own polling intervals.
35
- *
36
- * Communicates with AssetsController via Messenger:
37
- *
38
- * Actions:
39
- * - RpcDataSource:getActiveChains
40
- * - RpcDataSource:fetch
41
- * - RpcDataSource:subscribe
42
- * - RpcDataSource:unsubscribe
43
- *
44
- * Events:
45
- * - RpcDataSource:activeChainsUpdated
46
- * - RpcDataSource:assetsUpdated
47
- */
48
- export class RpcDataSource extends AbstractDataSource {
49
- #messenger;
50
- #onActiveChainsUpdated;
51
- #getNativeAssetForChain;
52
- #timeout;
53
- #tokenDetectionEnabled;
54
- #useExternalService;
55
- #isOnboarded;
56
- /** Currently active chains */
57
- #activeChains = [];
58
- /** Network status for each active chain */
59
- #chainStatuses = {};
60
- /** Cache of Web3Provider instances by chainId */
61
- #providerCache = new Map();
62
- /** Active subscriptions by ID */
63
- #activeSubscriptions = new Map();
64
- #unsubscribeTransactionConfirmed = undefined;
65
- // Rpc-datasource components
66
- #multicallClient;
67
- #balanceFetcher;
68
- #tokenDetector;
69
- #getAssetType;
70
- constructor(options) {
71
- super(CONTROLLER_NAME, { activeChains: [] });
72
- this.#messenger = options.messenger;
73
- this.#onActiveChainsUpdated = options.onActiveChainsUpdated;
74
- this.#getNativeAssetForChain = options.getNativeAssetForChain;
75
- this.#getAssetType = options.getAssetType;
76
- this.#timeout = options.timeout ?? 10_000;
77
- this.#tokenDetectionEnabled =
78
- options.tokenDetectionEnabled ?? (() => true);
79
- this.#useExternalService =
80
- options.useExternalService ?? (() => true);
81
- this.#isOnboarded = options.isOnboarded ?? (() => true);
82
- const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL;
83
- const detectionInterval = options.detectionInterval ?? DEFAULT_DETECTION_INTERVAL;
84
- log('Initializing RpcDataSource', {
85
- timeout: this.#timeout,
86
- balanceInterval,
87
- detectionInterval,
88
- tokenDetectionEnabled: this.#tokenDetectionEnabled(),
89
- useExternalService: this.#useExternalService(),
90
- });
91
- // Initialize MulticallClient with a provider getter
92
- this.#multicallClient = new MulticallClient({
93
- getProvider: (hexChainId) => {
94
- return this.#getMulticallProvider(hexChainId);
95
- },
96
- getMulticall3AddressForChain: (hexChainId) =>
97
- // The messenger is not being called from a constructor, so this is safe.
98
- // eslint-disable-next-line no-restricted-syntax
99
- this.#messenger.call('ConfigRegistryController:getNetworkConfigByCaip2ChainId', toCaipChainId(KnownCaipNamespace.Eip155, hexToNumber(hexChainId).toString()))?.contracts?.multicall3,
100
- });
101
- // Create messenger adapters for BalanceFetcher and TokenDetector
102
- const balanceFetcherMessenger = {
103
- call: (_action) => {
104
- // The messenger is not being called from a constructor, so this is safe.
105
- // eslint-disable-next-line no-restricted-syntax
106
- const state = this.#messenger.call('AssetsController:getState');
107
- return {
108
- assetsBalance: (state.assetsBalance ?? {}),
109
- customAssets: (state.customAssets ?? {}),
110
- };
111
- },
112
- };
113
- // Initialize BalanceFetcher with polling interval
114
- this.#balanceFetcher = new BalanceFetcher(this.#multicallClient, balanceFetcherMessenger, {
115
- pollingInterval: balanceInterval,
116
- isNativeAsset: (assetId) => {
117
- const { chainId } = parseCaipAssetType(assetId);
118
- const nativeId = this.#getNativeAssetForChain(chainId);
119
- return nativeId?.toLowerCase() === assetId.toLowerCase();
120
- },
121
- });
122
- // Polling controller awaits this callback; rejections must not become unhandled.
123
- this.#balanceFetcher.setOnBalanceUpdate(async (result) => {
124
- try {
125
- await this.#handleBalanceUpdate(result);
126
- }
127
- catch (error) {
128
- log('Balance update handler failed', { error });
129
- }
130
- });
131
- // Initialize TokenDetector with polling interval. The TokensApiClient is
132
- // configured with the shared TanStack Query client (when the controller
133
- // provides one) so concurrent detector polls/accounts/instances share a
134
- // single in-flight request and cached result per chain.
135
- const tokensApiClient = new TokensApiClient({
136
- queryClient: options.queryClient,
137
- });
138
- this.#tokenDetector = new TokenDetector(this.#multicallClient, tokensApiClient, {
139
- pollingInterval: detectionInterval,
140
- tokenDetectionEnabled: this.#tokenDetectionEnabled,
141
- useExternalService: this.#useExternalService,
142
- });
143
- // Sync throw in the detector would reject the poll tick if uncaught.
144
- this.#tokenDetector.setOnDetectionUpdate((result) => {
145
- try {
146
- this.#handleDetectionUpdate(result);
147
- }
148
- catch (error) {
149
- log('Detection update handler failed', { error });
150
- }
151
- });
152
- this.#subscribeToNetworkController();
153
- this.#subscribeToTransactionEvents();
154
- this.#initializeFromNetworkController();
155
- }
156
- /**
157
- * Convert a raw balance to human-readable format using decimals.
158
- *
159
- * Returns `'0'` when either input is invalid (e.g. `decimals` is `null`,
160
- * `NaN`, negative or non-finite, or `rawBalance` cannot be parsed as a
161
- * number). Defaulting to a fixed decimals value would silently produce
162
- * wrong amounts; `'0'` keeps state safe and never lets `NaN` leak in.
163
- *
164
- * @param rawBalance - The raw balance string.
165
- * @param decimals - The number of decimals for the token.
166
- * @returns The human-readable balance string, or `'0'` when inputs are invalid.
167
- */
168
- #convertToHumanReadable(rawBalance, decimals) {
169
- if (!Number.isFinite(decimals) || decimals < 0) {
170
- log('Invalid decimals — defaulting balance to "0"', {
171
- rawBalance,
172
- decimals,
173
- });
174
- return '0';
175
- }
176
- const rawAmount = new BigNumberJS(rawBalance);
177
- if (!rawAmount.isFinite()) {
178
- log('Invalid raw balance — defaulting to "0"', { rawBalance, decimals });
179
- return '0';
180
- }
181
- const divisor = new BigNumberJS(10).pow(decimals);
182
- return rawAmount.dividedBy(divisor).toFixed();
183
- }
184
- /**
185
- * Collect metadata for a list of balance entries.
186
- * For native tokens, generates metadata from chain status.
187
- * For ERC20 tokens, looks up from existing state or token list.
188
- *
189
- * @param balances - Array of balance entries with assetId.
190
- * @param chainId - The CAIP-2 chain ID.
191
- * @returns Record of asset metadata keyed by asset ID.
192
- */
193
- #collectMetadataForBalances(balances, chainId) {
194
- const assetsInfo = {};
195
- const existingMetadata = this.#getExistingAssetsMetadata();
196
- const nativeAssetId = this.#getNativeAssetForChain(chainId);
197
- for (const balance of balances) {
198
- const existingMeta = existingMetadata[balance.assetId];
199
- const isNative = existingMeta?.type === 'native' ||
200
- balance.assetId.toLowerCase() === nativeAssetId?.toLowerCase() ||
201
- this.#getAssetType(balance.assetId) === 'native';
202
- if (isNative && !this.#hasValidDecimals(existingMeta)) {
203
- // Only emit a stub when no valid metadata exists in state yet.
204
- // Re-emitting existing metadata into the response would overwrite
205
- // richer entries (e.g. image/description added by AccountsAPI) with
206
- // a simpler stub on every balance poll cycle.
207
- const chainStatus = this.#chainStatuses[chainId];
208
- if (chainStatus) {
209
- assetsInfo[balance.assetId] = {
210
- type: 'native',
211
- symbol: chainStatus.nativeCurrency,
212
- name: chainStatus.nativeCurrency,
213
- decimals: 18,
214
- };
215
- }
216
- }
217
- // For ERC-20 tokens and native tokens with existing valid metadata:
218
- // do not re-emit — the existing state entry is already correct.
219
- // Decimals for balance conversion are resolved via stateMetadata in
220
- // the callers (pickValidDecimals(stateMetadata, pipelineMetadata)).
221
- }
222
- return assetsInfo;
223
- }
224
- /**
225
- * Type guard for metadata whose `decimals` is safe to use for balance
226
- * conversion.
227
- *
228
- * Mirrors the validity rules in `#convertToHumanReadable` (finite and
229
- * non-negative). Keeping these in sync ensures that whenever the metadata
230
- * guard accepts a value, the balance guard will also accept it — so we
231
- * never end up emitting metadata with `decimals: -1` while silently
232
- * defaulting the balance to `'0'`.
233
- *
234
- * @param metadata - The metadata to check.
235
- * @returns `true` if `decimals` is a finite, non-negative number.
236
- */
237
- #hasValidDecimals(metadata) {
238
- return Boolean(metadata && Number.isFinite(metadata.decimals) && metadata.decimals >= 0);
239
- }
240
- /**
241
- * Pick the first valid `decimals` value from a list of metadata sources.
242
- *
243
- * `??` only short-circuits on `null`/`undefined`, so a stale state entry
244
- * with `decimals: NaN` would otherwise win over a later source that holds
245
- * a correct value (e.g. the chain-status stub produced by
246
- * `#collectMetadataForBalances`). This helper treats `NaN`, negative, and
247
- * non-finite values as missing so the next source can supply a usable one.
248
- *
249
- * @param metadatas - Metadata candidates in priority order.
250
- * @returns The first finite `decimals` value, or `undefined` if none are valid.
251
- */
252
- #pickValidDecimals(...metadatas) {
253
- for (const metadata of metadatas) {
254
- if (this.#hasValidDecimals(metadata)) {
255
- return metadata.decimals;
256
- }
257
- }
258
- return undefined;
259
- }
260
- /**
261
- * Handle balance update from BalanceFetcher.
262
- *
263
- * @param result - The balance fetch result.
264
- */
265
- async #handleBalanceUpdate(result) {
266
- const newBalances = {};
267
- // Convert hex chain ID to CAIP-2 format
268
- const chainIdDecimal = parseInt(result.chainId, 16);
269
- const caipChainId = `eip155:${chainIdDecimal}`;
270
- // Normalize asset IDs from BalanceFetcher (lowercase) to checksummed form
271
- const normalizedBalances = result.balances.map((b) => ({
272
- ...b,
273
- assetId: normalizeAssetId(b.assetId),
274
- }));
275
- // Collect metadata for all balances
276
- const assetsInfo = this.#collectMetadataForBalances(normalizedBalances, caipChainId);
277
- // Convert balances to human-readable format.
278
- // Resolution: state metadata → pipeline metadata; skip if decimals unknown.
279
- const existingMetadata = this.#getExistingAssetsMetadata();
280
- for (const balance of normalizedBalances) {
281
- const stateMetadata = existingMetadata[balance.assetId];
282
- const pipelineMetadata = assetsInfo[balance.assetId];
283
- const decimals = this.#pickValidDecimals(stateMetadata, pipelineMetadata);
284
- if (decimals === undefined) {
285
- continue;
286
- }
287
- const humanReadableAmount = this.#convertToHumanReadable(balance.balance, decimals);
288
- newBalances[balance.assetId] = {
289
- amount: humanReadableAmount,
290
- };
291
- }
292
- // Only send new data to AssetsController - it handles merging atomically
293
- // to avoid race conditions when concurrent updates occur for the same account
294
- const response = {
295
- assetsBalance: {
296
- [result.accountId]: newBalances,
297
- },
298
- assetsInfo,
299
- updateMode: 'merge',
300
- };
301
- const request = {
302
- accountsWithSupportedChains: [],
303
- chainIds: [caipChainId],
304
- dataTypes: ['balance'],
305
- };
306
- log('Balance update response', {
307
- accountId: result.accountId,
308
- newBalanceCount: Object.keys(newBalances).length,
309
- });
310
- for (const subscription of this.#activeSubscriptions.values()) {
311
- subscription.onAssetsUpdate(response, request)?.catch((error) => {
312
- log('Failed to update assets', { error });
313
- });
314
- }
315
- }
316
- /**
317
- * Handle detection update from TokenDetector.
318
- *
319
- * @param result - The token detection result.
320
- */
321
- #handleDetectionUpdate(result) {
322
- log('Detected new tokens', {
323
- count: result.detectedAssets.length,
324
- });
325
- // Build new metadata from detected assets
326
- const newMetadata = {};
327
- if (result.detectedAssets.length > 0) {
328
- for (const asset of result.detectedAssets) {
329
- // Only include if we have metadata (symbol and decimals at minimum)
330
- if (asset.symbol && asset.decimals !== undefined) {
331
- newMetadata[asset.assetId] = {
332
- type: this.#getAssetType(asset.assetId),
333
- symbol: asset.symbol,
334
- name: asset.name ?? asset.symbol,
335
- decimals: asset.decimals,
336
- image: asset.image,
337
- };
338
- }
339
- }
340
- }
341
- // Build new balances from detected tokens
342
- const newBalances = {};
343
- if (result.detectedBalances.length > 0) {
344
- for (const balance of result.detectedBalances) {
345
- // Get decimals from the detected asset metadata
346
- const detectedAsset = result.detectedAssets.find((asset) => asset.assetId === balance.assetId);
347
- if (detectedAsset?.decimals === undefined) {
348
- continue;
349
- }
350
- const humanReadableAmount = this.#convertToHumanReadable(balance.balance, detectedAsset.decimals);
351
- newBalances[balance.assetId] = {
352
- amount: humanReadableAmount,
353
- };
354
- }
355
- }
356
- // Only send new data to AssetsController - it handles merging atomically
357
- // to avoid race conditions when concurrent updates occur for the same account
358
- const response = {
359
- detectedAssets: {
360
- [result.accountId]: result.detectedAssets.map((asset) => asset.assetId),
361
- },
362
- assetsInfo: newMetadata,
363
- assetsBalance: {
364
- [result.accountId]: newBalances,
365
- },
366
- updateMode: 'merge',
367
- };
368
- const chainIdDecimal = parseInt(result.chainId, 16);
369
- const caipChainId = `eip155:${chainIdDecimal}`;
370
- const request = {
371
- accountsWithSupportedChains: [],
372
- chainIds: [caipChainId],
373
- dataTypes: ['balance', 'metadata', 'price'],
374
- };
375
- for (const subscription of this.#activeSubscriptions.values()) {
376
- subscription.onAssetsUpdate(response, request)?.catch((error) => {
377
- log('Failed to update detected assets', { error });
378
- });
379
- }
380
- }
381
- #subscribeToNetworkController() {
382
- this.#messenger.subscribe('NetworkController:stateChange', (networkState) => {
383
- log('NetworkController state changed');
384
- this.#clearProviderCache();
385
- this.#updateFromNetworkState(networkState);
386
- });
387
- }
388
- #subscribeToTransactionEvents() {
389
- const unsubConfirmed = this.#messenger.subscribe('TransactionController:transactionConfirmed', this.#onTransactionConfirmed.bind(this));
390
- this.#unsubscribeTransactionConfirmed =
391
- typeof unsubConfirmed === 'function' ? unsubConfirmed : undefined;
392
- }
393
- #onTransactionConfirmed(payload) {
394
- const hexChainId = payload?.chainId;
395
- if (!hexChainId) {
396
- return;
397
- }
398
- const caipChainId = `eip155:${parseInt(hexChainId, 16)}`;
399
- this.#refreshBalanceForChains([caipChainId], 'transactionConfirmed').catch((error) => {
400
- log('Failed to refresh balance after transaction confirmed', { error });
401
- });
402
- }
403
- /**
404
- * Fetch balances for the given chains across all active subscriptions and
405
- * push updates to the controller.
406
- *
407
- * @param chainIds - CAIP-2 chain IDs to refresh.
408
- * @param context - Why the refresh was triggered (for logging).
409
- */
410
- async #refreshBalanceForChains(chainIds, context = 'polling') {
411
- const chainIdsSet = new Set(chainIds);
412
- const chainsToFetch = chainIds.filter((chainId) => this.#activeChains.includes(chainId));
413
- if (chainsToFetch.length === 0) {
414
- return;
415
- }
416
- let appliedCount = 0;
417
- for (const subscription of this.#activeSubscriptions.values()) {
418
- const subscriptionChains = subscription.chains.filter((chainId) => chainIdsSet.has(chainId));
419
- if (subscriptionChains.length === 0) {
420
- continue;
421
- }
422
- const request = {
423
- accountsWithSupportedChains: subscription.accounts.map((account) => ({
424
- account,
425
- supportedChains: subscriptionChains,
426
- })),
427
- chainIds: subscriptionChains,
428
- dataTypes: ['balance'],
429
- };
430
- try {
431
- const response = await this.fetch(request);
432
- const balanceCount = response.assetsBalance
433
- ? Object.values(response.assetsBalance).reduce((sum, accountBalances) => sum + Object.keys(accountBalances).length, 0)
434
- : 0;
435
- if (balanceCount === 0) {
436
- continue;
437
- }
438
- const responseWithMode = {
439
- ...response,
440
- updateMode: response.updateMode ?? 'merge',
441
- };
442
- await subscription.onAssetsUpdate(responseWithMode, request);
443
- appliedCount += 1;
444
- }
445
- catch (error) {
446
- log('Failed to fetch balance after transaction', {
447
- context,
448
- chains: subscriptionChains,
449
- error,
450
- });
451
- }
452
- }
453
- if (appliedCount === 0 && context === 'transactionConfirmed') {
454
- log('No RpcDataSource subscription covers chain after transaction', {
455
- chainsToFetch,
456
- });
457
- }
458
- }
459
- #initializeFromNetworkController() {
460
- log('Initializing from NetworkController');
461
- try {
462
- const networkState = this.#messenger.call('NetworkController:getState');
463
- this.#updateFromNetworkState(networkState);
464
- }
465
- catch (error) {
466
- log('Failed to initialize from NetworkController', error);
467
- }
468
- }
469
- /**
470
- * Re-read NetworkController state and refresh Rpc `activeChains` (e.g. when
471
- * network availability metadata changes after an EVM network switch).
472
- */
473
- refreshActiveChainsFromNetworkState() {
474
- this.#initializeFromNetworkController();
475
- }
476
- #updateFromNetworkState(networkState) {
477
- const { networkConfigurationsByChainId, networksMetadata } = networkState;
478
- const chainStatuses = {};
479
- const activeChains = [];
480
- for (const [hexChainId, config] of Object.entries(networkConfigurationsByChainId)) {
481
- const decimalChainId = parseInt(hexChainId, 16);
482
- const caip2ChainId = `eip155:${decimalChainId}`;
483
- const defaultRpcEndpoint = config.rpcEndpoints[config.defaultRpcEndpointIndex];
484
- if (!defaultRpcEndpoint) {
485
- continue;
486
- }
487
- const { networkClientId } = defaultRpcEndpoint;
488
- const metadata = networksMetadata[networkClientId];
489
- const status = metadata?.status ?? 'unknown';
490
- chainStatuses[caip2ChainId] = {
491
- chainId: caip2ChainId,
492
- status,
493
- name: config.name,
494
- nativeCurrency: config.nativeCurrency,
495
- networkClientId,
496
- };
497
- if (status === 'available' || status === 'unknown') {
498
- activeChains.push(caip2ChainId);
499
- }
500
- }
501
- log('Network state updated', {
502
- configuredChains: Object.keys(chainStatuses),
503
- activeChains,
504
- });
505
- // Check if chains changed
506
- const previousChains = [...this.#activeChains];
507
- const previousSet = new Set(previousChains);
508
- const hasChanges = previousChains.length !== activeChains.length ||
509
- activeChains.some((chain) => !previousSet.has(chain));
510
- // Update internal state and data source state before notifying, so that
511
- // when the controller handles the callback and calls getActiveChainsSync(),
512
- // it receives the updated chains (same order as AbstractDataSource.updateActiveChains).
513
- this.#chainStatuses = chainStatuses;
514
- this.#activeChains = activeChains;
515
- this.state.activeChains = activeChains;
516
- if (hasChanges) {
517
- this.#onActiveChainsUpdated(this.getName(), activeChains, previousChains);
518
- }
519
- }
520
- #getProvider(chainId) {
521
- const cached = this.#providerCache.get(chainId);
522
- if (cached) {
523
- return cached;
524
- }
525
- const chainStatus = this.#chainStatuses[chainId];
526
- if (!chainStatus) {
527
- return undefined;
528
- }
529
- try {
530
- const networkClient = this.#messenger.call('NetworkController:getNetworkClientById', chainStatus.networkClientId);
531
- if (!networkClient?.provider) {
532
- return undefined;
533
- }
534
- const web3Provider = new Web3Provider(networkClient.provider);
535
- this.#providerCache.set(chainId, web3Provider);
536
- return web3Provider;
537
- }
538
- catch (error) {
539
- log('Failed to get provider for chain', { chainId, error });
540
- return undefined;
541
- }
542
- }
543
- /**
544
- * Get provider for MulticallClient using a hex chainId.
545
- *
546
- * @param hexChainId - The hex string representation of the chain id.
547
- * @returns An RpcProvider instance for the specified chain.
548
- */
549
- #getMulticallProvider(hexChainId) {
550
- const decimalChainId = parseInt(hexChainId, 16);
551
- const caip2ChainId = `eip155:${decimalChainId}`;
552
- const web3Provider = this.#getProvider(caip2ChainId);
553
- if (!web3Provider) {
554
- throw new Error(`No provider available for chain ${hexChainId}`);
555
- }
556
- return {
557
- call: async (params) => {
558
- return web3Provider.call({
559
- to: params.to,
560
- data: params.data,
561
- });
562
- },
563
- getBalance: async (address) => {
564
- const balance = await web3Provider.getBalance(address);
565
- return balance;
566
- },
567
- };
568
- }
569
- #clearProviderCache() {
570
- this.#providerCache.clear();
571
- }
572
- /**
573
- * Fetch the `decimals()` value from an ERC20 contract via RPC.
574
- *
575
- * @param chainId - CAIP-2 chain ID.
576
- * @param tokenAddress - The token contract address.
577
- * @returns The decimals value, or undefined if the call fails.
578
- */
579
- async #fetchDecimalsViaRpc(chainId, tokenAddress) {
580
- try {
581
- const provider = this.#getProvider(chainId);
582
- if (!provider) {
583
- return undefined;
584
- }
585
- // ERC20 decimals() selector: keccak256("decimals()") = 0x313ce567
586
- const result = await provider.call({
587
- to: tokenAddress,
588
- data: '0x313ce567',
589
- });
590
- if (!result || result === '0x') {
591
- return undefined;
592
- }
593
- const parsed = parseInt(result, 16);
594
- if (Number.isNaN(parsed) || parsed < 0 || parsed > 255) {
595
- return undefined;
596
- }
597
- return parsed;
598
- }
599
- catch {
600
- return undefined;
601
- }
602
- }
603
- /**
604
- * Get the data source name.
605
- *
606
- * @returns The name of this data source.
607
- */
608
- /**
609
- * Get the status of all configured chains.
610
- *
611
- * @returns Record of chain statuses keyed by chain ID.
612
- */
613
- getChainStatuses() {
614
- return { ...this.#chainStatuses };
615
- }
616
- /**
617
- * Get the status of a specific chain.
618
- *
619
- * @param chainId - The chain ID to get status for.
620
- * @returns The chain status or undefined if not found.
621
- */
622
- getChainStatus(chainId) {
623
- return this.#chainStatuses[chainId];
624
- }
625
- /**
626
- * Set the balance polling interval.
627
- *
628
- * @param interval - The polling interval in milliseconds.
629
- */
630
- setBalancePollingInterval(interval) {
631
- log('Setting balance polling interval', { interval });
632
- this.#balanceFetcher.setIntervalLength(interval);
633
- }
634
- /**
635
- * Get the current balance polling interval.
636
- *
637
- * @returns The polling interval in milliseconds, or undefined if not set.
638
- */
639
- getBalancePollingInterval() {
640
- return this.#balanceFetcher.getIntervalLength();
641
- }
642
- /**
643
- * Set the token detection polling interval.
644
- *
645
- * @param interval - The polling interval in milliseconds.
646
- */
647
- setDetectionPollingInterval(interval) {
648
- log('Setting detection polling interval', { interval });
649
- this.#tokenDetector.setIntervalLength(interval);
650
- }
651
- /**
652
- * Get the current token detection polling interval.
653
- *
654
- * @returns The polling interval in milliseconds, or undefined if not set.
655
- */
656
- getDetectionPollingInterval() {
657
- return this.#tokenDetector.getIntervalLength();
658
- }
659
- async fetch(request) {
660
- if (!this.#isOnboarded()) {
661
- log('Skipping fetch - onboarding not complete');
662
- return {};
663
- }
664
- const response = {};
665
- const chainsToFetch = request.chainIds.filter((chainId) => this.#activeChains.includes(chainId));
666
- log('Fetch requested', {
667
- accounts: request.accountsWithSupportedChains.map((a) => a.account.id),
668
- requestedChains: request.chainIds,
669
- chainsToFetch,
670
- });
671
- if (chainsToFetch.length === 0) {
672
- log('No active chains to fetch');
673
- return response;
674
- }
675
- const assetsBalance = {};
676
- const assetsInfo = {};
677
- const failedChains = [];
678
- // Fetch balances for each account and its supported chains (pre-computed in request)
679
- for (const { account, supportedChains, } of request.accountsWithSupportedChains) {
680
- const chainsForAccount = chainsToFetch.filter((chain) => supportedChains.includes(chain));
681
- if (chainsForAccount.length === 0) {
682
- continue;
683
- }
684
- const { address, id: accountId } = account;
685
- for (const chainId of chainsForAccount) {
686
- const hexChainId = caipChainIdToHex(chainId);
687
- const nativeAssetId = this.#getNativeAssetForChain(chainId);
688
- const shouldSkipNative = shouldSkipNativeForCaipChainId(chainId);
689
- const assetsToFetch = [];
690
- if (!shouldSkipNative) {
691
- // Build a single AssetFetchEntry[] for native + custom ERC-20s
692
- assetsToFetch.push({ assetId: nativeAssetId, address: ZERO_ADDRESS });
693
- }
694
- if (request.customAssets) {
695
- const existingMetadata = this.#getExistingAssetsMetadata();
696
- for (const assetId of request.customAssets) {
697
- try {
698
- const parsed = parseCaipAssetType(assetId);
699
- const assetChainId = `${parsed.chain.namespace}:${parsed.chain.reference}`;
700
- if (assetChainId === chainId &&
701
- this.#getAssetType(assetId) === 'erc20') {
702
- const tokenAddress = parsed.assetReference.toLowerCase();
703
- const normalizedId = normalizeAssetId(assetId);
704
- const decimals = existingMetadata[normalizedId]?.decimals;
705
- assetsToFetch.push({
706
- assetId,
707
- address: tokenAddress,
708
- decimals,
709
- });
710
- }
711
- }
712
- catch {
713
- // Skip unparseable asset IDs
714
- }
715
- }
716
- }
717
- try {
718
- const result = await this.#balanceFetcher.fetchBalancesForAssets(hexChainId, accountId, address, assetsToFetch);
719
- if (!assetsBalance[accountId]) {
720
- assetsBalance[accountId] = {};
721
- }
722
- // Normalize asset IDs from BalanceFetcher (which uses lowercase
723
- // addresses) to checksummed form so they match assetsInfo state keys.
724
- const normalizedBalances = result.balances.map((b) => ({
725
- ...b,
726
- assetId: normalizeAssetId(b.assetId),
727
- }));
728
- // Collect metadata for all balances
729
- const balanceMetadata = this.#collectMetadataForBalances(normalizedBalances, chainId);
730
- Object.assign(assetsInfo, balanceMetadata);
731
- // Convert balances to human-readable format using decimals from
732
- // assetsInfo state (which includes pendingMetadata from addCustomAsset).
733
- // Resolution: state → pipeline metadata → RPC `decimals()`; omit balance if still unknown.
734
- const existingMetadata = this.#getExistingAssetsMetadata();
735
- for (const balance of normalizedBalances) {
736
- const stateMetadata = existingMetadata[balance.assetId];
737
- const pipelineMetadata = assetsInfo[balance.assetId];
738
- let decimals = this.#pickValidDecimals(stateMetadata, pipelineMetadata);
739
- if (decimals === undefined) {
740
- const parsed = parseCaipAssetType(balance.assetId);
741
- if (this.#getAssetType(balance.assetId) === 'erc20') {
742
- decimals = await this.#fetchDecimalsViaRpc(chainId, parsed.assetReference);
743
- }
744
- }
745
- if (decimals === undefined) {
746
- continue;
747
- }
748
- const humanReadableAmount = this.#convertToHumanReadable(balance.balance, decimals);
749
- assetsBalance[accountId][balance.assetId] = {
750
- amount: humanReadableAmount,
751
- };
752
- }
753
- }
754
- catch (error) {
755
- log('Failed to fetch balance', { address, chainId, error });
756
- if (!assetsBalance[accountId]) {
757
- assetsBalance[accountId] = {};
758
- }
759
- if (!shouldSkipNative) {
760
- assetsBalance[accountId][nativeAssetId] = { amount: '0' };
761
- }
762
- // On error, emit a stub only when no valid metadata exists in state
763
- // yet. Re-emitting existing metadata would overwrite richer entries
764
- // (e.g. image/description added by AccountsAPI) with a simpler stub.
765
- const existingNativeMeta = this.#getExistingAssetsMetadata()[nativeAssetId];
766
- if (!this.#hasValidDecimals(existingNativeMeta)) {
767
- const chainStatus = this.#chainStatuses[chainId];
768
- if (chainStatus) {
769
- assetsInfo[nativeAssetId] = {
770
- type: 'native',
771
- symbol: chainStatus.nativeCurrency,
772
- name: chainStatus.nativeCurrency,
773
- decimals: 18,
774
- };
775
- }
776
- }
777
- if (!failedChains.includes(chainId)) {
778
- failedChains.push(chainId);
779
- }
780
- }
781
- }
782
- }
783
- if (failedChains.length > 0) {
784
- log('Fetch PARTIAL - some chains failed', {
785
- successChains: chainsToFetch.filter((chain) => !failedChains.includes(chain)),
786
- failedChains,
787
- });
788
- response.errors = {};
789
- for (const chainId of failedChains) {
790
- response.errors[chainId] = 'RPC fetch failed';
791
- }
792
- }
793
- else {
794
- log('Fetch SUCCESS', {
795
- chains: chainsToFetch,
796
- accountCount: Object.keys(assetsBalance).length,
797
- });
798
- }
799
- response.assetsBalance = assetsBalance;
800
- // Include metadata for native tokens if we have any
801
- if (Object.keys(assetsInfo).length > 0) {
802
- response.assetsInfo = assetsInfo;
803
- }
804
- response.updateMode = 'merge';
805
- return response;
806
- }
807
- /**
808
- * Run token detection for an account on a chain.
809
- *
810
- * @param chainId - The chain ID to detect tokens on.
811
- * @param account - The account to detect tokens for.
812
- * @returns Promise resolving to a DataResponse with detected assets.
813
- */
814
- async detectTokens(chainId, account) {
815
- if (!this.#tokenDetectionEnabled() || !this.#useExternalService()) {
816
- return {};
817
- }
818
- const hexChainId = caipChainIdToHex(chainId);
819
- const { address, id: accountId } = account;
820
- log('Running token detection', { chainId, accountId });
821
- try {
822
- const result = await this.#tokenDetector.detectTokens(hexChainId, accountId, address, {
823
- tokenDetectionEnabled: this.#tokenDetectionEnabled(),
824
- useExternalService: this.#useExternalService(),
825
- });
826
- if (result.detectedAssets.length === 0) {
827
- log('No new tokens detected');
828
- return {};
829
- }
830
- log('Detected new tokens', {
831
- count: result.detectedAssets.length,
832
- chainId,
833
- accountId,
834
- });
835
- // Convert detected assets to DataResponse format
836
- const balances = {};
837
- const assetsInfo = {};
838
- // Build metadata from detected assets
839
- for (const asset of result.detectedAssets) {
840
- if (asset.symbol && asset.decimals !== undefined) {
841
- assetsInfo[asset.assetId] = {
842
- type: this.#getAssetType(asset.assetId),
843
- symbol: asset.symbol,
844
- name: asset.name ?? asset.symbol,
845
- decimals: asset.decimals,
846
- image: asset.image,
847
- };
848
- }
849
- }
850
- // Add balances for detected tokens (converted to human-readable format)
851
- for (const balance of result.detectedBalances) {
852
- const detectedAsset = result.detectedAssets.find((asset) => asset.assetId === balance.assetId);
853
- if (detectedAsset?.decimals === undefined) {
854
- continue;
855
- }
856
- const humanReadableAmount = this.#convertToHumanReadable(balance.balance, detectedAsset.decimals);
857
- balances[balance.assetId] = {
858
- amount: humanReadableAmount,
859
- };
860
- }
861
- const response = {
862
- detectedAssets: {
863
- [accountId]: result.detectedAssets.map((asset) => asset.assetId),
864
- },
865
- assetsBalance: {
866
- [accountId]: balances,
867
- },
868
- };
869
- // Include metadata if we have any
870
- if (Object.keys(assetsInfo).length > 0) {
871
- response.assetsInfo = assetsInfo;
872
- }
873
- return response;
874
- }
875
- catch (error) {
876
- log('Token detection failed', { chainId, accountId, error });
877
- return {};
878
- }
879
- }
880
- get assetsMiddleware() {
881
- return async (context, next) => {
882
- const { request } = context;
883
- const supportedChains = request.chainIds.filter((chainId) => this.#activeChains.includes(chainId));
884
- if (supportedChains.length === 0) {
885
- return next(context);
886
- }
887
- let successfullyHandledChains = [];
888
- log('Middleware fetching', {
889
- chains: supportedChains,
890
- accounts: request.accountsWithSupportedChains.map((a) => a.account.id),
891
- });
892
- const response = await this.fetch({
893
- ...request,
894
- chainIds: supportedChains,
895
- });
896
- if (response.assetsBalance) {
897
- context.response.assetsBalance ??= {};
898
- for (const [accountId, accountBalances] of Object.entries(response.assetsBalance)) {
899
- context.response.assetsBalance[accountId] ??= {};
900
- context.response.assetsBalance[accountId] = {
901
- ...context.response.assetsBalance[accountId],
902
- ...accountBalances,
903
- };
904
- }
905
- }
906
- if (response.assetsInfo) {
907
- context.response.assetsInfo ??= {};
908
- context.response.assetsInfo = {
909
- ...context.response.assetsInfo,
910
- ...response.assetsInfo,
911
- };
912
- }
913
- const failedChains = new Set(Object.keys(response.errors ?? {}));
914
- successfullyHandledChains = supportedChains.filter((chainId) => !failedChains.has(chainId));
915
- if (successfullyHandledChains.length > 0) {
916
- const remainingChains = request.chainIds.filter((chainId) => !successfullyHandledChains.includes(chainId));
917
- return next({
918
- ...context,
919
- request: {
920
- ...request,
921
- chainIds: remainingChains,
922
- },
923
- });
924
- }
925
- return next(context);
926
- };
927
- }
928
- /**
929
- * Subscribe to updates for the given request.
930
- * Starts polling through BalanceFetcher and TokenDetector.
931
- *
932
- * @param subscriptionRequest - The subscription request details.
933
- */
934
- async subscribe(subscriptionRequest) {
935
- if (!this.#isOnboarded()) {
936
- log('Skipping subscribe - onboarding not complete');
937
- return;
938
- }
939
- const { request, subscriptionId, isUpdate } = subscriptionRequest;
940
- // Use request.chainIds when activeChains is not yet populated (e.g. before
941
- // NetworkController state has been applied) so polling can start.
942
- const chainsToSubscribe = this.#activeChains.length > 0
943
- ? request.chainIds.filter((chainId) => this.#activeChains.includes(chainId))
944
- : request.chainIds;
945
- log('Subscribe requested', {
946
- subscriptionId,
947
- isUpdate,
948
- accounts: request.accountsWithSupportedChains.map((a) => a.account.id),
949
- chainsToSubscribe,
950
- activeChainsFallback: this.#activeChains.length === 0,
951
- });
952
- if (chainsToSubscribe.length === 0) {
953
- log('No active chains to subscribe');
954
- return;
955
- }
956
- // Handle subscription update - restart polling for new chains
957
- if (isUpdate) {
958
- const existing = this.#activeSubscriptions.get(subscriptionId);
959
- if (existing) {
960
- log('Updating existing subscription - restarting polling', {
961
- subscriptionId,
962
- existingChains: existing.chains,
963
- newChains: chainsToSubscribe,
964
- });
965
- // Don't return early - continue to unsubscribe and restart polling
966
- }
967
- }
968
- // Clean up existing subscription (stops old polling)
969
- await this.unsubscribe(subscriptionId);
970
- // Start polling through BalanceFetcher and TokenDetector
971
- const balancePollingTokens = [];
972
- const detectionPollingTokens = [];
973
- for (const { account, supportedChains, } of request.accountsWithSupportedChains) {
974
- const chainsForAccount = chainsToSubscribe.filter((chain) => supportedChains.includes(chain));
975
- if (chainsForAccount.length === 0) {
976
- continue;
977
- }
978
- const { address, id: accountId } = account;
979
- for (const chainId of chainsForAccount) {
980
- const hexChainId = caipChainIdToHex(chainId);
981
- // Start balance polling
982
- const balanceInput = {
983
- chainId: hexChainId,
984
- accountId,
985
- accountAddress: address,
986
- ...(request.customAssetsOnly === true
987
- ? { customAssetsOnly: true }
988
- : {}),
989
- };
990
- const balanceToken = this.#balanceFetcher.startPolling(balanceInput);
991
- balancePollingTokens.push(balanceToken);
992
- // Token detection is only relevant for "regular" subscriptions —
993
- // a customAssetsOnly subscription should never run detection.
994
- if (request.customAssetsOnly !== true &&
995
- this.#tokenDetectionEnabled() &&
996
- this.#useExternalService()) {
997
- const detectionInput = {
998
- chainId: hexChainId,
999
- accountId,
1000
- accountAddress: address,
1001
- };
1002
- const detectionToken = this.#tokenDetector.startPolling(detectionInput);
1003
- detectionPollingTokens.push(detectionToken);
1004
- }
1005
- }
1006
- }
1007
- // Store subscription data
1008
- const accounts = request.accountsWithSupportedChains.map((entry) => entry.account);
1009
- this.#activeSubscriptions.set(subscriptionId, {
1010
- balancePollingTokens,
1011
- detectionPollingTokens,
1012
- chains: chainsToSubscribe,
1013
- accounts,
1014
- onAssetsUpdate: subscriptionRequest.onAssetsUpdate,
1015
- });
1016
- log('Subscription SUCCESS', {
1017
- subscriptionId,
1018
- chains: chainsToSubscribe,
1019
- balancePollingCount: balancePollingTokens.length,
1020
- detectionPollingCount: detectionPollingTokens.length,
1021
- });
1022
- }
1023
- /**
1024
- * Unsubscribe from updates and stop polling.
1025
- *
1026
- * @param subscriptionId - The subscription ID to unsubscribe.
1027
- */
1028
- async unsubscribe(subscriptionId) {
1029
- const subscription = this.#activeSubscriptions.get(subscriptionId);
1030
- if (subscription) {
1031
- // Stop balance polling
1032
- for (const token of subscription.balancePollingTokens) {
1033
- this.#balanceFetcher.stopPollingByPollingToken(token);
1034
- }
1035
- // Stop detection polling
1036
- for (const token of subscription.detectionPollingTokens) {
1037
- this.#tokenDetector.stopPollingByPollingToken(token);
1038
- }
1039
- this.#activeSubscriptions.delete(subscriptionId);
1040
- log('Unsubscribed and stopped polling', { subscriptionId });
1041
- }
1042
- }
1043
- /**
1044
- * Get existing assets metadata from AssetsController state.
1045
- * Used to include metadata for ERC20 tokens when returning balance updates.
1046
- *
1047
- * @returns Record of asset IDs to their metadata.
1048
- */
1049
- #getExistingAssetsMetadata() {
1050
- try {
1051
- const state = this.#messenger.call('AssetsController:getState');
1052
- return state.assetsInfo ?? {};
1053
- }
1054
- catch (error) {
1055
- log('Failed to get existing assets metadata', { error });
1056
- return {};
1057
- }
1058
- }
1059
- /**
1060
- * Destroy the data source and clean up resources.
1061
- */
1062
- destroy() {
1063
- log('Destroying RpcDataSource');
1064
- this.#unsubscribeTransactionConfirmed?.();
1065
- // Stop all polling
1066
- this.#balanceFetcher.stopAllPolling();
1067
- this.#tokenDetector.stopAllPolling();
1068
- // Clear subscriptions
1069
- this.#activeSubscriptions.clear();
1070
- // Clear caches
1071
- this.#providerCache.clear();
1072
- }
1073
- }
1074
- export function createRpcDataSource(options) {
1075
- return new RpcDataSource(options);
1076
- }
1077
- //# sourceMappingURL=RpcDataSource.js.map