From 05cf84b4d7330566b876de08872911b6f4354f64 Mon Sep 17 00:00:00 2001 From: Charly Chevalier Date: Thu, 15 Jan 2026 15:51:07 +0100 Subject: [PATCH 1/2] feat: add KeyringVersion + versions in KeyringCapabilites --- packages/keyring-api/CHANGELOG.md | 4 ++++ .../src/api/v2/keyring-capabilities.ts | 23 +++++++++++++++++++ .../api/v2/wrapper/keyring-wrapper.test.ts | 2 ++ packages/keyring-eth-hd/src/hd-keyring-v2.ts | 2 ++ .../src/ledger-keyring-v2.ts | 2 ++ .../src/simple-keyring-v2.ts | 2 ++ .../src/trezor-keyring-v2.ts | 2 ++ 7 files changed, 37 insertions(+) diff --git a/packages/keyring-api/CHANGELOG.md b/packages/keyring-api/CHANGELOG.md index c7b3cfff3..2eda68df1 100644 --- a/packages/keyring-api/CHANGELOG.md +++ b/packages/keyring-api/CHANGELOG.md @@ -16,6 +16,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `EthKeyringWrapper` abstract class for Ethereum-based `KeyringV2` implementations ([#404](https://github.com/MetaMask/accounts/pull/404)) - Provides common Ethereum signing method routing (`submitRequest`) for all Ethereum-based keyrings. - Add `KeyringWrapper` base class to adapt legacy keyrings to `KeyringV2` ([#398](https://github.com/MetaMask/accounts/pull/398)), ([#410](https://github.com/MetaMask/accounts/pull/410)) +- Add `KeyringVersion` enum and required `versions` field to `KeyringCapabilities` ([#TODO](https://github.com/MetaMask/accounts/pull/TODO)) + - `KeyringVersion` enum represents keyring API versions: `V1 = 1`, `V2 = 2`. + - Keyrings must now declare which API versions they support via the `versions` field. + - The `versions` field is a non-empty array of `KeyringVersion` values. ### Changed diff --git a/packages/keyring-api/src/api/v2/keyring-capabilities.ts b/packages/keyring-api/src/api/v2/keyring-capabilities.ts index 47c3e9cce..3c5424cdf 100644 --- a/packages/keyring-api/src/api/v2/keyring-capabilities.ts +++ b/packages/keyring-api/src/api/v2/keyring-capabilities.ts @@ -1,6 +1,7 @@ import { array, boolean, + enums, exactOptional, nonempty, object, @@ -14,10 +15,31 @@ import { } from './private-key'; import { CaipChainIdStruct } from '../caip'; +/** + * Enum representing keyring API versions. + */ +export enum KeyringVersion { + /** + * Initial Keyring API. + */ + V1 = 1, + + /** + * Unified keyring API introducing the new capabilities system. + * + * Requires Snap platform: TBD (TODO) + */ + V2 = 2, +} + /** * Struct for {@link KeyringCapabilities}. */ export const KeyringCapabilitiesStruct = object({ + /** + * List of keyring API versions that this keyring supports. + */ + versions: nonempty(array(enums([KeyringVersion.V1, KeyringVersion.V2]))), /** * List of CAIP-2 chain IDs that this keyring supports. */ @@ -78,6 +100,7 @@ export const KeyringCapabilitiesStruct = object({ * @example * ```ts * const capabilities: KeyringCapabilities = { + * versions: [KeyringVersion.V2], * scopes: ['bip122:_'], * bip44: { * derivePath: true, diff --git a/packages/keyring-api/src/api/v2/wrapper/keyring-wrapper.test.ts b/packages/keyring-api/src/api/v2/wrapper/keyring-wrapper.test.ts index 602ac46fe..1218942b7 100644 --- a/packages/keyring-api/src/api/v2/wrapper/keyring-wrapper.test.ts +++ b/packages/keyring-api/src/api/v2/wrapper/keyring-wrapper.test.ts @@ -5,6 +5,7 @@ import { v4 as uuidv4 } from 'uuid'; import { KeyringWrapper } from './keyring-wrapper'; import type { KeyringAccount } from '../../account'; import type { KeyringCapabilities } from '../keyring-capabilities'; +import { KeyringVersion } from '../keyring-capabilities'; import { KeyringType } from '../keyring-type'; class TestKeyringWrapper extends KeyringWrapper { @@ -127,6 +128,7 @@ class TestKeyring implements Keyring { } const capabilities: KeyringCapabilities = { + versions: [KeyringVersion.V2], scopes: ['eip155:10'], }; diff --git a/packages/keyring-eth-hd/src/hd-keyring-v2.ts b/packages/keyring-eth-hd/src/hd-keyring-v2.ts index 3e292be3e..e7baacee9 100644 --- a/packages/keyring-eth-hd/src/hd-keyring-v2.ts +++ b/packages/keyring-eth-hd/src/hd-keyring-v2.ts @@ -13,6 +13,7 @@ import { type KeyringCapabilities, type KeyringV2, KeyringType, + KeyringVersion, PrivateKeyEncoding, type EntropySourceId, } from '@metamask/keyring-api'; @@ -39,6 +40,7 @@ const HD_KEYRING_METHODS = [ ]; const hdKeyringV2Capabilities: KeyringCapabilities = { + versions: [KeyringVersion.V2], scopes: [EthScope.Eoa], bip44: { deriveIndex: true, diff --git a/packages/keyring-eth-ledger-bridge/src/ledger-keyring-v2.ts b/packages/keyring-eth-ledger-bridge/src/ledger-keyring-v2.ts index e4efb49fe..bacfc220a 100644 --- a/packages/keyring-eth-ledger-bridge/src/ledger-keyring-v2.ts +++ b/packages/keyring-eth-ledger-bridge/src/ledger-keyring-v2.ts @@ -10,6 +10,7 @@ import { type KeyringCapabilities, type KeyringV2, KeyringType, + KeyringVersion, type EntropySourceId, } from '@metamask/keyring-api'; import type { AccountId, EthKeyring } from '@metamask/keyring-utils'; @@ -28,6 +29,7 @@ const LEDGER_KEYRING_METHODS = [ ]; const ledgerKeyringV2Capabilities: KeyringCapabilities = { + versions: [KeyringVersion.V2], scopes: [EthScope.Eoa], bip44: { deriveIndex: true, diff --git a/packages/keyring-eth-simple/src/simple-keyring-v2.ts b/packages/keyring-eth-simple/src/simple-keyring-v2.ts index 68e03051c..46a3095f2 100644 --- a/packages/keyring-eth-simple/src/simple-keyring-v2.ts +++ b/packages/keyring-eth-simple/src/simple-keyring-v2.ts @@ -12,6 +12,7 @@ import { type KeyringCapabilities, type KeyringV2, KeyringType, + KeyringVersion, PrivateKeyEncoding, } from '@metamask/keyring-api'; import type { AccountId } from '@metamask/keyring-utils'; @@ -38,6 +39,7 @@ const SIMPLE_KEYRING_METHODS = [ ]; const simpleKeyringV2Capabilities: KeyringCapabilities = { + versions: [KeyringVersion.V2], scopes: [EthScope.Eoa], privateKey: { importFormats: [ diff --git a/packages/keyring-eth-trezor/src/trezor-keyring-v2.ts b/packages/keyring-eth-trezor/src/trezor-keyring-v2.ts index 5e3f31a56..b6b854375 100644 --- a/packages/keyring-eth-trezor/src/trezor-keyring-v2.ts +++ b/packages/keyring-eth-trezor/src/trezor-keyring-v2.ts @@ -10,6 +10,7 @@ import { type KeyringCapabilities, type KeyringV2, KeyringType, + KeyringVersion, type EntropySourceId, } from '@metamask/keyring-api'; import type { AccountId, EthKeyring } from '@metamask/keyring-utils'; @@ -29,6 +30,7 @@ const TREZOR_KEYRING_METHODS = [ ]; const trezorKeyringV2Capabilities: KeyringCapabilities = { + versions: [KeyringVersion.V2], scopes: [EthScope.Eoa], bip44: { deriveIndex: true, From 1cacda026c09b93c7082d648582ba74bfc0af243 Mon Sep 17 00:00:00 2001 From: Charly Chevalier Date: Thu, 15 Jan 2026 16:38:40 +0100 Subject: [PATCH 2/2] chore: fix changelog --- packages/keyring-api/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/keyring-api/CHANGELOG.md b/packages/keyring-api/CHANGELOG.md index 2eda68df1..044b4fb67 100644 --- a/packages/keyring-api/CHANGELOG.md +++ b/packages/keyring-api/CHANGELOG.md @@ -16,7 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `EthKeyringWrapper` abstract class for Ethereum-based `KeyringV2` implementations ([#404](https://github.com/MetaMask/accounts/pull/404)) - Provides common Ethereum signing method routing (`submitRequest`) for all Ethereum-based keyrings. - Add `KeyringWrapper` base class to adapt legacy keyrings to `KeyringV2` ([#398](https://github.com/MetaMask/accounts/pull/398)), ([#410](https://github.com/MetaMask/accounts/pull/410)) -- Add `KeyringVersion` enum and required `versions` field to `KeyringCapabilities` ([#TODO](https://github.com/MetaMask/accounts/pull/TODO)) +- Add `KeyringVersion` enum and required `versions` field to `KeyringCapabilities` ([#439](https://github.com/MetaMask/accounts/pull/439)) - `KeyringVersion` enum represents keyring API versions: `V1 = 1`, `V2 = 2`. - Keyrings must now declare which API versions they support via the `versions` field. - The `versions` field is a non-empty array of `KeyringVersion` values.