import { EventEmitter } from 'eventemitter3'; export interface RequestArguments { readonly method: string; readonly params?: readonly unknown[] | object; } export interface ProviderRpcError extends Error { message: string; code: number; data?: unknown; } interface ProviderConnectInfo { readonly chainId: string; } type ProviderEventMap = { connect: ProviderConnectInfo; disconnect: ProviderRpcError; chainChanged: string; // hex string accountsChanged: string[]; }; export class ProviderEventEmitter extends EventEmitter< keyof ProviderEventMap > {} export interface ProviderInterface extends ProviderEventEmitter { request(args: RequestArguments): Promise; disconnect(): Promise; emit( event: K, ...args: [ProviderEventMap[K]] ): boolean; on( event: K, listener: (_: ProviderEventMap[K]) => void ): this; }