@metamask-previews/network-enablement-controller 0.1.0-preview-037d305
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/CHANGELOG.md +17 -0
- package/LICENSE +20 -0
- package/README.md +182 -0
- package/dist/NetworkEnablementController.cjs +178 -0
- package/dist/NetworkEnablementController.cjs.map +1 -0
- package/dist/NetworkEnablementController.d.cts +102 -0
- package/dist/NetworkEnablementController.d.cts.map +1 -0
- package/dist/NetworkEnablementController.d.mts +102 -0
- package/dist/NetworkEnablementController.d.mts.map +1 -0
- package/dist/NetworkEnablementController.mjs +174 -0
- package/dist/NetworkEnablementController.mjs.map +1 -0
- package/dist/constants.cjs +16 -0
- package/dist/constants.cjs.map +1 -0
- package/dist/constants.d.cts +2 -0
- package/dist/constants.d.cts.map +1 -0
- package/dist/constants.d.mts +2 -0
- package/dist/constants.d.mts.map +1 -0
- package/dist/constants.mjs +13 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/index.cjs +14 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -0
- package/dist/selectors.cjs +87 -0
- package/dist/selectors.cjs.map +1 -0
- package/dist/selectors.d.cts +280 -0
- package/dist/selectors.d.cts.map +1 -0
- package/dist/selectors.d.mts +280 -0
- package/dist/selectors.d.mts.map +1 -0
- package/dist/selectors.mjs +81 -0
- package/dist/selectors.mjs.map +1 -0
- package/dist/types.cjs +13 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +9 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +9 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +10 -0
- package/dist/types.mjs.map +1 -0
- package/dist/utils.cjs +80 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +43 -0
- package/dist/utils.d.cts.map +1 -0
- package/dist/utils.d.mts +43 -0
- package/dist/utils.d.mts.map +1 -0
- package/dist/utils.mjs +74 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
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
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
+
};
|
|
6
|
+
var _NetworkEnablementController_instances, _NetworkEnablementController_ensureNamespaceBucket, _NetworkEnablementController_removeNetworkEntry, _NetworkEnablementController_onAddNetwork;
|
|
7
|
+
import { BaseController } from "@metamask/base-controller";
|
|
8
|
+
import { BuiltInNetworkName, ChainId } from "@metamask/controller-utils";
|
|
9
|
+
import { KnownCaipNamespace } from "@metamask/utils";
|
|
10
|
+
import { SolScope } from "./types.mjs";
|
|
11
|
+
import { deriveKeys, isOnlyNetworkEnabledInNamespace, isPopularNetwork } from "./utils.mjs";
|
|
12
|
+
const controllerName = 'NetworkEnablementController';
|
|
13
|
+
/**
|
|
14
|
+
* Gets the default state for the NetworkEnablementController.
|
|
15
|
+
*
|
|
16
|
+
* @returns The default state with pre-enabled networks.
|
|
17
|
+
*/
|
|
18
|
+
const getDefaultNetworkEnablementControllerState = () => ({
|
|
19
|
+
enabledNetworkMap: {
|
|
20
|
+
[KnownCaipNamespace.Eip155]: {
|
|
21
|
+
[ChainId[BuiltInNetworkName.Mainnet]]: true,
|
|
22
|
+
[ChainId[BuiltInNetworkName.LineaMainnet]]: true,
|
|
23
|
+
[ChainId[BuiltInNetworkName.BaseMainnet]]: true,
|
|
24
|
+
},
|
|
25
|
+
[KnownCaipNamespace.Solana]: {
|
|
26
|
+
[SolScope.Mainnet]: true,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
// Metadata for the controller state
|
|
31
|
+
const metadata = {
|
|
32
|
+
enabledNetworkMap: {
|
|
33
|
+
persist: true,
|
|
34
|
+
anonymous: true,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Controller responsible for managing network enablement state across different blockchain networks.
|
|
39
|
+
*
|
|
40
|
+
* This controller tracks which networks are enabled/disabled for the user and provides methods
|
|
41
|
+
* to toggle network states. It supports both EVM (EIP-155) and non-EVM networks like Solana.
|
|
42
|
+
*
|
|
43
|
+
* The controller maintains a map of enabled networks organized by namespace (e.g., 'eip155', 'solana')
|
|
44
|
+
* and provides methods to query and modify network enablement states.
|
|
45
|
+
*/
|
|
46
|
+
export class NetworkEnablementController extends BaseController {
|
|
47
|
+
/**
|
|
48
|
+
* Creates a NetworkEnablementController instance.
|
|
49
|
+
*
|
|
50
|
+
* @param args - The arguments to this function.
|
|
51
|
+
* @param args.messenger - Messenger used to communicate with BaseV2 controller.
|
|
52
|
+
* @param args.state - Initial state to set on this controller.
|
|
53
|
+
*/
|
|
54
|
+
constructor({ messenger, state, }) {
|
|
55
|
+
super({
|
|
56
|
+
messenger,
|
|
57
|
+
metadata,
|
|
58
|
+
name: controllerName,
|
|
59
|
+
state: {
|
|
60
|
+
...getDefaultNetworkEnablementControllerState(),
|
|
61
|
+
...state,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
_NetworkEnablementController_instances.add(this);
|
|
65
|
+
messenger.subscribe('NetworkController:networkAdded', ({ chainId }) => {
|
|
66
|
+
__classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_onAddNetwork).call(this, chainId);
|
|
67
|
+
});
|
|
68
|
+
messenger.subscribe('NetworkController:networkRemoved', ({ chainId }) => {
|
|
69
|
+
__classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_removeNetworkEntry).call(this, chainId);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Enables or disables a network for the user.
|
|
74
|
+
*
|
|
75
|
+
* This method accepts either a Hex chain ID (for EVM networks) or a CAIP-2 chain ID
|
|
76
|
+
* (for any blockchain network). The method will automatically convert Hex chain IDs
|
|
77
|
+
* to CAIP-2 format internally. This dual parameter support allows for backward
|
|
78
|
+
* compatibility with existing EVM chain ID formats while supporting newer
|
|
79
|
+
* multi-chain standards.
|
|
80
|
+
*
|
|
81
|
+
* When enabling a non-popular network, this method will disable all other networks
|
|
82
|
+
* to ensure only one network is active at a time (exclusive mode).
|
|
83
|
+
*
|
|
84
|
+
* @param chainId - The chain ID of the network to enable or disable. Can be either:
|
|
85
|
+
* - A Hex string (e.g., '0x1' for Ethereum mainnet) for EVM networks
|
|
86
|
+
* - A CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet, 'solana:mainnet' for Solana)
|
|
87
|
+
*/
|
|
88
|
+
enableNetwork(chainId) {
|
|
89
|
+
const { namespace, storageKey, reference } = deriveKeys(chainId);
|
|
90
|
+
const isPopular = isPopularNetwork(reference);
|
|
91
|
+
this.update((s) => {
|
|
92
|
+
// if the namespace bucket does not exist, return
|
|
93
|
+
// new nemespace are added only when a new network is added
|
|
94
|
+
if (!s.enabledNetworkMap[namespace]) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// If enabling a non-popular network, disable all networks in the same namespace
|
|
98
|
+
if (!isPopular) {
|
|
99
|
+
// disable all networks in the same namespace
|
|
100
|
+
Object.keys(s.enabledNetworkMap[namespace]).forEach((key) => {
|
|
101
|
+
s.enabledNetworkMap[namespace][key] = false;
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// disable all custom networks
|
|
106
|
+
Object.keys(s.enabledNetworkMap[namespace]).forEach((key) => {
|
|
107
|
+
const { reference: keyReference } = deriveKeys(key);
|
|
108
|
+
if (!isPopularNetwork(keyReference)) {
|
|
109
|
+
s.enabledNetworkMap[namespace][key] = false;
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
s.enabledNetworkMap[namespace][storageKey] = true;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Disables a network for the user.
|
|
118
|
+
*
|
|
119
|
+
* This method accepts either a Hex chain ID (for EVM networks) or a CAIP-2 chain ID
|
|
120
|
+
* (for any blockchain network). The method will automatically convert Hex chain IDs
|
|
121
|
+
* to CAIP-2 format internally.
|
|
122
|
+
*
|
|
123
|
+
* Note: This method will prevent disabling the last remaining enabled network
|
|
124
|
+
* to ensure at least one network is always available.
|
|
125
|
+
*
|
|
126
|
+
* @param chainId - The chain ID of the network to disable. Can be either:
|
|
127
|
+
* - A Hex string (e.g., '0x1' for Ethereum mainnet) for EVM networks
|
|
128
|
+
* - A CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet, 'solana:mainnet' for Solana)
|
|
129
|
+
*/
|
|
130
|
+
disableNetwork(chainId) {
|
|
131
|
+
const derivedKeys = deriveKeys(chainId);
|
|
132
|
+
const { namespace, storageKey } = derivedKeys;
|
|
133
|
+
if (isOnlyNetworkEnabledInNamespace(this.state, derivedKeys)) {
|
|
134
|
+
throw new Error('Cannot disable the last remaining enabled network');
|
|
135
|
+
}
|
|
136
|
+
this.update((s) => {
|
|
137
|
+
s.enabledNetworkMap[namespace][storageKey] = false;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
_NetworkEnablementController_instances = new WeakSet(), _NetworkEnablementController_ensureNamespaceBucket = function _NetworkEnablementController_ensureNamespaceBucket(state, ns) {
|
|
142
|
+
if (!state.enabledNetworkMap[ns]) {
|
|
143
|
+
state.enabledNetworkMap[ns] = {};
|
|
144
|
+
}
|
|
145
|
+
}, _NetworkEnablementController_removeNetworkEntry = function _NetworkEnablementController_removeNetworkEntry(chainId) {
|
|
146
|
+
const derivedKeys = deriveKeys(chainId);
|
|
147
|
+
const { namespace, storageKey } = derivedKeys;
|
|
148
|
+
this.update((s) => {
|
|
149
|
+
// fallback and enable ethereum mainnet
|
|
150
|
+
if (isOnlyNetworkEnabledInNamespace(this.state, derivedKeys)) {
|
|
151
|
+
s.enabledNetworkMap[namespace][ChainId[BuiltInNetworkName.Mainnet]] =
|
|
152
|
+
true;
|
|
153
|
+
}
|
|
154
|
+
if (namespace in s.enabledNetworkMap) {
|
|
155
|
+
delete s.enabledNetworkMap[namespace][storageKey];
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}, _NetworkEnablementController_onAddNetwork = function _NetworkEnablementController_onAddNetwork(chainId) {
|
|
159
|
+
const { namespace, storageKey, reference } = deriveKeys(chainId);
|
|
160
|
+
this.update((s) => {
|
|
161
|
+
// Ensure the namespace bucket exists
|
|
162
|
+
__classPrivateFieldGet(this, _NetworkEnablementController_instances, "m", _NetworkEnablementController_ensureNamespaceBucket).call(this, s, namespace);
|
|
163
|
+
// If adding a non-popular network, disable all other networks in the same namespace
|
|
164
|
+
// This implements exclusive mode where only one non-popular network can be active
|
|
165
|
+
if (!isPopularNetwork(reference)) {
|
|
166
|
+
Object.keys(s.enabledNetworkMap[namespace]).forEach((key) => {
|
|
167
|
+
s.enabledNetworkMap[namespace][key] = false;
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Add the new network as enabled
|
|
171
|
+
s.enabledNetworkMap[namespace][storageKey] = true;
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=NetworkEnablementController.mjs.map
|
|
@@ -0,0 +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 RestrictedMessenger,\n} from '@metamask/base-controller';\nimport { BuiltInNetworkName, ChainId } from '@metamask/controller-utils';\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 { CaipChainId, CaipNamespace, Hex } from '@metamask/utils';\nimport { KnownCaipNamespace } from '@metamask/utils';\n\nimport { SolScope } from './types';\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\nexport type NetworkEnablementControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n NetworkEnablementControllerActions | AllowedActions,\n NetworkEnablementControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\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 },\n [KnownCaipNamespace.Solana]: {\n [SolScope.Mainnet]: true,\n },\n },\n });\n\n// Metadata for the controller state\nconst metadata = {\n enabledNetworkMap: {\n persist: true,\n anonymous: 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, reference } = deriveKeys(chainId);\n\n const isPopular = isPopularNetwork(reference);\n\n this.update((s) => {\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 // If enabling a non-popular network, disable all networks in the same namespace\n if (!isPopular) {\n // disable all networks in the same namespace\n Object.keys(s.enabledNetworkMap[namespace]).forEach((key) => {\n s.enabledNetworkMap[namespace][key as CaipChainId | Hex] = false;\n });\n } else {\n // disable all custom networks\n Object.keys(s.enabledNetworkMap[namespace]).forEach((key) => {\n const { reference: keyReference } = deriveKeys(key as CaipChainId);\n if (!isPopularNetwork(keyReference)) {\n s.enabledNetworkMap[namespace][key as CaipChainId | Hex] = false;\n }\n });\n }\n s.enabledNetworkMap[namespace][storageKey] = true;\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 if (isOnlyNetworkEnabledInNamespace(this.state, derivedKeys)) {\n throw new Error('Cannot disable the last remaining enabled network');\n }\n\n this.update((s) => {\n s.enabledNetworkMap[namespace][storageKey] = false;\n });\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 * 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 * This method is called when a network is added to the system. It automatically\n * enables the new network and implements exclusive mode for non-popular networks.\n * If the network already exists, no changes are made.\n *\n * @param chainId - The chain ID of the network being added (Hex or CAIP-2 format)\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 // If adding a non-popular network, disable all other networks in the same namespace\n // This implements exclusive mode where only one non-popular network can be active\n if (!isPopularNetwork(reference)) {\n Object.keys(s.enabledNetworkMap[namespace]).forEach((key) => {\n s.enabledNetworkMap[namespace][key as CaipChainId | Hex] = false;\n });\n }\n\n // Add the new network as enabled\n s.enabledNetworkMap[namespace][storageKey] = true;\n });\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POPULAR_NETWORKS = void 0;
|
|
4
|
+
exports.POPULAR_NETWORKS = [
|
|
5
|
+
'0x1',
|
|
6
|
+
'0xe708',
|
|
7
|
+
'0x2105',
|
|
8
|
+
'0xa4b1',
|
|
9
|
+
'0xa86a',
|
|
10
|
+
'0x38',
|
|
11
|
+
'0xa',
|
|
12
|
+
'0x89',
|
|
13
|
+
'0x531',
|
|
14
|
+
'0x144', // zkSync Era (324)
|
|
15
|
+
];
|
|
16
|
+
//# sourceMappingURL=constants.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG;IAC9B,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO,EAAE,mBAAmB;CAC7B,CAAC","sourcesContent":["export const POPULAR_NETWORKS = [\n '0x1', // Ethereum Mainnet\n '0xe708', // Linea (59144)\n '0x2105', // Base (8453)\n '0xa4b1', // Arbitrum One (42161)\n '0xa86a', // Avalanche C-Chain (43114)\n '0x38', // BNB Smart Chain (56)\n '0xa', // Optimism (10)\n '0x89', // Polygon (137)\n '0x531', // Sei (Assuming 1329 used in EVM context)\n '0x144', // zkSync Era (324)\n];\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,UAW5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,UAW5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO,EAAE,mBAAmB;CAC7B,CAAC","sourcesContent":["export const POPULAR_NETWORKS = [\n '0x1', // Ethereum Mainnet\n '0xe708', // Linea (59144)\n '0x2105', // Base (8453)\n '0xa4b1', // Arbitrum One (42161)\n '0xa86a', // Avalanche C-Chain (43114)\n '0x38', // BNB Smart Chain (56)\n '0xa', // Optimism (10)\n '0x89', // Polygon (137)\n '0x531', // Sei (Assuming 1329 used in EVM context)\n '0x144', // zkSync Era (324)\n];\n"]}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectEnabledSolanaNetworks = exports.selectEnabledEvmNetworks = exports.selectEnabledNetworksCount = exports.selectAllEnabledNetworks = exports.createSelectorForEnabledNetworksForNamespace = exports.selectIsNetworkEnabled = exports.selectEnabledNetworkMap = exports.NetworkEnablementController = void 0;
|
|
4
|
+
var NetworkEnablementController_1 = require("./NetworkEnablementController.cjs");
|
|
5
|
+
Object.defineProperty(exports, "NetworkEnablementController", { enumerable: true, get: function () { return NetworkEnablementController_1.NetworkEnablementController; } });
|
|
6
|
+
var selectors_1 = require("./selectors.cjs");
|
|
7
|
+
Object.defineProperty(exports, "selectEnabledNetworkMap", { enumerable: true, get: function () { return selectors_1.selectEnabledNetworkMap; } });
|
|
8
|
+
Object.defineProperty(exports, "selectIsNetworkEnabled", { enumerable: true, get: function () { return selectors_1.selectIsNetworkEnabled; } });
|
|
9
|
+
Object.defineProperty(exports, "createSelectorForEnabledNetworksForNamespace", { enumerable: true, get: function () { return selectors_1.createSelectorForEnabledNetworksForNamespace; } });
|
|
10
|
+
Object.defineProperty(exports, "selectAllEnabledNetworks", { enumerable: true, get: function () { return selectors_1.selectAllEnabledNetworks; } });
|
|
11
|
+
Object.defineProperty(exports, "selectEnabledNetworksCount", { enumerable: true, get: function () { return selectors_1.selectEnabledNetworksCount; } });
|
|
12
|
+
Object.defineProperty(exports, "selectEnabledEvmNetworks", { enumerable: true, get: function () { return selectors_1.selectEnabledEvmNetworks; } });
|
|
13
|
+
Object.defineProperty(exports, "selectEnabledSolanaNetworks", { enumerable: true, get: function () { return selectors_1.selectEnabledSolanaNetworks; } });
|
|
14
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +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","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
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { NetworkEnablementController } from "./NetworkEnablementController.cjs";
|
|
2
|
+
export type { NetworkEnablementControllerState, NetworkEnablementControllerGetStateAction, NetworkEnablementControllerActions, NetworkEnablementControllerEvents, NetworkEnablementControllerMessenger, } from "./NetworkEnablementController.cjs";
|
|
3
|
+
export { selectEnabledNetworkMap, selectIsNetworkEnabled, createSelectorForEnabledNetworksForNamespace, selectAllEnabledNetworks, selectEnabledNetworksCount, selectEnabledEvmNetworks, selectEnabledSolanaNetworks, } from "./selectors.cjs";
|
|
4
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +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"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { NetworkEnablementController } from "./NetworkEnablementController.mjs";
|
|
2
|
+
export type { NetworkEnablementControllerState, NetworkEnablementControllerGetStateAction, NetworkEnablementControllerActions, NetworkEnablementControllerEvents, NetworkEnablementControllerMessenger, } from "./NetworkEnablementController.mjs";
|
|
3
|
+
export { selectEnabledNetworkMap, selectIsNetworkEnabled, createSelectorForEnabledNetworksForNamespace, selectAllEnabledNetworks, selectEnabledNetworksCount, selectEnabledEvmNetworks, selectEnabledSolanaNetworks, } from "./selectors.mjs";
|
|
4
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +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"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { NetworkEnablementController } from "./NetworkEnablementController.mjs";
|
|
2
|
+
export { selectEnabledNetworkMap, selectIsNetworkEnabled, createSelectorForEnabledNetworksForNamespace, selectAllEnabledNetworks, selectEnabledNetworksCount, selectEnabledEvmNetworks, selectEnabledSolanaNetworks } from "./selectors.mjs";
|
|
3
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +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","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"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectEnabledSolanaNetworks = exports.selectEnabledEvmNetworks = exports.selectEnabledNetworksCount = exports.selectAllEnabledNetworks = exports.createSelectorForEnabledNetworksForNamespace = exports.selectIsNetworkEnabled = exports.selectEnabledNetworkMap = void 0;
|
|
4
|
+
const utils_1 = require("@metamask/utils");
|
|
5
|
+
const reselect_1 = require("reselect");
|
|
6
|
+
const utils_2 = require("./utils.cjs");
|
|
7
|
+
/**
|
|
8
|
+
* Base selector to get the enabled network map from the controller state.
|
|
9
|
+
*
|
|
10
|
+
* @param state - The NetworkEnablementController state
|
|
11
|
+
* @returns The enabled network map
|
|
12
|
+
*/
|
|
13
|
+
const selectEnabledNetworkMap = (state) => state.enabledNetworkMap;
|
|
14
|
+
exports.selectEnabledNetworkMap = selectEnabledNetworkMap;
|
|
15
|
+
/**
|
|
16
|
+
* Selector to check if a specific network is enabled.
|
|
17
|
+
*
|
|
18
|
+
* This selector accepts either a Hex chain ID (for EVM networks) or a CAIP-2 chain ID
|
|
19
|
+
* (for any blockchain network) and returns whether the network is currently enabled.
|
|
20
|
+
* It returns false for unknown networks or if there's an error parsing the chain ID.
|
|
21
|
+
*
|
|
22
|
+
* @param chainId - The chain ID to check (Hex or CAIP-2 format)
|
|
23
|
+
* @returns A selector function that returns true if the network is enabled, false otherwise
|
|
24
|
+
*/
|
|
25
|
+
const selectIsNetworkEnabled = (chainId) => (0, reselect_1.createSelector)(exports.selectEnabledNetworkMap, (enabledNetworkMap) => {
|
|
26
|
+
const { namespace, storageKey } = (0, utils_2.deriveKeys)(chainId);
|
|
27
|
+
return (namespace in enabledNetworkMap &&
|
|
28
|
+
storageKey in enabledNetworkMap[namespace] &&
|
|
29
|
+
enabledNetworkMap[namespace][storageKey]);
|
|
30
|
+
});
|
|
31
|
+
exports.selectIsNetworkEnabled = selectIsNetworkEnabled;
|
|
32
|
+
/**
|
|
33
|
+
* Selector builder to get all enabled networks for a specific namespace.
|
|
34
|
+
*
|
|
35
|
+
* The selector returned by this function returns an array of chain IDs (as strings) for all enabled networks
|
|
36
|
+
* within the specified namespace (e.g., 'eip155' for EVM networks, 'solana' for Solana).
|
|
37
|
+
*
|
|
38
|
+
* @param namespace - The CAIP namespace to get enabled networks for (e.g., 'eip155', 'solana')
|
|
39
|
+
* @returns A selector function that returns an array of chain ID strings for enabled networks in the namespace
|
|
40
|
+
*/
|
|
41
|
+
const createSelectorForEnabledNetworksForNamespace = (namespace) => (0, reselect_1.createSelector)(exports.selectEnabledNetworkMap, (enabledNetworkMap) => {
|
|
42
|
+
return Object.entries(enabledNetworkMap[namespace] ?? {})
|
|
43
|
+
.filter(([, enabled]) => enabled)
|
|
44
|
+
.map(([id]) => id);
|
|
45
|
+
});
|
|
46
|
+
exports.createSelectorForEnabledNetworksForNamespace = createSelectorForEnabledNetworksForNamespace;
|
|
47
|
+
/**
|
|
48
|
+
* Selector to get all enabled networks across all namespaces.
|
|
49
|
+
*
|
|
50
|
+
* This selector returns a record where keys are CAIP namespaces and values are arrays
|
|
51
|
+
* of enabled chain IDs within each namespace.
|
|
52
|
+
*
|
|
53
|
+
* @returns A selector function that returns a record mapping namespace to array of enabled chain IDs
|
|
54
|
+
*/
|
|
55
|
+
exports.selectAllEnabledNetworks = (0, reselect_1.createSelector)(exports.selectEnabledNetworkMap, (enabledNetworkMap) => {
|
|
56
|
+
return Object.keys(enabledNetworkMap).reduce((acc, ns) => {
|
|
57
|
+
acc[ns] = Object.entries(enabledNetworkMap[ns])
|
|
58
|
+
.filter(([, enabled]) => enabled)
|
|
59
|
+
.map(([id]) => id);
|
|
60
|
+
return acc;
|
|
61
|
+
}, {});
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* Selector to get the total count of enabled networks across all namespaces.
|
|
65
|
+
*
|
|
66
|
+
* @returns A selector function that returns the total number of enabled networks
|
|
67
|
+
*/
|
|
68
|
+
exports.selectEnabledNetworksCount = (0, reselect_1.createSelector)(exports.selectAllEnabledNetworks, (allEnabledNetworks) => {
|
|
69
|
+
return Object.values(allEnabledNetworks).flat().length;
|
|
70
|
+
});
|
|
71
|
+
/**
|
|
72
|
+
* Selector to get all enabled EVM networks.
|
|
73
|
+
*
|
|
74
|
+
* This is a convenience selector that specifically targets EIP-155 networks.
|
|
75
|
+
*
|
|
76
|
+
* @returns A selector function that returns an array of enabled EVM chain IDs
|
|
77
|
+
*/
|
|
78
|
+
exports.selectEnabledEvmNetworks = (0, reselect_1.createSelector)((0, exports.createSelectorForEnabledNetworksForNamespace)(utils_1.KnownCaipNamespace.Eip155), (enabledEvmNetworks) => enabledEvmNetworks);
|
|
79
|
+
/**
|
|
80
|
+
* Selector to get all enabled Solana networks.
|
|
81
|
+
*
|
|
82
|
+
* This is a convenience selector that specifically targets Solana networks.
|
|
83
|
+
*
|
|
84
|
+
* @returns A selector function that returns an array of enabled Solana chain IDs
|
|
85
|
+
*/
|
|
86
|
+
exports.selectEnabledSolanaNetworks = (0, reselect_1.createSelector)((0, exports.createSelectorForEnabledNetworksForNamespace)(utils_1.KnownCaipNamespace.Solana), (enabledSolanaNetworks) => enabledSolanaNetworks);
|
|
87
|
+
//# sourceMappingURL=selectors.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectors.cjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":";;;AACA,2CAAqD;AACrD,uCAA0C;AAG1C,uCAAqC;AAErC;;;;;GAKG;AACI,MAAM,uBAAuB,GAAG,CACrC,KAAuC,EACvC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC;AAFhB,QAAA,uBAAuB,2BAEP;AAE7B;;;;;;;;;GASG;AACI,MAAM,sBAAsB,GAAG,CAAC,OAA0B,EAAE,EAAE,CACnE,IAAA,yBAAc,EAAC,+BAAuB,EAAE,CAAC,iBAAiB,EAAE,EAAE;IAC5D,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAA,kBAAU,EAAC,OAAO,CAAC,CAAC;IAEtD,OAAO,CACL,SAAS,IAAI,iBAAiB;QAC9B,UAAU,IAAI,iBAAiB,CAAC,SAAS,CAAC;QAC1C,iBAAiB,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CACzC,CAAC;AACJ,CAAC,CAAC,CAAC;AATQ,QAAA,sBAAsB,0BAS9B;AAEL;;;;;;;;GAQG;AACI,MAAM,4CAA4C,GAAG,CAC1D,SAAwB,EACxB,EAAE,CACF,IAAA,yBAAc,EAAC,+BAAuB,EAAE,CAAC,iBAAiB,EAAE,EAAE;IAC5D,OAAO,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;SACtD,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAPQ,QAAA,4CAA4C,gDAOpD;AAEL;;;;;;;GAOG;AACU,QAAA,wBAAwB,GAAG,IAAA,yBAAc,EACpD,+BAAuB,EACvB,CAAC,iBAAiB,EAAE,EAAE;IACpB,OAAQ,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAqB,CAAC,MAAM,CAC/D,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE;QACV,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;aAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACrB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAqC,CACtC,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;;;GAIG;AACU,QAAA,0BAA0B,GAAG,IAAA,yBAAc,EACtD,gCAAwB,EACxB,CAAC,kBAAkB,EAAE,EAAE;IACrB,OAAO,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;AACzD,CAAC,CACF,CAAC;AAEF;;;;;;GAMG;AACU,QAAA,wBAAwB,GAAG,IAAA,yBAAc,EACpD,IAAA,oDAA4C,EAAC,0BAAkB,CAAC,MAAM,CAAC,EACvE,CAAC,kBAAkB,EAAE,EAAE,CAAC,kBAAkB,CAC3C,CAAC;AAEF;;;;;;GAMG;AACU,QAAA,2BAA2B,GAAG,IAAA,yBAAc,EACvD,IAAA,oDAA4C,EAAC,0BAAkB,CAAC,MAAM,CAAC,EACvE,CAAC,qBAAqB,EAAE,EAAE,CAAC,qBAAqB,CACjD,CAAC","sourcesContent":["import type { CaipChainId, CaipNamespace, Hex } from '@metamask/utils';\nimport { KnownCaipNamespace } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport type { NetworkEnablementControllerState } from './NetworkEnablementController';\nimport { deriveKeys } from './utils';\n\n/**\n * Base selector to get the enabled network map from the controller state.\n *\n * @param state - The NetworkEnablementController state\n * @returns The enabled network map\n */\nexport const selectEnabledNetworkMap = (\n state: NetworkEnablementControllerState,\n) => state.enabledNetworkMap;\n\n/**\n * Selector to check if a specific network is enabled.\n *\n * This selector accepts either a Hex chain ID (for EVM networks) or a CAIP-2 chain ID\n * (for any blockchain network) and returns whether the network is currently enabled.\n * It returns false for unknown networks or if there's an error parsing the chain ID.\n *\n * @param chainId - The chain ID to check (Hex or CAIP-2 format)\n * @returns A selector function that returns true if the network is enabled, false otherwise\n */\nexport const selectIsNetworkEnabled = (chainId: Hex | CaipChainId) =>\n createSelector(selectEnabledNetworkMap, (enabledNetworkMap) => {\n const { namespace, storageKey } = deriveKeys(chainId);\n\n return (\n namespace in enabledNetworkMap &&\n storageKey in enabledNetworkMap[namespace] &&\n enabledNetworkMap[namespace][storageKey]\n );\n });\n\n/**\n * Selector builder to get all enabled networks for a specific namespace.\n *\n * The selector returned by this function returns an array of chain IDs (as strings) for all enabled networks\n * within the specified namespace (e.g., 'eip155' for EVM networks, 'solana' for Solana).\n *\n * @param namespace - The CAIP namespace to get enabled networks for (e.g., 'eip155', 'solana')\n * @returns A selector function that returns an array of chain ID strings for enabled networks in the namespace\n */\nexport const createSelectorForEnabledNetworksForNamespace = (\n namespace: CaipNamespace,\n) =>\n createSelector(selectEnabledNetworkMap, (enabledNetworkMap) => {\n return Object.entries(enabledNetworkMap[namespace] ?? {})\n .filter(([, enabled]) => enabled)\n .map(([id]) => id);\n });\n\n/**\n * Selector to get all enabled networks across all namespaces.\n *\n * This selector returns a record where keys are CAIP namespaces and values are arrays\n * of enabled chain IDs within each namespace.\n *\n * @returns A selector function that returns a record mapping namespace to array of enabled chain IDs\n */\nexport const selectAllEnabledNetworks = createSelector(\n selectEnabledNetworkMap,\n (enabledNetworkMap) => {\n return (Object.keys(enabledNetworkMap) as CaipNamespace[]).reduce(\n (acc, ns) => {\n acc[ns] = Object.entries(enabledNetworkMap[ns])\n .filter(([, enabled]) => enabled)\n .map(([id]) => id);\n return acc;\n },\n {} as Record<CaipNamespace, string[]>,\n );\n },\n);\n\n/**\n * Selector to get the total count of enabled networks across all namespaces.\n *\n * @returns A selector function that returns the total number of enabled networks\n */\nexport const selectEnabledNetworksCount = createSelector(\n selectAllEnabledNetworks,\n (allEnabledNetworks) => {\n return Object.values(allEnabledNetworks).flat().length;\n },\n);\n\n/**\n * Selector to get all enabled EVM networks.\n *\n * This is a convenience selector that specifically targets EIP-155 networks.\n *\n * @returns A selector function that returns an array of enabled EVM chain IDs\n */\nexport const selectEnabledEvmNetworks = createSelector(\n createSelectorForEnabledNetworksForNamespace(KnownCaipNamespace.Eip155),\n (enabledEvmNetworks) => enabledEvmNetworks,\n);\n\n/**\n * Selector to get all enabled Solana networks.\n *\n * This is a convenience selector that specifically targets Solana networks.\n *\n * @returns A selector function that returns an array of enabled Solana chain IDs\n */\nexport const selectEnabledSolanaNetworks = createSelector(\n createSelectorForEnabledNetworksForNamespace(KnownCaipNamespace.Solana),\n (enabledSolanaNetworks) => enabledSolanaNetworks,\n);\n"]}
|