Skip to content

feat(account-tree-controller)!: add {import,export}State actions - #9663

Merged
ccharly merged 119 commits into
mainfrom
cc/feat/account-tree-export-import
Aug 14, 2026
Merged

feat(account-tree-controller)!: add {import,export}State actions#9663
ccharly merged 119 commits into
mainfrom
cc/feat/account-tree-export-import

Conversation

@ccharly

@ccharlyccharly commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Explanation

New {export,import}State actions.

This is the implementation for this ADR:

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

High Risk
Touches secret export/import and keyring/multichain wallet creation; incorrect handling could leak or corrupt credentials or account metadata.

Overview
Adds AccountTreeController:exportState and AccountTreeController:importState so clients can snapshot and restore the account tree via a version-1 wire format (AccountTreeSnapshot, payload types, and IdMap are re-exported from the package).

exportState builds a snapshot of wallets/groups (names, pinned, hidden, etc.); with includeSecrets: true and an unlocked vault it can include mnemonics and private keys. exportState rejects when the vault is locked, including metadata-only exports. importState accepts only validated AccountTreeSnapshot instances (untrusted data must use deserialize first); it can create new HD wallets via MultichainAccountService and private-key accounts via KeyringController, then apply metadata to existing and new entries.

Tests add messenger action coverage, a controller-level metadata round-trip, dedicated export→serialize→deserialize→import integration tests for mnemonic/private-key secrets, and test harness updates (KeyringController:withController, multichain create actions, shared wallet fixtures).

Reviewed by Cursor Bugbot for commit 6078457. Bugbot is set up for automated code reviews on this repo. Configure here.

@ccharly

Copy link
Copy Markdown
ContributorAuthor

@metamaskbot publish-preview

@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.5.5-preview-421b16793
@metamask-previews/accounts-controller@39.0.5-preview-421b16793
@metamask-previews/address-book-controller@7.1.2-preview-421b16793
@metamask-previews/ai-controllers@0.8.0-preview-421b16793
@metamask-previews/analytics-controller@1.2.1-preview-421b16793
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-421b16793
@metamask-previews/announcement-controller@8.1.0-preview-421b16793
@metamask-previews/app-metadata-controller@2.0.1-preview-421b16793
@metamask-previews/approval-controller@9.0.2-preview-421b16793
@metamask-previews/assets-controller@11.2.0-preview-421b16793
@metamask-previews/assets-controllers@110.0.0-preview-421b16793
@metamask-previews/authenticated-user-storage@3.0.1-preview-421b16793
@metamask-previews/base-controller@9.1.0-preview-421b16793
@metamask-previews/base-data-service@0.1.3-preview-421b16793
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-421b16793
@metamask-previews/bridge-controller@78.0.0-preview-421b16793
@metamask-previews/bridge-status-controller@74.5.0-preview-421b16793
@metamask-previews/build-utils@3.0.4-preview-421b16793
@metamask-previews/chain-agnostic-permission@1.7.0-preview-421b16793
@metamask-previews/chomp-api-service@4.0.0-preview-421b16793
@metamask-previews/claims-controller@0.5.3-preview-421b16793
@metamask-previews/client-controller@1.0.1-preview-421b16793
@metamask-previews/client-utils@1.2.1-preview-421b16793
@metamask-previews/compliance-controller@2.1.0-preview-421b16793
@metamask-previews/composable-controller@12.0.1-preview-421b16793
@metamask-previews/config-registry-controller@0.4.1-preview-421b16793
@metamask-previews/connectivity-controller@0.3.0-preview-421b16793
@metamask-previews/controller-utils@12.3.0-preview-421b16793
@metamask-previews/core-backend@7.0.0-preview-421b16793
@metamask-previews/delegation-controller@3.0.2-preview-421b16793
@metamask-previews/earn-controller@12.2.2-preview-421b16793
@metamask-previews/eip-5792-middleware@3.0.5-preview-421b16793
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-421b16793
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-421b16793
@metamask-previews/ens-controller@19.1.5-preview-421b16793
@metamask-previews/eth-block-tracker@15.0.1-preview-421b16793
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-421b16793
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-421b16793
@metamask-previews/foundryup@1.0.1-preview-421b16793
@metamask-previews/gas-fee-controller@26.3.0-preview-421b16793
@metamask-previews/gator-permissions-controller@4.2.3-preview-421b16793
@metamask-previews/geolocation-controller@0.1.3-preview-421b16793
@metamask-previews/java-tron-up@1.0.0-preview-421b16793
@metamask-previews/json-rpc-engine@10.5.0-preview-421b16793
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-421b16793
@metamask-previews/keyring-controller@27.1.0-preview-421b16793
@metamask-previews/local-node-utils@1.0.0-preview-421b16793
@metamask-previews/logging-controller@8.0.2-preview-421b16793
@metamask-previews/message-manager@14.1.2-preview-421b16793
@metamask-previews/messenger@2.0.0-preview-421b16793
@metamask-previews/messenger-cli@0.2.0-preview-421b16793
@metamask-previews/money-account-api-data-service@0.3.0-preview-421b16793
@metamask-previews/money-account-balance-service@2.3.0-preview-421b16793
@metamask-previews/money-account-controller@0.3.3-preview-421b16793
@metamask-previews/money-account-upgrade-controller@3.0.0-preview-421b16793
@metamask-previews/multichain-account-service@13.0.0-preview-421b16793
@metamask-previews/multichain-api-middleware@4.0.1-preview-421b16793
@metamask-previews/multichain-network-controller@3.2.1-preview-421b16793
@metamask-previews/multichain-transactions-controller@7.1.1-preview-421b16793
@metamask-previews/name-controller@9.1.2-preview-421b16793
@metamask-previews/network-connection-banner-controller@0.1.0-preview-421b16793
@metamask-previews/network-controller@34.0.0-preview-421b16793
@metamask-previews/network-enablement-controller@5.6.0-preview-421b16793
@metamask-previews/notification-services-controller@26.0.0-preview-421b16793
@metamask-previews/passkey-controller@3.0.0-preview-421b16793
@metamask-previews/permission-controller@13.1.1-preview-421b16793
@metamask-previews/permission-log-controller@5.1.0-preview-421b16793
@metamask-previews/perps-controller@10.0.0-preview-421b16793
@metamask-previews/phishing-controller@17.3.0-preview-421b16793
@metamask-previews/platform-api-docs@0.0.0-preview-421b16793
@metamask-previews/polling-controller@16.0.8-preview-421b16793
@metamask-previews/preferences-controller@23.1.0-preview-421b16793
@metamask-previews/profile-metrics-controller@4.0.2-preview-421b16793
@metamask-previews/profile-sync-controller@28.3.0-preview-421b16793
@metamask-previews/ramps-controller@17.1.0-preview-421b16793
@metamask-previews/rate-limit-controller@7.0.1-preview-421b16793
@metamask-previews/react-data-query@0.2.2-preview-421b16793
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-421b16793
@metamask-previews/sample-controllers@5.0.3-preview-421b16793
@metamask-previews/seedless-onboarding-controller@10.1.0-preview-421b16793
@metamask-previews/selected-network-controller@26.1.5-preview-421b16793
@metamask-previews/sentinel-api-service@1.0.0-preview-421b16793
@metamask-previews/shield-controller@5.1.3-preview-421b16793
@metamask-previews/signature-controller@39.2.7-preview-421b16793
@metamask-previews/smart-transactions-controller@25.0.1-preview-421b16793
@metamask-previews/snap-account-service@2.0.0-preview-421b16793
@metamask-previews/social-controllers@2.6.0-preview-421b16793
@metamask-previews/solana-test-validator-up@1.0.0-preview-421b16793
@metamask-previews/stellar-quickstart-up@0.0.0-preview-421b16793
@metamask-previews/storage-service@1.0.2-preview-421b16793
@metamask-previews/subscription-controller@6.2.1-preview-421b16793
@metamask-previews/transaction-controller@69.2.1-preview-421b16793
@metamask-previews/transaction-pay-controller@26.0.0-preview-421b16793
@metamask-previews/user-operation-controller@41.2.7-preview-421b16793
@metamask-previews/wallet@8.1.0-preview-421b16793
@metamask-previews/wallet-cli@0.0.0-preview-421b16793

@ccharly
ccharly changed the base branch from main to cc/feat/account-tree-importAugust 14, 2026 11:26

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 7cd414f. Configure here.

Base automatically changed from cc/feat/account-tree-import to mainAugust 14, 2026 11:55
@ccharly

Copy link
Copy Markdown
ContributorAuthor

@metamaskbot publish-preview

gantunesr
gantunesr previously approved these changes Aug 14, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.6.1-preview-4e64b66e8
@metamask-previews/accounts-controller@39.1.0-preview-4e64b66e8
@metamask-previews/address-book-controller@7.1.2-preview-4e64b66e8
@metamask-previews/ai-controllers@0.8.0-preview-4e64b66e8
@metamask-previews/analytics-controller@2.0.0-preview-4e64b66e8
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-4e64b66e8
@metamask-previews/announcement-controller@8.1.0-preview-4e64b66e8
@metamask-previews/app-metadata-controller@2.0.1-preview-4e64b66e8
@metamask-previews/approval-controller@9.0.2-preview-4e64b66e8
@metamask-previews/assets-controller@13.1.3-preview-4e64b66e8
@metamask-previews/assets-controllers@111.1.0-preview-4e64b66e8
@metamask-previews/authenticated-user-storage@3.0.1-preview-4e64b66e8
@metamask-previews/base-controller@9.1.0-preview-4e64b66e8
@metamask-previews/base-data-service@0.1.3-preview-4e64b66e8
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-4e64b66e8
@metamask-previews/bridge-controller@79.2.0-preview-4e64b66e8
@metamask-previews/bridge-status-controller@75.1.0-preview-4e64b66e8
@metamask-previews/build-utils@3.0.4-preview-4e64b66e8
@metamask-previews/chain-agnostic-permission@1.7.0-preview-4e64b66e8
@metamask-previews/chomp-api-service@4.0.0-preview-4e64b66e8
@metamask-previews/claims-controller@0.6.0-preview-4e64b66e8
@metamask-previews/client-controller@1.0.1-preview-4e64b66e8
@metamask-previews/client-utils@2.0.2-preview-4e64b66e8
@metamask-previews/compliance-controller@2.1.0-preview-4e64b66e8
@metamask-previews/composable-controller@12.0.1-preview-4e64b66e8
@metamask-previews/config-registry-controller@2.0.1-preview-4e64b66e8
@metamask-previews/connectivity-controller@0.3.0-preview-4e64b66e8
@metamask-previews/controller-utils@12.3.0-preview-4e64b66e8
@metamask-previews/core-backend@8.1.1-preview-4e64b66e8
@metamask-previews/delegation-controller@3.0.2-preview-4e64b66e8
@metamask-previews/earn-controller@12.2.4-preview-4e64b66e8
@metamask-previews/eip-5792-middleware@3.0.5-preview-4e64b66e8
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-4e64b66e8
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-4e64b66e8
@metamask-previews/ens-controller@19.1.6-preview-4e64b66e8
@metamask-previews/eth-block-tracker@15.0.1-preview-4e64b66e8
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-4e64b66e8
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-4e64b66e8
@metamask-previews/foundryup@1.0.1-preview-4e64b66e8
@metamask-previews/gas-fee-controller@26.3.1-preview-4e64b66e8
@metamask-previews/gator-permissions-controller@5.0.1-preview-4e64b66e8
@metamask-previews/geolocation-controller@1.0.0-preview-4e64b66e8
@metamask-previews/java-tron-up@1.0.0-preview-4e64b66e8
@metamask-previews/json-rpc-engine@10.5.0-preview-4e64b66e8
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-4e64b66e8
@metamask-previews/keyring-controller@27.1.1-preview-4e64b66e8
@metamask-previews/kyc-controller@0.0.0-preview-4e64b66e8
@metamask-previews/local-node-utils@1.0.0-preview-4e64b66e8
@metamask-previews/logging-controller@9.0.0-preview-4e64b66e8
@metamask-previews/message-manager@14.1.2-preview-4e64b66e8
@metamask-previews/messenger@2.0.0-preview-4e64b66e8
@metamask-previews/messenger-cli@0.2.0-preview-4e64b66e8
@metamask-previews/money-account-api-data-service@0.4.0-preview-4e64b66e8
@metamask-previews/money-account-balance-service@2.4.1-preview-4e64b66e8
@metamask-previews/money-account-controller@1.0.0-preview-4e64b66e8
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-4e64b66e8
@metamask-previews/money-account-utils@1.1.0-preview-4e64b66e8
@metamask-previews/multichain-account-service@13.0.1-preview-4e64b66e8
@metamask-previews/multichain-api-middleware@4.0.2-preview-4e64b66e8
@metamask-previews/multichain-network-controller@3.2.3-preview-4e64b66e8
@metamask-previews/multichain-transactions-controller@7.1.2-preview-4e64b66e8
@metamask-previews/name-controller@9.1.2-preview-4e64b66e8
@metamask-previews/network-connection-banner-controller@0.1.2-preview-4e64b66e8
@metamask-previews/network-controller@35.0.1-preview-4e64b66e8
@metamask-previews/network-enablement-controller@6.0.3-preview-4e64b66e8
@metamask-previews/notification-services-controller@26.0.1-preview-4e64b66e8
@metamask-previews/passkey-controller@3.0.0-preview-4e64b66e8
@metamask-previews/permission-controller@13.1.1-preview-4e64b66e8
@metamask-previews/permission-log-controller@5.1.0-preview-4e64b66e8
@metamask-previews/perps-controller@12.0.0-preview-4e64b66e8
@metamask-previews/phishing-controller@17.3.1-preview-4e64b66e8
@metamask-previews/platform-api-docs@0.0.0-preview-4e64b66e8
@metamask-previews/polling-controller@16.0.9-preview-4e64b66e8
@metamask-previews/preferences-controller@23.1.0-preview-4e64b66e8
@metamask-previews/profile-metrics-controller@4.0.3-preview-4e64b66e8
@metamask-previews/profile-sync-controller@29.0.0-preview-4e64b66e8
@metamask-previews/ramps-controller@20.0.0-preview-4e64b66e8
@metamask-previews/rate-limit-controller@7.0.1-preview-4e64b66e8
@metamask-previews/react-data-query@0.2.2-preview-4e64b66e8
@metamask-previews/remote-feature-flag-controller@5.0.0-preview-4e64b66e8
@metamask-previews/sample-controllers@5.0.4-preview-4e64b66e8
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-4e64b66e8
@metamask-previews/selected-network-controller@26.1.6-preview-4e64b66e8
@metamask-previews/sentinel-api-service@1.0.0-preview-4e64b66e8
@metamask-previews/shield-controller@6.0.0-preview-4e64b66e8
@metamask-previews/signature-controller@39.2.9-preview-4e64b66e8
@metamask-previews/smart-transactions-controller@25.1.0-preview-4e64b66e8
@metamask-previews/snap-account-service@2.1.2-preview-4e64b66e8
@metamask-previews/social-controllers@2.7.1-preview-4e64b66e8
@metamask-previews/solana-test-validator-up@1.0.0-preview-4e64b66e8
@metamask-previews/stellar-quickstart-up@0.0.0-preview-4e64b66e8
@metamask-previews/storage-service@1.0.2-preview-4e64b66e8
@metamask-previews/subscription-controller@7.0.0-preview-4e64b66e8
@metamask-previews/transaction-controller@69.5.2-preview-4e64b66e8
@metamask-previews/transaction-pay-controller@26.3.0-preview-4e64b66e8
@metamask-previews/user-operation-controller@41.2.8-preview-4e64b66e8
@metamask-previews/wallet@10.0.0-preview-4e64b66e8
@metamask-previews/wallet-cli@0.0.0-preview-4e64b66e8

@ccharly

Copy link
Copy Markdown
ContributorAuthor

Re-tested with preview builds, it works fine. Merging now!

@ccharly
ccharly added this pull request to the merge queueAug 14, 2026
Merged via the queue into main with commit 6e9c949Aug 14, 2026
144 checks passed
@ccharly
ccharly deleted the cc/feat/account-tree-export-import branch August 14, 2026 14:27
pullBot pushed a commit to dmrazzy/core that referenced this pull request Aug 14, 2026
## Explanation
Add the export functions for the import/export feature of the
account-tree.
## References
- MetaMask#9663
## Checklist
- [ ] I've updated the test suite for new or updated code as appropriate
- [ ] I've updated documentation (JSDoc, Markdown, etc.) for new or
updated code as appropriate
- [ ] I've communicated my changes to consumers by [updating changelogs
for packages I've
changed](https://github.com/MetaMask/core/tree/main/docs/processes/updating-changelogs.md)
- [ ] I've introduced [breaking
changes](https://github.com/MetaMask/core/tree/main/docs/processes/breaking-changes.md)
in this PR and have prepared draft pull requests for clients and
consumer packages to resolve them
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **High Risk**
> Import decodes mnemonics and private keys and drives
keyring/multichain wallet creation; mistakes could corrupt vault state
or mishandle secrets.
> > **Overview**
> Adds **`importState`** to apply a deserialized `AccountTreeSnapshot`
to local account-tree state, complementing the existing export path.
> > For **mnemonic wallets**, it matches wallets by stable entropy payload
ID (via keyring), creates HD wallets through `MultichainAccountService`
when a mnemonic is present, batches missing account groups with
`createMultichainAccountGroups`, and applies wallet/group metadata
(name, pinned, hidden). Existing groups get metadata before group
creation so partial failures still update what is already local.
> > For **private-key wallets**, it imports missing EVM EOA keys in one
`KeyringController:withController` pass (create simple keyring if
needed), skips non-EOA entries for forward compatibility, and applies
group metadata without renaming the keyring wallet.
> > Shared test helpers (`makeLocalMnemonicWallet`, payload builders,
etc.) replace inline fixtures in **export** tests and back a large new
**import** test suite. Messenger types gain `WithController` and
`createMultichainAccountWallet`; the package build excludes test-only
paths.
> > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
8344c9c. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ccharly@gantunesr