Skip to content

feat(accounts-controller): add support for Snap keyring v2#8513

Open
ccharly wants to merge 5 commits intomainfrom
cc/feat/accounts-controller-snap-keyring-v2
Open

feat(accounts-controller): add support for Snap keyring v2#8513
ccharly wants to merge 5 commits intomainfrom
cc/feat/accounts-controller-snap-keyring-v2

Conversation

@ccharly
Copy link
Copy Markdown
Contributor

@ccharly ccharly commented Apr 17, 2026

Explanation

Adding support for Snap keyring v2 for this controller. For now, those keyrings are not in use, but we will need this to be able to the accounts associated with those new keyrings.

References

N/A

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

Medium Risk
Touches account synchronization on keyring state changes and account reconstruction in updateAccounts, which can impact account lists/selection if v2 keyring detection or lookup behavior differs from expectations.

Overview
AccountsController now recognizes Snap keyring v2 (KeyringType.Snap) accounts during both KeyringController:stateChange syncing and updateAccounts, retrieving them via SnapKeyringV2.lookupByAddress and injecting minimal Snap metadata into the resulting internal account.

Utilities were extended to map the v2 Snap keyring type to “Snap Account” and to detect v2 Snap keyring types (isSnapKeyringV2Type), and the keyring state-change patching logic was simplified to a single unified patch. Tests and changelog were updated to cover v2 add/skip edge cases (missing keyring instance, deleted-before-add), and package scripts now run messenger action type generation/checking with the oxfmt formatter.

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

@ccharly ccharly force-pushed the cc/feat/accounts-controller-snap-keyring-v2 branch from 2851f32 to 235c68e Compare April 17, 2026 16:37
Comment on lines -890 to -909
const generatePatch = (): StatePatch => {
return {
previous: {},
added: [],
updated: [],
removed: [],
};
};
const patches = {
snap: generatePatch(),
normal: generatePatch(),
};

// Gets the patch object based on the keyring type (since Snap accounts and other accounts
// are handled differently).
const patchOf = (type: string): StatePatch => {
if (isSnapKeyringType(type)) {
return patches.snap;
}
return patches.normal;
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Just removed all this since we don't need that separation at all!

Comment on lines +877 to +889
metadata: {
name: '',
importTime: Date.now(),
lastSelected: 0,
keyring: {
type: KeyringType.Snap,
},
snap: {
name: keyring.snapId,
enabled: true,
id: keyring.snapId,
},
},
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The new Snap keyring v2 only use KeyringAccount, thus we don't have any metadata for those!

@ccharly ccharly marked this pull request as ready for review April 17, 2026 17:41
@ccharly ccharly requested review from a team as code owners April 17, 2026 17:41
Comment on lines +882 to +886
snap: {
name: keyring.snapId,
enabled: true,
id: keyring.snapId,
},
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

We could query this from the SnapController, but that requires a new allowed action, thus a breaking change (but at least that would mimic what the current big SnapKeyring is doing)

Copy link
Copy Markdown

@cursor cursor bot left a comment

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 aa8bb9f. Configure here.

return keyringType === (KeyringTypes.snap as string);
}

/**
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

isNormalKeyringType misclassifies Snap keyring v2 as normal

Medium Severity

isNormalKeyringType only excludes v1 snap keyrings via isSnapKeyringType (which checks against KeyringTypes.snap), but doesn't exclude the newly introduced v2 snap keyring type (KeyringType.Snap). Since these are different string values, calling isNormalKeyringType(KeyringType.Snap) incorrectly returns true. This publicly exported function would misclassify Snap keyring v2 accounts as "normal" keyrings, which could cause consumers to apply incorrect handling for those accounts.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit aa8bb9f. Configure here.

Sign up for free to 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.

1 participant