Skip to content

fix(snap-account-service)!: relax keyring messages/methods handling#8860

Merged
ccharly merged 7 commits into
mainfrom
cc/fix/snap-account-service-kering-messages-methods
Jun 2, 2026
Merged

fix(snap-account-service)!: relax keyring messages/methods handling#8860
ccharly merged 7 commits into
mainfrom
cc/fix/snap-account-service-kering-messages-methods

Conversation

@ccharly

@ccharly ccharly commented May 20, 2026

Copy link
Copy Markdown
Contributor

Explanation

We used to always auto-create the legacy Snap keyring (and in the future, Snap keyring v2 instances) automatically when handling events/methods, but this can sometimes cause some deadlock, especially with v1 events (e.g. you call keyring.removeAccount which will send a notify:accountDeleted).

This was working fine before cause a lot of consumers were creating the Snap keyring in an unsafe way (combining getKeyringsByType and addNewKeyring).

We now only delegate those calls to the Snap keyring only when this makes sense!

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

High Risk
Changes keyring acquisition and auto-create rules on account-management Snap paths; integrators must wire withKeyringUnsafe and may see new errors or empty getSelectedAccounts when the keyring is missing.

Overview
Snap account service no longer auto-creates the legacy Snap keyring on every keyring Snap message or selected-account forward. It first resolves the keyring via KeyringController:withKeyringUnsafe (new required messenger action) and only creates the keyring when handling notify:accountCreated.

handleKeyringSnapMessage now returns [] for getSelectedAccounts if the keyring is missing (early Snap init), throws for other events when the keyring is absent, and still delegates when the keyring exists. Selected-account forwarding (account tree / unlock) skips quietly when no legacy keyring is present instead of triggering withController creation.

Tests and changelog document the double-lock fix; @metamask/keyring-api and @metamask/keyring-snap-sdk were added as dependencies.

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

@ccharly ccharly marked this pull request as ready for review May 20, 2026 13:17
@ccharly ccharly requested review from a team as code owners May 20, 2026 13:17
@ccharly

ccharly commented May 20, 2026

Copy link
Copy Markdown
Contributor Author

@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.4.0-preview-bfa94c060
@metamask-previews/accounts-controller@38.1.1-preview-bfa94c060
@metamask-previews/address-book-controller@7.1.2-preview-bfa94c060
@metamask-previews/ai-controllers@0.6.3-preview-bfa94c060
@metamask-previews/analytics-controller@1.0.1-preview-bfa94c060
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-bfa94c060
@metamask-previews/announcement-controller@8.1.0-preview-bfa94c060
@metamask-previews/app-metadata-controller@2.0.1-preview-bfa94c060
@metamask-previews/approval-controller@9.0.1-preview-bfa94c060
@metamask-previews/assets-controller@7.1.2-preview-bfa94c060
@metamask-previews/assets-controllers@108.1.0-preview-bfa94c060
@metamask-previews/authenticated-user-storage@2.0.0-preview-bfa94c060
@metamask-previews/base-controller@9.1.0-preview-bfa94c060
@metamask-previews/base-data-service@0.1.3-preview-bfa94c060
@metamask-previews/bridge-controller@72.0.4-preview-bfa94c060
@metamask-previews/bridge-status-controller@71.1.4-preview-bfa94c060
@metamask-previews/build-utils@3.0.4-preview-bfa94c060
@metamask-previews/chain-agnostic-permission@1.6.1-preview-bfa94c060
@metamask-previews/chomp-api-service@3.1.0-preview-bfa94c060
@metamask-previews/claims-controller@0.5.1-preview-bfa94c060
@metamask-previews/client-controller@1.0.1-preview-bfa94c060
@metamask-previews/compliance-controller@2.0.1-preview-bfa94c060
@metamask-previews/composable-controller@12.0.1-preview-bfa94c060
@metamask-previews/config-registry-controller@0.3.1-preview-bfa94c060
@metamask-previews/connectivity-controller@0.2.0-preview-bfa94c060
@metamask-previews/controller-utils@12.1.0-preview-bfa94c060
@metamask-previews/core-backend@6.3.0-preview-bfa94c060
@metamask-previews/delegation-controller@3.0.0-preview-bfa94c060
@metamask-previews/earn-controller@12.1.2-preview-bfa94c060
@metamask-previews/eip-5792-middleware@3.0.4-preview-bfa94c060
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-bfa94c060
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-bfa94c060
@metamask-previews/ens-controller@19.1.3-preview-bfa94c060
@metamask-previews/eth-block-tracker@15.0.1-preview-bfa94c060
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-bfa94c060
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-bfa94c060
@metamask-previews/foundryup@1.0.1-preview-bfa94c060
@metamask-previews/gas-fee-controller@26.2.2-preview-bfa94c060
@metamask-previews/gator-permissions-controller@4.1.2-preview-bfa94c060
@metamask-previews/geolocation-controller@0.1.3-preview-bfa94c060
@metamask-previews/json-rpc-engine@10.5.0-preview-bfa94c060
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-bfa94c060
@metamask-previews/keyring-controller@25.5.0-preview-bfa94c060
@metamask-previews/logging-controller@8.0.2-preview-bfa94c060
@metamask-previews/message-manager@14.1.2-preview-bfa94c060
@metamask-previews/messenger@1.2.0-preview-bfa94c060
@metamask-previews/messenger-cli@0.2.0-preview-bfa94c060
@metamask-previews/money-account-balance-service@1.0.2-preview-bfa94c060
@metamask-previews/money-account-controller@0.3.0-preview-bfa94c060
@metamask-previews/money-account-upgrade-controller@2.0.2-preview-bfa94c060
@metamask-previews/multichain-account-service@10.0.0-preview-bfa94c060
@metamask-previews/multichain-api-middleware@3.1.2-preview-bfa94c060
@metamask-previews/multichain-network-controller@3.1.2-preview-bfa94c060
@metamask-previews/multichain-transactions-controller@7.1.0-preview-bfa94c060
@metamask-previews/name-controller@9.1.2-preview-bfa94c060
@metamask-previews/network-controller@32.0.0-preview-bfa94c060
@metamask-previews/network-enablement-controller@5.2.0-preview-bfa94c060
@metamask-previews/notification-services-controller@24.1.0-preview-bfa94c060
@metamask-previews/passkey-controller@2.0.1-preview-bfa94c060
@metamask-previews/permission-controller@13.1.1-preview-bfa94c060
@metamask-previews/permission-log-controller@5.1.0-preview-bfa94c060
@metamask-previews/perps-controller@6.1.0-preview-bfa94c060
@metamask-previews/phishing-controller@17.2.0-preview-bfa94c060
@metamask-previews/polling-controller@16.0.6-preview-bfa94c060
@metamask-previews/preferences-controller@23.1.0-preview-bfa94c060
@metamask-previews/profile-metrics-controller@3.1.4-preview-bfa94c060
@metamask-previews/profile-sync-controller@28.1.0-preview-bfa94c060
@metamask-previews/ramps-controller@13.3.1-preview-bfa94c060
@metamask-previews/rate-limit-controller@7.0.1-preview-bfa94c060
@metamask-previews/react-data-query@0.2.1-preview-bfa94c060
@metamask-previews/remote-feature-flag-controller@4.2.1-preview-bfa94c060
@metamask-previews/sample-controllers@5.0.1-preview-bfa94c060
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-bfa94c060
@metamask-previews/selected-network-controller@26.1.3-preview-bfa94c060
@metamask-previews/shield-controller@5.1.2-preview-bfa94c060
@metamask-previews/signature-controller@39.2.2-preview-bfa94c060
@metamask-previews/snap-account-service@0.2.0-preview-bfa94c060
@metamask-previews/social-controllers@2.2.1-preview-bfa94c060
@metamask-previews/storage-service@1.0.1-preview-bfa94c060
@metamask-previews/subscription-controller@6.1.3-preview-bfa94c060
@metamask-previews/transaction-controller@65.4.0-preview-bfa94c060
@metamask-previews/transaction-pay-controller@22.5.0-preview-bfa94c060
@metamask-previews/user-operation-controller@41.2.2-preview-bfa94c060
@metamask-previews/wallet@0.0.0-preview-bfa94c060

@ccharly ccharly added this pull request to the merge queue Jun 2, 2026
Merged via the queue into main with commit 6acb1af Jun 2, 2026
370 checks passed
@ccharly ccharly deleted the cc/fix/snap-account-service-kering-messages-methods branch June 2, 2026 16:09
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.

2 participants