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
2 changes: 2 additions & 0 deletions packages/multichain-network-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#6543](https://github.com/MetaMask/core/pull/6543))
- Previously, `MultichainNetworkController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`.
- Bump `@metamask/base-controller` from `^8.1.0` to `^8.3.0` ([#6355](https://github.com/MetaMask/core/pull/6355), [#6465](https://github.com/MetaMask/core/pull/6465))

## [0.12.0]
Expand Down
1 change: 1 addition & 0 deletions packages/multichain-network-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
"@metamask/controller-utils": "^11.12.0",
"@metamask/keyring-api": "^20.1.0",
"@metamask/keyring-internal-api": "^8.1.0",
"@metamask/messenger": "^0.2.0",
"@metamask/superstruct": "^3.1.0",
"@metamask/utils": "^11.4.2",
"@solana/addresses": "^2.0.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { Messenger } from '@metamask/base-controller';
import { InfuraNetworkType } from '@metamask/controller-utils';
import type { AnyAccountType } from '@metamask/keyring-api';
import {
Expand All @@ -12,6 +11,13 @@ import {
EthScope,
TrxAccountType,
} from '@metamask/keyring-api';
import {
Messenger,
MOCK_ANY_NAMESPACE,
type MessengerActions,
type MessengerEvents,
type MockAnyNamespace,
} from '@metamask/messenger';
import type {
NetworkControllerGetStateAction,
NetworkControllerSetActiveNetworkAction,
Expand All @@ -26,13 +32,7 @@ import { createMockInternalAccount } from '../../tests/utils';
import { type ActiveNetworksResponse } from '../api/accounts-api';
import { getDefaultMultichainNetworkControllerState } from '../constants';
import type { AbstractMultichainNetworkService } from '../MultichainNetworkService/AbstractMultichainNetworkService';
import {
type AllowedActions,
type AllowedEvents,
type MultichainNetworkControllerAllowedActions,
type MultichainNetworkControllerAllowedEvents,
MULTICHAIN_NETWORK_CONTROLLER_NAME,
} from '../types';
import type { MultichainNetworkControllerMessenger } from '../types';

// We exclude the generic account type, since it's used for testing purposes.
type TestKeyringAccountType = Exclude<
Expand All @@ -56,6 +56,31 @@ function createMockNetworkService(
};
}

const controllerName = 'MultichainNetworkController';

type AllMultichainNetworkControllerActions =
MessengerActions<MultichainNetworkControllerMessenger>;

type AllMultichainNetworkControllerEvents =
MessengerEvents<MultichainNetworkControllerMessenger>;

type RootMessenger = Messenger<
MockAnyNamespace,
AllMultichainNetworkControllerActions,
AllMultichainNetworkControllerEvents
>;

/**
* Creates and returns a root messenger for testing
*
* @returns A messenger instance
*/
function getRootMessenger(): RootMessenger {
return new Messenger({
namespace: MOCK_ANY_NAMESPACE,
});
}

/**
* Setup a test controller instance.
*
Expand Down Expand Up @@ -103,12 +128,7 @@ function setupController({
>;
mockNetworkService?: AbstractMultichainNetworkService;
} = {}) {
const messenger = new Messenger<
MultichainNetworkControllerAllowedActions,
MultichainNetworkControllerAllowedEvents
>();

const publishSpy = jest.spyOn(messenger, 'publish');
const messenger = getRootMessenger();

// Register action handlers
const mockGetNetworkState =
Expand Down Expand Up @@ -168,21 +188,27 @@ function setupController({
mockFindNetworkClientIdByChainId,
);

const controllerMessenger = messenger.getRestricted<
typeof MULTICHAIN_NETWORK_CONTROLLER_NAME,
AllowedActions['type'],
AllowedEvents['type']
const controllerMessenger = new Messenger<
typeof controllerName,
AllMultichainNetworkControllerActions,
AllMultichainNetworkControllerEvents,
RootMessenger
>({
name: MULTICHAIN_NETWORK_CONTROLLER_NAME,
allowedActions: [
namespace: controllerName,
parent: messenger,
});

messenger.delegate({
messenger: controllerMessenger,
actions: [
'NetworkController:setActiveNetwork',
'NetworkController:getState',
'NetworkController:removeNetwork',
'NetworkController:getSelectedChainId',
'NetworkController:findNetworkClientIdByChainId',
'AccountsController:listMultichainAccounts',
],
allowedEvents: ['AccountsController:selectedAccountChange'],
events: ['AccountsController:selectedAccountChange'],
});

const defaultNetworkService = createMockNetworkService();
Expand Down Expand Up @@ -224,6 +250,8 @@ function setupController({
messenger.publish('AccountsController:selectedAccountChange', mockAccount);
};

const publishSpy = jest.spyOn(controllerMessenger, 'publish');

return {
messenger,
controller,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BaseController } from '@metamask/base-controller';
import { BaseController } from '@metamask/base-controller/next';
import { isEvmAccountType } from '@metamask/keyring-api';
import type { InternalAccount } from '@metamask/keyring-internal-api';
import type { NetworkClientId } from '@metamask/network-controller';
Expand Down Expand Up @@ -76,7 +76,7 @@ export class MultichainNetworkController extends BaseController<
* @param id - The client ID of the EVM network to set active.
*/
async #setActiveEvmNetwork(id: NetworkClientId): Promise<void> {
const { selectedNetworkClientId } = this.messagingSystem.call(
const { selectedNetworkClientId } = this.messenger.call(
'NetworkController:getState',
);

Expand All @@ -97,12 +97,12 @@ export class MultichainNetworkController extends BaseController<

// Only notify the network controller if the selected evm network is different
if (shouldNotifyNetworkChange) {
await this.messagingSystem.call('NetworkController:setActiveNetwork', id);
await this.messenger.call('NetworkController:setActiveNetwork', id);
}

// Only publish the networkDidChange event if either the EVM network is different or we're switching between EVM and non-EVM networks
if (shouldSetEvmActive || shouldNotifyNetworkChange) {
this.messagingSystem.publish(
this.messenger.publish(
'MultichainNetworkController:networkDidChange',
id,
);
Expand All @@ -129,10 +129,7 @@ export class MultichainNetworkController extends BaseController<
});

// Notify listeners that the network changed
this.messagingSystem.publish(
'MultichainNetworkController:networkDidChange',
id,
);
this.messenger.publish('MultichainNetworkController:networkDidChange', id);
}

/**
Expand Down Expand Up @@ -164,7 +161,7 @@ export class MultichainNetworkController extends BaseController<
async getNetworksWithTransactionActivityByAccounts(): Promise<ActiveNetworksByAddress> {
// TODO: We are filtering out non-EVN accounts for now
// Support for non-EVM networks will be added in the coming weeks
const evmAccounts = this.messagingSystem
const evmAccounts = this.messenger
.call('AccountsController:listMultichainAccounts')
.filter((account) => isEvmAccountType(account.type));

Expand Down Expand Up @@ -196,7 +193,7 @@ export class MultichainNetworkController extends BaseController<
*/
async #removeEvmNetwork(chainId: CaipChainId): Promise<void> {
const hexChainId = convertEvmCaipToHexChainId(chainId);
const selectedChainId = this.messagingSystem.call(
const selectedChainId = this.messenger.call(
'NetworkController:getSelectedChainId',
);

Expand All @@ -209,18 +206,15 @@ export class MultichainNetworkController extends BaseController<
// If a non-EVM network is selected, we can delete the currently EVM selected network, but
// we automatically switch to EVM mainnet.
const ethereumMainnetHexChainId = '0x1'; // TODO: Should probably be a constant.
const clientId = this.messagingSystem.call(
const clientId = this.messenger.call(
'NetworkController:findNetworkClientIdByChainId',
ethereumMainnetHexChainId,
);

await this.messagingSystem.call(
'NetworkController:setActiveNetwork',
clientId,
);
await this.messenger.call('NetworkController:setActiveNetwork', clientId);
}

this.messagingSystem.call('NetworkController:removeNetwork', hexChainId);
this.messenger.call('NetworkController:removeNetwork', hexChainId);
}

/**
Expand Down Expand Up @@ -297,7 +291,7 @@ export class MultichainNetworkController extends BaseController<
*/
#subscribeToMessageEvents() {
// Handle network switch when account is changed
this.messagingSystem.subscribe(
this.messenger.subscribe(
'AccountsController:selectedAccountChange',
(account) => this.#handleOnSelectedAccountChange(account),
);
Expand All @@ -307,11 +301,11 @@ export class MultichainNetworkController extends BaseController<
* Registers message handlers.
*/
#registerMessageHandlers() {
this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
'MultichainNetworkController:setActiveNetwork',
this.setActiveNetwork.bind(this),
);
this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
'MultichainNetworkController:getNetworksWithTransactionActivityByAccounts',
this.getNetworksWithTransactionActivityByAccounts.bind(this),
);
Expand Down
2 changes: 1 addition & 1 deletion packages/multichain-network-controller/src/constants.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { type StateMetadata } from '@metamask/base-controller';
import { type StateMetadata } from '@metamask/base-controller/next';
import {
type CaipChainId,
BtcScope,
Expand Down
24 changes: 7 additions & 17 deletions packages/multichain-network-controller/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import type { AccountsControllerListMultichainAccountsAction } from '@metamask/a
import {
type ControllerGetStateAction,
type ControllerStateChangeEvent,
type RestrictedMessenger,
} from '@metamask/base-controller';
} from '@metamask/base-controller/next';
import type {
BtcScope,
CaipAssetType,
Expand All @@ -12,6 +11,7 @@ import type {
TrxScope,
} from '@metamask/keyring-api';
import type { InternalAccount } from '@metamask/keyring-internal-api';
import type { Messenger } from '@metamask/messenger';
import type {
NetworkStatus,
NetworkControllerSetActiveNetworkAction,
Expand Down Expand Up @@ -178,7 +178,7 @@ export type MultichainNetworkControllerEvents =
/**
* Actions that this controller is allowed to call.
*/
export type AllowedActions =
type AllowedActions =
| NetworkControllerGetStateAction
| NetworkControllerSetActiveNetworkAction
| AccountsControllerListMultichainAccountsAction
Expand All @@ -195,23 +195,13 @@ export type AccountsControllerSelectedAccountChangeEvent = {
/**
* Events that this controller is allowed to subscribe.
*/
export type AllowedEvents = AccountsControllerSelectedAccountChangeEvent;

export type MultichainNetworkControllerAllowedActions =
| MultichainNetworkControllerActions
| AllowedActions;

export type MultichainNetworkControllerAllowedEvents =
| MultichainNetworkControllerEvents
| AllowedEvents;
type AllowedEvents = AccountsControllerSelectedAccountChangeEvent;

/**
* Messenger type for the MultichainNetworkController.
*/
export type MultichainNetworkControllerMessenger = RestrictedMessenger<
export type MultichainNetworkControllerMessenger = Messenger<
typeof MULTICHAIN_NETWORK_CONTROLLER_NAME,
MultichainNetworkControllerAllowedActions,
MultichainNetworkControllerAllowedEvents,
AllowedActions['type'],
AllowedEvents['type']
MultichainNetworkControllerActions | AllowedActions,
MultichainNetworkControllerEvents | AllowedEvents
>;
1 change: 1 addition & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3895,6 +3895,7 @@ __metadata:
"@metamask/keyring-api": "npm:^20.1.0"
"@metamask/keyring-controller": "npm:^23.0.0"
"@metamask/keyring-internal-api": "npm:^8.1.0"
"@metamask/messenger": "npm:^0.2.0"
"@metamask/network-controller": "npm:^24.1.0"
"@metamask/superstruct": "npm:^3.1.0"
"@metamask/utils": "npm:^11.4.2"
Expand Down
Loading