A complete and compact Ethereum library for dapps, wallets and any other tools.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Providers handle network connectivity to Ethereum nodes, supporting various connection methods including JSON-RPC, WebSocket, and browser-injected providers. They enable querying blockchain state, sending transactions, and listening for events.
Standard HTTP-based provider for connecting to Ethereum nodes via JSON-RPC endpoints.
/**
* Standard JSON-RPC provider for HTTP connections to Ethereum nodes
*/
class JsonRpcProvider extends AbstractProvider {
constructor(url?: string, network?: Networkish, options?: JsonRpcApiProviderOptions);
}
interface JsonRpcApiProviderOptions {
polling?: boolean;
staticNetwork?: Network;
batchStallTime?: number;
batchMaxSize?: number;
batchMaxCount?: number;
cacheTimeout?: number;
}Usage Example:
import { JsonRpcProvider } from "ethers";
// Connect to Infura
const provider = new JsonRpcProvider("https://mainnet.infura.io/v3/YOUR-PROJECT-ID");
// Connect to local node
const localProvider = new JsonRpcProvider("http://localhost:8545");
// Get network information
const network = await provider.getNetwork();
console.log(network.name, network.chainId);Real-time provider using WebSocket connections for event subscriptions and faster updates.
/**
* WebSocket provider for real-time blockchain events and faster updates
*/
class WebSocketProvider extends SocketProvider {
constructor(url: string | WebSocketLike, network?: Networkish);
}
interface WebSocketLike {
send(data: string): void;
close(): void;
addEventListener(event: string, listener: any): void;
removeEventListener(event: string, listener: any): void;
}Usage Example:
import { WebSocketProvider } from "ethers";
const wsProvider = new WebSocketProvider("wss://mainnet.infura.io/ws/v3/YOUR-PROJECT-ID");
// Listen for new blocks
wsProvider.on("block", (blockNumber) => {
console.log("New block:", blockNumber);
});Wrapper for browser-injected providers like MetaMask, providing standardized access to wallet functionality.
/**
* Browser provider wrapper for injected providers like MetaMask
*/
class BrowserProvider extends JsonRpcApiProvider {
constructor(ethereum: Eip1193Provider, network?: Networkish);
getSigner(address?: string): Promise<JsonRpcSigner>;
listAccounts(): Promise<JsonRpcSigner[]>;
send(method: string, params: Array<any>): Promise<any>;
}
interface Eip1193Provider extends EventEmitter {
request(args: { method: string; params?: Array<any> }): Promise<any>;
isConnected?(): boolean;
}Usage Example:
import { BrowserProvider } from "ethers";
// Connect to MetaMask
const provider = new BrowserProvider(window.ethereum);
// Get connected accounts
const signer = await provider.getSigner();
const address = await signer.getAddress();Resilient provider that automatically switches between multiple backend providers for improved reliability.
/**
* Fallback provider with multiple backends for improved reliability
*/
class FallbackProvider extends AbstractProvider {
constructor(providers: Array<FallbackProviderConfig>, network?: Networkish, options?: FallbackProviderOptions);
}
interface FallbackProviderConfig {
provider: Provider;
priority?: number;
stallTimeout?: number;
weight?: number;
}
interface FallbackProviderOptions {
quorum?: number;
eventQuorum?: number;
eventWorkers?: number;
cacheTimeout?: number;
}Convenience function that creates a configured provider with multiple backends for maximum reliability.
/**
* Creates a default provider with multiple backends for maximum reliability
* @param network - Network to connect to (default: "homestead")
* @param options - Configuration options for individual providers
* @returns Configured FallbackProvider instance
*/
function getDefaultProvider(network?: Networkish, options?: any): Provider;Usage Example:
import { getDefaultProvider } from "ethers";
// Get default provider for mainnet
const provider = getDefaultProvider();
// Get provider for specific network
const goerliProvider = getDefaultProvider("goerli", {
infura: "YOUR-PROJECT-ID",
alchemy: "YOUR-API-KEY"
});Core methods available on all provider instances for blockchain interaction.
/**
* Base provider interface with core blockchain interaction methods
*/
interface Provider {
// Network information
getNetwork(): Promise<Network>;
// Block queries
getBlockNumber(): Promise<number>;
getBlock(blockHashOrBlockTag: BlockTag): Promise<null | Block>;
// Account queries
getBalance(address: string, blockTag?: BlockTag): Promise<bigint>;
getCode(address: string, blockTag?: BlockTag): Promise<string>;
getStorage(address: string, position: BigNumberish, blockTag?: BlockTag): Promise<string>;
getTransactionCount(address: string, blockTag?: BlockTag): Promise<number>;
// Transaction operations
call(transaction: TransactionRequest, blockTag?: BlockTag): Promise<string>;
estimateGas(transaction: TransactionRequest): Promise<bigint>;
sendTransaction(signedTransaction: string): Promise<TransactionResponse>;
// Transaction and receipt queries
getTransaction(hash: string): Promise<null | TransactionResponse>;
getTransactionReceipt(hash: string): Promise<null | TransactionReceipt>;
// Event logs
getLogs(filter: Filter): Promise<Array<Log>>;
// Gas fees
getFeeData(): Promise<FeeData>;
// ENS resolution
resolveName(name: string): Promise<null | string>;
lookupAddress(address: string): Promise<null | string>;
}
type BlockTag = number | string | "latest" | "earliest" | "pending" | "safe" | "finalized";
interface Network {
name: string;
chainId: bigint;
ensAddress?: string;
}
interface Block {
hash: string;
number: number;
timestamp: number;
parentHash: string;
gasLimit: bigint;
gasUsed: bigint;
miner: string;
difficulty: bigint;
transactions: Array<string>;
}
interface FeeData {
gasPrice?: bigint;
maxFeePerGas?: bigint;
maxPriorityFeePerGas?: bigint;
}Subscribe to blockchain events including new blocks, pending transactions, and contract events.
/**
* Event subscription methods for real-time blockchain monitoring
*/
interface EventProvider {
on(event: ProviderEvent, listener: Listener): Provider;
off(event: ProviderEvent, listener?: Listener): Provider;
once(event: ProviderEvent, listener: Listener): Provider;
removeAllListeners(event?: ProviderEvent): Provider;
}
type ProviderEvent = "block" | "pending" | "error" | "network" | Filter | string;
type Listener = (...args: Array<any>) => void;Usage Examples:
import { JsonRpcProvider } from "ethers";
const provider = new JsonRpcProvider("YOUR-RPC-URL");
// Listen for new blocks
provider.on("block", (blockNumber) => {
console.log("New block:", blockNumber);
});
// Listen for pending transactions
provider.on("pending", (txHash) => {
console.log("Pending transaction:", txHash);
});
// Listen for contract events
const filter = {
address: "0x...",
topics: ["0x..."] // Event signature hash
};
provider.on(filter, (log) => {
console.log("Contract event:", log);
});Configure custom networks and manage network-specific settings.
/**
* Network configuration for custom or non-standard networks
*/
class Network {
constructor(name: string, chainId: BigNumberish);
readonly name: string;
readonly chainId: bigint;
readonly ensAddress?: string;
static from(network: Networkish): Network;
}
type Networkish = Network | string | bigint | number | {
name?: string;
chainId?: BigNumberish;
ensAddress?: string;
};Usage Example:
import { Network, JsonRpcProvider } from "ethers";
// Create custom network
const customNetwork = new Network("my-network", 1337);
// Use with provider
const provider = new JsonRpcProvider("http://localhost:8545", customNetwork);Ethers supports numerous third-party infrastructure providers for connecting to Ethereum and other blockchain networks.
Connects to Infura's JSON-RPC endpoints with extensive network support including Layer 2 networks.
/**
* Infura provider supporting mainnet, testnets, and Layer 2 networks
*/
class InfuraProvider extends JsonRpcProvider implements CommunityResourcable {
constructor(network?: Networkish, projectId?: string | null, projectSecret?: string | null);
readonly projectId: string;
readonly projectSecret: string | null;
static getWebSocketProvider(network?: Networkish, projectId?: string): InfuraWebSocketProvider;
static getRequest(network: Network, projectId?: string | null, projectSecret?: string | null): FetchRequest;
isCommunityResource(): boolean;
}
/**
* Infura WebSocket provider for real-time blockchain events
*/
class InfuraWebSocketProvider extends WebSocketProvider implements CommunityResourcable {
constructor(network?: Networkish, projectId?: string);
readonly projectId: string;
readonly projectSecret: string | null;
isCommunityResource(): boolean;
}Supported Networks:
Usage Example:
import { InfuraProvider, InfuraWebSocketProvider } from "ethers";
// HTTP provider
const provider = new InfuraProvider("mainnet", "YOUR-PROJECT-ID");
// With project secret for authenticated requests
const authProvider = new InfuraProvider("mainnet", "YOUR-PROJECT-ID", "YOUR-PROJECT-SECRET");
// WebSocket provider for real-time events
const wsProvider = new InfuraWebSocketProvider("mainnet", "YOUR-PROJECT-ID");
// Layer 2 networks
const arbitrumProvider = new InfuraProvider("arbitrum", "YOUR-PROJECT-ID");
const polygonProvider = new InfuraProvider("matic", "YOUR-PROJECT-ID");Connects to Alchemy's JSON-RPC endpoints with enhanced tracing capabilities.
/**
* Alchemy provider with enhanced blockchain data access and tracing support
*/
class AlchemyProvider extends JsonRpcProvider implements CommunityResourcable {
constructor(network?: Networkish, apiKey?: string | null);
readonly apiKey: string;
static getRequest(network: Network, apiKey?: string): FetchRequest;
isCommunityResource(): boolean;
}Supported Networks:
Usage Example:
import { AlchemyProvider } from "ethers";
// Basic connection
const provider = new AlchemyProvider("mainnet", "YOUR-API-KEY");
// Layer 2 networks
const arbitrumProvider = new AlchemyProvider("arbitrum", "YOUR-API-KEY");
const optimismProvider = new AlchemyProvider("optimism", "YOUR-API-KEY");
// Enhanced trace capabilities
const txResult = await provider.send("trace_transaction", [txHash]);Connects to Etherscan's API for blockchain data access with built-in rate limiting.
/**
* Etherscan provider using Etherscan's REST API instead of JSON-RPC
*/
class EtherscanProvider extends AbstractProvider implements CommunityResourcable {
constructor(network?: Networkish, apiKey?: string | null);
readonly apiKey: string | null;
static getRequest(network: Network, apiKey?: string | null): FetchRequest;
isCommunityResource(): boolean;
}
/**
* Etherscan network plugin for ENS resolution via Etherscan API
*/
class EtherscanPlugin extends NetworkPlugin {
constructor(apiKey?: string | null);
readonly baseUrl: string;
readonly apiKey: string | null;
}Usage Example:
import { EtherscanProvider, EtherscanPlugin } from "ethers";
// Basic Etherscan provider
const provider = new EtherscanProvider("mainnet", "YOUR-API-KEY");
// Using as network plugin
const network = new Network("mainnet", 1);
network.attachPlugin(new EtherscanPlugin("YOUR-API-KEY"));Other supported third-party infrastructure providers:
/**
* QuickNode provider for high-performance blockchain access
*/
class QuickNodeProvider extends JsonRpcProvider implements CommunityResourcable {
constructor(network?: Networkish, token?: string | null);
readonly token: string | null;
}
/**
* Ankr provider for decentralized RPC access
*/
class AnkrProvider extends JsonRpcProvider implements CommunityResourcable {
constructor(network?: Networkish, apiKey?: string | null);
readonly apiKey: string | null;
}
/**
* Cloudflare provider using Cloudflare's Ethereum gateway
*/
class CloudflareProvider extends JsonRpcProvider {
constructor(network?: Networkish);
}
/**
* Blockscout provider for Blockscout-compatible networks
*/
class BlockscoutProvider extends JsonRpcProvider {
constructor(network?: Networkish, baseUrl?: string);
readonly baseUrl: string;
}
/**
* Chainstack provider for Chainstack's managed blockchain infrastructure
*/
class ChainstackProvider extends JsonRpcProvider implements CommunityResourcable {
constructor(network?: Networkish, apiKey?: string | null);
readonly apiKey: string | null;
}
/**
* Pocket provider for Pocket Network's decentralized infrastructure
*/
class PocketProvider extends JsonRpcProvider implements CommunityResourcable {
constructor(network?: Networkish, apiKey?: string | null, applicationId?: string | null);
readonly apiKey: string | null;
readonly applicationId: string | null;
}Usage Examples:
import {
QuickNodeProvider,
AnkrProvider,
CloudflareProvider,
BlockscoutProvider,
ChainstackProvider,
PocketProvider
} from "ethers";
// QuickNode
const quicknode = new QuickNodeProvider("mainnet", "YOUR-TOKEN");
// Ankr
const ankr = new AnkrProvider("mainnet", "YOUR-API-KEY");
// Cloudflare (no API key required)
const cloudflare = new CloudflareProvider("mainnet");
// Chainstack
const chainstack = new ChainstackProvider("mainnet", "YOUR-API-KEY");
// Pocket Network
const pocket = new PocketProvider("mainnet", "YOUR-API-KEY", "YOUR-APP-ID");