export interface ErrorWithCode { code: number message: string } export interface ErrorWithData extends ErrorWithCode { data: T } export interface ErrorResponse { jsonrpc: '2.0' id: string | number | null result: null error: ErrorWithData } export interface RPCError extends Error { code: number statusCode: number response: ErrorResponse } export function isRPCError(err: any): err is RPCError { return err.name === 'RPCError' && typeof err.message === 'string' && Object.prototype.hasOwnProperty.call(err, 'code') && Object.prototype.hasOwnProperty.call(err, 'response') } export function createError( error: ErrorWithCode, info: { id: number | string | null data: T statusCode: number }, ): RPCError { const err = new Error(error.message) as RPCError err.name = 'RPCError' err.code = error.code err.statusCode = info.statusCode err.response = { jsonrpc: '2.0', id: info.id, error: { message: error.message, code: error.code, data: info.data, }, result: null, } return err }