|
1 | | -import {capella, deneb, electra, Wei, bellatrix, Root, ExecutionPayload, ExecutionRequests} from "@lodestar/types"; |
| 1 | +import {capella, deneb, electra, Wei, bellatrix, Root, ExecutionPayload, ExecutionRequests, ssz} from "@lodestar/types"; |
2 | 2 | import { |
3 | 3 | BYTES_PER_LOGS_BLOOM, |
4 | 4 | FIELD_ELEMENTS_PER_BLOB, |
@@ -116,7 +116,7 @@ type ExecutionPayloadRpcWithValue = { |
116 | 116 | // even though CL tracks this as executionPayloadValue, EL returns this as blockValue |
117 | 117 | blockValue: QUANTITY; |
118 | 118 | blobsBundle?: BlobsBundleRpc; |
119 | | - requests?: ExecutionRequestsRpc; |
| 119 | + executionRequests?: ExecutionRequestsRpc; |
120 | 120 | shouldOverrideBuilder?: boolean; |
121 | 121 | }; |
122 | 122 | type ExecutionPayloadResponse = ExecutionPayloadRpc | ExecutionPayloadRpcWithValue; |
@@ -159,29 +159,17 @@ export type WithdrawalRpc = { |
159 | 159 | amount: QUANTITY; |
160 | 160 | }; |
161 | 161 |
|
162 | | -export type ExecutionRequestsRpc = { |
163 | | - deposits: DepositRequestRpc[]; |
164 | | - withdrawals: WithdrawalRequestRpc[]; |
165 | | - consolidations: ConsolidationRequestRpc[]; |
166 | | -}; |
| 162 | +/** |
| 163 | + * ExecutionRequestsRpc only holds 3 elements in the following order: |
| 164 | + * - ssz'ed DepositRequests |
| 165 | + * - ssz'ed WithdrawalRequests |
| 166 | + * - ssz'ed ConsolidationRequests |
| 167 | + */ |
| 168 | +export type ExecutionRequestsRpc = [DepositRequestsRpc, WithdrawalRequestsRpc, ConsolidationRequestsRpc]; |
167 | 169 |
|
168 | | -export type DepositRequestRpc = { |
169 | | - pubkey: DATA; |
170 | | - withdrawalCredentials: DATA; |
171 | | - amount: QUANTITY; |
172 | | - signature: DATA; |
173 | | - index: QUANTITY; |
174 | | -}; |
175 | | -export type WithdrawalRequestRpc = { |
176 | | - sourceAddress: DATA; |
177 | | - validatorPubkey: DATA; |
178 | | - amount: QUANTITY; |
179 | | -}; |
180 | | -export type ConsolidationRequestRpc = { |
181 | | - sourceAddress: DATA; |
182 | | - sourcePubkey: DATA; |
183 | | - targetPubkey: DATA; |
184 | | -}; |
| 170 | +export type DepositRequestsRpc = DATA; |
| 171 | +export type WithdrawalRequestsRpc = DATA; |
| 172 | +export type ConsolidationRequestsRpc = DATA; |
185 | 173 |
|
186 | 174 | export type VersionedHashesRpc = DATA[]; |
187 | 175 |
|
@@ -278,7 +266,9 @@ export function parseExecutionPayload( |
278 | 266 | executionPayloadValue = quantityToBigint(response.blockValue); |
279 | 267 | data = response.executionPayload; |
280 | 268 | blobsBundle = response.blobsBundle ? parseBlobsBundle(response.blobsBundle) : undefined; |
281 | | - executionRequests = response.requests ? deserializeExecutionRequests(response.requests) : undefined; |
| 269 | + executionRequests = response.executionRequests |
| 270 | + ? deserializeExecutionRequests(response.executionRequests) |
| 271 | + : undefined; |
282 | 272 | shouldOverrideBuilder = response.shouldOverrideBuilder ?? false; |
283 | 273 | } else { |
284 | 274 | data = response; |
@@ -404,73 +394,53 @@ export function deserializeWithdrawal(serialized: WithdrawalRpc): capella.Withdr |
404 | 394 | } as capella.Withdrawal; |
405 | 395 | } |
406 | 396 |
|
407 | | -function serializeDepositRequest(depositRequest: electra.DepositRequest): DepositRequestRpc { |
408 | | - return { |
409 | | - pubkey: bytesToData(depositRequest.pubkey), |
410 | | - withdrawalCredentials: bytesToData(depositRequest.withdrawalCredentials), |
411 | | - amount: numToQuantity(depositRequest.amount), |
412 | | - signature: bytesToData(depositRequest.signature), |
413 | | - index: numToQuantity(depositRequest.index), |
414 | | - }; |
| 397 | +function serializeDepositRequests(depositRequests: electra.DepositRequests): DepositRequestsRpc { |
| 398 | + return bytesToData(ssz.electra.DepositRequests.serialize(depositRequests)); |
415 | 399 | } |
416 | 400 |
|
417 | | -function deserializeDepositRequest(serialized: DepositRequestRpc): electra.DepositRequest { |
418 | | - return { |
419 | | - pubkey: dataToBytes(serialized.pubkey, 48), |
420 | | - withdrawalCredentials: dataToBytes(serialized.withdrawalCredentials, 32), |
421 | | - amount: quantityToNum(serialized.amount), |
422 | | - signature: dataToBytes(serialized.signature, 96), |
423 | | - index: quantityToNum(serialized.index), |
424 | | - } as electra.DepositRequest; |
| 401 | +function deserializeDepositRequests(serialized: DepositRequestsRpc): electra.DepositRequests { |
| 402 | + return ssz.electra.DepositRequests.deserialize(dataToBytes(serialized, null)); |
425 | 403 | } |
426 | 404 |
|
427 | | -function serializeWithdrawalRequest(withdrawalRequest: electra.WithdrawalRequest): WithdrawalRequestRpc { |
428 | | - return { |
429 | | - sourceAddress: bytesToData(withdrawalRequest.sourceAddress), |
430 | | - validatorPubkey: bytesToData(withdrawalRequest.validatorPubkey), |
431 | | - amount: numToQuantity(withdrawalRequest.amount), |
432 | | - }; |
| 405 | +function serializeWithdrawalRequests(withdrawalRequests: electra.WithdrawalRequests): WithdrawalRequestsRpc { |
| 406 | + return bytesToData(ssz.electra.WithdrawalRequests.serialize(withdrawalRequests)); |
433 | 407 | } |
434 | 408 |
|
435 | | -function deserializeWithdrawalRequest(withdrawalRequest: WithdrawalRequestRpc): electra.WithdrawalRequest { |
436 | | - return { |
437 | | - sourceAddress: dataToBytes(withdrawalRequest.sourceAddress, 20), |
438 | | - validatorPubkey: dataToBytes(withdrawalRequest.validatorPubkey, 48), |
439 | | - amount: quantityToBigint(withdrawalRequest.amount), |
440 | | - }; |
| 409 | +function deserializeWithdrawalRequest(serialized: WithdrawalRequestsRpc): electra.WithdrawalRequests { |
| 410 | + return ssz.electra.WithdrawalRequests.deserialize(dataToBytes(serialized, null)); |
441 | 411 | } |
442 | 412 |
|
443 | | -function serializeConsolidationRequest(consolidationRequest: electra.ConsolidationRequest): ConsolidationRequestRpc { |
444 | | - return { |
445 | | - sourceAddress: bytesToData(consolidationRequest.sourceAddress), |
446 | | - sourcePubkey: bytesToData(consolidationRequest.sourcePubkey), |
447 | | - targetPubkey: bytesToData(consolidationRequest.targetPubkey), |
448 | | - }; |
| 413 | +function serializeConsolidationRequests( |
| 414 | + consolidationRequests: electra.ConsolidationRequests |
| 415 | +): ConsolidationRequestsRpc { |
| 416 | + return bytesToData(ssz.electra.ConsolidationRequests.serialize(consolidationRequests)); |
449 | 417 | } |
450 | 418 |
|
451 | | -function deserializeConsolidationRequest(consolidationRequest: ConsolidationRequestRpc): electra.ConsolidationRequest { |
452 | | - return { |
453 | | - sourceAddress: dataToBytes(consolidationRequest.sourceAddress, 20), |
454 | | - sourcePubkey: dataToBytes(consolidationRequest.sourcePubkey, 48), |
455 | | - targetPubkey: dataToBytes(consolidationRequest.targetPubkey, 48), |
456 | | - }; |
| 419 | +function deserializeConsolidationRequests(serialized: ConsolidationRequestsRpc): electra.ConsolidationRequests { |
| 420 | + return ssz.electra.ConsolidationRequests.deserialize(dataToBytes(serialized, null)); |
457 | 421 | } |
458 | 422 |
|
| 423 | +/** |
| 424 | + * This is identical to get_execution_requests_list in |
| 425 | + * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.8/specs/electra/beacon-chain.md#new-get_execution_requests_list |
| 426 | + */ |
459 | 427 | export function serializeExecutionRequests(executionRequests: ExecutionRequests): ExecutionRequestsRpc { |
460 | 428 | const {deposits, withdrawals, consolidations} = executionRequests; |
461 | | - return { |
462 | | - deposits: deposits.map(serializeDepositRequest), |
463 | | - withdrawals: withdrawals.map(serializeWithdrawalRequest), |
464 | | - consolidations: consolidations.map(serializeConsolidationRequest), |
465 | | - }; |
| 429 | + |
| 430 | + return [ |
| 431 | + serializeDepositRequests(deposits), |
| 432 | + serializeWithdrawalRequests(withdrawals), |
| 433 | + serializeConsolidationRequests(consolidations), |
| 434 | + ]; |
466 | 435 | } |
467 | 436 |
|
468 | | -export function deserializeExecutionRequests(executionRequests: ExecutionRequestsRpc): ExecutionRequests { |
469 | | - const {deposits, withdrawals, consolidations} = executionRequests; |
| 437 | +export function deserializeExecutionRequests(serialized: ExecutionRequestsRpc): ExecutionRequests { |
| 438 | + const [deposits, withdrawals, consolidations] = serialized; |
| 439 | + |
470 | 440 | return { |
471 | | - deposits: deposits.map(deserializeDepositRequest), |
472 | | - withdrawals: withdrawals.map(deserializeWithdrawalRequest), |
473 | | - consolidations: consolidations.map(deserializeConsolidationRequest), |
| 441 | + deposits: deserializeDepositRequests(deposits), |
| 442 | + withdrawals: deserializeWithdrawalRequest(withdrawals), |
| 443 | + consolidations: deserializeConsolidationRequests(consolidations), |
474 | 444 | }; |
475 | 445 | } |
476 | 446 |
|
|
0 commit comments