@metamask-previews/account-tree-controller 8.0.0-preview-4f4c98e → 8.0.0-preview-eb263b0ee

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 (426) hide show
  1. package/CHANGELOG.md +0 -1
  2. package/dist/AccountTreeController-method-action-types.cjs +7 -0
  3. package/dist/AccountTreeController-method-action-types.cjs.map +1 -0
  4. package/dist/{AccountTreeController-method-action-types.d.ts → AccountTreeController-method-action-types.d.cts} +2 -2
  5. package/dist/AccountTreeController-method-action-types.d.cts.map +1 -0
  6. package/dist/AccountTreeController-method-action-types.d.mts +256 -0
  7. package/dist/AccountTreeController-method-action-types.d.mts.map +1 -0
  8. package/dist/{AccountTreeController-method-action-types.js → AccountTreeController-method-action-types.mjs} +1 -1
  9. package/dist/AccountTreeController-method-action-types.mjs.map +1 -0
  10. package/dist/AccountTreeController.cjs +1247 -0
  11. package/dist/AccountTreeController.cjs.map +1 -0
  12. package/dist/{AccountTreeController.d.ts → AccountTreeController.d.cts} +17 -17
  13. package/dist/AccountTreeController.d.cts.map +1 -0
  14. package/dist/AccountTreeController.d.mts +269 -0
  15. package/dist/AccountTreeController.d.mts.map +1 -0
  16. package/dist/{AccountTreeController.js → AccountTreeController.mjs} +15 -15
  17. package/dist/AccountTreeController.mjs.map +1 -0
  18. package/dist/backup-and-sync/analytics/index.cjs +19 -0
  19. package/dist/backup-and-sync/analytics/index.cjs.map +1 -0
  20. package/dist/backup-and-sync/analytics/index.d.cts +3 -0
  21. package/dist/backup-and-sync/analytics/index.d.cts.map +1 -0
  22. package/dist/backup-and-sync/analytics/index.d.mts +3 -0
  23. package/dist/backup-and-sync/analytics/index.d.mts.map +1 -0
  24. package/dist/backup-and-sync/analytics/index.mjs +3 -0
  25. package/dist/backup-and-sync/analytics/index.mjs.map +1 -0
  26. package/dist/backup-and-sync/analytics/segment.cjs +38 -0
  27. package/dist/backup-and-sync/analytics/segment.cjs.map +1 -0
  28. package/dist/backup-and-sync/analytics/{segment.d.ts → segment.d.cts} +10 -10
  29. package/dist/backup-and-sync/analytics/segment.d.cts.map +1 -0
  30. package/dist/backup-and-sync/analytics/segment.d.mts +37 -0
  31. package/dist/backup-and-sync/analytics/segment.d.mts.map +1 -0
  32. package/dist/backup-and-sync/analytics/{segment.js → segment.mjs} +1 -1
  33. package/dist/backup-and-sync/analytics/segment.mjs.map +1 -0
  34. package/dist/backup-and-sync/analytics/traces.cjs +24 -0
  35. package/dist/backup-and-sync/analytics/traces.cjs.map +1 -0
  36. package/dist/backup-and-sync/analytics/{traces.d.ts → traces.d.cts} +3 -3
  37. package/dist/backup-and-sync/analytics/traces.d.cts.map +1 -0
  38. package/dist/backup-and-sync/analytics/traces.d.mts +16 -0
  39. package/dist/backup-and-sync/analytics/traces.d.mts.map +1 -0
  40. package/dist/backup-and-sync/analytics/{traces.js → traces.mjs} +1 -1
  41. package/dist/backup-and-sync/analytics/traces.mjs.map +1 -0
  42. package/dist/backup-and-sync/authentication/index.cjs +18 -0
  43. package/dist/backup-and-sync/authentication/index.cjs.map +1 -0
  44. package/dist/backup-and-sync/authentication/index.d.cts +2 -0
  45. package/dist/backup-and-sync/authentication/index.d.cts.map +1 -0
  46. package/dist/backup-and-sync/authentication/index.d.mts +2 -0
  47. package/dist/backup-and-sync/authentication/index.d.mts.map +1 -0
  48. package/dist/backup-and-sync/authentication/index.mjs +2 -0
  49. package/dist/backup-and-sync/authentication/index.mjs.map +1 -0
  50. package/dist/backup-and-sync/authentication/utils.cjs +23 -0
  51. package/dist/backup-and-sync/authentication/utils.cjs.map +1 -0
  52. package/dist/backup-and-sync/authentication/{utils.d.ts → utils.d.cts} +3 -3
  53. package/dist/backup-and-sync/authentication/utils.d.cts.map +1 -0
  54. package/dist/backup-and-sync/authentication/utils.d.mts +12 -0
  55. package/dist/backup-and-sync/authentication/utils.d.mts.map +1 -0
  56. package/dist/backup-and-sync/authentication/{utils.js → utils.mjs} +2 -2
  57. package/dist/backup-and-sync/authentication/utils.mjs.map +1 -0
  58. package/dist/backup-and-sync/service/atomic-sync-queue.cjs +123 -0
  59. package/dist/backup-and-sync/service/atomic-sync-queue.cjs.map +1 -0
  60. package/dist/backup-and-sync/service/{atomic-sync-queue.d.ts → atomic-sync-queue.d.cts} +1 -1
  61. package/dist/backup-and-sync/service/atomic-sync-queue.d.cts.map +1 -0
  62. package/dist/backup-and-sync/service/atomic-sync-queue.d.mts +43 -0
  63. package/dist/backup-and-sync/service/atomic-sync-queue.d.mts.map +1 -0
  64. package/dist/backup-and-sync/service/{atomic-sync-queue.js → atomic-sync-queue.mjs} +3 -3
  65. package/dist/backup-and-sync/service/atomic-sync-queue.mjs.map +1 -0
  66. package/dist/backup-and-sync/service/index.cjs +403 -0
  67. package/dist/backup-and-sync/service/index.cjs.map +1 -0
  68. package/dist/backup-and-sync/service/{index.d.ts → index.d.cts} +4 -4
  69. package/dist/backup-and-sync/service/index.d.cts.map +1 -0
  70. package/dist/backup-and-sync/service/index.d.mts +84 -0
  71. package/dist/backup-and-sync/service/index.d.mts.map +1 -0
  72. package/dist/backup-and-sync/service/{index.js → index.mjs} +9 -9
  73. package/dist/backup-and-sync/service/index.mjs.map +1 -0
  74. package/dist/backup-and-sync/syncing/group.cjs +190 -0
  75. package/dist/backup-and-sync/syncing/group.cjs.map +1 -0
  76. package/dist/backup-and-sync/syncing/{group.d.ts → group.d.cts} +6 -6
  77. package/dist/backup-and-sync/syncing/group.d.cts.map +1 -0
  78. package/dist/backup-and-sync/syncing/group.d.mts +48 -0
  79. package/dist/backup-and-sync/syncing/group.d.mts.map +1 -0
  80. package/dist/backup-and-sync/syncing/{group.js → group.mjs} +9 -9
  81. package/dist/backup-and-sync/syncing/group.mjs.map +1 -0
  82. package/dist/backup-and-sync/syncing/index.cjs +21 -0
  83. package/dist/backup-and-sync/syncing/index.cjs.map +1 -0
  84. package/dist/backup-and-sync/syncing/index.d.cts +5 -0
  85. package/dist/backup-and-sync/syncing/index.d.cts.map +1 -0
  86. package/dist/backup-and-sync/syncing/index.d.mts +5 -0
  87. package/dist/backup-and-sync/syncing/index.d.mts.map +1 -0
  88. package/dist/backup-and-sync/syncing/index.mjs +5 -0
  89. package/dist/backup-and-sync/syncing/index.mjs.map +1 -0
  90. package/dist/backup-and-sync/syncing/legacy.cjs +74 -0
  91. package/dist/backup-and-sync/syncing/legacy.cjs.map +1 -0
  92. package/dist/backup-and-sync/syncing/{legacy.d.ts → legacy.d.cts} +3 -3
  93. package/dist/backup-and-sync/syncing/legacy.d.cts.map +1 -0
  94. package/dist/backup-and-sync/syncing/legacy.d.mts +15 -0
  95. package/dist/backup-and-sync/syncing/legacy.d.mts.map +1 -0
  96. package/dist/backup-and-sync/syncing/{legacy.js → legacy.mjs} +8 -8
  97. package/dist/backup-and-sync/syncing/legacy.mjs.map +1 -0
  98. package/dist/backup-and-sync/syncing/metadata.cjs +56 -0
  99. package/dist/backup-and-sync/syncing/metadata.cjs.map +1 -0
  100. package/dist/backup-and-sync/syncing/{metadata.d.ts → metadata.d.cts} +4 -4
  101. package/dist/backup-and-sync/syncing/metadata.d.cts.map +1 -0
  102. package/dist/backup-and-sync/syncing/metadata.d.mts +39 -0
  103. package/dist/backup-and-sync/syncing/metadata.d.mts.map +1 -0
  104. package/dist/backup-and-sync/syncing/{metadata.js → metadata.mjs} +9 -2
  105. package/dist/backup-and-sync/syncing/metadata.mjs.map +1 -0
  106. package/dist/backup-and-sync/syncing/wallet.cjs +64 -0
  107. package/dist/backup-and-sync/syncing/wallet.cjs.map +1 -0
  108. package/dist/backup-and-sync/syncing/{wallet.d.ts → wallet.d.cts} +4 -4
  109. package/dist/backup-and-sync/syncing/wallet.d.cts.map +1 -0
  110. package/dist/backup-and-sync/syncing/wallet.d.mts +23 -0
  111. package/dist/backup-and-sync/syncing/wallet.d.mts.map +1 -0
  112. package/dist/backup-and-sync/syncing/{wallet.js → wallet.mjs} +6 -6
  113. package/dist/backup-and-sync/syncing/wallet.mjs.map +1 -0
  114. package/dist/backup-and-sync/types.cjs +41 -0
  115. package/dist/backup-and-sync/types.cjs.map +1 -0
  116. package/dist/backup-and-sync/{types.d.ts → types.d.cts} +12 -12
  117. package/dist/backup-and-sync/types.d.cts.map +1 -0
  118. package/dist/backup-and-sync/types.d.mts +131 -0
  119. package/dist/backup-and-sync/types.d.mts.map +1 -0
  120. package/dist/backup-and-sync/{types.js → types.mjs} +2 -2
  121. package/dist/backup-and-sync/types.mjs.map +1 -0
  122. package/dist/backup-and-sync/user-storage/constants.cjs +8 -0
  123. package/dist/backup-and-sync/user-storage/constants.cjs.map +1 -0
  124. package/dist/backup-and-sync/user-storage/{constants.d.ts → constants.d.cts} +1 -1
  125. package/dist/backup-and-sync/user-storage/constants.d.cts.map +1 -0
  126. package/dist/backup-and-sync/user-storage/constants.d.mts +5 -0
  127. package/dist/backup-and-sync/user-storage/constants.d.mts.map +1 -0
  128. package/dist/backup-and-sync/user-storage/{constants.js → constants.mjs} +1 -1
  129. package/dist/backup-and-sync/user-storage/constants.mjs.map +1 -0
  130. package/dist/backup-and-sync/user-storage/format-utils.cjs +115 -0
  131. package/dist/backup-and-sync/user-storage/format-utils.cjs.map +1 -0
  132. package/dist/backup-and-sync/user-storage/{format-utils.d.ts → format-utils.d.cts} +4 -4
  133. package/dist/backup-and-sync/user-storage/format-utils.d.cts.map +1 -0
  134. package/dist/backup-and-sync/user-storage/format-utils.d.mts +54 -0
  135. package/dist/backup-and-sync/user-storage/format-utils.d.mts.map +1 -0
  136. package/dist/backup-and-sync/user-storage/{format-utils.js → format-utils.mjs} +6 -6
  137. package/dist/backup-and-sync/user-storage/format-utils.mjs.map +1 -0
  138. package/dist/backup-and-sync/user-storage/index.cjs +21 -0
  139. package/dist/backup-and-sync/user-storage/index.cjs.map +1 -0
  140. package/dist/backup-and-sync/user-storage/index.d.cts +5 -0
  141. package/dist/backup-and-sync/user-storage/index.d.cts.map +1 -0
  142. package/dist/backup-and-sync/user-storage/index.d.mts +5 -0
  143. package/dist/backup-and-sync/user-storage/index.d.mts.map +1 -0
  144. package/dist/backup-and-sync/user-storage/index.mjs +5 -0
  145. package/dist/backup-and-sync/user-storage/index.mjs.map +1 -0
  146. package/dist/backup-and-sync/user-storage/network-operations.cjs +193 -0
  147. package/dist/backup-and-sync/user-storage/network-operations.cjs.map +1 -0
  148. package/dist/backup-and-sync/user-storage/{network-operations.d.ts → network-operations.d.cts} +4 -4
  149. package/dist/backup-and-sync/user-storage/network-operations.d.cts.map +1 -0
  150. package/dist/backup-and-sync/user-storage/network-operations.d.mts +80 -0
  151. package/dist/backup-and-sync/user-storage/network-operations.d.mts.map +1 -0
  152. package/dist/backup-and-sync/user-storage/{network-operations.js → network-operations.mjs} +7 -7
  153. package/dist/backup-and-sync/user-storage/network-operations.mjs.map +1 -0
  154. package/dist/backup-and-sync/user-storage/network-utils.cjs +33 -0
  155. package/dist/backup-and-sync/user-storage/network-utils.cjs.map +1 -0
  156. package/dist/backup-and-sync/user-storage/{network-utils.d.ts → network-utils.d.cts} +1 -1
  157. package/dist/backup-and-sync/user-storage/network-utils.d.cts.map +1 -0
  158. package/dist/backup-and-sync/user-storage/network-utils.d.mts +10 -0
  159. package/dist/backup-and-sync/user-storage/network-utils.d.mts.map +1 -0
  160. package/dist/backup-and-sync/user-storage/{network-utils.js → network-utils.mjs} +1 -1
  161. package/dist/backup-and-sync/user-storage/network-utils.mjs.map +1 -0
  162. package/dist/backup-and-sync/user-storage/validation.cjs +76 -0
  163. package/dist/backup-and-sync/user-storage/validation.cjs.map +1 -0
  164. package/dist/backup-and-sync/user-storage/{validation.d.ts → validation.d.cts} +2 -2
  165. package/dist/backup-and-sync/user-storage/validation.d.cts.map +1 -0
  166. package/dist/backup-and-sync/user-storage/validation.d.mts +23 -0
  167. package/dist/backup-and-sync/user-storage/validation.d.mts.map +1 -0
  168. package/dist/backup-and-sync/user-storage/{validation.js → validation.mjs} +3 -3
  169. package/dist/backup-and-sync/user-storage/validation.mjs.map +1 -0
  170. package/dist/backup-and-sync/utils/controller.cjs +88 -0
  171. package/dist/backup-and-sync/utils/controller.cjs.map +1 -0
  172. package/dist/backup-and-sync/utils/{controller.d.ts → controller.d.cts} +6 -6
  173. package/dist/backup-and-sync/utils/controller.d.cts.map +1 -0
  174. package/dist/backup-and-sync/utils/controller.d.mts +57 -0
  175. package/dist/backup-and-sync/utils/controller.d.mts.map +1 -0
  176. package/dist/backup-and-sync/utils/{controller.js → controller.mjs} +3 -3
  177. package/dist/backup-and-sync/utils/controller.mjs.map +1 -0
  178. package/dist/backup-and-sync/utils/errors.cjs +14 -0
  179. package/dist/backup-and-sync/utils/errors.cjs.map +1 -0
  180. package/dist/backup-and-sync/utils/{errors.d.ts → errors.d.cts} +1 -1
  181. package/dist/backup-and-sync/utils/errors.d.cts.map +1 -0
  182. package/dist/backup-and-sync/utils/errors.d.mts +8 -0
  183. package/dist/backup-and-sync/utils/errors.d.mts.map +1 -0
  184. package/dist/backup-and-sync/utils/{errors.js → errors.mjs} +1 -1
  185. package/dist/backup-and-sync/utils/errors.mjs.map +1 -0
  186. package/dist/backup-and-sync/utils/index.cjs +23 -0
  187. package/dist/backup-and-sync/utils/index.cjs.map +1 -0
  188. package/dist/backup-and-sync/utils/index.d.cts +4 -0
  189. package/dist/backup-and-sync/utils/index.d.cts.map +1 -0
  190. package/dist/backup-and-sync/utils/index.d.mts +4 -0
  191. package/dist/backup-and-sync/utils/index.d.mts.map +1 -0
  192. package/dist/backup-and-sync/utils/index.mjs +4 -0
  193. package/dist/backup-and-sync/utils/index.mjs.map +1 -0
  194. package/dist/backup-and-sync/utils/mutation-tracker.cjs +29 -0
  195. package/dist/backup-and-sync/utils/mutation-tracker.cjs.map +1 -0
  196. package/dist/backup-and-sync/utils/{mutation-tracker.d.ts → mutation-tracker.d.cts} +2 -2
  197. package/dist/backup-and-sync/utils/mutation-tracker.d.cts.map +1 -0
  198. package/dist/backup-and-sync/utils/mutation-tracker.d.mts +9 -0
  199. package/dist/backup-and-sync/utils/mutation-tracker.d.mts.map +1 -0
  200. package/dist/backup-and-sync/utils/{mutation-tracker.js → mutation-tracker.mjs} +1 -1
  201. package/dist/backup-and-sync/utils/mutation-tracker.mjs.map +1 -0
  202. package/dist/group.cjs +60 -0
  203. package/dist/group.cjs.map +1 -0
  204. package/dist/{group.d.ts → group.d.cts} +8 -8
  205. package/dist/group.d.cts.map +1 -0
  206. package/dist/group.d.mts +97 -0
  207. package/dist/group.d.mts.map +1 -0
  208. package/dist/{group.js → group.mjs} +2 -2
  209. package/dist/group.mjs.map +1 -0
  210. package/dist/index.cjs +21 -0
  211. package/dist/index.cjs.map +1 -0
  212. package/dist/{index.d.ts → index.d.cts} +13 -13
  213. package/dist/index.d.cts.map +1 -0
  214. package/dist/index.d.mts +13 -0
  215. package/dist/index.d.mts.map +1 -0
  216. package/dist/index.mjs +7 -0
  217. package/dist/index.mjs.map +1 -0
  218. package/dist/logger.cjs +7 -0
  219. package/dist/logger.cjs.map +1 -0
  220. package/dist/{logger.d.ts → logger.d.cts} +2 -1
  221. package/dist/logger.d.cts.map +1 -0
  222. package/dist/logger.d.mts +4 -0
  223. package/dist/logger.d.mts.map +1 -0
  224. package/dist/{logger.js → logger.mjs} +2 -2
  225. package/dist/logger.mjs.map +1 -0
  226. package/dist/rule.cjs +32 -0
  227. package/dist/rule.cjs.map +1 -0
  228. package/dist/{rule.d.ts → rule.d.cts} +7 -7
  229. package/dist/rule.d.cts.map +1 -0
  230. package/dist/rule.d.mts +83 -0
  231. package/dist/rule.d.mts.map +1 -0
  232. package/dist/{rule.js → rule.mjs} +1 -1
  233. package/dist/rule.mjs.map +1 -0
  234. package/dist/rules/entropy.cjs +78 -0
  235. package/dist/rules/entropy.cjs.map +1 -0
  236. package/dist/rules/{entropy.d.ts → entropy.d.cts} +7 -7
  237. package/dist/rules/entropy.d.cts.map +1 -0
  238. package/dist/rules/entropy.d.mts +16 -0
  239. package/dist/rules/entropy.d.mts.map +1 -0
  240. package/dist/rules/{entropy.js → entropy.mjs} +5 -5
  241. package/dist/rules/entropy.mjs.map +1 -0
  242. package/dist/rules/keyring.cjs +151 -0
  243. package/dist/rules/keyring.cjs.map +1 -0
  244. package/dist/rules/{keyring.d.ts → keyring.d.cts} +10 -10
  245. package/dist/rules/keyring.d.cts.map +1 -0
  246. package/dist/rules/keyring.d.mts +32 -0
  247. package/dist/rules/keyring.d.mts.map +1 -0
  248. package/dist/rules/{keyring.js → keyring.mjs} +7 -7
  249. package/dist/rules/keyring.mjs.map +1 -0
  250. package/dist/rules/snap.cjs +80 -0
  251. package/dist/rules/snap.cjs.map +1 -0
  252. package/dist/rules/{snap.d.ts → snap.d.cts} +6 -6
  253. package/dist/rules/snap.d.cts.map +1 -0
  254. package/dist/rules/snap.d.mts +14 -0
  255. package/dist/rules/snap.d.mts.map +1 -0
  256. package/dist/rules/{snap.js → snap.mjs} +8 -8
  257. package/dist/rules/snap.mjs.map +1 -0
  258. package/dist/state/export.cjs +230 -0
  259. package/dist/state/export.cjs.map +1 -0
  260. package/dist/state/{export.d.ts → export.d.cts} +6 -6
  261. package/dist/state/export.d.cts.map +1 -0
  262. package/dist/state/export.d.mts +40 -0
  263. package/dist/state/export.d.mts.map +1 -0
  264. package/dist/state/{export.js → export.mjs} +9 -8
  265. package/dist/state/export.mjs.map +1 -0
  266. package/dist/state/id-map.cjs +65 -0
  267. package/dist/state/id-map.cjs.map +1 -0
  268. package/dist/state/{id-map.d.ts → id-map.d.cts} +3 -3
  269. package/dist/state/id-map.d.cts.map +1 -0
  270. package/dist/state/id-map.d.mts +41 -0
  271. package/dist/state/id-map.d.mts.map +1 -0
  272. package/dist/state/{id-map.js → id-map.mjs} +2 -2
  273. package/dist/state/id-map.mjs.map +1 -0
  274. package/dist/state/import.cjs +285 -0
  275. package/dist/state/import.cjs.map +1 -0
  276. package/dist/state/{import.d.ts → import.d.cts} +4 -4
  277. package/dist/state/import.d.cts.map +1 -0
  278. package/dist/state/import.d.mts +29 -0
  279. package/dist/state/import.d.mts.map +1 -0
  280. package/dist/state/{import.js → import.mjs} +9 -8
  281. package/dist/state/import.mjs.map +1 -0
  282. package/dist/state/payload.cjs +169 -0
  283. package/dist/state/payload.cjs.map +1 -0
  284. package/dist/state/{payload.d.ts → payload.d.cts} +31 -31
  285. package/dist/state/payload.d.cts.map +1 -0
  286. package/dist/state/payload.d.mts +294 -0
  287. package/dist/state/payload.d.mts.map +1 -0
  288. package/dist/state/{payload.js → payload.mjs} +4 -4
  289. package/dist/state/payload.mjs.map +1 -0
  290. package/dist/state/snapshot.cjs +202 -0
  291. package/dist/state/snapshot.cjs.map +1 -0
  292. package/dist/state/{snapshot.d.ts → snapshot.d.cts} +3 -3
  293. package/dist/state/snapshot.d.cts.map +1 -0
  294. package/dist/state/snapshot.d.mts +120 -0
  295. package/dist/state/snapshot.d.mts.map +1 -0
  296. package/dist/state/{snapshot.js → snapshot.mjs} +3 -3
  297. package/dist/state/snapshot.mjs.map +1 -0
  298. package/dist/state/utils.cjs +68 -0
  299. package/dist/state/utils.cjs.map +1 -0
  300. package/dist/state/{utils.d.ts → utils.d.cts} +3 -3
  301. package/dist/state/utils.d.cts.map +1 -0
  302. package/dist/state/utils.d.mts +49 -0
  303. package/dist/state/utils.d.mts.map +1 -0
  304. package/dist/state/{utils.js → utils.mjs} +2 -2
  305. package/dist/state/utils.mjs.map +1 -0
  306. package/dist/type-utils.cjs +3 -0
  307. package/dist/type-utils.cjs.map +1 -0
  308. package/dist/{type-utils.d.ts → type-utils.d.cts} +1 -1
  309. package/dist/type-utils.d.cts.map +1 -0
  310. package/dist/type-utils.d.mts +18 -0
  311. package/dist/type-utils.d.mts.map +1 -0
  312. package/dist/type-utils.mjs +2 -0
  313. package/dist/type-utils.mjs.map +1 -0
  314. package/dist/types.cjs +3 -0
  315. package/dist/types.cjs.map +1 -0
  316. package/dist/{types.d.ts → types.d.cts} +16 -16
  317. package/dist/types.d.cts.map +1 -0
  318. package/dist/types.d.mts +120 -0
  319. package/dist/types.d.mts.map +1 -0
  320. package/dist/types.mjs +2 -0
  321. package/dist/types.mjs.map +1 -0
  322. package/dist/wallet.cjs +3 -0
  323. package/dist/wallet.cjs.map +1 -0
  324. package/dist/{wallet.d.ts → wallet.d.cts} +9 -9
  325. package/dist/wallet.d.cts.map +1 -0
  326. package/dist/wallet.d.mts +99 -0
  327. package/dist/wallet.d.mts.map +1 -0
  328. package/dist/wallet.mjs +2 -0
  329. package/dist/wallet.mjs.map +1 -0
  330. package/package.json +17 -13
  331. package/dist/AccountTreeController-method-action-types.d.ts.map +0 -1
  332. package/dist/AccountTreeController-method-action-types.js.map +0 -1
  333. package/dist/AccountTreeController.d.ts.map +0 -1
  334. package/dist/AccountTreeController.js.map +0 -1
  335. package/dist/backup-and-sync/analytics/index.d.ts +0 -3
  336. package/dist/backup-and-sync/analytics/index.d.ts.map +0 -1
  337. package/dist/backup-and-sync/analytics/index.js +0 -3
  338. package/dist/backup-and-sync/analytics/index.js.map +0 -1
  339. package/dist/backup-and-sync/analytics/segment.d.ts.map +0 -1
  340. package/dist/backup-and-sync/analytics/segment.js.map +0 -1
  341. package/dist/backup-and-sync/analytics/traces.d.ts.map +0 -1
  342. package/dist/backup-and-sync/analytics/traces.js.map +0 -1
  343. package/dist/backup-and-sync/authentication/index.d.ts +0 -2
  344. package/dist/backup-and-sync/authentication/index.d.ts.map +0 -1
  345. package/dist/backup-and-sync/authentication/index.js +0 -2
  346. package/dist/backup-and-sync/authentication/index.js.map +0 -1
  347. package/dist/backup-and-sync/authentication/utils.d.ts.map +0 -1
  348. package/dist/backup-and-sync/authentication/utils.js.map +0 -1
  349. package/dist/backup-and-sync/service/atomic-sync-queue.d.ts.map +0 -1
  350. package/dist/backup-and-sync/service/atomic-sync-queue.js.map +0 -1
  351. package/dist/backup-and-sync/service/index.d.ts.map +0 -1
  352. package/dist/backup-and-sync/service/index.js.map +0 -1
  353. package/dist/backup-and-sync/syncing/group.d.ts.map +0 -1
  354. package/dist/backup-and-sync/syncing/group.js.map +0 -1
  355. package/dist/backup-and-sync/syncing/index.d.ts +0 -5
  356. package/dist/backup-and-sync/syncing/index.d.ts.map +0 -1
  357. package/dist/backup-and-sync/syncing/index.js +0 -5
  358. package/dist/backup-and-sync/syncing/index.js.map +0 -1
  359. package/dist/backup-and-sync/syncing/legacy.d.ts.map +0 -1
  360. package/dist/backup-and-sync/syncing/legacy.js.map +0 -1
  361. package/dist/backup-and-sync/syncing/metadata.d.ts.map +0 -1
  362. package/dist/backup-and-sync/syncing/metadata.js.map +0 -1
  363. package/dist/backup-and-sync/syncing/wallet.d.ts.map +0 -1
  364. package/dist/backup-and-sync/syncing/wallet.js.map +0 -1
  365. package/dist/backup-and-sync/types.d.ts.map +0 -1
  366. package/dist/backup-and-sync/types.js.map +0 -1
  367. package/dist/backup-and-sync/user-storage/constants.d.ts.map +0 -1
  368. package/dist/backup-and-sync/user-storage/constants.js.map +0 -1
  369. package/dist/backup-and-sync/user-storage/format-utils.d.ts.map +0 -1
  370. package/dist/backup-and-sync/user-storage/format-utils.js.map +0 -1
  371. package/dist/backup-and-sync/user-storage/index.d.ts +0 -5
  372. package/dist/backup-and-sync/user-storage/index.d.ts.map +0 -1
  373. package/dist/backup-and-sync/user-storage/index.js +0 -5
  374. package/dist/backup-and-sync/user-storage/index.js.map +0 -1
  375. package/dist/backup-and-sync/user-storage/network-operations.d.ts.map +0 -1
  376. package/dist/backup-and-sync/user-storage/network-operations.js.map +0 -1
  377. package/dist/backup-and-sync/user-storage/network-utils.d.ts.map +0 -1
  378. package/dist/backup-and-sync/user-storage/network-utils.js.map +0 -1
  379. package/dist/backup-and-sync/user-storage/validation.d.ts.map +0 -1
  380. package/dist/backup-and-sync/user-storage/validation.js.map +0 -1
  381. package/dist/backup-and-sync/utils/controller.d.ts.map +0 -1
  382. package/dist/backup-and-sync/utils/controller.js.map +0 -1
  383. package/dist/backup-and-sync/utils/errors.d.ts.map +0 -1
  384. package/dist/backup-and-sync/utils/errors.js.map +0 -1
  385. package/dist/backup-and-sync/utils/index.d.ts +0 -4
  386. package/dist/backup-and-sync/utils/index.d.ts.map +0 -1
  387. package/dist/backup-and-sync/utils/index.js +0 -4
  388. package/dist/backup-and-sync/utils/index.js.map +0 -1
  389. package/dist/backup-and-sync/utils/mutation-tracker.d.ts.map +0 -1
  390. package/dist/backup-and-sync/utils/mutation-tracker.js.map +0 -1
  391. package/dist/group.d.ts.map +0 -1
  392. package/dist/group.js.map +0 -1
  393. package/dist/index.d.ts.map +0 -1
  394. package/dist/index.js +0 -7
  395. package/dist/index.js.map +0 -1
  396. package/dist/logger.d.ts.map +0 -1
  397. package/dist/logger.js.map +0 -1
  398. package/dist/rule.d.ts.map +0 -1
  399. package/dist/rule.js.map +0 -1
  400. package/dist/rules/entropy.d.ts.map +0 -1
  401. package/dist/rules/entropy.js.map +0 -1
  402. package/dist/rules/keyring.d.ts.map +0 -1
  403. package/dist/rules/keyring.js.map +0 -1
  404. package/dist/rules/snap.d.ts.map +0 -1
  405. package/dist/rules/snap.js.map +0 -1
  406. package/dist/state/export.d.ts.map +0 -1
  407. package/dist/state/export.js.map +0 -1
  408. package/dist/state/id-map.d.ts.map +0 -1
  409. package/dist/state/id-map.js.map +0 -1
  410. package/dist/state/import.d.ts.map +0 -1
  411. package/dist/state/import.js.map +0 -1
  412. package/dist/state/payload.d.ts.map +0 -1
  413. package/dist/state/payload.js.map +0 -1
  414. package/dist/state/snapshot.d.ts.map +0 -1
  415. package/dist/state/snapshot.js.map +0 -1
  416. package/dist/state/utils.d.ts.map +0 -1
  417. package/dist/state/utils.js.map +0 -1
  418. package/dist/type-utils.d.ts.map +0 -1
  419. package/dist/type-utils.js +0 -2
  420. package/dist/type-utils.js.map +0 -1
  421. package/dist/types.d.ts.map +0 -1
  422. package/dist/types.js +0 -2
  423. package/dist/types.js.map +0 -1
  424. package/dist/wallet.d.ts.map +0 -1
  425. package/dist/wallet.js +0 -2
  426. package/dist/wallet.js.map +0 -1
@@ -0,0 +1,1247 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _AccountTreeController_instances, _AccountTreeController_accountIdToContext, _AccountTreeController_groupIdToWalletId, _AccountTreeController_backupAndSyncService, _AccountTreeController_rules, _AccountTreeController_trace, _AccountTreeController_backupAndSyncConfig, _AccountTreeController_accountOrderCallbacks, _AccountTreeController_initialized, _AccountTreeController_initTreeContext, _AccountTreeController_getEntropyRule, _AccountTreeController_getSnapRule, _AccountTreeController_getKeyringRule, _AccountTreeController_applyAccountWalletMetadata, _AccountTreeController_getRuleForWallet, _AccountTreeController_getComputedAccountGroupName, _AccountTreeController_getDefaultAccountGroupName, _AccountTreeController_applyAccountGroupMetadata, _AccountTreeController_handleAccountsAdded, _AccountTreeController_handleAccountsRemoved, _AccountTreeController_pruneEmptyGroupAndWallet, _AccountTreeController_publishAccountGroupCreated, _AccountTreeController_publishAccountGroupUpdated, _AccountTreeController_publishAccountGroupRemoved, _AccountTreeController_insert, _AccountTreeController_listAccounts, _AccountTreeController_assertAccountGroupExists, _AccountTreeController_assertAccountWalletExists, _AccountTreeController_assertAccountGroupNameIsUnique, _AccountTreeController_setSelectedAccountGroup, _AccountTreeController_getDefaultSelectedAccountGroup, _AccountTreeController_handleSelectedAccountChange, _AccountTreeController_handleMultichainAccountWalletStatusChange, _AccountTreeController_getAccountGroup, _AccountTreeController_getAccountFromAccountGroupId, _AccountTreeController_getDefaultAccountGroupId, _AccountTreeController_hasEvmAccount, _AccountTreeController_resolveNameConflict, _AccountTreeController_createBackupAndSyncContext;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AccountTreeController = exports.getDefaultAccountTreeControllerState = exports.controllerName = void 0;
16
+ const account_api_1 = require("@metamask/account-api");
17
+ const base_controller_1 = require("@metamask/base-controller");
18
+ const keyring_api_1 = require("@metamask/keyring-api");
19
+ const utils_1 = require("@metamask/utils");
20
+ const index_js_1 = require("./backup-and-sync/analytics/index.cjs");
21
+ const index_js_2 = require("./backup-and-sync/service/index.cjs");
22
+ const index_js_3 = require("./backup-and-sync/utils/index.cjs");
23
+ const group_js_1 = require("./group.cjs");
24
+ const logger_js_1 = require("./logger.cjs");
25
+ const entropy_js_1 = require("./rules/entropy.cjs");
26
+ const keyring_js_1 = require("./rules/keyring.cjs");
27
+ const snap_js_1 = require("./rules/snap.cjs");
28
+ const export_js_1 = require("./state/export.cjs");
29
+ const import_js_1 = require("./state/import.cjs");
30
+ exports.controllerName = 'AccountTreeController';
31
+ const MESSENGER_EXPOSED_METHODS = [
32
+ 'getSelectedAccountGroup',
33
+ 'setSelectedAccountGroup',
34
+ 'setSelectedAccountGroupByAccountId',
35
+ 'getAccountsFromSelectedAccountGroup',
36
+ 'getAccountFromSelectedAccountGroup',
37
+ 'getAccountContext',
38
+ 'setAccountWalletName',
39
+ 'setAccountGroupName',
40
+ 'setAccountGroupPinned',
41
+ 'setAccountGroupHidden',
42
+ 'getAccountWalletObject',
43
+ 'getAccountWalletObjects',
44
+ 'getAccountGroupObject',
45
+ 'clearState',
46
+ 'syncWithUserStorage',
47
+ 'syncWithUserStorageAtLeastOnce',
48
+ 'init',
49
+ 'reinit',
50
+ 'exportState',
51
+ 'importState',
52
+ ];
53
+ const accountTreeControllerMetadata = {
54
+ accountTree: {
55
+ includeInStateLogs: true,
56
+ persist: true,
57
+ includeInDebugSnapshot: false,
58
+ usedInUi: true,
59
+ },
60
+ selectedAccountGroup: {
61
+ includeInStateLogs: true,
62
+ persist: true,
63
+ includeInDebugSnapshot: false,
64
+ usedInUi: true,
65
+ },
66
+ isAccountTreeSyncingInProgress: {
67
+ includeInStateLogs: false,
68
+ persist: false,
69
+ includeInDebugSnapshot: false,
70
+ usedInUi: true,
71
+ },
72
+ hasAccountTreeSyncingSyncedAtLeastOnce: {
73
+ includeInStateLogs: true,
74
+ persist: true,
75
+ includeInDebugSnapshot: false,
76
+ usedInUi: true,
77
+ },
78
+ accountGroupsMetadata: {
79
+ includeInStateLogs: true,
80
+ persist: true,
81
+ includeInDebugSnapshot: false,
82
+ usedInUi: true,
83
+ },
84
+ accountWalletsMetadata: {
85
+ includeInStateLogs: true,
86
+ persist: true,
87
+ includeInDebugSnapshot: false,
88
+ usedInUi: true,
89
+ },
90
+ };
91
+ /**
92
+ * Gets default state of the `AccountTreeController`.
93
+ *
94
+ * @returns The default state of the `AccountTreeController`.
95
+ */
96
+ function getDefaultAccountTreeControllerState() {
97
+ return {
98
+ accountTree: {
99
+ wallets: {},
100
+ },
101
+ selectedAccountGroup: '',
102
+ isAccountTreeSyncingInProgress: false,
103
+ hasAccountTreeSyncingSyncedAtLeastOnce: false,
104
+ accountGroupsMetadata: {},
105
+ accountWalletsMetadata: {},
106
+ };
107
+ }
108
+ exports.getDefaultAccountTreeControllerState = getDefaultAccountTreeControllerState;
109
+ class AccountTreeController extends base_controller_1.BaseController {
110
+ /**
111
+ * Constructor for AccountTreeController.
112
+ *
113
+ * @param options - The controller options.
114
+ * @param options.messenger - The messenger object.
115
+ * @param options.state - Initial state to set on this controller
116
+ * @param options.config - Optional configuration for the controller.
117
+ */
118
+ constructor({ messenger, state, config, }) {
119
+ super({
120
+ messenger,
121
+ name: exports.controllerName,
122
+ metadata: accountTreeControllerMetadata,
123
+ state: {
124
+ ...getDefaultAccountTreeControllerState(),
125
+ ...state,
126
+ },
127
+ });
128
+ _AccountTreeController_instances.add(this);
129
+ _AccountTreeController_accountIdToContext.set(this, void 0);
130
+ _AccountTreeController_groupIdToWalletId.set(this, void 0);
131
+ /**
132
+ * Service responsible for all backup and sync operations.
133
+ */
134
+ _AccountTreeController_backupAndSyncService.set(this, void 0);
135
+ _AccountTreeController_rules.set(this, void 0);
136
+ _AccountTreeController_trace.set(this, void 0);
137
+ _AccountTreeController_backupAndSyncConfig.set(this, void 0);
138
+ /**
139
+ * Callbacks to migrate hidden and pinned account information from the account order controller
140
+ */
141
+ _AccountTreeController_accountOrderCallbacks.set(this, void 0);
142
+ _AccountTreeController_initialized.set(this, void 0);
143
+ // This will be set to true upon the first `init` call.
144
+ __classPrivateFieldSet(this, _AccountTreeController_initialized, false, "f");
145
+ // Reverse map to allow fast node access from an account ID.
146
+ __classPrivateFieldSet(this, _AccountTreeController_accountIdToContext, new Map(), "f");
147
+ // Reverse map to allow fast wallet node access from a group ID.
148
+ __classPrivateFieldSet(this, _AccountTreeController_groupIdToWalletId, new Map(), "f");
149
+ // Rules to apply to construct the wallets tree.
150
+ __classPrivateFieldSet(this, _AccountTreeController_rules, [
151
+ // 1. We group by entropy-source
152
+ new entropy_js_1.EntropyRule(this.messenger),
153
+ // 2. We group by Snap ID
154
+ new snap_js_1.SnapRule(this.messenger),
155
+ // 3. We group by wallet type (this rule cannot fail and will group all non-matching accounts)
156
+ new keyring_js_1.KeyringRule(this.messenger),
157
+ ], "f");
158
+ // Initialize trace function
159
+ __classPrivateFieldSet(this, _AccountTreeController_trace, config?.trace ?? index_js_1.traceFallback, "f");
160
+ // Initialize backup and sync config
161
+ __classPrivateFieldSet(this, _AccountTreeController_backupAndSyncConfig, {
162
+ emitAnalyticsEventFn: (event) => {
163
+ return config?.backupAndSync?.onBackupAndSyncEvent?.((0, index_js_1.formatAnalyticsEvent)(event));
164
+ },
165
+ }, "f");
166
+ // Used when migrating initial hidden/pinned state for groups (if available).
167
+ __classPrivateFieldSet(this, _AccountTreeController_accountOrderCallbacks, config?.accountOrderCallbacks, "f");
168
+ // Initialize the backup and sync service
169
+ __classPrivateFieldSet(this, _AccountTreeController_backupAndSyncService, new index_js_2.BackupAndSyncService(__classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_createBackupAndSyncContext).call(this)), "f");
170
+ // We build the initial tree (from the state), but this might get updated
171
+ // after `init` got called. Having it available now, allow our consumers to
172
+ // re-use the state that was already available before we restart/lock the
173
+ // wallet.
174
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_initTreeContext).call(this, this.state.accountTree);
175
+ this.messenger.subscribe('AccountsController:accountsAdded', (accounts) => {
176
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_handleAccountsAdded).call(this, accounts);
177
+ });
178
+ this.messenger.subscribe('AccountsController:accountsRemoved', (accountIds) => {
179
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_handleAccountsRemoved).call(this, accountIds);
180
+ });
181
+ this.messenger.subscribe('AccountsController:selectedAccountChange', (account) => {
182
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_handleSelectedAccountChange).call(this, account);
183
+ });
184
+ this.messenger.subscribe('UserStorageController:stateChange', (userStorageControllerState) => {
185
+ __classPrivateFieldGet(this, _AccountTreeController_backupAndSyncService, "f").handleUserStorageStateChange(userStorageControllerState);
186
+ });
187
+ this.messenger.subscribe('MultichainAccountService:walletStatusChange', (walletId, status) => {
188
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_handleMultichainAccountWalletStatusChange).call(this, walletId, status);
189
+ });
190
+ this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
191
+ }
192
+ /**
193
+ * Initialize the controller's state.
194
+ *
195
+ * It constructs the initial state of the account tree (tree nodes, nodes
196
+ * names, metadata, etc..) and will automatically update the controller's
197
+ * state with it.
198
+ */
199
+ init() {
200
+ if (__classPrivateFieldGet(this, _AccountTreeController_initialized, "f")) {
201
+ // We prevent re-initilializing the state multiple times. Though, we can use
202
+ // `reinit` to re-init everything from scratch.
203
+ return;
204
+ }
205
+ (0, logger_js_1.projectLogger)('Initializing...');
206
+ const wallets = {};
207
+ // Clear mappings for fresh rebuild.
208
+ __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").clear();
209
+ __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").clear();
210
+ // Keep the current selected group to check if it's still part of the tree
211
+ // after rebuilding it.
212
+ const previousSelectedAccountGroup = this.state.selectedAccountGroup;
213
+ // There's no guarantee that accounts would be sorted by their import time
214
+ // with `listMultichainAccounts`. We have to sort them here before constructing
215
+ // the tree.
216
+ //
217
+ // Because of the alignment mecanism, some accounts from the same group might not
218
+ // have been imported at the same time, but at least of them should have been
219
+ // imported at the right time, thus, inserting the group at the proper place too.
220
+ //
221
+ // Lastly, if one day we allow to have "gaps" in between groups, then this `sort`
222
+ // won't be enough and we would have to use group properties instead (like group
223
+ // index or maybe introduce a `importTime` at group level).
224
+ const accounts = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_listAccounts).call(this).sort((a, b) => a.metadata.importTime - b.metadata.importTime);
225
+ // For now, we always re-compute all wallets, we do not re-use the existing state.
226
+ for (const account of accounts) {
227
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, wallets, account);
228
+ }
229
+ // Once we have the account tree, we can apply persisted metadata (names + UI states).
230
+ let previousSelectedAccountGroupStillExists = false;
231
+ this.update((state) => {
232
+ state.accountTree.wallets = wallets;
233
+ // Apply group metadata within the state update
234
+ for (const wallet of Object.values(state.accountTree.wallets)) {
235
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_applyAccountWalletMetadata).call(this, state, wallet.id);
236
+ // Used for default group default names (so we use human-indexing here).
237
+ let nextNaturalNameIndex = 1;
238
+ for (const group of Object.values(wallet.groups)) {
239
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_applyAccountGroupMetadata).call(this, state, wallet.id, group.id, {
240
+ // We allow computed name when initializing the tree.
241
+ // This will automatically handle account name migration for the very first init of the
242
+ // tree. Once groups are created, their name will be persisted, thus, taking precedence
243
+ // over the computed names (even if we re-init).
244
+ allowComputedName: true,
245
+ // FIXME: We should not need this kind of logic if we were not inserting accounts
246
+ // 1 by 1. Instead, we should be inserting wallets and groups directly. This would
247
+ // allow us to naturally insert a group in the tree AND update its metadata right
248
+ // away...
249
+ // But here, we have to wait for the entire group to be ready before updating
250
+ // its metadata (mainly because we're dealing with single accounts rather than entire
251
+ // groups).
252
+ // That is why we need this kind of extra parameter.
253
+ nextNaturalNameIndex,
254
+ });
255
+ if (group.id === previousSelectedAccountGroup) {
256
+ previousSelectedAccountGroupStillExists = true;
257
+ }
258
+ nextNaturalNameIndex += 1;
259
+ }
260
+ }
261
+ if (!previousSelectedAccountGroupStillExists ||
262
+ previousSelectedAccountGroup === '') {
263
+ // No group is selected yet OR group no longer exists, re-sync with the
264
+ // AccountsController.
265
+ state.selectedAccountGroup = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getDefaultSelectedAccountGroup).call(this, state.accountTree.wallets);
266
+ }
267
+ });
268
+ // We always fire the current selected group after init, even if it did not change, to ensure that
269
+ // all subscribers are aware of it and can react accordingly (e.g. by fetching accounts from
270
+ // the selected group on startup).
271
+ (0, logger_js_1.projectLogger)(`Selected (initial) group is: [${this.state.selectedAccountGroup}]`);
272
+ this.messenger.publish(`${exports.controllerName}:selectedAccountGroupChange`, this.state.selectedAccountGroup, previousSelectedAccountGroup);
273
+ __classPrivateFieldSet(this, _AccountTreeController_initialized, true, "f");
274
+ (0, logger_js_1.projectLogger)('Initialized!');
275
+ this.messenger.publish(`${exports.controllerName}:initialized`, this.state);
276
+ }
277
+ /**
278
+ * Re-initialize the controller's state.
279
+ *
280
+ * This is done in one single (atomic) `update` block to avoid having a temporary
281
+ * cleared state. Use this when you need to force a full re-init even if already initialized.
282
+ */
283
+ reinit() {
284
+ (0, logger_js_1.projectLogger)('Re-initializing...');
285
+ __classPrivateFieldSet(this, _AccountTreeController_initialized, false, "f");
286
+ this.init();
287
+ }
288
+ /**
289
+ * Gets the account wallet object from its ID.
290
+ *
291
+ * @param walletId - Account wallet ID.
292
+ * @returns The account wallet object if found, undefined otherwise.
293
+ */
294
+ getAccountWalletObject(walletId) {
295
+ const wallet = this.state.accountTree.wallets[walletId];
296
+ if (!wallet) {
297
+ return undefined;
298
+ }
299
+ return wallet;
300
+ }
301
+ /**
302
+ * Gets all account wallet objects.
303
+ *
304
+ * @returns All account wallet objects.
305
+ */
306
+ getAccountWalletObjects() {
307
+ return Object.values(this.state.accountTree.wallets);
308
+ }
309
+ /**
310
+ * Gets all underlying accounts from the currently selected account
311
+ * group.
312
+ *
313
+ * It also support account selector, which allows to filter specific
314
+ * accounts given some criterias (account type, address, scopes, etc...).
315
+ *
316
+ * @param selector - Optional account selector.
317
+ * @returns Underlying accounts for the currently selected account (filtered
318
+ * by the selector if provided).
319
+ */
320
+ getAccountsFromSelectedAccountGroup(selector) {
321
+ const groupId = this.getSelectedAccountGroup();
322
+ if (!groupId) {
323
+ return [];
324
+ }
325
+ const group = this.getAccountGroupObject(groupId);
326
+ // We should never reach this part, so we cannot cover it either.
327
+ /* istanbul ignore next */
328
+ if (!group) {
329
+ return [];
330
+ }
331
+ const accounts = [];
332
+ for (const id of group.accounts) {
333
+ const account = this.messenger.call('AccountsController:getAccount', id);
334
+ // For now, we're filtering undefined account, but I believe
335
+ // throwing would be more appropriate here.
336
+ if (account) {
337
+ accounts.push(account);
338
+ }
339
+ }
340
+ return selector ? (0, account_api_1.select)(accounts, selector) : accounts;
341
+ }
342
+ /**
343
+ * Gets an account from the currently selected account group, optionally
344
+ * filtered by a CAIP-2 chain ID.
345
+ *
346
+ * This is the group-based replacement for both
347
+ * `AccountsController:getSelectedAccount` and
348
+ * `AccountsController:getSelectedMultichainAccount`.
349
+ *
350
+ * When no chain ID is provided, an account of the selected group is returned
351
+ * using an EVM-priority rule: the first EVM account found in the group, or the
352
+ * first account in the group if no EVM account is found. When a chain ID is
353
+ * provided, the first account in the selected group whose scopes match the
354
+ * given chain is returned.
355
+ *
356
+ * @param chainId - Optional CAIP-2 chain ID used to filter accounts by scope.
357
+ * @returns The matching internal account from the selected group, or
358
+ * undefined if no group is selected or no account matches.
359
+ * @throws If `chainId` is provided but is not a valid CAIP-2 chain ID.
360
+ */
361
+ getAccountFromSelectedAccountGroup(chainId) {
362
+ const groupId = this.getSelectedAccountGroup();
363
+ if (!groupId) {
364
+ return undefined;
365
+ }
366
+ if (!chainId) {
367
+ return __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getAccountFromAccountGroupId).call(this, groupId);
368
+ }
369
+ if (!(0, utils_1.isCaipChainId)(chainId)) {
370
+ throw new Error(`Invalid CAIP-2 chain ID: ${String(chainId)}`);
371
+ }
372
+ const accounts = this.getAccountsFromSelectedAccountGroup({
373
+ scopes: [chainId],
374
+ });
375
+ return accounts[0];
376
+ }
377
+ /**
378
+ * Gets the account group object from its ID.
379
+ *
380
+ * @param groupId - Account group ID.
381
+ * @returns The account group object if found, undefined otherwise.
382
+ */
383
+ getAccountGroupObject(groupId) {
384
+ const walletId = __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").get(groupId);
385
+ if (!walletId) {
386
+ return undefined;
387
+ }
388
+ const wallet = this.getAccountWalletObject(walletId);
389
+ return wallet?.groups[groupId];
390
+ }
391
+ /**
392
+ * Gets the account's context which contains its wallet ID, group ID, and sort order.
393
+ *
394
+ * @param accountId - Account ID.
395
+ * @returns The account context if found, undefined otherwise.
396
+ */
397
+ getAccountContext(accountId) {
398
+ return __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").get(accountId);
399
+ }
400
+ /**
401
+ * Gets the currently selected account group ID.
402
+ *
403
+ * @returns The selected account group ID or empty string if none selected.
404
+ */
405
+ getSelectedAccountGroup() {
406
+ return this.state.selectedAccountGroup;
407
+ }
408
+ /**
409
+ * Sets the selected account group and updates the AccountsController selectedAccount accordingly.
410
+ *
411
+ * @param groupId - The account group ID to select.
412
+ */
413
+ setSelectedAccountGroup(groupId) {
414
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_setSelectedAccountGroup).call(this, groupId);
415
+ }
416
+ /**
417
+ * Sets the selected account group and updates the AccountsController selectedAccount accordingly.
418
+ *
419
+ * @param accountId - The account ID to select the group for.
420
+ */
421
+ setSelectedAccountGroupByAccountId(accountId) {
422
+ const context = __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").get(accountId);
423
+ if (!context) {
424
+ throw new Error('Account not found in the account tree');
425
+ }
426
+ this.setSelectedAccountGroup(context.groupId);
427
+ }
428
+ /**
429
+ * Sets a custom name for an account group.
430
+ *
431
+ * @param groupId - The account group ID.
432
+ * @param name - The custom name to set.
433
+ * @param autoHandleConflict - If true, automatically resolves name conflicts by adding a suffix. If false, throws on conflicts.
434
+ * @throws If the account group ID is not found in the current tree.
435
+ * @throws If the account group name already exists and autoHandleConflict is false.
436
+ */
437
+ setAccountGroupName(groupId, name, autoHandleConflict = false) {
438
+ // Validate that the group exists in the current tree
439
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_assertAccountGroupExists).call(this, groupId);
440
+ const walletId = __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").get(groupId);
441
+ (0, utils_1.assert)(walletId, 'Account group not found in tree');
442
+ const wallet = this.state.accountTree.wallets[walletId];
443
+ let finalName = name;
444
+ // Handle name conflicts based on the autoHandleConflict flag
445
+ if (autoHandleConflict &&
446
+ !(0, group_js_1.isAccountGroupNameUniqueFromWallet)(wallet, groupId, name)) {
447
+ finalName = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_resolveNameConflict).call(this, wallet, groupId, name);
448
+ }
449
+ else {
450
+ // Validate that the name is unique
451
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_assertAccountGroupNameIsUnique).call(this, groupId, finalName);
452
+ }
453
+ (0, logger_js_1.projectLogger)(`[${groupId}] Set new name to: "${finalName}" (auto handle conflict: ${autoHandleConflict})`);
454
+ this.update((state) => {
455
+ /* istanbul ignore next */
456
+ if (!state.accountGroupsMetadata[groupId]) {
457
+ state.accountGroupsMetadata[groupId] = {};
458
+ }
459
+ // Update persistent metadata
460
+ state.accountGroupsMetadata[groupId].name = {
461
+ value: finalName,
462
+ lastUpdatedAt: Date.now(),
463
+ };
464
+ // Update tree node directly using efficient mapping
465
+ state.accountTree.wallets[walletId].groups[groupId].metadata.name =
466
+ finalName;
467
+ });
468
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_publishAccountGroupUpdated).call(this, walletId, groupId);
469
+ // Trigger atomic sync for group rename (only for groups from entropy wallets)
470
+ if (wallet.type === account_api_1.AccountWalletType.Entropy) {
471
+ __classPrivateFieldGet(this, _AccountTreeController_backupAndSyncService, "f").enqueueSingleGroupSync(groupId);
472
+ }
473
+ }
474
+ /**
475
+ * Sets a custom name for an account wallet.
476
+ *
477
+ * @param walletId - The account wallet ID.
478
+ * @param name - The custom name to set.
479
+ * @throws If the account wallet ID is not found in the current tree.
480
+ */
481
+ setAccountWalletName(walletId, name) {
482
+ // Validate that the wallet exists in the current tree
483
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_assertAccountWalletExists).call(this, walletId);
484
+ this.update((state) => {
485
+ var _a;
486
+ // Update persistent metadata
487
+ (_a = state.accountWalletsMetadata)[walletId] ?? (_a[walletId] = {});
488
+ state.accountWalletsMetadata[walletId].name = {
489
+ value: name,
490
+ lastUpdatedAt: Date.now(),
491
+ };
492
+ // Update tree node directly
493
+ state.accountTree.wallets[walletId].metadata.name = name;
494
+ });
495
+ // Trigger atomic sync for wallet rename (only for groups from entropy wallets)
496
+ if (this.state.accountTree.wallets[walletId].type ===
497
+ account_api_1.AccountWalletType.Entropy) {
498
+ __classPrivateFieldGet(this, _AccountTreeController_backupAndSyncService, "f").enqueueSingleWalletSync(walletId);
499
+ }
500
+ }
501
+ /**
502
+ * Toggles the pinned state of an account group.
503
+ *
504
+ * @param groupId - The account group ID.
505
+ * @param pinned - Whether the group should be pinned.
506
+ * @throws If the account group ID is not found in the current tree.
507
+ */
508
+ setAccountGroupPinned(groupId, pinned) {
509
+ // Validate that the group exists in the current tree
510
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_assertAccountGroupExists).call(this, groupId);
511
+ const walletId = __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").get(groupId);
512
+ this.update((state) => {
513
+ /* istanbul ignore next */
514
+ if (!state.accountGroupsMetadata[groupId]) {
515
+ state.accountGroupsMetadata[groupId] = {};
516
+ }
517
+ // Update persistent metadata
518
+ state.accountGroupsMetadata[groupId].pinned = {
519
+ value: pinned,
520
+ lastUpdatedAt: Date.now(),
521
+ };
522
+ // Update tree node directly using efficient mapping
523
+ if (walletId) {
524
+ state.accountTree.wallets[walletId].groups[groupId].metadata.pinned =
525
+ pinned;
526
+ }
527
+ });
528
+ if (walletId) {
529
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_publishAccountGroupUpdated).call(this, walletId, groupId);
530
+ }
531
+ // Trigger atomic sync for group pinning (only for groups from entropy wallets)
532
+ if (walletId &&
533
+ this.state.accountTree.wallets[walletId].type ===
534
+ account_api_1.AccountWalletType.Entropy) {
535
+ __classPrivateFieldGet(this, _AccountTreeController_backupAndSyncService, "f").enqueueSingleGroupSync(groupId);
536
+ }
537
+ }
538
+ /**
539
+ * Toggles the hidden state of an account group.
540
+ *
541
+ * @param groupId - The account group ID.
542
+ * @param hidden - Whether the group should be hidden.
543
+ * @throws If the account group ID is not found in the current tree.
544
+ */
545
+ setAccountGroupHidden(groupId, hidden) {
546
+ // Validate that the group exists in the current tree
547
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_assertAccountGroupExists).call(this, groupId);
548
+ const walletId = __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").get(groupId);
549
+ this.update((state) => {
550
+ /* istanbul ignore next */
551
+ if (!state.accountGroupsMetadata[groupId]) {
552
+ state.accountGroupsMetadata[groupId] = {};
553
+ }
554
+ // Update persistent metadata
555
+ state.accountGroupsMetadata[groupId].hidden = {
556
+ value: hidden,
557
+ lastUpdatedAt: Date.now(),
558
+ };
559
+ // Update tree node directly using efficient mapping
560
+ if (walletId) {
561
+ state.accountTree.wallets[walletId].groups[groupId].metadata.hidden =
562
+ hidden;
563
+ }
564
+ });
565
+ if (walletId) {
566
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_publishAccountGroupUpdated).call(this, walletId, groupId);
567
+ }
568
+ // Trigger atomic sync for group hiding (only for groups from entropy wallets)
569
+ if (walletId &&
570
+ this.state.accountTree.wallets[walletId].type ===
571
+ account_api_1.AccountWalletType.Entropy) {
572
+ __classPrivateFieldGet(this, _AccountTreeController_backupAndSyncService, "f").enqueueSingleGroupSync(groupId);
573
+ }
574
+ }
575
+ /**
576
+ * Clears the controller state and resets to default values.
577
+ * Also clears the backup and sync service state.
578
+ */
579
+ clearState() {
580
+ (0, logger_js_1.projectLogger)('Clearing state');
581
+ const previousSelectedAccountGroup = this.state.selectedAccountGroup;
582
+ this.update(() => {
583
+ return {
584
+ ...getDefaultAccountTreeControllerState(),
585
+ };
586
+ });
587
+ __classPrivateFieldGet(this, _AccountTreeController_backupAndSyncService, "f").clearState();
588
+ // Clear in-memory reverse-lookup Maps so stale data is not accessible
589
+ // between this call and the next init().
590
+ __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").clear();
591
+ __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").clear();
592
+ // Notify subscribers that the selected group has been cleared,
593
+ // mirroring what #setSelectedAccountGroup does on normal transitions.
594
+ this.messenger.publish(`${exports.controllerName}:selectedAccountGroupChange`, '', previousSelectedAccountGroup);
595
+ // So we know we have to call `init` again.
596
+ __classPrivateFieldSet(this, _AccountTreeController_initialized, false, "f");
597
+ this.messenger.publish(`${exports.controllerName}:uninitialized`);
598
+ }
599
+ /**
600
+ * Bi-directionally syncs the account tree with user storage.
601
+ * This will perform a full sync, including both pulling updates
602
+ * from user storage and pushing local changes to user storage.
603
+ * This also performs legacy account syncing if needed.
604
+ *
605
+ * IMPORTANT:
606
+ * If a full sync is already in progress, it will return the ongoing promise.
607
+ *
608
+ * @returns A promise that resolves when the sync is complete.
609
+ */
610
+ async syncWithUserStorage() {
611
+ return __classPrivateFieldGet(this, _AccountTreeController_backupAndSyncService, "f").performFullSync();
612
+ }
613
+ /**
614
+ * Bi-directionally syncs the account tree with user storage.
615
+ * This will ensure at least one full sync is ran, including both pulling updates
616
+ * from user storage and pushing local changes to user storage.
617
+ * This also performs legacy account syncing if needed.
618
+ *
619
+ * IMPORTANT:
620
+ * If the first ever full sync is already in progress, it will return the ongoing promise.
621
+ * If the first ever full sync was previously completed, it will NOT start a new sync, and will resolve immediately.
622
+ *
623
+ * @returns A promise that resolves when the first ever full sync is complete.
624
+ */
625
+ async syncWithUserStorageAtLeastOnce() {
626
+ return __classPrivateFieldGet(this, _AccountTreeController_backupAndSyncService, "f").performFullSyncAtLeastOnce();
627
+ }
628
+ /**
629
+ * Produces a versioned snapshot of the current wallet and group state.
630
+ *
631
+ * When `options.includeSecrets` is `true`, `options.password` is required
632
+ * and verified against the vault before any secret is read. Without
633
+ * `includeSecrets`, only metadata (names, pinned, hidden) is exported and
634
+ * no password is needed.
635
+ *
636
+ * @param options - Export options.
637
+ * @returns A promise resolving to an `AccountTreeSnapshot`.
638
+ * @throws If the vault is locked or the password is incorrect.
639
+ */
640
+ async exportState(options) {
641
+ return (0, export_js_1.exportState)({ getState: () => this.state, messenger: this.messenger }, options);
642
+ }
643
+ /**
644
+ * Applies a validated snapshot to the current state.
645
+ *
646
+ * Accepts an {@link AccountTreeSnapshot} only — untrusted wire data must be
647
+ * parsed with {@link AccountTreeSnapshot.deserialize} first. Callers may
648
+ * filter the snapshot with {@link AccountTreeSnapshot.filterWallets},
649
+ * {@link AccountTreeSnapshot.filterGroups}, or
650
+ * {@link AccountTreeSnapshot.filterAllGroups} before importing.
651
+ *
652
+ * New mnemonic wallets are imported via `MultichainAccountService` and new
653
+ * private-key accounts via `KeyringController`. Metadata (name, pinned,
654
+ * hidden) is applied to all existing and newly created wallets / groups.
655
+ *
656
+ * @param snapshot - The validated snapshot to import.
657
+ * @returns A promise that resolves when the import is complete.
658
+ */
659
+ async importState(snapshot) {
660
+ return (0, import_js_1.importState)({
661
+ getState: () => this.state,
662
+ messenger: this.messenger,
663
+ setWalletName: (id, name) => this.setAccountWalletName(id, name),
664
+ setAccountGroupName: (id, name) => this.setAccountGroupName(id, name, true),
665
+ setAccountGroupPinned: (id, pinned) => this.setAccountGroupPinned(id, pinned),
666
+ setAccountGroupHidden: (id, hidden) => this.setAccountGroupHidden(id, hidden),
667
+ }, snapshot);
668
+ }
669
+ }
670
+ exports.AccountTreeController = AccountTreeController;
671
+ _AccountTreeController_accountIdToContext = new WeakMap(), _AccountTreeController_groupIdToWalletId = new WeakMap(), _AccountTreeController_backupAndSyncService = new WeakMap(), _AccountTreeController_rules = new WeakMap(), _AccountTreeController_trace = new WeakMap(), _AccountTreeController_backupAndSyncConfig = new WeakMap(), _AccountTreeController_accountOrderCallbacks = new WeakMap(), _AccountTreeController_initialized = new WeakMap(), _AccountTreeController_instances = new WeakSet(), _AccountTreeController_initTreeContext = function _AccountTreeController_initTreeContext(tree) {
672
+ // Fetch persisted accounts from the `AccountsController`.
673
+ const accounts = new Map(__classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_listAccounts).call(this).map((account) => [account.id, account]));
674
+ for (const [walletId, wallet] of Object.entries(tree.wallets)) {
675
+ for (const [groupId, group] of Object.entries(wallet.groups)) {
676
+ __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").set(groupId, walletId);
677
+ // We still need to go through accounts for the sort order.
678
+ for (const accountId of group.accounts) {
679
+ const account = accounts.get(accountId);
680
+ // NOTE: The account should always be available, but if it is not, we
681
+ // still let it inside the tree with a max sort order to avoid blocking
682
+ // the entire tree construction.
683
+ let sortOrder = group_js_1.MAX_SORT_ORDER;
684
+ if (account) {
685
+ sortOrder = group_js_1.ACCOUNT_TYPE_TO_SORT_ORDER[account.type];
686
+ }
687
+ __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").set(accountId, {
688
+ walletId,
689
+ groupId,
690
+ sortOrder,
691
+ });
692
+ }
693
+ }
694
+ }
695
+ }, _AccountTreeController_getEntropyRule = function _AccountTreeController_getEntropyRule() {
696
+ return __classPrivateFieldGet(this, _AccountTreeController_rules, "f")[0];
697
+ }, _AccountTreeController_getSnapRule = function _AccountTreeController_getSnapRule() {
698
+ return __classPrivateFieldGet(this, _AccountTreeController_rules, "f")[1];
699
+ }, _AccountTreeController_getKeyringRule = function _AccountTreeController_getKeyringRule() {
700
+ return __classPrivateFieldGet(this, _AccountTreeController_rules, "f")[2];
701
+ }, _AccountTreeController_applyAccountWalletMetadata = function _AccountTreeController_applyAccountWalletMetadata(state, walletId) {
702
+ const wallet = state.accountTree.wallets[walletId];
703
+ const persistedMetadata = state.accountWalletsMetadata[walletId];
704
+ // Apply persisted name if available (including empty strings)
705
+ if (persistedMetadata?.name !== undefined) {
706
+ wallet.metadata.name = persistedMetadata.name.value;
707
+ }
708
+ else if (!wallet.metadata.name) {
709
+ // Generate default name if none exists
710
+ if (wallet.type === account_api_1.AccountWalletType.Entropy) {
711
+ wallet.metadata.name =
712
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getEntropyRule).call(this).getDefaultAccountWalletName(wallet);
713
+ }
714
+ else if (wallet.type === account_api_1.AccountWalletType.Snap) {
715
+ wallet.metadata.name =
716
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getSnapRule).call(this).getDefaultAccountWalletName(wallet);
717
+ }
718
+ else {
719
+ wallet.metadata.name =
720
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getKeyringRule).call(this).getDefaultAccountWalletName(wallet);
721
+ }
722
+ (0, logger_js_1.projectLogger)(`[${wallet.id}] Set default name to: "${wallet.metadata.name}"`);
723
+ }
724
+ }, _AccountTreeController_getRuleForWallet = function _AccountTreeController_getRuleForWallet(wallet) {
725
+ switch (wallet.type) {
726
+ case account_api_1.AccountWalletType.Entropy:
727
+ return __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getEntropyRule).call(this);
728
+ case account_api_1.AccountWalletType.Snap:
729
+ return __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getSnapRule).call(this);
730
+ default:
731
+ return __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getKeyringRule).call(this);
732
+ }
733
+ }, _AccountTreeController_getComputedAccountGroupName = function _AccountTreeController_getComputedAccountGroupName(wallet, group) {
734
+ let proposedName = ''; // Empty means there's no computed name for this group.
735
+ for (const id of group.accounts) {
736
+ const account = this.messenger.call('AccountsController:getAccount', id);
737
+ if (!account?.metadata.name.length) {
738
+ continue;
739
+ }
740
+ // We only pick a new proposed name if we don't have one yet.
741
+ if (!proposedName) {
742
+ proposedName = account.metadata.name;
743
+ }
744
+ // But EVM accounts take precedence over any other computed names.
745
+ if ((0, keyring_api_1.isEvmAccountType)(account.type)) {
746
+ // So we just overwrite the proposed name and stop looping right away.
747
+ proposedName = account.metadata.name;
748
+ break;
749
+ }
750
+ }
751
+ // If this name already exists for whatever reason, we rename it to resolve this conflict.
752
+ if (proposedName.length &&
753
+ !(0, group_js_1.isAccountGroupNameUniqueFromWallet)(wallet, group.id, proposedName)) {
754
+ proposedName = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_resolveNameConflict).call(this, wallet, group.id, proposedName);
755
+ }
756
+ return proposedName;
757
+ }, _AccountTreeController_getDefaultAccountGroupName = function _AccountTreeController_getDefaultAccountGroupName(state, wallet, group, nextNaturalNameIndex) {
758
+ // Get the appropriate rule for this wallet type
759
+ const rule = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getRuleForWallet).call(this, wallet);
760
+ // Get the prefix for groups of this wallet
761
+ const namePrefix = rule.getDefaultAccountGroupPrefix(wallet);
762
+ // Parse the highest account index being used (similar to accounts-controller)
763
+ let highestNameIndex = 0;
764
+ for (const { id: otherGroupId } of Object.values(wallet.groups)) {
765
+ // Skip the current group being processed
766
+ if (otherGroupId === group.id) {
767
+ continue;
768
+ }
769
+ // We always get the name from the persisted map, since `init` will clear the
770
+ // `state.accountTree.wallets`, thus, given empty `group.metadata.name`.
771
+ // NOTE: If the other group has not been named yet, we just use an empty name.
772
+ const otherGroupName = state.accountGroupsMetadata[otherGroupId]?.name?.value ?? '';
773
+ // Parse the existing group name to extract the numeric index
774
+ const nameMatch = otherGroupName.match(/account\s+(\d+)$/iu);
775
+ if (nameMatch) {
776
+ const nameIndex = parseInt(nameMatch[1], 10);
777
+ if (nameIndex > highestNameIndex) {
778
+ highestNameIndex = nameIndex;
779
+ }
780
+ }
781
+ }
782
+ // We just use the highest known index no matter the wallet type.
783
+ //
784
+ // For entropy-based wallets (bip44), if a multichain account group with group index 1
785
+ // is inserted before another one with group index 0, then the naming will be:
786
+ // - "Account 1" (group index 1)
787
+ // - "Account 2" (group index 0)
788
+ // This naming makes more sense for the end-user.
789
+ //
790
+ // For other type of wallets, since those wallets can create arbitrary gaps, we still
791
+ // rely on the highest know index to avoid back-filling account with "old names".
792
+ let proposedNameIndex = Math.max(
793
+ // Use + 1 to use the next available index.
794
+ highestNameIndex + 1,
795
+ // In case all accounts have been renamed differently than the usual "Account <index>"
796
+ // pattern, we want to use the next "natural" index, which is just the number of groups
797
+ // in that wallet (e.g. ["Account A", "Another Account"], next natural index would be
798
+ // "Account 3" in this case).
799
+ nextNaturalNameIndex ?? Object.keys(wallet.groups).length);
800
+ // Find a unique name by checking for conflicts and incrementing if needed
801
+ let proposedNameExists;
802
+ let proposedName = '';
803
+ do {
804
+ proposedName = `${namePrefix} ${proposedNameIndex}`;
805
+ // Check if this name already exists in the wallet (excluding current group)
806
+ proposedNameExists = !(0, group_js_1.isAccountGroupNameUniqueFromWallet)(wallet, group.id, proposedName);
807
+ /* istanbul ignore next */
808
+ if (proposedNameExists) {
809
+ proposedNameIndex += 1; // Try next number
810
+ }
811
+ } while (proposedNameExists);
812
+ return proposedName;
813
+ }, _AccountTreeController_applyAccountGroupMetadata = function _AccountTreeController_applyAccountGroupMetadata(state, walletId, groupId, { allowComputedName, nextNaturalNameIndex, } = {}) {
814
+ var _a;
815
+ const wallet = state.accountTree.wallets[walletId];
816
+ const group = wallet.groups[groupId];
817
+ const persistedGroupMetadata = state.accountGroupsMetadata[groupId];
818
+ // Ensure metadata object exists once at the beginning
819
+ (_a = state.accountGroupsMetadata)[groupId] ?? (_a[groupId] = {});
820
+ // Apply persisted name if available (including empty strings)
821
+ if (persistedGroupMetadata?.name !== undefined) {
822
+ state.accountTree.wallets[walletId].groups[groupId].metadata.name =
823
+ persistedGroupMetadata.name.value;
824
+ }
825
+ else if (!group.metadata.name) {
826
+ let proposedName = '';
827
+ // Computed names are usually only used for existing/old accounts. So this option
828
+ // should be used only when we first initialize the tree.
829
+ if (allowComputedName) {
830
+ proposedName = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getComputedAccountGroupName).call(this, wallet, group);
831
+ }
832
+ // If we still don't have a valid name candidate, we fallback to a default name.
833
+ if (!proposedName.length) {
834
+ proposedName = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getDefaultAccountGroupName).call(this, state, wallet, group, nextNaturalNameIndex);
835
+ }
836
+ state.accountTree.wallets[walletId].groups[groupId].metadata.name =
837
+ proposedName;
838
+ (0, logger_js_1.projectLogger)(`[${group.id}] Set default name to: "${group.metadata.name}"`);
839
+ // Persist the generated name to ensure consistency
840
+ state.accountGroupsMetadata[groupId].name = {
841
+ value: proposedName,
842
+ // The `lastUpdatedAt` field is used for backup and sync, when comparing local names
843
+ // with backed up names. In this case, the generated name should never take precedence
844
+ // over a user-defined name, so we set `lastUpdatedAt` to 0.
845
+ lastUpdatedAt: 0,
846
+ };
847
+ }
848
+ // Apply persisted UI states
849
+ if (persistedGroupMetadata?.pinned?.value !== undefined) {
850
+ group.metadata.pinned = persistedGroupMetadata.pinned.value;
851
+ }
852
+ else {
853
+ let isPinned = false;
854
+ if (__classPrivateFieldGet(this, _AccountTreeController_accountOrderCallbacks, "f")?.isPinnedAccount) {
855
+ isPinned = group.accounts.some((account) => __classPrivateFieldGet(this, _AccountTreeController_accountOrderCallbacks, "f")?.isPinnedAccount?.(account));
856
+ }
857
+ state.accountGroupsMetadata[groupId].pinned = {
858
+ value: isPinned,
859
+ lastUpdatedAt: 0,
860
+ };
861
+ // If any accounts was previously pinned, then we consider the group to be pinned as well.
862
+ group.metadata.pinned = isPinned;
863
+ }
864
+ if (persistedGroupMetadata?.hidden?.value !== undefined) {
865
+ group.metadata.hidden = persistedGroupMetadata.hidden.value;
866
+ }
867
+ else {
868
+ let isHidden = false;
869
+ if (__classPrivateFieldGet(this, _AccountTreeController_accountOrderCallbacks, "f")?.isHiddenAccount) {
870
+ isHidden = group.accounts.some((account) => __classPrivateFieldGet(this, _AccountTreeController_accountOrderCallbacks, "f")?.isHiddenAccount?.(account));
871
+ }
872
+ state.accountGroupsMetadata[groupId].hidden = {
873
+ value: isHidden,
874
+ lastUpdatedAt: 0,
875
+ };
876
+ // If any accounts was previously hidden, then we consider the group to be hidden as well.
877
+ group.metadata.hidden = isHidden;
878
+ }
879
+ // Apply persisted lastSelected (plain number, not synced).
880
+ if (persistedGroupMetadata?.lastSelected !== undefined &&
881
+ persistedGroupMetadata.lastSelected >= 0) {
882
+ group.metadata.lastSelected = persistedGroupMetadata.lastSelected;
883
+ }
884
+ else {
885
+ // Automatiacally inject default value.
886
+ state.accountGroupsMetadata[groupId].lastSelected = 0;
887
+ group.metadata.lastSelected = 0;
888
+ }
889
+ }, _AccountTreeController_handleAccountsAdded = function _AccountTreeController_handleAccountsAdded(accounts) {
890
+ // We wait for the first `init` to be called to actually build up the tree and
891
+ // mutate it. We expect the caller to first update the `AccountsController` state
892
+ // to force the migration of accounts, and then call `init`.
893
+ if (!__classPrivateFieldGet(this, _AccountTreeController_initialized, "f")) {
894
+ return;
895
+ }
896
+ // Filter out accounts already known by the tree to avoid double-insertion.
897
+ const newAccounts = accounts.filter((account) => !__classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").has(account.id));
898
+ if (newAccounts.length === 0) {
899
+ return;
900
+ }
901
+ const createdGroups = new Map();
902
+ const updatedGroups = new Map();
903
+ this.update((state) => {
904
+ for (const account of newAccounts) {
905
+ const { walletId, groupId, created } = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, state.accountTree.wallets, account);
906
+ if (created) {
907
+ createdGroups.set(groupId, walletId);
908
+ }
909
+ else if (!createdGroups.has(groupId)) {
910
+ // ^ We check that the group has not been created in this same batch before adding it to the `updatedGroups`
911
+ // map, to avoid sending both created and updated events for the same group:
912
+ // - Account 1 + Account 2 + Account 3
913
+ // - Account 1 and 3 belong to the same group
914
+ // - Account 1 will create the group
915
+ // - Account 3 will update the group (but we only want to send a created event, not an updated one)
916
+ updatedGroups.set(groupId, walletId);
917
+ }
918
+ const wallet = state.accountTree.wallets[walletId];
919
+ if (wallet) {
920
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_applyAccountWalletMetadata).call(this, state, walletId);
921
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_applyAccountGroupMetadata).call(this, state, walletId, groupId);
922
+ }
923
+ }
924
+ });
925
+ this.messenger.publish(`${exports.controllerName}:accountTreeChange`, this.state.accountTree);
926
+ for (const [groupId, walletId] of createdGroups) {
927
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_publishAccountGroupCreated).call(this, walletId, groupId);
928
+ }
929
+ for (const [groupId, walletId] of updatedGroups) {
930
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_publishAccountGroupUpdated).call(this, walletId, groupId);
931
+ }
932
+ }, _AccountTreeController_handleAccountsRemoved = function _AccountTreeController_handleAccountsRemoved(accountIds) {
933
+ // We wait for the first `init` to be called to actually build up the tree and
934
+ // mutate it. We expect the caller to first update the `AccountsController` state
935
+ // to force the migration of accounts, and then call `init`.
936
+ if (!__classPrivateFieldGet(this, _AccountTreeController_initialized, "f")) {
937
+ return;
938
+ }
939
+ const knownAccounts = [];
940
+ for (const id of accountIds) {
941
+ const context = __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").get(id);
942
+ if (context) {
943
+ knownAccounts.push({ id, context });
944
+ }
945
+ }
946
+ if (knownAccounts.length === 0) {
947
+ return;
948
+ }
949
+ const previousSelectedAccountGroup = this.state.selectedAccountGroup;
950
+ const updatedGroups = new Map();
951
+ const removedGroups = new Set();
952
+ this.update((state) => {
953
+ for (const { id: accountId, context } of knownAccounts) {
954
+ const { walletId, groupId } = context;
955
+ const accounts = state.accountTree.wallets[walletId]?.groups[groupId]?.accounts;
956
+ if (accounts) {
957
+ const index = accounts.indexOf(accountId);
958
+ if (index !== -1) {
959
+ accounts.splice(index, 1);
960
+ if (state.selectedAccountGroup === groupId &&
961
+ accounts.length === 0) {
962
+ state.selectedAccountGroup = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getDefaultAccountGroupId).call(this, state.accountTree.wallets);
963
+ }
964
+ }
965
+ if (accounts.length === 0) {
966
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_pruneEmptyGroupAndWallet).call(this, state, walletId, groupId);
967
+ // If the group gets pruned, we should not consider it as updated.
968
+ updatedGroups.delete(groupId);
969
+ removedGroups.add(groupId);
970
+ }
971
+ else {
972
+ updatedGroups.set(groupId, walletId);
973
+ }
974
+ }
975
+ }
976
+ });
977
+ // Clear reverse-mappings after the state update
978
+ for (const { id } of knownAccounts) {
979
+ __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").delete(id);
980
+ }
981
+ this.messenger.publish(`${exports.controllerName}:accountTreeChange`, this.state.accountTree);
982
+ for (const [groupId, walletId] of updatedGroups) {
983
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_publishAccountGroupUpdated).call(this, walletId, groupId);
984
+ }
985
+ for (const groupId of removedGroups) {
986
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_publishAccountGroupRemoved).call(this, groupId);
987
+ }
988
+ const newSelectedAccountGroup = this.state.selectedAccountGroup;
989
+ if (newSelectedAccountGroup !== previousSelectedAccountGroup) {
990
+ this.messenger.publish(`${exports.controllerName}:selectedAccountGroupChange`, newSelectedAccountGroup, previousSelectedAccountGroup);
991
+ }
992
+ }, _AccountTreeController_pruneEmptyGroupAndWallet = function _AccountTreeController_pruneEmptyGroupAndWallet(state, walletId, groupId) {
993
+ const { wallets } = state.accountTree;
994
+ delete wallets[walletId].groups[groupId];
995
+ __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").delete(groupId);
996
+ // Clean up metadata for the pruned group
997
+ delete state.accountGroupsMetadata[groupId];
998
+ if (Object.keys(wallets[walletId].groups).length === 0) {
999
+ delete wallets[walletId];
1000
+ // Clean up metadata for the pruned wallet
1001
+ delete state.accountWalletsMetadata[walletId];
1002
+ }
1003
+ return state;
1004
+ }, _AccountTreeController_publishAccountGroupCreated = function _AccountTreeController_publishAccountGroupCreated(walletId, groupId) {
1005
+ const group = this.state.accountTree.wallets[walletId]?.groups[groupId];
1006
+ if (group) {
1007
+ this.messenger.publish(`${exports.controllerName}:accountGroupCreated`, group);
1008
+ }
1009
+ }, _AccountTreeController_publishAccountGroupUpdated = function _AccountTreeController_publishAccountGroupUpdated(walletId, groupId) {
1010
+ const group = this.state.accountTree.wallets[walletId]?.groups[groupId];
1011
+ if (group) {
1012
+ this.messenger.publish(`${exports.controllerName}:accountGroupUpdated`, group);
1013
+ }
1014
+ }, _AccountTreeController_publishAccountGroupRemoved = function _AccountTreeController_publishAccountGroupRemoved(groupId) {
1015
+ this.messenger.publish(`${exports.controllerName}:accountGroupRemoved`, groupId);
1016
+ }, _AccountTreeController_insert = function _AccountTreeController_insert(wallets, account) {
1017
+ const result = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getEntropyRule).call(this).match(account) ??
1018
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getSnapRule).call(this).match(account) ??
1019
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getKeyringRule).call(this).match(account); // This one cannot fail.
1020
+ // Update controller's state.
1021
+ const walletId = result.wallet.id;
1022
+ let wallet = wallets[walletId];
1023
+ if (!wallet) {
1024
+ (0, logger_js_1.projectLogger)(`[${walletId}] Added as new wallet`);
1025
+ wallets[walletId] = {
1026
+ ...result.wallet,
1027
+ status: 'ready',
1028
+ groups: {},
1029
+ metadata: {
1030
+ name: '', // Will get updated later.
1031
+ ...result.wallet.metadata,
1032
+ },
1033
+ // We do need to type-cast since we're not narrowing `result` with
1034
+ // the union tag `result.wallet.type`.
1035
+ };
1036
+ wallet = wallets[walletId];
1037
+ // Trigger atomic sync for new wallet (only for entropy wallets)
1038
+ if (wallet.type === account_api_1.AccountWalletType.Entropy) {
1039
+ __classPrivateFieldGet(this, _AccountTreeController_backupAndSyncService, "f").enqueueSingleWalletSync(walletId);
1040
+ }
1041
+ }
1042
+ const groupId = result.group.id;
1043
+ let group = wallet.groups[groupId];
1044
+ const { type, id } = account;
1045
+ const sortOrder = group_js_1.ACCOUNT_TYPE_TO_SORT_ORDER[type];
1046
+ const created = !group;
1047
+ if (!group) {
1048
+ (0, logger_js_1.projectLogger)(`[${walletId}] Add new group: [${groupId}]`);
1049
+ wallet.groups[groupId] = {
1050
+ ...result.group,
1051
+ // Type-wise, we are guaranteed to always have at least 1 account.
1052
+ accounts: [id],
1053
+ metadata: {
1054
+ name: '',
1055
+ ...{ pinned: false, hidden: false, lastSelected: 0 }, // Default UI states
1056
+ ...result.group.metadata, // Allow rules to override defaults
1057
+ },
1058
+ // We do need to type-cast since we're not narrowing `result` with
1059
+ // the union tag `result.group.type`.
1060
+ };
1061
+ group = wallet.groups[groupId];
1062
+ // Map group ID to its containing wallet ID for efficient direct access
1063
+ __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").set(groupId, walletId);
1064
+ // Trigger atomic sync for new group (only for entropy wallets)
1065
+ if (wallet.type === account_api_1.AccountWalletType.Entropy) {
1066
+ __classPrivateFieldGet(this, _AccountTreeController_backupAndSyncService, "f").enqueueSingleGroupSync(groupId);
1067
+ }
1068
+ }
1069
+ else {
1070
+ group.accounts.push(id);
1071
+ // We need to do this at every insertion because race conditions can happen
1072
+ // during the account creation process where one provider completes before the other.
1073
+ // The discovery process in the service can also lead to some accounts being created "out of order".
1074
+ const { accounts } = group;
1075
+ accounts.sort(
1076
+ /* istanbul ignore next: Comparator branch execution (a===id vs b===id)
1077
+ * and return attribution vary across engines; final ordering is covered
1078
+ * by behavior tests. Ignoring the entire comparator avoids flaky line
1079
+ * coverage without reducing scenario coverage.
1080
+ */
1081
+ (a, b) => {
1082
+ const aSortOrder = a === id ? sortOrder : __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").get(a)?.sortOrder;
1083
+ const bSortOrder = b === id ? sortOrder : __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").get(b)?.sortOrder;
1084
+ return ((aSortOrder ?? group_js_1.MAX_SORT_ORDER) - (bSortOrder ?? group_js_1.MAX_SORT_ORDER));
1085
+ });
1086
+ }
1087
+ (0, logger_js_1.projectLogger)(`[${groupId}] Add new account: { id: "${account.id}", type: "${account.type}", address: "${account.address}"`);
1088
+ // Update the reverse mapping for this account.
1089
+ __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").set(account.id, {
1090
+ walletId: wallet.id,
1091
+ groupId: group.id,
1092
+ sortOrder,
1093
+ });
1094
+ return { walletId: wallet.id, groupId: group.id, created };
1095
+ }, _AccountTreeController_listAccounts = function _AccountTreeController_listAccounts() {
1096
+ return this.messenger.call('AccountsController:listMultichainAccounts');
1097
+ }, _AccountTreeController_assertAccountGroupExists = function _AccountTreeController_assertAccountGroupExists(groupId) {
1098
+ const exists = __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").has(groupId);
1099
+ if (!exists) {
1100
+ throw new Error('Account group not found in tree');
1101
+ }
1102
+ }, _AccountTreeController_assertAccountWalletExists = function _AccountTreeController_assertAccountWalletExists(walletId) {
1103
+ const exists = Boolean(this.state.accountTree.wallets[walletId]);
1104
+ if (!exists) {
1105
+ throw new Error('Account wallet not found in tree');
1106
+ }
1107
+ }, _AccountTreeController_assertAccountGroupNameIsUnique = function _AccountTreeController_assertAccountGroupNameIsUnique(groupId, name) {
1108
+ if (!(0, group_js_1.isAccountGroupNameUnique)(this.state, groupId, name)) {
1109
+ throw new Error('Account group name already exists');
1110
+ }
1111
+ }, _AccountTreeController_setSelectedAccountGroup = function _AccountTreeController_setSelectedAccountGroup(groupId, forwardSelectedAccount = true) {
1112
+ const previousSelectedAccountGroup = this.state.selectedAccountGroup;
1113
+ // Idempotent check - if the same group is already selected, do nothing
1114
+ if (previousSelectedAccountGroup === groupId) {
1115
+ return;
1116
+ }
1117
+ // Find the first account in this group to select
1118
+ const accountToSelect = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getAccountFromAccountGroupId).call(this, groupId);
1119
+ if (!accountToSelect) {
1120
+ throw new Error('No accounts found in group');
1121
+ }
1122
+ this.update((state) => {
1123
+ // Update our selected account group first.
1124
+ state.selectedAccountGroup = groupId;
1125
+ // Then update its associated metadata (lastSelected timestamp) to keep
1126
+ // track of the most recently selected groups.
1127
+ const now = Date.now();
1128
+ /* istanbul ignore next */
1129
+ if (!state.accountGroupsMetadata[groupId]) {
1130
+ state.accountGroupsMetadata[groupId] = {};
1131
+ }
1132
+ state.accountGroupsMetadata[groupId].lastSelected = now;
1133
+ const walletId = __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f").get(groupId);
1134
+ if (walletId) {
1135
+ state.accountTree.wallets[walletId].groups[groupId].metadata.lastSelected = now;
1136
+ }
1137
+ });
1138
+ (0, logger_js_1.projectLogger)(`Selected group is now: [${this.state.selectedAccountGroup}]`);
1139
+ this.messenger.publish(`${exports.controllerName}:selectedAccountGroupChange`, groupId, previousSelectedAccountGroup);
1140
+ if (forwardSelectedAccount) {
1141
+ // Update AccountsController - this will trigger selectedAccountChange event,
1142
+ // but our handler is idempotent so it won't cause infinite loop
1143
+ this.messenger.call('AccountsController:setSelectedAccount', accountToSelect.id);
1144
+ (0, logger_js_1.projectLogger)(`Selected account is now: ${accountToSelect.id}`);
1145
+ }
1146
+ }, _AccountTreeController_getDefaultSelectedAccountGroup = function _AccountTreeController_getDefaultSelectedAccountGroup(wallets) {
1147
+ const selectedAccount = this.messenger.call('AccountsController:getSelectedMultichainAccount');
1148
+ if (selectedAccount?.id) {
1149
+ const accountMapping = __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").get(selectedAccount.id);
1150
+ if (accountMapping) {
1151
+ const { groupId } = accountMapping;
1152
+ return groupId;
1153
+ }
1154
+ }
1155
+ // Default to the default group in case of errors.
1156
+ return __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getDefaultAccountGroupId).call(this, wallets);
1157
+ }, _AccountTreeController_handleSelectedAccountChange = function _AccountTreeController_handleSelectedAccountChange(account) {
1158
+ const accountMapping = __classPrivateFieldGet(this, _AccountTreeController_accountIdToContext, "f").get(account.id);
1159
+ if (!accountMapping) {
1160
+ // Account not in tree yet, might be during initialization
1161
+ return;
1162
+ }
1163
+ const { groupId } = accountMapping;
1164
+ // Avoid infinite loop since this method is triggered by selected account change.
1165
+ const forwardSelectedAccount = false;
1166
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_setSelectedAccountGroup).call(this, groupId, forwardSelectedAccount);
1167
+ }, _AccountTreeController_handleMultichainAccountWalletStatusChange = function _AccountTreeController_handleMultichainAccountWalletStatusChange(walletId, walletStatus) {
1168
+ this.update((state) => {
1169
+ const wallet = state.accountTree.wallets[walletId];
1170
+ if (wallet) {
1171
+ wallet.status = walletStatus;
1172
+ }
1173
+ });
1174
+ }, _AccountTreeController_getAccountGroup = function _AccountTreeController_getAccountGroup(groupId) {
1175
+ const found = Object.values(this.state.accountTree.wallets).find((wallet) => wallet.groups[groupId] !== undefined);
1176
+ return found?.groups[groupId];
1177
+ }, _AccountTreeController_getAccountFromAccountGroupId = function _AccountTreeController_getAccountFromAccountGroupId(groupId) {
1178
+ const group = __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getAccountGroup).call(this, groupId);
1179
+ if (group) {
1180
+ let candidateId;
1181
+ for (const id of group.accounts) {
1182
+ const account = this.messenger.call('AccountsController:getAccount', id);
1183
+ if (account) {
1184
+ candidateId ?? (candidateId = id);
1185
+ if ((0, keyring_api_1.isEvmAccountType)(account.type)) {
1186
+ // EVM accounts have a higher priority, so if we find any, we just
1187
+ // use that account!
1188
+ return account;
1189
+ }
1190
+ }
1191
+ }
1192
+ return candidateId
1193
+ ? this.messenger.call('AccountsController:getAccount', candidateId)
1194
+ : undefined;
1195
+ }
1196
+ return undefined;
1197
+ }, _AccountTreeController_getDefaultAccountGroupId = function _AccountTreeController_getDefaultAccountGroupId(wallets) {
1198
+ let candidate;
1199
+ for (const wallet of Object.values(wallets)) {
1200
+ for (const group of Object.values(wallet.groups)) {
1201
+ if (group.accounts.length === 0) {
1202
+ continue;
1203
+ }
1204
+ if (!candidate) {
1205
+ candidate = group;
1206
+ continue;
1207
+ }
1208
+ if (group.metadata.lastSelected > candidate.metadata.lastSelected) {
1209
+ candidate = group;
1210
+ }
1211
+ else if (group.metadata.lastSelected === candidate.metadata.lastSelected &&
1212
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_hasEvmAccount).call(this, group) &&
1213
+ !__classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_hasEvmAccount).call(this, candidate)) {
1214
+ candidate = group;
1215
+ }
1216
+ }
1217
+ }
1218
+ return candidate?.id ?? '';
1219
+ }, _AccountTreeController_hasEvmAccount = function _AccountTreeController_hasEvmAccount(group) {
1220
+ for (const id of group.accounts) {
1221
+ const account = this.messenger.call('AccountsController:getAccount', id);
1222
+ if (account && (0, keyring_api_1.isEvmAccountType)(account.type)) {
1223
+ return true;
1224
+ }
1225
+ }
1226
+ return false;
1227
+ }, _AccountTreeController_resolveNameConflict = function _AccountTreeController_resolveNameConflict(wallet, groupId, name) {
1228
+ let suffix = 2;
1229
+ let candidateName = `${name} (${suffix})`;
1230
+ // Keep incrementing suffix until we find a unique name
1231
+ while (!(0, group_js_1.isAccountGroupNameUniqueFromWallet)(wallet, groupId, candidateName)) {
1232
+ suffix += 1;
1233
+ candidateName = `${name} (${suffix})`;
1234
+ }
1235
+ return candidateName;
1236
+ }, _AccountTreeController_createBackupAndSyncContext = function _AccountTreeController_createBackupAndSyncContext() {
1237
+ return {
1238
+ ...__classPrivateFieldGet(this, _AccountTreeController_backupAndSyncConfig, "f"),
1239
+ controller: this,
1240
+ messenger: this.messenger,
1241
+ controllerStateUpdateFn: this.update.bind(this),
1242
+ traceFn: __classPrivateFieldGet(this, _AccountTreeController_trace, "f").bind(this),
1243
+ groupIdToWalletId: __classPrivateFieldGet(this, _AccountTreeController_groupIdToWalletId, "f"),
1244
+ mutationTracker: (0, index_js_3.createSyncMutationTracker)(),
1245
+ };
1246
+ };
1247
+ //# sourceMappingURL=AccountTreeController.cjs.map