or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

abi.mdcontracts.mdcrypto.mdindex.mdproviders.mdutils.mdwallets.md
tile.json

providers.mddocs/

Providers and Network Connection

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.

Capabilities

JSON-RPC Provider

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);

WebSocket Provider

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);
});

Browser Provider

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();

Fallback Provider

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;
}

Default Provider

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"
});

Provider Methods

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;
}

Event Listening

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);
});

Network Configuration

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);

Third-Party Providers

Ethers supports numerous third-party infrastructure providers for connecting to Ethereum and other blockchain networks.

Infura Provider

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:

  • Ethereum: mainnet, goerli, sepolia
  • Arbitrum: arbitrum, arbitrum-goerli, arbitrum-sepolia
  • Base: base, base-goerli, base-sepolia
  • BNB Smart Chain: bnb, bnbt
  • Linea: linea, linea-goerli, linea-sepolia
  • Optimism: optimism, optimism-goerli, optimism-sepolia
  • Polygon: matic, matic-amoy, matic-mumbai

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");

Alchemy Provider

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:

  • Ethereum: mainnet, goerli, sepolia
  • Arbitrum: arbitrum, arbitrum-goerli, arbitrum-sepolia
  • Base: base, base-goerli, base-sepolia
  • Optimism: optimism, optimism-goerli, optimism-sepolia
  • Polygon: matic, matic-amoy, matic-mumbai

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]);

Etherscan Provider

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"));

Additional Third-Party Providers

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");