@metamask/network-controller 8.0.0 → 10.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkController.js","sourceRoot":"","sources":["../src/NetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import EthQuery from 'eth-query';\nimport Subprovider from 'web3-provider-engine/subproviders/provider';\nimport createInfuraProvider from 'eth-json-rpc-infura/src/createProvider';\nimport createMetamaskProvider from 'web3-provider-engine/zero';\nimport { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';\nimport type { SwappableProxy } from '@metamask/swappable-obj-proxy';\nimport { Mutex } from 'async-mutex';\nimport { v4 as random } from 'uuid';\nimport type { Patch } from 'immer';\nimport { errorCodes } from 'eth-rpc-errors';\nimport {\n BaseControllerV2,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport {\n NetworksChainId,\n NetworkType,\n isSafeChainId,\n NetworksTicker,\n isNetworkType,\n BUILT_IN_NETWORKS,\n} from '@metamask/controller-utils';\nimport { assertIsStrictHexString } from '@metamask/utils';\n\nimport { NetworkStatus } from './constants';\n\n/**\n * @type ProviderConfig\n *\n * Configuration passed to web3-provider-engine\n * @property rpcTarget - RPC target URL.\n * @property type - Human-readable network name.\n * @property chainId - Network ID as per EIP-155.\n * @property ticker - Currency ticker.\n * @property nickname - Personalized network name.\n * @property id - Network Configuration Id.\n */\nexport type ProviderConfig = {\n rpcTarget?: string;\n type: NetworkType;\n chainId: string;\n ticker?: string;\n nickname?: string;\n rpcPrefs?: { blockExplorerUrl?: string };\n id?: NetworkConfigurationId;\n};\n\nexport type Block = {\n baseFeePerGas?: string;\n};\n\nexport type NetworkDetails = {\n isEIP1559Compatible?: boolean;\n};\n\n/**\n * Custom RPC network information\n *\n * @property rpcTarget - RPC target URL.\n * @property chainId - Network ID as per EIP-155\n * @property nickname - Personalized network name.\n * @property ticker - Currency ticker.\n * @property rpcPrefs - Personalized preferences.\n */\nexport type NetworkConfiguration = {\n rpcUrl: string;\n chainId: string;\n ticker: string;\n nickname?: string;\n rpcPrefs?: {\n blockExplorerUrl: string;\n };\n};\n\n/**\n * Asserts that the given value is a network ID, i.e., that it is a decimal\n * number represented as a string.\n *\n * @param value - The value to check.\n */\nfunction assertNetworkId(value: string): asserts value is NetworkId {\n if (!/^\\d+$/u.test(value) || Number.isNaN(Number(value))) {\n throw new Error('value is not a number');\n }\n}\n\n/**\n * Type guard for determining whether the given value is an error object with a\n * `code` property, such as an instance of Error.\n *\n * TODO: Move this to @metamask/utils.\n *\n * @param error - The object to check.\n * @returns True if `error` has a `code`, false otherwise.\n */\nfunction isErrorWithCode(error: unknown): error is { code: string | number } {\n return typeof error === 'object' && error !== null && 'code' in error;\n}\n\n/**\n * The network ID of a network.\n */\nexport type NetworkId = `${number}`;\n\n/**\n * @type NetworkState\n *\n * Network controller state\n * @property network - Network ID as per net_version of the currently connected network\n * @property providerConfig - RPC URL and network name provider settings of the currently connected network\n * @property properties - an additional set of network properties for the currently connected network\n * @property networkConfigurations - the full list of configured networks either preloaded or added by the user.\n */\nexport type NetworkState = {\n networkId: NetworkId | null;\n networkStatus: NetworkStatus;\n providerConfig: ProviderConfig;\n networkDetails: NetworkDetails;\n networkConfigurations: Record<string, NetworkConfiguration & { id: string }>;\n};\n\nconst LOCALHOST_RPC_URL = 'http://localhost:8545';\n\nconst name = 'NetworkController';\n\nexport type EthQuery = any;\n\ntype Provider = any;\n\nexport type ProviderProxy = SwappableProxy<Provider>;\n\ntype BlockTracker = any;\n\nexport type BlockTrackerProxy = SwappableProxy<BlockTracker>;\n\nexport type NetworkControllerStateChangeEvent = {\n type: `NetworkController:stateChange`;\n payload: [NetworkState, Patch[]];\n};\n\nexport type NetworkControllerProviderConfigChangeEvent = {\n type: `NetworkController:providerConfigChange`;\n payload: [ProviderConfig];\n};\n\nexport type NetworkControllerEvents =\n | NetworkControllerStateChangeEvent\n | NetworkControllerProviderConfigChangeEvent;\n\nexport type NetworkControllerGetProviderConfigAction = {\n type: `NetworkController:getProviderConfig`;\n handler: () => ProviderConfig;\n};\n\nexport type NetworkControllerGetEthQueryAction = {\n type: `NetworkController:getEthQuery`;\n handler: () => EthQuery;\n};\n\nexport type NetworkControllerActions =\n | NetworkControllerGetProviderConfigAction\n | NetworkControllerGetEthQueryAction;\n\nexport type NetworkControllerMessenger = RestrictedControllerMessenger<\n typeof name,\n NetworkControllerGetProviderConfigAction | NetworkControllerGetEthQueryAction,\n | NetworkControllerStateChangeEvent\n | NetworkControllerProviderConfigChangeEvent,\n string,\n string\n>;\n\nexport type NetworkControllerOptions = {\n messenger: NetworkControllerMessenger;\n trackMetaMetricsEvent: () => void;\n infuraProjectId?: string;\n state?: Partial<NetworkState>;\n};\n\nexport const defaultState: NetworkState = {\n networkId: null,\n networkStatus: NetworkStatus.Unknown,\n providerConfig: {\n type: NetworkType.mainnet,\n chainId: NetworksChainId.mainnet,\n },\n networkDetails: { isEIP1559Compatible: false },\n networkConfigurations: {},\n};\n\ntype MetaMetricsEventPayload = {\n event: string;\n category: string;\n referrer?: { url: string };\n actionId?: number;\n environmentType?: string;\n properties?: unknown;\n sensitiveProperties?: unknown;\n revenue?: number;\n currency?: string;\n value?: number;\n};\n\ntype NetworkConfigurationId = string;\n\n/**\n * Controller that creates and manages an Ethereum network provider.\n */\nexport class NetworkController extends BaseControllerV2<\n typeof name,\n NetworkState,\n NetworkControllerMessenger\n> {\n #ethQuery: EthQuery;\n\n #infuraProjectId: string | undefined;\n\n #trackMetaMetricsEvent: (event: MetaMetricsEventPayload) => void;\n\n #mutex = new Mutex();\n\n #previousNetworkSpecifier: NetworkType | NetworkConfigurationId | null;\n\n #provider: Provider | undefined;\n\n #providerProxy: ProviderProxy | undefined;\n\n #blockTrackerProxy: BlockTrackerProxy | undefined;\n\n constructor({\n messenger,\n state,\n infuraProjectId,\n trackMetaMetricsEvent,\n }: NetworkControllerOptions) {\n super({\n name,\n metadata: {\n networkId: {\n persist: true,\n anonymous: false,\n },\n networkStatus: {\n persist: true,\n anonymous: false,\n },\n networkDetails: {\n persist: true,\n anonymous: false,\n },\n providerConfig: {\n persist: true,\n anonymous: false,\n },\n networkConfigurations: {\n persist: true,\n anonymous: false,\n },\n },\n messenger,\n state: { ...defaultState, ...state },\n });\n this.#infuraProjectId = infuraProjectId;\n this.#trackMetaMetricsEvent = trackMetaMetricsEvent;\n this.messagingSystem.registerActionHandler(\n `${this.name}:getProviderConfig`,\n () => {\n return this.state.providerConfig;\n },\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:getEthQuery`,\n () => {\n return this.#ethQuery;\n },\n );\n\n this.#previousNetworkSpecifier = this.state.providerConfig.type;\n }\n\n #configureProvider(\n type: NetworkType,\n rpcTarget?: string,\n chainId?: string,\n ticker?: string,\n nickname?: string,\n ) {\n switch (type) {\n case NetworkType.mainnet:\n case NetworkType.goerli:\n case NetworkType.sepolia:\n this.#setupInfuraProvider(type);\n break;\n case NetworkType.localhost:\n this.#setupStandardProvider(LOCALHOST_RPC_URL);\n break;\n case NetworkType.rpc:\n rpcTarget &&\n this.#setupStandardProvider(rpcTarget, chainId, ticker, nickname);\n break;\n default:\n throw new Error(`Unrecognized network type: '${type}'`);\n }\n }\n\n getProviderAndBlockTracker(): {\n provider: SwappableProxy<Provider> | undefined;\n blockTracker: SwappableProxy<BlockTracker> | undefined;\n } {\n return {\n provider: this.#providerProxy,\n blockTracker: this.#blockTrackerProxy,\n };\n }\n\n async #refreshNetwork() {\n this.update((state) => {\n state.networkId = null;\n state.networkStatus = NetworkStatus.Unknown;\n state.networkDetails = {};\n });\n const { rpcTarget, type, chainId, ticker } = this.state.providerConfig;\n this.#configureProvider(type, rpcTarget, chainId, ticker);\n await this.lookupNetwork();\n }\n\n #registerProvider() {\n const { provider } = this.getProviderAndBlockTracker();\n\n if (provider) {\n provider.on('error', this.#verifyNetwork.bind(this));\n this.#ethQuery = new EthQuery(provider);\n }\n }\n\n #setupInfuraProvider(type: NetworkType) {\n const infuraProvider = createInfuraProvider({\n network: type,\n projectId: this.#infuraProjectId,\n });\n const infuraSubprovider = new Subprovider(infuraProvider);\n const config = {\n dataSubprovider: infuraSubprovider,\n engineParams: {\n blockTrackerProvider: infuraProvider,\n pollingInterval: 12000,\n },\n };\n this.#updateProvider(createMetamaskProvider(config));\n }\n\n #setupStandardProvider(\n rpcTarget: string,\n chainId?: string,\n ticker?: string,\n nickname?: string,\n ) {\n const config = {\n chainId,\n engineParams: { pollingInterval: 12000 },\n nickname,\n rpcUrl: rpcTarget,\n ticker,\n };\n this.#updateProvider(createMetamaskProvider(config));\n }\n\n #updateProvider(provider: Provider) {\n this.#safelyStopProvider(this.#provider);\n this.#setProviderAndBlockTracker({\n provider,\n blockTracker: provider._blockTracker,\n });\n this.#registerProvider();\n }\n\n #safelyStopProvider(provider: Provider | undefined) {\n setTimeout(() => {\n provider?.stop();\n }, 500);\n }\n\n async #verifyNetwork() {\n if (this.state.networkStatus !== NetworkStatus.Available) {\n await this.lookupNetwork();\n }\n }\n\n /**\n * Method to inilialize the provider,\n * Creates the provider and block tracker for the configured network,\n * using the provider to gather details about the network.\n *\n */\n async initializeProvider() {\n const { type, rpcTarget, chainId, ticker, nickname } =\n this.state.providerConfig;\n this.#configureProvider(type, rpcTarget, chainId, ticker, nickname);\n this.#registerProvider();\n await this.lookupNetwork();\n }\n\n async #getNetworkId(): Promise<NetworkId> {\n const possibleNetworkId = await new Promise<string>((resolve, reject) => {\n this.#ethQuery.sendAsync(\n { method: 'net_version' },\n (error: Error, result: string) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n },\n );\n });\n\n assertNetworkId(possibleNetworkId);\n return possibleNetworkId;\n }\n\n /**\n * Performs side effects after switching to a network. If the network is\n * available, updates the network state with the network ID of the network and\n * stores whether the network supports EIP-1559; otherwise clears said\n * information about the network that may have been previously stored.\n */\n async lookupNetwork() {\n if (!this.#ethQuery) {\n return;\n }\n const releaseLock = await this.#mutex.acquire();\n\n try {\n try {\n const [networkId] = await Promise.all([\n this.#getNetworkId(),\n this.getEIP1559Compatibility(),\n ]);\n if (this.state.networkId === networkId) {\n return;\n }\n\n this.update((state) => {\n state.networkId = networkId;\n state.networkStatus = NetworkStatus.Available;\n });\n } catch (error) {\n const networkStatus =\n isErrorWithCode(error) && error.code !== errorCodes.rpc.internal\n ? NetworkStatus.Unavailable\n : NetworkStatus.Unknown;\n this.update((state) => {\n state.networkId = null;\n state.networkStatus = networkStatus;\n });\n }\n\n this.messagingSystem.publish(\n `NetworkController:providerConfigChange`,\n this.state.providerConfig,\n );\n } finally {\n releaseLock();\n }\n }\n\n /**\n * Convenience method to set the current provider config to the private providerConfig class variable.\n */\n #setCurrentAsPreviousProvider() {\n const { type, id } = this.state.providerConfig;\n if (type === NetworkType.rpc && id) {\n this.#previousNetworkSpecifier = id;\n } else {\n this.#previousNetworkSpecifier = type;\n }\n }\n\n /**\n * Convenience method to update provider network type settings.\n *\n * @param type - Human readable network name.\n */\n async setProviderType(type: NetworkType) {\n this.#setCurrentAsPreviousProvider();\n // If testnet the ticker symbol should use a testnet prefix\n const ticker =\n type in NetworksTicker && NetworksTicker[type].length > 0\n ? NetworksTicker[type]\n : 'ETH';\n\n this.update((state) => {\n state.providerConfig.type = type;\n state.providerConfig.ticker = ticker;\n state.providerConfig.chainId = NetworksChainId[type];\n state.providerConfig.rpcPrefs = BUILT_IN_NETWORKS[type].rpcPrefs;\n state.providerConfig.rpcTarget = undefined;\n state.providerConfig.nickname = undefined;\n state.providerConfig.id = undefined;\n });\n await this.#refreshNetwork();\n }\n\n /**\n * Convenience method to update provider RPC settings.\n *\n * @param networkConfigurationId - The unique id for the network configuration to set as the active provider.\n */\n async setActiveNetwork(networkConfigurationId: string) {\n this.#setCurrentAsPreviousProvider();\n\n const targetNetwork =\n this.state.networkConfigurations[networkConfigurationId];\n\n if (!targetNetwork) {\n throw new Error(\n `networkConfigurationId ${networkConfigurationId} does not match a configured networkConfiguration`,\n );\n }\n\n this.update((state) => {\n state.providerConfig.type = NetworkType.rpc;\n state.providerConfig.rpcTarget = targetNetwork.rpcUrl;\n state.providerConfig.chainId = targetNetwork.chainId;\n state.providerConfig.ticker = targetNetwork.ticker;\n state.providerConfig.nickname = targetNetwork.nickname;\n state.providerConfig.rpcPrefs = targetNetwork.rpcPrefs;\n state.providerConfig.id = targetNetwork.id;\n });\n\n await this.#refreshNetwork();\n }\n\n #getLatestBlock(): Promise<Block> {\n return new Promise((resolve, reject) => {\n this.#ethQuery.sendAsync(\n { method: 'eth_getBlockByNumber', params: ['latest', false] },\n (error: Error, block: Block) => {\n if (error) {\n reject(error);\n } else {\n resolve(block);\n }\n },\n );\n });\n }\n\n async getEIP1559Compatibility() {\n const { networkDetails = {} } = this.state;\n\n if (networkDetails.isEIP1559Compatible || !this.#ethQuery) {\n return true;\n }\n\n const latestBlock = await this.#getLatestBlock();\n const isEIP1559Compatible =\n typeof latestBlock.baseFeePerGas !== 'undefined';\n if (networkDetails.isEIP1559Compatible !== isEIP1559Compatible) {\n this.update((state) => {\n state.networkDetails.isEIP1559Compatible = isEIP1559Compatible;\n });\n }\n return isEIP1559Compatible;\n }\n\n /**\n * Re-initializes the provider and block tracker for the current network.\n */\n async resetConnection() {\n await this.#refreshNetwork();\n }\n\n #setProviderAndBlockTracker({\n provider,\n blockTracker,\n }: {\n provider: Provider;\n blockTracker: BlockTracker;\n }) {\n if (this.#providerProxy) {\n this.#providerProxy.setTarget(provider);\n } else {\n this.#providerProxy = createEventEmitterProxy(provider);\n }\n this.#provider = provider;\n\n if (this.#blockTrackerProxy) {\n this.#blockTrackerProxy.setTarget(blockTracker);\n } else {\n this.#blockTrackerProxy = createEventEmitterProxy(blockTracker, {\n eventFilter: 'skipInternal',\n });\n }\n }\n\n /**\n * Adds a network configuration if the rpcUrl is not already present on an\n * existing network configuration. Otherwise updates the entry with the matching rpcUrl.\n *\n * @param networkConfiguration - The network configuration to add or, if rpcUrl matches an existing entry, to modify.\n * @param networkConfiguration.rpcUrl - RPC provider url.\n * @param networkConfiguration.chainId - Network ID as per EIP-155.\n * @param networkConfiguration.ticker - Currency ticker.\n * @param networkConfiguration.nickname - Personalized network name.\n * @param networkConfiguration.rpcPrefs - Personalized preferences (i.e. preferred blockExplorer)\n * @param options - additional configuration options.\n * @param options.setActive - An option to set the newly added networkConfiguration as the active provider.\n * @param options.referrer - The site from which the call originated, or 'metamask' for internal calls - used for event metrics.\n * @param options.source - Where the upsertNetwork event originated (i.e. from a dapp or from the network form) - used for event metrics.\n * @returns id for the added or updated network configuration\n */\n async upsertNetworkConfiguration(\n { rpcUrl, chainId, ticker, nickname, rpcPrefs }: NetworkConfiguration,\n {\n setActive = false,\n referrer,\n source,\n }: { setActive?: boolean; referrer: string; source: string },\n ): Promise<string> {\n assertIsStrictHexString(chainId);\n\n if (!isSafeChainId(parseInt(chainId, 16))) {\n throw new Error(\n `Invalid chain ID \"${chainId}\": numerical value greater than max safe value.`,\n );\n }\n\n if (!rpcUrl) {\n throw new Error(\n 'An rpcUrl is required to add or update network configuration',\n );\n }\n\n if (!referrer || !source) {\n throw new Error(\n 'referrer and source are required arguments for adding or updating a network configuration',\n );\n }\n\n try {\n // eslint-disable-next-line no-new\n new URL(rpcUrl);\n } catch (e: any) {\n if (e.message.includes('Invalid URL')) {\n throw new Error('rpcUrl must be a valid URL');\n }\n }\n\n if (!ticker) {\n throw new Error(\n 'A ticker is required to add or update networkConfiguration',\n );\n }\n\n const newNetworkConfiguration = {\n rpcUrl,\n chainId,\n ticker,\n nickname,\n rpcPrefs,\n };\n\n const oldNetworkConfigurations = this.state.networkConfigurations;\n\n const oldNetworkConfigurationId = Object.values(\n oldNetworkConfigurations,\n ).find(\n (networkConfiguration) =>\n networkConfiguration.rpcUrl?.toLowerCase() === rpcUrl?.toLowerCase(),\n )?.id;\n\n const newNetworkConfigurationId = oldNetworkConfigurationId || random();\n this.update((state) => {\n state.networkConfigurations = {\n ...oldNetworkConfigurations,\n [newNetworkConfigurationId]: {\n ...newNetworkConfiguration,\n id: newNetworkConfigurationId,\n },\n };\n });\n\n if (!oldNetworkConfigurationId) {\n this.#trackMetaMetricsEvent({\n event: 'Custom Network Added',\n category: 'Network',\n referrer: {\n url: referrer,\n },\n properties: {\n chain_id: chainId,\n symbol: ticker,\n source,\n },\n });\n }\n\n if (setActive) {\n await this.setActiveNetwork(newNetworkConfigurationId);\n }\n\n return newNetworkConfigurationId;\n }\n\n /**\n * Removes network configuration from state.\n *\n * @param networkConfigurationId - The networkConfigurationId of an existing network configuration\n */\n removeNetworkConfiguration(networkConfigurationId: string) {\n if (!this.state.networkConfigurations[networkConfigurationId]) {\n throw new Error(\n `networkConfigurationId ${networkConfigurationId} does not match a configured networkConfiguration`,\n );\n }\n this.update((state) => {\n delete state.networkConfigurations[networkConfigurationId];\n });\n }\n\n /**\n * Rolls back provider config to the previous provider in case of errors or inability to connect during network switch.\n */\n async rollbackToPreviousProvider() {\n const specifier = this.#previousNetworkSpecifier;\n if (isNetworkType(specifier)) {\n await this.setProviderType(specifier);\n } else if (typeof specifier === 'string') {\n await this.setActiveNetwork(specifier);\n }\n }\n}\n\nexport default NetworkController;\n"]}
1
+ {"version":3,"file":"NetworkController.js","sourceRoot":"","sources":["../src/NetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';\nimport type { SwappableProxy } from '@metamask/swappable-obj-proxy';\nimport EthQuery from 'eth-query';\nimport {\n BaseControllerV2,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { v4 as random } from 'uuid';\nimport type { Patch } from 'immer';\nimport { errorCodes } from 'eth-rpc-errors';\nimport {\n BUILT_IN_NETWORKS,\n convertHexToDecimal,\n NetworksTicker,\n ChainId,\n InfuraNetworkType,\n NetworkType,\n isSafeChainId,\n} from '@metamask/controller-utils';\nimport {\n Hex,\n assertIsStrictHexString,\n hasProperty,\n isPlainObject,\n isStrictHexString,\n} from '@metamask/utils';\nimport { INFURA_BLOCKED_KEY, NetworkStatus } from './constants';\nimport { projectLogger, createModuleLogger } from './logger';\nimport {\n createNetworkClient,\n NetworkClientType,\n} from './create-network-client';\nimport type { BlockTracker, Provider } from './types';\n\nconst log = createModuleLogger(projectLogger, 'NetworkController');\n\n/**\n * @type ProviderConfig\n *\n * Configuration passed to web3-provider-engine\n * @property rpcUrl - RPC target URL.\n * @property type - Human-readable network name.\n * @property chainId - Network ID as per EIP-155.\n * @property ticker - Currency ticker.\n * @property nickname - Personalized network name.\n * @property id - Network Configuration Id.\n */\nexport type ProviderConfig = {\n rpcUrl?: string;\n type: NetworkType;\n chainId: Hex;\n ticker?: string;\n nickname?: string;\n rpcPrefs?: { blockExplorerUrl?: string };\n id?: NetworkConfigurationId;\n};\n\nexport type Block = {\n baseFeePerGas?: string;\n};\n\n/**\n * Information about the network not held by any other part of state. Currently\n * only used to capture whether a network supports EIP-1559.\n */\nexport type NetworkDetails = {\n /**\n * EIPs supported by the network.\n */\n EIPS: {\n [eipNumber: number]: boolean;\n };\n};\n\n/**\n * Custom RPC network information\n *\n * @property rpcUrl - RPC target URL.\n * @property chainId - Network ID as per EIP-155\n * @property nickname - Personalized network name.\n * @property ticker - Currency ticker.\n * @property rpcPrefs - Personalized preferences.\n */\nexport type NetworkConfiguration = {\n rpcUrl: string;\n chainId: Hex;\n ticker: string;\n nickname?: string;\n rpcPrefs?: {\n blockExplorerUrl: string;\n };\n};\n\n/**\n * Convert the given value into a valid network ID. The ID is accepted\n * as either a number, a decimal string, or a 0x-prefixed hex string.\n *\n * @param value - The network ID to convert, in an unknown format.\n * @returns A valid network ID (as a decimal string)\n * @throws If the given value cannot be safely parsed.\n */\nfunction convertNetworkId(value: unknown): NetworkId {\n if (typeof value === 'number' && !Number.isNaN(value)) {\n return `${value}`;\n } else if (isStrictHexString(value)) {\n return `${convertHexToDecimal(value)}`;\n } else if (typeof value === 'string' && /^\\d+$/u.test(value)) {\n return value as NetworkId;\n }\n throw new Error(`Cannot parse as a valid network ID: '${value}'`);\n}\n\n/**\n * Type guard for determining whether the given value is an error object with a\n * `code` property, such as an instance of Error.\n *\n * TODO: Move this to @metamask/utils.\n *\n * @param error - The object to check.\n * @returns True if `error` has a `code`, false otherwise.\n */\nfunction isErrorWithCode(error: unknown): error is { code: string | number } {\n return typeof error === 'object' && error !== null && 'code' in error;\n}\n\n/**\n * Returns whether the given argument is a type that our Infura middleware\n * recognizes.\n *\n * @param type - A type to compare.\n * @returns True or false, depending on whether the given type is one that our\n * Infura middleware recognizes.\n */\nfunction isInfuraProviderType(type: string): type is InfuraNetworkType {\n return Object.keys(InfuraNetworkType).includes(type);\n}\n\n/**\n * The network ID of a network.\n */\nexport type NetworkId = `${number}`;\n\n/**\n * @type NetworkState\n *\n * Network controller state\n * @property network - Network ID as per net_version of the currently connected network\n * @property providerConfig - RPC URL and network name provider settings of the currently connected network\n * @property properties - an additional set of network properties for the currently connected network\n * @property networkConfigurations - the full list of configured networks either preloaded or added by the user.\n */\nexport type NetworkState = {\n networkId: NetworkId | null;\n networkStatus: NetworkStatus;\n providerConfig: ProviderConfig;\n networkDetails: NetworkDetails;\n networkConfigurations: Record<string, NetworkConfiguration & { id: string }>;\n};\n\nconst name = 'NetworkController';\n\nexport type BlockTrackerProxy = SwappableProxy<BlockTracker>;\n\nexport type ProviderProxy = SwappableProxy<Provider>;\n\nexport type NetworkControllerStateChangeEvent = {\n type: `NetworkController:stateChange`;\n payload: [NetworkState, Patch[]];\n};\n\n/**\n * `networkWillChange` is published when the current network is about to be\n * switched, but the new provider has not been created and no state changes have\n * occurred yet.\n */\nexport type NetworkControllerNetworkWillChangeEvent = {\n type: 'NetworkController:networkWillChange';\n payload: [];\n};\n\n/**\n * `networkDidChange` is published after a provider has been created for a newly\n * switched network (but before the network has been confirmed to be available).\n */\nexport type NetworkControllerNetworkDidChangeEvent = {\n type: 'NetworkController:networkDidChange';\n payload: [];\n};\n\n/**\n * `infuraIsBlocked` is published after the network is switched to an Infura\n * network, but when Infura returns an error blocking the user based on their\n * location.\n */\nexport type NetworkControllerInfuraIsBlockedEvent = {\n type: 'NetworkController:infuraIsBlocked';\n payload: [];\n};\n\n/**\n * `infuraIsBlocked` is published either after the network is switched to an\n * Infura network and Infura does not return an error blocking the user based on\n * their location, or the network is switched to a non-Infura network.\n */\nexport type NetworkControllerInfuraIsUnblockedEvent = {\n type: 'NetworkController:infuraIsUnblocked';\n payload: [];\n};\n\nexport type NetworkControllerEvents =\n | NetworkControllerStateChangeEvent\n | NetworkControllerNetworkWillChangeEvent\n | NetworkControllerNetworkDidChangeEvent\n | NetworkControllerInfuraIsBlockedEvent\n | NetworkControllerInfuraIsUnblockedEvent;\n\nexport type NetworkControllerGetStateAction = {\n type: `NetworkController:getState`;\n handler: () => NetworkState;\n};\n\nexport type NetworkControllerGetProviderConfigAction = {\n type: `NetworkController:getProviderConfig`;\n handler: () => ProviderConfig;\n};\n\nexport type NetworkControllerGetEthQueryAction = {\n type: `NetworkController:getEthQuery`;\n handler: () => EthQuery | undefined;\n};\n\nexport type NetworkControllerActions =\n | NetworkControllerGetStateAction\n | NetworkControllerGetProviderConfigAction\n | NetworkControllerGetEthQueryAction;\n\nexport type NetworkControllerMessenger = RestrictedControllerMessenger<\n typeof name,\n NetworkControllerActions,\n NetworkControllerEvents,\n string,\n string\n>;\n\nexport type NetworkControllerOptions = {\n messenger: NetworkControllerMessenger;\n trackMetaMetricsEvent: () => void;\n infuraProjectId: string;\n state?: Partial<NetworkState>;\n};\n\nexport const defaultState: NetworkState = {\n networkId: null,\n networkStatus: NetworkStatus.Unknown,\n providerConfig: {\n type: NetworkType.mainnet,\n chainId: ChainId.mainnet,\n },\n networkDetails: {\n EIPS: {},\n },\n networkConfigurations: {},\n};\n\ntype MetaMetricsEventPayload = {\n event: string;\n category: string;\n referrer?: { url: string };\n actionId?: number;\n environmentType?: string;\n properties?: unknown;\n sensitiveProperties?: unknown;\n revenue?: number;\n currency?: string;\n value?: number;\n};\n\ntype NetworkConfigurationId = string;\n\n/**\n * Controller that creates and manages an Ethereum network provider.\n */\nexport class NetworkController extends BaseControllerV2<\n typeof name,\n NetworkState,\n NetworkControllerMessenger\n> {\n #ethQuery?: EthQuery;\n\n #infuraProjectId: string;\n\n #trackMetaMetricsEvent: (event: MetaMetricsEventPayload) => void;\n\n #previousProviderConfig: ProviderConfig;\n\n #providerProxy: ProviderProxy | undefined;\n\n #blockTrackerProxy: BlockTrackerProxy | undefined;\n\n constructor({\n messenger,\n state,\n infuraProjectId,\n trackMetaMetricsEvent,\n }: NetworkControllerOptions) {\n super({\n name,\n metadata: {\n networkId: {\n persist: true,\n anonymous: false,\n },\n networkStatus: {\n persist: true,\n anonymous: false,\n },\n networkDetails: {\n persist: true,\n anonymous: false,\n },\n providerConfig: {\n persist: true,\n anonymous: false,\n },\n networkConfigurations: {\n persist: true,\n anonymous: false,\n },\n },\n messenger,\n state: { ...defaultState, ...state },\n });\n if (!infuraProjectId || typeof infuraProjectId !== 'string') {\n throw new Error('Invalid Infura project ID');\n }\n this.#infuraProjectId = infuraProjectId;\n this.#trackMetaMetricsEvent = trackMetaMetricsEvent;\n this.messagingSystem.registerActionHandler(\n `${this.name}:getProviderConfig`,\n () => {\n return this.state.providerConfig;\n },\n );\n\n this.messagingSystem.registerActionHandler(\n `${this.name}:getEthQuery`,\n () => {\n return this.#ethQuery;\n },\n );\n\n this.#previousProviderConfig = this.state.providerConfig;\n }\n\n #configureProvider(\n type: NetworkType,\n rpcUrl: string | undefined,\n chainId: Hex | undefined,\n ) {\n switch (type) {\n case NetworkType.mainnet:\n case NetworkType.goerli:\n case NetworkType.sepolia:\n this.#setupInfuraProvider(type);\n break;\n case NetworkType.rpc:\n if (chainId === undefined) {\n throw new Error('chainId must be provided for custom RPC endpoints');\n }\n\n if (rpcUrl === undefined) {\n throw new Error('rpcUrl must be provided for custom RPC endpoints');\n }\n this.#setupStandardProvider(rpcUrl, chainId);\n break;\n default:\n throw new Error(`Unrecognized network type: '${type}'`);\n }\n }\n\n getProviderAndBlockTracker(): {\n provider: SwappableProxy<Provider> | undefined;\n blockTracker: SwappableProxy<BlockTracker> | undefined;\n } {\n return {\n provider: this.#providerProxy,\n blockTracker: this.#blockTrackerProxy,\n };\n }\n\n async #refreshNetwork() {\n this.messagingSystem.publish('NetworkController:networkWillChange');\n this.update((state) => {\n state.networkId = null;\n state.networkStatus = NetworkStatus.Unknown;\n state.networkDetails = {\n EIPS: {},\n };\n });\n const { rpcUrl, type, chainId } = this.state.providerConfig;\n this.#configureProvider(type, rpcUrl, chainId);\n this.messagingSystem.publish('NetworkController:networkDidChange');\n await this.lookupNetwork();\n }\n\n #registerProvider() {\n const { provider } = this.getProviderAndBlockTracker();\n\n if (provider) {\n this.#ethQuery = new EthQuery(provider);\n }\n }\n\n #setupInfuraProvider(type: InfuraNetworkType) {\n const { provider, blockTracker } = createNetworkClient({\n network: type,\n infuraProjectId: this.#infuraProjectId,\n type: NetworkClientType.Infura,\n });\n\n this.#updateProvider(provider, blockTracker);\n }\n\n #setupStandardProvider(rpcUrl: string, chainId: Hex) {\n const { provider, blockTracker } = createNetworkClient({\n chainId,\n rpcUrl,\n type: NetworkClientType.Custom,\n });\n\n this.#updateProvider(provider, blockTracker);\n }\n\n #updateProvider(provider: Provider, blockTracker: BlockTracker) {\n this.#setProviderAndBlockTracker({\n provider,\n blockTracker,\n });\n this.#registerProvider();\n }\n\n /**\n * Method to inilialize the provider,\n * Creates the provider and block tracker for the configured network,\n * using the provider to gather details about the network.\n *\n */\n async initializeProvider() {\n const { type, rpcUrl, chainId } = this.state.providerConfig;\n this.#configureProvider(type, rpcUrl, chainId);\n this.#registerProvider();\n await this.lookupNetwork();\n }\n\n async #getNetworkId(): Promise<NetworkId> {\n const possibleNetworkId = await new Promise<string>((resolve, reject) => {\n if (!this.#ethQuery) {\n throw new Error('Provider has not been initialized');\n }\n this.#ethQuery.sendAsync(\n { method: 'net_version' },\n (error: unknown, result?: unknown) => {\n if (error) {\n reject(error);\n } else {\n // TODO: Validate this type\n resolve(result as string);\n }\n },\n );\n });\n\n return convertNetworkId(possibleNetworkId);\n }\n\n /**\n * Performs side effects after switching to a network. If the network is\n * available, updates the network state with the network ID of the network and\n * stores whether the network supports EIP-1559; otherwise clears said\n * information about the network that may have been previously stored.\n *\n * @fires infuraIsBlocked if the network is Infura-supported and is blocking\n * requests.\n * @fires infuraIsUnblocked if the network is Infura-supported and is not\n * blocking requests, or if the network is not Infura-supported.\n */\n async lookupNetwork() {\n if (!this.#ethQuery) {\n return;\n }\n const isInfura = isInfuraProviderType(this.state.providerConfig.type);\n\n let networkChanged = false;\n const listener = () => {\n networkChanged = true;\n this.messagingSystem.unsubscribe(\n 'NetworkController:networkDidChange',\n listener,\n );\n };\n this.messagingSystem.subscribe(\n 'NetworkController:networkDidChange',\n listener,\n );\n\n let updatedNetworkStatus: NetworkStatus;\n let updatedNetworkId: NetworkId | null = null;\n let updatedIsEIP1559Compatible: boolean | undefined;\n\n try {\n const [networkId, isEIP1559Compatible] = await Promise.all([\n this.#getNetworkId(),\n this.#determineEIP1559Compatibility(),\n ]);\n updatedNetworkStatus = NetworkStatus.Available;\n updatedNetworkId = networkId;\n updatedIsEIP1559Compatible = isEIP1559Compatible;\n } catch (error) {\n if (isErrorWithCode(error)) {\n let responseBody;\n if (\n isInfura &&\n hasProperty(error, 'message') &&\n typeof error.message === 'string'\n ) {\n try {\n responseBody = JSON.parse(error.message);\n } catch {\n // error.message must not be JSON\n }\n }\n\n if (\n isPlainObject(responseBody) &&\n responseBody.error === INFURA_BLOCKED_KEY\n ) {\n updatedNetworkStatus = NetworkStatus.Blocked;\n } else if (error.code === errorCodes.rpc.internal) {\n updatedNetworkStatus = NetworkStatus.Unknown;\n } else {\n updatedNetworkStatus = NetworkStatus.Unavailable;\n }\n } else {\n log('NetworkController - could not determine network status', error);\n updatedNetworkStatus = NetworkStatus.Unknown;\n }\n }\n\n if (networkChanged) {\n // If the network has changed, then `lookupNetwork` either has been or is\n // in the process of being called, so we don't need to go further.\n return;\n }\n this.messagingSystem.unsubscribe(\n 'NetworkController:networkDidChange',\n listener,\n );\n\n this.update((state) => {\n state.networkId = updatedNetworkId;\n state.networkStatus = updatedNetworkStatus;\n if (updatedIsEIP1559Compatible === undefined) {\n delete state.networkDetails.EIPS[1559];\n } else {\n state.networkDetails.EIPS[1559] = updatedIsEIP1559Compatible;\n }\n });\n\n if (isInfura) {\n if (updatedNetworkStatus === NetworkStatus.Available) {\n this.messagingSystem.publish('NetworkController:infuraIsUnblocked');\n } else if (updatedNetworkStatus === NetworkStatus.Blocked) {\n this.messagingSystem.publish('NetworkController:infuraIsBlocked');\n }\n } else {\n // Always publish infuraIsUnblocked regardless of network status to\n // prevent consumers from being stuck in a blocked state if they were\n // previously connected to an Infura network that was blocked\n this.messagingSystem.publish('NetworkController:infuraIsUnblocked');\n }\n }\n\n /**\n * Convenience method to update provider network type settings.\n *\n * @param type - Human readable network name.\n */\n async setProviderType(type: InfuraNetworkType) {\n this.#previousProviderConfig = this.state.providerConfig;\n\n // If testnet the ticker symbol should use a testnet prefix\n const ticker =\n type in NetworksTicker && NetworksTicker[type].length > 0\n ? NetworksTicker[type]\n : 'ETH';\n\n this.update((state) => {\n state.providerConfig.type = type;\n state.providerConfig.ticker = ticker;\n state.providerConfig.chainId = ChainId[type];\n state.providerConfig.rpcPrefs = BUILT_IN_NETWORKS[type].rpcPrefs;\n state.providerConfig.rpcUrl = undefined;\n state.providerConfig.nickname = undefined;\n state.providerConfig.id = undefined;\n });\n await this.#refreshNetwork();\n }\n\n /**\n * Convenience method to update provider RPC settings.\n *\n * @param networkConfigurationId - The unique id for the network configuration to set as the active provider.\n */\n async setActiveNetwork(networkConfigurationId: string) {\n this.#previousProviderConfig = this.state.providerConfig;\n\n const targetNetwork =\n this.state.networkConfigurations[networkConfigurationId];\n\n if (!targetNetwork) {\n throw new Error(\n `networkConfigurationId ${networkConfigurationId} does not match a configured networkConfiguration`,\n );\n }\n\n this.update((state) => {\n state.providerConfig.type = NetworkType.rpc;\n state.providerConfig.rpcUrl = targetNetwork.rpcUrl;\n state.providerConfig.chainId = targetNetwork.chainId;\n state.providerConfig.ticker = targetNetwork.ticker;\n state.providerConfig.nickname = targetNetwork.nickname;\n state.providerConfig.rpcPrefs = targetNetwork.rpcPrefs;\n state.providerConfig.id = targetNetwork.id;\n });\n\n await this.#refreshNetwork();\n }\n\n #getLatestBlock(): Promise<Block> {\n return new Promise((resolve, reject) => {\n if (!this.#ethQuery) {\n throw new Error('Provider has not been initialized');\n }\n this.#ethQuery.sendAsync(\n { method: 'eth_getBlockByNumber', params: ['latest', false] },\n (error: unknown, block?: unknown) => {\n if (error) {\n reject(error);\n } else {\n // TODO: Validate this type\n resolve(block as Block);\n }\n },\n );\n });\n }\n\n /**\n * Determines whether the network supports EIP-1559 by checking whether the\n * latest block has a `baseFeePerGas` property, then updates state\n * appropriately.\n *\n * @returns A promise that resolves to true if the network supports EIP-1559\n * and false otherwise.\n */\n async getEIP1559Compatibility() {\n const { EIPS } = this.state.networkDetails;\n\n if (EIPS[1559] !== undefined) {\n return EIPS[1559];\n }\n\n if (!this.#ethQuery) {\n return false;\n }\n\n const isEIP1559Compatible = await this.#determineEIP1559Compatibility();\n this.update((state) => {\n state.networkDetails.EIPS[1559] = isEIP1559Compatible;\n });\n return isEIP1559Compatible;\n }\n\n /**\n * Retrieves the latest block from the currently selected network; if the\n * block has a `baseFeePerGas` property, then we know that the network\n * supports EIP-1559; otherwise it doesn't.\n *\n * @returns A promise that resolves to true if the network supports EIP-1559\n * and false otherwise.\n */\n async #determineEIP1559Compatibility(): Promise<boolean> {\n const latestBlock = await this.#getLatestBlock();\n return latestBlock?.baseFeePerGas !== undefined;\n }\n\n /**\n * Re-initializes the provider and block tracker for the current network.\n */\n async resetConnection() {\n await this.#refreshNetwork();\n }\n\n #setProviderAndBlockTracker({\n provider,\n blockTracker,\n }: {\n provider: Provider;\n blockTracker: BlockTracker;\n }) {\n if (this.#providerProxy) {\n this.#providerProxy.setTarget(provider);\n } else {\n this.#providerProxy = createEventEmitterProxy(provider);\n }\n\n if (this.#blockTrackerProxy) {\n this.#blockTrackerProxy.setTarget(blockTracker);\n } else {\n this.#blockTrackerProxy = createEventEmitterProxy(blockTracker, {\n eventFilter: 'skipInternal',\n });\n }\n }\n\n /**\n * Adds a network configuration if the rpcUrl is not already present on an\n * existing network configuration. Otherwise updates the entry with the matching rpcUrl.\n *\n * @param networkConfiguration - The network configuration to add or, if rpcUrl matches an existing entry, to modify.\n * @param networkConfiguration.rpcUrl - RPC provider url.\n * @param networkConfiguration.chainId - Network ID as per EIP-155.\n * @param networkConfiguration.ticker - Currency ticker.\n * @param networkConfiguration.nickname - Personalized network name.\n * @param networkConfiguration.rpcPrefs - Personalized preferences (i.e. preferred blockExplorer)\n * @param options - additional configuration options.\n * @param options.setActive - An option to set the newly added networkConfiguration as the active provider.\n * @param options.referrer - The site from which the call originated, or 'metamask' for internal calls - used for event metrics.\n * @param options.source - Where the upsertNetwork event originated (i.e. from a dapp or from the network form) - used for event metrics.\n * @returns id for the added or updated network configuration\n */\n async upsertNetworkConfiguration(\n { rpcUrl, chainId, ticker, nickname, rpcPrefs }: NetworkConfiguration,\n {\n setActive = false,\n referrer,\n source,\n }: { setActive?: boolean; referrer: string; source: string },\n ): Promise<string> {\n assertIsStrictHexString(chainId);\n\n if (!isSafeChainId(chainId)) {\n throw new Error(\n `Invalid chain ID \"${chainId}\": numerical value greater than max safe value.`,\n );\n }\n\n if (!rpcUrl) {\n throw new Error(\n 'An rpcUrl is required to add or update network configuration',\n );\n }\n\n if (!referrer || !source) {\n throw new Error(\n 'referrer and source are required arguments for adding or updating a network configuration',\n );\n }\n\n try {\n new URL(rpcUrl);\n } catch (e: any) {\n if (e.message.includes('Invalid URL')) {\n throw new Error('rpcUrl must be a valid URL');\n }\n }\n\n if (!ticker) {\n throw new Error(\n 'A ticker is required to add or update networkConfiguration',\n );\n }\n\n const newNetworkConfiguration = {\n rpcUrl,\n chainId,\n ticker,\n nickname,\n rpcPrefs,\n };\n\n const oldNetworkConfigurations = this.state.networkConfigurations;\n\n const oldNetworkConfigurationId = Object.values(\n oldNetworkConfigurations,\n ).find(\n (networkConfiguration) =>\n networkConfiguration.rpcUrl?.toLowerCase() === rpcUrl?.toLowerCase(),\n )?.id;\n\n const newNetworkConfigurationId = oldNetworkConfigurationId || random();\n this.update((state) => {\n state.networkConfigurations = {\n ...oldNetworkConfigurations,\n [newNetworkConfigurationId]: {\n ...newNetworkConfiguration,\n id: newNetworkConfigurationId,\n },\n };\n });\n\n if (!oldNetworkConfigurationId) {\n this.#trackMetaMetricsEvent({\n event: 'Custom Network Added',\n category: 'Network',\n referrer: {\n url: referrer,\n },\n properties: {\n chain_id: chainId,\n symbol: ticker,\n source,\n },\n });\n }\n\n if (setActive) {\n await this.setActiveNetwork(newNetworkConfigurationId);\n }\n\n return newNetworkConfigurationId;\n }\n\n /**\n * Removes network configuration from state.\n *\n * @param networkConfigurationId - The networkConfigurationId of an existing network configuration\n */\n removeNetworkConfiguration(networkConfigurationId: string) {\n if (!this.state.networkConfigurations[networkConfigurationId]) {\n throw new Error(\n `networkConfigurationId ${networkConfigurationId} does not match a configured networkConfiguration`,\n );\n }\n this.update((state) => {\n delete state.networkConfigurations[networkConfigurationId];\n });\n }\n\n /**\n * Switches to the previous network, assuming that the current network is\n * different than the initial network (if it is, then this is equivalent to\n * calling `resetConnection`).\n */\n async rollbackToPreviousProvider() {\n this.update((state) => {\n state.providerConfig = this.#previousProviderConfig;\n });\n await this.#refreshNetwork();\n }\n\n /**\n * Deactivates the controller, stopping any ongoing polling.\n *\n * In-progress requests will not be aborted.\n */\n async destroy() {\n await this.#blockTrackerProxy?.destroy();\n }\n}\n\nexport default NetworkController;\n"]}
@@ -16,6 +16,13 @@ export declare enum NetworkStatus {
16
16
  * The network was unable to receive and respond to requests for unknown
17
17
  * reasons.
18
18
  */
19
- Unavailable = "unavailable"
19
+ Unavailable = "unavailable",
20
+ /**
21
+ * The network is not only unavailable, but is also inaccessible for the user
22
+ * specifically based on their location. This state only applies to Infura
23
+ * networks.
24
+ */
25
+ Blocked = "blocked"
20
26
  }
27
+ export declare const INFURA_BLOCKED_KEY = "countryBlocked";
21
28
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,aAAa;IACvB;;;;OAIG;IACH,OAAO,YAAY;IACnB;;OAEG;IACH,SAAS,cAAc;IACvB;;;OAGG;IACH,WAAW,gBAAgB;CAC5B"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,aAAa;IACvB;;;;OAIG;IACH,OAAO,YAAY;IACnB;;OAEG;IACH,SAAS,cAAc;IACvB;;;OAGG;IACH,WAAW,gBAAgB;IAC3B;;;;OAIG;IACH,OAAO,YAAY;CACpB;AAED,eAAO,MAAM,kBAAkB,mBAAmB,CAAC"}
package/dist/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NetworkStatus = void 0;
3
+ exports.INFURA_BLOCKED_KEY = exports.NetworkStatus = void 0;
4
4
  /**
5
5
  * Represents the availability state of the currently selected network.
6
6
  */
@@ -21,5 +21,12 @@ var NetworkStatus;
21
21
  * reasons.
22
22
  */
23
23
  NetworkStatus["Unavailable"] = "unavailable";
24
+ /**
25
+ * The network is not only unavailable, but is also inaccessible for the user
26
+ * specifically based on their location. This state only applies to Infura
27
+ * networks.
28
+ */
29
+ NetworkStatus["Blocked"] = "blocked";
24
30
  })(NetworkStatus = exports.NetworkStatus || (exports.NetworkStatus = {}));
31
+ exports.INFURA_BLOCKED_KEY = 'countryBlocked';
25
32
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,IAAY,aAgBX;AAhBD,WAAY,aAAa;IACvB;;;;OAIG;IACH,oCAAmB,CAAA;IACnB;;OAEG;IACH,wCAAuB,CAAA;IACvB;;;OAGG;IACH,4CAA2B,CAAA;AAC7B,CAAC,EAhBW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAgBxB","sourcesContent":["/**\n * Represents the availability state of the currently selected network.\n */\nexport enum NetworkStatus {\n /**\n * The network may or may not be able to receive requests, but either no\n * attempt has been made to determine this, or an attempt was made but was\n * unsuccessful.\n */\n Unknown = 'unknown',\n /**\n * The network is able to receive and respond to requests.\n */\n Available = 'available',\n /**\n * The network was unable to receive and respond to requests for unknown\n * reasons.\n */\n Unavailable = 'unavailable',\n}\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,IAAY,aAsBX;AAtBD,WAAY,aAAa;IACvB;;;;OAIG;IACH,oCAAmB,CAAA;IACnB;;OAEG;IACH,wCAAuB,CAAA;IACvB;;;OAGG;IACH,4CAA2B,CAAA;IAC3B;;;;OAIG;IACH,oCAAmB,CAAA;AACrB,CAAC,EAtBW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAsBxB;AAEY,QAAA,kBAAkB,GAAG,gBAAgB,CAAC","sourcesContent":["/**\n * Represents the availability state of the currently selected network.\n */\nexport enum NetworkStatus {\n /**\n * The network may or may not be able to receive requests, but either no\n * attempt has been made to determine this, or an attempt was made but was\n * unsuccessful.\n */\n Unknown = 'unknown',\n /**\n * The network is able to receive and respond to requests.\n */\n Available = 'available',\n /**\n * The network was unable to receive and respond to requests for unknown\n * reasons.\n */\n Unavailable = 'unavailable',\n /**\n * The network is not only unavailable, but is also inaccessible for the user\n * specifically based on their location. This state only applies to Infura\n * networks.\n */\n Blocked = 'blocked',\n}\n\nexport const INFURA_BLOCKED_KEY = 'countryBlocked';\n"]}
@@ -0,0 +1,40 @@
1
+ import type { Hex } from '@metamask/utils';
2
+ import { InfuraNetworkType } from '@metamask/controller-utils';
3
+ import type { BlockTracker, Provider } from './types';
4
+ /**
5
+ * The type of network client that can be created.
6
+ */
7
+ export declare enum NetworkClientType {
8
+ Custom = "custom",
9
+ Infura = "infura"
10
+ }
11
+ /**
12
+ * A configuration object that can be used to create a provider engine for a
13
+ * custom network.
14
+ */
15
+ declare type CustomNetworkConfiguration = {
16
+ chainId: Hex;
17
+ rpcUrl: string;
18
+ type: NetworkClientType.Custom;
19
+ };
20
+ /**
21
+ * A configuration object that can be used to create a provider engine for an
22
+ * Infura network.
23
+ */
24
+ declare type InfuraNetworkConfiguration = {
25
+ network: InfuraNetworkType;
26
+ infuraProjectId: string;
27
+ type: NetworkClientType.Infura;
28
+ };
29
+ /**
30
+ * Create a JSON RPC network client for a specific network.
31
+ *
32
+ * @param networkConfig - The network configuration.
33
+ * @returns The network client.
34
+ */
35
+ export declare function createNetworkClient(networkConfig: CustomNetworkConfiguration | InfuraNetworkConfiguration): {
36
+ provider: Provider;
37
+ blockTracker: BlockTracker;
38
+ };
39
+ export {};
40
+ //# sourceMappingURL=create-network-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-network-client.d.ts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EACL,iBAAiB,EAGlB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAItD;;GAEG;AACH,oBAAY,iBAAiB;IAC3B,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAED;;;GAGG;AACH,aAAK,0BAA0B,GAAG;IAChC,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC;CAChC,CAAC;AAEF;;;GAGG;AACH,aAAK,0BAA0B,GAAG;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC;CAChC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,0BAA0B,GAAG,0BAA0B,GACrE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,YAAY,CAAA;CAAE,CAgDpD"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createNetworkClient = exports.NetworkClientType = void 0;
13
+ const json_rpc_engine_1 = require("json-rpc-engine");
14
+ const eth_json_rpc_middleware_1 = require("@metamask/eth-json-rpc-middleware");
15
+ const eth_json_rpc_provider_1 = require("@metamask/eth-json-rpc-provider");
16
+ const eth_json_rpc_infura_1 = require("@metamask/eth-json-rpc-infura");
17
+ const eth_block_tracker_1 = require("eth-block-tracker");
18
+ const controller_utils_1 = require("@metamask/controller-utils");
19
+ const SECOND = 1000;
20
+ /**
21
+ * The type of network client that can be created.
22
+ */
23
+ var NetworkClientType;
24
+ (function (NetworkClientType) {
25
+ NetworkClientType["Custom"] = "custom";
26
+ NetworkClientType["Infura"] = "infura";
27
+ })(NetworkClientType = exports.NetworkClientType || (exports.NetworkClientType = {}));
28
+ /**
29
+ * Create a JSON RPC network client for a specific network.
30
+ *
31
+ * @param networkConfig - The network configuration.
32
+ * @returns The network client.
33
+ */
34
+ function createNetworkClient(networkConfig) {
35
+ const rpcApiMiddleware = networkConfig.type === NetworkClientType.Infura
36
+ ? (0, eth_json_rpc_infura_1.createInfuraMiddleware)({
37
+ network: networkConfig.network,
38
+ projectId: networkConfig.infuraProjectId,
39
+ maxAttempts: 5,
40
+ source: 'metamask',
41
+ })
42
+ : (0, eth_json_rpc_middleware_1.createFetchMiddleware)({
43
+ btoa: global.btoa,
44
+ fetch: global.fetch,
45
+ rpcUrl: networkConfig.rpcUrl,
46
+ });
47
+ const rpcProvider = (0, eth_json_rpc_provider_1.providerFromMiddleware)(rpcApiMiddleware);
48
+ const blockTrackerOpts =
49
+ // eslint-disable-next-line node/no-process-env
50
+ process.env.IN_TEST && networkConfig.type === 'custom'
51
+ ? { pollingInterval: SECOND }
52
+ : {};
53
+ const blockTracker = new eth_block_tracker_1.PollingBlockTracker(Object.assign(Object.assign({}, blockTrackerOpts), { provider: rpcProvider }));
54
+ const networkMiddleware = networkConfig.type === NetworkClientType.Infura
55
+ ? createInfuraNetworkMiddleware({
56
+ blockTracker,
57
+ network: networkConfig.network,
58
+ rpcProvider,
59
+ rpcApiMiddleware,
60
+ })
61
+ : createCustomNetworkMiddleware({
62
+ blockTracker,
63
+ chainId: networkConfig.chainId,
64
+ rpcApiMiddleware,
65
+ });
66
+ const engine = new json_rpc_engine_1.JsonRpcEngine();
67
+ engine.push(networkMiddleware);
68
+ const provider = (0, eth_json_rpc_provider_1.providerFromEngine)(engine);
69
+ return { provider, blockTracker };
70
+ }
71
+ exports.createNetworkClient = createNetworkClient;
72
+ /**
73
+ * Create middleware for infura.
74
+ *
75
+ * @param args - The arguments.
76
+ * @param args.blockTracker - The block tracker to use.
77
+ * @param args.network - The Infura network to use.
78
+ * @param args.rpcProvider - The RPC provider to use.
79
+ * @param args.rpcApiMiddleware - Additional middleware.
80
+ * @returns The collection of middleware that makes up the Infura client.
81
+ */
82
+ function createInfuraNetworkMiddleware({ blockTracker, network, rpcProvider, rpcApiMiddleware, }) {
83
+ return (0, json_rpc_engine_1.mergeMiddleware)([
84
+ createNetworkAndChainIdMiddleware({ network }),
85
+ (0, eth_json_rpc_middleware_1.createBlockCacheMiddleware)({ blockTracker }),
86
+ (0, eth_json_rpc_middleware_1.createInflightCacheMiddleware)(),
87
+ (0, eth_json_rpc_middleware_1.createBlockRefMiddleware)({ blockTracker, provider: rpcProvider }),
88
+ (0, eth_json_rpc_middleware_1.createRetryOnEmptyMiddleware)({ blockTracker, provider: rpcProvider }),
89
+ (0, eth_json_rpc_middleware_1.createBlockTrackerInspectorMiddleware)({ blockTracker }),
90
+ rpcApiMiddleware,
91
+ ]);
92
+ }
93
+ /**
94
+ * Creates static method middleware.
95
+ *
96
+ * @param args - The Arguments.
97
+ * @param args.network - The Infura network to use.
98
+ * @returns The middleware that implements eth_chainId & net_version methods.
99
+ */
100
+ function createNetworkAndChainIdMiddleware({ network, }) {
101
+ return (0, json_rpc_engine_1.createScaffoldMiddleware)({
102
+ eth_chainId: controller_utils_1.ChainId[network],
103
+ net_version: controller_utils_1.NetworkId[network],
104
+ });
105
+ }
106
+ const createChainIdMiddleware = (chainId) => {
107
+ return (req, res, next, end) => {
108
+ if (req.method === 'eth_chainId') {
109
+ res.result = chainId;
110
+ return end();
111
+ }
112
+ return next();
113
+ };
114
+ };
115
+ /**
116
+ * Creates custom middleware.
117
+ *
118
+ * @param args - The arguments.
119
+ * @param args.blockTracker - The block tracker to use.
120
+ * @param args.chainId - The chain id to use.
121
+ * @param args.rpcApiMiddleware - Additional middleware.
122
+ * @returns The collection of middleware that makes up the Infura client.
123
+ */
124
+ function createCustomNetworkMiddleware({ blockTracker, chainId, rpcApiMiddleware, }) {
125
+ // eslint-disable-next-line node/no-process-env
126
+ const testMiddlewares = process.env.IN_TEST
127
+ ? [createEstimateGasDelayTestMiddleware()]
128
+ : [];
129
+ return (0, json_rpc_engine_1.mergeMiddleware)([
130
+ ...testMiddlewares,
131
+ createChainIdMiddleware(chainId),
132
+ (0, eth_json_rpc_middleware_1.createBlockRefRewriteMiddleware)({ blockTracker }),
133
+ (0, eth_json_rpc_middleware_1.createBlockCacheMiddleware)({ blockTracker }),
134
+ (0, eth_json_rpc_middleware_1.createInflightCacheMiddleware)(),
135
+ (0, eth_json_rpc_middleware_1.createBlockTrackerInspectorMiddleware)({ blockTracker }),
136
+ rpcApiMiddleware,
137
+ ]);
138
+ }
139
+ /**
140
+ * For use in tests only.
141
+ * Adds a delay to `eth_estimateGas` calls.
142
+ *
143
+ * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.
144
+ */
145
+ function createEstimateGasDelayTestMiddleware() {
146
+ return (0, json_rpc_engine_1.createAsyncMiddleware)((req, _, next) => __awaiter(this, void 0, void 0, function* () {
147
+ if (req.method === 'eth_estimateGas') {
148
+ yield new Promise((resolve) => setTimeout(resolve, SECOND * 2));
149
+ }
150
+ return next();
151
+ }));
152
+ }
153
+ //# sourceMappingURL=create-network-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-network-client.js","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createAsyncMiddleware,\n createScaffoldMiddleware,\n JsonRpcEngine,\n mergeMiddleware,\n JsonRpcMiddleware,\n} from 'json-rpc-engine';\nimport {\n createBlockCacheMiddleware,\n createBlockRefMiddleware,\n createBlockRefRewriteMiddleware,\n createBlockTrackerInspectorMiddleware,\n createInflightCacheMiddleware,\n createFetchMiddleware,\n createRetryOnEmptyMiddleware,\n} from '@metamask/eth-json-rpc-middleware';\nimport {\n providerFromEngine,\n providerFromMiddleware,\n SafeEventEmitterProvider,\n} from '@metamask/eth-json-rpc-provider';\nimport { createInfuraMiddleware } from '@metamask/eth-json-rpc-infura';\nimport type { Hex } from '@metamask/utils';\nimport { PollingBlockTracker } from 'eth-block-tracker';\nimport {\n InfuraNetworkType,\n ChainId,\n NetworkId,\n} from '@metamask/controller-utils';\nimport type { BlockTracker, Provider } from './types';\n\nconst SECOND = 1000;\n\n/**\n * The type of network client that can be created.\n */\nexport enum NetworkClientType {\n Custom = 'custom',\n Infura = 'infura',\n}\n\n/**\n * A configuration object that can be used to create a provider engine for a\n * custom network.\n */\ntype CustomNetworkConfiguration = {\n chainId: Hex;\n rpcUrl: string;\n type: NetworkClientType.Custom;\n};\n\n/**\n * A configuration object that can be used to create a provider engine for an\n * Infura network.\n */\ntype InfuraNetworkConfiguration = {\n network: InfuraNetworkType;\n infuraProjectId: string;\n type: NetworkClientType.Infura;\n};\n\n/**\n * Create a JSON RPC network client for a specific network.\n *\n * @param networkConfig - The network configuration.\n * @returns The network client.\n */\nexport function createNetworkClient(\n networkConfig: CustomNetworkConfiguration | InfuraNetworkConfiguration,\n): { provider: Provider; blockTracker: BlockTracker } {\n const rpcApiMiddleware =\n networkConfig.type === NetworkClientType.Infura\n ? createInfuraMiddleware({\n network: networkConfig.network,\n projectId: networkConfig.infuraProjectId,\n maxAttempts: 5,\n source: 'metamask',\n })\n : createFetchMiddleware({\n btoa: global.btoa,\n fetch: global.fetch,\n rpcUrl: networkConfig.rpcUrl,\n });\n\n const rpcProvider = providerFromMiddleware(rpcApiMiddleware);\n\n const blockTrackerOpts =\n // eslint-disable-next-line node/no-process-env\n process.env.IN_TEST && networkConfig.type === 'custom'\n ? { pollingInterval: SECOND }\n : {};\n const blockTracker = new PollingBlockTracker({\n ...blockTrackerOpts,\n provider: rpcProvider,\n });\n\n const networkMiddleware =\n networkConfig.type === NetworkClientType.Infura\n ? createInfuraNetworkMiddleware({\n blockTracker,\n network: networkConfig.network,\n rpcProvider,\n rpcApiMiddleware,\n })\n : createCustomNetworkMiddleware({\n blockTracker,\n chainId: networkConfig.chainId,\n rpcApiMiddleware,\n });\n\n const engine = new JsonRpcEngine();\n\n engine.push(networkMiddleware);\n\n const provider = providerFromEngine(engine);\n\n return { provider, blockTracker };\n}\n\n/**\n * Create middleware for infura.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.network - The Infura network to use.\n * @param args.rpcProvider - The RPC provider to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createInfuraNetworkMiddleware({\n blockTracker,\n network,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n network: InfuraNetworkType;\n rpcProvider: SafeEventEmitterProvider;\n rpcApiMiddleware: JsonRpcMiddleware<unknown, unknown>;\n}) {\n return mergeMiddleware([\n createNetworkAndChainIdMiddleware({ network }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),\n createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ]);\n}\n\n/**\n * Creates static method middleware.\n *\n * @param args - The Arguments.\n * @param args.network - The Infura network to use.\n * @returns The middleware that implements eth_chainId & net_version methods.\n */\nfunction createNetworkAndChainIdMiddleware({\n network,\n}: {\n network: InfuraNetworkType;\n}) {\n return createScaffoldMiddleware({\n eth_chainId: ChainId[network],\n net_version: NetworkId[network],\n });\n}\n\nconst createChainIdMiddleware = (\n chainId: Hex,\n): JsonRpcMiddleware<unknown, unknown> => {\n return (req, res, next, end) => {\n if (req.method === 'eth_chainId') {\n res.result = chainId;\n return end();\n }\n return next();\n };\n};\n\n/**\n * Creates custom middleware.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.chainId - The chain id to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createCustomNetworkMiddleware({\n blockTracker,\n chainId,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: Hex;\n rpcApiMiddleware: any;\n}) {\n // eslint-disable-next-line node/no-process-env\n const testMiddlewares = process.env.IN_TEST\n ? [createEstimateGasDelayTestMiddleware()]\n : [];\n\n return mergeMiddleware([\n ...testMiddlewares,\n createChainIdMiddleware(chainId),\n createBlockRefRewriteMiddleware({ blockTracker }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ]);\n}\n\n/**\n * For use in tests only.\n * Adds a delay to `eth_estimateGas` calls.\n *\n * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.\n */\nfunction createEstimateGasDelayTestMiddleware() {\n return createAsyncMiddleware(async (req, _, next) => {\n if (req.method === 'eth_estimateGas') {\n await new Promise((resolve) => setTimeout(resolve, SECOND * 2));\n }\n return next();\n });\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './NetworkController';
2
2
  export * from './constants';
3
+ export type { Provider } from './types';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,8CAA4B","sourcesContent":["export * from './NetworkController';\nexport * from './constants';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,8CAA4B","sourcesContent":["export * from './NetworkController';\nexport * from './constants';\nexport type { Provider } from './types';\n"]}
@@ -0,0 +1,5 @@
1
+ /// <reference types="debug" />
2
+ import { createModuleLogger } from '@metamask/utils';
3
+ export declare const projectLogger: import("debug").Debugger;
4
+ export { createModuleLogger };
5
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAAA,OAAO,EAAuB,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,eAAO,MAAM,aAAa,0BAA4C,CAAC;AAEvE,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createModuleLogger = exports.projectLogger = void 0;
4
+ const utils_1 = require("@metamask/utils");
5
+ Object.defineProperty(exports, "createModuleLogger", { enumerable: true, get: function () { return utils_1.createModuleLogger; } });
6
+ exports.projectLogger = (0, utils_1.createProjectLogger)('network-controller');
7
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;AAAA,2CAA0E;AAIjE,mGAJqB,0BAAkB,OAIrB;AAFd,QAAA,aAAa,GAAG,IAAA,2BAAmB,EAAC,oBAAoB,CAAC,CAAC","sourcesContent":["import { createProjectLogger, createModuleLogger } from '@metamask/utils';\n\nexport const projectLogger = createProjectLogger('network-controller');\n\nexport { createModuleLogger };\n"]}
@@ -0,0 +1,5 @@
1
+ import type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider';
2
+ import type { PollingBlockTracker } from 'eth-block-tracker';
3
+ export declare type Provider = SafeEventEmitterProvider;
4
+ export declare type BlockTracker = PollingBlockTracker;
5
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,oBAAY,QAAQ,GAAG,wBAAwB,CAAC;AAEhD,oBAAY,YAAY,GAAG,mBAAmB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider';\nimport type { PollingBlockTracker } from 'eth-block-tracker';\n\nexport type Provider = SafeEventEmitterProvider;\n\nexport type BlockTracker = PollingBlockTracker;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/network-controller",
3
- "version": "8.0.0",
3
+ "version": "10.0.0",
4
4
  "description": "Provides an interface to the currently selected network via a MetaMask-compatible provider object",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -29,26 +29,31 @@
29
29
  "test:watch": "jest --watch"
30
30
  },
31
31
  "dependencies": {
32
- "@metamask/base-controller": "^2.0.0",
33
- "@metamask/controller-utils": "^3.4.0",
32
+ "@metamask/base-controller": "^3.0.0",
33
+ "@metamask/controller-utils": "^4.0.0",
34
+ "@metamask/eth-json-rpc-infura": "^8.0.0",
35
+ "@metamask/eth-json-rpc-middleware": "^11.0.0",
36
+ "@metamask/eth-json-rpc-provider": "^1.0.0",
34
37
  "@metamask/swappable-obj-proxy": "^2.1.0",
35
- "@metamask/utils": "^5.0.1",
38
+ "@metamask/utils": "^5.0.2",
36
39
  "async-mutex": "^0.2.6",
37
40
  "babel-runtime": "^6.26.0",
38
- "eth-json-rpc-infura": "^5.1.0",
41
+ "eth-block-tracker": "^7.0.1",
39
42
  "eth-query": "^2.1.2",
40
43
  "eth-rpc-errors": "^4.0.2",
41
44
  "immer": "^9.0.6",
42
- "uuid": "^8.3.2",
43
- "web3-provider-engine": "^16.0.5"
45
+ "json-rpc-engine": "^6.1.0",
46
+ "uuid": "^8.3.2"
44
47
  },
45
48
  "devDependencies": {
46
49
  "@json-rpc-specification/meta-schema": "^1.0.6",
47
50
  "@metamask/auto-changelog": "^3.1.0",
48
51
  "@types/jest": "^27.4.1",
52
+ "@types/jest-when": "^2.7.3",
49
53
  "@types/lodash": "^4.14.191",
50
54
  "deepmerge": "^4.2.2",
51
55
  "jest": "^27.5.1",
56
+ "jest-when": "^3.4.2",
52
57
  "lodash": "^4.17.21",
53
58
  "nock": "^13.0.7",
54
59
  "sinon": "^9.2.4",
@@ -58,7 +63,7 @@
58
63
  "typescript": "~4.6.3"
59
64
  },
60
65
  "engines": {
61
- "node": ">=14.0.0"
66
+ "node": ">=16.0.0"
62
67
  },
63
68
  "publishConfig": {
64
69
  "access": "public",