Skip to content
Open
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
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@

## Initialization
/packages/wallet/src/initialization/instances/accounts-controller/ @MetaMask/accounts-engineers
/packages/wallet/src/initialization/instances/address-book-controller/ @MetaMask/confirmations
/packages/wallet/src/initialization/instances/approval-controller/ @MetaMask/confirmations
/packages/wallet/src/initialization/instances/connectivity-controller/ @MetaMask/core-platform
/packages/wallet/src/initialization/instances/keyring-controller/ @MetaMask/accounts-engineers @MetaMask/core-platform
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,7 @@ linkStyle default opacity:0.5
user_operation_controller --> transaction_controller;
user_operation_controller --> eth_block_tracker;
wallet --> accounts_controller;
wallet --> address_book_controller;
wallet --> approval_controller;
wallet --> base_controller;
wallet --> connectivity_controller;
Expand Down
4 changes: 4 additions & 0 deletions packages/wallet/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- **BREAKING:** Wire `AddressBookController` into the default wallet initialization ([#9291](https://github.com/MetaMask/core/pull/9291))

## [5.0.0]

### Added
Expand Down
1 change: 1 addition & 0 deletions packages/wallet/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
},
"dependencies": {
"@metamask/accounts-controller": "^39.0.3",
"@metamask/address-book-controller": "^7.1.2",
"@metamask/approval-controller": "^9.0.2",
"@metamask/base-controller": "^9.1.0",
"@metamask/browser-passworder": "^6.0.0",
Expand Down
57 changes: 57 additions & 0 deletions packages/wallet/src/Wallet.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { getDefaultAddressBookControllerState } from '@metamask/address-book-controller';
import { CONNECTIVITY_STATUSES } from '@metamask/connectivity-controller';
import { Messenger } from '@metamask/messenger';
import { InMemoryStorageAdapter } from '@metamask/storage-service';
Expand Down Expand Up @@ -262,6 +263,62 @@ describe('Wallet', () => {
});
});

describe('AddressBookController', () => {
const ADDRESS = '0x1234567890123456789012345678901234567890';

it('is wired and exposes its state on the wallet messenger', async () => {
const wallet = await setupWallet();
const { messenger } = wallet;

expect(messenger.call('AddressBookController:getState')).toStrictEqual(
getDefaultAddressBookControllerState(),
);
});

it('applies initial state passed through the Wallet constructor', () => {
const entry = {
address: ADDRESS,
name: 'Alice',
chainId: '0x1' as const,
memo: '',
isEns: false,
};

const wallet = new Wallet({
state: {
AddressBookController: {
addressBook: { '0x1': { [ADDRESS]: entry } },
},
},
instanceOptions: {
connectivityController: {
connectivityAdapter: new AlwaysOnlineAdapter(),
},
networkController: {
infuraProjectId: 'fake-infura-project-id',
},
storageService: {
storage: new InMemoryStorageAdapter(),
},
remoteFeatureFlagController: REMOTE_FEATURE_FLAG_OPTIONS,
},
});

expect(
wallet.state.AddressBookController.addressBook['0x1'][ADDRESS],
).toStrictEqual(entry);
});

it('routes its method actions through the wallet messenger', async () => {
const wallet = await setupWallet();
const { messenger } = wallet;

messenger.call('AddressBookController:set', ADDRESS, 'Alice');

expect(messenger.call('AddressBookController:list')).toHaveLength(1);
});
});

describe('ConnectivityController', () => {
it('reports online connectivity status', () => {
const wallet = new Wallet({
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import {
AddressBookController,
getDefaultAddressBookControllerState,
} from '@metamask/address-book-controller';
import { Messenger } from '@metamask/messenger';

import { defaultConfigurations } from '../../defaults';
import type {
DefaultActions,
DefaultEvents,
RootMessenger,
} from '../../defaults';
import { addressBookController } from './address-book-controller';

const ADDRESS = '0x1234567890123456789012345678901234567890';

/**
* Creates a root messenger for use in tests.
*
* @returns A root messenger.
*/
function getRootMessenger(): RootMessenger<DefaultActions, DefaultEvents> {
return new Messenger({ namespace: 'Root' });
}

describe('addressBookController', () => {
it('is registered as a default initialization configuration', () => {
expect(Object.values(defaultConfigurations)).toContain(
addressBookController,
);
});

it('initializes an AddressBookController with default state', () => {
const messenger = addressBookController.getMessenger(getRootMessenger());

const instance = addressBookController.init({
state: undefined,
messenger,
options: {},
});

expect(instance).toBeInstanceOf(AddressBookController);
expect(instance.state).toStrictEqual(
getDefaultAddressBookControllerState(),
);
});

it('merges provided state over the defaults', () => {
const messenger = addressBookController.getMessenger(getRootMessenger());

const entry = {
address: ADDRESS,
name: 'Alice',
chainId: '0x1' as const,
memo: '',
isEns: false,
};

const instance = addressBookController.init({
state: { addressBook: { '0x1': { [ADDRESS]: entry } } },
messenger,
options: {},
});

expect(instance.state.addressBook['0x1'][ADDRESS]).toStrictEqual(entry);
});

it('exposes its state through the root messenger', () => {
const rootMessenger = getRootMessenger();
const messenger = addressBookController.getMessenger(rootMessenger);

addressBookController.init({ state: undefined, messenger, options: {} });

expect(rootMessenger.call('AddressBookController:getState')).toStrictEqual(
getDefaultAddressBookControllerState(),
);
});

it('registers its method actions on the root messenger', () => {
const rootMessenger = getRootMessenger();
const messenger = addressBookController.getMessenger(rootMessenger);

const instance = addressBookController.init({
state: undefined,
messenger,
options: {},
});

rootMessenger.call('AddressBookController:set', ADDRESS, 'Alice');

expect(instance.list()).toHaveLength(1);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import {
AddressBookController,
AddressBookControllerMessenger,
} from '@metamask/address-book-controller';
import { Messenger } from '@metamask/messenger';

import type { InitializationConfiguration } from '../../types';

export const addressBookController: InitializationConfiguration<
AddressBookController,
AddressBookControllerMessenger
> = {
name: 'AddressBookController',
init: ({ state, messenger }) =>
new AddressBookController({
state,
messenger,
}),
getMessenger: (parent) =>
new Messenger({
namespace: 'AddressBookController',
parent,
}),
};
1 change: 1 addition & 0 deletions packages/wallet/src/initialization/instances/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export { accountsController } from './accounts-controller/accounts-controller';
export { addressBookController } from './address-book-controller/address-book-controller';
export { approvalController } from './approval-controller/approval-controller';
export { connectivityController } from './connectivity-controller/connectivity-controller';
export { keyringController } from './keyring-controller/keyring-controller';
Expand Down
1 change: 1 addition & 0 deletions packages/wallet/tsconfig.build.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
},
"references": [
{ "path": "../accounts-controller/tsconfig.build.json" },
{ "path": "../address-book-controller/tsconfig.build.json" },
{ "path": "../approval-controller/tsconfig.build.json" },
{ "path": "../base-controller/tsconfig.build.json" },
{ "path": "../connectivity-controller/tsconfig.build.json" },
Expand Down
1 change: 1 addition & 0 deletions packages/wallet/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
},
"references": [
{ "path": "../accounts-controller/tsconfig.json" },
{ "path": "../address-book-controller/tsconfig.json" },
{ "path": "../approval-controller/tsconfig.json" },
{ "path": "../base-controller/tsconfig.json" },
{ "path": "../connectivity-controller/tsconfig.json" },
Expand Down
1 change: 1 addition & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -8935,6 +8935,7 @@ __metadata:
resolution: "@metamask/wallet@workspace:packages/wallet"
dependencies:
"@metamask/accounts-controller": "npm:^39.0.3"
"@metamask/address-book-controller": "npm:^7.1.2"
"@metamask/approval-controller": "npm:^9.0.2"
"@metamask/auto-changelog": "npm:^6.1.0"
"@metamask/base-controller": "npm:^9.1.0"
Expand Down
Loading