@metamask-previews/network-enablement-controller 3.1.0-preview-5460dce → 3.1.0-preview-898a4135

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.
@@ -3,18 +3,11 @@ 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 __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
7
- if (kind === "m") throw new TypeError("Private method is not writable");
8
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
9
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
10
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
- };
12
- var _NetworkEnablementController_instances, _NetworkEnablementController_initialized, _NetworkEnablementController_ensureNamespaceBucket, _NetworkEnablementController_ensureSlip44NamespaceBucket, _NetworkEnablementController_isInPopularNetworksMode, _NetworkEnablementController_removeNetworkEntry, _NetworkEnablementController_onAddNetwork;
6
+ var _NetworkEnablementController_instances, _NetworkEnablementController_ensureNamespaceBucket, _NetworkEnablementController_isInPopularNetworksMode, _NetworkEnablementController_removeNetworkEntry, _NetworkEnablementController_onAddNetwork;
13
7
  import { BaseController } from "@metamask/base-controller";
14
8
  import { BuiltInNetworkName, ChainId } from "@metamask/controller-utils";
15
9
  import { BtcScope, SolScope, TrxScope } from "@metamask/keyring-api";
16
10
  import { KnownCaipNamespace } from "@metamask/utils";
17
- import { getSlip44ByChainId } from "./ChainService.mjs";
18
11
  import { POPULAR_NETWORKS } from "./constants.mjs";
19
12
  import { deriveKeys, isOnlyNetworkEnabledInNamespace, isPopularNetwork } from "./utils.mjs";
20
13
  const controllerName = 'NetworkEnablementController';
@@ -51,33 +44,6 @@ const getDefaultNetworkEnablementControllerState = () => ({
51
44
  [TrxScope.Shasta]: false,
52
45
  },
53
46
  },
54
- slip44: {
55
- [KnownCaipNamespace.Eip155]: {
56
- [ChainId[BuiltInNetworkName.Mainnet]]: '60',
57
- [ChainId[BuiltInNetworkName.LineaMainnet]]: '69',
58
- [ChainId[BuiltInNetworkName.BaseMainnet]]: '8453',
59
- [ChainId[BuiltInNetworkName.ArbitrumOne]]: '42161',
60
- [ChainId[BuiltInNetworkName.BscMainnet]]: '56',
61
- [ChainId[BuiltInNetworkName.OptimismMainnet]]: '10',
62
- [ChainId[BuiltInNetworkName.PolygonMainnet]]: '966',
63
- [ChainId[BuiltInNetworkName.SeiMainnet]]: '19000118', // SEI
64
- },
65
- [KnownCaipNamespace.Solana]: {
66
- [SolScope.Mainnet]: '501',
67
- [SolScope.Testnet]: '501',
68
- [SolScope.Devnet]: '501', // SOL
69
- },
70
- [KnownCaipNamespace.Bip122]: {
71
- [BtcScope.Mainnet]: '0',
72
- [BtcScope.Testnet]: '0',
73
- [BtcScope.Signet]: '0', // BTC
74
- },
75
- [KnownCaipNamespace.Tron]: {
76
- [TrxScope.Mainnet]: '195',
77
- [TrxScope.Nile]: '195',
78
- [TrxScope.Shasta]: '195', // TRX
79
- },
80
- },
81
47
  });
82
48
  // Metadata for the controller state
83
49
  const metadata = {
@@ -87,12 +53,6 @@ const metadata = {
87
53
  includeInDebugSnapshot: true,
88
54
  usedInUi: true,
89
55
  },
90
- slip44: {
91
- includeInStateLogs: true,
92
- persist: true,
93
- includeInDebugSnapshot: true,
94
- usedInUi: true,
95
- },
96
56
  };
97
57
  /**
98
58
  * Controller responsible for managing network enablement state across different blockchain networks.
@@ -122,12 +82,8 @@ export class NetworkEnablementController extends BaseController {
122
82
  },
123
83
  });
124
84
  _NetworkEnablementController_instances.add(this);
125
- _NetworkEnablementController_initialized.set(this, false);
126
85
  messenger.subscribe('NetworkController:networkAdded', ({ chainId }) => {
127
- // Handle async network addition
128
- __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_onAddNetwork).call(this, chainId).catch((error) => {
129
- console.error('Error adding network:', error);
130
- });
86
+ __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_onAddNetwork).call(this, chainId);
131
87
  });
132
88
  messenger.subscribe('NetworkController:networkRemoved', ({ chainId }) => {
133
89
  __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_removeNetworkEntry).call(this, chainId);
@@ -190,9 +146,8 @@ export class NetworkEnablementController extends BaseController {
190
146
  throw new Error(`Chain ID ${chainId} belongs to namespace ${derivedNamespace}, but namespace ${namespace} was specified`);
191
147
  }
192
148
  this.update((s) => {
193
- // Ensure the namespace buckets exist
149
+ // Ensure the namespace bucket exists
194
150
  __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureNamespaceBucket).call(this, s, namespace);
195
- __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureSlip44NamespaceBucket).call(this, s, namespace);
196
151
  // Disable all networks in the specified namespace first
197
152
  if (s.enabledNetworkMap[namespace]) {
198
153
  Object.keys(s.enabledNetworkMap[namespace]).forEach((key) => {
@@ -229,9 +184,8 @@ export class NetworkEnablementController extends BaseController {
229
184
  const { namespace, storageKey } = deriveKeys(chainId);
230
185
  // Check if network exists in NetworkController configurations
231
186
  if (networkControllerState.networkConfigurationsByChainId[chainId]) {
232
- // Ensure namespace buckets exist
187
+ // Ensure namespace bucket exists
233
188
  __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureNamespaceBucket).call(this, s, namespace);
234
- __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureSlip44NamespaceBucket).call(this, s, namespace);
235
189
  // Enable the network
236
190
  s.enabledNetworkMap[namespace][storageKey] = true;
237
191
  }
@@ -239,18 +193,16 @@ export class NetworkEnablementController extends BaseController {
239
193
  // Enable Solana mainnet if it exists in MultichainNetworkController configurations
240
194
  const solanaKeys = deriveKeys(SolScope.Mainnet);
241
195
  if (multichainState.multichainNetworkConfigurationsByChainId[SolScope.Mainnet]) {
242
- // Ensure namespace buckets exist
196
+ // Ensure namespace bucket exists
243
197
  __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureNamespaceBucket).call(this, s, solanaKeys.namespace);
244
- __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureSlip44NamespaceBucket).call(this, s, solanaKeys.namespace);
245
198
  // Enable Solana mainnet
246
199
  s.enabledNetworkMap[solanaKeys.namespace][solanaKeys.storageKey] = true;
247
200
  }
248
201
  // Enable Bitcoin mainnet if it exists in MultichainNetworkController configurations
249
202
  const bitcoinKeys = deriveKeys(BtcScope.Mainnet);
250
203
  if (multichainState.multichainNetworkConfigurationsByChainId[BtcScope.Mainnet]) {
251
- // Ensure namespace buckets exist
204
+ // Ensure namespace bucket exists
252
205
  __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureNamespaceBucket).call(this, s, bitcoinKeys.namespace);
253
- __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureSlip44NamespaceBucket).call(this, s, bitcoinKeys.namespace);
254
206
  // Enable Bitcoin mainnet
255
207
  s.enabledNetworkMap[bitcoinKeys.namespace][bitcoinKeys.storageKey] =
256
208
  true;
@@ -258,9 +210,8 @@ export class NetworkEnablementController extends BaseController {
258
210
  // Enable Tron mainnet if it exists in MultichainNetworkController configurations
259
211
  const tronKeys = deriveKeys(TrxScope.Mainnet);
260
212
  if (multichainState.multichainNetworkConfigurationsByChainId[TrxScope.Mainnet]) {
261
- // Ensure namespace buckets exist
213
+ // Ensure namespace bucket exists
262
214
  __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureNamespaceBucket).call(this, s, tronKeys.namespace);
263
- __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureSlip44NamespaceBucket).call(this, s, tronKeys.namespace);
264
215
  // Enable Tron mainnet
265
216
  s.enabledNetworkMap[tronKeys.namespace][tronKeys.storageKey] = true;
266
217
  }
@@ -273,29 +224,20 @@ export class NetworkEnablementController extends BaseController {
273
224
  * and MultichainNetworkController and syncs the enabled network map accordingly.
274
225
  * It ensures proper namespace buckets exist for all configured networks and only
275
226
  * adds missing networks with a default value of false, preserving existing user settings.
276
- * Additionally, it fetches slip44 values for EIP-155 networks that don't have them.
277
- *
278
- * This method only runs once per controller instance to avoid unnecessary API calls.
279
- * Subsequent calls will return immediately without performing any operations.
280
- * Use `reinit()` if you need to force re-initialization.
281
227
  *
282
228
  * This method should be called after the NetworkController and MultichainNetworkController
283
229
  * have been initialized and their configurations are available.
284
230
  */
285
- async init() {
286
- if (__classPrivateFieldGet(this, _NetworkEnablementController_initialized, "f")) {
287
- return;
288
- }
289
- // Get network configurations
290
- const networkControllerState = this.messenger.call('NetworkController:getState');
291
- const multichainState = this.messenger.call('MultichainNetworkController:getState');
292
- // First, initialize the state synchronously
231
+ init() {
293
232
  this.update((s) => {
233
+ // Get network configurations from NetworkController (EVM networks)
234
+ const networkControllerState = this.messenger.call('NetworkController:getState');
235
+ // Get network configurations from MultichainNetworkController (all networks)
236
+ const multichainState = this.messenger.call('MultichainNetworkController:getState');
294
237
  // Initialize namespace buckets for EVM networks from NetworkController
295
238
  Object.keys(networkControllerState.networkConfigurationsByChainId).forEach((chainId) => {
296
239
  const { namespace, storageKey } = deriveKeys(chainId);
297
240
  __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureNamespaceBucket).call(this, s, namespace);
298
- __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureSlip44NamespaceBucket).call(this, s, namespace);
299
241
  // Only add network if it doesn't already exist in state (preserves user settings)
300
242
  if (s.enabledNetworkMap[namespace][storageKey] === undefined) {
301
243
  s.enabledNetworkMap[namespace][storageKey] = false;
@@ -305,63 +247,12 @@ export class NetworkEnablementController extends BaseController {
305
247
  Object.keys(multichainState.multichainNetworkConfigurationsByChainId).forEach((chainId) => {
306
248
  const { namespace, storageKey } = deriveKeys(chainId);
307
249
  __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureNamespaceBucket).call(this, s, namespace);
308
- __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureSlip44NamespaceBucket).call(this, s, namespace);
309
250
  // Only add network if it doesn't already exist in state (preserves user settings)
310
251
  if (s.enabledNetworkMap[namespace][storageKey] === undefined) {
311
252
  s.enabledNetworkMap[namespace][storageKey] = false;
312
253
  }
313
254
  });
314
255
  });
315
- // Collect EIP-155 networks that need slip44 values
316
- const networksToFetch = [];
317
- Object.keys(networkControllerState.networkConfigurationsByChainId).forEach((chainId) => {
318
- const { namespace, storageKey, reference } = deriveKeys(chainId);
319
- if (namespace === 'eip155') {
320
- // Check if slip44 value already exists in state
321
- const existingSlip44 = this.state.slip44[namespace]?.[storageKey];
322
- if (!existingSlip44) {
323
- const numericChainId = parseInt(reference, 16);
324
- networksToFetch.push({ chainId, storageKey, numericChainId });
325
- }
326
- }
327
- });
328
- // Fetch slip44 values for networks that don't have them
329
- if (networksToFetch.length > 0) {
330
- const slip44Promises = networksToFetch.map(async ({ chainId, storageKey, numericChainId }) => {
331
- try {
332
- const slip44Value = await getSlip44ByChainId(numericChainId);
333
- return { chainId, storageKey, slip44Value };
334
- }
335
- catch (error) {
336
- console.error(`Failed to fetch slip44 for chainId ${chainId}:`, error);
337
- return { chainId, storageKey, slip44Value: null };
338
- }
339
- });
340
- const results = await Promise.all(slip44Promises);
341
- // Update state with fetched slip44 values
342
- this.update((s) => {
343
- results.forEach(({ storageKey, slip44Value }) => {
344
- if (slip44Value !== null) {
345
- // Ensure namespace exists (should already exist from above)
346
- __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureSlip44NamespaceBucket).call(this, s, 'eip155');
347
- // @ts-expect-error - TypeScript doesn't recognize the dynamic namespace access
348
- s.slip44.eip155[storageKey] = slip44Value;
349
- }
350
- });
351
- });
352
- }
353
- __classPrivateFieldSet(this, _NetworkEnablementController_initialized, true, "f");
354
- }
355
- /**
356
- * Re-initializes the controller's state.
357
- *
358
- * This method forces a fresh initialization even if the controller has already been initialized.
359
- * It will re-fetch slip44 values for all EIP-155 networks and re-sync the network state.
360
- * Use this when you need to force a full re-initialization.
361
- */
362
- async reinit() {
363
- __classPrivateFieldSet(this, _NetworkEnablementController_initialized, false, "f");
364
- await this.init();
365
256
  }
366
257
  /**
367
258
  * Disables a network for the user.
@@ -398,14 +289,10 @@ export class NetworkEnablementController extends BaseController {
398
289
  return this.state.enabledNetworkMap[namespace]?.[storageKey] ?? false;
399
290
  }
400
291
  }
401
- _NetworkEnablementController_initialized = new WeakMap(), _NetworkEnablementController_instances = new WeakSet(), _NetworkEnablementController_ensureNamespaceBucket = function _NetworkEnablementController_ensureNamespaceBucket(state, ns) {
292
+ _NetworkEnablementController_instances = new WeakSet(), _NetworkEnablementController_ensureNamespaceBucket = function _NetworkEnablementController_ensureNamespaceBucket(state, ns) {
402
293
  if (!state.enabledNetworkMap[ns]) {
403
294
  state.enabledNetworkMap[ns] = {};
404
295
  }
405
- }, _NetworkEnablementController_ensureSlip44NamespaceBucket = function _NetworkEnablementController_ensureSlip44NamespaceBucket(state, ns) {
406
- if (!state.slip44[ns]) {
407
- state.slip44[ns] = {};
408
- }
409
296
  }, _NetworkEnablementController_isInPopularNetworksMode = function _NetworkEnablementController_isInPopularNetworksMode() {
410
297
  // Get current network configurations to check which popular networks exist
411
298
  const networkControllerState = this.messenger.call('NetworkController:getState');
@@ -434,41 +321,11 @@ _NetworkEnablementController_initialized = new WeakMap(), _NetworkEnablementCont
434
321
  delete s.enabledNetworkMap[namespace][storageKey];
435
322
  }
436
323
  });
437
- }, _NetworkEnablementController_onAddNetwork =
438
- /**
439
- * Handles the addition of a new network to the controller.
440
- *
441
- * @param chainId - The chain ID to add (Hex or CAIP-2 format)
442
- *
443
- * @description
444
- * - If in popular networks mode (>2 popular networks enabled) AND adding a popular network:
445
- * - Keep current selection (add but don't enable the new network)
446
- * - Otherwise:
447
- * - Switch to the newly added network (disable all others, enable this one)
448
- * - Fetches and stores slip44 value for EIP-155 networks
449
- */
450
- async function _NetworkEnablementController_onAddNetwork(chainId) {
324
+ }, _NetworkEnablementController_onAddNetwork = function _NetworkEnablementController_onAddNetwork(chainId) {
451
325
  const { namespace, storageKey, reference } = deriveKeys(chainId);
452
- // Fetch slip44 for EIP-155 networks
453
- let slip44Value = null;
454
- if (namespace === 'eip155') {
455
- try {
456
- // Convert hex chainId to decimal for the API call
457
- const numericChainId = parseInt(reference);
458
- slip44Value = await getSlip44ByChainId(numericChainId);
459
- }
460
- catch (error) {
461
- console.error(`Failed to fetch slip44 for chainId ${chainId}:`, error);
462
- }
463
- }
464
326
  this.update((s) => {
465
- // Ensure the namespace buckets exist
327
+ // Ensure the namespace bucket exists
466
328
  __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureNamespaceBucket).call(this, s, namespace);
467
- __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureSlip44NamespaceBucket).call(this, s, namespace);
468
- // Add slip44 value if fetched successfully
469
- if (slip44Value !== null) {
470
- s.slip44[namespace][storageKey] = slip44Value;
471
- }
472
329
  // Check if popular networks mode is active (>2 popular networks enabled)
473
330
  const inPopularNetworksMode = __classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_isInPopularNetworksMode).call(this);
474
331
  // Check if the network being added is a popular network
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkEnablementController.mjs","sourceRoot":"","sources":["../src/NetworkEnablementController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { BuiltInNetworkName, ChainId } from '@metamask/controller-utils';\nimport { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api';\nimport type { Messenger } from '@metamask/messenger';\nimport type { MultichainNetworkControllerGetStateAction } from '@metamask/multichain-network-controller';\nimport type {\n NetworkControllerGetStateAction,\n NetworkControllerNetworkAddedEvent,\n NetworkControllerNetworkRemovedEvent,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { TransactionControllerTransactionSubmittedEvent } from '@metamask/transaction-controller';\nimport type { CaipChainId, CaipNamespace, Hex } from '@metamask/utils';\nimport { KnownCaipNamespace } from '@metamask/utils';\n\nimport { getSlip44ByChainId } from './ChainService';\nimport { POPULAR_NETWORKS } from './constants';\nimport {\n deriveKeys,\n isOnlyNetworkEnabledInNamespace,\n isPopularNetwork,\n} from './utils';\n\nconst controllerName = 'NetworkEnablementController';\n\n/**\n * Information about an ordered network.\n */\nexport type NetworksInfo = {\n /**\n * The network's chain id\n */\n networkId: CaipChainId;\n};\n\n/**\n * A map of enabled networks by CAIP namespace and chain ID.\n * For EIP-155 networks, the keys are Hex chain IDs.\n * For other networks, the keys are CAIP chain IDs.\n */\ntype EnabledMap = Record<CaipNamespace, Record<CaipChainId | Hex, boolean>>;\n\n// State shape for NetworkEnablementController\nexport type NetworkEnablementControllerState = {\n enabledNetworkMap: EnabledMap;\n slip44: Record<CaipNamespace, Record<CaipChainId | Hex, string>>;\n};\n\nexport type NetworkEnablementControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n NetworkEnablementControllerState\n >;\n\nexport type NetworkEnablementControllerSetEnabledNetworksAction = {\n type: `${typeof controllerName}:enableNetwork`;\n handler: NetworkEnablementController['enableNetwork'];\n};\n\nexport type NetworkEnablementControllerDisableNetworkAction = {\n type: `${typeof controllerName}:disableNetwork`;\n handler: NetworkEnablementController['disableNetwork'];\n};\n\n/**\n * All actions that {@link NetworkEnablementController} calls internally.\n */\nexport type AllowedActions =\n | NetworkControllerGetStateAction\n | MultichainNetworkControllerGetStateAction;\n\nexport type NetworkEnablementControllerActions =\n | NetworkEnablementControllerGetStateAction\n | NetworkEnablementControllerSetEnabledNetworksAction\n | NetworkEnablementControllerDisableNetworkAction;\n\nexport type NetworkEnablementControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n NetworkEnablementControllerState\n >;\n\nexport type NetworkEnablementControllerEvents =\n NetworkEnablementControllerStateChangeEvent;\n\n/**\n * All events that {@link NetworkEnablementController} subscribes to internally.\n */\nexport type AllowedEvents =\n | NetworkControllerNetworkAddedEvent\n | NetworkControllerNetworkRemovedEvent\n | NetworkControllerStateChangeEvent\n | TransactionControllerTransactionSubmittedEvent;\n\nexport type NetworkEnablementControllerMessenger = Messenger<\n typeof controllerName,\n NetworkEnablementControllerActions | AllowedActions,\n NetworkEnablementControllerEvents | AllowedEvents\n>;\n\n/**\n * Gets the default state for the NetworkEnablementController.\n *\n * @returns The default state with pre-enabled networks.\n */\nconst getDefaultNetworkEnablementControllerState =\n (): NetworkEnablementControllerState => ({\n enabledNetworkMap: {\n [KnownCaipNamespace.Eip155]: {\n [ChainId[BuiltInNetworkName.Mainnet]]: true,\n [ChainId[BuiltInNetworkName.LineaMainnet]]: true,\n [ChainId[BuiltInNetworkName.BaseMainnet]]: true,\n [ChainId[BuiltInNetworkName.ArbitrumOne]]: true,\n [ChainId[BuiltInNetworkName.BscMainnet]]: true,\n [ChainId[BuiltInNetworkName.OptimismMainnet]]: true,\n [ChainId[BuiltInNetworkName.PolygonMainnet]]: true,\n [ChainId[BuiltInNetworkName.SeiMainnet]]: true,\n },\n [KnownCaipNamespace.Solana]: {\n [SolScope.Mainnet]: true,\n [SolScope.Testnet]: false,\n [SolScope.Devnet]: false,\n },\n [KnownCaipNamespace.Bip122]: {\n [BtcScope.Mainnet]: true,\n [BtcScope.Testnet]: false,\n [BtcScope.Signet]: false,\n },\n [KnownCaipNamespace.Tron]: {\n [TrxScope.Mainnet]: true,\n [TrxScope.Nile]: false,\n [TrxScope.Shasta]: false,\n },\n },\n slip44: {\n [KnownCaipNamespace.Eip155]: {\n [ChainId[BuiltInNetworkName.Mainnet]]: '60', // ETH\n [ChainId[BuiltInNetworkName.LineaMainnet]]: '69', // LINEA\n [ChainId[BuiltInNetworkName.BaseMainnet]]: '8453', // BASE\n [ChainId[BuiltInNetworkName.ArbitrumOne]]: '42161', // ARBITRUM\n [ChainId[BuiltInNetworkName.BscMainnet]]: '56', // BSC\n [ChainId[BuiltInNetworkName.OptimismMainnet]]: '10', // OPTIMISM\n [ChainId[BuiltInNetworkName.PolygonMainnet]]: '966', // POLYGON\n [ChainId[BuiltInNetworkName.SeiMainnet]]: '19000118', // SEI\n },\n [KnownCaipNamespace.Solana]: {\n [SolScope.Mainnet]: '501', // SOL\n [SolScope.Testnet]: '501', // SOL\n [SolScope.Devnet]: '501', // SOL\n },\n [KnownCaipNamespace.Bip122]: {\n [BtcScope.Mainnet]: '0', // BTC\n [BtcScope.Testnet]: '0', // BTC\n [BtcScope.Signet]: '0', // BTC\n },\n [KnownCaipNamespace.Tron]: {\n [TrxScope.Mainnet]: '195', // TRX\n [TrxScope.Nile]: '195', // TRX\n [TrxScope.Shasta]: '195', // TRX\n },\n },\n });\n\n// Metadata for the controller state\nconst metadata = {\n enabledNetworkMap: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n slip44: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n};\n\n/**\n * Controller responsible for managing network enablement state across different blockchain networks.\n *\n * This controller tracks which networks are enabled/disabled for the user and provides methods\n * to toggle network states. It supports both EVM (EIP-155) and non-EVM networks like Solana.\n *\n * The controller maintains a map of enabled networks organized by namespace (e.g., 'eip155', 'solana')\n * and provides methods to query and modify network enablement states.\n */\nexport class NetworkEnablementController extends BaseController<\n typeof controllerName,\n NetworkEnablementControllerState,\n NetworkEnablementControllerMessenger\n> {\n #initialized = false;\n\n /**\n * Creates a NetworkEnablementController instance.\n *\n * @param args - The arguments to this function.\n * @param args.messenger - Messenger used to communicate with BaseV2 controller.\n * @param args.state - Initial state to set on this controller.\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: NetworkEnablementControllerMessenger;\n state?: Partial<NetworkEnablementControllerState>;\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: {\n ...getDefaultNetworkEnablementControllerState(),\n ...state,\n },\n });\n\n messenger.subscribe('NetworkController:networkAdded', ({ chainId }) => {\n // Handle async network addition\n this.#onAddNetwork(chainId).catch((error) => {\n console.error('Error adding network:', error);\n });\n });\n\n messenger.subscribe('NetworkController:networkRemoved', ({ chainId }) => {\n this.#removeNetworkEntry(chainId);\n });\n }\n\n /**\n * Enables or disables a network for the user.\n *\n * This method accepts either a Hex chain ID (for EVM networks) or a CAIP-2 chain ID\n * (for any blockchain network). The method will automatically convert Hex chain IDs\n * to CAIP-2 format internally. This dual parameter support allows for backward\n * compatibility with existing EVM chain ID formats while supporting newer\n * multi-chain standards.\n *\n * When enabling a non-popular network, this method will disable all other networks\n * to ensure only one network is active at a time (exclusive mode).\n *\n * @param chainId - The chain ID of the network to enable or disable. Can be either:\n * - A Hex string (e.g., '0x1' for Ethereum mainnet) for EVM networks\n * - A CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet, 'solana:mainnet' for Solana)\n */\n enableNetwork(chainId: Hex | CaipChainId): void {\n const { namespace, storageKey } = deriveKeys(chainId);\n\n this.update((s) => {\n // disable all networks in all namespaces first\n Object.keys(s.enabledNetworkMap).forEach((ns) => {\n Object.keys(s.enabledNetworkMap[ns]).forEach((key) => {\n s.enabledNetworkMap[ns][key as CaipChainId | Hex] = false;\n });\n });\n\n // if the namespace bucket does not exist, return\n // new nemespace are added only when a new network is added\n if (!s.enabledNetworkMap[namespace]) {\n return;\n }\n\n // enable the network\n s.enabledNetworkMap[namespace][storageKey] = true;\n });\n }\n\n /**\n * Enables a network for the user within a specific namespace.\n *\n * This method accepts either a Hex chain ID (for EVM networks) or a CAIP-2 chain ID\n * (for any blockchain network) and enables it within the specified namespace.\n * The method validates that the chainId belongs to the specified namespace for safety.\n *\n * Before enabling the target network, this method disables all other networks\n * in the same namespace to ensure exclusive behavior within the namespace.\n *\n * @param chainId - The chain ID of the network to enable. Can be either:\n * - A Hex string (e.g., '0x1' for Ethereum mainnet) for EVM networks\n * - A CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet, 'solana:mainnet' for Solana)\n * @param namespace - The CAIP namespace where the network should be enabled\n * @throws Error if the chainId's derived namespace doesn't match the provided namespace\n */\n enableNetworkInNamespace(\n chainId: Hex | CaipChainId,\n namespace: CaipNamespace,\n ): void {\n const { namespace: derivedNamespace, storageKey } = deriveKeys(chainId);\n\n // Validate that the derived namespace matches the provided namespace\n if (derivedNamespace !== namespace) {\n throw new Error(\n `Chain ID ${chainId} belongs to namespace ${derivedNamespace}, but namespace ${namespace} was specified`,\n );\n }\n\n this.update((s) => {\n // Ensure the namespace buckets exist\n this.#ensureNamespaceBucket(s, namespace);\n this.#ensureSlip44NamespaceBucket(s, namespace);\n\n // Disable all networks in the specified namespace first\n if (s.enabledNetworkMap[namespace]) {\n Object.keys(s.enabledNetworkMap[namespace]).forEach((key) => {\n s.enabledNetworkMap[namespace][key as CaipChainId | Hex] = false;\n });\n }\n\n // Enable the target network in the specified namespace\n s.enabledNetworkMap[namespace][storageKey] = true;\n });\n }\n\n /**\n * Enables all popular networks and Solana mainnet.\n *\n * This method first disables all networks across all namespaces, then enables\n * all networks defined in POPULAR_NETWORKS (EVM networks), Solana mainnet, and\n * Bitcoin mainnet. This provides exclusive behavior - only popular networks will\n * be enabled after calling this method.\n *\n * Popular networks that don't exist in NetworkController or MultichainNetworkController configurations will be skipped silently.\n */\n enableAllPopularNetworks(): void {\n this.update((s) => {\n // First disable all networks across all namespaces\n Object.keys(s.enabledNetworkMap).forEach((ns) => {\n Object.keys(s.enabledNetworkMap[ns]).forEach((key) => {\n s.enabledNetworkMap[ns][key as CaipChainId | Hex] = false;\n });\n });\n\n // Get current network configurations to check if networks exist\n const networkControllerState = this.messenger.call(\n 'NetworkController:getState',\n );\n const multichainState = this.messenger.call(\n 'MultichainNetworkController:getState',\n );\n\n // Enable all popular EVM networks that exist in NetworkController configurations\n POPULAR_NETWORKS.forEach((chainId) => {\n const { namespace, storageKey } = deriveKeys(chainId as Hex);\n\n // Check if network exists in NetworkController configurations\n if (\n networkControllerState.networkConfigurationsByChainId[chainId as Hex]\n ) {\n // Ensure namespace buckets exist\n this.#ensureNamespaceBucket(s, namespace);\n this.#ensureSlip44NamespaceBucket(s, namespace);\n // Enable the network\n s.enabledNetworkMap[namespace][storageKey] = true;\n }\n });\n\n // Enable Solana mainnet if it exists in MultichainNetworkController configurations\n const solanaKeys = deriveKeys(SolScope.Mainnet as CaipChainId);\n if (\n multichainState.multichainNetworkConfigurationsByChainId[\n SolScope.Mainnet\n ]\n ) {\n // Ensure namespace buckets exist\n this.#ensureNamespaceBucket(s, solanaKeys.namespace);\n this.#ensureSlip44NamespaceBucket(s, solanaKeys.namespace);\n // Enable Solana mainnet\n s.enabledNetworkMap[solanaKeys.namespace][solanaKeys.storageKey] = true;\n }\n\n // Enable Bitcoin mainnet if it exists in MultichainNetworkController configurations\n const bitcoinKeys = deriveKeys(BtcScope.Mainnet as CaipChainId);\n if (\n multichainState.multichainNetworkConfigurationsByChainId[\n BtcScope.Mainnet\n ]\n ) {\n // Ensure namespace buckets exist\n this.#ensureNamespaceBucket(s, bitcoinKeys.namespace);\n this.#ensureSlip44NamespaceBucket(s, bitcoinKeys.namespace);\n // Enable Bitcoin mainnet\n s.enabledNetworkMap[bitcoinKeys.namespace][bitcoinKeys.storageKey] =\n true;\n }\n\n // Enable Tron mainnet if it exists in MultichainNetworkController configurations\n const tronKeys = deriveKeys(TrxScope.Mainnet as CaipChainId);\n if (\n multichainState.multichainNetworkConfigurationsByChainId[\n TrxScope.Mainnet\n ]\n ) {\n // Ensure namespace buckets exist\n this.#ensureNamespaceBucket(s, tronKeys.namespace);\n this.#ensureSlip44NamespaceBucket(s, tronKeys.namespace);\n // Enable Tron mainnet\n s.enabledNetworkMap[tronKeys.namespace][tronKeys.storageKey] = true;\n }\n });\n }\n\n /**\n * Initializes the network enablement state from network controller configurations.\n *\n * This method reads the current network configurations from both NetworkController\n * and MultichainNetworkController and syncs the enabled network map accordingly.\n * It ensures proper namespace buckets exist for all configured networks and only\n * adds missing networks with a default value of false, preserving existing user settings.\n * Additionally, it fetches slip44 values for EIP-155 networks that don't have them.\n *\n * This method only runs once per controller instance to avoid unnecessary API calls.\n * Subsequent calls will return immediately without performing any operations.\n * Use `reinit()` if you need to force re-initialization.\n *\n * This method should be called after the NetworkController and MultichainNetworkController\n * have been initialized and their configurations are available.\n */\n async init(): Promise<void> {\n if (this.#initialized) {\n return;\n }\n\n // Get network configurations\n const networkControllerState = this.messenger.call(\n 'NetworkController:getState',\n );\n const multichainState = this.messenger.call(\n 'MultichainNetworkController:getState',\n );\n\n // First, initialize the state synchronously\n this.update((s) => {\n // Initialize namespace buckets for EVM networks from NetworkController\n Object.keys(\n networkControllerState.networkConfigurationsByChainId,\n ).forEach((chainId) => {\n const { namespace, storageKey } = deriveKeys(chainId as Hex);\n this.#ensureNamespaceBucket(s, namespace);\n this.#ensureSlip44NamespaceBucket(s, namespace);\n\n // Only add network if it doesn't already exist in state (preserves user settings)\n if (s.enabledNetworkMap[namespace][storageKey] === undefined) {\n s.enabledNetworkMap[namespace][storageKey] = false;\n }\n });\n\n // Initialize namespace buckets for all networks from MultichainNetworkController\n Object.keys(\n multichainState.multichainNetworkConfigurationsByChainId,\n ).forEach((chainId) => {\n const { namespace, storageKey } = deriveKeys(chainId as CaipChainId);\n this.#ensureNamespaceBucket(s, namespace);\n this.#ensureSlip44NamespaceBucket(s, namespace);\n\n // Only add network if it doesn't already exist in state (preserves user settings)\n if (s.enabledNetworkMap[namespace][storageKey] === undefined) {\n s.enabledNetworkMap[namespace][storageKey] = false;\n }\n });\n });\n\n // Collect EIP-155 networks that need slip44 values\n const networksToFetch: {\n chainId: string;\n storageKey: string;\n numericChainId: number;\n }[] = [];\n\n Object.keys(networkControllerState.networkConfigurationsByChainId).forEach(\n (chainId) => {\n const { namespace, storageKey, reference } = deriveKeys(chainId as Hex);\n\n if (namespace === 'eip155') {\n // Check if slip44 value already exists in state\n const existingSlip44 = this.state.slip44[namespace]?.[storageKey];\n if (!existingSlip44) {\n const numericChainId = parseInt(reference, 16);\n networksToFetch.push({ chainId, storageKey, numericChainId });\n }\n }\n },\n );\n\n // Fetch slip44 values for networks that don't have them\n if (networksToFetch.length > 0) {\n const slip44Promises = networksToFetch.map(\n async ({ chainId, storageKey, numericChainId }) => {\n try {\n const slip44Value = await getSlip44ByChainId(numericChainId);\n return { chainId, storageKey, slip44Value };\n } catch (error) {\n console.error(\n `Failed to fetch slip44 for chainId ${chainId}:`,\n error,\n );\n return { chainId, storageKey, slip44Value: null };\n }\n },\n );\n\n const results = await Promise.all(slip44Promises);\n\n // Update state with fetched slip44 values\n this.update((s) => {\n results.forEach(({ storageKey, slip44Value }) => {\n if (slip44Value !== null) {\n // Ensure namespace exists (should already exist from above)\n this.#ensureSlip44NamespaceBucket(s, 'eip155');\n // @ts-expect-error - TypeScript doesn't recognize the dynamic namespace access\n s.slip44.eip155[storageKey] = slip44Value;\n }\n });\n });\n }\n\n this.#initialized = true;\n }\n\n /**\n * Re-initializes the controller's state.\n *\n * This method forces a fresh initialization even if the controller has already been initialized.\n * It will re-fetch slip44 values for all EIP-155 networks and re-sync the network state.\n * Use this when you need to force a full re-initialization.\n */\n async reinit(): Promise<void> {\n this.#initialized = false;\n await this.init();\n }\n\n /**\n * Disables a network for the user.\n *\n * This method accepts either a Hex chain ID (for EVM networks) or a CAIP-2 chain ID\n * (for any blockchain network). The method will automatically convert Hex chain IDs\n * to CAIP-2 format internally.\n *\n * Note: This method will prevent disabling the last remaining enabled network\n * to ensure at least one network is always available.\n *\n * @param chainId - The chain ID of the network to disable. Can be either:\n * - A Hex string (e.g., '0x1' for Ethereum mainnet) for EVM networks\n * - A CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet, 'solana:mainnet' for Solana)\n */\n disableNetwork(chainId: Hex | CaipChainId): void {\n const derivedKeys = deriveKeys(chainId);\n const { namespace, storageKey } = derivedKeys;\n\n this.update((s) => {\n s.enabledNetworkMap[namespace][storageKey] = false;\n });\n }\n\n /**\n * Checks if a network is enabled.\n *\n * @param chainId - The chain ID of the network to check. Can be either:\n * - A Hex string (e.g., '0x1' for Ethereum mainnet) for EVM networks\n * - A CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet, 'solana:mainnet' for Solana)\n * @returns True if the network is enabled, false otherwise\n */\n isNetworkEnabled(chainId: Hex | CaipChainId): boolean {\n const derivedKeys = deriveKeys(chainId);\n const { namespace, storageKey } = derivedKeys;\n return this.state.enabledNetworkMap[namespace]?.[storageKey] ?? false;\n }\n\n /**\n * Ensures that a namespace bucket exists in the state.\n *\n * This method creates the namespace entry in the enabledNetworkMap if it doesn't\n * already exist. This is used to prepare the state structure before adding\n * network entries.\n *\n * @param state - The current controller state\n * @param ns - The CAIP namespace to ensure exists\n */\n #ensureNamespaceBucket(\n state: NetworkEnablementControllerState,\n ns: CaipNamespace,\n ) {\n if (!state.enabledNetworkMap[ns]) {\n state.enabledNetworkMap[ns] = {};\n }\n }\n\n /**\n * Ensures that a namespace bucket exists in the slip44 state.\n *\n * This method creates the namespace entry in the slip44 map if it doesn't\n * already exist. This is used to prepare the state structure before adding\n * slip44 entries.\n *\n * @param state - The current controller state\n * @param ns - The CAIP namespace to ensure exists\n */\n #ensureSlip44NamespaceBucket(\n state: NetworkEnablementControllerState,\n ns: CaipNamespace,\n ) {\n if (!state.slip44[ns]) {\n state.slip44[ns] = {};\n }\n }\n\n /**\n * Checks if popular networks mode is active (more than 2 popular networks enabled).\n *\n * This method counts how many networks defined in POPULAR_NETWORKS are currently\n * enabled in the state and returns true if more than 2 are enabled. It only checks\n * networks that actually exist in the NetworkController configurations.\n *\n * @returns True if more than 2 popular networks are enabled, false otherwise\n */\n #isInPopularNetworksMode(): boolean {\n // Get current network configurations to check which popular networks exist\n const networkControllerState = this.messenger.call(\n 'NetworkController:getState',\n );\n\n // Count how many popular networks are enabled\n const enabledPopularNetworksCount = POPULAR_NETWORKS.reduce(\n (count, chainId) => {\n // Only check networks that actually exist in NetworkController configurations\n if (\n !networkControllerState.networkConfigurationsByChainId[chainId as Hex]\n ) {\n return count; // Skip networks that don't exist\n }\n\n const { namespace, storageKey } = deriveKeys(chainId as Hex);\n const isEnabled = this.state.enabledNetworkMap[namespace]?.[storageKey];\n return isEnabled ? count + 1 : count;\n },\n 0,\n );\n\n // Return true if more than 2 popular networks are enabled\n return enabledPopularNetworksCount > 1;\n }\n\n /**\n * Removes a network entry from the state.\n *\n * This method is called when a network is removed from the system. It cleans up\n * the network entry and ensures that at least one network remains enabled.\n *\n * @param chainId - The chain ID to remove (Hex or CAIP-2 format)\n */\n #removeNetworkEntry(chainId: Hex | CaipChainId): void {\n const derivedKeys = deriveKeys(chainId);\n const { namespace, storageKey } = derivedKeys;\n\n this.update((s) => {\n // fallback and enable ethereum mainnet\n if (isOnlyNetworkEnabledInNamespace(this.state, derivedKeys)) {\n s.enabledNetworkMap[namespace][ChainId[BuiltInNetworkName.Mainnet]] =\n true;\n }\n\n if (namespace in s.enabledNetworkMap) {\n delete s.enabledNetworkMap[namespace][storageKey];\n }\n });\n }\n\n /**\n * Handles the addition of a new network to the controller.\n *\n * @param chainId - The chain ID to add (Hex or CAIP-2 format)\n *\n * @description\n * - If in popular networks mode (>2 popular networks enabled) AND adding a popular network:\n * - Keep current selection (add but don't enable the new network)\n * - Otherwise:\n * - Switch to the newly added network (disable all others, enable this one)\n * - Fetches and stores slip44 value for EIP-155 networks\n */\n async #onAddNetwork(chainId: Hex | CaipChainId): Promise<void> {\n const { namespace, storageKey, reference } = deriveKeys(chainId);\n\n // Fetch slip44 for EIP-155 networks\n let slip44Value: string | null = null;\n if (namespace === 'eip155') {\n try {\n // Convert hex chainId to decimal for the API call\n const numericChainId = parseInt(reference);\n slip44Value = await getSlip44ByChainId(numericChainId);\n } catch (error) {\n console.error(`Failed to fetch slip44 for chainId ${chainId}:`, error);\n }\n }\n\n this.update((s) => {\n // Ensure the namespace buckets exist\n this.#ensureNamespaceBucket(s, namespace);\n this.#ensureSlip44NamespaceBucket(s, namespace);\n\n // Add slip44 value if fetched successfully\n if (slip44Value !== null) {\n s.slip44[namespace][storageKey] = slip44Value;\n }\n\n // Check if popular networks mode is active (>2 popular networks enabled)\n const inPopularNetworksMode = this.#isInPopularNetworksMode();\n\n // Check if the network being added is a popular network\n const isAddedNetworkPopular = isPopularNetwork(reference);\n\n // Keep current selection only if in popular networks mode AND adding a popular network\n const shouldKeepCurrentSelection =\n inPopularNetworksMode && isAddedNetworkPopular;\n\n if (shouldKeepCurrentSelection) {\n // Add the popular network but don't enable it (keep current selection)\n s.enabledNetworkMap[namespace][storageKey] = true;\n } else {\n // Switch to the newly added network (disable all others, enable this one)\n Object.keys(s.enabledNetworkMap).forEach((ns) => {\n Object.keys(s.enabledNetworkMap[ns]).forEach((key) => {\n s.enabledNetworkMap[ns][key as CaipChainId | Hex] = false;\n });\n });\n // Enable the newly added network\n s.enabledNetworkMap[namespace][storageKey] = true;\n }\n });\n }\n}\n"]}
1
+ {"version":3,"file":"NetworkEnablementController.mjs","sourceRoot":"","sources":["../src/NetworkEnablementController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { BuiltInNetworkName, ChainId } from '@metamask/controller-utils';\nimport { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api';\nimport type { Messenger } from '@metamask/messenger';\nimport type { MultichainNetworkControllerGetStateAction } from '@metamask/multichain-network-controller';\nimport type {\n NetworkControllerGetStateAction,\n NetworkControllerNetworkAddedEvent,\n NetworkControllerNetworkRemovedEvent,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { TransactionControllerTransactionSubmittedEvent } from '@metamask/transaction-controller';\nimport type { CaipChainId, CaipNamespace, Hex } from '@metamask/utils';\nimport { KnownCaipNamespace } from '@metamask/utils';\n\nimport { POPULAR_NETWORKS } from './constants';\nimport {\n deriveKeys,\n isOnlyNetworkEnabledInNamespace,\n isPopularNetwork,\n} from './utils';\n\nconst controllerName = 'NetworkEnablementController';\n\n/**\n * Information about an ordered network.\n */\nexport type NetworksInfo = {\n /**\n * The network's chain id\n */\n networkId: CaipChainId;\n};\n\n/**\n * A map of enabled networks by CAIP namespace and chain ID.\n * For EIP-155 networks, the keys are Hex chain IDs.\n * For other networks, the keys are CAIP chain IDs.\n */\ntype EnabledMap = Record<CaipNamespace, Record<CaipChainId | Hex, boolean>>;\n\n// State shape for NetworkEnablementController\nexport type NetworkEnablementControllerState = {\n enabledNetworkMap: EnabledMap;\n};\n\nexport type NetworkEnablementControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n NetworkEnablementControllerState\n >;\n\nexport type NetworkEnablementControllerSetEnabledNetworksAction = {\n type: `${typeof controllerName}:enableNetwork`;\n handler: NetworkEnablementController['enableNetwork'];\n};\n\nexport type NetworkEnablementControllerDisableNetworkAction = {\n type: `${typeof controllerName}:disableNetwork`;\n handler: NetworkEnablementController['disableNetwork'];\n};\n\n/**\n * All actions that {@link NetworkEnablementController} calls internally.\n */\nexport type AllowedActions =\n | NetworkControllerGetStateAction\n | MultichainNetworkControllerGetStateAction;\n\nexport type NetworkEnablementControllerActions =\n | NetworkEnablementControllerGetStateAction\n | NetworkEnablementControllerSetEnabledNetworksAction\n | NetworkEnablementControllerDisableNetworkAction;\n\nexport type NetworkEnablementControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n NetworkEnablementControllerState\n >;\n\nexport type NetworkEnablementControllerEvents =\n NetworkEnablementControllerStateChangeEvent;\n\n/**\n * All events that {@link NetworkEnablementController} subscribes to internally.\n */\nexport type AllowedEvents =\n | NetworkControllerNetworkAddedEvent\n | NetworkControllerNetworkRemovedEvent\n | NetworkControllerStateChangeEvent\n | TransactionControllerTransactionSubmittedEvent;\n\nexport type NetworkEnablementControllerMessenger = Messenger<\n typeof controllerName,\n NetworkEnablementControllerActions | AllowedActions,\n NetworkEnablementControllerEvents | AllowedEvents\n>;\n\n/**\n * Gets the default state for the NetworkEnablementController.\n *\n * @returns The default state with pre-enabled networks.\n */\nconst getDefaultNetworkEnablementControllerState =\n (): NetworkEnablementControllerState => ({\n enabledNetworkMap: {\n [KnownCaipNamespace.Eip155]: {\n [ChainId[BuiltInNetworkName.Mainnet]]: true,\n [ChainId[BuiltInNetworkName.LineaMainnet]]: true,\n [ChainId[BuiltInNetworkName.BaseMainnet]]: true,\n [ChainId[BuiltInNetworkName.ArbitrumOne]]: true,\n [ChainId[BuiltInNetworkName.BscMainnet]]: true,\n [ChainId[BuiltInNetworkName.OptimismMainnet]]: true,\n [ChainId[BuiltInNetworkName.PolygonMainnet]]: true,\n [ChainId[BuiltInNetworkName.SeiMainnet]]: true,\n },\n [KnownCaipNamespace.Solana]: {\n [SolScope.Mainnet]: true,\n [SolScope.Testnet]: false,\n [SolScope.Devnet]: false,\n },\n [KnownCaipNamespace.Bip122]: {\n [BtcScope.Mainnet]: true,\n [BtcScope.Testnet]: false,\n [BtcScope.Signet]: false,\n },\n [KnownCaipNamespace.Tron]: {\n [TrxScope.Mainnet]: true,\n [TrxScope.Nile]: false,\n [TrxScope.Shasta]: false,\n },\n },\n });\n\n// Metadata for the controller state\nconst metadata = {\n enabledNetworkMap: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n};\n\n/**\n * Controller responsible for managing network enablement state across different blockchain networks.\n *\n * This controller tracks which networks are enabled/disabled for the user and provides methods\n * to toggle network states. It supports both EVM (EIP-155) and non-EVM networks like Solana.\n *\n * The controller maintains a map of enabled networks organized by namespace (e.g., 'eip155', 'solana')\n * and provides methods to query and modify network enablement states.\n */\nexport class NetworkEnablementController extends BaseController<\n typeof controllerName,\n NetworkEnablementControllerState,\n NetworkEnablementControllerMessenger\n> {\n /**\n * Creates a NetworkEnablementController instance.\n *\n * @param args - The arguments to this function.\n * @param args.messenger - Messenger used to communicate with BaseV2 controller.\n * @param args.state - Initial state to set on this controller.\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: NetworkEnablementControllerMessenger;\n state?: Partial<NetworkEnablementControllerState>;\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: {\n ...getDefaultNetworkEnablementControllerState(),\n ...state,\n },\n });\n\n messenger.subscribe('NetworkController:networkAdded', ({ chainId }) => {\n this.#onAddNetwork(chainId);\n });\n\n messenger.subscribe('NetworkController:networkRemoved', ({ chainId }) => {\n this.#removeNetworkEntry(chainId);\n });\n }\n\n /**\n * Enables or disables a network for the user.\n *\n * This method accepts either a Hex chain ID (for EVM networks) or a CAIP-2 chain ID\n * (for any blockchain network). The method will automatically convert Hex chain IDs\n * to CAIP-2 format internally. This dual parameter support allows for backward\n * compatibility with existing EVM chain ID formats while supporting newer\n * multi-chain standards.\n *\n * When enabling a non-popular network, this method will disable all other networks\n * to ensure only one network is active at a time (exclusive mode).\n *\n * @param chainId - The chain ID of the network to enable or disable. Can be either:\n * - A Hex string (e.g., '0x1' for Ethereum mainnet) for EVM networks\n * - A CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet, 'solana:mainnet' for Solana)\n */\n enableNetwork(chainId: Hex | CaipChainId): void {\n const { namespace, storageKey } = deriveKeys(chainId);\n\n this.update((s) => {\n // disable all networks in all namespaces first\n Object.keys(s.enabledNetworkMap).forEach((ns) => {\n Object.keys(s.enabledNetworkMap[ns]).forEach((key) => {\n s.enabledNetworkMap[ns][key as CaipChainId | Hex] = false;\n });\n });\n\n // if the namespace bucket does not exist, return\n // new nemespace are added only when a new network is added\n if (!s.enabledNetworkMap[namespace]) {\n return;\n }\n\n // enable the network\n s.enabledNetworkMap[namespace][storageKey] = true;\n });\n }\n\n /**\n * Enables a network for the user within a specific namespace.\n *\n * This method accepts either a Hex chain ID (for EVM networks) or a CAIP-2 chain ID\n * (for any blockchain network) and enables it within the specified namespace.\n * The method validates that the chainId belongs to the specified namespace for safety.\n *\n * Before enabling the target network, this method disables all other networks\n * in the same namespace to ensure exclusive behavior within the namespace.\n *\n * @param chainId - The chain ID of the network to enable. Can be either:\n * - A Hex string (e.g., '0x1' for Ethereum mainnet) for EVM networks\n * - A CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet, 'solana:mainnet' for Solana)\n * @param namespace - The CAIP namespace where the network should be enabled\n * @throws Error if the chainId's derived namespace doesn't match the provided namespace\n */\n enableNetworkInNamespace(\n chainId: Hex | CaipChainId,\n namespace: CaipNamespace,\n ): void {\n const { namespace: derivedNamespace, storageKey } = deriveKeys(chainId);\n\n // Validate that the derived namespace matches the provided namespace\n if (derivedNamespace !== namespace) {\n throw new Error(\n `Chain ID ${chainId} belongs to namespace ${derivedNamespace}, but namespace ${namespace} was specified`,\n );\n }\n\n this.update((s) => {\n // Ensure the namespace bucket exists\n this.#ensureNamespaceBucket(s, namespace);\n\n // Disable all networks in the specified namespace first\n if (s.enabledNetworkMap[namespace]) {\n Object.keys(s.enabledNetworkMap[namespace]).forEach((key) => {\n s.enabledNetworkMap[namespace][key as CaipChainId | Hex] = false;\n });\n }\n\n // Enable the target network in the specified namespace\n s.enabledNetworkMap[namespace][storageKey] = true;\n });\n }\n\n /**\n * Enables all popular networks and Solana mainnet.\n *\n * This method first disables all networks across all namespaces, then enables\n * all networks defined in POPULAR_NETWORKS (EVM networks), Solana mainnet, and\n * Bitcoin mainnet. This provides exclusive behavior - only popular networks will\n * be enabled after calling this method.\n *\n * Popular networks that don't exist in NetworkController or MultichainNetworkController configurations will be skipped silently.\n */\n enableAllPopularNetworks(): void {\n this.update((s) => {\n // First disable all networks across all namespaces\n Object.keys(s.enabledNetworkMap).forEach((ns) => {\n Object.keys(s.enabledNetworkMap[ns]).forEach((key) => {\n s.enabledNetworkMap[ns][key as CaipChainId | Hex] = false;\n });\n });\n\n // Get current network configurations to check if networks exist\n const networkControllerState = this.messenger.call(\n 'NetworkController:getState',\n );\n const multichainState = this.messenger.call(\n 'MultichainNetworkController:getState',\n );\n\n // Enable all popular EVM networks that exist in NetworkController configurations\n POPULAR_NETWORKS.forEach((chainId) => {\n const { namespace, storageKey } = deriveKeys(chainId as Hex);\n\n // Check if network exists in NetworkController configurations\n if (\n networkControllerState.networkConfigurationsByChainId[chainId as Hex]\n ) {\n // Ensure namespace bucket exists\n this.#ensureNamespaceBucket(s, namespace);\n // Enable the network\n s.enabledNetworkMap[namespace][storageKey] = true;\n }\n });\n\n // Enable Solana mainnet if it exists in MultichainNetworkController configurations\n const solanaKeys = deriveKeys(SolScope.Mainnet as CaipChainId);\n if (\n multichainState.multichainNetworkConfigurationsByChainId[\n SolScope.Mainnet\n ]\n ) {\n // Ensure namespace bucket exists\n this.#ensureNamespaceBucket(s, solanaKeys.namespace);\n // Enable Solana mainnet\n s.enabledNetworkMap[solanaKeys.namespace][solanaKeys.storageKey] = true;\n }\n\n // Enable Bitcoin mainnet if it exists in MultichainNetworkController configurations\n const bitcoinKeys = deriveKeys(BtcScope.Mainnet as CaipChainId);\n if (\n multichainState.multichainNetworkConfigurationsByChainId[\n BtcScope.Mainnet\n ]\n ) {\n // Ensure namespace bucket exists\n this.#ensureNamespaceBucket(s, bitcoinKeys.namespace);\n // Enable Bitcoin mainnet\n s.enabledNetworkMap[bitcoinKeys.namespace][bitcoinKeys.storageKey] =\n true;\n }\n\n // Enable Tron mainnet if it exists in MultichainNetworkController configurations\n const tronKeys = deriveKeys(TrxScope.Mainnet as CaipChainId);\n if (\n multichainState.multichainNetworkConfigurationsByChainId[\n TrxScope.Mainnet\n ]\n ) {\n // Ensure namespace bucket exists\n this.#ensureNamespaceBucket(s, tronKeys.namespace);\n // Enable Tron mainnet\n s.enabledNetworkMap[tronKeys.namespace][tronKeys.storageKey] = true;\n }\n });\n }\n\n /**\n * Initializes the network enablement state from network controller configurations.\n *\n * This method reads the current network configurations from both NetworkController\n * and MultichainNetworkController and syncs the enabled network map accordingly.\n * It ensures proper namespace buckets exist for all configured networks and only\n * adds missing networks with a default value of false, preserving existing user settings.\n *\n * This method should be called after the NetworkController and MultichainNetworkController\n * have been initialized and their configurations are available.\n */\n init(): void {\n this.update((s) => {\n // Get network configurations from NetworkController (EVM networks)\n const networkControllerState = this.messenger.call(\n 'NetworkController:getState',\n );\n\n // Get network configurations from MultichainNetworkController (all networks)\n const multichainState = this.messenger.call(\n 'MultichainNetworkController:getState',\n );\n\n // Initialize namespace buckets for EVM networks from NetworkController\n Object.keys(\n networkControllerState.networkConfigurationsByChainId,\n ).forEach((chainId) => {\n const { namespace, storageKey } = deriveKeys(chainId as Hex);\n this.#ensureNamespaceBucket(s, namespace);\n\n // Only add network if it doesn't already exist in state (preserves user settings)\n if (s.enabledNetworkMap[namespace][storageKey] === undefined) {\n s.enabledNetworkMap[namespace][storageKey] = false;\n }\n });\n\n // Initialize namespace buckets for all networks from MultichainNetworkController\n Object.keys(\n multichainState.multichainNetworkConfigurationsByChainId,\n ).forEach((chainId) => {\n const { namespace, storageKey } = deriveKeys(chainId as CaipChainId);\n this.#ensureNamespaceBucket(s, namespace);\n\n // Only add network if it doesn't already exist in state (preserves user settings)\n if (s.enabledNetworkMap[namespace][storageKey] === undefined) {\n s.enabledNetworkMap[namespace][storageKey] = false;\n }\n });\n });\n }\n\n /**\n * Disables a network for the user.\n *\n * This method accepts either a Hex chain ID (for EVM networks) or a CAIP-2 chain ID\n * (for any blockchain network). The method will automatically convert Hex chain IDs\n * to CAIP-2 format internally.\n *\n * Note: This method will prevent disabling the last remaining enabled network\n * to ensure at least one network is always available.\n *\n * @param chainId - The chain ID of the network to disable. Can be either:\n * - A Hex string (e.g., '0x1' for Ethereum mainnet) for EVM networks\n * - A CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet, 'solana:mainnet' for Solana)\n */\n disableNetwork(chainId: Hex | CaipChainId): void {\n const derivedKeys = deriveKeys(chainId);\n const { namespace, storageKey } = derivedKeys;\n\n this.update((s) => {\n s.enabledNetworkMap[namespace][storageKey] = false;\n });\n }\n\n /**\n * Checks if a network is enabled.\n *\n * @param chainId - The chain ID of the network to check. Can be either:\n * - A Hex string (e.g., '0x1' for Ethereum mainnet) for EVM networks\n * - A CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet, 'solana:mainnet' for Solana)\n * @returns True if the network is enabled, false otherwise\n */\n isNetworkEnabled(chainId: Hex | CaipChainId): boolean {\n const derivedKeys = deriveKeys(chainId);\n const { namespace, storageKey } = derivedKeys;\n return this.state.enabledNetworkMap[namespace]?.[storageKey] ?? false;\n }\n\n /**\n * Ensures that a namespace bucket exists in the state.\n *\n * This method creates the namespace entry in the enabledNetworkMap if it doesn't\n * already exist. This is used to prepare the state structure before adding\n * network entries.\n *\n * @param state - The current controller state\n * @param ns - The CAIP namespace to ensure exists\n */\n #ensureNamespaceBucket(\n state: NetworkEnablementControllerState,\n ns: CaipNamespace,\n ) {\n if (!state.enabledNetworkMap[ns]) {\n state.enabledNetworkMap[ns] = {};\n }\n }\n\n /**\n * Checks if popular networks mode is active (more than 2 popular networks enabled).\n *\n * This method counts how many networks defined in POPULAR_NETWORKS are currently\n * enabled in the state and returns true if more than 2 are enabled. It only checks\n * networks that actually exist in the NetworkController configurations.\n *\n * @returns True if more than 2 popular networks are enabled, false otherwise\n */\n #isInPopularNetworksMode(): boolean {\n // Get current network configurations to check which popular networks exist\n const networkControllerState = this.messenger.call(\n 'NetworkController:getState',\n );\n\n // Count how many popular networks are enabled\n const enabledPopularNetworksCount = POPULAR_NETWORKS.reduce(\n (count, chainId) => {\n // Only check networks that actually exist in NetworkController configurations\n if (\n !networkControllerState.networkConfigurationsByChainId[chainId as Hex]\n ) {\n return count; // Skip networks that don't exist\n }\n\n const { namespace, storageKey } = deriveKeys(chainId as Hex);\n const isEnabled = this.state.enabledNetworkMap[namespace]?.[storageKey];\n return isEnabled ? count + 1 : count;\n },\n 0,\n );\n\n // Return true if more than 2 popular networks are enabled\n return enabledPopularNetworksCount > 1;\n }\n\n /**\n * Removes a network entry from the state.\n *\n * This method is called when a network is removed from the system. It cleans up\n * the network entry and ensures that at least one network remains enabled.\n *\n * @param chainId - The chain ID to remove (Hex or CAIP-2 format)\n */\n #removeNetworkEntry(chainId: Hex | CaipChainId): void {\n const derivedKeys = deriveKeys(chainId);\n const { namespace, storageKey } = derivedKeys;\n\n this.update((s) => {\n // fallback and enable ethereum mainnet\n if (isOnlyNetworkEnabledInNamespace(this.state, derivedKeys)) {\n s.enabledNetworkMap[namespace][ChainId[BuiltInNetworkName.Mainnet]] =\n true;\n }\n\n if (namespace in s.enabledNetworkMap) {\n delete s.enabledNetworkMap[namespace][storageKey];\n }\n });\n }\n\n /**\n * Handles the addition of a new network to the controller.\n *\n * @param chainId - The chain ID to add (Hex or CAIP-2 format)\n *\n * @description\n * - If in popular networks mode (>2 popular networks enabled) AND adding a popular network:\n * - Keep current selection (add but don't enable the new network)\n * - Otherwise:\n * - Switch to the newly added network (disable all others, enable this one)\n */\n #onAddNetwork(chainId: Hex | CaipChainId): void {\n const { namespace, storageKey, reference } = deriveKeys(chainId);\n\n this.update((s) => {\n // Ensure the namespace bucket exists\n this.#ensureNamespaceBucket(s, namespace);\n\n // Check if popular networks mode is active (>2 popular networks enabled)\n const inPopularNetworksMode = this.#isInPopularNetworksMode();\n\n // Check if the network being added is a popular network\n const isAddedNetworkPopular = isPopularNetwork(reference);\n\n // Keep current selection only if in popular networks mode AND adding a popular network\n const shouldKeepCurrentSelection =\n inPopularNetworksMode && isAddedNetworkPopular;\n\n if (shouldKeepCurrentSelection) {\n // Add the popular network but don't enable it (keep current selection)\n s.enabledNetworkMap[namespace][storageKey] = true;\n } else {\n // Switch to the newly added network (disable all others, enable this one)\n Object.keys(s.enabledNetworkMap).forEach((ns) => {\n Object.keys(s.enabledNetworkMap[ns]).forEach((key) => {\n s.enabledNetworkMap[ns][key as CaipChainId | Hex] = false;\n });\n });\n // Enable the newly added network\n s.enabledNetworkMap[namespace][storageKey] = true;\n }\n });\n }\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSlip44ByChainId = exports.selectEnabledSolanaNetworks = exports.selectEnabledEvmNetworks = exports.selectEnabledNetworksCount = exports.selectAllEnabledNetworks = exports.createSelectorForEnabledNetworksForNamespace = exports.selectIsNetworkEnabled = exports.selectEnabledNetworkMap = exports.NetworkEnablementController = void 0;
3
+ exports.selectEnabledSolanaNetworks = exports.selectEnabledEvmNetworks = exports.selectEnabledNetworksCount = exports.selectAllEnabledNetworks = exports.createSelectorForEnabledNetworksForNamespace = exports.selectIsNetworkEnabled = exports.selectEnabledNetworkMap = exports.NetworkEnablementController = void 0;
4
4
  var NetworkEnablementController_1 = require("./NetworkEnablementController.cjs");
5
5
  Object.defineProperty(exports, "NetworkEnablementController", { enumerable: true, get: function () { return NetworkEnablementController_1.NetworkEnablementController; } });
6
6
  var selectors_1 = require("./selectors.cjs");
@@ -11,6 +11,4 @@ Object.defineProperty(exports, "selectAllEnabledNetworks", { enumerable: true, g
11
11
  Object.defineProperty(exports, "selectEnabledNetworksCount", { enumerable: true, get: function () { return selectors_1.selectEnabledNetworksCount; } });
12
12
  Object.defineProperty(exports, "selectEnabledEvmNetworks", { enumerable: true, get: function () { return selectors_1.selectEnabledEvmNetworks; } });
13
13
  Object.defineProperty(exports, "selectEnabledSolanaNetworks", { enumerable: true, get: function () { return selectors_1.selectEnabledSolanaNetworks; } });
14
- var ChainService_1 = require("./ChainService.cjs");
15
- Object.defineProperty(exports, "getSlip44ByChainId", { enumerable: true, get: function () { return ChainService_1.getSlip44ByChainId; } });
16
14
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iFAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AAUpC,6CAQqB;AAPnB,oHAAA,uBAAuB,OAAA;AACvB,mHAAA,sBAAsB,OAAA;AACtB,yIAAA,4CAA4C,OAAA;AAC5C,qHAAA,wBAAwB,OAAA;AACxB,uHAAA,0BAA0B,OAAA;AAC1B,qHAAA,wBAAwB,OAAA;AACxB,wHAAA,2BAA2B,OAAA;AAG7B,mDAAoD;AAA3C,kHAAA,kBAAkB,OAAA","sourcesContent":["export { NetworkEnablementController } from './NetworkEnablementController';\n\nexport type {\n NetworkEnablementControllerState,\n NetworkEnablementControllerGetStateAction,\n NetworkEnablementControllerActions,\n NetworkEnablementControllerEvents,\n NetworkEnablementControllerMessenger,\n} from './NetworkEnablementController';\n\nexport {\n selectEnabledNetworkMap,\n selectIsNetworkEnabled,\n createSelectorForEnabledNetworksForNamespace,\n selectAllEnabledNetworks,\n selectEnabledNetworksCount,\n selectEnabledEvmNetworks,\n selectEnabledSolanaNetworks,\n} from './selectors';\n\nexport { getSlip44ByChainId } from './ChainService';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iFAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AAUpC,6CAQqB;AAPnB,oHAAA,uBAAuB,OAAA;AACvB,mHAAA,sBAAsB,OAAA;AACtB,yIAAA,4CAA4C,OAAA;AAC5C,qHAAA,wBAAwB,OAAA;AACxB,uHAAA,0BAA0B,OAAA;AAC1B,qHAAA,wBAAwB,OAAA;AACxB,wHAAA,2BAA2B,OAAA","sourcesContent":["export { NetworkEnablementController } from './NetworkEnablementController';\n\nexport type {\n NetworkEnablementControllerState,\n NetworkEnablementControllerGetStateAction,\n NetworkEnablementControllerActions,\n NetworkEnablementControllerEvents,\n NetworkEnablementControllerMessenger,\n} from './NetworkEnablementController';\n\nexport {\n selectEnabledNetworkMap,\n selectIsNetworkEnabled,\n createSelectorForEnabledNetworksForNamespace,\n selectAllEnabledNetworks,\n selectEnabledNetworksCount,\n selectEnabledEvmNetworks,\n selectEnabledSolanaNetworks,\n} from './selectors';\n"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,4 @@
1
1
  export { NetworkEnablementController } from "./NetworkEnablementController.cjs";
2
2
  export type { NetworkEnablementControllerState, NetworkEnablementControllerGetStateAction, NetworkEnablementControllerActions, NetworkEnablementControllerEvents, NetworkEnablementControllerMessenger, } from "./NetworkEnablementController.cjs";
3
3
  export { selectEnabledNetworkMap, selectIsNetworkEnabled, createSelectorForEnabledNetworksForNamespace, selectAllEnabledNetworks, selectEnabledNetworksCount, selectEnabledEvmNetworks, selectEnabledSolanaNetworks, } from "./selectors.cjs";
4
- export { getSlip44ByChainId } from "./ChainService.cjs";
5
4
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,0CAAsC;AAE5E,YAAY,EACV,gCAAgC,EAChC,yCAAyC,EACzC,kCAAkC,EAClC,iCAAiC,EACjC,oCAAoC,GACrC,0CAAsC;AAEvC,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,4CAA4C,EAC5C,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,GAC5B,wBAAoB;AAErB,OAAO,EAAE,kBAAkB,EAAE,2BAAuB"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,0CAAsC;AAE5E,YAAY,EACV,gCAAgC,EAChC,yCAAyC,EACzC,kCAAkC,EAClC,iCAAiC,EACjC,oCAAoC,GACrC,0CAAsC;AAEvC,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,4CAA4C,EAC5C,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,GAC5B,wBAAoB"}
package/dist/index.d.mts CHANGED
@@ -1,5 +1,4 @@
1
1
  export { NetworkEnablementController } from "./NetworkEnablementController.mjs";
2
2
  export type { NetworkEnablementControllerState, NetworkEnablementControllerGetStateAction, NetworkEnablementControllerActions, NetworkEnablementControllerEvents, NetworkEnablementControllerMessenger, } from "./NetworkEnablementController.mjs";
3
3
  export { selectEnabledNetworkMap, selectIsNetworkEnabled, createSelectorForEnabledNetworksForNamespace, selectAllEnabledNetworks, selectEnabledNetworksCount, selectEnabledEvmNetworks, selectEnabledSolanaNetworks, } from "./selectors.mjs";
4
- export { getSlip44ByChainId } from "./ChainService.mjs";
5
4
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,0CAAsC;AAE5E,YAAY,EACV,gCAAgC,EAChC,yCAAyC,EACzC,kCAAkC,EAClC,iCAAiC,EACjC,oCAAoC,GACrC,0CAAsC;AAEvC,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,4CAA4C,EAC5C,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,GAC5B,wBAAoB;AAErB,OAAO,EAAE,kBAAkB,EAAE,2BAAuB"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,0CAAsC;AAE5E,YAAY,EACV,gCAAgC,EAChC,yCAAyC,EACzC,kCAAkC,EAClC,iCAAiC,EACjC,oCAAoC,GACrC,0CAAsC;AAEvC,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,4CAA4C,EAC5C,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,GAC5B,wBAAoB"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,3 @@
1
1
  export { NetworkEnablementController } from "./NetworkEnablementController.mjs";
2
2
  export { selectEnabledNetworkMap, selectIsNetworkEnabled, createSelectorForEnabledNetworksForNamespace, selectAllEnabledNetworks, selectEnabledNetworksCount, selectEnabledEvmNetworks, selectEnabledSolanaNetworks } from "./selectors.mjs";
3
- export { getSlip44ByChainId } from "./ChainService.mjs";
4
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,0CAAsC;AAU5E,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,4CAA4C,EAC5C,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC5B,wBAAoB;AAErB,OAAO,EAAE,kBAAkB,EAAE,2BAAuB","sourcesContent":["export { NetworkEnablementController } from './NetworkEnablementController';\n\nexport type {\n NetworkEnablementControllerState,\n NetworkEnablementControllerGetStateAction,\n NetworkEnablementControllerActions,\n NetworkEnablementControllerEvents,\n NetworkEnablementControllerMessenger,\n} from './NetworkEnablementController';\n\nexport {\n selectEnabledNetworkMap,\n selectIsNetworkEnabled,\n createSelectorForEnabledNetworksForNamespace,\n selectAllEnabledNetworks,\n selectEnabledNetworksCount,\n selectEnabledEvmNetworks,\n selectEnabledSolanaNetworks,\n} from './selectors';\n\nexport { getSlip44ByChainId } from './ChainService';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,0CAAsC;AAU5E,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,4CAA4C,EAC5C,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC5B,wBAAoB","sourcesContent":["export { NetworkEnablementController } from './NetworkEnablementController';\n\nexport type {\n NetworkEnablementControllerState,\n NetworkEnablementControllerGetStateAction,\n NetworkEnablementControllerActions,\n NetworkEnablementControllerEvents,\n NetworkEnablementControllerMessenger,\n} from './NetworkEnablementController';\n\nexport {\n selectEnabledNetworkMap,\n selectIsNetworkEnabled,\n createSelectorForEnabledNetworksForNamespace,\n selectAllEnabledNetworks,\n selectEnabledNetworksCount,\n selectEnabledEvmNetworks,\n selectEnabledSolanaNetworks,\n} from './selectors';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/network-enablement-controller",
3
- "version": "3.1.0-preview-5460dce",
3
+ "version": "3.1.0-preview-898a4135",
4
4
  "description": "Provides an interface to the currently enabled network using a MetaMask-compatible provider object",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -65,7 +65,6 @@
65
65
  "@metamask/controller-utils": "^11.15.0",
66
66
  "@metamask/keyring-api": "^21.0.0",
67
67
  "@metamask/messenger": "^0.3.0",
68
- "@metamask/slip44": "^4.2.0",
69
68
  "@metamask/utils": "^11.8.1",
70
69
  "reselect": "^5.1.1"
71
70
  },