@lodestar/beacon-node 1.50.0-dev.08c4bed201 → 1.50.0-dev.09bef4706f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +7 -2
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/validator/index.d.ts.map +1 -1
  5. package/lib/api/impl/validator/index.js +57 -17
  6. package/lib/api/impl/validator/index.js.map +1 -1
  7. package/lib/chain/ColumnReconstructionTracker.d.ts +0 -2
  8. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  9. package/lib/chain/ColumnReconstructionTracker.js +4 -5
  10. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  11. package/lib/chain/beaconProposerCache.d.ts +6 -0
  12. package/lib/chain/beaconProposerCache.d.ts.map +1 -1
  13. package/lib/chain/beaconProposerCache.js +16 -0
  14. package/lib/chain/beaconProposerCache.js.map +1 -1
  15. package/lib/chain/blocks/blockInput/blockInput.d.ts +1 -1
  16. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  17. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  18. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  19. package/lib/chain/blocks/importBlock.js +8 -6
  20. package/lib/chain/blocks/importBlock.js.map +1 -1
  21. package/lib/chain/chain.d.ts +1 -0
  22. package/lib/chain/chain.d.ts.map +1 -1
  23. package/lib/chain/chain.js +16 -2
  24. package/lib/chain/chain.js.map +1 -1
  25. package/lib/chain/interface.d.ts +3 -1
  26. package/lib/chain/interface.d.ts.map +1 -1
  27. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  28. package/lib/chain/prepareNextSlot.js +15 -6
  29. package/lib/chain/prepareNextSlot.js.map +1 -1
  30. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  31. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  32. package/lib/chain/produceBlock/produceBlockBody.d.ts +8 -0
  33. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  34. package/lib/chain/produceBlock/produceBlockBody.js +48 -34
  35. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  36. package/lib/chain/reprocess.d.ts +2 -1
  37. package/lib/chain/reprocess.d.ts.map +1 -1
  38. package/lib/chain/reprocess.js +2 -1
  39. package/lib/chain/reprocess.js.map +1 -1
  40. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  41. package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
  42. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  43. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  44. package/lib/chain/stateCache/persistentCheckpointsCache.js +1 -1
  45. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  46. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  47. package/lib/chain/validatorMonitor.js +6 -4
  48. package/lib/chain/validatorMonitor.js.map +1 -1
  49. package/lib/constants/constants.d.ts +1 -0
  50. package/lib/constants/constants.d.ts.map +1 -1
  51. package/lib/constants/constants.js +1 -0
  52. package/lib/constants/constants.js.map +1 -1
  53. package/lib/db/repositories/blockArchive.js +2 -2
  54. package/lib/db/repositories/blockArchive.js.map +1 -1
  55. package/lib/db/repositories/blockArchiveIndex.d.ts +1 -1
  56. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  57. package/lib/db/repositories/blockArchiveIndex.js +1 -2
  58. package/lib/db/repositories/blockArchiveIndex.js.map +1 -1
  59. package/lib/execution/engine/blobVersionedHashes.d.ts +9 -0
  60. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -0
  61. package/lib/execution/engine/blobVersionedHashes.js +74 -0
  62. package/lib/execution/engine/blobVersionedHashes.js.map +1 -0
  63. package/lib/execution/engine/http.d.ts +45 -13
  64. package/lib/execution/engine/http.d.ts.map +1 -1
  65. package/lib/execution/engine/http.js +236 -198
  66. package/lib/execution/engine/http.js.map +1 -1
  67. package/lib/execution/engine/index.d.ts +3 -2
  68. package/lib/execution/engine/index.d.ts.map +1 -1
  69. package/lib/execution/engine/index.js +33 -8
  70. package/lib/execution/engine/index.js.map +1 -1
  71. package/lib/execution/engine/interface.d.ts +1 -1
  72. package/lib/execution/engine/interface.d.ts.map +1 -1
  73. package/lib/execution/engine/jsonRpcHttpClient.d.ts.map +1 -1
  74. package/lib/execution/engine/jsonRpcHttpClient.js +14 -4
  75. package/lib/execution/engine/jsonRpcHttpClient.js.map +1 -1
  76. package/lib/execution/engine/jsonRpcTransport.d.ts +25 -0
  77. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -0
  78. package/lib/execution/engine/jsonRpcTransport.js +158 -0
  79. package/lib/execution/engine/jsonRpcTransport.js.map +1 -0
  80. package/lib/execution/engine/restHttpClient.d.ts +71 -0
  81. package/lib/execution/engine/restHttpClient.d.ts.map +1 -0
  82. package/lib/execution/engine/restHttpClient.js +201 -0
  83. package/lib/execution/engine/restHttpClient.js.map +1 -0
  84. package/lib/execution/engine/restTransport.d.ts +48 -0
  85. package/lib/execution/engine/restTransport.d.ts.map +1 -0
  86. package/lib/execution/engine/restTransport.js +411 -0
  87. package/lib/execution/engine/restTransport.js.map +1 -0
  88. package/lib/execution/engine/sszTypes.d.ts +1261 -0
  89. package/lib/execution/engine/sszTypes.d.ts.map +1 -0
  90. package/lib/execution/engine/sszTypes.js +216 -0
  91. package/lib/execution/engine/sszTypes.js.map +1 -0
  92. package/lib/execution/engine/transport.d.ts +39 -0
  93. package/lib/execution/engine/transport.d.ts.map +1 -0
  94. package/lib/execution/engine/transport.js +2 -0
  95. package/lib/execution/engine/transport.js.map +1 -0
  96. package/lib/execution/engine/transportMetrics.d.ts +5 -1
  97. package/lib/execution/engine/transportMetrics.d.ts.map +1 -1
  98. package/lib/execution/engine/types.d.ts +2 -0
  99. package/lib/execution/engine/types.d.ts.map +1 -1
  100. package/lib/execution/engine/types.js +31 -63
  101. package/lib/execution/engine/types.js.map +1 -1
  102. package/lib/execution/engine/utils.d.ts.map +1 -1
  103. package/lib/execution/engine/utils.js +9 -2
  104. package/lib/execution/engine/utils.js.map +1 -1
  105. package/lib/metrics/metrics/lodestar.d.ts +7 -0
  106. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  107. package/lib/metrics/metrics/lodestar.js +12 -1
  108. package/lib/metrics/metrics/lodestar.js.map +1 -1
  109. package/lib/network/gossip/topic.d.ts +0 -14
  110. package/lib/network/gossip/topic.d.ts.map +1 -1
  111. package/lib/network/processor/gossipHandlers.js +1 -1
  112. package/lib/network/processor/gossipHandlers.js.map +1 -1
  113. package/lib/network/processor/index.js +3 -3
  114. package/lib/network/processor/index.js.map +1 -1
  115. package/lib/network/reqresp/rateLimit.js +2 -2
  116. package/lib/network/reqresp/rateLimit.js.map +1 -1
  117. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  118. package/lib/network/subnets/attnetsService.js +3 -1
  119. package/lib/network/subnets/attnetsService.js.map +1 -1
  120. package/lib/node/notifier.d.ts.map +1 -1
  121. package/lib/node/notifier.js +12 -13
  122. package/lib/node/notifier.js.map +1 -1
  123. package/lib/node/options.d.ts +3 -2
  124. package/lib/node/options.d.ts.map +1 -1
  125. package/lib/node/options.js +2 -2
  126. package/lib/node/options.js.map +1 -1
  127. package/lib/sync/unknownBlock.d.ts.map +1 -1
  128. package/lib/sync/unknownBlock.js +3 -2
  129. package/lib/sync/unknownBlock.js.map +1 -1
  130. package/lib/util/clock.d.ts.map +1 -1
  131. package/lib/util/clock.js +3 -4
  132. package/lib/util/clock.js.map +1 -1
  133. package/lib/util/sszBytes.d.ts +2 -2
  134. package/lib/util/sszBytes.d.ts.map +1 -1
  135. package/lib/util/sszBytes.js +22 -14
  136. package/lib/util/sszBytes.js.map +1 -1
  137. package/package.json +16 -15
  138. package/src/api/impl/beacon/blocks/index.ts +10 -3
  139. package/src/api/impl/validator/index.ts +78 -19
  140. package/src/chain/ColumnReconstructionTracker.ts +4 -6
  141. package/src/chain/beaconProposerCache.ts +19 -1
  142. package/src/chain/blocks/blockInput/blockInput.ts +1 -1
  143. package/src/chain/blocks/importBlock.ts +9 -6
  144. package/src/chain/chain.ts +18 -2
  145. package/src/chain/interface.ts +4 -1
  146. package/src/chain/prepareNextSlot.ts +22 -6
  147. package/src/chain/produceBlock/computeNewStateRoot.ts +9 -2
  148. package/src/chain/produceBlock/produceBlockBody.ts +78 -39
  149. package/src/chain/reprocess.ts +2 -1
  150. package/src/chain/seenCache/seenGossipBlockInput.ts +2 -1
  151. package/src/chain/stateCache/persistentCheckpointsCache.ts +4 -1
  152. package/src/chain/validatorMonitor.ts +7 -4
  153. package/src/constants/constants.ts +1 -0
  154. package/src/db/repositories/blockArchive.ts +2 -2
  155. package/src/db/repositories/blockArchiveIndex.ts +2 -3
  156. package/src/execution/engine/blobVersionedHashes.ts +72 -0
  157. package/src/execution/engine/http.ts +304 -271
  158. package/src/execution/engine/index.ts +42 -7
  159. package/src/execution/engine/interface.ts +1 -1
  160. package/src/execution/engine/jsonRpcHttpClient.ts +12 -5
  161. package/src/execution/engine/jsonRpcTransport.ts +247 -0
  162. package/src/execution/engine/restHttpClient.ts +269 -0
  163. package/src/execution/engine/restTransport.ts +575 -0
  164. package/src/execution/engine/sszTypes.ts +354 -0
  165. package/src/execution/engine/transport.ts +61 -0
  166. package/src/execution/engine/transportMetrics.ts +2 -1
  167. package/src/execution/engine/types.ts +42 -80
  168. package/src/execution/engine/utils.ts +12 -2
  169. package/src/metrics/metrics/lodestar.ts +12 -1
  170. package/src/network/processor/gossipHandlers.ts +1 -1
  171. package/src/network/processor/index.ts +3 -3
  172. package/src/network/reqresp/rateLimit.ts +2 -2
  173. package/src/network/subnets/attnetsService.ts +8 -3
  174. package/src/node/notifier.ts +14 -13
  175. package/src/node/options.ts +10 -1
  176. package/src/sync/unknownBlock.ts +3 -2
  177. package/src/util/clock.ts +3 -4
  178. package/src/util/sszBytes.ts +25 -12
@@ -0,0 +1,201 @@
1
+ import { ErrorAborted, FetchError, LodestarError, TimeoutError, fetch, isValidHttpUrl, retry } from "@lodestar/utils";
2
+ import { JsonRpcHttpClientEvent, JsonRpcHttpClientEventEmitter, } from "./jsonRpcHttpClient.js";
3
+ import { encodeJwtToken } from "./jwt.js";
4
+ export const ENGINE_REST_BASE_PATH = "/engine/v1";
5
+ export const EXECUTION_VERSION_HEADER = "Eth-Execution-Version";
6
+ export const CLIENT_VERSION_HEADER = "X-Engine-Client-Version";
7
+ export const MEDIA_TYPE_SSZ = "application/octet-stream";
8
+ export const MEDIA_TYPE_JSON = "application/json";
9
+ const REQUEST_TIMEOUT = 30 * 1000;
10
+ /** Limits the amount of error detail printed with REST errors */
11
+ const MAX_ERROR_DETAIL_LENGTH = 500;
12
+ /** Non-2xx response, `type` and `detail` are taken from the problem+json body when present */
13
+ export class EngineRestError extends Error {
14
+ status;
15
+ type;
16
+ detail;
17
+ constructor(status, type, detail, routeId) {
18
+ super(`Engine REST error: status=${status} type=${type ?? "unknown"}${detail ? ` detail=${detail}` : ""}, ${routeId}`);
19
+ this.status = status;
20
+ this.type = type;
21
+ this.detail = detail;
22
+ }
23
+ }
24
+ export class EngineRestResponseError extends LodestarError {
25
+ constructor(routeId, reason) {
26
+ super({ code: "ENGINE_REST_INVALID_RESPONSE", routeId, reason }, `Invalid engine REST response: ${reason}, ${routeId}`);
27
+ }
28
+ }
29
+ /**
30
+ * HTTP/1.1 client for the REST engine API. Only transport concerns live here, encoding of
31
+ * request and response bodies is up to the caller.
32
+ */
33
+ export class EngineRestHttpClient {
34
+ urls;
35
+ opts;
36
+ emitter = new JsonRpcHttpClientEventEmitter();
37
+ metrics;
38
+ constructor(urls, opts = {}) {
39
+ this.urls = urls;
40
+ this.opts = opts;
41
+ if (urls.length === 0) {
42
+ throw Error("No urls provided to EngineRestHttpClient");
43
+ }
44
+ for (const [i, url] of urls.entries()) {
45
+ if (!isValidHttpUrl(url)) {
46
+ throw Error(`EngineRestHttpClient.urls[${i}] must be a valid URL: ${url}`);
47
+ }
48
+ }
49
+ this.metrics = opts.metrics ?? null;
50
+ }
51
+ /** Perform request with retries, emitting response and error events consumed by the engine state tracking */
52
+ async request(req, opts) {
53
+ try {
54
+ const response = await this.requestWithRetries(req, opts);
55
+ this.emitter.emit(JsonRpcHttpClientEvent.RESPONSE, { payload: req, response });
56
+ return response;
57
+ }
58
+ catch (error) {
59
+ this.emitter.emit(JsonRpcHttpClientEvent.ERROR, { payload: req, error: error });
60
+ throw error;
61
+ }
62
+ }
63
+ /** Perform request with retries without emitting events, used to probe support for the REST API */
64
+ async requestWithRetries(req, opts) {
65
+ const routeId = opts?.routeId ?? "unknown";
66
+ return retry(() => this.requestAnyUrl(req, opts), {
67
+ retries: opts?.retries ?? this.opts.retries ?? 0,
68
+ retryDelay: opts?.retryDelay ?? this.opts.retryDelay,
69
+ shouldRetry: opts?.shouldRetry ?? isRetryableEngineRestError,
70
+ signal: this.opts.signal,
71
+ onRetry: () => {
72
+ this.metrics?.retryCount.inc({ routeId });
73
+ },
74
+ });
75
+ }
76
+ async requestAnyUrl(req, opts) {
77
+ const routeId = opts?.routeId ?? "unknown";
78
+ let lastError = null;
79
+ for (let i = 0; i < this.urls.length; i++) {
80
+ if (i > 0) {
81
+ this.metrics?.requestUsedFallbackUrl.inc({ routeId });
82
+ }
83
+ try {
84
+ return await this.requestOneUrl(this.urls[i], req, opts);
85
+ }
86
+ catch (e) {
87
+ if (!isRetryableEngineRestError(e)) {
88
+ throw e;
89
+ }
90
+ lastError = e;
91
+ }
92
+ }
93
+ throw lastError ?? Error("Unknown error");
94
+ }
95
+ async requestOneUrl(baseUrl, req, opts) {
96
+ const controller = new AbortController();
97
+ const timeout = setTimeout(() => controller.abort(), opts?.timeout ?? this.opts.timeout ?? REQUEST_TIMEOUT);
98
+ // Not AbortSignal.any(), Node retains every composite until the long-lived parent signal aborts
99
+ const onParentSignalAbort = () => controller.abort();
100
+ this.opts.signal?.addEventListener("abort", onParentSignalAbort, { once: true });
101
+ if (this.opts.signal?.aborted) {
102
+ controller.abort();
103
+ }
104
+ const routeId = opts?.routeId ?? "unknown";
105
+ const timer = this.metrics?.requestTime.startTimer({ routeId });
106
+ this.metrics?.activeRequests.inc({ routeId }, 1);
107
+ try {
108
+ const url = new URL(`${ENGINE_REST_BASE_PATH}${req.path}`, baseUrl);
109
+ for (const [key, value] of Object.entries(req.query ?? {})) {
110
+ url.searchParams.set(key, String(value));
111
+ }
112
+ const headers = {
113
+ Accept: req.responseType === "ssz" ? MEDIA_TYPE_SSZ : MEDIA_TYPE_JSON,
114
+ };
115
+ if (req.body !== undefined) {
116
+ headers["Content-Type"] = MEDIA_TYPE_SSZ;
117
+ }
118
+ if (req.executionFork !== undefined) {
119
+ headers[EXECUTION_VERSION_HEADER] = req.executionFork;
120
+ }
121
+ if (this.opts.clientVersion !== undefined) {
122
+ headers[CLIENT_VERSION_HEADER] = this.opts.clientVersion;
123
+ }
124
+ if (this.opts.jwtSecret) {
125
+ const jwtClaim = { iat: Math.floor(Date.now() / 1000), id: this.opts.jwtId };
126
+ headers.Authorization = `Bearer ${encodeJwtToken(jwtClaim, this.opts.jwtSecret)}`;
127
+ }
128
+ this.metrics?.requestBytes.inc({ routeId }, req.body?.length ?? 0);
129
+ const res = await fetch(url, {
130
+ method: req.method,
131
+ body: req.body,
132
+ headers,
133
+ signal: controller.signal,
134
+ });
135
+ const streamTimer = this.metrics?.streamTime.startTimer({ routeId });
136
+ let body;
137
+ try {
138
+ body = new Uint8Array(await res.arrayBuffer());
139
+ }
140
+ catch (e) {
141
+ throw new FetchError(url, e);
142
+ }
143
+ finally {
144
+ streamTimer?.();
145
+ }
146
+ this.metrics?.responseBytes.inc({ routeId }, body.length);
147
+ if (!res.ok) {
148
+ const { type, detail } = parseProblemBody(body);
149
+ throw new EngineRestError(res.status, type, detail, routeId);
150
+ }
151
+ if (res.status !== 200 && res.status !== 204) {
152
+ throw new EngineRestResponseError(routeId, `Unexpected status ${res.status}`);
153
+ }
154
+ const contentType = res.headers.get("content-type")?.split(";", 1)[0].trim().toLowerCase();
155
+ const expectedContentType = req.responseType === "ssz" ? MEDIA_TYPE_SSZ : MEDIA_TYPE_JSON;
156
+ if (res.status !== 204 && contentType !== expectedContentType) {
157
+ throw new EngineRestResponseError(routeId, `Unexpected content type ${contentType}`);
158
+ }
159
+ return { status: res.status, body };
160
+ }
161
+ catch (e) {
162
+ this.metrics?.requestErrors.inc({ routeId });
163
+ if (controller.signal.aborted) {
164
+ if (this.opts.signal?.aborted) {
165
+ throw new ErrorAborted("request");
166
+ }
167
+ throw new TimeoutError("request");
168
+ }
169
+ throw e;
170
+ }
171
+ finally {
172
+ timer?.();
173
+ this.metrics?.activeRequests.dec({ routeId }, 1);
174
+ clearTimeout(timeout);
175
+ this.opts.signal?.removeEventListener("abort", onParentSignalAbort);
176
+ }
177
+ }
178
+ }
179
+ /** Client errors are deterministic apart from timeouts and rate limits, transport failures and server errors are retried */
180
+ export function isRetryableEngineRestError(e) {
181
+ return ((e instanceof EngineRestError && (e.status >= 500 || e.status === 408 || e.status === 429)) ||
182
+ e instanceof TimeoutError ||
183
+ (e instanceof FetchError && e.type !== "input" && e.type !== "aborted"));
184
+ }
185
+ function parseProblemBody(body) {
186
+ const text = new TextDecoder().decode(body);
187
+ try {
188
+ const problem = JSON.parse(text);
189
+ if (typeof problem === "object" && problem !== null) {
190
+ return {
191
+ type: "type" in problem && typeof problem.type === "string" ? problem.type : null,
192
+ detail: ("detail" in problem && typeof problem.detail === "string" ? problem.detail : text).slice(0, MAX_ERROR_DETAIL_LENGTH) || null,
193
+ };
194
+ }
195
+ }
196
+ catch {
197
+ // Legacy endpoints and proxies may return plain text instead of a problem document.
198
+ }
199
+ return { type: null, detail: text.slice(0, MAX_ERROR_DETAIL_LENGTH) || null };
200
+ }
201
+ //# sourceMappingURL=restHttpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restHttpClient.js","sourceRoot":"","sources":["../../../src/execution/engine/restHttpClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { ForkName } from "@lodestar/params";
2
+ import { ExecutionPayload, ExecutionRequests, Root, RootHex } from "@lodestar/types";
3
+ import { BlobAndProof } from "@lodestar/types/deneb";
4
+ import { BlobAndProofV2 } from "@lodestar/types/fulu";
5
+ import { ClientVersion, PayloadAttributes, PayloadId, VersionedHashes } from "./interface.js";
6
+ import { JsonRpcHttpClientEventEmitter } from "./jsonRpcHttpClient.js";
7
+ import { EngineRestHttpClient } from "./restHttpClient.js";
8
+ import { ExecutionForkName } from "./sszTypes.js";
9
+ import { ForkchoiceUpdatedResult, GetPayloadResult, IEngineTransport, PayloadStatusResult } from "./transport.js";
10
+ import { EngineTransportMetrics } from "./transportMetrics.js";
11
+ import { ExecutionPayloadBodyV2 } from "./types.js";
12
+ export type EngineCapabilities = {
13
+ supportedForks: Set<string>;
14
+ blobsRevisions: Set<string>;
15
+ limits: {
16
+ bodiesMaxCount: number;
17
+ blobsMaxVersionedHashes: number;
18
+ payloadMaxBytes: number;
19
+ };
20
+ };
21
+ export declare function toExecutionForkName(fork: ForkName): ExecutionForkName;
22
+ /** The header format is not pinned by the spec, the JSON `ClientVersionV1` shape is what ELs parse today */
23
+ export declare function formatClientVersionHeader(clientVersion: ClientVersion): string;
24
+ /**
25
+ * REST engine API with SSZ encoded bodies
26
+ * https://github.com/ethereum/execution-apis/blob/main/src/engine/refactor.md
27
+ */
28
+ export declare class RestEngineTransport implements IEngineTransport {
29
+ private readonly client;
30
+ private readonly metrics?;
31
+ private limits;
32
+ constructor(client: EngineRestHttpClient, metrics?: EngineTransportMetrics | null | undefined);
33
+ get emitter(): JsonRpcHttpClientEventEmitter;
34
+ /** Does not emit client events, a missing REST API must not be mistaken for an unhealthy engine */
35
+ getCapabilities(): Promise<EngineCapabilities>;
36
+ newPayload(fork: ForkName, executionPayload: ExecutionPayload, versionedHashes?: VersionedHashes, parentBeaconBlockRoot?: Root, executionRequests?: ExecutionRequests): Promise<PayloadStatusResult>;
37
+ forkchoiceUpdated(fork: ForkName, headBlockHash: RootHex, safeBlockHash: RootHex, finalizedBlockHash: RootHex, payloadAttributes?: PayloadAttributes): Promise<ForkchoiceUpdatedResult>;
38
+ getPayload(fork: ForkName, payloadId: PayloadId): Promise<GetPayloadResult>;
39
+ getPayloadBodiesByHashV2(blockHashes: RootHex[]): Promise<(ExecutionPayloadBodyV2 | null)[]>;
40
+ getBlobsV1(versionedHashes: VersionedHashes): Promise<(BlobAndProof | null)[]>;
41
+ /**
42
+ * Blobs and proofs are views into the response body rather than copies, the response is all-or-nothing
43
+ * so every byte of it is needed. The pooled buffers of the JSON-RPC transport are not used.
44
+ */
45
+ getBlobsV2(versionedHashes: VersionedHashes, _buffers?: Uint8Array[]): Promise<BlobAndProofV2[] | null>;
46
+ getClientVersion(_clientVersion: ClientVersion): Promise<ClientVersion[]>;
47
+ }
48
+ //# sourceMappingURL=restTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restTransport.d.ts","sourceRoot":"","sources":["../../../src/execution/engine/restTransport.ts"],"names":[],"mappings":"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"}