@metamask-previews/multichain-network-controller 0.0.0-preview-cb58d7d1 → 0.0.0-preview-ac664446
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MultichainNetworkController.cjs +54 -58
- package/dist/MultichainNetworkController.cjs.map +1 -1
- package/dist/MultichainNetworkController.d.cts.map +1 -1
- package/dist/MultichainNetworkController.d.mts.map +1 -1
- package/dist/MultichainNetworkController.mjs +54 -58
- package/dist/MultichainNetworkController.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -4,7 +4,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
4
4
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
5
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
6
|
};
|
|
7
|
-
var _MultichainNetworkController_instances, _MultichainNetworkController_setActiveEvmNetwork, _MultichainNetworkController_setActiveNonEvmNetwork,
|
|
7
|
+
var _MultichainNetworkController_instances, _MultichainNetworkController_setActiveEvmNetwork, _MultichainNetworkController_setActiveNonEvmNetwork, _MultichainNetworkController_handleOnSelectedAccountChange, _MultichainNetworkController_subscribeToMessageEvents, _MultichainNetworkController_registerMessageHandlers;
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.MultichainNetworkController = void 0;
|
|
10
10
|
const base_controller_1 = require("@metamask/base-controller");
|
|
@@ -29,41 +29,6 @@ class MultichainNetworkController extends base_controller_1.BaseController {
|
|
|
29
29
|
},
|
|
30
30
|
});
|
|
31
31
|
_MultichainNetworkController_instances.add(this);
|
|
32
|
-
/**
|
|
33
|
-
* Handles switching between EVM and non-EVM networks when an account is changed
|
|
34
|
-
*
|
|
35
|
-
* @param account - The account that was changed
|
|
36
|
-
*/
|
|
37
|
-
_MultichainNetworkController_handleSelectedAccountChange.set(this, (account) => {
|
|
38
|
-
const { type: accountType, address: accountAddress } = account;
|
|
39
|
-
const isEvmAccount = (0, keyring_api_1.isEvmAccountType)(accountType);
|
|
40
|
-
// Handle switching to EVM network
|
|
41
|
-
if (isEvmAccount) {
|
|
42
|
-
if (this.state.isEvmSelected) {
|
|
43
|
-
// No need to update if already on evm network
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
// Make EVM network active
|
|
47
|
-
this.update((state) => {
|
|
48
|
-
state.isEvmSelected = true;
|
|
49
|
-
});
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
// Handle switching to non-EVM network
|
|
53
|
-
const nonEvmChainId = (0, utils_2.getChainIdForNonEvmAddress)(accountAddress);
|
|
54
|
-
const isSameNonEvmNetwork = nonEvmChainId === this.state.selectedMultichainNetworkChainId;
|
|
55
|
-
if (isSameNonEvmNetwork) {
|
|
56
|
-
// No need to update if already on the same non-EVM network
|
|
57
|
-
this.update((state) => {
|
|
58
|
-
state.isEvmSelected = false;
|
|
59
|
-
});
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
this.update((state) => {
|
|
63
|
-
state.selectedMultichainNetworkChainId = nonEvmChainId;
|
|
64
|
-
state.isEvmSelected = false;
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
32
|
__classPrivateFieldGet(this, _MultichainNetworkController_instances, "m", _MultichainNetworkController_subscribeToMessageEvents).call(this);
|
|
68
33
|
__classPrivateFieldGet(this, _MultichainNetworkController_instances, "m", _MultichainNetworkController_registerMessageHandlers).call(this);
|
|
69
34
|
}
|
|
@@ -85,49 +50,80 @@ class MultichainNetworkController extends base_controller_1.BaseController {
|
|
|
85
50
|
}
|
|
86
51
|
}
|
|
87
52
|
exports.MultichainNetworkController = MultichainNetworkController;
|
|
88
|
-
|
|
53
|
+
_MultichainNetworkController_instances = new WeakSet(), _MultichainNetworkController_setActiveEvmNetwork =
|
|
89
54
|
/**
|
|
90
55
|
* Sets the active EVM network.
|
|
91
56
|
*
|
|
92
57
|
* @param id - The client ID of the EVM network to set active.
|
|
93
58
|
*/
|
|
94
59
|
async function _MultichainNetworkController_setActiveEvmNetwork(id) {
|
|
95
|
-
// Notify listeners that setActiveNetwork was called
|
|
96
|
-
this.messagingSystem.publish('MultichainNetworkController:networkDidChange', id);
|
|
97
|
-
// Indicate that the non-EVM network is not selected
|
|
98
|
-
this.update((state) => {
|
|
99
|
-
state.isEvmSelected = true;
|
|
100
|
-
});
|
|
101
|
-
// Prevent setting same network
|
|
102
60
|
const { selectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');
|
|
103
|
-
|
|
104
|
-
|
|
61
|
+
const shouldSetEvmActive = !this.state.isEvmSelected;
|
|
62
|
+
const shouldNotifyNetworkChange = id !== selectedNetworkClientId;
|
|
63
|
+
// No changes needed if EVM is active and network is already selected
|
|
64
|
+
if (!shouldSetEvmActive && !shouldNotifyNetworkChange) {
|
|
105
65
|
return;
|
|
106
66
|
}
|
|
107
|
-
// Update
|
|
108
|
-
|
|
67
|
+
// Update EVM selection state if needed
|
|
68
|
+
if (shouldSetEvmActive) {
|
|
69
|
+
this.update((state) => {
|
|
70
|
+
state.isEvmSelected = true;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Only notify the network controller if the selected evm network is different
|
|
74
|
+
if (shouldNotifyNetworkChange) {
|
|
75
|
+
await this.messagingSystem.call('NetworkController:setActiveNetwork', id);
|
|
76
|
+
}
|
|
77
|
+
// Only publish the networkDidChange event if either the EVM network is different or we're switching between EVM and non-EVM networks
|
|
78
|
+
if (shouldSetEvmActive || shouldNotifyNetworkChange) {
|
|
79
|
+
this.messagingSystem.publish('MultichainNetworkController:networkDidChange', id);
|
|
80
|
+
}
|
|
109
81
|
}, _MultichainNetworkController_setActiveNonEvmNetwork = function _MultichainNetworkController_setActiveNonEvmNetwork(id) {
|
|
110
|
-
if (id === this.state.selectedMultichainNetworkChainId
|
|
111
|
-
|
|
112
|
-
|
|
82
|
+
if (id === this.state.selectedMultichainNetworkChainId &&
|
|
83
|
+
!this.state.isEvmSelected) {
|
|
84
|
+
// Same non-EVM network is already selected, no need to update
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.update((state) => {
|
|
88
|
+
state.selectedMultichainNetworkChainId = id;
|
|
89
|
+
state.isEvmSelected = false;
|
|
90
|
+
});
|
|
91
|
+
// Notify listeners that the network changed
|
|
92
|
+
this.messagingSystem.publish('MultichainNetworkController:networkDidChange', id);
|
|
93
|
+
}, _MultichainNetworkController_handleOnSelectedAccountChange = function _MultichainNetworkController_handleOnSelectedAccountChange(account) {
|
|
94
|
+
const { type: accountType, address: accountAddress } = account;
|
|
95
|
+
const isEvmAccount = (0, keyring_api_1.isEvmAccountType)(accountType);
|
|
96
|
+
// Handle switching to EVM network
|
|
97
|
+
if (isEvmAccount) {
|
|
98
|
+
if (this.state.isEvmSelected) {
|
|
99
|
+
// No need to update if already on evm network
|
|
113
100
|
return;
|
|
114
101
|
}
|
|
115
|
-
//
|
|
102
|
+
// Make EVM network active
|
|
103
|
+
this.update((state) => {
|
|
104
|
+
state.isEvmSelected = true;
|
|
105
|
+
});
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Handle switching to non-EVM network
|
|
109
|
+
const nonEvmChainId = (0, utils_2.getChainIdForNonEvmAddress)(accountAddress);
|
|
110
|
+
const isSameNonEvmNetwork = nonEvmChainId === this.state.selectedMultichainNetworkChainId;
|
|
111
|
+
if (isSameNonEvmNetwork) {
|
|
112
|
+
// No need to update if already on the same non-EVM network
|
|
116
113
|
this.update((state) => {
|
|
117
114
|
state.isEvmSelected = false;
|
|
118
115
|
});
|
|
119
|
-
|
|
120
|
-
this.messagingSystem.publish('MultichainNetworkController:networkDidChange', id);
|
|
116
|
+
return;
|
|
121
117
|
}
|
|
122
|
-
// Notify listeners that setActiveNetwork was called
|
|
123
|
-
this.messagingSystem.publish('MultichainNetworkController:networkDidChange', id);
|
|
124
118
|
this.update((state) => {
|
|
125
|
-
state.selectedMultichainNetworkChainId =
|
|
119
|
+
state.selectedMultichainNetworkChainId = nonEvmChainId;
|
|
126
120
|
state.isEvmSelected = false;
|
|
127
121
|
});
|
|
122
|
+
// No need to publish NetworkController:setActiveNetwork because EVM accounts falls back to use the last selected EVM network
|
|
123
|
+
// DO NOT publish MultichainNetworkController:networkDidChange to prevent circular listener loops
|
|
128
124
|
}, _MultichainNetworkController_subscribeToMessageEvents = function _MultichainNetworkController_subscribeToMessageEvents() {
|
|
129
125
|
// Handle network switch when account is changed
|
|
130
|
-
this.messagingSystem.subscribe('AccountsController:selectedAccountChange', __classPrivateFieldGet(this,
|
|
126
|
+
this.messagingSystem.subscribe('AccountsController:selectedAccountChange', (account) => __classPrivateFieldGet(this, _MultichainNetworkController_instances, "m", _MultichainNetworkController_handleOnSelectedAccountChange).call(this, account));
|
|
131
127
|
}, _MultichainNetworkController_registerMessageHandlers = function _MultichainNetworkController_registerMessageHandlers() {
|
|
132
128
|
this.messagingSystem.registerActionHandler('MultichainNetworkController:setActiveNetwork', this.setActiveNetwork.bind(this));
|
|
133
129
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultichainNetworkController.cjs","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+DAA2D;AAC3D,uDAAyD;AAGzD,2CAAgD;AAEhD,+CAGqB;AACrB,uCAKiB;AACjB,uCAGiB;AAEjB;;;GAGG;AACH,MAAa,2BAA4B,SAAQ,gCAIhD;IACC,YAAY,EACV,SAAS,EACT,KAAK,GAON;QACC,KAAK,CAAC;YACJ,SAAS;YACT,IAAI,EAAE,0CAAkC;YACxC,QAAQ,EAAE,kDAAsC;YAChD,KAAK,EAAE;gBACL,GAAG,IAAA,sDAA0C,GAAE;gBAC/C,GAAG,KAAK;aACT;SACF,CAAC,CAAC;;
|
|
1
|
+
{"version":3,"file":"MultichainNetworkController.cjs","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { isCaipChainId } from '@metamask/utils';\n\nimport {\n MULTICHAIN_NETWORK_CONTROLLER_METADATA,\n getDefaultMultichainNetworkControllerState,\n} from './constants';\nimport {\n MULTICHAIN_NETWORK_CONTROLLER_NAME,\n type MultichainNetworkControllerState,\n type MultichainNetworkControllerMessenger,\n type SupportedCaipChainId,\n} from './types';\nimport {\n checkIfSupportedCaipChainId,\n getChainIdForNonEvmAddress,\n} from './utils';\n\n/**\n * The MultichainNetworkController is responsible for fetching and caching account\n * balances.\n */\nexport class MultichainNetworkController extends BaseController<\n typeof MULTICHAIN_NETWORK_CONTROLLER_NAME,\n MultichainNetworkControllerState,\n MultichainNetworkControllerMessenger\n> {\n constructor({\n messenger,\n state,\n }: {\n messenger: MultichainNetworkControllerMessenger;\n state?: Omit<\n Partial<MultichainNetworkControllerState>,\n 'multichainNetworkConfigurationsByChainId'\n >;\n }) {\n super({\n messenger,\n name: MULTICHAIN_NETWORK_CONTROLLER_NAME,\n metadata: MULTICHAIN_NETWORK_CONTROLLER_METADATA,\n state: {\n ...getDefaultMultichainNetworkControllerState(),\n ...state,\n },\n });\n\n this.#subscribeToMessageEvents();\n this.#registerMessageHandlers();\n }\n\n /**\n * Sets the active EVM network.\n *\n * @param id - The client ID of the EVM network to set active.\n */\n async #setActiveEvmNetwork(id: NetworkClientId): Promise<void> {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n\n const shouldSetEvmActive = !this.state.isEvmSelected;\n const shouldNotifyNetworkChange = id !== selectedNetworkClientId;\n\n // No changes needed if EVM is active and network is already selected\n if (!shouldSetEvmActive && !shouldNotifyNetworkChange) {\n return;\n }\n\n // Update EVM selection state if needed\n if (shouldSetEvmActive) {\n this.update((state) => {\n state.isEvmSelected = true;\n });\n }\n\n // Only notify the network controller if the selected evm network is different\n if (shouldNotifyNetworkChange) {\n await this.messagingSystem.call('NetworkController:setActiveNetwork', id);\n }\n\n // Only publish the networkDidChange event if either the EVM network is different or we're switching between EVM and non-EVM networks\n if (shouldSetEvmActive || shouldNotifyNetworkChange) {\n this.messagingSystem.publish(\n 'MultichainNetworkController:networkDidChange',\n id,\n );\n }\n }\n\n /**\n * Sets the active non-EVM network.\n *\n * @param id - The chain ID of the non-EVM network to set active.\n */\n #setActiveNonEvmNetwork(id: SupportedCaipChainId): void {\n if (\n id === this.state.selectedMultichainNetworkChainId &&\n !this.state.isEvmSelected\n ) {\n // Same non-EVM network is already selected, no need to update\n return;\n }\n\n this.update((state) => {\n state.selectedMultichainNetworkChainId = id;\n state.isEvmSelected = false;\n });\n\n // Notify listeners that the network changed\n this.messagingSystem.publish(\n 'MultichainNetworkController:networkDidChange',\n id,\n );\n }\n\n /**\n * Sets the active network.\n *\n * @param id - The non-EVM Caip chain ID or EVM client ID of the network to set active.\n * @returns - A promise that resolves when the network is set active.\n */\n async setActiveNetwork(\n id: SupportedCaipChainId | NetworkClientId,\n ): Promise<void> {\n if (isCaipChainId(id)) {\n const isSupportedCaipChainId = checkIfSupportedCaipChainId(id);\n if (!isSupportedCaipChainId) {\n throw new Error(`Unsupported Caip chain ID: ${String(id)}`);\n }\n return this.#setActiveNonEvmNetwork(id);\n }\n\n return await this.#setActiveEvmNetwork(id);\n }\n\n /**\n * Handles switching between EVM and non-EVM networks when an account is changed\n *\n * @param account - The account that was changed\n */\n #handleOnSelectedAccountChange(account: InternalAccount) {\n const { type: accountType, address: accountAddress } = account;\n const isEvmAccount = isEvmAccountType(accountType);\n\n // Handle switching to EVM network\n if (isEvmAccount) {\n if (this.state.isEvmSelected) {\n // No need to update if already on evm network\n return;\n }\n\n // Make EVM network active\n this.update((state) => {\n state.isEvmSelected = true;\n });\n\n return;\n }\n\n // Handle switching to non-EVM network\n const nonEvmChainId = getChainIdForNonEvmAddress(accountAddress);\n const isSameNonEvmNetwork =\n nonEvmChainId === this.state.selectedMultichainNetworkChainId;\n\n if (isSameNonEvmNetwork) {\n // No need to update if already on the same non-EVM network\n this.update((state) => {\n state.isEvmSelected = false;\n });\n return;\n }\n\n this.update((state) => {\n state.selectedMultichainNetworkChainId = nonEvmChainId;\n state.isEvmSelected = false;\n });\n\n // No need to publish NetworkController:setActiveNetwork because EVM accounts falls back to use the last selected EVM network\n // DO NOT publish MultichainNetworkController:networkDidChange to prevent circular listener loops\n }\n\n /**\n * Subscribes to message events.\n */\n #subscribeToMessageEvents() {\n // Handle network switch when account is changed\n this.messagingSystem.subscribe(\n 'AccountsController:selectedAccountChange',\n (account) => this.#handleOnSelectedAccountChange(account),\n );\n }\n\n /**\n * Registers message handlers.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n 'MultichainNetworkController:setActiveNetwork',\n this.setActiveNetwork.bind(this),\n );\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultichainNetworkController.d.cts","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAG3D,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AAOpE,OAAO,EACL,kCAAkC,EAClC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,oBAAoB,EAC1B,oBAAgB;AAMjB;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,cAAc,CAC7D,OAAO,kCAAkC,EACzC,gCAAgC,EAChC,oCAAoC,CACrC;;gBACa,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,oCAAoC,CAAC;QAChD,KAAK,CAAC,EAAE,IAAI,CACV,OAAO,CAAC,gCAAgC,CAAC,EACzC,0CAA0C,CAC3C,CAAC;KACH;
|
|
1
|
+
{"version":3,"file":"MultichainNetworkController.d.cts","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAG3D,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AAOpE,OAAO,EACL,kCAAkC,EAClC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,oBAAoB,EAC1B,oBAAgB;AAMjB;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,cAAc,CAC7D,OAAO,kCAAkC,EACzC,gCAAgC,EAChC,oCAAoC,CACrC;;gBACa,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,oCAAoC,CAAC;QAChD,KAAK,CAAC,EAAE,IAAI,CACV,OAAO,CAAC,gCAAgC,CAAC,EACzC,0CAA0C,CAC3C,CAAC;KACH;IAgFD;;;;;OAKG;IACG,gBAAgB,CACpB,EAAE,EAAE,oBAAoB,GAAG,eAAe,GACzC,OAAO,CAAC,IAAI,CAAC;CA8EjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultichainNetworkController.d.mts","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAG3D,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AAOpE,OAAO,EACL,kCAAkC,EAClC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,oBAAoB,EAC1B,oBAAgB;AAMjB;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,cAAc,CAC7D,OAAO,kCAAkC,EACzC,gCAAgC,EAChC,oCAAoC,CACrC;;gBACa,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,oCAAoC,CAAC;QAChD,KAAK,CAAC,EAAE,IAAI,CACV,OAAO,CAAC,gCAAgC,CAAC,EACzC,0CAA0C,CAC3C,CAAC;KACH;
|
|
1
|
+
{"version":3,"file":"MultichainNetworkController.d.mts","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAG3D,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AAOpE,OAAO,EACL,kCAAkC,EAClC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,oBAAoB,EAC1B,oBAAgB;AAMjB;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,cAAc,CAC7D,OAAO,kCAAkC,EACzC,gCAAgC,EAChC,oCAAoC,CACrC;;gBACa,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,oCAAoC,CAAC;QAChD,KAAK,CAAC,EAAE,IAAI,CACV,OAAO,CAAC,gCAAgC,CAAC,EACzC,0CAA0C,CAC3C,CAAC;KACH;IAgFD;;;;;OAKG;IACG,gBAAgB,CACpB,EAAE,EAAE,oBAAoB,GAAG,eAAe,GACzC,OAAO,CAAC,IAAI,CAAC;CA8EjB"}
|
|
@@ -3,7 +3,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
3
3
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
4
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
5
|
};
|
|
6
|
-
var _MultichainNetworkController_instances, _MultichainNetworkController_setActiveEvmNetwork, _MultichainNetworkController_setActiveNonEvmNetwork,
|
|
6
|
+
var _MultichainNetworkController_instances, _MultichainNetworkController_setActiveEvmNetwork, _MultichainNetworkController_setActiveNonEvmNetwork, _MultichainNetworkController_handleOnSelectedAccountChange, _MultichainNetworkController_subscribeToMessageEvents, _MultichainNetworkController_registerMessageHandlers;
|
|
7
7
|
import { BaseController } from "@metamask/base-controller";
|
|
8
8
|
import { isEvmAccountType } from "@metamask/keyring-api";
|
|
9
9
|
import { isCaipChainId } from "@metamask/utils";
|
|
@@ -26,41 +26,6 @@ export class MultichainNetworkController extends BaseController {
|
|
|
26
26
|
},
|
|
27
27
|
});
|
|
28
28
|
_MultichainNetworkController_instances.add(this);
|
|
29
|
-
/**
|
|
30
|
-
* Handles switching between EVM and non-EVM networks when an account is changed
|
|
31
|
-
*
|
|
32
|
-
* @param account - The account that was changed
|
|
33
|
-
*/
|
|
34
|
-
_MultichainNetworkController_handleSelectedAccountChange.set(this, (account) => {
|
|
35
|
-
const { type: accountType, address: accountAddress } = account;
|
|
36
|
-
const isEvmAccount = isEvmAccountType(accountType);
|
|
37
|
-
// Handle switching to EVM network
|
|
38
|
-
if (isEvmAccount) {
|
|
39
|
-
if (this.state.isEvmSelected) {
|
|
40
|
-
// No need to update if already on evm network
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
// Make EVM network active
|
|
44
|
-
this.update((state) => {
|
|
45
|
-
state.isEvmSelected = true;
|
|
46
|
-
});
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
// Handle switching to non-EVM network
|
|
50
|
-
const nonEvmChainId = getChainIdForNonEvmAddress(accountAddress);
|
|
51
|
-
const isSameNonEvmNetwork = nonEvmChainId === this.state.selectedMultichainNetworkChainId;
|
|
52
|
-
if (isSameNonEvmNetwork) {
|
|
53
|
-
// No need to update if already on the same non-EVM network
|
|
54
|
-
this.update((state) => {
|
|
55
|
-
state.isEvmSelected = false;
|
|
56
|
-
});
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
this.update((state) => {
|
|
60
|
-
state.selectedMultichainNetworkChainId = nonEvmChainId;
|
|
61
|
-
state.isEvmSelected = false;
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
29
|
__classPrivateFieldGet(this, _MultichainNetworkController_instances, "m", _MultichainNetworkController_subscribeToMessageEvents).call(this);
|
|
65
30
|
__classPrivateFieldGet(this, _MultichainNetworkController_instances, "m", _MultichainNetworkController_registerMessageHandlers).call(this);
|
|
66
31
|
}
|
|
@@ -81,49 +46,80 @@ export class MultichainNetworkController extends BaseController {
|
|
|
81
46
|
return await __classPrivateFieldGet(this, _MultichainNetworkController_instances, "m", _MultichainNetworkController_setActiveEvmNetwork).call(this, id);
|
|
82
47
|
}
|
|
83
48
|
}
|
|
84
|
-
|
|
49
|
+
_MultichainNetworkController_instances = new WeakSet(), _MultichainNetworkController_setActiveEvmNetwork =
|
|
85
50
|
/**
|
|
86
51
|
* Sets the active EVM network.
|
|
87
52
|
*
|
|
88
53
|
* @param id - The client ID of the EVM network to set active.
|
|
89
54
|
*/
|
|
90
55
|
async function _MultichainNetworkController_setActiveEvmNetwork(id) {
|
|
91
|
-
// Notify listeners that setActiveNetwork was called
|
|
92
|
-
this.messagingSystem.publish('MultichainNetworkController:networkDidChange', id);
|
|
93
|
-
// Indicate that the non-EVM network is not selected
|
|
94
|
-
this.update((state) => {
|
|
95
|
-
state.isEvmSelected = true;
|
|
96
|
-
});
|
|
97
|
-
// Prevent setting same network
|
|
98
56
|
const { selectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');
|
|
99
|
-
|
|
100
|
-
|
|
57
|
+
const shouldSetEvmActive = !this.state.isEvmSelected;
|
|
58
|
+
const shouldNotifyNetworkChange = id !== selectedNetworkClientId;
|
|
59
|
+
// No changes needed if EVM is active and network is already selected
|
|
60
|
+
if (!shouldSetEvmActive && !shouldNotifyNetworkChange) {
|
|
101
61
|
return;
|
|
102
62
|
}
|
|
103
|
-
// Update
|
|
104
|
-
|
|
63
|
+
// Update EVM selection state if needed
|
|
64
|
+
if (shouldSetEvmActive) {
|
|
65
|
+
this.update((state) => {
|
|
66
|
+
state.isEvmSelected = true;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Only notify the network controller if the selected evm network is different
|
|
70
|
+
if (shouldNotifyNetworkChange) {
|
|
71
|
+
await this.messagingSystem.call('NetworkController:setActiveNetwork', id);
|
|
72
|
+
}
|
|
73
|
+
// Only publish the networkDidChange event if either the EVM network is different or we're switching between EVM and non-EVM networks
|
|
74
|
+
if (shouldSetEvmActive || shouldNotifyNetworkChange) {
|
|
75
|
+
this.messagingSystem.publish('MultichainNetworkController:networkDidChange', id);
|
|
76
|
+
}
|
|
105
77
|
}, _MultichainNetworkController_setActiveNonEvmNetwork = function _MultichainNetworkController_setActiveNonEvmNetwork(id) {
|
|
106
|
-
if (id === this.state.selectedMultichainNetworkChainId
|
|
107
|
-
|
|
108
|
-
|
|
78
|
+
if (id === this.state.selectedMultichainNetworkChainId &&
|
|
79
|
+
!this.state.isEvmSelected) {
|
|
80
|
+
// Same non-EVM network is already selected, no need to update
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this.update((state) => {
|
|
84
|
+
state.selectedMultichainNetworkChainId = id;
|
|
85
|
+
state.isEvmSelected = false;
|
|
86
|
+
});
|
|
87
|
+
// Notify listeners that the network changed
|
|
88
|
+
this.messagingSystem.publish('MultichainNetworkController:networkDidChange', id);
|
|
89
|
+
}, _MultichainNetworkController_handleOnSelectedAccountChange = function _MultichainNetworkController_handleOnSelectedAccountChange(account) {
|
|
90
|
+
const { type: accountType, address: accountAddress } = account;
|
|
91
|
+
const isEvmAccount = isEvmAccountType(accountType);
|
|
92
|
+
// Handle switching to EVM network
|
|
93
|
+
if (isEvmAccount) {
|
|
94
|
+
if (this.state.isEvmSelected) {
|
|
95
|
+
// No need to update if already on evm network
|
|
109
96
|
return;
|
|
110
97
|
}
|
|
111
|
-
//
|
|
98
|
+
// Make EVM network active
|
|
99
|
+
this.update((state) => {
|
|
100
|
+
state.isEvmSelected = true;
|
|
101
|
+
});
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Handle switching to non-EVM network
|
|
105
|
+
const nonEvmChainId = getChainIdForNonEvmAddress(accountAddress);
|
|
106
|
+
const isSameNonEvmNetwork = nonEvmChainId === this.state.selectedMultichainNetworkChainId;
|
|
107
|
+
if (isSameNonEvmNetwork) {
|
|
108
|
+
// No need to update if already on the same non-EVM network
|
|
112
109
|
this.update((state) => {
|
|
113
110
|
state.isEvmSelected = false;
|
|
114
111
|
});
|
|
115
|
-
|
|
116
|
-
this.messagingSystem.publish('MultichainNetworkController:networkDidChange', id);
|
|
112
|
+
return;
|
|
117
113
|
}
|
|
118
|
-
// Notify listeners that setActiveNetwork was called
|
|
119
|
-
this.messagingSystem.publish('MultichainNetworkController:networkDidChange', id);
|
|
120
114
|
this.update((state) => {
|
|
121
|
-
state.selectedMultichainNetworkChainId =
|
|
115
|
+
state.selectedMultichainNetworkChainId = nonEvmChainId;
|
|
122
116
|
state.isEvmSelected = false;
|
|
123
117
|
});
|
|
118
|
+
// No need to publish NetworkController:setActiveNetwork because EVM accounts falls back to use the last selected EVM network
|
|
119
|
+
// DO NOT publish MultichainNetworkController:networkDidChange to prevent circular listener loops
|
|
124
120
|
}, _MultichainNetworkController_subscribeToMessageEvents = function _MultichainNetworkController_subscribeToMessageEvents() {
|
|
125
121
|
// Handle network switch when account is changed
|
|
126
|
-
this.messagingSystem.subscribe('AccountsController:selectedAccountChange', __classPrivateFieldGet(this,
|
|
122
|
+
this.messagingSystem.subscribe('AccountsController:selectedAccountChange', (account) => __classPrivateFieldGet(this, _MultichainNetworkController_instances, "m", _MultichainNetworkController_handleOnSelectedAccountChange).call(this, account));
|
|
127
123
|
}, _MultichainNetworkController_registerMessageHandlers = function _MultichainNetworkController_registerMessageHandlers() {
|
|
128
124
|
this.messagingSystem.registerActionHandler('MultichainNetworkController:setActiveNetwork', this.setActiveNetwork.bind(this));
|
|
129
125
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultichainNetworkController.mjs","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,8BAA8B;AAGzD,OAAO,EAAE,aAAa,EAAE,wBAAwB;AAEhD,OAAO,EACL,sCAAsC,EACtC,0CAA0C,EAC3C,wBAAoB;AACrB,OAAO,EACL,kCAAkC,EAInC,oBAAgB;AACjB,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC3B,oBAAgB;AAEjB;;;GAGG;AACH,MAAM,OAAO,2BAA4B,SAAQ,cAIhD;IACC,YAAY,EACV,SAAS,EACT,KAAK,GAON;QACC,KAAK,CAAC;YACJ,SAAS;YACT,IAAI,EAAE,kCAAkC;YACxC,QAAQ,EAAE,sCAAsC;YAChD,KAAK,EAAE;gBACL,GAAG,0CAA0C,EAAE;gBAC/C,GAAG,KAAK;aACT;SACF,CAAC,CAAC;;
|
|
1
|
+
{"version":3,"file":"MultichainNetworkController.mjs","sourceRoot":"","sources":["../src/MultichainNetworkController.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,8BAA8B;AAGzD,OAAO,EAAE,aAAa,EAAE,wBAAwB;AAEhD,OAAO,EACL,sCAAsC,EACtC,0CAA0C,EAC3C,wBAAoB;AACrB,OAAO,EACL,kCAAkC,EAInC,oBAAgB;AACjB,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC3B,oBAAgB;AAEjB;;;GAGG;AACH,MAAM,OAAO,2BAA4B,SAAQ,cAIhD;IACC,YAAY,EACV,SAAS,EACT,KAAK,GAON;QACC,KAAK,CAAC;YACJ,SAAS;YACT,IAAI,EAAE,kCAAkC;YACxC,QAAQ,EAAE,sCAAsC;YAChD,KAAK,EAAE;gBACL,GAAG,0CAA0C,EAAE;gBAC/C,GAAG,KAAK;aACT;SACF,CAAC,CAAC;;QAEH,uBAAA,IAAI,qGAA0B,MAA9B,IAAI,CAA4B,CAAC;QACjC,uBAAA,IAAI,oGAAyB,MAA7B,IAAI,CAA2B,CAAC;IAClC,CAAC;IAmED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CACpB,EAA0C;QAE1C,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE;YACrB,MAAM,sBAAsB,GAAG,2BAA2B,CAAC,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,sBAAsB,EAAE;gBAC3B,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aAC7D;YACD,OAAO,uBAAA,IAAI,mGAAwB,MAA5B,IAAI,EAAyB,EAAE,CAAC,CAAC;SACzC;QAED,OAAO,MAAM,uBAAA,IAAI,gGAAqB,MAAzB,IAAI,EAAsB,EAAE,CAAC,CAAC;IAC7C,CAAC;CAoEF;;AAvJC;;;;GAIG;AACH,KAAK,2DAAsB,EAAmB;IAC5C,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC3D,4BAA4B,CAC7B,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IACrD,MAAM,yBAAyB,GAAG,EAAE,KAAK,uBAAuB,CAAC;IAEjE,qEAAqE;IACrE,IAAI,CAAC,kBAAkB,IAAI,CAAC,yBAAyB,EAAE;QACrD,OAAO;KACR;IAED,uCAAuC;IACvC,IAAI,kBAAkB,EAAE;QACtB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC7B,CAAC,CAAC,CAAC;KACJ;IAED,8EAA8E;IAC9E,IAAI,yBAAyB,EAAE;QAC7B,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;KAC3E;IAED,qIAAqI;IACrI,IAAI,kBAAkB,IAAI,yBAAyB,EAAE;QACnD,IAAI,CAAC,eAAe,CAAC,OAAO,CAC1B,8CAA8C,EAC9C,EAAE,CACH,CAAC;KACH;AACH,CAAC,qHAOuB,EAAwB;IAC9C,IACE,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,gCAAgC;QAClD,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EACzB;QACA,8DAA8D;QAC9D,OAAO;KACR;IAED,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC;QAC5C,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,4CAA4C;IAC5C,IAAI,CAAC,eAAe,CAAC,OAAO,CAC1B,8CAA8C,EAC9C,EAAE,CACH,CAAC;AACJ,CAAC,mIA2B8B,OAAwB;IACrD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAC/D,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEnD,kCAAkC;IAClC,IAAI,YAAY,EAAE;QAChB,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC5B,8CAA8C;YAC9C,OAAO;SACR;QAED,0BAA0B;QAC1B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,OAAO;KACR;IAED,sCAAsC;IACtC,MAAM,aAAa,GAAG,0BAA0B,CAAC,cAAc,CAAC,CAAC;IACjE,MAAM,mBAAmB,GACvB,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC;IAEhE,IAAI,mBAAmB,EAAE;QACvB,2DAA2D;QAC3D,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,OAAO;KACR;IAED,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,gCAAgC,GAAG,aAAa,CAAC;QACvD,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,6HAA6H;IAC7H,iGAAiG;AACnG,CAAC;IAMC,gDAAgD;IAChD,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,0CAA0C,EAC1C,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAA,IAAI,0GAA+B,MAAnC,IAAI,EAAgC,OAAO,CAAC,CAC1D,CAAC;AACJ,CAAC;IAMC,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,8CAA8C,EAC9C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CACjC,CAAC;AACJ,CAAC","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { isCaipChainId } from '@metamask/utils';\n\nimport {\n MULTICHAIN_NETWORK_CONTROLLER_METADATA,\n getDefaultMultichainNetworkControllerState,\n} from './constants';\nimport {\n MULTICHAIN_NETWORK_CONTROLLER_NAME,\n type MultichainNetworkControllerState,\n type MultichainNetworkControllerMessenger,\n type SupportedCaipChainId,\n} from './types';\nimport {\n checkIfSupportedCaipChainId,\n getChainIdForNonEvmAddress,\n} from './utils';\n\n/**\n * The MultichainNetworkController is responsible for fetching and caching account\n * balances.\n */\nexport class MultichainNetworkController extends BaseController<\n typeof MULTICHAIN_NETWORK_CONTROLLER_NAME,\n MultichainNetworkControllerState,\n MultichainNetworkControllerMessenger\n> {\n constructor({\n messenger,\n state,\n }: {\n messenger: MultichainNetworkControllerMessenger;\n state?: Omit<\n Partial<MultichainNetworkControllerState>,\n 'multichainNetworkConfigurationsByChainId'\n >;\n }) {\n super({\n messenger,\n name: MULTICHAIN_NETWORK_CONTROLLER_NAME,\n metadata: MULTICHAIN_NETWORK_CONTROLLER_METADATA,\n state: {\n ...getDefaultMultichainNetworkControllerState(),\n ...state,\n },\n });\n\n this.#subscribeToMessageEvents();\n this.#registerMessageHandlers();\n }\n\n /**\n * Sets the active EVM network.\n *\n * @param id - The client ID of the EVM network to set active.\n */\n async #setActiveEvmNetwork(id: NetworkClientId): Promise<void> {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n\n const shouldSetEvmActive = !this.state.isEvmSelected;\n const shouldNotifyNetworkChange = id !== selectedNetworkClientId;\n\n // No changes needed if EVM is active and network is already selected\n if (!shouldSetEvmActive && !shouldNotifyNetworkChange) {\n return;\n }\n\n // Update EVM selection state if needed\n if (shouldSetEvmActive) {\n this.update((state) => {\n state.isEvmSelected = true;\n });\n }\n\n // Only notify the network controller if the selected evm network is different\n if (shouldNotifyNetworkChange) {\n await this.messagingSystem.call('NetworkController:setActiveNetwork', id);\n }\n\n // Only publish the networkDidChange event if either the EVM network is different or we're switching between EVM and non-EVM networks\n if (shouldSetEvmActive || shouldNotifyNetworkChange) {\n this.messagingSystem.publish(\n 'MultichainNetworkController:networkDidChange',\n id,\n );\n }\n }\n\n /**\n * Sets the active non-EVM network.\n *\n * @param id - The chain ID of the non-EVM network to set active.\n */\n #setActiveNonEvmNetwork(id: SupportedCaipChainId): void {\n if (\n id === this.state.selectedMultichainNetworkChainId &&\n !this.state.isEvmSelected\n ) {\n // Same non-EVM network is already selected, no need to update\n return;\n }\n\n this.update((state) => {\n state.selectedMultichainNetworkChainId = id;\n state.isEvmSelected = false;\n });\n\n // Notify listeners that the network changed\n this.messagingSystem.publish(\n 'MultichainNetworkController:networkDidChange',\n id,\n );\n }\n\n /**\n * Sets the active network.\n *\n * @param id - The non-EVM Caip chain ID or EVM client ID of the network to set active.\n * @returns - A promise that resolves when the network is set active.\n */\n async setActiveNetwork(\n id: SupportedCaipChainId | NetworkClientId,\n ): Promise<void> {\n if (isCaipChainId(id)) {\n const isSupportedCaipChainId = checkIfSupportedCaipChainId(id);\n if (!isSupportedCaipChainId) {\n throw new Error(`Unsupported Caip chain ID: ${String(id)}`);\n }\n return this.#setActiveNonEvmNetwork(id);\n }\n\n return await this.#setActiveEvmNetwork(id);\n }\n\n /**\n * Handles switching between EVM and non-EVM networks when an account is changed\n *\n * @param account - The account that was changed\n */\n #handleOnSelectedAccountChange(account: InternalAccount) {\n const { type: accountType, address: accountAddress } = account;\n const isEvmAccount = isEvmAccountType(accountType);\n\n // Handle switching to EVM network\n if (isEvmAccount) {\n if (this.state.isEvmSelected) {\n // No need to update if already on evm network\n return;\n }\n\n // Make EVM network active\n this.update((state) => {\n state.isEvmSelected = true;\n });\n\n return;\n }\n\n // Handle switching to non-EVM network\n const nonEvmChainId = getChainIdForNonEvmAddress(accountAddress);\n const isSameNonEvmNetwork =\n nonEvmChainId === this.state.selectedMultichainNetworkChainId;\n\n if (isSameNonEvmNetwork) {\n // No need to update if already on the same non-EVM network\n this.update((state) => {\n state.isEvmSelected = false;\n });\n return;\n }\n\n this.update((state) => {\n state.selectedMultichainNetworkChainId = nonEvmChainId;\n state.isEvmSelected = false;\n });\n\n // No need to publish NetworkController:setActiveNetwork because EVM accounts falls back to use the last selected EVM network\n // DO NOT publish MultichainNetworkController:networkDidChange to prevent circular listener loops\n }\n\n /**\n * Subscribes to message events.\n */\n #subscribeToMessageEvents() {\n // Handle network switch when account is changed\n this.messagingSystem.subscribe(\n 'AccountsController:selectedAccountChange',\n (account) => this.#handleOnSelectedAccountChange(account),\n );\n }\n\n /**\n * Registers message handlers.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n 'MultichainNetworkController:setActiveNetwork',\n this.setActiveNetwork.bind(this),\n );\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/multichain-network-controller",
|
|
3
|
-
"version": "0.0.0-preview-
|
|
3
|
+
"version": "0.0.0-preview-ac664446",
|
|
4
4
|
"description": "Multichain network controller",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@metamask/auto-changelog": "^3.4.4",
|
|
57
57
|
"@metamask/keyring-controller": "^19.1.0",
|
|
58
|
+
"@metamask/network-controller": "^22.2.1",
|
|
58
59
|
"@types/jest": "^27.4.1",
|
|
59
60
|
"@types/uuid": "^8.3.0",
|
|
60
61
|
"deepmerge": "^4.2.2",
|
|
@@ -67,8 +68,7 @@
|
|
|
67
68
|
"typescript": "~5.2.2"
|
|
68
69
|
},
|
|
69
70
|
"peerDependencies": {
|
|
70
|
-
"@metamask/
|
|
71
|
-
"@metamask/network-controller": "^22.1.1"
|
|
71
|
+
"@metamask/network-controller": "^22.2.1"
|
|
72
72
|
},
|
|
73
73
|
"engines": {
|
|
74
74
|
"node": "^18.18 || >=20"
|