UNPKG

@lodestar/prover

Version:

A Typescript implementation of the Ethereum Consensus light client

66 lines 2.71 kB
import { ZERO_ADDRESS } from "../constants.js"; import { isRequest, isValidBatchResponse, isValidResponse, logRequest, logResponse, mergeBatchReqResp, } from "./json_rpc.js"; import { isNullish } from "./validation.js"; export class ELRpcProvider { constructor(handler, logger) { this.requestId = 0; this.handler = handler; this.logger = logger; } /** * Request the EL RPC Provider * * @template K * @template E * @param {K} method - RPC Method * @param {ELApiParams[K]} params - RPC Params * @param {{raiseError?: E}} [opts] * @return {*} {Promise<E extends false ? JsonRpcResponse<ELApiReturn[K]> : JsonRpcResponseWithResultPayload<ELApiReturn[K]>>} * @memberof ELRpc */ async request(method, params, opts) { const { raiseError } = opts ?? { raiseError: true }; const payload = { jsonrpc: "2.0", method, params, id: this.getRequestId() }; logRequest(payload, this.logger); const response = await this.handler(payload); logResponse(response, this.logger); if (raiseError && !isValidResponse(response)) { throw new Error(`Invalid response from RPC. method=${method} params=${JSON.stringify(params)}`); } return response; } async batchRequest(input, opts) { const payloads = []; for (const req of input) { if (isRequest(req) && isNullish(req.id)) { payloads.push({ jsonrpc: "2.0", method: req.method, params: req.params, id: this.getRequestId() }); } else { payloads.push(req); } } logRequest(payloads, this.logger); const response = await this.handler(payloads); logResponse(response, this.logger); if (isNullish(response)) { throw new Error("Invalid empty response from server."); } if (opts.raiseError && !isValidBatchResponse(payloads, response)) { throw new Error(`Invalid response from RPC. payload=${JSON.stringify(payloads)} response=${JSON.stringify(response)}}`); } return mergeBatchReqResp(payloads, response); } async verifyCompatibility() { try { await this.request("eth_getProof", [ZERO_ADDRESS, [], "latest"], { raiseError: true }); } catch (err) { this.logger.error("Execution compatibility failed.", undefined, err); throw new Error("RPC does not support 'eth_getProof', which is required for the prover to work properly."); } } getRequestId() { return (++this.requestId).toString(); } } //# sourceMappingURL=rpc_provider.js.map