Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions packages/accounts-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed

- Use `KeyringV1Adapter` for `SnapKeyring` v2 accounts ([#8703](https://github.com/MetaMask/core/pull/8703))
- `SnapKeyring` v2 instances will be adapted/wrapped by a v1 keyring adapter, making it compatible with the current `KeyringController` keyrings management.
- Bump `@metamask/keyring-utils` from `^3.1.0` to `^3.2.1` ([#8703](https://github.com/MetaMask/core/pull/8703))

## [38.0.0]

### Added
Expand Down
3 changes: 2 additions & 1 deletion packages/accounts-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@
"@metamask/keyring-api": "^23.1.0",
"@metamask/keyring-controller": "^25.4.0",
"@metamask/keyring-internal-api": "^11.0.1",
"@metamask/keyring-utils": "^3.1.0",
"@metamask/keyring-sdk": "^2.1.1",
"@metamask/keyring-utils": "^3.2.1",
"@metamask/messenger": "^1.2.0",
"@metamask/network-controller": "^30.1.0",
"@metamask/superstruct": "^3.1.0",
Expand Down
29 changes: 24 additions & 5 deletions packages/accounts-controller/src/AccountsController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
KeyringTypes,
} from '@metamask/keyring-controller';
import type { InternalAccount } from '@metamask/keyring-internal-api';
import { KeyringV1Adapter } from '@metamask/keyring-sdk/v2';
import { MOCK_ANY_NAMESPACE, Messenger } from '@metamask/messenger';
import type {
MessengerActions,
Expand Down Expand Up @@ -263,7 +264,6 @@ function buildMockSnapKeyringV2(
snapId: string,
overrides: Partial<SnapKeyringV2> = {},
): SnapKeyringV2 {
// We need to use the same prototype as we use some `instanceof` checks.
const instance = Object.create(SnapKeyringV2.prototype) as SnapKeyringV2;

// The `snapId` is usually injected via `deserialize`, but here we just mock the getter directly.
Expand All @@ -275,6 +275,19 @@ function buildMockSnapKeyringV2(
return Object.assign(instance, overrides);
}

/**
* Wraps a mock SnapKeyringV2 in a KeyringV1Adapter so it passes the
* `instanceof KeyringV1Adapter` check in AccountsController.
*
* @param inner - The mock SnapKeyringV2 instance to wrap.
* @returns A KeyringV1Adapter wrapping the mock instance.
*/
function buildMockKeyringV1Adapter(
inner: SnapKeyringV2,
): KeyringV1Adapter<SnapKeyringV2> {
return new KeyringV1Adapter(inner);
}

/**
* Builds a new instance of the root messenger.
*
Expand Down Expand Up @@ -882,7 +895,9 @@ describe('AccountsController', () => {
const messenger = buildMessenger();
messenger.registerActionHandler(
'KeyringController:getKeyringsByType',
mockGetKeyringByType.mockReturnValue([mockSnapKeyringV2Instance]),
mockGetKeyringByType.mockReturnValue([
buildMockKeyringV1Adapter(mockSnapKeyringV2Instance),
]),
);

const mockNewKeyringState = {
Expand Down Expand Up @@ -945,7 +960,9 @@ describe('AccountsController', () => {
const messenger = buildMessenger();
messenger.registerActionHandler(
'KeyringController:getKeyringsByType',
mockGetKeyringByType.mockReturnValue([mockSnapKeyringV2Instance]),
mockGetKeyringByType.mockReturnValue([
buildMockKeyringV1Adapter(mockSnapKeyringV2Instance),
]),
);

const mockNewKeyringState = {
Expand Down Expand Up @@ -989,7 +1006,7 @@ describe('AccountsController', () => {
messenger.registerActionHandler(
'KeyringController:getKeyringsByType',
mockGetKeyringByType.mockReturnValue([
// Plain object — does NOT pass instanceof SnapKeyringV2
// Plain object — does NOT pass instanceof KeyringV1Adapter
{ lookupByAddress: jest.fn() },
]),
);
Expand Down Expand Up @@ -3294,7 +3311,9 @@ describe('AccountsController', () => {
);
messenger.registerActionHandler(
'KeyringController:getKeyringsByType',
mockGetKeyringByType.mockReturnValue([mockSnapKeyringV2Instance]),
mockGetKeyringByType.mockReturnValue([
buildMockKeyringV1Adapter(mockSnapKeyringV2Instance),
]),
);

const { accountsController } = setupAccountsController({
Expand Down
17 changes: 13 additions & 4 deletions packages/accounts-controller/src/AccountsController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import type {
KeyringObject,
} from '@metamask/keyring-controller';
import type { InternalAccount } from '@metamask/keyring-internal-api';
import { KeyringV1Adapter } from '@metamask/keyring-sdk/v2';
import { isScopeEqualToAny } from '@metamask/keyring-utils';
import type { Messenger, ExtractEventPayload } from '@metamask/messenger';
import type { NetworkClientId } from '@metamask/network-controller';
Expand Down Expand Up @@ -875,12 +876,20 @@ export class AccountsController extends BaseController<
KeyringType.Snap,
);

// Snap keyring v2 are "per-Snaps", so we need to iterate over all of them to find the account.
// Snap keyring v2 are "per-Snaps" (and can be accessed using their v1 adapter), so we need to
// iterate over all of them to find the account.
// NOTE: `:getKeyringsByType` will only return v1 instances, that's why we need to use their v1
// adapter + `unwrap` method to get the reference to their v2 instance.
for (const keyring of keyrings) {
if (keyring instanceof SnapKeyringV2) {
if (keyring instanceof KeyringV1Adapter) {
// NOTE: We already filtering by `KeyringType.Snap`, so we are sure that those adapters
// are wrapping a Snap keyring v2.
const adapter = keyring as KeyringV1Adapter<SnapKeyringV2>;
const keyringV2 = adapter.unwrap();

// We use the synchronous method here since this method is used during `:stateChange` that are
// use synchronous handlers.
const account = keyring.lookupByAddress(address);
const account = keyringV2.lookupByAddress(address);
if (account) {
return {
...account,
Expand All @@ -893,7 +902,7 @@ export class AccountsController extends BaseController<
type: KeyringType.Snap,
},
snap: {
id: keyring.snapId,
id: keyringV2.snapId,
},
},
};
Expand Down
2 changes: 1 addition & 1 deletion packages/keyring-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
"@lavamoat/allow-scripts": "^3.0.4",
"@lavamoat/preinstall-always-fail": "^2.1.0",
"@metamask/auto-changelog": "^6.1.0",
"@metamask/keyring-utils": "^3.1.0",
"@metamask/keyring-utils": "^3.2.1",
"@metamask/scure-bip39": "^2.1.1",
"@ts-bridge/cli": "^0.6.4",
"@types/jest": "^29.5.14",
Expand Down
2 changes: 1 addition & 1 deletion packages/money-account-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
},
"devDependencies": {
"@metamask/auto-changelog": "^6.1.0",
"@metamask/keyring-utils": "^3.1.0",
"@metamask/keyring-utils": "^3.2.1",
"@metamask/utils": "^11.9.0",
"@ts-bridge/cli": "^0.6.4",
"@types/jest": "^29.5.14",
Expand Down
1 change: 1 addition & 0 deletions packages/multichain-account-service/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Bump `@metamask/keyring-api` from `^21.6.0` to `^23.1.0` ([#8464](https://github.com/MetaMask/core/pull/8464), [#8647](https://github.com/MetaMask/core/pull/8647))
- Bump `@metamask/keyring-internal-api` from `^10.0.0` to `^11.0.1` ([#8464](https://github.com/MetaMask/core/pull/8464), [#8584](https://github.com/MetaMask/core/pull/8584), [#8647](https://github.com/MetaMask/core/pull/8647))
- Bump `@metamask/keyring-snap-client` from `^8.2.0` to `^9.0.2` ([#8464](https://github.com/MetaMask/core/pull/8464), [#8647](https://github.com/MetaMask/core/pull/8647))
- Bump `@metamask/keyring-utils` from `^3.1.0` to `^3.2.1` ([#8703](https://github.com/MetaMask/core/pull/8703))

## [8.0.1]

Expand Down
2 changes: 1 addition & 1 deletion packages/multichain-account-service/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
"@metamask/keyring-controller": "^25.4.0",
"@metamask/keyring-internal-api": "^11.0.1",
"@metamask/keyring-snap-client": "^9.0.2",
"@metamask/keyring-utils": "^3.1.0",
"@metamask/keyring-utils": "^3.2.1",
"@metamask/messenger": "^1.2.0",
"@metamask/snaps-controllers": "^19.0.0",
"@metamask/snaps-sdk": "^11.0.0",
Expand Down
31 changes: 16 additions & 15 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2579,7 +2579,8 @@ __metadata:
"@metamask/keyring-api": "npm:^23.1.0"
"@metamask/keyring-controller": "npm:^25.4.0"
"@metamask/keyring-internal-api": "npm:^11.0.1"
"@metamask/keyring-utils": "npm:^3.1.0"
"@metamask/keyring-sdk": "npm:^2.1.1"
"@metamask/keyring-utils": "npm:^3.2.1"
"@metamask/messenger": "npm:^1.2.0"
"@metamask/network-controller": "npm:^30.1.0"
"@metamask/providers": "npm:^22.1.0"
Expand Down Expand Up @@ -4240,7 +4241,7 @@ __metadata:
"@metamask/eth-simple-keyring": "npm:^12.0.2"
"@metamask/keyring-api": "npm:^23.1.0"
"@metamask/keyring-internal-api": "npm:^11.0.1"
"@metamask/keyring-utils": "npm:^3.1.0"
"@metamask/keyring-utils": "npm:^3.2.1"
"@metamask/messenger": "npm:^1.2.0"
"@metamask/scure-bip39": "npm:^2.1.1"
"@metamask/utils": "npm:^11.9.0"
Expand Down Expand Up @@ -4287,21 +4288,21 @@ __metadata:
languageName: node
linkType: hard

"@metamask/keyring-sdk@npm:^2.0.2":
version: 2.0.2
resolution: "@metamask/keyring-sdk@npm:2.0.2"
"@metamask/keyring-sdk@npm:^2.0.2, @metamask/keyring-sdk@npm:^2.1.1":
version: 2.1.1
resolution: "@metamask/keyring-sdk@npm:2.1.1"
dependencies:
"@ethereumjs/tx": "npm:^5.4.0"
"@metamask/eth-sig-util": "npm:^8.2.0"
"@metamask/keyring-api": "npm:^23.1.0"
"@metamask/keyring-utils": "npm:^3.2.0"
"@metamask/keyring-utils": "npm:^3.3.1"
"@metamask/scure-bip39": "npm:^2.1.1"
"@metamask/superstruct": "npm:^3.1.0"
"@metamask/utils": "npm:^11.11.0"
async-mutex: "npm:^0.5.0"
ethereum-cryptography: "npm:^2.2.1"
uuid: "npm:^9.0.1"
checksum: 10/2f456613df81580b032215ddf1c90fa9440442d631945329094a488743a71fdbbfe787c2c0809a315a1368ddbf9d3755faa936c54094cb32958fe8222f7e7a86
checksum: 10/bd10f41e124a61dd53c3914ab8f53e3519bc90905668f83e386bd0c7053754e446396a39b88f88228b2a001ee02762b287495e284ff3052ff5b7636803ac437b
languageName: node
linkType: hard

Expand Down Expand Up @@ -4337,15 +4338,15 @@ __metadata:
languageName: node
linkType: hard

"@metamask/keyring-utils@npm:^3.1.0, @metamask/keyring-utils@npm:^3.2.0":
version: 3.2.0
resolution: "@metamask/keyring-utils@npm:3.2.0"
"@metamask/keyring-utils@npm:^3.2.0, @metamask/keyring-utils@npm:^3.2.1, @metamask/keyring-utils@npm:^3.3.1":
version: 3.3.1
resolution: "@metamask/keyring-utils@npm:3.3.1"
dependencies:
"@ethereumjs/tx": "npm:^5.4.0"
"@metamask/superstruct": "npm:^3.1.0"
"@metamask/utils": "npm:^11.1.0"
"@metamask/utils": "npm:^11.11.0"
bitcoin-address-validation: "npm:^2.2.3"
checksum: 10/e71aa1b9ec9a24c72ea6d4864a10f11e68e5b77789728067230ec40cee2e85ad69073404d2fa62c760f014fd910fb68b3305a08f906f2534b9119e2a26d06a2b
checksum: 10/d0917b2f634d9eb2f563827739fca00c1675ee90674ec49b2b68afcb604aee843d6c5be5d79e9780fa22d29f71fc876f40b2d3d0ed4cab7f5948937ddd276691
languageName: node
linkType: hard

Expand Down Expand Up @@ -4496,7 +4497,7 @@ __metadata:
"@metamask/eth-money-keyring": "npm:^2.0.4"
"@metamask/keyring-api": "npm:^23.1.0"
"@metamask/keyring-controller": "npm:^25.4.0"
"@metamask/keyring-utils": "npm:^3.1.0"
"@metamask/keyring-utils": "npm:^3.2.1"
"@metamask/messenger": "npm:^1.2.0"
"@metamask/utils": "npm:^11.9.0"
"@ts-bridge/cli": "npm:^0.6.4"
Expand Down Expand Up @@ -4552,7 +4553,7 @@ __metadata:
"@metamask/keyring-controller": "npm:^25.4.0"
"@metamask/keyring-internal-api": "npm:^11.0.1"
"@metamask/keyring-snap-client": "npm:^9.0.2"
"@metamask/keyring-utils": "npm:^3.1.0"
"@metamask/keyring-utils": "npm:^3.2.1"
"@metamask/messenger": "npm:^1.2.0"
"@metamask/providers": "npm:^22.1.0"
"@metamask/snaps-controllers": "npm:^19.0.0"
Expand Down Expand Up @@ -5797,7 +5798,7 @@ __metadata:
languageName: unknown
linkType: soft

"@metamask/utils@npm:^11.0.1, @metamask/utils@npm:^11.1.0, @metamask/utils@npm:^11.10.0, @metamask/utils@npm:^11.11.0, @metamask/utils@npm:^11.4.0, @metamask/utils@npm:^11.4.2, @metamask/utils@npm:^11.8.1, @metamask/utils@npm:^11.9.0":
"@metamask/utils@npm:^11.0.1, @metamask/utils@npm:^11.10.0, @metamask/utils@npm:^11.11.0, @metamask/utils@npm:^11.4.0, @metamask/utils@npm:^11.4.2, @metamask/utils@npm:^11.8.1, @metamask/utils@npm:^11.9.0":
version: 11.11.0
resolution: "@metamask/utils@npm:11.11.0"
dependencies:
Expand Down
Loading