@metamask-previews/account-tree-controller 7.6.1-preview-e57e5c3dc → 7.6.1-preview-c449b8da8

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 (78) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/AccountTreeController-method-action-types.cjs.map +1 -1
  3. package/dist/AccountTreeController-method-action-types.d.cts +34 -1
  4. package/dist/AccountTreeController-method-action-types.d.cts.map +1 -1
  5. package/dist/AccountTreeController-method-action-types.d.mts +34 -1
  6. package/dist/AccountTreeController-method-action-types.d.mts.map +1 -1
  7. package/dist/AccountTreeController-method-action-types.mjs.map +1 -1
  8. package/dist/AccountTreeController.cjs +42 -0
  9. package/dist/AccountTreeController.cjs.map +1 -1
  10. package/dist/AccountTreeController.d.cts +29 -0
  11. package/dist/AccountTreeController.d.cts.map +1 -1
  12. package/dist/AccountTreeController.d.mts +29 -0
  13. package/dist/AccountTreeController.d.mts.map +1 -1
  14. package/dist/AccountTreeController.mjs +42 -0
  15. package/dist/AccountTreeController.mjs.map +1 -1
  16. package/dist/index.cjs +10 -1
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +5 -1
  19. package/dist/index.d.cts.map +1 -1
  20. package/dist/index.d.mts +5 -1
  21. package/dist/index.d.mts.map +1 -1
  22. package/dist/index.mjs +3 -0
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/state/export.cjs +214 -0
  25. package/dist/state/export.cjs.map +1 -0
  26. package/dist/state/export.d.cts +40 -0
  27. package/dist/state/export.d.cts.map +1 -0
  28. package/dist/state/export.d.mts +40 -0
  29. package/dist/state/export.d.mts.map +1 -0
  30. package/dist/state/export.mjs +208 -0
  31. package/dist/state/export.mjs.map +1 -0
  32. package/dist/state/id-map.cjs +65 -0
  33. package/dist/state/id-map.cjs.map +1 -0
  34. package/dist/state/id-map.d.cts +41 -0
  35. package/dist/state/id-map.d.cts.map +1 -0
  36. package/dist/state/id-map.d.mts +41 -0
  37. package/dist/state/id-map.d.mts.map +1 -0
  38. package/dist/state/id-map.mjs +61 -0
  39. package/dist/state/id-map.mjs.map +1 -0
  40. package/dist/state/import.cjs +268 -0
  41. package/dist/state/import.cjs.map +1 -0
  42. package/dist/state/import.d.cts +29 -0
  43. package/dist/state/import.d.cts.map +1 -0
  44. package/dist/state/import.d.mts +29 -0
  45. package/dist/state/import.d.mts.map +1 -0
  46. package/dist/state/import.mjs +264 -0
  47. package/dist/state/import.mjs.map +1 -0
  48. package/dist/state/payload.cjs +169 -0
  49. package/dist/state/payload.cjs.map +1 -0
  50. package/dist/state/payload.d.cts +288 -0
  51. package/dist/state/payload.d.cts.map +1 -0
  52. package/dist/state/payload.d.mts +288 -0
  53. package/dist/state/payload.d.mts.map +1 -0
  54. package/dist/state/payload.mjs +162 -0
  55. package/dist/state/payload.mjs.map +1 -0
  56. package/dist/state/snapshot.cjs +202 -0
  57. package/dist/state/snapshot.cjs.map +1 -0
  58. package/dist/state/snapshot.d.cts +120 -0
  59. package/dist/state/snapshot.d.cts.map +1 -0
  60. package/dist/state/snapshot.d.mts +120 -0
  61. package/dist/state/snapshot.d.mts.map +1 -0
  62. package/dist/state/snapshot.mjs +198 -0
  63. package/dist/state/snapshot.mjs.map +1 -0
  64. package/dist/state/utils.cjs +68 -0
  65. package/dist/state/utils.cjs.map +1 -0
  66. package/dist/state/utils.d.cts +49 -0
  67. package/dist/state/utils.d.cts.map +1 -0
  68. package/dist/state/utils.d.mts +49 -0
  69. package/dist/state/utils.d.mts.map +1 -0
  70. package/dist/state/utils.mjs +61 -0
  71. package/dist/state/utils.mjs.map +1 -0
  72. package/dist/types.cjs.map +1 -1
  73. package/dist/types.d.cts +3 -3
  74. package/dist/types.d.cts.map +1 -1
  75. package/dist/types.d.mts +3 -3
  76. package/dist/types.d.mts.map +1 -1
  77. package/dist/types.mjs.map +1 -1
  78. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,qBAAoB;AACvD,YAAY,EAAE,kBAAkB,EAAE,oBAAmB;AACrD,OAAO,EAAE,wBAAwB,EAAE,oBAAmB;AAEtD,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,qDAAoD;AAErD,YAAY,EACV,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,EAC5B,qCAAqC,EACrC,2CAA2C,EAC3C,oDAAoD,EACpD,6CAA6C,EAC7C,6CAA6C,EAC7C,6CAA6C,EAC7C,2BAA2B,EAC3B,8BAA8B,GAC/B,oBAAmB;AAEpB,YAAY,EACV,iDAAiD,EACjD,kDAAkD,EAClD,8DAA8D,EAC9D,6DAA6D,EAC7D,gDAAgD,EAChD,4CAA4C,EAC5C,kDAAkD,EAClD,kDAAkD,EAClD,6DAA6D,EAC7D,8CAA8C,EAC9C,+CAA+C,EAC/C,gDAAgD,EAChD,gDAAgD,EAChD,qCAAqC,EACrC,8CAA8C,EAC9C,yDAAyD,EACzD,+BAA+B,EAC/B,iCAAiC,GAClC,wDAAuD;AAExD,YAAY,EAAE,cAAc,EAAE,oCAAmC;AAEjE,OAAO,EACL,qBAAqB,EACrB,oCAAoC,GACrC,oCAAmC"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,qBAAoB;AACvD,YAAY,EAAE,kBAAkB,EAAE,oBAAmB;AACrD,OAAO,EAAE,wBAAwB,EAAE,oBAAmB;AAEtD,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,qDAAoD;AAErD,YAAY,EACV,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,EAC5B,qCAAqC,EACrC,2CAA2C,EAC3C,oDAAoD,EACpD,6CAA6C,EAC7C,6CAA6C,EAC7C,6CAA6C,EAC7C,2BAA2B,EAC3B,8BAA8B,GAC/B,oBAAmB;AAEpB,YAAY,EACV,iDAAiD,EACjD,kDAAkD,EAClD,8DAA8D,EAC9D,6DAA6D,EAC7D,gDAAgD,EAChD,4CAA4C,EAC5C,kDAAkD,EAClD,kDAAkD,EAClD,6DAA6D,EAC7D,8CAA8C,EAC9C,+CAA+C,EAC/C,gDAAgD,EAChD,gDAAgD,EAChD,qCAAqC,EACrC,8CAA8C,EAC9C,yDAAyD,EACzD,+BAA+B,EAC/B,iCAAiC,EACjC,sCAAsC,EACtC,sCAAsC,GACvC,wDAAuD;AAExD,YAAY,EAAE,cAAc,EAAE,oCAAmC;AAEjE,OAAO,EACL,qBAAqB,EACrB,oCAAoC,GACrC,oCAAmC;AAEpC,YAAY,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,EAC5B,8BAA8B,EAC9B,+BAA+B,EAC/B,iCAAiC,EACjC,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,GACnB,4BAA2B;AAE5B,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,GACzB,4BAA2B;AAE5B,OAAO,EAAE,mBAAmB,EAAE,6BAA4B;AAC1D,OAAO,EAAE,KAAK,EAAE,2BAA0B"}
package/dist/index.d.mts CHANGED
@@ -3,7 +3,11 @@ export type { AccountGroupObject } from "./group.mjs";
3
3
  export { isAccountGroupNameUnique } from "./group.mjs";
4
4
  export { USER_STORAGE_GROUPS_FEATURE_KEY, USER_STORAGE_WALLETS_FEATURE_KEY, } from "./backup-and-sync/user-storage/constants.mjs";
5
5
  export type { AccountTreeControllerState, AccountTreeControllerGetStateAction, AccountTreeControllerActions, AccountTreeControllerStateChangeEvent, AccountTreeControllerAccountTreeChangeEvent, AccountTreeControllerSelectedAccountGroupChangeEvent, AccountTreeControllerAccountGroupCreatedEvent, AccountTreeControllerAccountGroupUpdatedEvent, AccountTreeControllerAccountGroupRemovedEvent, AccountTreeControllerEvents, AccountTreeControllerMessenger, } from "./types.mjs";
6
- export type { AccountTreeControllerGetAccountWalletObjectAction, AccountTreeControllerGetAccountWalletObjectsAction, AccountTreeControllerGetAccountsFromSelectedAccountGroupAction, AccountTreeControllerGetAccountFromSelectedAccountGroupAction, AccountTreeControllerGetAccountGroupObjectAction, AccountTreeControllerGetAccountContextAction, AccountTreeControllerGetSelectedAccountGroupAction, AccountTreeControllerSetSelectedAccountGroupAction, AccountTreeControllerSetSelectedAccountGroupByAccountIdAction, AccountTreeControllerSetAccountGroupNameAction, AccountTreeControllerSetAccountWalletNameAction, AccountTreeControllerSetAccountGroupPinnedAction, AccountTreeControllerSetAccountGroupHiddenAction, AccountTreeControllerClearStateAction, AccountTreeControllerSyncWithUserStorageAction, AccountTreeControllerSyncWithUserStorageAtLeastOnceAction, AccountTreeControllerInitAction, AccountTreeControllerReinitAction, } from "./AccountTreeController-method-action-types.mjs";
6
+ export type { AccountTreeControllerGetAccountWalletObjectAction, AccountTreeControllerGetAccountWalletObjectsAction, AccountTreeControllerGetAccountsFromSelectedAccountGroupAction, AccountTreeControllerGetAccountFromSelectedAccountGroupAction, AccountTreeControllerGetAccountGroupObjectAction, AccountTreeControllerGetAccountContextAction, AccountTreeControllerGetSelectedAccountGroupAction, AccountTreeControllerSetSelectedAccountGroupAction, AccountTreeControllerSetSelectedAccountGroupByAccountIdAction, AccountTreeControllerSetAccountGroupNameAction, AccountTreeControllerSetAccountWalletNameAction, AccountTreeControllerSetAccountGroupPinnedAction, AccountTreeControllerSetAccountGroupHiddenAction, AccountTreeControllerClearStateAction, AccountTreeControllerSyncWithUserStorageAction, AccountTreeControllerSyncWithUserStorageAtLeastOnceAction, AccountTreeControllerInitAction, AccountTreeControllerReinitAction, AccountTreeControllerExportStateAction, AccountTreeControllerImportStateAction, } from "./AccountTreeController-method-action-types.mjs";
7
7
  export type { AccountContext } from "./AccountTreeController.mjs";
8
8
  export { AccountTreeController, getDefaultAccountTreeControllerState, } from "./AccountTreeController.mjs";
9
+ export type { AccountTreePayload, AccountTreePayloadStructType, AccountWalletMnemonicPayload, AccountWalletPrivateKeyPayload, AccountWalletMnemonicGroupEntry, AccountWalletPrivateKeyGroupEntry, AccountWalletPayloadId, AccountGroupPayloadId, AccountTreeSnapshotWallet, AccountTreeSnapshotGroup, ExportStateOptions, } from "./state/payload.mjs";
10
+ export { AccountWalletPayloadType, AccountWalletPrivateKeyEncoding, AccountTreePayloadStruct, assertAccountTreePayload, } from "./state/payload.mjs";
11
+ export { AccountTreeSnapshot } from "./state/snapshot.mjs";
12
+ export { IdMap } from "./state/id-map.mjs";
9
13
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,qBAAoB;AACvD,YAAY,EAAE,kBAAkB,EAAE,oBAAmB;AACrD,OAAO,EAAE,wBAAwB,EAAE,oBAAmB;AAEtD,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,qDAAoD;AAErD,YAAY,EACV,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,EAC5B,qCAAqC,EACrC,2CAA2C,EAC3C,oDAAoD,EACpD,6CAA6C,EAC7C,6CAA6C,EAC7C,6CAA6C,EAC7C,2BAA2B,EAC3B,8BAA8B,GAC/B,oBAAmB;AAEpB,YAAY,EACV,iDAAiD,EACjD,kDAAkD,EAClD,8DAA8D,EAC9D,6DAA6D,EAC7D,gDAAgD,EAChD,4CAA4C,EAC5C,kDAAkD,EAClD,kDAAkD,EAClD,6DAA6D,EAC7D,8CAA8C,EAC9C,+CAA+C,EAC/C,gDAAgD,EAChD,gDAAgD,EAChD,qCAAqC,EACrC,8CAA8C,EAC9C,yDAAyD,EACzD,+BAA+B,EAC/B,iCAAiC,GAClC,wDAAuD;AAExD,YAAY,EAAE,cAAc,EAAE,oCAAmC;AAEjE,OAAO,EACL,qBAAqB,EACrB,oCAAoC,GACrC,oCAAmC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,qBAAoB;AACvD,YAAY,EAAE,kBAAkB,EAAE,oBAAmB;AACrD,OAAO,EAAE,wBAAwB,EAAE,oBAAmB;AAEtD,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,qDAAoD;AAErD,YAAY,EACV,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,EAC5B,qCAAqC,EACrC,2CAA2C,EAC3C,oDAAoD,EACpD,6CAA6C,EAC7C,6CAA6C,EAC7C,6CAA6C,EAC7C,2BAA2B,EAC3B,8BAA8B,GAC/B,oBAAmB;AAEpB,YAAY,EACV,iDAAiD,EACjD,kDAAkD,EAClD,8DAA8D,EAC9D,6DAA6D,EAC7D,gDAAgD,EAChD,4CAA4C,EAC5C,kDAAkD,EAClD,kDAAkD,EAClD,6DAA6D,EAC7D,8CAA8C,EAC9C,+CAA+C,EAC/C,gDAAgD,EAChD,gDAAgD,EAChD,qCAAqC,EACrC,8CAA8C,EAC9C,yDAAyD,EACzD,+BAA+B,EAC/B,iCAAiC,EACjC,sCAAsC,EACtC,sCAAsC,GACvC,wDAAuD;AAExD,YAAY,EAAE,cAAc,EAAE,oCAAmC;AAEjE,OAAO,EACL,qBAAqB,EACrB,oCAAoC,GACrC,oCAAmC;AAEpC,YAAY,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,EAC5B,8BAA8B,EAC9B,+BAA+B,EAC/B,iCAAiC,EACjC,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,GACnB,4BAA2B;AAE5B,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,GACzB,4BAA2B;AAE5B,OAAO,EAAE,mBAAmB,EAAE,6BAA4B;AAC1D,OAAO,EAAE,KAAK,EAAE,2BAA0B"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,7 @@
1
1
  export { isAccountGroupNameUnique } from "./group.mjs";
2
2
  export { USER_STORAGE_GROUPS_FEATURE_KEY, USER_STORAGE_WALLETS_FEATURE_KEY } from "./backup-and-sync/user-storage/constants.mjs";
3
3
  export { AccountTreeController, getDefaultAccountTreeControllerState } from "./AccountTreeController.mjs";
4
+ export { AccountWalletPayloadType, AccountWalletPrivateKeyEncoding, AccountTreePayloadStruct, assertAccountTreePayload } from "./state/payload.mjs";
5
+ export { AccountTreeSnapshot } from "./state/snapshot.mjs";
6
+ export { IdMap } from "./state/id-map.mjs";
4
7
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,oBAAmB;AAEtD,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,EACjC,qDAAoD;AAuCrD,OAAO,EACL,qBAAqB,EACrB,oCAAoC,EACrC,oCAAmC","sourcesContent":["export type { AccountWalletObject } from './wallet.js';\nexport type { AccountGroupObject } from './group.js';\nexport { isAccountGroupNameUnique } from './group.js';\n\nexport {\n USER_STORAGE_GROUPS_FEATURE_KEY,\n USER_STORAGE_WALLETS_FEATURE_KEY,\n} from './backup-and-sync/user-storage/constants.js';\n\nexport type {\n AccountTreeControllerState,\n AccountTreeControllerGetStateAction,\n AccountTreeControllerActions,\n AccountTreeControllerStateChangeEvent,\n AccountTreeControllerAccountTreeChangeEvent,\n AccountTreeControllerSelectedAccountGroupChangeEvent,\n AccountTreeControllerAccountGroupCreatedEvent,\n AccountTreeControllerAccountGroupUpdatedEvent,\n AccountTreeControllerAccountGroupRemovedEvent,\n AccountTreeControllerEvents,\n AccountTreeControllerMessenger,\n} from './types.js';\n\nexport type {\n AccountTreeControllerGetAccountWalletObjectAction,\n AccountTreeControllerGetAccountWalletObjectsAction,\n AccountTreeControllerGetAccountsFromSelectedAccountGroupAction,\n AccountTreeControllerGetAccountFromSelectedAccountGroupAction,\n AccountTreeControllerGetAccountGroupObjectAction,\n AccountTreeControllerGetAccountContextAction,\n AccountTreeControllerGetSelectedAccountGroupAction,\n AccountTreeControllerSetSelectedAccountGroupAction,\n AccountTreeControllerSetSelectedAccountGroupByAccountIdAction,\n AccountTreeControllerSetAccountGroupNameAction,\n AccountTreeControllerSetAccountWalletNameAction,\n AccountTreeControllerSetAccountGroupPinnedAction,\n AccountTreeControllerSetAccountGroupHiddenAction,\n AccountTreeControllerClearStateAction,\n AccountTreeControllerSyncWithUserStorageAction,\n AccountTreeControllerSyncWithUserStorageAtLeastOnceAction,\n AccountTreeControllerInitAction,\n AccountTreeControllerReinitAction,\n} from './AccountTreeController-method-action-types.js';\n\nexport type { AccountContext } from './AccountTreeController.js';\n\nexport {\n AccountTreeController,\n getDefaultAccountTreeControllerState,\n} from './AccountTreeController.js';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,oBAAmB;AAEtD,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,EACjC,qDAAoD;AAyCrD,OAAO,EACL,qBAAqB,EACrB,oCAAoC,EACrC,oCAAmC;AAgBpC,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,EACzB,4BAA2B;AAE5B,OAAO,EAAE,mBAAmB,EAAE,6BAA4B;AAC1D,OAAO,EAAE,KAAK,EAAE,2BAA0B","sourcesContent":["export type { AccountWalletObject } from './wallet.js';\nexport type { AccountGroupObject } from './group.js';\nexport { isAccountGroupNameUnique } from './group.js';\n\nexport {\n USER_STORAGE_GROUPS_FEATURE_KEY,\n USER_STORAGE_WALLETS_FEATURE_KEY,\n} from './backup-and-sync/user-storage/constants.js';\n\nexport type {\n AccountTreeControllerState,\n AccountTreeControllerGetStateAction,\n AccountTreeControllerActions,\n AccountTreeControllerStateChangeEvent,\n AccountTreeControllerAccountTreeChangeEvent,\n AccountTreeControllerSelectedAccountGroupChangeEvent,\n AccountTreeControllerAccountGroupCreatedEvent,\n AccountTreeControllerAccountGroupUpdatedEvent,\n AccountTreeControllerAccountGroupRemovedEvent,\n AccountTreeControllerEvents,\n AccountTreeControllerMessenger,\n} from './types.js';\n\nexport type {\n AccountTreeControllerGetAccountWalletObjectAction,\n AccountTreeControllerGetAccountWalletObjectsAction,\n AccountTreeControllerGetAccountsFromSelectedAccountGroupAction,\n AccountTreeControllerGetAccountFromSelectedAccountGroupAction,\n AccountTreeControllerGetAccountGroupObjectAction,\n AccountTreeControllerGetAccountContextAction,\n AccountTreeControllerGetSelectedAccountGroupAction,\n AccountTreeControllerSetSelectedAccountGroupAction,\n AccountTreeControllerSetSelectedAccountGroupByAccountIdAction,\n AccountTreeControllerSetAccountGroupNameAction,\n AccountTreeControllerSetAccountWalletNameAction,\n AccountTreeControllerSetAccountGroupPinnedAction,\n AccountTreeControllerSetAccountGroupHiddenAction,\n AccountTreeControllerClearStateAction,\n AccountTreeControllerSyncWithUserStorageAction,\n AccountTreeControllerSyncWithUserStorageAtLeastOnceAction,\n AccountTreeControllerInitAction,\n AccountTreeControllerReinitAction,\n AccountTreeControllerExportStateAction,\n AccountTreeControllerImportStateAction,\n} from './AccountTreeController-method-action-types.js';\n\nexport type { AccountContext } from './AccountTreeController.js';\n\nexport {\n AccountTreeController,\n getDefaultAccountTreeControllerState,\n} from './AccountTreeController.js';\n\nexport type {\n AccountTreePayload,\n AccountTreePayloadStructType,\n AccountWalletMnemonicPayload,\n AccountWalletPrivateKeyPayload,\n AccountWalletMnemonicGroupEntry,\n AccountWalletPrivateKeyGroupEntry,\n AccountWalletPayloadId,\n AccountGroupPayloadId,\n AccountTreeSnapshotWallet,\n AccountTreeSnapshotGroup,\n ExportStateOptions,\n} from './state/payload.js';\n\nexport {\n AccountWalletPayloadType,\n AccountWalletPrivateKeyEncoding,\n AccountTreePayloadStruct,\n assertAccountTreePayload,\n} from './state/payload.js';\n\nexport { AccountTreeSnapshot } from './state/snapshot.js';\nexport { IdMap } from './state/id-map.js';\n"]}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exportState = exports.isPrivateKeyWalletObject = exports.isMnemonicWalletObject = void 0;
4
+ const account_api_1 = require("@metamask/account-api");
5
+ const v2_1 = require("@metamask/eth-hd-keyring/v2");
6
+ const keyring_api_1 = require("@metamask/keyring-api");
7
+ const keyring_controller_1 = require("@metamask/keyring-controller");
8
+ const id_map_js_1 = require("./id-map.cjs");
9
+ const payload_js_1 = require("./payload.cjs");
10
+ const snapshot_js_1 = require("./snapshot.cjs");
11
+ const utils_js_1 = require("./utils.cjs");
12
+ /**
13
+ * Returns `true` if `wallet` is an HD entropy wallet ({@link AccountWalletEntropyObject}).
14
+ *
15
+ * @param wallet - The wallet object to test.
16
+ * @returns Type predicate narrowing to {@link AccountWalletEntropyObject}.
17
+ */
18
+ function isMnemonicWalletObject(wallet) {
19
+ return wallet.type === account_api_1.AccountWalletType.Entropy;
20
+ }
21
+ exports.isMnemonicWalletObject = isMnemonicWalletObject;
22
+ /**
23
+ * Returns `true` if `wallet` is an imported private-key wallet
24
+ * ({@link AccountWalletKeyringObject} with keyring type {@link KeyringTypes.simple}).
25
+ *
26
+ * @param wallet - The wallet object to test.
27
+ * @returns Type predicate narrowing to {@link AccountWalletKeyringObject}.
28
+ */
29
+ function isPrivateKeyWalletObject(wallet) {
30
+ return (wallet.type === account_api_1.AccountWalletType.Keyring &&
31
+ wallet.metadata.keyring.type === keyring_controller_1.KeyringTypes.simple);
32
+ }
33
+ exports.isPrivateKeyWalletObject = isPrivateKeyWalletObject;
34
+ /**
35
+ * Exports a single entropy (HD) wallet object as an {@link AccountWalletMnemonicPayload}.
36
+ *
37
+ * Calls `KeyringController:withKeyringV2Unsafe` to derive the stable entropy source ID
38
+ * via {@link HdKeyring.toEntropySourceId} and, when `includeSecrets` is `true`, to read
39
+ * the raw mnemonic bytes.
40
+ *
41
+ * @param context - Export context.
42
+ * @param walletObj - The local entropy wallet to export.
43
+ * @param includeSecrets - When `true`, the BIP-39 mnemonic is included in the payload.
44
+ * @param idMap - ID map to populate with local↔payload ID pairs for this wallet and its groups.
45
+ * @returns The mnemonic wallet payload entry.
46
+ * @throws If `includeSecrets` is `true` but the mnemonic cannot be read from the keyring.
47
+ */
48
+ async function exportMnemonicWalletObject(context, walletObj, includeSecrets, idMap) {
49
+ const result = await context.messenger.call('KeyringController:withKeyringV2Unsafe',
50
+ // The local wallet entropy ID is the keyring ID.
51
+ { id: walletObj.metadata.entropy.id }, async ({ keyring }) => {
52
+ const hdKeyring = keyring;
53
+ const includeMnemonic = includeSecrets &&
54
+ hdKeyring.mnemonic !== null &&
55
+ hdKeyring.mnemonic !== undefined;
56
+ return {
57
+ // Compute the stable entropy source ID from the keyring's mnemonic (BIP-39 seed).
58
+ entropySourceId: await hdKeyring.toEntropySourceId(),
59
+ // No need to include the mnemonic here if we're not exporting secrets.
60
+ mnemonic: includeMnemonic ? hdKeyring.mnemonic : undefined,
61
+ };
62
+ });
63
+ const { entropySourceId, mnemonic } = result;
64
+ // We use the stable entropy source ID as the payload wallet ID, rather than the local wallet ID, to
65
+ // ensure that the exported snapshot is stable across different installations and sessions.
66
+ const wallet = {
67
+ type: payload_js_1.AccountWalletPayloadType.Mnemonic,
68
+ id: (0, payload_js_1.toWalletPayloadId)(entropySourceId),
69
+ metadata: { name: walletObj.metadata.name },
70
+ groups: [],
71
+ };
72
+ idMap.add(walletObj.id, wallet.id);
73
+ for (const groupObj of Object.values(walletObj.groups)) {
74
+ const { groupIndex } = groupObj.metadata.entropy;
75
+ const group = {
76
+ id: (0, payload_js_1.toGroupPayloadId)(wallet.id, groupIndex),
77
+ groupIndex,
78
+ metadata: {
79
+ name: groupObj.metadata.name,
80
+ pinned: groupObj.metadata.pinned,
81
+ hidden: groupObj.metadata.hidden,
82
+ },
83
+ };
84
+ idMap.add(groupObj.id, group.id);
85
+ wallet.groups.push(group);
86
+ }
87
+ // Sort the groups by their `groupIndex` to ensure a stable order in the exported payload.
88
+ wallet.groups.sort((group, otherGroup) => group.groupIndex - otherGroup.groupIndex);
89
+ // This should never happen, but we check just in case.
90
+ if (includeSecrets) {
91
+ if (mnemonic === undefined) {
92
+ throw new Error(`Failed to export mnemonic for wallet ${wallet.id}`);
93
+ }
94
+ wallet.value = (0, utils_js_1.encodeBytes)(mnemonic);
95
+ }
96
+ return wallet;
97
+ }
98
+ /**
99
+ * Exports a single simple-keyring wallet object as an {@link AccountWalletPrivateKeyPayload}.
100
+ *
101
+ * All groups from the wallet are merged into the `'private-key'` singleton payload entry.
102
+ * When `includeSecrets` is `true`, each group's private key is exported via
103
+ * `KeyringController:withKeyringV2`.
104
+ *
105
+ * @param context - Export context.
106
+ * @param walletObj - The local simple-keyring wallet to export.
107
+ * @param includeSecrets - When `true`, private keys are included in the payload.
108
+ * @param idMap - ID map to populate with local↔payload ID pairs for this wallet and its groups.
109
+ * @returns The private-key wallet payload entry.
110
+ * @throws If `includeSecrets` is `true` but a private key cannot be exported for an account.
111
+ */
112
+ async function exportPrivateKeyWalletObject(context, walletObj, includeSecrets, idMap) {
113
+ // We use a singleton wallet ID for private keys.
114
+ const wallet = {
115
+ type: payload_js_1.AccountWalletPayloadType.PrivateKey,
116
+ id: (0, payload_js_1.toWalletPayloadId)(payload_js_1.AccountWalletPayloadType.PrivateKey),
117
+ metadata: { name: walletObj.metadata.name },
118
+ groups: [],
119
+ };
120
+ for (const groupObj of Object.values(walletObj.groups)) {
121
+ const accountId = groupObj.accounts[0];
122
+ if (!accountId) {
123
+ continue;
124
+ }
125
+ const account = context.messenger.call('AccountsController:getAccount', accountId);
126
+ if (!account) {
127
+ continue;
128
+ }
129
+ const { address } = account;
130
+ let exported;
131
+ if (includeSecrets) {
132
+ const result = await context.messenger.call('KeyringController:withKeyringV2', { address }, async ({ keyring }) => {
133
+ if (!keyring.exportAccount) {
134
+ throw new Error(`Keyring for account ${accountId} does not support exportAccount`);
135
+ }
136
+ return keyring.exportAccount(accountId, {
137
+ type: 'private-key',
138
+ encoding: payload_js_1.AccountWalletPrivateKeyEncoding.Hexadecimal,
139
+ });
140
+ });
141
+ exported = result;
142
+ }
143
+ const group = {
144
+ id: (0, payload_js_1.toGroupPayloadId)(wallet.id, address),
145
+ metadata: {
146
+ name: groupObj.metadata.name,
147
+ pinned: groupObj.metadata.pinned,
148
+ hidden: groupObj.metadata.hidden,
149
+ },
150
+ };
151
+ if (includeSecrets) {
152
+ if (!exported) {
153
+ throw new Error(`Failed to export private key for account ${accountId}`);
154
+ }
155
+ group.value = {
156
+ privateKey: (0, utils_js_1.encodeBytes)(new TextEncoder().encode(exported.privateKey)),
157
+ encoding: exported.encoding,
158
+ type: keyring_api_1.EthAccountType.Eoa,
159
+ };
160
+ }
161
+ idMap.add(groupObj.id, group.id);
162
+ wallet.groups.push(group);
163
+ }
164
+ return wallet;
165
+ }
166
+ /**
167
+ * Builds an {@link AccountTreeSnapshot} from the current controller state.
168
+ *
169
+ * Iterates over all wallets in the tree:
170
+ * - {@link AccountWalletType.Entropy} (HD) wallets -> `'mnemonic'` payload entries.
171
+ * - {@link AccountWalletType.Keyring} wallets of type `simple` -> `'private-key'` payload entries.
172
+ * - Snap wallets and hardware keyrings are skipped in v1.
173
+ *
174
+ * @param context - Export context providing state and messenger access.
175
+ * @param options - Export options.
176
+ * @returns A promise that resolves to the built snapshot.
177
+ * @throws If `options.includeSecrets` is `true` and the vault is locked.
178
+ */
179
+ async function exportState(context, options = {}) {
180
+ const state = context.getState();
181
+ const includeSecrets = options.includeSecrets ?? false;
182
+ const { isUnlocked } = context.messenger.call('KeyringController:getState');
183
+ if (includeSecrets && !isUnlocked) {
184
+ throw new Error('Cannot include secrets in export when vault is locked');
185
+ }
186
+ const idMap = new id_map_js_1.IdMap();
187
+ const entries = [];
188
+ let privateKeyWallet;
189
+ for (const walletObj of Object.values(state.accountTree.wallets)) {
190
+ if (isMnemonicWalletObject(walletObj)) {
191
+ entries.push(await exportMnemonicWalletObject(context, walletObj, includeSecrets, idMap));
192
+ }
193
+ else if (isPrivateKeyWalletObject(walletObj)) {
194
+ const exported = await exportPrivateKeyWalletObject(context, walletObj, includeSecrets, idMap);
195
+ if (privateKeyWallet) {
196
+ privateKeyWallet.groups.push(...exported.groups);
197
+ }
198
+ else {
199
+ privateKeyWallet = exported;
200
+ // Register only once, since all private keys are exported into the same wallet entry.
201
+ idMap.add(walletObj.id, exported.id);
202
+ }
203
+ }
204
+ else {
205
+ // AccountWalletType.Snap and hardware keyrings: skipped for now.
206
+ }
207
+ }
208
+ if (privateKeyWallet) {
209
+ entries.push(privateKeyWallet);
210
+ }
211
+ return new snapshot_js_1.AccountTreeSnapshot(entries, idMap);
212
+ }
213
+ exports.exportState = exportState;
214
+ //# sourceMappingURL=export.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.cjs","sourceRoot":"","sources":["../../src/state/export.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountWalletType } from '@metamask/account-api';\nimport { HdKeyring } from '@metamask/eth-hd-keyring/v2';\nimport { EthAccountType } from '@metamask/keyring-api';\nimport { PrivateKeyExportedAccount } from '@metamask/keyring-api/v2';\nimport { KeyringTypes } from '@metamask/keyring-controller';\n\nimport type {\n AccountTreeControllerMessenger,\n AccountTreeControllerState,\n} from '../types.js';\nimport type { AccountWalletObject } from '../wallet.js';\nimport {\n AccountWalletEntropyObject,\n AccountWalletKeyringObject,\n} from '../wallet.js';\nimport { IdMap } from './id-map.js';\nimport type {\n AccountTreeWalletEntry,\n AccountWalletMnemonicGroupEntry,\n AccountWalletMnemonicPayload,\n AccountWalletPrivateKeyGroupEntry,\n AccountWalletPrivateKeyPayload,\n ExportStateOptions,\n} from './payload.js';\nimport {\n AccountWalletPayloadType,\n AccountWalletPrivateKeyEncoding,\n toWalletPayloadId,\n toGroupPayloadId,\n} from './payload.js';\nimport { AccountTreeSnapshot } from './snapshot.js';\nimport { encodeBytes } from './utils.js';\n\n/**\n * Returns `true` if `wallet` is an HD entropy wallet ({@link AccountWalletEntropyObject}).\n *\n * @param wallet - The wallet object to test.\n * @returns Type predicate narrowing to {@link AccountWalletEntropyObject}.\n */\nexport function isMnemonicWalletObject(\n wallet: AccountWalletObject,\n): wallet is AccountWalletEntropyObject {\n return wallet.type === AccountWalletType.Entropy;\n}\n\n/**\n * Returns `true` if `wallet` is an imported private-key wallet\n * ({@link AccountWalletKeyringObject} with keyring type {@link KeyringTypes.simple}).\n *\n * @param wallet - The wallet object to test.\n * @returns Type predicate narrowing to {@link AccountWalletKeyringObject}.\n */\nexport function isPrivateKeyWalletObject(\n wallet: AccountWalletObject,\n): wallet is AccountWalletKeyringObject {\n return (\n wallet.type === AccountWalletType.Keyring &&\n wallet.metadata.keyring.type === KeyringTypes.simple\n );\n}\n\n/** Context required by {@link exportState}. */\nexport type ExportContext = {\n getState: () => AccountTreeControllerState;\n messenger: AccountTreeControllerMessenger;\n};\n\n/**\n * Exports a single entropy (HD) wallet object as an {@link AccountWalletMnemonicPayload}.\n *\n * Calls `KeyringController:withKeyringV2Unsafe` to derive the stable entropy source ID\n * via {@link HdKeyring.toEntropySourceId} and, when `includeSecrets` is `true`, to read\n * the raw mnemonic bytes.\n *\n * @param context - Export context.\n * @param walletObj - The local entropy wallet to export.\n * @param includeSecrets - When `true`, the BIP-39 mnemonic is included in the payload.\n * @param idMap - ID map to populate with local↔payload ID pairs for this wallet and its groups.\n * @returns The mnemonic wallet payload entry.\n * @throws If `includeSecrets` is `true` but the mnemonic cannot be read from the keyring.\n */\nasync function exportMnemonicWalletObject(\n context: ExportContext,\n walletObj: AccountWalletEntropyObject,\n includeSecrets: boolean,\n idMap: IdMap,\n): Promise<AccountWalletMnemonicPayload> {\n const result = await context.messenger.call(\n 'KeyringController:withKeyringV2Unsafe',\n // The local wallet entropy ID is the keyring ID.\n { id: walletObj.metadata.entropy.id },\n async ({ keyring }) => {\n const hdKeyring = keyring as HdKeyring;\n const includeMnemonic =\n includeSecrets &&\n hdKeyring.mnemonic !== null &&\n hdKeyring.mnemonic !== undefined;\n\n return {\n // Compute the stable entropy source ID from the keyring's mnemonic (BIP-39 seed).\n entropySourceId: await hdKeyring.toEntropySourceId(),\n // No need to include the mnemonic here if we're not exporting secrets.\n mnemonic: includeMnemonic ? hdKeyring.mnemonic : undefined,\n };\n },\n );\n const { entropySourceId, mnemonic } = result as {\n entropySourceId: string;\n mnemonic?: Uint8Array;\n };\n\n // We use the stable entropy source ID as the payload wallet ID, rather than the local wallet ID, to\n // ensure that the exported snapshot is stable across different installations and sessions.\n const wallet: AccountWalletMnemonicPayload = {\n type: AccountWalletPayloadType.Mnemonic,\n id: toWalletPayloadId(entropySourceId),\n metadata: { name: walletObj.metadata.name },\n groups: [],\n };\n\n idMap.add(walletObj.id, wallet.id);\n\n for (const groupObj of Object.values(walletObj.groups)) {\n const { groupIndex } = groupObj.metadata.entropy;\n\n const group: AccountWalletMnemonicGroupEntry = {\n id: toGroupPayloadId(wallet.id, groupIndex),\n groupIndex,\n metadata: {\n name: groupObj.metadata.name,\n pinned: groupObj.metadata.pinned,\n hidden: groupObj.metadata.hidden,\n },\n };\n\n idMap.add(groupObj.id, group.id);\n\n wallet.groups.push(group);\n }\n\n // Sort the groups by their `groupIndex` to ensure a stable order in the exported payload.\n wallet.groups.sort(\n (group, otherGroup) => group.groupIndex - otherGroup.groupIndex,\n );\n\n // This should never happen, but we check just in case.\n if (includeSecrets) {\n if (mnemonic === undefined) {\n throw new Error(`Failed to export mnemonic for wallet ${wallet.id}`);\n }\n\n wallet.value = encodeBytes(mnemonic);\n }\n\n return wallet;\n}\n\n/**\n * Exports a single simple-keyring wallet object as an {@link AccountWalletPrivateKeyPayload}.\n *\n * All groups from the wallet are merged into the `'private-key'` singleton payload entry.\n * When `includeSecrets` is `true`, each group's private key is exported via\n * `KeyringController:withKeyringV2`.\n *\n * @param context - Export context.\n * @param walletObj - The local simple-keyring wallet to export.\n * @param includeSecrets - When `true`, private keys are included in the payload.\n * @param idMap - ID map to populate with local↔payload ID pairs for this wallet and its groups.\n * @returns The private-key wallet payload entry.\n * @throws If `includeSecrets` is `true` but a private key cannot be exported for an account.\n */\nasync function exportPrivateKeyWalletObject(\n context: ExportContext,\n walletObj: AccountWalletKeyringObject,\n includeSecrets: boolean,\n idMap: IdMap,\n): Promise<AccountWalletPrivateKeyPayload> {\n // We use a singleton wallet ID for private keys.\n const wallet: AccountWalletPrivateKeyPayload = {\n type: AccountWalletPayloadType.PrivateKey,\n id: toWalletPayloadId(AccountWalletPayloadType.PrivateKey),\n metadata: { name: walletObj.metadata.name },\n groups: [],\n };\n\n for (const groupObj of Object.values(walletObj.groups)) {\n const accountId = groupObj.accounts[0];\n if (!accountId) {\n continue;\n }\n const account = context.messenger.call(\n 'AccountsController:getAccount',\n accountId,\n );\n if (!account) {\n continue;\n }\n\n const { address } = account;\n\n let exported: PrivateKeyExportedAccount | undefined;\n if (includeSecrets) {\n const result = await context.messenger.call(\n 'KeyringController:withKeyringV2',\n { address },\n async ({ keyring }) => {\n if (!keyring.exportAccount) {\n throw new Error(\n `Keyring for account ${accountId} does not support exportAccount`,\n );\n }\n\n return keyring.exportAccount(accountId, {\n type: 'private-key',\n encoding: AccountWalletPrivateKeyEncoding.Hexadecimal,\n });\n },\n );\n\n exported = result as PrivateKeyExportedAccount;\n }\n\n const group: AccountWalletPrivateKeyGroupEntry = {\n id: toGroupPayloadId(wallet.id, address),\n metadata: {\n name: groupObj.metadata.name,\n pinned: groupObj.metadata.pinned,\n hidden: groupObj.metadata.hidden,\n },\n };\n\n if (includeSecrets) {\n if (!exported) {\n throw new Error(\n `Failed to export private key for account ${accountId}`,\n );\n }\n group.value = {\n privateKey: encodeBytes(new TextEncoder().encode(exported.privateKey)),\n encoding: exported.encoding,\n type: EthAccountType.Eoa,\n };\n }\n\n idMap.add(groupObj.id, group.id);\n\n wallet.groups.push(group);\n }\n\n return wallet;\n}\n\n/**\n * Builds an {@link AccountTreeSnapshot} from the current controller state.\n *\n * Iterates over all wallets in the tree:\n * - {@link AccountWalletType.Entropy} (HD) wallets -> `'mnemonic'` payload entries.\n * - {@link AccountWalletType.Keyring} wallets of type `simple` -> `'private-key'` payload entries.\n * - Snap wallets and hardware keyrings are skipped in v1.\n *\n * @param context - Export context providing state and messenger access.\n * @param options - Export options.\n * @returns A promise that resolves to the built snapshot.\n * @throws If `options.includeSecrets` is `true` and the vault is locked.\n */\nexport async function exportState(\n context: ExportContext,\n options: ExportStateOptions = {},\n): Promise<AccountTreeSnapshot> {\n const state = context.getState();\n\n const includeSecrets = options.includeSecrets ?? false;\n const { isUnlocked } = context.messenger.call('KeyringController:getState');\n if (includeSecrets && !isUnlocked) {\n throw new Error('Cannot include secrets in export when vault is locked');\n }\n\n const idMap = new IdMap();\n const entries: AccountTreeWalletEntry[] = [];\n let privateKeyWallet: AccountWalletPrivateKeyPayload | undefined;\n\n for (const walletObj of Object.values(state.accountTree.wallets)) {\n if (isMnemonicWalletObject(walletObj)) {\n entries.push(\n await exportMnemonicWalletObject(\n context,\n walletObj,\n includeSecrets,\n idMap,\n ),\n );\n } else if (isPrivateKeyWalletObject(walletObj)) {\n const exported = await exportPrivateKeyWalletObject(\n context,\n walletObj,\n includeSecrets,\n idMap,\n );\n\n if (privateKeyWallet) {\n privateKeyWallet.groups.push(...exported.groups);\n } else {\n privateKeyWallet = exported;\n\n // Register only once, since all private keys are exported into the same wallet entry.\n idMap.add(walletObj.id, exported.id);\n }\n } else {\n // AccountWalletType.Snap and hardware keyrings: skipped for now.\n }\n }\n\n if (privateKeyWallet) {\n entries.push(privateKeyWallet);\n }\n\n return new AccountTreeSnapshot(entries, idMap);\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import type { AccountTreeControllerMessenger, AccountTreeControllerState } from "../types.cjs";
2
+ import type { AccountWalletObject } from "../wallet.cjs";
3
+ import { AccountWalletEntropyObject, AccountWalletKeyringObject } from "../wallet.cjs";
4
+ import type { ExportStateOptions } from "./payload.cjs";
5
+ import { AccountTreeSnapshot } from "./snapshot.cjs";
6
+ /**
7
+ * Returns `true` if `wallet` is an HD entropy wallet ({@link AccountWalletEntropyObject}).
8
+ *
9
+ * @param wallet - The wallet object to test.
10
+ * @returns Type predicate narrowing to {@link AccountWalletEntropyObject}.
11
+ */
12
+ export declare function isMnemonicWalletObject(wallet: AccountWalletObject): wallet is AccountWalletEntropyObject;
13
+ /**
14
+ * Returns `true` if `wallet` is an imported private-key wallet
15
+ * ({@link AccountWalletKeyringObject} with keyring type {@link KeyringTypes.simple}).
16
+ *
17
+ * @param wallet - The wallet object to test.
18
+ * @returns Type predicate narrowing to {@link AccountWalletKeyringObject}.
19
+ */
20
+ export declare function isPrivateKeyWalletObject(wallet: AccountWalletObject): wallet is AccountWalletKeyringObject;
21
+ /** Context required by {@link exportState}. */
22
+ export type ExportContext = {
23
+ getState: () => AccountTreeControllerState;
24
+ messenger: AccountTreeControllerMessenger;
25
+ };
26
+ /**
27
+ * Builds an {@link AccountTreeSnapshot} from the current controller state.
28
+ *
29
+ * Iterates over all wallets in the tree:
30
+ * - {@link AccountWalletType.Entropy} (HD) wallets -> `'mnemonic'` payload entries.
31
+ * - {@link AccountWalletType.Keyring} wallets of type `simple` -> `'private-key'` payload entries.
32
+ * - Snap wallets and hardware keyrings are skipped in v1.
33
+ *
34
+ * @param context - Export context providing state and messenger access.
35
+ * @param options - Export options.
36
+ * @returns A promise that resolves to the built snapshot.
37
+ * @throws If `options.includeSecrets` is `true` and the vault is locked.
38
+ */
39
+ export declare function exportState(context: ExportContext, options?: ExportStateOptions): Promise<AccountTreeSnapshot>;
40
+ //# sourceMappingURL=export.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.cts","sourceRoot":"","sources":["../../src/state/export.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,8BAA8B,EAC9B,0BAA0B,EAC3B,qBAAoB;AACrB,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAqB;AACxD,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC3B,sBAAqB;AAEtB,OAAO,KAAK,EAMV,kBAAkB,EACnB,sBAAqB;AAOtB,OAAO,EAAE,mBAAmB,EAAE,uBAAsB;AAGpD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,mBAAmB,GAC1B,MAAM,IAAI,0BAA0B,CAEtC;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,GAC1B,MAAM,IAAI,0BAA0B,CAKtC;AAED,+CAA+C;AAC/C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,0BAA0B,CAAC;IAC3C,SAAS,EAAE,8BAA8B,CAAC;CAC3C,CAAC;AA2LF;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAiD9B"}
@@ -0,0 +1,40 @@
1
+ import type { AccountTreeControllerMessenger, AccountTreeControllerState } from "../types.mjs";
2
+ import type { AccountWalletObject } from "../wallet.mjs";
3
+ import { AccountWalletEntropyObject, AccountWalletKeyringObject } from "../wallet.mjs";
4
+ import type { ExportStateOptions } from "./payload.mjs";
5
+ import { AccountTreeSnapshot } from "./snapshot.mjs";
6
+ /**
7
+ * Returns `true` if `wallet` is an HD entropy wallet ({@link AccountWalletEntropyObject}).
8
+ *
9
+ * @param wallet - The wallet object to test.
10
+ * @returns Type predicate narrowing to {@link AccountWalletEntropyObject}.
11
+ */
12
+ export declare function isMnemonicWalletObject(wallet: AccountWalletObject): wallet is AccountWalletEntropyObject;
13
+ /**
14
+ * Returns `true` if `wallet` is an imported private-key wallet
15
+ * ({@link AccountWalletKeyringObject} with keyring type {@link KeyringTypes.simple}).
16
+ *
17
+ * @param wallet - The wallet object to test.
18
+ * @returns Type predicate narrowing to {@link AccountWalletKeyringObject}.
19
+ */
20
+ export declare function isPrivateKeyWalletObject(wallet: AccountWalletObject): wallet is AccountWalletKeyringObject;
21
+ /** Context required by {@link exportState}. */
22
+ export type ExportContext = {
23
+ getState: () => AccountTreeControllerState;
24
+ messenger: AccountTreeControllerMessenger;
25
+ };
26
+ /**
27
+ * Builds an {@link AccountTreeSnapshot} from the current controller state.
28
+ *
29
+ * Iterates over all wallets in the tree:
30
+ * - {@link AccountWalletType.Entropy} (HD) wallets -> `'mnemonic'` payload entries.
31
+ * - {@link AccountWalletType.Keyring} wallets of type `simple` -> `'private-key'` payload entries.
32
+ * - Snap wallets and hardware keyrings are skipped in v1.
33
+ *
34
+ * @param context - Export context providing state and messenger access.
35
+ * @param options - Export options.
36
+ * @returns A promise that resolves to the built snapshot.
37
+ * @throws If `options.includeSecrets` is `true` and the vault is locked.
38
+ */
39
+ export declare function exportState(context: ExportContext, options?: ExportStateOptions): Promise<AccountTreeSnapshot>;
40
+ //# sourceMappingURL=export.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.mts","sourceRoot":"","sources":["../../src/state/export.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,8BAA8B,EAC9B,0BAA0B,EAC3B,qBAAoB;AACrB,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAqB;AACxD,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC3B,sBAAqB;AAEtB,OAAO,KAAK,EAMV,kBAAkB,EACnB,sBAAqB;AAOtB,OAAO,EAAE,mBAAmB,EAAE,uBAAsB;AAGpD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,mBAAmB,GAC1B,MAAM,IAAI,0BAA0B,CAEtC;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,GAC1B,MAAM,IAAI,0BAA0B,CAKtC;AAED,+CAA+C;AAC/C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,0BAA0B,CAAC;IAC3C,SAAS,EAAE,8BAA8B,CAAC;CAC3C,CAAC;AA2LF;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAiD9B"}
@@ -0,0 +1,208 @@
1
+ import { AccountWalletType } from "@metamask/account-api";
2
+ import { HdKeyring } from "@metamask/eth-hd-keyring/v2";
3
+ import { EthAccountType } from "@metamask/keyring-api";
4
+ import { KeyringTypes } from "@metamask/keyring-controller";
5
+ import { IdMap } from "./id-map.mjs";
6
+ import { AccountWalletPayloadType, AccountWalletPrivateKeyEncoding, toWalletPayloadId, toGroupPayloadId } from "./payload.mjs";
7
+ import { AccountTreeSnapshot } from "./snapshot.mjs";
8
+ import { encodeBytes } from "./utils.mjs";
9
+ /**
10
+ * Returns `true` if `wallet` is an HD entropy wallet ({@link AccountWalletEntropyObject}).
11
+ *
12
+ * @param wallet - The wallet object to test.
13
+ * @returns Type predicate narrowing to {@link AccountWalletEntropyObject}.
14
+ */
15
+ export function isMnemonicWalletObject(wallet) {
16
+ return wallet.type === AccountWalletType.Entropy;
17
+ }
18
+ /**
19
+ * Returns `true` if `wallet` is an imported private-key wallet
20
+ * ({@link AccountWalletKeyringObject} with keyring type {@link KeyringTypes.simple}).
21
+ *
22
+ * @param wallet - The wallet object to test.
23
+ * @returns Type predicate narrowing to {@link AccountWalletKeyringObject}.
24
+ */
25
+ export function isPrivateKeyWalletObject(wallet) {
26
+ return (wallet.type === AccountWalletType.Keyring &&
27
+ wallet.metadata.keyring.type === KeyringTypes.simple);
28
+ }
29
+ /**
30
+ * Exports a single entropy (HD) wallet object as an {@link AccountWalletMnemonicPayload}.
31
+ *
32
+ * Calls `KeyringController:withKeyringV2Unsafe` to derive the stable entropy source ID
33
+ * via {@link HdKeyring.toEntropySourceId} and, when `includeSecrets` is `true`, to read
34
+ * the raw mnemonic bytes.
35
+ *
36
+ * @param context - Export context.
37
+ * @param walletObj - The local entropy wallet to export.
38
+ * @param includeSecrets - When `true`, the BIP-39 mnemonic is included in the payload.
39
+ * @param idMap - ID map to populate with local↔payload ID pairs for this wallet and its groups.
40
+ * @returns The mnemonic wallet payload entry.
41
+ * @throws If `includeSecrets` is `true` but the mnemonic cannot be read from the keyring.
42
+ */
43
+ async function exportMnemonicWalletObject(context, walletObj, includeSecrets, idMap) {
44
+ const result = await context.messenger.call('KeyringController:withKeyringV2Unsafe',
45
+ // The local wallet entropy ID is the keyring ID.
46
+ { id: walletObj.metadata.entropy.id }, async ({ keyring }) => {
47
+ const hdKeyring = keyring;
48
+ const includeMnemonic = includeSecrets &&
49
+ hdKeyring.mnemonic !== null &&
50
+ hdKeyring.mnemonic !== undefined;
51
+ return {
52
+ // Compute the stable entropy source ID from the keyring's mnemonic (BIP-39 seed).
53
+ entropySourceId: await hdKeyring.toEntropySourceId(),
54
+ // No need to include the mnemonic here if we're not exporting secrets.
55
+ mnemonic: includeMnemonic ? hdKeyring.mnemonic : undefined,
56
+ };
57
+ });
58
+ const { entropySourceId, mnemonic } = result;
59
+ // We use the stable entropy source ID as the payload wallet ID, rather than the local wallet ID, to
60
+ // ensure that the exported snapshot is stable across different installations and sessions.
61
+ const wallet = {
62
+ type: AccountWalletPayloadType.Mnemonic,
63
+ id: toWalletPayloadId(entropySourceId),
64
+ metadata: { name: walletObj.metadata.name },
65
+ groups: [],
66
+ };
67
+ idMap.add(walletObj.id, wallet.id);
68
+ for (const groupObj of Object.values(walletObj.groups)) {
69
+ const { groupIndex } = groupObj.metadata.entropy;
70
+ const group = {
71
+ id: toGroupPayloadId(wallet.id, groupIndex),
72
+ groupIndex,
73
+ metadata: {
74
+ name: groupObj.metadata.name,
75
+ pinned: groupObj.metadata.pinned,
76
+ hidden: groupObj.metadata.hidden,
77
+ },
78
+ };
79
+ idMap.add(groupObj.id, group.id);
80
+ wallet.groups.push(group);
81
+ }
82
+ // Sort the groups by their `groupIndex` to ensure a stable order in the exported payload.
83
+ wallet.groups.sort((group, otherGroup) => group.groupIndex - otherGroup.groupIndex);
84
+ // This should never happen, but we check just in case.
85
+ if (includeSecrets) {
86
+ if (mnemonic === undefined) {
87
+ throw new Error(`Failed to export mnemonic for wallet ${wallet.id}`);
88
+ }
89
+ wallet.value = encodeBytes(mnemonic);
90
+ }
91
+ return wallet;
92
+ }
93
+ /**
94
+ * Exports a single simple-keyring wallet object as an {@link AccountWalletPrivateKeyPayload}.
95
+ *
96
+ * All groups from the wallet are merged into the `'private-key'` singleton payload entry.
97
+ * When `includeSecrets` is `true`, each group's private key is exported via
98
+ * `KeyringController:withKeyringV2`.
99
+ *
100
+ * @param context - Export context.
101
+ * @param walletObj - The local simple-keyring wallet to export.
102
+ * @param includeSecrets - When `true`, private keys are included in the payload.
103
+ * @param idMap - ID map to populate with local↔payload ID pairs for this wallet and its groups.
104
+ * @returns The private-key wallet payload entry.
105
+ * @throws If `includeSecrets` is `true` but a private key cannot be exported for an account.
106
+ */
107
+ async function exportPrivateKeyWalletObject(context, walletObj, includeSecrets, idMap) {
108
+ // We use a singleton wallet ID for private keys.
109
+ const wallet = {
110
+ type: AccountWalletPayloadType.PrivateKey,
111
+ id: toWalletPayloadId(AccountWalletPayloadType.PrivateKey),
112
+ metadata: { name: walletObj.metadata.name },
113
+ groups: [],
114
+ };
115
+ for (const groupObj of Object.values(walletObj.groups)) {
116
+ const accountId = groupObj.accounts[0];
117
+ if (!accountId) {
118
+ continue;
119
+ }
120
+ const account = context.messenger.call('AccountsController:getAccount', accountId);
121
+ if (!account) {
122
+ continue;
123
+ }
124
+ const { address } = account;
125
+ let exported;
126
+ if (includeSecrets) {
127
+ const result = await context.messenger.call('KeyringController:withKeyringV2', { address }, async ({ keyring }) => {
128
+ if (!keyring.exportAccount) {
129
+ throw new Error(`Keyring for account ${accountId} does not support exportAccount`);
130
+ }
131
+ return keyring.exportAccount(accountId, {
132
+ type: 'private-key',
133
+ encoding: AccountWalletPrivateKeyEncoding.Hexadecimal,
134
+ });
135
+ });
136
+ exported = result;
137
+ }
138
+ const group = {
139
+ id: toGroupPayloadId(wallet.id, address),
140
+ metadata: {
141
+ name: groupObj.metadata.name,
142
+ pinned: groupObj.metadata.pinned,
143
+ hidden: groupObj.metadata.hidden,
144
+ },
145
+ };
146
+ if (includeSecrets) {
147
+ if (!exported) {
148
+ throw new Error(`Failed to export private key for account ${accountId}`);
149
+ }
150
+ group.value = {
151
+ privateKey: encodeBytes(new TextEncoder().encode(exported.privateKey)),
152
+ encoding: exported.encoding,
153
+ type: EthAccountType.Eoa,
154
+ };
155
+ }
156
+ idMap.add(groupObj.id, group.id);
157
+ wallet.groups.push(group);
158
+ }
159
+ return wallet;
160
+ }
161
+ /**
162
+ * Builds an {@link AccountTreeSnapshot} from the current controller state.
163
+ *
164
+ * Iterates over all wallets in the tree:
165
+ * - {@link AccountWalletType.Entropy} (HD) wallets -> `'mnemonic'` payload entries.
166
+ * - {@link AccountWalletType.Keyring} wallets of type `simple` -> `'private-key'` payload entries.
167
+ * - Snap wallets and hardware keyrings are skipped in v1.
168
+ *
169
+ * @param context - Export context providing state and messenger access.
170
+ * @param options - Export options.
171
+ * @returns A promise that resolves to the built snapshot.
172
+ * @throws If `options.includeSecrets` is `true` and the vault is locked.
173
+ */
174
+ export async function exportState(context, options = {}) {
175
+ const state = context.getState();
176
+ const includeSecrets = options.includeSecrets ?? false;
177
+ const { isUnlocked } = context.messenger.call('KeyringController:getState');
178
+ if (includeSecrets && !isUnlocked) {
179
+ throw new Error('Cannot include secrets in export when vault is locked');
180
+ }
181
+ const idMap = new IdMap();
182
+ const entries = [];
183
+ let privateKeyWallet;
184
+ for (const walletObj of Object.values(state.accountTree.wallets)) {
185
+ if (isMnemonicWalletObject(walletObj)) {
186
+ entries.push(await exportMnemonicWalletObject(context, walletObj, includeSecrets, idMap));
187
+ }
188
+ else if (isPrivateKeyWalletObject(walletObj)) {
189
+ const exported = await exportPrivateKeyWalletObject(context, walletObj, includeSecrets, idMap);
190
+ if (privateKeyWallet) {
191
+ privateKeyWallet.groups.push(...exported.groups);
192
+ }
193
+ else {
194
+ privateKeyWallet = exported;
195
+ // Register only once, since all private keys are exported into the same wallet entry.
196
+ idMap.add(walletObj.id, exported.id);
197
+ }
198
+ }
199
+ else {
200
+ // AccountWalletType.Snap and hardware keyrings: skipped for now.
201
+ }
202
+ }
203
+ if (privateKeyWallet) {
204
+ entries.push(privateKeyWallet);
205
+ }
206
+ return new AccountTreeSnapshot(entries, idMap);
207
+ }
208
+ //# sourceMappingURL=export.mjs.map