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
3 changes: 1 addition & 2 deletions eslint-warning-thresholds.json
Original file line number Diff line number Diff line change
Expand Up @@ -351,8 +351,7 @@
"@typescript-eslint/no-unsafe-enum-comparison": 1
},
"packages/selected-network-controller/src/SelectedNetworkController.ts": {
"@typescript-eslint/prefer-readonly": 1,
"prettier/prettier": 6
"@typescript-eslint/prefer-readonly": 1
},
"packages/selected-network-controller/tests/SelectedNetworkController.test.ts": {
"jest/no-conditional-in-test": 1
Expand Down
2 changes: 2 additions & 0 deletions packages/selected-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` ([#6500](https://github.com/MetaMask/core/pull/6500))
- Previously, `SelectedNetworkController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`.
- Bump `@metamask/utils` from `^11.2.0` to `^11.4.2` ([#6054](https://github.com/MetaMask/core/pull/6054))
- Bump `@metamask/base-controller` from `^8.0.1` to `^8.3.0` ([#6284](https://github.com/MetaMask/core/pull/6284), [#6355](https://github.com/MetaMask/core/pull/6355), [#6465](https://github.com/MetaMask/core/pull/6465))

Expand Down
1 change: 1 addition & 0 deletions packages/selected-network-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
"dependencies": {
"@metamask/base-controller": "^8.3.0",
"@metamask/json-rpc-engine": "^10.0.3",
"@metamask/messenger": "^0.2.0",
"@metamask/swappable-obj-proxy": "^2.3.0",
"@metamask/utils": "^11.4.2"
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import type { RestrictedMessenger } from '@metamask/base-controller';
import { BaseController } from '@metamask/base-controller';
import {
BaseController,
type ControllerGetStateAction,
type ControllerStateChangeEvent,
} from '@metamask/base-controller/next';
import type { Messenger } from '@metamask/messenger';
import type {
BlockTrackerProxy,
NetworkClientId,
Expand All @@ -16,9 +20,8 @@ import type {
} from '@metamask/permission-controller';
import { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';
import type { Hex } from '@metamask/utils';
import type { Patch } from 'immer';

export const controllerName = 'SelectedNetworkController';
const controllerName = 'SelectedNetworkController';

const stateMetadata = {
domains: { persist: true, anonymous: false },
Expand Down Expand Up @@ -46,15 +49,17 @@ export type SelectedNetworkControllerState = {
domains: Record<Domain, NetworkClientId>;
};

export type SelectedNetworkControllerStateChangeEvent = {
type: typeof SelectedNetworkControllerEventTypes.stateChange;
payload: [SelectedNetworkControllerState, Patch[]];
};
export type SelectedNetworkControllerStateChangeEvent =
ControllerStateChangeEvent<
typeof controllerName,
SelectedNetworkControllerState
>;

export type SelectedNetworkControllerGetSelectedNetworkStateAction = {
type: typeof SelectedNetworkControllerActionTypes.getState;
handler: () => SelectedNetworkControllerState;
};
export type SelectedNetworkControllerGetSelectedNetworkStateAction =
ControllerGetStateAction<
typeof controllerName,
SelectedNetworkControllerState
>;

export type SelectedNetworkControllerGetNetworkClientIdForDomainAction = {
type: typeof SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain;
Expand All @@ -71,7 +76,7 @@ export type SelectedNetworkControllerActions =
| SelectedNetworkControllerGetNetworkClientIdForDomainAction
| SelectedNetworkControllerSetNetworkClientIdForDomainAction;

export type AllowedActions =
type AllowedActions =
| NetworkControllerGetNetworkClientByIdAction
| NetworkControllerGetSelectedNetworkClientAction
| NetworkControllerGetStateAction
Expand All @@ -81,16 +86,14 @@ export type AllowedActions =
export type SelectedNetworkControllerEvents =
SelectedNetworkControllerStateChangeEvent;

export type AllowedEvents =
type AllowedEvents =
| NetworkControllerStateChangeEvent
| PermissionControllerStateChange;

export type SelectedNetworkControllerMessenger = RestrictedMessenger<
export type SelectedNetworkControllerMessenger = Messenger<
typeof controllerName,
SelectedNetworkControllerActions | AllowedActions,
SelectedNetworkControllerEvents | AllowedEvents,
AllowedActions['type'],
AllowedEvents['type']
SelectedNetworkControllerEvents | AllowedEvents
>;

export type SelectedNetworkControllerOptions = {
Expand Down Expand Up @@ -124,7 +127,7 @@ export class SelectedNetworkController extends BaseController<
* Construct a SelectedNetworkController controller.
*
* @param options - The controller options.
* @param options.messenger - The restricted messenger for the EncryptionPublicKey controller.
* @param options.messenger - The messenger for the SelectedNetworkController controller.
* @param options.state - The controllers initial state.
* @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.
* @param options.onPreferencesStateChange - A callback that is called when the preference state changes.
Expand All @@ -148,18 +151,18 @@ export class SelectedNetworkController extends BaseController<
this.#registerMessageHandlers();

// this is fetching all the dapp permissions from the PermissionsController and looking for any domains that are not in domains state in this controller. Then we take any missing domains and add them to state here, setting it with the globally selected networkClientId (fetched from the NetworkController)
this.messagingSystem
this.messenger
.call('PermissionController:getSubjectNames')
.filter((domain) => this.state.domains[domain] === undefined)
.forEach((domain) =>
this.setNetworkClientIdForDomain(
domain,
this.messagingSystem.call('NetworkController:getState')
this.messenger.call('NetworkController:getState')
.selectedNetworkClientId,
),
);

this.messagingSystem.subscribe(
this.messenger.subscribe(
'PermissionController:stateChange',
(_, patches) => {
patches.forEach(({ op, path }) => {
Expand All @@ -170,7 +173,7 @@ export class SelectedNetworkController extends BaseController<
if (op === 'add' && this.state.domains[domain] === undefined) {
this.setNetworkClientIdForDomain(
domain,
this.messagingSystem.call('NetworkController:getState')
this.messenger.call('NetworkController:getState')
.selectedNetworkClientId,
);
} else if (
Expand All @@ -184,7 +187,7 @@ export class SelectedNetworkController extends BaseController<
},
);

this.messagingSystem.subscribe(
this.messenger.subscribe(
'NetworkController:stateChange',
(
{ selectedNetworkClientId, networkConfigurationsByChainId },
Expand All @@ -199,12 +202,16 @@ export class SelectedNetworkController extends BaseController<
if (patch) {
const networkClientIdToChainId = Object.values(
networkConfigurationsByChainId,
).reduce((acc, network) => {
network.rpcEndpoints.forEach(
({ networkClientId }) => (acc[networkClientId] = network.chainId),
);
return acc;
}, {} as Record<string, Hex>);
).reduce(
(acc, network) => {
network.rpcEndpoints.forEach(
({ networkClientId }) =>
(acc[networkClientId] = network.chainId),
);
return acc;
},
{} as Record<string, Hex>,
);

Object.entries(this.state.domains).forEach(
([domain, networkClientIdForDomain]) => {
Expand Down Expand Up @@ -259,11 +266,11 @@ export class SelectedNetworkController extends BaseController<
}

#registerMessageHandlers(): void {
this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain,
this.getNetworkClientIdForDomain.bind(this),
);
this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain,
this.setNetworkClientIdForDomain.bind(this),
);
Expand All @@ -273,7 +280,7 @@ export class SelectedNetworkController extends BaseController<
domain: Domain,
networkClientId: NetworkClientId,
) {
const networkClient = this.messagingSystem.call(
const networkClient = this.messenger.call(
'NetworkController:getNetworkClientById',
networkClientId,
);
Expand All @@ -296,7 +303,7 @@ export class SelectedNetworkController extends BaseController<
* @param domain - The domain for which to unset the network client ID.
*/
#unsetNetworkClientIdForDomain(domain: Domain) {
const globallySelectedNetworkClient = this.messagingSystem.call(
const globallySelectedNetworkClient = this.messenger.call(
'NetworkController:getSelectedNetworkClient',
);
const networkProxy = this.#domainProxyMap.get(domain);
Expand All @@ -314,18 +321,15 @@ export class SelectedNetworkController extends BaseController<
}

#domainHasPermissions(domain: Domain): boolean {
return this.messagingSystem.call(
'PermissionController:hasPermissions',
domain,
);
return this.messenger.call('PermissionController:hasPermissions', domain);
}

// Loop through all domains and for those with permissions it points that domain's proxy
// to an unproxied instance of the globally selected network client.
// NOT the NetworkController's proxy of the globally selected networkClient
#resetAllPermissionedDomains() {
this.#domainProxyMap.forEach((_: NetworkProxy, domain: string) => {
const { selectedNetworkClientId } = this.messagingSystem.call(
const { selectedNetworkClientId } = this.messenger.call(
'NetworkController:getState',
);
// can't use public setNetworkClientIdForDomain because it will throw an error
Expand Down Expand Up @@ -362,7 +366,7 @@ export class SelectedNetworkController extends BaseController<

getNetworkClientIdForDomain(domain: Domain): NetworkClientId {
const { selectedNetworkClientId: metamaskSelectedNetworkClientId } =
this.messagingSystem.call('NetworkController:getState');
this.messenger.call('NetworkController:getState');
if (!this.#useRequestQueuePreference) {
return metamaskSelectedNetworkClientId;
}
Expand All @@ -378,7 +382,7 @@ export class SelectedNetworkController extends BaseController<
getProviderAndBlockTracker(domain: Domain): NetworkProxy {
// If the domain is 'metamask', return the NetworkController's globally selected network client proxy
if (domain === METAMASK_DOMAIN) {
const networkClient = this.messagingSystem.call(
const networkClient = this.messenger.call(
'NetworkController:getSelectedNetworkClient',
);
if (networkClient === undefined) {
Expand All @@ -395,12 +399,12 @@ export class SelectedNetworkController extends BaseController<
this.#domainHasPermissions(domain)
) {
const networkClientId = this.getNetworkClientIdForDomain(domain);
networkClient = this.messagingSystem.call(
networkClient = this.messenger.call(
'NetworkController:getNetworkClientById',
networkClientId,
);
} else {
networkClient = this.messagingSystem.call(
networkClient = this.messenger.call(
'NetworkController:getSelectedNetworkClient',
);
if (networkClient === undefined) {
Expand Down
Loading
Loading