Skip to content

feat(keyring-controller): add withKeyringV2 support#8390

Merged
ccharly merged 20 commits intomainfrom
cc/add-withkeyringv2-keyring-controller
Apr 13, 2026
Merged

feat(keyring-controller): add withKeyringV2 support#8390
ccharly merged 20 commits intomainfrom
cc/add-withkeyringv2-keyring-controller

Conversation

@ccharly
Copy link
Copy Markdown
Contributor

@ccharly ccharly commented Apr 7, 2026

Explanation

Another approach for withKeyringV2 where we actually extend the existing list of keyring instances to have an optional keyringV2 field.

This allow to keep them in memory and have the same lifecycle than v1 keyring instance (and since all v2 implementations are wrappers for now, they are "bound" to v1 instances anyway).

Original PR:

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
Introduces new V2 keyring selection/execution paths and caches V2 adapters alongside legacy keyrings, which could affect keyring lifecycle, rollback/persistence behavior, and error handling. Dependency bumps to keyring packages may also subtly change signing/account behavior.

Overview
Adds first-class KeyringV2 support by storing an optional in-memory V2 adapter next to each legacy keyring entry and creating/destroying these adapters during keyring create/restore/clear flows.

Introduces withKeyringV2 (locked, persisted/rollback) and withKeyringV2Unsafe (lock-free, no rollback) APIs plus messenger action types, including a new KeyringSelectorV2 (type/address/id/filter) and a KeyringV2NotSupported error when no V2 builder exists for a selected keyring.

Updates tests to cover selector variants, lock/rollback semantics, and messenger callability; bumps @metamask/eth-hd-keyring/@metamask/eth-simple-keyring versions and adjusts Jest coverage thresholds accordingly.

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

@ccharly ccharly force-pushed the cc/add-withkeyringv2-keyring-controller branch from 5a456ff to 41df780 Compare April 7, 2026 13:59
@socket-security
Copy link
Copy Markdown

socket-security bot commented Apr 7, 2026

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updated@​metamask/​eth-hd-keyring@​13.1.0 ⏵ 13.1.19910010091 +1100
Updated@​metamask/​eth-simple-keyring@​11.0.0 ⏵ 11.1.29910010094 +9100

View full report

Comment on lines +20 to +23
branches: 94.91,
functions: 100,
lines: 99.03,
statements: 99.04,
lines: 99.11,
statements: 99.12,
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.

Currently, that's what we have on main:

----------------------|---------|----------|---------|---------|------------------------------
File                  | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------------------|---------|----------|---------|---------|------------------------------
All files             |   99.04 |    95.09 |     100 |   99.03 |
 KeyringController.ts |   98.93 |    94.52 |     100 |   98.92 | 647,2099,2473,2485,2529,2836
 constants.ts         |     100 |      100 |     100 |     100 |
 errors.ts            |     100 |      100 |     100 |     100 |
----------------------|---------|----------|---------|---------|------------------------------

And the new coverage is like this:

----------------------|---------|----------|---------|---------|------------------------------
File                  | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s            
----------------------|---------|----------|---------|---------|------------------------------
All files             |   99.12 |    94.91 |     100 |   99.11 |                              
 KeyringController.ts |   99.03 |    94.37 |     100 |   99.01 | 736,2412,2796,2808,2852,3190 
 constants.ts         |     100 |      100 |     100 |     100 |                              
 errors.ts            |     100 |      100 |     100 |     100 |                              
----------------------|---------|----------|---------|---------|------------------------------

Same number of lines not covered, so nothing has changed in terms of coverage.

Copy link
Copy Markdown
Contributor Author

@ccharly ccharly Apr 10, 2026

Choose a reason for hiding this comment

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

Another small update after rebasing:

----------------------|---------|----------|---------|---------|------------------------------
File                  | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------------------|---------|----------|---------|---------|------------------------------
All files             |   99.09 |    94.91 |     100 |   99.08 |
 KeyringController.ts |      99 |    94.37 |     100 |   98.98 | 632,2202,2586,2598,2642,2980
 constants.ts         |     100 |      100 |     100 |     100 |
 errors.ts            |     100 |      100 |     100 |     100 |
----------------------|---------|----------|---------|---------|------------------------------

@ccharly ccharly force-pushed the cc/add-withkeyringv2-keyring-controller branch from 50b0fc4 to 54abb25 Compare April 8, 2026 08:43
@ccharly
Copy link
Copy Markdown
Contributor Author

ccharly commented Apr 8, 2026

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 8, 2026

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.0.0-preview-54abb25
@metamask-previews/accounts-controller@37.2.0-preview-54abb25
@metamask-previews/address-book-controller@7.1.1-preview-54abb25
@metamask-previews/ai-controllers@0.6.3-preview-54abb25
@metamask-previews/analytics-controller@1.0.1-preview-54abb25
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-54abb25
@metamask-previews/announcement-controller@8.1.0-preview-54abb25
@metamask-previews/app-metadata-controller@2.0.1-preview-54abb25
@metamask-previews/approval-controller@9.0.1-preview-54abb25
@metamask-previews/assets-controller@4.0.0-preview-54abb25
@metamask-previews/assets-controllers@103.1.1-preview-54abb25
@metamask-previews/base-controller@9.0.1-preview-54abb25
@metamask-previews/base-data-service@0.1.1-preview-54abb25
@metamask-previews/bridge-controller@70.0.1-preview-54abb25
@metamask-previews/bridge-status-controller@70.0.5-preview-54abb25
@metamask-previews/build-utils@3.0.4-preview-54abb25
@metamask-previews/chain-agnostic-permission@1.5.0-preview-54abb25
@metamask-previews/claims-controller@0.5.0-preview-54abb25
@metamask-previews/client-controller@1.0.1-preview-54abb25
@metamask-previews/compliance-controller@2.0.0-preview-54abb25
@metamask-previews/composable-controller@12.0.1-preview-54abb25
@metamask-previews/config-registry-controller@0.2.0-preview-54abb25
@metamask-previews/connectivity-controller@0.2.0-preview-54abb25
@metamask-previews/controller-utils@11.20.0-preview-54abb25
@metamask-previews/core-backend@6.2.1-preview-54abb25
@metamask-previews/delegation-controller@2.1.0-preview-54abb25
@metamask-previews/earn-controller@11.2.1-preview-54abb25
@metamask-previews/eip-5792-middleware@3.0.3-preview-54abb25
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-54abb25
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-54abb25
@metamask-previews/ens-controller@19.1.1-preview-54abb25
@metamask-previews/eth-block-tracker@15.0.1-preview-54abb25
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-54abb25
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-54abb25
@metamask-previews/foundryup@1.0.1-preview-54abb25
@metamask-previews/gas-fee-controller@26.1.1-preview-54abb25
@metamask-previews/gator-permissions-controller@3.0.1-preview-54abb25
@metamask-previews/geolocation-controller@0.1.2-preview-54abb25
@metamask-previews/json-rpc-engine@10.2.4-preview-54abb25
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-54abb25
@metamask-previews/keyring-controller@25.2.0-preview-54abb25
@metamask-previews/logging-controller@8.0.1-preview-54abb25
@metamask-previews/message-manager@14.1.1-preview-54abb25
@metamask-previews/messenger@1.1.1-preview-54abb25
@metamask-previews/messenger-cli@0.1.0-preview-54abb25
@metamask-previews/money-account-controller@0.1.0-preview-54abb25
@metamask-previews/multichain-account-service@8.0.1-preview-54abb25
@metamask-previews/multichain-api-middleware@2.0.0-preview-54abb25
@metamask-previews/multichain-network-controller@3.0.6-preview-54abb25
@metamask-previews/multichain-transactions-controller@7.0.4-preview-54abb25
@metamask-previews/name-controller@9.1.1-preview-54abb25
@metamask-previews/network-controller@30.0.1-preview-54abb25
@metamask-previews/network-enablement-controller@5.0.2-preview-54abb25
@metamask-previews/notification-services-controller@23.0.1-preview-54abb25
@metamask-previews/permission-controller@12.3.0-preview-54abb25
@metamask-previews/permission-log-controller@5.1.0-preview-54abb25
@metamask-previews/perps-controller@2.0.0-preview-54abb25
@metamask-previews/phishing-controller@17.1.1-preview-54abb25
@metamask-previews/polling-controller@16.0.4-preview-54abb25
@metamask-previews/preferences-controller@23.1.0-preview-54abb25
@metamask-previews/profile-metrics-controller@3.1.3-preview-54abb25
@metamask-previews/profile-sync-controller@28.0.2-preview-54abb25
@metamask-previews/ramps-controller@13.0.0-preview-54abb25
@metamask-previews/rate-limit-controller@7.0.1-preview-54abb25
@metamask-previews/react-data-query@0.2.0-preview-54abb25
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-54abb25
@metamask-previews/sample-controllers@4.0.4-preview-54abb25
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-54abb25
@metamask-previews/selected-network-controller@26.1.0-preview-54abb25
@metamask-previews/shield-controller@5.1.1-preview-54abb25
@metamask-previews/signature-controller@39.1.2-preview-54abb25
@metamask-previews/social-controllers@0.1.0-preview-54abb25
@metamask-previews/storage-service@1.0.1-preview-54abb25
@metamask-previews/subscription-controller@6.1.2-preview-54abb25
@metamask-previews/transaction-controller@64.0.0-preview-54abb25
@metamask-previews/transaction-pay-controller@19.0.3-preview-54abb25
@metamask-previews/user-operation-controller@41.2.0-preview-54abb25

@ccharly ccharly force-pushed the cc/add-withkeyringv2-keyring-controller branch from 39cc64a to 3c61b0b Compare April 10, 2026 07:50
@ccharly ccharly changed the title feat(keyring-controller): add withKeyringV2 and deprecate withKeyring feat(keyring-controller): add withKeyringV2 support Apr 10, 2026
@ccharly ccharly force-pushed the cc/add-withkeyringv2-keyring-controller branch from 3c61b0b to 8667557 Compare April 10, 2026 10:43
@ccharly
Copy link
Copy Markdown
Contributor Author

ccharly commented Apr 10, 2026

@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.0.0-preview-866755774
@metamask-previews/accounts-controller@37.2.0-preview-866755774
@metamask-previews/address-book-controller@7.1.1-preview-866755774
@metamask-previews/ai-controllers@0.6.3-preview-866755774
@metamask-previews/analytics-controller@1.0.1-preview-866755774
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-866755774
@metamask-previews/announcement-controller@8.1.0-preview-866755774
@metamask-previews/app-metadata-controller@2.0.1-preview-866755774
@metamask-previews/approval-controller@9.0.1-preview-866755774
@metamask-previews/assets-controller@5.0.0-preview-866755774
@metamask-previews/assets-controllers@103.1.1-preview-866755774
@metamask-previews/base-controller@9.0.1-preview-866755774
@metamask-previews/base-data-service@0.1.1-preview-866755774
@metamask-previews/bridge-controller@70.0.1-preview-866755774
@metamask-previews/bridge-status-controller@70.0.5-preview-866755774
@metamask-previews/build-utils@3.0.4-preview-866755774
@metamask-previews/chain-agnostic-permission@1.5.0-preview-866755774
@metamask-previews/claims-controller@0.5.0-preview-866755774
@metamask-previews/client-controller@1.0.1-preview-866755774
@metamask-previews/compliance-controller@2.0.0-preview-866755774
@metamask-previews/composable-controller@12.0.1-preview-866755774
@metamask-previews/config-registry-controller@0.2.0-preview-866755774
@metamask-previews/connectivity-controller@0.2.0-preview-866755774
@metamask-previews/controller-utils@11.20.0-preview-866755774
@metamask-previews/core-backend@6.2.1-preview-866755774
@metamask-previews/delegation-controller@2.1.0-preview-866755774
@metamask-previews/earn-controller@11.2.1-preview-866755774
@metamask-previews/eip-5792-middleware@3.0.3-preview-866755774
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-866755774
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-866755774
@metamask-previews/ens-controller@19.1.1-preview-866755774
@metamask-previews/eth-block-tracker@15.0.1-preview-866755774
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-866755774
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-866755774
@metamask-previews/foundryup@1.0.1-preview-866755774
@metamask-previews/gas-fee-controller@26.1.1-preview-866755774
@metamask-previews/gator-permissions-controller@3.0.1-preview-866755774
@metamask-previews/geolocation-controller@0.1.2-preview-866755774
@metamask-previews/json-rpc-engine@10.2.4-preview-866755774
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-866755774
@metamask-previews/keyring-controller@25.2.0-preview-866755774
@metamask-previews/logging-controller@8.0.1-preview-866755774
@metamask-previews/message-manager@14.1.1-preview-866755774
@metamask-previews/messenger@1.1.1-preview-866755774
@metamask-previews/messenger-cli@0.1.0-preview-866755774
@metamask-previews/money-account-controller@0.1.0-preview-866755774
@metamask-previews/multichain-account-service@8.0.1-preview-866755774
@metamask-previews/multichain-api-middleware@2.0.0-preview-866755774
@metamask-previews/multichain-network-controller@3.0.6-preview-866755774
@metamask-previews/multichain-transactions-controller@7.0.4-preview-866755774
@metamask-previews/name-controller@9.1.1-preview-866755774
@metamask-previews/network-controller@30.0.1-preview-866755774
@metamask-previews/network-enablement-controller@5.0.2-preview-866755774
@metamask-previews/notification-services-controller@23.0.1-preview-866755774
@metamask-previews/permission-controller@12.3.0-preview-866755774
@metamask-previews/permission-log-controller@5.1.0-preview-866755774
@metamask-previews/perps-controller@2.0.0-preview-866755774
@metamask-previews/phishing-controller@17.1.1-preview-866755774
@metamask-previews/polling-controller@16.0.4-preview-866755774
@metamask-previews/preferences-controller@23.1.0-preview-866755774
@metamask-previews/profile-metrics-controller@3.1.3-preview-866755774
@metamask-previews/profile-sync-controller@28.0.2-preview-866755774
@metamask-previews/ramps-controller@13.1.0-preview-866755774
@metamask-previews/rate-limit-controller@7.0.1-preview-866755774
@metamask-previews/react-data-query@0.2.0-preview-866755774
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-866755774
@metamask-previews/sample-controllers@4.0.4-preview-866755774
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-866755774
@metamask-previews/selected-network-controller@26.1.0-preview-866755774
@metamask-previews/shield-controller@5.1.1-preview-866755774
@metamask-previews/signature-controller@39.1.2-preview-866755774
@metamask-previews/social-controllers@0.1.0-preview-866755774
@metamask-previews/storage-service@1.0.1-preview-866755774
@metamask-previews/subscription-controller@6.1.2-preview-866755774
@metamask-previews/transaction-controller@64.0.0-preview-866755774
@metamask-previews/transaction-pay-controller@19.1.0-preview-866755774
@metamask-previews/user-operation-controller@41.2.0-preview-866755774

@ccharly ccharly force-pushed the cc/add-withkeyringv2-keyring-controller branch from d452085 to 6b4f746 Compare April 10, 2026 13:19
@ccharly ccharly marked this pull request as ready for review April 10, 2026 13:20
@ccharly ccharly requested review from a team as code owners April 10, 2026 13:20
@ccharly
Copy link
Copy Markdown
Contributor Author

ccharly commented Apr 10, 2026

@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.0.0-preview-6b4f746
@metamask-previews/accounts-controller@37.2.0-preview-6b4f746
@metamask-previews/address-book-controller@7.1.1-preview-6b4f746
@metamask-previews/ai-controllers@0.6.3-preview-6b4f746
@metamask-previews/analytics-controller@1.0.1-preview-6b4f746
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-6b4f746
@metamask-previews/announcement-controller@8.1.0-preview-6b4f746
@metamask-previews/app-metadata-controller@2.0.1-preview-6b4f746
@metamask-previews/approval-controller@9.0.1-preview-6b4f746
@metamask-previews/assets-controller@5.0.0-preview-6b4f746
@metamask-previews/assets-controllers@103.1.1-preview-6b4f746
@metamask-previews/base-controller@9.0.1-preview-6b4f746
@metamask-previews/base-data-service@0.1.1-preview-6b4f746
@metamask-previews/bridge-controller@70.0.1-preview-6b4f746
@metamask-previews/bridge-status-controller@70.0.5-preview-6b4f746
@metamask-previews/build-utils@3.0.4-preview-6b4f746
@metamask-previews/chain-agnostic-permission@1.5.0-preview-6b4f746
@metamask-previews/claims-controller@0.5.0-preview-6b4f746
@metamask-previews/client-controller@1.0.1-preview-6b4f746
@metamask-previews/compliance-controller@2.0.0-preview-6b4f746
@metamask-previews/composable-controller@12.0.1-preview-6b4f746
@metamask-previews/config-registry-controller@0.2.0-preview-6b4f746
@metamask-previews/connectivity-controller@0.2.0-preview-6b4f746
@metamask-previews/controller-utils@11.20.0-preview-6b4f746
@metamask-previews/core-backend@6.2.1-preview-6b4f746
@metamask-previews/delegation-controller@2.1.0-preview-6b4f746
@metamask-previews/earn-controller@11.2.1-preview-6b4f746
@metamask-previews/eip-5792-middleware@3.0.3-preview-6b4f746
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-6b4f746
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-6b4f746
@metamask-previews/ens-controller@19.1.1-preview-6b4f746
@metamask-previews/eth-block-tracker@15.0.1-preview-6b4f746
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-6b4f746
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-6b4f746
@metamask-previews/foundryup@1.0.1-preview-6b4f746
@metamask-previews/gas-fee-controller@26.1.1-preview-6b4f746
@metamask-previews/gator-permissions-controller@3.0.1-preview-6b4f746
@metamask-previews/geolocation-controller@0.1.2-preview-6b4f746
@metamask-previews/json-rpc-engine@10.2.4-preview-6b4f746
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-6b4f746
@metamask-previews/keyring-controller@25.2.0-preview-6b4f746
@metamask-previews/logging-controller@8.0.1-preview-6b4f746
@metamask-previews/message-manager@14.1.1-preview-6b4f746
@metamask-previews/messenger@1.1.1-preview-6b4f746
@metamask-previews/messenger-cli@0.1.0-preview-6b4f746
@metamask-previews/money-account-controller@0.1.0-preview-6b4f746
@metamask-previews/multichain-account-service@8.0.1-preview-6b4f746
@metamask-previews/multichain-api-middleware@2.0.0-preview-6b4f746
@metamask-previews/multichain-network-controller@3.0.6-preview-6b4f746
@metamask-previews/multichain-transactions-controller@7.0.4-preview-6b4f746
@metamask-previews/name-controller@9.1.1-preview-6b4f746
@metamask-previews/network-controller@30.0.1-preview-6b4f746
@metamask-previews/network-enablement-controller@5.0.2-preview-6b4f746
@metamask-previews/notification-services-controller@23.0.1-preview-6b4f746
@metamask-previews/permission-controller@12.3.0-preview-6b4f746
@metamask-previews/permission-log-controller@5.1.0-preview-6b4f746
@metamask-previews/perps-controller@2.0.0-preview-6b4f746
@metamask-previews/phishing-controller@17.1.1-preview-6b4f746
@metamask-previews/polling-controller@16.0.4-preview-6b4f746
@metamask-previews/preferences-controller@23.1.0-preview-6b4f746
@metamask-previews/profile-metrics-controller@3.1.3-preview-6b4f746
@metamask-previews/profile-sync-controller@28.0.2-preview-6b4f746
@metamask-previews/ramps-controller@13.1.0-preview-6b4f746
@metamask-previews/rate-limit-controller@7.0.1-preview-6b4f746
@metamask-previews/react-data-query@0.2.0-preview-6b4f746
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-6b4f746
@metamask-previews/sample-controllers@4.0.4-preview-6b4f746
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-6b4f746
@metamask-previews/selected-network-controller@26.1.0-preview-6b4f746
@metamask-previews/shield-controller@5.1.1-preview-6b4f746
@metamask-previews/signature-controller@39.1.2-preview-6b4f746
@metamask-previews/social-controllers@0.1.0-preview-6b4f746
@metamask-previews/storage-service@1.0.1-preview-6b4f746
@metamask-previews/subscription-controller@6.1.2-preview-6b4f746
@metamask-previews/transaction-controller@64.0.0-preview-6b4f746
@metamask-previews/transaction-pay-controller@19.1.0-preview-6b4f746
@metamask-previews/user-operation-controller@41.2.0-preview-6b4f746

ccharly and others added 5 commits April 13, 2026 13:42
Co-authored-by: Mathieu Artu <mathieu.artu@consensys.net>
Co-authored-by: Mathieu Artu <mathieu.artu@consensys.net>
Copy link
Copy Markdown
Contributor

@mathieuartu mathieuartu left a comment

Choose a reason for hiding this comment

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

Woohoo!

@ccharly ccharly added this pull request to the merge queue Apr 13, 2026
Merged via the queue into main with commit 086b7f0 Apr 13, 2026
341 checks passed
@ccharly ccharly deleted the cc/add-withkeyringv2-keyring-controller branch April 13, 2026 13:44
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