feat(snap-account-service): add migration logic + keyring v2 support#8732
feat(snap-account-service): add migration logic + keyring v2 support#8732ccharly wants to merge 20 commits into
Conversation
96269d0 to
43c238b
Compare
8452267 to
ce71df1
Compare
a4b5e03 to
47199fa
Compare
|
@metamaskbot publish-preview |
|
Preview builds have been published. Learn how to use preview builds in other projects. Expand for full list of packages and versions. |
9cae8f4 to
24c3001
Compare
|
@metamaskbot publish-preview |
|
Preview builds have been published. Learn how to use preview builds in other projects. Expand for full list of packages and versions. |
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
98e5de2 to
3ab5f83
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ 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 f39f26b. Configure here.
|
@metamaskbot publish-preview |
|
Preview builds have been published. Learn how to use preview builds in other projects. Expand for full list of packages and versions. |
| filter: (keyring): keyring is SnapKeyring => | ||
| isSnapKeyring(keyring) && keyring.snapId === snapId, | ||
| }, | ||
| async ({ keyring }) => operation(keyring as SnapKeyring), |
There was a problem hiding this comment.
why do we need the cast if we're using the type predicate in the filter?
There was a problem hiding this comment.
I think we lose the type generics when using actions (that use generics) through the messenger
There was a problem hiding this comment.
Ah yeah I figured, all good! I wonder if the typing can be improved in the messenger so we don't lose it, I imagine there would be so many castings dropped across all teams if so haha 😆
|
|
||
| // Migrate from the global v1 Snap keyring to the per-Snap v2 keyring | ||
| // before doing anything else. | ||
| await this.migrate(); |
There was a problem hiding this comment.
can we not do this in the constructor? doing it anytime a snap provider gets used doesn't feel right even though it's a no-op.
There was a problem hiding this comment.
Well.. I put it there to ensure the migration would be run no matter who requires a Snap keyring.
Maybe I could try to:
- Rename
migratetoensureMigrated - Hook
KeyringController:unlockinstead - Run the migration right after the unlock (which could be a noop)
This way, we could guarantee the migration has been ran correctly.
We could add a guard like if (!this.migrated) { throw new Error('Not migrated yet'); } in case a :ensureReady comes before (but I don't think that would happen with the :unlock hook honestly)
There was a problem hiding this comment.
Ok nice, that sounds good

Explanation
Add migration logic to migrate from the legacy Snap keyring to the new architecture with 1 Snap keyring v2 per Snaps.
Also enhance
:ensureReadyso consumers can safely call:withKeyringV2to get the associated Snap keyring v2 instance before using it.References
N/A
Checklist
Note
High Risk
High risk because it changes Snap keyring selection, migration, and selected-account forwarding across keyrings, which can affect account availability and Snap message routing during startup and resync flows.
Overview
Adds a concurrency-safe migration in
SnapAccountServiceto move accounts from the legacy global Snap keyring into per-SnapSnapKeyringv2 instances, removes the legacy keyring afterward, and makesensureReadyrun migration + auto-create a missing v2 keyring for the requested Snap.Updates Snap message delegation and selected-account forwarding to target v2 keyrings via
KeyringController:withKeyringV2/withKeyringV2Unsafe, including filtering selected accounts to only those owned by each Snap and special-casingGetSelectedAccounts.Migrates
multichain-account-serviceSnap providers to usewithKeyringV2and the@metamask/eth-snap-keyring/v2API (includingdeleteAccountand updatedcreateAccount(s)signatures), and bumps@metamask/eth-snap-keyringto^22.1.0across affected packages.Reviewed by Cursor Bugbot for commit 61b8446. Bugbot is set up for automated code reviews on this repo. Configure here.