UNPKG

@metamask/network-controller

Version:

Provides an interface to the currently selected network via a MetaMask-compatible provider object

851 lines 37.1 kB
import type { ControllerGetStateAction, ControllerStateChangeEvent, RestrictedMessenger } from "@metamask/base-controller"; import { BaseController } from "@metamask/base-controller"; import type { Partialize } from "@metamask/controller-utils"; import { InfuraNetworkType } from "@metamask/controller-utils"; import type { ErrorReportingServiceCaptureExceptionAction } from "@metamask/error-reporting-service"; import type { PollingBlockTrackerOptions } from "@metamask/eth-block-tracker"; import EthQuery from "@metamask/eth-query"; import type { SwappableProxy } from "@metamask/swappable-obj-proxy"; import type { Hex } from "@metamask/utils"; import type { Draft } from "immer"; import type { Logger } from "loglevel"; import { NetworkStatus } from "./constants.mjs"; import type { AutoManagedNetworkClient, ProxyWithAccessibleTarget } from "./create-auto-managed-network-client.mjs"; import type { RpcServiceOptions } from "./rpc-service/rpc-service.mjs"; import { NetworkClientType } from "./types.mjs"; import type { BlockTracker, Provider, CustomNetworkClientConfiguration, InfuraNetworkClientConfiguration, AdditionalDefaultNetwork } from "./types.mjs"; export type Block = { baseFeePerGas?: string; }; /** * Information about a network not held by any other part of state. */ export type NetworkMetadata = { /** * EIPs supported by the network. */ EIPS: { [eipNumber: number]: boolean; }; /** * Indicates the availability of the network */ status: NetworkStatus; }; /** * The type of an RPC endpoint. * * @see {@link CustomRpcEndpoint} * @see {@link InfuraRpcEndpoint} */ export declare enum RpcEndpointType { Custom = "custom", Infura = "infura" } /** * An Infura RPC endpoint is a reference to a specific network that Infura * supports as well as an Infura account we own that we allow users to make use * of for free. We need to disambiguate these endpoints from custom RPC * endpoints, because while the types for these kinds of object both have the * same interface, the URL for an Infura endpoint contains the Infura project * ID, and we don't want this to be present in state. We therefore hide it by * representing it in the URL as `{infuraProjectId}`, which we replace this when * create network clients. But we need to know somehow that we only need to do * this replacement for Infura endpoints and not custom endpoints — hence the * separate type. */ export type InfuraRpcEndpoint = { /** * Alternate RPC endpoints to use when this endpoint is down. */ failoverUrls?: string[]; /** * The optional user-facing nickname of the endpoint. */ name?: string; /** * The identifier for the network client that has been created for this RPC * endpoint. This is also used to uniquely identify the RPC endpoint in a * set of RPC endpoints as well: once assigned, it is used to determine * whether the `name`, `type`, or `url` of the RPC endpoint has changed. */ networkClientId: BuiltInNetworkClientId; /** * The type of this endpoint, always "default". */ type: RpcEndpointType.Infura; /** * The URL of the endpoint. Expected to be a template with the string * `{infuraProjectId}`, which will get replaced with the Infura project ID * when the network client is created. */ url: `https://${InfuraNetworkType}.infura.io/v3/{infuraProjectId}`; }; /** * A custom RPC endpoint is a reference to a user-defined server which fronts an * EVM chain. It may refer to an Infura network, but only by coincidence. */ export type CustomRpcEndpoint = { /** * Alternate RPC endpoints to use when this endpoint is down. */ failoverUrls?: string[]; /** * The optional user-facing nickname of the endpoint. */ name?: string; /** * The identifier for the network client that has been created for this RPC * endpoint. This is also used to uniquely identify the RPC endpoint in a * set of RPC endpoints as well: once assigned, it is used to determine * whether the `name`, `type`, or `url` of the RPC endpoint has changed. */ networkClientId: CustomNetworkClientId; /** * The type of this endpoint, always "custom". */ type: RpcEndpointType.Custom; /** * The URL of the endpoint. */ url: string; }; /** * An RPC endpoint is a reference to a server which fronts an EVM chain. There * are two varieties of RPC endpoints: Infura and custom. * * @see {@link CustomRpcEndpoint} * @see {@link InfuraRpcEndpoint} */ export type RpcEndpoint = InfuraRpcEndpoint | CustomRpcEndpoint; /** * From a user perspective, a network configuration holds information about a * network that a user can select through the client. A "network" in this sense * can explicitly refer to an EVM chain that the user explicitly adds or doesn't * need to add (because it comes shipped with the client). The properties here * therefore directly map to fields that a user sees and can edit for a network * within the client. * * Internally, a network configuration represents a single conceptual EVM chain, * which is represented tangibly via multiple RPC endpoints. A "network" is then * something for which a network client object is created automatically or * created on demand when it is added to the client. */ export type NetworkConfiguration = { /** * A set of URLs that allows the user to view activity that has occurred on * the chain. */ blockExplorerUrls: string[]; /** * The ID of the chain. Represented in hexadecimal format with a leading "0x" * instead of decimal format so that when viewed out of context it can be * unambiguously interpreted. */ chainId: Hex; /** * A reference to a URL that the client will use by default to allow the user * to view activity that has occurred on the chain. This index must refer to * an item in `blockExplorerUrls`. */ defaultBlockExplorerUrlIndex?: number; /** * A reference to an RPC endpoint that all requests will use by default in order to * interact with the chain. This index must refer to an item in * `rpcEndpoints`. */ defaultRpcEndpointIndex: number; /** * The user-facing nickname assigned to the chain. */ name: string; /** * The name of the currency to use for the chain. */ nativeCurrency: string; /** * The collection of possible RPC endpoints that the client can use to * interact with the chain. */ rpcEndpoints: RpcEndpoint[]; /** * Profile Sync - Network Sync field. * Allows comparison of local network state with state to sync. */ lastUpdatedAt?: number; }; /** * A custom RPC endpoint in a new network configuration, meant to be used in * conjunction with `AddNetworkFields`. * * Custom RPC endpoints do not need a `networkClientId` property because it is * assumed that they have not already been added and therefore network clients * do not exist for them yet (and hence IDs need to be generated). */ export type AddNetworkCustomRpcEndpointFields = Omit<CustomRpcEndpoint, 'networkClientId'>; /** * A new network configuration that `addNetwork` takes. * * Custom RPC endpoints do not need a `networkClientId` property because it is * assumed that they have not already been added and are not represented by * network clients yet. */ export type AddNetworkFields = Omit<NetworkConfiguration, 'rpcEndpoints'> & { rpcEndpoints: (InfuraRpcEndpoint | AddNetworkCustomRpcEndpointFields)[]; }; /** * A custom RPC endpoint in an updated representation of a network * configuration, meant to be used in conjunction with `UpdateNetworkFields`. * * Custom RPC endpoints do not need a `networkClientId` property because it is * assumed that they have not already been added and therefore network clients * do not exist for them yet (and hence IDs need to be generated). */ export type UpdateNetworkCustomRpcEndpointFields = Partialize<CustomRpcEndpoint, 'networkClientId'>; /** * An updated representation of an existing network configuration that * `updateNetwork` takes. * * Custom RPC endpoints may or may not have a `networkClientId` property; if * they do, then it is assumed that they already exist, and if not, then it is * assumed that they are new and are not represented by network clients yet. */ export type UpdateNetworkFields = Omit<NetworkConfiguration, 'rpcEndpoints'> & { rpcEndpoints: (InfuraRpcEndpoint | UpdateNetworkCustomRpcEndpointFields)[]; }; /** * `Object.keys()` is intentionally generic: it returns the keys of an object, * but it cannot make guarantees about the contents of that object, so the type * of the keys is merely `string[]`. While this is technically accurate, it is * also unnecessary if we have an object that we own and whose contents are * known exactly. * * TODO: Move to @metamask/utils. * * @param object - The object. * @returns The keys of an object, typed according to the type of the object * itself. */ export declare function knownKeysOf<K extends PropertyKey>(object: Partial<Record<K, any>>): K[]; /** * The string that uniquely identifies an Infura network client. */ export type BuiltInNetworkClientId = InfuraNetworkType; /** * The string that uniquely identifies a custom network client. */ export type CustomNetworkClientId = string; /** * The string that uniquely identifies a network client. */ export type NetworkClientId = BuiltInNetworkClientId | CustomNetworkClientId; /** * Extra information about each network, such as whether it is accessible or * blocked and whether it supports EIP-1559, keyed by network client ID. */ export type NetworksMetadata = Record<NetworkClientId, NetworkMetadata>; /** * The state that NetworkController stores. */ export type NetworkState = { /** * The ID of the network client that the proxies returned by * `getSelectedNetworkClient` currently point to. */ selectedNetworkClientId: NetworkClientId; /** * The registry of networks and corresponding RPC endpoints that the * controller can use to make requests for various chains. * * @see {@link NetworkConfiguration} */ networkConfigurationsByChainId: Record<Hex, NetworkConfiguration>; /** * Extra information about each network, such as whether it is accessible or * blocked and whether it supports EIP-1559, keyed by network client ID. */ networksMetadata: NetworksMetadata; }; declare const controllerName = "NetworkController"; /** * Represents the block tracker for the currently selected network. (Note that * this is a proxy around a proxy: the inner one exists so that the block * tracker doesn't have to exist until it's used, and the outer one exists so * that the currently selected network can change without consumers needing to * refresh the object reference to that network.) */ export type BlockTrackerProxy = SwappableProxy<ProxyWithAccessibleTarget<BlockTracker>>; /** * Represents the provider for the currently selected network. (Note that this * is a proxy around a proxy: the inner one exists so that the provider doesn't * have to exist until it's used, and the outer one exists so that the currently * selected network can change without consumers needing to refresh the object * reference to that network.) */ export type ProviderProxy = SwappableProxy<ProxyWithAccessibleTarget<Provider>>; export type NetworkControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, NetworkState>; /** * `networkWillChange` is published when the current network is about to be * switched, but the new provider has not been created and no state changes have * occurred yet. */ export type NetworkControllerNetworkWillChangeEvent = { type: 'NetworkController:networkWillChange'; payload: [NetworkState]; }; /** * `networkDidChange` is published after a provider has been created for a newly * switched network (but before the network has been confirmed to be available). */ export type NetworkControllerNetworkDidChangeEvent = { type: 'NetworkController:networkDidChange'; payload: [NetworkState]; }; /** * `infuraIsBlocked` is published after the network is switched to an Infura * network, but when Infura returns an error blocking the user based on their * location. */ export type NetworkControllerInfuraIsBlockedEvent = { type: 'NetworkController:infuraIsBlocked'; payload: []; }; /** * `infuraIsBlocked` is published either after the network is switched to an * Infura network and Infura does not return an error blocking the user based on * their location, or the network is switched to a non-Infura network. */ export type NetworkControllerInfuraIsUnblockedEvent = { type: 'NetworkController:infuraIsUnblocked'; payload: []; }; /** * `networkAdded` is published after a network configuration is added to the * network configuration registry and network clients are created for it. */ export type NetworkControllerNetworkAddedEvent = { type: 'NetworkController:networkAdded'; payload: [networkConfiguration: NetworkConfiguration]; }; /** * `networkRemoved` is published after a network configuration is removed from the * network configuration registry and once the network clients have been removed. */ export type NetworkControllerNetworkRemovedEvent = { type: 'NetworkController:networkRemoved'; payload: [networkConfiguration: NetworkConfiguration]; }; /** * `rpcEndpointUnavailable` is published after an attempt to make a request to * an RPC endpoint fails too many times in a row (because of a connection error * or an unusable response). */ export type NetworkControllerRpcEndpointUnavailableEvent = { type: 'NetworkController:rpcEndpointUnavailable'; payload: [ { chainId: Hex; endpointUrl: string; failoverEndpointUrl?: string; error: unknown; } ]; }; /** * `rpcEndpointDegraded` is published after a request to an RPC endpoint * responds successfully but takes too long. */ export type NetworkControllerRpcEndpointDegradedEvent = { type: 'NetworkController:rpcEndpointDegraded'; payload: [ { chainId: Hex; endpointUrl: string; error: unknown; } ]; }; /** * `rpcEndpointRequestRetried` is published after a request to an RPC endpoint * is retried following a connection error or an unusable response. */ export type NetworkControllerRpcEndpointRequestRetriedEvent = { type: 'NetworkController:rpcEndpointRequestRetried'; payload: [ { endpointUrl: string; attempt: number; } ]; }; export type NetworkControllerEvents = NetworkControllerStateChangeEvent | NetworkControllerNetworkWillChangeEvent | NetworkControllerNetworkDidChangeEvent | NetworkControllerInfuraIsBlockedEvent | NetworkControllerInfuraIsUnblockedEvent | NetworkControllerNetworkAddedEvent | NetworkControllerNetworkRemovedEvent | NetworkControllerRpcEndpointUnavailableEvent | NetworkControllerRpcEndpointDegradedEvent | NetworkControllerRpcEndpointRequestRetriedEvent; /** * All events that {@link NetworkController} calls internally. */ type AllowedEvents = never; export type NetworkControllerGetStateAction = ControllerGetStateAction<typeof controllerName, NetworkState>; export type NetworkControllerGetEthQueryAction = { type: `NetworkController:getEthQuery`; handler: () => EthQuery | undefined; }; export type NetworkControllerGetNetworkClientByIdAction = { type: `NetworkController:getNetworkClientById`; handler: NetworkController['getNetworkClientById']; }; export type NetworkControllerGetSelectedNetworkClientAction = { type: `NetworkController:getSelectedNetworkClient`; handler: NetworkController['getSelectedNetworkClient']; }; export type NetworkControllerGetSelectedChainIdAction = { type: 'NetworkController:getSelectedChainId'; handler: NetworkController['getSelectedChainId']; }; export type NetworkControllerGetEIP1559CompatibilityAction = { type: `NetworkController:getEIP1559Compatibility`; handler: NetworkController['getEIP1559Compatibility']; }; export type NetworkControllerFindNetworkClientIdByChainIdAction = { type: `NetworkController:findNetworkClientIdByChainId`; handler: NetworkController['findNetworkClientIdByChainId']; }; /** * Change the currently selected network to the given built-in network type. * * @deprecated This action has been replaced by `setActiveNetwork`, and will be * removed in a future release. */ export type NetworkControllerSetProviderTypeAction = { type: `NetworkController:setProviderType`; handler: NetworkController['setProviderType']; }; export type NetworkControllerSetActiveNetworkAction = { type: `NetworkController:setActiveNetwork`; handler: NetworkController['setActiveNetwork']; }; export type NetworkControllerGetNetworkConfigurationByChainId = { type: `NetworkController:getNetworkConfigurationByChainId`; handler: NetworkController['getNetworkConfigurationByChainId']; }; export type NetworkControllerGetNetworkConfigurationByNetworkClientId = { type: `NetworkController:getNetworkConfigurationByNetworkClientId`; handler: NetworkController['getNetworkConfigurationByNetworkClientId']; }; export type NetworkControllerAddNetworkAction = { type: 'NetworkController:addNetwork'; handler: NetworkController['addNetwork']; }; export type NetworkControllerRemoveNetworkAction = { type: 'NetworkController:removeNetwork'; handler: NetworkController['removeNetwork']; }; export type NetworkControllerUpdateNetworkAction = { type: 'NetworkController:updateNetwork'; handler: NetworkController['updateNetwork']; }; export type NetworkControllerActions = NetworkControllerGetStateAction | NetworkControllerGetEthQueryAction | NetworkControllerGetNetworkClientByIdAction | NetworkControllerGetSelectedNetworkClientAction | NetworkControllerGetSelectedChainIdAction | NetworkControllerGetEIP1559CompatibilityAction | NetworkControllerFindNetworkClientIdByChainIdAction | NetworkControllerSetActiveNetworkAction | NetworkControllerSetProviderTypeAction | NetworkControllerGetNetworkConfigurationByChainId | NetworkControllerGetNetworkConfigurationByNetworkClientId | NetworkControllerAddNetworkAction | NetworkControllerRemoveNetworkAction | NetworkControllerUpdateNetworkAction; /** * All actions that {@link NetworkController} calls internally. */ type AllowedActions = ErrorReportingServiceCaptureExceptionAction; export type NetworkControllerMessenger = RestrictedMessenger<typeof controllerName, NetworkControllerActions | AllowedActions, NetworkControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>; /** * Options for the NetworkController constructor. */ export type NetworkControllerOptions = { /** * The messenger suited for this controller. */ messenger: NetworkControllerMessenger; /** * The API key for Infura, used to make requests to Infura. */ infuraProjectId: string; /** * The desired state with which to initialize this controller. * Missing properties will be filled in with defaults. For instance, if not * specified, `networkConfigurationsByChainId` will default to a basic set of * network configurations (see {@link InfuraNetworkType} for the list). */ state?: Partial<NetworkState>; /** * A `loglevel` logger object. */ log?: Logger; /** * A function that can be used to customize a RPC service constructed for an * RPC endpoint. The function takes the URL of the endpoint and should return * an object with type {@link RpcServiceOptions}, minus `failoverService` * and `endpointUrl` (as they are filled in automatically). */ getRpcServiceOptions: (rpcEndpointUrl: string) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>; /** * A function that can be used to customize a block tracker constructed for an * RPC endpoint. The function takes the URL of the endpoint and should return * an object of type {@link PollingBlockTrackerOptions}, minus `provider` (as * it is filled in automatically). */ getBlockTrackerOptions?: (rpcEndpointUrl: string) => Omit<PollingBlockTrackerOptions, 'provider'>; /** * An array of Hex Chain IDs representing the additional networks to be included as default. */ additionalDefaultNetworks?: AdditionalDefaultNetwork[]; /** * Whether or not requests sent to unavailable RPC endpoints should be * automatically diverted to configured failover RPC endpoints. */ isRpcFailoverEnabled?: boolean; }; /** * Constructs properties for the NetworkController state whose values will be * used if not provided to the constructor. * * @param [additionalDefaultNetworks] - An array of Hex Chain IDs representing the additional networks to be included as default. * @returns The default NetworkController state. */ export declare function getDefaultNetworkControllerState(additionalDefaultNetworks?: AdditionalDefaultNetwork[]): NetworkState; /** * Get a list of all network configurations. * * @param state - NetworkController state * @returns A list of all available network configurations */ export declare function getNetworkConfigurations(state: NetworkState): NetworkConfiguration[]; /** * Redux selector for getting a list of all network configurations from * NetworkController state. * * @param state - NetworkController state * @returns A list of all available network configurations */ export declare const selectNetworkConfigurations: ((state: NetworkState) => NetworkConfiguration[]) & { clearCache: () => void; resultsCount: () => number; resetResultsCount: () => void; } & { resultFunc: (resultFuncArgs_0: Record<`0x${string}`, NetworkConfiguration>) => NetworkConfiguration[]; memoizedResultFunc: ((resultFuncArgs_0: Record<`0x${string}`, NetworkConfiguration>) => NetworkConfiguration[]) & { clearCache: () => void; resultsCount: () => number; resetResultsCount: () => void; }; lastResult: () => NetworkConfiguration[]; dependencies: [(state: NetworkState) => Record<`0x${string}`, NetworkConfiguration>]; recomputations: () => number; resetRecomputations: () => void; dependencyRecomputations: () => number; resetDependencyRecomputations: () => void; } & { argsMemoize: typeof import("reselect").weakMapMemoize; memoize: typeof import("reselect").weakMapMemoize; }; /** * Get a list of all available network client IDs from a list of network * configurations. * * @param networkConfigurations - The array of network configurations * @returns A list of all available client IDs */ export declare function getAvailableNetworkClientIds(networkConfigurations: NetworkConfiguration[]): string[]; /** * Redux selector for getting a list of all available network client IDs * from NetworkController state. * * @param state - NetworkController state * @returns A list of all available network client IDs. */ export declare const selectAvailableNetworkClientIds: ((state: NetworkState) => string[]) & { clearCache: () => void; resultsCount: () => number; resetResultsCount: () => void; } & { resultFunc: (resultFuncArgs_0: NetworkConfiguration[]) => string[]; memoizedResultFunc: ((resultFuncArgs_0: NetworkConfiguration[]) => string[]) & { clearCache: () => void; resultsCount: () => number; resetResultsCount: () => void; }; lastResult: () => string[]; dependencies: [((state: NetworkState) => NetworkConfiguration[]) & { clearCache: () => void; resultsCount: () => number; resetResultsCount: () => void; } & { resultFunc: (resultFuncArgs_0: Record<`0x${string}`, NetworkConfiguration>) => NetworkConfiguration[]; memoizedResultFunc: ((resultFuncArgs_0: Record<`0x${string}`, NetworkConfiguration>) => NetworkConfiguration[]) & { clearCache: () => void; resultsCount: () => number; resetResultsCount: () => void; }; lastResult: () => NetworkConfiguration[]; dependencies: [(state: NetworkState) => Record<`0x${string}`, NetworkConfiguration>]; recomputations: () => number; resetRecomputations: () => void; dependencyRecomputations: () => number; resetDependencyRecomputations: () => void; } & { argsMemoize: typeof import("reselect").weakMapMemoize; memoize: typeof import("reselect").weakMapMemoize; }]; recomputations: () => number; resetRecomputations: () => void; dependencyRecomputations: () => number; resetDependencyRecomputations: () => void; } & { argsMemoize: typeof import("reselect").weakMapMemoize; memoize: typeof import("reselect").weakMapMemoize; }; /** * The collection of auto-managed network clients that map to Infura networks. */ export type AutoManagedBuiltInNetworkClientRegistry = Record<BuiltInNetworkClientId, AutoManagedNetworkClient<InfuraNetworkClientConfiguration>>; /** * The collection of auto-managed network clients that map to Infura networks. */ export type AutoManagedCustomNetworkClientRegistry = Record<CustomNetworkClientId, AutoManagedNetworkClient<CustomNetworkClientConfiguration>>; /** * The collection of auto-managed network clients that map to Infura networks * as well as custom networks that users have added. */ export type AutoManagedNetworkClientRegistry = { [NetworkClientType.Infura]: AutoManagedBuiltInNetworkClientRegistry; [NetworkClientType.Custom]: AutoManagedCustomNetworkClientRegistry; }; /** * Controller that creates and manages an Ethereum network provider. */ export declare class NetworkController extends BaseController<typeof controllerName, NetworkState, NetworkControllerMessenger> { #private; /** * Constructs a NetworkController. * * @param options - The options; see {@link NetworkControllerOptions}. */ constructor(options: NetworkControllerOptions); /** * Enables the RPC failover functionality. That is, if any RPC endpoints are * configured with failover URLs, then traffic will automatically be diverted * to them if those RPC endpoints are unavailable. */ enableRpcFailover(): void; /** * Disables the RPC failover functionality. That is, even if any RPC endpoints * are configured with failover URLs, then traffic will not automatically be * diverted to them if those RPC endpoints are unavailable. */ disableRpcFailover(): void; /** * Accesses the provider and block tracker for the currently selected network. * @returns The proxy and block tracker proxies. * @deprecated This method has been replaced by `getSelectedNetworkClient` (which has a more easily used return type) and will be removed in a future release. */ getProviderAndBlockTracker(): { provider: SwappableProxy<ProxyWithAccessibleTarget<Provider>> | undefined; blockTracker: SwappableProxy<ProxyWithAccessibleTarget<BlockTracker>> | undefined; }; /** * Accesses the provider and block tracker for the currently selected network. * * @returns an object with the provider and block tracker proxies for the currently selected network. */ getSelectedNetworkClient(): { provider: SwappableProxy<ProxyWithAccessibleTarget<Provider>>; blockTracker: SwappableProxy<ProxyWithAccessibleTarget<BlockTracker>>; } | undefined; /** * Accesses the chain ID from the selected network client. * * @returns The chain ID of the selected network client in hex format or undefined if there is no network client. */ getSelectedChainId(): Hex | undefined; /** * Internally, the Infura and custom network clients are categorized by type * so that when accessing either kind of network client, TypeScript knows * which type to assign to the network client. For some cases it's more useful * to be able to access network clients by ID instead of by type and then ID, * so this function makes that possible. * * @returns The network clients registered so far, keyed by ID. */ getNetworkClientRegistry(): AutoManagedBuiltInNetworkClientRegistry & AutoManagedCustomNetworkClientRegistry; /** * Returns the Infura network client with the given ID. * * @param infuraNetworkClientId - An Infura network client ID. * @returns The Infura network client. * @throws If an Infura network client does not exist with the given ID. */ getNetworkClientById(infuraNetworkClientId: BuiltInNetworkClientId): AutoManagedNetworkClient<InfuraNetworkClientConfiguration>; /** * Returns the custom network client with the given ID. * * @param customNetworkClientId - A custom network client ID. * @returns The custom network client. * @throws If a custom network client does not exist with the given ID. */ getNetworkClientById(customNetworkClientId: CustomNetworkClientId): AutoManagedNetworkClient<CustomNetworkClientConfiguration>; /** * Ensures that network clients for Infura and custom RPC endpoints have been * created. Then, consulting state, initializes and establishes the currently * selected network client. */ initializeProvider(): Promise<void>; /** * Refreshes the network meta with EIP-1559 support and the network status * based on the given network client ID. * * @param networkClientId - The ID of the network client to update. */ lookupNetworkByClientId(networkClientId: NetworkClientId): Promise<void>; /** * Persists the following metadata about the given or selected network to * state: * * - The status of the network, namely, whether it is available, geo-blocked * (Infura only), or unavailable, or whether the status is unknown * - Whether the network supports EIP-1559, or whether it is unknown * * Note that it is possible for the network to be switched while this data is * being collected. If that is the case, no metadata for the (now previously) * selected network will be updated. * * @param networkClientId - The ID of the network client to update. * If no ID is provided, uses the currently selected network. */ lookupNetwork(networkClientId?: NetworkClientId): Promise<void>; /** * Convenience method to update provider network type settings. * * @param type - Human readable network name. * @deprecated This has been replaced by `setActiveNetwork`, and will be * removed in a future release */ setProviderType(type: InfuraNetworkType): Promise<void>; /** * Changes the selected network. * * @param networkClientId - The ID of a network client that will be used to * make requests. * @param options - Options for this method. * @param options.updateState - Allows for updating state. * @throws if no network client is associated with the given * network client ID. */ setActiveNetwork(networkClientId: string, options?: { updateState?: (state: Draft<NetworkState>) => void; }): Promise<void>; /** * Determines whether the network supports EIP-1559 by checking whether the * latest block has a `baseFeePerGas` property, then updates state * appropriately. * * @param networkClientId - The networkClientId to fetch the correct provider against which to check 1559 compatibility. * @returns A promise that resolves to true if the network supports EIP-1559 * , false otherwise, or `undefined` if unable to determine the compatibility. */ getEIP1559Compatibility(networkClientId?: NetworkClientId): Promise<boolean | undefined>; get1559CompatibilityWithNetworkClientId(networkClientId: NetworkClientId): Promise<boolean>; /** * Ensures that the provider and block tracker proxies are pointed to the * currently selected network and refreshes the metadata for the */ resetConnection(): Promise<void>; /** * Returns the network configuration that has been filed under the given chain * ID. * * @param chainId - The chain ID to use as a key. * @returns The network configuration if one exists, or undefined. */ getNetworkConfigurationByChainId(chainId: Hex): NetworkConfiguration | undefined; /** * Returns the network configuration that contains an RPC endpoint with the * given network client ID. * * @param networkClientId - The network client ID to use as a key. * @returns The network configuration if one exists, or undefined. */ getNetworkConfigurationByNetworkClientId(networkClientId: NetworkClientId): NetworkConfiguration | undefined; /** * Creates and registers network clients for the collection of Infura and * custom RPC endpoints that can be used to make requests for a particular * chain, storing the given configuration object in state for later reference. * * @param fields - The object that describes the new network/chain and lists * the RPC endpoints which front that chain. * @returns The newly added network configuration. * @throws if any part of `fields` would produce invalid state. * @see {@link NetworkConfiguration} */ addNetwork(fields: AddNetworkFields): NetworkConfiguration; /** * Updates the configuration for a previously stored network filed under the * given chain ID, creating + registering new network clients to represent RPC * endpoints that have been added and destroying + unregistering existing * network clients for RPC endpoints that have been removed. * * Note that if `chainId` is changed, then all network clients associated with * that chain will be removed and re-added, even if none of the RPC endpoints * have changed. * * @param chainId - The chain ID associated with an existing network. * @param fields - The object that describes the updates to the network/chain, * including the new set of RPC endpoints which should front that chain. * @param options - Options to provide. * @param options.replacementSelectedRpcEndpointIndex - Usually you cannot * remove an RPC endpoint that is being represented by the currently selected * network client. This option allows you to specify another RPC endpoint * (either an existing one or a new one) that should be used to select a new * network instead. * @returns The updated network configuration. * @throws if `chainId` does not refer to an existing network configuration, * if any part of `fields` would produce invalid state, etc. * @see {@link NetworkConfiguration} */ updateNetwork(chainId: Hex, fields: UpdateNetworkFields, { replacementSelectedRpcEndpointIndex, }?: { replacementSelectedRpcEndpointIndex?: number; }): Promise<NetworkConfiguration>; /** * Destroys and unregisters the network identified by the given chain ID, also * removing the associated network configuration from state. * * @param chainId - The chain ID associated with an existing network. * @throws if `chainId` does not refer to an existing network configuration, * or if the currently selected network is being removed. * @see {@link NetworkConfiguration} */ removeNetwork(chainId: Hex): void; /** * Assuming that the network has been previously switched, switches to this * new network. * * If the network has not been previously switched, this method is equivalent * to {@link resetConnection}. */ rollbackToPreviousProvider(): Promise<void>; /** * Deactivates the controller, stopping any ongoing polling. * * In-progress requests will not be aborted. */ destroy(): Promise<void>; /** * Merges the given backup data into controller state. * * @param backup - The data that has been backed up. * @param backup.networkConfigurationsByChainId - Network configurations, * keyed by chain ID. */ loadBackup({ networkConfigurationsByChainId, }: Pick<NetworkState, 'networkConfigurationsByChainId'>): void; /** * Searches for the default RPC endpoint configured for the given chain and * returns its network client ID. This can then be passed to * {@link getNetworkClientById} to retrieve the network client. * * @param chainId - Chain ID to search for. * @returns The ID of the network client created for the chain's default RPC * endpoint. */ findNetworkClientIdByChainId(chainId: Hex): NetworkClientId; } export {}; //# sourceMappingURL=NetworkController.d.mts.map