Skip to content

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

Open
ccharly wants to merge 20 commits intomainfrom
cc/add-withkeyringv2-keyring-controller
Open

feat(keyring-controller): add withKeyringV2 support#8390
ccharly wants to merge 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

* the given operation with the wrapped keyring as a mutually
* exclusive atomic operation.
*
* We re-wrap the keyring in a `KeyringV2` adapter on each invocation,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is not true anymore based on your awesome work ⭐

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.

Ah damn true, I forgot to update the docs with this 🙈 Let me re-write something for this

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.

Comment on lines +1925 to +1926
* We re-wrap the keyring in a `KeyringV2` adapter on each invocation,
* since V2 wrappers are ephemeral adapters created on-the-fly, and cheap to create.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No longer true, we could add something like The cached KeyringV2 adapter is retrieved from the keyring entry. instead? WDYT?

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.

Comment on lines +1936 to +1937
* Selection is performed against the V1 keyrings in `#keyrings`, since
* V2 wrappers are ephemeral adapters created on-the-fly.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No longer true

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.

Comment on lines +329 to +330
* Selection is performed against the V1 keyrings in `#keyrings`, since
* V2 wrappers are ephemeral adapters created on-the-fly.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same

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.

/**
* Keyring selector used for `withKeyringV2` (see {@link KeyringController#withKeyringV2} and {@link KeyringSelector}).
*/
export type KeyringSelectorV2<SelectedKeyring extends KeyringV2 = KeyringV2> =
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Wondering if the generic is overkill? We always narrow down to KeyringV2 in the filter I guess?

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.

I think we should keep it. We introduced this recently with @danroc and this allow us to do stuff like:

await controller.withKeyringV2({ filter: isSnapKeyring }, ({ keyring }) => {
  if (keyring.getSnapId() === ...) { // Only available on `SnapKeyringV2`.
    ...
  }
});

Like keyring is already properly inferred as SnapKeyringV2 AND we still have a constraint of KeyringV2, so semantically this is still correct!

Comment on lines +1985 to +1989
if (Object.is(result, keyring)) {
throw new KeyringControllerError(
KeyringControllerErrorMessage.UnsafeDirectKeyringAccess,
);
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit: duplication here and in the unsafe variant. Could we use a broader version of assertNoUnsafeDirectKeyringAccess maybe?

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.

Maybe it's time yep 😄 I'll see what I can do!

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.

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>
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