UNPKG

hardhat

Version:

Hardhat is an extensible developer tool that helps smart contract developers increase productivity by reliably bringing together the tools they want.

148 lines (120 loc) 3.09 kB
import type { FailedJsonRpcResponse, JsonRpcRequest, JsonRpcResponse, RequestArguments, SuccessfulJsonRpcResponse, } from "../../../types/providers.js"; import { HardhatError } from "@nomicfoundation/hardhat-errors"; import { isObject } from "@nomicfoundation/hardhat-utils/lang"; /** * Gets a JSON-RPC 2.0 request object. * See https://www.jsonrpc.org/specification#request_object */ export function getJsonRpcRequest( id: number | string, method: string, params?: unknown[] | object, ): JsonRpcRequest { const requestObject: JsonRpcRequest = { jsonrpc: "2.0", id, method, }; requestObject.params = getRequestParams({ method, params }); if (id !== undefined) { requestObject.id = id; } return requestObject; } export function parseJsonRpcResponse(text: string): JsonRpcResponse { try { const json: unknown = JSON.parse(text); if (!isJsonRpcResponse(json)) { /* eslint-disable-next-line no-restricted-syntax -- allow throwing a generic error here as it will be handled in the catch block */ throw new Error("Invalid JSON-RPC response"); } return json; } catch { throw new HardhatError( HardhatError.ERRORS.CORE.NETWORK.INVALID_JSON_RESPONSE, { response: text, }, ); } } export function isJsonRpcRequest(payload: unknown): payload is JsonRpcRequest { if (!isObject(payload)) { return false; } if (payload.jsonrpc !== "2.0") { return false; } if (typeof payload.id !== "number" && typeof payload.id !== "string") { return false; } if (typeof payload.method !== "string") { return false; } if (!Array.isArray(payload.params)) { return false; } return true; } export function isJsonRpcResponse( payload: unknown, ): payload is JsonRpcResponse { if (!isObject(payload)) { return false; } if (payload.jsonrpc !== "2.0") { return false; } if ( typeof payload.id !== "number" && typeof payload.id !== "string" && payload.id !== null ) { return false; } if (payload.result === undefined && payload.error === undefined) { return false; } if (payload.error !== undefined) { if (!isObject(payload.error)) { return false; } if (typeof payload.error.code !== "number") { return false; } if (typeof payload.error.message !== "string") { return false; } } return true; } export function isSuccessfulJsonRpcResponse( payload: JsonRpcResponse, ): payload is SuccessfulJsonRpcResponse { return "result" in payload; } export function isFailedJsonRpcResponse( payload: JsonRpcResponse, ): payload is FailedJsonRpcResponse { return "error" in payload && payload.error !== undefined; } export function getRequestParams( requestArguments: RequestArguments, ): unknown[] { if (requestArguments.params === undefined) { return []; } if (Array.isArray(requestArguments.params)) { return requestArguments.params; } throw new HardhatError( HardhatError.ERRORS.CORE.NETWORK.INVALID_REQUEST_PARAMS, ); }