@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
@@ -0,0 +1,539 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cleanSpamAssets = exports.isUnlockCleanupEnabled = exports.healAssetsInfoMetadata = exports.tempHealAssetsInfoMetadata = void 0;
4
+ const utils_1 = require("@metamask/utils");
5
+ const lodash_1 = require("lodash");
6
+ const batch_js_1 = require("../data-sources/evm-rpc-services/utils/batch.cjs");
7
+ const defaults_js_1 = require("../defaults.cjs");
8
+ const logger_js_1 = require("../logger.cjs");
9
+ const fetchWithTimeout_js_1 = require("../utils/fetchWithTimeout.cjs");
10
+ const log = (0, logger_js_1.createModuleLogger)(logger_js_1.projectLogger, 'tempHealAssetsInfoMetadata');
11
+ /**
12
+ * TEMPORARY — will be removed in a future release.
13
+ *
14
+ * @param options - The options bag.
15
+ * @param options.state - Current controller state to compute the patch against.
16
+ * @param options.getMigrationState - Getter for the untrusted legacy state root.
17
+ * @param options.captureException - Optional reporter for healing failures.
18
+ * @returns Updated controller state with the healing patch applied, or the
19
+ * original state when there is nothing to heal or healing fails.
20
+ */
21
+ function tempHealAssetsInfoMetadata({ state, getMigrationState, captureException, }) {
22
+ const reportError = (error) => {
23
+ log('Failed to heal assetsInfo metadata', error);
24
+ captureException?.(new Error(`AssetsController: temporary assetsInfo metadata healing failed: ${(0, utils_1.getErrorMessage)(error)}`));
25
+ };
26
+ let patch = null;
27
+ try {
28
+ patch = healAssetsInfoMetadata(getMigrationState(), state);
29
+ }
30
+ catch (error) {
31
+ reportError(error);
32
+ }
33
+ if (!patch) {
34
+ return state;
35
+ }
36
+ try {
37
+ const nextState = (0, lodash_1.cloneDeep)(state);
38
+ applyHealingPatch(nextState, patch);
39
+ log('Healed wiped assetsInfo metadata for niche-chain tokens', {
40
+ healedAssetsInfoCount: Object.keys(patch.assetsInfo).length,
41
+ healedCustomAssetsAccounts: Object.keys(patch.customAssets).length,
42
+ });
43
+ return nextState;
44
+ }
45
+ catch (error) {
46
+ reportError(error);
47
+ return state;
48
+ }
49
+ }
50
+ exports.tempHealAssetsInfoMetadata = tempHealAssetsInfoMetadata;
51
+ /**
52
+ * Apply a healing patch to (draft) controller state. Defensive against
53
+ * concurrent writes: fills `assetsInfo` gaps only and dedupes `customAssets`
54
+ * against the current draft rather than trusting the patch blindly.
55
+ *
56
+ * @param state - Mutable controller state copy.
57
+ * @param patch - The additions computed by {@link healAssetsInfoMetadata}.
58
+ */
59
+ function applyHealingPatch(state, patch) {
60
+ var _a, _b;
61
+ for (const [assetId, metadata] of Object.entries(patch.assetsInfo)) {
62
+ (_a = state.assetsInfo)[_b = assetId] ?? (_a[_b] = metadata);
63
+ }
64
+ for (const [accountId, assetIds] of Object.entries(patch.customAssets)) {
65
+ const existing = state.customAssets[accountId] ?? [];
66
+ state.customAssets[accountId] = [
67
+ ...existing,
68
+ ...assetIds.filter((assetId) => !existing.includes(assetId)),
69
+ ];
70
+ }
71
+ }
72
+ const EVM_CHAIN_NAMESPACE = 'eip155';
73
+ const EVM_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/u;
74
+ /**
75
+ * Popular networks (covered by the Accounts API) can self-heal through
76
+ * auto-detection, so their tokens must not be touched. Frozen snapshot from
77
+ * extension migration #215.
78
+ */
79
+ const ACCOUNT_API_SUPPORTED_CHAIN_IDS = new Set([
80
+ 'eip155:1', // Ethereum Mainnet
81
+ 'eip155:10', // Optimism
82
+ 'eip155:56', // BNB Smart Chain
83
+ 'eip155:137', // Polygon
84
+ 'eip155:143', // Monad
85
+ 'eip155:999', // HyperEVM
86
+ 'eip155:1329', // Sei
87
+ 'eip155:5042', // Arc
88
+ 'eip155:8453', // Base
89
+ 'eip155:42161', // Arbitrum One
90
+ 'eip155:43114', // Avalanche
91
+ 'eip155:59144', // Linea
92
+ ]);
93
+ /**
94
+ * Compute the additions required to heal `assetsInfo` metadata (and custom
95
+ * asset tracking) for tokens on niche EVM chains, based on the legacy
96
+ * `TokensController` state.
97
+ *
98
+ * What it deliberately skips:
99
+ *
100
+ * - Accounts-API-supported chains — see `ACCOUNT_API_SUPPORTED_CHAIN_IDS`.
101
+ * - Tokens the user hid/removed, detected via either the legacy
102
+ * `TokensController.allIgnoredTokens` or the current
103
+ * `assetPreferences` (`hidden: true`).
104
+ * - Non-EVM assets, ERC-721s, and tokens with invalid addresses or metadata.
105
+ *
106
+ * @param legacyState - Untrusted legacy state root. Expected (but not
107
+ * required) to contain `TokensController.allTokens`,
108
+ * `TokensController.allIgnoredTokens`, and
109
+ * `AccountsController.internalAccounts.accounts`.
110
+ * @param currentState - Current `AssetsController` state slices (read-only).
111
+ * @returns The additions to apply, or `null` when there is nothing to heal.
112
+ */
113
+ function healAssetsInfoMetadata(legacyState, currentState) {
114
+ const allTokens = readPath(legacyState, ['TokensController', 'allTokens']);
115
+ if (!(0, utils_1.isObject)(allTokens)) {
116
+ return null;
117
+ }
118
+ const addressToAccountId = buildAddressToAccountIdMap(legacyState);
119
+ const hiddenAssetIds = collectHiddenAssetIds(currentState);
120
+ const allIgnoredTokens = readPath(legacyState, [
121
+ 'TokensController',
122
+ 'allIgnoredTokens',
123
+ ]);
124
+ const assetsInfoAdditions = {};
125
+ const customAssetAdditions = {};
126
+ for (const [hexChainId, accountTokens] of Object.entries(allTokens)) {
127
+ if (!(0, utils_1.isObject)(accountTokens)) {
128
+ continue;
129
+ }
130
+ const caip2 = hexChainIdToCaip2(hexChainId);
131
+ // Skip chains we can't parse or that self-heal via the accounts API.
132
+ if (!caip2 || ACCOUNT_API_SUPPORTED_CHAIN_IDS.has(caip2)) {
133
+ continue;
134
+ }
135
+ for (const [rawAddress, tokens] of Object.entries(accountTokens)) {
136
+ if (!Array.isArray(tokens) || tokens.length === 0) {
137
+ continue;
138
+ }
139
+ const accountId = addressToAccountId[rawAddress.toLowerCase()];
140
+ const ignoredAddresses = collectIgnoredAddresses(allIgnoredTokens, hexChainId, rawAddress);
141
+ for (const token of tokens) {
142
+ const restorable = getRestorableAsset(token, caip2, ignoredAddresses, hiddenAssetIds);
143
+ if (!restorable) {
144
+ continue;
145
+ }
146
+ const { assetId, info } = restorable;
147
+ // `assetsInfo` is a global registry; fill gaps only, never overwrite.
148
+ if (currentState.assetsInfo[assetId] === undefined &&
149
+ assetsInfoAdditions[assetId] === undefined) {
150
+ assetsInfoAdditions[assetId] = info;
151
+ }
152
+ // Ensure the asset is tracked for its account.
153
+ if (accountId) {
154
+ addCustomAssetAddition(currentState, customAssetAdditions, accountId, assetId);
155
+ }
156
+ }
157
+ }
158
+ }
159
+ if (Object.keys(assetsInfoAdditions).length === 0 &&
160
+ Object.keys(customAssetAdditions).length === 0) {
161
+ return null;
162
+ }
163
+ return {
164
+ assetsInfo: assetsInfoAdditions,
165
+ customAssets: customAssetAdditions,
166
+ };
167
+ }
168
+ exports.healAssetsInfoMetadata = healAssetsInfoMetadata;
169
+ /**
170
+ * Resolve a raw `TokensController` token entry to the CAIP-19 asset ID and
171
+ * metadata that should be healed, or `null` when the token must be skipped
172
+ * (not an object, missing/invalid address or symbol, an ERC-721, or hidden
173
+ * in either the legacy or the current controller).
174
+ *
175
+ * @param token - Raw token entry from `allTokens`.
176
+ * @param caip2 - The CAIP-2 chain ID of the token's chain (e.g. 'eip155:14').
177
+ * @param ignoredAddresses - Lowercase addresses hidden via legacy `allIgnoredTokens`.
178
+ * @param hiddenAssetIds - Lowercase asset IDs hidden via current `assetPreferences`.
179
+ * @returns The restorable asset, or `null` to skip.
180
+ */
181
+ function getRestorableAsset(token, caip2, ignoredAddresses, hiddenAssetIds) {
182
+ if (!(0, utils_1.isObject)(token)) {
183
+ return null;
184
+ }
185
+ // Skip NFTs — AssetsController tracks them separately.
186
+ if (token.isERC721 === true) {
187
+ return null;
188
+ }
189
+ if (typeof token.address !== 'string' ||
190
+ !EVM_ADDRESS_REGEX.test(token.address)) {
191
+ return null;
192
+ }
193
+ // Healed metadata with no symbol would be unusable in the UI; skip it.
194
+ if (typeof token.symbol !== 'string' || token.symbol.length === 0) {
195
+ return null;
196
+ }
197
+ const assetId = buildErc20AssetId(caip2, token.address);
198
+ if (!assetId) {
199
+ return null;
200
+ }
201
+ // Skip tokens the user hid/removed — in the legacy controller…
202
+ if (ignoredAddresses.has(token.address.toLowerCase())) {
203
+ return null;
204
+ }
205
+ // …or in the current controller.
206
+ if (hiddenAssetIds.has(assetId.toLowerCase())) {
207
+ return null;
208
+ }
209
+ return { assetId, info: buildEvmAssetInfo(token) };
210
+ }
211
+ /**
212
+ * Build a `FungibleAssetMetadata` from a raw `TokensController` token entry.
213
+ * The caller has already validated `symbol` as a non-empty string.
214
+ *
215
+ * @param token - Raw token object.
216
+ * @returns The metadata to write into `assetsInfo`.
217
+ */
218
+ function buildEvmAssetInfo(token) {
219
+ const symbol = token.symbol;
220
+ const name = typeof token.name === 'string' && token.name.length > 0
221
+ ? token.name
222
+ : symbol;
223
+ const decimals = typeof token.decimals === 'number' && Number.isFinite(token.decimals)
224
+ ? token.decimals
225
+ : 0;
226
+ const image = typeof token.image === 'string' && token.image.length > 0
227
+ ? token.image
228
+ : undefined;
229
+ const aggregators = Array.isArray(token.aggregators)
230
+ ? token.aggregators.filter((aggregator) => typeof aggregator === 'string')
231
+ : undefined;
232
+ return {
233
+ type: 'erc20',
234
+ symbol,
235
+ name,
236
+ decimals,
237
+ ...(image ? { image } : {}),
238
+ ...(aggregators ? { aggregators } : {}),
239
+ };
240
+ }
241
+ /**
242
+ * Build a map from lowercase account address to account UUID using the
243
+ * legacy `AccountsController.internalAccounts.accounts`.
244
+ *
245
+ * @param legacyState - Untrusted legacy state root.
246
+ * @returns Map of lowercase address to account ID (empty on invalid input).
247
+ */
248
+ function buildAddressToAccountIdMap(legacyState) {
249
+ const accounts = readPath(legacyState, [
250
+ 'AccountsController',
251
+ 'internalAccounts',
252
+ 'accounts',
253
+ ]);
254
+ if (!(0, utils_1.isObject)(accounts)) {
255
+ return {};
256
+ }
257
+ const map = {};
258
+ for (const [id, account] of Object.entries(accounts)) {
259
+ if ((0, utils_1.isObject)(account) &&
260
+ typeof account.address === 'string' &&
261
+ account.address.length > 0) {
262
+ map[account.address.toLowerCase()] = id;
263
+ }
264
+ }
265
+ return map;
266
+ }
267
+ /**
268
+ * Collect the set of CAIP-19 asset IDs (lowercased) marked `hidden: true` in
269
+ * the current `assetPreferences`. Lowercasing lets callers compare against
270
+ * checksummed asset IDs case-insensitively.
271
+ *
272
+ * @param currentState - Current `AssetsController` state slices.
273
+ * @returns Set of lowercase hidden asset IDs.
274
+ */
275
+ function collectHiddenAssetIds(currentState) {
276
+ const hidden = new Set();
277
+ for (const [assetId, preference] of Object.entries(currentState.assetPreferences)) {
278
+ if ((0, utils_1.isObject)(preference) && preference.hidden === true) {
279
+ hidden.add(assetId.toLowerCase());
280
+ }
281
+ }
282
+ return hidden;
283
+ }
284
+ /**
285
+ * Collect the lowercase token addresses ignored (hidden) in the legacy
286
+ * `TokensController.allIgnoredTokens` for a given chain and account. The
287
+ * account key is matched case-insensitively.
288
+ *
289
+ * @param allIgnoredTokens - The legacy `allIgnoredTokens` map (possibly missing).
290
+ * @param hexChainId - The hex chain ID being processed.
291
+ * @param accountAddress - The account address whose ignored list to read.
292
+ * @returns Set of lowercase ignored token addresses.
293
+ */
294
+ function collectIgnoredAddresses(allIgnoredTokens, hexChainId, accountAddress) {
295
+ const result = new Set();
296
+ if (!(0, utils_1.isObject)(allIgnoredTokens)) {
297
+ return result;
298
+ }
299
+ const chainEntry = allIgnoredTokens[hexChainId];
300
+ if (!(0, utils_1.isObject)(chainEntry)) {
301
+ return result;
302
+ }
303
+ const lowerAccount = accountAddress.toLowerCase();
304
+ for (const [address, list] of Object.entries(chainEntry)) {
305
+ if (address.toLowerCase() !== lowerAccount || !Array.isArray(list)) {
306
+ continue;
307
+ }
308
+ for (const ignored of list) {
309
+ if (typeof ignored === 'string') {
310
+ result.add(ignored.toLowerCase());
311
+ }
312
+ }
313
+ }
314
+ return result;
315
+ }
316
+ /**
317
+ * Convert a hex chain ID (e.g. '0x1') to a CAIP-2 chain ID (e.g. 'eip155:1').
318
+ *
319
+ * @param hexChainId - The hex-encoded EVM chain ID.
320
+ * @returns The CAIP-2 chain ID, or `null` when the input cannot be parsed.
321
+ */
322
+ function hexChainIdToCaip2(hexChainId) {
323
+ if (!/^0x[0-9a-fA-F]+$/u.test(hexChainId)) {
324
+ return null;
325
+ }
326
+ const decimal = Number.parseInt(hexChainId, 16);
327
+ if (!Number.isFinite(decimal)) {
328
+ return null;
329
+ }
330
+ return `${EVM_CHAIN_NAMESPACE}:${decimal}`;
331
+ }
332
+ /**
333
+ * Build the checksummed CAIP-19 asset ID for an ERC-20 token.
334
+ *
335
+ * @param caip2 - The CAIP-2 chain ID (e.g. 'eip155:14').
336
+ * @param tokenAddress - The ERC-20 contract address.
337
+ * @returns The asset ID, or `null` when the address cannot be checksummed.
338
+ */
339
+ function buildErc20AssetId(caip2, tokenAddress) {
340
+ let checksummed;
341
+ try {
342
+ checksummed = (0, utils_1.getChecksumAddress)(tokenAddress);
343
+ }
344
+ catch {
345
+ return null;
346
+ }
347
+ return `${caip2}/erc20:${checksummed}`;
348
+ }
349
+ /**
350
+ * Read a nested path on an unknown value, returning `undefined` if any
351
+ * intermediate key is missing or not an object.
352
+ *
353
+ * @param root - The value to read from.
354
+ * @param path - Sequence of keys to traverse.
355
+ * @returns The value at the path, or `undefined`.
356
+ */
357
+ function readPath(root, path) {
358
+ return path.reduce((cursor, key) => {
359
+ if (!(0, utils_1.isObject)(cursor) || !(0, utils_1.hasProperty)(cursor, key)) {
360
+ return undefined;
361
+ }
362
+ return cursor[key];
363
+ }, root);
364
+ }
365
+ /**
366
+ * Record `assetId` as a custom-asset addition for `accountId` unless it is
367
+ * already tracked in the current `assetsBalance` (mutual exclusion), already
368
+ * present in the current `customAssets`, or already queued as an addition.
369
+ *
370
+ * @param currentState - Current `AssetsController` state slices.
371
+ * @param additions - The custom-asset additions accumulated so far (mutated).
372
+ * @param accountId - The account UUID.
373
+ * @param assetId - CAIP-19 asset identifier.
374
+ */
375
+ function addCustomAssetAddition(currentState, additions, accountId, assetId) {
376
+ if (currentState.assetsBalance[accountId]?.[assetId]) {
377
+ return;
378
+ }
379
+ if (currentState.customAssets[accountId]?.includes(assetId)) {
380
+ return;
381
+ }
382
+ const queued = additions[accountId] ?? [];
383
+ if (!queued.includes(assetId)) {
384
+ queued.push(assetId);
385
+ }
386
+ additions[accountId] = queued;
387
+ }
388
+ const cleanupLog = (0, logger_js_1.createModuleLogger)(logger_js_1.projectLogger, 'cleanSpamAssets');
389
+ /**
390
+ * TEMPORARY — feature flag for unlock spam cleanup
391
+ *
392
+ * @param remoteFeatureFlags - RemoteFeatureFlag state.
393
+ * @returns `true` only when the flag explicitly enables the cleanup.
394
+ */
395
+ function isUnlockCleanupEnabled(remoteFeatureFlags) {
396
+ if (!(0, utils_1.isObject)(remoteFeatureFlags)) {
397
+ return false;
398
+ }
399
+ const flag = remoteFeatureFlags.assetsUnifyState;
400
+ return ((0, utils_1.isObject)(flag) &&
401
+ (0, utils_1.hasProperty)(flag, 'useUnlockCleanup') &&
402
+ flag.useUnlockCleanup === true);
403
+ }
404
+ exports.isUnlockCleanupEnabled = isUnlockCleanupEnabled;
405
+ const FETCH_TIMEOUT_MS = 15000;
406
+ const DEFAULT_OCCURRENCE_FLOOR = 3;
407
+ /**
408
+ * Cleanup of Spam Assets.
409
+ * The state can be persisted with spam tokens through boundary faults (API loosened, WS passing in spam)
410
+ *
411
+ * @param options - Input params.
412
+ * @param options.state - Current controller state (read-only).
413
+ * @param options.apiClient - Token API client.
414
+ * @param options.captureException - Optional reporter for failures.
415
+ * @returns Updated or original controller state
416
+ */
417
+ async function cleanSpamAssets({ state, apiClient, captureException, }) {
418
+ const candidates = collectSpamCleanupCandidates(state);
419
+ if (candidates.length === 0) {
420
+ return null;
421
+ }
422
+ try {
423
+ const floors = await fetchSuggestedOccurrenceFloors(apiClient);
424
+ const spamAssetIds = [];
425
+ for (const batch of (0, batch_js_1.divideIntoBatches)(candidates, {
426
+ batchSize: 50,
427
+ })) {
428
+ const belowFloorAssetIds = await findBelowFloorAssetIds(batch, floors, apiClient).catch(() => []);
429
+ if (belowFloorAssetIds.length > 0) {
430
+ cleanupLog('Classified a batch of assets as spam', {
431
+ batchSize: batch.length,
432
+ spamCount: belowFloorAssetIds.length,
433
+ });
434
+ spamAssetIds.push(...belowFloorAssetIds);
435
+ }
436
+ }
437
+ if (spamAssetIds.length === 0) {
438
+ return null;
439
+ }
440
+ return { spamAssetIds, applyPatch: applyCleanupPatch };
441
+ }
442
+ catch (error) {
443
+ // API calls failed, cleanup not performed. Will be retried when next invoked.
444
+ cleanupLog('Spam cleanup failed; leaving remaining assets untouched', error);
445
+ captureException?.(new Error(`AssetsController: assetsInfo spam cleanup failed: ${(0, utils_1.getErrorMessage)(error)}`));
446
+ return null;
447
+ }
448
+ }
449
+ exports.cleanSpamAssets = cleanSpamAssets;
450
+ /**
451
+ * Collect the assets eligible for cleanup:
452
+ * - ERC-20 token
453
+ * - Not in excluded list
454
+ * - Not a custom asset
455
+ * - On Account API covered chains
456
+ *
457
+ * @param state - Current controller state.
458
+ * @param state.assetsInfo - Tracked asset metadata, keyed by CAIP-19 ID.
459
+ * @param state.customAssets - Per-account custom asset IDs.
460
+ * @returns Candidate asset IDs.
461
+ */
462
+ function collectSpamCleanupCandidates({ assetsInfo, customAssets, }) {
463
+ const customAssetIds = new Set(Object.values(customAssets)
464
+ .flat()
465
+ .map((assetId) => assetId.toLowerCase()));
466
+ const excludedAssets = [...defaults_js_1.DEFAULT_TRACKED_ASSETS_BY_CHAIN.values()]
467
+ .flat()
468
+ .map((a) => a.toLowerCase());
469
+ return Object.keys(assetsInfo).filter((assetId) => {
470
+ const lowerId = assetId.toLowerCase();
471
+ const [chainId, asset] = lowerId.split('/');
472
+ const isERC20 = Boolean(asset?.startsWith('erc20:'));
473
+ const isNotExcluded = !excludedAssets.includes(lowerId);
474
+ const isNotCustomAsset = !customAssetIds.has(lowerId);
475
+ const isOnAccountAPICoveredChain = ACCOUNT_API_SUPPORTED_CHAIN_IDS.has(chainId);
476
+ return (isERC20 && isNotExcluded && isNotCustomAsset && isOnAccountAPICoveredChain);
477
+ });
478
+ }
479
+ /**
480
+ * Fetch and filter assets by occurrence floor.
481
+ * If fetch fails, error is propagated (fail-close, cleanup not performed)
482
+ *
483
+ * @param assetIds - A single batch of candidate asset IDs.
484
+ * @param floors - Suggested occurrence floors keyed by decimal chain ID.
485
+ * @param apiClient - Token API client.
486
+ * @returns The subset of `assetIds` that falls below its chain's floor.
487
+ */
488
+ async function findBelowFloorAssetIds(assetIds, floors, apiClient) {
489
+ try {
490
+ const assets = await (0, fetchWithTimeout_js_1.fetchWithTimeout)(() => apiClient.tokens.fetchV3Assets(assetIds, { includeOccurrences: true }, { staleTime: 0, gcTime: 0 }), FETCH_TIMEOUT_MS);
491
+ const occurrencesByLowerId = new Map(assets.map((asset) => [asset.assetId.toLowerCase(), asset.occurrences]));
492
+ return assetIds.filter((assetId) => {
493
+ const chainReference = assetId.split(':')[1]?.split('/')[0] ?? '';
494
+ const floor = floors[chainReference] ?? DEFAULT_OCCURRENCE_FLOOR;
495
+ return (occurrencesByLowerId.get(assetId.toLowerCase()) ?? 0) < floor;
496
+ });
497
+ }
498
+ catch (error) {
499
+ cleanupLog('Failed to fetch assets', error);
500
+ throw error;
501
+ }
502
+ }
503
+ /**
504
+ * Fetch per-chain suggested occurrence floors.
505
+ * If fetch fails, error is propagated (fail-close, cleanup not performed)
506
+ *
507
+ * @param apiClient - Token API client.
508
+ * @returns Map of decimal chain ID to suggested floor.
509
+ */
510
+ async function fetchSuggestedOccurrenceFloors(apiClient) {
511
+ try {
512
+ return await (0, fetchWithTimeout_js_1.fetchWithTimeout)(() => apiClient.token.fetchV1SuggestedOccurrenceFloors({
513
+ staleTime: 0,
514
+ gcTime: 0,
515
+ }), FETCH_TIMEOUT_MS);
516
+ }
517
+ catch (error) {
518
+ cleanupLog('Failed to fetch suggested occurrence floors', error);
519
+ throw error;
520
+ }
521
+ }
522
+ function applyCleanupPatch(state, patch) {
523
+ const { spamAssetIds } = patch;
524
+ const spam = new Set(spamAssetIds.map((assetId) => assetId.toLowerCase()));
525
+ if (spam.size === 0) {
526
+ return;
527
+ }
528
+ const isSpam = (assetId) => spam.has(assetId.toLowerCase());
529
+ for (const assetId of Object.keys(state.assetsInfo).filter(isSpam)) {
530
+ delete state.assetsInfo[assetId];
531
+ }
532
+ for (const balances of Object.values(state.assetsBalance)) {
533
+ for (const assetId of Object.keys(balances).filter(isSpam)) {
534
+ delete balances[assetId];
535
+ }
536
+ }
537
+ cleanupLog('Removed spam assets', { count: spam.size });
538
+ }
539
+ //# sourceMappingURL=healAssetsInfoMetadata.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healAssetsInfoMetadata.cjs","sourceRoot":"","sources":["../../src/migrations/healAssetsInfoMetadata.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { TokensControllerState } from '@metamask/assets-controllers';\nimport type { ApiPlatformClient } from '@metamask/core-backend';\nimport type { Hex } from '@metamask/utils';\nimport {\n getChecksumAddress,\n getErrorMessage,\n hasProperty,\n isObject,\n} from '@metamask/utils';\nimport { cloneDeep } from 'lodash';\n\nimport { divideIntoBatches } from '../data-sources/evm-rpc-services/utils/batch.js';\nimport { DEFAULT_TRACKED_ASSETS_BY_CHAIN } from '../defaults.js';\nimport { createModuleLogger, projectLogger } from '../logger.js';\nimport type {\n AccountId,\n Caip19AssetId,\n FungibleAssetMetadata,\n AssetsControllerStateInternal,\n} from '../types.js';\nimport { fetchWithTimeout } from '../utils/fetchWithTimeout.js';\n\n/**\n * TEMPORARY MODULE — remove in a future release.\n *\n * Port of extension migration #215 (Assets Controller Metadata Healing).\n * Issue: https://consensyssoftware.atlassian.net/browse/ASSETS-3346\n * Incident: #incident-metamask-1731\n *\n * Background: after a prior defect in AssetsController, metadata for custom\n * tokens was wiped. Most popular chains support auto-detection and can\n * self-heal, however not all.\n *\n * This module computes the state additions needed to restore metadata for\n * custom tokens on niche EVM chains (chains that cannot auto-detect and\n * self-heal), using the legacy `TokensController.allTokens` state as the\n * source of truth. It is a pure function so it can be tested in isolation;\n * the controller applies the returned patch in its constructor.\n *\n * The legacy state is treated as fully untrusted (`unknown`): every shape is\n * validated before use, and any unexpected input results in that entry being\n * skipped (or `null` being returned when nothing is restorable).\n */\n\n/**\n * The slices of current `AssetsController` state the healing computation\n * reads. Never mutated.\n */\nexport type CurrentAssetsState = Pick<\n AssetsControllerStateInternal,\n 'assetsInfo' | 'assetsBalance' | 'customAssets' | 'assetPreferences'\n>;\n\n/**\n * TEMPORARY — will be removed in a future release.\n *\n * Shape of the legacy persisted state the ASSETS-3346 healing reads, derived\n * from the real `TokensControllerState` and `AccountsControllerState` types.\n * Use it to type the `tempMigrateAssetsInfoMetadataAssets3346` getter when\n * integrating in a client.\n *\n * Everything is optional and only the listed slices are read:\n *\n * - `TokensController.allTokens` — required for any healing to happen.\n * - `TokensController.allIgnoredTokens` — tokens the user hid/removed\n * (skipped during healing).\n * - `AccountsController.internalAccounts.accounts` — maps addresses to\n * account IDs so healed tokens are also tracked in `customAssets`\n * (without it only `assetsInfo` is healed).\n *\n * At runtime the value still crosses the boundary as `unknown`: every shape\n * is re-validated by the migration, so a partial or malformed object is safe\n * and simply skipped.\n */\nexport type Assets3346MigrationState = {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- must match the persisted controller state key\n TokensController?: Partial<\n Pick<TokensControllerState, 'allTokens' | 'allIgnoredTokens'>\n >;\n // eslint-disable-next-line @typescript-eslint/naming-convention -- must match the persisted controller state key\n AccountsController?: {\n internalAccounts?: {\n accounts?: Record<\n string,\n Pick<\n AccountsControllerState['internalAccounts']['accounts'][string],\n 'address'\n >\n >;\n };\n };\n};\n\nexport type AssetsInfoHealingPatch = {\n assetsInfo: Record<Caip19AssetId, FungibleAssetMetadata>;\n customAssets: Record<AccountId, Caip19AssetId[]>;\n};\n\nconst log = createModuleLogger(projectLogger, 'tempHealAssetsInfoMetadata');\n\nexport type TempHealAssetsInfoMetadataOptions = {\n /** Current `AssetsController` state the healing patch is computed against. */\n state: AssetsControllerStateInternal;\n /**\n * Host-provided getter for the untrusted legacy state root (see\n * `AssetsControllerOptions.tempMigrateAssetsInfoMetadataAssets3346`).\n */\n getMigrationState: () => unknown;\n /** Optional Sentry-compatible reporter for healing failures. */\n captureException?: (error: Error) => void;\n};\n\n/**\n * TEMPORARY — will be removed in a future release.\n *\n * @param options - The options bag.\n * @param options.state - Current controller state to compute the patch against.\n * @param options.getMigrationState - Getter for the untrusted legacy state root.\n * @param options.captureException - Optional reporter for healing failures.\n * @returns Updated controller state with the healing patch applied, or the\n * original state when there is nothing to heal or healing fails.\n */\nexport function tempHealAssetsInfoMetadata({\n state,\n getMigrationState,\n captureException,\n}: TempHealAssetsInfoMetadataOptions): AssetsControllerStateInternal {\n const reportError = (error: unknown): void => {\n log('Failed to heal assetsInfo metadata', error);\n captureException?.(\n new Error(\n `AssetsController: temporary assetsInfo metadata healing failed: ${getErrorMessage(\n error,\n )}`,\n ),\n );\n };\n\n let patch: AssetsInfoHealingPatch | null = null;\n try {\n patch = healAssetsInfoMetadata(getMigrationState(), state);\n } catch (error) {\n reportError(error);\n }\n\n if (!patch) {\n return state;\n }\n\n try {\n const nextState = cloneDeep(state);\n applyHealingPatch(nextState, patch);\n\n log('Healed wiped assetsInfo metadata for niche-chain tokens', {\n healedAssetsInfoCount: Object.keys(patch.assetsInfo).length,\n healedCustomAssetsAccounts: Object.keys(patch.customAssets).length,\n });\n\n return nextState;\n } catch (error) {\n reportError(error);\n return state;\n }\n}\n\n/**\n * Apply a healing patch to (draft) controller state. Defensive against\n * concurrent writes: fills `assetsInfo` gaps only and dedupes `customAssets`\n * against the current draft rather than trusting the patch blindly.\n *\n * @param state - Mutable controller state copy.\n * @param patch - The additions computed by {@link healAssetsInfoMetadata}.\n */\nfunction applyHealingPatch(\n state: CurrentAssetsState,\n patch: AssetsInfoHealingPatch,\n): void {\n for (const [assetId, metadata] of Object.entries(patch.assetsInfo)) {\n state.assetsInfo[assetId as Caip19AssetId] ??= metadata;\n }\n\n for (const [accountId, assetIds] of Object.entries(patch.customAssets)) {\n const existing = state.customAssets[accountId] ?? [];\n state.customAssets[accountId] = [\n ...existing,\n ...assetIds.filter((assetId) => !existing.includes(assetId)),\n ];\n }\n}\n\nconst EVM_CHAIN_NAMESPACE = 'eip155';\n\nconst EVM_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/u;\n\n/**\n * Popular networks (covered by the Accounts API) can self-heal through\n * auto-detection, so their tokens must not be touched. Frozen snapshot from\n * extension migration #215.\n */\nconst ACCOUNT_API_SUPPORTED_CHAIN_IDS: ReadonlySet<string> = new Set([\n 'eip155:1', // Ethereum Mainnet\n 'eip155:10', // Optimism\n 'eip155:56', // BNB Smart Chain\n 'eip155:137', // Polygon\n 'eip155:143', // Monad\n 'eip155:999', // HyperEVM\n 'eip155:1329', // Sei\n 'eip155:5042', // Arc\n 'eip155:8453', // Base\n 'eip155:42161', // Arbitrum One\n 'eip155:43114', // Avalanche\n 'eip155:59144', // Linea\n]);\n\n/**\n * Compute the additions required to heal `assetsInfo` metadata (and custom\n * asset tracking) for tokens on niche EVM chains, based on the legacy\n * `TokensController` state.\n *\n * What it deliberately skips:\n *\n * - Accounts-API-supported chains — see `ACCOUNT_API_SUPPORTED_CHAIN_IDS`.\n * - Tokens the user hid/removed, detected via either the legacy\n * `TokensController.allIgnoredTokens` or the current\n * `assetPreferences` (`hidden: true`).\n * - Non-EVM assets, ERC-721s, and tokens with invalid addresses or metadata.\n *\n * @param legacyState - Untrusted legacy state root. Expected (but not\n * required) to contain `TokensController.allTokens`,\n * `TokensController.allIgnoredTokens`, and\n * `AccountsController.internalAccounts.accounts`.\n * @param currentState - Current `AssetsController` state slices (read-only).\n * @returns The additions to apply, or `null` when there is nothing to heal.\n */\nexport function healAssetsInfoMetadata(\n legacyState: unknown,\n currentState: CurrentAssetsState,\n): AssetsInfoHealingPatch | null {\n const allTokens = readPath(legacyState, ['TokensController', 'allTokens']);\n if (!isObject(allTokens)) {\n return null;\n }\n\n const addressToAccountId = buildAddressToAccountIdMap(legacyState);\n const hiddenAssetIds = collectHiddenAssetIds(currentState);\n const allIgnoredTokens = readPath(legacyState, [\n 'TokensController',\n 'allIgnoredTokens',\n ]);\n\n const assetsInfoAdditions: Record<Caip19AssetId, FungibleAssetMetadata> = {};\n const customAssetAdditions: Record<AccountId, Caip19AssetId[]> = {};\n\n for (const [hexChainId, accountTokens] of Object.entries(allTokens)) {\n if (!isObject(accountTokens)) {\n continue;\n }\n\n const caip2 = hexChainIdToCaip2(hexChainId);\n // Skip chains we can't parse or that self-heal via the accounts API.\n if (!caip2 || ACCOUNT_API_SUPPORTED_CHAIN_IDS.has(caip2)) {\n continue;\n }\n\n for (const [rawAddress, tokens] of Object.entries(accountTokens)) {\n if (!Array.isArray(tokens) || tokens.length === 0) {\n continue;\n }\n\n const accountId = addressToAccountId[rawAddress.toLowerCase()];\n const ignoredAddresses = collectIgnoredAddresses(\n allIgnoredTokens,\n hexChainId,\n rawAddress,\n );\n\n for (const token of tokens) {\n const restorable = getRestorableAsset(\n token,\n caip2,\n ignoredAddresses,\n hiddenAssetIds,\n );\n if (!restorable) {\n continue;\n }\n const { assetId, info } = restorable;\n\n // `assetsInfo` is a global registry; fill gaps only, never overwrite.\n if (\n currentState.assetsInfo[assetId] === undefined &&\n assetsInfoAdditions[assetId] === undefined\n ) {\n assetsInfoAdditions[assetId] = info;\n }\n\n // Ensure the asset is tracked for its account.\n if (accountId) {\n addCustomAssetAddition(\n currentState,\n customAssetAdditions,\n accountId,\n assetId,\n );\n }\n }\n }\n }\n\n if (\n Object.keys(assetsInfoAdditions).length === 0 &&\n Object.keys(customAssetAdditions).length === 0\n ) {\n return null;\n }\n\n return {\n assetsInfo: assetsInfoAdditions,\n customAssets: customAssetAdditions,\n };\n}\n\n/**\n * Resolve a raw `TokensController` token entry to the CAIP-19 asset ID and\n * metadata that should be healed, or `null` when the token must be skipped\n * (not an object, missing/invalid address or symbol, an ERC-721, or hidden\n * in either the legacy or the current controller).\n *\n * @param token - Raw token entry from `allTokens`.\n * @param caip2 - The CAIP-2 chain ID of the token's chain (e.g. 'eip155:14').\n * @param ignoredAddresses - Lowercase addresses hidden via legacy `allIgnoredTokens`.\n * @param hiddenAssetIds - Lowercase asset IDs hidden via current `assetPreferences`.\n * @returns The restorable asset, or `null` to skip.\n */\nfunction getRestorableAsset(\n token: unknown,\n caip2: string,\n ignoredAddresses: Set<string>,\n hiddenAssetIds: Set<string>,\n): { assetId: Caip19AssetId; info: FungibleAssetMetadata } | null {\n if (!isObject(token)) {\n return null;\n }\n // Skip NFTs — AssetsController tracks them separately.\n if (token.isERC721 === true) {\n return null;\n }\n if (\n typeof token.address !== 'string' ||\n !EVM_ADDRESS_REGEX.test(token.address)\n ) {\n return null;\n }\n // Healed metadata with no symbol would be unusable in the UI; skip it.\n if (typeof token.symbol !== 'string' || token.symbol.length === 0) {\n return null;\n }\n\n const assetId = buildErc20AssetId(caip2, token.address as Hex);\n if (!assetId) {\n return null;\n }\n\n // Skip tokens the user hid/removed — in the legacy controller…\n if (ignoredAddresses.has(token.address.toLowerCase())) {\n return null;\n }\n // …or in the current controller.\n if (hiddenAssetIds.has(assetId.toLowerCase())) {\n return null;\n }\n\n return { assetId, info: buildEvmAssetInfo(token) };\n}\n\n/**\n * Build a `FungibleAssetMetadata` from a raw `TokensController` token entry.\n * The caller has already validated `symbol` as a non-empty string.\n *\n * @param token - Raw token object.\n * @returns The metadata to write into `assetsInfo`.\n */\nfunction buildEvmAssetInfo(\n token: Record<string, unknown>,\n): FungibleAssetMetadata {\n const symbol = token.symbol as string;\n const name =\n typeof token.name === 'string' && token.name.length > 0\n ? token.name\n : symbol;\n const decimals =\n typeof token.decimals === 'number' && Number.isFinite(token.decimals)\n ? token.decimals\n : 0;\n\n const image =\n typeof token.image === 'string' && token.image.length > 0\n ? token.image\n : undefined;\n const aggregators = Array.isArray(token.aggregators)\n ? token.aggregators.filter(\n (aggregator): aggregator is string => typeof aggregator === 'string',\n )\n : undefined;\n\n return {\n type: 'erc20',\n symbol,\n name,\n decimals,\n ...(image ? { image } : {}),\n ...(aggregators ? { aggregators } : {}),\n };\n}\n\n/**\n * Build a map from lowercase account address to account UUID using the\n * legacy `AccountsController.internalAccounts.accounts`.\n *\n * @param legacyState - Untrusted legacy state root.\n * @returns Map of lowercase address to account ID (empty on invalid input).\n */\nfunction buildAddressToAccountIdMap(\n legacyState: unknown,\n): Record<string, AccountId> {\n const accounts = readPath(legacyState, [\n 'AccountsController',\n 'internalAccounts',\n 'accounts',\n ]);\n if (!isObject(accounts)) {\n return {};\n }\n\n const map: Record<string, AccountId> = {};\n for (const [id, account] of Object.entries(accounts)) {\n if (\n isObject(account) &&\n typeof account.address === 'string' &&\n account.address.length > 0\n ) {\n map[account.address.toLowerCase()] = id;\n }\n }\n return map;\n}\n\n/**\n * Collect the set of CAIP-19 asset IDs (lowercased) marked `hidden: true` in\n * the current `assetPreferences`. Lowercasing lets callers compare against\n * checksummed asset IDs case-insensitively.\n *\n * @param currentState - Current `AssetsController` state slices.\n * @returns Set of lowercase hidden asset IDs.\n */\nfunction collectHiddenAssetIds(currentState: CurrentAssetsState): Set<string> {\n const hidden = new Set<string>();\n for (const [assetId, preference] of Object.entries(\n currentState.assetPreferences,\n )) {\n if (isObject(preference) && preference.hidden === true) {\n hidden.add(assetId.toLowerCase());\n }\n }\n return hidden;\n}\n\n/**\n * Collect the lowercase token addresses ignored (hidden) in the legacy\n * `TokensController.allIgnoredTokens` for a given chain and account. The\n * account key is matched case-insensitively.\n *\n * @param allIgnoredTokens - The legacy `allIgnoredTokens` map (possibly missing).\n * @param hexChainId - The hex chain ID being processed.\n * @param accountAddress - The account address whose ignored list to read.\n * @returns Set of lowercase ignored token addresses.\n */\nfunction collectIgnoredAddresses(\n allIgnoredTokens: unknown,\n hexChainId: string,\n accountAddress: string,\n): Set<string> {\n const result = new Set<string>();\n if (!isObject(allIgnoredTokens)) {\n return result;\n }\n\n const chainEntry = allIgnoredTokens[hexChainId];\n if (!isObject(chainEntry)) {\n return result;\n }\n\n const lowerAccount = accountAddress.toLowerCase();\n for (const [address, list] of Object.entries(chainEntry)) {\n if (address.toLowerCase() !== lowerAccount || !Array.isArray(list)) {\n continue;\n }\n for (const ignored of list) {\n if (typeof ignored === 'string') {\n result.add(ignored.toLowerCase());\n }\n }\n }\n return result;\n}\n\n/**\n * Convert a hex chain ID (e.g. '0x1') to a CAIP-2 chain ID (e.g. 'eip155:1').\n *\n * @param hexChainId - The hex-encoded EVM chain ID.\n * @returns The CAIP-2 chain ID, or `null` when the input cannot be parsed.\n */\nfunction hexChainIdToCaip2(hexChainId: string): string | null {\n if (!/^0x[0-9a-fA-F]+$/u.test(hexChainId)) {\n return null;\n }\n const decimal = Number.parseInt(hexChainId, 16);\n if (!Number.isFinite(decimal)) {\n return null;\n }\n return `${EVM_CHAIN_NAMESPACE}:${decimal}`;\n}\n\n/**\n * Build the checksummed CAIP-19 asset ID for an ERC-20 token.\n *\n * @param caip2 - The CAIP-2 chain ID (e.g. 'eip155:14').\n * @param tokenAddress - The ERC-20 contract address.\n * @returns The asset ID, or `null` when the address cannot be checksummed.\n */\nfunction buildErc20AssetId(\n caip2: string,\n tokenAddress: Hex,\n): Caip19AssetId | null {\n let checksummed: string;\n try {\n checksummed = getChecksumAddress(tokenAddress);\n } catch {\n return null;\n }\n return `${caip2}/erc20:${checksummed}` as Caip19AssetId;\n}\n\n/**\n * Read a nested path on an unknown value, returning `undefined` if any\n * intermediate key is missing or not an object.\n *\n * @param root - The value to read from.\n * @param path - Sequence of keys to traverse.\n * @returns The value at the path, or `undefined`.\n */\nfunction readPath(root: unknown, path: string[]): unknown {\n return path.reduce<unknown>((cursor, key) => {\n if (!isObject(cursor) || !hasProperty(cursor, key)) {\n return undefined;\n }\n return cursor[key];\n }, root);\n}\n\n/**\n * Record `assetId` as a custom-asset addition for `accountId` unless it is\n * already tracked in the current `assetsBalance` (mutual exclusion), already\n * present in the current `customAssets`, or already queued as an addition.\n *\n * @param currentState - Current `AssetsController` state slices.\n * @param additions - The custom-asset additions accumulated so far (mutated).\n * @param accountId - The account UUID.\n * @param assetId - CAIP-19 asset identifier.\n */\nfunction addCustomAssetAddition(\n currentState: CurrentAssetsState,\n additions: Record<AccountId, Caip19AssetId[]>,\n accountId: AccountId,\n assetId: Caip19AssetId,\n): void {\n if (currentState.assetsBalance[accountId]?.[assetId]) {\n return;\n }\n if (currentState.customAssets[accountId]?.includes(assetId)) {\n return;\n }\n\n const queued = additions[accountId] ?? [];\n if (!queued.includes(assetId)) {\n queued.push(assetId);\n }\n additions[accountId] = queued;\n}\n\nconst cleanupLog = createModuleLogger(projectLogger, 'cleanSpamAssets');\n\n/**\n * TEMPORARY — feature flag for unlock spam cleanup\n *\n * @param remoteFeatureFlags - RemoteFeatureFlag state.\n * @returns `true` only when the flag explicitly enables the cleanup.\n */\nexport function isUnlockCleanupEnabled(remoteFeatureFlags: unknown): boolean {\n if (!isObject(remoteFeatureFlags)) {\n return false;\n }\n\n const flag = remoteFeatureFlags.assetsUnifyState;\n return (\n isObject(flag) &&\n hasProperty(flag, 'useUnlockCleanup') &&\n flag.useUnlockCleanup === true\n );\n}\n\nconst FETCH_TIMEOUT_MS = 15_000;\nconst DEFAULT_OCCURRENCE_FLOOR = 3;\n\n/** The slices of Token API surface the cleanup uses. */\nexport type SpamTokensApiClient = Pick<ApiPlatformClient, 'tokens' | 'token'>;\n\nexport type CleanSpamAssetsState = Pick<\n AssetsControllerStateInternal,\n 'assetsInfo' | 'assetsBalance' | 'customAssets'\n>;\n\nexport type CleanSpamAssetsOptions = {\n state: CleanSpamAssetsState;\n apiClient: SpamTokensApiClient;\n captureException?: (error: Error) => void;\n};\n\n/**\n * Cleanup of Spam Assets.\n * The state can be persisted with spam tokens through boundary faults (API loosened, WS passing in spam)\n *\n * @param options - Input params.\n * @param options.state - Current controller state (read-only).\n * @param options.apiClient - Token API client.\n * @param options.captureException - Optional reporter for failures.\n * @returns Updated or original controller state\n */\nexport async function cleanSpamAssets({\n state,\n apiClient,\n captureException,\n}: CleanSpamAssetsOptions): Promise<{\n spamAssetIds: Caip19AssetId[];\n applyPatch: typeof applyCleanupPatch;\n} | null> {\n const candidates = collectSpamCleanupCandidates(state);\n if (candidates.length === 0) {\n return null;\n }\n\n try {\n const floors = await fetchSuggestedOccurrenceFloors(apiClient);\n const spamAssetIds: Caip19AssetId[] = [];\n\n for (const batch of divideIntoBatches(candidates, {\n batchSize: 50,\n })) {\n const belowFloorAssetIds = await findBelowFloorAssetIds(\n batch,\n floors,\n apiClient,\n ).catch(() => []);\n if (belowFloorAssetIds.length > 0) {\n cleanupLog('Classified a batch of assets as spam', {\n batchSize: batch.length,\n spamCount: belowFloorAssetIds.length,\n });\n spamAssetIds.push(...belowFloorAssetIds);\n }\n }\n\n if (spamAssetIds.length === 0) {\n return null;\n }\n\n return { spamAssetIds, applyPatch: applyCleanupPatch };\n } catch (error) {\n // API calls failed, cleanup not performed. Will be retried when next invoked.\n cleanupLog(\n 'Spam cleanup failed; leaving remaining assets untouched',\n error,\n );\n captureException?.(\n new Error(\n `AssetsController: assetsInfo spam cleanup failed: ${getErrorMessage(\n error,\n )}`,\n ),\n );\n return null;\n }\n}\n\n/**\n * Collect the assets eligible for cleanup:\n * - ERC-20 token\n * - Not in excluded list\n * - Not a custom asset\n * - On Account API covered chains\n *\n * @param state - Current controller state.\n * @param state.assetsInfo - Tracked asset metadata, keyed by CAIP-19 ID.\n * @param state.customAssets - Per-account custom asset IDs.\n * @returns Candidate asset IDs.\n */\nfunction collectSpamCleanupCandidates({\n assetsInfo,\n customAssets,\n}: Pick<CleanSpamAssetsState, 'assetsInfo' | 'customAssets'>): Caip19AssetId[] {\n const customAssetIds = new Set(\n Object.values(customAssets)\n .flat()\n .map((assetId) => assetId.toLowerCase()),\n );\n\n const excludedAssets = [...DEFAULT_TRACKED_ASSETS_BY_CHAIN.values()]\n .flat()\n .map((a) => a.toLowerCase());\n\n return (Object.keys(assetsInfo) as Caip19AssetId[]).filter((assetId) => {\n const lowerId = assetId.toLowerCase();\n const [chainId, asset] = lowerId.split('/');\n\n const isERC20 = Boolean(asset?.startsWith('erc20:'));\n const isNotExcluded = !excludedAssets.includes(lowerId);\n const isNotCustomAsset = !customAssetIds.has(lowerId);\n const isOnAccountAPICoveredChain =\n ACCOUNT_API_SUPPORTED_CHAIN_IDS.has(chainId);\n\n return (\n isERC20 && isNotExcluded && isNotCustomAsset && isOnAccountAPICoveredChain\n );\n });\n}\n\n/**\n * Fetch and filter assets by occurrence floor.\n * If fetch fails, error is propagated (fail-close, cleanup not performed)\n *\n * @param assetIds - A single batch of candidate asset IDs.\n * @param floors - Suggested occurrence floors keyed by decimal chain ID.\n * @param apiClient - Token API client.\n * @returns The subset of `assetIds` that falls below its chain's floor.\n */\nasync function findBelowFloorAssetIds(\n assetIds: Caip19AssetId[],\n floors: Record<string, number>,\n apiClient: SpamTokensApiClient,\n): Promise<Caip19AssetId[]> {\n try {\n const assets = await fetchWithTimeout(\n () =>\n apiClient.tokens.fetchV3Assets(\n assetIds,\n { includeOccurrences: true },\n { staleTime: 0, gcTime: 0 },\n ),\n FETCH_TIMEOUT_MS,\n );\n\n const occurrencesByLowerId = new Map(\n assets.map((asset) => [asset.assetId.toLowerCase(), asset.occurrences]),\n );\n\n return assetIds.filter((assetId) => {\n const chainReference = assetId.split(':')[1]?.split('/')[0] ?? '';\n const floor = floors[chainReference] ?? DEFAULT_OCCURRENCE_FLOOR;\n return (occurrencesByLowerId.get(assetId.toLowerCase()) ?? 0) < floor;\n });\n } catch (error) {\n cleanupLog('Failed to fetch assets', error);\n throw error;\n }\n}\n\n/**\n * Fetch per-chain suggested occurrence floors.\n * If fetch fails, error is propagated (fail-close, cleanup not performed)\n *\n * @param apiClient - Token API client.\n * @returns Map of decimal chain ID to suggested floor.\n */\nasync function fetchSuggestedOccurrenceFloors(\n apiClient: SpamTokensApiClient,\n): Promise<Record<string, number>> {\n try {\n return await fetchWithTimeout(\n () =>\n apiClient.token.fetchV1SuggestedOccurrenceFloors({\n staleTime: 0,\n gcTime: 0,\n }),\n FETCH_TIMEOUT_MS,\n );\n } catch (error) {\n cleanupLog('Failed to fetch suggested occurrence floors', error);\n throw error;\n }\n}\n\nfunction applyCleanupPatch(\n state: Pick<CleanSpamAssetsState, 'assetsInfo' | 'assetsBalance'>,\n patch: {\n spamAssetIds: Caip19AssetId[];\n },\n): void {\n const { spamAssetIds } = patch;\n\n const spam = new Set(spamAssetIds.map((assetId) => assetId.toLowerCase()));\n if (spam.size === 0) {\n return;\n }\n const isSpam = (assetId: string): boolean => spam.has(assetId.toLowerCase());\n\n for (const assetId of Object.keys(state.assetsInfo).filter(isSpam)) {\n delete state.assetsInfo[assetId as Caip19AssetId];\n }\n for (const balances of Object.values(state.assetsBalance)) {\n for (const assetId of Object.keys(balances).filter(isSpam)) {\n delete balances[assetId as Caip19AssetId];\n }\n }\n\n cleanupLog('Removed spam assets', { count: spam.size });\n}\n"]}
@@ -1,7 +1,7 @@
1
- import type { AccountsControllerState } from '@metamask/accounts-controller';
2
- import type { TokensControllerState } from '@metamask/assets-controllers';
3
- import type { ApiPlatformClient } from '@metamask/core-backend';
4
- import type { AccountId, Caip19AssetId, FungibleAssetMetadata, AssetsControllerStateInternal } from '../types.js';
1
+ import type { AccountsControllerState } from "@metamask/accounts-controller";
2
+ import type { TokensControllerState } from "@metamask/assets-controllers";
3
+ import type { ApiPlatformClient } from "@metamask/core-backend";
4
+ import type { AccountId, Caip19AssetId, FungibleAssetMetadata, AssetsControllerStateInternal } from "../types.cjs";
5
5
  /**
6
6
  * TEMPORARY MODULE — remove in a future release.
7
7
  *
@@ -137,4 +137,4 @@ declare function applyCleanupPatch(state: Pick<CleanSpamAssetsState, 'assetsInfo
137
137
  spamAssetIds: Caip19AssetId[];
138
138
  }): void;
139
139
  export {};
140
- //# sourceMappingURL=healAssetsInfoMetadata.d.ts.map
140
+ //# sourceMappingURL=healAssetsInfoMetadata.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healAssetsInfoMetadata.d.cts","sourceRoot":"","sources":["../../src/migrations/healAssetsInfoMetadata.ts"],"names":[],"mappings":"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"}