diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..6cbabdf61 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Status Research & Development GmbH +# Licensed under either of +# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or +# http://www.apache.org/licenses/LICENSE-2.0) +# * MIT license ([LICENSE-MIT](LICENSE-MIT) or +# http://opensource.org/licenses/MIT) +# at your option. This file may not be copied, modified, or distributed except +# according to those terms. +vendor/* \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bb3025379..3db4bac79 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,18 +35,8 @@ jobs: cpu: amd64 - os: windows cpu: amd64 - branch: [~, upstream/version-2-0] - exclude: - - target: - os: macos - branch: upstream/version-2-0 - - target: - os: windows - branch: upstream/version-2-0 + branch: [~] include: - - branch: upstream/version-2-0 - branch-short: version-2-0 - nimflags-extra: --mm:refc - target: os: linux builder: ['self-hosted','ubuntu-22.04'] diff --git a/AllTests-mainnet.md b/AllTests-mainnet.md index c55646046..3de6c0d68 100644 --- a/AllTests-mainnet.md +++ b/AllTests-mainnet.md @@ -89,10 +89,10 @@ OK: 2/2 Fail: 0/2 Skip: 0/2 OK: 1/1 Fail: 0/1 Skip: 0/1 ## Blinded block conversions ```diff -+ Bellatrix toSignedBlindedBlock OK -+ Capella toSignedBlindedBlock OK -+ Deneb toSignedBlindedBlock OK -+ Electra toSignedBlindedBlock OK ++ Bellatrix toSignedBlindedBeaconBlock OK ++ Capella toSignedBlindedBeaconBlock OK ++ Deneb toSignedBlindedBeaconBlock OK ++ Electra toSignedBlindedBeaconBlock OK ``` OK: 4/4 Fail: 0/4 Skip: 0/4 ## Block pool altair processing [Preset: mainnet] @@ -467,16 +467,20 @@ OK: 5/5 Fail: 0/5 Skip: 0/5 + URL parsing OK ``` OK: 5/5 Fail: 0/5 Skip: 0/5 -## Eth1 monitor +## Engine API conversions ```diff -+ Deposits chain OK -+ Rewrite URLs OK + Roundtrip engine RPC V1 and bellatrix ExecutionPayload representations OK + Roundtrip engine RPC V2 and capella ExecutionPayload representations OK + Roundtrip engine RPC V3 and deneb ExecutionPayload representations OK + Roundtrip engine RPC V4 and electra ExecutionPayload representations OK ``` -OK: 6/6 Fail: 0/6 Skip: 0/6 +OK: 4/4 Fail: 0/4 Skip: 0/4 +## Eth1 monitor +```diff ++ Deposits chain OK ++ Rewrite URLs OK +``` +OK: 2/2 Fail: 0/2 Skip: 0/2 ## Eth2 specific discovery tests ```diff + Invalid attnets field OK @@ -936,10 +940,10 @@ OK: 6/6 Fail: 0/6 Skip: 0/6 + Dynamic validator set: updateDynamicValidators() test OK ``` OK: 4/4 Fail: 0/4 Skip: 0/4 -## ValidatorPubKey Bloom filter +## ValidatorPubKey bucket sort ```diff -+ incremental construction with no false positives/negatives OK -+ one-shot construction with no false positives/negatives OK ++ incremental construction OK ++ one-shot construction OK ``` OK: 2/2 Fail: 0/2 Skip: 0/2 ## Zero signature sanity checks diff --git a/CHANGELOG.md b/CHANGELOG.md index f99bc24d4..6e49e395c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,36 @@ +2024-08-29 v24.8.0 +================== + +Nimbus `v24.8.0` is a `low-urgency` release with beacon API improvements and fixes. + +### Improvements + +* Increase speed of processing blocks with deposits by 25%: + https://github.com/status-im/nimbus-eth2/pull/6469 + +* Avoid running light client sync in background when node is synced: + https://github.com/status-im/nimbus-eth2/pull/6505 + +* Add additional Sepolia bootnode: + https://github.com/status-im/nimbus-eth2/pull/6490 + +### Fixes + +* Add timeouts to failed execution layer requests: + https://github.com/status-im/nimbus-eth2/pull/6441 + +* Use correct fork digest when broadcasting blob sidecars, sync committee, and sync contribution messages: + https://github.com/status-im/nimbus-eth2/pull/6440 + +* Fix Holesky genesis state being downloaded multiple times: + https://github.com/status-im/nimbus-eth2/pull/6452 + +* Check blob versioned hashes when optimistic syncing: + https://github.com/status-im/nimbus-eth2/pull/6501 + +* Increase trusted node sync state downloading timeout to 120 seconds: + https://github.com/status-im/nimbus-eth2/pull/6487 + 2024-07-29 v24.7.0 ================== diff --git a/ConsensusSpecPreset-mainnet.md b/ConsensusSpecPreset-mainnet.md index f35de0c85..bd0125e58 100644 --- a/ConsensusSpecPreset-mainnet.md +++ b/ConsensusSpecPreset-mainnet.md @@ -2487,9 +2487,12 @@ OK: 12/12 Fail: 0/12 Skip: 0/12 + Pending consolidations - all_consolidation_cases_together [Preset: mainnet] OK + Pending consolidations - basic_pending_consolidation [Preset: mainnet] OK + Pending consolidations - consolidation_not_yet_withdrawable_validator [Preset: mainnet] OK ++ Pending consolidations - pending_consolidation_compounding_creds [Preset: mainnet] OK ++ Pending consolidations - pending_consolidation_future_epoch [Preset: mainnet] OK ++ Pending consolidations - pending_consolidation_with_pending_deposit [Preset: mainnet] OK + Pending consolidations - skip_consolidation_when_source_slashed [Preset: mainnet] OK ``` -OK: 4/4 Fail: 0/4 Skip: 0/4 +OK: 7/7 Fail: 0/7 Skip: 0/7 ## EF - Electra - Epoch Processing - RANDAO mixes reset [Preset: mainnet] ```diff + RANDAO mixes reset - updated_randao_mixes [Preset: mainnet] OK @@ -3710,4 +3713,4 @@ OK: 69/88 Fail: 0/88 Skip: 19/88 OK: 3/3 Fail: 0/3 Skip: 0/3 ---TOTAL--- -OK: 2988/3008 Fail: 0/3008 Skip: 20/3008 +OK: 2991/3011 Fail: 0/3011 Skip: 20/3011 diff --git a/ConsensusSpecPreset-minimal.md b/ConsensusSpecPreset-minimal.md index 5a9a43b45..2cd032224 100644 --- a/ConsensusSpecPreset-minimal.md +++ b/ConsensusSpecPreset-minimal.md @@ -2598,9 +2598,12 @@ OK: 12/12 Fail: 0/12 Skip: 0/12 + Pending consolidations - all_consolidation_cases_together [Preset: minimal] OK + Pending consolidations - basic_pending_consolidation [Preset: minimal] OK + Pending consolidations - consolidation_not_yet_withdrawable_validator [Preset: minimal] OK ++ Pending consolidations - pending_consolidation_compounding_creds [Preset: minimal] OK ++ Pending consolidations - pending_consolidation_future_epoch [Preset: minimal] OK ++ Pending consolidations - pending_consolidation_with_pending_deposit [Preset: minimal] OK + Pending consolidations - skip_consolidation_when_source_slashed [Preset: minimal] OK ``` -OK: 4/4 Fail: 0/4 Skip: 0/4 +OK: 7/7 Fail: 0/7 Skip: 0/7 ## EF - Electra - Epoch Processing - RANDAO mixes reset [Preset: minimal] ```diff + RANDAO mixes reset - updated_randao_mixes [Preset: minimal] OK @@ -4047,4 +4050,4 @@ OK: 185/207 Fail: 0/207 Skip: 22/207 OK: 3/3 Fail: 0/3 Skip: 0/3 ---TOTAL--- -OK: 3294/3317 Fail: 0/3317 Skip: 23/3317 +OK: 3297/3320 Fail: 0/3320 Skip: 23/3320 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..70c43dfab --- /dev/null +++ b/Dockerfile @@ -0,0 +1,47 @@ +# Copyright (c) 2024 Status Research & Development GmbH +# Licensed under either of +# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or +# http://www.apache.org/licenses/LICENSE-2.0) +# * MIT license ([LICENSE-MIT](LICENSE-MIT) or +# http://opensource.org/licenses/MIT) +# at your option. This file may not be copied, modified, or distributed except +# according to those terms. + +FROM debian:testing-slim AS build + +SHELL ["/bin/bash", "-c"] + +RUN apt-get clean && apt update \ + && apt -y install build-essential git-lfs + +RUN ldd --version ldd + +ADD . /root/nimbus-eth2 + +RUN cd /root/nimbus-eth2 \ + && make -j$(nproc) update \ + && make -j$(nproc) V=1 NIMFLAGS="-d:const_preset=mainnet -d:disableMarchNative" LOG_LEVEL=TRACE nimbus_beacon_node + + +# --------------------------------- # +# Starting new image to reduce size # +# --------------------------------- # +FROM debian:testing-slim as deploy + +SHELL ["/bin/bash", "-c"] +RUN apt-get clean && apt update \ + && apt -y install build-essential +RUN apt update && apt -y upgrade + +RUN ldd --version ldd + +RUN rm -rf /home/user/nimbus-eth2/build/nimbus_beacon_node + +# "COPY" creates new image layers, so we cram all we can into one command +COPY --from=build /root/nimbus-eth2/build/nimbus_beacon_node /home/user/nimbus-eth2/build/nimbus_beacon_node + +ENV PATH="/home/user/nimbus-eth2/build:${PATH}" +ENTRYPOINT ["nimbus_beacon_node"] +WORKDIR /home/user/nimbus-eth2/build + +STOPSIGNAL SIGINT \ No newline at end of file diff --git a/beacon_chain/beacon_chain_db_immutable.nim b/beacon_chain/beacon_chain_db_immutable.nim index 2b3aef7c0..e17f75643 100644 --- a/beacon_chain/beacon_chain_db_immutable.nim +++ b/beacon_chain/beacon_chain_db_immutable.nim @@ -130,7 +130,7 @@ type current_sync_committee*: SyncCommittee # [New in Altair] next_sync_committee*: SyncCommittee # [New in Altair] - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#beaconstate + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#beaconstate # Memory-representation-equivalent to a Bellatrix BeaconState for in-place SSZ # reading and writing BellatrixBeaconStateNoImmutableValidators* = object diff --git a/beacon_chain/beacon_clock.nim b/beacon_chain/beacon_clock.nim index 3aec4e75b..b4337d8a2 100644 --- a/beacon_chain/beacon_clock.nim +++ b/beacon_chain/beacon_clock.nim @@ -27,7 +27,7 @@ type ## which blocks are valid - in particular, blocks are not valid if they ## come from the future as seen from the local clock. ## - ## https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/fork-choice.md#fork-choice + ## https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/fork-choice.md#fork-choice ## # TODO consider NTP and network-adjusted timestamps as outlined here: # https://ethresear.ch/t/network-adjusted-timestamps/4187 diff --git a/beacon_chain/beacon_node_light_client.nim b/beacon_chain/beacon_node_light_client.nim index 6b2c47743..d66f78889 100644 --- a/beacon_chain/beacon_node_light_client.nim +++ b/beacon_chain/beacon_node_light_client.nim @@ -52,9 +52,15 @@ proc initLightClient*( optimisticProcessor = initOptimisticProcessor( getBeaconTime, optimisticHandler) + shouldInhibitSync = func(): bool = + if node.syncManager != nil: + not node.syncManager.inProgress # No LC sync needed if DAG is in sync + else: + false lightClient = createLightClient( node.network, rng, config, cfg, forkDigests, getBeaconTime, - genesis_validators_root, LightClientFinalizationMode.Strict) + genesis_validators_root, LightClientFinalizationMode.Strict, + shouldInhibitSync = shouldInhibitSync) if config.syncLightClient: proc onOptimisticHeader( diff --git a/beacon_chain/bloomfilter.nim b/beacon_chain/bloomfilter.nim deleted file mode 100644 index a4a966329..000000000 --- a/beacon_chain/bloomfilter.nim +++ /dev/null @@ -1,49 +0,0 @@ -# beacon_chain -# Copyright (c) 2024 Status Research & Development GmbH -# Licensed and distributed under either of -# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). -# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). -# at your option. This file may not be copied, modified, or distributed except according to those terms. - -{.push raises: [].} - -import "."/spec/crypto - -from stew/bitops2 import getBit, setBit -from "."/spec/datatypes/base import Validator, pubkey -from "."/spec/helpers import bytes_to_uint32 - -const - # https://hur.st/bloomfilter/?n=4M&p=&m=8MiB&k= - pubkeyBloomFilterScale = 23 # 21 too small, 22 borderline, 24 also ok - -type - PubkeyBloomFilter* = object - data: array[1 shl pubkeyBloomFilterScale, byte] - -iterator bloomFilterHashes(pubkey: ValidatorPubKey): auto = - const pubkeyBloomFilterMask = (1 shl pubkeyBloomFilterScale) - 1 - for r in countup(0'u32, 20'u32, 4'u32): - # ValidatorPubKeys have fairly uniform entropy; using enough hash - # functions also reduces risk of low-entropy portions - yield pubkey.blob.toOpenArray(r, r+3).bytes_to_uint32 and - pubkeyBloomFilterMask - -template incl*(bloomFilter: var PubkeyBloomFilter, pubkey: ValidatorPubKey) = - for bloomFilterHash in bloomFilterHashes(pubkey): - setBit(bloomFilter.data, bloomFilterHash) - -func constructBloomFilter*(x: openArray[Validator]): auto = - let res = new PubkeyBloomFilter - for m in x: - incl(res[], m.pubkey) - res - -func mightContain*( - bloomFilter: PubkeyBloomFilter, pubkey: ValidatorPubKey): bool = - # Might return false positive, but never false negative - for bloomFilterHash in bloomFilterHashes(pubkey): - if not getBit(bloomFilter.data, bloomFilterHash): - return false - - true diff --git a/beacon_chain/conf.nim b/beacon_chain/conf.nim index 405448862..90674714c 100644 --- a/beacon_chain/conf.nim +++ b/beacon_chain/conf.nim @@ -32,8 +32,6 @@ import from std/os import getHomeDir, parentDir, `/` from std/strutils import parseBiggestUInt, replace -from fork_choice/fork_choice_types - import ForkChoiceVersion from consensus_object_pools/block_pools_types_light_client import LightClientDataImportMode @@ -676,12 +674,6 @@ type desc: "Bandwidth estimate for the node (bits per second)" name: "debug-bandwidth-estimate" .}: Option[Natural] - forkChoiceVersion* {. - hidden - desc: "Forkchoice version to use. " & - "Must be one of: stable" - name: "debug-forkchoice-version" .}: Option[ForkChoiceVersion] - of BNStartUpCmd.wallets: case walletsCmd* {.command.}: WalletsCmd of WalletsCmd.create: diff --git a/beacon_chain/consensus_object_pools/attestation_pool.nim b/beacon_chain/consensus_object_pools/attestation_pool.nim index f4c847e45..3e1ad8d65 100644 --- a/beacon_chain/consensus_object_pools/attestation_pool.nim +++ b/beacon_chain/consensus_object_pools/attestation_pool.nim @@ -104,7 +104,6 @@ declareGauge attestation_pool_block_attestation_packing_time, proc init*(T: type AttestationPool, dag: ChainDAGRef, quarantine: ref Quarantine, - forkChoiceVersion = ForkChoiceVersion.Stable, onAttestation: OnPhase0AttestationCallback = nil, onElectraAttestation: OnElectraAttestationCallback = nil): T = ## Initialize an AttestationPool from the dag `headState` @@ -113,7 +112,7 @@ proc init*(T: type AttestationPool, dag: ChainDAGRef, let finalizedEpochRef = dag.getFinalizedEpochRef() var forkChoice = ForkChoice.init( - finalizedEpochRef, dag.finalizedHead.blck, forkChoiceVersion) + finalizedEpochRef, dag.finalizedHead.blck) # Feed fork choice with unfinalized history - during startup, block pool only # keeps track of a single history so we just need to follow it @@ -200,6 +199,7 @@ proc addForkChoiceVotes( error "Couldn't add attestation to fork choice, bug?", err = v.error() func candidateIdx(pool: AttestationPool, slot: Slot): Opt[int] = + static: doAssert pool.phase0Candidates.len == pool.electraCandidates.len if slot >= pool.startingSlot and slot < (pool.startingSlot + pool.phase0Candidates.lenu64): Opt.some(int(slot mod pool.phase0Candidates.lenu64)) @@ -210,8 +210,8 @@ proc updateCurrent(pool: var AttestationPool, wallSlot: Slot) = if wallSlot + 1 < pool.phase0Candidates.lenu64: return # Genesis - let - newStartingSlot = wallSlot + 1 - pool.phase0Candidates.lenu64 + static: doAssert pool.phase0Candidates.len == pool.electraCandidates.len + let newStartingSlot = wallSlot + 1 - pool.phase0Candidates.lenu64 if newStartingSlot < pool.startingSlot: error "Current slot older than attestation pool view, clock reset?", @@ -224,10 +224,12 @@ proc updateCurrent(pool: var AttestationPool, wallSlot: Slot) = if newStartingSlot - pool.startingSlot >= pool.phase0Candidates.lenu64(): # In case many slots passed since the last update, avoid iterating over # the same indices over and over - pool.phase0Candidates = default(type(pool.phase0Candidates)) + pool.phase0Candidates.reset() + pool.electraCandidates.reset() else: for i in pool.startingSlot..newStartingSlot: pool.phase0Candidates[i.uint64 mod pool.phase0Candidates.lenu64].reset() + pool.electraCandidates[i.uint64 mod pool.electraCandidates.lenu64].reset() pool.startingSlot = newStartingSlot @@ -507,6 +509,7 @@ func covers*( if candidateIdx.isNone: return false + debugComment "foo" # needs to know more than attestationdata now #let attestation_data_root = hash_tree_root(data) #pool.electraCandidates[candidateIdx.get()].withValue(attestation_data_root, entry): @@ -651,7 +654,8 @@ func score( proc check_attestation_compatible*( dag: ChainDAGRef, state: ForkyHashedBeaconState, - attestation: SomeAttestation | electra.Attestation | electra.TrustedAttestation): Result[void, cstring] = + attestation: SomeAttestation | electra.Attestation | + electra.TrustedAttestation): Result[void, cstring] = let targetEpoch = attestation.data.target.epoch compatibleRoot = state.dependent_root(targetEpoch.get_previous_epoch) diff --git a/beacon_chain/consensus_object_pools/blockchain_dag.nim b/beacon_chain/consensus_object_pools/blockchain_dag.nim index 0cecc7f12..7498f23bb 100644 --- a/beacon_chain/consensus_object_pools/blockchain_dag.nim +++ b/beacon_chain/consensus_object_pools/blockchain_dag.nim @@ -1178,7 +1178,7 @@ proc init*(T: type ChainDAGRef, cfg: RuntimeConfig, db: BeaconChainDB, # should have `previous_version` set to `current_version` while # this doesn't happen to be the case in network that go through # regular hard-fork upgrades. See for example: - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#testing + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#testing if stateFork.current_version != configFork.current_version: error "State from database does not match network, check --network parameter", tail = dag.tail, headRef, stateFork, configFork @@ -1972,7 +1972,7 @@ proc pruneBlocksDAG(dag: ChainDAGRef) = prunedHeads = hlen - dag.heads.len, dagPruneDur = Moment.now() - startTick -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/sync/optimistic.md#helpers +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/sync/optimistic.md#helpers func is_optimistic*(dag: ChainDAGRef, bid: BlockId): bool = let blck = if bid.slot <= dag.finalizedHead.slot: diff --git a/beacon_chain/consensus_object_pools/consensus_manager.nim b/beacon_chain/consensus_object_pools/consensus_manager.nim index b561e854e..54194df98 100644 --- a/beacon_chain/consensus_object_pools/consensus_manager.nim +++ b/beacon_chain/consensus_object_pools/consensus_manager.nim @@ -15,6 +15,7 @@ import ../beacon_clock, ./common_tools +from ../el/engine_api_conversions import asBlockHash from ../spec/beaconstate import get_expected_withdrawals, has_eth1_withdrawal_credential from ../spec/datatypes/capella import Withdrawal diff --git a/beacon_chain/consensus_object_pools/spec_cache.nim b/beacon_chain/consensus_object_pools/spec_cache.nim index 323546559..525166fba 100644 --- a/beacon_chain/consensus_object_pools/spec_cache.nim +++ b/beacon_chain/consensus_object_pools/spec_cache.nim @@ -53,7 +53,7 @@ iterator get_beacon_committee*( committees_per_slot * SLOTS_PER_EPOCH ): yield (index_in_committee, idx) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#get_beacon_committee +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#get_beacon_committee func get_beacon_committee*( shufflingRef: ShufflingRef, slot: Slot, committee_index: CommitteeIndex): seq[ValidatorIndex] = diff --git a/beacon_chain/consensus_object_pools/sync_committee_msg_pool.nim b/beacon_chain/consensus_object_pools/sync_committee_msg_pool.nim index 89fc6ce7e..2b3a3eb90 100644 --- a/beacon_chain/consensus_object_pools/sync_committee_msg_pool.nim +++ b/beacon_chain/consensus_object_pools/sync_committee_msg_pool.nim @@ -364,7 +364,7 @@ proc produceSyncAggregate*( proc isEpochLeadTime*( pool: SyncCommitteeMsgPool, epochsToSyncPeriod: uint64): bool = - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#sync-committee-subnet-stability + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#sync-committee-subnet-stability # This ensures a uniform distribution without requiring additional state: # (1/4) = 1/4, 4 slots out # (3/4) * (1/3) = 1/4, 3 slots out diff --git a/beacon_chain/el/el_manager.nim b/beacon_chain/el/el_manager.nim index 1a2c99e37..504936470 100644 --- a/beacon_chain/el/el_manager.nim +++ b/beacon_chain/el/el_manager.nim @@ -20,7 +20,7 @@ import ../spec/[eth2_merkleization, forks], ../networking/network_metadata, ".."/beacon_node_status, - "."/[eth1_chain, el_conf] + "."/[el_conf, engine_api_conversions, eth1_chain] from std/times import getTime, inSeconds, initTime, `-` from ../spec/engine_authentication import getSignedIatToken @@ -40,6 +40,12 @@ type Int64LeBytes = DynamicBytes[8, 8] WithoutTimeout* = distinct int + SomeEnginePayloadWithValue = + BellatrixExecutionPayloadWithValue | + GetPayloadV2Response | + GetPayloadV3Response | + GetPayloadV4Response + contract(DepositContract): proc deposit(pubkey: PubKeyBytes, withdrawalCredentials: WithdrawalCredentialsBytes, @@ -198,16 +204,6 @@ type merkleTreeIndex: Int64LeBytes, j: JsonNode) {.gcsafe, raises: [].} - BellatrixExecutionPayloadWithValue* = object - executionPayload*: ExecutionPayloadV1 - blockValue*: UInt256 - - SomeEnginePayloadWithValue = - BellatrixExecutionPayloadWithValue | - GetPayloadV2Response | - GetPayloadV3Response | - GetPayloadV4Response - declareCounter failed_web3_requests, "Failed web3 requests" @@ -376,340 +372,6 @@ template eth1ChainBlocks*(m: ELManager): Deque[Eth1Block] = # doAssert SECONDS_PER_ETH1_BLOCK * cfg.ETH1_FOLLOW_DISTANCE < GENESIS_DELAY, # "Invalid configuration: GENESIS_DELAY is set too low" -func asConsensusWithdrawal(w: WithdrawalV1): capella.Withdrawal = - capella.Withdrawal( - index: w.index.uint64, - validator_index: w.validatorIndex.uint64, - address: ExecutionAddress(data: w.address.distinctBase), - amount: Gwei w.amount) - -func asEngineWithdrawal(w: capella.Withdrawal): WithdrawalV1 = - WithdrawalV1( - index: Quantity(w.index), - validatorIndex: Quantity(w.validator_index), - address: Address(w.address.data), - amount: Quantity(w.amount)) - -func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV1): - bellatrix.ExecutionPayload = - template getTransaction(tt: TypedTransaction): bellatrix.Transaction = - bellatrix.Transaction.init(tt.distinctBase) - - bellatrix.ExecutionPayload( - parent_hash: rpcExecutionPayload.parentHash.asEth2Digest, - feeRecipient: - ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase), - state_root: rpcExecutionPayload.stateRoot.asEth2Digest, - receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest, - logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase), - prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest, - block_number: rpcExecutionPayload.blockNumber.uint64, - gas_limit: rpcExecutionPayload.gasLimit.uint64, - gas_used: rpcExecutionPayload.gasUsed.uint64, - timestamp: rpcExecutionPayload.timestamp.uint64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes), - base_fee_per_gas: rpcExecutionPayload.baseFeePerGas, - block_hash: rpcExecutionPayload.blockHash.asEth2Digest, - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init( - mapIt(rpcExecutionPayload.transactions, it.getTransaction))) - -func asConsensusType*(payloadWithValue: BellatrixExecutionPayloadWithValue): - bellatrix.ExecutionPayloadForSigning = - bellatrix.ExecutionPayloadForSigning( - executionPayload: payloadWithValue.executionPayload.asConsensusType, - blockValue: payloadWithValue.blockValue) - -template maybeDeref[T](o: Opt[T]): T = o.get -template maybeDeref[V](v: V): V = v - -func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV1OrV2|ExecutionPayloadV2): - capella.ExecutionPayload = - template getTransaction(tt: TypedTransaction): bellatrix.Transaction = - bellatrix.Transaction.init(tt.distinctBase) - - capella.ExecutionPayload( - parent_hash: rpcExecutionPayload.parentHash.asEth2Digest, - feeRecipient: - ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase), - state_root: rpcExecutionPayload.stateRoot.asEth2Digest, - receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest, - logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase), - prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest, - block_number: rpcExecutionPayload.blockNumber.uint64, - gas_limit: rpcExecutionPayload.gasLimit.uint64, - gas_used: rpcExecutionPayload.gasUsed.uint64, - timestamp: rpcExecutionPayload.timestamp.uint64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes), - base_fee_per_gas: rpcExecutionPayload.baseFeePerGas, - block_hash: rpcExecutionPayload.blockHash.asEth2Digest, - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init( - mapIt(rpcExecutionPayload.transactions, it.getTransaction)), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init( - mapIt(maybeDeref rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal))) - -func asConsensusType*(payloadWithValue: engine_api.GetPayloadV2Response): - capella.ExecutionPayloadForSigning = - capella.ExecutionPayloadForSigning( - executionPayload: payloadWithValue.executionPayload.asConsensusType, - blockValue: payloadWithValue.blockValue) - -func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV3): - deneb.ExecutionPayload = - template getTransaction(tt: TypedTransaction): bellatrix.Transaction = - bellatrix.Transaction.init(tt.distinctBase) - - deneb.ExecutionPayload( - parent_hash: rpcExecutionPayload.parentHash.asEth2Digest, - feeRecipient: - ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase), - state_root: rpcExecutionPayload.stateRoot.asEth2Digest, - receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest, - logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase), - prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest, - block_number: rpcExecutionPayload.blockNumber.uint64, - gas_limit: rpcExecutionPayload.gasLimit.uint64, - gas_used: rpcExecutionPayload.gasUsed.uint64, - timestamp: rpcExecutionPayload.timestamp.uint64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes), - base_fee_per_gas: rpcExecutionPayload.baseFeePerGas, - block_hash: rpcExecutionPayload.blockHash.asEth2Digest, - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init( - mapIt(rpcExecutionPayload.transactions, it.getTransaction)), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init( - mapIt(rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal)), - blob_gas_used: rpcExecutionPayload.blobGasUsed.uint64, - excess_blob_gas: rpcExecutionPayload.excessBlobGas.uint64) - -func asConsensusType*(payload: engine_api.GetPayloadV3Response): - deneb.ExecutionPayloadForSigning = - deneb.ExecutionPayloadForSigning( - executionPayload: payload.executionPayload.asConsensusType, - blockValue: payload.blockValue, - # TODO - # The `mapIt` calls below are necessary only because we use different distinct - # types for KZG commitments and Blobs in the `web3` and the `deneb` spec types. - # Both are defined as `array[N, byte]` under the hood. - blobsBundle: deneb.BlobsBundle( - commitments: KzgCommitments.init( - payload.blobsBundle.commitments.mapIt( - kzg_abi.KzgCommitment(bytes: it.bytes))), - proofs: KzgProofs.init( - payload.blobsBundle.proofs.mapIt( - kzg_abi.KzgProof(bytes: it.bytes))), - blobs: Blobs.init( - payload.blobsBundle.blobs.mapIt(it.bytes)))) - -func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV4): - electra.ExecutionPayload = - template getTransaction(tt: TypedTransaction): bellatrix.Transaction = - bellatrix.Transaction.init(tt.distinctBase) - - template getDepositRequest( - dr: DepositRequestV1): electra.DepositRequest = - electra.DepositRequest( - pubkey: ValidatorPubKey(blob: dr.pubkey.distinctBase), - withdrawal_credentials: dr.withdrawalCredentials.asEth2Digest, - amount: dr.amount.Gwei, - signature: ValidatorSig(blob: dr.signature.distinctBase), - index: dr.index.uint64) - - template getWithdrawalRequest( - wr: WithdrawalRequestV1): electra.WithdrawalRequest = - electra.WithdrawalRequest( - source_address: ExecutionAddress(data: wr.sourceAddress.distinctBase), - validator_pubkey: ValidatorPubKey(blob: wr.validatorPubkey.distinctBase), - amount: wr.amount.Gwei) - - template getConsolidationRequest( - cr: ConsolidationRequestV1): electra.ConsolidationRequest = - electra.ConsolidationRequest( - source_address: ExecutionAddress(data: cr.sourceAddress.distinctBase), - source_pubkey: ValidatorPubKey(blob: cr.sourcePubkey.distinctBase), - target_pubkey: ValidatorPubKey(blob: cr.targetPubkey.distinctBase)) - - electra.ExecutionPayload( - parent_hash: rpcExecutionPayload.parentHash.asEth2Digest, - feeRecipient: - ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase), - state_root: rpcExecutionPayload.stateRoot.asEth2Digest, - receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest, - logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase), - prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest, - block_number: rpcExecutionPayload.blockNumber.uint64, - gas_limit: rpcExecutionPayload.gasLimit.uint64, - gas_used: rpcExecutionPayload.gasUsed.uint64, - timestamp: rpcExecutionPayload.timestamp.uint64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init( - rpcExecutionPayload.extraData.bytes), - base_fee_per_gas: rpcExecutionPayload.baseFeePerGas, - block_hash: rpcExecutionPayload.blockHash.asEth2Digest, - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init( - mapIt(rpcExecutionPayload.transactions, it.getTransaction)), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init( - mapIt(rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal)), - blob_gas_used: rpcExecutionPayload.blobGasUsed.uint64, - excess_blob_gas: rpcExecutionPayload.excessBlobGas.uint64, - deposit_requests: - List[electra.DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init( - mapIt(rpcExecutionPayload.depositRequests, it.getDepositRequest)), - withdrawal_requests: List[electra.WithdrawalRequest, - MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init( - mapIt(rpcExecutionPayload.withdrawalRequests, - it.getWithdrawalRequest)), - consolidation_requests: List[electra.ConsolidationRequest, - Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init( - mapIt(rpcExecutionPayload.consolidationRequests, - it.getConsolidationRequest))) - -func asConsensusType*(payload: engine_api.GetPayloadV4Response): - electra.ExecutionPayloadForSigning = - electra.ExecutionPayloadForSigning( - executionPayload: payload.executionPayload.asConsensusType, - blockValue: payload.blockValue, - # TODO - # The `mapIt` calls below are necessary only because we use different distinct - # types for KZG commitments and Blobs in the `web3` and the `deneb` spec types. - # Both are defined as `array[N, byte]` under the hood. - blobsBundle: deneb.BlobsBundle( - commitments: KzgCommitments.init( - payload.blobsBundle.commitments.mapIt( - kzg_abi.KzgCommitment(bytes: it.bytes))), - proofs: KzgProofs.init( - payload.blobsBundle.proofs.mapIt( - kzg_abi.KzgProof(bytes: it.bytes))), - blobs: Blobs.init( - payload.blobsBundle.blobs.mapIt(it.bytes)))) - -func asEngineExecutionPayload*(executionPayload: bellatrix.ExecutionPayload): - ExecutionPayloadV1 = - template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction = - TypedTransaction(tt.distinctBase) - - engine_api.ExecutionPayloadV1( - parentHash: executionPayload.parent_hash.asBlockHash, - feeRecipient: Address(executionPayload.fee_recipient.data), - stateRoot: executionPayload.state_root.asBlockHash, - receiptsRoot: executionPayload.receipts_root.asBlockHash, - logsBloom: - FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data), - prevRandao: executionPayload.prev_randao.asBlockHash, - blockNumber: Quantity(executionPayload.block_number), - gasLimit: Quantity(executionPayload.gas_limit), - gasUsed: Quantity(executionPayload.gas_used), - timestamp: Quantity(executionPayload.timestamp), - extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data), - baseFeePerGas: executionPayload.base_fee_per_gas, - blockHash: executionPayload.block_hash.asBlockHash, - transactions: mapIt(executionPayload.transactions, it.getTypedTransaction)) - -template toEngineWithdrawal(w: capella.Withdrawal): WithdrawalV1 = - WithdrawalV1( - index: Quantity(w.index), - validatorIndex: Quantity(w.validator_index), - address: Address(w.address.data), - amount: Quantity(w.amount)) - -func asEngineExecutionPayload*(executionPayload: capella.ExecutionPayload): - ExecutionPayloadV2 = - template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction = - TypedTransaction(tt.distinctBase) - engine_api.ExecutionPayloadV2( - parentHash: executionPayload.parent_hash.asBlockHash, - feeRecipient: Address(executionPayload.fee_recipient.data), - stateRoot: executionPayload.state_root.asBlockHash, - receiptsRoot: executionPayload.receipts_root.asBlockHash, - logsBloom: - FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data), - prevRandao: executionPayload.prev_randao.asBlockHash, - blockNumber: Quantity(executionPayload.block_number), - gasLimit: Quantity(executionPayload.gas_limit), - gasUsed: Quantity(executionPayload.gas_used), - timestamp: Quantity(executionPayload.timestamp), - extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data), - baseFeePerGas: executionPayload.base_fee_per_gas, - blockHash: executionPayload.block_hash.asBlockHash, - transactions: mapIt(executionPayload.transactions, it.getTypedTransaction), - withdrawals: mapIt(executionPayload.withdrawals, it.toEngineWithdrawal)) - -func asEngineExecutionPayload*(executionPayload: deneb.ExecutionPayload): - ExecutionPayloadV3 = - template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction = - TypedTransaction(tt.distinctBase) - - engine_api.ExecutionPayloadV3( - parentHash: executionPayload.parent_hash.asBlockHash, - feeRecipient: Address(executionPayload.fee_recipient.data), - stateRoot: executionPayload.state_root.asBlockHash, - receiptsRoot: executionPayload.receipts_root.asBlockHash, - logsBloom: - FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data), - prevRandao: executionPayload.prev_randao.asBlockHash, - blockNumber: Quantity(executionPayload.block_number), - gasLimit: Quantity(executionPayload.gas_limit), - gasUsed: Quantity(executionPayload.gas_used), - timestamp: Quantity(executionPayload.timestamp), - extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data), - baseFeePerGas: executionPayload.base_fee_per_gas, - blockHash: executionPayload.block_hash.asBlockHash, - transactions: mapIt(executionPayload.transactions, it.getTypedTransaction), - withdrawals: mapIt(executionPayload.withdrawals, it.asEngineWithdrawal), - blobGasUsed: Quantity(executionPayload.blob_gas_used), - excessBlobGas: Quantity(executionPayload.excess_blob_gas)) - -func asEngineExecutionPayload*(executionPayload: electra.ExecutionPayload): - ExecutionPayloadV4 = - template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction = - TypedTransaction(tt.distinctBase) - - template getDepositRequest( - dr: electra.DepositRequest): DepositRequestV1 = - DepositRequestV1( - pubkey: FixedBytes[RawPubKeySize](dr.pubkey.blob), - withdrawalCredentials: FixedBytes[32](dr.withdrawal_credentials.data), - amount: dr.amount.Quantity, - signature: FixedBytes[RawSigSize](dr.signature.blob), - index: dr.index.Quantity) - - template getWithdrawalRequest( - wr: electra.WithdrawalRequest): WithdrawalRequestV1 = - WithdrawalRequestV1( - sourceAddress: Address(wr.source_address.data), - validatorPubkey: FixedBytes[RawPubKeySize](wr.validator_pubkey.blob), - amount: wr.amount.Quantity) - - template getConsolidationRequest( - cr: electra.ConsolidationRequest): ConsolidationRequestV1 = - ConsolidationRequestV1( - sourceAddress: Address(cr.source_address.data), - sourcePubkey: FixedBytes[RawPubKeySize](cr.source_pubkey.blob), - targetPubkey: FixedBytes[RawPubKeySize](cr.target_pubkey.blob)) - - engine_api.ExecutionPayloadV4( - parentHash: executionPayload.parent_hash.asBlockHash, - feeRecipient: Address(executionPayload.fee_recipient.data), - stateRoot: executionPayload.state_root.asBlockHash, - receiptsRoot: executionPayload.receipts_root.asBlockHash, - logsBloom: - FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data), - prevRandao: executionPayload.prev_randao.asBlockHash, - blockNumber: Quantity(executionPayload.block_number), - gasLimit: Quantity(executionPayload.gas_limit), - gasUsed: Quantity(executionPayload.gas_used), - timestamp: Quantity(executionPayload.timestamp), - extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data), - baseFeePerGas: executionPayload.base_fee_per_gas, - blockHash: executionPayload.block_hash.asBlockHash, - transactions: mapIt(executionPayload.transactions, it.getTypedTransaction), - withdrawals: mapIt(executionPayload.withdrawals, it.asEngineWithdrawal), - blobGasUsed: Quantity(executionPayload.blob_gas_used), - excessBlobGas: Quantity(executionPayload.excess_blob_gas), - depositRequests: mapIt( - executionPayload.deposit_requests, it.getDepositRequest), - withdrawalRequests: mapIt( - executionPayload.withdrawal_requests, it.getWithdrawalRequest), - consolidationRequests: mapIt( - executionPayload.consolidation_requests, it.getConsolidationRequest)) - func isConnected(connection: ELConnection): bool = connection.web3.isSome diff --git a/beacon_chain/el/engine_api_conversions.nim b/beacon_chain/el/engine_api_conversions.nim new file mode 100644 index 000000000..8647c68e0 --- /dev/null +++ b/beacon_chain/el/engine_api_conversions.nim @@ -0,0 +1,359 @@ +# beacon_chain +# Copyright (c) 2024 Status Research & Development GmbH +# Licensed and distributed under either of +# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). +# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). +# at your option. This file may not be copied, modified, or distributed except according to those terms. + +{.push raises: [].} + +import + ../spec/datatypes/[bellatrix, capella, deneb, electra], + web3/[engine_api, engine_api_types] + +from std/sequtils import mapIt + +type + BellatrixExecutionPayloadWithValue* = object + executionPayload*: ExecutionPayloadV1 + blockValue*: UInt256 + +func asEth2Digest*(x: BlockHash): Eth2Digest = + Eth2Digest(data: array[32, byte](x)) + +template asBlockHash*(x: Eth2Digest): BlockHash = + BlockHash(x.data) + +func asConsensusWithdrawal*(w: WithdrawalV1): capella.Withdrawal = + capella.Withdrawal( + index: w.index.uint64, + validator_index: w.validatorIndex.uint64, + address: ExecutionAddress(data: w.address.distinctBase), + amount: Gwei w.amount) + +func asEngineWithdrawal(w: capella.Withdrawal): WithdrawalV1 = + WithdrawalV1( + index: Quantity(w.index), + validatorIndex: Quantity(w.validator_index), + address: Address(w.address.data), + amount: Quantity(w.amount)) + +func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV1): + bellatrix.ExecutionPayload = + template getTransaction(tt: TypedTransaction): bellatrix.Transaction = + bellatrix.Transaction.init(tt.distinctBase) + + bellatrix.ExecutionPayload( + parent_hash: rpcExecutionPayload.parentHash.asEth2Digest, + feeRecipient: + ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase), + state_root: rpcExecutionPayload.stateRoot.asEth2Digest, + receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest, + logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase), + prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest, + block_number: rpcExecutionPayload.blockNumber.uint64, + gas_limit: rpcExecutionPayload.gasLimit.uint64, + gas_used: rpcExecutionPayload.gasUsed.uint64, + timestamp: rpcExecutionPayload.timestamp.uint64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes), + base_fee_per_gas: rpcExecutionPayload.baseFeePerGas, + block_hash: rpcExecutionPayload.blockHash.asEth2Digest, + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init( + mapIt(rpcExecutionPayload.transactions, it.getTransaction))) + +func asConsensusType*(payloadWithValue: BellatrixExecutionPayloadWithValue): + bellatrix.ExecutionPayloadForSigning = + bellatrix.ExecutionPayloadForSigning( + executionPayload: payloadWithValue.executionPayload.asConsensusType, + blockValue: payloadWithValue.blockValue) + +template maybeDeref*[T](o: Opt[T]): T = o.get +template maybeDeref*[V](v: V): V = v + +func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV1OrV2|ExecutionPayloadV2): + capella.ExecutionPayload = + template getTransaction(tt: TypedTransaction): bellatrix.Transaction = + bellatrix.Transaction.init(tt.distinctBase) + + capella.ExecutionPayload( + parent_hash: rpcExecutionPayload.parentHash.asEth2Digest, + feeRecipient: + ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase), + state_root: rpcExecutionPayload.stateRoot.asEth2Digest, + receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest, + logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase), + prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest, + block_number: rpcExecutionPayload.blockNumber.uint64, + gas_limit: rpcExecutionPayload.gasLimit.uint64, + gas_used: rpcExecutionPayload.gasUsed.uint64, + timestamp: rpcExecutionPayload.timestamp.uint64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes), + base_fee_per_gas: rpcExecutionPayload.baseFeePerGas, + block_hash: rpcExecutionPayload.blockHash.asEth2Digest, + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init( + mapIt(rpcExecutionPayload.transactions, it.getTransaction)), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init( + mapIt(maybeDeref rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal))) + +func asConsensusType*(payloadWithValue: engine_api.GetPayloadV2Response): + capella.ExecutionPayloadForSigning = + capella.ExecutionPayloadForSigning( + executionPayload: payloadWithValue.executionPayload.asConsensusType, + blockValue: payloadWithValue.blockValue) + +func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV3): + deneb.ExecutionPayload = + template getTransaction(tt: TypedTransaction): bellatrix.Transaction = + bellatrix.Transaction.init(tt.distinctBase) + + deneb.ExecutionPayload( + parent_hash: rpcExecutionPayload.parentHash.asEth2Digest, + feeRecipient: + ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase), + state_root: rpcExecutionPayload.stateRoot.asEth2Digest, + receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest, + logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase), + prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest, + block_number: rpcExecutionPayload.blockNumber.uint64, + gas_limit: rpcExecutionPayload.gasLimit.uint64, + gas_used: rpcExecutionPayload.gasUsed.uint64, + timestamp: rpcExecutionPayload.timestamp.uint64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(rpcExecutionPayload.extraData.bytes), + base_fee_per_gas: rpcExecutionPayload.baseFeePerGas, + block_hash: rpcExecutionPayload.blockHash.asEth2Digest, + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init( + mapIt(rpcExecutionPayload.transactions, it.getTransaction)), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init( + mapIt(rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal)), + blob_gas_used: rpcExecutionPayload.blobGasUsed.uint64, + excess_blob_gas: rpcExecutionPayload.excessBlobGas.uint64) + +func asConsensusType*(payload: engine_api.GetPayloadV3Response): + deneb.ExecutionPayloadForSigning = + deneb.ExecutionPayloadForSigning( + executionPayload: payload.executionPayload.asConsensusType, + blockValue: payload.blockValue, + # TODO + # The `mapIt` calls below are necessary only because we use different distinct + # types for KZG commitments and Blobs in the `web3` and the `deneb` spec types. + # Both are defined as `array[N, byte]` under the hood. + blobsBundle: deneb.BlobsBundle( + commitments: KzgCommitments.init( + payload.blobsBundle.commitments.mapIt( + kzg_abi.KzgCommitment(bytes: it.bytes))), + proofs: KzgProofs.init( + payload.blobsBundle.proofs.mapIt( + kzg_abi.KzgProof(bytes: it.bytes))), + blobs: Blobs.init( + payload.blobsBundle.blobs.mapIt(it.bytes)))) + +func asConsensusType*(rpcExecutionPayload: ExecutionPayloadV4): + electra.ExecutionPayload = + template getTransaction(tt: TypedTransaction): bellatrix.Transaction = + bellatrix.Transaction.init(tt.distinctBase) + + template getDepositRequest( + dr: DepositRequestV1): electra.DepositRequest = + electra.DepositRequest( + pubkey: ValidatorPubKey(blob: dr.pubkey.distinctBase), + withdrawal_credentials: dr.withdrawalCredentials.asEth2Digest, + amount: dr.amount.Gwei, + signature: ValidatorSig(blob: dr.signature.distinctBase), + index: dr.index.uint64) + + template getWithdrawalRequest( + wr: WithdrawalRequestV1): electra.WithdrawalRequest = + electra.WithdrawalRequest( + source_address: ExecutionAddress(data: wr.sourceAddress.distinctBase), + validator_pubkey: ValidatorPubKey(blob: wr.validatorPubkey.distinctBase), + amount: wr.amount.Gwei) + + template getConsolidationRequest( + cr: ConsolidationRequestV1): electra.ConsolidationRequest = + electra.ConsolidationRequest( + source_address: ExecutionAddress(data: cr.sourceAddress.distinctBase), + source_pubkey: ValidatorPubKey(blob: cr.sourcePubkey.distinctBase), + target_pubkey: ValidatorPubKey(blob: cr.targetPubkey.distinctBase)) + + electra.ExecutionPayload( + parent_hash: rpcExecutionPayload.parentHash.asEth2Digest, + feeRecipient: + ExecutionAddress(data: rpcExecutionPayload.feeRecipient.distinctBase), + state_root: rpcExecutionPayload.stateRoot.asEth2Digest, + receipts_root: rpcExecutionPayload.receiptsRoot.asEth2Digest, + logs_bloom: BloomLogs(data: rpcExecutionPayload.logsBloom.distinctBase), + prev_randao: rpcExecutionPayload.prevRandao.asEth2Digest, + block_number: rpcExecutionPayload.blockNumber.uint64, + gas_limit: rpcExecutionPayload.gasLimit.uint64, + gas_used: rpcExecutionPayload.gasUsed.uint64, + timestamp: rpcExecutionPayload.timestamp.uint64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init( + rpcExecutionPayload.extraData.bytes), + base_fee_per_gas: rpcExecutionPayload.baseFeePerGas, + block_hash: rpcExecutionPayload.blockHash.asEth2Digest, + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init( + mapIt(rpcExecutionPayload.transactions, it.getTransaction)), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init( + mapIt(rpcExecutionPayload.withdrawals, it.asConsensusWithdrawal)), + blob_gas_used: rpcExecutionPayload.blobGasUsed.uint64, + excess_blob_gas: rpcExecutionPayload.excessBlobGas.uint64, + deposit_requests: + List[electra.DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init( + mapIt(rpcExecutionPayload.depositRequests, it.getDepositRequest)), + withdrawal_requests: List[electra.WithdrawalRequest, + MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init( + mapIt(rpcExecutionPayload.withdrawalRequests, + it.getWithdrawalRequest)), + consolidation_requests: List[electra.ConsolidationRequest, + Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init( + mapIt(rpcExecutionPayload.consolidationRequests, + it.getConsolidationRequest))) + +func asConsensusType*(payload: engine_api.GetPayloadV4Response): + electra.ExecutionPayloadForSigning = + electra.ExecutionPayloadForSigning( + executionPayload: payload.executionPayload.asConsensusType, + blockValue: payload.blockValue, + # TODO + # The `mapIt` calls below are necessary only because we use different distinct + # types for KZG commitments and Blobs in the `web3` and the `deneb` spec types. + # Both are defined as `array[N, byte]` under the hood. + blobsBundle: deneb.BlobsBundle( + commitments: KzgCommitments.init( + payload.blobsBundle.commitments.mapIt( + kzg_abi.KzgCommitment(bytes: it.bytes))), + proofs: KzgProofs.init( + payload.blobsBundle.proofs.mapIt( + kzg_abi.KzgProof(bytes: it.bytes))), + blobs: Blobs.init( + payload.blobsBundle.blobs.mapIt(it.bytes)))) + +func asEngineExecutionPayload*(executionPayload: bellatrix.ExecutionPayload): + ExecutionPayloadV1 = + template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction = + TypedTransaction(tt.distinctBase) + + engine_api.ExecutionPayloadV1( + parentHash: executionPayload.parent_hash.asBlockHash, + feeRecipient: Address(executionPayload.fee_recipient.data), + stateRoot: executionPayload.state_root.asBlockHash, + receiptsRoot: executionPayload.receipts_root.asBlockHash, + logsBloom: + FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data), + prevRandao: executionPayload.prev_randao.asBlockHash, + blockNumber: Quantity(executionPayload.block_number), + gasLimit: Quantity(executionPayload.gas_limit), + gasUsed: Quantity(executionPayload.gas_used), + timestamp: Quantity(executionPayload.timestamp), + extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data), + baseFeePerGas: executionPayload.base_fee_per_gas, + blockHash: executionPayload.block_hash.asBlockHash, + transactions: mapIt(executionPayload.transactions, it.getTypedTransaction)) + +template toEngineWithdrawal*(w: capella.Withdrawal): WithdrawalV1 = + WithdrawalV1( + index: Quantity(w.index), + validatorIndex: Quantity(w.validator_index), + address: Address(w.address.data), + amount: Quantity(w.amount)) + +func asEngineExecutionPayload*(executionPayload: capella.ExecutionPayload): + ExecutionPayloadV2 = + template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction = + TypedTransaction(tt.distinctBase) + engine_api.ExecutionPayloadV2( + parentHash: executionPayload.parent_hash.asBlockHash, + feeRecipient: Address(executionPayload.fee_recipient.data), + stateRoot: executionPayload.state_root.asBlockHash, + receiptsRoot: executionPayload.receipts_root.asBlockHash, + logsBloom: + FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data), + prevRandao: executionPayload.prev_randao.asBlockHash, + blockNumber: Quantity(executionPayload.block_number), + gasLimit: Quantity(executionPayload.gas_limit), + gasUsed: Quantity(executionPayload.gas_used), + timestamp: Quantity(executionPayload.timestamp), + extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data), + baseFeePerGas: executionPayload.base_fee_per_gas, + blockHash: executionPayload.block_hash.asBlockHash, + transactions: mapIt(executionPayload.transactions, it.getTypedTransaction), + withdrawals: mapIt(executionPayload.withdrawals, it.toEngineWithdrawal)) + +func asEngineExecutionPayload*(executionPayload: deneb.ExecutionPayload): + ExecutionPayloadV3 = + template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction = + TypedTransaction(tt.distinctBase) + + engine_api.ExecutionPayloadV3( + parentHash: executionPayload.parent_hash.asBlockHash, + feeRecipient: Address(executionPayload.fee_recipient.data), + stateRoot: executionPayload.state_root.asBlockHash, + receiptsRoot: executionPayload.receipts_root.asBlockHash, + logsBloom: + FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data), + prevRandao: executionPayload.prev_randao.asBlockHash, + blockNumber: Quantity(executionPayload.block_number), + gasLimit: Quantity(executionPayload.gas_limit), + gasUsed: Quantity(executionPayload.gas_used), + timestamp: Quantity(executionPayload.timestamp), + extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data), + baseFeePerGas: executionPayload.base_fee_per_gas, + blockHash: executionPayload.block_hash.asBlockHash, + transactions: mapIt(executionPayload.transactions, it.getTypedTransaction), + withdrawals: mapIt(executionPayload.withdrawals, it.asEngineWithdrawal), + blobGasUsed: Quantity(executionPayload.blob_gas_used), + excessBlobGas: Quantity(executionPayload.excess_blob_gas)) + +func asEngineExecutionPayload*(executionPayload: electra.ExecutionPayload): + ExecutionPayloadV4 = + template getTypedTransaction(tt: bellatrix.Transaction): TypedTransaction = + TypedTransaction(tt.distinctBase) + + template getDepositRequest( + dr: electra.DepositRequest): DepositRequestV1 = + DepositRequestV1( + pubkey: FixedBytes[RawPubKeySize](dr.pubkey.blob), + withdrawalCredentials: FixedBytes[32](dr.withdrawal_credentials.data), + amount: dr.amount.Quantity, + signature: FixedBytes[RawSigSize](dr.signature.blob), + index: dr.index.Quantity) + + template getWithdrawalRequest( + wr: electra.WithdrawalRequest): WithdrawalRequestV1 = + WithdrawalRequestV1( + sourceAddress: Address(wr.source_address.data), + validatorPubkey: FixedBytes[RawPubKeySize](wr.validator_pubkey.blob), + amount: wr.amount.Quantity) + + template getConsolidationRequest( + cr: electra.ConsolidationRequest): ConsolidationRequestV1 = + ConsolidationRequestV1( + sourceAddress: Address(cr.source_address.data), + sourcePubkey: FixedBytes[RawPubKeySize](cr.source_pubkey.blob), + targetPubkey: FixedBytes[RawPubKeySize](cr.target_pubkey.blob)) + + engine_api.ExecutionPayloadV4( + parentHash: executionPayload.parent_hash.asBlockHash, + feeRecipient: Address(executionPayload.fee_recipient.data), + stateRoot: executionPayload.state_root.asBlockHash, + receiptsRoot: executionPayload.receipts_root.asBlockHash, + logsBloom: + FixedBytes[BYTES_PER_LOGS_BLOOM](executionPayload.logs_bloom.data), + prevRandao: executionPayload.prev_randao.asBlockHash, + blockNumber: Quantity(executionPayload.block_number), + gasLimit: Quantity(executionPayload.gas_limit), + gasUsed: Quantity(executionPayload.gas_used), + timestamp: Quantity(executionPayload.timestamp), + extraData: DynamicBytes[0, MAX_EXTRA_DATA_BYTES](executionPayload.extra_data), + baseFeePerGas: executionPayload.base_fee_per_gas, + blockHash: executionPayload.block_hash.asBlockHash, + transactions: mapIt(executionPayload.transactions, it.getTypedTransaction), + withdrawals: mapIt(executionPayload.withdrawals, it.asEngineWithdrawal), + blobGasUsed: Quantity(executionPayload.blob_gas_used), + excessBlobGas: Quantity(executionPayload.excess_blob_gas), + depositRequests: mapIt( + executionPayload.deposit_requests, it.getDepositRequest), + withdrawalRequests: mapIt( + executionPayload.withdrawal_requests, it.getWithdrawalRequest), + consolidationRequests: mapIt( + executionPayload.consolidation_requests, it.getConsolidationRequest)) diff --git a/beacon_chain/el/eth1_chain.nim b/beacon_chain/el/eth1_chain.nim index 231ff3bc1..1fb736731 100644 --- a/beacon_chain/el/eth1_chain.nim +++ b/beacon_chain/el/eth1_chain.nim @@ -16,6 +16,8 @@ import web3/[conversions, eth_api_types], ./merkle_minimal +from ./engine_api_conversions import asBlockHash, asEth2Digest + export beacon_chain_db, deques, digest, base, forks logScope: @@ -80,12 +82,6 @@ type deposits*: seq[Deposit] hasMissingDeposits*: bool -func asEth2Digest*(x: BlockHash): Eth2Digest = - Eth2Digest(data: array[32, byte](x)) - -template asBlockHash*(x: Eth2Digest): BlockHash = - BlockHash(x.data) - # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/validator.md#get_eth1_data func compute_time_at_slot(genesis_time: uint64, slot: Slot): uint64 = genesis_time + slot * SECONDS_PER_SLOT @@ -115,7 +111,7 @@ template findBlock(chain: Eth1Chain, eth1Data: Eth1Data): Eth1Block = func makeSuccessorWithoutDeposits*(existingBlock: Eth1Block, successor: BlockObject): Eth1Block = - result = Eth1Block( + Eth1Block( hash: successor.hash.asEth2Digest, number: Eth1BlockNumber successor.number, timestamp: Eth1BlockTimestamp successor.timestamp) diff --git a/beacon_chain/el/merkle_minimal.nim b/beacon_chain/el/merkle_minimal.nim index 1fe051b2c..0c694b4dd 100644 --- a/beacon_chain/el/merkle_minimal.nim +++ b/beacon_chain/el/merkle_minimal.nim @@ -7,7 +7,7 @@ {.push raises: [].} -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/tests/core/pyspec/eth2spec/utils/merkle_minimal.py +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/tests/core/pyspec/eth2spec/utils/merkle_minimal.py # Merkle tree helpers # --------------------------------------------------------------- diff --git a/beacon_chain/fork_choice/fork_choice.nim b/beacon_chain/fork_choice/fork_choice.nim index 6b638ce58..6d886be98 100644 --- a/beacon_chain/fork_choice/fork_choice.nim +++ b/beacon_chain/fork_choice/fork_choice.nim @@ -49,13 +49,11 @@ func compute_deltas( logScope: topics = "fork_choice" func init*( - T: type ForkChoiceBackend, checkpoints: FinalityCheckpoints, - version: ForkChoiceVersion): T = - T(proto_array: ProtoArray.init(checkpoints, version)) + T: type ForkChoiceBackend, checkpoints: FinalityCheckpoints): T = + T(proto_array: ProtoArray.init(checkpoints)) proc init*( - T: type ForkChoice, epochRef: EpochRef, blck: BlockRef, - version: ForkChoiceVersion): T = + T: type ForkChoice, epochRef: EpochRef, blck: BlockRef): T = ## Initialize a fork choice context for a finalized state - in the finalized ## state, the justified and finalized checkpoints are the same, so only one ## is used here @@ -67,10 +65,8 @@ proc init*( backend: ForkChoiceBackend.init( FinalityCheckpoints( justified: checkpoint, - finalized: checkpoint), - version), + finalized: checkpoint)), checkpoints: Checkpoints( - version: version, justified: BalanceCheckpoint( checkpoint: checkpoint, total_active_balance: epochRef.total_active_balance, @@ -113,7 +109,7 @@ proc update_justified( self.update_justified(dag, blck, justified.epoch) ok() -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/fork-choice.md#update_checkpoints +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/fork-choice.md#update_checkpoints proc update_checkpoints( self: var Checkpoints, dag: ChainDAGRef, checkpoints: FinalityCheckpoints): FcResult[void] = @@ -377,7 +373,7 @@ proc get_head*(self: var ForkChoice, self.checkpoints.justified.balances, self.checkpoints.proposer_boost_root) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/fork_choice/safe-block.md#get_safe_beacon_block_root +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/fork_choice/safe-block.md#get_safe_beacon_block_root func get_safe_beacon_block_root*(self: ForkChoice): Eth2Digest = # Use most recent justified block as a stopgap self.checkpoints.justified.checkpoint.root diff --git a/beacon_chain/fork_choice/fork_choice_types.nim b/beacon_chain/fork_choice/fork_choice_types.nim index c683f14ca..743ec5995 100644 --- a/beacon_chain/fork_choice/fork_choice_types.nim +++ b/beacon_chain/fork_choice/fork_choice_types.nim @@ -29,14 +29,6 @@ import # ---------------------------------------------------------------------- type - ForkChoiceVersion* {.pure.} = enum - ## Controls which version of fork choice to run. - Stable = "stable" - ## Use current version from stable Ethereum consensus specifications - Pr3431 = "pr3431" - ## https://github.com/ethereum/consensus-specs/pull/3431 - ## https://github.com/ethereum/consensus-specs/issues/3466 - fcKind* = enum ## Fork Choice Error Kinds fcFinalizedNodeUnknown @@ -96,7 +88,6 @@ type ## Subtracted from logical index to get the physical index ProtoArray* = object - version*: ForkChoiceVersion currentEpoch*: Epoch checkpoints*: FinalityCheckpoints nodes*: ProtoNodes @@ -121,7 +112,6 @@ type balances*: seq[Gwei] Checkpoints* = object - version*: ForkChoiceVersion time*: BeaconTime justified*: BalanceCheckpoint finalized*: Checkpoint diff --git a/beacon_chain/fork_choice/proto_array.nim b/beacon_chain/fork_choice/proto_array.nim index 381279055..b2d4eac06 100644 --- a/beacon_chain/fork_choice/proto_array.nim +++ b/beacon_chain/fork_choice/proto_array.nim @@ -90,8 +90,7 @@ func nodeLeadsToViableHead( # ---------------------------------------------------------------------- func init*( - T: type ProtoArray, checkpoints: FinalityCheckpoints, - version: ForkChoiceVersion): T = + T: type ProtoArray, checkpoints: FinalityCheckpoints): T = let node = ProtoNode( bid: BlockId( slot: checkpoints.finalized.epoch.start_slot, @@ -103,8 +102,7 @@ func init*( bestChild: none(int), bestDescendant: none(int)) - T(version: version, - checkpoints: checkpoints, + T(checkpoints: checkpoints, nodes: ProtoNodes(buf: @[node], offset: 0), indices: {node.bid.root: 0}.toTable()) @@ -536,23 +534,10 @@ func nodeIsViableForHead( node.checkpoints.justified.epoch == self.checkpoints.justified.epoch if not correctJustified: - case self.version - of ForkChoiceVersion.Stable: - # If the previous epoch is justified, the block should be pulled-up. - # In this case, check that unrealized justification is higher than the - # store and that the voting source is not more than two epochs ago - if self.isPreviousEpochJustified and - node.bid.slot.epoch == self.currentEpoch: - let unrealized = - self.currentEpochTips.getOrDefault(nodeIdx, node.checkpoints) - correctJustified = - unrealized.justified.epoch >= self.checkpoints.justified.epoch and - node.checkpoints.justified.epoch + 2 >= self.currentEpoch - of ForkChoiceVersion.Pr3431: - # The voting source should be either at the same height as the store's - # justified checkpoint or not more than two epochs ago - correctJustified = - node.checkpoints.justified.epoch + 2 >= self.currentEpoch + # The voting source should be either at the same height as the store's + # justified checkpoint or not more than two epochs ago + correctJustified = + node.checkpoints.justified.epoch + 2 >= self.currentEpoch return if not correctJustified: @@ -565,7 +550,7 @@ func nodeIsViableForHead( true else: # Check that this node is not going to be pruned - let + let finalizedEpoch = self.checkpoints.finalized.epoch finalizedSlot = finalizedEpoch.start_slot var ancestor = some node diff --git a/beacon_chain/gossip_processing/batch_validation.nim b/beacon_chain/gossip_processing/batch_validation.nim index 39e0743a9..5c98cf10c 100644 --- a/beacon_chain/gossip_processing/batch_validation.nim +++ b/beacon_chain/gossip_processing/batch_validation.nim @@ -99,7 +99,7 @@ type Batch* = object ## A batch represents up to BatchedCryptoSize non-aggregated signatures created: Moment - sigsets: seq[SignatureSet] + multiSets: Table[array[32, byte], MultiSignatureSet] items: seq[BatchItem] VerifierItem = object @@ -198,7 +198,7 @@ proc complete(batchCrypto: var BatchCrypto, batch: var Batch, ok: bool) = batchCrypto.counts.batches += 1 batchCrypto.counts.signatures += batch.items.len() - batchCrypto.counts.aggregates += batch.sigsets.len() + batchCrypto.counts.aggregates += batch.multiSets.len() if batchCrypto.counts.batches >= 256: # Not too often, so as not to overwhelm our metrics @@ -208,16 +208,6 @@ proc complete(batchCrypto: var BatchCrypto, batch: var Batch, ok: bool) = reset(batchCrypto.counts) -func combine(a: var Signature, b: Signature) = - var tmp = AggregateSignature.init(CookedSig(a)) - tmp.aggregate(b) - a = Signature(tmp.finish()) - -func combine(a: var PublicKey, b: PublicKey) = - var tmp = AggregatePublicKey.init(CookedPubKey(a)) - tmp.aggregate(b) - a = PublicKey(tmp.finish()) - proc batchVerifyTask(task: ptr BatchTask) {.nimcall.} = # Task suitable for running in taskpools - look, no GC! let @@ -237,12 +227,29 @@ proc spawnBatchVerifyTask(tp: Taskpool, task: ptr BatchTask) = # Possibly related to: https://github.com/nim-lang/Nim/issues/22305 tp.spawn batchVerifyTask(task) -proc batchVerifyAsync*( - verifier: ref BatchVerifier, signal: ThreadSignalPtr, +func combine( + multiSet: MultiSignatureSet, + verifier: ref BatchVerifier): SignatureSet = + var secureRandomBytes: array[32, byte] + verifier[].rng[].generate(secureRandomBytes) + multiSet.combine(secureRandomBytes) + +func combineAll( + multiSets: Table[array[32, byte], MultiSignatureSet], + verifier: ref BatchVerifier): seq[SignatureSet] = + var sigsets = newSeqOfCap[SignatureSet](multiSets.len) + for multiSet in multiSets.values(): + sigsets.add multiSet.combine(verifier) + sigsets + +proc batchVerifyAsync( + verifier: ref BatchVerifier, + signal: ThreadSignalPtr, batch: ref Batch): Future[bool] {.async: (raises: [CancelledError]).} = + let sigsets = batch[].multiSets.combineAll(verifier) var task = BatchTask( - setsPtr: makeUncheckedArray(baseAddr batch[].sigsets), - numSets: batch[].sigsets.len, + setsPtr: makeUncheckedArray(baseAddr sigsets), + numSets: sigsets.len, taskpool: verifier[].taskpool, cache: addr verifier[].sigVerifCache, signal: signal, @@ -264,18 +271,18 @@ proc batchVerifyAsync*( task.ok.load() proc processBatch( - batchCrypto: ref BatchCrypto, batch: ref Batch, - verifier: ref BatchVerifier, signal: ThreadSignalPtr) {.async: (raises: [CancelledError]).} = - let - numSets = batch[].sigsets.len() + batchCrypto: ref BatchCrypto, + batch: ref Batch, + verifier: ref BatchVerifier, + signal: ThreadSignalPtr) {.async: (raises: [CancelledError]).} = + let numSets = batch[].multiSets.len if numSets == 0: # Nothing to do in this batch, can happen when a batch is created without # there being any signatures successfully added to it return - let - startTick = Moment.now() + let startTick = Moment.now() # If the hardware is too slow to keep up or an event caused a temporary # buildup of signature verification tasks, the batch will be dropped so as to @@ -300,13 +307,19 @@ proc processBatch( # may not be beneficial to use batch verification: # https://github.com/status-im/nim-blscurve/blob/3956f63dd0ed5d7939f6195ee09e4c5c1ace9001/blscurve/bls_batch_verifier.nim#L390 if numSets == 1: - blsVerify(batch[].sigsets[0]) + var r: bool + for multiSet in batch[].multiSets.values(): + r = blsVerify(multiSet.combine(verifier)) + break + r elif batchCrypto[].taskpool.numThreads > 1 and numSets > 3: await batchVerifyAsync(verifier, signal, batch) else: let secureRandomBytes = verifier[].rng[].generate(array[32, byte]) batchVerifySerial( - verifier[].sigVerifCache, batch.sigsets, secureRandomBytes) + verifier[].sigVerifCache, + batch.multiSets.combineAll(verifier), + secureRandomBytes) trace "batch crypto - finished", numSets, items = batch[].items.len(), ok, @@ -366,18 +379,10 @@ proc verifySoon( batch = batchCrypto[].getBatch() fut = newFuture[BatchResult](name) - var found = false - # Find existing signature sets with the same message - if we can verify an - # aggregate instead of several signatures, that is _much_ faster - for item in batch[].sigsets.mitems(): - if item.message == sigset.message: - item.signature.combine(sigset.signature) - item.pubkey.combine(sigset.pubkey) - found = true - break - - if not found: - batch[].sigsets.add sigset + batch[].multiSets.withValue(sigset.message, multiSet): + multiSet[].add sigset + do: + batch[].multiSets[sigset.message] = MultiSignatureSet.init sigset # We need to keep the "original" sigset to allow verifying each signature # one by one in the case the combined operation fails diff --git a/beacon_chain/gossip_processing/block_processor.nim b/beacon_chain/gossip_processing/block_processor.nim index 213a7fe21..5722dcfdc 100644 --- a/beacon_chain/gossip_processing/block_processor.nim +++ b/beacon_chain/gossip_processing/block_processor.nim @@ -9,11 +9,11 @@ import chronicles, chronos, metrics, - ../spec/[forks, signatures, signatures_batch], + ../spec/[forks, helpers_el, signatures, signatures_batch], ../sszdump from std/deques import Deque, addLast, contains, initDeque, items, len, shrink -from std/sequtils import mapIt +from std/sequtils import anyIt, mapIt from ../consensus_object_pools/consensus_manager import ConsensusManager, checkNextProposer, optimisticExecutionBlockHash, runProposalForkchoiceUpdated, shouldSyncOptimistically, updateHead, @@ -586,31 +586,41 @@ proc storeBlock( if NewPayloadStatus.noResponse == payloadStatus: # When the execution layer is not available to verify the payload, we do the - # required check on the CL side instead and proceed as if the EL was syncing - - # TODO run https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/deneb/beacon-chain.md#blob-kzg-commitments - # https://github.com/ethereum/execution-apis/blob/main/src/engine/experimental/blob-extension.md#specification - # "This validation MUST be instantly run in all cases even during active - # sync process." - # - # Client software MUST validate `blockHash` value as being equivalent to - # `Keccak256(RLP(ExecutionBlockHeader))` - # https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.3/src/engine/paris.md#specification - # - # This should simulate an unsynced EL, which still must perform these - # checks. This means it must be able to do so without context, beyond - # whatever data the block itself contains. + # required checks on the CL instead and proceed as if the EL was syncing + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#verify_and_notify_new_payload + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/deneb/beacon-chain.md#modified-verify_and_notify_new_payload when typeof(signedBlock).kind >= ConsensusFork.Bellatrix: - template payload(): auto = signedBlock.message.body.execution_payload - if signedBlock.message.is_execution_block and - payload.block_hash != + if signedBlock.message.is_execution_block: + template payload(): auto = signedBlock.message.body.execution_payload + + template returnWithError(msg: string, extraMsg = ""): untyped = + if extraMsg != "": + debug msg, reason = extraMsg, executionPayload = shortLog(payload) + else: + debug msg, executionPayload = shortLog(payload) + self[].dumpInvalidBlock(signedBlock) + doAssert strictVerification notin dag.updateFlags + self.consensusManager.quarantine[].addUnviable(signedBlock.root) + return err((VerifierError.Invalid, ProcessingStatus.completed)) + + if payload.transactions.anyIt(it.len == 0): + returnWithError "Execution block contains zero length transactions" + + if payload.block_hash != signedBlock.message.compute_execution_block_hash(): - debug "Execution block hash validation failed", - execution_payload = shortLog(payload) - self[].dumpInvalidBlock(signedBlock) - doAssert strictVerification notin dag.updateFlags - self.consensusManager.quarantine[].addUnviable(signedBlock.root) - return err((VerifierError.Invalid, ProcessingStatus.completed)) + returnWithError "Execution block hash validation failed" + + # [New in Deneb:EIP4844] + when typeof(signedBlock).kind >= ConsensusFork.Deneb: + let blobsRes = signedBlock.message.is_valid_versioned_hashes + if blobsRes.isErr: + returnWithError "Blob versioned hashes invalid", blobsRes.error + else: + # If there are EIP-4844 (type 3) transactions in the payload with + # versioned hashes, the transactions would be rejected by the EL + # based on payload timestamp (only allowed post Deneb); + # There are no `blob_kzg_commitments` before Deneb to compare against + discard let newPayloadTick = Moment.now() @@ -888,7 +898,7 @@ proc processBlock( # - MUST NOT optimistically import the block. # - MUST NOT apply the block to the fork choice store. # - MAY queue the block for later processing. - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/sync/optimistic.md#execution-engine-errors + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/sync/optimistic.md#execution-engine-errors await sleepAsync(chronos.seconds(1)) self[].enqueueBlock( entry.src, entry.blck, entry.blobs, entry.resfut, entry.maybeFinalized, diff --git a/beacon_chain/gossip_processing/gossip_validation.nim b/beacon_chain/gossip_processing/gossip_validation.nim index 82e5fbf9d..06447177b 100644 --- a/beacon_chain/gossip_processing/gossip_validation.nim +++ b/beacon_chain/gossip_processing/gossip_validation.nim @@ -303,7 +303,7 @@ template validateBeaconBlockBellatrix( # # `is_merge_transition_complete(state)` tests for # `state.latest_execution_payload_header != ExecutionPayloadHeader()`, while - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#block-processing + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#block-processing # shows that `state.latest_execution_payload_header` being default or not is # exactly equivalent to whether that block's execution payload is default or # not, so test cached block information rather than reconstructing a state. @@ -1187,7 +1187,7 @@ proc validateAggregate*( ok((attesting_indices, sig)) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/p2p-interface.md#bls_to_execution_change +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/capella/p2p-interface.md#bls_to_execution_change proc validateBlsToExecutionChange*( pool: ValidatorChangePool, batchCrypto: ref BatchCrypto, signed_address_change: SignedBLSToExecutionChange, diff --git a/beacon_chain/libnimbus_lc/libnimbus_lc.h b/beacon_chain/libnimbus_lc/libnimbus_lc.h index 268ead32e..5067ba48a 100644 --- a/beacon_chain/libnimbus_lc/libnimbus_lc.h +++ b/beacon_chain/libnimbus_lc/libnimbus_lc.h @@ -94,7 +94,7 @@ typedef struct ETHConsensusConfig ETHConsensusConfig; * based on the given `config.yaml` file content - If successful. * @return `NULL` - If the given `config.yaml` is malformed or incompatible. * - * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/configs/README.md + * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/configs/README.md */ ETH_RESULT_USE_CHECK ETHConsensusConfig *_Nullable ETHConsensusConfigCreateFromYaml(const char *configFileContent); @@ -151,9 +151,9 @@ typedef struct ETHBeaconState ETHBeaconState; * * @see https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/beacon-chain.md#beaconstate * @see https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#beaconstate - * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#beaconstate + * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#beaconstate * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/beacon-chain.md#beaconstate - * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/configs/README.md + * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/configs/README.md */ ETH_RESULT_USE_CHECK ETHBeaconState *_Nullable ETHBeaconStateCreateFromSsz( @@ -325,8 +325,8 @@ typedef struct ETHLightClientStore ETHLightClientStore; * * @see https://ethereum.github.io/beacon-APIs/?urls.primaryName=v2.4.1#/Beacon/getLightClientBootstrap * @see https://ethereum.github.io/beacon-APIs/?urls.primaryName=v2.4.1#/Events/eventstream - * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/light-client.md - * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/weak-subjectivity.md#weak-subjectivity-period + * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/light-client.md + * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/weak-subjectivity.md#weak-subjectivity-period */ ETH_RESULT_USE_CHECK ETHLightClientStore *_Nullable ETHLightClientStoreCreateFromBootstrap( @@ -579,7 +579,7 @@ typedef struct ETHLightClientHeader ETHLightClientHeader; * * @return Latest finalized header. * - * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/light-client/sync-protocol.md#modified-lightclientheader + * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/capella/light-client/sync-protocol.md#modified-lightclientheader */ ETH_RESULT_USE_CHECK const ETHLightClientHeader *ETHLightClientStoreGetFinalizedHeader( @@ -598,7 +598,7 @@ const ETHLightClientHeader *ETHLightClientStoreGetFinalizedHeader( * @return Whether or not the next sync committee is currently known. * * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/sync-protocol.md#is_next_sync_committee_known - * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/light-client.md + * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/light-client.md */ ETH_RESULT_USE_CHECK bool ETHLightClientStoreIsNextSyncCommitteeKnown(const ETHLightClientStore *store); @@ -695,7 +695,7 @@ typedef struct ETHBeaconBlockHeader ETHBeaconBlockHeader; * * @return Beacon block header. * - * @see https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.6/specs/phase0/beacon-chain.md#beaconblockheader + * @see https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#beaconblockheader */ ETH_RESULT_USE_CHECK const ETHBeaconBlockHeader *ETHLightClientHeaderGetBeacon( diff --git a/beacon_chain/libnimbus_lc/libnimbus_lc.nim b/beacon_chain/libnimbus_lc/libnimbus_lc.nim index 71d266d04..c78d84e23 100644 --- a/beacon_chain/libnimbus_lc/libnimbus_lc.nim +++ b/beacon_chain/libnimbus_lc/libnimbus_lc.nim @@ -17,7 +17,7 @@ import json_rpc/jsonmarshal, secp256k1, web3/[engine_api_types, eth_api_types, conversions], - ../el/eth1_chain, + ../el/[engine_api_conversions, eth1_chain], ../spec/eth2_apis/[eth2_rest_serialization, rest_light_client_calls], ../spec/[helpers, light_client_sync], ../sync/light_client_sync_helpers, @@ -77,7 +77,7 @@ proc ETHConsensusConfigCreateFromYaml( ## * `NULL` - If the given `config.yaml` is malformed or incompatible. ## ## See: - ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/configs/README.md + ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/configs/README.md let cfg = RuntimeConfig.new() try: cfg[] = readRuntimeConfig($configFileContent, "config.yaml")[0] @@ -143,9 +143,9 @@ proc ETHBeaconStateCreateFromSsz( ## See: ## * https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/beacon-chain.md#beaconstate ## * https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#beaconstate - ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#beaconstate + ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#beaconstate ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/beacon-chain.md#beaconstate - ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/configs/README.md + ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/configs/README.md let consensusFork = ConsensusFork.decodeString($consensusVersion).valueOr: return nil @@ -328,8 +328,8 @@ proc ETHLightClientStoreCreateFromBootstrap( ## See: ## * https://ethereum.github.io/beacon-APIs/?urls.primaryName=v2.4.1#/Beacon/getLightClientBootstrap ## * https://ethereum.github.io/beacon-APIs/?urls.primaryName=v2.4.1#/Events/eventstream - ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/light-client.md - ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/weak-subjectivity.md#weak-subjectivity-period + ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/light-client.md + ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/weak-subjectivity.md#weak-subjectivity-period let mediaType = MediaType.init($mediaType) consensusFork = ConsensusFork.decodeString($consensusVersion).valueOr: @@ -755,7 +755,7 @@ func ETHLightClientStoreIsNextSyncCommitteeKnown( ## ## See: ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/sync-protocol.md#is_next_sync_committee_known - ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/light-client.md + ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/light-client.md store[].is_next_sync_committee_known func ETHLightClientStoreGetOptimisticHeader( @@ -841,7 +841,7 @@ proc ETHLightClientHeaderCopyBeaconRoot( ## * Pointer to a copy of the given header's beacon block root. ## ## See: - ## * https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.6/specs/phase0/beacon-chain.md#hash_tree_root + ## * https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#hash_tree_root discard cfg # Future-proof against new fields, see `get_lc_execution_root`. let root = Eth2Digest.new() root[] = header[].beacon.hash_tree_root() diff --git a/beacon_chain/light_client.nim b/beacon_chain/light_client.nim index a8ffe0a23..94b9a3dbe 100644 --- a/beacon_chain/light_client.nim +++ b/beacon_chain/light_client.nim @@ -86,7 +86,8 @@ proc createLightClient( getBeaconTime: GetBeaconTimeFn, genesis_validators_root: Eth2Digest, finalizationMode: LightClientFinalizationMode, - strictVerification = false + strictVerification = false, + shouldInhibitSync: light_client_manager.GetBoolCallback = nil ): LightClient = let lightClient = LightClient( network: network, @@ -177,7 +178,8 @@ proc createLightClient( lightClient.network, rng, getTrustedBlockRoot, bootstrapVerifier, updateVerifier, finalityVerifier, optimisticVerifier, isLightClientStoreInitialized, isNextSyncCommitteeKnown, - getFinalizedPeriod, getOptimisticPeriod, getBeaconTime) + getFinalizedPeriod, getOptimisticPeriod, getBeaconTime, + shouldInhibitSync = shouldInhibitSync) lightClient.gossipState = {} @@ -191,13 +193,15 @@ proc createLightClient*( forkDigests: ref ForkDigests, getBeaconTime: GetBeaconTimeFn, genesis_validators_root: Eth2Digest, - finalizationMode: LightClientFinalizationMode + finalizationMode: LightClientFinalizationMode, + shouldInhibitSync: light_client_manager.GetBoolCallback = nil ): LightClient = createLightClient( network, rng, config.dumpEnabled, config.dumpDirInvalid, config.dumpDirIncoming, cfg, forkDigests, getBeaconTime, genesis_validators_root, finalizationMode, - strictVerification = config.strictVerification) + strictVerification = config.strictVerification, + shouldInhibitSync = shouldInhibitSync) proc createLightClient*( network: Eth2Node, @@ -207,12 +211,14 @@ proc createLightClient*( forkDigests: ref ForkDigests, getBeaconTime: GetBeaconTimeFn, genesis_validators_root: Eth2Digest, - finalizationMode: LightClientFinalizationMode + finalizationMode: LightClientFinalizationMode, + shouldInhibitSync: light_client_manager.GetBoolCallback = nil ): LightClient = createLightClient( network, rng, dumpEnabled = false, dumpDirInvalid = ".", dumpDirIncoming = ".", - cfg, forkDigests, getBeaconTime, genesis_validators_root, finalizationMode) + cfg, forkDigests, getBeaconTime, genesis_validators_root, finalizationMode, + shouldInhibitSync = shouldInhibitSync) proc start*(lightClient: LightClient) = notice "Starting light client", diff --git a/beacon_chain/networking/eth2_network.nim b/beacon_chain/networking/eth2_network.nim index d794fb161..5754fea54 100644 --- a/beacon_chain/networking/eth2_network.nim +++ b/beacon_chain/networking/eth2_network.nim @@ -176,7 +176,7 @@ type MounterProc* = proc(network: Eth2Node) {.gcsafe, raises: [].} MessageContentPrinter* = proc(msg: pointer): string {.gcsafe, raises: [].} - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/phase0/p2p-interface.md#goodbye + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/p2p-interface.md#goodbye DisconnectionReason* = enum # might see other values on the wire! ClientShutDown = 1 @@ -2555,8 +2555,8 @@ proc updateStabilitySubnetMetadata*(node: Eth2Node, attnets: AttnetBits) = node.metadata.seq_number += 1 node.metadata.attnets = attnets - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/p2p-interface.md#attestation-subnet-subscription - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.4/specs/phase0/p2p-interface.md#attestation-subnet-bitfield + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/p2p-interface.md#attestation-subnet-subscription + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/p2p-interface.md#attestation-subnet-bitfield let res = node.discovery.updateRecord({ enrAttestationSubnetsField: SSZ.encode(node.metadata.attnets) }) @@ -2568,7 +2568,7 @@ proc updateStabilitySubnetMetadata*(node: Eth2Node, attnets: AttnetBits) = debug "Stability subnets changed; updated ENR attnets", attnets proc updateSyncnetsMetadata*(node: Eth2Node, syncnets: SyncnetBits) = - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#sync-committee-subnet-stability + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#sync-committee-subnet-stability if node.metadata.syncnets == syncnets: return diff --git a/beacon_chain/nimbus_beacon_node.nim b/beacon_chain/nimbus_beacon_node.nim index 950c7f075..942e02b98 100644 --- a/beacon_chain/nimbus_beacon_node.nim +++ b/beacon_chain/nimbus_beacon_node.nim @@ -385,7 +385,7 @@ proc initFullNode( quarantine = newClone( Quarantine.init()) attestationPool = newClone(AttestationPool.init( - dag, quarantine, config.forkChoiceVersion.get, onAttestationReceived)) + dag, quarantine, onAttestationReceived)) syncCommitteeMsgPool = newClone( SyncCommitteeMsgPool.init(rng, dag.cfg, onSyncContribution)) lightClientPool = newClone( @@ -574,7 +574,9 @@ proc init*(T: type BeaconNode, config: BeaconNodeConf, metadata: Eth2NetworkMetadata): Future[BeaconNode] {.async.} = - var taskpool: TaskPoolPtr + var + taskpool: TaskPoolPtr + genesisState: ref ForkedHashedBeaconState = nil template cfg: auto = metadata.cfg template eth1Network: auto = metadata.eth1Network @@ -582,10 +584,10 @@ proc init*(T: type BeaconNode, if not(isDir(config.databaseDir)): # If database directory missing, we going to use genesis state to check # for weak_subjectivity_period. + genesisState = + await fetchGenesisState( + metadata, config.genesisState, config.genesisStateUrl) let - genesisState = - await fetchGenesisState( - metadata, config.genesisState, config.genesisStateUrl) genesisTime = getStateField(genesisState[], genesis_time) beaconClock = BeaconClock.init(genesisTime).valueOr: fatal "Invalid genesis time in genesis state", genesisTime @@ -640,15 +642,15 @@ proc init*(T: type BeaconNode, db = BeaconChainDB.new(config.databaseDir, cfg, inMemory = false) if config.externalBeaconApiUrl.isSome and ChainDAGRef.isInitialized(db).isErr: - var genesisState: ref ForkedHashedBeaconState let trustedBlockRoot = if config.trustedStateRoot.isSome or config.trustedBlockRoot.isSome: config.trustedBlockRoot elif cfg.ALTAIR_FORK_EPOCH == GENESIS_EPOCH: # Sync can be bootstrapped from the genesis block root - genesisState = await fetchGenesisState( - metadata, config.genesisState, config.genesisStateUrl) - if genesisState != nil: + if genesisState.isNil: + genesisState = await fetchGenesisState( + metadata, config.genesisState, config.genesisStateUrl) + if not genesisState.isNil: let genesisBlockRoot = get_initial_beacon_block(genesisState[]).root notice "Neither `--trusted-block-root` nor `--trusted-state-root` " & "provided with `--external-beacon-api-url`, " & @@ -669,7 +671,7 @@ proc init*(T: type BeaconNode, trustedBlockRoot = config.trustedBlockRoot, trustedStateRoot = config.trustedStateRoot else: - if genesisState == nil: + if genesisState.isNil: genesisState = await fetchGenesisState( metadata, config.genesisState, config.genesisStateUrl) await db.doRunTrustedNodeSync( @@ -735,15 +737,18 @@ proc init*(T: type BeaconNode, var networkGenesisValidatorsRoot = metadata.bakedGenesisValidatorsRoot if not ChainDAGRef.isInitialized(db).isOk(): - let genesisState = - if checkpointState != nil and + genesisState = + if not checkpointState.isNil and getStateField(checkpointState[], slot) == 0: checkpointState else: - await fetchGenesisState( - metadata, config.genesisState, config.genesisStateUrl) + if genesisState.isNil: + await fetchGenesisState( + metadata, config.genesisState, config.genesisStateUrl) + else: + genesisState - if genesisState == nil and checkpointState == nil: + if genesisState.isNil and checkpointState.isNil: fatal "No database and no genesis snapshot found. Please supply a genesis.ssz " & "with the network configuration" quit 1 @@ -1246,8 +1251,6 @@ proc doppelgangerChecked(node: BeaconNode, epoch: Epoch) = for validator in node.attachedValidators[]: validator.doppelgangerChecked(epoch - 1) -from ./spec/state_transition_epoch import effective_balance_might_update - proc maybeUpdateActionTrackerNextEpoch( node: BeaconNode, forkyState: ForkyHashedBeaconState, nextEpoch: Epoch) = if node.consensusManager[].actionTracker.needsUpdate( @@ -1793,7 +1796,7 @@ proc installMessageValidators(node: BeaconNode) = let digest = forkDigests[].atConsensusFork(consensusFork) # beacon_block - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.1/specs/phase0/p2p-interface.md#beacon_block + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/p2p-interface.md#beacon_block node.network.addValidator( getBeaconBlocksTopic(digest), proc ( signedBlock: consensusFork.SignedBeaconBlock @@ -1910,7 +1913,7 @@ proc installMessageValidators(node: BeaconNode) = MsgSource.gossip, msg))) when consensusFork >= ConsensusFork.Capella: - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/p2p-interface.md#bls_to_execution_change + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/capella/p2p-interface.md#bls_to_execution_change node.network.addAsyncValidator( getBlsToExecutionChangeTopic(digest), proc ( msg: SignedBLSToExecutionChange @@ -2262,8 +2265,6 @@ proc doRunBeaconNode(config: var BeaconNodeConf, rng: ref HmacDrbgContext) {.rai # works for node in metadata.bootstrapNodes: config.bootstrapNodes.add node - if config.forkChoiceVersion.isNone: - config.forkChoiceVersion = some(ForkChoiceVersion.Pr3431) ## Ctrl+C handling proc controlCHandler() {.noconv.} = diff --git a/beacon_chain/rpc/rest_config_api.nim b/beacon_chain/rpc/rest_config_api.nim index 76462a815..febb5a85d 100644 --- a/beacon_chain/rpc/rest_config_api.nim +++ b/beacon_chain/rpc/rest_config_api.nim @@ -43,6 +43,8 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) = Base10.toString(MIN_DEPOSIT_AMOUNT), MAX_EFFECTIVE_BALANCE: Base10.toString(MAX_EFFECTIVE_BALANCE), + MAX_EFFECTIVE_BALANCE_ELECTRA: + Base10.toString(static(MAX_EFFECTIVE_BALANCE_ELECTRA.uint64)), EFFECTIVE_BALANCE_INCREMENT: Base10.toString(EFFECTIVE_BALANCE_INCREMENT), MIN_ATTESTATION_INCLUSION_DELAY: @@ -90,7 +92,7 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) = MAX_VOLUNTARY_EXITS: Base10.toString(MAX_VOLUNTARY_EXITS), - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/mainnet/altair.yaml + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/mainnet/altair.yaml INACTIVITY_PENALTY_QUOTIENT_ALTAIR: Base10.toString(INACTIVITY_PENALTY_QUOTIENT_ALTAIR), MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR: @@ -106,7 +108,7 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) = UPDATE_TIMEOUT: Base10.toString(UPDATE_TIMEOUT), - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/mainnet/bellatrix.yaml + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/mainnet/bellatrix.yaml INACTIVITY_PENALTY_QUOTIENT_BELLATRIX: Base10.toString(INACTIVITY_PENALTY_QUOTIENT_BELLATRIX), MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX: @@ -122,7 +124,7 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) = MAX_EXTRA_DATA_BYTES: Base10.toString(uint64(MAX_EXTRA_DATA_BYTES)), - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/mainnet/capella.yaml + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/mainnet/capella.yaml MAX_BLS_TO_EXECUTION_CHANGES: Base10.toString(uint64(MAX_BLS_TO_EXECUTION_CHANGES)), MAX_WITHDRAWALS_PER_PAYLOAD: @@ -180,6 +182,10 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) = "0x" & $cfg.DENEB_FORK_VERSION, DENEB_FORK_EPOCH: Base10.toString(uint64(cfg.DENEB_FORK_EPOCH)), + ELECTRA_FORK_VERSION: + "0x" & $cfg.ELECTRA_FORK_VERSION, + ELECTRA_FORK_EPOCH: + Base10.toString(uint64(cfg.ELECTRA_FORK_EPOCH)), SECONDS_PER_SLOT: Base10.toString(SECONDS_PER_SLOT), SECONDS_PER_ETH1_BLOCK: diff --git a/beacon_chain/rpc/rest_debug_api.nim b/beacon_chain/rpc/rest_debug_api.nim index 8a64301c3..1013c09e7 100644 --- a/beacon_chain/rpc/rest_debug_api.nim +++ b/beacon_chain/rpc/rest_debug_api.nim @@ -90,8 +90,7 @@ proc installDebugApiHandlers*(router: var RestRouter, node: BeaconNode) = var response = GetForkChoiceResponse( justified_checkpoint: forkChoice.checkpoints.justified.checkpoint, finalized_checkpoint: forkChoice.checkpoints.finalized, - extra_data: RestExtraData( - version: some($forkChoice.backend.proto_array.version))) + extra_data: RestExtraData()) for item in forkChoice.backend.proto_array: let diff --git a/beacon_chain/spec/beacon_time.nim b/beacon_chain/spec/beacon_time.nim index 868620efd..861cbf272 100644 --- a/beacon_chain/spec/beacon_time.nim +++ b/beacon_chain/spec/beacon_time.nim @@ -43,7 +43,7 @@ const GENESIS_SLOT* = Slot(0) GENESIS_EPOCH* = Epoch(0) # compute_epoch_at_slot(GENESIS_SLOT) - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/fork-choice.md#constant + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/fork-choice.md#constant INTERVALS_PER_SLOT* = 3 FAR_FUTURE_BEACON_TIME* = BeaconTime(ns_since_genesis: int64.high()) @@ -139,16 +139,16 @@ const # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/validator.md#broadcast-aggregate aggregateSlotOffset* = TimeDiff(nanoseconds: NANOSECONDS_PER_SLOT.int64 * 2 div INTERVALS_PER_SLOT) - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#prepare-sync-committee-message + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#prepare-sync-committee-message syncCommitteeMessageSlotOffset* = TimeDiff(nanoseconds: NANOSECONDS_PER_SLOT.int64 div INTERVALS_PER_SLOT) - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#broadcast-sync-committee-contribution + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#broadcast-sync-committee-contribution syncContributionSlotOffset* = TimeDiff(nanoseconds: NANOSECONDS_PER_SLOT.int64 * 2 div INTERVALS_PER_SLOT) - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/p2p-interface.md#sync-committee + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/p2p-interface.md#sync-committee lightClientFinalityUpdateSlotOffset* = TimeDiff(nanoseconds: NANOSECONDS_PER_SLOT.int64 div INTERVALS_PER_SLOT) - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/p2p-interface.md#sync-committee + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/p2p-interface.md#sync-committee lightClientOptimisticUpdateSlotOffset* = TimeDiff(nanoseconds: NANOSECONDS_PER_SLOT.int64 div INTERVALS_PER_SLOT) @@ -188,7 +188,7 @@ func epoch*(slot: Slot): Epoch = # aka compute_epoch_at_slot if slot == FAR_FUTURE_SLOT: FAR_FUTURE_EPOCH else: Epoch(slot div SLOTS_PER_EPOCH) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/fork-choice.md#compute_slots_since_epoch_start +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/fork-choice.md#compute_slots_since_epoch_start func since_epoch_start*(slot: Slot): uint64 = # aka compute_slots_since_epoch_start ## How many slots since the beginning of the epoch (`[0..SLOTS_PER_EPOCH-1]`) (slot mod SLOTS_PER_EPOCH) @@ -196,7 +196,7 @@ func since_epoch_start*(slot: Slot): uint64 = # aka compute_slots_since_epoch_st template is_epoch*(slot: Slot): bool = slot.since_epoch_start == 0 -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#compute_start_slot_at_epoch +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#compute_start_slot_at_epoch func start_slot*(epoch: Epoch): Slot = # aka compute_start_slot_at_epoch ## Return the start slot of ``epoch``. const maxEpoch = Epoch(FAR_FUTURE_SLOT div SLOTS_PER_EPOCH) @@ -216,7 +216,7 @@ iterator slots*(epoch: Epoch): Slot = for slot in start_slot ..< start_slot + SLOTS_PER_EPOCH: yield slot -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#sync-committee +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#sync-committee template sync_committee_period*(epoch: Epoch): SyncCommitteePeriod = if epoch == FAR_FUTURE_EPOCH: FAR_FUTURE_PERIOD else: SyncCommitteePeriod(epoch div EPOCHS_PER_SYNC_COMMITTEE_PERIOD) diff --git a/beacon_chain/spec/beaconstate.nim b/beacon_chain/spec/beaconstate.nim index e6773f55b..fc7f758c1 100644 --- a/beacon_chain/spec/beaconstate.nim +++ b/beacon_chain/spec/beaconstate.nim @@ -86,7 +86,7 @@ func compute_activation_exit_epoch*(epoch: Epoch): Epoch = ## ``epoch`` take effect. epoch + 1 + MAX_SEED_LOOKAHEAD -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#get_validator_churn_limit +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#get_validator_churn_limit func get_validator_churn_limit*( cfg: RuntimeConfig, state: ForkyBeaconState, cache: var StateCache): uint64 = @@ -96,7 +96,7 @@ func get_validator_churn_limit*( count_active_validators( state, state.get_current_epoch(), cache) div cfg.CHURN_LIMIT_QUOTIENT) -# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/deneb/beacon-chain.md#new-get_validator_activation_churn_limit +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/deneb/beacon-chain.md#new-get_validator_activation_churn_limit func get_validator_activation_churn_limit*( cfg: RuntimeConfig, state: deneb.BeaconState | electra.BeaconState, cache: var StateCache): uint64 = @@ -270,7 +270,7 @@ func compute_consolidation_epoch_and_update_churn*( state.earliest_consolidation_epoch -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#updated--initiate_validator_exit +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/electra/beacon-chain.md#modified-initiate_validator_exit func initiate_validator_exit*( cfg: RuntimeConfig, state: var electra.BeaconState, index: ValidatorIndex, exit_queue_info: ExitQueueInfo, @@ -301,7 +301,7 @@ from ./datatypes/deneb import BeaconState # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/beacon-chain.md#slash_validator # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#modified-slash_validator -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#modified-slash_validator +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#modified-slash_validator # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#updated-slash_validator func get_slashing_penalty*( state: ForkyBeaconState, validator_effective_balance: Gwei): Gwei = @@ -319,21 +319,21 @@ func get_slashing_penalty*( # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.7/specs/phase0/beacon-chain.md#slash_validator # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#modified-slash_validator -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#modified-slash_validator +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#modified-slash_validator func get_whistleblower_reward*( state: phase0.BeaconState | altair.BeaconState | bellatrix.BeaconState | capella.BeaconState | deneb.BeaconState, validator_effective_balance: Gwei): Gwei = validator_effective_balance div WHISTLEBLOWER_REWARD_QUOTIENT -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#updated-slash_validator +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/electra/beacon-chain.md#modified-slash_validator func get_whistleblower_reward*( state: electra.BeaconState, validator_effective_balance: Gwei): Gwei = validator_effective_balance div WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/beacon-chain.md#slash_validator # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#modified-slash_validator -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#modified-slash_validator +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#modified-slash_validator func get_proposer_reward(state: ForkyBeaconState, whistleblower_reward: Gwei): Gwei = when state is phase0.BeaconState: whistleblower_reward div PROPOSER_REWARD_QUOTIENT @@ -346,7 +346,7 @@ func get_proposer_reward(state: ForkyBeaconState, whistleblower_reward: Gwei): G # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.7/specs/phase0/beacon-chain.md#slash_validator # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#modified-slash_validator -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#modified-slash_validator +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#modified-slash_validator proc slash_validator*( cfg: RuntimeConfig, state: var ForkyBeaconState, slashed_index: ValidatorIndex, pre_exit_queue_info: ExitQueueInfo, @@ -407,7 +407,7 @@ func get_initial_beacon_block*(state: phase0.HashedBeaconState): phase0.TrustedSignedBeaconBlock( message: message, root: hash_tree_root(message)) -# https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/altair/beacon-chain.md#initialize-state-for-pure-altair-testnets-and-test-vectors +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#initialize-state-for-pure-altair-testnets-and-test-vectors func get_initial_beacon_block*(state: altair.HashedBeaconState): altair.TrustedSignedBeaconBlock = # The genesis block is implicitly trusted @@ -419,7 +419,7 @@ func get_initial_beacon_block*(state: altair.HashedBeaconState): altair.TrustedSignedBeaconBlock( message: message, root: hash_tree_root(message)) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#testing +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#testing func get_initial_beacon_block*(state: bellatrix.HashedBeaconState): bellatrix.TrustedSignedBeaconBlock = # The genesis block is implicitly trusted @@ -624,7 +624,7 @@ func get_attesting_indices*( toSeq(get_attesting_indices_iter(state, data, aggregation_bits, cache)) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#get_attesting_indices +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#get_attesting_indices func get_attesting_indices*( state: ForkyBeaconState, data: AttestationData, aggregation_bits: ElectraCommitteeValidatorsBits, committee_bits: auto, @@ -770,7 +770,7 @@ func check_attestation_index( Result[CommitteeIndex, cstring] = check_attestation_index(data.index, committees_per_slot) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/beacon-chain.md#get_attestation_participation_flag_indices +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#get_attestation_participation_flag_indices func get_attestation_participation_flag_indices( state: altair.BeaconState | bellatrix.BeaconState | capella.BeaconState, data: AttestationData, inclusion_delay: uint64): set[TimelyFlag] = @@ -1128,7 +1128,7 @@ proc process_attestation*( ok(proposer_reward) -# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#get_next_sync_committee_indices +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#get_next_sync_committee_indices # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/electra/beacon-chain.md#modified-get_next_sync_committee_indices func get_next_sync_committee_keys( state: altair.BeaconState | bellatrix.BeaconState | capella.BeaconState | @@ -1173,7 +1173,7 @@ func get_next_sync_committee_keys( i += 1'u64 res -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/beacon-chain.md#has_eth1_withdrawal_credential +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/capella/beacon-chain.md#has_eth1_withdrawal_credential func has_eth1_withdrawal_credential*(validator: Validator): bool = ## Check if ``validator`` has an 0x01 prefixed "eth1" withdrawal credential. validator.withdrawal_credentials.data[0] == ETH1_ADDRESS_WITHDRAWAL_PREFIX @@ -1195,7 +1195,7 @@ func has_execution_withdrawal_credential*(validator: Validator): bool = has_compounding_withdrawal_credential(validator) or has_eth1_withdrawal_credential(validator) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/beacon-chain.md#is_fully_withdrawable_validator +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/capella/beacon-chain.md#is_fully_withdrawable_validator # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/electra/beacon-chain.md#updated-is_fully_withdrawable_validator func is_fully_withdrawable_validator( fork: static ConsensusFork, validator: Validator, balance: Gwei, @@ -1277,21 +1277,60 @@ func get_pending_balance_to_withdraw*( pending_balance +# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.7/specs/phase0/beacon-chain.md#effective-balances-updates +template effective_balance_might_update*( + balance: Gwei, effective_balance: Gwei): bool = + const + HYSTERESIS_INCREMENT = + EFFECTIVE_BALANCE_INCREMENT.Gwei div HYSTERESIS_QUOTIENT + DOWNWARD_THRESHOLD = HYSTERESIS_INCREMENT * HYSTERESIS_DOWNWARD_MULTIPLIER + UPWARD_THRESHOLD = HYSTERESIS_INCREMENT * HYSTERESIS_UPWARD_MULTIPLIER + balance + DOWNWARD_THRESHOLD < effective_balance or + effective_balance + UPWARD_THRESHOLD < balance + +# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/beacon-chain.md#effective-balances-updates +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.1/specs/electra/beacon-chain.md#updated-process_effective_balance_updates +template get_effective_balance_update*( + consensusFork: static ConsensusFork, balance: Gwei, + effective_balance: Gwei, vidx: uint64): Gwei = + when consensusFork <= ConsensusFork.Deneb: + min( + balance - balance mod EFFECTIVE_BALANCE_INCREMENT.Gwei, + MAX_EFFECTIVE_BALANCE.Gwei) + else: + debugComment "amortize validator read access" + let effective_balance_limit = + if has_compounding_withdrawal_credential(state.validators.item(vidx)): + MAX_EFFECTIVE_BALANCE_ELECTRA.Gwei + else: + MIN_ACTIVATION_BALANCE.Gwei + min( + balance - balance mod EFFECTIVE_BALANCE_INCREMENT.Gwei, + effective_balance_limit) + +template get_updated_effective_balance*( + consensusFork: static ConsensusFork, balance: Gwei, + effective_balance: Gwei, vidx: uint64): Gwei = + if effective_balance_might_update(balance, effective_balance): + get_effective_balance_update(consensusFork, balance, effective_balance, vidx) + else: + balance + # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/capella/beacon-chain.md#new-get_expected_withdrawals -func get_expected_withdrawals*( - state: capella.BeaconState | deneb.BeaconState): seq[Withdrawal] = +template get_expected_withdrawals_aux*( + state: capella.BeaconState | deneb.BeaconState, epoch: Epoch, + fetch_balance: untyped): seq[Withdrawal] = let - epoch = get_current_epoch(state) num_validators = lenu64(state.validators) bound = min(len(state.validators), MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP) var withdrawal_index = state.next_withdrawal_index - validator_index = state.next_withdrawal_validator_index + validator_index {.inject.} = state.next_withdrawal_validator_index withdrawals: seq[Withdrawal] = @[] for _ in 0 ..< bound: let validator = state.validators[validator_index] - balance = state.balances[validator_index] + balance = fetch_balance if is_fully_withdrawable_validator( typeof(state).kind, validator, balance, epoch): var w = Withdrawal( @@ -1315,13 +1354,20 @@ func get_expected_withdrawals*( validator_index = (validator_index + 1) mod num_validators withdrawals +func get_expected_withdrawals*( + state: capella.BeaconState | deneb.BeaconState): seq[Withdrawal] = + get_expected_withdrawals_aux(state, get_current_epoch(state)) do: + state.balances[validator_index] + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/electra/beacon-chain.md#updated-get_expected_withdrawals # This partials count is used in exactly one place, while in general being able # to cleanly treat the results of get_expected_withdrawals as a seq[Withdrawal] # are valuable enough to make that the default version of this spec function. -func get_expected_withdrawals_with_partial_count*(state: electra.BeaconState): +template get_expected_withdrawals_with_partial_count_aux*( + state: electra.BeaconState, epoch: Epoch, fetch_balance: untyped): (seq[Withdrawal], uint64) = - let epoch = get_current_epoch(state) + doAssert epoch - get_current_epoch(state) in [0'u64, 1'u64] + var withdrawal_index = state.next_withdrawal_index withdrawals: seq[Withdrawal] = @[] @@ -1333,16 +1379,31 @@ func get_expected_withdrawals_with_partial_count*(state: electra.BeaconState): break let - validator = state.validators[withdrawal.index] + validator = state.validators.item(withdrawal.index) + + # Keep a uniform variable name available for injected code + validator_index {.inject.} = withdrawal.index + + # Here, can't use the pre-stored effective balance because this template + # might be called on the next slot and therefore next epoch, after which + # the effective balance might have updated. + effective_balance_at_slot = + if epoch == get_current_epoch(state): + validator.effective_balance + else: + get_updated_effective_balance( + typeof(state).kind, fetch_balance, validator.effective_balance, + validator_index) + has_sufficient_effective_balance = - validator.effective_balance >= static(MIN_ACTIVATION_BALANCE.Gwei) - has_excess_balance = - state.balances[withdrawal.index] > static(MIN_ACTIVATION_BALANCE.Gwei) + effective_balance_at_slot >= static(MIN_ACTIVATION_BALANCE.Gwei) + has_excess_balance = fetch_balance > static(MIN_ACTIVATION_BALANCE.Gwei) if validator.exit_epoch == FAR_FUTURE_EPOCH and has_sufficient_effective_balance and has_excess_balance: - let withdrawable_balance = min( - state.balances[withdrawal.index] - static(MIN_ACTIVATION_BALANCE.Gwei), - withdrawal.amount) + let + withdrawable_balance = min( + fetch_balance - static(MIN_ACTIVATION_BALANCE.Gwei), + withdrawal.amount) var w = Withdrawal( index: withdrawal_index, validator_index: withdrawal.index, @@ -1356,13 +1417,13 @@ func get_expected_withdrawals_with_partial_count*(state: electra.BeaconState): let bound = min(len(state.validators), MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP) num_validators = lenu64(state.validators) - var validator_index = state.next_withdrawal_validator_index + var validator_index {.inject.} = state.next_withdrawal_validator_index # Sweep for remaining. for _ in 0 ..< bound: let - validator = state.validators[validator_index] - balance = state.balances[validator_index] + validator = state.validators.item(validator_index) + balance = fetch_balance if is_fully_withdrawable_validator( typeof(state).kind, validator, balance, epoch): var w = Withdrawal( @@ -1388,6 +1449,12 @@ func get_expected_withdrawals_with_partial_count*(state: electra.BeaconState): (withdrawals, partial_withdrawals_count) +template get_expected_withdrawals_with_partial_count*( + state: electra.BeaconState): (seq[Withdrawal], uint64) = + get_expected_withdrawals_with_partial_count_aux( + state, get_current_epoch(state)) do: + state.balances.item(validator_index) + func get_expected_withdrawals*(state: electra.BeaconState): seq[Withdrawal] = get_expected_withdrawals_with_partial_count(state)[0] @@ -1513,7 +1580,7 @@ proc initialize_hashed_beacon_state_from_eth1*( cfg, eth1_block_hash, eth1_timestamp, deposits, flags)) result.root = hash_tree_root(result.data) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#testing +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#testing # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/beacon-chain.md#testing # https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/deneb/beacon-chain.md#testing proc initialize_beacon_state_from_eth1*( @@ -1866,7 +1933,7 @@ func upgrade_to_capella*(cfg: RuntimeConfig, pre: bellatrix.BeaconState): # historical_summaries initialized to correct default automatically ) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/deneb/fork.md#upgrading-the-state +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/deneb/fork.md#upgrading-the-state func upgrade_to_deneb*(cfg: RuntimeConfig, pre: capella.BeaconState): ref deneb.BeaconState = let @@ -1951,7 +2018,7 @@ func upgrade_to_deneb*(cfg: RuntimeConfig, pre: capella.BeaconState): historical_summaries: pre.historical_summaries ) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/electra/fork.md#upgrading-the-state +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/electra/fork.md#upgrading-the-state func upgrade_to_electra*( cfg: RuntimeConfig, pre: deneb.BeaconState, cache: var StateCache): ref electra.BeaconState = diff --git a/beacon_chain/spec/crypto.nim b/beacon_chain/spec/crypto.nim index 9529229f9..d51176076 100644 --- a/beacon_chain/spec/crypto.nim +++ b/beacon_chain/spec/crypto.nim @@ -245,14 +245,14 @@ proc blsVerify*( # Guard against invalid signature blobs that fail to parse parsedSig.isSome() and blsVerify(pubkey, message, parsedSig.get()) -func blsVerify*(sigSet: SignatureSet): bool = +func blsVerify*(sigset: SignatureSet): bool = ## Unbatched verification ## of 1 SignatureSet ## tuple[pubkey: blscurve.PublicKey, message: array[32, byte], blscurve.signature: Signature] verify( - sigSet.pubkey, - sigSet.message, - sigSet.signature + sigset.pubkey, + sigset.message, + sigset.signature ) func blsSign*(privkey: ValidatorPrivKey, message: openArray[byte]): CookedSig = diff --git a/beacon_chain/spec/datatypes/altair.nim b/beacon_chain/spec/datatypes/altair.nim index 59405662a..9d87becaf 100644 --- a/beacon_chain/spec/datatypes/altair.nim +++ b/beacon_chain/spec/datatypes/altair.nim @@ -51,7 +51,7 @@ const PARTICIPATION_FLAG_WEIGHTS*: array[TimelyFlag, uint64] = [uint64 TIMELY_SOURCE_WEIGHT, TIMELY_TARGET_WEIGHT, TIMELY_HEAD_WEIGHT] - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#misc + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#misc TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE* = 16 SYNC_COMMITTEE_SUBNET_COUNT* = 4 @@ -78,7 +78,7 @@ static: doAssert TIMELY_SOURCE_WEIGHT + TIMELY_TARGET_WEIGHT + type ### New types - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#synccommitteemessage + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#synccommitteemessage SyncCommitteeMessage* = object slot*: Slot ## Slot to which this contribution pertains @@ -92,7 +92,7 @@ type signature*: ValidatorSig ## Signature by the validator over the block root of `slot` - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#synccommitteecontribution + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#synccommitteecontribution SyncCommitteeAggregationBits* = BitArray[SYNC_SUBCOMMITTEE_SIZE] @@ -114,18 +114,18 @@ type signature*: ValidatorSig ## Signature by the validator(s) over the block root of `slot` - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#contributionandproof + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#contributionandproof ContributionAndProof* = object aggregator_index*: uint64 # `ValidatorIndex` after validation contribution*: SyncCommitteeContribution selection_proof*: ValidatorSig - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#signedcontributionandproof + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#signedcontributionandproof SignedContributionAndProof* = object message*: ContributionAndProof signature*: ValidatorSig - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#syncaggregatorselectiondata + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#syncaggregatorselectiondata SyncAggregatorSelectionData* = object slot*: Slot subcommittee_index*: uint64 # `SyncSubcommitteeIndex` after validation diff --git a/beacon_chain/spec/datatypes/base.nim b/beacon_chain/spec/datatypes/base.nim index e32713ac4..74f937d60 100644 --- a/beacon_chain/spec/datatypes/base.nim +++ b/beacon_chain/spec/datatypes/base.nim @@ -76,7 +76,7 @@ export tables, results, endians2, json_serialization, sszTypes, beacon_time, crypto, digest, presets, kzg4844 -const SPEC_VERSION* = "1.5.0-alpha.3" +const SPEC_VERSION* = "1.5.0-alpha.5" ## Spec version we're aiming to be compatible with, right now const @@ -312,7 +312,7 @@ type HashedValidatorPubKey* = object value*: ptr HashedValidatorPubKeyItem - # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/beacon-chain.md#validator + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#validator Validator* = object pubkeyData*{.serializedFieldName: "pubkey".}: HashedValidatorPubKey @@ -334,7 +334,7 @@ type withdrawable_epoch*: Epoch ## When validator can withdraw funds - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#pendingattestation + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#pendingattestation PendingAttestation* = object aggregation_bits*: CommitteeValidatorsBits data*: AttestationData @@ -343,7 +343,7 @@ type proposer_index*: uint64 # `ValidatorIndex` after validation - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#historicalbatch + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#historicalbatch HistoricalBatch* = object block_roots* : array[SLOTS_PER_HISTORICAL_ROOT, Eth2Digest] state_roots* : array[SLOTS_PER_HISTORICAL_ROOT, Eth2Digest] @@ -380,7 +380,7 @@ type sync_committee_bits*: BitArray[SYNC_COMMITTEE_SIZE] sync_committee_signature*: TrustedSig - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#custom-types + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#custom-types Transaction* = List[byte, Limit MAX_BYTES_PER_TRANSACTION] ExecutionAddress* = object @@ -440,7 +440,7 @@ type block_summary_root*: Eth2Digest state_summary_root*: Eth2Digest - # https://github.com/ethereum/consensus-specs/blob/82133085a1295e93394ebdf71df8f2f6e0962588/specs/electra/beacon-chain.md#depositreceipt + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/electra/beacon-chain.md#pendingbalancedeposit PendingBalanceDeposit* = object index*: uint64 amount*: Gwei @@ -472,7 +472,7 @@ type pubkeys*: HashArray[Limit SYNC_COMMITTEE_SIZE, ValidatorPubKey] aggregate_pubkey*: ValidatorPubKey - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.6/specs/phase0/beacon-chain.md#beaconblockheader + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#beaconblockheader BeaconBlockHeader* = object slot*: Slot proposer_index*: uint64 # `ValidatorIndex` after validation @@ -480,7 +480,7 @@ type state_root*: Eth2Digest body_root*: Eth2Digest - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#signingdata + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#signingdata SigningData* = object object_root*: Eth2Digest domain*: Eth2Domain @@ -509,7 +509,7 @@ type sync_committees*: Table[SyncCommitteePeriod, SyncCommitteeCache] # This matches the mutable state of the Solidity deposit contract - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/solidity_deposit_contract/deposit_contract.sol + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/solidity_deposit_contract/deposit_contract.sol DepositContractState* = object branch*: array[DEPOSIT_CONTRACT_TREE_DEPTH, Eth2Digest] deposit_count*: array[32, byte] # Uint256 diff --git a/beacon_chain/spec/datatypes/bellatrix.nim b/beacon_chain/spec/datatypes/bellatrix.nim index a75b8ad30..85ad3e605 100644 --- a/beacon_chain/spec/datatypes/bellatrix.nim +++ b/beacon_chain/spec/datatypes/bellatrix.nim @@ -35,7 +35,7 @@ const NEWPAYLOAD_TIMEOUT* = 8.seconds type - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#executionpayload + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#executionpayload ExecutionPayload* = object # Execution block header fields parent_hash*: Eth2Digest @@ -63,7 +63,7 @@ type executionPayload*: ExecutionPayload blockValue*: Wei - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#executionpayloadheader + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#executionpayloadheader ExecutionPayloadHeader* = object # Execution block header fields parent_hash*: Eth2Digest @@ -93,7 +93,7 @@ type parent_hash*: Eth2Digest total_difficulty*: Eth2Digest # uint256 - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#beaconstate + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#beaconstate BeaconState* = object # Versioning genesis_time*: uint64 @@ -218,7 +218,7 @@ type state_root*: Eth2Digest body*: TrustedBeaconBlockBody - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#beaconblockbody + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#beaconblockbody BeaconBlockBody* = object randao_reveal*: ValidatorSig eth1_data*: Eth1Data diff --git a/beacon_chain/spec/datatypes/capella.nim b/beacon_chain/spec/datatypes/capella.nim index b48aa4421..9ce594c91 100644 --- a/beacon_chain/spec/datatypes/capella.nim +++ b/beacon_chain/spec/datatypes/capella.nim @@ -32,7 +32,7 @@ const # This index is rooted in `BeaconBlockBody`. # The first member (`randao_reveal`) is 16, subsequent members +1 each. # If there are ever more than 16 members in `BeaconBlockBody`, indices change! - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/ssz/merkle-proofs.md + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/ssz/merkle-proofs.md # execution_payload EXECUTION_PAYLOAD_GINDEX* = 25.GeneralizedIndex @@ -96,7 +96,7 @@ type ExecutionBranch* = array[log2trunc(EXECUTION_PAYLOAD_GINDEX), Eth2Digest] - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/capella/light-client/sync-protocol.md#modified-lightclientheader + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/capella/light-client/sync-protocol.md#modified-lightclientheader LightClientHeader* = object beacon*: BeaconBlockHeader ## Beacon block header @@ -330,7 +330,7 @@ type state_root*: Eth2Digest body*: TrustedBeaconBlockBody - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/capella/beacon-chain.md#beaconblockbody + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/capella/beacon-chain.md#beaconblockbody BeaconBlockBody* = object randao_reveal*: ValidatorSig eth1_data*: Eth1Data @@ -658,7 +658,7 @@ func upgrade_lc_bootstrap_to_capella*( current_sync_committee: pre.current_sync_committee, current_sync_committee_branch: pre.current_sync_committee_branch) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/light-client/fork.md#upgrading-light-client-data +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/capella/light-client/fork.md#upgrading-light-client-data func upgrade_lc_update_to_capella*( pre: altair.LightClientUpdate): LightClientUpdate = LightClientUpdate( diff --git a/beacon_chain/spec/datatypes/constants.nim b/beacon_chain/spec/datatypes/constants.nim index 2a84749a1..0c0a5e723 100644 --- a/beacon_chain/spec/datatypes/constants.nim +++ b/beacon_chain/spec/datatypes/constants.nim @@ -87,5 +87,5 @@ const UNSET_DEPOSIT_REQUESTS_START_INDEX*: uint64 = not 0'u64 FULL_EXIT_REQUEST_AMOUNT*: uint64 = 0 - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/electra/beacon-chain.md#withdrawal-prefixes + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/electra/beacon-chain.md#withdrawal-prefixes COMPOUNDING_WITHDRAWAL_PREFIX* = 0x02 diff --git a/beacon_chain/spec/datatypes/deneb.nim b/beacon_chain/spec/datatypes/deneb.nim index e63fced5b..a1d311380 100644 --- a/beacon_chain/spec/datatypes/deneb.nim +++ b/beacon_chain/spec/datatypes/deneb.nim @@ -77,7 +77,7 @@ type kzg_commitment*: KzgCommitment versioned_hash*: string # TODO should be string; VersionedHash not distinct - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/deneb/p2p-interface.md#blobidentifier + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/deneb/p2p-interface.md#blobidentifier BlobIdentifier* = object block_root*: Eth2Digest index*: BlobIndex @@ -168,7 +168,7 @@ type ## Current sync committee corresponding to `header.beacon.state_root` current_sync_committee_branch*: altair.CurrentSyncCommitteeBranch - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/altair/light-client/sync-protocol.md#lightclientupdate + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/sync-protocol.md#lightclientupdate LightClientUpdate* = object attested_header*: LightClientHeader ## Header attested to by the sync committee @@ -467,7 +467,7 @@ type bls_to_execution_changes*: SignedBLSToExecutionChangeList blob_kzg_commitments*: KzgCommitments # [New in Deneb] - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#signedbeaconblock + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#signedbeaconblock SignedBeaconBlock* = object message*: BeaconBlock signature*: ValidatorSig @@ -627,7 +627,7 @@ func kzg_commitment_inclusion_proof_gindex*( BLOB_KZG_COMMITMENTS_FIRST_GINDEX + index -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/deneb/light-client/sync-protocol.md#modified-get_lc_execution_root +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/deneb/light-client/sync-protocol.md#modified-get_lc_execution_root func get_lc_execution_root*( header: LightClientHeader, cfg: RuntimeConfig): Eth2Digest = let epoch = header.beacon.slot.epoch @@ -658,7 +658,7 @@ func get_lc_execution_root*( ZERO_HASH -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/deneb/light-client/sync-protocol.md#modified-is_valid_light_client_header +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/deneb/light-client/sync-protocol.md#modified-is_valid_light_client_header func is_valid_light_client_header*( header: LightClientHeader, cfg: RuntimeConfig): bool = let epoch = header.beacon.slot.epoch diff --git a/beacon_chain/spec/datatypes/electra.nim b/beacon_chain/spec/datatypes/electra.nim index 29818802e..32b441016 100644 --- a/beacon_chain/spec/datatypes/electra.nim +++ b/beacon_chain/spec/datatypes/electra.nim @@ -180,7 +180,7 @@ type ExecutionBranch* = array[log2trunc(EXECUTION_PAYLOAD_GINDEX_ELECTRA), Eth2Digest] - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/validator.md#aggregateandproof + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/validator.md#aggregateandproof AggregateAndProof* = object aggregator_index*: uint64 # `ValidatorIndex` after validation aggregate*: Attestation @@ -237,7 +237,7 @@ type signature_slot*: Slot ## Slot at which the aggregate signature was created (untrusted) - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/altair/light-client/sync-protocol.md#lightclientfinalityupdate + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/sync-protocol.md#lightclientfinalityupdate LightClientFinalityUpdate* = object # Header attested to by the sync committee attested_header*: LightClientHeader @@ -394,7 +394,7 @@ type data*: BeaconState root*: Eth2Digest # hash_tree_root(data) - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#beaconblock + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#beaconblock BeaconBlock* = object ## For each slot, a proposer is chosen from the validator pool to propose ## a new block. Once the block as been proposed, it is transmitted to @@ -857,7 +857,7 @@ func upgrade_lc_header_to_electra*( transactions_root: pre.execution.transactions_root, withdrawals_root: pre.execution.withdrawals_root, blob_gas_used: pre.execution.blob_gas_used, - excess_blob_gas: pre.execution.blob_gas_used, + excess_blob_gas: pre.execution.excess_blob_gas, deposit_requests_root: ZERO_HASH, # [New in Electra:EIP6110] withdrawal_requests_root: ZERO_HASH, # [New in Electra:EIP7002:EIP7251] consolidation_requests_root: ZERO_HASH), # [New in Electra:EIP7251] diff --git a/beacon_chain/spec/eth2_apis/rest_types.nim b/beacon_chain/spec/eth2_apis/rest_types.nim index 1330c50aa..0c2ff4381 100644 --- a/beacon_chain/spec/eth2_apis/rest_types.nim +++ b/beacon_chain/spec/eth2_apis/rest_types.nim @@ -601,7 +601,7 @@ type extra_data*: Option[RestNodeExtraData] RestExtraData* = object - version*: Option[string] + discard GetForkChoiceResponse* = object justified_checkpoint*: Checkpoint diff --git a/beacon_chain/spec/forks_light_client.nim b/beacon_chain/spec/forks_light_client.nim index 51c1d11e8..2337a986d 100644 --- a/beacon_chain/spec/forks_light_client.nim +++ b/beacon_chain/spec/forks_light_client.nim @@ -169,20 +169,6 @@ type of LightClientDataFork.Electra: electraData*: electra.LightClientStore -func lcDataForkAtEpoch*( - cfg: RuntimeConfig, epoch: Epoch): LightClientDataFork = - static: doAssert LightClientDataFork.high == LightClientDataFork.Electra - if epoch >= cfg.ELECTRA_FORK_EPOCH: - LightClientDataFork.Electra - elif epoch >= cfg.DENEB_FORK_EPOCH: - LightClientDataFork.Deneb - elif epoch >= cfg.CAPELLA_FORK_EPOCH: - LightClientDataFork.Capella - elif epoch >= cfg.ALTAIR_FORK_EPOCH: - LightClientDataFork.Altair - else: - LightClientDataFork.None - template kind*( # `SomeLightClientObject`: https://github.com/nim-lang/Nim/issues/18095 x: typedesc[ diff --git a/beacon_chain/spec/helpers.nim b/beacon_chain/spec/helpers.nim index a42f7dd1d..448c8510a 100644 --- a/beacon_chain/spec/helpers.nim +++ b/beacon_chain/spec/helpers.nim @@ -25,7 +25,7 @@ import export eth2_merkleization, forks, rlp, ssz_codec -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/weak-subjectivity.md#constants +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/weak-subjectivity.md#constants const ETH_TO_GWEI = 1_000_000_000.Gwei func toEther*(gwei: Gwei): Ether = @@ -162,7 +162,7 @@ func compute_domain*( result[0..3] = domain_type.data result[4..31] = fork_data_root.data.toOpenArray(0, 27) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#get_domain +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#get_domain func get_domain*( fork: Fork, domain_type: DomainType, @@ -264,7 +264,7 @@ func create_blob_sidecars*( res.add(sidecar) res -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/sync-protocol.md#is_sync_committee_update +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/sync-protocol.md#is_sync_committee_update template is_sync_committee_update*(update: SomeForkyLightClientUpdate): bool = when update is SomeForkyLightClientUpdateWithSyncCommittee: update.next_sync_committee_branch != @@ -393,7 +393,7 @@ func contextEpoch*(bootstrap: ForkyLightClientBootstrap): Epoch = func contextEpoch*(update: SomeForkyLightClientUpdate): Epoch = update.attested_header.beacon.slot.epoch -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#is_merge_transition_complete +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#is_merge_transition_complete func is_merge_transition_complete*( state: bellatrix.BeaconState | capella.BeaconState | deneb.BeaconState | electra.BeaconState): bool = @@ -401,7 +401,7 @@ func is_merge_transition_complete*( default(typeof(state.latest_execution_payload_header)) state.latest_execution_payload_header != defaultExecutionPayloadHeader -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/sync/optimistic.md#helpers +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/sync/optimistic.md#helpers func is_execution_block*(blck: SomeForkyBeaconBlock): bool = when typeof(blck).kind >= ConsensusFork.Bellatrix: const defaultExecutionPayload = @@ -410,7 +410,7 @@ func is_execution_block*(blck: SomeForkyBeaconBlock): bool = else: false -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#is_merge_transition_block +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#is_merge_transition_block func is_merge_transition_block( state: bellatrix.BeaconState | capella.BeaconState | deneb.BeaconState | electra.BeaconState, @@ -426,7 +426,7 @@ func is_merge_transition_block( not is_merge_transition_complete(state) and body.execution_payload != defaultExecutionPayload -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#is_execution_enabled +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#is_execution_enabled func is_execution_enabled*( state: bellatrix.BeaconState | capella.BeaconState | deneb.BeaconState | electra.BeaconState, @@ -440,7 +440,7 @@ func is_execution_enabled*( electra.SigVerifiedBeaconBlockBody): bool = is_merge_transition_block(state, body) or is_merge_transition_complete(state) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#compute_timestamp_at_slot +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#compute_timestamp_at_slot func compute_timestamp_at_slot*(state: ForkyBeaconState, slot: Slot): uint64 = # Note: This function is unsafe with respect to overflows and underflows. let slots_since_genesis = slot - GENESIS_SLOT diff --git a/beacon_chain/spec/helpers_el.nim b/beacon_chain/spec/helpers_el.nim new file mode 100644 index 000000000..d33d1b39f --- /dev/null +++ b/beacon_chain/spec/helpers_el.nim @@ -0,0 +1,46 @@ +# beacon_chain +# Copyright (c) 2024 Status Research & Development GmbH +# Licensed and distributed under either of +# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). +# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). +# at your option. This file may not be copied, modified, or distributed except according to those terms. + +{.push raises: [].} + +import + std/typetraits, + eth/common/eth_types_rlp, + "."/[helpers, state_transition_block] + +func readExecutionTransaction( + txBytes: bellatrix.Transaction): Result[ExecutionTransaction, string] = + # Nim 2.0.8: `rlp.decode(distinctBase(txBytes), ExecutionTransaction)` + # uses the generic `read` from `rlp.nim` instead of the specific `read` + # from `eth_types_rlp.nim`, leading to compilation error. + # Doing this in two steps works around this resolution order issue. + var rlp = rlpFromBytes(distinctBase(txBytes)) + try: + ok rlp.read(ExecutionTransaction) + except RlpError as exc: + err("Invalid transaction: " & exc.msg) + +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.4/specs/deneb/beacon-chain.md#is_valid_versioned_hashes +func is_valid_versioned_hashes*(blck: ForkyBeaconBlock): Result[void, string] = + static: doAssert typeof(blck).kind >= ConsensusFork.Deneb + template transactions: untyped = blck.body.execution_payload.transactions + template commitments: untyped = blck.body.blob_kzg_commitments + + var i = 0 + for txBytes in transactions: + if txBytes.len == 0 or txBytes[0] != TxEip4844.byte: + continue # Only blob transactions may have blobs + let tx = ? txBytes.readExecutionTransaction() + for vHash in tx.versionedHashes: + if commitments.len <= i: + return err("Extra blobs without matching `blob_kzg_commitments`") + if vHash.data != kzg_commitment_to_versioned_hash(commitments[i]): + return err("Invalid `blob_versioned_hash` at index " & $i) + inc i + if i != commitments.len: + return err("Extra `blob_kzg_commitments` without matching blobs") + ok() diff --git a/beacon_chain/spec/keystore.nim b/beacon_chain/spec/keystore.nim index bd32f6871..3e7ad5f6a 100644 --- a/beacon_chain/spec/keystore.nim +++ b/beacon_chain/spec/keystore.nim @@ -1380,13 +1380,13 @@ proc createWallet*(kdfKind: KdfKind, crypto: crypto, nextAccount: nextAccount.get(0)) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/validator.md#bls_withdrawal_prefix +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/validator.md#bls_withdrawal_prefix func makeWithdrawalCredentials*(k: ValidatorPubKey): Eth2Digest = var bytes = eth2digest(k.toRaw()) bytes.data[0] = BLS_WITHDRAWAL_PREFIX.uint8 bytes -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/deposit-contract.md#withdrawal-credentials +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/deposit-contract.md#withdrawal-credentials func makeWithdrawalCredentials*(k: CookedPubKey): Eth2Digest = makeWithdrawalCredentials(k.toPubKey()) diff --git a/beacon_chain/spec/network.nim b/beacon_chain/spec/network.nim index d36fe7112..3b95d8458 100644 --- a/beacon_chain/spec/network.nim +++ b/beacon_chain/spec/network.nim @@ -14,8 +14,8 @@ import export base const - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/p2p-interface.md#topics-and-messages - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/p2p-interface.md#topics-and-messages + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/p2p-interface.md#topics-and-messages + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/capella/p2p-interface.md#topics-and-messages topicBeaconBlocksSuffix* = "beacon_block/ssz_snappy" topicVoluntaryExitsSuffix* = "voluntary_exit/ssz_snappy" topicProposerSlashingsSuffix* = "proposer_slashing/ssz_snappy" @@ -27,7 +27,7 @@ const # The spec now includes this as a bare uint64 as `RESP_TIMEOUT` RESP_TIMEOUT_DUR* = RESP_TIMEOUT.int64.seconds - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/altair/light-client/p2p-interface.md#configuration + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/p2p-interface.md#configuration MAX_REQUEST_LIGHT_CLIENT_UPDATES* = 128 # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/deneb/p2p-interface.md#configuration @@ -63,7 +63,7 @@ func getAttesterSlashingsTopic*(forkDigest: ForkDigest): string = func getAggregateAndProofsTopic*(forkDigest: ForkDigest): string = eth2Prefix(forkDigest) & topicAggregateAndProofsSuffix -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/p2p-interface.md#topics-and-messages +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/capella/p2p-interface.md#topics-and-messages func getBlsToExecutionChangeTopic*(forkDigest: ForkDigest): string = eth2Prefix(forkDigest) & topicBlsToExecutionChangeSuffix @@ -197,7 +197,7 @@ func getTargetGossipState*( targetForks func nearSyncCommitteePeriod*(epoch: Epoch): Opt[uint64] = - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#sync-committee-subnet-stability + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#sync-committee-subnet-stability if epoch.is_sync_committee_period(): return Opt.some 0'u64 let epochsBefore = @@ -216,7 +216,7 @@ func getSyncSubnets*( if not nodeHasPubkey(pubkey): continue - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#broadcast-sync-committee-message + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#broadcast-sync-committee-message # The first quarter of the pubkeys map to subnet 0, the second quarter to # subnet 1, the third quarter to subnet 2 and the final quarter to subnet # 3. diff --git a/beacon_chain/spec/presets.nim b/beacon_chain/spec/presets.nim index 6278acbab..817a51fec 100644 --- a/beacon_chain/spec/presets.nim +++ b/beacon_chain/spec/presets.nim @@ -787,7 +787,7 @@ proc readRuntimeConfig*( "MAX_REQUEST_BLOB_SIDECARS" checkCompatibility BLOB_SIDECAR_SUBNET_COUNT - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/fork-choice.md#configuration + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/fork-choice.md#configuration # Isn't being used as a preset in the usual way: at any time, there's one correct value checkCompatibility PROPOSER_SCORE_BOOST checkCompatibility REORG_HEAD_WEIGHT_THRESHOLD diff --git a/beacon_chain/spec/presets/gnosis/electra_preset.nim b/beacon_chain/spec/presets/gnosis/electra_preset.nim index a9b2aa2e8..a2c9e6eef 100644 --- a/beacon_chain/spec/presets/gnosis/electra_preset.nim +++ b/beacon_chain/spec/presets/gnosis/electra_preset.nim @@ -8,7 +8,7 @@ {.push raises: [].} # Gnosis preset - Electra (Gnosis version not avilable yet; EF mainnet for now) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/mainnet/electra.yaml +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/mainnet/electra.yaml const # Gwei values # --------------------------------------------------------------- diff --git a/beacon_chain/spec/presets/mainnet/altair_preset.nim b/beacon_chain/spec/presets/mainnet/altair_preset.nim index 104b6725c..610af3eb9 100644 --- a/beacon_chain/spec/presets/mainnet/altair_preset.nim +++ b/beacon_chain/spec/presets/mainnet/altair_preset.nim @@ -8,7 +8,7 @@ {.push raises: [].} # Mainnet preset - Altair -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/mainnet/altair.yaml +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/mainnet/altair.yaml const # Updated penalty values # --------------------------------------------------------------- diff --git a/beacon_chain/spec/presets/mainnet/bellatrix_preset.nim b/beacon_chain/spec/presets/mainnet/bellatrix_preset.nim index 5acf0a1eb..7d40594b2 100644 --- a/beacon_chain/spec/presets/mainnet/bellatrix_preset.nim +++ b/beacon_chain/spec/presets/mainnet/bellatrix_preset.nim @@ -8,7 +8,7 @@ {.push raises: [].} # Mainnet preset - Bellatrix -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/mainnet/bellatrix.yaml +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/mainnet/bellatrix.yaml const # Updated penalty values # --------------------------------------------------------------- diff --git a/beacon_chain/spec/presets/mainnet/capella_preset.nim b/beacon_chain/spec/presets/mainnet/capella_preset.nim index 593c0f870..5e43f4ff5 100644 --- a/beacon_chain/spec/presets/mainnet/capella_preset.nim +++ b/beacon_chain/spec/presets/mainnet/capella_preset.nim @@ -8,7 +8,7 @@ {.push raises: [].} # Mainnet preset - Capella -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/mainnet/capella.yaml +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/mainnet/capella.yaml const # Max operations per block # --------------------------------------------------------------- diff --git a/beacon_chain/spec/presets/mainnet/electra_preset.nim b/beacon_chain/spec/presets/mainnet/electra_preset.nim index 3e54b2394..b2b589bcf 100644 --- a/beacon_chain/spec/presets/mainnet/electra_preset.nim +++ b/beacon_chain/spec/presets/mainnet/electra_preset.nim @@ -8,7 +8,7 @@ {.push raises: [].} # Electra preset - Electra -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/mainnet/electra.yaml +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/mainnet/electra.yaml const # Gwei values # --------------------------------------------------------------- diff --git a/beacon_chain/spec/presets/minimal/altair_preset.nim b/beacon_chain/spec/presets/minimal/altair_preset.nim index 365a94d59..eb68b5958 100644 --- a/beacon_chain/spec/presets/minimal/altair_preset.nim +++ b/beacon_chain/spec/presets/minimal/altair_preset.nim @@ -8,7 +8,7 @@ {.push raises: [].} # Minimal preset - Altair -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/minimal/altair.yaml +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/minimal/altair.yaml const # Updated penalty values # --------------------------------------------------------------- diff --git a/beacon_chain/spec/presets/minimal/bellatrix_preset.nim b/beacon_chain/spec/presets/minimal/bellatrix_preset.nim index 631e3f85c..f188ed7e4 100644 --- a/beacon_chain/spec/presets/minimal/bellatrix_preset.nim +++ b/beacon_chain/spec/presets/minimal/bellatrix_preset.nim @@ -8,7 +8,7 @@ {.push raises: [].} # Minimal preset - Bellatrix -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/minimal/bellatrix.yaml +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/minimal/bellatrix.yaml const # Updated penalty values # --------------------------------------------------------------- diff --git a/beacon_chain/spec/presets/minimal/capella_preset.nim b/beacon_chain/spec/presets/minimal/capella_preset.nim index 7851d1a87..fd1b82a5c 100644 --- a/beacon_chain/spec/presets/minimal/capella_preset.nim +++ b/beacon_chain/spec/presets/minimal/capella_preset.nim @@ -8,7 +8,7 @@ {.push raises: [].} # Minimal preset - Capella -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/presets/minimal/capella.yaml +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/presets/minimal/capella.yaml const # Max operations per block # --------------------------------------------------------------- diff --git a/beacon_chain/spec/signatures.nim b/beacon_chain/spec/signatures.nim index f48e790af..67a4eb3d8 100644 --- a/beacon_chain/spec/signatures.nim +++ b/beacon_chain/spec/signatures.nim @@ -143,7 +143,7 @@ func compute_attestation_signing_root*( fork, DOMAIN_BEACON_ATTESTER, epoch, genesis_validators_root) compute_signing_root(attestation_data, domain) -# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/validator.md#aggregate-signature +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/validator.md#aggregate-signature func get_attestation_signature*( fork: Fork, genesis_validators_root: Eth2Digest, attestation_data: AttestationData, @@ -269,7 +269,7 @@ proc verify_voluntary_exit_signature*( blsVerify(pubkey, signing_root.data, signature) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#prepare-sync-committee-message +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#prepare-sync-committee-message func compute_sync_committee_message_signing_root*( fork: Fork, genesis_validators_root: Eth2Digest, slot: Slot, beacon_block_root: Eth2Digest): Eth2Digest = @@ -304,7 +304,7 @@ proc verify_sync_committee_signature*( blsFastAggregateVerify(pubkeys, signing_root.data, signature) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#aggregation-selection +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#aggregation-selection func compute_sync_committee_selection_proof_signing_root*( fork: Fork, genesis_validators_root: Eth2Digest, slot: Slot, subcommittee_index: SyncSubcommitteeIndex): Eth2Digest = @@ -335,7 +335,7 @@ proc verify_sync_committee_selection_proof*( blsVerify(pubkey, signing_root.data, signature) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#signature +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#signature func compute_contribution_and_proof_signing_root*( fork: Fork, genesis_validators_root: Eth2Digest, msg: ContributionAndProof): Eth2Digest = @@ -353,7 +353,7 @@ proc get_contribution_and_proof_signature*( blsSign(privkey, signing_root.data) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#aggregation-selection +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#aggregation-selection func is_sync_committee_aggregator*(signature: ValidatorSig): bool = let signatureDigest = eth2digest(signature.blob) diff --git a/beacon_chain/spec/signatures_batch.nim b/beacon_chain/spec/signatures_batch.nim index 02c0564de..d07dee8cd 100644 --- a/beacon_chain/spec/signatures_batch.nim +++ b/beacon_chain/spec/signatures_batch.nim @@ -83,7 +83,7 @@ func aggregateAttesters( # Aggregation spec requires non-empty collection # - https://tools.ietf.org/html/draft-irtf-cfrg-bls-signature-04 # Consensus specs require at least one attesting index in attestation - # - https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#is_valid_indexed_attestation + # - https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#is_valid_indexed_attestation return err("aggregateAttesters: no attesting indices") let diff --git a/beacon_chain/spec/state_transition.nim b/beacon_chain/spec/state_transition.nim index ef922b96b..9f9c61fe9 100644 --- a/beacon_chain/spec/state_transition.nim +++ b/beacon_chain/spec/state_transition.nim @@ -365,7 +365,7 @@ func partialBeaconBlock*( ): auto = const consensusFork = typeof(state).kind - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/validator.md#preparing-for-a-beaconblock + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/validator.md#preparing-for-a-beaconblock var res = consensusFork.BeaconBlock( slot: state.data.slot, proposer_index: proposer_index.uint64, diff --git a/beacon_chain/spec/state_transition_block.nim b/beacon_chain/spec/state_transition_block.nim index eb8bd16b0..b5ed6bcc1 100644 --- a/beacon_chain/spec/state_transition_block.nim +++ b/beacon_chain/spec/state_transition_block.nim @@ -10,7 +10,7 @@ # State transition - block processing, as described in # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.7/specs/phase0/beacon-chain.md#block-processing # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#block-processing -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#block-processing +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#block-processing # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/capella/beacon-chain.md#block-processing # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/deneb/beacon-chain.md#block-processing # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.1/specs/electra/beacon-chain.md#block-processing @@ -82,7 +82,7 @@ func `xor`[T: array](a, b: T): T = for i in 0..= ConsensusFork.Electra: debugComment "check hashlist add return" # [New in Electra:EIP7251] discard state.pending_balance_deposits.add PendingBalanceDeposit( - index: state.validators.lenu64 - 1, amount: amount) + index: new_vidx, amount: amount) doAssert state.validators.len == state.balances.len - bloom_filter.incl pubkey + bucketSortedValidators.add new_vidx.ValidatorIndex else: # Deposits may come with invalid signatures - in that case, they are not # turned into a validator but still get processed to keep the deposit @@ -375,10 +348,11 @@ proc apply_deposit( ok() -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/phase0/beacon-chain.md#deposits +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#deposits proc process_deposit*( cfg: RuntimeConfig, state: var ForkyBeaconState, - bloom_filter: var PubkeyBloomFilter, deposit: Deposit, flags: UpdateFlags): + bucketSortedValidators: var BucketSortedValidators, + deposit: Deposit, flags: UpdateFlags): Result[void, cstring] = ## Process an Eth1 deposit, registering a validator or increasing its balance. @@ -395,12 +369,13 @@ proc process_deposit*( # Deposits must be processed in order state.eth1_deposit_index += 1 - apply_deposit(cfg, state, bloom_filter, deposit.data, flags) + apply_deposit(cfg, state, bucketSortedValidators, deposit.data, flags) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/electra/beacon-chain.md#new-process_deposit_request +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/electra/beacon-chain.md#new-process_deposit_request func process_deposit_request*( cfg: RuntimeConfig, state: var electra.BeaconState, - bloom_filter: var PubkeyBloomFilter, deposit_request: DepositRequest, + bucketSortedValidators: var BucketSortedValidators, + deposit_request: DepositRequest, flags: UpdateFlags): Result[void, cstring] = # Set deposit request start index if state.deposit_requests_start_index == @@ -408,7 +383,7 @@ func process_deposit_request*( state.deposit_requests_start_index = deposit_request.index apply_deposit( - cfg, state, bloom_filter, DepositData( + cfg, state, bucketSortedValidators, DepositData( pubkey: deposit_request.pubkey, withdrawal_credentials: deposit_request.withdrawal_credentials, amount: deposit_request.amount, @@ -510,6 +485,7 @@ proc process_bls_to_execution_change*( # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/electra/beacon-chain.md#new-process_withdrawal_request func process_withdrawal_request*( cfg: RuntimeConfig, state: var electra.BeaconState, + bucketSortedValidators: BucketSortedValidators, withdrawal_request: WithdrawalRequest, cache: var StateCache) = let amount = withdrawal_request.amount @@ -523,7 +499,9 @@ func process_withdrawal_request*( let request_pubkey = withdrawal_request.validator_pubkey # Verify pubkey exists - index = findValidatorIndex(state, request_pubkey).valueOr: + index = findValidatorIndex( + state.validators.asSeq, bucketSortedValidators, + request_pubkey).valueOr: return validator = state.validators.item(index) @@ -591,6 +569,7 @@ func process_withdrawal_request*( # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/electra/beacon-chain.md#new-process_consolidation_request proc process_consolidation_request*( cfg: RuntimeConfig, state: var electra.BeaconState, + bucketSortedValidators: BucketSortedValidators, consolidation_request: ConsolidationRequest, cache: var StateCache) = # If the pending consolidations queue is full, consolidation requests are @@ -606,11 +585,14 @@ proc process_consolidation_request*( let # Verify pubkeys exists - source_index = - findValidatorIndex(state, consolidation_request.source_pubkey).valueOr: + source_index = findValidatorIndex( + state.validators.asSeq, bucketSortedValidators, + consolidation_request.source_pubkey).valueOr: return target_index = - findValidatorIndex(state, consolidation_request.target_pubkey).valueOr: + findValidatorIndex( + state.validators.asSeq, bucketSortedValidators, + consolidation_request.target_pubkey).valueOr: return # Verify that source != target, so a consolidation cannot be used as an exit. @@ -698,12 +680,26 @@ proc process_operations( # It costs a full validator set scan to construct these values; only do so if # there will be some kind of exit. - var exit_queue_info = - if body.proposer_slashings.len + body.attester_slashings.len + - body.voluntary_exits.len > 0: - get_state_exit_queue_info(state) - else: - default(ExitQueueInfo) # not used + # TODO Electra doesn't use exit_queue_info, don't calculate + var + exit_queue_info = + if body.proposer_slashings.len + body.attester_slashings.len + + body.voluntary_exits.len > 0: + get_state_exit_queue_info(state) + else: + default(ExitQueueInfo) # not used + bsv_use = + when typeof(body).kind >= ConsensusFork.Electra: + body.deposits.len + body.execution_payload.deposit_requests.len + + body.execution_payload.withdrawal_requests.len + + body.execution_payload.consolidation_requests.len > 0 + else: + body.deposits.len > 0 + bsv = + if bsv_use: + sortValidatorBuckets(state.validators.asSeq) + else: + nil # this is a logic error, effectively assert for op in body.proposer_slashings: let (proposer_slashing_reward, new_exit_queue_info) = @@ -718,10 +714,8 @@ proc process_operations( for op in body.attestations: operations_rewards.attestations += ? process_attestation(state, op, flags, base_reward_per_increment, cache) - if body.deposits.len > 0: - let bloom_filter = constructBloomFilter(state.validators.asSeq) - for op in body.deposits: - ? process_deposit(cfg, state, bloom_filter[], op, flags) + for op in body.deposits: + ? process_deposit(cfg, state, bsv[], op, flags) for op in body.voluntary_exits: exit_queue_info = ? process_voluntary_exit( cfg, state, op, flags, exit_queue_info, cache) @@ -731,15 +725,13 @@ proc process_operations( when typeof(body).kind >= ConsensusFork.Electra: for op in body.execution_payload.deposit_requests: - debugComment "combine with previous Bloom filter construction" - let bloom_filter = constructBloomFilter(state.validators.asSeq) - ? process_deposit_request(cfg, state, bloom_filter[], op, {}) + ? process_deposit_request(cfg, state, bsv[], op, {}) for op in body.execution_payload.withdrawal_requests: # [New in Electra:EIP7002:7251] - process_withdrawal_request(cfg, state, op, cache) + process_withdrawal_request(cfg, state, bsv[], op, cache) for op in body.execution_payload.consolidation_requests: # [New in Electra:EIP7251] - process_consolidation_request(cfg, state, op, cache) + process_consolidation_request(cfg, state, bsv[], op, cache) ok(operations_rewards) @@ -756,11 +748,11 @@ func get_participant_reward*(total_active_balance: Gwei): Gwei = WEIGHT_DENOMINATOR div SLOTS_PER_EPOCH max_participant_rewards div SYNC_COMMITTEE_SIZE -# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#sync-aggregate-processing +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#sync-aggregate-processing func get_proposer_reward*(participant_reward: Gwei): Gwei = participant_reward * PROPOSER_WEIGHT div (WEIGHT_DENOMINATOR - PROPOSER_WEIGHT) -# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#sync-aggregate-processing +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#sync-aggregate-processing proc process_sync_aggregate*( state: var (altair.BeaconState | bellatrix.BeaconState | capella.BeaconState | deneb.BeaconState | electra.BeaconState), @@ -1117,7 +1109,7 @@ proc process_block*( ok(? process_operations(cfg, state, blck.body, 0.Gwei, flags, cache)) -# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#block-processing +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#block-processing # TODO workaround for https://github.com/nim-lang/Nim/issues/18095 # copy of datatypes/altair.nim type SomeAltairBlock = @@ -1146,7 +1138,7 @@ proc process_block*( ok(operations_rewards) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#block-processing +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#block-processing # TODO workaround for https://github.com/nim-lang/Nim/issues/18095 type SomeBellatrixBlock = bellatrix.BeaconBlock | bellatrix.SigVerifiedBeaconBlock | bellatrix.TrustedBeaconBlock diff --git a/beacon_chain/spec/state_transition_epoch.nim b/beacon_chain/spec/state_transition_epoch.nim index c8e2c2b5a..95bf42366 100644 --- a/beacon_chain/spec/state_transition_epoch.nim +++ b/beacon_chain/spec/state_transition_epoch.nim @@ -10,7 +10,7 @@ # State transition - epoch processing, as described in # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.6/specs/phase0/beacon-chain.md#epoch-processing # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#epoch-processing -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#epoch-processing +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#epoch-processing # https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/capella/beacon-chain.md#epoch-processing # # The entry point is `process_epoch`, which is at the bottom of this file. @@ -535,7 +535,7 @@ func get_attestation_component_delta( else: RewardDelta(penalties: base_reward) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#components-of-attestation-deltas +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#components-of-attestation-deltas func get_source_delta*( validator: RewardStatus, base_reward: Gwei, @@ -694,14 +694,14 @@ func get_unslashed_participating_increment*( flag_index: TimelyFlag): uint64 = info.balances.previous_epoch[flag_index] div EFFECTIVE_BALANCE_INCREMENT.Gwei -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/beacon-chain.md#get_flag_index_deltas +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#get_flag_index_deltas func get_active_increments*( info: altair.EpochInfo | bellatrix.BeaconState): uint64 = info.balances.current_epoch div EFFECTIVE_BALANCE_INCREMENT.Gwei # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#get_flag_index_deltas -# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#modified-get_inactivity_penalty_deltas -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#modified-get_inactivity_penalty_deltas +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#modified-get_inactivity_penalty_deltas +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#modified-get_inactivity_penalty_deltas # Combines get_flag_index_deltas() and get_inactivity_penalty_deltas() template get_flag_and_inactivity_delta( state: altair.BeaconState | bellatrix.BeaconState | capella.BeaconState | @@ -843,7 +843,7 @@ func get_flag_and_inactivity_delta_for_validator( active_increments, penalty_denominator, epoch_participation, participating_increments, info, vidx, inactivity_score.uint64) -# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/beacon-chain.md#rewards-and-penalties-1 +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#rewards-and-penalties-1 func process_rewards_and_penalties*( state: var phase0.BeaconState, info: var phase0.EpochInfo) = # No rewards are applied at the end of `GENESIS_EPOCH` because rewards are @@ -866,7 +866,7 @@ func process_rewards_and_penalties*( decrease_balance(balance, v.delta.penalties) state.balances.asSeq()[idx] = balance -# https://github.com/ethereum/consensus-specs/blob/v1.4.0-alpha.3/specs/altair/beacon-chain.md#rewards-and-penalties +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#rewards-and-penalties func process_rewards_and_penalties*( cfg: RuntimeConfig, state: var (altair.BeaconState | bellatrix.BeaconState | @@ -902,7 +902,7 @@ func process_rewards_and_penalties*( from std/heapqueue import HeapQueue, `[]`, len, push, replace -# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.6/specs/phase0/beacon-chain.md#registry-updates +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#registry-updates func process_registry_updates*( cfg: RuntimeConfig, state: var (phase0.BeaconState | altair.BeaconState | @@ -971,7 +971,7 @@ func process_registry_updates*( ok() -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#updated--process_registry_updates +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/electra/beacon-chain.md#modified-process_registry_updates func process_registry_updates*( cfg: RuntimeConfig, state: var electra.BeaconState, cache: var StateCache): Result[void, cstring] = @@ -999,7 +999,7 @@ func process_registry_updates*( # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.7/specs/phase0/beacon-chain.md#slashings # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#slashings -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#slashings +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#slashings func get_adjusted_total_slashing_balance*( state: ForkyBeaconState, total_balance: Gwei): Gwei = const multiplier = @@ -1018,14 +1018,14 @@ func get_adjusted_total_slashing_balance*( # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.7/specs/phase0/beacon-chain.md#slashings # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#slashings -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#slashings +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#slashings func slashing_penalty_applies*(validator: Validator, epoch: Epoch): bool = validator.slashed and epoch + EPOCHS_PER_SLASHINGS_VECTOR div 2 == validator.withdrawable_epoch # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.7/specs/phase0/beacon-chain.md#slashings -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/beacon-chain.md#slashings -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#slashings +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#slashings +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#slashings func get_slashing_penalty*(validator: Validator, adjusted_total_slashing_balance, total_balance: Gwei): Gwei = @@ -1036,8 +1036,8 @@ func get_slashing_penalty*(validator: Validator, penalty_numerator div total_balance * increment # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.7/specs/phase0/beacon-chain.md#slashings -# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#slashings -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/bellatrix/beacon-chain.md#slashings +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#slashings +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/bellatrix/beacon-chain.md#slashings func get_slashing( state: ForkyBeaconState, total_balance: Gwei, vidx: ValidatorIndex): Gwei = # For efficiency reasons, it doesn't make sense to have process_slashings use @@ -1075,61 +1075,18 @@ func process_eth1_data_reset*(state: var ForkyBeaconState) = if next_epoch mod EPOCHS_PER_ETH1_VOTING_PERIOD == 0: state.eth1_data_votes = default(type state.eth1_data_votes) -# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.7/specs/phase0/beacon-chain.md#effective-balances-updates -template effective_balance_might_update*( - balance: Gwei, effective_balance: Gwei): bool = - const - HYSTERESIS_INCREMENT = - EFFECTIVE_BALANCE_INCREMENT.Gwei div HYSTERESIS_QUOTIENT - DOWNWARD_THRESHOLD = HYSTERESIS_INCREMENT * HYSTERESIS_DOWNWARD_MULTIPLIER - UPWARD_THRESHOLD = HYSTERESIS_INCREMENT * HYSTERESIS_UPWARD_MULTIPLIER - balance + DOWNWARD_THRESHOLD < effective_balance or - effective_balance + UPWARD_THRESHOLD < balance - # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/beacon-chain.md#effective-balances-updates -func process_effective_balance_updates*( - state: var (phase0.BeaconState | altair.BeaconState | - bellatrix.BeaconState | capella.BeaconState | - deneb.BeaconState)) = - # Update effective balances with hysteresis - for vidx in state.validators.vindices: - let - balance = state.balances.item(vidx) - effective_balance = state.validators.item(vidx).effective_balance - if effective_balance_might_update(balance, effective_balance): - let new_effective_balance = - min( - balance - balance mod EFFECTIVE_BALANCE_INCREMENT.Gwei, - MAX_EFFECTIVE_BALANCE.Gwei) - # Protect against unnecessary cache invalidation - if new_effective_balance != effective_balance: - state.validators.mitem(vidx).effective_balance = new_effective_balance - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.1/specs/electra/beacon-chain.md#updated-process_effective_balance_updates -func process_effective_balance_updates*(state: var electra.BeaconState) = +func process_effective_balance_updates*(state: var ForkyBeaconState) = # Update effective balances with hysteresis for vidx in state.validators.vindices: let balance = state.balances.item(vidx) effective_balance = state.validators.item(vidx).effective_balance + if effective_balance_might_update(balance, effective_balance): - debugComment "amortize validator read access" - # Wrapping MAX_EFFECTIVE_BALANCE_ELECTRA.Gwei and - # MIN_ACTIVATION_BALANCE.Gwei in static() results - # in - # beacon_chain/spec/state_transition_epoch.nim(1067, 20) Error: expected: ':', but got: '(' - # even though it'd be better to statically verify safety - let - effective_balance_limit = - if has_compounding_withdrawal_credential( - state.validators.item(vidx)): - MAX_EFFECTIVE_BALANCE_ELECTRA.Gwei - else: - MIN_ACTIVATION_BALANCE.Gwei - new_effective_balance = - min( - balance - balance mod EFFECTIVE_BALANCE_INCREMENT.Gwei, - effective_balance_limit) + let new_effective_balance = get_effective_balance_update( + typeof(state).kind, balance, effective_balance, vidx.distinctBase) # Protect against unnecessary cache invalidation if new_effective_balance != effective_balance: state.validators.mitem(vidx).effective_balance = new_effective_balance @@ -1167,7 +1124,7 @@ func process_historical_roots_update*(state: var ForkyBeaconState) = if next_epoch mod (SLOTS_PER_HISTORICAL_ROOT div SLOTS_PER_EPOCH) == 0: # Equivalent to hash_tree_root(foo: HistoricalBatch), but without using # significant additional stack or heap. - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#historicalbatch + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#historicalbatch # In response to https://github.com/status-im/nimbus-eth2/issues/921 if not state.historical_roots.add state.compute_historical_root(): raiseAssert "no more room for historical roots, so long and thanks for the fish!" @@ -1277,8 +1234,10 @@ func process_historical_summaries_update*( func process_pending_balance_deposits*( cfg: RuntimeConfig, state: var electra.BeaconState, cache: var StateCache): Result[void, cstring] = - let available_for_processing = state.deposit_balance_to_consume + - get_activation_exit_churn_limit(cfg, state, cache) + let + next_epoch = get_current_epoch(state) + 1 + available_for_processing = state.deposit_balance_to_consume + + get_activation_exit_churn_limit(cfg, state, cache) var processed_amount = 0.Gwei next_deposit_index = 0 @@ -1293,7 +1252,7 @@ func process_pending_balance_deposits*( # Validator is exiting, postpone the deposit until after withdrawable epoch if validator.exit_epoch < FAR_FUTURE_EPOCH: - if get_current_epoch(state) <= validator.withdrawable_epoch: + if next_epoch <= validator.withdrawable_epoch: deposits_to_postpone.add(deposit) # Deposited balance will never become active. Increase balance but do not # consume churn @@ -1333,6 +1292,7 @@ func process_pending_balance_deposits*( func process_pending_consolidations*( cfg: RuntimeConfig, state: var electra.BeaconState): Result[void, cstring] = + let next_epoch = get_current_epoch(state) + 1 var next_pending_consolidation = 0 for pending_consolidation in state.pending_consolidations: let source_validator = @@ -1340,7 +1300,7 @@ func process_pending_consolidations*( if source_validator.slashed: next_pending_consolidation += 1 continue - if source_validator.withdrawable_epoch > get_current_epoch(state): + if source_validator.withdrawable_epoch > next_epoch: break let @@ -1424,7 +1384,7 @@ func init*( deneb.BeaconState | electra.BeaconState): T = init(result, state) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/beacon-chain.md#epoch-processing +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#epoch-processing proc process_epoch*( cfg: RuntimeConfig, state: var (altair.BeaconState | bellatrix.BeaconState), @@ -1451,7 +1411,7 @@ proc process_epoch*( process_inactivity_updates(cfg, state, info) # [New in Altair] - # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#rewards-and-penalties + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#rewards-and-penalties process_rewards_and_penalties(cfg, state, info) # [Modified in Altair] # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/beacon-chain.md#registry-updates @@ -1503,7 +1463,7 @@ proc process_epoch*( # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.6/specs/phase0/beacon-chain.md#registry-updates ? process_registry_updates(cfg, state, cache) - # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#slashings + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#slashings process_slashings(state, info.balances.current_epoch) process_eth1_data_reset(state) @@ -1526,7 +1486,7 @@ proc process_epoch*( info.init(state) - # https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/altair/beacon-chain.md#justification-and-finalization + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/beacon-chain.md#justification-and-finalization process_justification_and_finalization(state, info.balances, flags) # state.slot hasn't been incremented yet. @@ -1564,9 +1524,8 @@ proc process_epoch*( ok() proc get_validator_balance_after_epoch*( - cfg: RuntimeConfig, - state: deneb.BeaconState | electra.BeaconState, - flags: UpdateFlags, cache: var StateCache, info: var altair.EpochInfo, + cfg: RuntimeConfig, state: deneb.BeaconState | electra.BeaconState, + cache: var StateCache, info: var altair.EpochInfo, index: ValidatorIndex): Gwei = # Run a subset of process_epoch() which affects an individual validator, # without modifying state itself @@ -1586,7 +1545,7 @@ proc get_validator_balance_after_epoch*( weigh_justification_and_finalization( state, info.balances.current_epoch, info.balances.previous_epoch[TIMELY_TARGET_FLAG_INDEX], - info.balances.current_epoch_TIMELY_TARGET, flags) + info.balances.current_epoch_TIMELY_TARGET, {}) # Used as part of process_rewards_and_penalties let inactivity_score = @@ -1667,3 +1626,21 @@ proc get_validator_balance_after_epoch*( processed_amount += deposit.amount post_epoch_balance + +proc get_next_slot_expected_withdrawals*( + cfg: RuntimeConfig, state: deneb.BeaconState, cache: var StateCache, + info: var altair.EpochInfo): seq[Withdrawal] = + get_expected_withdrawals_aux(state, (state.slot + 1).epoch) do: + # validator_index is defined by an injected symbol within the template + get_validator_balance_after_epoch( + cfg, state, cache, info, validator_index.ValidatorIndex) + +proc get_next_slot_expected_withdrawals*( + cfg: RuntimeConfig, state: electra.BeaconState, cache: var StateCache, + info: var altair.EpochInfo): seq[Withdrawal] = + let (res, _) = get_expected_withdrawals_with_partial_count_aux( + state, (state.slot + 1).epoch) do: + # validator_index is defined by an injected symbol within the template + get_validator_balance_after_epoch( + cfg, state, cache, info, validator_index.ValidatorIndex) + res diff --git a/beacon_chain/spec/validator.nim b/beacon_chain/spec/validator.nim index cc04b33ce..43bc65a5f 100644 --- a/beacon_chain/spec/validator.nim +++ b/beacon_chain/spec/validator.nim @@ -158,7 +158,7 @@ func get_shuffled_active_validator_indices*( withState(state): cache.get_shuffled_active_validator_indices(forkyState.data, epoch) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#get_active_validator_indices +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#get_active_validator_indices func count_active_validators*(state: ForkyBeaconState, epoch: Epoch, cache: var StateCache): uint64 = @@ -394,7 +394,7 @@ func compute_proposer_index(state: ForkyBeaconState, ## Return from ``indices`` a random index sampled by effective balance. compute_proposer_index(state, indices, seed, shuffled_index) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#get_beacon_proposer_index +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#get_beacon_proposer_index func get_beacon_proposer_index*( state: ForkyBeaconState, cache: var StateCache, slot: Slot): Opt[ValidatorIndex] = diff --git a/beacon_chain/spec/weak_subjectivity.nim b/beacon_chain/spec/weak_subjectivity.nim index 2fe449015..a647d7e65 100644 --- a/beacon_chain/spec/weak_subjectivity.nim +++ b/beacon_chain/spec/weak_subjectivity.nim @@ -10,10 +10,10 @@ import ./datatypes/base, ./beaconstate, ./forks, ./helpers -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/weak-subjectivity.md#configuration +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/weak-subjectivity.md#configuration const SAFETY_DECAY* = 10'u64 -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/weak-subjectivity.md#compute_weak_subjectivity_period +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/weak-subjectivity.md#compute_weak_subjectivity_period func compute_weak_subjectivity_period( cfg: RuntimeConfig, state: ForkyBeaconState): uint64 = ## Returns the weak subjectivity period for the current ``state``. @@ -49,7 +49,7 @@ func compute_weak_subjectivity_period( ws_period -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/weak-subjectivity.md#is_within_weak_subjectivity_period +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/weak-subjectivity.md#is_within_weak_subjectivity_period func is_within_weak_subjectivity_period*(cfg: RuntimeConfig, current_slot: Slot, ws_state: ForkedHashedBeaconState, ws_checkpoint: Checkpoint): bool = diff --git a/beacon_chain/sync/light_client_manager.nim b/beacon_chain/sync/light_client_manager.nim index f8b8bc5a4..30837b35f 100644 --- a/beacon_chain/sync/light_client_manager.nim +++ b/beacon_chain/sync/light_client_manager.nim @@ -65,6 +65,7 @@ type getFinalizedPeriod: GetSyncCommitteePeriodCallback getOptimisticPeriod: GetSyncCommitteePeriodCallback getBeaconTime: GetBeaconTimeFn + shouldInhibitSync: GetBoolCallback loopFuture: Future[void].Raising([CancelledError]) func init*( @@ -80,7 +81,8 @@ func init*( isNextSyncCommitteeKnown: GetBoolCallback, getFinalizedPeriod: GetSyncCommitteePeriodCallback, getOptimisticPeriod: GetSyncCommitteePeriodCallback, - getBeaconTime: GetBeaconTimeFn + getBeaconTime: GetBeaconTimeFn, + shouldInhibitSync: GetBoolCallback = nil ): LightClientManager = ## Initialize light client manager. LightClientManager( @@ -95,8 +97,8 @@ func init*( isNextSyncCommitteeKnown: isNextSyncCommitteeKnown, getFinalizedPeriod: getFinalizedPeriod, getOptimisticPeriod: getOptimisticPeriod, - getBeaconTime: getBeaconTime - ) + getBeaconTime: getBeaconTime, + shouldInhibitSync: shouldInhibitSync) proc isGossipSupported*( self: LightClientManager, @@ -328,13 +330,14 @@ template query[E]( ): Future[bool].Raising([CancelledError]) = self.query(e, Nothing()) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/light-client.md#light-client-sync-process +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/light-client.md#light-client-sync-process proc loop(self: LightClientManager) {.async: (raises: [CancelledError]).} = var nextSyncTaskTime = self.getBeaconTime() while true: # Periodically wake and check for changes let wallTime = self.getBeaconTime() if wallTime < nextSyncTaskTime or + (self.shouldInhibitSync != nil and self.shouldInhibitSync()) or self.network.peerPool.lenAvailable < 1: await sleepAsync(chronos.seconds(2)) continue diff --git a/beacon_chain/sync/light_client_protocol.nim b/beacon_chain/sync/light_client_protocol.nim index 339313c00..6b5316644 100644 --- a/beacon_chain/sync/light_client_protocol.nim +++ b/beacon_chain/sync/light_client_protocol.nim @@ -90,7 +90,7 @@ p2pProtocol LightClientSync(version = 1, debug "LC bootstrap request done", peer, blockRoot - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/p2p-interface.md#lightclientupdatesbyrange + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/p2p-interface.md#lightclientupdatesbyrange proc lightClientUpdatesByRange( peer: Peer, startPeriod: SyncCommitteePeriod, @@ -134,7 +134,7 @@ p2pProtocol LightClientSync(version = 1, debug "LC updates by range request done", peer, startPeriod, count, found - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/p2p-interface.md#getlightclientfinalityupdate + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/p2p-interface.md#getlightclientfinalityupdate proc lightClientFinalityUpdate( peer: Peer, response: SingleChunkResponse[ForkedLightClientFinalityUpdate]) @@ -160,7 +160,7 @@ p2pProtocol LightClientSync(version = 1, debug "LC finality update request done", peer - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/altair/light-client/p2p-interface.md#getlightclientoptimisticupdate + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/p2p-interface.md#getlightclientoptimisticupdate proc lightClientOptimisticUpdate( peer: Peer, response: SingleChunkResponse[ForkedLightClientOptimisticUpdate]) diff --git a/beacon_chain/trusted_node_sync.nim b/beacon_chain/trusted_node_sync.nim index 42b57787a..4c89c2599 100644 --- a/beacon_chain/trusted_node_sync.nim +++ b/beacon_chain/trusted_node_sync.nim @@ -21,7 +21,7 @@ import from presto import RestDecodingError const - largeRequestsTimeout = 90.seconds # Downloading large items such as states. + largeRequestsTimeout = 120.seconds # Downloading large items such as states. smallRequestsTimeout = 30.seconds # Downloading smaller items such as blocks and deposit snapshots. proc fetchDepositSnapshot( @@ -171,7 +171,7 @@ proc doTrustedNodeSync*( let stateId = case syncTarget.kind of TrustedNodeSyncKind.TrustedBlockRoot: - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/light-client/light-client.md#light-client-sync-process + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/light-client.md#light-client-sync-process const lcDataFork = LightClientDataFork.high var bestViableCheckpoint: Opt[tuple[slot: Slot, state_root: Eth2Digest]] func trackBestViableCheckpoint(store: lcDataFork.LightClientStore) = diff --git a/beacon_chain/validator_bucket_sort.nim b/beacon_chain/validator_bucket_sort.nim new file mode 100644 index 000000000..2659d98e5 --- /dev/null +++ b/beacon_chain/validator_bucket_sort.nim @@ -0,0 +1,90 @@ +# beacon_chain +# Copyright (c) 2024 Status Research & Development GmbH +# Licensed and distributed under either of +# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). +# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). +# at your option. This file may not be copied, modified, or distributed except according to those terms. + +{.push raises: [].} + +import std/typetraits +import "."/spec/crypto +from "."/spec/datatypes/base import Validator, ValidatorIndex, pubkey, `==` + +const + BUCKET_BITS = 9 # >= 13 gets slow to construct + NUM_BUCKETS = 1 shl BUCKET_BITS + +type + # `newSeqUninitialized` requires its type to be SomeNumber + IntValidatorIndex = distinctBase ValidatorIndex + + BucketSortedValidators* = object + bucketSorted*: seq[IntValidatorIndex] + bucketUpperBounds: array[NUM_BUCKETS, uint] # avoids over/underflow checks + extraItems*: seq[ValidatorIndex] + +template getBucketNumber(h: ValidatorPubKey): uint = + # This assumes https://en.wikipedia.org/wiki/Avalanche_effect for uniform + # distribution across pubkeys. ValidatorPubKey specifically satisfies this + # criterion. If required, can look at more input bytes, but ultimately it + # doesn't affect correctness, only speed. + + # Otherwise need more than 2 bytes of input + static: doAssert BUCKET_BITS <= 16 + + const BUCKET_MASK = (NUM_BUCKETS - 1) + ((h.blob[0] * 256 + h.blob[1]) and BUCKET_MASK) + +func sortValidatorBuckets*(validators: openArray[Validator]): + ref BucketSortedValidators {.noinline.} = + var bucketSizes: array[NUM_BUCKETS, uint] + for validator in validators: + inc bucketSizes[getBucketNumber(validator.pubkey)] + + var + bucketInsertPositions: array[NUM_BUCKETS, uint] + accum: uint + for i, s in bucketSizes: + accum += s + bucketInsertPositions[i] = accum + doAssert accum == validators.len.uint + let res = (ref BucketSortedValidators)( + bucketSorted: newSeqUninitialized[IntValidatorIndex](validators.len), + bucketUpperBounds: bucketInsertPositions) + + for i, validator in validators: + let insertPos = + addr bucketInsertPositions[getBucketNumber(validator.pubkey)] + dec insertPos[] + res.bucketSorted[insertPos[]] = i.IntValidatorIndex + + doAssert bucketInsertPositions[0] == 0 + for i in 1 ..< NUM_BUCKETS: + doAssert res.bucketUpperBounds[i - 1] == bucketInsertPositions[i] + + res + +func add*( + bucketSortedValidators: var BucketSortedValidators, + validatorIndex: ValidatorIndex) = + bucketSortedValidators.extraItems.add validatorIndex + +func findValidatorIndex*( + validators: openArray[Validator], bsv: BucketSortedValidators, + pubkey: ValidatorPubKey): Opt[ValidatorIndex] = + for validatorIndex in bsv.extraItems: + if validators[validatorIndex.distinctBase].pubkey == pubkey: + return Opt.some validatorIndex + let + bucketNumber = getBucketNumber(pubkey) + lowerBounds = + if bucketNumber == 0: + 0'u + else: + bsv.bucketUpperBounds[bucketNumber - 1] + + for i in lowerBounds ..< bsv.bucketUpperBounds[bucketNumber]: + if validators[bsv.bucketSorted[i]].pubkey == pubkey: + return Opt.some bsv.bucketSorted[i].ValidatorIndex + Opt.none ValidatorIndex diff --git a/beacon_chain/validators/beacon_validators.nim b/beacon_chain/validators/beacon_validators.nim index 47237c1ef..9d307a5b0 100644 --- a/beacon_chain/validators/beacon_validators.nim +++ b/beacon_chain/validators/beacon_validators.nim @@ -443,8 +443,8 @@ proc getExecutionPayload( feeRecipient = $feeRecipient node.elManager.getPayload( - PayloadType, beaconHead.blck.bid.root, executionHead, latestSafe, - latestFinalized, timestamp, random, feeRecipient, withdrawals) + PayloadType, beaconHead.blck.bid.root, executionHead, latestSafe, + latestFinalized, timestamp, random, feeRecipient, withdrawals) # BlockRewards has issues resolving somehow otherwise import ".."/spec/state_transition_block @@ -1950,8 +1950,8 @@ proc handleValidatorDuties*(node: BeaconNode, lastSlot, slot: Slot) {.async: (ra updateValidatorMetrics(node) # the important stuff is done, update the vanity numbers - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/validator.md#broadcast-aggregate - # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#broadcast-sync-committee-contribution + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/validator.md#broadcast-aggregate + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#broadcast-sync-committee-contribution # Wait 2 / 3 of the slot time to allow messages to propagate, then collect # the result in aggregates static: diff --git a/beacon_chain/validators/slashing_protection.nim b/beacon_chain/validators/slashing_protection.nim index ffecb26f3..8cc6a0a7f 100644 --- a/beacon_chain/validators/slashing_protection.nim +++ b/beacon_chain/validators/slashing_protection.nim @@ -209,7 +209,7 @@ template withContext*(db: SlashingProtectionDB, body: untyped): untyped = index: ValidatorIndex, validator: ValidatorPubKey, source, target: Epoch, - attestation_signing_root: Eth2Digest): Result[void, BadVote] = + attestation_signing_root: Eth2Digest): Result[void, BadVote] {.redefine.} = registerAttestationInContextV2(Opt.some(index), validator, source, target, attestation_signing_root) block: body diff --git a/beacon_chain/validators/slashing_protection_v2.nim b/beacon_chain/validators/slashing_protection_v2.nim index 96359db80..81858ae4d 100644 --- a/beacon_chain/validators/slashing_protection_v2.nim +++ b/beacon_chain/validators/slashing_protection_v2.nim @@ -36,7 +36,7 @@ export results # - https://notes.ethereum.org/@djrtwo/Bkn3zpwxB#Validator-responsibilities # # Phase 0 spec - Honest Validator - how to avoid slashing -# - https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/validator.md#how-to-avoid-slashing +# - https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/validator.md#how-to-avoid-slashing # # In-depth reading on slashing conditions # diff --git a/beacon_chain/validators/validator_pool.nim b/beacon_chain/validators/validator_pool.nim index 4e035efac..6d13117ba 100644 --- a/beacon_chain/validators/validator_pool.nim +++ b/beacon_chain/validators/validator_pool.nim @@ -776,7 +776,7 @@ proc getAggregateAndProofSignature*(v: AttachedValidator, fork, genesis_validators_root, aggregate_and_proof) await v.signData(request) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#prepare-sync-committee-message +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#prepare-sync-committee-message proc getSyncCommitteeMessage*(v: AttachedValidator, fork: Fork, genesis_validators_root: Eth2Digest, @@ -807,7 +807,7 @@ proc getSyncCommitteeMessage*(v: AttachedValidator, ) ) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#aggregation-selection +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#aggregation-selection proc getSyncCommitteeSelectionProof*(v: AttachedValidator, fork: Fork, genesis_validators_root: Eth2Digest, slot: Slot, @@ -827,7 +827,7 @@ proc getSyncCommitteeSelectionProof*(v: AttachedValidator, fork: Fork, ) await v.signData(request) -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/altair/validator.md#broadcast-sync-committee-contribution +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/validator.md#broadcast-sync-committee-contribution proc getContributionAndProofSignature*(v: AttachedValidator, fork: Fork, genesis_validators_root: Eth2Digest, contribution_and_proof: ContributionAndProof diff --git a/beacon_chain/version.nim b/beacon_chain/version.nim index 51c33eded..29dd9fcc6 100644 --- a/beacon_chain/version.nim +++ b/beacon_chain/version.nim @@ -18,7 +18,7 @@ const "Copyright (c) 2019-" & compileYear & " Status Research & Development GmbH" versionMajor* = 24 - versionMinor* = 7 + versionMinor* = 8 versionBuild* = 0 versionBlob* = "stateofus" # Single word - ends up in the default graffiti diff --git a/docs/attestation_flow.md b/docs/attestation_flow.md index 9e48bceaf..e7805e9f7 100644 --- a/docs/attestation_flow.md +++ b/docs/attestation_flow.md @@ -6,7 +6,7 @@ This is a WIP document to explain the attestation flows. It is important to distinguish attestation `validation` from attestation `verification`. - Attestation `validation` is defined in the P2P specs. Validated attestations can be forwarded on GossipSub. - - Aggregated: https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/p2p-interface.md#beacon_aggregate_and_proof + - Aggregated: https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/p2p-interface.md#beacon_aggregate_and_proof - Unaggregated: https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/p2p-interface.md#beacon_attestation_subnet_id - Attestation `verification` is defined in the consensus specs. Verified attestations can affect fork choice and may be included in a block. - https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.6/specs/phase0/beacon-chain.md#attestations diff --git a/docs/block_flow.md b/docs/block_flow.md index 9c37f2154..dc16d9b15 100644 --- a/docs/block_flow.md +++ b/docs/block_flow.md @@ -9,7 +9,7 @@ Important distinction: https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/phase0/p2p-interface.md#beacon_block. A validated block can be forwarded on gossipsub. - and we distinguish `verification` which is defined in consensus specs: - https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/beacon-chain.md#block-processing + https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/beacon-chain.md#block-processing A block needs to be verified to enter fork choice, the DAG and the BeaconChainDB In particular in terms of costly checks validating a block only requires checking: diff --git a/docs/the_nimbus_book/src/el-light-client.md b/docs/the_nimbus_book/src/el-light-client.md index 2c896089d..4e77d543a 100644 --- a/docs/the_nimbus_book/src/el-light-client.md +++ b/docs/the_nimbus_book/src/el-light-client.md @@ -104,7 +104,7 @@ The following sections explain how to do this for certain EL clients. ## Running the light client The light client starts syncing from a trusted block. -This trusted block should be somewhat recent ([~1-2 weeks](https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/phase0/weak-subjectivity.md)) and needs to be configured each time when starting the light client. +This trusted block should be somewhat recent ([~1-2 weeks](https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/weak-subjectivity.md)) and needs to be configured each time when starting the light client. ### 1. Obtaining a trusted block root diff --git a/funding.json b/funding.json new file mode 100644 index 000000000..db37fabd9 --- /dev/null +++ b/funding.json @@ -0,0 +1,5 @@ +{ + "opRetro": { + "projectId": "0xe346264e87202b47f1057eb0b0fcaa0ea7f83e14507ca4585a91a5d94e0e92c0" + } +} diff --git a/kurtosis-network-params.yml b/kurtosis-network-params.yml new file mode 100644 index 000000000..6ca101238 --- /dev/null +++ b/kurtosis-network-params.yml @@ -0,0 +1,31 @@ +# Copyright (c) 2024 Status Research & Development GmbH +# Licensed under either of +# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or +# http://www.apache.org/licenses/LICENSE-2.0) +# * MIT license ([LICENSE-MIT](LICENSE-MIT) or +# http://opensource.org/licenses/MIT) +# at your option. This file may not be copied, modified, or distributed except +# according to those terms. + +participants_matrix: + el: + - el_type: geth + - el_type: nethermind + - el_type: erigon + cl: + - cl_type: nimbus + cl_image: + - cl_type: lighthouse + - cl_type: prysm +additional_services: + - tx_spammer + - assertoor + - beacon_metrics_gazer +mev_type: null +assertoor_params: + image: "ethpandaops/assertoor:master" + run_stability_check: true + run_block_proposal_check: true + run_transaction_test: true + run_blob_transaction_test: true + run_opcodes_transaction_test: true \ No newline at end of file diff --git a/ncli/ncli_common.nim b/ncli/ncli_common.nim index e4d9b5e0f..1565e0a12 100644 --- a/ncli/ncli_common.nim +++ b/ncli/ncli_common.nim @@ -406,6 +406,9 @@ func collectFromAttestations( rewardsAndPenalties[index].inclusion_delay = some(inclusionDelay.uint64) +from ".."/beacon_chain/validator_bucket_sort import + findValidatorIndex, sortValidatorBuckets + proc collectFromDeposits( rewardsAndPenalties: var seq[RewardsAndPenalties], forkedState: ForkedHashedBeaconState, @@ -414,9 +417,12 @@ proc collectFromDeposits( cfg: RuntimeConfig) = withStateAndBlck(forkedState, forkedBlock): for deposit in forkyBlck.message.body.deposits: - let pubkey = deposit.data.pubkey - let amount = deposit.data.amount - var index = findValidatorIndex(forkyState.data, pubkey) + let + pubkey = deposit.data.pubkey + amount = deposit.data.amount + var index = findValidatorIndex( + forkyState.data.validators.asSeq, sortValidatorBuckets( + forkyState.data.validators.asSeq)[], pubkey) if index.isNone: if pubkey in pubkeyToIndex: try: diff --git a/ncli/ncli_testnet.nim b/ncli/ncli_testnet.nim index 4a4d742ea..3f46b4abc 100644 --- a/ncli/ncli_testnet.nim +++ b/ncli/ncli_testnet.nim @@ -24,6 +24,7 @@ import from std/os import changeFileExt, fileExists from std/sequtils import mapIt, toSeq from std/times import toUnix +from ../beacon_chain/el/engine_api_conversions import asEth2Digest from ../beacon_chain/spec/beaconstate import initialize_beacon_state_from_eth1 from ../tests/mocking/mock_genesis import mockEth1BlockHash @@ -721,4 +722,4 @@ when isMainModule: # This is handled above before the case statement discard - waitFor main() + waitFor main() \ No newline at end of file diff --git a/ncli/resttest-rules.json b/ncli/resttest-rules.json index bdae75429..4a7d134ee 100644 --- a/ncli/resttest-rules.json +++ b/ncli/resttest-rules.json @@ -4012,7 +4012,7 @@ "response": { "status": {"operator": "equals", "value": "200"}, "headers": [{"key": "Content-Type", "value": "application/json", "operator": "equals"}], - "body": [{"operator": "jstructcmps", "start": ["data"], "value": {"MAX_COMMITTEES_PER_SLOT":"","TARGET_COMMITTEE_SIZE":"","MAX_VALIDATORS_PER_COMMITTEE":"","SHUFFLE_ROUND_COUNT":"","HYSTERESIS_QUOTIENT":"","HYSTERESIS_DOWNWARD_MULTIPLIER":"","HYSTERESIS_UPWARD_MULTIPLIER":"","MIN_DEPOSIT_AMOUNT":"","MAX_EFFECTIVE_BALANCE":"","EFFECTIVE_BALANCE_INCREMENT":"","MIN_ATTESTATION_INCLUSION_DELAY":"","SLOTS_PER_EPOCH":"","MIN_SEED_LOOKAHEAD":"","MAX_SEED_LOOKAHEAD":"","EPOCHS_PER_ETH1_VOTING_PERIOD":"","SLOTS_PER_HISTORICAL_ROOT":"","MIN_EPOCHS_TO_INACTIVITY_PENALTY":"","EPOCHS_PER_HISTORICAL_VECTOR":"","EPOCHS_PER_SLASHINGS_VECTOR":"","HISTORICAL_ROOTS_LIMIT":"","VALIDATOR_REGISTRY_LIMIT":"","BASE_REWARD_FACTOR":"","WHISTLEBLOWER_REWARD_QUOTIENT":"","PROPOSER_REWARD_QUOTIENT":"","INACTIVITY_PENALTY_QUOTIENT":"","MIN_SLASHING_PENALTY_QUOTIENT":"","PROPORTIONAL_SLASHING_MULTIPLIER":"","MAX_PROPOSER_SLASHINGS":"","MAX_ATTESTER_SLASHINGS":"","MAX_ATTESTATIONS":"","MAX_DEPOSITS":"","MAX_VOLUNTARY_EXITS":"","INACTIVITY_PENALTY_QUOTIENT_ALTAIR":"","MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR":"","PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR":"","SYNC_COMMITTEE_SIZE":"","EPOCHS_PER_SYNC_COMMITTEE_PERIOD":"","MIN_SYNC_COMMITTEE_PARTICIPANTS":"","UPDATE_TIMEOUT":"","INACTIVITY_PENALTY_QUOTIENT_BELLATRIX":"","MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX":"","PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX":"","MAX_BYTES_PER_TRANSACTION":"","MAX_TRANSACTIONS_PER_PAYLOAD":"","BYTES_PER_LOGS_BLOOM":"","MAX_EXTRA_DATA_BYTES":"","MAX_BLS_TO_EXECUTION_CHANGES":"","MAX_WITHDRAWALS_PER_PAYLOAD":"","MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP":"","PRESET_BASE":"","CONFIG_NAME":"","TERMINAL_TOTAL_DIFFICULTY":"","TERMINAL_BLOCK_HASH":"","TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH":"","MIN_GENESIS_ACTIVE_VALIDATOR_COUNT":"","MIN_GENESIS_TIME":"","GENESIS_FORK_VERSION":"","GENESIS_DELAY":"","ALTAIR_FORK_VERSION":"","ALTAIR_FORK_EPOCH":"","BELLATRIX_FORK_VERSION":"","BELLATRIX_FORK_EPOCH":"","CAPELLA_FORK_VERSION":"","CAPELLA_FORK_EPOCH":"","DENEB_FORK_VERSION":"","DENEB_FORK_EPOCH":"","SECONDS_PER_SLOT":"","SECONDS_PER_ETH1_BLOCK":"","MIN_VALIDATOR_WITHDRAWABILITY_DELAY":"","FIELD_ELEMENTS_PER_BLOB":"","MAX_BLOB_COMMITMENTS_PER_BLOCK":"","MAX_BLOBS_PER_BLOCK":"","KZG_COMMITMENT_INCLUSION_PROOF_DEPTH":"","KZG_COMMITMENT_INCLUSION_PROOF_DEPTH_ELECTRA":"","SHARD_COMMITTEE_PERIOD":"","ETH1_FOLLOW_DISTANCE":"","INACTIVITY_SCORE_BIAS":"","INACTIVITY_SCORE_RECOVERY_RATE":"","EJECTION_BALANCE":"","MIN_PER_EPOCH_CHURN_LIMIT":"","CHURN_LIMIT_QUOTIENT":"","MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT":"","PROPOSER_SCORE_BOOST":"","REORG_HEAD_WEIGHT_THRESHOLD":"","REORG_PARENT_WEIGHT_THRESHOLD":"","REORG_MAX_EPOCHS_SINCE_FINALIZATION":"","DEPOSIT_CHAIN_ID":"","DEPOSIT_NETWORK_ID":"","DEPOSIT_CONTRACT_ADDRESS":"","GOSSIP_MAX_SIZE":"","MAX_REQUEST_BLOCKS":"","EPOCHS_PER_SUBNET_SUBSCRIPTION":"","MIN_EPOCHS_FOR_BLOCK_REQUESTS":"","MAX_CHUNK_SIZE":"","TTFB_TIMEOUT":"","RESP_TIMEOUT":"","ATTESTATION_PROPAGATION_SLOT_RANGE":"","MAXIMUM_GOSSIP_CLOCK_DISPARITY":"","MESSAGE_DOMAIN_INVALID_SNAPPY":"","MESSAGE_DOMAIN_VALID_SNAPPY":"","SUBNETS_PER_NODE":"","ATTESTATION_SUBNET_COUNT":"","ATTESTATION_SUBNET_EXTRA_BITS":"","ATTESTATION_SUBNET_PREFIX_BITS":"","MAX_REQUEST_BLOCKS_DENEB":"","MAX_REQUEST_BLOB_SIDECARS":"","MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS":"","BLOB_SIDECAR_SUBNET_COUNT":"","BLS_WITHDRAWAL_PREFIX":"","ETH1_ADDRESS_WITHDRAWAL_PREFIX":"","DOMAIN_BEACON_PROPOSER":"","DOMAIN_BEACON_ATTESTER":"","DOMAIN_RANDAO":"","DOMAIN_DEPOSIT":"","DOMAIN_VOLUNTARY_EXIT":"","DOMAIN_SELECTION_PROOF":"","DOMAIN_AGGREGATE_AND_PROOF":"","TIMELY_SOURCE_FLAG_INDEX":"","TIMELY_TARGET_FLAG_INDEX":"","TIMELY_HEAD_FLAG_INDEX":"","TIMELY_SOURCE_WEIGHT":"","TIMELY_TARGET_WEIGHT":"","TIMELY_HEAD_WEIGHT":"","SYNC_REWARD_WEIGHT":"","PROPOSER_WEIGHT":"","WEIGHT_DENOMINATOR":"","DOMAIN_SYNC_COMMITTEE":"","DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF":"","DOMAIN_CONTRIBUTION_AND_PROOF":"","DOMAIN_BLS_TO_EXECUTION_CHANGE":"","TARGET_AGGREGATORS_PER_COMMITTEE":"","TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE":"","SYNC_COMMITTEE_SUBNET_COUNT":""}}] + "body": [{"operator": "jstructcmps", "start": ["data"], "value": {"MAX_COMMITTEES_PER_SLOT":"","TARGET_COMMITTEE_SIZE":"","MAX_VALIDATORS_PER_COMMITTEE":"","SHUFFLE_ROUND_COUNT":"","HYSTERESIS_QUOTIENT":"","HYSTERESIS_DOWNWARD_MULTIPLIER":"","HYSTERESIS_UPWARD_MULTIPLIER":"","MIN_DEPOSIT_AMOUNT":"","MAX_EFFECTIVE_BALANCE":"","MAX_EFFECTIVE_BALANCE_ELECTRA":"","EFFECTIVE_BALANCE_INCREMENT":"","MIN_ATTESTATION_INCLUSION_DELAY":"","SLOTS_PER_EPOCH":"","MIN_SEED_LOOKAHEAD":"","MAX_SEED_LOOKAHEAD":"","EPOCHS_PER_ETH1_VOTING_PERIOD":"","SLOTS_PER_HISTORICAL_ROOT":"","MIN_EPOCHS_TO_INACTIVITY_PENALTY":"","EPOCHS_PER_HISTORICAL_VECTOR":"","EPOCHS_PER_SLASHINGS_VECTOR":"","HISTORICAL_ROOTS_LIMIT":"","VALIDATOR_REGISTRY_LIMIT":"","BASE_REWARD_FACTOR":"","WHISTLEBLOWER_REWARD_QUOTIENT":"","PROPOSER_REWARD_QUOTIENT":"","INACTIVITY_PENALTY_QUOTIENT":"","MIN_SLASHING_PENALTY_QUOTIENT":"","PROPORTIONAL_SLASHING_MULTIPLIER":"","MAX_PROPOSER_SLASHINGS":"","MAX_ATTESTER_SLASHINGS":"","MAX_ATTESTATIONS":"","MAX_DEPOSITS":"","MAX_VOLUNTARY_EXITS":"","INACTIVITY_PENALTY_QUOTIENT_ALTAIR":"","MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR":"","PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR":"","SYNC_COMMITTEE_SIZE":"","EPOCHS_PER_SYNC_COMMITTEE_PERIOD":"","MIN_SYNC_COMMITTEE_PARTICIPANTS":"","UPDATE_TIMEOUT":"","INACTIVITY_PENALTY_QUOTIENT_BELLATRIX":"","MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX":"","PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX":"","MAX_BYTES_PER_TRANSACTION":"","MAX_TRANSACTIONS_PER_PAYLOAD":"","BYTES_PER_LOGS_BLOOM":"","MAX_EXTRA_DATA_BYTES":"","MAX_BLS_TO_EXECUTION_CHANGES":"","MAX_WITHDRAWALS_PER_PAYLOAD":"","MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP":"","PRESET_BASE":"","CONFIG_NAME":"","TERMINAL_TOTAL_DIFFICULTY":"","TERMINAL_BLOCK_HASH":"","TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH":"","MIN_GENESIS_ACTIVE_VALIDATOR_COUNT":"","MIN_GENESIS_TIME":"","GENESIS_FORK_VERSION":"","GENESIS_DELAY":"","ALTAIR_FORK_VERSION":"","ALTAIR_FORK_EPOCH":"","BELLATRIX_FORK_VERSION":"","BELLATRIX_FORK_EPOCH":"","CAPELLA_FORK_VERSION":"","CAPELLA_FORK_EPOCH":"","DENEB_FORK_VERSION":"","DENEB_FORK_EPOCH":"","ELECTRA_FORK_VERSION":"","ELECTRA_FORK_EPOCH":"","SECONDS_PER_SLOT":"","SECONDS_PER_ETH1_BLOCK":"","MIN_VALIDATOR_WITHDRAWABILITY_DELAY":"","FIELD_ELEMENTS_PER_BLOB":"","MAX_BLOB_COMMITMENTS_PER_BLOCK":"","MAX_BLOBS_PER_BLOCK":"","KZG_COMMITMENT_INCLUSION_PROOF_DEPTH":"","KZG_COMMITMENT_INCLUSION_PROOF_DEPTH_ELECTRA":"","SHARD_COMMITTEE_PERIOD":"","ETH1_FOLLOW_DISTANCE":"","INACTIVITY_SCORE_BIAS":"","INACTIVITY_SCORE_RECOVERY_RATE":"","EJECTION_BALANCE":"","MIN_PER_EPOCH_CHURN_LIMIT":"","CHURN_LIMIT_QUOTIENT":"","MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT":"","PROPOSER_SCORE_BOOST":"","REORG_HEAD_WEIGHT_THRESHOLD":"","REORG_PARENT_WEIGHT_THRESHOLD":"","REORG_MAX_EPOCHS_SINCE_FINALIZATION":"","DEPOSIT_CHAIN_ID":"","DEPOSIT_NETWORK_ID":"","DEPOSIT_CONTRACT_ADDRESS":"","GOSSIP_MAX_SIZE":"","MAX_REQUEST_BLOCKS":"","EPOCHS_PER_SUBNET_SUBSCRIPTION":"","MIN_EPOCHS_FOR_BLOCK_REQUESTS":"","MAX_CHUNK_SIZE":"","TTFB_TIMEOUT":"","RESP_TIMEOUT":"","ATTESTATION_PROPAGATION_SLOT_RANGE":"","MAXIMUM_GOSSIP_CLOCK_DISPARITY":"","MESSAGE_DOMAIN_INVALID_SNAPPY":"","MESSAGE_DOMAIN_VALID_SNAPPY":"","SUBNETS_PER_NODE":"","ATTESTATION_SUBNET_COUNT":"","ATTESTATION_SUBNET_EXTRA_BITS":"","ATTESTATION_SUBNET_PREFIX_BITS":"","MAX_REQUEST_BLOCKS_DENEB":"","MAX_REQUEST_BLOB_SIDECARS":"","MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS":"","BLOB_SIDECAR_SUBNET_COUNT":"","BLS_WITHDRAWAL_PREFIX":"","ETH1_ADDRESS_WITHDRAWAL_PREFIX":"","DOMAIN_BEACON_PROPOSER":"","DOMAIN_BEACON_ATTESTER":"","DOMAIN_RANDAO":"","DOMAIN_DEPOSIT":"","DOMAIN_VOLUNTARY_EXIT":"","DOMAIN_SELECTION_PROOF":"","DOMAIN_AGGREGATE_AND_PROOF":"","TIMELY_SOURCE_FLAG_INDEX":"","TIMELY_TARGET_FLAG_INDEX":"","TIMELY_HEAD_FLAG_INDEX":"","TIMELY_SOURCE_WEIGHT":"","TIMELY_TARGET_WEIGHT":"","TIMELY_HEAD_WEIGHT":"","SYNC_REWARD_WEIGHT":"","PROPOSER_WEIGHT":"","WEIGHT_DENOMINATOR":"","DOMAIN_SYNC_COMMITTEE":"","DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF":"","DOMAIN_CONTRIBUTION_AND_PROOF":"","DOMAIN_BLS_TO_EXECUTION_CHANGE":"","TARGET_AGGREGATORS_PER_COMMITTEE":"","TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE":"","SYNC_COMMITTEE_SUBNET_COUNT":""}}] } }, { diff --git a/nfuzz/libnfuzz.nim b/nfuzz/libnfuzz.nim index 102ee1b5b..1fdd4e4c3 100644 --- a/nfuzz/libnfuzz.nim +++ b/nfuzz/libnfuzz.nim @@ -141,14 +141,14 @@ func nfuzz_block_header(input: openArray[byte], xoutput: ptr byte, decodeAndProcess(BlockHeaderInput): process_block_header(data.state, data.beaconBlock.message, flags, cache).isOk -from ".."/beacon_chain/bloomfilter import constructBloomFilter +from ".."/beacon_chain/validator_bucket_sort import sortValidatorBuckets proc nfuzz_deposit(input: openArray[byte], xoutput: ptr byte, xoutput_size: ptr uint, disable_bls: bool): bool {.exportc, raises: [FuzzCrashError].} = decodeAndProcess(DepositInput): process_deposit( getRuntimeConfig(some "mainnet"), data.state, - constructBloomFilter(data.state.validators.asSeq)[], data.deposit, + sortValidatorBuckets(data.state.validators.asSeq)[], data.deposit, flags).isOk proc nfuzz_proposer_slashing(input: openArray[byte], xoutput: ptr byte, diff --git a/run-kurtosis-check.sh b/run-kurtosis-check.sh new file mode 100755 index 000000000..debe9b998 --- /dev/null +++ b/run-kurtosis-check.sh @@ -0,0 +1,252 @@ +#!/bin/bash +set -euo pipefail +# Copyright (c) 2024 Status Research & Development GmbH +# Licensed under either of +# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or +# http://www.apache.org/licenses/LICENSE-2.0) +# * MIT license ([LICENSE-MIT](LICENSE-MIT) or +# http://opensource.org/licenses/MIT) +# at your option. This file may not be copied, modified, or distributed except +# according to those terms. + +# ------------------------------------------------ +# Inputs on how to run checks +# ------------------------------------------------ +echo +printf "Do you want to run the checks in terminal or visit the assertoor URL? (terminal/url) " +read reply + +echo +printf "Build new changes (yes/no)? " +read use_previous_image + +# ------------------------------------------------ +# Installation Checks +# ------------------------------------------------ + +# Checking for docker installation +echo "Checking docker installation" +if command -v docker &> /dev/null; then + echo "Docker installation found" +else + echo "Docker installation not found. Please install docker." + exit 1 +fi + +echo "Checking kurtosis installation" +if command -v kurtosis &> /dev/null; then + echo "Kurtosis installation found" +else + echo "Kurtosis installation not found. Installing kurtosis" + echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list + sudo apt-get update + sudo apt-get install -y kurtosis +fi + +# Install jq if not installed already +if [ "$(which jq)" != "" ]; +then + echo "jq is already installed" +else + echo "jq is not installed. Installing jq" + sudo apt-get install -y jq +fi + +new_cl_image="localtestnet" + +# ------------------------------------------------ +# Build the Docker Image +# ------------------------------------------------ +if [[ "$use_previous_image" == "no" ]]; then + echo "Using the previously built Docker image" + echo + echo -n "Please enter the docker image name (default: localtestnet) " + read -r cl_image + if [[ "$cl_image" == "" ]]; then + new_cl_image="localtestnet" + else + new_cl_image=$cl_image + fi +else + echo "Starting the Docker Build!" + # Build the docker Image + sudo docker build . -t localtestnet + # The new el_image value + new_cl_image="localtestnet" +fi + + +# ------------------------------------------------ +# Run the Kurtosis Tests +# ------------------------------------------------ + +# Use sed to replace the el_image value in the file +cat kurtosis-network-params.yml | envsubst > assertoor.yaml +sed -i "s/cl_image: .*/cl_image: $new_cl_image/" assertoor.yaml + +sudo kurtosis run \ + --enclave nimbus-localtestnet \ + github.com/ethpandaops/ethereum-package \ + --args-file assertoor.yaml + +enclave_dump=$(kurtosis enclave inspect nimbus-localtestnet) +assertoor_url=$(echo "$enclave_dump" | grep assertoor | grep http | sed 's/.*\(http:\/\/[0-9.:]\+\).*/\1/') + +# ------------------------------------------------ +# Remove Generated File +# ------------------------------------------------ +rm assertoor.yaml + +# Check the user's input and respond accordingly +if [[ "$reply" == "url" ]]; then + echo "You chose to visit the assertoor URL." + echo "Assertoor Checks Please Visit -> ${assertoor_url}" + echo "Please visit the URL to check the status of the tests" + echo "The kurtosis enclave needs to be cleared, after the tests are done. Please run the following command ----- sudo kurtosis enclave rm -f nimbus-localtestnet" +else + echo "Running the checks over terminal" + + + # ------------------------------------------------ + # Check for Test Status + # ------------------------------------------------ + YELLOW='\033[1;33m' + GRAY='\033[0;37m' + GREEN='\033[0;32m' + RED='\033[0;31m' + NC='\033[0m' + + # print assertor logs + assertoor_container=$(docker container list | grep assertoor | sed 's/^\([^ ]\+\) .*$/\1/') + docker logs -f "$assertoor_container" & + + # helper to fetch task status for specific test id + get_tasks_status() { + tasks=$(curl -s "${assertoor_url}"/api/v1/test_run/"$1" | jq -c ".data.tasks[] | {index, parent_index, name, title, status, result}") + declare -A task_graph_map + task_graph_map[0]="" + + while read task; do + task_id=$(echo "$task" | jq -r ".index") + task_parent=$(echo "$task" | jq -r ".parent_index") + task_name=$(echo "$task" | jq -r ".name") + task_title=$(echo "$task" | jq -r ".title") + task_status=$(echo "$task" | jq -r ".status") + task_result=$(echo "$task" | jq -r ".result") + + task_graph="${task_graph_map[$task_parent]}" + task_graph_map[$task_id]="$task_graph |" + if [ ! -z "$task_graph" ]; then + task_graph="${task_graph}- " + fi + + if [ "$task_status" == "pending" ]; then + task_status="${GRAY}pending ${NC}" + elif [ "$task_status" == "running" ]; then + task_status="${YELLOW}running ${NC}" + elif [ "$task_status" == "complete" ]; then + task_status="${GREEN}complete${NC}" + fi + + if [ "$task_result" == "none" ]; then + task_result="${GRAY}none ${NC}" + elif [ "$task_result" == "success" ]; then + task_result="${GREEN}success${NC}" + elif [ "$task_result" == "failure" ]; then + task_result="${RED}failure${NC}" + fi + + echo -e " $(printf '%-4s' "$task_id")\t$task_status\t$task_result\t$(printf '%-50s' "$task_graph$task_name") \t$task_title" + done <<< $(echo "$tasks") + } + + # poll & check test status + final_test_result="" + failed_test_id="" + while true + do + pending_tests=0 + failed_tests=0 + total_tests=0 + running_test="" + + status_lines=() + task_lines="" + status_lines+=("$(date +'%Y-%m-%d %H:%M:%S') Test Status:") + + tests=$(curl -s "${assertoor_url}"/api/v1/test_runs | jq -c ".data[] | {run_id, test_id, name, status}") + while read -r test; do + if [ -z "$test" ]; then + continue + fi + run_id=$(echo "$test" | jq -r ".run_id") + test_id=$(echo "$test" | jq -r ".test_id") + test_name=$(echo "$test" | jq -r ".name") + test_status=$(echo "$test" | jq -r ".status") + + if [ "$test_status" == "pending" ]; then + pending_tests=$(expr $pending_tests + 1) + status_name="${GRAY}pending${NC}" + elif [ "$test_status" == "running" ]; then + pending_tests=$(expr $pending_tests + 1) + running_test="$run_id" + status_name="${YELLOW}running${NC}" + + elif [ "$test_status" == "success" ]; then + status_name="${GREEN}success${NC}" + elif [ "$test_status" == "failure" ]; then + failed_tests=$(expr $failed_tests + 1) + failed_test_id="$run_id" + status_name="${RED}failure${NC}" + else + status_name="$test_status" + fi + status_lines+=(" $(printf '%-3s' "$test_id") $status_name \t$test_name") + total_tests=$(expr $total_tests + 1) + done <<< $(echo "$tests") + + for status_line in "${status_lines[@]}" + do + echo -e "$status_line" + done + + if [ -n "$running_test" ]; then + task_lines=$(get_tasks_status "$running_test") + echo "Active Test Task Status:" + echo "$task_lines" + fi + + if [ "$failed_tests" -gt 0 ]; then + final_test_result="failure" + break + fi + if [ "$total_tests" -gt 0 ] && [ "$pending_tests" -le 0 ]; then + final_test_result="success" + break + fi + + sleep 60 + done + + # save test results & status to github output + echo "test_result=$(echo "$final_test_result")" + echo "test_status" + for status_line in "${status_lines[@]}" + do + echo -e "$status_line" + done + echo + + if [ -n "$failed_test_id" ]; then + echo "failed_test_status" + get_tasks_status "$failed_test_id" + echo "" + else + echo "failed_test_status=" + fi + + # ------------------------------------------------ + # Cleanup + # ------------------------------------------------ + sudo kurtosis enclave rm -f nimbus-localtestnet +fi \ No newline at end of file diff --git a/tests/all_tests.nim b/tests/all_tests.nim index 18f698da6..f23a957c8 100644 --- a/tests/all_tests.nim +++ b/tests/all_tests.nim @@ -21,11 +21,11 @@ import # Unit test ./test_block_dag, ./test_block_processor, ./test_block_quarantine, - ./test_bloom_filter, ./test_conf, ./test_datatypes, ./test_deposit_snapshots, ./test_discovery, + ./test_engine_api_conversions, ./test_engine_authentication, ./test_el_manager, ./test_el_conf, @@ -51,6 +51,7 @@ import # Unit test ./test_sync_committee_pool, ./test_sync_manager, ./test_toblindedblock, + ./test_validator_bucket_sort, ./test_validator_change_pool, ./test_validator_pool, ./test_zero_signature, @@ -64,4 +65,4 @@ import # Unit test when not defined(windows): import ./test_keymanager_api -summarizeLongTests("AllTests") +summarizeLongTests("AllTests") \ No newline at end of file diff --git a/tests/consensus_spec/altair/test_fixture_light_client_sync_protocol.nim b/tests/consensus_spec/altair/test_fixture_light_client_sync_protocol.nim index 0ca338944..2d1627710 100644 --- a/tests/consensus_spec/altair/test_fixture_light_client_sync_protocol.nim +++ b/tests/consensus_spec/altair/test_fixture_light_client_sync_protocol.nim @@ -23,7 +23,7 @@ import # Test utilities ../../testutil, ../../testblockutil -# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/tests/core/pyspec/eth2spec/test/helpers/sync_committee.py#L27-L44 +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/tests/core/pyspec/eth2spec/test/helpers/sync_committee.py#L27-L44 proc compute_aggregate_sync_committee_signature( cfg: RuntimeConfig, forked: ForkedHashedBeaconState, @@ -133,7 +133,7 @@ proc block_for_next_slot( addTestBlock( forked, cache, attestations = attestations, cfg = cfg) -# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.5/specs/altair/light-client/sync-protocol.md#initialize_light_client_store +# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/altair/light-client/sync-protocol.md#initialize_light_client_store func initialize_light_client_store( state: auto, storeDataFork: static LightClientDataFork): auto = storeDataFork.LightClientStore( diff --git a/tests/consensus_spec/altair/test_fixture_operations.nim b/tests/consensus_spec/altair/test_fixture_operations.nim index 8ca1b4f6c..4bd39a28e 100644 --- a/tests/consensus_spec/altair/test_fixture_operations.nim +++ b/tests/consensus_spec/altair/test_fixture_operations.nim @@ -114,7 +114,8 @@ suite baseDescription & "Block Header " & preset(): runTest[altair.BeaconBlock, typeof applyBlockHeader]( OpBlockHeaderDir, suiteName, "Block Header", "block", applyBlockHeader, path) -from ".."/".."/".."/beacon_chain/bloomfilter import constructBloomFilter +from ".."/".."/".."/beacon_chain/validator_bucket_sort import + sortValidatorBuckets suite baseDescription & "Deposit " & preset(): proc applyDeposit( @@ -122,7 +123,7 @@ suite baseDescription & "Deposit " & preset(): Result[void, cstring] = process_deposit( defaultRuntimeConfig, preState, - constructBloomFilter(preState.validators.asSeq)[], deposit, {}) + sortValidatorBuckets(preState.validators.asSeq)[], deposit, {}) for path in walkTests(OpDepositsDir): runTest[Deposit, typeof applyDeposit]( @@ -173,4 +174,4 @@ suite baseDescription & "Voluntary Exit " & preset(): for path in walkTests(OpVoluntaryExitDir): runTest[SignedVoluntaryExit, typeof applyVoluntaryExit]( OpVoluntaryExitDir, suiteName, "Voluntary Exit", "voluntary_exit", - applyVoluntaryExit, path) + applyVoluntaryExit, path) \ No newline at end of file diff --git a/tests/consensus_spec/bellatrix/test_fixture_operations.nim b/tests/consensus_spec/bellatrix/test_fixture_operations.nim index 7ec841519..f4187c295 100644 --- a/tests/consensus_spec/bellatrix/test_fixture_operations.nim +++ b/tests/consensus_spec/bellatrix/test_fixture_operations.nim @@ -121,7 +121,8 @@ suite baseDescription & "Block Header " & preset(): OpBlockHeaderDir, suiteName, "Block Header", "block", applyBlockHeader, path) -from ".."/".."/".."/beacon_chain/bloomfilter import constructBloomFilter +from ".."/".."/".."/beacon_chain/validator_bucket_sort import + sortValidatorBuckets suite baseDescription & "Deposit " & preset(): proc applyDeposit( @@ -129,7 +130,7 @@ suite baseDescription & "Deposit " & preset(): Result[void, cstring] = process_deposit( defaultRuntimeConfig, preState, - constructBloomFilter(preState.validators.asSeq)[], deposit, {}) + sortValidatorBuckets(preState.validators.asSeq)[], deposit, {}) for path in walkTests(OpDepositsDir): runTest[Deposit, typeof applyDeposit]( @@ -198,4 +199,4 @@ suite baseDescription & "Voluntary Exit " & preset(): for path in walkTests(OpVoluntaryExitDir): runTest[SignedVoluntaryExit, typeof applyVoluntaryExit]( OpVoluntaryExitDir, suiteName, "Voluntary Exit", "voluntary_exit", - applyVoluntaryExit, path) + applyVoluntaryExit, path) \ No newline at end of file diff --git a/tests/consensus_spec/capella/test_fixture_operations.nim b/tests/consensus_spec/capella/test_fixture_operations.nim index 22198cb46..47f9b751d 100644 --- a/tests/consensus_spec/capella/test_fixture_operations.nim +++ b/tests/consensus_spec/capella/test_fixture_operations.nim @@ -138,7 +138,8 @@ suite baseDescription & "BLS to execution change " & preset(): OpBlsToExecutionChangeDir, suiteName, "BLS to execution change", "address_change", applyBlsToExecutionChange, path) -from ".."/".."/".."/beacon_chain/bloomfilter import constructBloomFilter +from ".."/".."/".."/beacon_chain/validator_bucket_sort import + sortValidatorBuckets suite baseDescription & "Deposit " & preset(): func applyDeposit( @@ -146,7 +147,7 @@ suite baseDescription & "Deposit " & preset(): Result[void, cstring] = process_deposit( defaultRuntimeConfig, preState, - constructBloomFilter(preState.validators.asSeq)[], deposit, {}) + sortValidatorBuckets(preState.validators.asSeq)[], deposit, {}) for path in walkTests(OpDepositsDir): runTest[Deposit, typeof applyDeposit]( @@ -226,4 +227,4 @@ suite baseDescription & "Withdrawals " & preset(): for path in walkTests(OpWithdrawalsDir): runTest[capella.ExecutionPayload, typeof applyWithdrawals]( OpWithdrawalsDir, suiteName, "Withdrawals", "execution_payload", - applyWithdrawals, path) + applyWithdrawals, path) \ No newline at end of file diff --git a/tests/consensus_spec/deneb/test_fixture_operations.nim b/tests/consensus_spec/deneb/test_fixture_operations.nim index 78dad933b..56aeb9768 100644 --- a/tests/consensus_spec/deneb/test_fixture_operations.nim +++ b/tests/consensus_spec/deneb/test_fixture_operations.nim @@ -141,7 +141,8 @@ suite baseDescription & "BLS to execution change " & preset(): OpBlsToExecutionChangeDir, suiteName, "BLS to execution change", "address_change", applyBlsToExecutionChange, path) -from ".."/".."/".."/beacon_chain/bloomfilter import constructBloomFilter +from ".."/".."/".."/beacon_chain/validator_bucket_sort import + sortValidatorBuckets suite baseDescription & "Deposit " & preset(): func applyDeposit( @@ -149,7 +150,7 @@ suite baseDescription & "Deposit " & preset(): Result[void, cstring] = process_deposit( defaultRuntimeConfig, preState, - constructBloomFilter(preState.validators.asSeq)[], deposit, {}) + sortValidatorBuckets(preState.validators.asSeq)[], deposit, {}) for path in walkTests(OpDepositsDir): runTest[Deposit, typeof applyDeposit]( @@ -228,4 +229,4 @@ suite baseDescription & "Withdrawals " & preset(): for path in walkTests(OpWithdrawalsDir): runTest[deneb.ExecutionPayload, typeof applyWithdrawals]( OpWithdrawalsDir, suiteName, "Withdrawals", "execution_payload", - applyWithdrawals, path) + applyWithdrawals, path) \ No newline at end of file diff --git a/tests/consensus_spec/electra/test_fixture_operations.nim b/tests/consensus_spec/electra/test_fixture_operations.nim index d3974d56b..a7b21d72c 100644 --- a/tests/consensus_spec/electra/test_fixture_operations.nim +++ b/tests/consensus_spec/electra/test_fixture_operations.nim @@ -148,13 +148,18 @@ suite baseDescription & "BLS to execution change " & preset(): OpBlsToExecutionChangeDir, suiteName, "BLS to execution change", "address_change", applyBlsToExecutionChange, path) +from ".."/".."/".."/beacon_chain/validator_bucket_sort import + sortValidatorBuckets + suite baseDescription & "Consolidation Request " & preset(): proc applyConsolidationRequest( preState: var electra.BeaconState, consolidation_request: ConsolidationRequest): Result[void, cstring] = var cache: StateCache process_consolidation_request( - defaultRuntimeConfig, preState, consolidation_request, cache) + defaultRuntimeConfig, preState, + sortValidatorBuckets(preState.validators.asSeq)[], + consolidation_request, cache) ok() for path in walkTests(OpConsolidationRequestDir): @@ -162,15 +167,13 @@ suite baseDescription & "Consolidation Request " & preset(): OpConsolidationRequestDir, suiteName, "Consolidation Request", "consolidation_request", applyConsolidationRequest, path) -from ".."/".."/".."/beacon_chain/bloomfilter import constructBloomFilter - suite baseDescription & "Deposit " & preset(): func applyDeposit( preState: var electra.BeaconState, deposit: Deposit): Result[void, cstring] = process_deposit( defaultRuntimeConfig, preState, - constructBloomFilter(preState.validators.asSeq)[], deposit, {}) + sortValidatorBuckets(preState.validators.asSeq)[], deposit, {}) for path in walkTests(OpDepositsDir): runTest[Deposit, typeof applyDeposit]( @@ -182,7 +185,7 @@ suite baseDescription & "Deposit Request " & preset(): Result[void, cstring] = process_deposit_request( defaultRuntimeConfig, preState, - constructBloomFilter(preState.validators.asSeq)[], depositRequest, {}) + sortValidatorBuckets(preState.validators.asSeq)[], depositRequest, {}) for path in walkTests(OpDepositRequestDir): runTest[DepositRequest, typeof applyDepositRequest]( @@ -212,7 +215,9 @@ suite baseDescription & "Withdrawal Request " & preset(): Result[void, cstring] = var cache: StateCache process_withdrawal_request( - defaultRuntimeConfig, preState, withdrawalRequest, cache) + defaultRuntimeConfig, preState, + sortValidatorBuckets(preState.validators.asSeq)[], withdrawalRequest, + cache) ok() for path in walkTests(OpWithdrawalRequestDir): @@ -276,4 +281,4 @@ suite baseDescription & "Withdrawals " & preset(): for path in walkTests(OpWithdrawalsDir): runTest[electra.ExecutionPayload, typeof applyWithdrawals]( OpWithdrawalsDir, suiteName, "Withdrawals", "execution_payload", - applyWithdrawals, path) + applyWithdrawals, path) \ No newline at end of file diff --git a/tests/consensus_spec/fixtures_utils.nim b/tests/consensus_spec/fixtures_utils.nim index c658ef5a2..32dddaa18 100644 --- a/tests/consensus_spec/fixtures_utils.nim +++ b/tests/consensus_spec/fixtures_utils.nim @@ -83,7 +83,7 @@ type rewards*: List[Gwei, Limit VALIDATOR_REGISTRY_LIMIT] penalties*: List[Gwei, Limit VALIDATOR_REGISTRY_LIMIT] - # https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.6/specs/phase0/validator.md#eth1block + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/phase0/validator.md#eth1block Eth1Block* = object timestamp*: uint64 deposit_root*: Eth2Digest diff --git a/tests/consensus_spec/phase0/test_fixture_operations.nim b/tests/consensus_spec/phase0/test_fixture_operations.nim index 42195af5a..329666902 100644 --- a/tests/consensus_spec/phase0/test_fixture_operations.nim +++ b/tests/consensus_spec/phase0/test_fixture_operations.nim @@ -106,7 +106,8 @@ suite baseDescription & "Block Header " & preset(): OpBlockHeaderDir, suiteName, "Block Header", "block", applyBlockHeader, path) -from ".."/".."/".."/beacon_chain/bloomfilter import constructBloomFilter +from ".."/".."/".."/beacon_chain/validator_bucket_sort import + sortValidatorBuckets suite baseDescription & "Deposit " & preset(): proc applyDeposit( @@ -114,7 +115,7 @@ suite baseDescription & "Deposit " & preset(): Result[void, cstring] = process_deposit( defaultRuntimeConfig, preState, - constructBloomFilter(preState.validators.asSeq)[], deposit, {}) + sortValidatorBuckets(preState.validators.asSeq)[], deposit, {}) for path in walkTests(OpDepositsDir): runTest[Deposit, typeof applyDeposit]( @@ -150,4 +151,4 @@ suite baseDescription & "Voluntary Exit " & preset(): for path in walkTests(OpVoluntaryExitDir): runTest[SignedVoluntaryExit, typeof applyVoluntaryExit]( OpVoluntaryExitDir, suiteName, "Voluntary Exit", "voluntary_exit", - applyVoluntaryExit, path) + applyVoluntaryExit, path) \ No newline at end of file diff --git a/tests/consensus_spec/test_fixture_fork_choice.nim b/tests/consensus_spec/test_fixture_fork_choice.nim index 4e1ab0066..a7aa97b94 100644 --- a/tests/consensus_spec/test_fixture_fork_choice.nim +++ b/tests/consensus_spec/test_fixture_fork_choice.nim @@ -90,8 +90,7 @@ proc initialLoad( dag = ChainDAGRef.init( forkedState[].kind.genesisTestRuntimeConfig, db, validatorMonitor, {}) fkChoice = newClone(ForkChoice.init( - dag.getFinalizedEpochRef(), dag.finalizedHead.blck, - ForkChoiceVersion.Pr3431)) + dag.getFinalizedEpochRef(), dag.finalizedHead.blck)) (dag, fkChoice) diff --git a/tests/test_bloom_filter.nim b/tests/test_bloom_filter.nim deleted file mode 100644 index 46c00ccfa..000000000 --- a/tests/test_bloom_filter.nim +++ /dev/null @@ -1,147 +0,0 @@ -# beacon_chain -# Copyright (c) 2024 Status Research & Development GmbH -# Licensed and distributed under either of -# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). -# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). -# at your option. This file may not be copied, modified, or distributed except according to those terms. - -{.push raises: [].} -{.used.} - -import ".."/beacon_chain/spec/crypto, unittest2 - -from std/sequtils import mapIt -from ".."/beacon_chain/bloomfilter import - constructBloomFilter, incl, mightContain -from ".."/beacon_chain/spec/datatypes/base import - HashedValidatorPubKey, HashedValidatorPubKeyItem, Validator, fromHex, pubkey -from ".."/beacon_chain/spec/eth2_merkleization import hash_tree_root - -let pubkeys = [ - ValidatorPubKey.fromHex("0xd52edb450c9fdad41ce16d724be7b986a5422f8a791b68a370ef86045a85147cf8f7a6342034958d46a136965b622c48"), - ValidatorPubKey.fromHex("0x6f343f3c55183fc6c980e7597ac47c14b59322e22be9109e7ad8412f5b0e5c918b4e6dd60e5b98eb8d2501a94b2fb022"), - ValidatorPubKey.fromHex("0x5e40d512d91a27aa60e95fa10acb60a8a5dc6d85f2238e6418bfd4ebf44215270301f9e15564dde2c2b628fe80e7f970"), - ValidatorPubKey.fromHex("0x4ae23aea68bfd30022d4efdde1b4428f23317a70fb6df716dc16ccde96b74174c2f8cd18237bdb7ae900acbaba8cad70"), - ValidatorPubKey.fromHex("0x032fc41fa7fc1a44a1f38d73a3465974c2048bb347a9fcb261b93fc6581009d7c9870f0e1a21d619069d5250456cd5ca"), - ValidatorPubKey.fromHex("0x8cea40c0986bc0dc51b664e846a08948112987903b6ffe462b77f092dc43e752dfefaad738810c43364b2f2ed24a5988"), - ValidatorPubKey.fromHex("0xc663a799c732d544a835251935fc5be18eb365806279863877ff2f9308779106816a48be235b4b5d9dcaf42bdf1119f7"), - ValidatorPubKey.fromHex("0xc5682345f202d59614089a6fd5c2375adf8e40316bb69114474f1861c9a6791cc512c0133860353a4bb35d659f3fcd14"), - ValidatorPubKey.fromHex("0x593c3b4d962ff759945f70afa98d3d653fb4c73a2808a4f30472d972cdfd12df7535ba5ba88f3c5e8a59ff844129949f"), - ValidatorPubKey.fromHex("0xabc272512d7a861c0bc190c23cdef8d4d6b9b159d9f53aaf8834c8f521edf416b850d6c14b4c040bac7ceaa1be117e98"), - ValidatorPubKey.fromHex("0xd6dc377e866b762ab63dc2155be71bf24624855e255332dc48a175a9024e71057ad4ad351d7b5aeee944afaaff5d4e1b"), - ValidatorPubKey.fromHex("0x9af21f5d70846185023f70f7841f2f6323c27307c3e54025f103ba359c856b76d3c06f0a09b4669e4838187805253467"), - ValidatorPubKey.fromHex("0x92312221300b0707c401d3163f951babaeb4121fa7222dafebba8b8cf91928567477b4b2c249af446a759ef13d990a0c"), - ValidatorPubKey.fromHex("0x37c2731f409eafdb4bb5a1722e33cc39ab8dcf87eb7b4702aca0dcfdceea15002c1b697124eb6f1f83bd807cafb0ff43"), - ValidatorPubKey.fromHex("0xac72cfe3b2a0c549f608746fd0c3daa7195c42e05157f8d8b10bd84b1d04bff763eb6bf74620be8bcdba0ea4704630ee"), - ValidatorPubKey.fromHex("0x6cab2ab1fd15489aae21becc2cfb8923513bacce9d9773c3ad35ef7535a6e92d3a78de4d103e2ed88a818f872de331f2"), - ValidatorPubKey.fromHex("0x99138fe703da75af5571e3994e7c0b6bba06cb2a4a4978e4b41e52e06af7c1c928105bb5fae878d16934529c96883e97"), - ValidatorPubKey.fromHex("0x850c61b9bf24be2470fe0b1ead466d9b93ea4b4d41980f2f6c82eef9b526d68bf6be613b4e7653b79267829a4107dd30"), - ValidatorPubKey.fromHex("0x310ddff78f82b2ea039f6077b099f4e8e148da97d35a14140cdf5754db933034d15a58085ff91522e2722504a6ebdc87"), - ValidatorPubKey.fromHex("0x331103905b6cc0da6ef1fc2e10cb6c9feed110a5a09fed5f32f56416ea814e80961fdf81455a6483de18c40e1f3bb718"), - ValidatorPubKey.fromHex("0x8f4a32c968cb197581a3c4cec214d33736026997d1a4dc9538c932b3d859dd0547a7a06a08a9115c2c2a4fdfccaa07d2"), - ValidatorPubKey.fromHex("0xda87a0a9a300057c1f4a196f9e8947a1f461aca3be84799ac9a187c4ecb0f6450cc15e64d30b30da4f5cf2848808b9ab"), - ValidatorPubKey.fromHex("0x91e197089e1a351f0f6b1d4777c464edffac62067162133c01185074d520cbefd4e661d978cf04f9832804cb636e7a5f"), - ValidatorPubKey.fromHex("0xf0e76be22bf4afd4ea3730ef7dd0156b777e2835d828deee887881263affa33bf4685ad18fa05d09e87481a4c89c345c"), - ValidatorPubKey.fromHex("0x4a0276deca3b176cd6fe0b648f0fc418568c0c9d29d607e74e02c17852b72e636e681f4be63b0b1ad842db3efe0518c2"), - ValidatorPubKey.fromHex("0x7ad942fe106ee88c214bd5e34078b2c98849ba594a4e266a8548c1b5e44bd151135fa5a720323927c142af19fd1e74b1"), - ValidatorPubKey.fromHex("0x0648a3a4f9cf10e8f8881902549e0b7c6b207e72d5498e54503e1497ccfc03954a7440dfa0cd5ba62f80234bd99733ca"), - ValidatorPubKey.fromHex("0x5d569974f21599857609ec27e11cd2b9c007209790fe36e0cc5ff1bef0c83c07eddc84602ae04a3b803b158fa8d8a7df"), - ValidatorPubKey.fromHex("0x63290edbc38bfa204b7fd4b3fba3f677f00a54897b4c62c83ff5a1d0a905f64d2ea73ab9fa903d86c3ac8e5c91f66cc2"), - ValidatorPubKey.fromHex("0xc56363e2f8a19dcb1c9fa0b446b9c2e6a93218250df814da9566c4ceaeb116a4d60031ec60b89c23e0e911dccc301e34"), - ValidatorPubKey.fromHex("0x68c143f8c1cf0dc47345526bfd5123ed31edcbf393673352fe948107f5317ddcf8934814657879da7a1ec5782d13fdc4"), - ValidatorPubKey.fromHex("0x6e1c7d1ca0056d721a94cda0a776b68d447b1706882e04ed7ca7356d61d7d08c9c2aaf782e9c3f0c4c6e4758ca6c9228"), - ValidatorPubKey.fromHex("0x12d410ee83662b4506546e912ada2e0273f27279fdc46565d0c862e262bdbe98f91466a5bfa4e65660fd8e5a4da28543"), - ValidatorPubKey.fromHex("0x039b3ebfcc2d6f181b40da2b63d94406c440f2c32547e69560bb137a295886c3e82b7ac5aa18e14bfe080b805ae75197"), - ValidatorPubKey.fromHex("0x02875a3d83a806329b612096329959eec1a2300d9740a2c94d030dc5c99c6c0c62bd5f832b615d36cc165bc304e7a892"), - ValidatorPubKey.fromHex("0xfc0acd4ca1e1ea234b39219af5c899a743332e33a17be2dcb10bfed72e4d437fd2693ac1ae1dcec2d189a9689b0b53ff"), - ValidatorPubKey.fromHex("0x8104b3b199bf0261b1584fe269e5599266bd60cbd201205565e139fbe4a9577f48f71cebae7f7cf434cf07f66cc51ec9"), - ValidatorPubKey.fromHex("0xcfe998a8989f5318aee192e185e87a51b96aeec479d37f00cdcfafe534f514c316a10c4ba311c076cae6b192386dc25a"), - ValidatorPubKey.fromHex("0x44d7bcaebb2da8001982540c8917da5ff950750d90e5b788f2c35262b58efca64dfe3df46793380016a9d24b521c3920"), - ValidatorPubKey.fromHex("0x2b7fd53635b1effa086d6db933b65bfbca85160ed731fa8b5c77a8b726b4c5b61ff56d88d57f3e4fece8c593df18f2b3"), - ValidatorPubKey.fromHex("0x642e56b532e08e4cb75d619ed3b360ad1971584e338638b7d5716672922e513465c3fb13d26d381e7b21ffe9bc8e428f"), - ValidatorPubKey.fromHex("0x61820ec30590c9e75b06b0cc454686067fc6db1d329814aaf1a31e3e3defe50f41ee15c106e3602c4931e131032787db"), - ValidatorPubKey.fromHex("0xdc41f2c1504c90f44ba32b7e9d8e069d9c788a125f45df163c65c56cf22f5823e7614b2fcd5cec7c14a276b67e0fa7b8"), - ValidatorPubKey.fromHex("0x079d59adc0ac14e2c7397a23c3debcb080d1378ad4ac6a091daeb12f1d134c063ce4629bdf0880172017b81bed0064ec"), - ValidatorPubKey.fromHex("0x41e0b5b8befce0add67f48a9b485307105e3772aae012777c6afa62304f67a7407dd0c16b791754076549eba2b7a18a8"), - ValidatorPubKey.fromHex("0xd36e7623ae93544eaa5868e50936797bddffb2b3b66728b38f0c479f1640c60e82ad887b960e6c9340526da8a030f5b2"), - ValidatorPubKey.fromHex("0x8986816ba54e777b2c6045a805b11c08bb1f64898a6786428da9efc2ae466cb940fa3c11feacfdeeba87df9b3ce3e93f"), - ValidatorPubKey.fromHex("0x5ea844f61fe1710c19cb67e5daec1c3ba0fc203ab23598b1c9cfae6f4ab9d9f127d50d0b9cebf64d7650f66c06ca5596"), - ValidatorPubKey.fromHex("0x3e77eef77d7573362dffd75800d7554ad41f4349b3a2ab72d6fe031bf3c42bf283f985b933ac142de581079371018fdc"), - ValidatorPubKey.fromHex("0xa848afaf6d44d43e2f072bf3cf82e1ae6a8c63cda627c12d95a43e6ac4f20b8a9213a723d642c95ae2bd66bccadb8467"), - ValidatorPubKey.fromHex("0xb0b1b8582a84cbc5f43585c9d2e2b9d34f0788977f5004d6e21b12bfd5cd7165d72fba0da182f13aa44af63f9045da3e"), - ValidatorPubKey.fromHex("0x4f5517fe02d94b1eeee0a294b4f7d6064f8a3eb3fd6f31801ab7545be1dc290f26972515b23018b23efa9a812f648b6b"), - ValidatorPubKey.fromHex("0xa0f040547549deccd5cdc3a0a3a91974754fdc8177763adfc25ffb7704f8ca5e83985db3f276fadb1c113fb279720a05"), - ValidatorPubKey.fromHex("0x7dd6ae00b240244b0e49cf7538a5021e6725d3b87b909e797c7d9c6947c3b29353ff61c128ad36db66b77f197308ba04"), - ValidatorPubKey.fromHex("0xdc824ba613c5ddf2c112f0ca3bb91e6d7bfcbfd340b1e611183b8bf8c4cc37d1b843909f2c9db8353de6938834516fa2"), - ValidatorPubKey.fromHex("0xb085822d9549b0b674591015525f0846ec00ef3ff52b1107592285d0a75b757708a54fcfe5655f28473c33ae4d43ee5c"), - ValidatorPubKey.fromHex("0xab704b4be6cbbbe0f9176fd3dccbf2c0272e4f42538d5f4844a288820179f7c799d051c501e78ee3848484e1818d8456"), - ValidatorPubKey.fromHex("0x12c3c3fa284bd55ebbe82abce576c104929a909e9d78eba2f595ce42822ffe52c427ad61923f48107b1639e4bd99a45b"), - ValidatorPubKey.fromHex("0x64c86e12cdc8091c0b0e317abc073a71c96df04e1fb2235219a1289d3ce62b323fc1a226f0b298ee5596bbebabdacaf5"), - ValidatorPubKey.fromHex("0x1d5cc7e50da341a6f6931dc9fb4df6a37d21545281b9fdc2836182e2f45ff2a2a6e9181ab5d4893125fea6495fe68dd3"), - ValidatorPubKey.fromHex("0x923573206c1b1a75716339eb61f489b10d5811a280dd15333f980374ca63664741e16d911f8372ff74714ec79662683f"), - ValidatorPubKey.fromHex("0x7c1fe9a7ab8da368228a27f575cbb36aa9ce2e68d60c336184f02b985b5c13a7d09cbe315895a1da5f1f86d713f94417"), - ValidatorPubKey.fromHex("0xbb85e9cdac2db9a2dda61480082f3ed0f683db798219cdbfadac846c7b374f90a8c6784c95b53676b631152077619ee5"), - ValidatorPubKey.fromHex("0x58db99741e4c904ec1444a9c23c287eeea88de3c647c9dd9ed45e8230b7ed0bf080d546ae4597af148b69809df07e73c"), - ValidatorPubKey.fromHex("0x2208988a10feef0f7ec1550e8ef8c14c786de0bd647e5b3d10d3b884c8521af0ce59ba1a8583afe888b9348d2e1ed7d5"), - ValidatorPubKey.fromHex("0xd11cd69262896cf2a19a52928b7fcba8cd1c1661d0c938ffbfb4482283f53b44435af5695ce10fddc9315393aeda57ef"), - ValidatorPubKey.fromHex("0x4a568216203673c3f895529c194c2ca172d613e8f866dd9ee5e8db9b5b681942c7b5634c2349689a6753e1d1113d062e"), - ValidatorPubKey.fromHex("0x7ceb8add4aebaf802c3e8b37f85076a6de8c6d7007dcb92fa7b4da028a571f9dae41338b8d3f2446db4335ffbff7f083"), - ValidatorPubKey.fromHex("0xfda68482093ff5780855a139008ba695a1bd74864cb4ff72451caa5a46f8db497b44baecc93ead6aacd34c9ac92522d4"), - ValidatorPubKey.fromHex("0x8483c152bf17da7df9f3e7102d2fdd143b7649a95920263c8231ce6e80f01a849ae62064f2d03d6dcb89024d07ef9f33"), - ValidatorPubKey.fromHex("0x33ea02799800edf1c7660f1acf923f33913f2eaa89944c3b8ca4e44a2d061a1c6e4286ca92251bc0f3b11c535824aa0e"), - ValidatorPubKey.fromHex("0x46e3fdc0b5b6df3147a95ccfdfe66373bdbf96e6d5eed7306428f986778dd3b9eecb0bc5e568213b0b3faee7ce6caa79"), - ValidatorPubKey.fromHex("0xac9df2f76111be4c822a91d24a85291f55ed4ae4c574803781018360f83cc395fee9a3e56d92fc34d2f74f4dcd81c19d"), - ValidatorPubKey.fromHex("0xe6724c500b1573fee191980bdf4d8e30086bc2f2460ac775d9ceec553d4870f314fae83d04b9d9f17dc1bec64e1b5260"), - ValidatorPubKey.fromHex("0xb45d08842d2721b18d17209081b5b95ed2b9198c0dd47d16117834e1b96913071f5afe5abe53206a10103baeadbc4314"), - ValidatorPubKey.fromHex("0x8badb39dec9b9c348e4833797ac1f7fc84f7bac557d1bed58096144f48b8cda5fd8ddbe21e278f0b6d5c9aed6c90f783"), - ValidatorPubKey.fromHex("0x5fd79ebdc6f58defee05a823c9d793dfdc4b0c43ddbd1eb74c3432f59d069fe026ead5b1c925626ed9f915aee6f91247"), - ValidatorPubKey.fromHex("0x7763334ab10953dea5bffac69dea12eb53f0cd46947f04334d417223040453cfbe0f658d6f1e22a79c09807bdf3ee2c1"), - ValidatorPubKey.fromHex("0xf2df734e8b11d562900079828c2cde7dca86a2d63cf57813c67bab47fc627f1bb773d70015a486a1a2cd09b4a04c1b28"), - ValidatorPubKey.fromHex("0xd0c621f5bb524fb68aa3631b4a0629bf6bc210fe30e237d9caf8bfb476686b82eb8e8460062d187d6e2699ddc8988c0c"), - ValidatorPubKey.fromHex("0x10eb53f3ba6d355e301c785a2f204294c6a63233edee9cc135791815d086c9a8604c0d46baca6abe8c7a58e708e2106a"), - ValidatorPubKey.fromHex("0x4244a5380986232f8fb39f9396be04e6c504c3b1f87e9672d7154d09b97f0fa86cae849aac06b30ce993e00e126cf5b0"), - ValidatorPubKey.fromHex("0x2382850a411c389df2afdd2a03a6196b451893e2674d11e0b8ac6914ffa53c7a1ced201cc1390a3aa1a2879dcdfa143b"), - ValidatorPubKey.fromHex("0xa20189e31ecc6a8c2002a9dec9645aada8f01dbaa6f22f7efcc10e1de109f2528edcbe768f1baf78b8ecba189d70e28b"), - ValidatorPubKey.fromHex("0xd1f4e4ebedcc39544148157f4a5279def61a8dda08c087afbcc85e85f5fe8a244972e26077cfc1820c0c85814adfad6e"), - ValidatorPubKey.fromHex("0xf62d8f1b982babdffcc6616f8b2ac54fac5224c7a1fb66121079b9a521aff4f2ade3cd7aa40baa838e522a927179ac82"), - ValidatorPubKey.fromHex("0x7e0c87bbf88d5762dfca69732bb36525d11a755fde736f28088bc17958cb8d5745a923a56c6c0b4e98c0ffd9623f9816"), - ValidatorPubKey.fromHex("0xbf1d6ae7fd84bee92a4e22bd73b3869402504736ff5af0da6e02181ae2506a248ca4e969a82ea0304a93b6bb68d29435"), - ValidatorPubKey.fromHex("0x8ec4826fcde422ba62d222274fda595cd988d27fa0ffcbc91ab7ace22d2c9617a94ba008064a5f159801dc3b1956d96f"), - ValidatorPubKey.fromHex("0x068bee5a0d17f286962fdf71fe6e9d8b2d05f8203ecf2fbc0672003ec18a53636062dabd430715b8599f1111091417dd"), - ValidatorPubKey.fromHex("0xc0e15eadc90fbf93e2deccdd58cb13b30fea11913ca39c2ee42ddf74201dae1e84553ce8c6818d91658cb8ae97573c24"), - ValidatorPubKey.fromHex("0x5a0e0446883b0a0f09ea42faffc02ebf25407159503f5b430a216a54b1b9a4272765314c267ee2f3be8fe101208a28fd"), - ValidatorPubKey.fromHex("0xc22aa9c85a08126c371c19163c940c459a478a7391cabfb170a352faa30687ef571568d4ad327a6fe69652cd0daa33af"), - ValidatorPubKey.fromHex("0xc53c961a6977d4711914b2852ac231e6dae019ce13555e189bcae94b1786f0bb3b3e8ad173c3f029758ecbc0c0b1c6f0"), - ValidatorPubKey.fromHex("0x925aefdfeaeea3402ddd678a7069c20183fed9a11f7f866215788177ba9ae9d2914874866c2dd78f79f81495ce172352"), - ValidatorPubKey.fromHex("0x4aca00821c817196db75be87cb044f36466c65e5ea3ca90c60353b3927107bdbd8ec0775dfe8c08ea123801f4443d01b"), - ValidatorPubKey.fromHex("0xb84960b4042210498cd2ab478685a1b65e2a4e3bbf2e813440e38f38659def0e5ebe9514316f125634e23ae398fa2458"), - ValidatorPubKey.fromHex("0x3dbee79b334a30be85c82ae64331ab0bd7ce371c2b5cc734212f079209a845d0f45393bbca97ffad203e0af81af4325b"), - ValidatorPubKey.fromHex("0xfd9e33dec3e8ebeeb2ec64297ace2997dc6ecf148d98067cc3aabf2419a2788160c4d670836419672eebd663999ba53b"), - ValidatorPubKey.fromHex("0xdd9de04d992ecd5991ed84567803f2195b9c0cbbf74968e60c2272ba59f741fb07e84eefd970a0507b36ad7e4bd56e7e")] - -suite "ValidatorPubKey Bloom filter": - test "one-shot construction with no false positives/negatives": - var hashedPubkeyItems = mapIt(pubkeys, HashedValidatorPubKeyItem( - key: it.get, root: hash_tree_root(it.get))) - let - hashedPubkeys = mapIt(hashedPubkeyItems, HashedValidatorPubKey( - value: unsafeAddr it)) - validators = mapIt(hashedPubkeys, Validator(pubkeyData: it)) - - let bloomFilter = constructBloomFilter( - validators.toOpenArray(0, validators.len div 2)) - for validator in validators.toOpenArray(0, validators.len div 2): - check: bloomFilter[].mightContain(validator.pubkey) - for validator in validators.toOpenArray( - validators.len div 2 + 1, validators.len - 1): - check: not bloomFilter[].mightContain(validator.pubkey) - - test "incremental construction with no false positives/negatives": - let bloomFilter = constructBloomFilter([]) - for pubkey in pubkeys.toOpenArray(0, pubkeys.len div 2): - incl(bloomFilter[], pubkey.get) - - for pubkey in pubkeys.toOpenArray(0, pubkeys.len div 2): - check: bloomFilter[].mightContain(pubkey.get) - for pubkey in pubkeys.toOpenArray(pubkeys.len div 2 + 1, pubkeys.len - 1): - check: not bloomFilter[].mightContain(pubkey.get) diff --git a/tests/test_el_manager.nim b/tests/test_el_manager.nim index de3e8d63b..7845597c7 100644 --- a/tests/test_el_manager.nim +++ b/tests/test_el_manager.nim @@ -13,17 +13,6 @@ import ../beacon_chain/el/[el_conf, el_manager], ./testutil -from ssz_serialization/types import Limit, List, init -from stew/byteutils import hexToByteArray -from stint import UInt256 -from ../beacon_chain/spec/datatypes/bellatrix import - BloomLogs, ExecutionAddress, ExecutionPayload, fromHex -from ../beacon_chain/spec/datatypes/capella import ExecutionPayload -from ../beacon_chain/spec/datatypes/deneb import ExecutionPayload -from ../beacon_chain/spec/digest import Eth2Digest -from ../beacon_chain/spec/presets import - MAX_BYTES_PER_TRANSACTION, MAX_EXTRA_DATA_BYTES, MAX_TRANSACTIONS_PER_PAYLOAD - suite "Eth1 monitor": test "Rewrite URLs": var @@ -70,2757 +59,4 @@ suite "Eth1 monitor": for i in 0 .. depositIndex: for j in i .. depositIndex: - doTest(i, j) - - test "Roundtrip engine RPC V1 and bellatrix ExecutionPayload representations": - # Each Eth2Digest field is chosen randomly. Each uint64 field is random, - # with boosted probabilities for 0, 1, and high(uint64). There can be 0, - # 1, 2, or 3 transactions uniformly. Each transaction is 0, 8, 13, or 16 - # bytes. fee_recipient and logs_bloom, both, are uniformly random. extra - # bytes are random, with 0, 1, and 32 lengths' probabilities increased. - const executionPayloads = [ - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x760d4d1fced29500a422c401a646ee5bb5d65a07efa1492856a72cff9948a434"), - fee_recipient: ExecutionAddress.fromHex("0x315f583fa44fc6684553d3c88c3d26e9ed7123d8"), - state_root: Eth2Digest.fromHex("0xa6975bac699618cc22c05b1ba8f47cbd162475669474316d7a79ea84bce3c690"), - receipts_root: Eth2Digest.fromHex("0x080d53a0fd22d93f669b06052413851469d63adeb301810d7ce7a51c90c8e8ce"), - logs_bloom: BloomLogs.fromHex("0x453a1f1c4f63bcf0be84e36a9ac233b551601bb2e5ab9450235bd83e41d2013f42c97044ac197a91da96efd6fb18f233bad2e884d76f0a63a6fbf7dbc714cc9aa497fb6d363feeba18447ecf799d5f8d769232553c375b21166c0176859dba63eb77f1a17e482ebac07c3cfd5281277f55f1e5c79cc675d501e1982816d31db7d73c89e855315d8f4e9fef1c9ebb322610235c44632a80341b42f05d207ac4869d08d98a3587a470f598095ebb932788fefacdd70e7749e0bd47ceff88a74ee1f006d9791350484149935d4521d86e644ebc4346154ca0bfa9fbb83120630867d878c12e53a04a879e993b755f02670c9c47f091acf1b3f593782ddaa98f0df4"), - prev_randao: Eth2Digest.fromHex("0xe19503a6fa6acde0b8f5981f29eb2e298ddff63e6243529d735bcfa42680a515"), - block_number: 9937808397572497453'u64, - gas_limit: 15517598874177925531'u64, - gas_used: 3241597546384131838'u64, - timestamp: 17932057306109702405'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[55'u8, 184'u8, 18'u8, 128'u8, 63'u8, 61'u8, 26'u8, 79'u8, 3'u8, 225'u8, 167'u8, 15'u8, 240'u8, 167'u8, 180'u8, 141'u8, 205'u8, 10'u8, 246'u8, 70'u8, 248'u8, 35'u8, 19'u8, 45'u8, 252'u8, 187'u8, 168'u8, 42'u8]), - base_fee_per_gas: UInt256.fromHex("0xaf8acbd8a0f0f8eeced9a1014333cdddbd2090d663a06cd919cf17529e9d7862"), - block_hash: Eth2Digest.fromHex("0x86b46255725b39af70a9e1a3096287d9772ccc635408fe06c34cc8b680977ff5"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x2cb54ddf357864102f4ab6bce57317a75cee972f303449bf7047f4e0e5809127"), - fee_recipient: ExecutionAddress.fromHex("0x92af67d9604b945fd2cbaccd29598e2b47ef5d2d"), - state_root: Eth2Digest.fromHex("0xc64221514816a2f87a29c2c474abf99547820b2a12e6e5956f160dd54579e521"), - receipts_root: Eth2Digest.fromHex("0x76c1ca0e483a557f6884d64bd891c62904c64c2fe69350278345c622cc50b0d7"), - logs_bloom: BloomLogs.fromHex("0x7afdc9a99777d76b713e960e9f12ad4fe46ecb7ea6d5b245c6d9ee11d3fd35e7ae33dd6062fb6578bc2c2f286f1c6a4aa6a44cc80a88a3678c7085c35a0f2e5334ea686e2098fe5d179bbbaf81cbc349a15e7a21aa27f0ddcad342d980d056a356694cdadcef8db3c7866b6cb087c28f2aeed7a5bc9b1294cef0da3ac3b46dbe72d7f164f1990bc32f755b709b96a96bdd8da2c9d9300e9f6906040347d337fc21b833ff0b80305b22ac64a2df2dede4c01c65c192884f161aacd12ba56dab9189477e6ae484a97ff96e0aba1f9b8d043896b8433779abeec091f16b94a013325fe11096d1f2d79b701ab5b46063ac99392a790e617555fe3286dfd7ec0cb9b6"), - prev_randao: Eth2Digest.fromHex("0xc4021ae781a3b3a1dfb1e4464b032a3bae5f5b68366beb555ede1f126920cd5c"), - block_number: 11318858212743222111'u64, - gas_limit: 2312263413099464025'u64, - gas_used: 1, - timestamp: 15461704461982808518'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[254'u8, 188'u8, 92'u8, 24'u8, 153'u8, 206'u8, 74'u8, 108'u8, 96'u8, 100'u8, 148'u8, 84'u8, 151'u8, 74'u8, 73'u8, 167'u8, 65'u8, 177'u8, 253'u8, 62'u8]), - base_fee_per_gas: UInt256.fromHex("0xb1c4b2bffcb38aaa1f98b483441aa212c9dd951d4706dd505a973fd5fd84796f"), - block_hash: Eth2Digest.fromHex("0x8b150d453d802fdbb19be0132621a5e8061e70cfe6668ee6a63e4ff217434999"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[142'u8, 197'u8, 221'u8, 83'u8, 32'u8, 126'u8, 145'u8, 86'u8, 28'u8, 39'u8, 112'u8, 240'u8, 168'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[175'u8, 191'u8, 143'u8, 78'u8, 162'u8, 249'u8, 87'u8, 193'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 168'u8, 190'u8, 157'u8, 39'u8, 143'u8, 147'u8, 156'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xac5a7347865f503e1578d1b47271c8e60027b5ba24b0da8e7c3733bcdbeda220"), - fee_recipient: ExecutionAddress.fromHex("0x8b7fa656e67f6af2074ec3f16930ad742a69f189"), - state_root: Eth2Digest.fromHex("0xeb50f351f6945df8983cf4037ee264dcb2ceef3313ae452248571811d8a3a8cf"), - receipts_root: Eth2Digest.fromHex("0x860af6010832f64a5234327b653aabbd3898881a7b72ae42e08d4a1519166fba"), - logs_bloom: BloomLogs.fromHex("0x01a18d51076880a1a8ea86cc5dc5fb904ba0a3c285b7dff34ee5dbad9d64721f3849ad9f50b90ad4524eca6b0564f8a1a5827a7b476ea051c33a7c0e18db4cfb27b36476bbb1eacbc029dbc5009e5cea695045cfb34c868163514b784133f0f2998cf12e2caf9c74f69732ed3716396dc34d86725428aff48bf6b935ae88f5e4820b9a325bc670cf560dcb479723213a3156a9d7d0e7de0dc791d0eb94a691013624b8aa982ca3c9d5b49fcac8fafbb403c9fbceee5373f0fb2b77ff1bae8160fe2a47b01d792b088eb3fe24c53b5c6a8b4a3b59060d587ca7376f8baba58d57cf745b2a346f800a54d08545194e067ae260c73369a016b12d0fbc20abc78ba3"), - prev_randao: Eth2Digest.fromHex("0x330b7093023f617d2cb5f76cee4b078af002b68d81e3a5b5c9d37c4411871a95"), - block_number: 18446744073709551615'u64, - gas_limit: 13979513761871276914'u64, - gas_used: 6199089254852634745'u64, - timestamp: 7404562418233177323'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[220'u8, 149'u8, 177'u8, 36'u8, 228'u8, 88'u8, 47'u8, 149'u8, 211'u8, 213'u8, 170'u8, 40'u8, 207'u8, 145'u8, 137'u8, 64'u8, 153'u8, 22'u8]), - base_fee_per_gas: UInt256.fromHex("0xfc82d0e46d05b21aedab6f368183611d2885b28c52842f28f621ef6c631b6e6a"), - block_hash: Eth2Digest.fromHex("0xa8c6b2dcc2496f0230e796f8a69642126955ae6209a0d0c2dee2c925212f447e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[138'u8, 17'u8, 34'u8, 168'u8, 105'u8, 179'u8, 196'u8, 21'u8, 253'u8, 242'u8, 106'u8, 30'u8, 40'u8, 190'u8, 179'u8, 93'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xd3be9b45bfe67229afb47461ca2970505586cab8eb8e00f280ceb07a9d47866f"), - fee_recipient: ExecutionAddress.fromHex("0xde645d4a77f0a386a45c52357948e1d7eac5e780"), - state_root: Eth2Digest.fromHex("0x69b70e0188e7b88e38df90853b2dfd2e4c7181e83d82d77ab81c57d161216b92"), - receipts_root: Eth2Digest.fromHex("0xc01d94a01736268170a16196927029d4d8d7c65970ec78ece94c87304bed4568"), - logs_bloom: BloomLogs.fromHex("0x7f1ac5c77e3f0c8a1a103ee83dd7d0fd6fb13895aa1141de330445474b3216e2646c15c1cbf4ab4feb1e4e21c2e6970f4a6648675508b08111e00b62866b0f6cccd58afea87d2cd0a24c0384fa179dc33ae6d0db8c1b118a75fb442682b7cbecc2808fe8c812c3720ca54f6723a395fff5dd1720f41822c91b080503bbfeef21eea192d5b7c4160344996d017ab849fa97e862206caac8f8bfeba41865514b21a8d8fa9ce3dcc0daf5bf86fd2f07d222fc7a9d11fb4031b2cd72544d7f89eb95203a570bc179f9ba1f73f39d74049fe22b63939ea49d5d40f42c00c5f1bd429e84ade377475e432186acd9975914670052fea64453fca87317f62e29b550e88f"), - prev_randao: Eth2Digest.fromHex("0xce47da2b2a68186b78054be0894ccc9ae7213c18b9093c0ebc1b9ed011071a39"), - block_number: 9014833350824993703'u64, - gas_limit: 18446744073709551615'u64, - gas_used: 7874274181221487360'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[139'u8]), - base_fee_per_gas: UInt256.fromHex("0x1eb821a0ee3f9d2e5b49c64177db9ffc96ec6b06249cefa8c51d0ce7e664a3ae"), - block_hash: Eth2Digest.fromHex("0x99479be6429eac4a945ca8171d3d3ce42d7b5af298292e833e20462438e06229"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[99'u8, 198'u8, 91'u8, 86'u8, 23'u8, 222'u8, 121'u8, 250'u8, 12'u8, 135'u8, 133'u8, 37'u8, 61'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[81'u8, 173'u8, 241'u8, 145'u8, 54'u8, 3'u8, 36'u8, 121'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x06504beb0dc3bae44ef75678d29ec5138d87da68d307ca7d43e259cede60fda6"), - fee_recipient: ExecutionAddress.fromHex("0x527ce602a0be18c0944dc27b2864c711a91f89a6"), - state_root: Eth2Digest.fromHex("0xad3bbef5d22bdc2429da09eb85137c881f85fe6e6b3ea207e5eaeb399c755055"), - receipts_root: Eth2Digest.fromHex("0xf94fdc52cde20532cfdee73e9cebb61d9f7160191345f9caf58b45501d8effbc"), - logs_bloom: BloomLogs.fromHex("0x0999cc50752006a2bc8e5485c239b9a41be6ea2fd8f0392884246ef7d33bccdf4bd326fadae385e3ecc309bf0f367ac1791767ffaee90ddfa7bee22d19f417708fded2b2b6b3be2b6007745fb1de940e7849761586953c04e3bec3c9b6342d1b91dd024980f469b484bd0befc4941a3846d027390d6256e4acf9933e0891dd558270eb35d3455f4e49c890479e970a8008b75ff4d33b4f7e5a8c19e75d8abd8673ebb859a8a24907584d88f0d68b3142b3c6952695fdd84581f5a070601a575a8e7bfa0bf7cf0fe9d70a051005f9dc594d09909e9d079d02a4e441e5b3f33388de8d46cbdcdf24f835415680e569f2ed29acdc01042a6a7ee701e4e6cace5c28"), - prev_randao: Eth2Digest.fromHex("0x7cef96d72498facdb399dfb5b6d7d69185f3edc70715540fdc7ef651c4685c6a"), - block_number: 13066898984921201592'u64, - gas_limit: 9241830338892723842'u64, - gas_used: 8347984358275749670'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[11'u8, 46'u8, 127'u8, 104'u8, 141'u8, 79'u8, 55'u8, 48'u8, 242'u8, 12'u8, 142'u8, 2'u8]), - base_fee_per_gas: UInt256.fromHex("0x6241db2a44a58a2c1aac93c4aa18aed5add30d1937c31078542bb544bf9ba2df"), - block_hash: Eth2Digest.fromHex("0xdc1756667e7c3f1615650cbbaae1117a6bac817c6579cf3f7afbc93277eb3ea1"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[13'u8, 24'u8, 248'u8, 26'u8, 141'u8, 177'u8, 236'u8, 2'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[213'u8, 208'u8, 242'u8, 46'u8, 0'u8, 31'u8, 219'u8, 213'u8, 197'u8, 218'u8, 148'u8, 236'u8, 43'u8, 152'u8, 123'u8, 96'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 163'u8, 60'u8, 195'u8, 40'u8, 68'u8, 185'u8, 20'u8, 244'u8, 82'u8, 34'u8, 181'u8, 26'u8, 201'u8, 2'u8, 108'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xb5d4a5eae3a1ea004ed573b0b8f8a22c847616758c0faf1e7e9589f16e55415c"), - fee_recipient: ExecutionAddress.fromHex("0xf7ac0877fd8bcadde1e050f6c7ddad13688ec071"), - state_root: Eth2Digest.fromHex("0x7472f824376a723894f8d539743c7f93b69839772f28cf6a83e2102fde99c3c9"), - receipts_root: Eth2Digest.fromHex("0x750365b5d975460a64f07758abd0cdd44cee23cc2d4f06f2a047cf4c12c23db4"), - logs_bloom: BloomLogs.fromHex("0xe24d8452039bddd10e1252c1ebf9b9e81a22577f940e8708d200548717e8471e130a7066adc48785a8dea1dca05953d6be16504a57112c065e7909586cd611af9e0b840b81caf0532dbb2833ee5ac6a6eb7b6c990cba6ccf6f4ddec5a7c76f8296bd2a693cbbb43b1d86b66f6aa58888734d3fb21cf5e96f1b981f8ae2737bce1cad1cc458650291cf7a3d22c61fde6af3a07a44bf1b334b2c5dabbef16e5e73db75e87f04670cb3830f0a7badc702e7dd37a59ce02992f4473a909e57dee1fdd22cfc886f4fcb6ea205ec9234a8ec85ea134242748f9f10062534fd0528bc1b5b1e89511cdf91a1e7fb4f8c58c93d2a6c75e48a2d48235cb7de13040db8dc9c"), - prev_randao: Eth2Digest.fromHex("0x2410823a37c763e13b03a4c48e32f9e43b8440ca31ecfe8e0543a20a02c496c5"), - block_number: 14920119354157670036'u64, - gas_limit: 17193947846593799248'u64, - gas_used: 2176791850599260430'u64, - timestamp: 12670133468877091192'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[31'u8, 7'u8, 1'u8, 212'u8, 152'u8, 82'u8, 167'u8, 57'u8, 116'u8, 147'u8, 97'u8, 109'u8, 219'u8, 207'u8, 151'u8, 116'u8, 43'u8, 218'u8, 91'u8, 253'u8, 14'u8, 182'u8, 102'u8, 57'u8, 153'u8, 72'u8, 172'u8, 208'u8, 0'u8, 64'u8, 97'u8]), - base_fee_per_gas: UInt256.fromHex("0xf1daaa067663bf3277b9149aab162f4e330f988f0be8f83a556743a57ae5c8fd"), - block_hash: Eth2Digest.fromHex("0x5d462b4b243c6292b6a3b32f4e05849c0613d0a61954734c524f75f8df66cf8d"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x2629683cfc70198038837270bde3c60176c2a4aeeced0d4a4f14dc99a380c377"), - fee_recipient: ExecutionAddress.fromHex("0xd234af1937861b66ca84c334824763fb54347677"), - state_root: Eth2Digest.fromHex("0xf79f02d52d7f2a4be99eebba3dfb3bce74136ea739da515703d095a66ce203d5"), - receipts_root: Eth2Digest.fromHex("0xa97ae6fa5d6937f7754ff96766a54bb8ec082b046814e74f6c9c67147795f526"), - logs_bloom: BloomLogs.fromHex("0x5d2ef8bc2f58a84e4050e3a38985e4c267940707c8da3f687fefb9e22e4ae11a2f79a24456af3758e8b521d546dc178da5c85da869ebb2da551976488a769ca2940fa20853e4e1d1fcf8d5bbea0d16973c827d38c97c47c57835677590567829d119e8108f2ee3fa988b267ccfc3e58e5f81c18c775a9baf06d4d81aee405c5683fa4e5e891b58101a27e8f71c60d357a4ab8bd02e12fbbb0e363c4632b0a3c0de638de37448c9476c65a62f7f1dd9643fac6ff78ee431d18ab554b4c8a1984fb5fa0de3464d223f236eb8e8a8f59601221d2ab480ffcefaf4bf6471b40a14773ac0cdb43aea505941e4b0fa6fb26eb091adad77acce41e516fc743e5fdb045f"), - prev_randao: Eth2Digest.fromHex("0xbe44d7c5f844a2acb307a4371784d7742be482aece83368d94813ffa1c7bb60f"), - block_number: 13524449277995212660'u64, - gas_limit: 1, - gas_used: 7976957374052242924'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[57'u8]), - base_fee_per_gas: UInt256.fromHex("0x6c98d9ff36f1032fd55d8a6038d7b1f7c4e5f7c884b73f626fe43e687beeb46d"), - block_hash: Eth2Digest.fromHex("0x2c95101857b07bdda0502741da8cd9160ec0474929d132e9159098576f9a7c35"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[75'u8, 85'u8, 130'u8, 87'u8, 90'u8, 172'u8, 176'u8, 44'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[207'u8, 150'u8, 64'u8, 87'u8, 15'u8, 18'u8, 3'u8, 236'u8, 232'u8, 87'u8, 174'u8, 192'u8, 29'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[23'u8, 37'u8, 57'u8, 158'u8, 137'u8, 222'u8, 53'u8, 111'u8, 63'u8, 13'u8, 69'u8, 110'u8, 175'u8, 108'u8, 16'u8, 207'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x190544155dd98bf86d3ed5ee94d01afd3a8e67b8476f94d90604706da0a7d340"), - fee_recipient: ExecutionAddress.fromHex("0x799d176d73d5d6d54d66941ad6cef8208677371c"), - state_root: Eth2Digest.fromHex("0x07e626b9c44b0ff14586d17acf79cb136ccc5d37fd7135da33cec516af168f43"), - receipts_root: Eth2Digest.fromHex("0xb8b100bc5c155fe6358b9a16756ec06880365f5fe89124cf9fea963e26d3770f"), - logs_bloom: BloomLogs.fromHex("0xc314d3d6ab41a3fce7433dc286ee5c9820d883ff572ee7dfd2f4ee745f11a71f6dbe142d8c14bd6cc76782f1bb2b3770e65a929b2187581956bad937907a124c92ba10686763ddc87ba5b4a4e9cf4b9a35255fad5f54b404aeed5ad9859b5f9fd3c137e9eb6ef394a10b8ad3fbba75ba38c2cbfb91fa793ac763e8cd31481fbecef02b3365b990f5120a2970f2779574c60769347ae334a9f39bb3d3ad35182f7dcd252bfe9663c4f54b44dea8d79e3bcd89877231e81a9e9f5c1eaf5da1f56ffc39c23fc3ae6c130281c792a31e7a60115d46abbe17807cd120038631ca7a6636c8c644b57719e386cc8ada32ce806f75110ad143522fb0b240213df4bab07e"), - prev_randao: Eth2Digest.fromHex("0x17e445793c0e354ee43381ded194220ebd87ccbacef83e3da5a1cd3c8c57bf49"), - block_number: 5728529601694960312'u64, - gas_limit: 9410734351409376782'u64, - gas_used: 16470261240710401393'u64, - timestamp: 8811957812590656903'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[95'u8, 124'u8, 151'u8, 79'u8, 76'u8, 171'u8, 74'u8, 213'u8, 207'u8, 202'u8, 63'u8, 2'u8, 182'u8, 32'u8, 115'u8, 65'u8, 90'u8, 186'u8, 34'u8, 63'u8, 241'u8, 191'u8, 88'u8, 10'u8, 197'u8, 52'u8, 33'u8, 98'u8, 78'u8, 210'u8]), - base_fee_per_gas: UInt256.fromHex("0x3c1ba8cf82268c828c1a7f249328741ae21f35a7659365efd7496df94dbb85e9"), - block_hash: Eth2Digest.fromHex("0xc2b2bc39ed0cf5764800d3c91401828ed32d0eea58f9d336c32f9e6f7200ac8d"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x86d7b430f69b215ab5ae863998ce41f01a5016376c8bec7f5b7a6e16a2326d92"), - fee_recipient: ExecutionAddress.fromHex("0x73068946d757f5d145a38fe9de817b8b1e9d6c43"), - state_root: Eth2Digest.fromHex("0x312b4af4d3ca5960dda2f99531819f5c32624753cc0756c05d242f65dd605d92"), - receipts_root: Eth2Digest.fromHex("0xf3a1e8f784ee4bdb897d1511ce642276e2ecbc1f21bfde9caf7c4479b7fdf902"), - logs_bloom: BloomLogs.fromHex("0x633d228aa8b2b9f4b614c4b7c7aca616232d61bc6e06ca28f4b94bc39165cf3ca2e090cebbe8a5b66b161d92e65099503327f9f2adae6ec5a73463063a994d73f37e12caec8f6d439be7520b48b25ccfa8ff64e6884b7e240c8dfd0100a23f9f644da13f1628d989eef92806c9f936a71f470d710653355acd84fb23ff15910f1d2866d83b036246c46a681e762b9a19e72aab21b428c4710511d0a39cc5ec39ebf3aecb5c19096ab32135a629abc8cdec39b2b3631bf4e86bbfb824276fd728bef454ed981e5f9e8a4bb96b27f09f661c5c221f63a26945174162496496c9bbf38cd894c50fa69df0a8c722ab48d75044bf43468639ae9b61d0b5a2f9d819eb"), - prev_randao: Eth2Digest.fromHex("0x3a0689ac32c82a6b84d3230fdc6e2c1e89671fa3906336ccde9fb7cfd1811ac8"), - block_number: 9465334901279616671'u64, - gas_limit: 17844363972830076325'u64, - gas_used: 9534663249377184661'u64, - timestamp: 15490999633909732541'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[199'u8]), - base_fee_per_gas: UInt256.fromHex("0x9fc9f32819a67c4aebae259b0648e2b82f526ce8eef8fee33961f9fc69653b2b"), - block_hash: Eth2Digest.fromHex("0x1ac3f16da76520977c5e5d86f0c261d76e18413c202e8a46241951b3a80ca601"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[223'u8, 37'u8, 18'u8, 125'u8, 208'u8, 57'u8, 114'u8, 113'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 181'u8, 143'u8, 219'u8, 145'u8, 77'u8, 39'u8, 126'u8, 173'u8, 30'u8, 59'u8, 70'u8, 205'u8, 51'u8, 16'u8, 213'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xc51bf481df9be981c6656081e3854ffcf27551e2b4fdaed4ab12b355f247f4e1"), - fee_recipient: ExecutionAddress.fromHex("0xd79098c25eed05c9f6d55e95f5f6f58c1472fb28"), - state_root: Eth2Digest.fromHex("0x1a6b1eb78e5ac155d4be247a3b48d8d8d8574a16fa846681553037629b97ffd0"), - receipts_root: Eth2Digest.fromHex("0x5e44d4a3621cd8e495edc0b208f977c8d3f8e79a78fa7ecfc4a0f6e436f67b71"), - logs_bloom: BloomLogs.fromHex("0xe2b0dcfd2341ceb9c4edbc7115dbd6ed5f1c54ca39bee191fdaaa34368acee93f48561094dd23a3985ea2c2b83d918ba9dc671cde7732a591b4f9abd2eacf9d6416ca8c8d556052a98df2cffdbb086315585004c51c76872a06cee7d318f4845c0ade4c907c7933d4d883bcc586885be04ca9149e05b1624856e69e1efe8c93cd55d840bf71279293a118d51d4391fcbf4e6abe6ee50492ff2de085069a3c7656eb3a749d6bf46f56a2acd93a6840eb78e09a42f23fdea69bfbf017f4fd6b4a8d17df1aa5147c1897fe5fda1f5e79121f2fefef97117e7871d1cbf5b0b0350b9fc497c5aba27cbc129d452d6a60effb76e08b890d0bb856115fcfe3966359fda"), - prev_randao: Eth2Digest.fromHex("0xcd6fd69596cdd7df95e0b68e8ade01541b12ed15caa2b59803a4c4e6791870d4"), - block_number: 12264963829660560313'u64, - gas_limit: 11775806146734810959'u64, - gas_used: 1863395589678049593'u64, - timestamp: 5625804670695895441'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[183'u8]), - base_fee_per_gas: UInt256.fromHex("0x1443705192ff4dc1a819be4f22b8dcd6e7802337e62082880b1090f44a27d0e2"), - block_hash: Eth2Digest.fromHex("0x68da52444eb5322f3a0bda6bdc9a3a11a540dbd22026bb2d24862bbc32af9460"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[212'u8, 80'u8, 176'u8, 133'u8, 132'u8, 119'u8, 233'u8, 131'u8, 195'u8, 118'u8, 54'u8, 94'u8, 129'u8, 206'u8, 47'u8, 107'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 31'u8, 192'u8, 94'u8, 136'u8, 120'u8, 228'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[114'u8, 23'u8, 239'u8, 220'u8, 169'u8, 188'u8, 213'u8, 179'u8, 223'u8, 129'u8, 189'u8, 50'u8, 158'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x8b3e7e8d447527b9d00693389928260e7ea9da6855efd99369182bd9c213988a"), - fee_recipient: ExecutionAddress.fromHex("0xb45716c9aeddeb030c0b94202fcb97bd75a039b6"), - state_root: Eth2Digest.fromHex("0x8114b285e5f3277c04a66e660fef3b86295d6ca859dfa216df3309c0a7242f2d"), - receipts_root: Eth2Digest.fromHex("0x2a3ff38541ef83faad176c3c98ceb5c55622dec83fbfc5a19bdb27646849e852"), - logs_bloom: BloomLogs.fromHex("0x384a9b3d38d343af68d00c229e79aa31f2059e17c655f5e48d31d2b59b769660e91c1e5f386e4f7dc83f2570029a6f2b3351623fcb4dadd6b5b7b26e27de19e248ebd970a9678b69403ea8e16fe88562959586fcfdee3c407fcf623c94891a2270ba1829bf2ab77fa32913bb11c8a4a69e9baa6544ad336253637626b16d4a98884e7ac7d6c1e697a9435b1e5403b5122eebddec9c03c8a6c8fed0d8877888371e133fb837d33f073375f7e1536abf622610734b9b0aced8a891f02d5b35734e58b0ead66c49ed9f898b8f27e9415275c5d15051ec00cb006f8aef702a7414aefacfa9742cd3d8d34be817e0c731696e20b973cf2da66799121c0c6d12bc835d"), - prev_randao: Eth2Digest.fromHex("0x3bd54c7151dae2ad524b4df0d4283e3641ba787fc76f54221dba3a2aa556a1bb"), - block_number: 18446744073709551615'u64, - gas_limit: 637978774023867007'u64, - gas_used: 15110835166938431016'u64, - timestamp: 18065456863038184935'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[235'u8, 229'u8, 162'u8, 249'u8, 154'u8, 135'u8]), - base_fee_per_gas: UInt256.fromHex("0xbe93cc3dc2bb7e012db659df49e57653bf6ff21354c64eeb69c0002e9f933035"), - block_hash: Eth2Digest.fromHex("0x46cb3f590b2fbce372e67968a0d2ff4ce1b2c530fcc26b7a24ed6db054f52035"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 66'u8, 215'u8, 40'u8, 223'u8, 195'u8, 43'u8, 228'u8, 225'u8, 244'u8, 34'u8, 14'u8, 117'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[92'u8, 46'u8, 215'u8, 218'u8, 71'u8, 99'u8, 115'u8, 119'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xa4854e346d2e9a921cc6b3c4ce9fc739c99795cf10002924089f9886f8624d59"), - fee_recipient: ExecutionAddress.fromHex("0xa88781cf69a1eed63bcc3a32b6f9aba35d4f5b5e"), - state_root: Eth2Digest.fromHex("0xdc06d9210fd2738b0fa9df6d68e4ffbfef0dd7d7d8093fdbcd97ff845318cf6b"), - receipts_root: Eth2Digest.fromHex("0xfe1b70c143066edc444f9b49e778cf6db0060bd4e9122564350cf23061830439"), - logs_bloom: BloomLogs.fromHex("0x095a57c3f2d97aad8692cd09dfdd8388f1bf9ef98a1c3223ecfd0aed17d8c7c3ef593d7f09ba86500644deaa676df811da501d572f342e3f7ee7b9b081992f344f71fa50b3b9635d7375f67dbd85a0b1ade3d8d4778118df55b90c44f7dd1114f2ebcea5778b32701ef94af9b3713d1fe00275e09c7e918d7c529a37aa9de3464eb6364812ec486464ccbf7df2523369fdeb1b28955e35e8685c16f07fbe342edd1bc044021ed480bf4ceffefb13eaf4550c67ef8a5079f3f612f07fff60193eda6ac11d39f3056c41ea4355ef5ef7f311493c415cc8c42cb30a73dd58098262acebe6d901e4bae26b6e1eba693c7dc596ea27b0cdd4fee2f6450ca8b50b1a70"), - prev_randao: Eth2Digest.fromHex("0xc52844ad11072faa2222ffe9cbff77dcc7f681367d2aef5f1c3b206140064195"), - block_number: 767785029239287422'u64, - gas_limit: 15062566578072747104'u64, - gas_used: 7648884410596067087'u64, - timestamp: 4380084205540210041'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[217'u8, 40'u8, 125'u8, 94'u8, 156'u8, 71'u8, 79'u8, 66'u8, 117'u8, 228'u8, 173'u8, 189'u8, 115'u8, 41'u8, 153'u8, 226'u8, 130'u8, 21'u8, 108'u8, 194'u8, 206'u8, 218'u8, 141'u8]), - base_fee_per_gas: UInt256.fromHex("0x436767990abff9288346859c6b85b8a972421619eab2253483385c8151cb2016"), - block_hash: Eth2Digest.fromHex("0xca4f05c33836d82aee8230ef660016b993bca4aaf9a7b6cad96c2a0193eb026c"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[156'u8, 143'u8, 203'u8, 250'u8, 238'u8, 137'u8, 34'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[64'u8, 44'u8, 165'u8, 9'u8, 1'u8, 211'u8, 27'u8, 108'u8, 166'u8, 61'u8, 119'u8, 11'u8, 222'u8, 85'u8, 48'u8, 185'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[165'u8, 95'u8, 221'u8, 213'u8, 229'u8, 134'u8, 185'u8, 221'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x5e7b12465e0461e5dfa59a3254282378c55961b0e411023ce89d968bbdc33e9c"), - fee_recipient: ExecutionAddress.fromHex("0xbd1a1396ab49631cc933770944996b294da97d43"), - state_root: Eth2Digest.fromHex("0x74e6ccfb15da8afb94eebf28cb3ba3f9ce63e3354097f2f2527fe1cf978e76bf"), - receipts_root: Eth2Digest.fromHex("0x8e48bee56e149d1851cff0740ceab06767bd0e819261c5a2f75dbea382a110b6"), - logs_bloom: BloomLogs.fromHex("0x7894fbe58c624a153dbb160c516c9e82bd0cacf5f347f984efcca9450e9a20b50e058ed38e41c331df61114086f8a6b8a049467d7dafd812953aa593b2e9fbc056f0dba80973b2eaae8814b5e0804300eeea15613e59c8d34339f58e1b45599361497a3608c05140cf432e7983a30985aa0faf45dff56dce99eaa5ad3418722df17eaaa4e8df25ed1d9eedee1390e6440c4c37675182dcc07ff199d6dd015d3aa03194765e85fc0d4759d3c693fc2550e50835b88ba41d10fc33b58550d813abaa75bab39c0fbe419f1bde8fb82db9fcfb79894faeed84b2314f115a8fb9e276315ccbfb8e9650571add358f594ff2fb4ab9661afde76081bb2cfbfd2f26d212"), - prev_randao: Eth2Digest.fromHex("0xb9a9bce05e42cf3d2ffc2c2ea95164c9b215fc8e440dd2985ca24cff40e32780"), - block_number: 14460352585391846826'u64, - gas_limit: 2426408612341958329'u64, - gas_used: 13656152006197676019'u64, - timestamp: 6263571560389404595'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[177'u8, 36'u8, 79'u8, 26'u8, 164'u8, 59'u8, 182'u8, 88'u8, 223'u8, 22'u8, 79'u8, 197'u8, 109'u8, 53'u8, 53'u8, 134'u8, 244'u8, 84'u8, 146'u8, 158'u8, 234'u8, 252'u8, 188'u8, 175'u8, 69'u8, 51'u8, 118'u8, 101'u8, 242'u8, 0'u8, 51'u8, 103'u8]), - base_fee_per_gas: UInt256.fromHex("0x997e6c8ffbd1ea95e875612109843c6cdfd0c6bcaffa1e06ba303b3012b3c371"), - block_hash: Eth2Digest.fromHex("0x9a7f83cf6a64e153fc3316244fabd972a49ebf5dfb173d7e611bf3447a175c41"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 103'u8, 164'u8, 112'u8, 136'u8, 91'u8, 170'u8, 241'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xa8f90a617f1f230506d200c6026bd60e38f599930ed04f90cdc320a6d45bb022"), - fee_recipient: ExecutionAddress.fromHex("0x3531157eaf2c185bd8720f3edfaf76829632f07d"), - state_root: Eth2Digest.fromHex("0xa16f8936e945ecd45a4ae107e46acd8530e438fa1bc8eb85aef62afaca1656da"), - receipts_root: Eth2Digest.fromHex("0x3e76522c8f3b7e8d8a63f4968ab15413b8bbd7af9782c4878b52213b0b3d13f8"), - logs_bloom: BloomLogs.fromHex("0xc13b59de763feaa39debf70d280364ec68eb578af8a90aba7e2cf3a6cee413a28836c674662a0283df8ff04964eb928de97a3883226950b584d773c9b4479d6d5bda6fd71951c0c846752ed688e13dccff947b7a6c81bfac198b6bf785bca7be28bcf9a208b983afe6e766b0536311c1c12b4d01c712cdaa167ecec5520395068b1c1f939d20962de1aba36454cdb36031fa0ba886a8ece71234654e8b081562452046a388ebcf3cfd975493833ff4e146d5e5ddb061d994461ab8b468cf1d6d491d78fd8923f9f6563e3fbfa72639de993701ff6214fd83cd3597e870dec1c1e788a4f01f881c48e57b07c5a217132658208d2221a86c7e9823159984d235b5"), - prev_randao: Eth2Digest.fromHex("0xbac4a9aa16b289584d13abe3c47a58dda713c4b479ee70e1ac7b3b698e8505af"), - block_number: 4839752353493107669'u64, - gas_limit: 4713453319947764960'u64, - gas_used: 3470256075652600568'u64, - timestamp: 13764471837770950237'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[60'u8, 109'u8, 153'u8, 55'u8, 17'u8, 196'u8, 17'u8, 96'u8, 202'u8, 173'u8, 16'u8, 189'u8, 165'u8, 107'u8, 68'u8, 230'u8, 238'u8, 62'u8, 199'u8, 211'u8, 244'u8, 83'u8, 88'u8]), - base_fee_per_gas: UInt256.fromHex("0x3adad83f48e34c6220dce41ecc0b09f9bb1ae4bda4466935c70e7c6cd54e185e"), - block_hash: Eth2Digest.fromHex("0x9183524f908425608c1e3a80d7c4ac2c539903af4b3a2f1b22c3283281706aba"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xc914f63464f3f1588a32d3751900d415bbf1fe002c42068650f5c7c588b1935c"), - fee_recipient: ExecutionAddress.fromHex("0x61523b6add59cc65d3c5b75c6f749fa601e157de"), - state_root: Eth2Digest.fromHex("0xe84ecb995f6c7e753355c8d2e24694441c528b65ef9b1d8c6f4e9d98d409342b"), - receipts_root: Eth2Digest.fromHex("0x887bdafa340c24acb58f36a7e3825ce39fb7e0caaba3a9b63f78d2186cc6994a"), - logs_bloom: BloomLogs.fromHex("0x1fbd358ad7e32eefe4489b6c72bafcf6dbac109970e5c103e329279cede3619faf1309faf266ba155496c19565b31562f31539c98b6256919d8950bb6eca937401d91fa5b3032b4400ce6dd60a8c1c6cc94331b7e78d7a350ebb5d6e04a2594af981f167a89227c7c902dbb8eac3d7b54177d85214a6ef57b50da82b6420cf914fd63171f0b7dff9233bfaa2069774b142a136c5183ed4f57cde2590735b19ef549ff5bc910477b98344e7557ffc440b03d56842f356a6e223fd052c6272e24f43dc9e64055c097d81b56ecfd6087238602a743e09c383ad4eae6ef449570febdfebfefa347f06f480f319ff06365bbfae16b62a950143f9acc3663510356f0c"), - prev_randao: Eth2Digest.fromHex("0xc755584f86084ab2e62bd58f25dfe54538c0171e6447e7e1a51cf05db94377da"), - block_number: 9276126375553452674'u64, - gas_limit: 9007257403963034102'u64, - gas_used: 12806310385580231715'u64, - timestamp: 9957937708118639445'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xe2df33500d1162994934e9fa65fd5db641b0be2b61a6c302c7b9019f86042338"), - block_hash: Eth2Digest.fromHex("0xce58ef51926a6eb4cf2997c4ec771b54907737ae8fe9522fc316c97a1c7ee6d7"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x086322b79160568c7d096747ef351338ddc93f252dab1df3ef65aaf24723d2c3"), - fee_recipient: ExecutionAddress.fromHex("0x03c6998b5a3ff1c98538c2333d279f2b1cc59f7f"), - state_root: Eth2Digest.fromHex("0x446d99a7e9fd2c327fbd445dbfb3b3e3a895cdfa6f208496dd09c0f84f7ac0fd"), - receipts_root: Eth2Digest.fromHex("0xf4c74d5c59c46f1d9f916b32d8a12939cc2a379bae83153137de76415f6e5afe"), - logs_bloom: BloomLogs.fromHex("0x40f87c3729ba599c3e9bb749c48148ee0d5563db71cf0daaad3af95c45622d7b2a64204157a92a93cf0ffbe0052fb79eef83ba8389fe9d9e7646874b0636960e4eee86eeca00ba70f65b2046620264b795852def9beebb671f841e19ce07934b7c2f66301cc3c7dfa2606067cdeb04a564b87e56ff3650c7c6bbbc96b2de5ccf8e314ae74a26347371c315062532a1f1a2fe0c417ed5d12b6f81c3440c0d8b19d0cf8a030be83ee7ada6046d75098b6ee66664ead786a65ef5cdcb33c4634aa07cd7490abc0ea9ce722423a0cba1aecb379552e89483de43dd321cdaa8a005ab7e8e2a958038ca12e2b08709348a7f6daf34c488add1a0a21aed0da0b64251f9"), - prev_randao: Eth2Digest.fromHex("0x2ff08bd0b22bae8c3627f61b8da627fc367b3a60f93dbe48de1ca6f25ada489b"), - block_number: 10605470807350562909'u64, - gas_limit: 587854351728657338'u64, - gas_used: 8799032544585725320'u64, - timestamp: 18028498231539883963'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xfbe348f0c77be2ddbd3ec038e3aad88107625dc6e96b1fb3bbfdba8c737a3d7e"), - block_hash: Eth2Digest.fromHex("0xc545e833aa2ee5d708e041f4dcb44bda654372b3f5f660c683d12230303da729"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[89'u8, 59'u8, 131'u8, 146'u8, 186'u8, 180'u8, 208'u8, 76'u8, 69'u8, 40'u8, 29'u8, 211'u8, 97'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[208'u8, 136'u8, 157'u8, 0'u8, 120'u8, 231'u8, 99'u8, 33'u8, 31'u8, 210'u8, 80'u8, 203'u8, 24'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xcfba7f4aa4ff01d3d9de84dbe1761c79627a10c3188fb0a7c8adfa0d489e6441"), - fee_recipient: ExecutionAddress.fromHex("0x106b3bcaae4ff58dd837768be35c29c48571e4a4"), - state_root: Eth2Digest.fromHex("0xe6242399020361e70cb6b89701001fa8326251e6bae3b4ca1978eded8831d9a7"), - receipts_root: Eth2Digest.fromHex("0x3db0f9a05cc39be94414c3be28378d2b91ba3ff43ea2ea7e4e0a1874a0983f58"), - logs_bloom: BloomLogs.fromHex("0xd591169a3cc38e0837a76c4d7057f94c1ef08ad5af1778b1b06c3a0ec85201bfc659b18c49de831ce6b4a40f0d2800a9cc9001f74810c58473f9b973b720f84626cc9270b0428439b985043f5d9c3289ef8a794f5b8265e10e9fb9fa53a93887d270b8204f8f16cd968e295b0a06aa70e9f6f174733d251f3bfc644a7fb274b0138729f18c0e4382bd4bf0387870f633ed897a125ca854120c2885194f3180af4b62760db96da51f88ae1cd222f49b00fbbc1544eb0e98cea67e36368816f541723158d3691f3cf1509c65a51a8e68efb66c500dd6516ca1b02aeb4e0c13cf5bbead53672fb5a7a1863c8edfaf4eb9a4b4322a39d8643528bccf22493914fa01"), - prev_randao: Eth2Digest.fromHex("0x14fec0a1edb9c82dc9aa7fb7224791c51a3937e74e5da59646123867496460f2"), - block_number: 6272046003849350913'u64, - gas_limit: 15423951135645467684'u64, - gas_used: 3743939155619454195'u64, - timestamp: 8496536260448579184'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[152'u8]), - base_fee_per_gas: UInt256.fromHex("0xd8b104041bdc4c76a9735e2b4b45f0f3612e8962f672aaf511f06a94b48562c8"), - block_hash: Eth2Digest.fromHex("0x8ca67fec04b7e3bc5a01f5bb265b93b4488b58ec2ac7f2c3ced030311de2762e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[152'u8, 232'u8, 136'u8, 228'u8, 253'u8, 248'u8, 85'u8, 92'u8, 103'u8, 38'u8, 106'u8, 166'u8, 148'u8, 8'u8, 37'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[58'u8, 215'u8, 97'u8, 99'u8, 152'u8, 126'u8, 14'u8, 252'u8, 64'u8, 87'u8, 242'u8, 60'u8, 210'u8, 217'u8, 75'u8, 189'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x063bc56b731eeeff8bf1c33d88523a04a14fa0c745eb3c750139842d88244982"), - fee_recipient: ExecutionAddress.fromHex("0x415b1cd5b42709a3724ab2f6f50a6dab7399d7ca"), - state_root: Eth2Digest.fromHex("0xf261abf37066b8dc5c868946346c98aae445adbb48e6dd05969fbb49267a276e"), - receipts_root: Eth2Digest.fromHex("0x5a337b7ee29d98e22b461f43b7a87e52d89fda2e7a3487ea92873be04a49ea68"), - logs_bloom: BloomLogs.fromHex("0x01817fd642526acdd8b57b4fc2fb58aba269095ce220ae5770004055f550918778021eae3abeffff1b3fa9fba50ff8d532fd8e2e67da7bdcca1cf9505179f19f595f5d9f09b98d5bc7d1ecb22527255e8e161ca2124c5fedbb59527f91a242671177e33a6fa377d585ebdbd6d9ff2bf80bec3695657441e35da43861f14b9a7e65ed475c323ece62d84aed7262cf3fd2b06ba03695e2e26e5e58fc5b8b99d519fda879587e3764930e3921aa15b2ee8691ea0e738030acb8832ca353d3bb63fbc0150c532b842cd053abeae8238c9ffe6f4b2b7210dc862c48843ae2a9088ecdb8c258592a0feb5215b8c9ad494ad896379d86e0ac89e6cd8765003ac5c95cce"), - prev_randao: Eth2Digest.fromHex("0xb28f434f3f40e40693b0c1726a018e2b3bc13c41608a2ca71aa5c8bf61829287"), - block_number: 14597257287993827247'u64, - gas_limit: 9090926713872599867'u64, - gas_used: 17391976671717618186'u64, - timestamp: 13439825139187707720'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[73'u8, 163'u8, 138'u8, 201'u8, 62'u8, 1'u8, 37'u8, 90'u8, 157'u8]), - base_fee_per_gas: UInt256.fromHex("0x8a42339ef76757729ef6c4536b3b59255b18d7085d8ba786275b2076fc55b3c6"), - block_hash: Eth2Digest.fromHex("0xb3f6ec11b285a105833f5b68b67e8e23c85c28df2362a13a76db705f110fce8c"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xb31c41d39ef7e9a9b905cc93d82264415024d7daef48d886f1b3bc0fd6545edb"), - fee_recipient: ExecutionAddress.fromHex("0x5ad4b6c0d6b986e775f3a9ae2be73a330ba9f87c"), - state_root: Eth2Digest.fromHex("0x01dbc857a3d8994cf10cd1be3b2018be0e26ba54a5456e10a6e5729328a0b5f5"), - receipts_root: Eth2Digest.fromHex("0xa51e9cb9893bd7d73a8fd4e5267d80ddcb29d998814cfa9980dbae50ef101aff"), - logs_bloom: BloomLogs.fromHex("0xf1280db0ef6bb796e70dfef3b0bafa62690ef1e8f14a237856bae5dbe29dfd43ac789c53305ab5b0b7cc48ed53d1236ab9433a5352dac55b6e0a3ff90e9e815e2ce16fe5574c87f0066090c39b811996e2974da0bdb8bb59eb044bbb6bc2d7f8241093c7143a7c9892be85ea4284258ea2477f6a677d424efb6469724d641bbdc3f9254529b6af5cc5f5a77dad49c1a59ae37c19ffc69f6e331139b6ebac306ea09460dc0fc5791ef2cfb9e7bf29d662872e30b94384be90416df03bef5cf5a2339af4745f2f620fd1320d3fb79848692719cb8956b8efd427c9c0cc3ea6efb8f84feae0075ed10ec5c6243074e6004849712d8d1dd97ebb2948fcdf1d020c6e"), - prev_randao: Eth2Digest.fromHex("0xc8a27f0b7850de04e3d794b9e9d4f144c356f864401c3f802927faf4b88b47ac"), - block_number: 10821099926525463598'u64, - gas_limit: 7115919978619568727'u64, - gas_used: 1, - timestamp: 5900615379943209755'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[56'u8, 176'u8, 67'u8, 30'u8, 11'u8, 27'u8, 136'u8, 121'u8, 86'u8, 17'u8, 4'u8, 121'u8, 11'u8, 222'u8, 158'u8, 78'u8, 56'u8, 66'u8, 243'u8]), - base_fee_per_gas: UInt256.fromHex("0xfbaacdba879288838ff725df19b7a31148ec5a24e7989441544d6dec1c980034"), - block_hash: Eth2Digest.fromHex("0x04616c0808df7a1bc177bc48cb6ed865125fbbac2fa3e3c36f33a5f1c48a23fd"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xf6cba3ced37c08da230babbf9d1e360661e5a21ac235fefa75cbe756f15809de"), - fee_recipient: ExecutionAddress.fromHex("0x0c080349793b7f43fb3ee9101889e7d32e02c01d"), - state_root: Eth2Digest.fromHex("0x6a33580fc482e9783d66bee9276f42b74a2cbc2b7434fc408a6ba9df77db0ceb"), - receipts_root: Eth2Digest.fromHex("0xd896daff74ffd6ffcc088adba01aea52af82d861b7ff649265a750e5995dcf31"), - logs_bloom: BloomLogs.fromHex("0xec00c3385b735b6a4088ed066bdb088e7826a2830fd13a1a1525c4590eb08baeba81bb511bbf2db2c0547c69c10b5c6c1bf5c8e5a7931584e6ed8ed7357431e1e2391fc0e61a060baf8984a6fd5c04c68fe0f28f94281d0db663b1b2fdaad9b51d3a12bb9fba255c923dea5ce45dd68ec2c5afc9fd13a0e24d234a3c8c5f255e7d62d48a8e01fb5c1eaf0c7a68a616ac935416fe3332943d78eb28a48a180e2bee26e85d786583ae0609a8b98e1045738f054aa12bef97593cd16d8d795314bfff33c51b397afa2299a4a64244817e5a07cdcd75eb4c4c06e8e943d8d1db8e65f17368ab6175c3e14daad0b99fd0f1050feebadf9db8fe8f1c19ed867f4df676"), - prev_randao: Eth2Digest.fromHex("0xdcd37bc148c25afa7e320009ce19567108745ef5ed57781f55df1d73b707e26e"), - block_number: 13754339262807377549'u64, - gas_limit: 5250261236890759949'u64, - gas_used: 1335844244115849195'u64, - timestamp: 16758901654456753273'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[28'u8, 8'u8, 171'u8, 122'u8, 126'u8, 38'u8, 142'u8, 246'u8, 162'u8, 197'u8, 241'u8, 216'u8, 158'u8, 184'u8, 73'u8, 191'u8, 208'u8, 5'u8, 79'u8, 231'u8, 254'u8, 55'u8, 126'u8, 97'u8, 184'u8, 78'u8, 36'u8, 80'u8, 160'u8, 124'u8, 188'u8, 176'u8]), - base_fee_per_gas: UInt256.fromHex("0x0ea1185e0ac50d1e2cc0be7229c846528380def25f7d8860cf366e6edd793be0"), - block_hash: Eth2Digest.fromHex("0xb471874aa6e8987deee40902d59537fed8af3e9b6ae2f8b476ddb051629b3b09"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 215'u8, 225'u8, 83'u8, 163'u8, 187'u8, 111'u8, 141'u8, 246'u8, 57'u8, 238'u8, 163'u8, 25'u8, 91'u8, 114'u8, 111'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[93'u8, 42'u8, 101'u8, 80'u8, 160'u8, 252'u8, 158'u8, 121'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[164'u8, 98'u8, 105'u8, 179'u8, 25'u8, 33'u8, 130'u8, 239'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x62ce6a6d68578309c4730f96f98a809d4b4225fc3d37a285daf26288b10f9590"), - fee_recipient: ExecutionAddress.fromHex("0x8c892b06f1e9c877c310b6eccefb20fcf5e00227"), - state_root: Eth2Digest.fromHex("0x578f93b83206e3239c69f51cc8e59cd89087260cda9f0efc892aa2ffb2bf386e"), - receipts_root: Eth2Digest.fromHex("0xa4ac657af8e0dad66ec74f4f66b246fe0089485e2810071fa556c09ea585059f"), - logs_bloom: BloomLogs.fromHex("0x18d67e640f9ad3a24deb7e3f8cbe0ba8224cf9cb9e67b2fd6c774fac7aa3f4adca2befe8322962cf000cb89c3e352433cf1aade51ceac9fe69966a8a89f7985030a301eb690e7eb20b5ac3b315930ee5397b6d65b03a1131b94e7f3505ef030877e460e9195b742e943716d9875a3e2e9998236d3565d622216af1721b658a12fe7d82a62619b4f2d042f146305ff1ad1bf394437340735eac9e962b3fe67597793d1151ec87fcb5f0056837c5813c75c4a0f94d91da71299b3780f250ee31eb9f106e3c443f0ba05213da05177238909fd9e60de9484e091b91dead82debc020929d1f14e79b610af3d15bf9c3757e62bb32a69523c1bd576e5c5d4bc2ef0a6"), - prev_randao: Eth2Digest.fromHex("0x552627eb969604e7d4ed1e631b74b2410dea7f4dbd49511bda390e3b9da8bf60"), - block_number: 7763671958353664038'u64, - gas_limit: 3930616259240751958'u64, - gas_used: 7960068863134244743'u64, - timestamp: 18446744073709551615'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[227'u8, 111'u8, 127'u8, 243'u8, 191'u8, 237'u8, 88'u8, 146'u8, 146'u8, 236'u8, 162'u8, 237'u8, 164'u8, 177'u8, 249'u8, 52'u8, 1'u8, 26'u8, 187'u8, 208'u8, 244'u8, 234'u8, 113'u8, 199'u8, 30'u8, 209'u8, 197'u8, 63'u8, 126'u8, 104'u8, 143'u8, 30'u8]), - base_fee_per_gas: UInt256.fromHex("0x6bcd9684e1bc8f4fc5d089e0bf5fed35a8bf3039808d030bb9eb1ff7147180b5"), - block_hash: Eth2Digest.fromHex("0x9e2505de9f245873565b553e7215abff698bdfcee1dbd93e40eb295dd84e7f45"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[140'u8, 134'u8, 173'u8, 70'u8, 168'u8, 181'u8, 221'u8, 210'u8, 25'u8, 142'u8, 168'u8, 139'u8, 77'u8, 134'u8, 203'u8, 219'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x4f8251c361a23171de8648d1e96c91fea2cc5a691dcd884e3a957dc8f6a8802a"), - fee_recipient: ExecutionAddress.fromHex("0x7da9175abaf6e4e400e0ee516fd3ab07dd659f2a"), - state_root: Eth2Digest.fromHex("0x1bd3a5da4c266dd396b8209288e68be066176ebe64cd4c17c4c6cdccaf03577e"), - receipts_root: Eth2Digest.fromHex("0x16133c4fe31f0487e700514160acf9257458a6ee716be8043cb6c532f84ef614"), - logs_bloom: BloomLogs.fromHex("0x5ca3807e674d69536b33337d798deaeb9fa6c7cbab7aef1473e6a6614f6f2c74ef85ee3632612b9c1e78d2a63e0b2f58d48d71e8d62e38510bc2f307680497cb965153b43392b8aa2dcd91a766356eab3ff1b4a6c4b037d61df1a8a4c6d3fa0e3c57a299a1c0a7382052ac25c412f2d2356c302e326fa0cfb570354e31e2f8046b80e2690ba69ec7c284c2df8ad23d16764cbc0ba28516f3c31aa89da3e3286106dcecc835b3007a17f33c4962efc3c9b0f5bff14c783e414ba60d35b79ab33ccd0151c34a94efc461d0df0a994085373f33275a4cd6839603632409b670072a4554f1c9342c03cd403a6feb67b23d3a075707ca89b77bad64e24a6ab79446ad"), - prev_randao: Eth2Digest.fromHex("0x6353ec5b94b9112f25e66de48b532ff5610c63f34c50a02fdf64af6c9d0ef2f4"), - block_number: 16866969889068542818'u64, - gas_limit: 5116920640663397560'u64, - gas_used: 13292402101416991817'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[136'u8, 133'u8, 189'u8, 60'u8, 229'u8, 217'u8, 70'u8, 145'u8, 136'u8, 97'u8, 175'u8, 23'u8, 183'u8, 73'u8]), - base_fee_per_gas: UInt256.fromHex("0xe1307a28a2868b4d934aefdde7bbd09b0644b5c422d2c680770775cb44623512"), - block_hash: Eth2Digest.fromHex("0x11e23850b143b8b4dd8394ee1f2cebf073068502d04dde00000925cf23ff55cc"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x0c67b44b492590ffb9e6d2a63c84714821be7526ce1c337c06276e33a62b7b93"), - fee_recipient: ExecutionAddress.fromHex("0x1d16dbe66ead2ba8afb8594acaf8d536be08dac3"), - state_root: Eth2Digest.fromHex("0xeeb40e334aff8512435b5908a8dd3c06993cadca8bc44e9a6c28c6003162c6a9"), - receipts_root: Eth2Digest.fromHex("0xefa5b7de19da2333bfb7bfa814a306f904fef2ff4f8b1154314649a56fea3c8d"), - logs_bloom: BloomLogs.fromHex("0x4ebbaff6a56343a6bc0170aca2e2ba303f3e3f972c88539ef84e402740e3c9e21c6951d461baf56eec14c06ca0e95f4921079d0d82e9dd46e73f3fa76417246217ff9c5425f19b0f8b2a735ee522c1bc377a2b079099430d0f9316164f5930456245534bbe138d0a19ee58bb13a0d724723a6fa50e39b8a7ad5804f92ab43c24782e27dbb32789408cdd716af9a0b0cb1e2f3aee0bcb5aa4088c0cf1528fad466f3d71d906649becf25f405f619dead731e0831efb522b5faee7a39ca28128effc79977816d50ae23745ab96b80dc7f548aa5d43b0d5c331fdc1ce080a4d63e19942ecb4df8f56397b2ef67d017f2d2de9296e1fd8036ed8592f5a89553c4642"), - prev_randao: Eth2Digest.fromHex("0x5d3c3ac25330e1cd3a516003315ed24bd2dc6cd31d389639cce4b6ae4a3ac8cf"), - block_number: 10891095348111649307'u64, - gas_limit: 13670668340379820434'u64, - gas_used: 1482104080767186829'u64, - timestamp: 6602476120092784163'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[223'u8, 228'u8, 253'u8, 3'u8, 38'u8, 218'u8, 253'u8, 87'u8, 206'u8, 243'u8, 168'u8, 113'u8]), - base_fee_per_gas: UInt256.fromHex("0x972a01f27d586035ce5fb233118e52652ebbf89f6d39558a41b27c8840c849b1"), - block_hash: Eth2Digest.fromHex("0x9280fa96a569e7c25b2dfc12a141d3edd24acf2fbfa19ee72e5a1fd5dba25a11"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[116'u8, 179'u8, 195'u8, 80'u8, 193'u8, 73'u8, 187'u8, 64'u8, 41'u8, 251'u8, 55'u8, 90'u8, 161'u8, 30'u8, 221'u8, 210'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x7a9d6ab34c0314959d5bdceb0bd80f142e59e5e2addedcd178612303897e7a8a"), - fee_recipient: ExecutionAddress.fromHex("0x3425bc529b4791f5fdb7dd365501199b2f81e578"), - state_root: Eth2Digest.fromHex("0x4eb1a9a3c4b9392325a14f3f8efbc0b3cc3bfc2d7e9992377abd84af6c556db5"), - receipts_root: Eth2Digest.fromHex("0x094e9114d3487925f6818140978e4db64d8306083a8e5c987657e21c3a1995bd"), - logs_bloom: BloomLogs.fromHex("0x0815701b4689d0bb7f80fb1485ad3255a66b890725a1d2d66b4fc66678e2d08784c21ef583401493d5dda1549eda32303b7d102edc72b9fe1d696ab459294a88db0d7263abdf982ddf59ce008b8ac734565de79c269dfc18a36709ca91a3cd50516725e9fa9d98302fa0322254382aab0cdf1f95f2397579f7219bd7ab096ef1f00d7b1131b0055bff65ae9954cb22959adbc40983840ae3b85358fd205bdf6ac6bcf723047ffc53a094a06c2039935b6ef579efc618bf4127a6e4e531f6d97c17789be639691ef87fa5540cf732a184a0e09d5c60866ecd0be0a04bc94317712c395d84c2cec90f43f4807048bf1a93e3e6520a1a7c59092e2e391abf9d2e68"), - prev_randao: Eth2Digest.fromHex("0x349eec90244f3d812002732cd833952969b27a463def04291051137344c89c41"), - block_number: 5715688900321967041'u64, - gas_limit: 17172684770312311722'u64, - gas_used: 9286597649062725614'u64, - timestamp: 195835912833125491'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[34'u8, 35'u8, 209'u8, 45'u8, 117'u8]), - base_fee_per_gas: UInt256.fromHex("0x7b5b4e48b3daadecb9724a74d426a86ffb5c5f8abd43469b4e3fe2a728b5a645"), - block_hash: Eth2Digest.fromHex("0xc71c294b5562af30b9e2b03e76cec0cc6d8b50694219404aaed2ace8f756a22e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[178'u8, 142'u8, 115'u8, 217'u8, 56'u8, 74'u8, 150'u8, 16'u8, 244'u8, 148'u8, 19'u8, 33'u8, 89'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[195'u8, 248'u8, 42'u8, 129'u8, 151'u8, 119'u8, 232'u8, 235'u8, 245'u8, 240'u8, 113'u8, 157'u8, 235'u8, 158'u8, 160'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 27'u8, 72'u8, 107'u8, 18'u8, 210'u8, 127'u8, 78'u8])]) - ), - (bellatrix.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x806a868f0f31e8f519fa6339ad18c414dba17feb03aaf6ca3775b152bac64f3b"), - fee_recipient: ExecutionAddress.fromHex("0xa2bcc8b793c4a5d4e0f68251d2f22e1ff4366d2c"), - state_root: Eth2Digest.fromHex("0x6979ac9545f31eaf7ed8bd227cd7cbd1017492b892bcc118f7417ea87d50d412"), - receipts_root: Eth2Digest.fromHex("0xca0ac1828fae211c9d0fd7ab763460d89f9da0669d082c68b9fdca3ca1b59123"), - logs_bloom: BloomLogs.fromHex("0x0656423dc7b375cee4f5c3bedc500eaff2da91d0dd5f4e695933c92a2a6af7441200a41177bcae7912839f993a733aa2bb82976f08180a901e63c588a26dc9ccc58f477eccbb08aa932d512bfc765a57527acd04c585af23f48f389420890d06877d8a0f523cb90be10dbc73cb5b11e808f5c6c90c6fc3a9434dab462f2977eacf79146b35ee2372aae8a6fe3628cbe21a8988fd9546b25581b6d998462f9af7f653d3a4702a4a63b9f26cc7d2f72e18a3918fa9b65ed81d23ac0a64dd8f3f878f745fcb4de9ad144ae9565288d7bf90e6d356f49cc242d000e988fe76e0196f0c5b24bdf9dc501222e54f64861e0d45dda2bdf09e5fb290a1ec6dce39b02883"), - prev_randao: Eth2Digest.fromHex("0xc986211f6550cb787e89140d8856531ec309f652e2a871e2715c1dd055448074"), - block_number: 7781035717593646205'u64, - gas_limit: 9088183223170031827'u64, - gas_used: 0, - timestamp: 1844848381084178223'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xaac988479abbe95e03cc214e7b99795c4ec117bfe4da06e4624e94b262b015e2"), - block_hash: Eth2Digest.fromHex("0x14137d373f6e6110b3fe3c1d743a4f84547ad3d59d0b42598b794ff601e97e38"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[10'u8, 28'u8, 79'u8, 238'u8, 85'u8, 206'u8, 161'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[144'u8, 222'u8, 190'u8, 14'u8, 247'u8, 119'u8, 95'u8, 48'u8, 238'u8, 50'u8, 180'u8, 12'u8, 216'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]) - )] - - for executionPayload in executionPayloads: - check: - executionPayload == asConsensusType( - asEngineExecutionPayload(executionPayload)) - - test "Roundtrip engine RPC V2 and capella ExecutionPayload representations": - # Each Eth2Digest field is chosen randomly. Each uint64 field is random, - # with boosted probabilities for 0, 1, and high(uint64). There can be 0, - # 1, 2, or 3 transactions uniformly. Each transaction is 0, 8, 13, or 16 - # bytes. fee_recipient and logs_bloom, both, are uniformly random. extra - # bytes are random, with 0, 1, and 32 lengths' probabilities increased. - # - # For withdrawals, many possible values are nonsensical (e.g., sufficiently - # high withdrawal indexes or validator indexes), but should be supported in - # this layer regardless, so sample across entire domain. - const executionPayloads = [ - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x760d4d1fced29500a422c401a646ee5bb5d65a07efa1492856a72cff9948a434"), - fee_recipient: ExecutionAddress.fromHex("0x315f583fa44fc6684553d3c88c3d26e9ed7123d8"), - state_root: Eth2Digest.fromHex("0xa6975bac699618cc22c05b1ba8f47cbd162475669474316d7a79ea84bce3c690"), - receipts_root: Eth2Digest.fromHex("0x080d53a0fd22d93f669b06052413851469d63adeb301810d7ce7a51c90c8e8ce"), - logs_bloom: BloomLogs.fromHex("0x453a1f1c4f63bcf0be84e36a9ac233b551601bb2e5ab9450235bd83e41d2013f42c97044ac197a91da96efd6fb18f233bad2e884d76f0a63a6fbf7dbc714cc9aa497fb6d363feeba18447ecf799d5f8d769232553c375b21166c0176859dba63eb77f1a17e482ebac07c3cfd5281277f55f1e5c79cc675d501e1982816d31db7d73c89e855315d8f4e9fef1c9ebb322610235c44632a80341b42f05d207ac4869d08d98a3587a470f598095ebb932788fefacdd70e7749e0bd47ceff88a74ee1f006d9791350484149935d4521d86e644ebc4346154ca0bfa9fbb83120630867d878c12e53a04a879e993b755f02670c9c47f091acf1b3f593782ddaa98f0df4"), - prev_randao: Eth2Digest.fromHex("0xe19503a6fa6acde0b8f5981f29eb2e298ddff63e6243529d735bcfa42680a515"), - block_number: 9937808397572497453'u64, - gas_limit: 15517598874177925531'u64, - gas_used: 3241597546384131838'u64, - timestamp: 17932057306109702405'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[55'u8, 184'u8, 18'u8, 128'u8, 63'u8, 61'u8, 26'u8, 79'u8, 3'u8, 225'u8, 167'u8, 15'u8, 240'u8, 167'u8, 180'u8, 141'u8, 205'u8, 10'u8, 246'u8, 70'u8, 248'u8, 35'u8, 19'u8, 45'u8, 252'u8, 187'u8, 168'u8, 42'u8]), - base_fee_per_gas: UInt256.fromHex("0xaf8acbd8a0f0f8eeced9a1014333cdddbd2090d663a06cd919cf17529e9d7862"), - block_hash: Eth2Digest.fromHex("0x86b46255725b39af70a9e1a3096287d9772ccc635408fe06c34cc8b680977ff5"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 98780'u64, validator_index: 8610867051145053792'u64, address: ExecutionAddress.fromHex("0x0c33e909ef375bd3ab33961b5ea767b4f1c8bce0"), amount: 671269'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 500164'u64, address: ExecutionAddress.fromHex("0x271215240885828779da36212489170f19a8f5bb"), amount: 2071087476832314128'u64.Gwei), - capella.Withdrawal(index: 26148315722507923'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x340bd9f489ec124b8a879673f12969b14d0b5555"), amount: 9486787560616102568'u64.Gwei), - capella.Withdrawal(index: 4839737623914146930'u64, validator_index: 273755626242170824'u64, address: ExecutionAddress.fromHex("0xcacc573cfc0ad561aae27f7be1c38b8dd6fab2cc"), amount: 9475975971913976804'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x2cb54ddf357864102f4ab6bce57317a75cee972f303449bf7047f4e0e5809127"), - fee_recipient: ExecutionAddress.fromHex("0x92af67d9604b945fd2cbaccd29598e2b47ef5d2d"), - state_root: Eth2Digest.fromHex("0xc64221514816a2f87a29c2c474abf99547820b2a12e6e5956f160dd54579e521"), - receipts_root: Eth2Digest.fromHex("0x76c1ca0e483a557f6884d64bd891c62904c64c2fe69350278345c622cc50b0d7"), - logs_bloom: BloomLogs.fromHex("0x7afdc9a99777d76b713e960e9f12ad4fe46ecb7ea6d5b245c6d9ee11d3fd35e7ae33dd6062fb6578bc2c2f286f1c6a4aa6a44cc80a88a3678c7085c35a0f2e5334ea686e2098fe5d179bbbaf81cbc349a15e7a21aa27f0ddcad342d980d056a356694cdadcef8db3c7866b6cb087c28f2aeed7a5bc9b1294cef0da3ac3b46dbe72d7f164f1990bc32f755b709b96a96bdd8da2c9d9300e9f6906040347d337fc21b833ff0b80305b22ac64a2df2dede4c01c65c192884f161aacd12ba56dab9189477e6ae484a97ff96e0aba1f9b8d043896b8433779abeec091f16b94a013325fe11096d1f2d79b701ab5b46063ac99392a790e617555fe3286dfd7ec0cb9b6"), - prev_randao: Eth2Digest.fromHex("0xc4021ae781a3b3a1dfb1e4464b032a3bae5f5b68366beb555ede1f126920cd5c"), - block_number: 11318858212743222111'u64, - gas_limit: 2312263413099464025'u64, - gas_used: 1, - timestamp: 15461704461982808518'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[254'u8, 188'u8, 92'u8, 24'u8, 153'u8, 206'u8, 74'u8, 108'u8, 96'u8, 100'u8, 148'u8, 84'u8, 151'u8, 74'u8, 73'u8, 167'u8, 65'u8, 177'u8, 253'u8, 62'u8]), - base_fee_per_gas: UInt256.fromHex("0xb1c4b2bffcb38aaa1f98b483441aa212c9dd951d4706dd505a973fd5fd84796f"), - block_hash: Eth2Digest.fromHex("0x8b150d453d802fdbb19be0132621a5e8061e70cfe6668ee6a63e4ff217434999"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[142'u8, 197'u8, 221'u8, 83'u8, 32'u8, 126'u8, 145'u8, 86'u8, 28'u8, 39'u8, 112'u8, 240'u8, 168'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[175'u8, 191'u8, 143'u8, 78'u8, 162'u8, 249'u8, 87'u8, 193'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 168'u8, 190'u8, 157'u8, 39'u8, 143'u8, 147'u8, 156'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 11497754023538902580'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xb0b680a6d93e520fa32e399ded64871d99c1f2c6"), amount: 15592017597077727306'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 14269483352942387358'u64, address: ExecutionAddress.fromHex("0x97e4451d09c9af077dc9081e5081563aa26e4c51"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 9664968187979079659'u64, validator_index: 750818'u64, address: ExecutionAddress.fromHex("0x1e4bc6f12efe96b9f5ca549b77a3d62c5f5403d8"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 727020'u64, validator_index: 10133766089843653238'u64, address: ExecutionAddress.fromHex("0x6a1ed64277cf1eba8c96281531d2799d1fa7c409"), amount: 130469'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xac5a7347865f503e1578d1b47271c8e60027b5ba24b0da8e7c3733bcdbeda220"), - fee_recipient: ExecutionAddress.fromHex("0x8b7fa656e67f6af2074ec3f16930ad742a69f189"), - state_root: Eth2Digest.fromHex("0xeb50f351f6945df8983cf4037ee264dcb2ceef3313ae452248571811d8a3a8cf"), - receipts_root: Eth2Digest.fromHex("0x860af6010832f64a5234327b653aabbd3898881a7b72ae42e08d4a1519166fba"), - logs_bloom: BloomLogs.fromHex("0x01a18d51076880a1a8ea86cc5dc5fb904ba0a3c285b7dff34ee5dbad9d64721f3849ad9f50b90ad4524eca6b0564f8a1a5827a7b476ea051c33a7c0e18db4cfb27b36476bbb1eacbc029dbc5009e5cea695045cfb34c868163514b784133f0f2998cf12e2caf9c74f69732ed3716396dc34d86725428aff48bf6b935ae88f5e4820b9a325bc670cf560dcb479723213a3156a9d7d0e7de0dc791d0eb94a691013624b8aa982ca3c9d5b49fcac8fafbb403c9fbceee5373f0fb2b77ff1bae8160fe2a47b01d792b088eb3fe24c53b5c6a8b4a3b59060d587ca7376f8baba58d57cf745b2a346f800a54d08545194e067ae260c73369a016b12d0fbc20abc78ba3"), - prev_randao: Eth2Digest.fromHex("0x330b7093023f617d2cb5f76cee4b078af002b68d81e3a5b5c9d37c4411871a95"), - block_number: 18446744073709551615'u64, - gas_limit: 13979513761871276914'u64, - gas_used: 6199089254852634745'u64, - timestamp: 7404562418233177323'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[220'u8, 149'u8, 177'u8, 36'u8, 228'u8, 88'u8, 47'u8, 149'u8, 211'u8, 213'u8, 170'u8, 40'u8, 207'u8, 145'u8, 137'u8, 64'u8, 153'u8, 22'u8]), - base_fee_per_gas: UInt256.fromHex("0xfc82d0e46d05b21aedab6f368183611d2885b28c52842f28f621ef6c631b6e6a"), - block_hash: Eth2Digest.fromHex("0xa8c6b2dcc2496f0230e796f8a69642126955ae6209a0d0c2dee2c925212f447e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[138'u8, 17'u8, 34'u8, 168'u8, 105'u8, 179'u8, 196'u8, 21'u8, 253'u8, 242'u8, 106'u8, 30'u8, 40'u8, 190'u8, 179'u8, 93'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 1'u64, validator_index: 239183'u64, address: ExecutionAddress.fromHex("0x75efb2a04b5f25ae56ff7256ee9f4fdc4e25baf3"), amount: 402148'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xd3be9b45bfe67229afb47461ca2970505586cab8eb8e00f280ceb07a9d47866f"), - fee_recipient: ExecutionAddress.fromHex("0xde645d4a77f0a386a45c52357948e1d7eac5e780"), - state_root: Eth2Digest.fromHex("0x69b70e0188e7b88e38df90853b2dfd2e4c7181e83d82d77ab81c57d161216b92"), - receipts_root: Eth2Digest.fromHex("0xc01d94a01736268170a16196927029d4d8d7c65970ec78ece94c87304bed4568"), - logs_bloom: BloomLogs.fromHex("0x7f1ac5c77e3f0c8a1a103ee83dd7d0fd6fb13895aa1141de330445474b3216e2646c15c1cbf4ab4feb1e4e21c2e6970f4a6648675508b08111e00b62866b0f6cccd58afea87d2cd0a24c0384fa179dc33ae6d0db8c1b118a75fb442682b7cbecc2808fe8c812c3720ca54f6723a395fff5dd1720f41822c91b080503bbfeef21eea192d5b7c4160344996d017ab849fa97e862206caac8f8bfeba41865514b21a8d8fa9ce3dcc0daf5bf86fd2f07d222fc7a9d11fb4031b2cd72544d7f89eb95203a570bc179f9ba1f73f39d74049fe22b63939ea49d5d40f42c00c5f1bd429e84ade377475e432186acd9975914670052fea64453fca87317f62e29b550e88f"), - prev_randao: Eth2Digest.fromHex("0xce47da2b2a68186b78054be0894ccc9ae7213c18b9093c0ebc1b9ed011071a39"), - block_number: 9014833350824993703'u64, - gas_limit: 18446744073709551615'u64, - gas_used: 7874274181221487360'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[139'u8]), - base_fee_per_gas: UInt256.fromHex("0x1eb821a0ee3f9d2e5b49c64177db9ffc96ec6b06249cefa8c51d0ce7e664a3ae"), - block_hash: Eth2Digest.fromHex("0x99479be6429eac4a945ca8171d3d3ce42d7b5af298292e833e20462438e06229"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[99'u8, 198'u8, 91'u8, 86'u8, 23'u8, 222'u8, 121'u8, 250'u8, 12'u8, 135'u8, 133'u8, 37'u8, 61'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[81'u8, 173'u8, 241'u8, 145'u8, 54'u8, 3'u8, 36'u8, 121'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x06504beb0dc3bae44ef75678d29ec5138d87da68d307ca7d43e259cede60fda6"), - fee_recipient: ExecutionAddress.fromHex("0x527ce602a0be18c0944dc27b2864c711a91f89a6"), - state_root: Eth2Digest.fromHex("0xad3bbef5d22bdc2429da09eb85137c881f85fe6e6b3ea207e5eaeb399c755055"), - receipts_root: Eth2Digest.fromHex("0xf94fdc52cde20532cfdee73e9cebb61d9f7160191345f9caf58b45501d8effbc"), - logs_bloom: BloomLogs.fromHex("0x0999cc50752006a2bc8e5485c239b9a41be6ea2fd8f0392884246ef7d33bccdf4bd326fadae385e3ecc309bf0f367ac1791767ffaee90ddfa7bee22d19f417708fded2b2b6b3be2b6007745fb1de940e7849761586953c04e3bec3c9b6342d1b91dd024980f469b484bd0befc4941a3846d027390d6256e4acf9933e0891dd558270eb35d3455f4e49c890479e970a8008b75ff4d33b4f7e5a8c19e75d8abd8673ebb859a8a24907584d88f0d68b3142b3c6952695fdd84581f5a070601a575a8e7bfa0bf7cf0fe9d70a051005f9dc594d09909e9d079d02a4e441e5b3f33388de8d46cbdcdf24f835415680e569f2ed29acdc01042a6a7ee701e4e6cace5c28"), - prev_randao: Eth2Digest.fromHex("0x7cef96d72498facdb399dfb5b6d7d69185f3edc70715540fdc7ef651c4685c6a"), - block_number: 13066898984921201592'u64, - gas_limit: 9241830338892723842'u64, - gas_used: 8347984358275749670'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[11'u8, 46'u8, 127'u8, 104'u8, 141'u8, 79'u8, 55'u8, 48'u8, 242'u8, 12'u8, 142'u8, 2'u8]), - base_fee_per_gas: UInt256.fromHex("0x6241db2a44a58a2c1aac93c4aa18aed5add30d1937c31078542bb544bf9ba2df"), - block_hash: Eth2Digest.fromHex("0xdc1756667e7c3f1615650cbbaae1117a6bac817c6579cf3f7afbc93277eb3ea1"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[13'u8, 24'u8, 248'u8, 26'u8, 141'u8, 177'u8, 236'u8, 2'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[213'u8, 208'u8, 242'u8, 46'u8, 0'u8, 31'u8, 219'u8, 213'u8, 197'u8, 218'u8, 148'u8, 236'u8, 43'u8, 152'u8, 123'u8, 96'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 163'u8, 60'u8, 195'u8, 40'u8, 68'u8, 185'u8, 20'u8, 244'u8, 82'u8, 34'u8, 181'u8, 26'u8, 201'u8, 2'u8, 108'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 15531362396155364476'u64, address: ExecutionAddress.fromHex("0x063b2e1de01c4dad4402641553c7c60ea990ab30"), amount: 106054'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xb5d4a5eae3a1ea004ed573b0b8f8a22c847616758c0faf1e7e9589f16e55415c"), - fee_recipient: ExecutionAddress.fromHex("0xf7ac0877fd8bcadde1e050f6c7ddad13688ec071"), - state_root: Eth2Digest.fromHex("0x7472f824376a723894f8d539743c7f93b69839772f28cf6a83e2102fde99c3c9"), - receipts_root: Eth2Digest.fromHex("0x750365b5d975460a64f07758abd0cdd44cee23cc2d4f06f2a047cf4c12c23db4"), - logs_bloom: BloomLogs.fromHex("0xe24d8452039bddd10e1252c1ebf9b9e81a22577f940e8708d200548717e8471e130a7066adc48785a8dea1dca05953d6be16504a57112c065e7909586cd611af9e0b840b81caf0532dbb2833ee5ac6a6eb7b6c990cba6ccf6f4ddec5a7c76f8296bd2a693cbbb43b1d86b66f6aa58888734d3fb21cf5e96f1b981f8ae2737bce1cad1cc458650291cf7a3d22c61fde6af3a07a44bf1b334b2c5dabbef16e5e73db75e87f04670cb3830f0a7badc702e7dd37a59ce02992f4473a909e57dee1fdd22cfc886f4fcb6ea205ec9234a8ec85ea134242748f9f10062534fd0528bc1b5b1e89511cdf91a1e7fb4f8c58c93d2a6c75e48a2d48235cb7de13040db8dc9c"), - prev_randao: Eth2Digest.fromHex("0x2410823a37c763e13b03a4c48e32f9e43b8440ca31ecfe8e0543a20a02c496c5"), - block_number: 14920119354157670036'u64, - gas_limit: 17193947846593799248'u64, - gas_used: 2176791850599260430'u64, - timestamp: 12670133468877091192'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[31'u8, 7'u8, 1'u8, 212'u8, 152'u8, 82'u8, 167'u8, 57'u8, 116'u8, 147'u8, 97'u8, 109'u8, 219'u8, 207'u8, 151'u8, 116'u8, 43'u8, 218'u8, 91'u8, 253'u8, 14'u8, 182'u8, 102'u8, 57'u8, 153'u8, 72'u8, 172'u8, 208'u8, 0'u8, 64'u8, 97'u8]), - base_fee_per_gas: UInt256.fromHex("0xf1daaa067663bf3277b9149aab162f4e330f988f0be8f83a556743a57ae5c8fd"), - block_hash: Eth2Digest.fromHex("0x5d462b4b243c6292b6a3b32f4e05849c0613d0a61954734c524f75f8df66cf8d"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5416630176463173042'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xd7b1d18e4eb7b5041b4b08bae2ce8e22982d6e6c"), amount: 911474'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x2629683cfc70198038837270bde3c60176c2a4aeeced0d4a4f14dc99a380c377"), - fee_recipient: ExecutionAddress.fromHex("0xd234af1937861b66ca84c334824763fb54347677"), - state_root: Eth2Digest.fromHex("0xf79f02d52d7f2a4be99eebba3dfb3bce74136ea739da515703d095a66ce203d5"), - receipts_root: Eth2Digest.fromHex("0xa97ae6fa5d6937f7754ff96766a54bb8ec082b046814e74f6c9c67147795f526"), - logs_bloom: BloomLogs.fromHex("0x5d2ef8bc2f58a84e4050e3a38985e4c267940707c8da3f687fefb9e22e4ae11a2f79a24456af3758e8b521d546dc178da5c85da869ebb2da551976488a769ca2940fa20853e4e1d1fcf8d5bbea0d16973c827d38c97c47c57835677590567829d119e8108f2ee3fa988b267ccfc3e58e5f81c18c775a9baf06d4d81aee405c5683fa4e5e891b58101a27e8f71c60d357a4ab8bd02e12fbbb0e363c4632b0a3c0de638de37448c9476c65a62f7f1dd9643fac6ff78ee431d18ab554b4c8a1984fb5fa0de3464d223f236eb8e8a8f59601221d2ab480ffcefaf4bf6471b40a14773ac0cdb43aea505941e4b0fa6fb26eb091adad77acce41e516fc743e5fdb045f"), - prev_randao: Eth2Digest.fromHex("0xbe44d7c5f844a2acb307a4371784d7742be482aece83368d94813ffa1c7bb60f"), - block_number: 13524449277995212660'u64, - gas_limit: 1, - gas_used: 7976957374052242924'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[57'u8]), - base_fee_per_gas: UInt256.fromHex("0x6c98d9ff36f1032fd55d8a6038d7b1f7c4e5f7c884b73f626fe43e687beeb46d"), - block_hash: Eth2Digest.fromHex("0x2c95101857b07bdda0502741da8cd9160ec0474929d132e9159098576f9a7c35"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[75'u8, 85'u8, 130'u8, 87'u8, 90'u8, 172'u8, 176'u8, 44'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[207'u8, 150'u8, 64'u8, 87'u8, 15'u8, 18'u8, 3'u8, 236'u8, 232'u8, 87'u8, 174'u8, 192'u8, 29'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[23'u8, 37'u8, 57'u8, 158'u8, 137'u8, 222'u8, 53'u8, 111'u8, 63'u8, 13'u8, 69'u8, 110'u8, 175'u8, 108'u8, 16'u8, 207'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 1071093368516669975'u64, validator_index: 15999188653672167093'u64, address: ExecutionAddress.fromHex("0x368b0ae1a6bfc3312460f212017e8bb32aae55bf"), amount: 13132185675616884508'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 1251419977457119333'u64, address: ExecutionAddress.fromHex("0x0a4d18e47c5ec0c639ff29d8f8c9be0b60f00452"), amount: 1'u64.Gwei), - capella.Withdrawal(index: 2046299652899032730'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x44bfe00f98603a5e8363030de4202ba50c7e8138"), amount: 15403504672180847702'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x190544155dd98bf86d3ed5ee94d01afd3a8e67b8476f94d90604706da0a7d340"), - fee_recipient: ExecutionAddress.fromHex("0x799d176d73d5d6d54d66941ad6cef8208677371c"), - state_root: Eth2Digest.fromHex("0x07e626b9c44b0ff14586d17acf79cb136ccc5d37fd7135da33cec516af168f43"), - receipts_root: Eth2Digest.fromHex("0xb8b100bc5c155fe6358b9a16756ec06880365f5fe89124cf9fea963e26d3770f"), - logs_bloom: BloomLogs.fromHex("0xc314d3d6ab41a3fce7433dc286ee5c9820d883ff572ee7dfd2f4ee745f11a71f6dbe142d8c14bd6cc76782f1bb2b3770e65a929b2187581956bad937907a124c92ba10686763ddc87ba5b4a4e9cf4b9a35255fad5f54b404aeed5ad9859b5f9fd3c137e9eb6ef394a10b8ad3fbba75ba38c2cbfb91fa793ac763e8cd31481fbecef02b3365b990f5120a2970f2779574c60769347ae334a9f39bb3d3ad35182f7dcd252bfe9663c4f54b44dea8d79e3bcd89877231e81a9e9f5c1eaf5da1f56ffc39c23fc3ae6c130281c792a31e7a60115d46abbe17807cd120038631ca7a6636c8c644b57719e386cc8ada32ce806f75110ad143522fb0b240213df4bab07e"), - prev_randao: Eth2Digest.fromHex("0x17e445793c0e354ee43381ded194220ebd87ccbacef83e3da5a1cd3c8c57bf49"), - block_number: 5728529601694960312'u64, - gas_limit: 9410734351409376782'u64, - gas_used: 16470261240710401393'u64, - timestamp: 8811957812590656903'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[95'u8, 124'u8, 151'u8, 79'u8, 76'u8, 171'u8, 74'u8, 213'u8, 207'u8, 202'u8, 63'u8, 2'u8, 182'u8, 32'u8, 115'u8, 65'u8, 90'u8, 186'u8, 34'u8, 63'u8, 241'u8, 191'u8, 88'u8, 10'u8, 197'u8, 52'u8, 33'u8, 98'u8, 78'u8, 210'u8]), - base_fee_per_gas: UInt256.fromHex("0x3c1ba8cf82268c828c1a7f249328741ae21f35a7659365efd7496df94dbb85e9"), - block_hash: Eth2Digest.fromHex("0xc2b2bc39ed0cf5764800d3c91401828ed32d0eea58f9d336c32f9e6f7200ac8d"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 802141'u64, validator_index: 7520769587588158114'u64, address: ExecutionAddress.fromHex("0xce1fcedcc47b22d7e38f76c1cba49c2c20da09eb"), amount: 5845756482608800263'u64.Gwei), - capella.Withdrawal(index: 4169028257817284566'u64, validator_index: 496485'u64, address: ExecutionAddress.fromHex("0xf99805deece4ff418b55557b45060e88035f755a"), amount: 4870783513883486430'u64.Gwei), - capella.Withdrawal(index: 10410265605811982468'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x31e886453fa4e7fcec6ce6094ad22950637d41a1"), amount: 157748'u64.Gwei), - capella.Withdrawal(index: 10622085591419415519'u64, validator_index: 8179967808007927229'u64, address: ExecutionAddress.fromHex("0x03d2493395b71bb181db626a99c24dbc1d07065f"), amount: 18446744073709551615'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x86d7b430f69b215ab5ae863998ce41f01a5016376c8bec7f5b7a6e16a2326d92"), - fee_recipient: ExecutionAddress.fromHex("0x73068946d757f5d145a38fe9de817b8b1e9d6c43"), - state_root: Eth2Digest.fromHex("0x312b4af4d3ca5960dda2f99531819f5c32624753cc0756c05d242f65dd605d92"), - receipts_root: Eth2Digest.fromHex("0xf3a1e8f784ee4bdb897d1511ce642276e2ecbc1f21bfde9caf7c4479b7fdf902"), - logs_bloom: BloomLogs.fromHex("0x633d228aa8b2b9f4b614c4b7c7aca616232d61bc6e06ca28f4b94bc39165cf3ca2e090cebbe8a5b66b161d92e65099503327f9f2adae6ec5a73463063a994d73f37e12caec8f6d439be7520b48b25ccfa8ff64e6884b7e240c8dfd0100a23f9f644da13f1628d989eef92806c9f936a71f470d710653355acd84fb23ff15910f1d2866d83b036246c46a681e762b9a19e72aab21b428c4710511d0a39cc5ec39ebf3aecb5c19096ab32135a629abc8cdec39b2b3631bf4e86bbfb824276fd728bef454ed981e5f9e8a4bb96b27f09f661c5c221f63a26945174162496496c9bbf38cd894c50fa69df0a8c722ab48d75044bf43468639ae9b61d0b5a2f9d819eb"), - prev_randao: Eth2Digest.fromHex("0x3a0689ac32c82a6b84d3230fdc6e2c1e89671fa3906336ccde9fb7cfd1811ac8"), - block_number: 9465334901279616671'u64, - gas_limit: 17844363972830076325'u64, - gas_used: 9534663249377184661'u64, - timestamp: 15490999633909732541'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[199'u8]), - base_fee_per_gas: UInt256.fromHex("0x9fc9f32819a67c4aebae259b0648e2b82f526ce8eef8fee33961f9fc69653b2b"), - block_hash: Eth2Digest.fromHex("0x1ac3f16da76520977c5e5d86f0c261d76e18413c202e8a46241951b3a80ca601"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[223'u8, 37'u8, 18'u8, 125'u8, 208'u8, 57'u8, 114'u8, 113'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 181'u8, 143'u8, 219'u8, 145'u8, 77'u8, 39'u8, 126'u8, 173'u8, 30'u8, 59'u8, 70'u8, 205'u8, 51'u8, 16'u8, 213'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 0'u64, validator_index: 7432737887980948854'u64, address: ExecutionAddress.fromHex("0x1a99860ddeecae3195a051bc0a0fcc37d0135e37"), amount: 921585'u64.Gwei), - capella.Withdrawal(index: 8891974894683849035'u64, validator_index: 18060634568259374245'u64, address: ExecutionAddress.fromHex("0x53a6cc4c3996f0181cfe62be861900f56cb75a87"), amount: 235145'u64.Gwei), - capella.Withdrawal(index: 11531749110606308043'u64, validator_index: 9858359378531619375'u64, address: ExecutionAddress.fromHex("0x6b7a4bc00868b077f1c4aa53369e893162bcc384"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 530041'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b7853973d34b1efe7722be5c688589b49c1aaa9"), amount: 18446744073709551615'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xc51bf481df9be981c6656081e3854ffcf27551e2b4fdaed4ab12b355f247f4e1"), - fee_recipient: ExecutionAddress.fromHex("0xd79098c25eed05c9f6d55e95f5f6f58c1472fb28"), - state_root: Eth2Digest.fromHex("0x1a6b1eb78e5ac155d4be247a3b48d8d8d8574a16fa846681553037629b97ffd0"), - receipts_root: Eth2Digest.fromHex("0x5e44d4a3621cd8e495edc0b208f977c8d3f8e79a78fa7ecfc4a0f6e436f67b71"), - logs_bloom: BloomLogs.fromHex("0xe2b0dcfd2341ceb9c4edbc7115dbd6ed5f1c54ca39bee191fdaaa34368acee93f48561094dd23a3985ea2c2b83d918ba9dc671cde7732a591b4f9abd2eacf9d6416ca8c8d556052a98df2cffdbb086315585004c51c76872a06cee7d318f4845c0ade4c907c7933d4d883bcc586885be04ca9149e05b1624856e69e1efe8c93cd55d840bf71279293a118d51d4391fcbf4e6abe6ee50492ff2de085069a3c7656eb3a749d6bf46f56a2acd93a6840eb78e09a42f23fdea69bfbf017f4fd6b4a8d17df1aa5147c1897fe5fda1f5e79121f2fefef97117e7871d1cbf5b0b0350b9fc497c5aba27cbc129d452d6a60effb76e08b890d0bb856115fcfe3966359fda"), - prev_randao: Eth2Digest.fromHex("0xcd6fd69596cdd7df95e0b68e8ade01541b12ed15caa2b59803a4c4e6791870d4"), - block_number: 12264963829660560313'u64, - gas_limit: 11775806146734810959'u64, - gas_used: 1863395589678049593'u64, - timestamp: 5625804670695895441'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[183'u8]), - base_fee_per_gas: UInt256.fromHex("0x1443705192ff4dc1a819be4f22b8dcd6e7802337e62082880b1090f44a27d0e2"), - block_hash: Eth2Digest.fromHex("0x68da52444eb5322f3a0bda6bdc9a3a11a540dbd22026bb2d24862bbc32af9460"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[212'u8, 80'u8, 176'u8, 133'u8, 132'u8, 119'u8, 233'u8, 131'u8, 195'u8, 118'u8, 54'u8, 94'u8, 129'u8, 206'u8, 47'u8, 107'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 31'u8, 192'u8, 94'u8, 136'u8, 120'u8, 228'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[114'u8, 23'u8, 239'u8, 220'u8, 169'u8, 188'u8, 213'u8, 179'u8, 223'u8, 129'u8, 189'u8, 50'u8, 158'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 109465'u64, address: ExecutionAddress.fromHex("0x30376c1737df493e34318acb7efa0aadd3d78738"), amount: 419309'u64.Gwei), - capella.Withdrawal(index: 3744271566165938073'u64, validator_index: 162930'u64, address: ExecutionAddress.fromHex("0x9a3eee4729cf5ef57a1c4aeb474636461991270a"), amount: 9043308530560640624'u64.Gwei), - capella.Withdrawal(index: 10893292846301120513'u64, validator_index: 15952780188276928656'u64, address: ExecutionAddress.fromHex("0xfccc1279aa3dde74ea08b699fecb4481c777f259"), amount: 5614376920521492084'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 2895353066704396409'u64, address: ExecutionAddress.fromHex("0x7e8b34a029236dc0d15db19153165d1eccab05a8"), amount: 3749025806369957542'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x8b3e7e8d447527b9d00693389928260e7ea9da6855efd99369182bd9c213988a"), - fee_recipient: ExecutionAddress.fromHex("0xb45716c9aeddeb030c0b94202fcb97bd75a039b6"), - state_root: Eth2Digest.fromHex("0x8114b285e5f3277c04a66e660fef3b86295d6ca859dfa216df3309c0a7242f2d"), - receipts_root: Eth2Digest.fromHex("0x2a3ff38541ef83faad176c3c98ceb5c55622dec83fbfc5a19bdb27646849e852"), - logs_bloom: BloomLogs.fromHex("0x384a9b3d38d343af68d00c229e79aa31f2059e17c655f5e48d31d2b59b769660e91c1e5f386e4f7dc83f2570029a6f2b3351623fcb4dadd6b5b7b26e27de19e248ebd970a9678b69403ea8e16fe88562959586fcfdee3c407fcf623c94891a2270ba1829bf2ab77fa32913bb11c8a4a69e9baa6544ad336253637626b16d4a98884e7ac7d6c1e697a9435b1e5403b5122eebddec9c03c8a6c8fed0d8877888371e133fb837d33f073375f7e1536abf622610734b9b0aced8a891f02d5b35734e58b0ead66c49ed9f898b8f27e9415275c5d15051ec00cb006f8aef702a7414aefacfa9742cd3d8d34be817e0c731696e20b973cf2da66799121c0c6d12bc835d"), - prev_randao: Eth2Digest.fromHex("0x3bd54c7151dae2ad524b4df0d4283e3641ba787fc76f54221dba3a2aa556a1bb"), - block_number: 18446744073709551615'u64, - gas_limit: 637978774023867007'u64, - gas_used: 15110835166938431016'u64, - timestamp: 18065456863038184935'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[235'u8, 229'u8, 162'u8, 249'u8, 154'u8, 135'u8]), - base_fee_per_gas: UInt256.fromHex("0xbe93cc3dc2bb7e012db659df49e57653bf6ff21354c64eeb69c0002e9f933035"), - block_hash: Eth2Digest.fromHex("0x46cb3f590b2fbce372e67968a0d2ff4ce1b2c530fcc26b7a24ed6db054f52035"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 66'u8, 215'u8, 40'u8, 223'u8, 195'u8, 43'u8, 228'u8, 225'u8, 244'u8, 34'u8, 14'u8, 117'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[92'u8, 46'u8, 215'u8, 218'u8, 71'u8, 99'u8, 115'u8, 119'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xa4854e346d2e9a921cc6b3c4ce9fc739c99795cf10002924089f9886f8624d59"), - fee_recipient: ExecutionAddress.fromHex("0xa88781cf69a1eed63bcc3a32b6f9aba35d4f5b5e"), - state_root: Eth2Digest.fromHex("0xdc06d9210fd2738b0fa9df6d68e4ffbfef0dd7d7d8093fdbcd97ff845318cf6b"), - receipts_root: Eth2Digest.fromHex("0xfe1b70c143066edc444f9b49e778cf6db0060bd4e9122564350cf23061830439"), - logs_bloom: BloomLogs.fromHex("0x095a57c3f2d97aad8692cd09dfdd8388f1bf9ef98a1c3223ecfd0aed17d8c7c3ef593d7f09ba86500644deaa676df811da501d572f342e3f7ee7b9b081992f344f71fa50b3b9635d7375f67dbd85a0b1ade3d8d4778118df55b90c44f7dd1114f2ebcea5778b32701ef94af9b3713d1fe00275e09c7e918d7c529a37aa9de3464eb6364812ec486464ccbf7df2523369fdeb1b28955e35e8685c16f07fbe342edd1bc044021ed480bf4ceffefb13eaf4550c67ef8a5079f3f612f07fff60193eda6ac11d39f3056c41ea4355ef5ef7f311493c415cc8c42cb30a73dd58098262acebe6d901e4bae26b6e1eba693c7dc596ea27b0cdd4fee2f6450ca8b50b1a70"), - prev_randao: Eth2Digest.fromHex("0xc52844ad11072faa2222ffe9cbff77dcc7f681367d2aef5f1c3b206140064195"), - block_number: 767785029239287422'u64, - gas_limit: 15062566578072747104'u64, - gas_used: 7648884410596067087'u64, - timestamp: 4380084205540210041'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[217'u8, 40'u8, 125'u8, 94'u8, 156'u8, 71'u8, 79'u8, 66'u8, 117'u8, 228'u8, 173'u8, 189'u8, 115'u8, 41'u8, 153'u8, 226'u8, 130'u8, 21'u8, 108'u8, 194'u8, 206'u8, 218'u8, 141'u8]), - base_fee_per_gas: UInt256.fromHex("0x436767990abff9288346859c6b85b8a972421619eab2253483385c8151cb2016"), - block_hash: Eth2Digest.fromHex("0xca4f05c33836d82aee8230ef660016b993bca4aaf9a7b6cad96c2a0193eb026c"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[156'u8, 143'u8, 203'u8, 250'u8, 238'u8, 137'u8, 34'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[64'u8, 44'u8, 165'u8, 9'u8, 1'u8, 211'u8, 27'u8, 108'u8, 166'u8, 61'u8, 119'u8, 11'u8, 222'u8, 85'u8, 48'u8, 185'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[165'u8, 95'u8, 221'u8, 213'u8, 229'u8, 134'u8, 185'u8, 221'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 373208'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1ef66a8127bdbf1302c13af1b2a3fde17f1e421e"), amount: 12972917955689502470'u64.Gwei), - capella.Withdrawal(index: 7007268656739027478'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xca30e17b5a7925b1a5afa06710d6cffb4681d2fb"), amount: 13141021224557402822'u64.Gwei), - capella.Withdrawal(index: 10730268187610256048'u64, validator_index: 7483561449283560970'u64, address: ExecutionAddress.fromHex("0x84e755db228c9399912364a239227c467477e076"), amount: 16091384671148001130'u64.Gwei), - capella.Withdrawal(index: 861292'u64, validator_index: 101133'u64, address: ExecutionAddress.fromHex("0x70e7126e6288dd8559b6bf8946b98fe02bc53e8f"), amount: 5439105246644982514'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x5e7b12465e0461e5dfa59a3254282378c55961b0e411023ce89d968bbdc33e9c"), - fee_recipient: ExecutionAddress.fromHex("0xbd1a1396ab49631cc933770944996b294da97d43"), - state_root: Eth2Digest.fromHex("0x74e6ccfb15da8afb94eebf28cb3ba3f9ce63e3354097f2f2527fe1cf978e76bf"), - receipts_root: Eth2Digest.fromHex("0x8e48bee56e149d1851cff0740ceab06767bd0e819261c5a2f75dbea382a110b6"), - logs_bloom: BloomLogs.fromHex("0x7894fbe58c624a153dbb160c516c9e82bd0cacf5f347f984efcca9450e9a20b50e058ed38e41c331df61114086f8a6b8a049467d7dafd812953aa593b2e9fbc056f0dba80973b2eaae8814b5e0804300eeea15613e59c8d34339f58e1b45599361497a3608c05140cf432e7983a30985aa0faf45dff56dce99eaa5ad3418722df17eaaa4e8df25ed1d9eedee1390e6440c4c37675182dcc07ff199d6dd015d3aa03194765e85fc0d4759d3c693fc2550e50835b88ba41d10fc33b58550d813abaa75bab39c0fbe419f1bde8fb82db9fcfb79894faeed84b2314f115a8fb9e276315ccbfb8e9650571add358f594ff2fb4ab9661afde76081bb2cfbfd2f26d212"), - prev_randao: Eth2Digest.fromHex("0xb9a9bce05e42cf3d2ffc2c2ea95164c9b215fc8e440dd2985ca24cff40e32780"), - block_number: 14460352585391846826'u64, - gas_limit: 2426408612341958329'u64, - gas_used: 13656152006197676019'u64, - timestamp: 6263571560389404595'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[177'u8, 36'u8, 79'u8, 26'u8, 164'u8, 59'u8, 182'u8, 88'u8, 223'u8, 22'u8, 79'u8, 197'u8, 109'u8, 53'u8, 53'u8, 134'u8, 244'u8, 84'u8, 146'u8, 158'u8, 234'u8, 252'u8, 188'u8, 175'u8, 69'u8, 51'u8, 118'u8, 101'u8, 242'u8, 0'u8, 51'u8, 103'u8]), - base_fee_per_gas: UInt256.fromHex("0x997e6c8ffbd1ea95e875612109843c6cdfd0c6bcaffa1e06ba303b3012b3c371"), - block_hash: Eth2Digest.fromHex("0x9a7f83cf6a64e153fc3316244fabd972a49ebf5dfb173d7e611bf3447a175c41"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 103'u8, 164'u8, 112'u8, 136'u8, 91'u8, 170'u8, 241'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 12452742873210027116'u64, validator_index: 163643'u64, address: ExecutionAddress.fromHex("0x5d09dd69d2b2370e11b21d758bc82c2a73ee00d0"), amount: 12246034467900494037'u64.Gwei), - capella.Withdrawal(index: 256915780184525584'u64, validator_index: 364410'u64, address: ExecutionAddress.fromHex("0x40a55ad4a156caf112e2abe789554520814e48a1"), amount: 297315'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xa8f90a617f1f230506d200c6026bd60e38f599930ed04f90cdc320a6d45bb022"), - fee_recipient: ExecutionAddress.fromHex("0x3531157eaf2c185bd8720f3edfaf76829632f07d"), - state_root: Eth2Digest.fromHex("0xa16f8936e945ecd45a4ae107e46acd8530e438fa1bc8eb85aef62afaca1656da"), - receipts_root: Eth2Digest.fromHex("0x3e76522c8f3b7e8d8a63f4968ab15413b8bbd7af9782c4878b52213b0b3d13f8"), - logs_bloom: BloomLogs.fromHex("0xc13b59de763feaa39debf70d280364ec68eb578af8a90aba7e2cf3a6cee413a28836c674662a0283df8ff04964eb928de97a3883226950b584d773c9b4479d6d5bda6fd71951c0c846752ed688e13dccff947b7a6c81bfac198b6bf785bca7be28bcf9a208b983afe6e766b0536311c1c12b4d01c712cdaa167ecec5520395068b1c1f939d20962de1aba36454cdb36031fa0ba886a8ece71234654e8b081562452046a388ebcf3cfd975493833ff4e146d5e5ddb061d994461ab8b468cf1d6d491d78fd8923f9f6563e3fbfa72639de993701ff6214fd83cd3597e870dec1c1e788a4f01f881c48e57b07c5a217132658208d2221a86c7e9823159984d235b5"), - prev_randao: Eth2Digest.fromHex("0xbac4a9aa16b289584d13abe3c47a58dda713c4b479ee70e1ac7b3b698e8505af"), - block_number: 4839752353493107669'u64, - gas_limit: 4713453319947764960'u64, - gas_used: 3470256075652600568'u64, - timestamp: 13764471837770950237'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[60'u8, 109'u8, 153'u8, 55'u8, 17'u8, 196'u8, 17'u8, 96'u8, 202'u8, 173'u8, 16'u8, 189'u8, 165'u8, 107'u8, 68'u8, 230'u8, 238'u8, 62'u8, 199'u8, 211'u8, 244'u8, 83'u8, 88'u8]), - base_fee_per_gas: UInt256.fromHex("0x3adad83f48e34c6220dce41ecc0b09f9bb1ae4bda4466935c70e7c6cd54e185e"), - block_hash: Eth2Digest.fromHex("0x9183524f908425608c1e3a80d7c4ac2c539903af4b3a2f1b22c3283281706aba"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 645596'u64, validator_index: 248698'u64, address: ExecutionAddress.fromHex("0x124e32ea8d0363647a58a5511b6de35bdd50236e"), amount: 18446744073709551615'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xc914f63464f3f1588a32d3751900d415bbf1fe002c42068650f5c7c588b1935c"), - fee_recipient: ExecutionAddress.fromHex("0x61523b6add59cc65d3c5b75c6f749fa601e157de"), - state_root: Eth2Digest.fromHex("0xe84ecb995f6c7e753355c8d2e24694441c528b65ef9b1d8c6f4e9d98d409342b"), - receipts_root: Eth2Digest.fromHex("0x887bdafa340c24acb58f36a7e3825ce39fb7e0caaba3a9b63f78d2186cc6994a"), - logs_bloom: BloomLogs.fromHex("0x1fbd358ad7e32eefe4489b6c72bafcf6dbac109970e5c103e329279cede3619faf1309faf266ba155496c19565b31562f31539c98b6256919d8950bb6eca937401d91fa5b3032b4400ce6dd60a8c1c6cc94331b7e78d7a350ebb5d6e04a2594af981f167a89227c7c902dbb8eac3d7b54177d85214a6ef57b50da82b6420cf914fd63171f0b7dff9233bfaa2069774b142a136c5183ed4f57cde2590735b19ef549ff5bc910477b98344e7557ffc440b03d56842f356a6e223fd052c6272e24f43dc9e64055c097d81b56ecfd6087238602a743e09c383ad4eae6ef449570febdfebfefa347f06f480f319ff06365bbfae16b62a950143f9acc3663510356f0c"), - prev_randao: Eth2Digest.fromHex("0xc755584f86084ab2e62bd58f25dfe54538c0171e6447e7e1a51cf05db94377da"), - block_number: 9276126375553452674'u64, - gas_limit: 9007257403963034102'u64, - gas_used: 12806310385580231715'u64, - timestamp: 9957937708118639445'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xe2df33500d1162994934e9fa65fd5db641b0be2b61a6c302c7b9019f86042338"), - block_hash: Eth2Digest.fromHex("0xce58ef51926a6eb4cf2997c4ec771b54907737ae8fe9522fc316c97a1c7ee6d7"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 16986670237072862757'u64, validator_index: 701065'u64, address: ExecutionAddress.fromHex("0x50371592a27339f868b9ef63f6c02e8c1e72ce94"), amount: 3561319411833205205'u64.Gwei), - capella.Withdrawal(index: 2402770018709110103'u64, validator_index: 798632'u64, address: ExecutionAddress.fromHex("0x9d42c6c10cbc0b04e3f2e74f63c777802d4ca064"), amount: 898967'u64.Gwei), - capella.Withdrawal(index: 944680'u64, validator_index: 507423'u64, address: ExecutionAddress.fromHex("0x640d578aeed6b8a9acc83f13343f3139fe8f4a15"), amount: 941781'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x086322b79160568c7d096747ef351338ddc93f252dab1df3ef65aaf24723d2c3"), - fee_recipient: ExecutionAddress.fromHex("0x03c6998b5a3ff1c98538c2333d279f2b1cc59f7f"), - state_root: Eth2Digest.fromHex("0x446d99a7e9fd2c327fbd445dbfb3b3e3a895cdfa6f208496dd09c0f84f7ac0fd"), - receipts_root: Eth2Digest.fromHex("0xf4c74d5c59c46f1d9f916b32d8a12939cc2a379bae83153137de76415f6e5afe"), - logs_bloom: BloomLogs.fromHex("0x40f87c3729ba599c3e9bb749c48148ee0d5563db71cf0daaad3af95c45622d7b2a64204157a92a93cf0ffbe0052fb79eef83ba8389fe9d9e7646874b0636960e4eee86eeca00ba70f65b2046620264b795852def9beebb671f841e19ce07934b7c2f66301cc3c7dfa2606067cdeb04a564b87e56ff3650c7c6bbbc96b2de5ccf8e314ae74a26347371c315062532a1f1a2fe0c417ed5d12b6f81c3440c0d8b19d0cf8a030be83ee7ada6046d75098b6ee66664ead786a65ef5cdcb33c4634aa07cd7490abc0ea9ce722423a0cba1aecb379552e89483de43dd321cdaa8a005ab7e8e2a958038ca12e2b08709348a7f6daf34c488add1a0a21aed0da0b64251f9"), - prev_randao: Eth2Digest.fromHex("0x2ff08bd0b22bae8c3627f61b8da627fc367b3a60f93dbe48de1ca6f25ada489b"), - block_number: 10605470807350562909'u64, - gas_limit: 587854351728657338'u64, - gas_used: 8799032544585725320'u64, - timestamp: 18028498231539883963'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xfbe348f0c77be2ddbd3ec038e3aad88107625dc6e96b1fb3bbfdba8c737a3d7e"), - block_hash: Eth2Digest.fromHex("0xc545e833aa2ee5d708e041f4dcb44bda654372b3f5f660c683d12230303da729"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[89'u8, 59'u8, 131'u8, 146'u8, 186'u8, 180'u8, 208'u8, 76'u8, 69'u8, 40'u8, 29'u8, 211'u8, 97'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[208'u8, 136'u8, 157'u8, 0'u8, 120'u8, 231'u8, 99'u8, 33'u8, 31'u8, 210'u8, 80'u8, 203'u8, 24'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 225873861246030158'u64, validator_index: 3132710425326779052'u64, address: ExecutionAddress.fromHex("0x4d2573288e7949201c806877449e441801ba62c5"), amount: 9096383177302198854'u64.Gwei), - capella.Withdrawal(index: 2816791477401799195'u64, validator_index: 12199871733060832130'u64, address: ExecutionAddress.fromHex("0xd4e21e668d5e8b1c097cb250dc862bfd7f8a2b76"), amount: 7278220627858832735'u64.Gwei), - capella.Withdrawal(index: 12003547154719720523'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xe888b3288bfaf8f979c93699cbabef6c1f156f19"), amount: 18446744073709551615'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xcfba7f4aa4ff01d3d9de84dbe1761c79627a10c3188fb0a7c8adfa0d489e6441"), - fee_recipient: ExecutionAddress.fromHex("0x106b3bcaae4ff58dd837768be35c29c48571e4a4"), - state_root: Eth2Digest.fromHex("0xe6242399020361e70cb6b89701001fa8326251e6bae3b4ca1978eded8831d9a7"), - receipts_root: Eth2Digest.fromHex("0x3db0f9a05cc39be94414c3be28378d2b91ba3ff43ea2ea7e4e0a1874a0983f58"), - logs_bloom: BloomLogs.fromHex("0xd591169a3cc38e0837a76c4d7057f94c1ef08ad5af1778b1b06c3a0ec85201bfc659b18c49de831ce6b4a40f0d2800a9cc9001f74810c58473f9b973b720f84626cc9270b0428439b985043f5d9c3289ef8a794f5b8265e10e9fb9fa53a93887d270b8204f8f16cd968e295b0a06aa70e9f6f174733d251f3bfc644a7fb274b0138729f18c0e4382bd4bf0387870f633ed897a125ca854120c2885194f3180af4b62760db96da51f88ae1cd222f49b00fbbc1544eb0e98cea67e36368816f541723158d3691f3cf1509c65a51a8e68efb66c500dd6516ca1b02aeb4e0c13cf5bbead53672fb5a7a1863c8edfaf4eb9a4b4322a39d8643528bccf22493914fa01"), - prev_randao: Eth2Digest.fromHex("0x14fec0a1edb9c82dc9aa7fb7224791c51a3937e74e5da59646123867496460f2"), - block_number: 6272046003849350913'u64, - gas_limit: 15423951135645467684'u64, - gas_used: 3743939155619454195'u64, - timestamp: 8496536260448579184'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[152'u8]), - base_fee_per_gas: UInt256.fromHex("0xd8b104041bdc4c76a9735e2b4b45f0f3612e8962f672aaf511f06a94b48562c8"), - block_hash: Eth2Digest.fromHex("0x8ca67fec04b7e3bc5a01f5bb265b93b4488b58ec2ac7f2c3ced030311de2762e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[152'u8, 232'u8, 136'u8, 228'u8, 253'u8, 248'u8, 85'u8, 92'u8, 103'u8, 38'u8, 106'u8, 166'u8, 148'u8, 8'u8, 37'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[58'u8, 215'u8, 97'u8, 99'u8, 152'u8, 126'u8, 14'u8, 252'u8, 64'u8, 87'u8, 242'u8, 60'u8, 210'u8, 217'u8, 75'u8, 189'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 18405055677765556765'u64, validator_index: 13513833286292305941'u64, address: ExecutionAddress.fromHex("0xfe53af2bf3560b2157a683a545d4f898354f4d55"), amount: 911502'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x063bc56b731eeeff8bf1c33d88523a04a14fa0c745eb3c750139842d88244982"), - fee_recipient: ExecutionAddress.fromHex("0x415b1cd5b42709a3724ab2f6f50a6dab7399d7ca"), - state_root: Eth2Digest.fromHex("0xf261abf37066b8dc5c868946346c98aae445adbb48e6dd05969fbb49267a276e"), - receipts_root: Eth2Digest.fromHex("0x5a337b7ee29d98e22b461f43b7a87e52d89fda2e7a3487ea92873be04a49ea68"), - logs_bloom: BloomLogs.fromHex("0x01817fd642526acdd8b57b4fc2fb58aba269095ce220ae5770004055f550918778021eae3abeffff1b3fa9fba50ff8d532fd8e2e67da7bdcca1cf9505179f19f595f5d9f09b98d5bc7d1ecb22527255e8e161ca2124c5fedbb59527f91a242671177e33a6fa377d585ebdbd6d9ff2bf80bec3695657441e35da43861f14b9a7e65ed475c323ece62d84aed7262cf3fd2b06ba03695e2e26e5e58fc5b8b99d519fda879587e3764930e3921aa15b2ee8691ea0e738030acb8832ca353d3bb63fbc0150c532b842cd053abeae8238c9ffe6f4b2b7210dc862c48843ae2a9088ecdb8c258592a0feb5215b8c9ad494ad896379d86e0ac89e6cd8765003ac5c95cce"), - prev_randao: Eth2Digest.fromHex("0xb28f434f3f40e40693b0c1726a018e2b3bc13c41608a2ca71aa5c8bf61829287"), - block_number: 14597257287993827247'u64, - gas_limit: 9090926713872599867'u64, - gas_used: 17391976671717618186'u64, - timestamp: 13439825139187707720'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[73'u8, 163'u8, 138'u8, 201'u8, 62'u8, 1'u8, 37'u8, 90'u8, 157'u8]), - base_fee_per_gas: UInt256.fromHex("0x8a42339ef76757729ef6c4536b3b59255b18d7085d8ba786275b2076fc55b3c6"), - block_hash: Eth2Digest.fromHex("0xb3f6ec11b285a105833f5b68b67e8e23c85c28df2362a13a76db705f110fce8c"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5477557954669138518'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b840b26a19377c64b870be600aa336a40ae46ed"), amount: 42381'u64.Gwei), - capella.Withdrawal(index: 0'u64, validator_index: 1'u64, address: ExecutionAddress.fromHex("0x3d22a723824a2944ea9accc8653002bf7d61a10a"), amount: 2799163561369818755'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xb31c41d39ef7e9a9b905cc93d82264415024d7daef48d886f1b3bc0fd6545edb"), - fee_recipient: ExecutionAddress.fromHex("0x5ad4b6c0d6b986e775f3a9ae2be73a330ba9f87c"), - state_root: Eth2Digest.fromHex("0x01dbc857a3d8994cf10cd1be3b2018be0e26ba54a5456e10a6e5729328a0b5f5"), - receipts_root: Eth2Digest.fromHex("0xa51e9cb9893bd7d73a8fd4e5267d80ddcb29d998814cfa9980dbae50ef101aff"), - logs_bloom: BloomLogs.fromHex("0xf1280db0ef6bb796e70dfef3b0bafa62690ef1e8f14a237856bae5dbe29dfd43ac789c53305ab5b0b7cc48ed53d1236ab9433a5352dac55b6e0a3ff90e9e815e2ce16fe5574c87f0066090c39b811996e2974da0bdb8bb59eb044bbb6bc2d7f8241093c7143a7c9892be85ea4284258ea2477f6a677d424efb6469724d641bbdc3f9254529b6af5cc5f5a77dad49c1a59ae37c19ffc69f6e331139b6ebac306ea09460dc0fc5791ef2cfb9e7bf29d662872e30b94384be90416df03bef5cf5a2339af4745f2f620fd1320d3fb79848692719cb8956b8efd427c9c0cc3ea6efb8f84feae0075ed10ec5c6243074e6004849712d8d1dd97ebb2948fcdf1d020c6e"), - prev_randao: Eth2Digest.fromHex("0xc8a27f0b7850de04e3d794b9e9d4f144c356f864401c3f802927faf4b88b47ac"), - block_number: 10821099926525463598'u64, - gas_limit: 7115919978619568727'u64, - gas_used: 1, - timestamp: 5900615379943209755'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[56'u8, 176'u8, 67'u8, 30'u8, 11'u8, 27'u8, 136'u8, 121'u8, 86'u8, 17'u8, 4'u8, 121'u8, 11'u8, 222'u8, 158'u8, 78'u8, 56'u8, 66'u8, 243'u8]), - base_fee_per_gas: UInt256.fromHex("0xfbaacdba879288838ff725df19b7a31148ec5a24e7989441544d6dec1c980034"), - block_hash: Eth2Digest.fromHex("0x04616c0808df7a1bc177bc48cb6ed865125fbbac2fa3e3c36f33a5f1c48a23fd"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 143666'u64, validator_index: 849676'u64, address: ExecutionAddress.fromHex("0xbf06178f996afec7c9d3cb488e812f32aafe4242"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 560588584813483246'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1a1b89bf52af0d4a8eff759986ffd93cf4464114"), amount: 13046900622089392610'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xf6cba3ced37c08da230babbf9d1e360661e5a21ac235fefa75cbe756f15809de"), - fee_recipient: ExecutionAddress.fromHex("0x0c080349793b7f43fb3ee9101889e7d32e02c01d"), - state_root: Eth2Digest.fromHex("0x6a33580fc482e9783d66bee9276f42b74a2cbc2b7434fc408a6ba9df77db0ceb"), - receipts_root: Eth2Digest.fromHex("0xd896daff74ffd6ffcc088adba01aea52af82d861b7ff649265a750e5995dcf31"), - logs_bloom: BloomLogs.fromHex("0xec00c3385b735b6a4088ed066bdb088e7826a2830fd13a1a1525c4590eb08baeba81bb511bbf2db2c0547c69c10b5c6c1bf5c8e5a7931584e6ed8ed7357431e1e2391fc0e61a060baf8984a6fd5c04c68fe0f28f94281d0db663b1b2fdaad9b51d3a12bb9fba255c923dea5ce45dd68ec2c5afc9fd13a0e24d234a3c8c5f255e7d62d48a8e01fb5c1eaf0c7a68a616ac935416fe3332943d78eb28a48a180e2bee26e85d786583ae0609a8b98e1045738f054aa12bef97593cd16d8d795314bfff33c51b397afa2299a4a64244817e5a07cdcd75eb4c4c06e8e943d8d1db8e65f17368ab6175c3e14daad0b99fd0f1050feebadf9db8fe8f1c19ed867f4df676"), - prev_randao: Eth2Digest.fromHex("0xdcd37bc148c25afa7e320009ce19567108745ef5ed57781f55df1d73b707e26e"), - block_number: 13754339262807377549'u64, - gas_limit: 5250261236890759949'u64, - gas_used: 1335844244115849195'u64, - timestamp: 16758901654456753273'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[28'u8, 8'u8, 171'u8, 122'u8, 126'u8, 38'u8, 142'u8, 246'u8, 162'u8, 197'u8, 241'u8, 216'u8, 158'u8, 184'u8, 73'u8, 191'u8, 208'u8, 5'u8, 79'u8, 231'u8, 254'u8, 55'u8, 126'u8, 97'u8, 184'u8, 78'u8, 36'u8, 80'u8, 160'u8, 124'u8, 188'u8, 176'u8]), - base_fee_per_gas: UInt256.fromHex("0x0ea1185e0ac50d1e2cc0be7229c846528380def25f7d8860cf366e6edd793be0"), - block_hash: Eth2Digest.fromHex("0xb471874aa6e8987deee40902d59537fed8af3e9b6ae2f8b476ddb051629b3b09"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 215'u8, 225'u8, 83'u8, 163'u8, 187'u8, 111'u8, 141'u8, 246'u8, 57'u8, 238'u8, 163'u8, 25'u8, 91'u8, 114'u8, 111'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[93'u8, 42'u8, 101'u8, 80'u8, 160'u8, 252'u8, 158'u8, 121'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[164'u8, 98'u8, 105'u8, 179'u8, 25'u8, 33'u8, 130'u8, 239'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5378768050415100863'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0x3d84c03e4c18979ee8288bd58b24989580f0a590"), amount: 815393520574223128'u64.Gwei), - capella.Withdrawal(index: 17328504288784263137'u64, validator_index: 305278'u64, address: ExecutionAddress.fromHex("0xa00491dfbee05f23fc7ddcfcb1b27b2855334e81"), amount: 7734460020873819187'u64.Gwei), - capella.Withdrawal(index: 0'u64, validator_index: 444647'u64, address: ExecutionAddress.fromHex("0x0689ed39160f4b4c20138f300b3b2502e6d6ab5a"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 834083'u64, validator_index: 10715076713456342424'u64, address: ExecutionAddress.fromHex("0x07ee24f650e7254d10d61b832db7174128bf22b4"), amount: 17794546242151296198'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x62ce6a6d68578309c4730f96f98a809d4b4225fc3d37a285daf26288b10f9590"), - fee_recipient: ExecutionAddress.fromHex("0x8c892b06f1e9c877c310b6eccefb20fcf5e00227"), - state_root: Eth2Digest.fromHex("0x578f93b83206e3239c69f51cc8e59cd89087260cda9f0efc892aa2ffb2bf386e"), - receipts_root: Eth2Digest.fromHex("0xa4ac657af8e0dad66ec74f4f66b246fe0089485e2810071fa556c09ea585059f"), - logs_bloom: BloomLogs.fromHex("0x18d67e640f9ad3a24deb7e3f8cbe0ba8224cf9cb9e67b2fd6c774fac7aa3f4adca2befe8322962cf000cb89c3e352433cf1aade51ceac9fe69966a8a89f7985030a301eb690e7eb20b5ac3b315930ee5397b6d65b03a1131b94e7f3505ef030877e460e9195b742e943716d9875a3e2e9998236d3565d622216af1721b658a12fe7d82a62619b4f2d042f146305ff1ad1bf394437340735eac9e962b3fe67597793d1151ec87fcb5f0056837c5813c75c4a0f94d91da71299b3780f250ee31eb9f106e3c443f0ba05213da05177238909fd9e60de9484e091b91dead82debc020929d1f14e79b610af3d15bf9c3757e62bb32a69523c1bd576e5c5d4bc2ef0a6"), - prev_randao: Eth2Digest.fromHex("0x552627eb969604e7d4ed1e631b74b2410dea7f4dbd49511bda390e3b9da8bf60"), - block_number: 7763671958353664038'u64, - gas_limit: 3930616259240751958'u64, - gas_used: 7960068863134244743'u64, - timestamp: 18446744073709551615'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[227'u8, 111'u8, 127'u8, 243'u8, 191'u8, 237'u8, 88'u8, 146'u8, 146'u8, 236'u8, 162'u8, 237'u8, 164'u8, 177'u8, 249'u8, 52'u8, 1'u8, 26'u8, 187'u8, 208'u8, 244'u8, 234'u8, 113'u8, 199'u8, 30'u8, 209'u8, 197'u8, 63'u8, 126'u8, 104'u8, 143'u8, 30'u8]), - base_fee_per_gas: UInt256.fromHex("0x6bcd9684e1bc8f4fc5d089e0bf5fed35a8bf3039808d030bb9eb1ff7147180b5"), - block_hash: Eth2Digest.fromHex("0x9e2505de9f245873565b553e7215abff698bdfcee1dbd93e40eb295dd84e7f45"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[140'u8, 134'u8, 173'u8, 70'u8, 168'u8, 181'u8, 221'u8, 210'u8, 25'u8, 142'u8, 168'u8, 139'u8, 77'u8, 134'u8, 203'u8, 219'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 0'u64, validator_index: 780337'u64, address: ExecutionAddress.fromHex("0xf0ab5949e96d8befa8090fe5612d9c45beea0c8f"), amount: 2246589958612652012'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x4f8251c361a23171de8648d1e96c91fea2cc5a691dcd884e3a957dc8f6a8802a"), - fee_recipient: ExecutionAddress.fromHex("0x7da9175abaf6e4e400e0ee516fd3ab07dd659f2a"), - state_root: Eth2Digest.fromHex("0x1bd3a5da4c266dd396b8209288e68be066176ebe64cd4c17c4c6cdccaf03577e"), - receipts_root: Eth2Digest.fromHex("0x16133c4fe31f0487e700514160acf9257458a6ee716be8043cb6c532f84ef614"), - logs_bloom: BloomLogs.fromHex("0x5ca3807e674d69536b33337d798deaeb9fa6c7cbab7aef1473e6a6614f6f2c74ef85ee3632612b9c1e78d2a63e0b2f58d48d71e8d62e38510bc2f307680497cb965153b43392b8aa2dcd91a766356eab3ff1b4a6c4b037d61df1a8a4c6d3fa0e3c57a299a1c0a7382052ac25c412f2d2356c302e326fa0cfb570354e31e2f8046b80e2690ba69ec7c284c2df8ad23d16764cbc0ba28516f3c31aa89da3e3286106dcecc835b3007a17f33c4962efc3c9b0f5bff14c783e414ba60d35b79ab33ccd0151c34a94efc461d0df0a994085373f33275a4cd6839603632409b670072a4554f1c9342c03cd403a6feb67b23d3a075707ca89b77bad64e24a6ab79446ad"), - prev_randao: Eth2Digest.fromHex("0x6353ec5b94b9112f25e66de48b532ff5610c63f34c50a02fdf64af6c9d0ef2f4"), - block_number: 16866969889068542818'u64, - gas_limit: 5116920640663397560'u64, - gas_used: 13292402101416991817'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[136'u8, 133'u8, 189'u8, 60'u8, 229'u8, 217'u8, 70'u8, 145'u8, 136'u8, 97'u8, 175'u8, 23'u8, 183'u8, 73'u8]), - base_fee_per_gas: UInt256.fromHex("0xe1307a28a2868b4d934aefdde7bbd09b0644b5c422d2c680770775cb44623512"), - block_hash: Eth2Digest.fromHex("0x11e23850b143b8b4dd8394ee1f2cebf073068502d04dde00000925cf23ff55cc"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x0c67b44b492590ffb9e6d2a63c84714821be7526ce1c337c06276e33a62b7b93"), - fee_recipient: ExecutionAddress.fromHex("0x1d16dbe66ead2ba8afb8594acaf8d536be08dac3"), - state_root: Eth2Digest.fromHex("0xeeb40e334aff8512435b5908a8dd3c06993cadca8bc44e9a6c28c6003162c6a9"), - receipts_root: Eth2Digest.fromHex("0xefa5b7de19da2333bfb7bfa814a306f904fef2ff4f8b1154314649a56fea3c8d"), - logs_bloom: BloomLogs.fromHex("0x4ebbaff6a56343a6bc0170aca2e2ba303f3e3f972c88539ef84e402740e3c9e21c6951d461baf56eec14c06ca0e95f4921079d0d82e9dd46e73f3fa76417246217ff9c5425f19b0f8b2a735ee522c1bc377a2b079099430d0f9316164f5930456245534bbe138d0a19ee58bb13a0d724723a6fa50e39b8a7ad5804f92ab43c24782e27dbb32789408cdd716af9a0b0cb1e2f3aee0bcb5aa4088c0cf1528fad466f3d71d906649becf25f405f619dead731e0831efb522b5faee7a39ca28128effc79977816d50ae23745ab96b80dc7f548aa5d43b0d5c331fdc1ce080a4d63e19942ecb4df8f56397b2ef67d017f2d2de9296e1fd8036ed8592f5a89553c4642"), - prev_randao: Eth2Digest.fromHex("0x5d3c3ac25330e1cd3a516003315ed24bd2dc6cd31d389639cce4b6ae4a3ac8cf"), - block_number: 10891095348111649307'u64, - gas_limit: 13670668340379820434'u64, - gas_used: 1482104080767186829'u64, - timestamp: 6602476120092784163'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[223'u8, 228'u8, 253'u8, 3'u8, 38'u8, 218'u8, 253'u8, 87'u8, 206'u8, 243'u8, 168'u8, 113'u8]), - base_fee_per_gas: UInt256.fromHex("0x972a01f27d586035ce5fb233118e52652ebbf89f6d39558a41b27c8840c849b1"), - block_hash: Eth2Digest.fromHex("0x9280fa96a569e7c25b2dfc12a141d3edd24acf2fbfa19ee72e5a1fd5dba25a11"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[116'u8, 179'u8, 195'u8, 80'u8, 193'u8, 73'u8, 187'u8, 64'u8, 41'u8, 251'u8, 55'u8, 90'u8, 161'u8, 30'u8, 221'u8, 210'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 820354'u64, validator_index: 626992'u64, address: ExecutionAddress.fromHex("0x4abb3f9a694bf6b27be97e24290ca6826b23c5d0"), amount: 100271'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x7a9d6ab34c0314959d5bdceb0bd80f142e59e5e2addedcd178612303897e7a8a"), - fee_recipient: ExecutionAddress.fromHex("0x3425bc529b4791f5fdb7dd365501199b2f81e578"), - state_root: Eth2Digest.fromHex("0x4eb1a9a3c4b9392325a14f3f8efbc0b3cc3bfc2d7e9992377abd84af6c556db5"), - receipts_root: Eth2Digest.fromHex("0x094e9114d3487925f6818140978e4db64d8306083a8e5c987657e21c3a1995bd"), - logs_bloom: BloomLogs.fromHex("0x0815701b4689d0bb7f80fb1485ad3255a66b890725a1d2d66b4fc66678e2d08784c21ef583401493d5dda1549eda32303b7d102edc72b9fe1d696ab459294a88db0d7263abdf982ddf59ce008b8ac734565de79c269dfc18a36709ca91a3cd50516725e9fa9d98302fa0322254382aab0cdf1f95f2397579f7219bd7ab096ef1f00d7b1131b0055bff65ae9954cb22959adbc40983840ae3b85358fd205bdf6ac6bcf723047ffc53a094a06c2039935b6ef579efc618bf4127a6e4e531f6d97c17789be639691ef87fa5540cf732a184a0e09d5c60866ecd0be0a04bc94317712c395d84c2cec90f43f4807048bf1a93e3e6520a1a7c59092e2e391abf9d2e68"), - prev_randao: Eth2Digest.fromHex("0x349eec90244f3d812002732cd833952969b27a463def04291051137344c89c41"), - block_number: 5715688900321967041'u64, - gas_limit: 17172684770312311722'u64, - gas_used: 9286597649062725614'u64, - timestamp: 195835912833125491'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[34'u8, 35'u8, 209'u8, 45'u8, 117'u8]), - base_fee_per_gas: UInt256.fromHex("0x7b5b4e48b3daadecb9724a74d426a86ffb5c5f8abd43469b4e3fe2a728b5a645"), - block_hash: Eth2Digest.fromHex("0xc71c294b5562af30b9e2b03e76cec0cc6d8b50694219404aaed2ace8f756a22e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[178'u8, 142'u8, 115'u8, 217'u8, 56'u8, 74'u8, 150'u8, 16'u8, 244'u8, 148'u8, 19'u8, 33'u8, 89'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[195'u8, 248'u8, 42'u8, 129'u8, 151'u8, 119'u8, 232'u8, 235'u8, 245'u8, 240'u8, 113'u8, 157'u8, 235'u8, 158'u8, 160'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 27'u8, 72'u8, 107'u8, 18'u8, 210'u8, 127'u8, 78'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5186085670428433087'u64, validator_index: 156817'u64, address: ExecutionAddress.fromHex("0xf8d93a548c4b243e66f4f73b29da342a0fab04de"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 9475052657186699106'u64, validator_index: 759532'u64, address: ExecutionAddress.fromHex("0x97559fac3168c6ee81b0f0b0b88563080ca24769"), amount: 4852567582077527137'u64.Gwei), - ]) - ), - (capella.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x806a868f0f31e8f519fa6339ad18c414dba17feb03aaf6ca3775b152bac64f3b"), - fee_recipient: ExecutionAddress.fromHex("0xa2bcc8b793c4a5d4e0f68251d2f22e1ff4366d2c"), - state_root: Eth2Digest.fromHex("0x6979ac9545f31eaf7ed8bd227cd7cbd1017492b892bcc118f7417ea87d50d412"), - receipts_root: Eth2Digest.fromHex("0xca0ac1828fae211c9d0fd7ab763460d89f9da0669d082c68b9fdca3ca1b59123"), - logs_bloom: BloomLogs.fromHex("0x0656423dc7b375cee4f5c3bedc500eaff2da91d0dd5f4e695933c92a2a6af7441200a41177bcae7912839f993a733aa2bb82976f08180a901e63c588a26dc9ccc58f477eccbb08aa932d512bfc765a57527acd04c585af23f48f389420890d06877d8a0f523cb90be10dbc73cb5b11e808f5c6c90c6fc3a9434dab462f2977eacf79146b35ee2372aae8a6fe3628cbe21a8988fd9546b25581b6d998462f9af7f653d3a4702a4a63b9f26cc7d2f72e18a3918fa9b65ed81d23ac0a64dd8f3f878f745fcb4de9ad144ae9565288d7bf90e6d356f49cc242d000e988fe76e0196f0c5b24bdf9dc501222e54f64861e0d45dda2bdf09e5fb290a1ec6dce39b02883"), - prev_randao: Eth2Digest.fromHex("0xc986211f6550cb787e89140d8856531ec309f652e2a871e2715c1dd055448074"), - block_number: 7781035717593646205'u64, - gas_limit: 9088183223170031827'u64, - gas_used: 0, - timestamp: 1844848381084178223'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xaac988479abbe95e03cc214e7b99795c4ec117bfe4da06e4624e94b262b015e2"), - block_hash: Eth2Digest.fromHex("0x14137d373f6e6110b3fe3c1d743a4f84547ad3d59d0b42598b794ff601e97e38"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[10'u8, 28'u8, 79'u8, 238'u8, 85'u8, 206'u8, 161'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[144'u8, 222'u8, 190'u8, 14'u8, 247'u8, 119'u8, 95'u8, 48'u8, 238'u8, 50'u8, 180'u8, 12'u8, 216'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 428032'u64, validator_index: 18218455002493563835'u64, address: ExecutionAddress.fromHex("0x389fe5e57a13de364b852d7e2cebc2add2cb7510"), amount: 726634'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xc6a0db1d09160cec69bda14b444c46745e09c96b"), amount: 742028'u64.Gwei), - capella.Withdrawal(index: 858390'u64, validator_index: 326055'u64, address: ExecutionAddress.fromHex("0x6a861508a89443c763d5daf15dab44a8a45147fc"), amount: 597242'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 17239721441660215355'u64, address: ExecutionAddress.fromHex("0x1450447dc71e28e312c7de7034523cd322eabc98"), amount: 18446744073709551615'u64.Gwei), - ]) - )] - - for executionPayload in executionPayloads: - check: - executionPayload == asConsensusType( - asEngineExecutionPayload(executionPayload)) - - test "Roundtrip engine RPC V3 and deneb ExecutionPayload representations": - # Each Eth2Digest field is chosen randomly. Each uint64 field is random, - # with boosted probabilities for 0, 1, and high(uint64). There can be 0, - # 1, 2, or 3 transactions uniformly. Each transaction is 0, 8, 13, or 16 - # bytes. fee_recipient and logs_bloom, both, are uniformly random. extra - # bytes are random, with 0, 1, and 32 lengths' probabilities increased. - # - # For withdrawals, many possible values are nonsensical (e.g., sufficiently - # high withdrawal indexes or validator indexes), but should be supported in - # this layer regardless, so sample across entire domain. - const executionPayloads = [ - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x760d4d1fced29500a422c401a646ee5bb5d65a07efa1492856a72cff9948a434"), - fee_recipient: ExecutionAddress.fromHex("0x315f583fa44fc6684553d3c88c3d26e9ed7123d8"), - state_root: Eth2Digest.fromHex("0xa6975bac699618cc22c05b1ba8f47cbd162475669474316d7a79ea84bce3c690"), - receipts_root: Eth2Digest.fromHex("0x080d53a0fd22d93f669b06052413851469d63adeb301810d7ce7a51c90c8e8ce"), - logs_bloom: BloomLogs.fromHex("0x453a1f1c4f63bcf0be84e36a9ac233b551601bb2e5ab9450235bd83e41d2013f42c97044ac197a91da96efd6fb18f233bad2e884d76f0a63a6fbf7dbc714cc9aa497fb6d363feeba18447ecf799d5f8d769232553c375b21166c0176859dba63eb77f1a17e482ebac07c3cfd5281277f55f1e5c79cc675d501e1982816d31db7d73c89e855315d8f4e9fef1c9ebb322610235c44632a80341b42f05d207ac4869d08d98a3587a470f598095ebb932788fefacdd70e7749e0bd47ceff88a74ee1f006d9791350484149935d4521d86e644ebc4346154ca0bfa9fbb83120630867d878c12e53a04a879e993b755f02670c9c47f091acf1b3f593782ddaa98f0df4"), - prev_randao: Eth2Digest.fromHex("0xe19503a6fa6acde0b8f5981f29eb2e298ddff63e6243529d735bcfa42680a515"), - block_number: 9937808397572497453'u64, - gas_limit: 15517598874177925531'u64, - gas_used: 3241597546384131838'u64, - timestamp: 17932057306109702405'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[55'u8, 184'u8, 18'u8, 128'u8, 63'u8, 61'u8, 26'u8, 79'u8, 3'u8, 225'u8, 167'u8, 15'u8, 240'u8, 167'u8, 180'u8, 141'u8, 205'u8, 10'u8, 246'u8, 70'u8, 248'u8, 35'u8, 19'u8, 45'u8, 252'u8, 187'u8, 168'u8, 42'u8]), - base_fee_per_gas: UInt256.fromHex("0xaf8acbd8a0f0f8eeced9a1014333cdddbd2090d663a06cd919cf17529e9d7862"), - block_hash: Eth2Digest.fromHex("0x86b46255725b39af70a9e1a3096287d9772ccc635408fe06c34cc8b680977ff5"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 98780'u64, validator_index: 8610867051145053792'u64, address: ExecutionAddress.fromHex("0x0c33e909ef375bd3ab33961b5ea767b4f1c8bce0"), amount: 671269'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 500164'u64, address: ExecutionAddress.fromHex("0x271215240885828779da36212489170f19a8f5bb"), amount: 2071087476832314128'u64.Gwei), - capella.Withdrawal(index: 26148315722507923'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x340bd9f489ec124b8a879673f12969b14d0b5555"), amount: 9486787560616102568'u64.Gwei), - capella.Withdrawal(index: 4839737623914146930'u64, validator_index: 273755626242170824'u64, address: ExecutionAddress.fromHex("0xcacc573cfc0ad561aae27f7be1c38b8dd6fab2cc"), amount: 9475975971913976804'u64.Gwei), - ]), - blob_gas_used: 4401258332680664954'u64, - excess_blob_gas: 12834012644793671460'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x2cb54ddf357864102f4ab6bce57317a75cee972f303449bf7047f4e0e5809127"), - fee_recipient: ExecutionAddress.fromHex("0x92af67d9604b945fd2cbaccd29598e2b47ef5d2d"), - state_root: Eth2Digest.fromHex("0xc64221514816a2f87a29c2c474abf99547820b2a12e6e5956f160dd54579e521"), - receipts_root: Eth2Digest.fromHex("0x76c1ca0e483a557f6884d64bd891c62904c64c2fe69350278345c622cc50b0d7"), - logs_bloom: BloomLogs.fromHex("0x7afdc9a99777d76b713e960e9f12ad4fe46ecb7ea6d5b245c6d9ee11d3fd35e7ae33dd6062fb6578bc2c2f286f1c6a4aa6a44cc80a88a3678c7085c35a0f2e5334ea686e2098fe5d179bbbaf81cbc349a15e7a21aa27f0ddcad342d980d056a356694cdadcef8db3c7866b6cb087c28f2aeed7a5bc9b1294cef0da3ac3b46dbe72d7f164f1990bc32f755b709b96a96bdd8da2c9d9300e9f6906040347d337fc21b833ff0b80305b22ac64a2df2dede4c01c65c192884f161aacd12ba56dab9189477e6ae484a97ff96e0aba1f9b8d043896b8433779abeec091f16b94a013325fe11096d1f2d79b701ab5b46063ac99392a790e617555fe3286dfd7ec0cb9b6"), - prev_randao: Eth2Digest.fromHex("0xc4021ae781a3b3a1dfb1e4464b032a3bae5f5b68366beb555ede1f126920cd5c"), - block_number: 11318858212743222111'u64, - gas_limit: 2312263413099464025'u64, - gas_used: 1, - timestamp: 15461704461982808518'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[254'u8, 188'u8, 92'u8, 24'u8, 153'u8, 206'u8, 74'u8, 108'u8, 96'u8, 100'u8, 148'u8, 84'u8, 151'u8, 74'u8, 73'u8, 167'u8, 65'u8, 177'u8, 253'u8, 62'u8]), - base_fee_per_gas: UInt256.fromHex("0xb1c4b2bffcb38aaa1f98b483441aa212c9dd951d4706dd505a973fd5fd84796f"), - block_hash: Eth2Digest.fromHex("0x8b150d453d802fdbb19be0132621a5e8061e70cfe6668ee6a63e4ff217434999"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[142'u8, 197'u8, 221'u8, 83'u8, 32'u8, 126'u8, 145'u8, 86'u8, 28'u8, 39'u8, 112'u8, 240'u8, 168'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[175'u8, 191'u8, 143'u8, 78'u8, 162'u8, 249'u8, 87'u8, 193'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 168'u8, 190'u8, 157'u8, 39'u8, 143'u8, 147'u8, 156'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 11497754023538902580'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xb0b680a6d93e520fa32e399ded64871d99c1f2c6"), amount: 15592017597077727306'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 14269483352942387358'u64, address: ExecutionAddress.fromHex("0x97e4451d09c9af077dc9081e5081563aa26e4c51"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 9664968187979079659'u64, validator_index: 750818'u64, address: ExecutionAddress.fromHex("0x1e4bc6f12efe96b9f5ca549b77a3d62c5f5403d8"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 727020'u64, validator_index: 10133766089843653238'u64, address: ExecutionAddress.fromHex("0x6a1ed64277cf1eba8c96281531d2799d1fa7c409"), amount: 130469'u64.Gwei), - ]), - blob_gas_used: 4810756443599845432'u64, - excess_blob_gas: 1435200597189175983'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xac5a7347865f503e1578d1b47271c8e60027b5ba24b0da8e7c3733bcdbeda220"), - fee_recipient: ExecutionAddress.fromHex("0x8b7fa656e67f6af2074ec3f16930ad742a69f189"), - state_root: Eth2Digest.fromHex("0xeb50f351f6945df8983cf4037ee264dcb2ceef3313ae452248571811d8a3a8cf"), - receipts_root: Eth2Digest.fromHex("0x860af6010832f64a5234327b653aabbd3898881a7b72ae42e08d4a1519166fba"), - logs_bloom: BloomLogs.fromHex("0x01a18d51076880a1a8ea86cc5dc5fb904ba0a3c285b7dff34ee5dbad9d64721f3849ad9f50b90ad4524eca6b0564f8a1a5827a7b476ea051c33a7c0e18db4cfb27b36476bbb1eacbc029dbc5009e5cea695045cfb34c868163514b784133f0f2998cf12e2caf9c74f69732ed3716396dc34d86725428aff48bf6b935ae88f5e4820b9a325bc670cf560dcb479723213a3156a9d7d0e7de0dc791d0eb94a691013624b8aa982ca3c9d5b49fcac8fafbb403c9fbceee5373f0fb2b77ff1bae8160fe2a47b01d792b088eb3fe24c53b5c6a8b4a3b59060d587ca7376f8baba58d57cf745b2a346f800a54d08545194e067ae260c73369a016b12d0fbc20abc78ba3"), - prev_randao: Eth2Digest.fromHex("0x330b7093023f617d2cb5f76cee4b078af002b68d81e3a5b5c9d37c4411871a95"), - block_number: 18446744073709551615'u64, - gas_limit: 13979513761871276914'u64, - gas_used: 6199089254852634745'u64, - timestamp: 7404562418233177323'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[220'u8, 149'u8, 177'u8, 36'u8, 228'u8, 88'u8, 47'u8, 149'u8, 211'u8, 213'u8, 170'u8, 40'u8, 207'u8, 145'u8, 137'u8, 64'u8, 153'u8, 22'u8]), - base_fee_per_gas: UInt256.fromHex("0xfc82d0e46d05b21aedab6f368183611d2885b28c52842f28f621ef6c631b6e6a"), - block_hash: Eth2Digest.fromHex("0xa8c6b2dcc2496f0230e796f8a69642126955ae6209a0d0c2dee2c925212f447e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[138'u8, 17'u8, 34'u8, 168'u8, 105'u8, 179'u8, 196'u8, 21'u8, 253'u8, 242'u8, 106'u8, 30'u8, 40'u8, 190'u8, 179'u8, 93'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 1'u64, validator_index: 239183'u64, address: ExecutionAddress.fromHex("0x75efb2a04b5f25ae56ff7256ee9f4fdc4e25baf3"), amount: 402148'u64.Gwei), - ]), - blob_gas_used: 723464856451065691'u64, - excess_blob_gas: 11231138371511965912'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xd3be9b45bfe67229afb47461ca2970505586cab8eb8e00f280ceb07a9d47866f"), - fee_recipient: ExecutionAddress.fromHex("0xde645d4a77f0a386a45c52357948e1d7eac5e780"), - state_root: Eth2Digest.fromHex("0x69b70e0188e7b88e38df90853b2dfd2e4c7181e83d82d77ab81c57d161216b92"), - receipts_root: Eth2Digest.fromHex("0xc01d94a01736268170a16196927029d4d8d7c65970ec78ece94c87304bed4568"), - logs_bloom: BloomLogs.fromHex("0x7f1ac5c77e3f0c8a1a103ee83dd7d0fd6fb13895aa1141de330445474b3216e2646c15c1cbf4ab4feb1e4e21c2e6970f4a6648675508b08111e00b62866b0f6cccd58afea87d2cd0a24c0384fa179dc33ae6d0db8c1b118a75fb442682b7cbecc2808fe8c812c3720ca54f6723a395fff5dd1720f41822c91b080503bbfeef21eea192d5b7c4160344996d017ab849fa97e862206caac8f8bfeba41865514b21a8d8fa9ce3dcc0daf5bf86fd2f07d222fc7a9d11fb4031b2cd72544d7f89eb95203a570bc179f9ba1f73f39d74049fe22b63939ea49d5d40f42c00c5f1bd429e84ade377475e432186acd9975914670052fea64453fca87317f62e29b550e88f"), - prev_randao: Eth2Digest.fromHex("0xce47da2b2a68186b78054be0894ccc9ae7213c18b9093c0ebc1b9ed011071a39"), - block_number: 9014833350824993703'u64, - gas_limit: 18446744073709551615'u64, - gas_used: 7874274181221487360'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[139'u8]), - base_fee_per_gas: UInt256.fromHex("0x1eb821a0ee3f9d2e5b49c64177db9ffc96ec6b06249cefa8c51d0ce7e664a3ae"), - block_hash: Eth2Digest.fromHex("0x99479be6429eac4a945ca8171d3d3ce42d7b5af298292e833e20462438e06229"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[99'u8, 198'u8, 91'u8, 86'u8, 23'u8, 222'u8, 121'u8, 250'u8, 12'u8, 135'u8, 133'u8, 37'u8, 61'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[81'u8, 173'u8, 241'u8, 145'u8, 54'u8, 3'u8, 36'u8, 121'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), - blob_gas_used: 1936360613980595982'u64, - excess_blob_gas: 525438497879148955'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x06504beb0dc3bae44ef75678d29ec5138d87da68d307ca7d43e259cede60fda6"), - fee_recipient: ExecutionAddress.fromHex("0x527ce602a0be18c0944dc27b2864c711a91f89a6"), - state_root: Eth2Digest.fromHex("0xad3bbef5d22bdc2429da09eb85137c881f85fe6e6b3ea207e5eaeb399c755055"), - receipts_root: Eth2Digest.fromHex("0xf94fdc52cde20532cfdee73e9cebb61d9f7160191345f9caf58b45501d8effbc"), - logs_bloom: BloomLogs.fromHex("0x0999cc50752006a2bc8e5485c239b9a41be6ea2fd8f0392884246ef7d33bccdf4bd326fadae385e3ecc309bf0f367ac1791767ffaee90ddfa7bee22d19f417708fded2b2b6b3be2b6007745fb1de940e7849761586953c04e3bec3c9b6342d1b91dd024980f469b484bd0befc4941a3846d027390d6256e4acf9933e0891dd558270eb35d3455f4e49c890479e970a8008b75ff4d33b4f7e5a8c19e75d8abd8673ebb859a8a24907584d88f0d68b3142b3c6952695fdd84581f5a070601a575a8e7bfa0bf7cf0fe9d70a051005f9dc594d09909e9d079d02a4e441e5b3f33388de8d46cbdcdf24f835415680e569f2ed29acdc01042a6a7ee701e4e6cace5c28"), - prev_randao: Eth2Digest.fromHex("0x7cef96d72498facdb399dfb5b6d7d69185f3edc70715540fdc7ef651c4685c6a"), - block_number: 13066898984921201592'u64, - gas_limit: 9241830338892723842'u64, - gas_used: 8347984358275749670'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[11'u8, 46'u8, 127'u8, 104'u8, 141'u8, 79'u8, 55'u8, 48'u8, 242'u8, 12'u8, 142'u8, 2'u8]), - base_fee_per_gas: UInt256.fromHex("0x6241db2a44a58a2c1aac93c4aa18aed5add30d1937c31078542bb544bf9ba2df"), - block_hash: Eth2Digest.fromHex("0xdc1756667e7c3f1615650cbbaae1117a6bac817c6579cf3f7afbc93277eb3ea1"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[13'u8, 24'u8, 248'u8, 26'u8, 141'u8, 177'u8, 236'u8, 2'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[213'u8, 208'u8, 242'u8, 46'u8, 0'u8, 31'u8, 219'u8, 213'u8, 197'u8, 218'u8, 148'u8, 236'u8, 43'u8, 152'u8, 123'u8, 96'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 163'u8, 60'u8, 195'u8, 40'u8, 68'u8, 185'u8, 20'u8, 244'u8, 82'u8, 34'u8, 181'u8, 26'u8, 201'u8, 2'u8, 108'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 15531362396155364476'u64, address: ExecutionAddress.fromHex("0x063b2e1de01c4dad4402641553c7c60ea990ab30"), amount: 106054'u64.Gwei), - ]), - blob_gas_used: 0, - excess_blob_gas: 11830672376638423068'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xb5d4a5eae3a1ea004ed573b0b8f8a22c847616758c0faf1e7e9589f16e55415c"), - fee_recipient: ExecutionAddress.fromHex("0xf7ac0877fd8bcadde1e050f6c7ddad13688ec071"), - state_root: Eth2Digest.fromHex("0x7472f824376a723894f8d539743c7f93b69839772f28cf6a83e2102fde99c3c9"), - receipts_root: Eth2Digest.fromHex("0x750365b5d975460a64f07758abd0cdd44cee23cc2d4f06f2a047cf4c12c23db4"), - logs_bloom: BloomLogs.fromHex("0xe24d8452039bddd10e1252c1ebf9b9e81a22577f940e8708d200548717e8471e130a7066adc48785a8dea1dca05953d6be16504a57112c065e7909586cd611af9e0b840b81caf0532dbb2833ee5ac6a6eb7b6c990cba6ccf6f4ddec5a7c76f8296bd2a693cbbb43b1d86b66f6aa58888734d3fb21cf5e96f1b981f8ae2737bce1cad1cc458650291cf7a3d22c61fde6af3a07a44bf1b334b2c5dabbef16e5e73db75e87f04670cb3830f0a7badc702e7dd37a59ce02992f4473a909e57dee1fdd22cfc886f4fcb6ea205ec9234a8ec85ea134242748f9f10062534fd0528bc1b5b1e89511cdf91a1e7fb4f8c58c93d2a6c75e48a2d48235cb7de13040db8dc9c"), - prev_randao: Eth2Digest.fromHex("0x2410823a37c763e13b03a4c48e32f9e43b8440ca31ecfe8e0543a20a02c496c5"), - block_number: 14920119354157670036'u64, - gas_limit: 17193947846593799248'u64, - gas_used: 2176791850599260430'u64, - timestamp: 12670133468877091192'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[31'u8, 7'u8, 1'u8, 212'u8, 152'u8, 82'u8, 167'u8, 57'u8, 116'u8, 147'u8, 97'u8, 109'u8, 219'u8, 207'u8, 151'u8, 116'u8, 43'u8, 218'u8, 91'u8, 253'u8, 14'u8, 182'u8, 102'u8, 57'u8, 153'u8, 72'u8, 172'u8, 208'u8, 0'u8, 64'u8, 97'u8]), - base_fee_per_gas: UInt256.fromHex("0xf1daaa067663bf3277b9149aab162f4e330f988f0be8f83a556743a57ae5c8fd"), - block_hash: Eth2Digest.fromHex("0x5d462b4b243c6292b6a3b32f4e05849c0613d0a61954734c524f75f8df66cf8d"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5416630176463173042'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xd7b1d18e4eb7b5041b4b08bae2ce8e22982d6e6c"), amount: 911474'u64.Gwei), - ]), - blob_gas_used: 17909098553568904023'u64, - excess_blob_gas: 2561776469828429184'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x2629683cfc70198038837270bde3c60176c2a4aeeced0d4a4f14dc99a380c377"), - fee_recipient: ExecutionAddress.fromHex("0xd234af1937861b66ca84c334824763fb54347677"), - state_root: Eth2Digest.fromHex("0xf79f02d52d7f2a4be99eebba3dfb3bce74136ea739da515703d095a66ce203d5"), - receipts_root: Eth2Digest.fromHex("0xa97ae6fa5d6937f7754ff96766a54bb8ec082b046814e74f6c9c67147795f526"), - logs_bloom: BloomLogs.fromHex("0x5d2ef8bc2f58a84e4050e3a38985e4c267940707c8da3f687fefb9e22e4ae11a2f79a24456af3758e8b521d546dc178da5c85da869ebb2da551976488a769ca2940fa20853e4e1d1fcf8d5bbea0d16973c827d38c97c47c57835677590567829d119e8108f2ee3fa988b267ccfc3e58e5f81c18c775a9baf06d4d81aee405c5683fa4e5e891b58101a27e8f71c60d357a4ab8bd02e12fbbb0e363c4632b0a3c0de638de37448c9476c65a62f7f1dd9643fac6ff78ee431d18ab554b4c8a1984fb5fa0de3464d223f236eb8e8a8f59601221d2ab480ffcefaf4bf6471b40a14773ac0cdb43aea505941e4b0fa6fb26eb091adad77acce41e516fc743e5fdb045f"), - prev_randao: Eth2Digest.fromHex("0xbe44d7c5f844a2acb307a4371784d7742be482aece83368d94813ffa1c7bb60f"), - block_number: 13524449277995212660'u64, - gas_limit: 1, - gas_used: 7976957374052242924'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[57'u8]), - base_fee_per_gas: UInt256.fromHex("0x6c98d9ff36f1032fd55d8a6038d7b1f7c4e5f7c884b73f626fe43e687beeb46d"), - block_hash: Eth2Digest.fromHex("0x2c95101857b07bdda0502741da8cd9160ec0474929d132e9159098576f9a7c35"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[75'u8, 85'u8, 130'u8, 87'u8, 90'u8, 172'u8, 176'u8, 44'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[207'u8, 150'u8, 64'u8, 87'u8, 15'u8, 18'u8, 3'u8, 236'u8, 232'u8, 87'u8, 174'u8, 192'u8, 29'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[23'u8, 37'u8, 57'u8, 158'u8, 137'u8, 222'u8, 53'u8, 111'u8, 63'u8, 13'u8, 69'u8, 110'u8, 175'u8, 108'u8, 16'u8, 207'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 1071093368516669975'u64, validator_index: 15999188653672167093'u64, address: ExecutionAddress.fromHex("0x368b0ae1a6bfc3312460f212017e8bb32aae55bf"), amount: 13132185675616884508'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 1251419977457119333'u64, address: ExecutionAddress.fromHex("0x0a4d18e47c5ec0c639ff29d8f8c9be0b60f00452"), amount: 1'u64.Gwei), - capella.Withdrawal(index: 2046299652899032730'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x44bfe00f98603a5e8363030de4202ba50c7e8138"), amount: 15403504672180847702'u64.Gwei), - ]), - blob_gas_used: 819823383278806839'u64, - excess_blob_gas: 5121347703897393436'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x190544155dd98bf86d3ed5ee94d01afd3a8e67b8476f94d90604706da0a7d340"), - fee_recipient: ExecutionAddress.fromHex("0x799d176d73d5d6d54d66941ad6cef8208677371c"), - state_root: Eth2Digest.fromHex("0x07e626b9c44b0ff14586d17acf79cb136ccc5d37fd7135da33cec516af168f43"), - receipts_root: Eth2Digest.fromHex("0xb8b100bc5c155fe6358b9a16756ec06880365f5fe89124cf9fea963e26d3770f"), - logs_bloom: BloomLogs.fromHex("0xc314d3d6ab41a3fce7433dc286ee5c9820d883ff572ee7dfd2f4ee745f11a71f6dbe142d8c14bd6cc76782f1bb2b3770e65a929b2187581956bad937907a124c92ba10686763ddc87ba5b4a4e9cf4b9a35255fad5f54b404aeed5ad9859b5f9fd3c137e9eb6ef394a10b8ad3fbba75ba38c2cbfb91fa793ac763e8cd31481fbecef02b3365b990f5120a2970f2779574c60769347ae334a9f39bb3d3ad35182f7dcd252bfe9663c4f54b44dea8d79e3bcd89877231e81a9e9f5c1eaf5da1f56ffc39c23fc3ae6c130281c792a31e7a60115d46abbe17807cd120038631ca7a6636c8c644b57719e386cc8ada32ce806f75110ad143522fb0b240213df4bab07e"), - prev_randao: Eth2Digest.fromHex("0x17e445793c0e354ee43381ded194220ebd87ccbacef83e3da5a1cd3c8c57bf49"), - block_number: 5728529601694960312'u64, - gas_limit: 9410734351409376782'u64, - gas_used: 16470261240710401393'u64, - timestamp: 8811957812590656903'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[95'u8, 124'u8, 151'u8, 79'u8, 76'u8, 171'u8, 74'u8, 213'u8, 207'u8, 202'u8, 63'u8, 2'u8, 182'u8, 32'u8, 115'u8, 65'u8, 90'u8, 186'u8, 34'u8, 63'u8, 241'u8, 191'u8, 88'u8, 10'u8, 197'u8, 52'u8, 33'u8, 98'u8, 78'u8, 210'u8]), - base_fee_per_gas: UInt256.fromHex("0x3c1ba8cf82268c828c1a7f249328741ae21f35a7659365efd7496df94dbb85e9"), - block_hash: Eth2Digest.fromHex("0xc2b2bc39ed0cf5764800d3c91401828ed32d0eea58f9d336c32f9e6f7200ac8d"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 802141'u64, validator_index: 7520769587588158114'u64, address: ExecutionAddress.fromHex("0xce1fcedcc47b22d7e38f76c1cba49c2c20da09eb"), amount: 5845756482608800263'u64.Gwei), - capella.Withdrawal(index: 4169028257817284566'u64, validator_index: 496485'u64, address: ExecutionAddress.fromHex("0xf99805deece4ff418b55557b45060e88035f755a"), amount: 4870783513883486430'u64.Gwei), - capella.Withdrawal(index: 10410265605811982468'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x31e886453fa4e7fcec6ce6094ad22950637d41a1"), amount: 157748'u64.Gwei), - capella.Withdrawal(index: 10622085591419415519'u64, validator_index: 8179967808007927229'u64, address: ExecutionAddress.fromHex("0x03d2493395b71bb181db626a99c24dbc1d07065f"), amount: 18446744073709551615'u64.Gwei), - ]), - blob_gas_used: 14543409578714974146'u64, - excess_blob_gas: 0 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x86d7b430f69b215ab5ae863998ce41f01a5016376c8bec7f5b7a6e16a2326d92"), - fee_recipient: ExecutionAddress.fromHex("0x73068946d757f5d145a38fe9de817b8b1e9d6c43"), - state_root: Eth2Digest.fromHex("0x312b4af4d3ca5960dda2f99531819f5c32624753cc0756c05d242f65dd605d92"), - receipts_root: Eth2Digest.fromHex("0xf3a1e8f784ee4bdb897d1511ce642276e2ecbc1f21bfde9caf7c4479b7fdf902"), - logs_bloom: BloomLogs.fromHex("0x633d228aa8b2b9f4b614c4b7c7aca616232d61bc6e06ca28f4b94bc39165cf3ca2e090cebbe8a5b66b161d92e65099503327f9f2adae6ec5a73463063a994d73f37e12caec8f6d439be7520b48b25ccfa8ff64e6884b7e240c8dfd0100a23f9f644da13f1628d989eef92806c9f936a71f470d710653355acd84fb23ff15910f1d2866d83b036246c46a681e762b9a19e72aab21b428c4710511d0a39cc5ec39ebf3aecb5c19096ab32135a629abc8cdec39b2b3631bf4e86bbfb824276fd728bef454ed981e5f9e8a4bb96b27f09f661c5c221f63a26945174162496496c9bbf38cd894c50fa69df0a8c722ab48d75044bf43468639ae9b61d0b5a2f9d819eb"), - prev_randao: Eth2Digest.fromHex("0x3a0689ac32c82a6b84d3230fdc6e2c1e89671fa3906336ccde9fb7cfd1811ac8"), - block_number: 9465334901279616671'u64, - gas_limit: 17844363972830076325'u64, - gas_used: 9534663249377184661'u64, - timestamp: 15490999633909732541'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[199'u8]), - base_fee_per_gas: UInt256.fromHex("0x9fc9f32819a67c4aebae259b0648e2b82f526ce8eef8fee33961f9fc69653b2b"), - block_hash: Eth2Digest.fromHex("0x1ac3f16da76520977c5e5d86f0c261d76e18413c202e8a46241951b3a80ca601"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[223'u8, 37'u8, 18'u8, 125'u8, 208'u8, 57'u8, 114'u8, 113'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 181'u8, 143'u8, 219'u8, 145'u8, 77'u8, 39'u8, 126'u8, 173'u8, 30'u8, 59'u8, 70'u8, 205'u8, 51'u8, 16'u8, 213'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 0'u64, validator_index: 7432737887980948854'u64, address: ExecutionAddress.fromHex("0x1a99860ddeecae3195a051bc0a0fcc37d0135e37"), amount: 921585'u64.Gwei), - capella.Withdrawal(index: 8891974894683849035'u64, validator_index: 18060634568259374245'u64, address: ExecutionAddress.fromHex("0x53a6cc4c3996f0181cfe62be861900f56cb75a87"), amount: 235145'u64.Gwei), - capella.Withdrawal(index: 11531749110606308043'u64, validator_index: 9858359378531619375'u64, address: ExecutionAddress.fromHex("0x6b7a4bc00868b077f1c4aa53369e893162bcc384"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 530041'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b7853973d34b1efe7722be5c688589b49c1aaa9"), amount: 18446744073709551615'u64.Gwei), - ]), - blob_gas_used: 9156166815001018661'u64, - excess_blob_gas: 13354810927429053716'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xc51bf481df9be981c6656081e3854ffcf27551e2b4fdaed4ab12b355f247f4e1"), - fee_recipient: ExecutionAddress.fromHex("0xd79098c25eed05c9f6d55e95f5f6f58c1472fb28"), - state_root: Eth2Digest.fromHex("0x1a6b1eb78e5ac155d4be247a3b48d8d8d8574a16fa846681553037629b97ffd0"), - receipts_root: Eth2Digest.fromHex("0x5e44d4a3621cd8e495edc0b208f977c8d3f8e79a78fa7ecfc4a0f6e436f67b71"), - logs_bloom: BloomLogs.fromHex("0xe2b0dcfd2341ceb9c4edbc7115dbd6ed5f1c54ca39bee191fdaaa34368acee93f48561094dd23a3985ea2c2b83d918ba9dc671cde7732a591b4f9abd2eacf9d6416ca8c8d556052a98df2cffdbb086315585004c51c76872a06cee7d318f4845c0ade4c907c7933d4d883bcc586885be04ca9149e05b1624856e69e1efe8c93cd55d840bf71279293a118d51d4391fcbf4e6abe6ee50492ff2de085069a3c7656eb3a749d6bf46f56a2acd93a6840eb78e09a42f23fdea69bfbf017f4fd6b4a8d17df1aa5147c1897fe5fda1f5e79121f2fefef97117e7871d1cbf5b0b0350b9fc497c5aba27cbc129d452d6a60effb76e08b890d0bb856115fcfe3966359fda"), - prev_randao: Eth2Digest.fromHex("0xcd6fd69596cdd7df95e0b68e8ade01541b12ed15caa2b59803a4c4e6791870d4"), - block_number: 12264963829660560313'u64, - gas_limit: 11775806146734810959'u64, - gas_used: 1863395589678049593'u64, - timestamp: 5625804670695895441'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[183'u8]), - base_fee_per_gas: UInt256.fromHex("0x1443705192ff4dc1a819be4f22b8dcd6e7802337e62082880b1090f44a27d0e2"), - block_hash: Eth2Digest.fromHex("0x68da52444eb5322f3a0bda6bdc9a3a11a540dbd22026bb2d24862bbc32af9460"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[212'u8, 80'u8, 176'u8, 133'u8, 132'u8, 119'u8, 233'u8, 131'u8, 195'u8, 118'u8, 54'u8, 94'u8, 129'u8, 206'u8, 47'u8, 107'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 31'u8, 192'u8, 94'u8, 136'u8, 120'u8, 228'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[114'u8, 23'u8, 239'u8, 220'u8, 169'u8, 188'u8, 213'u8, 179'u8, 223'u8, 129'u8, 189'u8, 50'u8, 158'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 109465'u64, address: ExecutionAddress.fromHex("0x30376c1737df493e34318acb7efa0aadd3d78738"), amount: 419309'u64.Gwei), - capella.Withdrawal(index: 3744271566165938073'u64, validator_index: 162930'u64, address: ExecutionAddress.fromHex("0x9a3eee4729cf5ef57a1c4aeb474636461991270a"), amount: 9043308530560640624'u64.Gwei), - capella.Withdrawal(index: 10893292846301120513'u64, validator_index: 15952780188276928656'u64, address: ExecutionAddress.fromHex("0xfccc1279aa3dde74ea08b699fecb4481c777f259"), amount: 5614376920521492084'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 2895353066704396409'u64, address: ExecutionAddress.fromHex("0x7e8b34a029236dc0d15db19153165d1eccab05a8"), amount: 3749025806369957542'u64.Gwei), - ]), - blob_gas_used: 0, - excess_blob_gas: 1597862542620394734'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x8b3e7e8d447527b9d00693389928260e7ea9da6855efd99369182bd9c213988a"), - fee_recipient: ExecutionAddress.fromHex("0xb45716c9aeddeb030c0b94202fcb97bd75a039b6"), - state_root: Eth2Digest.fromHex("0x8114b285e5f3277c04a66e660fef3b86295d6ca859dfa216df3309c0a7242f2d"), - receipts_root: Eth2Digest.fromHex("0x2a3ff38541ef83faad176c3c98ceb5c55622dec83fbfc5a19bdb27646849e852"), - logs_bloom: BloomLogs.fromHex("0x384a9b3d38d343af68d00c229e79aa31f2059e17c655f5e48d31d2b59b769660e91c1e5f386e4f7dc83f2570029a6f2b3351623fcb4dadd6b5b7b26e27de19e248ebd970a9678b69403ea8e16fe88562959586fcfdee3c407fcf623c94891a2270ba1829bf2ab77fa32913bb11c8a4a69e9baa6544ad336253637626b16d4a98884e7ac7d6c1e697a9435b1e5403b5122eebddec9c03c8a6c8fed0d8877888371e133fb837d33f073375f7e1536abf622610734b9b0aced8a891f02d5b35734e58b0ead66c49ed9f898b8f27e9415275c5d15051ec00cb006f8aef702a7414aefacfa9742cd3d8d34be817e0c731696e20b973cf2da66799121c0c6d12bc835d"), - prev_randao: Eth2Digest.fromHex("0x3bd54c7151dae2ad524b4df0d4283e3641ba787fc76f54221dba3a2aa556a1bb"), - block_number: 18446744073709551615'u64, - gas_limit: 637978774023867007'u64, - gas_used: 15110835166938431016'u64, - timestamp: 18065456863038184935'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[235'u8, 229'u8, 162'u8, 249'u8, 154'u8, 135'u8]), - base_fee_per_gas: UInt256.fromHex("0xbe93cc3dc2bb7e012db659df49e57653bf6ff21354c64eeb69c0002e9f933035"), - block_hash: Eth2Digest.fromHex("0x46cb3f590b2fbce372e67968a0d2ff4ce1b2c530fcc26b7a24ed6db054f52035"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 66'u8, 215'u8, 40'u8, 223'u8, 195'u8, 43'u8, 228'u8, 225'u8, 244'u8, 34'u8, 14'u8, 117'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[92'u8, 46'u8, 215'u8, 218'u8, 71'u8, 99'u8, 115'u8, 119'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), - blob_gas_used: 1, - excess_blob_gas: 1 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xa4854e346d2e9a921cc6b3c4ce9fc739c99795cf10002924089f9886f8624d59"), - fee_recipient: ExecutionAddress.fromHex("0xa88781cf69a1eed63bcc3a32b6f9aba35d4f5b5e"), - state_root: Eth2Digest.fromHex("0xdc06d9210fd2738b0fa9df6d68e4ffbfef0dd7d7d8093fdbcd97ff845318cf6b"), - receipts_root: Eth2Digest.fromHex("0xfe1b70c143066edc444f9b49e778cf6db0060bd4e9122564350cf23061830439"), - logs_bloom: BloomLogs.fromHex("0x095a57c3f2d97aad8692cd09dfdd8388f1bf9ef98a1c3223ecfd0aed17d8c7c3ef593d7f09ba86500644deaa676df811da501d572f342e3f7ee7b9b081992f344f71fa50b3b9635d7375f67dbd85a0b1ade3d8d4778118df55b90c44f7dd1114f2ebcea5778b32701ef94af9b3713d1fe00275e09c7e918d7c529a37aa9de3464eb6364812ec486464ccbf7df2523369fdeb1b28955e35e8685c16f07fbe342edd1bc044021ed480bf4ceffefb13eaf4550c67ef8a5079f3f612f07fff60193eda6ac11d39f3056c41ea4355ef5ef7f311493c415cc8c42cb30a73dd58098262acebe6d901e4bae26b6e1eba693c7dc596ea27b0cdd4fee2f6450ca8b50b1a70"), - prev_randao: Eth2Digest.fromHex("0xc52844ad11072faa2222ffe9cbff77dcc7f681367d2aef5f1c3b206140064195"), - block_number: 767785029239287422'u64, - gas_limit: 15062566578072747104'u64, - gas_used: 7648884410596067087'u64, - timestamp: 4380084205540210041'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[217'u8, 40'u8, 125'u8, 94'u8, 156'u8, 71'u8, 79'u8, 66'u8, 117'u8, 228'u8, 173'u8, 189'u8, 115'u8, 41'u8, 153'u8, 226'u8, 130'u8, 21'u8, 108'u8, 194'u8, 206'u8, 218'u8, 141'u8]), - base_fee_per_gas: UInt256.fromHex("0x436767990abff9288346859c6b85b8a972421619eab2253483385c8151cb2016"), - block_hash: Eth2Digest.fromHex("0xca4f05c33836d82aee8230ef660016b993bca4aaf9a7b6cad96c2a0193eb026c"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[156'u8, 143'u8, 203'u8, 250'u8, 238'u8, 137'u8, 34'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[64'u8, 44'u8, 165'u8, 9'u8, 1'u8, 211'u8, 27'u8, 108'u8, 166'u8, 61'u8, 119'u8, 11'u8, 222'u8, 85'u8, 48'u8, 185'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[165'u8, 95'u8, 221'u8, 213'u8, 229'u8, 134'u8, 185'u8, 221'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 373208'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1ef66a8127bdbf1302c13af1b2a3fde17f1e421e"), amount: 12972917955689502470'u64.Gwei), - capella.Withdrawal(index: 7007268656739027478'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xca30e17b5a7925b1a5afa06710d6cffb4681d2fb"), amount: 13141021224557402822'u64.Gwei), - capella.Withdrawal(index: 10730268187610256048'u64, validator_index: 7483561449283560970'u64, address: ExecutionAddress.fromHex("0x84e755db228c9399912364a239227c467477e076"), amount: 16091384671148001130'u64.Gwei), - capella.Withdrawal(index: 861292'u64, validator_index: 101133'u64, address: ExecutionAddress.fromHex("0x70e7126e6288dd8559b6bf8946b98fe02bc53e8f"), amount: 5439105246644982514'u64.Gwei), - ]), - blob_gas_used: 2533380168586417970'u64, - excess_blob_gas: 307516487526704997'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x5e7b12465e0461e5dfa59a3254282378c55961b0e411023ce89d968bbdc33e9c"), - fee_recipient: ExecutionAddress.fromHex("0xbd1a1396ab49631cc933770944996b294da97d43"), - state_root: Eth2Digest.fromHex("0x74e6ccfb15da8afb94eebf28cb3ba3f9ce63e3354097f2f2527fe1cf978e76bf"), - receipts_root: Eth2Digest.fromHex("0x8e48bee56e149d1851cff0740ceab06767bd0e819261c5a2f75dbea382a110b6"), - logs_bloom: BloomLogs.fromHex("0x7894fbe58c624a153dbb160c516c9e82bd0cacf5f347f984efcca9450e9a20b50e058ed38e41c331df61114086f8a6b8a049467d7dafd812953aa593b2e9fbc056f0dba80973b2eaae8814b5e0804300eeea15613e59c8d34339f58e1b45599361497a3608c05140cf432e7983a30985aa0faf45dff56dce99eaa5ad3418722df17eaaa4e8df25ed1d9eedee1390e6440c4c37675182dcc07ff199d6dd015d3aa03194765e85fc0d4759d3c693fc2550e50835b88ba41d10fc33b58550d813abaa75bab39c0fbe419f1bde8fb82db9fcfb79894faeed84b2314f115a8fb9e276315ccbfb8e9650571add358f594ff2fb4ab9661afde76081bb2cfbfd2f26d212"), - prev_randao: Eth2Digest.fromHex("0xb9a9bce05e42cf3d2ffc2c2ea95164c9b215fc8e440dd2985ca24cff40e32780"), - block_number: 14460352585391846826'u64, - gas_limit: 2426408612341958329'u64, - gas_used: 13656152006197676019'u64, - timestamp: 6263571560389404595'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[177'u8, 36'u8, 79'u8, 26'u8, 164'u8, 59'u8, 182'u8, 88'u8, 223'u8, 22'u8, 79'u8, 197'u8, 109'u8, 53'u8, 53'u8, 134'u8, 244'u8, 84'u8, 146'u8, 158'u8, 234'u8, 252'u8, 188'u8, 175'u8, 69'u8, 51'u8, 118'u8, 101'u8, 242'u8, 0'u8, 51'u8, 103'u8]), - base_fee_per_gas: UInt256.fromHex("0x997e6c8ffbd1ea95e875612109843c6cdfd0c6bcaffa1e06ba303b3012b3c371"), - block_hash: Eth2Digest.fromHex("0x9a7f83cf6a64e153fc3316244fabd972a49ebf5dfb173d7e611bf3447a175c41"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 103'u8, 164'u8, 112'u8, 136'u8, 91'u8, 170'u8, 241'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 12452742873210027116'u64, validator_index: 163643'u64, address: ExecutionAddress.fromHex("0x5d09dd69d2b2370e11b21d758bc82c2a73ee00d0"), amount: 12246034467900494037'u64.Gwei), - capella.Withdrawal(index: 256915780184525584'u64, validator_index: 364410'u64, address: ExecutionAddress.fromHex("0x40a55ad4a156caf112e2abe789554520814e48a1"), amount: 297315'u64.Gwei), - ]), - blob_gas_used: 3541847679255581458'u64, - excess_blob_gas: 1 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xa8f90a617f1f230506d200c6026bd60e38f599930ed04f90cdc320a6d45bb022"), - fee_recipient: ExecutionAddress.fromHex("0x3531157eaf2c185bd8720f3edfaf76829632f07d"), - state_root: Eth2Digest.fromHex("0xa16f8936e945ecd45a4ae107e46acd8530e438fa1bc8eb85aef62afaca1656da"), - receipts_root: Eth2Digest.fromHex("0x3e76522c8f3b7e8d8a63f4968ab15413b8bbd7af9782c4878b52213b0b3d13f8"), - logs_bloom: BloomLogs.fromHex("0xc13b59de763feaa39debf70d280364ec68eb578af8a90aba7e2cf3a6cee413a28836c674662a0283df8ff04964eb928de97a3883226950b584d773c9b4479d6d5bda6fd71951c0c846752ed688e13dccff947b7a6c81bfac198b6bf785bca7be28bcf9a208b983afe6e766b0536311c1c12b4d01c712cdaa167ecec5520395068b1c1f939d20962de1aba36454cdb36031fa0ba886a8ece71234654e8b081562452046a388ebcf3cfd975493833ff4e146d5e5ddb061d994461ab8b468cf1d6d491d78fd8923f9f6563e3fbfa72639de993701ff6214fd83cd3597e870dec1c1e788a4f01f881c48e57b07c5a217132658208d2221a86c7e9823159984d235b5"), - prev_randao: Eth2Digest.fromHex("0xbac4a9aa16b289584d13abe3c47a58dda713c4b479ee70e1ac7b3b698e8505af"), - block_number: 4839752353493107669'u64, - gas_limit: 4713453319947764960'u64, - gas_used: 3470256075652600568'u64, - timestamp: 13764471837770950237'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[60'u8, 109'u8, 153'u8, 55'u8, 17'u8, 196'u8, 17'u8, 96'u8, 202'u8, 173'u8, 16'u8, 189'u8, 165'u8, 107'u8, 68'u8, 230'u8, 238'u8, 62'u8, 199'u8, 211'u8, 244'u8, 83'u8, 88'u8]), - base_fee_per_gas: UInt256.fromHex("0x3adad83f48e34c6220dce41ecc0b09f9bb1ae4bda4466935c70e7c6cd54e185e"), - block_hash: Eth2Digest.fromHex("0x9183524f908425608c1e3a80d7c4ac2c539903af4b3a2f1b22c3283281706aba"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 645596'u64, validator_index: 248698'u64, address: ExecutionAddress.fromHex("0x124e32ea8d0363647a58a5511b6de35bdd50236e"), amount: 18446744073709551615'u64.Gwei), - ]), - blob_gas_used: 3410596457491766161'u64, - excess_blob_gas: 0 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xc914f63464f3f1588a32d3751900d415bbf1fe002c42068650f5c7c588b1935c"), - fee_recipient: ExecutionAddress.fromHex("0x61523b6add59cc65d3c5b75c6f749fa601e157de"), - state_root: Eth2Digest.fromHex("0xe84ecb995f6c7e753355c8d2e24694441c528b65ef9b1d8c6f4e9d98d409342b"), - receipts_root: Eth2Digest.fromHex("0x887bdafa340c24acb58f36a7e3825ce39fb7e0caaba3a9b63f78d2186cc6994a"), - logs_bloom: BloomLogs.fromHex("0x1fbd358ad7e32eefe4489b6c72bafcf6dbac109970e5c103e329279cede3619faf1309faf266ba155496c19565b31562f31539c98b6256919d8950bb6eca937401d91fa5b3032b4400ce6dd60a8c1c6cc94331b7e78d7a350ebb5d6e04a2594af981f167a89227c7c902dbb8eac3d7b54177d85214a6ef57b50da82b6420cf914fd63171f0b7dff9233bfaa2069774b142a136c5183ed4f57cde2590735b19ef549ff5bc910477b98344e7557ffc440b03d56842f356a6e223fd052c6272e24f43dc9e64055c097d81b56ecfd6087238602a743e09c383ad4eae6ef449570febdfebfefa347f06f480f319ff06365bbfae16b62a950143f9acc3663510356f0c"), - prev_randao: Eth2Digest.fromHex("0xc755584f86084ab2e62bd58f25dfe54538c0171e6447e7e1a51cf05db94377da"), - block_number: 9276126375553452674'u64, - gas_limit: 9007257403963034102'u64, - gas_used: 12806310385580231715'u64, - timestamp: 9957937708118639445'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xe2df33500d1162994934e9fa65fd5db641b0be2b61a6c302c7b9019f86042338"), - block_hash: Eth2Digest.fromHex("0xce58ef51926a6eb4cf2997c4ec771b54907737ae8fe9522fc316c97a1c7ee6d7"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 16986670237072862757'u64, validator_index: 701065'u64, address: ExecutionAddress.fromHex("0x50371592a27339f868b9ef63f6c02e8c1e72ce94"), amount: 3561319411833205205'u64.Gwei), - capella.Withdrawal(index: 2402770018709110103'u64, validator_index: 798632'u64, address: ExecutionAddress.fromHex("0x9d42c6c10cbc0b04e3f2e74f63c777802d4ca064"), amount: 898967'u64.Gwei), - capella.Withdrawal(index: 944680'u64, validator_index: 507423'u64, address: ExecutionAddress.fromHex("0x640d578aeed6b8a9acc83f13343f3139fe8f4a15"), amount: 941781'u64.Gwei), - ]), - blob_gas_used: 15366131400223670470'u64, - excess_blob_gas: 13352270791962864689'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x086322b79160568c7d096747ef351338ddc93f252dab1df3ef65aaf24723d2c3"), - fee_recipient: ExecutionAddress.fromHex("0x03c6998b5a3ff1c98538c2333d279f2b1cc59f7f"), - state_root: Eth2Digest.fromHex("0x446d99a7e9fd2c327fbd445dbfb3b3e3a895cdfa6f208496dd09c0f84f7ac0fd"), - receipts_root: Eth2Digest.fromHex("0xf4c74d5c59c46f1d9f916b32d8a12939cc2a379bae83153137de76415f6e5afe"), - logs_bloom: BloomLogs.fromHex("0x40f87c3729ba599c3e9bb749c48148ee0d5563db71cf0daaad3af95c45622d7b2a64204157a92a93cf0ffbe0052fb79eef83ba8389fe9d9e7646874b0636960e4eee86eeca00ba70f65b2046620264b795852def9beebb671f841e19ce07934b7c2f66301cc3c7dfa2606067cdeb04a564b87e56ff3650c7c6bbbc96b2de5ccf8e314ae74a26347371c315062532a1f1a2fe0c417ed5d12b6f81c3440c0d8b19d0cf8a030be83ee7ada6046d75098b6ee66664ead786a65ef5cdcb33c4634aa07cd7490abc0ea9ce722423a0cba1aecb379552e89483de43dd321cdaa8a005ab7e8e2a958038ca12e2b08709348a7f6daf34c488add1a0a21aed0da0b64251f9"), - prev_randao: Eth2Digest.fromHex("0x2ff08bd0b22bae8c3627f61b8da627fc367b3a60f93dbe48de1ca6f25ada489b"), - block_number: 10605470807350562909'u64, - gas_limit: 587854351728657338'u64, - gas_used: 8799032544585725320'u64, - timestamp: 18028498231539883963'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xfbe348f0c77be2ddbd3ec038e3aad88107625dc6e96b1fb3bbfdba8c737a3d7e"), - block_hash: Eth2Digest.fromHex("0xc545e833aa2ee5d708e041f4dcb44bda654372b3f5f660c683d12230303da729"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[89'u8, 59'u8, 131'u8, 146'u8, 186'u8, 180'u8, 208'u8, 76'u8, 69'u8, 40'u8, 29'u8, 211'u8, 97'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[208'u8, 136'u8, 157'u8, 0'u8, 120'u8, 231'u8, 99'u8, 33'u8, 31'u8, 210'u8, 80'u8, 203'u8, 24'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 225873861246030158'u64, validator_index: 3132710425326779052'u64, address: ExecutionAddress.fromHex("0x4d2573288e7949201c806877449e441801ba62c5"), amount: 9096383177302198854'u64.Gwei), - capella.Withdrawal(index: 2816791477401799195'u64, validator_index: 12199871733060832130'u64, address: ExecutionAddress.fromHex("0xd4e21e668d5e8b1c097cb250dc862bfd7f8a2b76"), amount: 7278220627858832735'u64.Gwei), - capella.Withdrawal(index: 12003547154719720523'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xe888b3288bfaf8f979c93699cbabef6c1f156f19"), amount: 18446744073709551615'u64.Gwei), - ]), - blob_gas_used: 0, - excess_blob_gas: 1233408100755176706'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xcfba7f4aa4ff01d3d9de84dbe1761c79627a10c3188fb0a7c8adfa0d489e6441"), - fee_recipient: ExecutionAddress.fromHex("0x106b3bcaae4ff58dd837768be35c29c48571e4a4"), - state_root: Eth2Digest.fromHex("0xe6242399020361e70cb6b89701001fa8326251e6bae3b4ca1978eded8831d9a7"), - receipts_root: Eth2Digest.fromHex("0x3db0f9a05cc39be94414c3be28378d2b91ba3ff43ea2ea7e4e0a1874a0983f58"), - logs_bloom: BloomLogs.fromHex("0xd591169a3cc38e0837a76c4d7057f94c1ef08ad5af1778b1b06c3a0ec85201bfc659b18c49de831ce6b4a40f0d2800a9cc9001f74810c58473f9b973b720f84626cc9270b0428439b985043f5d9c3289ef8a794f5b8265e10e9fb9fa53a93887d270b8204f8f16cd968e295b0a06aa70e9f6f174733d251f3bfc644a7fb274b0138729f18c0e4382bd4bf0387870f633ed897a125ca854120c2885194f3180af4b62760db96da51f88ae1cd222f49b00fbbc1544eb0e98cea67e36368816f541723158d3691f3cf1509c65a51a8e68efb66c500dd6516ca1b02aeb4e0c13cf5bbead53672fb5a7a1863c8edfaf4eb9a4b4322a39d8643528bccf22493914fa01"), - prev_randao: Eth2Digest.fromHex("0x14fec0a1edb9c82dc9aa7fb7224791c51a3937e74e5da59646123867496460f2"), - block_number: 6272046003849350913'u64, - gas_limit: 15423951135645467684'u64, - gas_used: 3743939155619454195'u64, - timestamp: 8496536260448579184'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[152'u8]), - base_fee_per_gas: UInt256.fromHex("0xd8b104041bdc4c76a9735e2b4b45f0f3612e8962f672aaf511f06a94b48562c8"), - block_hash: Eth2Digest.fromHex("0x8ca67fec04b7e3bc5a01f5bb265b93b4488b58ec2ac7f2c3ced030311de2762e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[152'u8, 232'u8, 136'u8, 228'u8, 253'u8, 248'u8, 85'u8, 92'u8, 103'u8, 38'u8, 106'u8, 166'u8, 148'u8, 8'u8, 37'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[58'u8, 215'u8, 97'u8, 99'u8, 152'u8, 126'u8, 14'u8, 252'u8, 64'u8, 87'u8, 242'u8, 60'u8, 210'u8, 217'u8, 75'u8, 189'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 18405055677765556765'u64, validator_index: 13513833286292305941'u64, address: ExecutionAddress.fromHex("0xfe53af2bf3560b2157a683a545d4f898354f4d55"), amount: 911502'u64.Gwei), - ]), - blob_gas_used: 11215270247452431947'u64, - excess_blob_gas: 0 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x063bc56b731eeeff8bf1c33d88523a04a14fa0c745eb3c750139842d88244982"), - fee_recipient: ExecutionAddress.fromHex("0x415b1cd5b42709a3724ab2f6f50a6dab7399d7ca"), - state_root: Eth2Digest.fromHex("0xf261abf37066b8dc5c868946346c98aae445adbb48e6dd05969fbb49267a276e"), - receipts_root: Eth2Digest.fromHex("0x5a337b7ee29d98e22b461f43b7a87e52d89fda2e7a3487ea92873be04a49ea68"), - logs_bloom: BloomLogs.fromHex("0x01817fd642526acdd8b57b4fc2fb58aba269095ce220ae5770004055f550918778021eae3abeffff1b3fa9fba50ff8d532fd8e2e67da7bdcca1cf9505179f19f595f5d9f09b98d5bc7d1ecb22527255e8e161ca2124c5fedbb59527f91a242671177e33a6fa377d585ebdbd6d9ff2bf80bec3695657441e35da43861f14b9a7e65ed475c323ece62d84aed7262cf3fd2b06ba03695e2e26e5e58fc5b8b99d519fda879587e3764930e3921aa15b2ee8691ea0e738030acb8832ca353d3bb63fbc0150c532b842cd053abeae8238c9ffe6f4b2b7210dc862c48843ae2a9088ecdb8c258592a0feb5215b8c9ad494ad896379d86e0ac89e6cd8765003ac5c95cce"), - prev_randao: Eth2Digest.fromHex("0xb28f434f3f40e40693b0c1726a018e2b3bc13c41608a2ca71aa5c8bf61829287"), - block_number: 14597257287993827247'u64, - gas_limit: 9090926713872599867'u64, - gas_used: 17391976671717618186'u64, - timestamp: 13439825139187707720'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[73'u8, 163'u8, 138'u8, 201'u8, 62'u8, 1'u8, 37'u8, 90'u8, 157'u8]), - base_fee_per_gas: UInt256.fromHex("0x8a42339ef76757729ef6c4536b3b59255b18d7085d8ba786275b2076fc55b3c6"), - block_hash: Eth2Digest.fromHex("0xb3f6ec11b285a105833f5b68b67e8e23c85c28df2362a13a76db705f110fce8c"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5477557954669138518'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b840b26a19377c64b870be600aa336a40ae46ed"), amount: 42381'u64.Gwei), - capella.Withdrawal(index: 0'u64, validator_index: 1'u64, address: ExecutionAddress.fromHex("0x3d22a723824a2944ea9accc8653002bf7d61a10a"), amount: 2799163561369818755'u64.Gwei), - ]), - blob_gas_used: 69111814634726666'u64, - excess_blob_gas: 10785611890433610477'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xb31c41d39ef7e9a9b905cc93d82264415024d7daef48d886f1b3bc0fd6545edb"), - fee_recipient: ExecutionAddress.fromHex("0x5ad4b6c0d6b986e775f3a9ae2be73a330ba9f87c"), - state_root: Eth2Digest.fromHex("0x01dbc857a3d8994cf10cd1be3b2018be0e26ba54a5456e10a6e5729328a0b5f5"), - receipts_root: Eth2Digest.fromHex("0xa51e9cb9893bd7d73a8fd4e5267d80ddcb29d998814cfa9980dbae50ef101aff"), - logs_bloom: BloomLogs.fromHex("0xf1280db0ef6bb796e70dfef3b0bafa62690ef1e8f14a237856bae5dbe29dfd43ac789c53305ab5b0b7cc48ed53d1236ab9433a5352dac55b6e0a3ff90e9e815e2ce16fe5574c87f0066090c39b811996e2974da0bdb8bb59eb044bbb6bc2d7f8241093c7143a7c9892be85ea4284258ea2477f6a677d424efb6469724d641bbdc3f9254529b6af5cc5f5a77dad49c1a59ae37c19ffc69f6e331139b6ebac306ea09460dc0fc5791ef2cfb9e7bf29d662872e30b94384be90416df03bef5cf5a2339af4745f2f620fd1320d3fb79848692719cb8956b8efd427c9c0cc3ea6efb8f84feae0075ed10ec5c6243074e6004849712d8d1dd97ebb2948fcdf1d020c6e"), - prev_randao: Eth2Digest.fromHex("0xc8a27f0b7850de04e3d794b9e9d4f144c356f864401c3f802927faf4b88b47ac"), - block_number: 10821099926525463598'u64, - gas_limit: 7115919978619568727'u64, - gas_used: 1, - timestamp: 5900615379943209755'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[56'u8, 176'u8, 67'u8, 30'u8, 11'u8, 27'u8, 136'u8, 121'u8, 86'u8, 17'u8, 4'u8, 121'u8, 11'u8, 222'u8, 158'u8, 78'u8, 56'u8, 66'u8, 243'u8]), - base_fee_per_gas: UInt256.fromHex("0xfbaacdba879288838ff725df19b7a31148ec5a24e7989441544d6dec1c980034"), - block_hash: Eth2Digest.fromHex("0x04616c0808df7a1bc177bc48cb6ed865125fbbac2fa3e3c36f33a5f1c48a23fd"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 143666'u64, validator_index: 849676'u64, address: ExecutionAddress.fromHex("0xbf06178f996afec7c9d3cb488e812f32aafe4242"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 560588584813483246'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1a1b89bf52af0d4a8eff759986ffd93cf4464114"), amount: 13046900622089392610'u64.Gwei), - ]), - blob_gas_used: 1, - excess_blob_gas: 10155937412879977460'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xf6cba3ced37c08da230babbf9d1e360661e5a21ac235fefa75cbe756f15809de"), - fee_recipient: ExecutionAddress.fromHex("0x0c080349793b7f43fb3ee9101889e7d32e02c01d"), - state_root: Eth2Digest.fromHex("0x6a33580fc482e9783d66bee9276f42b74a2cbc2b7434fc408a6ba9df77db0ceb"), - receipts_root: Eth2Digest.fromHex("0xd896daff74ffd6ffcc088adba01aea52af82d861b7ff649265a750e5995dcf31"), - logs_bloom: BloomLogs.fromHex("0xec00c3385b735b6a4088ed066bdb088e7826a2830fd13a1a1525c4590eb08baeba81bb511bbf2db2c0547c69c10b5c6c1bf5c8e5a7931584e6ed8ed7357431e1e2391fc0e61a060baf8984a6fd5c04c68fe0f28f94281d0db663b1b2fdaad9b51d3a12bb9fba255c923dea5ce45dd68ec2c5afc9fd13a0e24d234a3c8c5f255e7d62d48a8e01fb5c1eaf0c7a68a616ac935416fe3332943d78eb28a48a180e2bee26e85d786583ae0609a8b98e1045738f054aa12bef97593cd16d8d795314bfff33c51b397afa2299a4a64244817e5a07cdcd75eb4c4c06e8e943d8d1db8e65f17368ab6175c3e14daad0b99fd0f1050feebadf9db8fe8f1c19ed867f4df676"), - prev_randao: Eth2Digest.fromHex("0xdcd37bc148c25afa7e320009ce19567108745ef5ed57781f55df1d73b707e26e"), - block_number: 13754339262807377549'u64, - gas_limit: 5250261236890759949'u64, - gas_used: 1335844244115849195'u64, - timestamp: 16758901654456753273'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[28'u8, 8'u8, 171'u8, 122'u8, 126'u8, 38'u8, 142'u8, 246'u8, 162'u8, 197'u8, 241'u8, 216'u8, 158'u8, 184'u8, 73'u8, 191'u8, 208'u8, 5'u8, 79'u8, 231'u8, 254'u8, 55'u8, 126'u8, 97'u8, 184'u8, 78'u8, 36'u8, 80'u8, 160'u8, 124'u8, 188'u8, 176'u8]), - base_fee_per_gas: UInt256.fromHex("0x0ea1185e0ac50d1e2cc0be7229c846528380def25f7d8860cf366e6edd793be0"), - block_hash: Eth2Digest.fromHex("0xb471874aa6e8987deee40902d59537fed8af3e9b6ae2f8b476ddb051629b3b09"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 215'u8, 225'u8, 83'u8, 163'u8, 187'u8, 111'u8, 141'u8, 246'u8, 57'u8, 238'u8, 163'u8, 25'u8, 91'u8, 114'u8, 111'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[93'u8, 42'u8, 101'u8, 80'u8, 160'u8, 252'u8, 158'u8, 121'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[164'u8, 98'u8, 105'u8, 179'u8, 25'u8, 33'u8, 130'u8, 239'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5378768050415100863'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0x3d84c03e4c18979ee8288bd58b24989580f0a590"), amount: 815393520574223128'u64.Gwei), - capella.Withdrawal(index: 17328504288784263137'u64, validator_index: 305278'u64, address: ExecutionAddress.fromHex("0xa00491dfbee05f23fc7ddcfcb1b27b2855334e81"), amount: 7734460020873819187'u64.Gwei), - capella.Withdrawal(index: 0'u64, validator_index: 444647'u64, address: ExecutionAddress.fromHex("0x0689ed39160f4b4c20138f300b3b2502e6d6ab5a"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 834083'u64, validator_index: 10715076713456342424'u64, address: ExecutionAddress.fromHex("0x07ee24f650e7254d10d61b832db7174128bf22b4"), amount: 17794546242151296198'u64.Gwei), - ]), - blob_gas_used: 7080212387270627767'u64, - excess_blob_gas: 17322910515629142083'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x62ce6a6d68578309c4730f96f98a809d4b4225fc3d37a285daf26288b10f9590"), - fee_recipient: ExecutionAddress.fromHex("0x8c892b06f1e9c877c310b6eccefb20fcf5e00227"), - state_root: Eth2Digest.fromHex("0x578f93b83206e3239c69f51cc8e59cd89087260cda9f0efc892aa2ffb2bf386e"), - receipts_root: Eth2Digest.fromHex("0xa4ac657af8e0dad66ec74f4f66b246fe0089485e2810071fa556c09ea585059f"), - logs_bloom: BloomLogs.fromHex("0x18d67e640f9ad3a24deb7e3f8cbe0ba8224cf9cb9e67b2fd6c774fac7aa3f4adca2befe8322962cf000cb89c3e352433cf1aade51ceac9fe69966a8a89f7985030a301eb690e7eb20b5ac3b315930ee5397b6d65b03a1131b94e7f3505ef030877e460e9195b742e943716d9875a3e2e9998236d3565d622216af1721b658a12fe7d82a62619b4f2d042f146305ff1ad1bf394437340735eac9e962b3fe67597793d1151ec87fcb5f0056837c5813c75c4a0f94d91da71299b3780f250ee31eb9f106e3c443f0ba05213da05177238909fd9e60de9484e091b91dead82debc020929d1f14e79b610af3d15bf9c3757e62bb32a69523c1bd576e5c5d4bc2ef0a6"), - prev_randao: Eth2Digest.fromHex("0x552627eb969604e7d4ed1e631b74b2410dea7f4dbd49511bda390e3b9da8bf60"), - block_number: 7763671958353664038'u64, - gas_limit: 3930616259240751958'u64, - gas_used: 7960068863134244743'u64, - timestamp: 18446744073709551615'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[227'u8, 111'u8, 127'u8, 243'u8, 191'u8, 237'u8, 88'u8, 146'u8, 146'u8, 236'u8, 162'u8, 237'u8, 164'u8, 177'u8, 249'u8, 52'u8, 1'u8, 26'u8, 187'u8, 208'u8, 244'u8, 234'u8, 113'u8, 199'u8, 30'u8, 209'u8, 197'u8, 63'u8, 126'u8, 104'u8, 143'u8, 30'u8]), - base_fee_per_gas: UInt256.fromHex("0x6bcd9684e1bc8f4fc5d089e0bf5fed35a8bf3039808d030bb9eb1ff7147180b5"), - block_hash: Eth2Digest.fromHex("0x9e2505de9f245873565b553e7215abff698bdfcee1dbd93e40eb295dd84e7f45"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[140'u8, 134'u8, 173'u8, 70'u8, 168'u8, 181'u8, 221'u8, 210'u8, 25'u8, 142'u8, 168'u8, 139'u8, 77'u8, 134'u8, 203'u8, 219'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 0'u64, validator_index: 780337'u64, address: ExecutionAddress.fromHex("0xf0ab5949e96d8befa8090fe5612d9c45beea0c8f"), amount: 2246589958612652012'u64.Gwei), - ]), - blob_gas_used: 0, - excess_blob_gas: 9638659159857567769'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x4f8251c361a23171de8648d1e96c91fea2cc5a691dcd884e3a957dc8f6a8802a"), - fee_recipient: ExecutionAddress.fromHex("0x7da9175abaf6e4e400e0ee516fd3ab07dd659f2a"), - state_root: Eth2Digest.fromHex("0x1bd3a5da4c266dd396b8209288e68be066176ebe64cd4c17c4c6cdccaf03577e"), - receipts_root: Eth2Digest.fromHex("0x16133c4fe31f0487e700514160acf9257458a6ee716be8043cb6c532f84ef614"), - logs_bloom: BloomLogs.fromHex("0x5ca3807e674d69536b33337d798deaeb9fa6c7cbab7aef1473e6a6614f6f2c74ef85ee3632612b9c1e78d2a63e0b2f58d48d71e8d62e38510bc2f307680497cb965153b43392b8aa2dcd91a766356eab3ff1b4a6c4b037d61df1a8a4c6d3fa0e3c57a299a1c0a7382052ac25c412f2d2356c302e326fa0cfb570354e31e2f8046b80e2690ba69ec7c284c2df8ad23d16764cbc0ba28516f3c31aa89da3e3286106dcecc835b3007a17f33c4962efc3c9b0f5bff14c783e414ba60d35b79ab33ccd0151c34a94efc461d0df0a994085373f33275a4cd6839603632409b670072a4554f1c9342c03cd403a6feb67b23d3a075707ca89b77bad64e24a6ab79446ad"), - prev_randao: Eth2Digest.fromHex("0x6353ec5b94b9112f25e66de48b532ff5610c63f34c50a02fdf64af6c9d0ef2f4"), - block_number: 16866969889068542818'u64, - gas_limit: 5116920640663397560'u64, - gas_used: 13292402101416991817'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[136'u8, 133'u8, 189'u8, 60'u8, 229'u8, 217'u8, 70'u8, 145'u8, 136'u8, 97'u8, 175'u8, 23'u8, 183'u8, 73'u8]), - base_fee_per_gas: UInt256.fromHex("0xe1307a28a2868b4d934aefdde7bbd09b0644b5c422d2c680770775cb44623512"), - block_hash: Eth2Digest.fromHex("0x11e23850b143b8b4dd8394ee1f2cebf073068502d04dde00000925cf23ff55cc"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), - blob_gas_used: 4954178403284176013'u64, - excess_blob_gas: 1 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x0c67b44b492590ffb9e6d2a63c84714821be7526ce1c337c06276e33a62b7b93"), - fee_recipient: ExecutionAddress.fromHex("0x1d16dbe66ead2ba8afb8594acaf8d536be08dac3"), - state_root: Eth2Digest.fromHex("0xeeb40e334aff8512435b5908a8dd3c06993cadca8bc44e9a6c28c6003162c6a9"), - receipts_root: Eth2Digest.fromHex("0xefa5b7de19da2333bfb7bfa814a306f904fef2ff4f8b1154314649a56fea3c8d"), - logs_bloom: BloomLogs.fromHex("0x4ebbaff6a56343a6bc0170aca2e2ba303f3e3f972c88539ef84e402740e3c9e21c6951d461baf56eec14c06ca0e95f4921079d0d82e9dd46e73f3fa76417246217ff9c5425f19b0f8b2a735ee522c1bc377a2b079099430d0f9316164f5930456245534bbe138d0a19ee58bb13a0d724723a6fa50e39b8a7ad5804f92ab43c24782e27dbb32789408cdd716af9a0b0cb1e2f3aee0bcb5aa4088c0cf1528fad466f3d71d906649becf25f405f619dead731e0831efb522b5faee7a39ca28128effc79977816d50ae23745ab96b80dc7f548aa5d43b0d5c331fdc1ce080a4d63e19942ecb4df8f56397b2ef67d017f2d2de9296e1fd8036ed8592f5a89553c4642"), - prev_randao: Eth2Digest.fromHex("0x5d3c3ac25330e1cd3a516003315ed24bd2dc6cd31d389639cce4b6ae4a3ac8cf"), - block_number: 10891095348111649307'u64, - gas_limit: 13670668340379820434'u64, - gas_used: 1482104080767186829'u64, - timestamp: 6602476120092784163'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[223'u8, 228'u8, 253'u8, 3'u8, 38'u8, 218'u8, 253'u8, 87'u8, 206'u8, 243'u8, 168'u8, 113'u8]), - base_fee_per_gas: UInt256.fromHex("0x972a01f27d586035ce5fb233118e52652ebbf89f6d39558a41b27c8840c849b1"), - block_hash: Eth2Digest.fromHex("0x9280fa96a569e7c25b2dfc12a141d3edd24acf2fbfa19ee72e5a1fd5dba25a11"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[116'u8, 179'u8, 195'u8, 80'u8, 193'u8, 73'u8, 187'u8, 64'u8, 41'u8, 251'u8, 55'u8, 90'u8, 161'u8, 30'u8, 221'u8, 210'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 820354'u64, validator_index: 626992'u64, address: ExecutionAddress.fromHex("0x4abb3f9a694bf6b27be97e24290ca6826b23c5d0"), amount: 100271'u64.Gwei), - ]), - blob_gas_used: 0, - excess_blob_gas: 4396492484488695305'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x7a9d6ab34c0314959d5bdceb0bd80f142e59e5e2addedcd178612303897e7a8a"), - fee_recipient: ExecutionAddress.fromHex("0x3425bc529b4791f5fdb7dd365501199b2f81e578"), - state_root: Eth2Digest.fromHex("0x4eb1a9a3c4b9392325a14f3f8efbc0b3cc3bfc2d7e9992377abd84af6c556db5"), - receipts_root: Eth2Digest.fromHex("0x094e9114d3487925f6818140978e4db64d8306083a8e5c987657e21c3a1995bd"), - logs_bloom: BloomLogs.fromHex("0x0815701b4689d0bb7f80fb1485ad3255a66b890725a1d2d66b4fc66678e2d08784c21ef583401493d5dda1549eda32303b7d102edc72b9fe1d696ab459294a88db0d7263abdf982ddf59ce008b8ac734565de79c269dfc18a36709ca91a3cd50516725e9fa9d98302fa0322254382aab0cdf1f95f2397579f7219bd7ab096ef1f00d7b1131b0055bff65ae9954cb22959adbc40983840ae3b85358fd205bdf6ac6bcf723047ffc53a094a06c2039935b6ef579efc618bf4127a6e4e531f6d97c17789be639691ef87fa5540cf732a184a0e09d5c60866ecd0be0a04bc94317712c395d84c2cec90f43f4807048bf1a93e3e6520a1a7c59092e2e391abf9d2e68"), - prev_randao: Eth2Digest.fromHex("0x349eec90244f3d812002732cd833952969b27a463def04291051137344c89c41"), - block_number: 5715688900321967041'u64, - gas_limit: 17172684770312311722'u64, - gas_used: 9286597649062725614'u64, - timestamp: 195835912833125491'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[34'u8, 35'u8, 209'u8, 45'u8, 117'u8]), - base_fee_per_gas: UInt256.fromHex("0x7b5b4e48b3daadecb9724a74d426a86ffb5c5f8abd43469b4e3fe2a728b5a645"), - block_hash: Eth2Digest.fromHex("0xc71c294b5562af30b9e2b03e76cec0cc6d8b50694219404aaed2ace8f756a22e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[178'u8, 142'u8, 115'u8, 217'u8, 56'u8, 74'u8, 150'u8, 16'u8, 244'u8, 148'u8, 19'u8, 33'u8, 89'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[195'u8, 248'u8, 42'u8, 129'u8, 151'u8, 119'u8, 232'u8, 235'u8, 245'u8, 240'u8, 113'u8, 157'u8, 235'u8, 158'u8, 160'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 27'u8, 72'u8, 107'u8, 18'u8, 210'u8, 127'u8, 78'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5186085670428433087'u64, validator_index: 156817'u64, address: ExecutionAddress.fromHex("0xf8d93a548c4b243e66f4f73b29da342a0fab04de"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 9475052657186699106'u64, validator_index: 759532'u64, address: ExecutionAddress.fromHex("0x97559fac3168c6ee81b0f0b0b88563080ca24769"), amount: 4852567582077527137'u64.Gwei), - ]), - blob_gas_used: 11199168226748373856'u64, - excess_blob_gas: 13194543368024635634'u64 - ), - (deneb.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x806a868f0f31e8f519fa6339ad18c414dba17feb03aaf6ca3775b152bac64f3b"), - fee_recipient: ExecutionAddress.fromHex("0xa2bcc8b793c4a5d4e0f68251d2f22e1ff4366d2c"), - state_root: Eth2Digest.fromHex("0x6979ac9545f31eaf7ed8bd227cd7cbd1017492b892bcc118f7417ea87d50d412"), - receipts_root: Eth2Digest.fromHex("0xca0ac1828fae211c9d0fd7ab763460d89f9da0669d082c68b9fdca3ca1b59123"), - logs_bloom: BloomLogs.fromHex("0x0656423dc7b375cee4f5c3bedc500eaff2da91d0dd5f4e695933c92a2a6af7441200a41177bcae7912839f993a733aa2bb82976f08180a901e63c588a26dc9ccc58f477eccbb08aa932d512bfc765a57527acd04c585af23f48f389420890d06877d8a0f523cb90be10dbc73cb5b11e808f5c6c90c6fc3a9434dab462f2977eacf79146b35ee2372aae8a6fe3628cbe21a8988fd9546b25581b6d998462f9af7f653d3a4702a4a63b9f26cc7d2f72e18a3918fa9b65ed81d23ac0a64dd8f3f878f745fcb4de9ad144ae9565288d7bf90e6d356f49cc242d000e988fe76e0196f0c5b24bdf9dc501222e54f64861e0d45dda2bdf09e5fb290a1ec6dce39b02883"), - prev_randao: Eth2Digest.fromHex("0xc986211f6550cb787e89140d8856531ec309f652e2a871e2715c1dd055448074"), - block_number: 7781035717593646205'u64, - gas_limit: 9088183223170031827'u64, - gas_used: 0, - timestamp: 1844848381084178223'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xaac988479abbe95e03cc214e7b99795c4ec117bfe4da06e4624e94b262b015e2"), - block_hash: Eth2Digest.fromHex("0x14137d373f6e6110b3fe3c1d743a4f84547ad3d59d0b42598b794ff601e97e38"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[10'u8, 28'u8, 79'u8, 238'u8, 85'u8, 206'u8, 161'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[144'u8, 222'u8, 190'u8, 14'u8, 247'u8, 119'u8, 95'u8, 48'u8, 238'u8, 50'u8, 180'u8, 12'u8, 216'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 428032'u64, validator_index: 18218455002493563835'u64, address: ExecutionAddress.fromHex("0x389fe5e57a13de364b852d7e2cebc2add2cb7510"), amount: 726634'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xc6a0db1d09160cec69bda14b444c46745e09c96b"), amount: 742028'u64.Gwei), - capella.Withdrawal(index: 858390'u64, validator_index: 326055'u64, address: ExecutionAddress.fromHex("0x6a861508a89443c763d5daf15dab44a8a45147fc"), amount: 597242'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 17239721441660215355'u64, address: ExecutionAddress.fromHex("0x1450447dc71e28e312c7de7034523cd322eabc98"), amount: 18446744073709551615'u64.Gwei), - ]), - blob_gas_used: 6943026604784588438'u64, - excess_blob_gas: 4081254329996628499'u64 - )] - - for executionPayload in executionPayloads: - check: - executionPayload == asConsensusType( - asEngineExecutionPayload(executionPayload)) - - test "Roundtrip engine RPC V4 and electra ExecutionPayload representations": - # Each Eth2Digest field is chosen randomly. Each uint64 field is random, - # with boosted probabilities for 0, 1, and high(uint64). There can be 0, - # 1, 2, or 3 transactions uniformly. Each transaction is 0, 8, 13, or 16 - # bytes. fee_recipient and logs_bloom, both, are uniformly random. extra - # bytes are random, with 0, 1, and 32 lengths' probabilities increased. - # - # For withdrawals, many possible values are nonsensical (e.g., sufficiently - # high withdrawal indexes or validator indexes), but should be supported in - # this layer regardless, so sample across entire domain. - const executionPayloads = [ - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x760d4d1fced29500a422c401a646ee5bb5d65a07efa1492856a72cff9948a434"), - fee_recipient: ExecutionAddress.fromHex("0x315f583fa44fc6684553d3c88c3d26e9ed7123d8"), - state_root: Eth2Digest.fromHex("0xa6975bac699618cc22c05b1ba8f47cbd162475669474316d7a79ea84bce3c690"), - receipts_root: Eth2Digest.fromHex("0x080d53a0fd22d93f669b06052413851469d63adeb301810d7ce7a51c90c8e8ce"), - logs_bloom: BloomLogs.fromHex("0x453a1f1c4f63bcf0be84e36a9ac233b551601bb2e5ab9450235bd83e41d2013f42c97044ac197a91da96efd6fb18f233bad2e884d76f0a63a6fbf7dbc714cc9aa497fb6d363feeba18447ecf799d5f8d769232553c375b21166c0176859dba63eb77f1a17e482ebac07c3cfd5281277f55f1e5c79cc675d501e1982816d31db7d73c89e855315d8f4e9fef1c9ebb322610235c44632a80341b42f05d207ac4869d08d98a3587a470f598095ebb932788fefacdd70e7749e0bd47ceff88a74ee1f006d9791350484149935d4521d86e644ebc4346154ca0bfa9fbb83120630867d878c12e53a04a879e993b755f02670c9c47f091acf1b3f593782ddaa98f0df4"), - prev_randao: Eth2Digest.fromHex("0xe19503a6fa6acde0b8f5981f29eb2e298ddff63e6243529d735bcfa42680a515"), - block_number: 9937808397572497453'u64, - gas_limit: 15517598874177925531'u64, - gas_used: 3241597546384131838'u64, - timestamp: 17932057306109702405'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[55'u8, 184'u8, 18'u8, 128'u8, 63'u8, 61'u8, 26'u8, 79'u8, 3'u8, 225'u8, 167'u8, 15'u8, 240'u8, 167'u8, 180'u8, 141'u8, 205'u8, 10'u8, 246'u8, 70'u8, 248'u8, 35'u8, 19'u8, 45'u8, 252'u8, 187'u8, 168'u8, 42'u8]), - base_fee_per_gas: UInt256.fromHex("0xaf8acbd8a0f0f8eeced9a1014333cdddbd2090d663a06cd919cf17529e9d7862"), - block_hash: Eth2Digest.fromHex("0x86b46255725b39af70a9e1a3096287d9772ccc635408fe06c34cc8b680977ff5"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 98780'u64, validator_index: 8610867051145053792'u64, address: ExecutionAddress.fromHex("0x0c33e909ef375bd3ab33961b5ea767b4f1c8bce0"), amount: 671269'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 500164'u64, address: ExecutionAddress.fromHex("0x271215240885828779da36212489170f19a8f5bb"), amount: 2071087476832314128'u64.Gwei), - capella.Withdrawal(index: 26148315722507923'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x340bd9f489ec124b8a879673f12969b14d0b5555"), amount: 9486787560616102568'u64.Gwei), - capella.Withdrawal(index: 4839737623914146930'u64, validator_index: 273755626242170824'u64, address: ExecutionAddress.fromHex("0xcacc573cfc0ad561aae27f7be1c38b8dd6fab2cc"), amount: 9475975971913976804'u64.Gwei), - ]), - blob_gas_used: 4401258332680664954'u64, - excess_blob_gas: 12834012644793671460'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x814b12b95f9846e3d69ee46e6a47a26d6cc8613641a1352f35395a15de56043ef451726e797757b9768657a9e9787a83")), - withdrawal_credentials: Eth2Digest.fromHex("0x241d63159f0cde42aeec7610900762ad2016f5bc0270250d7086b173bf6e4181"), - amount: 12638322094749964200'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x10244d58594ff86b3548ae04b3c193756c7cf2e9830da492c6021259f8bce7ac6ea62d93a9b78adc77a168b91865876ac68ef7f05564cac91353e400fa5c44317789d2d93d6a6cba9155db29b7857562a6d9316454d1a9c5178e2ce5c75fa5bb")), - index: 8139570810318771243'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb7721c98fe1ae6beaf0e486d2d951a307a3d3265cf6f2b16bd8b40f2dbfbc6e4e20e3f75c29e70a0432af0385a997eaf")), - withdrawal_credentials: Eth2Digest.fromHex("0x0aae47c8d21e2ff63a5b341c1bf209f5176762d522d16d2f7b9a595cc327a3a6"), - amount: 15018910798502483977'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xa6d248e93991eff0b001418667e718204216d88fce9933fcce52e4daa026e8c47f9863a77d675fecd6def721d194684c28823350fe80429356c57792c70b22571e7d3219b9a8a35d3a552dd5eb6ffdd01ee5a1fcd2d14ad82038f7ca00a22ca8")), - index: 13899393201735021181'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xbced475462c8676eb79a8e288f1f7759b621192b2a5f41162473affe3219663fa1e9d78f0ce94c556e4bfa1dfd3f0f9f")), - withdrawal_credentials: Eth2Digest.fromHex("0x245144c69624ec1ff4feefd0d9080e016fcab37726bf712df06ebe512bd11fc3"), - amount: 8365809466950819313'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x806f5cb96d5cabc2ecfe96fd92816e1e86ea1e86229675bbdd6de141461bfbf3d358094f41ddb91cab075a67950af6016a326697be18d38a2056aab597d40cb216b642b5d6c6f4edacd4a4a89a7c342f3d11f18a1f4f7783ea25251a1f355009")), - index: 17214334124209319458'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x22189bc4bc3f45eb3d6d8a5bc6b85aa8f680c5f9cd1aba686757faee3d31bec7bff6af52671fdb767ea7ccaf14ac2ae1")), - withdrawal_credentials: Eth2Digest.fromHex("0x25993e69ef274cd8b703d25cd3932b117e08123578b20365aeae8a244a625355"), - amount: 12258289723293669412'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xce7d46dc7f0b4ad54417dd50800761161dee1abb2e20af7c4cad314a6921768f7b89ba17bc7b51497c67a14255c31aa19d19bdad1d572f88c598ffdbe7be5d8cbe1ceb83836948512448725ca56ba834626a8f42aa110c7b272524707e514fab")), - index: 13244611922088961185'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x0b1cd7defa0a00c8714ab2ab6a1da006d469c725042c589890c9e5c21070d5289a5b33357f9dd8a79e6364fc4e012440")), - withdrawal_credentials: Eth2Digest.fromHex("0x4b07a81b5612a02914cfd99571711c78cbaa3e0f1fbb23c4a0a51e04c263a659"), - amount: 16282163526662133088'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x943c3c3818d5aa98fbf8344ef4cdc9c13cdabfdeb7762efc8bb32d2ea32d3bbb4ef069a254f5f35325f48609fad7bbafb6389e204767a9b3bbe46a04f8baa850bfd4d3747aaf2816c7e18fc2ebe4fa41088d195d09c761819c7a2e57a3451148")), - index: 900883336538271514'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x2cb54ddf357864102f4ab6bce57317a75cee972f303449bf7047f4e0e5809127"), - fee_recipient: ExecutionAddress.fromHex("0x92af67d9604b945fd2cbaccd29598e2b47ef5d2d"), - state_root: Eth2Digest.fromHex("0xc64221514816a2f87a29c2c474abf99547820b2a12e6e5956f160dd54579e521"), - receipts_root: Eth2Digest.fromHex("0x76c1ca0e483a557f6884d64bd891c62904c64c2fe69350278345c622cc50b0d7"), - logs_bloom: BloomLogs.fromHex("0x7afdc9a99777d76b713e960e9f12ad4fe46ecb7ea6d5b245c6d9ee11d3fd35e7ae33dd6062fb6578bc2c2f286f1c6a4aa6a44cc80a88a3678c7085c35a0f2e5334ea686e2098fe5d179bbbaf81cbc349a15e7a21aa27f0ddcad342d980d056a356694cdadcef8db3c7866b6cb087c28f2aeed7a5bc9b1294cef0da3ac3b46dbe72d7f164f1990bc32f755b709b96a96bdd8da2c9d9300e9f6906040347d337fc21b833ff0b80305b22ac64a2df2dede4c01c65c192884f161aacd12ba56dab9189477e6ae484a97ff96e0aba1f9b8d043896b8433779abeec091f16b94a013325fe11096d1f2d79b701ab5b46063ac99392a790e617555fe3286dfd7ec0cb9b6"), - prev_randao: Eth2Digest.fromHex("0xc4021ae781a3b3a1dfb1e4464b032a3bae5f5b68366beb555ede1f126920cd5c"), - block_number: 11318858212743222111'u64, - gas_limit: 2312263413099464025'u64, - gas_used: 1, - timestamp: 15461704461982808518'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[254'u8, 188'u8, 92'u8, 24'u8, 153'u8, 206'u8, 74'u8, 108'u8, 96'u8, 100'u8, 148'u8, 84'u8, 151'u8, 74'u8, 73'u8, 167'u8, 65'u8, 177'u8, 253'u8, 62'u8]), - base_fee_per_gas: UInt256.fromHex("0xb1c4b2bffcb38aaa1f98b483441aa212c9dd951d4706dd505a973fd5fd84796f"), - block_hash: Eth2Digest.fromHex("0x8b150d453d802fdbb19be0132621a5e8061e70cfe6668ee6a63e4ff217434999"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[142'u8, 197'u8, 221'u8, 83'u8, 32'u8, 126'u8, 145'u8, 86'u8, 28'u8, 39'u8, 112'u8, 240'u8, 168'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[175'u8, 191'u8, 143'u8, 78'u8, 162'u8, 249'u8, 87'u8, 193'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 168'u8, 190'u8, 157'u8, 39'u8, 143'u8, 147'u8, 156'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 11497754023538902580'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xb0b680a6d93e520fa32e399ded64871d99c1f2c6"), amount: 15592017597077727306'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 14269483352942387358'u64, address: ExecutionAddress.fromHex("0x97e4451d09c9af077dc9081e5081563aa26e4c51"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 9664968187979079659'u64, validator_index: 750818'u64, address: ExecutionAddress.fromHex("0x1e4bc6f12efe96b9f5ca549b77a3d62c5f5403d8"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 727020'u64, validator_index: 10133766089843653238'u64, address: ExecutionAddress.fromHex("0x6a1ed64277cf1eba8c96281531d2799d1fa7c409"), amount: 130469'u64.Gwei), - ]), - blob_gas_used: 4810756443599845432'u64, - excess_blob_gas: 1435200597189175983'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x8fa8ea53febdf07bd7f832be8c965a4aca37c3340b4cfd75624c125f4eb5946a404e9cc35d74f55048c1fcfadde3551e")), - withdrawal_credentials: Eth2Digest.fromHex("0x7647368d6b5580fc677b463d57d4cc9dda93117e9c8604cda4679030cd4956e4"), - amount: 11838169110820399795'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x84ed920f689cda2883afa0c5d12db16206abca7d0319047c2542b9fc6c0e5fb9cf945e76c34da4448bf06a90cf51686393af3b80feebef058a8cf98762439bf748c7394083edcb3b4b20390c00415046f84885a8fc60d873318ed08f7e420d7b")), - index: 14081768455144986910'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xae3d89af9e4d6caa6e9746a13f9bba9886c7fb75669af29e089799bf94614d722a776006b4b2fc347e54c88ddebdb5df")), - withdrawal_credentials: Eth2Digest.fromHex("0x0548c33677c9d3d11898e1b1cb7e8546b5d28c09626aeb43fe77609ef8eb709c"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x8beef976488318fe3577aaa2686096377805c1486c3598c5a01202884ac1b68013cdc02e1bda7cc5fcd649c76cb57df4d8bde53f119e2c9f7699653f4686c12ce909b508fc92a063773da4319bc9ec52f1605c7a4c220a1d3bf182e80b7a5949")), - index: 7396750296380130136'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd3abc92b8a163a56e35c545a528eaa0c5bdbfcc5de8a1be80231d2a33ef1249a31c3638771f7a3e764fee81f6c95d433")), - withdrawal_credentials: Eth2Digest.fromHex("0x074fa7f5af43e713a8ee7f09fb46ef4f05b23a060486141b5d9e9d273c7fbe56"), - amount: 1209689892101089592'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x01b42eaad61c4f658526ff4d64bb49f19276a698b34870245109c24f6f59dcaf87ab2275526c665d2493ea6c77f2bfb86e77d0375f4f63ce4cb3dbe5632442453fb4c73558d3569b62f1a6ecd5821daa85d6762a8a24c0eba6b8e51c9b0acb8f")), - index: 16259922695017953678'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xf18bdc121a076ebb642352c940b5c0cd9c60ea4d3b8188b9f7b446efcabbc5af2f0a2672632b0474c5147d17427bf526")), - withdrawal_credentials: Eth2Digest.fromHex("0x80de1f7b69ecf34465e463b30e49453c36e65684ce3004a082ffd84bf4c0441e"), - amount: 4622244708907095023'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x426dc233d2195c02283140b3d90a50da4d6d5bce3f7c3894a910d891ed835c2cb1dd8ba1e5f82dd214a322abd50e3043408d6f7a04499b2bdf6fcc5b4cda0400d557df79bba2aea31de06de9c8a1e069666a3b71577809480f82fce4a12882fd")), - index: 9250544134833432385'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x809a16fa8c9e34875aaac4939775bb6b0034b2fb7f5db570567ef604b11485c878544dc6e6878f4ad921fce8cdcc7273")), - withdrawal_credentials: Eth2Digest.fromHex("0xcf05474e4f86279a6faec8fd6987ac10c4aa6595e6d061fe7217a68d5fcaf5d3"), - amount: 4509592030421891894'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x0d543b0e9b934586fb877615c8d2551e11998f020bce6b96901fb8045ef42eb41f6039e813136043fe5c63d91a11e1e15e5c4063d1775f95ae1715cb87b21b7690b44ec38efd1a825e1e3ac68d21940f772b3309edb3ddebb24204e06d4924c2")), - index: 12423850076890731216'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x39554fbddf13facd81344d536c08ed5769304749"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xc4f5b2c07cc2f6758dd8eaef217247f767bcd88a8f5c93b030023d420568f47735d113df344627759f4ea1b56c53136f"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x243c496e83f955ef23dc3d121b3cbe5f56305d73"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xe9a3d62cdf9acae4966e5682958d0cc9223065b4d68ed3b12a024a56744ab9656736326061f9fb41a8f15564cb4d241f"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x462f156d8d950c7ffd40d7ba149bcc34093bbdb7"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd6d7f2281c2b9c98a8a5dc0b7f41783eb91b838973207239852e817ed412e164e330003ac9ab0e96bc65886e15b5cbe9"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xac5a7347865f503e1578d1b47271c8e60027b5ba24b0da8e7c3733bcdbeda220"), - fee_recipient: ExecutionAddress.fromHex("0x8b7fa656e67f6af2074ec3f16930ad742a69f189"), - state_root: Eth2Digest.fromHex("0xeb50f351f6945df8983cf4037ee264dcb2ceef3313ae452248571811d8a3a8cf"), - receipts_root: Eth2Digest.fromHex("0x860af6010832f64a5234327b653aabbd3898881a7b72ae42e08d4a1519166fba"), - logs_bloom: BloomLogs.fromHex("0x01a18d51076880a1a8ea86cc5dc5fb904ba0a3c285b7dff34ee5dbad9d64721f3849ad9f50b90ad4524eca6b0564f8a1a5827a7b476ea051c33a7c0e18db4cfb27b36476bbb1eacbc029dbc5009e5cea695045cfb34c868163514b784133f0f2998cf12e2caf9c74f69732ed3716396dc34d86725428aff48bf6b935ae88f5e4820b9a325bc670cf560dcb479723213a3156a9d7d0e7de0dc791d0eb94a691013624b8aa982ca3c9d5b49fcac8fafbb403c9fbceee5373f0fb2b77ff1bae8160fe2a47b01d792b088eb3fe24c53b5c6a8b4a3b59060d587ca7376f8baba58d57cf745b2a346f800a54d08545194e067ae260c73369a016b12d0fbc20abc78ba3"), - prev_randao: Eth2Digest.fromHex("0x330b7093023f617d2cb5f76cee4b078af002b68d81e3a5b5c9d37c4411871a95"), - block_number: 18446744073709551615'u64, - gas_limit: 13979513761871276914'u64, - gas_used: 6199089254852634745'u64, - timestamp: 7404562418233177323'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[220'u8, 149'u8, 177'u8, 36'u8, 228'u8, 88'u8, 47'u8, 149'u8, 211'u8, 213'u8, 170'u8, 40'u8, 207'u8, 145'u8, 137'u8, 64'u8, 153'u8, 22'u8]), - base_fee_per_gas: UInt256.fromHex("0xfc82d0e46d05b21aedab6f368183611d2885b28c52842f28f621ef6c631b6e6a"), - block_hash: Eth2Digest.fromHex("0xa8c6b2dcc2496f0230e796f8a69642126955ae6209a0d0c2dee2c925212f447e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[138'u8, 17'u8, 34'u8, 168'u8, 105'u8, 179'u8, 196'u8, 21'u8, 253'u8, 242'u8, 106'u8, 30'u8, 40'u8, 190'u8, 179'u8, 93'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 1'u64, validator_index: 239183'u64, address: ExecutionAddress.fromHex("0x75efb2a04b5f25ae56ff7256ee9f4fdc4e25baf3"), amount: 402148'u64.Gwei), - ]), - blob_gas_used: 723464856451065691'u64, - excess_blob_gas: 11231138371511965912'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd82ed23e86d1d22165bcbed4e01b2548997769f369344a4f347772108782d77c20cdaa614c57457726d3e5d384a7d09b")), - withdrawal_credentials: Eth2Digest.fromHex("0x2acf0fdd7ca651a467899a928ffd036d88dd86301808ccd2a06d5002daa35d15"), - amount: 15437169017045689073'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x143a1a4dcac6db342901feb541dc0c95830a4ca1aca9c3fcb55e2dcb9a5b31e2bd9214b1a3a12e17e140d37ba7ebfd11d6d8a38eea5d0755402dd400386aaefcc70d12fb1409f92797923bf964bea3f916b562f3ff2b522c48b748c8e8c632d4")), - index: 15872726372973140071'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x3a8a707225d47dbddb01c1ca39181af823d57d97"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9cf008ca8159512ffffa1fe56de68bb9e44f9c4bb3c2c4924f5d7bf1bb810cc807b155f11ddd55a4972346f8e75f06ab"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x7c55f3e4f648bcfb47db2122233b25881785709b"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb9e559b137b8ab79ddfbc6ea2fb44d96d1925c2b7b6e4c0e1b69f66d82b656065af06bd62e8fe9210276a116ad78c382"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xcf25ed583b463f3a57acd97c398e27877b9bf6a6"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xa14ac0d85ae38dd91a9f7da12b6c7cb4e879f78effc5ac0da8f9ee56059460f31152009fc1b88d0e0a0bf576950f45e0"))), - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xd3be9b45bfe67229afb47461ca2970505586cab8eb8e00f280ceb07a9d47866f"), - fee_recipient: ExecutionAddress.fromHex("0xde645d4a77f0a386a45c52357948e1d7eac5e780"), - state_root: Eth2Digest.fromHex("0x69b70e0188e7b88e38df90853b2dfd2e4c7181e83d82d77ab81c57d161216b92"), - receipts_root: Eth2Digest.fromHex("0xc01d94a01736268170a16196927029d4d8d7c65970ec78ece94c87304bed4568"), - logs_bloom: BloomLogs.fromHex("0x7f1ac5c77e3f0c8a1a103ee83dd7d0fd6fb13895aa1141de330445474b3216e2646c15c1cbf4ab4feb1e4e21c2e6970f4a6648675508b08111e00b62866b0f6cccd58afea87d2cd0a24c0384fa179dc33ae6d0db8c1b118a75fb442682b7cbecc2808fe8c812c3720ca54f6723a395fff5dd1720f41822c91b080503bbfeef21eea192d5b7c4160344996d017ab849fa97e862206caac8f8bfeba41865514b21a8d8fa9ce3dcc0daf5bf86fd2f07d222fc7a9d11fb4031b2cd72544d7f89eb95203a570bc179f9ba1f73f39d74049fe22b63939ea49d5d40f42c00c5f1bd429e84ade377475e432186acd9975914670052fea64453fca87317f62e29b550e88f"), - prev_randao: Eth2Digest.fromHex("0xce47da2b2a68186b78054be0894ccc9ae7213c18b9093c0ebc1b9ed011071a39"), - block_number: 9014833350824993703'u64, - gas_limit: 18446744073709551615'u64, - gas_used: 7874274181221487360'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[139'u8]), - base_fee_per_gas: UInt256.fromHex("0x1eb821a0ee3f9d2e5b49c64177db9ffc96ec6b06249cefa8c51d0ce7e664a3ae"), - block_hash: Eth2Digest.fromHex("0x99479be6429eac4a945ca8171d3d3ce42d7b5af298292e833e20462438e06229"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[99'u8, 198'u8, 91'u8, 86'u8, 23'u8, 222'u8, 121'u8, 250'u8, 12'u8, 135'u8, 133'u8, 37'u8, 61'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[81'u8, 173'u8, 241'u8, 145'u8, 54'u8, 3'u8, 36'u8, 121'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), - blob_gas_used: 1936360613980595982'u64, - excess_blob_gas: 525438497879148955'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x2dc5c92e3d525d69b07de9f2e0fb3db26b05c966b029e38fa736bb60b49d6abe86d4dc61255de43e9bd012c1677a7adc")), - withdrawal_credentials: Eth2Digest.fromHex("0xa85cff9568bd1244836733549567286eaa0aef139c416c235555551772e2ae29"), - amount: 5525246068348642244'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x4f2e42e2305bd30fdbdc8c2b0e8f9c57c544f097cfdc2fb2335df422a14c5c827d91c586384a2d14f64bbd98124046506388058414766674bbb59bfefe2c701c05a5e9c135d60617830ac5d60788712587220964a78a632cde4e124b7692ce62")), - index: 0), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x6ecff72c568c0e272157ac48bd047406c8117cc60e531a3acd46531da9b140c91ae684c72def7839e6d84b6f190877e0")), - withdrawal_credentials: Eth2Digest.fromHex("0x0946aa245e0435cb321fd0e166c31cb363fc2f264bbb2d67be9fe89d07b2037c"), - amount: 13283742386908495031'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xf683f76e5a79d2248248f701d87327b35705ae31284d8e7602a1470a239d35f9622c5c39812a933ca586f724af4f10b58cea183b8c127dada1abda2eb0879e1aa49f7a9bd89ab76f7d5f33d2ad80c9f058ace2bd83c224520f8d02b0942ed985")), - index: 789807770712130412'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9c696094074fb290b6f8558c7ebe08b8595859aabfe521a7307c3179b21dc8df0a63f0970f89bfe3197373a92630c3c7")), - withdrawal_credentials: Eth2Digest.fromHex("0x650cc685a706fd441937753efc42e243339d62c6866f83b00c0ae2becc8882db"), - amount: 2716675895799004971'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x79e01ad75396043b9343d83587ccf1dbc7928a8f520e92b2840fa40cb086b04964b8fda19176d22d643c5afe0703884487fc40a14b7a7100c96d4811ea7af08046fd0d7aab8a1f73e05fa598f5be976696109312b26ea8b629ee984be7a7077f")), - index: 1321141240653182102'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xcc2fd5c9cec6e09329e140efd4ee508de16b2af020d8ed8b1323f166c3c6cc0ceacefccbb9867cd5681610749050429e")), - withdrawal_credentials: Eth2Digest.fromHex("0x89a95d7a2fa26fb6db447d53a508f92f997823f95a6caa25e04196bfb3749f5d"), - amount: 18351003704404188995'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x351d11b34c55e1d947d5ce132e02ef1f3765136d14945b3fa297569465d057fb593df173d99e690c7dc8f6455add6b6abc87e4ea88a68fc396ad9189f3c56bf642ccd5dcb42dbcd67b8d6c3ba6627bc2a51d776cc35adbfacb7bd5e84948995d")), - index: 16817584575889190379'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xca1819f056ebd22a08689e4d40a195116b68e56a1c9b0914499801f7015f1e2696a9d3fbc17a5c2641b0429eb7bf2124")), - withdrawal_credentials: Eth2Digest.fromHex("0x83b7ec99b4e424a17228b43057b9bc8ae387fbc075f1dc692b0e1765629e2494"), - amount: 18420683568430679261'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x94cb986143fdae936c832d08977520c41a6a9b1569b012a8486678571ea5ce2e913f55c9d5631a8f02d1b75aca414969c56f22cf0b6e5193f7ac3568b09c9ae955581c69095908ccab9c5ff5c47b2edef262f2843ccc7cbc69eb35b14c66886c")), - index: 11423537419700559218'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x44754b90f7b23eee1dddafa745ac723dcc147404"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x8d13edc45159cdcf6ed780fc7b93e74434fa392b0842dfa92458cc59515aaac127317df24def9701eb6d5ea060eaffea"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x06504beb0dc3bae44ef75678d29ec5138d87da68d307ca7d43e259cede60fda6"), - fee_recipient: ExecutionAddress.fromHex("0x527ce602a0be18c0944dc27b2864c711a91f89a6"), - state_root: Eth2Digest.fromHex("0xad3bbef5d22bdc2429da09eb85137c881f85fe6e6b3ea207e5eaeb399c755055"), - receipts_root: Eth2Digest.fromHex("0xf94fdc52cde20532cfdee73e9cebb61d9f7160191345f9caf58b45501d8effbc"), - logs_bloom: BloomLogs.fromHex("0x0999cc50752006a2bc8e5485c239b9a41be6ea2fd8f0392884246ef7d33bccdf4bd326fadae385e3ecc309bf0f367ac1791767ffaee90ddfa7bee22d19f417708fded2b2b6b3be2b6007745fb1de940e7849761586953c04e3bec3c9b6342d1b91dd024980f469b484bd0befc4941a3846d027390d6256e4acf9933e0891dd558270eb35d3455f4e49c890479e970a8008b75ff4d33b4f7e5a8c19e75d8abd8673ebb859a8a24907584d88f0d68b3142b3c6952695fdd84581f5a070601a575a8e7bfa0bf7cf0fe9d70a051005f9dc594d09909e9d079d02a4e441e5b3f33388de8d46cbdcdf24f835415680e569f2ed29acdc01042a6a7ee701e4e6cace5c28"), - prev_randao: Eth2Digest.fromHex("0x7cef96d72498facdb399dfb5b6d7d69185f3edc70715540fdc7ef651c4685c6a"), - block_number: 13066898984921201592'u64, - gas_limit: 9241830338892723842'u64, - gas_used: 8347984358275749670'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[11'u8, 46'u8, 127'u8, 104'u8, 141'u8, 79'u8, 55'u8, 48'u8, 242'u8, 12'u8, 142'u8, 2'u8]), - base_fee_per_gas: UInt256.fromHex("0x6241db2a44a58a2c1aac93c4aa18aed5add30d1937c31078542bb544bf9ba2df"), - block_hash: Eth2Digest.fromHex("0xdc1756667e7c3f1615650cbbaae1117a6bac817c6579cf3f7afbc93277eb3ea1"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[13'u8, 24'u8, 248'u8, 26'u8, 141'u8, 177'u8, 236'u8, 2'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[213'u8, 208'u8, 242'u8, 46'u8, 0'u8, 31'u8, 219'u8, 213'u8, 197'u8, 218'u8, 148'u8, 236'u8, 43'u8, 152'u8, 123'u8, 96'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 163'u8, 60'u8, 195'u8, 40'u8, 68'u8, 185'u8, 20'u8, 244'u8, 82'u8, 34'u8, 181'u8, 26'u8, 201'u8, 2'u8, 108'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 15531362396155364476'u64, address: ExecutionAddress.fromHex("0x063b2e1de01c4dad4402641553c7c60ea990ab30"), amount: 106054'u64.Gwei), - ]), - blob_gas_used: 0, - excess_blob_gas: 11830672376638423068'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x09902c0e95be295a0b550efdeca632b9e9628760737ef80afda66a830d3b3695891d94f7c0504e9d5f7ece9b244ff8cf")), - withdrawal_credentials: Eth2Digest.fromHex("0x0cc2bc536712049ab8303dbc403542bf5ae5b2308c6859420ed950ed9b221567"), - amount: 13281242819623749583'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x08c9aa65cb03faed07e92003192d98e83a9026d2c8b31ebdaeb70a21809d93e87351482aa9f49b039a1de250ae1a0a2cf9104c23165ed658e433062e7b8cfb26aecd8d73be477745f9e7f4da7927dfb300ef82157a66936b78582344f58468f0")), - index: 16878503552918350820'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb49156fdde58af27ac558dcf697f2eb2f2c92efd5b455ff736ca88258d9c2e7b77989585dd562da6eed32b228e8510ea")), - withdrawal_credentials: Eth2Digest.fromHex("0x4e922c8a3cc2bc7f5ebf9733c67d76f338e7902653c28248ef967047a9875835"), - amount: 4089107267451814479'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x9e2864164d275e436ed45120245d2063dbedc87d555cceabe8c18622fe462411ecbe7fa4a262989a45795efea09d21f8e4254cedd5c787bf80211be0a3c6ffc1bcc5f364387f32f746647e0194a599653f3af5f6e1151244df02bb7b3f7270cc")), - index: 1665528005288012054'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xb5d4a5eae3a1ea004ed573b0b8f8a22c847616758c0faf1e7e9589f16e55415c"), - fee_recipient: ExecutionAddress.fromHex("0xf7ac0877fd8bcadde1e050f6c7ddad13688ec071"), - state_root: Eth2Digest.fromHex("0x7472f824376a723894f8d539743c7f93b69839772f28cf6a83e2102fde99c3c9"), - receipts_root: Eth2Digest.fromHex("0x750365b5d975460a64f07758abd0cdd44cee23cc2d4f06f2a047cf4c12c23db4"), - logs_bloom: BloomLogs.fromHex("0xe24d8452039bddd10e1252c1ebf9b9e81a22577f940e8708d200548717e8471e130a7066adc48785a8dea1dca05953d6be16504a57112c065e7909586cd611af9e0b840b81caf0532dbb2833ee5ac6a6eb7b6c990cba6ccf6f4ddec5a7c76f8296bd2a693cbbb43b1d86b66f6aa58888734d3fb21cf5e96f1b981f8ae2737bce1cad1cc458650291cf7a3d22c61fde6af3a07a44bf1b334b2c5dabbef16e5e73db75e87f04670cb3830f0a7badc702e7dd37a59ce02992f4473a909e57dee1fdd22cfc886f4fcb6ea205ec9234a8ec85ea134242748f9f10062534fd0528bc1b5b1e89511cdf91a1e7fb4f8c58c93d2a6c75e48a2d48235cb7de13040db8dc9c"), - prev_randao: Eth2Digest.fromHex("0x2410823a37c763e13b03a4c48e32f9e43b8440ca31ecfe8e0543a20a02c496c5"), - block_number: 14920119354157670036'u64, - gas_limit: 17193947846593799248'u64, - gas_used: 2176791850599260430'u64, - timestamp: 12670133468877091192'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[31'u8, 7'u8, 1'u8, 212'u8, 152'u8, 82'u8, 167'u8, 57'u8, 116'u8, 147'u8, 97'u8, 109'u8, 219'u8, 207'u8, 151'u8, 116'u8, 43'u8, 218'u8, 91'u8, 253'u8, 14'u8, 182'u8, 102'u8, 57'u8, 153'u8, 72'u8, 172'u8, 208'u8, 0'u8, 64'u8, 97'u8]), - base_fee_per_gas: UInt256.fromHex("0xf1daaa067663bf3277b9149aab162f4e330f988f0be8f83a556743a57ae5c8fd"), - block_hash: Eth2Digest.fromHex("0x5d462b4b243c6292b6a3b32f4e05849c0613d0a61954734c524f75f8df66cf8d"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5416630176463173042'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xd7b1d18e4eb7b5041b4b08bae2ce8e22982d6e6c"), amount: 911474'u64.Gwei), - ]), - blob_gas_used: 17909098553568904023'u64, - excess_blob_gas: 2561776469828429184'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xab3432ddf2af63c4fab5af4cc8bd2e73aadf316f2899b88ac2d81cce54476a401f2c6692b95a049a559134c160ea9588")), - withdrawal_credentials: Eth2Digest.fromHex("0x4efa2bd51acb05fda811629ca1fd71fb77f4523a26087e25f8f6faeea76619f4"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x2303cdb9d265dfd2ac3923c45ac94797eaec8188c244c8b9c7480d55db3d0e33876c14abd1cce784c18d07ed474ab7911b29e5d0343377d923a21c6a4ef6b0d302075a1aa9e7341e22aba6aa5b139b754a3b99b80ecc5c39771eec11d456f210")), - index: 17835217878031055704'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xc6d41b4862a8b3c4dffa9a2550fedd5598417ab02715a841d91e13688bb2a3f30e22a1bc60363a77dc95b6bf0d7e0df3")), - withdrawal_credentials: Eth2Digest.fromHex("0x771668e08e36fb5974e56502c56bfe6a9b4976e6954e845b416fbed33c18c26d"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xdb8c8b42b6796c13f5737484f6da27b7eb3ddc3f03195be0cf6a484f34bb5e5da5ab4276222ce48b84f2b80e3f40604ec0b20ae0b451f4f25e598f483fd99d5b158ca0dc102de8c11c2713992997d7bafda9bd719c7ca70480174915d76bfe73")), - index: 13902730600946299592'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x6b841e43fc2268f72a78f0c77d57c4cc6d0b87686a435813c3f9af9a87a01b21b5ca1c6b54ebcaf5e861c7cd66244ac9")), - withdrawal_credentials: Eth2Digest.fromHex("0xbb1071d3f5aa5125b1d01442d9d82812dff796db2d8d36b590c1ea66ec945c33"), - amount: 16549762982203261123'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x6d18d257618a085090dc37a79c3f02b6a7145f27d72736abf90cc4a1fde6a00b2670d86243ee71efbe5819360b53dc2263784457be537b0325e7b080507d78f0b18b839acbde966f3bd5567ebab939978b00b5b996f1632d6ef5aafefd3c8e6e")), - index: 3347786845438227400'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd424dc39bd77478209cee2c04bd9dedcf60823c4fabf724d0aba4a2d401a14a9b5e0cc0b6a2058e8165177c70fde7767")), - withdrawal_credentials: Eth2Digest.fromHex("0xe02ee40d601028257747b8a429c224fd401ac674454ace65280f169eca07cec6"), - amount: 7324985409398823338'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xca03e6b82cd3df289ed574c2deca216a089928bc944abd3efd26ee3124c45b22e7f541c02cc95f71ea8b52f0fed044ca14863b651c07b6e52abbce8afb500556a32e33a5f57a33ca6103237aa1c5bc409f4a2745b9828d6eff5360a2ba63d162")), - index: 18335046601207607970'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ConsolidationRequest( - source_address: ExecutionAddress.fromHex("0xf059ccccbe2c2c647c9eb7443e500f59b185a682"), - source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xebb87808992003e0482b3e56df9b966fb33c46798b637a6663239157d19655d48f1e553905f7bc49f61d1f42223bb475")), - target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb5ff2f18bf7efc34ee68ecfae0ff51611f382e9fc7dc34634f32a1b4387c3010e996dbdee44e26f591aa2e69c3b58f8c"))) - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x2629683cfc70198038837270bde3c60176c2a4aeeced0d4a4f14dc99a380c377"), - fee_recipient: ExecutionAddress.fromHex("0xd234af1937861b66ca84c334824763fb54347677"), - state_root: Eth2Digest.fromHex("0xf79f02d52d7f2a4be99eebba3dfb3bce74136ea739da515703d095a66ce203d5"), - receipts_root: Eth2Digest.fromHex("0xa97ae6fa5d6937f7754ff96766a54bb8ec082b046814e74f6c9c67147795f526"), - logs_bloom: BloomLogs.fromHex("0x5d2ef8bc2f58a84e4050e3a38985e4c267940707c8da3f687fefb9e22e4ae11a2f79a24456af3758e8b521d546dc178da5c85da869ebb2da551976488a769ca2940fa20853e4e1d1fcf8d5bbea0d16973c827d38c97c47c57835677590567829d119e8108f2ee3fa988b267ccfc3e58e5f81c18c775a9baf06d4d81aee405c5683fa4e5e891b58101a27e8f71c60d357a4ab8bd02e12fbbb0e363c4632b0a3c0de638de37448c9476c65a62f7f1dd9643fac6ff78ee431d18ab554b4c8a1984fb5fa0de3464d223f236eb8e8a8f59601221d2ab480ffcefaf4bf6471b40a14773ac0cdb43aea505941e4b0fa6fb26eb091adad77acce41e516fc743e5fdb045f"), - prev_randao: Eth2Digest.fromHex("0xbe44d7c5f844a2acb307a4371784d7742be482aece83368d94813ffa1c7bb60f"), - block_number: 13524449277995212660'u64, - gas_limit: 1, - gas_used: 7976957374052242924'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[57'u8]), - base_fee_per_gas: UInt256.fromHex("0x6c98d9ff36f1032fd55d8a6038d7b1f7c4e5f7c884b73f626fe43e687beeb46d"), - block_hash: Eth2Digest.fromHex("0x2c95101857b07bdda0502741da8cd9160ec0474929d132e9159098576f9a7c35"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[75'u8, 85'u8, 130'u8, 87'u8, 90'u8, 172'u8, 176'u8, 44'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[207'u8, 150'u8, 64'u8, 87'u8, 15'u8, 18'u8, 3'u8, 236'u8, 232'u8, 87'u8, 174'u8, 192'u8, 29'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[23'u8, 37'u8, 57'u8, 158'u8, 137'u8, 222'u8, 53'u8, 111'u8, 63'u8, 13'u8, 69'u8, 110'u8, 175'u8, 108'u8, 16'u8, 207'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 1071093368516669975'u64, validator_index: 15999188653672167093'u64, address: ExecutionAddress.fromHex("0x368b0ae1a6bfc3312460f212017e8bb32aae55bf"), amount: 13132185675616884508'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 1251419977457119333'u64, address: ExecutionAddress.fromHex("0x0a4d18e47c5ec0c639ff29d8f8c9be0b60f00452"), amount: 1'u64.Gwei), - capella.Withdrawal(index: 2046299652899032730'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x44bfe00f98603a5e8363030de4202ba50c7e8138"), amount: 15403504672180847702'u64.Gwei), - ]), - blob_gas_used: 819823383278806839'u64, - excess_blob_gas: 5121347703897393436'u64 - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x190544155dd98bf86d3ed5ee94d01afd3a8e67b8476f94d90604706da0a7d340"), - fee_recipient: ExecutionAddress.fromHex("0x799d176d73d5d6d54d66941ad6cef8208677371c"), - state_root: Eth2Digest.fromHex("0x07e626b9c44b0ff14586d17acf79cb136ccc5d37fd7135da33cec516af168f43"), - receipts_root: Eth2Digest.fromHex("0xb8b100bc5c155fe6358b9a16756ec06880365f5fe89124cf9fea963e26d3770f"), - logs_bloom: BloomLogs.fromHex("0xc314d3d6ab41a3fce7433dc286ee5c9820d883ff572ee7dfd2f4ee745f11a71f6dbe142d8c14bd6cc76782f1bb2b3770e65a929b2187581956bad937907a124c92ba10686763ddc87ba5b4a4e9cf4b9a35255fad5f54b404aeed5ad9859b5f9fd3c137e9eb6ef394a10b8ad3fbba75ba38c2cbfb91fa793ac763e8cd31481fbecef02b3365b990f5120a2970f2779574c60769347ae334a9f39bb3d3ad35182f7dcd252bfe9663c4f54b44dea8d79e3bcd89877231e81a9e9f5c1eaf5da1f56ffc39c23fc3ae6c130281c792a31e7a60115d46abbe17807cd120038631ca7a6636c8c644b57719e386cc8ada32ce806f75110ad143522fb0b240213df4bab07e"), - prev_randao: Eth2Digest.fromHex("0x17e445793c0e354ee43381ded194220ebd87ccbacef83e3da5a1cd3c8c57bf49"), - block_number: 5728529601694960312'u64, - gas_limit: 9410734351409376782'u64, - gas_used: 16470261240710401393'u64, - timestamp: 8811957812590656903'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[95'u8, 124'u8, 151'u8, 79'u8, 76'u8, 171'u8, 74'u8, 213'u8, 207'u8, 202'u8, 63'u8, 2'u8, 182'u8, 32'u8, 115'u8, 65'u8, 90'u8, 186'u8, 34'u8, 63'u8, 241'u8, 191'u8, 88'u8, 10'u8, 197'u8, 52'u8, 33'u8, 98'u8, 78'u8, 210'u8]), - base_fee_per_gas: UInt256.fromHex("0x3c1ba8cf82268c828c1a7f249328741ae21f35a7659365efd7496df94dbb85e9"), - block_hash: Eth2Digest.fromHex("0xc2b2bc39ed0cf5764800d3c91401828ed32d0eea58f9d336c32f9e6f7200ac8d"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 802141'u64, validator_index: 7520769587588158114'u64, address: ExecutionAddress.fromHex("0xce1fcedcc47b22d7e38f76c1cba49c2c20da09eb"), amount: 5845756482608800263'u64.Gwei), - capella.Withdrawal(index: 4169028257817284566'u64, validator_index: 496485'u64, address: ExecutionAddress.fromHex("0xf99805deece4ff418b55557b45060e88035f755a"), amount: 4870783513883486430'u64.Gwei), - capella.Withdrawal(index: 10410265605811982468'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x31e886453fa4e7fcec6ce6094ad22950637d41a1"), amount: 157748'u64.Gwei), - capella.Withdrawal(index: 10622085591419415519'u64, validator_index: 8179967808007927229'u64, address: ExecutionAddress.fromHex("0x03d2493395b71bb181db626a99c24dbc1d07065f"), amount: 18446744073709551615'u64.Gwei), - ]), - blob_gas_used: 14543409578714974146'u64, - excess_blob_gas: 0, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x7ad7353de5ad5fcef75b9e4c275970a4ad4cd5221ac692d5ee7f51d26a35a927f5a67d3540c5d08667772f78284a4987")), - withdrawal_credentials: Eth2Digest.fromHex("0x1320977c1ca99dc4970e49e5d49c5f81fb3bbbf17ccf5b7963c070ac31bb893f"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x42a5b14b6d5018eedf1dc9bb07cd64ae2d25f583ad805d58d89b4c8381db8740fe188a70f1a1d2eb0e486807cefff900f93ebed94fbe2539edddf06f91bf347281f9dcc891db49d6107c2f88d678d32e5e9849a2be7b082919edb769b7c70abf")), - index: 16997402741851403011'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x4bd763bcdfcf9fd2ce667c75408bc1157fa9730a"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xdf62e8946d1457a50ce017fae0c36e5dc5177e642c18b74dd6df192620f8a32bef5f02453f0835583f6082f213df7245"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x86d7b430f69b215ab5ae863998ce41f01a5016376c8bec7f5b7a6e16a2326d92"), - fee_recipient: ExecutionAddress.fromHex("0x73068946d757f5d145a38fe9de817b8b1e9d6c43"), - state_root: Eth2Digest.fromHex("0x312b4af4d3ca5960dda2f99531819f5c32624753cc0756c05d242f65dd605d92"), - receipts_root: Eth2Digest.fromHex("0xf3a1e8f784ee4bdb897d1511ce642276e2ecbc1f21bfde9caf7c4479b7fdf902"), - logs_bloom: BloomLogs.fromHex("0x633d228aa8b2b9f4b614c4b7c7aca616232d61bc6e06ca28f4b94bc39165cf3ca2e090cebbe8a5b66b161d92e65099503327f9f2adae6ec5a73463063a994d73f37e12caec8f6d439be7520b48b25ccfa8ff64e6884b7e240c8dfd0100a23f9f644da13f1628d989eef92806c9f936a71f470d710653355acd84fb23ff15910f1d2866d83b036246c46a681e762b9a19e72aab21b428c4710511d0a39cc5ec39ebf3aecb5c19096ab32135a629abc8cdec39b2b3631bf4e86bbfb824276fd728bef454ed981e5f9e8a4bb96b27f09f661c5c221f63a26945174162496496c9bbf38cd894c50fa69df0a8c722ab48d75044bf43468639ae9b61d0b5a2f9d819eb"), - prev_randao: Eth2Digest.fromHex("0x3a0689ac32c82a6b84d3230fdc6e2c1e89671fa3906336ccde9fb7cfd1811ac8"), - block_number: 9465334901279616671'u64, - gas_limit: 17844363972830076325'u64, - gas_used: 9534663249377184661'u64, - timestamp: 15490999633909732541'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[199'u8]), - base_fee_per_gas: UInt256.fromHex("0x9fc9f32819a67c4aebae259b0648e2b82f526ce8eef8fee33961f9fc69653b2b"), - block_hash: Eth2Digest.fromHex("0x1ac3f16da76520977c5e5d86f0c261d76e18413c202e8a46241951b3a80ca601"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[223'u8, 37'u8, 18'u8, 125'u8, 208'u8, 57'u8, 114'u8, 113'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 181'u8, 143'u8, 219'u8, 145'u8, 77'u8, 39'u8, 126'u8, 173'u8, 30'u8, 59'u8, 70'u8, 205'u8, 51'u8, 16'u8, 213'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 0'u64, validator_index: 7432737887980948854'u64, address: ExecutionAddress.fromHex("0x1a99860ddeecae3195a051bc0a0fcc37d0135e37"), amount: 921585'u64.Gwei), - capella.Withdrawal(index: 8891974894683849035'u64, validator_index: 18060634568259374245'u64, address: ExecutionAddress.fromHex("0x53a6cc4c3996f0181cfe62be861900f56cb75a87"), amount: 235145'u64.Gwei), - capella.Withdrawal(index: 11531749110606308043'u64, validator_index: 9858359378531619375'u64, address: ExecutionAddress.fromHex("0x6b7a4bc00868b077f1c4aa53369e893162bcc384"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 530041'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b7853973d34b1efe7722be5c688589b49c1aaa9"), amount: 18446744073709551615'u64.Gwei), - ]), - blob_gas_used: 9156166815001018661'u64, - excess_blob_gas: 13354810927429053716'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x6ce4fb12127809ce5bee8b8bcd25790df1df55b636f64ac7cf646af8d20e4cf3712a03e55b77f37be494658cc79beecd")), - withdrawal_credentials: Eth2Digest.fromHex("0xf4192de759e26b7fafdb9342168586029f4526dc67ee8b161dab7e057d060176"), - amount: 6209827226225403552'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xa829b6d810883c32466e2bb858bfbce89865f1d3fd71883e4e8b8d7df83c6a18e96e477249a22f0a7b16efd177b982e043f3cce23127c95fdf4e809903a5a906103c25ea6fd36df3f61c3d7feb00ad49937ace39c5ea44767d7f627d25572156")), - index: 6407923788439683512'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5d0d1f7e35e59873d58f7a723c510186deb7f03b3fc0074d1d6ba90f49ccedfe7b262b18c7f362a7ef81acc98437e188")), - withdrawal_credentials: Eth2Digest.fromHex("0x0221b17586adfb32e428829e7c90c7e5d8af40f26534a1e82658d887358de265"), - amount: 3864819260875678713'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xfec65da38278820cfe4168de78631f7b100146cec2d4aa3002ca3a783e81ca95954351666be524ce681e4a5799f6fc47a092baca86727cbb024013415c832f8a45346e30759753c39bc6e5e17d963f7b7483f4bbd3cdaf7707ee5b51448c2516")), - index: 0), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x2ffd86a5a167ed01e994b0b42077e5df2d9703560c6e8d986a8025f28c316ab4f91bcf3d0fb285c66bd9558e32165f8f")), - withdrawal_credentials: Eth2Digest.fromHex("0xf2afb039d649f80905f7b2f37927be964d1c8be69ff51afefb87d597d03cfacb"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x7132e4495443a0542cabf627dd5952ad0e38d000d166045c92b3360835de266511383429cc8980eb54730d8f4ced119e95452d3fc53c8a6f02da22239376356ed9bef153b632b928314835175d493dfb402f4d07ad262e9330baf5f3cef7b000")), - index: 8224197877093273527'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xa6ffac664fa1f64295679cbf163ad8f1716be062460e2a645c87d11368a4119d4138311d45506867c8c75d89aeb905dd")), - withdrawal_credentials: Eth2Digest.fromHex("0x7cb1f70fdb82a4c7b8415df98d90140ec58fa6422b7066b2da2d4bee20d95d65"), - amount: 6485560087895553151'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xbd837ceae239191f7e958fabc91efc7b3830da9814f4d888ec278ed0fbf870e811db948bf81377fd53339db9095f3c71b36de09b6f5b38a18caba6d3e8f337bbcb107380ee3d50058e3d266653860b1c6a9309eb60f142948f53041a07109f4d")), - index: 2237248193846176262'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x614d16bedf5dfe9d06171e3ef50671e66fadfce4"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9f92a4aa0e58f82ff2ec0bbe4aca6d338fd08ffff3213f64bef81148f7dbb163eb25add8ccc540ec0dd1bf9d237e26f9"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x4cff44c8f0353fa6dee31f6c87e4b8c3bcaf1c38"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x3166f8e41daae4a0af1549a00b95ad9280d73e91a882d49c827bc078c88300264e7171cbbf50e3598da77bcdb175a203"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ConsolidationRequest( - source_address: ExecutionAddress.fromHex("0x6a8481544d310f4ab07679dc86cff400e403f789"), - source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5a89a8355effbeee155130234f8cb602f5648a01290f216272d532cf8a6c2996a55875a804012d4dd2217d4f11353b94")), - target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9fe9b12de144e810792b4a82bcbaa538249fd5809df54b5a83f32fc9f290b4ce222575e589d59291cc9c0adc4ccedb8f"))) - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xc51bf481df9be981c6656081e3854ffcf27551e2b4fdaed4ab12b355f247f4e1"), - fee_recipient: ExecutionAddress.fromHex("0xd79098c25eed05c9f6d55e95f5f6f58c1472fb28"), - state_root: Eth2Digest.fromHex("0x1a6b1eb78e5ac155d4be247a3b48d8d8d8574a16fa846681553037629b97ffd0"), - receipts_root: Eth2Digest.fromHex("0x5e44d4a3621cd8e495edc0b208f977c8d3f8e79a78fa7ecfc4a0f6e436f67b71"), - logs_bloom: BloomLogs.fromHex("0xe2b0dcfd2341ceb9c4edbc7115dbd6ed5f1c54ca39bee191fdaaa34368acee93f48561094dd23a3985ea2c2b83d918ba9dc671cde7732a591b4f9abd2eacf9d6416ca8c8d556052a98df2cffdbb086315585004c51c76872a06cee7d318f4845c0ade4c907c7933d4d883bcc586885be04ca9149e05b1624856e69e1efe8c93cd55d840bf71279293a118d51d4391fcbf4e6abe6ee50492ff2de085069a3c7656eb3a749d6bf46f56a2acd93a6840eb78e09a42f23fdea69bfbf017f4fd6b4a8d17df1aa5147c1897fe5fda1f5e79121f2fefef97117e7871d1cbf5b0b0350b9fc497c5aba27cbc129d452d6a60effb76e08b890d0bb856115fcfe3966359fda"), - prev_randao: Eth2Digest.fromHex("0xcd6fd69596cdd7df95e0b68e8ade01541b12ed15caa2b59803a4c4e6791870d4"), - block_number: 12264963829660560313'u64, - gas_limit: 11775806146734810959'u64, - gas_used: 1863395589678049593'u64, - timestamp: 5625804670695895441'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[183'u8]), - base_fee_per_gas: UInt256.fromHex("0x1443705192ff4dc1a819be4f22b8dcd6e7802337e62082880b1090f44a27d0e2"), - block_hash: Eth2Digest.fromHex("0x68da52444eb5322f3a0bda6bdc9a3a11a540dbd22026bb2d24862bbc32af9460"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[212'u8, 80'u8, 176'u8, 133'u8, 132'u8, 119'u8, 233'u8, 131'u8, 195'u8, 118'u8, 54'u8, 94'u8, 129'u8, 206'u8, 47'u8, 107'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 31'u8, 192'u8, 94'u8, 136'u8, 120'u8, 228'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[114'u8, 23'u8, 239'u8, 220'u8, 169'u8, 188'u8, 213'u8, 179'u8, 223'u8, 129'u8, 189'u8, 50'u8, 158'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 109465'u64, address: ExecutionAddress.fromHex("0x30376c1737df493e34318acb7efa0aadd3d78738"), amount: 419309'u64.Gwei), - capella.Withdrawal(index: 3744271566165938073'u64, validator_index: 162930'u64, address: ExecutionAddress.fromHex("0x9a3eee4729cf5ef57a1c4aeb474636461991270a"), amount: 9043308530560640624'u64.Gwei), - capella.Withdrawal(index: 10893292846301120513'u64, validator_index: 15952780188276928656'u64, address: ExecutionAddress.fromHex("0xfccc1279aa3dde74ea08b699fecb4481c777f259"), amount: 5614376920521492084'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 2895353066704396409'u64, address: ExecutionAddress.fromHex("0x7e8b34a029236dc0d15db19153165d1eccab05a8"), amount: 3749025806369957542'u64.Gwei), - ]), - blob_gas_used: 0, - excess_blob_gas: 1597862542620394734'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x324b63f48d1a5e1b0858799c200e774326b0487e3037f048d20462065e42065d189b1419b018b06becdeb7ed46eacec6")), - withdrawal_credentials: Eth2Digest.fromHex("0x98b06ec79f8c27a94d13de9774ef0e8756a08650654771aee335ac0c4f14a36b"), - amount: 5951406920150253456'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x3cffce51a48cb97b5ddc300c82cecad819bf8d7220e95785908969adc2fe81a4c54ca561b751f8f8afc987bc232b75c3fc590368b51433370bad030aadb7a9f7e5975aada8f6c8f8954fcde7892af4f957daf88b544594d1094ab10072e2efd0")), - index: 6209810282279082517'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd40cedb2ee345c1106a11b9df2b99b7bf6c87172052a084b7f51424b0eb5cff3b9de788124974d89ce20bcc41d12a3f0")), - withdrawal_credentials: Eth2Digest.fromHex("0xa31f86305d23a833cbc2f0ab5bb3d7eec6418ca06e2bd16368cdfd849b43a592"), - amount: 6087805632659367228'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x7a4df2b27bded4e1cc2e20120e70f576e9991369d77dfad54186d3067416bfe1f7cb7a1021a9c0722370680367fe4c12e571902c2f4ce4c2754a4738c10ead67b1d9a1a82b2ecd4ce3b6567c87e0066c979664bf79025851cd9583c5ed2f7c2f")), - index: 4361690020859323832'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x9c2b1570328c29ef47c715cd021aead97695741e"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x6d3da7dd6f61e0818830bf11df8c91af8be664041d8832ca48b0c90566963acaa54695da7fb9ae2904d1aa0d7de5dcbd"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xf3fff390ae583278167deb91dba09b4ba089acaf"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xaeaef2b0928efd727bab75c3859118681492d7aaa0ceb7cb0897e21d4689ce7a6a9306850b2dbd801cb3ec165bb97d68"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x9a89ea1df940046760d3a84e134ea525a05a91fd"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x7afe11eec6aa2da5eb2bb7f9c6f2329ef9b9c17cd2f2ea35fee5e4169bc4e26c73c30cbbde16cbe4ae2351266454c31f"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xf77580ffa7329925db0934de5f3667b1a32effd1"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x3f5026c08a653bb8cc9f46a5cb1c35200c43efb6c44f729b48d12400828f5029fdc88f4672f1f9393d7d764ba3599bf1"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xc61710d4969b77326cfe3ee23b65023c23e8789e"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb2952e0f7d6581c3032f95f4908bf76f6df8d7e866b7b67996254597ef73ce9a15dac375b78a3456d4f7f156af2b5ed5"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x8b3e7e8d447527b9d00693389928260e7ea9da6855efd99369182bd9c213988a"), - fee_recipient: ExecutionAddress.fromHex("0xb45716c9aeddeb030c0b94202fcb97bd75a039b6"), - state_root: Eth2Digest.fromHex("0x8114b285e5f3277c04a66e660fef3b86295d6ca859dfa216df3309c0a7242f2d"), - receipts_root: Eth2Digest.fromHex("0x2a3ff38541ef83faad176c3c98ceb5c55622dec83fbfc5a19bdb27646849e852"), - logs_bloom: BloomLogs.fromHex("0x384a9b3d38d343af68d00c229e79aa31f2059e17c655f5e48d31d2b59b769660e91c1e5f386e4f7dc83f2570029a6f2b3351623fcb4dadd6b5b7b26e27de19e248ebd970a9678b69403ea8e16fe88562959586fcfdee3c407fcf623c94891a2270ba1829bf2ab77fa32913bb11c8a4a69e9baa6544ad336253637626b16d4a98884e7ac7d6c1e697a9435b1e5403b5122eebddec9c03c8a6c8fed0d8877888371e133fb837d33f073375f7e1536abf622610734b9b0aced8a891f02d5b35734e58b0ead66c49ed9f898b8f27e9415275c5d15051ec00cb006f8aef702a7414aefacfa9742cd3d8d34be817e0c731696e20b973cf2da66799121c0c6d12bc835d"), - prev_randao: Eth2Digest.fromHex("0x3bd54c7151dae2ad524b4df0d4283e3641ba787fc76f54221dba3a2aa556a1bb"), - block_number: 18446744073709551615'u64, - gas_limit: 637978774023867007'u64, - gas_used: 15110835166938431016'u64, - timestamp: 18065456863038184935'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[235'u8, 229'u8, 162'u8, 249'u8, 154'u8, 135'u8]), - base_fee_per_gas: UInt256.fromHex("0xbe93cc3dc2bb7e012db659df49e57653bf6ff21354c64eeb69c0002e9f933035"), - block_hash: Eth2Digest.fromHex("0x46cb3f590b2fbce372e67968a0d2ff4ce1b2c530fcc26b7a24ed6db054f52035"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 66'u8, 215'u8, 40'u8, 223'u8, 195'u8, 43'u8, 228'u8, 225'u8, 244'u8, 34'u8, 14'u8, 117'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[92'u8, 46'u8, 215'u8, 218'u8, 71'u8, 99'u8, 115'u8, 119'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), - blob_gas_used: 1, - excess_blob_gas: 1, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xe4bed2d5de111ca1d0a77bf6006c09ced6c6cc89"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x814d7cd0b6d428414fa787584e1eb52a5f215b8f0e7792499365f465ac43f5696e8d18ab579568c348f6dde75c189301"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x95137ca91b36a9a753441d911bdf91677931615c"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x0e223fadbfa2985e293f13e083bbe22a9a208d0e9f37fd99d24be92b3e329d77f1d40d61b891e2bdfed12ca746eeec50"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ConsolidationRequest( - source_address: ExecutionAddress.fromHex("0xbcd0cbd6a0bf406f2af8b28c0d7509f80bc020ae"), - source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd51d34ca13ca3ae5c9f2821414457e0a0e19ac03057e84371954b0f20d4e834997d9592c9e5c3b548097a2497fa4b230")), - target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x097c5ccdf7e60c886c2fced51dedd5be62f20aed504898cb89e215d655bd5cc450a2219b805717497c978c1fabd7faa0"))) - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xa4854e346d2e9a921cc6b3c4ce9fc739c99795cf10002924089f9886f8624d59"), - fee_recipient: ExecutionAddress.fromHex("0xa88781cf69a1eed63bcc3a32b6f9aba35d4f5b5e"), - state_root: Eth2Digest.fromHex("0xdc06d9210fd2738b0fa9df6d68e4ffbfef0dd7d7d8093fdbcd97ff845318cf6b"), - receipts_root: Eth2Digest.fromHex("0xfe1b70c143066edc444f9b49e778cf6db0060bd4e9122564350cf23061830439"), - logs_bloom: BloomLogs.fromHex("0x095a57c3f2d97aad8692cd09dfdd8388f1bf9ef98a1c3223ecfd0aed17d8c7c3ef593d7f09ba86500644deaa676df811da501d572f342e3f7ee7b9b081992f344f71fa50b3b9635d7375f67dbd85a0b1ade3d8d4778118df55b90c44f7dd1114f2ebcea5778b32701ef94af9b3713d1fe00275e09c7e918d7c529a37aa9de3464eb6364812ec486464ccbf7df2523369fdeb1b28955e35e8685c16f07fbe342edd1bc044021ed480bf4ceffefb13eaf4550c67ef8a5079f3f612f07fff60193eda6ac11d39f3056c41ea4355ef5ef7f311493c415cc8c42cb30a73dd58098262acebe6d901e4bae26b6e1eba693c7dc596ea27b0cdd4fee2f6450ca8b50b1a70"), - prev_randao: Eth2Digest.fromHex("0xc52844ad11072faa2222ffe9cbff77dcc7f681367d2aef5f1c3b206140064195"), - block_number: 767785029239287422'u64, - gas_limit: 15062566578072747104'u64, - gas_used: 7648884410596067087'u64, - timestamp: 4380084205540210041'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[217'u8, 40'u8, 125'u8, 94'u8, 156'u8, 71'u8, 79'u8, 66'u8, 117'u8, 228'u8, 173'u8, 189'u8, 115'u8, 41'u8, 153'u8, 226'u8, 130'u8, 21'u8, 108'u8, 194'u8, 206'u8, 218'u8, 141'u8]), - base_fee_per_gas: UInt256.fromHex("0x436767990abff9288346859c6b85b8a972421619eab2253483385c8151cb2016"), - block_hash: Eth2Digest.fromHex("0xca4f05c33836d82aee8230ef660016b993bca4aaf9a7b6cad96c2a0193eb026c"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[156'u8, 143'u8, 203'u8, 250'u8, 238'u8, 137'u8, 34'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[64'u8, 44'u8, 165'u8, 9'u8, 1'u8, 211'u8, 27'u8, 108'u8, 166'u8, 61'u8, 119'u8, 11'u8, 222'u8, 85'u8, 48'u8, 185'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[165'u8, 95'u8, 221'u8, 213'u8, 229'u8, 134'u8, 185'u8, 221'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 373208'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1ef66a8127bdbf1302c13af1b2a3fde17f1e421e"), amount: 12972917955689502470'u64.Gwei), - capella.Withdrawal(index: 7007268656739027478'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xca30e17b5a7925b1a5afa06710d6cffb4681d2fb"), amount: 13141021224557402822'u64.Gwei), - capella.Withdrawal(index: 10730268187610256048'u64, validator_index: 7483561449283560970'u64, address: ExecutionAddress.fromHex("0x84e755db228c9399912364a239227c467477e076"), amount: 16091384671148001130'u64.Gwei), - capella.Withdrawal(index: 861292'u64, validator_index: 101133'u64, address: ExecutionAddress.fromHex("0x70e7126e6288dd8559b6bf8946b98fe02bc53e8f"), amount: 5439105246644982514'u64.Gwei), - ]), - blob_gas_used: 2533380168586417970'u64, - excess_blob_gas: 307516487526704997'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x4dfd0237e85c7fa842fe25ed710e4b9394731e38a27f2adaf03f7c15c0478917d31d93b7acab73f6af454e86dd24b99c")), - withdrawal_credentials: Eth2Digest.fromHex("0x6cacb6bd39183416e6bbef6f4725e4b1ddff84fe80f4630183f2cbed9a23e135"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xe7c07da5cb5f8fda5223db042db39643418920beba7e66d1e3bcc3ba6e80170a6846caa6d67a544b3863f57eadae7d86d09d3767a20d1568b4796b32288156dda21a6ee036a47b51a806d2c27724e7ee4f974bf03116b85184a8f41c53f068f6")), - index: 0), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x7fe03a03b1e91c134ebbcf8d3f80cb282b2f8f06659e80681aeba55b08353fd4306f6ee71be7c1f3e64df0d3ca945a15")), - withdrawal_credentials: Eth2Digest.fromHex("0x656c24211a240b215d2a7d97a5410fe7a182e34b255e11627d03c51fb9e5c3b1"), - amount: 14255636113874187022'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x8e0886f9bd55885f102852f38c980d2bd9304fab0fddc803f4233251e4c5ce891fbd53d8079dfccdb67dfd7f713fcab0c4f9e10a6cf5cdaeaf9195827b6579d36b8822e24631c1c9022d27f99cf414396f3c889e2e24d58d547d79c27291e724")), - index: 12470930277850569937'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x629474c4e5a9d1ffc7507e388d86eed83cf0762eb404ddb5860bf575ef4f6a7ff3dce8a63a09375e3a9a5a49fbc6fb72")), - withdrawal_credentials: Eth2Digest.fromHex("0x48c7a56b506f4838f3dafa9ba67e43a3aa2b681faa6b573ea68acdf55679f15e"), - amount: 14112283334180796705'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xc614759dcdc309a46d9f24ae6b2840625bc5ddecd802c2907f9141d9091966e3367d78b3963717877a6110d741f40b45486acd32ac0e7bf1b4c36e681411570a7d1156dda127c1c5e5c6011ff857222ea51086016c01346e6cd2c8764bc7e7f4")), - index: 9892892756897161299'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x9892501906b7abf06fdb6893b8e1767884bc17f5"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x30099e0ee2adf0d51a0a96d10fd2fd5cf6f17cdb4b4ea88b5a0e205bd10d40319595e0403891aaa1bac82b980ef76f23"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x5e7b12465e0461e5dfa59a3254282378c55961b0e411023ce89d968bbdc33e9c"), - fee_recipient: ExecutionAddress.fromHex("0xbd1a1396ab49631cc933770944996b294da97d43"), - state_root: Eth2Digest.fromHex("0x74e6ccfb15da8afb94eebf28cb3ba3f9ce63e3354097f2f2527fe1cf978e76bf"), - receipts_root: Eth2Digest.fromHex("0x8e48bee56e149d1851cff0740ceab06767bd0e819261c5a2f75dbea382a110b6"), - logs_bloom: BloomLogs.fromHex("0x7894fbe58c624a153dbb160c516c9e82bd0cacf5f347f984efcca9450e9a20b50e058ed38e41c331df61114086f8a6b8a049467d7dafd812953aa593b2e9fbc056f0dba80973b2eaae8814b5e0804300eeea15613e59c8d34339f58e1b45599361497a3608c05140cf432e7983a30985aa0faf45dff56dce99eaa5ad3418722df17eaaa4e8df25ed1d9eedee1390e6440c4c37675182dcc07ff199d6dd015d3aa03194765e85fc0d4759d3c693fc2550e50835b88ba41d10fc33b58550d813abaa75bab39c0fbe419f1bde8fb82db9fcfb79894faeed84b2314f115a8fb9e276315ccbfb8e9650571add358f594ff2fb4ab9661afde76081bb2cfbfd2f26d212"), - prev_randao: Eth2Digest.fromHex("0xb9a9bce05e42cf3d2ffc2c2ea95164c9b215fc8e440dd2985ca24cff40e32780"), - block_number: 14460352585391846826'u64, - gas_limit: 2426408612341958329'u64, - gas_used: 13656152006197676019'u64, - timestamp: 6263571560389404595'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[177'u8, 36'u8, 79'u8, 26'u8, 164'u8, 59'u8, 182'u8, 88'u8, 223'u8, 22'u8, 79'u8, 197'u8, 109'u8, 53'u8, 53'u8, 134'u8, 244'u8, 84'u8, 146'u8, 158'u8, 234'u8, 252'u8, 188'u8, 175'u8, 69'u8, 51'u8, 118'u8, 101'u8, 242'u8, 0'u8, 51'u8, 103'u8]), - base_fee_per_gas: UInt256.fromHex("0x997e6c8ffbd1ea95e875612109843c6cdfd0c6bcaffa1e06ba303b3012b3c371"), - block_hash: Eth2Digest.fromHex("0x9a7f83cf6a64e153fc3316244fabd972a49ebf5dfb173d7e611bf3447a175c41"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 103'u8, 164'u8, 112'u8, 136'u8, 91'u8, 170'u8, 241'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 12452742873210027116'u64, validator_index: 163643'u64, address: ExecutionAddress.fromHex("0x5d09dd69d2b2370e11b21d758bc82c2a73ee00d0"), amount: 12246034467900494037'u64.Gwei), - capella.Withdrawal(index: 256915780184525584'u64, validator_index: 364410'u64, address: ExecutionAddress.fromHex("0x40a55ad4a156caf112e2abe789554520814e48a1"), amount: 297315'u64.Gwei), - ]), - blob_gas_used: 3541847679255581458'u64, - excess_blob_gas: 1, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x0040411f8a57799b620765d6125d09ab8aac3074bd7ad75c4c02c99e819e63ff37882940702644921ef7509d48e45c4c")), - withdrawal_credentials: Eth2Digest.fromHex("0xf601917dad8bf2e472ad4da2affd60b710264fb1802aacbe796acbae3bc26930"), - amount: 3582020308334691622'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x811ffff27712770001d25199c5f1689ef102362da9a617fe7a9db13b50949c705defad17795f52d4db786e80ee3b963b402f5cbd4772bbca81893a104f091a2b11f025287250200fdcee4ad1fc20d24cee626d89c5d05360e9d19e94c8e129d2")), - index: 9118657603155344378'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xeec8485a98937b5c18d52d02e8e52ef6a72ca2d0fccc367816789d49b9596e1814b63a3efbc4faf11349f360abbdb046")), - withdrawal_credentials: Eth2Digest.fromHex("0x557778b1a01594a2fc0bc05835de388ff3c141bd3141820c286fe114ad14e80d"), - amount: 5881642850443225888'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x967057d2edd3b53ae9fb665fe668ab2319403b4f8e4620064b11f0933f9def18d952cae5f50395ffd1a8e8554604d95371b7643386df808a18c913e186a7a915e5a5c65908dd6668f2c0d02e404eb88d3499c096967e93b791d814429caae9a2")), - index: 7603599240231509693'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xa8f90a617f1f230506d200c6026bd60e38f599930ed04f90cdc320a6d45bb022"), - fee_recipient: ExecutionAddress.fromHex("0x3531157eaf2c185bd8720f3edfaf76829632f07d"), - state_root: Eth2Digest.fromHex("0xa16f8936e945ecd45a4ae107e46acd8530e438fa1bc8eb85aef62afaca1656da"), - receipts_root: Eth2Digest.fromHex("0x3e76522c8f3b7e8d8a63f4968ab15413b8bbd7af9782c4878b52213b0b3d13f8"), - logs_bloom: BloomLogs.fromHex("0xc13b59de763feaa39debf70d280364ec68eb578af8a90aba7e2cf3a6cee413a28836c674662a0283df8ff04964eb928de97a3883226950b584d773c9b4479d6d5bda6fd71951c0c846752ed688e13dccff947b7a6c81bfac198b6bf785bca7be28bcf9a208b983afe6e766b0536311c1c12b4d01c712cdaa167ecec5520395068b1c1f939d20962de1aba36454cdb36031fa0ba886a8ece71234654e8b081562452046a388ebcf3cfd975493833ff4e146d5e5ddb061d994461ab8b468cf1d6d491d78fd8923f9f6563e3fbfa72639de993701ff6214fd83cd3597e870dec1c1e788a4f01f881c48e57b07c5a217132658208d2221a86c7e9823159984d235b5"), - prev_randao: Eth2Digest.fromHex("0xbac4a9aa16b289584d13abe3c47a58dda713c4b479ee70e1ac7b3b698e8505af"), - block_number: 4839752353493107669'u64, - gas_limit: 4713453319947764960'u64, - gas_used: 3470256075652600568'u64, - timestamp: 13764471837770950237'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[60'u8, 109'u8, 153'u8, 55'u8, 17'u8, 196'u8, 17'u8, 96'u8, 202'u8, 173'u8, 16'u8, 189'u8, 165'u8, 107'u8, 68'u8, 230'u8, 238'u8, 62'u8, 199'u8, 211'u8, 244'u8, 83'u8, 88'u8]), - base_fee_per_gas: UInt256.fromHex("0x3adad83f48e34c6220dce41ecc0b09f9bb1ae4bda4466935c70e7c6cd54e185e"), - block_hash: Eth2Digest.fromHex("0x9183524f908425608c1e3a80d7c4ac2c539903af4b3a2f1b22c3283281706aba"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 645596'u64, validator_index: 248698'u64, address: ExecutionAddress.fromHex("0x124e32ea8d0363647a58a5511b6de35bdd50236e"), amount: 18446744073709551615'u64.Gwei), - ]), - blob_gas_used: 3410596457491766161'u64, - excess_blob_gas: 0, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xea1c8a68747bf78cf13fc0035612547fa9b98da285369c234822eea879ad1c86c5c7d5516db5ca374acc023a21ce0477")), - withdrawal_credentials: Eth2Digest.fromHex("0x6cc96c66ac799953125c24b4311e703728b294ca302ec0dfe5e82fcbfe3636ea"), - amount: 10141350867210496320'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xd6a92f4de599923ba4955c360b2cd54bd544e2b75947127fefa9ec08f5e53cf02bf398b63a0420226dd356fc5d50683eaead8a5aa8a6d4fdbe62296506c813e5e02a2513b6457c1ca408e1189fba32e80d74c48e389f62c7b0b0ff3c1881ec55")), - index: 14462442824619447645'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xf55f4b626328f2b7a725d8a3f8485072eebf7f6e"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x3eb1812d045ff1d2f7d96f919c41230db2993ed8194de6ba564fad54047e3b45fb925e5216cc47f69e184a4e2c45ce39"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xc914f63464f3f1588a32d3751900d415bbf1fe002c42068650f5c7c588b1935c"), - fee_recipient: ExecutionAddress.fromHex("0x61523b6add59cc65d3c5b75c6f749fa601e157de"), - state_root: Eth2Digest.fromHex("0xe84ecb995f6c7e753355c8d2e24694441c528b65ef9b1d8c6f4e9d98d409342b"), - receipts_root: Eth2Digest.fromHex("0x887bdafa340c24acb58f36a7e3825ce39fb7e0caaba3a9b63f78d2186cc6994a"), - logs_bloom: BloomLogs.fromHex("0x1fbd358ad7e32eefe4489b6c72bafcf6dbac109970e5c103e329279cede3619faf1309faf266ba155496c19565b31562f31539c98b6256919d8950bb6eca937401d91fa5b3032b4400ce6dd60a8c1c6cc94331b7e78d7a350ebb5d6e04a2594af981f167a89227c7c902dbb8eac3d7b54177d85214a6ef57b50da82b6420cf914fd63171f0b7dff9233bfaa2069774b142a136c5183ed4f57cde2590735b19ef549ff5bc910477b98344e7557ffc440b03d56842f356a6e223fd052c6272e24f43dc9e64055c097d81b56ecfd6087238602a743e09c383ad4eae6ef449570febdfebfefa347f06f480f319ff06365bbfae16b62a950143f9acc3663510356f0c"), - prev_randao: Eth2Digest.fromHex("0xc755584f86084ab2e62bd58f25dfe54538c0171e6447e7e1a51cf05db94377da"), - block_number: 9276126375553452674'u64, - gas_limit: 9007257403963034102'u64, - gas_used: 12806310385580231715'u64, - timestamp: 9957937708118639445'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xe2df33500d1162994934e9fa65fd5db641b0be2b61a6c302c7b9019f86042338"), - block_hash: Eth2Digest.fromHex("0xce58ef51926a6eb4cf2997c4ec771b54907737ae8fe9522fc316c97a1c7ee6d7"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 16986670237072862757'u64, validator_index: 701065'u64, address: ExecutionAddress.fromHex("0x50371592a27339f868b9ef63f6c02e8c1e72ce94"), amount: 3561319411833205205'u64.Gwei), - capella.Withdrawal(index: 2402770018709110103'u64, validator_index: 798632'u64, address: ExecutionAddress.fromHex("0x9d42c6c10cbc0b04e3f2e74f63c777802d4ca064"), amount: 898967'u64.Gwei), - capella.Withdrawal(index: 944680'u64, validator_index: 507423'u64, address: ExecutionAddress.fromHex("0x640d578aeed6b8a9acc83f13343f3139fe8f4a15"), amount: 941781'u64.Gwei), - ]), - blob_gas_used: 15366131400223670470'u64, - excess_blob_gas: 13352270791962864689'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x1e9d9b4c3b9ade4b4835d9ca67aab333ec3019b775960c734627ced08ff62080f47879339cdec66a6e3c6c54adcf5004")), - withdrawal_credentials: Eth2Digest.fromHex("0xfae4f9dfdeea6379f5623d452670c431331e5cff819bd1f3d1cb24f5f34135fd"), - amount: 18192096631954481393'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x0c8407a90cf206e5233d3c702e23dfeb2238ce281cf00764fdfb3d12708babd45d21767373a0c57231f20d2479cc0fcd88b58547c0281e76584f709b1afe4ef4bb0b65db3a3bf9f87e1e11fea88caf23b4ac9d9b84efdfae174628bdea84c7e0")), - index: 11885726942708777117'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5ffc8c61c4ea561e6de463b54a9b09d9d467fb3db6149c40e5f0006c1840e605bd26b92414e61041c6c9f7527920d346")), - withdrawal_credentials: Eth2Digest.fromHex("0x77e707557d73e53cc2ca694428e99b2acb9e56cfe0f55afa5e58772a533e9e61"), - amount: 699724654155768223'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x597938ce07c7c767bf0ac21bbdb56e9696db13044da930cf916b01648db8ec1ef4a989e483b79a381c2de2cd42a5a01ba96df21cbf71107330eb23e5de99797ddec2044c83576a7567238230d8fe19f421986761615c6ce1cb66502911c65e56")), - index: 2345813180163742962'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd8ac112850aa690da757eac4bd7726d222e04c48e22ded62e24880fa4419948cbf5a2325fe3e1bcee205f733a308a39b")), - withdrawal_credentials: Eth2Digest.fromHex("0xb796c0757bcc940a422de5d3f8fc4aa130f7c9db954846330a23dc021bea4b61"), - amount: 15859650167034453942'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x2f470357ded569d4fe968b5da6619cbeb414271e71ec7abc8e0e6c7c962b1932934bef085f682bc6af358670bdaf80572dd4ee3fdf80711e60205868aad5859971a858f30eaeee2883bad62b5c4e6ada3ea38ae1ab516f294a16b18c099fa760")), - index: 3956355178667798015'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x98410af351e5be94f9d37f7cc9f97a85e9bd0dad"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd96132438444f4582e21aaa4950d907a84d56f5edaf5d4262439210d6b6aae00ef67d15caa1e95040484b977ba677f31"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xe640e25259ffe5aa8b481e98684b41a14f3d2192"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xfb8bad5edefcf4a76157dd4df48c345b10966ebe21c5265519a3d166ee6f43b92bc67707a7bcc478c05cb5d5aaa5e217"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x6544a67710ed5b8466aea7bb74de9e275c7a7338"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xae821baad66de4d33dc8a8ea9088ab97cce0be2f1be1243c3c640377fd57f3f7389087ace339f953d52372d198300f8c"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x48f380f0b267ceec6fbe39f80b7108991acf97b5"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x2c9a9040e72e095e347f8ba9ad33947a1ec5ffddaa2e86a112fd73c30af209625f1bf19eb7b4fcee28409707679781d1"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x04fb4574aa211ef818aa9c13135f20f4694b8ce3"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x8d381b3ee22253692bd5861ede4c0d62cb2f6c90df6afd180831ec183ac3f8bcccbbfb5fa1f3ee38d5c3871ca8e28ba3"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ConsolidationRequest( - source_address: ExecutionAddress.fromHex("0x459b669c12e0acba7faa0ba7e6233644ee3d6b80"), - source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x6d00f156d7db5c9f2a0f1dd38917c5a0062f7ed54436f35e6e363e5db15ea60434482236614e41e37a25b0fcaf19ea5c")), - target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xc13b30ba7af6c7be66f9af3bf6c6b837a54eb67a88ca19b156285327da4ad7a24205356a862bb7805ccae30f78b2bcc9"))) - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x086322b79160568c7d096747ef351338ddc93f252dab1df3ef65aaf24723d2c3"), - fee_recipient: ExecutionAddress.fromHex("0x03c6998b5a3ff1c98538c2333d279f2b1cc59f7f"), - state_root: Eth2Digest.fromHex("0x446d99a7e9fd2c327fbd445dbfb3b3e3a895cdfa6f208496dd09c0f84f7ac0fd"), - receipts_root: Eth2Digest.fromHex("0xf4c74d5c59c46f1d9f916b32d8a12939cc2a379bae83153137de76415f6e5afe"), - logs_bloom: BloomLogs.fromHex("0x40f87c3729ba599c3e9bb749c48148ee0d5563db71cf0daaad3af95c45622d7b2a64204157a92a93cf0ffbe0052fb79eef83ba8389fe9d9e7646874b0636960e4eee86eeca00ba70f65b2046620264b795852def9beebb671f841e19ce07934b7c2f66301cc3c7dfa2606067cdeb04a564b87e56ff3650c7c6bbbc96b2de5ccf8e314ae74a26347371c315062532a1f1a2fe0c417ed5d12b6f81c3440c0d8b19d0cf8a030be83ee7ada6046d75098b6ee66664ead786a65ef5cdcb33c4634aa07cd7490abc0ea9ce722423a0cba1aecb379552e89483de43dd321cdaa8a005ab7e8e2a958038ca12e2b08709348a7f6daf34c488add1a0a21aed0da0b64251f9"), - prev_randao: Eth2Digest.fromHex("0x2ff08bd0b22bae8c3627f61b8da627fc367b3a60f93dbe48de1ca6f25ada489b"), - block_number: 10605470807350562909'u64, - gas_limit: 587854351728657338'u64, - gas_used: 8799032544585725320'u64, - timestamp: 18028498231539883963'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xfbe348f0c77be2ddbd3ec038e3aad88107625dc6e96b1fb3bbfdba8c737a3d7e"), - block_hash: Eth2Digest.fromHex("0xc545e833aa2ee5d708e041f4dcb44bda654372b3f5f660c683d12230303da729"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[89'u8, 59'u8, 131'u8, 146'u8, 186'u8, 180'u8, 208'u8, 76'u8, 69'u8, 40'u8, 29'u8, 211'u8, 97'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[208'u8, 136'u8, 157'u8, 0'u8, 120'u8, 231'u8, 99'u8, 33'u8, 31'u8, 210'u8, 80'u8, 203'u8, 24'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 225873861246030158'u64, validator_index: 3132710425326779052'u64, address: ExecutionAddress.fromHex("0x4d2573288e7949201c806877449e441801ba62c5"), amount: 9096383177302198854'u64.Gwei), - capella.Withdrawal(index: 2816791477401799195'u64, validator_index: 12199871733060832130'u64, address: ExecutionAddress.fromHex("0xd4e21e668d5e8b1c097cb250dc862bfd7f8a2b76"), amount: 7278220627858832735'u64.Gwei), - capella.Withdrawal(index: 12003547154719720523'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xe888b3288bfaf8f979c93699cbabef6c1f156f19"), amount: 18446744073709551615'u64.Gwei), - ]), - blob_gas_used: 0, - excess_blob_gas: 1233408100755176706'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x16c6ba72f97bd60af3008e747aa0045eace969dd"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x79b68340894f69a82de6d6ac26b6cffd1f84be9008f7cec5a8f740c5dcd73103e50366cb45ec0c2a0984b37597011784"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xf950853d752ff1e8dfd3ffb9bdb504e851361060"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9924a9bf1759d436f9dcc185cdb646d06af53ddf9e86351b69bda506eaaf4b47739a0737ebfcb7d734d33237eb77983c"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x7ef709dcc026c545a1707a4161948637f4c1afce"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xfe1b2e2cd818d436f9cfd7ad7e9efb8e8940bff9ac2c5094793d26f9a50f76436e25b40d375d7b9d461ac7fac81887d3"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x1e6d99ec506e2b79322f77283f3e18dfc0561346"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x25931e58a52265a5a90f7004706cd736fdb762d50aff67039d5e0242039dfc49fd6670e6f4cf62639d7debe3efe5298b"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xcfba7f4aa4ff01d3d9de84dbe1761c79627a10c3188fb0a7c8adfa0d489e6441"), - fee_recipient: ExecutionAddress.fromHex("0x106b3bcaae4ff58dd837768be35c29c48571e4a4"), - state_root: Eth2Digest.fromHex("0xe6242399020361e70cb6b89701001fa8326251e6bae3b4ca1978eded8831d9a7"), - receipts_root: Eth2Digest.fromHex("0x3db0f9a05cc39be94414c3be28378d2b91ba3ff43ea2ea7e4e0a1874a0983f58"), - logs_bloom: BloomLogs.fromHex("0xd591169a3cc38e0837a76c4d7057f94c1ef08ad5af1778b1b06c3a0ec85201bfc659b18c49de831ce6b4a40f0d2800a9cc9001f74810c58473f9b973b720f84626cc9270b0428439b985043f5d9c3289ef8a794f5b8265e10e9fb9fa53a93887d270b8204f8f16cd968e295b0a06aa70e9f6f174733d251f3bfc644a7fb274b0138729f18c0e4382bd4bf0387870f633ed897a125ca854120c2885194f3180af4b62760db96da51f88ae1cd222f49b00fbbc1544eb0e98cea67e36368816f541723158d3691f3cf1509c65a51a8e68efb66c500dd6516ca1b02aeb4e0c13cf5bbead53672fb5a7a1863c8edfaf4eb9a4b4322a39d8643528bccf22493914fa01"), - prev_randao: Eth2Digest.fromHex("0x14fec0a1edb9c82dc9aa7fb7224791c51a3937e74e5da59646123867496460f2"), - block_number: 6272046003849350913'u64, - gas_limit: 15423951135645467684'u64, - gas_used: 3743939155619454195'u64, - timestamp: 8496536260448579184'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[152'u8]), - base_fee_per_gas: UInt256.fromHex("0xd8b104041bdc4c76a9735e2b4b45f0f3612e8962f672aaf511f06a94b48562c8"), - block_hash: Eth2Digest.fromHex("0x8ca67fec04b7e3bc5a01f5bb265b93b4488b58ec2ac7f2c3ced030311de2762e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[152'u8, 232'u8, 136'u8, 228'u8, 253'u8, 248'u8, 85'u8, 92'u8, 103'u8, 38'u8, 106'u8, 166'u8, 148'u8, 8'u8, 37'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[58'u8, 215'u8, 97'u8, 99'u8, 152'u8, 126'u8, 14'u8, 252'u8, 64'u8, 87'u8, 242'u8, 60'u8, 210'u8, 217'u8, 75'u8, 189'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 18405055677765556765'u64, validator_index: 13513833286292305941'u64, address: ExecutionAddress.fromHex("0xfe53af2bf3560b2157a683a545d4f898354f4d55"), amount: 911502'u64.Gwei), - ]), - blob_gas_used: 11215270247452431947'u64, - excess_blob_gas: 0, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x44142d2fd3abda9800ef805779e63c7ea88068f2b2509a92a2e05f61e0fc9ad1c2272e96db6ae6fdee235dff74917afe")), - withdrawal_credentials: Eth2Digest.fromHex("0x65d4629f775514b46c0e413f9bf42f52cdf46f75a2a2b7b22e2a2a6b635adee4"), - amount: 18375333628189344873'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x436fa460d6fce0b4df72719d42d3d7e992585fb95c573868478c2ea343af6755c702fa84cd5bd6d237688d6905261c52f9d45ae52acdfe95b6de2e34127df773fb0d32d231f138dfdc3c3837f68ba77e7586f64aa5dc45c2eb0d44a61fcb29df")), - index: 11602205279250285026'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb5ca0fc53760118a8c10c994d885d409fb93f07196f7a8bad868d5b2275f925db9119903e180d1b76b4aebe2ec2bd1d7")), - withdrawal_credentials: Eth2Digest.fromHex("0x7de076e071a5916c3c122a22fc9853b6c31712c7ddfe128216bd5d87784cc008"), - amount: 8755851176211479347'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x0b7a4a77b5554a3be5f9338c31158e9f0b0b5fc95e9ef176ca38183ceb3aaf214711af03ecf194091cbc99a11aa7a376d721b3c1e27e71447828326ee811a07f4680c5a73fb52106bfe9b66eadd40cf80f027f0db90e41c77c78552edaccf295")), - index: 659556622372086172'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xa80127ae927ef2fc72e527bee414d2a899e1050f"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x463d04b11a5f2b3a5ff5d93f7c20acb46b06d8a434d9dcbbcde024be06f50b6542ebca1a759d8cf8381e7142bce4bd1c"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x91e2ec291b66f267104a11157c46ef32fd40c22f"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xc05bcf497d5e305552b041c7a239536c938fff8bc755fadd28fd907f070f7f4a5553660a3351739a0b1bec2e6ec3d2aa"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x1281069954affabc619e8092861136ada40cb869"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x781f234560ec5d2197a33908a66fcb156330141f51212a51a0f0117417b5370f3fd0266c9dd1bf2c66d47eaf98375327"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x56855acbe00c442f0d20d489deb80fc02b31a173"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x805d72db2998bbfaf07d13f5328db300ea7a2fa156d049bf072590d61dca40ae142de4a204e36768f6e546af62d7e1fb"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x722d597ea5a6f82a0f9b06bd8af0449d18f78795"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x1de64f16597d52214d1a5987abc026398d310712ad0db48d48e747e7783204579a886bbd9a58a47704d9874a83726a50"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ConsolidationRequest( - source_address: ExecutionAddress.fromHex("0x70ce642845a24bd208442a6aeb263b5d9977926f"), - source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x581a1e6d7b11b2512426c8aacdc735470ba2b85e164a65062fabbf1341f6cd994ca0c8b2fa8640d679ad481abaa70555")), - target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x17d58eca3304640ac6da21ac5a629b32573cc99602971e7a751db3ec253e3e75810488fcd60c59dd43cc80ad9cbf66a1"))) - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x063bc56b731eeeff8bf1c33d88523a04a14fa0c745eb3c750139842d88244982"), - fee_recipient: ExecutionAddress.fromHex("0x415b1cd5b42709a3724ab2f6f50a6dab7399d7ca"), - state_root: Eth2Digest.fromHex("0xf261abf37066b8dc5c868946346c98aae445adbb48e6dd05969fbb49267a276e"), - receipts_root: Eth2Digest.fromHex("0x5a337b7ee29d98e22b461f43b7a87e52d89fda2e7a3487ea92873be04a49ea68"), - logs_bloom: BloomLogs.fromHex("0x01817fd642526acdd8b57b4fc2fb58aba269095ce220ae5770004055f550918778021eae3abeffff1b3fa9fba50ff8d532fd8e2e67da7bdcca1cf9505179f19f595f5d9f09b98d5bc7d1ecb22527255e8e161ca2124c5fedbb59527f91a242671177e33a6fa377d585ebdbd6d9ff2bf80bec3695657441e35da43861f14b9a7e65ed475c323ece62d84aed7262cf3fd2b06ba03695e2e26e5e58fc5b8b99d519fda879587e3764930e3921aa15b2ee8691ea0e738030acb8832ca353d3bb63fbc0150c532b842cd053abeae8238c9ffe6f4b2b7210dc862c48843ae2a9088ecdb8c258592a0feb5215b8c9ad494ad896379d86e0ac89e6cd8765003ac5c95cce"), - prev_randao: Eth2Digest.fromHex("0xb28f434f3f40e40693b0c1726a018e2b3bc13c41608a2ca71aa5c8bf61829287"), - block_number: 14597257287993827247'u64, - gas_limit: 9090926713872599867'u64, - gas_used: 17391976671717618186'u64, - timestamp: 13439825139187707720'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[73'u8, 163'u8, 138'u8, 201'u8, 62'u8, 1'u8, 37'u8, 90'u8, 157'u8]), - base_fee_per_gas: UInt256.fromHex("0x8a42339ef76757729ef6c4536b3b59255b18d7085d8ba786275b2076fc55b3c6"), - block_hash: Eth2Digest.fromHex("0xb3f6ec11b285a105833f5b68b67e8e23c85c28df2362a13a76db705f110fce8c"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5477557954669138518'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b840b26a19377c64b870be600aa336a40ae46ed"), amount: 42381'u64.Gwei), - capella.Withdrawal(index: 0'u64, validator_index: 1'u64, address: ExecutionAddress.fromHex("0x3d22a723824a2944ea9accc8653002bf7d61a10a"), amount: 2799163561369818755'u64.Gwei), - ]), - blob_gas_used: 69111814634726666'u64, - excess_blob_gas: 10785611890433610477'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x027404a69d1a1a8b931d0deb6ef4c90cc23fe74e"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x144cd543ddf6cc88499595246d2373629467e69048b4c638824b8c4d82296fb635028f495c7516174670ed1c5b320462"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x748168ee6835196ae76808fe3232a422b40e42a7"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5e024d736b5c4d340929745f59b7d681eeb151107f895a87d534491b5af13fbf7bed890a2f41dc8debacf2f65fce2c20"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ConsolidationRequest( - source_address: ExecutionAddress.fromHex("0xc80ff3b9e9f68f8a64b9207600adfe37ba1fad50"), - source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9495309c1e65aa3ba8097bf1bee00be1f067910a8abcc897f5752eab5962387973e394caf9c873ea71c958c3c08e1b4f")), - target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xf1a12eaa4fe32257839694fdf8fb17083d6c35fe20d045db01ffa1b45721021b68efc2a7f7f5360493bc1f0902ff121e"))) - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xb31c41d39ef7e9a9b905cc93d82264415024d7daef48d886f1b3bc0fd6545edb"), - fee_recipient: ExecutionAddress.fromHex("0x5ad4b6c0d6b986e775f3a9ae2be73a330ba9f87c"), - state_root: Eth2Digest.fromHex("0x01dbc857a3d8994cf10cd1be3b2018be0e26ba54a5456e10a6e5729328a0b5f5"), - receipts_root: Eth2Digest.fromHex("0xa51e9cb9893bd7d73a8fd4e5267d80ddcb29d998814cfa9980dbae50ef101aff"), - logs_bloom: BloomLogs.fromHex("0xf1280db0ef6bb796e70dfef3b0bafa62690ef1e8f14a237856bae5dbe29dfd43ac789c53305ab5b0b7cc48ed53d1236ab9433a5352dac55b6e0a3ff90e9e815e2ce16fe5574c87f0066090c39b811996e2974da0bdb8bb59eb044bbb6bc2d7f8241093c7143a7c9892be85ea4284258ea2477f6a677d424efb6469724d641bbdc3f9254529b6af5cc5f5a77dad49c1a59ae37c19ffc69f6e331139b6ebac306ea09460dc0fc5791ef2cfb9e7bf29d662872e30b94384be90416df03bef5cf5a2339af4745f2f620fd1320d3fb79848692719cb8956b8efd427c9c0cc3ea6efb8f84feae0075ed10ec5c6243074e6004849712d8d1dd97ebb2948fcdf1d020c6e"), - prev_randao: Eth2Digest.fromHex("0xc8a27f0b7850de04e3d794b9e9d4f144c356f864401c3f802927faf4b88b47ac"), - block_number: 10821099926525463598'u64, - gas_limit: 7115919978619568727'u64, - gas_used: 1, - timestamp: 5900615379943209755'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[56'u8, 176'u8, 67'u8, 30'u8, 11'u8, 27'u8, 136'u8, 121'u8, 86'u8, 17'u8, 4'u8, 121'u8, 11'u8, 222'u8, 158'u8, 78'u8, 56'u8, 66'u8, 243'u8]), - base_fee_per_gas: UInt256.fromHex("0xfbaacdba879288838ff725df19b7a31148ec5a24e7989441544d6dec1c980034"), - block_hash: Eth2Digest.fromHex("0x04616c0808df7a1bc177bc48cb6ed865125fbbac2fa3e3c36f33a5f1c48a23fd"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 143666'u64, validator_index: 849676'u64, address: ExecutionAddress.fromHex("0xbf06178f996afec7c9d3cb488e812f32aafe4242"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 560588584813483246'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1a1b89bf52af0d4a8eff759986ffd93cf4464114"), amount: 13046900622089392610'u64.Gwei), - ]), - blob_gas_used: 1, - excess_blob_gas: 10155937412879977460'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5333b0180b311e552ce6b94225290f3e948b601845d628ae8137bee6e5fc8ef65d2eb2948cd564f48f40a39107d425a0")), - withdrawal_credentials: Eth2Digest.fromHex("0x311c904177ac7dab28a516a2306e47550b373338232eb146993204120e838a1e"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xf1dad35f740e178ef1aac4df7470becd0bb2d54767c04cda321ec2ff9e74fdd9ab1e42d65fcf2e1fbaa42f0f0de36e7d58f300de706ce634886c6883b36c517cdc411c236d984ed9568f39111d562360c1f61a066b30a0e7b724b4f5bc5d34b2")), - index: 5781210920531179973'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xfd253bde6458c872a3052a365ed5fca973dad3a0bef826f46a14c866bda1bbbc1c54c8117c89ec6fb514cb358af293dc")), - withdrawal_credentials: Eth2Digest.fromHex("0xd9471e69c21bdfefe367eebff0f5500573ded27a7793f9a1f9149f6997f750bf"), - amount: 439091423098684932'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xddb1aa7c758a9513fd8ad0a0cd3332a9b9411d7a0795e08591f363b5b4887b4cd4e4d22c87ac9c62a5aed65e3325cb4451d9c37539c1a9d6d84e69f38ddb0b7fb27e6ed7d744b95f5dbaff6b17794fd627842c652884f46c293251bbc0c8970a")), - index: 16197400268122174810'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x08dbad1402daa1c3e58e1cac5bdaa36704c9d21df7772d734f4fec1f770140dd4779646794d47c4df0c55adc130b89ea")), - withdrawal_credentials: Eth2Digest.fromHex("0x3969600fb0033db2f9bf9718367ffffdc6044f53dd397042d89c822887a72bc5"), - amount: 18281837285233220396'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x655e809ad38376a8d7fdd895a30d8a1ac52861864f67e1ce885cc40cbdf3ff27a8a6f8cb1b33f74254c5bfef90de22f6b1c724e888d284438995fab628ecdc5278319435192ed259b56ab6d2f18ad3ba53aa534e85fa802e15c1a1ec9fe3b7e1")), - index: 15032238460111462081'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xc8bcdf0144cd4eb45e62b4fa76b7d5963fa912ec"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x4569a134a3f6e0ac638b19e8d88c9010f7281449f78adcbad225d11d2358790b2454504ac56209ac54cf66d5df779bce"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x308d3b908ce2fb2ebd207120422994608d8c3354"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x3deec67ff0f69aeeeddf322043b694ed4ec79aa2cd2414797bb95da5691b2b9731d3fe3d3627684d022241f80504f3ad"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ConsolidationRequest( - source_address: ExecutionAddress.fromHex("0xfa3b832100b4deb83db5776ebb5c920b88c5ee4f"), - source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xc414a06a2bfafdb6ccde87c98b99de8124cfedf66b86832cae0ada7005c4939608282a7b947d43b322918765f1cdb1fd")), - target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x0b4c6a47a37b9fa0633348712fc45033dbd7ab958c8aa8a2c99dbdb325917728586b4dab8846da152df1a51c8301fd9f"))) - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0xf6cba3ced37c08da230babbf9d1e360661e5a21ac235fefa75cbe756f15809de"), - fee_recipient: ExecutionAddress.fromHex("0x0c080349793b7f43fb3ee9101889e7d32e02c01d"), - state_root: Eth2Digest.fromHex("0x6a33580fc482e9783d66bee9276f42b74a2cbc2b7434fc408a6ba9df77db0ceb"), - receipts_root: Eth2Digest.fromHex("0xd896daff74ffd6ffcc088adba01aea52af82d861b7ff649265a750e5995dcf31"), - logs_bloom: BloomLogs.fromHex("0xec00c3385b735b6a4088ed066bdb088e7826a2830fd13a1a1525c4590eb08baeba81bb511bbf2db2c0547c69c10b5c6c1bf5c8e5a7931584e6ed8ed7357431e1e2391fc0e61a060baf8984a6fd5c04c68fe0f28f94281d0db663b1b2fdaad9b51d3a12bb9fba255c923dea5ce45dd68ec2c5afc9fd13a0e24d234a3c8c5f255e7d62d48a8e01fb5c1eaf0c7a68a616ac935416fe3332943d78eb28a48a180e2bee26e85d786583ae0609a8b98e1045738f054aa12bef97593cd16d8d795314bfff33c51b397afa2299a4a64244817e5a07cdcd75eb4c4c06e8e943d8d1db8e65f17368ab6175c3e14daad0b99fd0f1050feebadf9db8fe8f1c19ed867f4df676"), - prev_randao: Eth2Digest.fromHex("0xdcd37bc148c25afa7e320009ce19567108745ef5ed57781f55df1d73b707e26e"), - block_number: 13754339262807377549'u64, - gas_limit: 5250261236890759949'u64, - gas_used: 1335844244115849195'u64, - timestamp: 16758901654456753273'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[28'u8, 8'u8, 171'u8, 122'u8, 126'u8, 38'u8, 142'u8, 246'u8, 162'u8, 197'u8, 241'u8, 216'u8, 158'u8, 184'u8, 73'u8, 191'u8, 208'u8, 5'u8, 79'u8, 231'u8, 254'u8, 55'u8, 126'u8, 97'u8, 184'u8, 78'u8, 36'u8, 80'u8, 160'u8, 124'u8, 188'u8, 176'u8]), - base_fee_per_gas: UInt256.fromHex("0x0ea1185e0ac50d1e2cc0be7229c846528380def25f7d8860cf366e6edd793be0"), - block_hash: Eth2Digest.fromHex("0xb471874aa6e8987deee40902d59537fed8af3e9b6ae2f8b476ddb051629b3b09"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 215'u8, 225'u8, 83'u8, 163'u8, 187'u8, 111'u8, 141'u8, 246'u8, 57'u8, 238'u8, 163'u8, 25'u8, 91'u8, 114'u8, 111'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[93'u8, 42'u8, 101'u8, 80'u8, 160'u8, 252'u8, 158'u8, 121'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[164'u8, 98'u8, 105'u8, 179'u8, 25'u8, 33'u8, 130'u8, 239'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5378768050415100863'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0x3d84c03e4c18979ee8288bd58b24989580f0a590"), amount: 815393520574223128'u64.Gwei), - capella.Withdrawal(index: 17328504288784263137'u64, validator_index: 305278'u64, address: ExecutionAddress.fromHex("0xa00491dfbee05f23fc7ddcfcb1b27b2855334e81"), amount: 7734460020873819187'u64.Gwei), - capella.Withdrawal(index: 0'u64, validator_index: 444647'u64, address: ExecutionAddress.fromHex("0x0689ed39160f4b4c20138f300b3b2502e6d6ab5a"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 834083'u64, validator_index: 10715076713456342424'u64, address: ExecutionAddress.fromHex("0x07ee24f650e7254d10d61b832db7174128bf22b4"), amount: 17794546242151296198'u64.Gwei), - ]), - blob_gas_used: 7080212387270627767'u64, - excess_blob_gas: 17322910515629142083'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xf08f319d0ceaed0b05713852711ac610c213b902e2173d8db62f1eb6aa3a6beaca49c48e76bcc5a25ed6a16d949fc2cd")), - withdrawal_credentials: Eth2Digest.fromHex("0x166df75e231abc5e67a30cbe8f8392df207b0a203784d5cfccc8d757472defb4"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xaadc232ca2439def6d7ef995342870dd330c245f46e5cd42fcf1a86a491f65baf722d4d8cad5faf0c66920b17bbad2d92bee6db09afee46839beff07db973e8515da6c77741396a4c844400c7d5f2f9cb815a4fc14dc12e85dfa1e265c8f8e52")), - index: 11769346303267269586'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x4ea1b17de1819b452f77c0ec61ca191225cd3d21bd94ebaa8f63eaf87b2a7e131b45688d8187b5853e25193bee3f5586")), - withdrawal_credentials: Eth2Digest.fromHex("0xabff3296e33aa3656c2911cc07ed003b5520db5ad937c60b3ba70423d25de9ce"), - amount: 13132016002583744347'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xc544cafb21de7664dc3f6e49fb1d972bb9b0e84672889c29116cc08af20191c09d1078f70f5ebdfadfae76092cd5bc3328709703ec0aede57f8a339a2cea50d76f3b14b26dca2d6d66c5775190896040d91c38ebe45b642ed48a224c300f1353")), - index: 0), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x926949c6a561ac127c2d6e7fb2fac3d3df36abdb91aaf857f923cd43645bfb76bf75c4afae07aafe5f4c7bd8d2aff312")), - withdrawal_credentials: Eth2Digest.fromHex("0xbd953da5243317a12f8088fbd1483795ed953b05f49e4c82b7b95a93c7fb3347"), - amount: 12812987719379600277'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xac73e1dfb07bae2ee700bf7cd09a10a39595491047e708d4e47c7d7149f40853657ca564beda87b00e4bc164122c0973ccd9df366b274dafd8bd949881c5ad6fee9f0abcfad2677481f41ca4a5df978ae1f26d783609772706c9c3ef1c35a54f")), - index: 18434818685702059208'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x013f9a9161f2e1a9235ab5ffc2e8968cdfed7126341ab0e0f3ab176546a3e2cd3d0d9c8523542ebbbaea50b6f096af47")), - withdrawal_credentials: Eth2Digest.fromHex("0x7be93c7783e230acb77ff4fa480299c5e295f7516325b73e4c4efd987d6a590d"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x97ea0a8e3f3e73fb11ded1814f4232e8bfb1e7b71bce608f3f181e5609bdaab3ffde52b1ff98d94c3d02ffefa6b3716cd83deda00888224f24716619f685c940da205910227b976bedf7f0cfc16262e2ec48dd837509326c97e329fe666846ab")), - index: 8630770799181013738'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x4e4c648248758aaba856a20f8496700f036a9177"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x96902ac59a4940715d171f1d6ec3e03b0c1557fc0100abb930b6626917b9792aabd48ec1bc1e37737c582fe11c966658"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xa99cc4727a81a0abfb662fe28748133420938dae"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x10f3cea6d52558a866988352bef57525f708aecb5fb392af8453e306cf7c5da68aea8a544d71db63dc1057317b00feb7"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xe13404d88c1418f69c92ed12d256382a462ecf4e"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xf8f8cffff4aa7bec351b9e084274b6e47c536671bd559c7fbf110985e684a58c0384ffc314c23c4441c0f17ce33bd767"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x6f9427252a6fa414a6501e0761cf92f0839f3bbe"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x4ca4f660800c2cfa68827299ddcbfddcf2cb01c51dcaf5af1abc5e8f05164846ca26f1c8c884a3e674a22dbfc0d9fa7b"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x14bce680ec1a632aac5f77cb4d5eca52f74bd1e6"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb4f363283d5276f12a6c2c98c58484c6a6e8e3c7f5b3adfc044d2de76365bef427f8b9ac1e321baa7a611447010f9e8d"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x62ce6a6d68578309c4730f96f98a809d4b4225fc3d37a285daf26288b10f9590"), - fee_recipient: ExecutionAddress.fromHex("0x8c892b06f1e9c877c310b6eccefb20fcf5e00227"), - state_root: Eth2Digest.fromHex("0x578f93b83206e3239c69f51cc8e59cd89087260cda9f0efc892aa2ffb2bf386e"), - receipts_root: Eth2Digest.fromHex("0xa4ac657af8e0dad66ec74f4f66b246fe0089485e2810071fa556c09ea585059f"), - logs_bloom: BloomLogs.fromHex("0x18d67e640f9ad3a24deb7e3f8cbe0ba8224cf9cb9e67b2fd6c774fac7aa3f4adca2befe8322962cf000cb89c3e352433cf1aade51ceac9fe69966a8a89f7985030a301eb690e7eb20b5ac3b315930ee5397b6d65b03a1131b94e7f3505ef030877e460e9195b742e943716d9875a3e2e9998236d3565d622216af1721b658a12fe7d82a62619b4f2d042f146305ff1ad1bf394437340735eac9e962b3fe67597793d1151ec87fcb5f0056837c5813c75c4a0f94d91da71299b3780f250ee31eb9f106e3c443f0ba05213da05177238909fd9e60de9484e091b91dead82debc020929d1f14e79b610af3d15bf9c3757e62bb32a69523c1bd576e5c5d4bc2ef0a6"), - prev_randao: Eth2Digest.fromHex("0x552627eb969604e7d4ed1e631b74b2410dea7f4dbd49511bda390e3b9da8bf60"), - block_number: 7763671958353664038'u64, - gas_limit: 3930616259240751958'u64, - gas_used: 7960068863134244743'u64, - timestamp: 18446744073709551615'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[227'u8, 111'u8, 127'u8, 243'u8, 191'u8, 237'u8, 88'u8, 146'u8, 146'u8, 236'u8, 162'u8, 237'u8, 164'u8, 177'u8, 249'u8, 52'u8, 1'u8, 26'u8, 187'u8, 208'u8, 244'u8, 234'u8, 113'u8, 199'u8, 30'u8, 209'u8, 197'u8, 63'u8, 126'u8, 104'u8, 143'u8, 30'u8]), - base_fee_per_gas: UInt256.fromHex("0x6bcd9684e1bc8f4fc5d089e0bf5fed35a8bf3039808d030bb9eb1ff7147180b5"), - block_hash: Eth2Digest.fromHex("0x9e2505de9f245873565b553e7215abff698bdfcee1dbd93e40eb295dd84e7f45"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[140'u8, 134'u8, 173'u8, 70'u8, 168'u8, 181'u8, 221'u8, 210'u8, 25'u8, 142'u8, 168'u8, 139'u8, 77'u8, 134'u8, 203'u8, 219'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 0'u64, validator_index: 780337'u64, address: ExecutionAddress.fromHex("0xf0ab5949e96d8befa8090fe5612d9c45beea0c8f"), amount: 2246589958612652012'u64.Gwei), - ]), - blob_gas_used: 0, - excess_blob_gas: 9638659159857567769'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x0d7bd99094b190c06d115f727bab3974676f30feda394294d2fd7250443e3514868fca6c749b42bf6cf70c9fbea48d53")), - withdrawal_credentials: Eth2Digest.fromHex("0x983b0d33e8325a806a21d0ac9bb262e565ca7e094d578876a89501a8985413d9"), - amount: 6392806474408369626'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xac560bee8d8dd4dad94f2bd5b480e7799f7a8445adf3e0070747f8b5724d442453fbba2f332cc69af3a450dce80249b6b7afe19340f4fc5dc54a5c0e56cd4c484c94c61480bc56c75eef44e55c1288bd58739b8354caa93da5d2502bb38546df")), - index: 7086745948630243467'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x91810ed86a3244c89274f94fd510532cf12d7074"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xbb480d96367f62ab5790cbfdeeac6344e21774681edd0afe64c50b48f4d07795e584468821788948c7d8c151733ad01f"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xe16b15a5256815cf6d338498a5cb0e8ec0d5bfec"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x79b49178606e2a5cda067c04b982d445df7b41d09d4361e5498b7a454d0e8a37a6975da56c3bd20694a3fcb467f7ff59"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x4f8251c361a23171de8648d1e96c91fea2cc5a691dcd884e3a957dc8f6a8802a"), - fee_recipient: ExecutionAddress.fromHex("0x7da9175abaf6e4e400e0ee516fd3ab07dd659f2a"), - state_root: Eth2Digest.fromHex("0x1bd3a5da4c266dd396b8209288e68be066176ebe64cd4c17c4c6cdccaf03577e"), - receipts_root: Eth2Digest.fromHex("0x16133c4fe31f0487e700514160acf9257458a6ee716be8043cb6c532f84ef614"), - logs_bloom: BloomLogs.fromHex("0x5ca3807e674d69536b33337d798deaeb9fa6c7cbab7aef1473e6a6614f6f2c74ef85ee3632612b9c1e78d2a63e0b2f58d48d71e8d62e38510bc2f307680497cb965153b43392b8aa2dcd91a766356eab3ff1b4a6c4b037d61df1a8a4c6d3fa0e3c57a299a1c0a7382052ac25c412f2d2356c302e326fa0cfb570354e31e2f8046b80e2690ba69ec7c284c2df8ad23d16764cbc0ba28516f3c31aa89da3e3286106dcecc835b3007a17f33c4962efc3c9b0f5bff14c783e414ba60d35b79ab33ccd0151c34a94efc461d0df0a994085373f33275a4cd6839603632409b670072a4554f1c9342c03cd403a6feb67b23d3a075707ca89b77bad64e24a6ab79446ad"), - prev_randao: Eth2Digest.fromHex("0x6353ec5b94b9112f25e66de48b532ff5610c63f34c50a02fdf64af6c9d0ef2f4"), - block_number: 16866969889068542818'u64, - gas_limit: 5116920640663397560'u64, - gas_used: 13292402101416991817'u64, - timestamp: 1, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[136'u8, 133'u8, 189'u8, 60'u8, 229'u8, 217'u8, 70'u8, 145'u8, 136'u8, 97'u8, 175'u8, 23'u8, 183'u8, 73'u8]), - base_fee_per_gas: UInt256.fromHex("0xe1307a28a2868b4d934aefdde7bbd09b0644b5c422d2c680770775cb44623512"), - block_hash: Eth2Digest.fromHex("0x11e23850b143b8b4dd8394ee1f2cebf073068502d04dde00000925cf23ff55cc"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), - blob_gas_used: 4954178403284176013'u64, - excess_blob_gas: 1, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x08396e3d726ff055f903e2b4e7b743fd8c128f4b"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x01c1c045960d8121bc8ab57c4728dfb3c07289818df71893c002352eca51c54f03db8840f608607bea01bd7b0f02284d"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xc7fefcefc468685bc9b8cdd3c4e1ae643952b254"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x816cae90cab4ca290dfaf9f32b7ad508bd82095ec815cd55b9399eee91208d30f79e548951bfdddc60b7e7560f2b9e1b"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x7eef42203641e2f5c21779289b6c48d24d578887"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x738dfea8a133b5fd384bd6242fa58f1119bcfed0cfca93899c95f1670d1460b905134cc91eabb429d2147b5f147d5d1f"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x032d5223828ee1c8943fdacfbcd25ce4bb2eacfd"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xf42315c025ae7ef0e8a04175441e9617b0e315a9e7c8fc5f0a0bba4efc9775fea3a8af9b40c4aa37633718ccb5b3260d"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ConsolidationRequest( - source_address: ExecutionAddress.fromHex("0x548760f25ecda293ef4950d60520003770b31964"), - source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x1e384047c673119fbed6c635e11f4db74edddd17cc6e51634f5eea100a21a07012fc9b89d2c7677c282bab0d1136cead")), - target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9454bddf457231bf55c91db6a018a0501e97e31d0cb2e7fa180910b75aa1a98e80739885ba4a878df2ef7ac3f2db9fad"))) - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x0c67b44b492590ffb9e6d2a63c84714821be7526ce1c337c06276e33a62b7b93"), - fee_recipient: ExecutionAddress.fromHex("0x1d16dbe66ead2ba8afb8594acaf8d536be08dac3"), - state_root: Eth2Digest.fromHex("0xeeb40e334aff8512435b5908a8dd3c06993cadca8bc44e9a6c28c6003162c6a9"), - receipts_root: Eth2Digest.fromHex("0xefa5b7de19da2333bfb7bfa814a306f904fef2ff4f8b1154314649a56fea3c8d"), - logs_bloom: BloomLogs.fromHex("0x4ebbaff6a56343a6bc0170aca2e2ba303f3e3f972c88539ef84e402740e3c9e21c6951d461baf56eec14c06ca0e95f4921079d0d82e9dd46e73f3fa76417246217ff9c5425f19b0f8b2a735ee522c1bc377a2b079099430d0f9316164f5930456245534bbe138d0a19ee58bb13a0d724723a6fa50e39b8a7ad5804f92ab43c24782e27dbb32789408cdd716af9a0b0cb1e2f3aee0bcb5aa4088c0cf1528fad466f3d71d906649becf25f405f619dead731e0831efb522b5faee7a39ca28128effc79977816d50ae23745ab96b80dc7f548aa5d43b0d5c331fdc1ce080a4d63e19942ecb4df8f56397b2ef67d017f2d2de9296e1fd8036ed8592f5a89553c4642"), - prev_randao: Eth2Digest.fromHex("0x5d3c3ac25330e1cd3a516003315ed24bd2dc6cd31d389639cce4b6ae4a3ac8cf"), - block_number: 10891095348111649307'u64, - gas_limit: 13670668340379820434'u64, - gas_used: 1482104080767186829'u64, - timestamp: 6602476120092784163'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[223'u8, 228'u8, 253'u8, 3'u8, 38'u8, 218'u8, 253'u8, 87'u8, 206'u8, 243'u8, 168'u8, 113'u8]), - base_fee_per_gas: UInt256.fromHex("0x972a01f27d586035ce5fb233118e52652ebbf89f6d39558a41b27c8840c849b1"), - block_hash: Eth2Digest.fromHex("0x9280fa96a569e7c25b2dfc12a141d3edd24acf2fbfa19ee72e5a1fd5dba25a11"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[116'u8, 179'u8, 195'u8, 80'u8, 193'u8, 73'u8, 187'u8, 64'u8, 41'u8, 251'u8, 55'u8, 90'u8, 161'u8, 30'u8, 221'u8, 210'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 820354'u64, validator_index: 626992'u64, address: ExecutionAddress.fromHex("0x4abb3f9a694bf6b27be97e24290ca6826b23c5d0"), amount: 100271'u64.Gwei), - ]), - blob_gas_used: 0, - excess_blob_gas: 4396492484488695305'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9aa3ec3541db18dc4f7bd8e3111a3f00c0d7c5c096a4cf312e3c91a10ca1a91802c4b7b8bbd657dd30af4f3c365a70ba")), - withdrawal_credentials: Eth2Digest.fromHex("0xf26e0fb84321ae08d027c81a3e8b113263c01ba0b5e8b258089e496854c4571f"), - amount: 14325001783554754582'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xe3654532d224f33eba82bb7f487098c687c180592f8d6406af9d13e8019f417f4bac5ab12c4da72d85f90af2ba18ae4f1f27984033ee63687635db7a69375b38b48168575926def4ba0cd2322a3d970436ed788627fbb4889bba989114da9b82")), - index: 0), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5960755c394a07ae7c11ab0260a033eb22b0a0f957be785a513878d0ef04cd3b46af090fd6e2bbd930cc345f81f209e9")), - withdrawal_credentials: Eth2Digest.fromHex("0xa86195129950eb6a8df3190107c2b84e8ad8fdff7b0720d84c42fab9de51e38a"), - amount: 279514025671376926'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x121632563dca7d7a560e5b243d7f27dc7dc72319f1486f67cb41751c5f5a42bd9f8efdd14e3f811e03c84e3ba36295a0cb2313bb9792cfc7d80a1669f0adc30934440adbd665ef96b3c30a2762cbaf932e6eb1b4a1c93063ec7f0b6f6aa2a9db")), - index: 10368232928814555152'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x7bee235a632b5f79831f376843209740d409b9f8"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x8f40af9186eb70dea2f3105785a930511368e60d2235055c34a0be1a591c5b580eed67542c89a0f8a024c4a6bd1f9bb7"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0x72fdf4c5a62970c6d6c9ee395eec4dfd6fcca4de"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x540a810f4e9ad62bca1d677e9135d519100012f6f12a8f5105623762ba5de3782cb3baaf63c4a32cf03a036127d6d009"))), - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xd3a0f8518063d55c61423dce1bfcd2abd9a27a62"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x82bec5cd588df021e98087c703b995075ee1cfde2257eebed5e27f53a3a16903479fa2e6864ab3c3c397cd25b6ba3d4f"))), - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x7a9d6ab34c0314959d5bdceb0bd80f142e59e5e2addedcd178612303897e7a8a"), - fee_recipient: ExecutionAddress.fromHex("0x3425bc529b4791f5fdb7dd365501199b2f81e578"), - state_root: Eth2Digest.fromHex("0x4eb1a9a3c4b9392325a14f3f8efbc0b3cc3bfc2d7e9992377abd84af6c556db5"), - receipts_root: Eth2Digest.fromHex("0x094e9114d3487925f6818140978e4db64d8306083a8e5c987657e21c3a1995bd"), - logs_bloom: BloomLogs.fromHex("0x0815701b4689d0bb7f80fb1485ad3255a66b890725a1d2d66b4fc66678e2d08784c21ef583401493d5dda1549eda32303b7d102edc72b9fe1d696ab459294a88db0d7263abdf982ddf59ce008b8ac734565de79c269dfc18a36709ca91a3cd50516725e9fa9d98302fa0322254382aab0cdf1f95f2397579f7219bd7ab096ef1f00d7b1131b0055bff65ae9954cb22959adbc40983840ae3b85358fd205bdf6ac6bcf723047ffc53a094a06c2039935b6ef579efc618bf4127a6e4e531f6d97c17789be639691ef87fa5540cf732a184a0e09d5c60866ecd0be0a04bc94317712c395d84c2cec90f43f4807048bf1a93e3e6520a1a7c59092e2e391abf9d2e68"), - prev_randao: Eth2Digest.fromHex("0x349eec90244f3d812002732cd833952969b27a463def04291051137344c89c41"), - block_number: 5715688900321967041'u64, - gas_limit: 17172684770312311722'u64, - gas_used: 9286597649062725614'u64, - timestamp: 195835912833125491'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[34'u8, 35'u8, 209'u8, 45'u8, 117'u8]), - base_fee_per_gas: UInt256.fromHex("0x7b5b4e48b3daadecb9724a74d426a86ffb5c5f8abd43469b4e3fe2a728b5a645"), - block_hash: Eth2Digest.fromHex("0xc71c294b5562af30b9e2b03e76cec0cc6d8b50694219404aaed2ace8f756a22e"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[178'u8, 142'u8, 115'u8, 217'u8, 56'u8, 74'u8, 150'u8, 16'u8, 244'u8, 148'u8, 19'u8, 33'u8, 89'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[195'u8, 248'u8, 42'u8, 129'u8, 151'u8, 119'u8, 232'u8, 235'u8, 245'u8, 240'u8, 113'u8, 157'u8, 235'u8, 158'u8, 160'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 27'u8, 72'u8, 107'u8, 18'u8, 210'u8, 127'u8, 78'u8])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 5186085670428433087'u64, validator_index: 156817'u64, address: ExecutionAddress.fromHex("0xf8d93a548c4b243e66f4f73b29da342a0fab04de"), amount: 18446744073709551615'u64.Gwei), - capella.Withdrawal(index: 9475052657186699106'u64, validator_index: 759532'u64, address: ExecutionAddress.fromHex("0x97559fac3168c6ee81b0f0b0b88563080ca24769"), amount: 4852567582077527137'u64.Gwei), - ]), - blob_gas_used: 11199168226748373856'u64, - excess_blob_gas: 13194543368024635634'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xe4476f7d26f357eeb0a2c31eca0febf37a9bbd8bb28810101b3d62832fbc63ecf6ae6019bbea00bbf1b786ccd4e5143e")), - withdrawal_credentials: Eth2Digest.fromHex("0xc9b68e2b8e85dc344cb56a8f2b1930ebad58094a8724e64d7de0b7d39178abb1"), - amount: 6807629444642690487'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x742db20aaebafe1bde890ff9a00901d9b8e2ff5e1f27ec96d0adcd4d058fc4b7dc8545931f686c71180035d90eb61c107f96b6f401b75afaa4f4824bc9085c8bf7618f86e64e04d0b0779e54dfc6b9188c4dce82a70e383298403025ef634e6c")), - index: 8242431675098722712'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9cbfe60e6b7fd6ca80f047492eee67fe83391b71ae1d70e2e6e7143c096e4059897f3033cf01a266209b974f1accf9d1")), - withdrawal_credentials: Eth2Digest.fromHex("0xdcfd039ba7148cc07212f227be45fdc329a499b8b0ab074dda9c6fa0f4534066"), - amount: 17558068707432308727'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x8e274ccbdef898449a07a296386e5983ec423f7ddee02bb9d480ec99dca4f5074b8f6cf469758a45586f031e2ae0a5448aa133531cddf88e9bd2b9fae191fdc817c1989124f1866753fbc833f79fb78f89677df12bc6d288693e5362f2a972bd")), - index: 15922103202526011942'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - WithdrawalRequest( - source_address: ExecutionAddress.fromHex("0xe368e59ddc49ffac6818f01b4be692a517b6838e"), - validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9c7a489a7498cada308db339f80aafeeff5e38ef7dc5803344a725b3b7f23d6d6162a33798a69660417b8fffb51c3d50"))) - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ConsolidationRequest( - source_address: ExecutionAddress.fromHex("0x45c3398e59b885ccf52ef5d36ab2acc3c3f9d584"), - source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x47faa2f4d2bc6e1b2c8366db1e4300fb6fb099f26c9e0cd53b87b22f4fd038751b8fef08f6c1e636116c95874bab5bb1")), - target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x632e3e022a91046f0a6769abfd159b998321363c79d77b7bc139359fafb4cce331322599fc05fd8c5b1d6aef94e810ed"))) - ]), - ), - (electra.ExecutionPayload)( - parent_hash: Eth2Digest.fromHex("0x806a868f0f31e8f519fa6339ad18c414dba17feb03aaf6ca3775b152bac64f3b"), - fee_recipient: ExecutionAddress.fromHex("0xa2bcc8b793c4a5d4e0f68251d2f22e1ff4366d2c"), - state_root: Eth2Digest.fromHex("0x6979ac9545f31eaf7ed8bd227cd7cbd1017492b892bcc118f7417ea87d50d412"), - receipts_root: Eth2Digest.fromHex("0xca0ac1828fae211c9d0fd7ab763460d89f9da0669d082c68b9fdca3ca1b59123"), - logs_bloom: BloomLogs.fromHex("0x0656423dc7b375cee4f5c3bedc500eaff2da91d0dd5f4e695933c92a2a6af7441200a41177bcae7912839f993a733aa2bb82976f08180a901e63c588a26dc9ccc58f477eccbb08aa932d512bfc765a57527acd04c585af23f48f389420890d06877d8a0f523cb90be10dbc73cb5b11e808f5c6c90c6fc3a9434dab462f2977eacf79146b35ee2372aae8a6fe3628cbe21a8988fd9546b25581b6d998462f9af7f653d3a4702a4a63b9f26cc7d2f72e18a3918fa9b65ed81d23ac0a64dd8f3f878f745fcb4de9ad144ae9565288d7bf90e6d356f49cc242d000e988fe76e0196f0c5b24bdf9dc501222e54f64861e0d45dda2bdf09e5fb290a1ec6dce39b02883"), - prev_randao: Eth2Digest.fromHex("0xc986211f6550cb787e89140d8856531ec309f652e2a871e2715c1dd055448074"), - block_number: 7781035717593646205'u64, - gas_limit: 9088183223170031827'u64, - gas_used: 0, - timestamp: 1844848381084178223'u64, - extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), - base_fee_per_gas: UInt256.fromHex("0xaac988479abbe95e03cc214e7b99795c4ec117bfe4da06e4624e94b262b015e2"), - block_hash: Eth2Digest.fromHex("0x14137d373f6e6110b3fe3c1d743a4f84547ad3d59d0b42598b794ff601e97e38"), - transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[10'u8, 28'u8, 79'u8, 238'u8, 85'u8, 206'u8, 161'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[144'u8, 222'u8, 190'u8, 14'u8, 247'u8, 119'u8, 95'u8, 48'u8, 238'u8, 50'u8, 180'u8, 12'u8, 216'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), - withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ - capella.Withdrawal(index: 428032'u64, validator_index: 18218455002493563835'u64, address: ExecutionAddress.fromHex("0x389fe5e57a13de364b852d7e2cebc2add2cb7510"), amount: 726634'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xc6a0db1d09160cec69bda14b444c46745e09c96b"), amount: 742028'u64.Gwei), - capella.Withdrawal(index: 858390'u64, validator_index: 326055'u64, address: ExecutionAddress.fromHex("0x6a861508a89443c763d5daf15dab44a8a45147fc"), amount: 597242'u64.Gwei), - capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 17239721441660215355'u64, address: ExecutionAddress.fromHex("0x1450447dc71e28e312c7de7034523cd322eabc98"), amount: 18446744073709551615'u64.Gwei), - ]), - blob_gas_used: 6943026604784588438'u64, - excess_blob_gas: 4081254329996628499'u64, - deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xdb77124f3289375b57590aa624baa5feabd0cb05d9b849ddf7fb6c6a19ae6e0e9b2b5f0b5619f8114d2e84f86387b8b1")), - withdrawal_credentials: Eth2Digest.fromHex("0xda71d922d0c2f43e0e743d15acf61fbbc235cd7e5a6b5d3ddf0a8f99c09e5423"), - amount: 8900470305881875693'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x0359d1b9bb630af7adedef569b58902f861eabd6832fdac38f4ea9fcee0687d5b32beb1762707bb7f197cc7cb7e56a2c5071f0c20647fe133bc807f8656d55ba454adc7c0c82e1d91b6ee2015c659595a29b20c75fdc9eb09c1dd181ca30cde3")), - index: 7027910908460072698'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x766195f078501722f6c2250140a793ca7c7e4eedf04a08d7a9046790347feba8b43a07824c279c3382e30dac18e24dc9")), - withdrawal_credentials: Eth2Digest.fromHex("0x8033ec1a06aba2965b7e5a44c3195aadf60c733e54cd737c3f08183ba15fc91c"), - amount: 18016967842448743237'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xfe46ea45efda7361cfbc8a5436dac3d2906176f219f38e477106a7a1bcb7efa726097a058553f0df0336bc982fcc7ff0ec99a085032d853f0a865639581bf40c06d463a6341f40a0bb5a149e1052ee9cbb60948cb9e673d12dc26979b7c75150")), - index: 2199989485519321583'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x3da140a6919e15bbce6592e20deb726c7f49490de1d785f2c6dccacf042a73b3baaf7a8a78b2b845bb91dd94bb4516e1")), - withdrawal_credentials: Eth2Digest.fromHex("0xd7ca318f49e1acc9dd1b42088b59d7321cbf61ab08deb200b507569a84b45a6d"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0xdb1d2894d5f853b0bf89dc64d977608ac2774d8c5f4f59566f4ee3a723caf13b4eb66aca7495dfced5068057516b1ba6106e2af198bb5a0a78ecc47cace8b6e0b570b13b23d58827f756f8947d12187c4f804b49924f9beaa669f5d8690513b0")), - index: 2386861599472159894'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x551918d44e257d9a00f2e9307eb6735d5da6dcb6b372a0c80d35b167afca47f6087e0fb2fbd8d3846977bb1975b431b5")), - withdrawal_credentials: Eth2Digest.fromHex("0x23d544fec453c12e55f24488f48870115d07946ba266621aa03997f8340ba0c9"), - amount: 15504548595993808618'u64.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x8be2d5ec33930f835ba523c8db1d5c47e7719a8844a2339f9a7497df2687efe009dbee6429accd5794272609b3f75ba25c959c7daa30e87f0eada1268363de1afd86656162f95a5b7a76eebae76c8cb3619045fd0050224b77ff1567e590a42f")), - index: 17558896845903288827'u64), - DepositRequest( - pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x920b41013a660d49b8ec1651d7ed869b0812cab03ff409e32b29beb8d8d74744d5d2375e40afa7da019408552026017a")), - withdrawal_credentials: Eth2Digest.fromHex("0xb8f6d6891169e1fa957873ae437ac92f650dbf32f0ce5dbede96926ccf755d52"), - amount: 0.Gwei, - signature: ValidatorSig(blob: hexToByteArray[96]("0x232d34989ba30727e4ae0aa874a4bfc3934d61d0295d8f1c5f8416523f5cd05a3181a03543ff7318c4f4b9207d006267dde451177612bd888f69b43ebea83a4289cd6615526160d7ecf2a09842d4c2e90ae9f207a440a348ed8ef31e0cf1fe8b")), - index: 4403524705240661292'u64), - ]), - withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ - ]), - consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ - ConsolidationRequest( - source_address: ExecutionAddress.fromHex("0xaa3e4b371bd5d3c907eae23ce4c4f6b5dfe0cb65"), - source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5bfc2cffb681249ff93734c176a8bac7cb207859a77658019f7fadf0a49f8f5b2496c7fcb2a270ea99f9a80f15b95ac1")), - target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x495170003efda9e294e95cd4d80c903b4fe6c48846b1c8fcbca71b21837e6ca8ffecd0f224aead3e1088ae755a882ae5"))) - ]), - )] - - for executionPayload in executionPayloads: - check: - executionPayload == asConsensusType( - asEngineExecutionPayload(executionPayload)) \ No newline at end of file + doTest(i, j) \ No newline at end of file diff --git a/tests/test_engine_api_conversions.nim b/tests/test_engine_api_conversions.nim new file mode 100644 index 000000000..a413cbfe9 --- /dev/null +++ b/tests/test_engine_api_conversions.nim @@ -0,0 +1,2782 @@ +# beacon_chain +# Copyright (c) 2024 Status Research & Development GmbH +# Licensed and distributed under either of +# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). +# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). +# at your option. This file may not be copied, modified, or distributed except according to those terms. + +{.push raises: [].} +{.used.} + +import + unittest2, + ../beacon_chain/el/engine_api_conversions, + ../beacon_chain/spec/datatypes/base, + ./testutil + +from ssz_serialization/types import Limit, List, init, `==` +from stew/byteutils import hexToByteArray +from stint import UInt256 +from ../beacon_chain/spec/datatypes/bellatrix import + BloomLogs, ExecutionAddress, ExecutionPayload, fromHex +from ../beacon_chain/spec/datatypes/capella import ExecutionPayload +from ../beacon_chain/spec/datatypes/deneb import ExecutionPayload +from ../beacon_chain/spec/datatypes/electra import + ConsolidationRequest, DepositRequest, ExecutionPayload, WithdrawalRequest +from ../beacon_chain/spec/digest import Eth2Digest +from ../beacon_chain/spec/presets import + MAX_BYTES_PER_TRANSACTION, MAX_EXTRA_DATA_BYTES, MAX_TRANSACTIONS_PER_PAYLOAD + +suite "Engine API conversions": + test "Roundtrip engine RPC V1 and bellatrix ExecutionPayload representations": + # Each Eth2Digest field is chosen randomly. Each uint64 field is random, + # with boosted probabilities for 0, 1, and high(uint64). There can be 0, + # 1, 2, or 3 transactions uniformly. Each transaction is 0, 8, 13, or 16 + # bytes. fee_recipient and logs_bloom, both, are uniformly random. extra + # bytes are random, with 0, 1, and 32 lengths' probabilities increased. + const executionPayloads = [ + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x760d4d1fced29500a422c401a646ee5bb5d65a07efa1492856a72cff9948a434"), + fee_recipient: ExecutionAddress.fromHex("0x315f583fa44fc6684553d3c88c3d26e9ed7123d8"), + state_root: Eth2Digest.fromHex("0xa6975bac699618cc22c05b1ba8f47cbd162475669474316d7a79ea84bce3c690"), + receipts_root: Eth2Digest.fromHex("0x080d53a0fd22d93f669b06052413851469d63adeb301810d7ce7a51c90c8e8ce"), + logs_bloom: BloomLogs.fromHex("0x453a1f1c4f63bcf0be84e36a9ac233b551601bb2e5ab9450235bd83e41d2013f42c97044ac197a91da96efd6fb18f233bad2e884d76f0a63a6fbf7dbc714cc9aa497fb6d363feeba18447ecf799d5f8d769232553c375b21166c0176859dba63eb77f1a17e482ebac07c3cfd5281277f55f1e5c79cc675d501e1982816d31db7d73c89e855315d8f4e9fef1c9ebb322610235c44632a80341b42f05d207ac4869d08d98a3587a470f598095ebb932788fefacdd70e7749e0bd47ceff88a74ee1f006d9791350484149935d4521d86e644ebc4346154ca0bfa9fbb83120630867d878c12e53a04a879e993b755f02670c9c47f091acf1b3f593782ddaa98f0df4"), + prev_randao: Eth2Digest.fromHex("0xe19503a6fa6acde0b8f5981f29eb2e298ddff63e6243529d735bcfa42680a515"), + block_number: 9937808397572497453'u64, + gas_limit: 15517598874177925531'u64, + gas_used: 3241597546384131838'u64, + timestamp: 17932057306109702405'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[55'u8, 184'u8, 18'u8, 128'u8, 63'u8, 61'u8, 26'u8, 79'u8, 3'u8, 225'u8, 167'u8, 15'u8, 240'u8, 167'u8, 180'u8, 141'u8, 205'u8, 10'u8, 246'u8, 70'u8, 248'u8, 35'u8, 19'u8, 45'u8, 252'u8, 187'u8, 168'u8, 42'u8]), + base_fee_per_gas: UInt256.fromHex("0xaf8acbd8a0f0f8eeced9a1014333cdddbd2090d663a06cd919cf17529e9d7862"), + block_hash: Eth2Digest.fromHex("0x86b46255725b39af70a9e1a3096287d9772ccc635408fe06c34cc8b680977ff5"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x2cb54ddf357864102f4ab6bce57317a75cee972f303449bf7047f4e0e5809127"), + fee_recipient: ExecutionAddress.fromHex("0x92af67d9604b945fd2cbaccd29598e2b47ef5d2d"), + state_root: Eth2Digest.fromHex("0xc64221514816a2f87a29c2c474abf99547820b2a12e6e5956f160dd54579e521"), + receipts_root: Eth2Digest.fromHex("0x76c1ca0e483a557f6884d64bd891c62904c64c2fe69350278345c622cc50b0d7"), + logs_bloom: BloomLogs.fromHex("0x7afdc9a99777d76b713e960e9f12ad4fe46ecb7ea6d5b245c6d9ee11d3fd35e7ae33dd6062fb6578bc2c2f286f1c6a4aa6a44cc80a88a3678c7085c35a0f2e5334ea686e2098fe5d179bbbaf81cbc349a15e7a21aa27f0ddcad342d980d056a356694cdadcef8db3c7866b6cb087c28f2aeed7a5bc9b1294cef0da3ac3b46dbe72d7f164f1990bc32f755b709b96a96bdd8da2c9d9300e9f6906040347d337fc21b833ff0b80305b22ac64a2df2dede4c01c65c192884f161aacd12ba56dab9189477e6ae484a97ff96e0aba1f9b8d043896b8433779abeec091f16b94a013325fe11096d1f2d79b701ab5b46063ac99392a790e617555fe3286dfd7ec0cb9b6"), + prev_randao: Eth2Digest.fromHex("0xc4021ae781a3b3a1dfb1e4464b032a3bae5f5b68366beb555ede1f126920cd5c"), + block_number: 11318858212743222111'u64, + gas_limit: 2312263413099464025'u64, + gas_used: 1, + timestamp: 15461704461982808518'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[254'u8, 188'u8, 92'u8, 24'u8, 153'u8, 206'u8, 74'u8, 108'u8, 96'u8, 100'u8, 148'u8, 84'u8, 151'u8, 74'u8, 73'u8, 167'u8, 65'u8, 177'u8, 253'u8, 62'u8]), + base_fee_per_gas: UInt256.fromHex("0xb1c4b2bffcb38aaa1f98b483441aa212c9dd951d4706dd505a973fd5fd84796f"), + block_hash: Eth2Digest.fromHex("0x8b150d453d802fdbb19be0132621a5e8061e70cfe6668ee6a63e4ff217434999"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[142'u8, 197'u8, 221'u8, 83'u8, 32'u8, 126'u8, 145'u8, 86'u8, 28'u8, 39'u8, 112'u8, 240'u8, 168'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[175'u8, 191'u8, 143'u8, 78'u8, 162'u8, 249'u8, 87'u8, 193'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 168'u8, 190'u8, 157'u8, 39'u8, 143'u8, 147'u8, 156'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xac5a7347865f503e1578d1b47271c8e60027b5ba24b0da8e7c3733bcdbeda220"), + fee_recipient: ExecutionAddress.fromHex("0x8b7fa656e67f6af2074ec3f16930ad742a69f189"), + state_root: Eth2Digest.fromHex("0xeb50f351f6945df8983cf4037ee264dcb2ceef3313ae452248571811d8a3a8cf"), + receipts_root: Eth2Digest.fromHex("0x860af6010832f64a5234327b653aabbd3898881a7b72ae42e08d4a1519166fba"), + logs_bloom: BloomLogs.fromHex("0x01a18d51076880a1a8ea86cc5dc5fb904ba0a3c285b7dff34ee5dbad9d64721f3849ad9f50b90ad4524eca6b0564f8a1a5827a7b476ea051c33a7c0e18db4cfb27b36476bbb1eacbc029dbc5009e5cea695045cfb34c868163514b784133f0f2998cf12e2caf9c74f69732ed3716396dc34d86725428aff48bf6b935ae88f5e4820b9a325bc670cf560dcb479723213a3156a9d7d0e7de0dc791d0eb94a691013624b8aa982ca3c9d5b49fcac8fafbb403c9fbceee5373f0fb2b77ff1bae8160fe2a47b01d792b088eb3fe24c53b5c6a8b4a3b59060d587ca7376f8baba58d57cf745b2a346f800a54d08545194e067ae260c73369a016b12d0fbc20abc78ba3"), + prev_randao: Eth2Digest.fromHex("0x330b7093023f617d2cb5f76cee4b078af002b68d81e3a5b5c9d37c4411871a95"), + block_number: 18446744073709551615'u64, + gas_limit: 13979513761871276914'u64, + gas_used: 6199089254852634745'u64, + timestamp: 7404562418233177323'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[220'u8, 149'u8, 177'u8, 36'u8, 228'u8, 88'u8, 47'u8, 149'u8, 211'u8, 213'u8, 170'u8, 40'u8, 207'u8, 145'u8, 137'u8, 64'u8, 153'u8, 22'u8]), + base_fee_per_gas: UInt256.fromHex("0xfc82d0e46d05b21aedab6f368183611d2885b28c52842f28f621ef6c631b6e6a"), + block_hash: Eth2Digest.fromHex("0xa8c6b2dcc2496f0230e796f8a69642126955ae6209a0d0c2dee2c925212f447e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[138'u8, 17'u8, 34'u8, 168'u8, 105'u8, 179'u8, 196'u8, 21'u8, 253'u8, 242'u8, 106'u8, 30'u8, 40'u8, 190'u8, 179'u8, 93'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xd3be9b45bfe67229afb47461ca2970505586cab8eb8e00f280ceb07a9d47866f"), + fee_recipient: ExecutionAddress.fromHex("0xde645d4a77f0a386a45c52357948e1d7eac5e780"), + state_root: Eth2Digest.fromHex("0x69b70e0188e7b88e38df90853b2dfd2e4c7181e83d82d77ab81c57d161216b92"), + receipts_root: Eth2Digest.fromHex("0xc01d94a01736268170a16196927029d4d8d7c65970ec78ece94c87304bed4568"), + logs_bloom: BloomLogs.fromHex("0x7f1ac5c77e3f0c8a1a103ee83dd7d0fd6fb13895aa1141de330445474b3216e2646c15c1cbf4ab4feb1e4e21c2e6970f4a6648675508b08111e00b62866b0f6cccd58afea87d2cd0a24c0384fa179dc33ae6d0db8c1b118a75fb442682b7cbecc2808fe8c812c3720ca54f6723a395fff5dd1720f41822c91b080503bbfeef21eea192d5b7c4160344996d017ab849fa97e862206caac8f8bfeba41865514b21a8d8fa9ce3dcc0daf5bf86fd2f07d222fc7a9d11fb4031b2cd72544d7f89eb95203a570bc179f9ba1f73f39d74049fe22b63939ea49d5d40f42c00c5f1bd429e84ade377475e432186acd9975914670052fea64453fca87317f62e29b550e88f"), + prev_randao: Eth2Digest.fromHex("0xce47da2b2a68186b78054be0894ccc9ae7213c18b9093c0ebc1b9ed011071a39"), + block_number: 9014833350824993703'u64, + gas_limit: 18446744073709551615'u64, + gas_used: 7874274181221487360'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[139'u8]), + base_fee_per_gas: UInt256.fromHex("0x1eb821a0ee3f9d2e5b49c64177db9ffc96ec6b06249cefa8c51d0ce7e664a3ae"), + block_hash: Eth2Digest.fromHex("0x99479be6429eac4a945ca8171d3d3ce42d7b5af298292e833e20462438e06229"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[99'u8, 198'u8, 91'u8, 86'u8, 23'u8, 222'u8, 121'u8, 250'u8, 12'u8, 135'u8, 133'u8, 37'u8, 61'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[81'u8, 173'u8, 241'u8, 145'u8, 54'u8, 3'u8, 36'u8, 121'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x06504beb0dc3bae44ef75678d29ec5138d87da68d307ca7d43e259cede60fda6"), + fee_recipient: ExecutionAddress.fromHex("0x527ce602a0be18c0944dc27b2864c711a91f89a6"), + state_root: Eth2Digest.fromHex("0xad3bbef5d22bdc2429da09eb85137c881f85fe6e6b3ea207e5eaeb399c755055"), + receipts_root: Eth2Digest.fromHex("0xf94fdc52cde20532cfdee73e9cebb61d9f7160191345f9caf58b45501d8effbc"), + logs_bloom: BloomLogs.fromHex("0x0999cc50752006a2bc8e5485c239b9a41be6ea2fd8f0392884246ef7d33bccdf4bd326fadae385e3ecc309bf0f367ac1791767ffaee90ddfa7bee22d19f417708fded2b2b6b3be2b6007745fb1de940e7849761586953c04e3bec3c9b6342d1b91dd024980f469b484bd0befc4941a3846d027390d6256e4acf9933e0891dd558270eb35d3455f4e49c890479e970a8008b75ff4d33b4f7e5a8c19e75d8abd8673ebb859a8a24907584d88f0d68b3142b3c6952695fdd84581f5a070601a575a8e7bfa0bf7cf0fe9d70a051005f9dc594d09909e9d079d02a4e441e5b3f33388de8d46cbdcdf24f835415680e569f2ed29acdc01042a6a7ee701e4e6cace5c28"), + prev_randao: Eth2Digest.fromHex("0x7cef96d72498facdb399dfb5b6d7d69185f3edc70715540fdc7ef651c4685c6a"), + block_number: 13066898984921201592'u64, + gas_limit: 9241830338892723842'u64, + gas_used: 8347984358275749670'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[11'u8, 46'u8, 127'u8, 104'u8, 141'u8, 79'u8, 55'u8, 48'u8, 242'u8, 12'u8, 142'u8, 2'u8]), + base_fee_per_gas: UInt256.fromHex("0x6241db2a44a58a2c1aac93c4aa18aed5add30d1937c31078542bb544bf9ba2df"), + block_hash: Eth2Digest.fromHex("0xdc1756667e7c3f1615650cbbaae1117a6bac817c6579cf3f7afbc93277eb3ea1"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[13'u8, 24'u8, 248'u8, 26'u8, 141'u8, 177'u8, 236'u8, 2'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[213'u8, 208'u8, 242'u8, 46'u8, 0'u8, 31'u8, 219'u8, 213'u8, 197'u8, 218'u8, 148'u8, 236'u8, 43'u8, 152'u8, 123'u8, 96'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 163'u8, 60'u8, 195'u8, 40'u8, 68'u8, 185'u8, 20'u8, 244'u8, 82'u8, 34'u8, 181'u8, 26'u8, 201'u8, 2'u8, 108'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xb5d4a5eae3a1ea004ed573b0b8f8a22c847616758c0faf1e7e9589f16e55415c"), + fee_recipient: ExecutionAddress.fromHex("0xf7ac0877fd8bcadde1e050f6c7ddad13688ec071"), + state_root: Eth2Digest.fromHex("0x7472f824376a723894f8d539743c7f93b69839772f28cf6a83e2102fde99c3c9"), + receipts_root: Eth2Digest.fromHex("0x750365b5d975460a64f07758abd0cdd44cee23cc2d4f06f2a047cf4c12c23db4"), + logs_bloom: BloomLogs.fromHex("0xe24d8452039bddd10e1252c1ebf9b9e81a22577f940e8708d200548717e8471e130a7066adc48785a8dea1dca05953d6be16504a57112c065e7909586cd611af9e0b840b81caf0532dbb2833ee5ac6a6eb7b6c990cba6ccf6f4ddec5a7c76f8296bd2a693cbbb43b1d86b66f6aa58888734d3fb21cf5e96f1b981f8ae2737bce1cad1cc458650291cf7a3d22c61fde6af3a07a44bf1b334b2c5dabbef16e5e73db75e87f04670cb3830f0a7badc702e7dd37a59ce02992f4473a909e57dee1fdd22cfc886f4fcb6ea205ec9234a8ec85ea134242748f9f10062534fd0528bc1b5b1e89511cdf91a1e7fb4f8c58c93d2a6c75e48a2d48235cb7de13040db8dc9c"), + prev_randao: Eth2Digest.fromHex("0x2410823a37c763e13b03a4c48e32f9e43b8440ca31ecfe8e0543a20a02c496c5"), + block_number: 14920119354157670036'u64, + gas_limit: 17193947846593799248'u64, + gas_used: 2176791850599260430'u64, + timestamp: 12670133468877091192'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[31'u8, 7'u8, 1'u8, 212'u8, 152'u8, 82'u8, 167'u8, 57'u8, 116'u8, 147'u8, 97'u8, 109'u8, 219'u8, 207'u8, 151'u8, 116'u8, 43'u8, 218'u8, 91'u8, 253'u8, 14'u8, 182'u8, 102'u8, 57'u8, 153'u8, 72'u8, 172'u8, 208'u8, 0'u8, 64'u8, 97'u8]), + base_fee_per_gas: UInt256.fromHex("0xf1daaa067663bf3277b9149aab162f4e330f988f0be8f83a556743a57ae5c8fd"), + block_hash: Eth2Digest.fromHex("0x5d462b4b243c6292b6a3b32f4e05849c0613d0a61954734c524f75f8df66cf8d"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x2629683cfc70198038837270bde3c60176c2a4aeeced0d4a4f14dc99a380c377"), + fee_recipient: ExecutionAddress.fromHex("0xd234af1937861b66ca84c334824763fb54347677"), + state_root: Eth2Digest.fromHex("0xf79f02d52d7f2a4be99eebba3dfb3bce74136ea739da515703d095a66ce203d5"), + receipts_root: Eth2Digest.fromHex("0xa97ae6fa5d6937f7754ff96766a54bb8ec082b046814e74f6c9c67147795f526"), + logs_bloom: BloomLogs.fromHex("0x5d2ef8bc2f58a84e4050e3a38985e4c267940707c8da3f687fefb9e22e4ae11a2f79a24456af3758e8b521d546dc178da5c85da869ebb2da551976488a769ca2940fa20853e4e1d1fcf8d5bbea0d16973c827d38c97c47c57835677590567829d119e8108f2ee3fa988b267ccfc3e58e5f81c18c775a9baf06d4d81aee405c5683fa4e5e891b58101a27e8f71c60d357a4ab8bd02e12fbbb0e363c4632b0a3c0de638de37448c9476c65a62f7f1dd9643fac6ff78ee431d18ab554b4c8a1984fb5fa0de3464d223f236eb8e8a8f59601221d2ab480ffcefaf4bf6471b40a14773ac0cdb43aea505941e4b0fa6fb26eb091adad77acce41e516fc743e5fdb045f"), + prev_randao: Eth2Digest.fromHex("0xbe44d7c5f844a2acb307a4371784d7742be482aece83368d94813ffa1c7bb60f"), + block_number: 13524449277995212660'u64, + gas_limit: 1, + gas_used: 7976957374052242924'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[57'u8]), + base_fee_per_gas: UInt256.fromHex("0x6c98d9ff36f1032fd55d8a6038d7b1f7c4e5f7c884b73f626fe43e687beeb46d"), + block_hash: Eth2Digest.fromHex("0x2c95101857b07bdda0502741da8cd9160ec0474929d132e9159098576f9a7c35"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[75'u8, 85'u8, 130'u8, 87'u8, 90'u8, 172'u8, 176'u8, 44'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[207'u8, 150'u8, 64'u8, 87'u8, 15'u8, 18'u8, 3'u8, 236'u8, 232'u8, 87'u8, 174'u8, 192'u8, 29'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[23'u8, 37'u8, 57'u8, 158'u8, 137'u8, 222'u8, 53'u8, 111'u8, 63'u8, 13'u8, 69'u8, 110'u8, 175'u8, 108'u8, 16'u8, 207'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x190544155dd98bf86d3ed5ee94d01afd3a8e67b8476f94d90604706da0a7d340"), + fee_recipient: ExecutionAddress.fromHex("0x799d176d73d5d6d54d66941ad6cef8208677371c"), + state_root: Eth2Digest.fromHex("0x07e626b9c44b0ff14586d17acf79cb136ccc5d37fd7135da33cec516af168f43"), + receipts_root: Eth2Digest.fromHex("0xb8b100bc5c155fe6358b9a16756ec06880365f5fe89124cf9fea963e26d3770f"), + logs_bloom: BloomLogs.fromHex("0xc314d3d6ab41a3fce7433dc286ee5c9820d883ff572ee7dfd2f4ee745f11a71f6dbe142d8c14bd6cc76782f1bb2b3770e65a929b2187581956bad937907a124c92ba10686763ddc87ba5b4a4e9cf4b9a35255fad5f54b404aeed5ad9859b5f9fd3c137e9eb6ef394a10b8ad3fbba75ba38c2cbfb91fa793ac763e8cd31481fbecef02b3365b990f5120a2970f2779574c60769347ae334a9f39bb3d3ad35182f7dcd252bfe9663c4f54b44dea8d79e3bcd89877231e81a9e9f5c1eaf5da1f56ffc39c23fc3ae6c130281c792a31e7a60115d46abbe17807cd120038631ca7a6636c8c644b57719e386cc8ada32ce806f75110ad143522fb0b240213df4bab07e"), + prev_randao: Eth2Digest.fromHex("0x17e445793c0e354ee43381ded194220ebd87ccbacef83e3da5a1cd3c8c57bf49"), + block_number: 5728529601694960312'u64, + gas_limit: 9410734351409376782'u64, + gas_used: 16470261240710401393'u64, + timestamp: 8811957812590656903'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[95'u8, 124'u8, 151'u8, 79'u8, 76'u8, 171'u8, 74'u8, 213'u8, 207'u8, 202'u8, 63'u8, 2'u8, 182'u8, 32'u8, 115'u8, 65'u8, 90'u8, 186'u8, 34'u8, 63'u8, 241'u8, 191'u8, 88'u8, 10'u8, 197'u8, 52'u8, 33'u8, 98'u8, 78'u8, 210'u8]), + base_fee_per_gas: UInt256.fromHex("0x3c1ba8cf82268c828c1a7f249328741ae21f35a7659365efd7496df94dbb85e9"), + block_hash: Eth2Digest.fromHex("0xc2b2bc39ed0cf5764800d3c91401828ed32d0eea58f9d336c32f9e6f7200ac8d"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x86d7b430f69b215ab5ae863998ce41f01a5016376c8bec7f5b7a6e16a2326d92"), + fee_recipient: ExecutionAddress.fromHex("0x73068946d757f5d145a38fe9de817b8b1e9d6c43"), + state_root: Eth2Digest.fromHex("0x312b4af4d3ca5960dda2f99531819f5c32624753cc0756c05d242f65dd605d92"), + receipts_root: Eth2Digest.fromHex("0xf3a1e8f784ee4bdb897d1511ce642276e2ecbc1f21bfde9caf7c4479b7fdf902"), + logs_bloom: BloomLogs.fromHex("0x633d228aa8b2b9f4b614c4b7c7aca616232d61bc6e06ca28f4b94bc39165cf3ca2e090cebbe8a5b66b161d92e65099503327f9f2adae6ec5a73463063a994d73f37e12caec8f6d439be7520b48b25ccfa8ff64e6884b7e240c8dfd0100a23f9f644da13f1628d989eef92806c9f936a71f470d710653355acd84fb23ff15910f1d2866d83b036246c46a681e762b9a19e72aab21b428c4710511d0a39cc5ec39ebf3aecb5c19096ab32135a629abc8cdec39b2b3631bf4e86bbfb824276fd728bef454ed981e5f9e8a4bb96b27f09f661c5c221f63a26945174162496496c9bbf38cd894c50fa69df0a8c722ab48d75044bf43468639ae9b61d0b5a2f9d819eb"), + prev_randao: Eth2Digest.fromHex("0x3a0689ac32c82a6b84d3230fdc6e2c1e89671fa3906336ccde9fb7cfd1811ac8"), + block_number: 9465334901279616671'u64, + gas_limit: 17844363972830076325'u64, + gas_used: 9534663249377184661'u64, + timestamp: 15490999633909732541'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[199'u8]), + base_fee_per_gas: UInt256.fromHex("0x9fc9f32819a67c4aebae259b0648e2b82f526ce8eef8fee33961f9fc69653b2b"), + block_hash: Eth2Digest.fromHex("0x1ac3f16da76520977c5e5d86f0c261d76e18413c202e8a46241951b3a80ca601"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[223'u8, 37'u8, 18'u8, 125'u8, 208'u8, 57'u8, 114'u8, 113'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 181'u8, 143'u8, 219'u8, 145'u8, 77'u8, 39'u8, 126'u8, 173'u8, 30'u8, 59'u8, 70'u8, 205'u8, 51'u8, 16'u8, 213'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xc51bf481df9be981c6656081e3854ffcf27551e2b4fdaed4ab12b355f247f4e1"), + fee_recipient: ExecutionAddress.fromHex("0xd79098c25eed05c9f6d55e95f5f6f58c1472fb28"), + state_root: Eth2Digest.fromHex("0x1a6b1eb78e5ac155d4be247a3b48d8d8d8574a16fa846681553037629b97ffd0"), + receipts_root: Eth2Digest.fromHex("0x5e44d4a3621cd8e495edc0b208f977c8d3f8e79a78fa7ecfc4a0f6e436f67b71"), + logs_bloom: BloomLogs.fromHex("0xe2b0dcfd2341ceb9c4edbc7115dbd6ed5f1c54ca39bee191fdaaa34368acee93f48561094dd23a3985ea2c2b83d918ba9dc671cde7732a591b4f9abd2eacf9d6416ca8c8d556052a98df2cffdbb086315585004c51c76872a06cee7d318f4845c0ade4c907c7933d4d883bcc586885be04ca9149e05b1624856e69e1efe8c93cd55d840bf71279293a118d51d4391fcbf4e6abe6ee50492ff2de085069a3c7656eb3a749d6bf46f56a2acd93a6840eb78e09a42f23fdea69bfbf017f4fd6b4a8d17df1aa5147c1897fe5fda1f5e79121f2fefef97117e7871d1cbf5b0b0350b9fc497c5aba27cbc129d452d6a60effb76e08b890d0bb856115fcfe3966359fda"), + prev_randao: Eth2Digest.fromHex("0xcd6fd69596cdd7df95e0b68e8ade01541b12ed15caa2b59803a4c4e6791870d4"), + block_number: 12264963829660560313'u64, + gas_limit: 11775806146734810959'u64, + gas_used: 1863395589678049593'u64, + timestamp: 5625804670695895441'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[183'u8]), + base_fee_per_gas: UInt256.fromHex("0x1443705192ff4dc1a819be4f22b8dcd6e7802337e62082880b1090f44a27d0e2"), + block_hash: Eth2Digest.fromHex("0x68da52444eb5322f3a0bda6bdc9a3a11a540dbd22026bb2d24862bbc32af9460"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[212'u8, 80'u8, 176'u8, 133'u8, 132'u8, 119'u8, 233'u8, 131'u8, 195'u8, 118'u8, 54'u8, 94'u8, 129'u8, 206'u8, 47'u8, 107'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 31'u8, 192'u8, 94'u8, 136'u8, 120'u8, 228'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[114'u8, 23'u8, 239'u8, 220'u8, 169'u8, 188'u8, 213'u8, 179'u8, 223'u8, 129'u8, 189'u8, 50'u8, 158'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x8b3e7e8d447527b9d00693389928260e7ea9da6855efd99369182bd9c213988a"), + fee_recipient: ExecutionAddress.fromHex("0xb45716c9aeddeb030c0b94202fcb97bd75a039b6"), + state_root: Eth2Digest.fromHex("0x8114b285e5f3277c04a66e660fef3b86295d6ca859dfa216df3309c0a7242f2d"), + receipts_root: Eth2Digest.fromHex("0x2a3ff38541ef83faad176c3c98ceb5c55622dec83fbfc5a19bdb27646849e852"), + logs_bloom: BloomLogs.fromHex("0x384a9b3d38d343af68d00c229e79aa31f2059e17c655f5e48d31d2b59b769660e91c1e5f386e4f7dc83f2570029a6f2b3351623fcb4dadd6b5b7b26e27de19e248ebd970a9678b69403ea8e16fe88562959586fcfdee3c407fcf623c94891a2270ba1829bf2ab77fa32913bb11c8a4a69e9baa6544ad336253637626b16d4a98884e7ac7d6c1e697a9435b1e5403b5122eebddec9c03c8a6c8fed0d8877888371e133fb837d33f073375f7e1536abf622610734b9b0aced8a891f02d5b35734e58b0ead66c49ed9f898b8f27e9415275c5d15051ec00cb006f8aef702a7414aefacfa9742cd3d8d34be817e0c731696e20b973cf2da66799121c0c6d12bc835d"), + prev_randao: Eth2Digest.fromHex("0x3bd54c7151dae2ad524b4df0d4283e3641ba787fc76f54221dba3a2aa556a1bb"), + block_number: 18446744073709551615'u64, + gas_limit: 637978774023867007'u64, + gas_used: 15110835166938431016'u64, + timestamp: 18065456863038184935'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[235'u8, 229'u8, 162'u8, 249'u8, 154'u8, 135'u8]), + base_fee_per_gas: UInt256.fromHex("0xbe93cc3dc2bb7e012db659df49e57653bf6ff21354c64eeb69c0002e9f933035"), + block_hash: Eth2Digest.fromHex("0x46cb3f590b2fbce372e67968a0d2ff4ce1b2c530fcc26b7a24ed6db054f52035"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 66'u8, 215'u8, 40'u8, 223'u8, 195'u8, 43'u8, 228'u8, 225'u8, 244'u8, 34'u8, 14'u8, 117'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[92'u8, 46'u8, 215'u8, 218'u8, 71'u8, 99'u8, 115'u8, 119'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xa4854e346d2e9a921cc6b3c4ce9fc739c99795cf10002924089f9886f8624d59"), + fee_recipient: ExecutionAddress.fromHex("0xa88781cf69a1eed63bcc3a32b6f9aba35d4f5b5e"), + state_root: Eth2Digest.fromHex("0xdc06d9210fd2738b0fa9df6d68e4ffbfef0dd7d7d8093fdbcd97ff845318cf6b"), + receipts_root: Eth2Digest.fromHex("0xfe1b70c143066edc444f9b49e778cf6db0060bd4e9122564350cf23061830439"), + logs_bloom: BloomLogs.fromHex("0x095a57c3f2d97aad8692cd09dfdd8388f1bf9ef98a1c3223ecfd0aed17d8c7c3ef593d7f09ba86500644deaa676df811da501d572f342e3f7ee7b9b081992f344f71fa50b3b9635d7375f67dbd85a0b1ade3d8d4778118df55b90c44f7dd1114f2ebcea5778b32701ef94af9b3713d1fe00275e09c7e918d7c529a37aa9de3464eb6364812ec486464ccbf7df2523369fdeb1b28955e35e8685c16f07fbe342edd1bc044021ed480bf4ceffefb13eaf4550c67ef8a5079f3f612f07fff60193eda6ac11d39f3056c41ea4355ef5ef7f311493c415cc8c42cb30a73dd58098262acebe6d901e4bae26b6e1eba693c7dc596ea27b0cdd4fee2f6450ca8b50b1a70"), + prev_randao: Eth2Digest.fromHex("0xc52844ad11072faa2222ffe9cbff77dcc7f681367d2aef5f1c3b206140064195"), + block_number: 767785029239287422'u64, + gas_limit: 15062566578072747104'u64, + gas_used: 7648884410596067087'u64, + timestamp: 4380084205540210041'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[217'u8, 40'u8, 125'u8, 94'u8, 156'u8, 71'u8, 79'u8, 66'u8, 117'u8, 228'u8, 173'u8, 189'u8, 115'u8, 41'u8, 153'u8, 226'u8, 130'u8, 21'u8, 108'u8, 194'u8, 206'u8, 218'u8, 141'u8]), + base_fee_per_gas: UInt256.fromHex("0x436767990abff9288346859c6b85b8a972421619eab2253483385c8151cb2016"), + block_hash: Eth2Digest.fromHex("0xca4f05c33836d82aee8230ef660016b993bca4aaf9a7b6cad96c2a0193eb026c"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[156'u8, 143'u8, 203'u8, 250'u8, 238'u8, 137'u8, 34'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[64'u8, 44'u8, 165'u8, 9'u8, 1'u8, 211'u8, 27'u8, 108'u8, 166'u8, 61'u8, 119'u8, 11'u8, 222'u8, 85'u8, 48'u8, 185'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[165'u8, 95'u8, 221'u8, 213'u8, 229'u8, 134'u8, 185'u8, 221'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x5e7b12465e0461e5dfa59a3254282378c55961b0e411023ce89d968bbdc33e9c"), + fee_recipient: ExecutionAddress.fromHex("0xbd1a1396ab49631cc933770944996b294da97d43"), + state_root: Eth2Digest.fromHex("0x74e6ccfb15da8afb94eebf28cb3ba3f9ce63e3354097f2f2527fe1cf978e76bf"), + receipts_root: Eth2Digest.fromHex("0x8e48bee56e149d1851cff0740ceab06767bd0e819261c5a2f75dbea382a110b6"), + logs_bloom: BloomLogs.fromHex("0x7894fbe58c624a153dbb160c516c9e82bd0cacf5f347f984efcca9450e9a20b50e058ed38e41c331df61114086f8a6b8a049467d7dafd812953aa593b2e9fbc056f0dba80973b2eaae8814b5e0804300eeea15613e59c8d34339f58e1b45599361497a3608c05140cf432e7983a30985aa0faf45dff56dce99eaa5ad3418722df17eaaa4e8df25ed1d9eedee1390e6440c4c37675182dcc07ff199d6dd015d3aa03194765e85fc0d4759d3c693fc2550e50835b88ba41d10fc33b58550d813abaa75bab39c0fbe419f1bde8fb82db9fcfb79894faeed84b2314f115a8fb9e276315ccbfb8e9650571add358f594ff2fb4ab9661afde76081bb2cfbfd2f26d212"), + prev_randao: Eth2Digest.fromHex("0xb9a9bce05e42cf3d2ffc2c2ea95164c9b215fc8e440dd2985ca24cff40e32780"), + block_number: 14460352585391846826'u64, + gas_limit: 2426408612341958329'u64, + gas_used: 13656152006197676019'u64, + timestamp: 6263571560389404595'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[177'u8, 36'u8, 79'u8, 26'u8, 164'u8, 59'u8, 182'u8, 88'u8, 223'u8, 22'u8, 79'u8, 197'u8, 109'u8, 53'u8, 53'u8, 134'u8, 244'u8, 84'u8, 146'u8, 158'u8, 234'u8, 252'u8, 188'u8, 175'u8, 69'u8, 51'u8, 118'u8, 101'u8, 242'u8, 0'u8, 51'u8, 103'u8]), + base_fee_per_gas: UInt256.fromHex("0x997e6c8ffbd1ea95e875612109843c6cdfd0c6bcaffa1e06ba303b3012b3c371"), + block_hash: Eth2Digest.fromHex("0x9a7f83cf6a64e153fc3316244fabd972a49ebf5dfb173d7e611bf3447a175c41"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 103'u8, 164'u8, 112'u8, 136'u8, 91'u8, 170'u8, 241'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xa8f90a617f1f230506d200c6026bd60e38f599930ed04f90cdc320a6d45bb022"), + fee_recipient: ExecutionAddress.fromHex("0x3531157eaf2c185bd8720f3edfaf76829632f07d"), + state_root: Eth2Digest.fromHex("0xa16f8936e945ecd45a4ae107e46acd8530e438fa1bc8eb85aef62afaca1656da"), + receipts_root: Eth2Digest.fromHex("0x3e76522c8f3b7e8d8a63f4968ab15413b8bbd7af9782c4878b52213b0b3d13f8"), + logs_bloom: BloomLogs.fromHex("0xc13b59de763feaa39debf70d280364ec68eb578af8a90aba7e2cf3a6cee413a28836c674662a0283df8ff04964eb928de97a3883226950b584d773c9b4479d6d5bda6fd71951c0c846752ed688e13dccff947b7a6c81bfac198b6bf785bca7be28bcf9a208b983afe6e766b0536311c1c12b4d01c712cdaa167ecec5520395068b1c1f939d20962de1aba36454cdb36031fa0ba886a8ece71234654e8b081562452046a388ebcf3cfd975493833ff4e146d5e5ddb061d994461ab8b468cf1d6d491d78fd8923f9f6563e3fbfa72639de993701ff6214fd83cd3597e870dec1c1e788a4f01f881c48e57b07c5a217132658208d2221a86c7e9823159984d235b5"), + prev_randao: Eth2Digest.fromHex("0xbac4a9aa16b289584d13abe3c47a58dda713c4b479ee70e1ac7b3b698e8505af"), + block_number: 4839752353493107669'u64, + gas_limit: 4713453319947764960'u64, + gas_used: 3470256075652600568'u64, + timestamp: 13764471837770950237'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[60'u8, 109'u8, 153'u8, 55'u8, 17'u8, 196'u8, 17'u8, 96'u8, 202'u8, 173'u8, 16'u8, 189'u8, 165'u8, 107'u8, 68'u8, 230'u8, 238'u8, 62'u8, 199'u8, 211'u8, 244'u8, 83'u8, 88'u8]), + base_fee_per_gas: UInt256.fromHex("0x3adad83f48e34c6220dce41ecc0b09f9bb1ae4bda4466935c70e7c6cd54e185e"), + block_hash: Eth2Digest.fromHex("0x9183524f908425608c1e3a80d7c4ac2c539903af4b3a2f1b22c3283281706aba"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xc914f63464f3f1588a32d3751900d415bbf1fe002c42068650f5c7c588b1935c"), + fee_recipient: ExecutionAddress.fromHex("0x61523b6add59cc65d3c5b75c6f749fa601e157de"), + state_root: Eth2Digest.fromHex("0xe84ecb995f6c7e753355c8d2e24694441c528b65ef9b1d8c6f4e9d98d409342b"), + receipts_root: Eth2Digest.fromHex("0x887bdafa340c24acb58f36a7e3825ce39fb7e0caaba3a9b63f78d2186cc6994a"), + logs_bloom: BloomLogs.fromHex("0x1fbd358ad7e32eefe4489b6c72bafcf6dbac109970e5c103e329279cede3619faf1309faf266ba155496c19565b31562f31539c98b6256919d8950bb6eca937401d91fa5b3032b4400ce6dd60a8c1c6cc94331b7e78d7a350ebb5d6e04a2594af981f167a89227c7c902dbb8eac3d7b54177d85214a6ef57b50da82b6420cf914fd63171f0b7dff9233bfaa2069774b142a136c5183ed4f57cde2590735b19ef549ff5bc910477b98344e7557ffc440b03d56842f356a6e223fd052c6272e24f43dc9e64055c097d81b56ecfd6087238602a743e09c383ad4eae6ef449570febdfebfefa347f06f480f319ff06365bbfae16b62a950143f9acc3663510356f0c"), + prev_randao: Eth2Digest.fromHex("0xc755584f86084ab2e62bd58f25dfe54538c0171e6447e7e1a51cf05db94377da"), + block_number: 9276126375553452674'u64, + gas_limit: 9007257403963034102'u64, + gas_used: 12806310385580231715'u64, + timestamp: 9957937708118639445'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xe2df33500d1162994934e9fa65fd5db641b0be2b61a6c302c7b9019f86042338"), + block_hash: Eth2Digest.fromHex("0xce58ef51926a6eb4cf2997c4ec771b54907737ae8fe9522fc316c97a1c7ee6d7"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x086322b79160568c7d096747ef351338ddc93f252dab1df3ef65aaf24723d2c3"), + fee_recipient: ExecutionAddress.fromHex("0x03c6998b5a3ff1c98538c2333d279f2b1cc59f7f"), + state_root: Eth2Digest.fromHex("0x446d99a7e9fd2c327fbd445dbfb3b3e3a895cdfa6f208496dd09c0f84f7ac0fd"), + receipts_root: Eth2Digest.fromHex("0xf4c74d5c59c46f1d9f916b32d8a12939cc2a379bae83153137de76415f6e5afe"), + logs_bloom: BloomLogs.fromHex("0x40f87c3729ba599c3e9bb749c48148ee0d5563db71cf0daaad3af95c45622d7b2a64204157a92a93cf0ffbe0052fb79eef83ba8389fe9d9e7646874b0636960e4eee86eeca00ba70f65b2046620264b795852def9beebb671f841e19ce07934b7c2f66301cc3c7dfa2606067cdeb04a564b87e56ff3650c7c6bbbc96b2de5ccf8e314ae74a26347371c315062532a1f1a2fe0c417ed5d12b6f81c3440c0d8b19d0cf8a030be83ee7ada6046d75098b6ee66664ead786a65ef5cdcb33c4634aa07cd7490abc0ea9ce722423a0cba1aecb379552e89483de43dd321cdaa8a005ab7e8e2a958038ca12e2b08709348a7f6daf34c488add1a0a21aed0da0b64251f9"), + prev_randao: Eth2Digest.fromHex("0x2ff08bd0b22bae8c3627f61b8da627fc367b3a60f93dbe48de1ca6f25ada489b"), + block_number: 10605470807350562909'u64, + gas_limit: 587854351728657338'u64, + gas_used: 8799032544585725320'u64, + timestamp: 18028498231539883963'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xfbe348f0c77be2ddbd3ec038e3aad88107625dc6e96b1fb3bbfdba8c737a3d7e"), + block_hash: Eth2Digest.fromHex("0xc545e833aa2ee5d708e041f4dcb44bda654372b3f5f660c683d12230303da729"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[89'u8, 59'u8, 131'u8, 146'u8, 186'u8, 180'u8, 208'u8, 76'u8, 69'u8, 40'u8, 29'u8, 211'u8, 97'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[208'u8, 136'u8, 157'u8, 0'u8, 120'u8, 231'u8, 99'u8, 33'u8, 31'u8, 210'u8, 80'u8, 203'u8, 24'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xcfba7f4aa4ff01d3d9de84dbe1761c79627a10c3188fb0a7c8adfa0d489e6441"), + fee_recipient: ExecutionAddress.fromHex("0x106b3bcaae4ff58dd837768be35c29c48571e4a4"), + state_root: Eth2Digest.fromHex("0xe6242399020361e70cb6b89701001fa8326251e6bae3b4ca1978eded8831d9a7"), + receipts_root: Eth2Digest.fromHex("0x3db0f9a05cc39be94414c3be28378d2b91ba3ff43ea2ea7e4e0a1874a0983f58"), + logs_bloom: BloomLogs.fromHex("0xd591169a3cc38e0837a76c4d7057f94c1ef08ad5af1778b1b06c3a0ec85201bfc659b18c49de831ce6b4a40f0d2800a9cc9001f74810c58473f9b973b720f84626cc9270b0428439b985043f5d9c3289ef8a794f5b8265e10e9fb9fa53a93887d270b8204f8f16cd968e295b0a06aa70e9f6f174733d251f3bfc644a7fb274b0138729f18c0e4382bd4bf0387870f633ed897a125ca854120c2885194f3180af4b62760db96da51f88ae1cd222f49b00fbbc1544eb0e98cea67e36368816f541723158d3691f3cf1509c65a51a8e68efb66c500dd6516ca1b02aeb4e0c13cf5bbead53672fb5a7a1863c8edfaf4eb9a4b4322a39d8643528bccf22493914fa01"), + prev_randao: Eth2Digest.fromHex("0x14fec0a1edb9c82dc9aa7fb7224791c51a3937e74e5da59646123867496460f2"), + block_number: 6272046003849350913'u64, + gas_limit: 15423951135645467684'u64, + gas_used: 3743939155619454195'u64, + timestamp: 8496536260448579184'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[152'u8]), + base_fee_per_gas: UInt256.fromHex("0xd8b104041bdc4c76a9735e2b4b45f0f3612e8962f672aaf511f06a94b48562c8"), + block_hash: Eth2Digest.fromHex("0x8ca67fec04b7e3bc5a01f5bb265b93b4488b58ec2ac7f2c3ced030311de2762e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[152'u8, 232'u8, 136'u8, 228'u8, 253'u8, 248'u8, 85'u8, 92'u8, 103'u8, 38'u8, 106'u8, 166'u8, 148'u8, 8'u8, 37'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[58'u8, 215'u8, 97'u8, 99'u8, 152'u8, 126'u8, 14'u8, 252'u8, 64'u8, 87'u8, 242'u8, 60'u8, 210'u8, 217'u8, 75'u8, 189'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x063bc56b731eeeff8bf1c33d88523a04a14fa0c745eb3c750139842d88244982"), + fee_recipient: ExecutionAddress.fromHex("0x415b1cd5b42709a3724ab2f6f50a6dab7399d7ca"), + state_root: Eth2Digest.fromHex("0xf261abf37066b8dc5c868946346c98aae445adbb48e6dd05969fbb49267a276e"), + receipts_root: Eth2Digest.fromHex("0x5a337b7ee29d98e22b461f43b7a87e52d89fda2e7a3487ea92873be04a49ea68"), + logs_bloom: BloomLogs.fromHex("0x01817fd642526acdd8b57b4fc2fb58aba269095ce220ae5770004055f550918778021eae3abeffff1b3fa9fba50ff8d532fd8e2e67da7bdcca1cf9505179f19f595f5d9f09b98d5bc7d1ecb22527255e8e161ca2124c5fedbb59527f91a242671177e33a6fa377d585ebdbd6d9ff2bf80bec3695657441e35da43861f14b9a7e65ed475c323ece62d84aed7262cf3fd2b06ba03695e2e26e5e58fc5b8b99d519fda879587e3764930e3921aa15b2ee8691ea0e738030acb8832ca353d3bb63fbc0150c532b842cd053abeae8238c9ffe6f4b2b7210dc862c48843ae2a9088ecdb8c258592a0feb5215b8c9ad494ad896379d86e0ac89e6cd8765003ac5c95cce"), + prev_randao: Eth2Digest.fromHex("0xb28f434f3f40e40693b0c1726a018e2b3bc13c41608a2ca71aa5c8bf61829287"), + block_number: 14597257287993827247'u64, + gas_limit: 9090926713872599867'u64, + gas_used: 17391976671717618186'u64, + timestamp: 13439825139187707720'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[73'u8, 163'u8, 138'u8, 201'u8, 62'u8, 1'u8, 37'u8, 90'u8, 157'u8]), + base_fee_per_gas: UInt256.fromHex("0x8a42339ef76757729ef6c4536b3b59255b18d7085d8ba786275b2076fc55b3c6"), + block_hash: Eth2Digest.fromHex("0xb3f6ec11b285a105833f5b68b67e8e23c85c28df2362a13a76db705f110fce8c"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xb31c41d39ef7e9a9b905cc93d82264415024d7daef48d886f1b3bc0fd6545edb"), + fee_recipient: ExecutionAddress.fromHex("0x5ad4b6c0d6b986e775f3a9ae2be73a330ba9f87c"), + state_root: Eth2Digest.fromHex("0x01dbc857a3d8994cf10cd1be3b2018be0e26ba54a5456e10a6e5729328a0b5f5"), + receipts_root: Eth2Digest.fromHex("0xa51e9cb9893bd7d73a8fd4e5267d80ddcb29d998814cfa9980dbae50ef101aff"), + logs_bloom: BloomLogs.fromHex("0xf1280db0ef6bb796e70dfef3b0bafa62690ef1e8f14a237856bae5dbe29dfd43ac789c53305ab5b0b7cc48ed53d1236ab9433a5352dac55b6e0a3ff90e9e815e2ce16fe5574c87f0066090c39b811996e2974da0bdb8bb59eb044bbb6bc2d7f8241093c7143a7c9892be85ea4284258ea2477f6a677d424efb6469724d641bbdc3f9254529b6af5cc5f5a77dad49c1a59ae37c19ffc69f6e331139b6ebac306ea09460dc0fc5791ef2cfb9e7bf29d662872e30b94384be90416df03bef5cf5a2339af4745f2f620fd1320d3fb79848692719cb8956b8efd427c9c0cc3ea6efb8f84feae0075ed10ec5c6243074e6004849712d8d1dd97ebb2948fcdf1d020c6e"), + prev_randao: Eth2Digest.fromHex("0xc8a27f0b7850de04e3d794b9e9d4f144c356f864401c3f802927faf4b88b47ac"), + block_number: 10821099926525463598'u64, + gas_limit: 7115919978619568727'u64, + gas_used: 1, + timestamp: 5900615379943209755'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[56'u8, 176'u8, 67'u8, 30'u8, 11'u8, 27'u8, 136'u8, 121'u8, 86'u8, 17'u8, 4'u8, 121'u8, 11'u8, 222'u8, 158'u8, 78'u8, 56'u8, 66'u8, 243'u8]), + base_fee_per_gas: UInt256.fromHex("0xfbaacdba879288838ff725df19b7a31148ec5a24e7989441544d6dec1c980034"), + block_hash: Eth2Digest.fromHex("0x04616c0808df7a1bc177bc48cb6ed865125fbbac2fa3e3c36f33a5f1c48a23fd"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xf6cba3ced37c08da230babbf9d1e360661e5a21ac235fefa75cbe756f15809de"), + fee_recipient: ExecutionAddress.fromHex("0x0c080349793b7f43fb3ee9101889e7d32e02c01d"), + state_root: Eth2Digest.fromHex("0x6a33580fc482e9783d66bee9276f42b74a2cbc2b7434fc408a6ba9df77db0ceb"), + receipts_root: Eth2Digest.fromHex("0xd896daff74ffd6ffcc088adba01aea52af82d861b7ff649265a750e5995dcf31"), + logs_bloom: BloomLogs.fromHex("0xec00c3385b735b6a4088ed066bdb088e7826a2830fd13a1a1525c4590eb08baeba81bb511bbf2db2c0547c69c10b5c6c1bf5c8e5a7931584e6ed8ed7357431e1e2391fc0e61a060baf8984a6fd5c04c68fe0f28f94281d0db663b1b2fdaad9b51d3a12bb9fba255c923dea5ce45dd68ec2c5afc9fd13a0e24d234a3c8c5f255e7d62d48a8e01fb5c1eaf0c7a68a616ac935416fe3332943d78eb28a48a180e2bee26e85d786583ae0609a8b98e1045738f054aa12bef97593cd16d8d795314bfff33c51b397afa2299a4a64244817e5a07cdcd75eb4c4c06e8e943d8d1db8e65f17368ab6175c3e14daad0b99fd0f1050feebadf9db8fe8f1c19ed867f4df676"), + prev_randao: Eth2Digest.fromHex("0xdcd37bc148c25afa7e320009ce19567108745ef5ed57781f55df1d73b707e26e"), + block_number: 13754339262807377549'u64, + gas_limit: 5250261236890759949'u64, + gas_used: 1335844244115849195'u64, + timestamp: 16758901654456753273'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[28'u8, 8'u8, 171'u8, 122'u8, 126'u8, 38'u8, 142'u8, 246'u8, 162'u8, 197'u8, 241'u8, 216'u8, 158'u8, 184'u8, 73'u8, 191'u8, 208'u8, 5'u8, 79'u8, 231'u8, 254'u8, 55'u8, 126'u8, 97'u8, 184'u8, 78'u8, 36'u8, 80'u8, 160'u8, 124'u8, 188'u8, 176'u8]), + base_fee_per_gas: UInt256.fromHex("0x0ea1185e0ac50d1e2cc0be7229c846528380def25f7d8860cf366e6edd793be0"), + block_hash: Eth2Digest.fromHex("0xb471874aa6e8987deee40902d59537fed8af3e9b6ae2f8b476ddb051629b3b09"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 215'u8, 225'u8, 83'u8, 163'u8, 187'u8, 111'u8, 141'u8, 246'u8, 57'u8, 238'u8, 163'u8, 25'u8, 91'u8, 114'u8, 111'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[93'u8, 42'u8, 101'u8, 80'u8, 160'u8, 252'u8, 158'u8, 121'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[164'u8, 98'u8, 105'u8, 179'u8, 25'u8, 33'u8, 130'u8, 239'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x62ce6a6d68578309c4730f96f98a809d4b4225fc3d37a285daf26288b10f9590"), + fee_recipient: ExecutionAddress.fromHex("0x8c892b06f1e9c877c310b6eccefb20fcf5e00227"), + state_root: Eth2Digest.fromHex("0x578f93b83206e3239c69f51cc8e59cd89087260cda9f0efc892aa2ffb2bf386e"), + receipts_root: Eth2Digest.fromHex("0xa4ac657af8e0dad66ec74f4f66b246fe0089485e2810071fa556c09ea585059f"), + logs_bloom: BloomLogs.fromHex("0x18d67e640f9ad3a24deb7e3f8cbe0ba8224cf9cb9e67b2fd6c774fac7aa3f4adca2befe8322962cf000cb89c3e352433cf1aade51ceac9fe69966a8a89f7985030a301eb690e7eb20b5ac3b315930ee5397b6d65b03a1131b94e7f3505ef030877e460e9195b742e943716d9875a3e2e9998236d3565d622216af1721b658a12fe7d82a62619b4f2d042f146305ff1ad1bf394437340735eac9e962b3fe67597793d1151ec87fcb5f0056837c5813c75c4a0f94d91da71299b3780f250ee31eb9f106e3c443f0ba05213da05177238909fd9e60de9484e091b91dead82debc020929d1f14e79b610af3d15bf9c3757e62bb32a69523c1bd576e5c5d4bc2ef0a6"), + prev_randao: Eth2Digest.fromHex("0x552627eb969604e7d4ed1e631b74b2410dea7f4dbd49511bda390e3b9da8bf60"), + block_number: 7763671958353664038'u64, + gas_limit: 3930616259240751958'u64, + gas_used: 7960068863134244743'u64, + timestamp: 18446744073709551615'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[227'u8, 111'u8, 127'u8, 243'u8, 191'u8, 237'u8, 88'u8, 146'u8, 146'u8, 236'u8, 162'u8, 237'u8, 164'u8, 177'u8, 249'u8, 52'u8, 1'u8, 26'u8, 187'u8, 208'u8, 244'u8, 234'u8, 113'u8, 199'u8, 30'u8, 209'u8, 197'u8, 63'u8, 126'u8, 104'u8, 143'u8, 30'u8]), + base_fee_per_gas: UInt256.fromHex("0x6bcd9684e1bc8f4fc5d089e0bf5fed35a8bf3039808d030bb9eb1ff7147180b5"), + block_hash: Eth2Digest.fromHex("0x9e2505de9f245873565b553e7215abff698bdfcee1dbd93e40eb295dd84e7f45"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[140'u8, 134'u8, 173'u8, 70'u8, 168'u8, 181'u8, 221'u8, 210'u8, 25'u8, 142'u8, 168'u8, 139'u8, 77'u8, 134'u8, 203'u8, 219'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x4f8251c361a23171de8648d1e96c91fea2cc5a691dcd884e3a957dc8f6a8802a"), + fee_recipient: ExecutionAddress.fromHex("0x7da9175abaf6e4e400e0ee516fd3ab07dd659f2a"), + state_root: Eth2Digest.fromHex("0x1bd3a5da4c266dd396b8209288e68be066176ebe64cd4c17c4c6cdccaf03577e"), + receipts_root: Eth2Digest.fromHex("0x16133c4fe31f0487e700514160acf9257458a6ee716be8043cb6c532f84ef614"), + logs_bloom: BloomLogs.fromHex("0x5ca3807e674d69536b33337d798deaeb9fa6c7cbab7aef1473e6a6614f6f2c74ef85ee3632612b9c1e78d2a63e0b2f58d48d71e8d62e38510bc2f307680497cb965153b43392b8aa2dcd91a766356eab3ff1b4a6c4b037d61df1a8a4c6d3fa0e3c57a299a1c0a7382052ac25c412f2d2356c302e326fa0cfb570354e31e2f8046b80e2690ba69ec7c284c2df8ad23d16764cbc0ba28516f3c31aa89da3e3286106dcecc835b3007a17f33c4962efc3c9b0f5bff14c783e414ba60d35b79ab33ccd0151c34a94efc461d0df0a994085373f33275a4cd6839603632409b670072a4554f1c9342c03cd403a6feb67b23d3a075707ca89b77bad64e24a6ab79446ad"), + prev_randao: Eth2Digest.fromHex("0x6353ec5b94b9112f25e66de48b532ff5610c63f34c50a02fdf64af6c9d0ef2f4"), + block_number: 16866969889068542818'u64, + gas_limit: 5116920640663397560'u64, + gas_used: 13292402101416991817'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[136'u8, 133'u8, 189'u8, 60'u8, 229'u8, 217'u8, 70'u8, 145'u8, 136'u8, 97'u8, 175'u8, 23'u8, 183'u8, 73'u8]), + base_fee_per_gas: UInt256.fromHex("0xe1307a28a2868b4d934aefdde7bbd09b0644b5c422d2c680770775cb44623512"), + block_hash: Eth2Digest.fromHex("0x11e23850b143b8b4dd8394ee1f2cebf073068502d04dde00000925cf23ff55cc"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x0c67b44b492590ffb9e6d2a63c84714821be7526ce1c337c06276e33a62b7b93"), + fee_recipient: ExecutionAddress.fromHex("0x1d16dbe66ead2ba8afb8594acaf8d536be08dac3"), + state_root: Eth2Digest.fromHex("0xeeb40e334aff8512435b5908a8dd3c06993cadca8bc44e9a6c28c6003162c6a9"), + receipts_root: Eth2Digest.fromHex("0xefa5b7de19da2333bfb7bfa814a306f904fef2ff4f8b1154314649a56fea3c8d"), + logs_bloom: BloomLogs.fromHex("0x4ebbaff6a56343a6bc0170aca2e2ba303f3e3f972c88539ef84e402740e3c9e21c6951d461baf56eec14c06ca0e95f4921079d0d82e9dd46e73f3fa76417246217ff9c5425f19b0f8b2a735ee522c1bc377a2b079099430d0f9316164f5930456245534bbe138d0a19ee58bb13a0d724723a6fa50e39b8a7ad5804f92ab43c24782e27dbb32789408cdd716af9a0b0cb1e2f3aee0bcb5aa4088c0cf1528fad466f3d71d906649becf25f405f619dead731e0831efb522b5faee7a39ca28128effc79977816d50ae23745ab96b80dc7f548aa5d43b0d5c331fdc1ce080a4d63e19942ecb4df8f56397b2ef67d017f2d2de9296e1fd8036ed8592f5a89553c4642"), + prev_randao: Eth2Digest.fromHex("0x5d3c3ac25330e1cd3a516003315ed24bd2dc6cd31d389639cce4b6ae4a3ac8cf"), + block_number: 10891095348111649307'u64, + gas_limit: 13670668340379820434'u64, + gas_used: 1482104080767186829'u64, + timestamp: 6602476120092784163'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[223'u8, 228'u8, 253'u8, 3'u8, 38'u8, 218'u8, 253'u8, 87'u8, 206'u8, 243'u8, 168'u8, 113'u8]), + base_fee_per_gas: UInt256.fromHex("0x972a01f27d586035ce5fb233118e52652ebbf89f6d39558a41b27c8840c849b1"), + block_hash: Eth2Digest.fromHex("0x9280fa96a569e7c25b2dfc12a141d3edd24acf2fbfa19ee72e5a1fd5dba25a11"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[116'u8, 179'u8, 195'u8, 80'u8, 193'u8, 73'u8, 187'u8, 64'u8, 41'u8, 251'u8, 55'u8, 90'u8, 161'u8, 30'u8, 221'u8, 210'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x7a9d6ab34c0314959d5bdceb0bd80f142e59e5e2addedcd178612303897e7a8a"), + fee_recipient: ExecutionAddress.fromHex("0x3425bc529b4791f5fdb7dd365501199b2f81e578"), + state_root: Eth2Digest.fromHex("0x4eb1a9a3c4b9392325a14f3f8efbc0b3cc3bfc2d7e9992377abd84af6c556db5"), + receipts_root: Eth2Digest.fromHex("0x094e9114d3487925f6818140978e4db64d8306083a8e5c987657e21c3a1995bd"), + logs_bloom: BloomLogs.fromHex("0x0815701b4689d0bb7f80fb1485ad3255a66b890725a1d2d66b4fc66678e2d08784c21ef583401493d5dda1549eda32303b7d102edc72b9fe1d696ab459294a88db0d7263abdf982ddf59ce008b8ac734565de79c269dfc18a36709ca91a3cd50516725e9fa9d98302fa0322254382aab0cdf1f95f2397579f7219bd7ab096ef1f00d7b1131b0055bff65ae9954cb22959adbc40983840ae3b85358fd205bdf6ac6bcf723047ffc53a094a06c2039935b6ef579efc618bf4127a6e4e531f6d97c17789be639691ef87fa5540cf732a184a0e09d5c60866ecd0be0a04bc94317712c395d84c2cec90f43f4807048bf1a93e3e6520a1a7c59092e2e391abf9d2e68"), + prev_randao: Eth2Digest.fromHex("0x349eec90244f3d812002732cd833952969b27a463def04291051137344c89c41"), + block_number: 5715688900321967041'u64, + gas_limit: 17172684770312311722'u64, + gas_used: 9286597649062725614'u64, + timestamp: 195835912833125491'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[34'u8, 35'u8, 209'u8, 45'u8, 117'u8]), + base_fee_per_gas: UInt256.fromHex("0x7b5b4e48b3daadecb9724a74d426a86ffb5c5f8abd43469b4e3fe2a728b5a645"), + block_hash: Eth2Digest.fromHex("0xc71c294b5562af30b9e2b03e76cec0cc6d8b50694219404aaed2ace8f756a22e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[178'u8, 142'u8, 115'u8, 217'u8, 56'u8, 74'u8, 150'u8, 16'u8, 244'u8, 148'u8, 19'u8, 33'u8, 89'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[195'u8, 248'u8, 42'u8, 129'u8, 151'u8, 119'u8, 232'u8, 235'u8, 245'u8, 240'u8, 113'u8, 157'u8, 235'u8, 158'u8, 160'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 27'u8, 72'u8, 107'u8, 18'u8, 210'u8, 127'u8, 78'u8])]) + ), + (bellatrix.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x806a868f0f31e8f519fa6339ad18c414dba17feb03aaf6ca3775b152bac64f3b"), + fee_recipient: ExecutionAddress.fromHex("0xa2bcc8b793c4a5d4e0f68251d2f22e1ff4366d2c"), + state_root: Eth2Digest.fromHex("0x6979ac9545f31eaf7ed8bd227cd7cbd1017492b892bcc118f7417ea87d50d412"), + receipts_root: Eth2Digest.fromHex("0xca0ac1828fae211c9d0fd7ab763460d89f9da0669d082c68b9fdca3ca1b59123"), + logs_bloom: BloomLogs.fromHex("0x0656423dc7b375cee4f5c3bedc500eaff2da91d0dd5f4e695933c92a2a6af7441200a41177bcae7912839f993a733aa2bb82976f08180a901e63c588a26dc9ccc58f477eccbb08aa932d512bfc765a57527acd04c585af23f48f389420890d06877d8a0f523cb90be10dbc73cb5b11e808f5c6c90c6fc3a9434dab462f2977eacf79146b35ee2372aae8a6fe3628cbe21a8988fd9546b25581b6d998462f9af7f653d3a4702a4a63b9f26cc7d2f72e18a3918fa9b65ed81d23ac0a64dd8f3f878f745fcb4de9ad144ae9565288d7bf90e6d356f49cc242d000e988fe76e0196f0c5b24bdf9dc501222e54f64861e0d45dda2bdf09e5fb290a1ec6dce39b02883"), + prev_randao: Eth2Digest.fromHex("0xc986211f6550cb787e89140d8856531ec309f652e2a871e2715c1dd055448074"), + block_number: 7781035717593646205'u64, + gas_limit: 9088183223170031827'u64, + gas_used: 0, + timestamp: 1844848381084178223'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xaac988479abbe95e03cc214e7b99795c4ec117bfe4da06e4624e94b262b015e2"), + block_hash: Eth2Digest.fromHex("0x14137d373f6e6110b3fe3c1d743a4f84547ad3d59d0b42598b794ff601e97e38"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[10'u8, 28'u8, 79'u8, 238'u8, 85'u8, 206'u8, 161'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[144'u8, 222'u8, 190'u8, 14'u8, 247'u8, 119'u8, 95'u8, 48'u8, 238'u8, 50'u8, 180'u8, 12'u8, 216'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]) + )] + + for executionPayload in executionPayloads: + check: + executionPayload == asConsensusType( + asEngineExecutionPayload(executionPayload)) + + test "Roundtrip engine RPC V2 and capella ExecutionPayload representations": + # Each Eth2Digest field is chosen randomly. Each uint64 field is random, + # with boosted probabilities for 0, 1, and high(uint64). There can be 0, + # 1, 2, or 3 transactions uniformly. Each transaction is 0, 8, 13, or 16 + # bytes. fee_recipient and logs_bloom, both, are uniformly random. extra + # bytes are random, with 0, 1, and 32 lengths' probabilities increased. + # + # For withdrawals, many possible values are nonsensical (e.g., sufficiently + # high withdrawal indexes or validator indexes), but should be supported in + # this layer regardless, so sample across entire domain. + const executionPayloads = [ + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x760d4d1fced29500a422c401a646ee5bb5d65a07efa1492856a72cff9948a434"), + fee_recipient: ExecutionAddress.fromHex("0x315f583fa44fc6684553d3c88c3d26e9ed7123d8"), + state_root: Eth2Digest.fromHex("0xa6975bac699618cc22c05b1ba8f47cbd162475669474316d7a79ea84bce3c690"), + receipts_root: Eth2Digest.fromHex("0x080d53a0fd22d93f669b06052413851469d63adeb301810d7ce7a51c90c8e8ce"), + logs_bloom: BloomLogs.fromHex("0x453a1f1c4f63bcf0be84e36a9ac233b551601bb2e5ab9450235bd83e41d2013f42c97044ac197a91da96efd6fb18f233bad2e884d76f0a63a6fbf7dbc714cc9aa497fb6d363feeba18447ecf799d5f8d769232553c375b21166c0176859dba63eb77f1a17e482ebac07c3cfd5281277f55f1e5c79cc675d501e1982816d31db7d73c89e855315d8f4e9fef1c9ebb322610235c44632a80341b42f05d207ac4869d08d98a3587a470f598095ebb932788fefacdd70e7749e0bd47ceff88a74ee1f006d9791350484149935d4521d86e644ebc4346154ca0bfa9fbb83120630867d878c12e53a04a879e993b755f02670c9c47f091acf1b3f593782ddaa98f0df4"), + prev_randao: Eth2Digest.fromHex("0xe19503a6fa6acde0b8f5981f29eb2e298ddff63e6243529d735bcfa42680a515"), + block_number: 9937808397572497453'u64, + gas_limit: 15517598874177925531'u64, + gas_used: 3241597546384131838'u64, + timestamp: 17932057306109702405'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[55'u8, 184'u8, 18'u8, 128'u8, 63'u8, 61'u8, 26'u8, 79'u8, 3'u8, 225'u8, 167'u8, 15'u8, 240'u8, 167'u8, 180'u8, 141'u8, 205'u8, 10'u8, 246'u8, 70'u8, 248'u8, 35'u8, 19'u8, 45'u8, 252'u8, 187'u8, 168'u8, 42'u8]), + base_fee_per_gas: UInt256.fromHex("0xaf8acbd8a0f0f8eeced9a1014333cdddbd2090d663a06cd919cf17529e9d7862"), + block_hash: Eth2Digest.fromHex("0x86b46255725b39af70a9e1a3096287d9772ccc635408fe06c34cc8b680977ff5"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 98780'u64, validator_index: 8610867051145053792'u64, address: ExecutionAddress.fromHex("0x0c33e909ef375bd3ab33961b5ea767b4f1c8bce0"), amount: 671269'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 500164'u64, address: ExecutionAddress.fromHex("0x271215240885828779da36212489170f19a8f5bb"), amount: 2071087476832314128'u64.Gwei), + capella.Withdrawal(index: 26148315722507923'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x340bd9f489ec124b8a879673f12969b14d0b5555"), amount: 9486787560616102568'u64.Gwei), + capella.Withdrawal(index: 4839737623914146930'u64, validator_index: 273755626242170824'u64, address: ExecutionAddress.fromHex("0xcacc573cfc0ad561aae27f7be1c38b8dd6fab2cc"), amount: 9475975971913976804'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x2cb54ddf357864102f4ab6bce57317a75cee972f303449bf7047f4e0e5809127"), + fee_recipient: ExecutionAddress.fromHex("0x92af67d9604b945fd2cbaccd29598e2b47ef5d2d"), + state_root: Eth2Digest.fromHex("0xc64221514816a2f87a29c2c474abf99547820b2a12e6e5956f160dd54579e521"), + receipts_root: Eth2Digest.fromHex("0x76c1ca0e483a557f6884d64bd891c62904c64c2fe69350278345c622cc50b0d7"), + logs_bloom: BloomLogs.fromHex("0x7afdc9a99777d76b713e960e9f12ad4fe46ecb7ea6d5b245c6d9ee11d3fd35e7ae33dd6062fb6578bc2c2f286f1c6a4aa6a44cc80a88a3678c7085c35a0f2e5334ea686e2098fe5d179bbbaf81cbc349a15e7a21aa27f0ddcad342d980d056a356694cdadcef8db3c7866b6cb087c28f2aeed7a5bc9b1294cef0da3ac3b46dbe72d7f164f1990bc32f755b709b96a96bdd8da2c9d9300e9f6906040347d337fc21b833ff0b80305b22ac64a2df2dede4c01c65c192884f161aacd12ba56dab9189477e6ae484a97ff96e0aba1f9b8d043896b8433779abeec091f16b94a013325fe11096d1f2d79b701ab5b46063ac99392a790e617555fe3286dfd7ec0cb9b6"), + prev_randao: Eth2Digest.fromHex("0xc4021ae781a3b3a1dfb1e4464b032a3bae5f5b68366beb555ede1f126920cd5c"), + block_number: 11318858212743222111'u64, + gas_limit: 2312263413099464025'u64, + gas_used: 1, + timestamp: 15461704461982808518'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[254'u8, 188'u8, 92'u8, 24'u8, 153'u8, 206'u8, 74'u8, 108'u8, 96'u8, 100'u8, 148'u8, 84'u8, 151'u8, 74'u8, 73'u8, 167'u8, 65'u8, 177'u8, 253'u8, 62'u8]), + base_fee_per_gas: UInt256.fromHex("0xb1c4b2bffcb38aaa1f98b483441aa212c9dd951d4706dd505a973fd5fd84796f"), + block_hash: Eth2Digest.fromHex("0x8b150d453d802fdbb19be0132621a5e8061e70cfe6668ee6a63e4ff217434999"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[142'u8, 197'u8, 221'u8, 83'u8, 32'u8, 126'u8, 145'u8, 86'u8, 28'u8, 39'u8, 112'u8, 240'u8, 168'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[175'u8, 191'u8, 143'u8, 78'u8, 162'u8, 249'u8, 87'u8, 193'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 168'u8, 190'u8, 157'u8, 39'u8, 143'u8, 147'u8, 156'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 11497754023538902580'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xb0b680a6d93e520fa32e399ded64871d99c1f2c6"), amount: 15592017597077727306'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 14269483352942387358'u64, address: ExecutionAddress.fromHex("0x97e4451d09c9af077dc9081e5081563aa26e4c51"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 9664968187979079659'u64, validator_index: 750818'u64, address: ExecutionAddress.fromHex("0x1e4bc6f12efe96b9f5ca549b77a3d62c5f5403d8"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 727020'u64, validator_index: 10133766089843653238'u64, address: ExecutionAddress.fromHex("0x6a1ed64277cf1eba8c96281531d2799d1fa7c409"), amount: 130469'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xac5a7347865f503e1578d1b47271c8e60027b5ba24b0da8e7c3733bcdbeda220"), + fee_recipient: ExecutionAddress.fromHex("0x8b7fa656e67f6af2074ec3f16930ad742a69f189"), + state_root: Eth2Digest.fromHex("0xeb50f351f6945df8983cf4037ee264dcb2ceef3313ae452248571811d8a3a8cf"), + receipts_root: Eth2Digest.fromHex("0x860af6010832f64a5234327b653aabbd3898881a7b72ae42e08d4a1519166fba"), + logs_bloom: BloomLogs.fromHex("0x01a18d51076880a1a8ea86cc5dc5fb904ba0a3c285b7dff34ee5dbad9d64721f3849ad9f50b90ad4524eca6b0564f8a1a5827a7b476ea051c33a7c0e18db4cfb27b36476bbb1eacbc029dbc5009e5cea695045cfb34c868163514b784133f0f2998cf12e2caf9c74f69732ed3716396dc34d86725428aff48bf6b935ae88f5e4820b9a325bc670cf560dcb479723213a3156a9d7d0e7de0dc791d0eb94a691013624b8aa982ca3c9d5b49fcac8fafbb403c9fbceee5373f0fb2b77ff1bae8160fe2a47b01d792b088eb3fe24c53b5c6a8b4a3b59060d587ca7376f8baba58d57cf745b2a346f800a54d08545194e067ae260c73369a016b12d0fbc20abc78ba3"), + prev_randao: Eth2Digest.fromHex("0x330b7093023f617d2cb5f76cee4b078af002b68d81e3a5b5c9d37c4411871a95"), + block_number: 18446744073709551615'u64, + gas_limit: 13979513761871276914'u64, + gas_used: 6199089254852634745'u64, + timestamp: 7404562418233177323'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[220'u8, 149'u8, 177'u8, 36'u8, 228'u8, 88'u8, 47'u8, 149'u8, 211'u8, 213'u8, 170'u8, 40'u8, 207'u8, 145'u8, 137'u8, 64'u8, 153'u8, 22'u8]), + base_fee_per_gas: UInt256.fromHex("0xfc82d0e46d05b21aedab6f368183611d2885b28c52842f28f621ef6c631b6e6a"), + block_hash: Eth2Digest.fromHex("0xa8c6b2dcc2496f0230e796f8a69642126955ae6209a0d0c2dee2c925212f447e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[138'u8, 17'u8, 34'u8, 168'u8, 105'u8, 179'u8, 196'u8, 21'u8, 253'u8, 242'u8, 106'u8, 30'u8, 40'u8, 190'u8, 179'u8, 93'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 1'u64, validator_index: 239183'u64, address: ExecutionAddress.fromHex("0x75efb2a04b5f25ae56ff7256ee9f4fdc4e25baf3"), amount: 402148'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xd3be9b45bfe67229afb47461ca2970505586cab8eb8e00f280ceb07a9d47866f"), + fee_recipient: ExecutionAddress.fromHex("0xde645d4a77f0a386a45c52357948e1d7eac5e780"), + state_root: Eth2Digest.fromHex("0x69b70e0188e7b88e38df90853b2dfd2e4c7181e83d82d77ab81c57d161216b92"), + receipts_root: Eth2Digest.fromHex("0xc01d94a01736268170a16196927029d4d8d7c65970ec78ece94c87304bed4568"), + logs_bloom: BloomLogs.fromHex("0x7f1ac5c77e3f0c8a1a103ee83dd7d0fd6fb13895aa1141de330445474b3216e2646c15c1cbf4ab4feb1e4e21c2e6970f4a6648675508b08111e00b62866b0f6cccd58afea87d2cd0a24c0384fa179dc33ae6d0db8c1b118a75fb442682b7cbecc2808fe8c812c3720ca54f6723a395fff5dd1720f41822c91b080503bbfeef21eea192d5b7c4160344996d017ab849fa97e862206caac8f8bfeba41865514b21a8d8fa9ce3dcc0daf5bf86fd2f07d222fc7a9d11fb4031b2cd72544d7f89eb95203a570bc179f9ba1f73f39d74049fe22b63939ea49d5d40f42c00c5f1bd429e84ade377475e432186acd9975914670052fea64453fca87317f62e29b550e88f"), + prev_randao: Eth2Digest.fromHex("0xce47da2b2a68186b78054be0894ccc9ae7213c18b9093c0ebc1b9ed011071a39"), + block_number: 9014833350824993703'u64, + gas_limit: 18446744073709551615'u64, + gas_used: 7874274181221487360'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[139'u8]), + base_fee_per_gas: UInt256.fromHex("0x1eb821a0ee3f9d2e5b49c64177db9ffc96ec6b06249cefa8c51d0ce7e664a3ae"), + block_hash: Eth2Digest.fromHex("0x99479be6429eac4a945ca8171d3d3ce42d7b5af298292e833e20462438e06229"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[99'u8, 198'u8, 91'u8, 86'u8, 23'u8, 222'u8, 121'u8, 250'u8, 12'u8, 135'u8, 133'u8, 37'u8, 61'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[81'u8, 173'u8, 241'u8, 145'u8, 54'u8, 3'u8, 36'u8, 121'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x06504beb0dc3bae44ef75678d29ec5138d87da68d307ca7d43e259cede60fda6"), + fee_recipient: ExecutionAddress.fromHex("0x527ce602a0be18c0944dc27b2864c711a91f89a6"), + state_root: Eth2Digest.fromHex("0xad3bbef5d22bdc2429da09eb85137c881f85fe6e6b3ea207e5eaeb399c755055"), + receipts_root: Eth2Digest.fromHex("0xf94fdc52cde20532cfdee73e9cebb61d9f7160191345f9caf58b45501d8effbc"), + logs_bloom: BloomLogs.fromHex("0x0999cc50752006a2bc8e5485c239b9a41be6ea2fd8f0392884246ef7d33bccdf4bd326fadae385e3ecc309bf0f367ac1791767ffaee90ddfa7bee22d19f417708fded2b2b6b3be2b6007745fb1de940e7849761586953c04e3bec3c9b6342d1b91dd024980f469b484bd0befc4941a3846d027390d6256e4acf9933e0891dd558270eb35d3455f4e49c890479e970a8008b75ff4d33b4f7e5a8c19e75d8abd8673ebb859a8a24907584d88f0d68b3142b3c6952695fdd84581f5a070601a575a8e7bfa0bf7cf0fe9d70a051005f9dc594d09909e9d079d02a4e441e5b3f33388de8d46cbdcdf24f835415680e569f2ed29acdc01042a6a7ee701e4e6cace5c28"), + prev_randao: Eth2Digest.fromHex("0x7cef96d72498facdb399dfb5b6d7d69185f3edc70715540fdc7ef651c4685c6a"), + block_number: 13066898984921201592'u64, + gas_limit: 9241830338892723842'u64, + gas_used: 8347984358275749670'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[11'u8, 46'u8, 127'u8, 104'u8, 141'u8, 79'u8, 55'u8, 48'u8, 242'u8, 12'u8, 142'u8, 2'u8]), + base_fee_per_gas: UInt256.fromHex("0x6241db2a44a58a2c1aac93c4aa18aed5add30d1937c31078542bb544bf9ba2df"), + block_hash: Eth2Digest.fromHex("0xdc1756667e7c3f1615650cbbaae1117a6bac817c6579cf3f7afbc93277eb3ea1"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[13'u8, 24'u8, 248'u8, 26'u8, 141'u8, 177'u8, 236'u8, 2'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[213'u8, 208'u8, 242'u8, 46'u8, 0'u8, 31'u8, 219'u8, 213'u8, 197'u8, 218'u8, 148'u8, 236'u8, 43'u8, 152'u8, 123'u8, 96'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 163'u8, 60'u8, 195'u8, 40'u8, 68'u8, 185'u8, 20'u8, 244'u8, 82'u8, 34'u8, 181'u8, 26'u8, 201'u8, 2'u8, 108'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 15531362396155364476'u64, address: ExecutionAddress.fromHex("0x063b2e1de01c4dad4402641553c7c60ea990ab30"), amount: 106054'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xb5d4a5eae3a1ea004ed573b0b8f8a22c847616758c0faf1e7e9589f16e55415c"), + fee_recipient: ExecutionAddress.fromHex("0xf7ac0877fd8bcadde1e050f6c7ddad13688ec071"), + state_root: Eth2Digest.fromHex("0x7472f824376a723894f8d539743c7f93b69839772f28cf6a83e2102fde99c3c9"), + receipts_root: Eth2Digest.fromHex("0x750365b5d975460a64f07758abd0cdd44cee23cc2d4f06f2a047cf4c12c23db4"), + logs_bloom: BloomLogs.fromHex("0xe24d8452039bddd10e1252c1ebf9b9e81a22577f940e8708d200548717e8471e130a7066adc48785a8dea1dca05953d6be16504a57112c065e7909586cd611af9e0b840b81caf0532dbb2833ee5ac6a6eb7b6c990cba6ccf6f4ddec5a7c76f8296bd2a693cbbb43b1d86b66f6aa58888734d3fb21cf5e96f1b981f8ae2737bce1cad1cc458650291cf7a3d22c61fde6af3a07a44bf1b334b2c5dabbef16e5e73db75e87f04670cb3830f0a7badc702e7dd37a59ce02992f4473a909e57dee1fdd22cfc886f4fcb6ea205ec9234a8ec85ea134242748f9f10062534fd0528bc1b5b1e89511cdf91a1e7fb4f8c58c93d2a6c75e48a2d48235cb7de13040db8dc9c"), + prev_randao: Eth2Digest.fromHex("0x2410823a37c763e13b03a4c48e32f9e43b8440ca31ecfe8e0543a20a02c496c5"), + block_number: 14920119354157670036'u64, + gas_limit: 17193947846593799248'u64, + gas_used: 2176791850599260430'u64, + timestamp: 12670133468877091192'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[31'u8, 7'u8, 1'u8, 212'u8, 152'u8, 82'u8, 167'u8, 57'u8, 116'u8, 147'u8, 97'u8, 109'u8, 219'u8, 207'u8, 151'u8, 116'u8, 43'u8, 218'u8, 91'u8, 253'u8, 14'u8, 182'u8, 102'u8, 57'u8, 153'u8, 72'u8, 172'u8, 208'u8, 0'u8, 64'u8, 97'u8]), + base_fee_per_gas: UInt256.fromHex("0xf1daaa067663bf3277b9149aab162f4e330f988f0be8f83a556743a57ae5c8fd"), + block_hash: Eth2Digest.fromHex("0x5d462b4b243c6292b6a3b32f4e05849c0613d0a61954734c524f75f8df66cf8d"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5416630176463173042'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xd7b1d18e4eb7b5041b4b08bae2ce8e22982d6e6c"), amount: 911474'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x2629683cfc70198038837270bde3c60176c2a4aeeced0d4a4f14dc99a380c377"), + fee_recipient: ExecutionAddress.fromHex("0xd234af1937861b66ca84c334824763fb54347677"), + state_root: Eth2Digest.fromHex("0xf79f02d52d7f2a4be99eebba3dfb3bce74136ea739da515703d095a66ce203d5"), + receipts_root: Eth2Digest.fromHex("0xa97ae6fa5d6937f7754ff96766a54bb8ec082b046814e74f6c9c67147795f526"), + logs_bloom: BloomLogs.fromHex("0x5d2ef8bc2f58a84e4050e3a38985e4c267940707c8da3f687fefb9e22e4ae11a2f79a24456af3758e8b521d546dc178da5c85da869ebb2da551976488a769ca2940fa20853e4e1d1fcf8d5bbea0d16973c827d38c97c47c57835677590567829d119e8108f2ee3fa988b267ccfc3e58e5f81c18c775a9baf06d4d81aee405c5683fa4e5e891b58101a27e8f71c60d357a4ab8bd02e12fbbb0e363c4632b0a3c0de638de37448c9476c65a62f7f1dd9643fac6ff78ee431d18ab554b4c8a1984fb5fa0de3464d223f236eb8e8a8f59601221d2ab480ffcefaf4bf6471b40a14773ac0cdb43aea505941e4b0fa6fb26eb091adad77acce41e516fc743e5fdb045f"), + prev_randao: Eth2Digest.fromHex("0xbe44d7c5f844a2acb307a4371784d7742be482aece83368d94813ffa1c7bb60f"), + block_number: 13524449277995212660'u64, + gas_limit: 1, + gas_used: 7976957374052242924'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[57'u8]), + base_fee_per_gas: UInt256.fromHex("0x6c98d9ff36f1032fd55d8a6038d7b1f7c4e5f7c884b73f626fe43e687beeb46d"), + block_hash: Eth2Digest.fromHex("0x2c95101857b07bdda0502741da8cd9160ec0474929d132e9159098576f9a7c35"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[75'u8, 85'u8, 130'u8, 87'u8, 90'u8, 172'u8, 176'u8, 44'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[207'u8, 150'u8, 64'u8, 87'u8, 15'u8, 18'u8, 3'u8, 236'u8, 232'u8, 87'u8, 174'u8, 192'u8, 29'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[23'u8, 37'u8, 57'u8, 158'u8, 137'u8, 222'u8, 53'u8, 111'u8, 63'u8, 13'u8, 69'u8, 110'u8, 175'u8, 108'u8, 16'u8, 207'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 1071093368516669975'u64, validator_index: 15999188653672167093'u64, address: ExecutionAddress.fromHex("0x368b0ae1a6bfc3312460f212017e8bb32aae55bf"), amount: 13132185675616884508'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 1251419977457119333'u64, address: ExecutionAddress.fromHex("0x0a4d18e47c5ec0c639ff29d8f8c9be0b60f00452"), amount: 1'u64.Gwei), + capella.Withdrawal(index: 2046299652899032730'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x44bfe00f98603a5e8363030de4202ba50c7e8138"), amount: 15403504672180847702'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x190544155dd98bf86d3ed5ee94d01afd3a8e67b8476f94d90604706da0a7d340"), + fee_recipient: ExecutionAddress.fromHex("0x799d176d73d5d6d54d66941ad6cef8208677371c"), + state_root: Eth2Digest.fromHex("0x07e626b9c44b0ff14586d17acf79cb136ccc5d37fd7135da33cec516af168f43"), + receipts_root: Eth2Digest.fromHex("0xb8b100bc5c155fe6358b9a16756ec06880365f5fe89124cf9fea963e26d3770f"), + logs_bloom: BloomLogs.fromHex("0xc314d3d6ab41a3fce7433dc286ee5c9820d883ff572ee7dfd2f4ee745f11a71f6dbe142d8c14bd6cc76782f1bb2b3770e65a929b2187581956bad937907a124c92ba10686763ddc87ba5b4a4e9cf4b9a35255fad5f54b404aeed5ad9859b5f9fd3c137e9eb6ef394a10b8ad3fbba75ba38c2cbfb91fa793ac763e8cd31481fbecef02b3365b990f5120a2970f2779574c60769347ae334a9f39bb3d3ad35182f7dcd252bfe9663c4f54b44dea8d79e3bcd89877231e81a9e9f5c1eaf5da1f56ffc39c23fc3ae6c130281c792a31e7a60115d46abbe17807cd120038631ca7a6636c8c644b57719e386cc8ada32ce806f75110ad143522fb0b240213df4bab07e"), + prev_randao: Eth2Digest.fromHex("0x17e445793c0e354ee43381ded194220ebd87ccbacef83e3da5a1cd3c8c57bf49"), + block_number: 5728529601694960312'u64, + gas_limit: 9410734351409376782'u64, + gas_used: 16470261240710401393'u64, + timestamp: 8811957812590656903'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[95'u8, 124'u8, 151'u8, 79'u8, 76'u8, 171'u8, 74'u8, 213'u8, 207'u8, 202'u8, 63'u8, 2'u8, 182'u8, 32'u8, 115'u8, 65'u8, 90'u8, 186'u8, 34'u8, 63'u8, 241'u8, 191'u8, 88'u8, 10'u8, 197'u8, 52'u8, 33'u8, 98'u8, 78'u8, 210'u8]), + base_fee_per_gas: UInt256.fromHex("0x3c1ba8cf82268c828c1a7f249328741ae21f35a7659365efd7496df94dbb85e9"), + block_hash: Eth2Digest.fromHex("0xc2b2bc39ed0cf5764800d3c91401828ed32d0eea58f9d336c32f9e6f7200ac8d"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 802141'u64, validator_index: 7520769587588158114'u64, address: ExecutionAddress.fromHex("0xce1fcedcc47b22d7e38f76c1cba49c2c20da09eb"), amount: 5845756482608800263'u64.Gwei), + capella.Withdrawal(index: 4169028257817284566'u64, validator_index: 496485'u64, address: ExecutionAddress.fromHex("0xf99805deece4ff418b55557b45060e88035f755a"), amount: 4870783513883486430'u64.Gwei), + capella.Withdrawal(index: 10410265605811982468'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x31e886453fa4e7fcec6ce6094ad22950637d41a1"), amount: 157748'u64.Gwei), + capella.Withdrawal(index: 10622085591419415519'u64, validator_index: 8179967808007927229'u64, address: ExecutionAddress.fromHex("0x03d2493395b71bb181db626a99c24dbc1d07065f"), amount: 18446744073709551615'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x86d7b430f69b215ab5ae863998ce41f01a5016376c8bec7f5b7a6e16a2326d92"), + fee_recipient: ExecutionAddress.fromHex("0x73068946d757f5d145a38fe9de817b8b1e9d6c43"), + state_root: Eth2Digest.fromHex("0x312b4af4d3ca5960dda2f99531819f5c32624753cc0756c05d242f65dd605d92"), + receipts_root: Eth2Digest.fromHex("0xf3a1e8f784ee4bdb897d1511ce642276e2ecbc1f21bfde9caf7c4479b7fdf902"), + logs_bloom: BloomLogs.fromHex("0x633d228aa8b2b9f4b614c4b7c7aca616232d61bc6e06ca28f4b94bc39165cf3ca2e090cebbe8a5b66b161d92e65099503327f9f2adae6ec5a73463063a994d73f37e12caec8f6d439be7520b48b25ccfa8ff64e6884b7e240c8dfd0100a23f9f644da13f1628d989eef92806c9f936a71f470d710653355acd84fb23ff15910f1d2866d83b036246c46a681e762b9a19e72aab21b428c4710511d0a39cc5ec39ebf3aecb5c19096ab32135a629abc8cdec39b2b3631bf4e86bbfb824276fd728bef454ed981e5f9e8a4bb96b27f09f661c5c221f63a26945174162496496c9bbf38cd894c50fa69df0a8c722ab48d75044bf43468639ae9b61d0b5a2f9d819eb"), + prev_randao: Eth2Digest.fromHex("0x3a0689ac32c82a6b84d3230fdc6e2c1e89671fa3906336ccde9fb7cfd1811ac8"), + block_number: 9465334901279616671'u64, + gas_limit: 17844363972830076325'u64, + gas_used: 9534663249377184661'u64, + timestamp: 15490999633909732541'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[199'u8]), + base_fee_per_gas: UInt256.fromHex("0x9fc9f32819a67c4aebae259b0648e2b82f526ce8eef8fee33961f9fc69653b2b"), + block_hash: Eth2Digest.fromHex("0x1ac3f16da76520977c5e5d86f0c261d76e18413c202e8a46241951b3a80ca601"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[223'u8, 37'u8, 18'u8, 125'u8, 208'u8, 57'u8, 114'u8, 113'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 181'u8, 143'u8, 219'u8, 145'u8, 77'u8, 39'u8, 126'u8, 173'u8, 30'u8, 59'u8, 70'u8, 205'u8, 51'u8, 16'u8, 213'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 0'u64, validator_index: 7432737887980948854'u64, address: ExecutionAddress.fromHex("0x1a99860ddeecae3195a051bc0a0fcc37d0135e37"), amount: 921585'u64.Gwei), + capella.Withdrawal(index: 8891974894683849035'u64, validator_index: 18060634568259374245'u64, address: ExecutionAddress.fromHex("0x53a6cc4c3996f0181cfe62be861900f56cb75a87"), amount: 235145'u64.Gwei), + capella.Withdrawal(index: 11531749110606308043'u64, validator_index: 9858359378531619375'u64, address: ExecutionAddress.fromHex("0x6b7a4bc00868b077f1c4aa53369e893162bcc384"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 530041'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b7853973d34b1efe7722be5c688589b49c1aaa9"), amount: 18446744073709551615'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xc51bf481df9be981c6656081e3854ffcf27551e2b4fdaed4ab12b355f247f4e1"), + fee_recipient: ExecutionAddress.fromHex("0xd79098c25eed05c9f6d55e95f5f6f58c1472fb28"), + state_root: Eth2Digest.fromHex("0x1a6b1eb78e5ac155d4be247a3b48d8d8d8574a16fa846681553037629b97ffd0"), + receipts_root: Eth2Digest.fromHex("0x5e44d4a3621cd8e495edc0b208f977c8d3f8e79a78fa7ecfc4a0f6e436f67b71"), + logs_bloom: BloomLogs.fromHex("0xe2b0dcfd2341ceb9c4edbc7115dbd6ed5f1c54ca39bee191fdaaa34368acee93f48561094dd23a3985ea2c2b83d918ba9dc671cde7732a591b4f9abd2eacf9d6416ca8c8d556052a98df2cffdbb086315585004c51c76872a06cee7d318f4845c0ade4c907c7933d4d883bcc586885be04ca9149e05b1624856e69e1efe8c93cd55d840bf71279293a118d51d4391fcbf4e6abe6ee50492ff2de085069a3c7656eb3a749d6bf46f56a2acd93a6840eb78e09a42f23fdea69bfbf017f4fd6b4a8d17df1aa5147c1897fe5fda1f5e79121f2fefef97117e7871d1cbf5b0b0350b9fc497c5aba27cbc129d452d6a60effb76e08b890d0bb856115fcfe3966359fda"), + prev_randao: Eth2Digest.fromHex("0xcd6fd69596cdd7df95e0b68e8ade01541b12ed15caa2b59803a4c4e6791870d4"), + block_number: 12264963829660560313'u64, + gas_limit: 11775806146734810959'u64, + gas_used: 1863395589678049593'u64, + timestamp: 5625804670695895441'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[183'u8]), + base_fee_per_gas: UInt256.fromHex("0x1443705192ff4dc1a819be4f22b8dcd6e7802337e62082880b1090f44a27d0e2"), + block_hash: Eth2Digest.fromHex("0x68da52444eb5322f3a0bda6bdc9a3a11a540dbd22026bb2d24862bbc32af9460"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[212'u8, 80'u8, 176'u8, 133'u8, 132'u8, 119'u8, 233'u8, 131'u8, 195'u8, 118'u8, 54'u8, 94'u8, 129'u8, 206'u8, 47'u8, 107'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 31'u8, 192'u8, 94'u8, 136'u8, 120'u8, 228'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[114'u8, 23'u8, 239'u8, 220'u8, 169'u8, 188'u8, 213'u8, 179'u8, 223'u8, 129'u8, 189'u8, 50'u8, 158'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 109465'u64, address: ExecutionAddress.fromHex("0x30376c1737df493e34318acb7efa0aadd3d78738"), amount: 419309'u64.Gwei), + capella.Withdrawal(index: 3744271566165938073'u64, validator_index: 162930'u64, address: ExecutionAddress.fromHex("0x9a3eee4729cf5ef57a1c4aeb474636461991270a"), amount: 9043308530560640624'u64.Gwei), + capella.Withdrawal(index: 10893292846301120513'u64, validator_index: 15952780188276928656'u64, address: ExecutionAddress.fromHex("0xfccc1279aa3dde74ea08b699fecb4481c777f259"), amount: 5614376920521492084'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 2895353066704396409'u64, address: ExecutionAddress.fromHex("0x7e8b34a029236dc0d15db19153165d1eccab05a8"), amount: 3749025806369957542'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x8b3e7e8d447527b9d00693389928260e7ea9da6855efd99369182bd9c213988a"), + fee_recipient: ExecutionAddress.fromHex("0xb45716c9aeddeb030c0b94202fcb97bd75a039b6"), + state_root: Eth2Digest.fromHex("0x8114b285e5f3277c04a66e660fef3b86295d6ca859dfa216df3309c0a7242f2d"), + receipts_root: Eth2Digest.fromHex("0x2a3ff38541ef83faad176c3c98ceb5c55622dec83fbfc5a19bdb27646849e852"), + logs_bloom: BloomLogs.fromHex("0x384a9b3d38d343af68d00c229e79aa31f2059e17c655f5e48d31d2b59b769660e91c1e5f386e4f7dc83f2570029a6f2b3351623fcb4dadd6b5b7b26e27de19e248ebd970a9678b69403ea8e16fe88562959586fcfdee3c407fcf623c94891a2270ba1829bf2ab77fa32913bb11c8a4a69e9baa6544ad336253637626b16d4a98884e7ac7d6c1e697a9435b1e5403b5122eebddec9c03c8a6c8fed0d8877888371e133fb837d33f073375f7e1536abf622610734b9b0aced8a891f02d5b35734e58b0ead66c49ed9f898b8f27e9415275c5d15051ec00cb006f8aef702a7414aefacfa9742cd3d8d34be817e0c731696e20b973cf2da66799121c0c6d12bc835d"), + prev_randao: Eth2Digest.fromHex("0x3bd54c7151dae2ad524b4df0d4283e3641ba787fc76f54221dba3a2aa556a1bb"), + block_number: 18446744073709551615'u64, + gas_limit: 637978774023867007'u64, + gas_used: 15110835166938431016'u64, + timestamp: 18065456863038184935'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[235'u8, 229'u8, 162'u8, 249'u8, 154'u8, 135'u8]), + base_fee_per_gas: UInt256.fromHex("0xbe93cc3dc2bb7e012db659df49e57653bf6ff21354c64eeb69c0002e9f933035"), + block_hash: Eth2Digest.fromHex("0x46cb3f590b2fbce372e67968a0d2ff4ce1b2c530fcc26b7a24ed6db054f52035"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 66'u8, 215'u8, 40'u8, 223'u8, 195'u8, 43'u8, 228'u8, 225'u8, 244'u8, 34'u8, 14'u8, 117'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[92'u8, 46'u8, 215'u8, 218'u8, 71'u8, 99'u8, 115'u8, 119'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xa4854e346d2e9a921cc6b3c4ce9fc739c99795cf10002924089f9886f8624d59"), + fee_recipient: ExecutionAddress.fromHex("0xa88781cf69a1eed63bcc3a32b6f9aba35d4f5b5e"), + state_root: Eth2Digest.fromHex("0xdc06d9210fd2738b0fa9df6d68e4ffbfef0dd7d7d8093fdbcd97ff845318cf6b"), + receipts_root: Eth2Digest.fromHex("0xfe1b70c143066edc444f9b49e778cf6db0060bd4e9122564350cf23061830439"), + logs_bloom: BloomLogs.fromHex("0x095a57c3f2d97aad8692cd09dfdd8388f1bf9ef98a1c3223ecfd0aed17d8c7c3ef593d7f09ba86500644deaa676df811da501d572f342e3f7ee7b9b081992f344f71fa50b3b9635d7375f67dbd85a0b1ade3d8d4778118df55b90c44f7dd1114f2ebcea5778b32701ef94af9b3713d1fe00275e09c7e918d7c529a37aa9de3464eb6364812ec486464ccbf7df2523369fdeb1b28955e35e8685c16f07fbe342edd1bc044021ed480bf4ceffefb13eaf4550c67ef8a5079f3f612f07fff60193eda6ac11d39f3056c41ea4355ef5ef7f311493c415cc8c42cb30a73dd58098262acebe6d901e4bae26b6e1eba693c7dc596ea27b0cdd4fee2f6450ca8b50b1a70"), + prev_randao: Eth2Digest.fromHex("0xc52844ad11072faa2222ffe9cbff77dcc7f681367d2aef5f1c3b206140064195"), + block_number: 767785029239287422'u64, + gas_limit: 15062566578072747104'u64, + gas_used: 7648884410596067087'u64, + timestamp: 4380084205540210041'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[217'u8, 40'u8, 125'u8, 94'u8, 156'u8, 71'u8, 79'u8, 66'u8, 117'u8, 228'u8, 173'u8, 189'u8, 115'u8, 41'u8, 153'u8, 226'u8, 130'u8, 21'u8, 108'u8, 194'u8, 206'u8, 218'u8, 141'u8]), + base_fee_per_gas: UInt256.fromHex("0x436767990abff9288346859c6b85b8a972421619eab2253483385c8151cb2016"), + block_hash: Eth2Digest.fromHex("0xca4f05c33836d82aee8230ef660016b993bca4aaf9a7b6cad96c2a0193eb026c"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[156'u8, 143'u8, 203'u8, 250'u8, 238'u8, 137'u8, 34'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[64'u8, 44'u8, 165'u8, 9'u8, 1'u8, 211'u8, 27'u8, 108'u8, 166'u8, 61'u8, 119'u8, 11'u8, 222'u8, 85'u8, 48'u8, 185'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[165'u8, 95'u8, 221'u8, 213'u8, 229'u8, 134'u8, 185'u8, 221'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 373208'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1ef66a8127bdbf1302c13af1b2a3fde17f1e421e"), amount: 12972917955689502470'u64.Gwei), + capella.Withdrawal(index: 7007268656739027478'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xca30e17b5a7925b1a5afa06710d6cffb4681d2fb"), amount: 13141021224557402822'u64.Gwei), + capella.Withdrawal(index: 10730268187610256048'u64, validator_index: 7483561449283560970'u64, address: ExecutionAddress.fromHex("0x84e755db228c9399912364a239227c467477e076"), amount: 16091384671148001130'u64.Gwei), + capella.Withdrawal(index: 861292'u64, validator_index: 101133'u64, address: ExecutionAddress.fromHex("0x70e7126e6288dd8559b6bf8946b98fe02bc53e8f"), amount: 5439105246644982514'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x5e7b12465e0461e5dfa59a3254282378c55961b0e411023ce89d968bbdc33e9c"), + fee_recipient: ExecutionAddress.fromHex("0xbd1a1396ab49631cc933770944996b294da97d43"), + state_root: Eth2Digest.fromHex("0x74e6ccfb15da8afb94eebf28cb3ba3f9ce63e3354097f2f2527fe1cf978e76bf"), + receipts_root: Eth2Digest.fromHex("0x8e48bee56e149d1851cff0740ceab06767bd0e819261c5a2f75dbea382a110b6"), + logs_bloom: BloomLogs.fromHex("0x7894fbe58c624a153dbb160c516c9e82bd0cacf5f347f984efcca9450e9a20b50e058ed38e41c331df61114086f8a6b8a049467d7dafd812953aa593b2e9fbc056f0dba80973b2eaae8814b5e0804300eeea15613e59c8d34339f58e1b45599361497a3608c05140cf432e7983a30985aa0faf45dff56dce99eaa5ad3418722df17eaaa4e8df25ed1d9eedee1390e6440c4c37675182dcc07ff199d6dd015d3aa03194765e85fc0d4759d3c693fc2550e50835b88ba41d10fc33b58550d813abaa75bab39c0fbe419f1bde8fb82db9fcfb79894faeed84b2314f115a8fb9e276315ccbfb8e9650571add358f594ff2fb4ab9661afde76081bb2cfbfd2f26d212"), + prev_randao: Eth2Digest.fromHex("0xb9a9bce05e42cf3d2ffc2c2ea95164c9b215fc8e440dd2985ca24cff40e32780"), + block_number: 14460352585391846826'u64, + gas_limit: 2426408612341958329'u64, + gas_used: 13656152006197676019'u64, + timestamp: 6263571560389404595'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[177'u8, 36'u8, 79'u8, 26'u8, 164'u8, 59'u8, 182'u8, 88'u8, 223'u8, 22'u8, 79'u8, 197'u8, 109'u8, 53'u8, 53'u8, 134'u8, 244'u8, 84'u8, 146'u8, 158'u8, 234'u8, 252'u8, 188'u8, 175'u8, 69'u8, 51'u8, 118'u8, 101'u8, 242'u8, 0'u8, 51'u8, 103'u8]), + base_fee_per_gas: UInt256.fromHex("0x997e6c8ffbd1ea95e875612109843c6cdfd0c6bcaffa1e06ba303b3012b3c371"), + block_hash: Eth2Digest.fromHex("0x9a7f83cf6a64e153fc3316244fabd972a49ebf5dfb173d7e611bf3447a175c41"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 103'u8, 164'u8, 112'u8, 136'u8, 91'u8, 170'u8, 241'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 12452742873210027116'u64, validator_index: 163643'u64, address: ExecutionAddress.fromHex("0x5d09dd69d2b2370e11b21d758bc82c2a73ee00d0"), amount: 12246034467900494037'u64.Gwei), + capella.Withdrawal(index: 256915780184525584'u64, validator_index: 364410'u64, address: ExecutionAddress.fromHex("0x40a55ad4a156caf112e2abe789554520814e48a1"), amount: 297315'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xa8f90a617f1f230506d200c6026bd60e38f599930ed04f90cdc320a6d45bb022"), + fee_recipient: ExecutionAddress.fromHex("0x3531157eaf2c185bd8720f3edfaf76829632f07d"), + state_root: Eth2Digest.fromHex("0xa16f8936e945ecd45a4ae107e46acd8530e438fa1bc8eb85aef62afaca1656da"), + receipts_root: Eth2Digest.fromHex("0x3e76522c8f3b7e8d8a63f4968ab15413b8bbd7af9782c4878b52213b0b3d13f8"), + logs_bloom: BloomLogs.fromHex("0xc13b59de763feaa39debf70d280364ec68eb578af8a90aba7e2cf3a6cee413a28836c674662a0283df8ff04964eb928de97a3883226950b584d773c9b4479d6d5bda6fd71951c0c846752ed688e13dccff947b7a6c81bfac198b6bf785bca7be28bcf9a208b983afe6e766b0536311c1c12b4d01c712cdaa167ecec5520395068b1c1f939d20962de1aba36454cdb36031fa0ba886a8ece71234654e8b081562452046a388ebcf3cfd975493833ff4e146d5e5ddb061d994461ab8b468cf1d6d491d78fd8923f9f6563e3fbfa72639de993701ff6214fd83cd3597e870dec1c1e788a4f01f881c48e57b07c5a217132658208d2221a86c7e9823159984d235b5"), + prev_randao: Eth2Digest.fromHex("0xbac4a9aa16b289584d13abe3c47a58dda713c4b479ee70e1ac7b3b698e8505af"), + block_number: 4839752353493107669'u64, + gas_limit: 4713453319947764960'u64, + gas_used: 3470256075652600568'u64, + timestamp: 13764471837770950237'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[60'u8, 109'u8, 153'u8, 55'u8, 17'u8, 196'u8, 17'u8, 96'u8, 202'u8, 173'u8, 16'u8, 189'u8, 165'u8, 107'u8, 68'u8, 230'u8, 238'u8, 62'u8, 199'u8, 211'u8, 244'u8, 83'u8, 88'u8]), + base_fee_per_gas: UInt256.fromHex("0x3adad83f48e34c6220dce41ecc0b09f9bb1ae4bda4466935c70e7c6cd54e185e"), + block_hash: Eth2Digest.fromHex("0x9183524f908425608c1e3a80d7c4ac2c539903af4b3a2f1b22c3283281706aba"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 645596'u64, validator_index: 248698'u64, address: ExecutionAddress.fromHex("0x124e32ea8d0363647a58a5511b6de35bdd50236e"), amount: 18446744073709551615'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xc914f63464f3f1588a32d3751900d415bbf1fe002c42068650f5c7c588b1935c"), + fee_recipient: ExecutionAddress.fromHex("0x61523b6add59cc65d3c5b75c6f749fa601e157de"), + state_root: Eth2Digest.fromHex("0xe84ecb995f6c7e753355c8d2e24694441c528b65ef9b1d8c6f4e9d98d409342b"), + receipts_root: Eth2Digest.fromHex("0x887bdafa340c24acb58f36a7e3825ce39fb7e0caaba3a9b63f78d2186cc6994a"), + logs_bloom: BloomLogs.fromHex("0x1fbd358ad7e32eefe4489b6c72bafcf6dbac109970e5c103e329279cede3619faf1309faf266ba155496c19565b31562f31539c98b6256919d8950bb6eca937401d91fa5b3032b4400ce6dd60a8c1c6cc94331b7e78d7a350ebb5d6e04a2594af981f167a89227c7c902dbb8eac3d7b54177d85214a6ef57b50da82b6420cf914fd63171f0b7dff9233bfaa2069774b142a136c5183ed4f57cde2590735b19ef549ff5bc910477b98344e7557ffc440b03d56842f356a6e223fd052c6272e24f43dc9e64055c097d81b56ecfd6087238602a743e09c383ad4eae6ef449570febdfebfefa347f06f480f319ff06365bbfae16b62a950143f9acc3663510356f0c"), + prev_randao: Eth2Digest.fromHex("0xc755584f86084ab2e62bd58f25dfe54538c0171e6447e7e1a51cf05db94377da"), + block_number: 9276126375553452674'u64, + gas_limit: 9007257403963034102'u64, + gas_used: 12806310385580231715'u64, + timestamp: 9957937708118639445'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xe2df33500d1162994934e9fa65fd5db641b0be2b61a6c302c7b9019f86042338"), + block_hash: Eth2Digest.fromHex("0xce58ef51926a6eb4cf2997c4ec771b54907737ae8fe9522fc316c97a1c7ee6d7"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 16986670237072862757'u64, validator_index: 701065'u64, address: ExecutionAddress.fromHex("0x50371592a27339f868b9ef63f6c02e8c1e72ce94"), amount: 3561319411833205205'u64.Gwei), + capella.Withdrawal(index: 2402770018709110103'u64, validator_index: 798632'u64, address: ExecutionAddress.fromHex("0x9d42c6c10cbc0b04e3f2e74f63c777802d4ca064"), amount: 898967'u64.Gwei), + capella.Withdrawal(index: 944680'u64, validator_index: 507423'u64, address: ExecutionAddress.fromHex("0x640d578aeed6b8a9acc83f13343f3139fe8f4a15"), amount: 941781'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x086322b79160568c7d096747ef351338ddc93f252dab1df3ef65aaf24723d2c3"), + fee_recipient: ExecutionAddress.fromHex("0x03c6998b5a3ff1c98538c2333d279f2b1cc59f7f"), + state_root: Eth2Digest.fromHex("0x446d99a7e9fd2c327fbd445dbfb3b3e3a895cdfa6f208496dd09c0f84f7ac0fd"), + receipts_root: Eth2Digest.fromHex("0xf4c74d5c59c46f1d9f916b32d8a12939cc2a379bae83153137de76415f6e5afe"), + logs_bloom: BloomLogs.fromHex("0x40f87c3729ba599c3e9bb749c48148ee0d5563db71cf0daaad3af95c45622d7b2a64204157a92a93cf0ffbe0052fb79eef83ba8389fe9d9e7646874b0636960e4eee86eeca00ba70f65b2046620264b795852def9beebb671f841e19ce07934b7c2f66301cc3c7dfa2606067cdeb04a564b87e56ff3650c7c6bbbc96b2de5ccf8e314ae74a26347371c315062532a1f1a2fe0c417ed5d12b6f81c3440c0d8b19d0cf8a030be83ee7ada6046d75098b6ee66664ead786a65ef5cdcb33c4634aa07cd7490abc0ea9ce722423a0cba1aecb379552e89483de43dd321cdaa8a005ab7e8e2a958038ca12e2b08709348a7f6daf34c488add1a0a21aed0da0b64251f9"), + prev_randao: Eth2Digest.fromHex("0x2ff08bd0b22bae8c3627f61b8da627fc367b3a60f93dbe48de1ca6f25ada489b"), + block_number: 10605470807350562909'u64, + gas_limit: 587854351728657338'u64, + gas_used: 8799032544585725320'u64, + timestamp: 18028498231539883963'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xfbe348f0c77be2ddbd3ec038e3aad88107625dc6e96b1fb3bbfdba8c737a3d7e"), + block_hash: Eth2Digest.fromHex("0xc545e833aa2ee5d708e041f4dcb44bda654372b3f5f660c683d12230303da729"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[89'u8, 59'u8, 131'u8, 146'u8, 186'u8, 180'u8, 208'u8, 76'u8, 69'u8, 40'u8, 29'u8, 211'u8, 97'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[208'u8, 136'u8, 157'u8, 0'u8, 120'u8, 231'u8, 99'u8, 33'u8, 31'u8, 210'u8, 80'u8, 203'u8, 24'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 225873861246030158'u64, validator_index: 3132710425326779052'u64, address: ExecutionAddress.fromHex("0x4d2573288e7949201c806877449e441801ba62c5"), amount: 9096383177302198854'u64.Gwei), + capella.Withdrawal(index: 2816791477401799195'u64, validator_index: 12199871733060832130'u64, address: ExecutionAddress.fromHex("0xd4e21e668d5e8b1c097cb250dc862bfd7f8a2b76"), amount: 7278220627858832735'u64.Gwei), + capella.Withdrawal(index: 12003547154719720523'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xe888b3288bfaf8f979c93699cbabef6c1f156f19"), amount: 18446744073709551615'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xcfba7f4aa4ff01d3d9de84dbe1761c79627a10c3188fb0a7c8adfa0d489e6441"), + fee_recipient: ExecutionAddress.fromHex("0x106b3bcaae4ff58dd837768be35c29c48571e4a4"), + state_root: Eth2Digest.fromHex("0xe6242399020361e70cb6b89701001fa8326251e6bae3b4ca1978eded8831d9a7"), + receipts_root: Eth2Digest.fromHex("0x3db0f9a05cc39be94414c3be28378d2b91ba3ff43ea2ea7e4e0a1874a0983f58"), + logs_bloom: BloomLogs.fromHex("0xd591169a3cc38e0837a76c4d7057f94c1ef08ad5af1778b1b06c3a0ec85201bfc659b18c49de831ce6b4a40f0d2800a9cc9001f74810c58473f9b973b720f84626cc9270b0428439b985043f5d9c3289ef8a794f5b8265e10e9fb9fa53a93887d270b8204f8f16cd968e295b0a06aa70e9f6f174733d251f3bfc644a7fb274b0138729f18c0e4382bd4bf0387870f633ed897a125ca854120c2885194f3180af4b62760db96da51f88ae1cd222f49b00fbbc1544eb0e98cea67e36368816f541723158d3691f3cf1509c65a51a8e68efb66c500dd6516ca1b02aeb4e0c13cf5bbead53672fb5a7a1863c8edfaf4eb9a4b4322a39d8643528bccf22493914fa01"), + prev_randao: Eth2Digest.fromHex("0x14fec0a1edb9c82dc9aa7fb7224791c51a3937e74e5da59646123867496460f2"), + block_number: 6272046003849350913'u64, + gas_limit: 15423951135645467684'u64, + gas_used: 3743939155619454195'u64, + timestamp: 8496536260448579184'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[152'u8]), + base_fee_per_gas: UInt256.fromHex("0xd8b104041bdc4c76a9735e2b4b45f0f3612e8962f672aaf511f06a94b48562c8"), + block_hash: Eth2Digest.fromHex("0x8ca67fec04b7e3bc5a01f5bb265b93b4488b58ec2ac7f2c3ced030311de2762e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[152'u8, 232'u8, 136'u8, 228'u8, 253'u8, 248'u8, 85'u8, 92'u8, 103'u8, 38'u8, 106'u8, 166'u8, 148'u8, 8'u8, 37'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[58'u8, 215'u8, 97'u8, 99'u8, 152'u8, 126'u8, 14'u8, 252'u8, 64'u8, 87'u8, 242'u8, 60'u8, 210'u8, 217'u8, 75'u8, 189'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 18405055677765556765'u64, validator_index: 13513833286292305941'u64, address: ExecutionAddress.fromHex("0xfe53af2bf3560b2157a683a545d4f898354f4d55"), amount: 911502'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x063bc56b731eeeff8bf1c33d88523a04a14fa0c745eb3c750139842d88244982"), + fee_recipient: ExecutionAddress.fromHex("0x415b1cd5b42709a3724ab2f6f50a6dab7399d7ca"), + state_root: Eth2Digest.fromHex("0xf261abf37066b8dc5c868946346c98aae445adbb48e6dd05969fbb49267a276e"), + receipts_root: Eth2Digest.fromHex("0x5a337b7ee29d98e22b461f43b7a87e52d89fda2e7a3487ea92873be04a49ea68"), + logs_bloom: BloomLogs.fromHex("0x01817fd642526acdd8b57b4fc2fb58aba269095ce220ae5770004055f550918778021eae3abeffff1b3fa9fba50ff8d532fd8e2e67da7bdcca1cf9505179f19f595f5d9f09b98d5bc7d1ecb22527255e8e161ca2124c5fedbb59527f91a242671177e33a6fa377d585ebdbd6d9ff2bf80bec3695657441e35da43861f14b9a7e65ed475c323ece62d84aed7262cf3fd2b06ba03695e2e26e5e58fc5b8b99d519fda879587e3764930e3921aa15b2ee8691ea0e738030acb8832ca353d3bb63fbc0150c532b842cd053abeae8238c9ffe6f4b2b7210dc862c48843ae2a9088ecdb8c258592a0feb5215b8c9ad494ad896379d86e0ac89e6cd8765003ac5c95cce"), + prev_randao: Eth2Digest.fromHex("0xb28f434f3f40e40693b0c1726a018e2b3bc13c41608a2ca71aa5c8bf61829287"), + block_number: 14597257287993827247'u64, + gas_limit: 9090926713872599867'u64, + gas_used: 17391976671717618186'u64, + timestamp: 13439825139187707720'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[73'u8, 163'u8, 138'u8, 201'u8, 62'u8, 1'u8, 37'u8, 90'u8, 157'u8]), + base_fee_per_gas: UInt256.fromHex("0x8a42339ef76757729ef6c4536b3b59255b18d7085d8ba786275b2076fc55b3c6"), + block_hash: Eth2Digest.fromHex("0xb3f6ec11b285a105833f5b68b67e8e23c85c28df2362a13a76db705f110fce8c"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5477557954669138518'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b840b26a19377c64b870be600aa336a40ae46ed"), amount: 42381'u64.Gwei), + capella.Withdrawal(index: 0'u64, validator_index: 1'u64, address: ExecutionAddress.fromHex("0x3d22a723824a2944ea9accc8653002bf7d61a10a"), amount: 2799163561369818755'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xb31c41d39ef7e9a9b905cc93d82264415024d7daef48d886f1b3bc0fd6545edb"), + fee_recipient: ExecutionAddress.fromHex("0x5ad4b6c0d6b986e775f3a9ae2be73a330ba9f87c"), + state_root: Eth2Digest.fromHex("0x01dbc857a3d8994cf10cd1be3b2018be0e26ba54a5456e10a6e5729328a0b5f5"), + receipts_root: Eth2Digest.fromHex("0xa51e9cb9893bd7d73a8fd4e5267d80ddcb29d998814cfa9980dbae50ef101aff"), + logs_bloom: BloomLogs.fromHex("0xf1280db0ef6bb796e70dfef3b0bafa62690ef1e8f14a237856bae5dbe29dfd43ac789c53305ab5b0b7cc48ed53d1236ab9433a5352dac55b6e0a3ff90e9e815e2ce16fe5574c87f0066090c39b811996e2974da0bdb8bb59eb044bbb6bc2d7f8241093c7143a7c9892be85ea4284258ea2477f6a677d424efb6469724d641bbdc3f9254529b6af5cc5f5a77dad49c1a59ae37c19ffc69f6e331139b6ebac306ea09460dc0fc5791ef2cfb9e7bf29d662872e30b94384be90416df03bef5cf5a2339af4745f2f620fd1320d3fb79848692719cb8956b8efd427c9c0cc3ea6efb8f84feae0075ed10ec5c6243074e6004849712d8d1dd97ebb2948fcdf1d020c6e"), + prev_randao: Eth2Digest.fromHex("0xc8a27f0b7850de04e3d794b9e9d4f144c356f864401c3f802927faf4b88b47ac"), + block_number: 10821099926525463598'u64, + gas_limit: 7115919978619568727'u64, + gas_used: 1, + timestamp: 5900615379943209755'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[56'u8, 176'u8, 67'u8, 30'u8, 11'u8, 27'u8, 136'u8, 121'u8, 86'u8, 17'u8, 4'u8, 121'u8, 11'u8, 222'u8, 158'u8, 78'u8, 56'u8, 66'u8, 243'u8]), + base_fee_per_gas: UInt256.fromHex("0xfbaacdba879288838ff725df19b7a31148ec5a24e7989441544d6dec1c980034"), + block_hash: Eth2Digest.fromHex("0x04616c0808df7a1bc177bc48cb6ed865125fbbac2fa3e3c36f33a5f1c48a23fd"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 143666'u64, validator_index: 849676'u64, address: ExecutionAddress.fromHex("0xbf06178f996afec7c9d3cb488e812f32aafe4242"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 560588584813483246'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1a1b89bf52af0d4a8eff759986ffd93cf4464114"), amount: 13046900622089392610'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xf6cba3ced37c08da230babbf9d1e360661e5a21ac235fefa75cbe756f15809de"), + fee_recipient: ExecutionAddress.fromHex("0x0c080349793b7f43fb3ee9101889e7d32e02c01d"), + state_root: Eth2Digest.fromHex("0x6a33580fc482e9783d66bee9276f42b74a2cbc2b7434fc408a6ba9df77db0ceb"), + receipts_root: Eth2Digest.fromHex("0xd896daff74ffd6ffcc088adba01aea52af82d861b7ff649265a750e5995dcf31"), + logs_bloom: BloomLogs.fromHex("0xec00c3385b735b6a4088ed066bdb088e7826a2830fd13a1a1525c4590eb08baeba81bb511bbf2db2c0547c69c10b5c6c1bf5c8e5a7931584e6ed8ed7357431e1e2391fc0e61a060baf8984a6fd5c04c68fe0f28f94281d0db663b1b2fdaad9b51d3a12bb9fba255c923dea5ce45dd68ec2c5afc9fd13a0e24d234a3c8c5f255e7d62d48a8e01fb5c1eaf0c7a68a616ac935416fe3332943d78eb28a48a180e2bee26e85d786583ae0609a8b98e1045738f054aa12bef97593cd16d8d795314bfff33c51b397afa2299a4a64244817e5a07cdcd75eb4c4c06e8e943d8d1db8e65f17368ab6175c3e14daad0b99fd0f1050feebadf9db8fe8f1c19ed867f4df676"), + prev_randao: Eth2Digest.fromHex("0xdcd37bc148c25afa7e320009ce19567108745ef5ed57781f55df1d73b707e26e"), + block_number: 13754339262807377549'u64, + gas_limit: 5250261236890759949'u64, + gas_used: 1335844244115849195'u64, + timestamp: 16758901654456753273'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[28'u8, 8'u8, 171'u8, 122'u8, 126'u8, 38'u8, 142'u8, 246'u8, 162'u8, 197'u8, 241'u8, 216'u8, 158'u8, 184'u8, 73'u8, 191'u8, 208'u8, 5'u8, 79'u8, 231'u8, 254'u8, 55'u8, 126'u8, 97'u8, 184'u8, 78'u8, 36'u8, 80'u8, 160'u8, 124'u8, 188'u8, 176'u8]), + base_fee_per_gas: UInt256.fromHex("0x0ea1185e0ac50d1e2cc0be7229c846528380def25f7d8860cf366e6edd793be0"), + block_hash: Eth2Digest.fromHex("0xb471874aa6e8987deee40902d59537fed8af3e9b6ae2f8b476ddb051629b3b09"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 215'u8, 225'u8, 83'u8, 163'u8, 187'u8, 111'u8, 141'u8, 246'u8, 57'u8, 238'u8, 163'u8, 25'u8, 91'u8, 114'u8, 111'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[93'u8, 42'u8, 101'u8, 80'u8, 160'u8, 252'u8, 158'u8, 121'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[164'u8, 98'u8, 105'u8, 179'u8, 25'u8, 33'u8, 130'u8, 239'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5378768050415100863'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0x3d84c03e4c18979ee8288bd58b24989580f0a590"), amount: 815393520574223128'u64.Gwei), + capella.Withdrawal(index: 17328504288784263137'u64, validator_index: 305278'u64, address: ExecutionAddress.fromHex("0xa00491dfbee05f23fc7ddcfcb1b27b2855334e81"), amount: 7734460020873819187'u64.Gwei), + capella.Withdrawal(index: 0'u64, validator_index: 444647'u64, address: ExecutionAddress.fromHex("0x0689ed39160f4b4c20138f300b3b2502e6d6ab5a"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 834083'u64, validator_index: 10715076713456342424'u64, address: ExecutionAddress.fromHex("0x07ee24f650e7254d10d61b832db7174128bf22b4"), amount: 17794546242151296198'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x62ce6a6d68578309c4730f96f98a809d4b4225fc3d37a285daf26288b10f9590"), + fee_recipient: ExecutionAddress.fromHex("0x8c892b06f1e9c877c310b6eccefb20fcf5e00227"), + state_root: Eth2Digest.fromHex("0x578f93b83206e3239c69f51cc8e59cd89087260cda9f0efc892aa2ffb2bf386e"), + receipts_root: Eth2Digest.fromHex("0xa4ac657af8e0dad66ec74f4f66b246fe0089485e2810071fa556c09ea585059f"), + logs_bloom: BloomLogs.fromHex("0x18d67e640f9ad3a24deb7e3f8cbe0ba8224cf9cb9e67b2fd6c774fac7aa3f4adca2befe8322962cf000cb89c3e352433cf1aade51ceac9fe69966a8a89f7985030a301eb690e7eb20b5ac3b315930ee5397b6d65b03a1131b94e7f3505ef030877e460e9195b742e943716d9875a3e2e9998236d3565d622216af1721b658a12fe7d82a62619b4f2d042f146305ff1ad1bf394437340735eac9e962b3fe67597793d1151ec87fcb5f0056837c5813c75c4a0f94d91da71299b3780f250ee31eb9f106e3c443f0ba05213da05177238909fd9e60de9484e091b91dead82debc020929d1f14e79b610af3d15bf9c3757e62bb32a69523c1bd576e5c5d4bc2ef0a6"), + prev_randao: Eth2Digest.fromHex("0x552627eb969604e7d4ed1e631b74b2410dea7f4dbd49511bda390e3b9da8bf60"), + block_number: 7763671958353664038'u64, + gas_limit: 3930616259240751958'u64, + gas_used: 7960068863134244743'u64, + timestamp: 18446744073709551615'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[227'u8, 111'u8, 127'u8, 243'u8, 191'u8, 237'u8, 88'u8, 146'u8, 146'u8, 236'u8, 162'u8, 237'u8, 164'u8, 177'u8, 249'u8, 52'u8, 1'u8, 26'u8, 187'u8, 208'u8, 244'u8, 234'u8, 113'u8, 199'u8, 30'u8, 209'u8, 197'u8, 63'u8, 126'u8, 104'u8, 143'u8, 30'u8]), + base_fee_per_gas: UInt256.fromHex("0x6bcd9684e1bc8f4fc5d089e0bf5fed35a8bf3039808d030bb9eb1ff7147180b5"), + block_hash: Eth2Digest.fromHex("0x9e2505de9f245873565b553e7215abff698bdfcee1dbd93e40eb295dd84e7f45"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[140'u8, 134'u8, 173'u8, 70'u8, 168'u8, 181'u8, 221'u8, 210'u8, 25'u8, 142'u8, 168'u8, 139'u8, 77'u8, 134'u8, 203'u8, 219'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 0'u64, validator_index: 780337'u64, address: ExecutionAddress.fromHex("0xf0ab5949e96d8befa8090fe5612d9c45beea0c8f"), amount: 2246589958612652012'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x4f8251c361a23171de8648d1e96c91fea2cc5a691dcd884e3a957dc8f6a8802a"), + fee_recipient: ExecutionAddress.fromHex("0x7da9175abaf6e4e400e0ee516fd3ab07dd659f2a"), + state_root: Eth2Digest.fromHex("0x1bd3a5da4c266dd396b8209288e68be066176ebe64cd4c17c4c6cdccaf03577e"), + receipts_root: Eth2Digest.fromHex("0x16133c4fe31f0487e700514160acf9257458a6ee716be8043cb6c532f84ef614"), + logs_bloom: BloomLogs.fromHex("0x5ca3807e674d69536b33337d798deaeb9fa6c7cbab7aef1473e6a6614f6f2c74ef85ee3632612b9c1e78d2a63e0b2f58d48d71e8d62e38510bc2f307680497cb965153b43392b8aa2dcd91a766356eab3ff1b4a6c4b037d61df1a8a4c6d3fa0e3c57a299a1c0a7382052ac25c412f2d2356c302e326fa0cfb570354e31e2f8046b80e2690ba69ec7c284c2df8ad23d16764cbc0ba28516f3c31aa89da3e3286106dcecc835b3007a17f33c4962efc3c9b0f5bff14c783e414ba60d35b79ab33ccd0151c34a94efc461d0df0a994085373f33275a4cd6839603632409b670072a4554f1c9342c03cd403a6feb67b23d3a075707ca89b77bad64e24a6ab79446ad"), + prev_randao: Eth2Digest.fromHex("0x6353ec5b94b9112f25e66de48b532ff5610c63f34c50a02fdf64af6c9d0ef2f4"), + block_number: 16866969889068542818'u64, + gas_limit: 5116920640663397560'u64, + gas_used: 13292402101416991817'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[136'u8, 133'u8, 189'u8, 60'u8, 229'u8, 217'u8, 70'u8, 145'u8, 136'u8, 97'u8, 175'u8, 23'u8, 183'u8, 73'u8]), + base_fee_per_gas: UInt256.fromHex("0xe1307a28a2868b4d934aefdde7bbd09b0644b5c422d2c680770775cb44623512"), + block_hash: Eth2Digest.fromHex("0x11e23850b143b8b4dd8394ee1f2cebf073068502d04dde00000925cf23ff55cc"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x0c67b44b492590ffb9e6d2a63c84714821be7526ce1c337c06276e33a62b7b93"), + fee_recipient: ExecutionAddress.fromHex("0x1d16dbe66ead2ba8afb8594acaf8d536be08dac3"), + state_root: Eth2Digest.fromHex("0xeeb40e334aff8512435b5908a8dd3c06993cadca8bc44e9a6c28c6003162c6a9"), + receipts_root: Eth2Digest.fromHex("0xefa5b7de19da2333bfb7bfa814a306f904fef2ff4f8b1154314649a56fea3c8d"), + logs_bloom: BloomLogs.fromHex("0x4ebbaff6a56343a6bc0170aca2e2ba303f3e3f972c88539ef84e402740e3c9e21c6951d461baf56eec14c06ca0e95f4921079d0d82e9dd46e73f3fa76417246217ff9c5425f19b0f8b2a735ee522c1bc377a2b079099430d0f9316164f5930456245534bbe138d0a19ee58bb13a0d724723a6fa50e39b8a7ad5804f92ab43c24782e27dbb32789408cdd716af9a0b0cb1e2f3aee0bcb5aa4088c0cf1528fad466f3d71d906649becf25f405f619dead731e0831efb522b5faee7a39ca28128effc79977816d50ae23745ab96b80dc7f548aa5d43b0d5c331fdc1ce080a4d63e19942ecb4df8f56397b2ef67d017f2d2de9296e1fd8036ed8592f5a89553c4642"), + prev_randao: Eth2Digest.fromHex("0x5d3c3ac25330e1cd3a516003315ed24bd2dc6cd31d389639cce4b6ae4a3ac8cf"), + block_number: 10891095348111649307'u64, + gas_limit: 13670668340379820434'u64, + gas_used: 1482104080767186829'u64, + timestamp: 6602476120092784163'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[223'u8, 228'u8, 253'u8, 3'u8, 38'u8, 218'u8, 253'u8, 87'u8, 206'u8, 243'u8, 168'u8, 113'u8]), + base_fee_per_gas: UInt256.fromHex("0x972a01f27d586035ce5fb233118e52652ebbf89f6d39558a41b27c8840c849b1"), + block_hash: Eth2Digest.fromHex("0x9280fa96a569e7c25b2dfc12a141d3edd24acf2fbfa19ee72e5a1fd5dba25a11"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[116'u8, 179'u8, 195'u8, 80'u8, 193'u8, 73'u8, 187'u8, 64'u8, 41'u8, 251'u8, 55'u8, 90'u8, 161'u8, 30'u8, 221'u8, 210'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 820354'u64, validator_index: 626992'u64, address: ExecutionAddress.fromHex("0x4abb3f9a694bf6b27be97e24290ca6826b23c5d0"), amount: 100271'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x7a9d6ab34c0314959d5bdceb0bd80f142e59e5e2addedcd178612303897e7a8a"), + fee_recipient: ExecutionAddress.fromHex("0x3425bc529b4791f5fdb7dd365501199b2f81e578"), + state_root: Eth2Digest.fromHex("0x4eb1a9a3c4b9392325a14f3f8efbc0b3cc3bfc2d7e9992377abd84af6c556db5"), + receipts_root: Eth2Digest.fromHex("0x094e9114d3487925f6818140978e4db64d8306083a8e5c987657e21c3a1995bd"), + logs_bloom: BloomLogs.fromHex("0x0815701b4689d0bb7f80fb1485ad3255a66b890725a1d2d66b4fc66678e2d08784c21ef583401493d5dda1549eda32303b7d102edc72b9fe1d696ab459294a88db0d7263abdf982ddf59ce008b8ac734565de79c269dfc18a36709ca91a3cd50516725e9fa9d98302fa0322254382aab0cdf1f95f2397579f7219bd7ab096ef1f00d7b1131b0055bff65ae9954cb22959adbc40983840ae3b85358fd205bdf6ac6bcf723047ffc53a094a06c2039935b6ef579efc618bf4127a6e4e531f6d97c17789be639691ef87fa5540cf732a184a0e09d5c60866ecd0be0a04bc94317712c395d84c2cec90f43f4807048bf1a93e3e6520a1a7c59092e2e391abf9d2e68"), + prev_randao: Eth2Digest.fromHex("0x349eec90244f3d812002732cd833952969b27a463def04291051137344c89c41"), + block_number: 5715688900321967041'u64, + gas_limit: 17172684770312311722'u64, + gas_used: 9286597649062725614'u64, + timestamp: 195835912833125491'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[34'u8, 35'u8, 209'u8, 45'u8, 117'u8]), + base_fee_per_gas: UInt256.fromHex("0x7b5b4e48b3daadecb9724a74d426a86ffb5c5f8abd43469b4e3fe2a728b5a645"), + block_hash: Eth2Digest.fromHex("0xc71c294b5562af30b9e2b03e76cec0cc6d8b50694219404aaed2ace8f756a22e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[178'u8, 142'u8, 115'u8, 217'u8, 56'u8, 74'u8, 150'u8, 16'u8, 244'u8, 148'u8, 19'u8, 33'u8, 89'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[195'u8, 248'u8, 42'u8, 129'u8, 151'u8, 119'u8, 232'u8, 235'u8, 245'u8, 240'u8, 113'u8, 157'u8, 235'u8, 158'u8, 160'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 27'u8, 72'u8, 107'u8, 18'u8, 210'u8, 127'u8, 78'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5186085670428433087'u64, validator_index: 156817'u64, address: ExecutionAddress.fromHex("0xf8d93a548c4b243e66f4f73b29da342a0fab04de"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 9475052657186699106'u64, validator_index: 759532'u64, address: ExecutionAddress.fromHex("0x97559fac3168c6ee81b0f0b0b88563080ca24769"), amount: 4852567582077527137'u64.Gwei), + ]) + ), + (capella.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x806a868f0f31e8f519fa6339ad18c414dba17feb03aaf6ca3775b152bac64f3b"), + fee_recipient: ExecutionAddress.fromHex("0xa2bcc8b793c4a5d4e0f68251d2f22e1ff4366d2c"), + state_root: Eth2Digest.fromHex("0x6979ac9545f31eaf7ed8bd227cd7cbd1017492b892bcc118f7417ea87d50d412"), + receipts_root: Eth2Digest.fromHex("0xca0ac1828fae211c9d0fd7ab763460d89f9da0669d082c68b9fdca3ca1b59123"), + logs_bloom: BloomLogs.fromHex("0x0656423dc7b375cee4f5c3bedc500eaff2da91d0dd5f4e695933c92a2a6af7441200a41177bcae7912839f993a733aa2bb82976f08180a901e63c588a26dc9ccc58f477eccbb08aa932d512bfc765a57527acd04c585af23f48f389420890d06877d8a0f523cb90be10dbc73cb5b11e808f5c6c90c6fc3a9434dab462f2977eacf79146b35ee2372aae8a6fe3628cbe21a8988fd9546b25581b6d998462f9af7f653d3a4702a4a63b9f26cc7d2f72e18a3918fa9b65ed81d23ac0a64dd8f3f878f745fcb4de9ad144ae9565288d7bf90e6d356f49cc242d000e988fe76e0196f0c5b24bdf9dc501222e54f64861e0d45dda2bdf09e5fb290a1ec6dce39b02883"), + prev_randao: Eth2Digest.fromHex("0xc986211f6550cb787e89140d8856531ec309f652e2a871e2715c1dd055448074"), + block_number: 7781035717593646205'u64, + gas_limit: 9088183223170031827'u64, + gas_used: 0, + timestamp: 1844848381084178223'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xaac988479abbe95e03cc214e7b99795c4ec117bfe4da06e4624e94b262b015e2"), + block_hash: Eth2Digest.fromHex("0x14137d373f6e6110b3fe3c1d743a4f84547ad3d59d0b42598b794ff601e97e38"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[10'u8, 28'u8, 79'u8, 238'u8, 85'u8, 206'u8, 161'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[144'u8, 222'u8, 190'u8, 14'u8, 247'u8, 119'u8, 95'u8, 48'u8, 238'u8, 50'u8, 180'u8, 12'u8, 216'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 428032'u64, validator_index: 18218455002493563835'u64, address: ExecutionAddress.fromHex("0x389fe5e57a13de364b852d7e2cebc2add2cb7510"), amount: 726634'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xc6a0db1d09160cec69bda14b444c46745e09c96b"), amount: 742028'u64.Gwei), + capella.Withdrawal(index: 858390'u64, validator_index: 326055'u64, address: ExecutionAddress.fromHex("0x6a861508a89443c763d5daf15dab44a8a45147fc"), amount: 597242'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 17239721441660215355'u64, address: ExecutionAddress.fromHex("0x1450447dc71e28e312c7de7034523cd322eabc98"), amount: 18446744073709551615'u64.Gwei), + ]) + )] + + for executionPayload in executionPayloads: + check: + executionPayload == asConsensusType( + asEngineExecutionPayload(executionPayload)) + + test "Roundtrip engine RPC V3 and deneb ExecutionPayload representations": + # Each Eth2Digest field is chosen randomly. Each uint64 field is random, + # with boosted probabilities for 0, 1, and high(uint64). There can be 0, + # 1, 2, or 3 transactions uniformly. Each transaction is 0, 8, 13, or 16 + # bytes. fee_recipient and logs_bloom, both, are uniformly random. extra + # bytes are random, with 0, 1, and 32 lengths' probabilities increased. + # + # For withdrawals, many possible values are nonsensical (e.g., sufficiently + # high withdrawal indexes or validator indexes), but should be supported in + # this layer regardless, so sample across entire domain. + const executionPayloads = [ + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x760d4d1fced29500a422c401a646ee5bb5d65a07efa1492856a72cff9948a434"), + fee_recipient: ExecutionAddress.fromHex("0x315f583fa44fc6684553d3c88c3d26e9ed7123d8"), + state_root: Eth2Digest.fromHex("0xa6975bac699618cc22c05b1ba8f47cbd162475669474316d7a79ea84bce3c690"), + receipts_root: Eth2Digest.fromHex("0x080d53a0fd22d93f669b06052413851469d63adeb301810d7ce7a51c90c8e8ce"), + logs_bloom: BloomLogs.fromHex("0x453a1f1c4f63bcf0be84e36a9ac233b551601bb2e5ab9450235bd83e41d2013f42c97044ac197a91da96efd6fb18f233bad2e884d76f0a63a6fbf7dbc714cc9aa497fb6d363feeba18447ecf799d5f8d769232553c375b21166c0176859dba63eb77f1a17e482ebac07c3cfd5281277f55f1e5c79cc675d501e1982816d31db7d73c89e855315d8f4e9fef1c9ebb322610235c44632a80341b42f05d207ac4869d08d98a3587a470f598095ebb932788fefacdd70e7749e0bd47ceff88a74ee1f006d9791350484149935d4521d86e644ebc4346154ca0bfa9fbb83120630867d878c12e53a04a879e993b755f02670c9c47f091acf1b3f593782ddaa98f0df4"), + prev_randao: Eth2Digest.fromHex("0xe19503a6fa6acde0b8f5981f29eb2e298ddff63e6243529d735bcfa42680a515"), + block_number: 9937808397572497453'u64, + gas_limit: 15517598874177925531'u64, + gas_used: 3241597546384131838'u64, + timestamp: 17932057306109702405'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[55'u8, 184'u8, 18'u8, 128'u8, 63'u8, 61'u8, 26'u8, 79'u8, 3'u8, 225'u8, 167'u8, 15'u8, 240'u8, 167'u8, 180'u8, 141'u8, 205'u8, 10'u8, 246'u8, 70'u8, 248'u8, 35'u8, 19'u8, 45'u8, 252'u8, 187'u8, 168'u8, 42'u8]), + base_fee_per_gas: UInt256.fromHex("0xaf8acbd8a0f0f8eeced9a1014333cdddbd2090d663a06cd919cf17529e9d7862"), + block_hash: Eth2Digest.fromHex("0x86b46255725b39af70a9e1a3096287d9772ccc635408fe06c34cc8b680977ff5"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 98780'u64, validator_index: 8610867051145053792'u64, address: ExecutionAddress.fromHex("0x0c33e909ef375bd3ab33961b5ea767b4f1c8bce0"), amount: 671269'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 500164'u64, address: ExecutionAddress.fromHex("0x271215240885828779da36212489170f19a8f5bb"), amount: 2071087476832314128'u64.Gwei), + capella.Withdrawal(index: 26148315722507923'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x340bd9f489ec124b8a879673f12969b14d0b5555"), amount: 9486787560616102568'u64.Gwei), + capella.Withdrawal(index: 4839737623914146930'u64, validator_index: 273755626242170824'u64, address: ExecutionAddress.fromHex("0xcacc573cfc0ad561aae27f7be1c38b8dd6fab2cc"), amount: 9475975971913976804'u64.Gwei), + ]), + blob_gas_used: 4401258332680664954'u64, + excess_blob_gas: 12834012644793671460'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x2cb54ddf357864102f4ab6bce57317a75cee972f303449bf7047f4e0e5809127"), + fee_recipient: ExecutionAddress.fromHex("0x92af67d9604b945fd2cbaccd29598e2b47ef5d2d"), + state_root: Eth2Digest.fromHex("0xc64221514816a2f87a29c2c474abf99547820b2a12e6e5956f160dd54579e521"), + receipts_root: Eth2Digest.fromHex("0x76c1ca0e483a557f6884d64bd891c62904c64c2fe69350278345c622cc50b0d7"), + logs_bloom: BloomLogs.fromHex("0x7afdc9a99777d76b713e960e9f12ad4fe46ecb7ea6d5b245c6d9ee11d3fd35e7ae33dd6062fb6578bc2c2f286f1c6a4aa6a44cc80a88a3678c7085c35a0f2e5334ea686e2098fe5d179bbbaf81cbc349a15e7a21aa27f0ddcad342d980d056a356694cdadcef8db3c7866b6cb087c28f2aeed7a5bc9b1294cef0da3ac3b46dbe72d7f164f1990bc32f755b709b96a96bdd8da2c9d9300e9f6906040347d337fc21b833ff0b80305b22ac64a2df2dede4c01c65c192884f161aacd12ba56dab9189477e6ae484a97ff96e0aba1f9b8d043896b8433779abeec091f16b94a013325fe11096d1f2d79b701ab5b46063ac99392a790e617555fe3286dfd7ec0cb9b6"), + prev_randao: Eth2Digest.fromHex("0xc4021ae781a3b3a1dfb1e4464b032a3bae5f5b68366beb555ede1f126920cd5c"), + block_number: 11318858212743222111'u64, + gas_limit: 2312263413099464025'u64, + gas_used: 1, + timestamp: 15461704461982808518'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[254'u8, 188'u8, 92'u8, 24'u8, 153'u8, 206'u8, 74'u8, 108'u8, 96'u8, 100'u8, 148'u8, 84'u8, 151'u8, 74'u8, 73'u8, 167'u8, 65'u8, 177'u8, 253'u8, 62'u8]), + base_fee_per_gas: UInt256.fromHex("0xb1c4b2bffcb38aaa1f98b483441aa212c9dd951d4706dd505a973fd5fd84796f"), + block_hash: Eth2Digest.fromHex("0x8b150d453d802fdbb19be0132621a5e8061e70cfe6668ee6a63e4ff217434999"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[142'u8, 197'u8, 221'u8, 83'u8, 32'u8, 126'u8, 145'u8, 86'u8, 28'u8, 39'u8, 112'u8, 240'u8, 168'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[175'u8, 191'u8, 143'u8, 78'u8, 162'u8, 249'u8, 87'u8, 193'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 168'u8, 190'u8, 157'u8, 39'u8, 143'u8, 147'u8, 156'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 11497754023538902580'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xb0b680a6d93e520fa32e399ded64871d99c1f2c6"), amount: 15592017597077727306'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 14269483352942387358'u64, address: ExecutionAddress.fromHex("0x97e4451d09c9af077dc9081e5081563aa26e4c51"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 9664968187979079659'u64, validator_index: 750818'u64, address: ExecutionAddress.fromHex("0x1e4bc6f12efe96b9f5ca549b77a3d62c5f5403d8"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 727020'u64, validator_index: 10133766089843653238'u64, address: ExecutionAddress.fromHex("0x6a1ed64277cf1eba8c96281531d2799d1fa7c409"), amount: 130469'u64.Gwei), + ]), + blob_gas_used: 4810756443599845432'u64, + excess_blob_gas: 1435200597189175983'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xac5a7347865f503e1578d1b47271c8e60027b5ba24b0da8e7c3733bcdbeda220"), + fee_recipient: ExecutionAddress.fromHex("0x8b7fa656e67f6af2074ec3f16930ad742a69f189"), + state_root: Eth2Digest.fromHex("0xeb50f351f6945df8983cf4037ee264dcb2ceef3313ae452248571811d8a3a8cf"), + receipts_root: Eth2Digest.fromHex("0x860af6010832f64a5234327b653aabbd3898881a7b72ae42e08d4a1519166fba"), + logs_bloom: BloomLogs.fromHex("0x01a18d51076880a1a8ea86cc5dc5fb904ba0a3c285b7dff34ee5dbad9d64721f3849ad9f50b90ad4524eca6b0564f8a1a5827a7b476ea051c33a7c0e18db4cfb27b36476bbb1eacbc029dbc5009e5cea695045cfb34c868163514b784133f0f2998cf12e2caf9c74f69732ed3716396dc34d86725428aff48bf6b935ae88f5e4820b9a325bc670cf560dcb479723213a3156a9d7d0e7de0dc791d0eb94a691013624b8aa982ca3c9d5b49fcac8fafbb403c9fbceee5373f0fb2b77ff1bae8160fe2a47b01d792b088eb3fe24c53b5c6a8b4a3b59060d587ca7376f8baba58d57cf745b2a346f800a54d08545194e067ae260c73369a016b12d0fbc20abc78ba3"), + prev_randao: Eth2Digest.fromHex("0x330b7093023f617d2cb5f76cee4b078af002b68d81e3a5b5c9d37c4411871a95"), + block_number: 18446744073709551615'u64, + gas_limit: 13979513761871276914'u64, + gas_used: 6199089254852634745'u64, + timestamp: 7404562418233177323'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[220'u8, 149'u8, 177'u8, 36'u8, 228'u8, 88'u8, 47'u8, 149'u8, 211'u8, 213'u8, 170'u8, 40'u8, 207'u8, 145'u8, 137'u8, 64'u8, 153'u8, 22'u8]), + base_fee_per_gas: UInt256.fromHex("0xfc82d0e46d05b21aedab6f368183611d2885b28c52842f28f621ef6c631b6e6a"), + block_hash: Eth2Digest.fromHex("0xa8c6b2dcc2496f0230e796f8a69642126955ae6209a0d0c2dee2c925212f447e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[138'u8, 17'u8, 34'u8, 168'u8, 105'u8, 179'u8, 196'u8, 21'u8, 253'u8, 242'u8, 106'u8, 30'u8, 40'u8, 190'u8, 179'u8, 93'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 1'u64, validator_index: 239183'u64, address: ExecutionAddress.fromHex("0x75efb2a04b5f25ae56ff7256ee9f4fdc4e25baf3"), amount: 402148'u64.Gwei), + ]), + blob_gas_used: 723464856451065691'u64, + excess_blob_gas: 11231138371511965912'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xd3be9b45bfe67229afb47461ca2970505586cab8eb8e00f280ceb07a9d47866f"), + fee_recipient: ExecutionAddress.fromHex("0xde645d4a77f0a386a45c52357948e1d7eac5e780"), + state_root: Eth2Digest.fromHex("0x69b70e0188e7b88e38df90853b2dfd2e4c7181e83d82d77ab81c57d161216b92"), + receipts_root: Eth2Digest.fromHex("0xc01d94a01736268170a16196927029d4d8d7c65970ec78ece94c87304bed4568"), + logs_bloom: BloomLogs.fromHex("0x7f1ac5c77e3f0c8a1a103ee83dd7d0fd6fb13895aa1141de330445474b3216e2646c15c1cbf4ab4feb1e4e21c2e6970f4a6648675508b08111e00b62866b0f6cccd58afea87d2cd0a24c0384fa179dc33ae6d0db8c1b118a75fb442682b7cbecc2808fe8c812c3720ca54f6723a395fff5dd1720f41822c91b080503bbfeef21eea192d5b7c4160344996d017ab849fa97e862206caac8f8bfeba41865514b21a8d8fa9ce3dcc0daf5bf86fd2f07d222fc7a9d11fb4031b2cd72544d7f89eb95203a570bc179f9ba1f73f39d74049fe22b63939ea49d5d40f42c00c5f1bd429e84ade377475e432186acd9975914670052fea64453fca87317f62e29b550e88f"), + prev_randao: Eth2Digest.fromHex("0xce47da2b2a68186b78054be0894ccc9ae7213c18b9093c0ebc1b9ed011071a39"), + block_number: 9014833350824993703'u64, + gas_limit: 18446744073709551615'u64, + gas_used: 7874274181221487360'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[139'u8]), + base_fee_per_gas: UInt256.fromHex("0x1eb821a0ee3f9d2e5b49c64177db9ffc96ec6b06249cefa8c51d0ce7e664a3ae"), + block_hash: Eth2Digest.fromHex("0x99479be6429eac4a945ca8171d3d3ce42d7b5af298292e833e20462438e06229"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[99'u8, 198'u8, 91'u8, 86'u8, 23'u8, 222'u8, 121'u8, 250'u8, 12'u8, 135'u8, 133'u8, 37'u8, 61'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[81'u8, 173'u8, 241'u8, 145'u8, 54'u8, 3'u8, 36'u8, 121'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), + blob_gas_used: 1936360613980595982'u64, + excess_blob_gas: 525438497879148955'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x06504beb0dc3bae44ef75678d29ec5138d87da68d307ca7d43e259cede60fda6"), + fee_recipient: ExecutionAddress.fromHex("0x527ce602a0be18c0944dc27b2864c711a91f89a6"), + state_root: Eth2Digest.fromHex("0xad3bbef5d22bdc2429da09eb85137c881f85fe6e6b3ea207e5eaeb399c755055"), + receipts_root: Eth2Digest.fromHex("0xf94fdc52cde20532cfdee73e9cebb61d9f7160191345f9caf58b45501d8effbc"), + logs_bloom: BloomLogs.fromHex("0x0999cc50752006a2bc8e5485c239b9a41be6ea2fd8f0392884246ef7d33bccdf4bd326fadae385e3ecc309bf0f367ac1791767ffaee90ddfa7bee22d19f417708fded2b2b6b3be2b6007745fb1de940e7849761586953c04e3bec3c9b6342d1b91dd024980f469b484bd0befc4941a3846d027390d6256e4acf9933e0891dd558270eb35d3455f4e49c890479e970a8008b75ff4d33b4f7e5a8c19e75d8abd8673ebb859a8a24907584d88f0d68b3142b3c6952695fdd84581f5a070601a575a8e7bfa0bf7cf0fe9d70a051005f9dc594d09909e9d079d02a4e441e5b3f33388de8d46cbdcdf24f835415680e569f2ed29acdc01042a6a7ee701e4e6cace5c28"), + prev_randao: Eth2Digest.fromHex("0x7cef96d72498facdb399dfb5b6d7d69185f3edc70715540fdc7ef651c4685c6a"), + block_number: 13066898984921201592'u64, + gas_limit: 9241830338892723842'u64, + gas_used: 8347984358275749670'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[11'u8, 46'u8, 127'u8, 104'u8, 141'u8, 79'u8, 55'u8, 48'u8, 242'u8, 12'u8, 142'u8, 2'u8]), + base_fee_per_gas: UInt256.fromHex("0x6241db2a44a58a2c1aac93c4aa18aed5add30d1937c31078542bb544bf9ba2df"), + block_hash: Eth2Digest.fromHex("0xdc1756667e7c3f1615650cbbaae1117a6bac817c6579cf3f7afbc93277eb3ea1"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[13'u8, 24'u8, 248'u8, 26'u8, 141'u8, 177'u8, 236'u8, 2'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[213'u8, 208'u8, 242'u8, 46'u8, 0'u8, 31'u8, 219'u8, 213'u8, 197'u8, 218'u8, 148'u8, 236'u8, 43'u8, 152'u8, 123'u8, 96'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 163'u8, 60'u8, 195'u8, 40'u8, 68'u8, 185'u8, 20'u8, 244'u8, 82'u8, 34'u8, 181'u8, 26'u8, 201'u8, 2'u8, 108'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 15531362396155364476'u64, address: ExecutionAddress.fromHex("0x063b2e1de01c4dad4402641553c7c60ea990ab30"), amount: 106054'u64.Gwei), + ]), + blob_gas_used: 0, + excess_blob_gas: 11830672376638423068'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xb5d4a5eae3a1ea004ed573b0b8f8a22c847616758c0faf1e7e9589f16e55415c"), + fee_recipient: ExecutionAddress.fromHex("0xf7ac0877fd8bcadde1e050f6c7ddad13688ec071"), + state_root: Eth2Digest.fromHex("0x7472f824376a723894f8d539743c7f93b69839772f28cf6a83e2102fde99c3c9"), + receipts_root: Eth2Digest.fromHex("0x750365b5d975460a64f07758abd0cdd44cee23cc2d4f06f2a047cf4c12c23db4"), + logs_bloom: BloomLogs.fromHex("0xe24d8452039bddd10e1252c1ebf9b9e81a22577f940e8708d200548717e8471e130a7066adc48785a8dea1dca05953d6be16504a57112c065e7909586cd611af9e0b840b81caf0532dbb2833ee5ac6a6eb7b6c990cba6ccf6f4ddec5a7c76f8296bd2a693cbbb43b1d86b66f6aa58888734d3fb21cf5e96f1b981f8ae2737bce1cad1cc458650291cf7a3d22c61fde6af3a07a44bf1b334b2c5dabbef16e5e73db75e87f04670cb3830f0a7badc702e7dd37a59ce02992f4473a909e57dee1fdd22cfc886f4fcb6ea205ec9234a8ec85ea134242748f9f10062534fd0528bc1b5b1e89511cdf91a1e7fb4f8c58c93d2a6c75e48a2d48235cb7de13040db8dc9c"), + prev_randao: Eth2Digest.fromHex("0x2410823a37c763e13b03a4c48e32f9e43b8440ca31ecfe8e0543a20a02c496c5"), + block_number: 14920119354157670036'u64, + gas_limit: 17193947846593799248'u64, + gas_used: 2176791850599260430'u64, + timestamp: 12670133468877091192'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[31'u8, 7'u8, 1'u8, 212'u8, 152'u8, 82'u8, 167'u8, 57'u8, 116'u8, 147'u8, 97'u8, 109'u8, 219'u8, 207'u8, 151'u8, 116'u8, 43'u8, 218'u8, 91'u8, 253'u8, 14'u8, 182'u8, 102'u8, 57'u8, 153'u8, 72'u8, 172'u8, 208'u8, 0'u8, 64'u8, 97'u8]), + base_fee_per_gas: UInt256.fromHex("0xf1daaa067663bf3277b9149aab162f4e330f988f0be8f83a556743a57ae5c8fd"), + block_hash: Eth2Digest.fromHex("0x5d462b4b243c6292b6a3b32f4e05849c0613d0a61954734c524f75f8df66cf8d"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5416630176463173042'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xd7b1d18e4eb7b5041b4b08bae2ce8e22982d6e6c"), amount: 911474'u64.Gwei), + ]), + blob_gas_used: 17909098553568904023'u64, + excess_blob_gas: 2561776469828429184'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x2629683cfc70198038837270bde3c60176c2a4aeeced0d4a4f14dc99a380c377"), + fee_recipient: ExecutionAddress.fromHex("0xd234af1937861b66ca84c334824763fb54347677"), + state_root: Eth2Digest.fromHex("0xf79f02d52d7f2a4be99eebba3dfb3bce74136ea739da515703d095a66ce203d5"), + receipts_root: Eth2Digest.fromHex("0xa97ae6fa5d6937f7754ff96766a54bb8ec082b046814e74f6c9c67147795f526"), + logs_bloom: BloomLogs.fromHex("0x5d2ef8bc2f58a84e4050e3a38985e4c267940707c8da3f687fefb9e22e4ae11a2f79a24456af3758e8b521d546dc178da5c85da869ebb2da551976488a769ca2940fa20853e4e1d1fcf8d5bbea0d16973c827d38c97c47c57835677590567829d119e8108f2ee3fa988b267ccfc3e58e5f81c18c775a9baf06d4d81aee405c5683fa4e5e891b58101a27e8f71c60d357a4ab8bd02e12fbbb0e363c4632b0a3c0de638de37448c9476c65a62f7f1dd9643fac6ff78ee431d18ab554b4c8a1984fb5fa0de3464d223f236eb8e8a8f59601221d2ab480ffcefaf4bf6471b40a14773ac0cdb43aea505941e4b0fa6fb26eb091adad77acce41e516fc743e5fdb045f"), + prev_randao: Eth2Digest.fromHex("0xbe44d7c5f844a2acb307a4371784d7742be482aece83368d94813ffa1c7bb60f"), + block_number: 13524449277995212660'u64, + gas_limit: 1, + gas_used: 7976957374052242924'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[57'u8]), + base_fee_per_gas: UInt256.fromHex("0x6c98d9ff36f1032fd55d8a6038d7b1f7c4e5f7c884b73f626fe43e687beeb46d"), + block_hash: Eth2Digest.fromHex("0x2c95101857b07bdda0502741da8cd9160ec0474929d132e9159098576f9a7c35"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[75'u8, 85'u8, 130'u8, 87'u8, 90'u8, 172'u8, 176'u8, 44'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[207'u8, 150'u8, 64'u8, 87'u8, 15'u8, 18'u8, 3'u8, 236'u8, 232'u8, 87'u8, 174'u8, 192'u8, 29'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[23'u8, 37'u8, 57'u8, 158'u8, 137'u8, 222'u8, 53'u8, 111'u8, 63'u8, 13'u8, 69'u8, 110'u8, 175'u8, 108'u8, 16'u8, 207'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 1071093368516669975'u64, validator_index: 15999188653672167093'u64, address: ExecutionAddress.fromHex("0x368b0ae1a6bfc3312460f212017e8bb32aae55bf"), amount: 13132185675616884508'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 1251419977457119333'u64, address: ExecutionAddress.fromHex("0x0a4d18e47c5ec0c639ff29d8f8c9be0b60f00452"), amount: 1'u64.Gwei), + capella.Withdrawal(index: 2046299652899032730'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x44bfe00f98603a5e8363030de4202ba50c7e8138"), amount: 15403504672180847702'u64.Gwei), + ]), + blob_gas_used: 819823383278806839'u64, + excess_blob_gas: 5121347703897393436'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x190544155dd98bf86d3ed5ee94d01afd3a8e67b8476f94d90604706da0a7d340"), + fee_recipient: ExecutionAddress.fromHex("0x799d176d73d5d6d54d66941ad6cef8208677371c"), + state_root: Eth2Digest.fromHex("0x07e626b9c44b0ff14586d17acf79cb136ccc5d37fd7135da33cec516af168f43"), + receipts_root: Eth2Digest.fromHex("0xb8b100bc5c155fe6358b9a16756ec06880365f5fe89124cf9fea963e26d3770f"), + logs_bloom: BloomLogs.fromHex("0xc314d3d6ab41a3fce7433dc286ee5c9820d883ff572ee7dfd2f4ee745f11a71f6dbe142d8c14bd6cc76782f1bb2b3770e65a929b2187581956bad937907a124c92ba10686763ddc87ba5b4a4e9cf4b9a35255fad5f54b404aeed5ad9859b5f9fd3c137e9eb6ef394a10b8ad3fbba75ba38c2cbfb91fa793ac763e8cd31481fbecef02b3365b990f5120a2970f2779574c60769347ae334a9f39bb3d3ad35182f7dcd252bfe9663c4f54b44dea8d79e3bcd89877231e81a9e9f5c1eaf5da1f56ffc39c23fc3ae6c130281c792a31e7a60115d46abbe17807cd120038631ca7a6636c8c644b57719e386cc8ada32ce806f75110ad143522fb0b240213df4bab07e"), + prev_randao: Eth2Digest.fromHex("0x17e445793c0e354ee43381ded194220ebd87ccbacef83e3da5a1cd3c8c57bf49"), + block_number: 5728529601694960312'u64, + gas_limit: 9410734351409376782'u64, + gas_used: 16470261240710401393'u64, + timestamp: 8811957812590656903'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[95'u8, 124'u8, 151'u8, 79'u8, 76'u8, 171'u8, 74'u8, 213'u8, 207'u8, 202'u8, 63'u8, 2'u8, 182'u8, 32'u8, 115'u8, 65'u8, 90'u8, 186'u8, 34'u8, 63'u8, 241'u8, 191'u8, 88'u8, 10'u8, 197'u8, 52'u8, 33'u8, 98'u8, 78'u8, 210'u8]), + base_fee_per_gas: UInt256.fromHex("0x3c1ba8cf82268c828c1a7f249328741ae21f35a7659365efd7496df94dbb85e9"), + block_hash: Eth2Digest.fromHex("0xc2b2bc39ed0cf5764800d3c91401828ed32d0eea58f9d336c32f9e6f7200ac8d"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 802141'u64, validator_index: 7520769587588158114'u64, address: ExecutionAddress.fromHex("0xce1fcedcc47b22d7e38f76c1cba49c2c20da09eb"), amount: 5845756482608800263'u64.Gwei), + capella.Withdrawal(index: 4169028257817284566'u64, validator_index: 496485'u64, address: ExecutionAddress.fromHex("0xf99805deece4ff418b55557b45060e88035f755a"), amount: 4870783513883486430'u64.Gwei), + capella.Withdrawal(index: 10410265605811982468'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x31e886453fa4e7fcec6ce6094ad22950637d41a1"), amount: 157748'u64.Gwei), + capella.Withdrawal(index: 10622085591419415519'u64, validator_index: 8179967808007927229'u64, address: ExecutionAddress.fromHex("0x03d2493395b71bb181db626a99c24dbc1d07065f"), amount: 18446744073709551615'u64.Gwei), + ]), + blob_gas_used: 14543409578714974146'u64, + excess_blob_gas: 0 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x86d7b430f69b215ab5ae863998ce41f01a5016376c8bec7f5b7a6e16a2326d92"), + fee_recipient: ExecutionAddress.fromHex("0x73068946d757f5d145a38fe9de817b8b1e9d6c43"), + state_root: Eth2Digest.fromHex("0x312b4af4d3ca5960dda2f99531819f5c32624753cc0756c05d242f65dd605d92"), + receipts_root: Eth2Digest.fromHex("0xf3a1e8f784ee4bdb897d1511ce642276e2ecbc1f21bfde9caf7c4479b7fdf902"), + logs_bloom: BloomLogs.fromHex("0x633d228aa8b2b9f4b614c4b7c7aca616232d61bc6e06ca28f4b94bc39165cf3ca2e090cebbe8a5b66b161d92e65099503327f9f2adae6ec5a73463063a994d73f37e12caec8f6d439be7520b48b25ccfa8ff64e6884b7e240c8dfd0100a23f9f644da13f1628d989eef92806c9f936a71f470d710653355acd84fb23ff15910f1d2866d83b036246c46a681e762b9a19e72aab21b428c4710511d0a39cc5ec39ebf3aecb5c19096ab32135a629abc8cdec39b2b3631bf4e86bbfb824276fd728bef454ed981e5f9e8a4bb96b27f09f661c5c221f63a26945174162496496c9bbf38cd894c50fa69df0a8c722ab48d75044bf43468639ae9b61d0b5a2f9d819eb"), + prev_randao: Eth2Digest.fromHex("0x3a0689ac32c82a6b84d3230fdc6e2c1e89671fa3906336ccde9fb7cfd1811ac8"), + block_number: 9465334901279616671'u64, + gas_limit: 17844363972830076325'u64, + gas_used: 9534663249377184661'u64, + timestamp: 15490999633909732541'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[199'u8]), + base_fee_per_gas: UInt256.fromHex("0x9fc9f32819a67c4aebae259b0648e2b82f526ce8eef8fee33961f9fc69653b2b"), + block_hash: Eth2Digest.fromHex("0x1ac3f16da76520977c5e5d86f0c261d76e18413c202e8a46241951b3a80ca601"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[223'u8, 37'u8, 18'u8, 125'u8, 208'u8, 57'u8, 114'u8, 113'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 181'u8, 143'u8, 219'u8, 145'u8, 77'u8, 39'u8, 126'u8, 173'u8, 30'u8, 59'u8, 70'u8, 205'u8, 51'u8, 16'u8, 213'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 0'u64, validator_index: 7432737887980948854'u64, address: ExecutionAddress.fromHex("0x1a99860ddeecae3195a051bc0a0fcc37d0135e37"), amount: 921585'u64.Gwei), + capella.Withdrawal(index: 8891974894683849035'u64, validator_index: 18060634568259374245'u64, address: ExecutionAddress.fromHex("0x53a6cc4c3996f0181cfe62be861900f56cb75a87"), amount: 235145'u64.Gwei), + capella.Withdrawal(index: 11531749110606308043'u64, validator_index: 9858359378531619375'u64, address: ExecutionAddress.fromHex("0x6b7a4bc00868b077f1c4aa53369e893162bcc384"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 530041'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b7853973d34b1efe7722be5c688589b49c1aaa9"), amount: 18446744073709551615'u64.Gwei), + ]), + blob_gas_used: 9156166815001018661'u64, + excess_blob_gas: 13354810927429053716'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xc51bf481df9be981c6656081e3854ffcf27551e2b4fdaed4ab12b355f247f4e1"), + fee_recipient: ExecutionAddress.fromHex("0xd79098c25eed05c9f6d55e95f5f6f58c1472fb28"), + state_root: Eth2Digest.fromHex("0x1a6b1eb78e5ac155d4be247a3b48d8d8d8574a16fa846681553037629b97ffd0"), + receipts_root: Eth2Digest.fromHex("0x5e44d4a3621cd8e495edc0b208f977c8d3f8e79a78fa7ecfc4a0f6e436f67b71"), + logs_bloom: BloomLogs.fromHex("0xe2b0dcfd2341ceb9c4edbc7115dbd6ed5f1c54ca39bee191fdaaa34368acee93f48561094dd23a3985ea2c2b83d918ba9dc671cde7732a591b4f9abd2eacf9d6416ca8c8d556052a98df2cffdbb086315585004c51c76872a06cee7d318f4845c0ade4c907c7933d4d883bcc586885be04ca9149e05b1624856e69e1efe8c93cd55d840bf71279293a118d51d4391fcbf4e6abe6ee50492ff2de085069a3c7656eb3a749d6bf46f56a2acd93a6840eb78e09a42f23fdea69bfbf017f4fd6b4a8d17df1aa5147c1897fe5fda1f5e79121f2fefef97117e7871d1cbf5b0b0350b9fc497c5aba27cbc129d452d6a60effb76e08b890d0bb856115fcfe3966359fda"), + prev_randao: Eth2Digest.fromHex("0xcd6fd69596cdd7df95e0b68e8ade01541b12ed15caa2b59803a4c4e6791870d4"), + block_number: 12264963829660560313'u64, + gas_limit: 11775806146734810959'u64, + gas_used: 1863395589678049593'u64, + timestamp: 5625804670695895441'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[183'u8]), + base_fee_per_gas: UInt256.fromHex("0x1443705192ff4dc1a819be4f22b8dcd6e7802337e62082880b1090f44a27d0e2"), + block_hash: Eth2Digest.fromHex("0x68da52444eb5322f3a0bda6bdc9a3a11a540dbd22026bb2d24862bbc32af9460"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[212'u8, 80'u8, 176'u8, 133'u8, 132'u8, 119'u8, 233'u8, 131'u8, 195'u8, 118'u8, 54'u8, 94'u8, 129'u8, 206'u8, 47'u8, 107'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 31'u8, 192'u8, 94'u8, 136'u8, 120'u8, 228'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[114'u8, 23'u8, 239'u8, 220'u8, 169'u8, 188'u8, 213'u8, 179'u8, 223'u8, 129'u8, 189'u8, 50'u8, 158'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 109465'u64, address: ExecutionAddress.fromHex("0x30376c1737df493e34318acb7efa0aadd3d78738"), amount: 419309'u64.Gwei), + capella.Withdrawal(index: 3744271566165938073'u64, validator_index: 162930'u64, address: ExecutionAddress.fromHex("0x9a3eee4729cf5ef57a1c4aeb474636461991270a"), amount: 9043308530560640624'u64.Gwei), + capella.Withdrawal(index: 10893292846301120513'u64, validator_index: 15952780188276928656'u64, address: ExecutionAddress.fromHex("0xfccc1279aa3dde74ea08b699fecb4481c777f259"), amount: 5614376920521492084'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 2895353066704396409'u64, address: ExecutionAddress.fromHex("0x7e8b34a029236dc0d15db19153165d1eccab05a8"), amount: 3749025806369957542'u64.Gwei), + ]), + blob_gas_used: 0, + excess_blob_gas: 1597862542620394734'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x8b3e7e8d447527b9d00693389928260e7ea9da6855efd99369182bd9c213988a"), + fee_recipient: ExecutionAddress.fromHex("0xb45716c9aeddeb030c0b94202fcb97bd75a039b6"), + state_root: Eth2Digest.fromHex("0x8114b285e5f3277c04a66e660fef3b86295d6ca859dfa216df3309c0a7242f2d"), + receipts_root: Eth2Digest.fromHex("0x2a3ff38541ef83faad176c3c98ceb5c55622dec83fbfc5a19bdb27646849e852"), + logs_bloom: BloomLogs.fromHex("0x384a9b3d38d343af68d00c229e79aa31f2059e17c655f5e48d31d2b59b769660e91c1e5f386e4f7dc83f2570029a6f2b3351623fcb4dadd6b5b7b26e27de19e248ebd970a9678b69403ea8e16fe88562959586fcfdee3c407fcf623c94891a2270ba1829bf2ab77fa32913bb11c8a4a69e9baa6544ad336253637626b16d4a98884e7ac7d6c1e697a9435b1e5403b5122eebddec9c03c8a6c8fed0d8877888371e133fb837d33f073375f7e1536abf622610734b9b0aced8a891f02d5b35734e58b0ead66c49ed9f898b8f27e9415275c5d15051ec00cb006f8aef702a7414aefacfa9742cd3d8d34be817e0c731696e20b973cf2da66799121c0c6d12bc835d"), + prev_randao: Eth2Digest.fromHex("0x3bd54c7151dae2ad524b4df0d4283e3641ba787fc76f54221dba3a2aa556a1bb"), + block_number: 18446744073709551615'u64, + gas_limit: 637978774023867007'u64, + gas_used: 15110835166938431016'u64, + timestamp: 18065456863038184935'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[235'u8, 229'u8, 162'u8, 249'u8, 154'u8, 135'u8]), + base_fee_per_gas: UInt256.fromHex("0xbe93cc3dc2bb7e012db659df49e57653bf6ff21354c64eeb69c0002e9f933035"), + block_hash: Eth2Digest.fromHex("0x46cb3f590b2fbce372e67968a0d2ff4ce1b2c530fcc26b7a24ed6db054f52035"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 66'u8, 215'u8, 40'u8, 223'u8, 195'u8, 43'u8, 228'u8, 225'u8, 244'u8, 34'u8, 14'u8, 117'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[92'u8, 46'u8, 215'u8, 218'u8, 71'u8, 99'u8, 115'u8, 119'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), + blob_gas_used: 1, + excess_blob_gas: 1 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xa4854e346d2e9a921cc6b3c4ce9fc739c99795cf10002924089f9886f8624d59"), + fee_recipient: ExecutionAddress.fromHex("0xa88781cf69a1eed63bcc3a32b6f9aba35d4f5b5e"), + state_root: Eth2Digest.fromHex("0xdc06d9210fd2738b0fa9df6d68e4ffbfef0dd7d7d8093fdbcd97ff845318cf6b"), + receipts_root: Eth2Digest.fromHex("0xfe1b70c143066edc444f9b49e778cf6db0060bd4e9122564350cf23061830439"), + logs_bloom: BloomLogs.fromHex("0x095a57c3f2d97aad8692cd09dfdd8388f1bf9ef98a1c3223ecfd0aed17d8c7c3ef593d7f09ba86500644deaa676df811da501d572f342e3f7ee7b9b081992f344f71fa50b3b9635d7375f67dbd85a0b1ade3d8d4778118df55b90c44f7dd1114f2ebcea5778b32701ef94af9b3713d1fe00275e09c7e918d7c529a37aa9de3464eb6364812ec486464ccbf7df2523369fdeb1b28955e35e8685c16f07fbe342edd1bc044021ed480bf4ceffefb13eaf4550c67ef8a5079f3f612f07fff60193eda6ac11d39f3056c41ea4355ef5ef7f311493c415cc8c42cb30a73dd58098262acebe6d901e4bae26b6e1eba693c7dc596ea27b0cdd4fee2f6450ca8b50b1a70"), + prev_randao: Eth2Digest.fromHex("0xc52844ad11072faa2222ffe9cbff77dcc7f681367d2aef5f1c3b206140064195"), + block_number: 767785029239287422'u64, + gas_limit: 15062566578072747104'u64, + gas_used: 7648884410596067087'u64, + timestamp: 4380084205540210041'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[217'u8, 40'u8, 125'u8, 94'u8, 156'u8, 71'u8, 79'u8, 66'u8, 117'u8, 228'u8, 173'u8, 189'u8, 115'u8, 41'u8, 153'u8, 226'u8, 130'u8, 21'u8, 108'u8, 194'u8, 206'u8, 218'u8, 141'u8]), + base_fee_per_gas: UInt256.fromHex("0x436767990abff9288346859c6b85b8a972421619eab2253483385c8151cb2016"), + block_hash: Eth2Digest.fromHex("0xca4f05c33836d82aee8230ef660016b993bca4aaf9a7b6cad96c2a0193eb026c"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[156'u8, 143'u8, 203'u8, 250'u8, 238'u8, 137'u8, 34'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[64'u8, 44'u8, 165'u8, 9'u8, 1'u8, 211'u8, 27'u8, 108'u8, 166'u8, 61'u8, 119'u8, 11'u8, 222'u8, 85'u8, 48'u8, 185'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[165'u8, 95'u8, 221'u8, 213'u8, 229'u8, 134'u8, 185'u8, 221'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 373208'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1ef66a8127bdbf1302c13af1b2a3fde17f1e421e"), amount: 12972917955689502470'u64.Gwei), + capella.Withdrawal(index: 7007268656739027478'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xca30e17b5a7925b1a5afa06710d6cffb4681d2fb"), amount: 13141021224557402822'u64.Gwei), + capella.Withdrawal(index: 10730268187610256048'u64, validator_index: 7483561449283560970'u64, address: ExecutionAddress.fromHex("0x84e755db228c9399912364a239227c467477e076"), amount: 16091384671148001130'u64.Gwei), + capella.Withdrawal(index: 861292'u64, validator_index: 101133'u64, address: ExecutionAddress.fromHex("0x70e7126e6288dd8559b6bf8946b98fe02bc53e8f"), amount: 5439105246644982514'u64.Gwei), + ]), + blob_gas_used: 2533380168586417970'u64, + excess_blob_gas: 307516487526704997'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x5e7b12465e0461e5dfa59a3254282378c55961b0e411023ce89d968bbdc33e9c"), + fee_recipient: ExecutionAddress.fromHex("0xbd1a1396ab49631cc933770944996b294da97d43"), + state_root: Eth2Digest.fromHex("0x74e6ccfb15da8afb94eebf28cb3ba3f9ce63e3354097f2f2527fe1cf978e76bf"), + receipts_root: Eth2Digest.fromHex("0x8e48bee56e149d1851cff0740ceab06767bd0e819261c5a2f75dbea382a110b6"), + logs_bloom: BloomLogs.fromHex("0x7894fbe58c624a153dbb160c516c9e82bd0cacf5f347f984efcca9450e9a20b50e058ed38e41c331df61114086f8a6b8a049467d7dafd812953aa593b2e9fbc056f0dba80973b2eaae8814b5e0804300eeea15613e59c8d34339f58e1b45599361497a3608c05140cf432e7983a30985aa0faf45dff56dce99eaa5ad3418722df17eaaa4e8df25ed1d9eedee1390e6440c4c37675182dcc07ff199d6dd015d3aa03194765e85fc0d4759d3c693fc2550e50835b88ba41d10fc33b58550d813abaa75bab39c0fbe419f1bde8fb82db9fcfb79894faeed84b2314f115a8fb9e276315ccbfb8e9650571add358f594ff2fb4ab9661afde76081bb2cfbfd2f26d212"), + prev_randao: Eth2Digest.fromHex("0xb9a9bce05e42cf3d2ffc2c2ea95164c9b215fc8e440dd2985ca24cff40e32780"), + block_number: 14460352585391846826'u64, + gas_limit: 2426408612341958329'u64, + gas_used: 13656152006197676019'u64, + timestamp: 6263571560389404595'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[177'u8, 36'u8, 79'u8, 26'u8, 164'u8, 59'u8, 182'u8, 88'u8, 223'u8, 22'u8, 79'u8, 197'u8, 109'u8, 53'u8, 53'u8, 134'u8, 244'u8, 84'u8, 146'u8, 158'u8, 234'u8, 252'u8, 188'u8, 175'u8, 69'u8, 51'u8, 118'u8, 101'u8, 242'u8, 0'u8, 51'u8, 103'u8]), + base_fee_per_gas: UInt256.fromHex("0x997e6c8ffbd1ea95e875612109843c6cdfd0c6bcaffa1e06ba303b3012b3c371"), + block_hash: Eth2Digest.fromHex("0x9a7f83cf6a64e153fc3316244fabd972a49ebf5dfb173d7e611bf3447a175c41"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 103'u8, 164'u8, 112'u8, 136'u8, 91'u8, 170'u8, 241'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 12452742873210027116'u64, validator_index: 163643'u64, address: ExecutionAddress.fromHex("0x5d09dd69d2b2370e11b21d758bc82c2a73ee00d0"), amount: 12246034467900494037'u64.Gwei), + capella.Withdrawal(index: 256915780184525584'u64, validator_index: 364410'u64, address: ExecutionAddress.fromHex("0x40a55ad4a156caf112e2abe789554520814e48a1"), amount: 297315'u64.Gwei), + ]), + blob_gas_used: 3541847679255581458'u64, + excess_blob_gas: 1 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xa8f90a617f1f230506d200c6026bd60e38f599930ed04f90cdc320a6d45bb022"), + fee_recipient: ExecutionAddress.fromHex("0x3531157eaf2c185bd8720f3edfaf76829632f07d"), + state_root: Eth2Digest.fromHex("0xa16f8936e945ecd45a4ae107e46acd8530e438fa1bc8eb85aef62afaca1656da"), + receipts_root: Eth2Digest.fromHex("0x3e76522c8f3b7e8d8a63f4968ab15413b8bbd7af9782c4878b52213b0b3d13f8"), + logs_bloom: BloomLogs.fromHex("0xc13b59de763feaa39debf70d280364ec68eb578af8a90aba7e2cf3a6cee413a28836c674662a0283df8ff04964eb928de97a3883226950b584d773c9b4479d6d5bda6fd71951c0c846752ed688e13dccff947b7a6c81bfac198b6bf785bca7be28bcf9a208b983afe6e766b0536311c1c12b4d01c712cdaa167ecec5520395068b1c1f939d20962de1aba36454cdb36031fa0ba886a8ece71234654e8b081562452046a388ebcf3cfd975493833ff4e146d5e5ddb061d994461ab8b468cf1d6d491d78fd8923f9f6563e3fbfa72639de993701ff6214fd83cd3597e870dec1c1e788a4f01f881c48e57b07c5a217132658208d2221a86c7e9823159984d235b5"), + prev_randao: Eth2Digest.fromHex("0xbac4a9aa16b289584d13abe3c47a58dda713c4b479ee70e1ac7b3b698e8505af"), + block_number: 4839752353493107669'u64, + gas_limit: 4713453319947764960'u64, + gas_used: 3470256075652600568'u64, + timestamp: 13764471837770950237'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[60'u8, 109'u8, 153'u8, 55'u8, 17'u8, 196'u8, 17'u8, 96'u8, 202'u8, 173'u8, 16'u8, 189'u8, 165'u8, 107'u8, 68'u8, 230'u8, 238'u8, 62'u8, 199'u8, 211'u8, 244'u8, 83'u8, 88'u8]), + base_fee_per_gas: UInt256.fromHex("0x3adad83f48e34c6220dce41ecc0b09f9bb1ae4bda4466935c70e7c6cd54e185e"), + block_hash: Eth2Digest.fromHex("0x9183524f908425608c1e3a80d7c4ac2c539903af4b3a2f1b22c3283281706aba"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 645596'u64, validator_index: 248698'u64, address: ExecutionAddress.fromHex("0x124e32ea8d0363647a58a5511b6de35bdd50236e"), amount: 18446744073709551615'u64.Gwei), + ]), + blob_gas_used: 3410596457491766161'u64, + excess_blob_gas: 0 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xc914f63464f3f1588a32d3751900d415bbf1fe002c42068650f5c7c588b1935c"), + fee_recipient: ExecutionAddress.fromHex("0x61523b6add59cc65d3c5b75c6f749fa601e157de"), + state_root: Eth2Digest.fromHex("0xe84ecb995f6c7e753355c8d2e24694441c528b65ef9b1d8c6f4e9d98d409342b"), + receipts_root: Eth2Digest.fromHex("0x887bdafa340c24acb58f36a7e3825ce39fb7e0caaba3a9b63f78d2186cc6994a"), + logs_bloom: BloomLogs.fromHex("0x1fbd358ad7e32eefe4489b6c72bafcf6dbac109970e5c103e329279cede3619faf1309faf266ba155496c19565b31562f31539c98b6256919d8950bb6eca937401d91fa5b3032b4400ce6dd60a8c1c6cc94331b7e78d7a350ebb5d6e04a2594af981f167a89227c7c902dbb8eac3d7b54177d85214a6ef57b50da82b6420cf914fd63171f0b7dff9233bfaa2069774b142a136c5183ed4f57cde2590735b19ef549ff5bc910477b98344e7557ffc440b03d56842f356a6e223fd052c6272e24f43dc9e64055c097d81b56ecfd6087238602a743e09c383ad4eae6ef449570febdfebfefa347f06f480f319ff06365bbfae16b62a950143f9acc3663510356f0c"), + prev_randao: Eth2Digest.fromHex("0xc755584f86084ab2e62bd58f25dfe54538c0171e6447e7e1a51cf05db94377da"), + block_number: 9276126375553452674'u64, + gas_limit: 9007257403963034102'u64, + gas_used: 12806310385580231715'u64, + timestamp: 9957937708118639445'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xe2df33500d1162994934e9fa65fd5db641b0be2b61a6c302c7b9019f86042338"), + block_hash: Eth2Digest.fromHex("0xce58ef51926a6eb4cf2997c4ec771b54907737ae8fe9522fc316c97a1c7ee6d7"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 16986670237072862757'u64, validator_index: 701065'u64, address: ExecutionAddress.fromHex("0x50371592a27339f868b9ef63f6c02e8c1e72ce94"), amount: 3561319411833205205'u64.Gwei), + capella.Withdrawal(index: 2402770018709110103'u64, validator_index: 798632'u64, address: ExecutionAddress.fromHex("0x9d42c6c10cbc0b04e3f2e74f63c777802d4ca064"), amount: 898967'u64.Gwei), + capella.Withdrawal(index: 944680'u64, validator_index: 507423'u64, address: ExecutionAddress.fromHex("0x640d578aeed6b8a9acc83f13343f3139fe8f4a15"), amount: 941781'u64.Gwei), + ]), + blob_gas_used: 15366131400223670470'u64, + excess_blob_gas: 13352270791962864689'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x086322b79160568c7d096747ef351338ddc93f252dab1df3ef65aaf24723d2c3"), + fee_recipient: ExecutionAddress.fromHex("0x03c6998b5a3ff1c98538c2333d279f2b1cc59f7f"), + state_root: Eth2Digest.fromHex("0x446d99a7e9fd2c327fbd445dbfb3b3e3a895cdfa6f208496dd09c0f84f7ac0fd"), + receipts_root: Eth2Digest.fromHex("0xf4c74d5c59c46f1d9f916b32d8a12939cc2a379bae83153137de76415f6e5afe"), + logs_bloom: BloomLogs.fromHex("0x40f87c3729ba599c3e9bb749c48148ee0d5563db71cf0daaad3af95c45622d7b2a64204157a92a93cf0ffbe0052fb79eef83ba8389fe9d9e7646874b0636960e4eee86eeca00ba70f65b2046620264b795852def9beebb671f841e19ce07934b7c2f66301cc3c7dfa2606067cdeb04a564b87e56ff3650c7c6bbbc96b2de5ccf8e314ae74a26347371c315062532a1f1a2fe0c417ed5d12b6f81c3440c0d8b19d0cf8a030be83ee7ada6046d75098b6ee66664ead786a65ef5cdcb33c4634aa07cd7490abc0ea9ce722423a0cba1aecb379552e89483de43dd321cdaa8a005ab7e8e2a958038ca12e2b08709348a7f6daf34c488add1a0a21aed0da0b64251f9"), + prev_randao: Eth2Digest.fromHex("0x2ff08bd0b22bae8c3627f61b8da627fc367b3a60f93dbe48de1ca6f25ada489b"), + block_number: 10605470807350562909'u64, + gas_limit: 587854351728657338'u64, + gas_used: 8799032544585725320'u64, + timestamp: 18028498231539883963'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xfbe348f0c77be2ddbd3ec038e3aad88107625dc6e96b1fb3bbfdba8c737a3d7e"), + block_hash: Eth2Digest.fromHex("0xc545e833aa2ee5d708e041f4dcb44bda654372b3f5f660c683d12230303da729"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[89'u8, 59'u8, 131'u8, 146'u8, 186'u8, 180'u8, 208'u8, 76'u8, 69'u8, 40'u8, 29'u8, 211'u8, 97'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[208'u8, 136'u8, 157'u8, 0'u8, 120'u8, 231'u8, 99'u8, 33'u8, 31'u8, 210'u8, 80'u8, 203'u8, 24'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 225873861246030158'u64, validator_index: 3132710425326779052'u64, address: ExecutionAddress.fromHex("0x4d2573288e7949201c806877449e441801ba62c5"), amount: 9096383177302198854'u64.Gwei), + capella.Withdrawal(index: 2816791477401799195'u64, validator_index: 12199871733060832130'u64, address: ExecutionAddress.fromHex("0xd4e21e668d5e8b1c097cb250dc862bfd7f8a2b76"), amount: 7278220627858832735'u64.Gwei), + capella.Withdrawal(index: 12003547154719720523'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xe888b3288bfaf8f979c93699cbabef6c1f156f19"), amount: 18446744073709551615'u64.Gwei), + ]), + blob_gas_used: 0, + excess_blob_gas: 1233408100755176706'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xcfba7f4aa4ff01d3d9de84dbe1761c79627a10c3188fb0a7c8adfa0d489e6441"), + fee_recipient: ExecutionAddress.fromHex("0x106b3bcaae4ff58dd837768be35c29c48571e4a4"), + state_root: Eth2Digest.fromHex("0xe6242399020361e70cb6b89701001fa8326251e6bae3b4ca1978eded8831d9a7"), + receipts_root: Eth2Digest.fromHex("0x3db0f9a05cc39be94414c3be28378d2b91ba3ff43ea2ea7e4e0a1874a0983f58"), + logs_bloom: BloomLogs.fromHex("0xd591169a3cc38e0837a76c4d7057f94c1ef08ad5af1778b1b06c3a0ec85201bfc659b18c49de831ce6b4a40f0d2800a9cc9001f74810c58473f9b973b720f84626cc9270b0428439b985043f5d9c3289ef8a794f5b8265e10e9fb9fa53a93887d270b8204f8f16cd968e295b0a06aa70e9f6f174733d251f3bfc644a7fb274b0138729f18c0e4382bd4bf0387870f633ed897a125ca854120c2885194f3180af4b62760db96da51f88ae1cd222f49b00fbbc1544eb0e98cea67e36368816f541723158d3691f3cf1509c65a51a8e68efb66c500dd6516ca1b02aeb4e0c13cf5bbead53672fb5a7a1863c8edfaf4eb9a4b4322a39d8643528bccf22493914fa01"), + prev_randao: Eth2Digest.fromHex("0x14fec0a1edb9c82dc9aa7fb7224791c51a3937e74e5da59646123867496460f2"), + block_number: 6272046003849350913'u64, + gas_limit: 15423951135645467684'u64, + gas_used: 3743939155619454195'u64, + timestamp: 8496536260448579184'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[152'u8]), + base_fee_per_gas: UInt256.fromHex("0xd8b104041bdc4c76a9735e2b4b45f0f3612e8962f672aaf511f06a94b48562c8"), + block_hash: Eth2Digest.fromHex("0x8ca67fec04b7e3bc5a01f5bb265b93b4488b58ec2ac7f2c3ced030311de2762e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[152'u8, 232'u8, 136'u8, 228'u8, 253'u8, 248'u8, 85'u8, 92'u8, 103'u8, 38'u8, 106'u8, 166'u8, 148'u8, 8'u8, 37'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[58'u8, 215'u8, 97'u8, 99'u8, 152'u8, 126'u8, 14'u8, 252'u8, 64'u8, 87'u8, 242'u8, 60'u8, 210'u8, 217'u8, 75'u8, 189'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 18405055677765556765'u64, validator_index: 13513833286292305941'u64, address: ExecutionAddress.fromHex("0xfe53af2bf3560b2157a683a545d4f898354f4d55"), amount: 911502'u64.Gwei), + ]), + blob_gas_used: 11215270247452431947'u64, + excess_blob_gas: 0 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x063bc56b731eeeff8bf1c33d88523a04a14fa0c745eb3c750139842d88244982"), + fee_recipient: ExecutionAddress.fromHex("0x415b1cd5b42709a3724ab2f6f50a6dab7399d7ca"), + state_root: Eth2Digest.fromHex("0xf261abf37066b8dc5c868946346c98aae445adbb48e6dd05969fbb49267a276e"), + receipts_root: Eth2Digest.fromHex("0x5a337b7ee29d98e22b461f43b7a87e52d89fda2e7a3487ea92873be04a49ea68"), + logs_bloom: BloomLogs.fromHex("0x01817fd642526acdd8b57b4fc2fb58aba269095ce220ae5770004055f550918778021eae3abeffff1b3fa9fba50ff8d532fd8e2e67da7bdcca1cf9505179f19f595f5d9f09b98d5bc7d1ecb22527255e8e161ca2124c5fedbb59527f91a242671177e33a6fa377d585ebdbd6d9ff2bf80bec3695657441e35da43861f14b9a7e65ed475c323ece62d84aed7262cf3fd2b06ba03695e2e26e5e58fc5b8b99d519fda879587e3764930e3921aa15b2ee8691ea0e738030acb8832ca353d3bb63fbc0150c532b842cd053abeae8238c9ffe6f4b2b7210dc862c48843ae2a9088ecdb8c258592a0feb5215b8c9ad494ad896379d86e0ac89e6cd8765003ac5c95cce"), + prev_randao: Eth2Digest.fromHex("0xb28f434f3f40e40693b0c1726a018e2b3bc13c41608a2ca71aa5c8bf61829287"), + block_number: 14597257287993827247'u64, + gas_limit: 9090926713872599867'u64, + gas_used: 17391976671717618186'u64, + timestamp: 13439825139187707720'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[73'u8, 163'u8, 138'u8, 201'u8, 62'u8, 1'u8, 37'u8, 90'u8, 157'u8]), + base_fee_per_gas: UInt256.fromHex("0x8a42339ef76757729ef6c4536b3b59255b18d7085d8ba786275b2076fc55b3c6"), + block_hash: Eth2Digest.fromHex("0xb3f6ec11b285a105833f5b68b67e8e23c85c28df2362a13a76db705f110fce8c"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5477557954669138518'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b840b26a19377c64b870be600aa336a40ae46ed"), amount: 42381'u64.Gwei), + capella.Withdrawal(index: 0'u64, validator_index: 1'u64, address: ExecutionAddress.fromHex("0x3d22a723824a2944ea9accc8653002bf7d61a10a"), amount: 2799163561369818755'u64.Gwei), + ]), + blob_gas_used: 69111814634726666'u64, + excess_blob_gas: 10785611890433610477'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xb31c41d39ef7e9a9b905cc93d82264415024d7daef48d886f1b3bc0fd6545edb"), + fee_recipient: ExecutionAddress.fromHex("0x5ad4b6c0d6b986e775f3a9ae2be73a330ba9f87c"), + state_root: Eth2Digest.fromHex("0x01dbc857a3d8994cf10cd1be3b2018be0e26ba54a5456e10a6e5729328a0b5f5"), + receipts_root: Eth2Digest.fromHex("0xa51e9cb9893bd7d73a8fd4e5267d80ddcb29d998814cfa9980dbae50ef101aff"), + logs_bloom: BloomLogs.fromHex("0xf1280db0ef6bb796e70dfef3b0bafa62690ef1e8f14a237856bae5dbe29dfd43ac789c53305ab5b0b7cc48ed53d1236ab9433a5352dac55b6e0a3ff90e9e815e2ce16fe5574c87f0066090c39b811996e2974da0bdb8bb59eb044bbb6bc2d7f8241093c7143a7c9892be85ea4284258ea2477f6a677d424efb6469724d641bbdc3f9254529b6af5cc5f5a77dad49c1a59ae37c19ffc69f6e331139b6ebac306ea09460dc0fc5791ef2cfb9e7bf29d662872e30b94384be90416df03bef5cf5a2339af4745f2f620fd1320d3fb79848692719cb8956b8efd427c9c0cc3ea6efb8f84feae0075ed10ec5c6243074e6004849712d8d1dd97ebb2948fcdf1d020c6e"), + prev_randao: Eth2Digest.fromHex("0xc8a27f0b7850de04e3d794b9e9d4f144c356f864401c3f802927faf4b88b47ac"), + block_number: 10821099926525463598'u64, + gas_limit: 7115919978619568727'u64, + gas_used: 1, + timestamp: 5900615379943209755'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[56'u8, 176'u8, 67'u8, 30'u8, 11'u8, 27'u8, 136'u8, 121'u8, 86'u8, 17'u8, 4'u8, 121'u8, 11'u8, 222'u8, 158'u8, 78'u8, 56'u8, 66'u8, 243'u8]), + base_fee_per_gas: UInt256.fromHex("0xfbaacdba879288838ff725df19b7a31148ec5a24e7989441544d6dec1c980034"), + block_hash: Eth2Digest.fromHex("0x04616c0808df7a1bc177bc48cb6ed865125fbbac2fa3e3c36f33a5f1c48a23fd"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 143666'u64, validator_index: 849676'u64, address: ExecutionAddress.fromHex("0xbf06178f996afec7c9d3cb488e812f32aafe4242"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 560588584813483246'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1a1b89bf52af0d4a8eff759986ffd93cf4464114"), amount: 13046900622089392610'u64.Gwei), + ]), + blob_gas_used: 1, + excess_blob_gas: 10155937412879977460'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xf6cba3ced37c08da230babbf9d1e360661e5a21ac235fefa75cbe756f15809de"), + fee_recipient: ExecutionAddress.fromHex("0x0c080349793b7f43fb3ee9101889e7d32e02c01d"), + state_root: Eth2Digest.fromHex("0x6a33580fc482e9783d66bee9276f42b74a2cbc2b7434fc408a6ba9df77db0ceb"), + receipts_root: Eth2Digest.fromHex("0xd896daff74ffd6ffcc088adba01aea52af82d861b7ff649265a750e5995dcf31"), + logs_bloom: BloomLogs.fromHex("0xec00c3385b735b6a4088ed066bdb088e7826a2830fd13a1a1525c4590eb08baeba81bb511bbf2db2c0547c69c10b5c6c1bf5c8e5a7931584e6ed8ed7357431e1e2391fc0e61a060baf8984a6fd5c04c68fe0f28f94281d0db663b1b2fdaad9b51d3a12bb9fba255c923dea5ce45dd68ec2c5afc9fd13a0e24d234a3c8c5f255e7d62d48a8e01fb5c1eaf0c7a68a616ac935416fe3332943d78eb28a48a180e2bee26e85d786583ae0609a8b98e1045738f054aa12bef97593cd16d8d795314bfff33c51b397afa2299a4a64244817e5a07cdcd75eb4c4c06e8e943d8d1db8e65f17368ab6175c3e14daad0b99fd0f1050feebadf9db8fe8f1c19ed867f4df676"), + prev_randao: Eth2Digest.fromHex("0xdcd37bc148c25afa7e320009ce19567108745ef5ed57781f55df1d73b707e26e"), + block_number: 13754339262807377549'u64, + gas_limit: 5250261236890759949'u64, + gas_used: 1335844244115849195'u64, + timestamp: 16758901654456753273'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[28'u8, 8'u8, 171'u8, 122'u8, 126'u8, 38'u8, 142'u8, 246'u8, 162'u8, 197'u8, 241'u8, 216'u8, 158'u8, 184'u8, 73'u8, 191'u8, 208'u8, 5'u8, 79'u8, 231'u8, 254'u8, 55'u8, 126'u8, 97'u8, 184'u8, 78'u8, 36'u8, 80'u8, 160'u8, 124'u8, 188'u8, 176'u8]), + base_fee_per_gas: UInt256.fromHex("0x0ea1185e0ac50d1e2cc0be7229c846528380def25f7d8860cf366e6edd793be0"), + block_hash: Eth2Digest.fromHex("0xb471874aa6e8987deee40902d59537fed8af3e9b6ae2f8b476ddb051629b3b09"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 215'u8, 225'u8, 83'u8, 163'u8, 187'u8, 111'u8, 141'u8, 246'u8, 57'u8, 238'u8, 163'u8, 25'u8, 91'u8, 114'u8, 111'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[93'u8, 42'u8, 101'u8, 80'u8, 160'u8, 252'u8, 158'u8, 121'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[164'u8, 98'u8, 105'u8, 179'u8, 25'u8, 33'u8, 130'u8, 239'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5378768050415100863'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0x3d84c03e4c18979ee8288bd58b24989580f0a590"), amount: 815393520574223128'u64.Gwei), + capella.Withdrawal(index: 17328504288784263137'u64, validator_index: 305278'u64, address: ExecutionAddress.fromHex("0xa00491dfbee05f23fc7ddcfcb1b27b2855334e81"), amount: 7734460020873819187'u64.Gwei), + capella.Withdrawal(index: 0'u64, validator_index: 444647'u64, address: ExecutionAddress.fromHex("0x0689ed39160f4b4c20138f300b3b2502e6d6ab5a"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 834083'u64, validator_index: 10715076713456342424'u64, address: ExecutionAddress.fromHex("0x07ee24f650e7254d10d61b832db7174128bf22b4"), amount: 17794546242151296198'u64.Gwei), + ]), + blob_gas_used: 7080212387270627767'u64, + excess_blob_gas: 17322910515629142083'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x62ce6a6d68578309c4730f96f98a809d4b4225fc3d37a285daf26288b10f9590"), + fee_recipient: ExecutionAddress.fromHex("0x8c892b06f1e9c877c310b6eccefb20fcf5e00227"), + state_root: Eth2Digest.fromHex("0x578f93b83206e3239c69f51cc8e59cd89087260cda9f0efc892aa2ffb2bf386e"), + receipts_root: Eth2Digest.fromHex("0xa4ac657af8e0dad66ec74f4f66b246fe0089485e2810071fa556c09ea585059f"), + logs_bloom: BloomLogs.fromHex("0x18d67e640f9ad3a24deb7e3f8cbe0ba8224cf9cb9e67b2fd6c774fac7aa3f4adca2befe8322962cf000cb89c3e352433cf1aade51ceac9fe69966a8a89f7985030a301eb690e7eb20b5ac3b315930ee5397b6d65b03a1131b94e7f3505ef030877e460e9195b742e943716d9875a3e2e9998236d3565d622216af1721b658a12fe7d82a62619b4f2d042f146305ff1ad1bf394437340735eac9e962b3fe67597793d1151ec87fcb5f0056837c5813c75c4a0f94d91da71299b3780f250ee31eb9f106e3c443f0ba05213da05177238909fd9e60de9484e091b91dead82debc020929d1f14e79b610af3d15bf9c3757e62bb32a69523c1bd576e5c5d4bc2ef0a6"), + prev_randao: Eth2Digest.fromHex("0x552627eb969604e7d4ed1e631b74b2410dea7f4dbd49511bda390e3b9da8bf60"), + block_number: 7763671958353664038'u64, + gas_limit: 3930616259240751958'u64, + gas_used: 7960068863134244743'u64, + timestamp: 18446744073709551615'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[227'u8, 111'u8, 127'u8, 243'u8, 191'u8, 237'u8, 88'u8, 146'u8, 146'u8, 236'u8, 162'u8, 237'u8, 164'u8, 177'u8, 249'u8, 52'u8, 1'u8, 26'u8, 187'u8, 208'u8, 244'u8, 234'u8, 113'u8, 199'u8, 30'u8, 209'u8, 197'u8, 63'u8, 126'u8, 104'u8, 143'u8, 30'u8]), + base_fee_per_gas: UInt256.fromHex("0x6bcd9684e1bc8f4fc5d089e0bf5fed35a8bf3039808d030bb9eb1ff7147180b5"), + block_hash: Eth2Digest.fromHex("0x9e2505de9f245873565b553e7215abff698bdfcee1dbd93e40eb295dd84e7f45"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[140'u8, 134'u8, 173'u8, 70'u8, 168'u8, 181'u8, 221'u8, 210'u8, 25'u8, 142'u8, 168'u8, 139'u8, 77'u8, 134'u8, 203'u8, 219'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 0'u64, validator_index: 780337'u64, address: ExecutionAddress.fromHex("0xf0ab5949e96d8befa8090fe5612d9c45beea0c8f"), amount: 2246589958612652012'u64.Gwei), + ]), + blob_gas_used: 0, + excess_blob_gas: 9638659159857567769'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x4f8251c361a23171de8648d1e96c91fea2cc5a691dcd884e3a957dc8f6a8802a"), + fee_recipient: ExecutionAddress.fromHex("0x7da9175abaf6e4e400e0ee516fd3ab07dd659f2a"), + state_root: Eth2Digest.fromHex("0x1bd3a5da4c266dd396b8209288e68be066176ebe64cd4c17c4c6cdccaf03577e"), + receipts_root: Eth2Digest.fromHex("0x16133c4fe31f0487e700514160acf9257458a6ee716be8043cb6c532f84ef614"), + logs_bloom: BloomLogs.fromHex("0x5ca3807e674d69536b33337d798deaeb9fa6c7cbab7aef1473e6a6614f6f2c74ef85ee3632612b9c1e78d2a63e0b2f58d48d71e8d62e38510bc2f307680497cb965153b43392b8aa2dcd91a766356eab3ff1b4a6c4b037d61df1a8a4c6d3fa0e3c57a299a1c0a7382052ac25c412f2d2356c302e326fa0cfb570354e31e2f8046b80e2690ba69ec7c284c2df8ad23d16764cbc0ba28516f3c31aa89da3e3286106dcecc835b3007a17f33c4962efc3c9b0f5bff14c783e414ba60d35b79ab33ccd0151c34a94efc461d0df0a994085373f33275a4cd6839603632409b670072a4554f1c9342c03cd403a6feb67b23d3a075707ca89b77bad64e24a6ab79446ad"), + prev_randao: Eth2Digest.fromHex("0x6353ec5b94b9112f25e66de48b532ff5610c63f34c50a02fdf64af6c9d0ef2f4"), + block_number: 16866969889068542818'u64, + gas_limit: 5116920640663397560'u64, + gas_used: 13292402101416991817'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[136'u8, 133'u8, 189'u8, 60'u8, 229'u8, 217'u8, 70'u8, 145'u8, 136'u8, 97'u8, 175'u8, 23'u8, 183'u8, 73'u8]), + base_fee_per_gas: UInt256.fromHex("0xe1307a28a2868b4d934aefdde7bbd09b0644b5c422d2c680770775cb44623512"), + block_hash: Eth2Digest.fromHex("0x11e23850b143b8b4dd8394ee1f2cebf073068502d04dde00000925cf23ff55cc"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), + blob_gas_used: 4954178403284176013'u64, + excess_blob_gas: 1 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x0c67b44b492590ffb9e6d2a63c84714821be7526ce1c337c06276e33a62b7b93"), + fee_recipient: ExecutionAddress.fromHex("0x1d16dbe66ead2ba8afb8594acaf8d536be08dac3"), + state_root: Eth2Digest.fromHex("0xeeb40e334aff8512435b5908a8dd3c06993cadca8bc44e9a6c28c6003162c6a9"), + receipts_root: Eth2Digest.fromHex("0xefa5b7de19da2333bfb7bfa814a306f904fef2ff4f8b1154314649a56fea3c8d"), + logs_bloom: BloomLogs.fromHex("0x4ebbaff6a56343a6bc0170aca2e2ba303f3e3f972c88539ef84e402740e3c9e21c6951d461baf56eec14c06ca0e95f4921079d0d82e9dd46e73f3fa76417246217ff9c5425f19b0f8b2a735ee522c1bc377a2b079099430d0f9316164f5930456245534bbe138d0a19ee58bb13a0d724723a6fa50e39b8a7ad5804f92ab43c24782e27dbb32789408cdd716af9a0b0cb1e2f3aee0bcb5aa4088c0cf1528fad466f3d71d906649becf25f405f619dead731e0831efb522b5faee7a39ca28128effc79977816d50ae23745ab96b80dc7f548aa5d43b0d5c331fdc1ce080a4d63e19942ecb4df8f56397b2ef67d017f2d2de9296e1fd8036ed8592f5a89553c4642"), + prev_randao: Eth2Digest.fromHex("0x5d3c3ac25330e1cd3a516003315ed24bd2dc6cd31d389639cce4b6ae4a3ac8cf"), + block_number: 10891095348111649307'u64, + gas_limit: 13670668340379820434'u64, + gas_used: 1482104080767186829'u64, + timestamp: 6602476120092784163'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[223'u8, 228'u8, 253'u8, 3'u8, 38'u8, 218'u8, 253'u8, 87'u8, 206'u8, 243'u8, 168'u8, 113'u8]), + base_fee_per_gas: UInt256.fromHex("0x972a01f27d586035ce5fb233118e52652ebbf89f6d39558a41b27c8840c849b1"), + block_hash: Eth2Digest.fromHex("0x9280fa96a569e7c25b2dfc12a141d3edd24acf2fbfa19ee72e5a1fd5dba25a11"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[116'u8, 179'u8, 195'u8, 80'u8, 193'u8, 73'u8, 187'u8, 64'u8, 41'u8, 251'u8, 55'u8, 90'u8, 161'u8, 30'u8, 221'u8, 210'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 820354'u64, validator_index: 626992'u64, address: ExecutionAddress.fromHex("0x4abb3f9a694bf6b27be97e24290ca6826b23c5d0"), amount: 100271'u64.Gwei), + ]), + blob_gas_used: 0, + excess_blob_gas: 4396492484488695305'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x7a9d6ab34c0314959d5bdceb0bd80f142e59e5e2addedcd178612303897e7a8a"), + fee_recipient: ExecutionAddress.fromHex("0x3425bc529b4791f5fdb7dd365501199b2f81e578"), + state_root: Eth2Digest.fromHex("0x4eb1a9a3c4b9392325a14f3f8efbc0b3cc3bfc2d7e9992377abd84af6c556db5"), + receipts_root: Eth2Digest.fromHex("0x094e9114d3487925f6818140978e4db64d8306083a8e5c987657e21c3a1995bd"), + logs_bloom: BloomLogs.fromHex("0x0815701b4689d0bb7f80fb1485ad3255a66b890725a1d2d66b4fc66678e2d08784c21ef583401493d5dda1549eda32303b7d102edc72b9fe1d696ab459294a88db0d7263abdf982ddf59ce008b8ac734565de79c269dfc18a36709ca91a3cd50516725e9fa9d98302fa0322254382aab0cdf1f95f2397579f7219bd7ab096ef1f00d7b1131b0055bff65ae9954cb22959adbc40983840ae3b85358fd205bdf6ac6bcf723047ffc53a094a06c2039935b6ef579efc618bf4127a6e4e531f6d97c17789be639691ef87fa5540cf732a184a0e09d5c60866ecd0be0a04bc94317712c395d84c2cec90f43f4807048bf1a93e3e6520a1a7c59092e2e391abf9d2e68"), + prev_randao: Eth2Digest.fromHex("0x349eec90244f3d812002732cd833952969b27a463def04291051137344c89c41"), + block_number: 5715688900321967041'u64, + gas_limit: 17172684770312311722'u64, + gas_used: 9286597649062725614'u64, + timestamp: 195835912833125491'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[34'u8, 35'u8, 209'u8, 45'u8, 117'u8]), + base_fee_per_gas: UInt256.fromHex("0x7b5b4e48b3daadecb9724a74d426a86ffb5c5f8abd43469b4e3fe2a728b5a645"), + block_hash: Eth2Digest.fromHex("0xc71c294b5562af30b9e2b03e76cec0cc6d8b50694219404aaed2ace8f756a22e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[178'u8, 142'u8, 115'u8, 217'u8, 56'u8, 74'u8, 150'u8, 16'u8, 244'u8, 148'u8, 19'u8, 33'u8, 89'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[195'u8, 248'u8, 42'u8, 129'u8, 151'u8, 119'u8, 232'u8, 235'u8, 245'u8, 240'u8, 113'u8, 157'u8, 235'u8, 158'u8, 160'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 27'u8, 72'u8, 107'u8, 18'u8, 210'u8, 127'u8, 78'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5186085670428433087'u64, validator_index: 156817'u64, address: ExecutionAddress.fromHex("0xf8d93a548c4b243e66f4f73b29da342a0fab04de"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 9475052657186699106'u64, validator_index: 759532'u64, address: ExecutionAddress.fromHex("0x97559fac3168c6ee81b0f0b0b88563080ca24769"), amount: 4852567582077527137'u64.Gwei), + ]), + blob_gas_used: 11199168226748373856'u64, + excess_blob_gas: 13194543368024635634'u64 + ), + (deneb.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x806a868f0f31e8f519fa6339ad18c414dba17feb03aaf6ca3775b152bac64f3b"), + fee_recipient: ExecutionAddress.fromHex("0xa2bcc8b793c4a5d4e0f68251d2f22e1ff4366d2c"), + state_root: Eth2Digest.fromHex("0x6979ac9545f31eaf7ed8bd227cd7cbd1017492b892bcc118f7417ea87d50d412"), + receipts_root: Eth2Digest.fromHex("0xca0ac1828fae211c9d0fd7ab763460d89f9da0669d082c68b9fdca3ca1b59123"), + logs_bloom: BloomLogs.fromHex("0x0656423dc7b375cee4f5c3bedc500eaff2da91d0dd5f4e695933c92a2a6af7441200a41177bcae7912839f993a733aa2bb82976f08180a901e63c588a26dc9ccc58f477eccbb08aa932d512bfc765a57527acd04c585af23f48f389420890d06877d8a0f523cb90be10dbc73cb5b11e808f5c6c90c6fc3a9434dab462f2977eacf79146b35ee2372aae8a6fe3628cbe21a8988fd9546b25581b6d998462f9af7f653d3a4702a4a63b9f26cc7d2f72e18a3918fa9b65ed81d23ac0a64dd8f3f878f745fcb4de9ad144ae9565288d7bf90e6d356f49cc242d000e988fe76e0196f0c5b24bdf9dc501222e54f64861e0d45dda2bdf09e5fb290a1ec6dce39b02883"), + prev_randao: Eth2Digest.fromHex("0xc986211f6550cb787e89140d8856531ec309f652e2a871e2715c1dd055448074"), + block_number: 7781035717593646205'u64, + gas_limit: 9088183223170031827'u64, + gas_used: 0, + timestamp: 1844848381084178223'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xaac988479abbe95e03cc214e7b99795c4ec117bfe4da06e4624e94b262b015e2"), + block_hash: Eth2Digest.fromHex("0x14137d373f6e6110b3fe3c1d743a4f84547ad3d59d0b42598b794ff601e97e38"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[10'u8, 28'u8, 79'u8, 238'u8, 85'u8, 206'u8, 161'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[144'u8, 222'u8, 190'u8, 14'u8, 247'u8, 119'u8, 95'u8, 48'u8, 238'u8, 50'u8, 180'u8, 12'u8, 216'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 428032'u64, validator_index: 18218455002493563835'u64, address: ExecutionAddress.fromHex("0x389fe5e57a13de364b852d7e2cebc2add2cb7510"), amount: 726634'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xc6a0db1d09160cec69bda14b444c46745e09c96b"), amount: 742028'u64.Gwei), + capella.Withdrawal(index: 858390'u64, validator_index: 326055'u64, address: ExecutionAddress.fromHex("0x6a861508a89443c763d5daf15dab44a8a45147fc"), amount: 597242'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 17239721441660215355'u64, address: ExecutionAddress.fromHex("0x1450447dc71e28e312c7de7034523cd322eabc98"), amount: 18446744073709551615'u64.Gwei), + ]), + blob_gas_used: 6943026604784588438'u64, + excess_blob_gas: 4081254329996628499'u64 + )] + + for executionPayload in executionPayloads: + check: + executionPayload == asConsensusType( + asEngineExecutionPayload(executionPayload)) + + test "Roundtrip engine RPC V4 and electra ExecutionPayload representations": + # Each Eth2Digest field is chosen randomly. Each uint64 field is random, + # with boosted probabilities for 0, 1, and high(uint64). There can be 0, + # 1, 2, or 3 transactions uniformly. Each transaction is 0, 8, 13, or 16 + # bytes. fee_recipient and logs_bloom, both, are uniformly random. extra + # bytes are random, with 0, 1, and 32 lengths' probabilities increased. + # + # For withdrawals, many possible values are nonsensical (e.g., sufficiently + # high withdrawal indexes or validator indexes), but should be supported in + # this layer regardless, so sample across entire domain. + const executionPayloads = [ + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x760d4d1fced29500a422c401a646ee5bb5d65a07efa1492856a72cff9948a434"), + fee_recipient: ExecutionAddress.fromHex("0x315f583fa44fc6684553d3c88c3d26e9ed7123d8"), + state_root: Eth2Digest.fromHex("0xa6975bac699618cc22c05b1ba8f47cbd162475669474316d7a79ea84bce3c690"), + receipts_root: Eth2Digest.fromHex("0x080d53a0fd22d93f669b06052413851469d63adeb301810d7ce7a51c90c8e8ce"), + logs_bloom: BloomLogs.fromHex("0x453a1f1c4f63bcf0be84e36a9ac233b551601bb2e5ab9450235bd83e41d2013f42c97044ac197a91da96efd6fb18f233bad2e884d76f0a63a6fbf7dbc714cc9aa497fb6d363feeba18447ecf799d5f8d769232553c375b21166c0176859dba63eb77f1a17e482ebac07c3cfd5281277f55f1e5c79cc675d501e1982816d31db7d73c89e855315d8f4e9fef1c9ebb322610235c44632a80341b42f05d207ac4869d08d98a3587a470f598095ebb932788fefacdd70e7749e0bd47ceff88a74ee1f006d9791350484149935d4521d86e644ebc4346154ca0bfa9fbb83120630867d878c12e53a04a879e993b755f02670c9c47f091acf1b3f593782ddaa98f0df4"), + prev_randao: Eth2Digest.fromHex("0xe19503a6fa6acde0b8f5981f29eb2e298ddff63e6243529d735bcfa42680a515"), + block_number: 9937808397572497453'u64, + gas_limit: 15517598874177925531'u64, + gas_used: 3241597546384131838'u64, + timestamp: 17932057306109702405'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[55'u8, 184'u8, 18'u8, 128'u8, 63'u8, 61'u8, 26'u8, 79'u8, 3'u8, 225'u8, 167'u8, 15'u8, 240'u8, 167'u8, 180'u8, 141'u8, 205'u8, 10'u8, 246'u8, 70'u8, 248'u8, 35'u8, 19'u8, 45'u8, 252'u8, 187'u8, 168'u8, 42'u8]), + base_fee_per_gas: UInt256.fromHex("0xaf8acbd8a0f0f8eeced9a1014333cdddbd2090d663a06cd919cf17529e9d7862"), + block_hash: Eth2Digest.fromHex("0x86b46255725b39af70a9e1a3096287d9772ccc635408fe06c34cc8b680977ff5"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 98780'u64, validator_index: 8610867051145053792'u64, address: ExecutionAddress.fromHex("0x0c33e909ef375bd3ab33961b5ea767b4f1c8bce0"), amount: 671269'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 500164'u64, address: ExecutionAddress.fromHex("0x271215240885828779da36212489170f19a8f5bb"), amount: 2071087476832314128'u64.Gwei), + capella.Withdrawal(index: 26148315722507923'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x340bd9f489ec124b8a879673f12969b14d0b5555"), amount: 9486787560616102568'u64.Gwei), + capella.Withdrawal(index: 4839737623914146930'u64, validator_index: 273755626242170824'u64, address: ExecutionAddress.fromHex("0xcacc573cfc0ad561aae27f7be1c38b8dd6fab2cc"), amount: 9475975971913976804'u64.Gwei), + ]), + blob_gas_used: 4401258332680664954'u64, + excess_blob_gas: 12834012644793671460'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x814b12b95f9846e3d69ee46e6a47a26d6cc8613641a1352f35395a15de56043ef451726e797757b9768657a9e9787a83")), + withdrawal_credentials: Eth2Digest.fromHex("0x241d63159f0cde42aeec7610900762ad2016f5bc0270250d7086b173bf6e4181"), + amount: 12638322094749964200'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x10244d58594ff86b3548ae04b3c193756c7cf2e9830da492c6021259f8bce7ac6ea62d93a9b78adc77a168b91865876ac68ef7f05564cac91353e400fa5c44317789d2d93d6a6cba9155db29b7857562a6d9316454d1a9c5178e2ce5c75fa5bb")), + index: 8139570810318771243'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb7721c98fe1ae6beaf0e486d2d951a307a3d3265cf6f2b16bd8b40f2dbfbc6e4e20e3f75c29e70a0432af0385a997eaf")), + withdrawal_credentials: Eth2Digest.fromHex("0x0aae47c8d21e2ff63a5b341c1bf209f5176762d522d16d2f7b9a595cc327a3a6"), + amount: 15018910798502483977'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xa6d248e93991eff0b001418667e718204216d88fce9933fcce52e4daa026e8c47f9863a77d675fecd6def721d194684c28823350fe80429356c57792c70b22571e7d3219b9a8a35d3a552dd5eb6ffdd01ee5a1fcd2d14ad82038f7ca00a22ca8")), + index: 13899393201735021181'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xbced475462c8676eb79a8e288f1f7759b621192b2a5f41162473affe3219663fa1e9d78f0ce94c556e4bfa1dfd3f0f9f")), + withdrawal_credentials: Eth2Digest.fromHex("0x245144c69624ec1ff4feefd0d9080e016fcab37726bf712df06ebe512bd11fc3"), + amount: 8365809466950819313'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x806f5cb96d5cabc2ecfe96fd92816e1e86ea1e86229675bbdd6de141461bfbf3d358094f41ddb91cab075a67950af6016a326697be18d38a2056aab597d40cb216b642b5d6c6f4edacd4a4a89a7c342f3d11f18a1f4f7783ea25251a1f355009")), + index: 17214334124209319458'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x22189bc4bc3f45eb3d6d8a5bc6b85aa8f680c5f9cd1aba686757faee3d31bec7bff6af52671fdb767ea7ccaf14ac2ae1")), + withdrawal_credentials: Eth2Digest.fromHex("0x25993e69ef274cd8b703d25cd3932b117e08123578b20365aeae8a244a625355"), + amount: 12258289723293669412'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xce7d46dc7f0b4ad54417dd50800761161dee1abb2e20af7c4cad314a6921768f7b89ba17bc7b51497c67a14255c31aa19d19bdad1d572f88c598ffdbe7be5d8cbe1ceb83836948512448725ca56ba834626a8f42aa110c7b272524707e514fab")), + index: 13244611922088961185'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x0b1cd7defa0a00c8714ab2ab6a1da006d469c725042c589890c9e5c21070d5289a5b33357f9dd8a79e6364fc4e012440")), + withdrawal_credentials: Eth2Digest.fromHex("0x4b07a81b5612a02914cfd99571711c78cbaa3e0f1fbb23c4a0a51e04c263a659"), + amount: 16282163526662133088'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x943c3c3818d5aa98fbf8344ef4cdc9c13cdabfdeb7762efc8bb32d2ea32d3bbb4ef069a254f5f35325f48609fad7bbafb6389e204767a9b3bbe46a04f8baa850bfd4d3747aaf2816c7e18fc2ebe4fa41088d195d09c761819c7a2e57a3451148")), + index: 900883336538271514'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x2cb54ddf357864102f4ab6bce57317a75cee972f303449bf7047f4e0e5809127"), + fee_recipient: ExecutionAddress.fromHex("0x92af67d9604b945fd2cbaccd29598e2b47ef5d2d"), + state_root: Eth2Digest.fromHex("0xc64221514816a2f87a29c2c474abf99547820b2a12e6e5956f160dd54579e521"), + receipts_root: Eth2Digest.fromHex("0x76c1ca0e483a557f6884d64bd891c62904c64c2fe69350278345c622cc50b0d7"), + logs_bloom: BloomLogs.fromHex("0x7afdc9a99777d76b713e960e9f12ad4fe46ecb7ea6d5b245c6d9ee11d3fd35e7ae33dd6062fb6578bc2c2f286f1c6a4aa6a44cc80a88a3678c7085c35a0f2e5334ea686e2098fe5d179bbbaf81cbc349a15e7a21aa27f0ddcad342d980d056a356694cdadcef8db3c7866b6cb087c28f2aeed7a5bc9b1294cef0da3ac3b46dbe72d7f164f1990bc32f755b709b96a96bdd8da2c9d9300e9f6906040347d337fc21b833ff0b80305b22ac64a2df2dede4c01c65c192884f161aacd12ba56dab9189477e6ae484a97ff96e0aba1f9b8d043896b8433779abeec091f16b94a013325fe11096d1f2d79b701ab5b46063ac99392a790e617555fe3286dfd7ec0cb9b6"), + prev_randao: Eth2Digest.fromHex("0xc4021ae781a3b3a1dfb1e4464b032a3bae5f5b68366beb555ede1f126920cd5c"), + block_number: 11318858212743222111'u64, + gas_limit: 2312263413099464025'u64, + gas_used: 1, + timestamp: 15461704461982808518'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[254'u8, 188'u8, 92'u8, 24'u8, 153'u8, 206'u8, 74'u8, 108'u8, 96'u8, 100'u8, 148'u8, 84'u8, 151'u8, 74'u8, 73'u8, 167'u8, 65'u8, 177'u8, 253'u8, 62'u8]), + base_fee_per_gas: UInt256.fromHex("0xb1c4b2bffcb38aaa1f98b483441aa212c9dd951d4706dd505a973fd5fd84796f"), + block_hash: Eth2Digest.fromHex("0x8b150d453d802fdbb19be0132621a5e8061e70cfe6668ee6a63e4ff217434999"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[142'u8, 197'u8, 221'u8, 83'u8, 32'u8, 126'u8, 145'u8, 86'u8, 28'u8, 39'u8, 112'u8, 240'u8, 168'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[175'u8, 191'u8, 143'u8, 78'u8, 162'u8, 249'u8, 87'u8, 193'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 168'u8, 190'u8, 157'u8, 39'u8, 143'u8, 147'u8, 156'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 11497754023538902580'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xb0b680a6d93e520fa32e399ded64871d99c1f2c6"), amount: 15592017597077727306'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 14269483352942387358'u64, address: ExecutionAddress.fromHex("0x97e4451d09c9af077dc9081e5081563aa26e4c51"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 9664968187979079659'u64, validator_index: 750818'u64, address: ExecutionAddress.fromHex("0x1e4bc6f12efe96b9f5ca549b77a3d62c5f5403d8"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 727020'u64, validator_index: 10133766089843653238'u64, address: ExecutionAddress.fromHex("0x6a1ed64277cf1eba8c96281531d2799d1fa7c409"), amount: 130469'u64.Gwei), + ]), + blob_gas_used: 4810756443599845432'u64, + excess_blob_gas: 1435200597189175983'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x8fa8ea53febdf07bd7f832be8c965a4aca37c3340b4cfd75624c125f4eb5946a404e9cc35d74f55048c1fcfadde3551e")), + withdrawal_credentials: Eth2Digest.fromHex("0x7647368d6b5580fc677b463d57d4cc9dda93117e9c8604cda4679030cd4956e4"), + amount: 11838169110820399795'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x84ed920f689cda2883afa0c5d12db16206abca7d0319047c2542b9fc6c0e5fb9cf945e76c34da4448bf06a90cf51686393af3b80feebef058a8cf98762439bf748c7394083edcb3b4b20390c00415046f84885a8fc60d873318ed08f7e420d7b")), + index: 14081768455144986910'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xae3d89af9e4d6caa6e9746a13f9bba9886c7fb75669af29e089799bf94614d722a776006b4b2fc347e54c88ddebdb5df")), + withdrawal_credentials: Eth2Digest.fromHex("0x0548c33677c9d3d11898e1b1cb7e8546b5d28c09626aeb43fe77609ef8eb709c"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x8beef976488318fe3577aaa2686096377805c1486c3598c5a01202884ac1b68013cdc02e1bda7cc5fcd649c76cb57df4d8bde53f119e2c9f7699653f4686c12ce909b508fc92a063773da4319bc9ec52f1605c7a4c220a1d3bf182e80b7a5949")), + index: 7396750296380130136'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd3abc92b8a163a56e35c545a528eaa0c5bdbfcc5de8a1be80231d2a33ef1249a31c3638771f7a3e764fee81f6c95d433")), + withdrawal_credentials: Eth2Digest.fromHex("0x074fa7f5af43e713a8ee7f09fb46ef4f05b23a060486141b5d9e9d273c7fbe56"), + amount: 1209689892101089592'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x01b42eaad61c4f658526ff4d64bb49f19276a698b34870245109c24f6f59dcaf87ab2275526c665d2493ea6c77f2bfb86e77d0375f4f63ce4cb3dbe5632442453fb4c73558d3569b62f1a6ecd5821daa85d6762a8a24c0eba6b8e51c9b0acb8f")), + index: 16259922695017953678'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xf18bdc121a076ebb642352c940b5c0cd9c60ea4d3b8188b9f7b446efcabbc5af2f0a2672632b0474c5147d17427bf526")), + withdrawal_credentials: Eth2Digest.fromHex("0x80de1f7b69ecf34465e463b30e49453c36e65684ce3004a082ffd84bf4c0441e"), + amount: 4622244708907095023'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x426dc233d2195c02283140b3d90a50da4d6d5bce3f7c3894a910d891ed835c2cb1dd8ba1e5f82dd214a322abd50e3043408d6f7a04499b2bdf6fcc5b4cda0400d557df79bba2aea31de06de9c8a1e069666a3b71577809480f82fce4a12882fd")), + index: 9250544134833432385'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x809a16fa8c9e34875aaac4939775bb6b0034b2fb7f5db570567ef604b11485c878544dc6e6878f4ad921fce8cdcc7273")), + withdrawal_credentials: Eth2Digest.fromHex("0xcf05474e4f86279a6faec8fd6987ac10c4aa6595e6d061fe7217a68d5fcaf5d3"), + amount: 4509592030421891894'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x0d543b0e9b934586fb877615c8d2551e11998f020bce6b96901fb8045ef42eb41f6039e813136043fe5c63d91a11e1e15e5c4063d1775f95ae1715cb87b21b7690b44ec38efd1a825e1e3ac68d21940f772b3309edb3ddebb24204e06d4924c2")), + index: 12423850076890731216'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x39554fbddf13facd81344d536c08ed5769304749"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xc4f5b2c07cc2f6758dd8eaef217247f767bcd88a8f5c93b030023d420568f47735d113df344627759f4ea1b56c53136f"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x243c496e83f955ef23dc3d121b3cbe5f56305d73"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xe9a3d62cdf9acae4966e5682958d0cc9223065b4d68ed3b12a024a56744ab9656736326061f9fb41a8f15564cb4d241f"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x462f156d8d950c7ffd40d7ba149bcc34093bbdb7"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd6d7f2281c2b9c98a8a5dc0b7f41783eb91b838973207239852e817ed412e164e330003ac9ab0e96bc65886e15b5cbe9"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xac5a7347865f503e1578d1b47271c8e60027b5ba24b0da8e7c3733bcdbeda220"), + fee_recipient: ExecutionAddress.fromHex("0x8b7fa656e67f6af2074ec3f16930ad742a69f189"), + state_root: Eth2Digest.fromHex("0xeb50f351f6945df8983cf4037ee264dcb2ceef3313ae452248571811d8a3a8cf"), + receipts_root: Eth2Digest.fromHex("0x860af6010832f64a5234327b653aabbd3898881a7b72ae42e08d4a1519166fba"), + logs_bloom: BloomLogs.fromHex("0x01a18d51076880a1a8ea86cc5dc5fb904ba0a3c285b7dff34ee5dbad9d64721f3849ad9f50b90ad4524eca6b0564f8a1a5827a7b476ea051c33a7c0e18db4cfb27b36476bbb1eacbc029dbc5009e5cea695045cfb34c868163514b784133f0f2998cf12e2caf9c74f69732ed3716396dc34d86725428aff48bf6b935ae88f5e4820b9a325bc670cf560dcb479723213a3156a9d7d0e7de0dc791d0eb94a691013624b8aa982ca3c9d5b49fcac8fafbb403c9fbceee5373f0fb2b77ff1bae8160fe2a47b01d792b088eb3fe24c53b5c6a8b4a3b59060d587ca7376f8baba58d57cf745b2a346f800a54d08545194e067ae260c73369a016b12d0fbc20abc78ba3"), + prev_randao: Eth2Digest.fromHex("0x330b7093023f617d2cb5f76cee4b078af002b68d81e3a5b5c9d37c4411871a95"), + block_number: 18446744073709551615'u64, + gas_limit: 13979513761871276914'u64, + gas_used: 6199089254852634745'u64, + timestamp: 7404562418233177323'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[220'u8, 149'u8, 177'u8, 36'u8, 228'u8, 88'u8, 47'u8, 149'u8, 211'u8, 213'u8, 170'u8, 40'u8, 207'u8, 145'u8, 137'u8, 64'u8, 153'u8, 22'u8]), + base_fee_per_gas: UInt256.fromHex("0xfc82d0e46d05b21aedab6f368183611d2885b28c52842f28f621ef6c631b6e6a"), + block_hash: Eth2Digest.fromHex("0xa8c6b2dcc2496f0230e796f8a69642126955ae6209a0d0c2dee2c925212f447e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[138'u8, 17'u8, 34'u8, 168'u8, 105'u8, 179'u8, 196'u8, 21'u8, 253'u8, 242'u8, 106'u8, 30'u8, 40'u8, 190'u8, 179'u8, 93'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 1'u64, validator_index: 239183'u64, address: ExecutionAddress.fromHex("0x75efb2a04b5f25ae56ff7256ee9f4fdc4e25baf3"), amount: 402148'u64.Gwei), + ]), + blob_gas_used: 723464856451065691'u64, + excess_blob_gas: 11231138371511965912'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd82ed23e86d1d22165bcbed4e01b2548997769f369344a4f347772108782d77c20cdaa614c57457726d3e5d384a7d09b")), + withdrawal_credentials: Eth2Digest.fromHex("0x2acf0fdd7ca651a467899a928ffd036d88dd86301808ccd2a06d5002daa35d15"), + amount: 15437169017045689073'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x143a1a4dcac6db342901feb541dc0c95830a4ca1aca9c3fcb55e2dcb9a5b31e2bd9214b1a3a12e17e140d37ba7ebfd11d6d8a38eea5d0755402dd400386aaefcc70d12fb1409f92797923bf964bea3f916b562f3ff2b522c48b748c8e8c632d4")), + index: 15872726372973140071'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x3a8a707225d47dbddb01c1ca39181af823d57d97"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9cf008ca8159512ffffa1fe56de68bb9e44f9c4bb3c2c4924f5d7bf1bb810cc807b155f11ddd55a4972346f8e75f06ab"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x7c55f3e4f648bcfb47db2122233b25881785709b"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb9e559b137b8ab79ddfbc6ea2fb44d96d1925c2b7b6e4c0e1b69f66d82b656065af06bd62e8fe9210276a116ad78c382"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xcf25ed583b463f3a57acd97c398e27877b9bf6a6"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xa14ac0d85ae38dd91a9f7da12b6c7cb4e879f78effc5ac0da8f9ee56059460f31152009fc1b88d0e0a0bf576950f45e0"))), + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xd3be9b45bfe67229afb47461ca2970505586cab8eb8e00f280ceb07a9d47866f"), + fee_recipient: ExecutionAddress.fromHex("0xde645d4a77f0a386a45c52357948e1d7eac5e780"), + state_root: Eth2Digest.fromHex("0x69b70e0188e7b88e38df90853b2dfd2e4c7181e83d82d77ab81c57d161216b92"), + receipts_root: Eth2Digest.fromHex("0xc01d94a01736268170a16196927029d4d8d7c65970ec78ece94c87304bed4568"), + logs_bloom: BloomLogs.fromHex("0x7f1ac5c77e3f0c8a1a103ee83dd7d0fd6fb13895aa1141de330445474b3216e2646c15c1cbf4ab4feb1e4e21c2e6970f4a6648675508b08111e00b62866b0f6cccd58afea87d2cd0a24c0384fa179dc33ae6d0db8c1b118a75fb442682b7cbecc2808fe8c812c3720ca54f6723a395fff5dd1720f41822c91b080503bbfeef21eea192d5b7c4160344996d017ab849fa97e862206caac8f8bfeba41865514b21a8d8fa9ce3dcc0daf5bf86fd2f07d222fc7a9d11fb4031b2cd72544d7f89eb95203a570bc179f9ba1f73f39d74049fe22b63939ea49d5d40f42c00c5f1bd429e84ade377475e432186acd9975914670052fea64453fca87317f62e29b550e88f"), + prev_randao: Eth2Digest.fromHex("0xce47da2b2a68186b78054be0894ccc9ae7213c18b9093c0ebc1b9ed011071a39"), + block_number: 9014833350824993703'u64, + gas_limit: 18446744073709551615'u64, + gas_used: 7874274181221487360'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[139'u8]), + base_fee_per_gas: UInt256.fromHex("0x1eb821a0ee3f9d2e5b49c64177db9ffc96ec6b06249cefa8c51d0ce7e664a3ae"), + block_hash: Eth2Digest.fromHex("0x99479be6429eac4a945ca8171d3d3ce42d7b5af298292e833e20462438e06229"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[99'u8, 198'u8, 91'u8, 86'u8, 23'u8, 222'u8, 121'u8, 250'u8, 12'u8, 135'u8, 133'u8, 37'u8, 61'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[81'u8, 173'u8, 241'u8, 145'u8, 54'u8, 3'u8, 36'u8, 121'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), + blob_gas_used: 1936360613980595982'u64, + excess_blob_gas: 525438497879148955'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x2dc5c92e3d525d69b07de9f2e0fb3db26b05c966b029e38fa736bb60b49d6abe86d4dc61255de43e9bd012c1677a7adc")), + withdrawal_credentials: Eth2Digest.fromHex("0xa85cff9568bd1244836733549567286eaa0aef139c416c235555551772e2ae29"), + amount: 5525246068348642244'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x4f2e42e2305bd30fdbdc8c2b0e8f9c57c544f097cfdc2fb2335df422a14c5c827d91c586384a2d14f64bbd98124046506388058414766674bbb59bfefe2c701c05a5e9c135d60617830ac5d60788712587220964a78a632cde4e124b7692ce62")), + index: 0), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x6ecff72c568c0e272157ac48bd047406c8117cc60e531a3acd46531da9b140c91ae684c72def7839e6d84b6f190877e0")), + withdrawal_credentials: Eth2Digest.fromHex("0x0946aa245e0435cb321fd0e166c31cb363fc2f264bbb2d67be9fe89d07b2037c"), + amount: 13283742386908495031'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xf683f76e5a79d2248248f701d87327b35705ae31284d8e7602a1470a239d35f9622c5c39812a933ca586f724af4f10b58cea183b8c127dada1abda2eb0879e1aa49f7a9bd89ab76f7d5f33d2ad80c9f058ace2bd83c224520f8d02b0942ed985")), + index: 789807770712130412'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9c696094074fb290b6f8558c7ebe08b8595859aabfe521a7307c3179b21dc8df0a63f0970f89bfe3197373a92630c3c7")), + withdrawal_credentials: Eth2Digest.fromHex("0x650cc685a706fd441937753efc42e243339d62c6866f83b00c0ae2becc8882db"), + amount: 2716675895799004971'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x79e01ad75396043b9343d83587ccf1dbc7928a8f520e92b2840fa40cb086b04964b8fda19176d22d643c5afe0703884487fc40a14b7a7100c96d4811ea7af08046fd0d7aab8a1f73e05fa598f5be976696109312b26ea8b629ee984be7a7077f")), + index: 1321141240653182102'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xcc2fd5c9cec6e09329e140efd4ee508de16b2af020d8ed8b1323f166c3c6cc0ceacefccbb9867cd5681610749050429e")), + withdrawal_credentials: Eth2Digest.fromHex("0x89a95d7a2fa26fb6db447d53a508f92f997823f95a6caa25e04196bfb3749f5d"), + amount: 18351003704404188995'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x351d11b34c55e1d947d5ce132e02ef1f3765136d14945b3fa297569465d057fb593df173d99e690c7dc8f6455add6b6abc87e4ea88a68fc396ad9189f3c56bf642ccd5dcb42dbcd67b8d6c3ba6627bc2a51d776cc35adbfacb7bd5e84948995d")), + index: 16817584575889190379'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xca1819f056ebd22a08689e4d40a195116b68e56a1c9b0914499801f7015f1e2696a9d3fbc17a5c2641b0429eb7bf2124")), + withdrawal_credentials: Eth2Digest.fromHex("0x83b7ec99b4e424a17228b43057b9bc8ae387fbc075f1dc692b0e1765629e2494"), + amount: 18420683568430679261'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x94cb986143fdae936c832d08977520c41a6a9b1569b012a8486678571ea5ce2e913f55c9d5631a8f02d1b75aca414969c56f22cf0b6e5193f7ac3568b09c9ae955581c69095908ccab9c5ff5c47b2edef262f2843ccc7cbc69eb35b14c66886c")), + index: 11423537419700559218'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x44754b90f7b23eee1dddafa745ac723dcc147404"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x8d13edc45159cdcf6ed780fc7b93e74434fa392b0842dfa92458cc59515aaac127317df24def9701eb6d5ea060eaffea"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x06504beb0dc3bae44ef75678d29ec5138d87da68d307ca7d43e259cede60fda6"), + fee_recipient: ExecutionAddress.fromHex("0x527ce602a0be18c0944dc27b2864c711a91f89a6"), + state_root: Eth2Digest.fromHex("0xad3bbef5d22bdc2429da09eb85137c881f85fe6e6b3ea207e5eaeb399c755055"), + receipts_root: Eth2Digest.fromHex("0xf94fdc52cde20532cfdee73e9cebb61d9f7160191345f9caf58b45501d8effbc"), + logs_bloom: BloomLogs.fromHex("0x0999cc50752006a2bc8e5485c239b9a41be6ea2fd8f0392884246ef7d33bccdf4bd326fadae385e3ecc309bf0f367ac1791767ffaee90ddfa7bee22d19f417708fded2b2b6b3be2b6007745fb1de940e7849761586953c04e3bec3c9b6342d1b91dd024980f469b484bd0befc4941a3846d027390d6256e4acf9933e0891dd558270eb35d3455f4e49c890479e970a8008b75ff4d33b4f7e5a8c19e75d8abd8673ebb859a8a24907584d88f0d68b3142b3c6952695fdd84581f5a070601a575a8e7bfa0bf7cf0fe9d70a051005f9dc594d09909e9d079d02a4e441e5b3f33388de8d46cbdcdf24f835415680e569f2ed29acdc01042a6a7ee701e4e6cace5c28"), + prev_randao: Eth2Digest.fromHex("0x7cef96d72498facdb399dfb5b6d7d69185f3edc70715540fdc7ef651c4685c6a"), + block_number: 13066898984921201592'u64, + gas_limit: 9241830338892723842'u64, + gas_used: 8347984358275749670'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[11'u8, 46'u8, 127'u8, 104'u8, 141'u8, 79'u8, 55'u8, 48'u8, 242'u8, 12'u8, 142'u8, 2'u8]), + base_fee_per_gas: UInt256.fromHex("0x6241db2a44a58a2c1aac93c4aa18aed5add30d1937c31078542bb544bf9ba2df"), + block_hash: Eth2Digest.fromHex("0xdc1756667e7c3f1615650cbbaae1117a6bac817c6579cf3f7afbc93277eb3ea1"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[13'u8, 24'u8, 248'u8, 26'u8, 141'u8, 177'u8, 236'u8, 2'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[213'u8, 208'u8, 242'u8, 46'u8, 0'u8, 31'u8, 219'u8, 213'u8, 197'u8, 218'u8, 148'u8, 236'u8, 43'u8, 152'u8, 123'u8, 96'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[84'u8, 163'u8, 60'u8, 195'u8, 40'u8, 68'u8, 185'u8, 20'u8, 244'u8, 82'u8, 34'u8, 181'u8, 26'u8, 201'u8, 2'u8, 108'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 15531362396155364476'u64, address: ExecutionAddress.fromHex("0x063b2e1de01c4dad4402641553c7c60ea990ab30"), amount: 106054'u64.Gwei), + ]), + blob_gas_used: 0, + excess_blob_gas: 11830672376638423068'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x09902c0e95be295a0b550efdeca632b9e9628760737ef80afda66a830d3b3695891d94f7c0504e9d5f7ece9b244ff8cf")), + withdrawal_credentials: Eth2Digest.fromHex("0x0cc2bc536712049ab8303dbc403542bf5ae5b2308c6859420ed950ed9b221567"), + amount: 13281242819623749583'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x08c9aa65cb03faed07e92003192d98e83a9026d2c8b31ebdaeb70a21809d93e87351482aa9f49b039a1de250ae1a0a2cf9104c23165ed658e433062e7b8cfb26aecd8d73be477745f9e7f4da7927dfb300ef82157a66936b78582344f58468f0")), + index: 16878503552918350820'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb49156fdde58af27ac558dcf697f2eb2f2c92efd5b455ff736ca88258d9c2e7b77989585dd562da6eed32b228e8510ea")), + withdrawal_credentials: Eth2Digest.fromHex("0x4e922c8a3cc2bc7f5ebf9733c67d76f338e7902653c28248ef967047a9875835"), + amount: 4089107267451814479'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x9e2864164d275e436ed45120245d2063dbedc87d555cceabe8c18622fe462411ecbe7fa4a262989a45795efea09d21f8e4254cedd5c787bf80211be0a3c6ffc1bcc5f364387f32f746647e0194a599653f3af5f6e1151244df02bb7b3f7270cc")), + index: 1665528005288012054'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xb5d4a5eae3a1ea004ed573b0b8f8a22c847616758c0faf1e7e9589f16e55415c"), + fee_recipient: ExecutionAddress.fromHex("0xf7ac0877fd8bcadde1e050f6c7ddad13688ec071"), + state_root: Eth2Digest.fromHex("0x7472f824376a723894f8d539743c7f93b69839772f28cf6a83e2102fde99c3c9"), + receipts_root: Eth2Digest.fromHex("0x750365b5d975460a64f07758abd0cdd44cee23cc2d4f06f2a047cf4c12c23db4"), + logs_bloom: BloomLogs.fromHex("0xe24d8452039bddd10e1252c1ebf9b9e81a22577f940e8708d200548717e8471e130a7066adc48785a8dea1dca05953d6be16504a57112c065e7909586cd611af9e0b840b81caf0532dbb2833ee5ac6a6eb7b6c990cba6ccf6f4ddec5a7c76f8296bd2a693cbbb43b1d86b66f6aa58888734d3fb21cf5e96f1b981f8ae2737bce1cad1cc458650291cf7a3d22c61fde6af3a07a44bf1b334b2c5dabbef16e5e73db75e87f04670cb3830f0a7badc702e7dd37a59ce02992f4473a909e57dee1fdd22cfc886f4fcb6ea205ec9234a8ec85ea134242748f9f10062534fd0528bc1b5b1e89511cdf91a1e7fb4f8c58c93d2a6c75e48a2d48235cb7de13040db8dc9c"), + prev_randao: Eth2Digest.fromHex("0x2410823a37c763e13b03a4c48e32f9e43b8440ca31ecfe8e0543a20a02c496c5"), + block_number: 14920119354157670036'u64, + gas_limit: 17193947846593799248'u64, + gas_used: 2176791850599260430'u64, + timestamp: 12670133468877091192'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[31'u8, 7'u8, 1'u8, 212'u8, 152'u8, 82'u8, 167'u8, 57'u8, 116'u8, 147'u8, 97'u8, 109'u8, 219'u8, 207'u8, 151'u8, 116'u8, 43'u8, 218'u8, 91'u8, 253'u8, 14'u8, 182'u8, 102'u8, 57'u8, 153'u8, 72'u8, 172'u8, 208'u8, 0'u8, 64'u8, 97'u8]), + base_fee_per_gas: UInt256.fromHex("0xf1daaa067663bf3277b9149aab162f4e330f988f0be8f83a556743a57ae5c8fd"), + block_hash: Eth2Digest.fromHex("0x5d462b4b243c6292b6a3b32f4e05849c0613d0a61954734c524f75f8df66cf8d"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5416630176463173042'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xd7b1d18e4eb7b5041b4b08bae2ce8e22982d6e6c"), amount: 911474'u64.Gwei), + ]), + blob_gas_used: 17909098553568904023'u64, + excess_blob_gas: 2561776469828429184'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xab3432ddf2af63c4fab5af4cc8bd2e73aadf316f2899b88ac2d81cce54476a401f2c6692b95a049a559134c160ea9588")), + withdrawal_credentials: Eth2Digest.fromHex("0x4efa2bd51acb05fda811629ca1fd71fb77f4523a26087e25f8f6faeea76619f4"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x2303cdb9d265dfd2ac3923c45ac94797eaec8188c244c8b9c7480d55db3d0e33876c14abd1cce784c18d07ed474ab7911b29e5d0343377d923a21c6a4ef6b0d302075a1aa9e7341e22aba6aa5b139b754a3b99b80ecc5c39771eec11d456f210")), + index: 17835217878031055704'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xc6d41b4862a8b3c4dffa9a2550fedd5598417ab02715a841d91e13688bb2a3f30e22a1bc60363a77dc95b6bf0d7e0df3")), + withdrawal_credentials: Eth2Digest.fromHex("0x771668e08e36fb5974e56502c56bfe6a9b4976e6954e845b416fbed33c18c26d"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xdb8c8b42b6796c13f5737484f6da27b7eb3ddc3f03195be0cf6a484f34bb5e5da5ab4276222ce48b84f2b80e3f40604ec0b20ae0b451f4f25e598f483fd99d5b158ca0dc102de8c11c2713992997d7bafda9bd719c7ca70480174915d76bfe73")), + index: 13902730600946299592'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x6b841e43fc2268f72a78f0c77d57c4cc6d0b87686a435813c3f9af9a87a01b21b5ca1c6b54ebcaf5e861c7cd66244ac9")), + withdrawal_credentials: Eth2Digest.fromHex("0xbb1071d3f5aa5125b1d01442d9d82812dff796db2d8d36b590c1ea66ec945c33"), + amount: 16549762982203261123'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x6d18d257618a085090dc37a79c3f02b6a7145f27d72736abf90cc4a1fde6a00b2670d86243ee71efbe5819360b53dc2263784457be537b0325e7b080507d78f0b18b839acbde966f3bd5567ebab939978b00b5b996f1632d6ef5aafefd3c8e6e")), + index: 3347786845438227400'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd424dc39bd77478209cee2c04bd9dedcf60823c4fabf724d0aba4a2d401a14a9b5e0cc0b6a2058e8165177c70fde7767")), + withdrawal_credentials: Eth2Digest.fromHex("0xe02ee40d601028257747b8a429c224fd401ac674454ace65280f169eca07cec6"), + amount: 7324985409398823338'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xca03e6b82cd3df289ed574c2deca216a089928bc944abd3efd26ee3124c45b22e7f541c02cc95f71ea8b52f0fed044ca14863b651c07b6e52abbce8afb500556a32e33a5f57a33ca6103237aa1c5bc409f4a2745b9828d6eff5360a2ba63d162")), + index: 18335046601207607970'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ConsolidationRequest( + source_address: ExecutionAddress.fromHex("0xf059ccccbe2c2c647c9eb7443e500f59b185a682"), + source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xebb87808992003e0482b3e56df9b966fb33c46798b637a6663239157d19655d48f1e553905f7bc49f61d1f42223bb475")), + target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb5ff2f18bf7efc34ee68ecfae0ff51611f382e9fc7dc34634f32a1b4387c3010e996dbdee44e26f591aa2e69c3b58f8c"))) + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x2629683cfc70198038837270bde3c60176c2a4aeeced0d4a4f14dc99a380c377"), + fee_recipient: ExecutionAddress.fromHex("0xd234af1937861b66ca84c334824763fb54347677"), + state_root: Eth2Digest.fromHex("0xf79f02d52d7f2a4be99eebba3dfb3bce74136ea739da515703d095a66ce203d5"), + receipts_root: Eth2Digest.fromHex("0xa97ae6fa5d6937f7754ff96766a54bb8ec082b046814e74f6c9c67147795f526"), + logs_bloom: BloomLogs.fromHex("0x5d2ef8bc2f58a84e4050e3a38985e4c267940707c8da3f687fefb9e22e4ae11a2f79a24456af3758e8b521d546dc178da5c85da869ebb2da551976488a769ca2940fa20853e4e1d1fcf8d5bbea0d16973c827d38c97c47c57835677590567829d119e8108f2ee3fa988b267ccfc3e58e5f81c18c775a9baf06d4d81aee405c5683fa4e5e891b58101a27e8f71c60d357a4ab8bd02e12fbbb0e363c4632b0a3c0de638de37448c9476c65a62f7f1dd9643fac6ff78ee431d18ab554b4c8a1984fb5fa0de3464d223f236eb8e8a8f59601221d2ab480ffcefaf4bf6471b40a14773ac0cdb43aea505941e4b0fa6fb26eb091adad77acce41e516fc743e5fdb045f"), + prev_randao: Eth2Digest.fromHex("0xbe44d7c5f844a2acb307a4371784d7742be482aece83368d94813ffa1c7bb60f"), + block_number: 13524449277995212660'u64, + gas_limit: 1, + gas_used: 7976957374052242924'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[57'u8]), + base_fee_per_gas: UInt256.fromHex("0x6c98d9ff36f1032fd55d8a6038d7b1f7c4e5f7c884b73f626fe43e687beeb46d"), + block_hash: Eth2Digest.fromHex("0x2c95101857b07bdda0502741da8cd9160ec0474929d132e9159098576f9a7c35"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[75'u8, 85'u8, 130'u8, 87'u8, 90'u8, 172'u8, 176'u8, 44'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[207'u8, 150'u8, 64'u8, 87'u8, 15'u8, 18'u8, 3'u8, 236'u8, 232'u8, 87'u8, 174'u8, 192'u8, 29'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[23'u8, 37'u8, 57'u8, 158'u8, 137'u8, 222'u8, 53'u8, 111'u8, 63'u8, 13'u8, 69'u8, 110'u8, 175'u8, 108'u8, 16'u8, 207'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 1071093368516669975'u64, validator_index: 15999188653672167093'u64, address: ExecutionAddress.fromHex("0x368b0ae1a6bfc3312460f212017e8bb32aae55bf"), amount: 13132185675616884508'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 1251419977457119333'u64, address: ExecutionAddress.fromHex("0x0a4d18e47c5ec0c639ff29d8f8c9be0b60f00452"), amount: 1'u64.Gwei), + capella.Withdrawal(index: 2046299652899032730'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x44bfe00f98603a5e8363030de4202ba50c7e8138"), amount: 15403504672180847702'u64.Gwei), + ]), + blob_gas_used: 819823383278806839'u64, + excess_blob_gas: 5121347703897393436'u64 + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x190544155dd98bf86d3ed5ee94d01afd3a8e67b8476f94d90604706da0a7d340"), + fee_recipient: ExecutionAddress.fromHex("0x799d176d73d5d6d54d66941ad6cef8208677371c"), + state_root: Eth2Digest.fromHex("0x07e626b9c44b0ff14586d17acf79cb136ccc5d37fd7135da33cec516af168f43"), + receipts_root: Eth2Digest.fromHex("0xb8b100bc5c155fe6358b9a16756ec06880365f5fe89124cf9fea963e26d3770f"), + logs_bloom: BloomLogs.fromHex("0xc314d3d6ab41a3fce7433dc286ee5c9820d883ff572ee7dfd2f4ee745f11a71f6dbe142d8c14bd6cc76782f1bb2b3770e65a929b2187581956bad937907a124c92ba10686763ddc87ba5b4a4e9cf4b9a35255fad5f54b404aeed5ad9859b5f9fd3c137e9eb6ef394a10b8ad3fbba75ba38c2cbfb91fa793ac763e8cd31481fbecef02b3365b990f5120a2970f2779574c60769347ae334a9f39bb3d3ad35182f7dcd252bfe9663c4f54b44dea8d79e3bcd89877231e81a9e9f5c1eaf5da1f56ffc39c23fc3ae6c130281c792a31e7a60115d46abbe17807cd120038631ca7a6636c8c644b57719e386cc8ada32ce806f75110ad143522fb0b240213df4bab07e"), + prev_randao: Eth2Digest.fromHex("0x17e445793c0e354ee43381ded194220ebd87ccbacef83e3da5a1cd3c8c57bf49"), + block_number: 5728529601694960312'u64, + gas_limit: 9410734351409376782'u64, + gas_used: 16470261240710401393'u64, + timestamp: 8811957812590656903'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[95'u8, 124'u8, 151'u8, 79'u8, 76'u8, 171'u8, 74'u8, 213'u8, 207'u8, 202'u8, 63'u8, 2'u8, 182'u8, 32'u8, 115'u8, 65'u8, 90'u8, 186'u8, 34'u8, 63'u8, 241'u8, 191'u8, 88'u8, 10'u8, 197'u8, 52'u8, 33'u8, 98'u8, 78'u8, 210'u8]), + base_fee_per_gas: UInt256.fromHex("0x3c1ba8cf82268c828c1a7f249328741ae21f35a7659365efd7496df94dbb85e9"), + block_hash: Eth2Digest.fromHex("0xc2b2bc39ed0cf5764800d3c91401828ed32d0eea58f9d336c32f9e6f7200ac8d"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 802141'u64, validator_index: 7520769587588158114'u64, address: ExecutionAddress.fromHex("0xce1fcedcc47b22d7e38f76c1cba49c2c20da09eb"), amount: 5845756482608800263'u64.Gwei), + capella.Withdrawal(index: 4169028257817284566'u64, validator_index: 496485'u64, address: ExecutionAddress.fromHex("0xf99805deece4ff418b55557b45060e88035f755a"), amount: 4870783513883486430'u64.Gwei), + capella.Withdrawal(index: 10410265605811982468'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x31e886453fa4e7fcec6ce6094ad22950637d41a1"), amount: 157748'u64.Gwei), + capella.Withdrawal(index: 10622085591419415519'u64, validator_index: 8179967808007927229'u64, address: ExecutionAddress.fromHex("0x03d2493395b71bb181db626a99c24dbc1d07065f"), amount: 18446744073709551615'u64.Gwei), + ]), + blob_gas_used: 14543409578714974146'u64, + excess_blob_gas: 0, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x7ad7353de5ad5fcef75b9e4c275970a4ad4cd5221ac692d5ee7f51d26a35a927f5a67d3540c5d08667772f78284a4987")), + withdrawal_credentials: Eth2Digest.fromHex("0x1320977c1ca99dc4970e49e5d49c5f81fb3bbbf17ccf5b7963c070ac31bb893f"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x42a5b14b6d5018eedf1dc9bb07cd64ae2d25f583ad805d58d89b4c8381db8740fe188a70f1a1d2eb0e486807cefff900f93ebed94fbe2539edddf06f91bf347281f9dcc891db49d6107c2f88d678d32e5e9849a2be7b082919edb769b7c70abf")), + index: 16997402741851403011'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x4bd763bcdfcf9fd2ce667c75408bc1157fa9730a"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xdf62e8946d1457a50ce017fae0c36e5dc5177e642c18b74dd6df192620f8a32bef5f02453f0835583f6082f213df7245"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x86d7b430f69b215ab5ae863998ce41f01a5016376c8bec7f5b7a6e16a2326d92"), + fee_recipient: ExecutionAddress.fromHex("0x73068946d757f5d145a38fe9de817b8b1e9d6c43"), + state_root: Eth2Digest.fromHex("0x312b4af4d3ca5960dda2f99531819f5c32624753cc0756c05d242f65dd605d92"), + receipts_root: Eth2Digest.fromHex("0xf3a1e8f784ee4bdb897d1511ce642276e2ecbc1f21bfde9caf7c4479b7fdf902"), + logs_bloom: BloomLogs.fromHex("0x633d228aa8b2b9f4b614c4b7c7aca616232d61bc6e06ca28f4b94bc39165cf3ca2e090cebbe8a5b66b161d92e65099503327f9f2adae6ec5a73463063a994d73f37e12caec8f6d439be7520b48b25ccfa8ff64e6884b7e240c8dfd0100a23f9f644da13f1628d989eef92806c9f936a71f470d710653355acd84fb23ff15910f1d2866d83b036246c46a681e762b9a19e72aab21b428c4710511d0a39cc5ec39ebf3aecb5c19096ab32135a629abc8cdec39b2b3631bf4e86bbfb824276fd728bef454ed981e5f9e8a4bb96b27f09f661c5c221f63a26945174162496496c9bbf38cd894c50fa69df0a8c722ab48d75044bf43468639ae9b61d0b5a2f9d819eb"), + prev_randao: Eth2Digest.fromHex("0x3a0689ac32c82a6b84d3230fdc6e2c1e89671fa3906336ccde9fb7cfd1811ac8"), + block_number: 9465334901279616671'u64, + gas_limit: 17844363972830076325'u64, + gas_used: 9534663249377184661'u64, + timestamp: 15490999633909732541'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[199'u8]), + base_fee_per_gas: UInt256.fromHex("0x9fc9f32819a67c4aebae259b0648e2b82f526ce8eef8fee33961f9fc69653b2b"), + block_hash: Eth2Digest.fromHex("0x1ac3f16da76520977c5e5d86f0c261d76e18413c202e8a46241951b3a80ca601"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[223'u8, 37'u8, 18'u8, 125'u8, 208'u8, 57'u8, 114'u8, 113'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 181'u8, 143'u8, 219'u8, 145'u8, 77'u8, 39'u8, 126'u8, 173'u8, 30'u8, 59'u8, 70'u8, 205'u8, 51'u8, 16'u8, 213'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 0'u64, validator_index: 7432737887980948854'u64, address: ExecutionAddress.fromHex("0x1a99860ddeecae3195a051bc0a0fcc37d0135e37"), amount: 921585'u64.Gwei), + capella.Withdrawal(index: 8891974894683849035'u64, validator_index: 18060634568259374245'u64, address: ExecutionAddress.fromHex("0x53a6cc4c3996f0181cfe62be861900f56cb75a87"), amount: 235145'u64.Gwei), + capella.Withdrawal(index: 11531749110606308043'u64, validator_index: 9858359378531619375'u64, address: ExecutionAddress.fromHex("0x6b7a4bc00868b077f1c4aa53369e893162bcc384"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 530041'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b7853973d34b1efe7722be5c688589b49c1aaa9"), amount: 18446744073709551615'u64.Gwei), + ]), + blob_gas_used: 9156166815001018661'u64, + excess_blob_gas: 13354810927429053716'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x6ce4fb12127809ce5bee8b8bcd25790df1df55b636f64ac7cf646af8d20e4cf3712a03e55b77f37be494658cc79beecd")), + withdrawal_credentials: Eth2Digest.fromHex("0xf4192de759e26b7fafdb9342168586029f4526dc67ee8b161dab7e057d060176"), + amount: 6209827226225403552'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xa829b6d810883c32466e2bb858bfbce89865f1d3fd71883e4e8b8d7df83c6a18e96e477249a22f0a7b16efd177b982e043f3cce23127c95fdf4e809903a5a906103c25ea6fd36df3f61c3d7feb00ad49937ace39c5ea44767d7f627d25572156")), + index: 6407923788439683512'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5d0d1f7e35e59873d58f7a723c510186deb7f03b3fc0074d1d6ba90f49ccedfe7b262b18c7f362a7ef81acc98437e188")), + withdrawal_credentials: Eth2Digest.fromHex("0x0221b17586adfb32e428829e7c90c7e5d8af40f26534a1e82658d887358de265"), + amount: 3864819260875678713'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xfec65da38278820cfe4168de78631f7b100146cec2d4aa3002ca3a783e81ca95954351666be524ce681e4a5799f6fc47a092baca86727cbb024013415c832f8a45346e30759753c39bc6e5e17d963f7b7483f4bbd3cdaf7707ee5b51448c2516")), + index: 0), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x2ffd86a5a167ed01e994b0b42077e5df2d9703560c6e8d986a8025f28c316ab4f91bcf3d0fb285c66bd9558e32165f8f")), + withdrawal_credentials: Eth2Digest.fromHex("0xf2afb039d649f80905f7b2f37927be964d1c8be69ff51afefb87d597d03cfacb"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x7132e4495443a0542cabf627dd5952ad0e38d000d166045c92b3360835de266511383429cc8980eb54730d8f4ced119e95452d3fc53c8a6f02da22239376356ed9bef153b632b928314835175d493dfb402f4d07ad262e9330baf5f3cef7b000")), + index: 8224197877093273527'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xa6ffac664fa1f64295679cbf163ad8f1716be062460e2a645c87d11368a4119d4138311d45506867c8c75d89aeb905dd")), + withdrawal_credentials: Eth2Digest.fromHex("0x7cb1f70fdb82a4c7b8415df98d90140ec58fa6422b7066b2da2d4bee20d95d65"), + amount: 6485560087895553151'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xbd837ceae239191f7e958fabc91efc7b3830da9814f4d888ec278ed0fbf870e811db948bf81377fd53339db9095f3c71b36de09b6f5b38a18caba6d3e8f337bbcb107380ee3d50058e3d266653860b1c6a9309eb60f142948f53041a07109f4d")), + index: 2237248193846176262'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x614d16bedf5dfe9d06171e3ef50671e66fadfce4"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9f92a4aa0e58f82ff2ec0bbe4aca6d338fd08ffff3213f64bef81148f7dbb163eb25add8ccc540ec0dd1bf9d237e26f9"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x4cff44c8f0353fa6dee31f6c87e4b8c3bcaf1c38"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x3166f8e41daae4a0af1549a00b95ad9280d73e91a882d49c827bc078c88300264e7171cbbf50e3598da77bcdb175a203"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ConsolidationRequest( + source_address: ExecutionAddress.fromHex("0x6a8481544d310f4ab07679dc86cff400e403f789"), + source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5a89a8355effbeee155130234f8cb602f5648a01290f216272d532cf8a6c2996a55875a804012d4dd2217d4f11353b94")), + target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9fe9b12de144e810792b4a82bcbaa538249fd5809df54b5a83f32fc9f290b4ce222575e589d59291cc9c0adc4ccedb8f"))) + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xc51bf481df9be981c6656081e3854ffcf27551e2b4fdaed4ab12b355f247f4e1"), + fee_recipient: ExecutionAddress.fromHex("0xd79098c25eed05c9f6d55e95f5f6f58c1472fb28"), + state_root: Eth2Digest.fromHex("0x1a6b1eb78e5ac155d4be247a3b48d8d8d8574a16fa846681553037629b97ffd0"), + receipts_root: Eth2Digest.fromHex("0x5e44d4a3621cd8e495edc0b208f977c8d3f8e79a78fa7ecfc4a0f6e436f67b71"), + logs_bloom: BloomLogs.fromHex("0xe2b0dcfd2341ceb9c4edbc7115dbd6ed5f1c54ca39bee191fdaaa34368acee93f48561094dd23a3985ea2c2b83d918ba9dc671cde7732a591b4f9abd2eacf9d6416ca8c8d556052a98df2cffdbb086315585004c51c76872a06cee7d318f4845c0ade4c907c7933d4d883bcc586885be04ca9149e05b1624856e69e1efe8c93cd55d840bf71279293a118d51d4391fcbf4e6abe6ee50492ff2de085069a3c7656eb3a749d6bf46f56a2acd93a6840eb78e09a42f23fdea69bfbf017f4fd6b4a8d17df1aa5147c1897fe5fda1f5e79121f2fefef97117e7871d1cbf5b0b0350b9fc497c5aba27cbc129d452d6a60effb76e08b890d0bb856115fcfe3966359fda"), + prev_randao: Eth2Digest.fromHex("0xcd6fd69596cdd7df95e0b68e8ade01541b12ed15caa2b59803a4c4e6791870d4"), + block_number: 12264963829660560313'u64, + gas_limit: 11775806146734810959'u64, + gas_used: 1863395589678049593'u64, + timestamp: 5625804670695895441'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[183'u8]), + base_fee_per_gas: UInt256.fromHex("0x1443705192ff4dc1a819be4f22b8dcd6e7802337e62082880b1090f44a27d0e2"), + block_hash: Eth2Digest.fromHex("0x68da52444eb5322f3a0bda6bdc9a3a11a540dbd22026bb2d24862bbc32af9460"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[212'u8, 80'u8, 176'u8, 133'u8, 132'u8, 119'u8, 233'u8, 131'u8, 195'u8, 118'u8, 54'u8, 94'u8, 129'u8, 206'u8, 47'u8, 107'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 31'u8, 192'u8, 94'u8, 136'u8, 120'u8, 228'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[114'u8, 23'u8, 239'u8, 220'u8, 169'u8, 188'u8, 213'u8, 179'u8, 223'u8, 129'u8, 189'u8, 50'u8, 158'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 109465'u64, address: ExecutionAddress.fromHex("0x30376c1737df493e34318acb7efa0aadd3d78738"), amount: 419309'u64.Gwei), + capella.Withdrawal(index: 3744271566165938073'u64, validator_index: 162930'u64, address: ExecutionAddress.fromHex("0x9a3eee4729cf5ef57a1c4aeb474636461991270a"), amount: 9043308530560640624'u64.Gwei), + capella.Withdrawal(index: 10893292846301120513'u64, validator_index: 15952780188276928656'u64, address: ExecutionAddress.fromHex("0xfccc1279aa3dde74ea08b699fecb4481c777f259"), amount: 5614376920521492084'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 2895353066704396409'u64, address: ExecutionAddress.fromHex("0x7e8b34a029236dc0d15db19153165d1eccab05a8"), amount: 3749025806369957542'u64.Gwei), + ]), + blob_gas_used: 0, + excess_blob_gas: 1597862542620394734'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x324b63f48d1a5e1b0858799c200e774326b0487e3037f048d20462065e42065d189b1419b018b06becdeb7ed46eacec6")), + withdrawal_credentials: Eth2Digest.fromHex("0x98b06ec79f8c27a94d13de9774ef0e8756a08650654771aee335ac0c4f14a36b"), + amount: 5951406920150253456'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x3cffce51a48cb97b5ddc300c82cecad819bf8d7220e95785908969adc2fe81a4c54ca561b751f8f8afc987bc232b75c3fc590368b51433370bad030aadb7a9f7e5975aada8f6c8f8954fcde7892af4f957daf88b544594d1094ab10072e2efd0")), + index: 6209810282279082517'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd40cedb2ee345c1106a11b9df2b99b7bf6c87172052a084b7f51424b0eb5cff3b9de788124974d89ce20bcc41d12a3f0")), + withdrawal_credentials: Eth2Digest.fromHex("0xa31f86305d23a833cbc2f0ab5bb3d7eec6418ca06e2bd16368cdfd849b43a592"), + amount: 6087805632659367228'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x7a4df2b27bded4e1cc2e20120e70f576e9991369d77dfad54186d3067416bfe1f7cb7a1021a9c0722370680367fe4c12e571902c2f4ce4c2754a4738c10ead67b1d9a1a82b2ecd4ce3b6567c87e0066c979664bf79025851cd9583c5ed2f7c2f")), + index: 4361690020859323832'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x9c2b1570328c29ef47c715cd021aead97695741e"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x6d3da7dd6f61e0818830bf11df8c91af8be664041d8832ca48b0c90566963acaa54695da7fb9ae2904d1aa0d7de5dcbd"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xf3fff390ae583278167deb91dba09b4ba089acaf"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xaeaef2b0928efd727bab75c3859118681492d7aaa0ceb7cb0897e21d4689ce7a6a9306850b2dbd801cb3ec165bb97d68"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x9a89ea1df940046760d3a84e134ea525a05a91fd"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x7afe11eec6aa2da5eb2bb7f9c6f2329ef9b9c17cd2f2ea35fee5e4169bc4e26c73c30cbbde16cbe4ae2351266454c31f"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xf77580ffa7329925db0934de5f3667b1a32effd1"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x3f5026c08a653bb8cc9f46a5cb1c35200c43efb6c44f729b48d12400828f5029fdc88f4672f1f9393d7d764ba3599bf1"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xc61710d4969b77326cfe3ee23b65023c23e8789e"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb2952e0f7d6581c3032f95f4908bf76f6df8d7e866b7b67996254597ef73ce9a15dac375b78a3456d4f7f156af2b5ed5"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x8b3e7e8d447527b9d00693389928260e7ea9da6855efd99369182bd9c213988a"), + fee_recipient: ExecutionAddress.fromHex("0xb45716c9aeddeb030c0b94202fcb97bd75a039b6"), + state_root: Eth2Digest.fromHex("0x8114b285e5f3277c04a66e660fef3b86295d6ca859dfa216df3309c0a7242f2d"), + receipts_root: Eth2Digest.fromHex("0x2a3ff38541ef83faad176c3c98ceb5c55622dec83fbfc5a19bdb27646849e852"), + logs_bloom: BloomLogs.fromHex("0x384a9b3d38d343af68d00c229e79aa31f2059e17c655f5e48d31d2b59b769660e91c1e5f386e4f7dc83f2570029a6f2b3351623fcb4dadd6b5b7b26e27de19e248ebd970a9678b69403ea8e16fe88562959586fcfdee3c407fcf623c94891a2270ba1829bf2ab77fa32913bb11c8a4a69e9baa6544ad336253637626b16d4a98884e7ac7d6c1e697a9435b1e5403b5122eebddec9c03c8a6c8fed0d8877888371e133fb837d33f073375f7e1536abf622610734b9b0aced8a891f02d5b35734e58b0ead66c49ed9f898b8f27e9415275c5d15051ec00cb006f8aef702a7414aefacfa9742cd3d8d34be817e0c731696e20b973cf2da66799121c0c6d12bc835d"), + prev_randao: Eth2Digest.fromHex("0x3bd54c7151dae2ad524b4df0d4283e3641ba787fc76f54221dba3a2aa556a1bb"), + block_number: 18446744073709551615'u64, + gas_limit: 637978774023867007'u64, + gas_used: 15110835166938431016'u64, + timestamp: 18065456863038184935'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[235'u8, 229'u8, 162'u8, 249'u8, 154'u8, 135'u8]), + base_fee_per_gas: UInt256.fromHex("0xbe93cc3dc2bb7e012db659df49e57653bf6ff21354c64eeb69c0002e9f933035"), + block_hash: Eth2Digest.fromHex("0x46cb3f590b2fbce372e67968a0d2ff4ce1b2c530fcc26b7a24ed6db054f52035"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 66'u8, 215'u8, 40'u8, 223'u8, 195'u8, 43'u8, 228'u8, 225'u8, 244'u8, 34'u8, 14'u8, 117'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[92'u8, 46'u8, 215'u8, 218'u8, 71'u8, 99'u8, 115'u8, 119'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), + blob_gas_used: 1, + excess_blob_gas: 1, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xe4bed2d5de111ca1d0a77bf6006c09ced6c6cc89"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x814d7cd0b6d428414fa787584e1eb52a5f215b8f0e7792499365f465ac43f5696e8d18ab579568c348f6dde75c189301"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x95137ca91b36a9a753441d911bdf91677931615c"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x0e223fadbfa2985e293f13e083bbe22a9a208d0e9f37fd99d24be92b3e329d77f1d40d61b891e2bdfed12ca746eeec50"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ConsolidationRequest( + source_address: ExecutionAddress.fromHex("0xbcd0cbd6a0bf406f2af8b28c0d7509f80bc020ae"), + source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd51d34ca13ca3ae5c9f2821414457e0a0e19ac03057e84371954b0f20d4e834997d9592c9e5c3b548097a2497fa4b230")), + target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x097c5ccdf7e60c886c2fced51dedd5be62f20aed504898cb89e215d655bd5cc450a2219b805717497c978c1fabd7faa0"))) + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xa4854e346d2e9a921cc6b3c4ce9fc739c99795cf10002924089f9886f8624d59"), + fee_recipient: ExecutionAddress.fromHex("0xa88781cf69a1eed63bcc3a32b6f9aba35d4f5b5e"), + state_root: Eth2Digest.fromHex("0xdc06d9210fd2738b0fa9df6d68e4ffbfef0dd7d7d8093fdbcd97ff845318cf6b"), + receipts_root: Eth2Digest.fromHex("0xfe1b70c143066edc444f9b49e778cf6db0060bd4e9122564350cf23061830439"), + logs_bloom: BloomLogs.fromHex("0x095a57c3f2d97aad8692cd09dfdd8388f1bf9ef98a1c3223ecfd0aed17d8c7c3ef593d7f09ba86500644deaa676df811da501d572f342e3f7ee7b9b081992f344f71fa50b3b9635d7375f67dbd85a0b1ade3d8d4778118df55b90c44f7dd1114f2ebcea5778b32701ef94af9b3713d1fe00275e09c7e918d7c529a37aa9de3464eb6364812ec486464ccbf7df2523369fdeb1b28955e35e8685c16f07fbe342edd1bc044021ed480bf4ceffefb13eaf4550c67ef8a5079f3f612f07fff60193eda6ac11d39f3056c41ea4355ef5ef7f311493c415cc8c42cb30a73dd58098262acebe6d901e4bae26b6e1eba693c7dc596ea27b0cdd4fee2f6450ca8b50b1a70"), + prev_randao: Eth2Digest.fromHex("0xc52844ad11072faa2222ffe9cbff77dcc7f681367d2aef5f1c3b206140064195"), + block_number: 767785029239287422'u64, + gas_limit: 15062566578072747104'u64, + gas_used: 7648884410596067087'u64, + timestamp: 4380084205540210041'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[217'u8, 40'u8, 125'u8, 94'u8, 156'u8, 71'u8, 79'u8, 66'u8, 117'u8, 228'u8, 173'u8, 189'u8, 115'u8, 41'u8, 153'u8, 226'u8, 130'u8, 21'u8, 108'u8, 194'u8, 206'u8, 218'u8, 141'u8]), + base_fee_per_gas: UInt256.fromHex("0x436767990abff9288346859c6b85b8a972421619eab2253483385c8151cb2016"), + block_hash: Eth2Digest.fromHex("0xca4f05c33836d82aee8230ef660016b993bca4aaf9a7b6cad96c2a0193eb026c"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[156'u8, 143'u8, 203'u8, 250'u8, 238'u8, 137'u8, 34'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[64'u8, 44'u8, 165'u8, 9'u8, 1'u8, 211'u8, 27'u8, 108'u8, 166'u8, 61'u8, 119'u8, 11'u8, 222'u8, 85'u8, 48'u8, 185'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[165'u8, 95'u8, 221'u8, 213'u8, 229'u8, 134'u8, 185'u8, 221'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 373208'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1ef66a8127bdbf1302c13af1b2a3fde17f1e421e"), amount: 12972917955689502470'u64.Gwei), + capella.Withdrawal(index: 7007268656739027478'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xca30e17b5a7925b1a5afa06710d6cffb4681d2fb"), amount: 13141021224557402822'u64.Gwei), + capella.Withdrawal(index: 10730268187610256048'u64, validator_index: 7483561449283560970'u64, address: ExecutionAddress.fromHex("0x84e755db228c9399912364a239227c467477e076"), amount: 16091384671148001130'u64.Gwei), + capella.Withdrawal(index: 861292'u64, validator_index: 101133'u64, address: ExecutionAddress.fromHex("0x70e7126e6288dd8559b6bf8946b98fe02bc53e8f"), amount: 5439105246644982514'u64.Gwei), + ]), + blob_gas_used: 2533380168586417970'u64, + excess_blob_gas: 307516487526704997'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x4dfd0237e85c7fa842fe25ed710e4b9394731e38a27f2adaf03f7c15c0478917d31d93b7acab73f6af454e86dd24b99c")), + withdrawal_credentials: Eth2Digest.fromHex("0x6cacb6bd39183416e6bbef6f4725e4b1ddff84fe80f4630183f2cbed9a23e135"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xe7c07da5cb5f8fda5223db042db39643418920beba7e66d1e3bcc3ba6e80170a6846caa6d67a544b3863f57eadae7d86d09d3767a20d1568b4796b32288156dda21a6ee036a47b51a806d2c27724e7ee4f974bf03116b85184a8f41c53f068f6")), + index: 0), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x7fe03a03b1e91c134ebbcf8d3f80cb282b2f8f06659e80681aeba55b08353fd4306f6ee71be7c1f3e64df0d3ca945a15")), + withdrawal_credentials: Eth2Digest.fromHex("0x656c24211a240b215d2a7d97a5410fe7a182e34b255e11627d03c51fb9e5c3b1"), + amount: 14255636113874187022'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x8e0886f9bd55885f102852f38c980d2bd9304fab0fddc803f4233251e4c5ce891fbd53d8079dfccdb67dfd7f713fcab0c4f9e10a6cf5cdaeaf9195827b6579d36b8822e24631c1c9022d27f99cf414396f3c889e2e24d58d547d79c27291e724")), + index: 12470930277850569937'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x629474c4e5a9d1ffc7507e388d86eed83cf0762eb404ddb5860bf575ef4f6a7ff3dce8a63a09375e3a9a5a49fbc6fb72")), + withdrawal_credentials: Eth2Digest.fromHex("0x48c7a56b506f4838f3dafa9ba67e43a3aa2b681faa6b573ea68acdf55679f15e"), + amount: 14112283334180796705'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xc614759dcdc309a46d9f24ae6b2840625bc5ddecd802c2907f9141d9091966e3367d78b3963717877a6110d741f40b45486acd32ac0e7bf1b4c36e681411570a7d1156dda127c1c5e5c6011ff857222ea51086016c01346e6cd2c8764bc7e7f4")), + index: 9892892756897161299'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x9892501906b7abf06fdb6893b8e1767884bc17f5"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x30099e0ee2adf0d51a0a96d10fd2fd5cf6f17cdb4b4ea88b5a0e205bd10d40319595e0403891aaa1bac82b980ef76f23"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x5e7b12465e0461e5dfa59a3254282378c55961b0e411023ce89d968bbdc33e9c"), + fee_recipient: ExecutionAddress.fromHex("0xbd1a1396ab49631cc933770944996b294da97d43"), + state_root: Eth2Digest.fromHex("0x74e6ccfb15da8afb94eebf28cb3ba3f9ce63e3354097f2f2527fe1cf978e76bf"), + receipts_root: Eth2Digest.fromHex("0x8e48bee56e149d1851cff0740ceab06767bd0e819261c5a2f75dbea382a110b6"), + logs_bloom: BloomLogs.fromHex("0x7894fbe58c624a153dbb160c516c9e82bd0cacf5f347f984efcca9450e9a20b50e058ed38e41c331df61114086f8a6b8a049467d7dafd812953aa593b2e9fbc056f0dba80973b2eaae8814b5e0804300eeea15613e59c8d34339f58e1b45599361497a3608c05140cf432e7983a30985aa0faf45dff56dce99eaa5ad3418722df17eaaa4e8df25ed1d9eedee1390e6440c4c37675182dcc07ff199d6dd015d3aa03194765e85fc0d4759d3c693fc2550e50835b88ba41d10fc33b58550d813abaa75bab39c0fbe419f1bde8fb82db9fcfb79894faeed84b2314f115a8fb9e276315ccbfb8e9650571add358f594ff2fb4ab9661afde76081bb2cfbfd2f26d212"), + prev_randao: Eth2Digest.fromHex("0xb9a9bce05e42cf3d2ffc2c2ea95164c9b215fc8e440dd2985ca24cff40e32780"), + block_number: 14460352585391846826'u64, + gas_limit: 2426408612341958329'u64, + gas_used: 13656152006197676019'u64, + timestamp: 6263571560389404595'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[177'u8, 36'u8, 79'u8, 26'u8, 164'u8, 59'u8, 182'u8, 88'u8, 223'u8, 22'u8, 79'u8, 197'u8, 109'u8, 53'u8, 53'u8, 134'u8, 244'u8, 84'u8, 146'u8, 158'u8, 234'u8, 252'u8, 188'u8, 175'u8, 69'u8, 51'u8, 118'u8, 101'u8, 242'u8, 0'u8, 51'u8, 103'u8]), + base_fee_per_gas: UInt256.fromHex("0x997e6c8ffbd1ea95e875612109843c6cdfd0c6bcaffa1e06ba303b3012b3c371"), + block_hash: Eth2Digest.fromHex("0x9a7f83cf6a64e153fc3316244fabd972a49ebf5dfb173d7e611bf3447a175c41"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[137'u8, 103'u8, 164'u8, 112'u8, 136'u8, 91'u8, 170'u8, 241'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 12452742873210027116'u64, validator_index: 163643'u64, address: ExecutionAddress.fromHex("0x5d09dd69d2b2370e11b21d758bc82c2a73ee00d0"), amount: 12246034467900494037'u64.Gwei), + capella.Withdrawal(index: 256915780184525584'u64, validator_index: 364410'u64, address: ExecutionAddress.fromHex("0x40a55ad4a156caf112e2abe789554520814e48a1"), amount: 297315'u64.Gwei), + ]), + blob_gas_used: 3541847679255581458'u64, + excess_blob_gas: 1, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x0040411f8a57799b620765d6125d09ab8aac3074bd7ad75c4c02c99e819e63ff37882940702644921ef7509d48e45c4c")), + withdrawal_credentials: Eth2Digest.fromHex("0xf601917dad8bf2e472ad4da2affd60b710264fb1802aacbe796acbae3bc26930"), + amount: 3582020308334691622'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x811ffff27712770001d25199c5f1689ef102362da9a617fe7a9db13b50949c705defad17795f52d4db786e80ee3b963b402f5cbd4772bbca81893a104f091a2b11f025287250200fdcee4ad1fc20d24cee626d89c5d05360e9d19e94c8e129d2")), + index: 9118657603155344378'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xeec8485a98937b5c18d52d02e8e52ef6a72ca2d0fccc367816789d49b9596e1814b63a3efbc4faf11349f360abbdb046")), + withdrawal_credentials: Eth2Digest.fromHex("0x557778b1a01594a2fc0bc05835de388ff3c141bd3141820c286fe114ad14e80d"), + amount: 5881642850443225888'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x967057d2edd3b53ae9fb665fe668ab2319403b4f8e4620064b11f0933f9def18d952cae5f50395ffd1a8e8554604d95371b7643386df808a18c913e186a7a915e5a5c65908dd6668f2c0d02e404eb88d3499c096967e93b791d814429caae9a2")), + index: 7603599240231509693'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xa8f90a617f1f230506d200c6026bd60e38f599930ed04f90cdc320a6d45bb022"), + fee_recipient: ExecutionAddress.fromHex("0x3531157eaf2c185bd8720f3edfaf76829632f07d"), + state_root: Eth2Digest.fromHex("0xa16f8936e945ecd45a4ae107e46acd8530e438fa1bc8eb85aef62afaca1656da"), + receipts_root: Eth2Digest.fromHex("0x3e76522c8f3b7e8d8a63f4968ab15413b8bbd7af9782c4878b52213b0b3d13f8"), + logs_bloom: BloomLogs.fromHex("0xc13b59de763feaa39debf70d280364ec68eb578af8a90aba7e2cf3a6cee413a28836c674662a0283df8ff04964eb928de97a3883226950b584d773c9b4479d6d5bda6fd71951c0c846752ed688e13dccff947b7a6c81bfac198b6bf785bca7be28bcf9a208b983afe6e766b0536311c1c12b4d01c712cdaa167ecec5520395068b1c1f939d20962de1aba36454cdb36031fa0ba886a8ece71234654e8b081562452046a388ebcf3cfd975493833ff4e146d5e5ddb061d994461ab8b468cf1d6d491d78fd8923f9f6563e3fbfa72639de993701ff6214fd83cd3597e870dec1c1e788a4f01f881c48e57b07c5a217132658208d2221a86c7e9823159984d235b5"), + prev_randao: Eth2Digest.fromHex("0xbac4a9aa16b289584d13abe3c47a58dda713c4b479ee70e1ac7b3b698e8505af"), + block_number: 4839752353493107669'u64, + gas_limit: 4713453319947764960'u64, + gas_used: 3470256075652600568'u64, + timestamp: 13764471837770950237'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[60'u8, 109'u8, 153'u8, 55'u8, 17'u8, 196'u8, 17'u8, 96'u8, 202'u8, 173'u8, 16'u8, 189'u8, 165'u8, 107'u8, 68'u8, 230'u8, 238'u8, 62'u8, 199'u8, 211'u8, 244'u8, 83'u8, 88'u8]), + base_fee_per_gas: UInt256.fromHex("0x3adad83f48e34c6220dce41ecc0b09f9bb1ae4bda4466935c70e7c6cd54e185e"), + block_hash: Eth2Digest.fromHex("0x9183524f908425608c1e3a80d7c4ac2c539903af4b3a2f1b22c3283281706aba"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 645596'u64, validator_index: 248698'u64, address: ExecutionAddress.fromHex("0x124e32ea8d0363647a58a5511b6de35bdd50236e"), amount: 18446744073709551615'u64.Gwei), + ]), + blob_gas_used: 3410596457491766161'u64, + excess_blob_gas: 0, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xea1c8a68747bf78cf13fc0035612547fa9b98da285369c234822eea879ad1c86c5c7d5516db5ca374acc023a21ce0477")), + withdrawal_credentials: Eth2Digest.fromHex("0x6cc96c66ac799953125c24b4311e703728b294ca302ec0dfe5e82fcbfe3636ea"), + amount: 10141350867210496320'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xd6a92f4de599923ba4955c360b2cd54bd544e2b75947127fefa9ec08f5e53cf02bf398b63a0420226dd356fc5d50683eaead8a5aa8a6d4fdbe62296506c813e5e02a2513b6457c1ca408e1189fba32e80d74c48e389f62c7b0b0ff3c1881ec55")), + index: 14462442824619447645'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xf55f4b626328f2b7a725d8a3f8485072eebf7f6e"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x3eb1812d045ff1d2f7d96f919c41230db2993ed8194de6ba564fad54047e3b45fb925e5216cc47f69e184a4e2c45ce39"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xc914f63464f3f1588a32d3751900d415bbf1fe002c42068650f5c7c588b1935c"), + fee_recipient: ExecutionAddress.fromHex("0x61523b6add59cc65d3c5b75c6f749fa601e157de"), + state_root: Eth2Digest.fromHex("0xe84ecb995f6c7e753355c8d2e24694441c528b65ef9b1d8c6f4e9d98d409342b"), + receipts_root: Eth2Digest.fromHex("0x887bdafa340c24acb58f36a7e3825ce39fb7e0caaba3a9b63f78d2186cc6994a"), + logs_bloom: BloomLogs.fromHex("0x1fbd358ad7e32eefe4489b6c72bafcf6dbac109970e5c103e329279cede3619faf1309faf266ba155496c19565b31562f31539c98b6256919d8950bb6eca937401d91fa5b3032b4400ce6dd60a8c1c6cc94331b7e78d7a350ebb5d6e04a2594af981f167a89227c7c902dbb8eac3d7b54177d85214a6ef57b50da82b6420cf914fd63171f0b7dff9233bfaa2069774b142a136c5183ed4f57cde2590735b19ef549ff5bc910477b98344e7557ffc440b03d56842f356a6e223fd052c6272e24f43dc9e64055c097d81b56ecfd6087238602a743e09c383ad4eae6ef449570febdfebfefa347f06f480f319ff06365bbfae16b62a950143f9acc3663510356f0c"), + prev_randao: Eth2Digest.fromHex("0xc755584f86084ab2e62bd58f25dfe54538c0171e6447e7e1a51cf05db94377da"), + block_number: 9276126375553452674'u64, + gas_limit: 9007257403963034102'u64, + gas_used: 12806310385580231715'u64, + timestamp: 9957937708118639445'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xe2df33500d1162994934e9fa65fd5db641b0be2b61a6c302c7b9019f86042338"), + block_hash: Eth2Digest.fromHex("0xce58ef51926a6eb4cf2997c4ec771b54907737ae8fe9522fc316c97a1c7ee6d7"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 16986670237072862757'u64, validator_index: 701065'u64, address: ExecutionAddress.fromHex("0x50371592a27339f868b9ef63f6c02e8c1e72ce94"), amount: 3561319411833205205'u64.Gwei), + capella.Withdrawal(index: 2402770018709110103'u64, validator_index: 798632'u64, address: ExecutionAddress.fromHex("0x9d42c6c10cbc0b04e3f2e74f63c777802d4ca064"), amount: 898967'u64.Gwei), + capella.Withdrawal(index: 944680'u64, validator_index: 507423'u64, address: ExecutionAddress.fromHex("0x640d578aeed6b8a9acc83f13343f3139fe8f4a15"), amount: 941781'u64.Gwei), + ]), + blob_gas_used: 15366131400223670470'u64, + excess_blob_gas: 13352270791962864689'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x1e9d9b4c3b9ade4b4835d9ca67aab333ec3019b775960c734627ced08ff62080f47879339cdec66a6e3c6c54adcf5004")), + withdrawal_credentials: Eth2Digest.fromHex("0xfae4f9dfdeea6379f5623d452670c431331e5cff819bd1f3d1cb24f5f34135fd"), + amount: 18192096631954481393'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x0c8407a90cf206e5233d3c702e23dfeb2238ce281cf00764fdfb3d12708babd45d21767373a0c57231f20d2479cc0fcd88b58547c0281e76584f709b1afe4ef4bb0b65db3a3bf9f87e1e11fea88caf23b4ac9d9b84efdfae174628bdea84c7e0")), + index: 11885726942708777117'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5ffc8c61c4ea561e6de463b54a9b09d9d467fb3db6149c40e5f0006c1840e605bd26b92414e61041c6c9f7527920d346")), + withdrawal_credentials: Eth2Digest.fromHex("0x77e707557d73e53cc2ca694428e99b2acb9e56cfe0f55afa5e58772a533e9e61"), + amount: 699724654155768223'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x597938ce07c7c767bf0ac21bbdb56e9696db13044da930cf916b01648db8ec1ef4a989e483b79a381c2de2cd42a5a01ba96df21cbf71107330eb23e5de99797ddec2044c83576a7567238230d8fe19f421986761615c6ce1cb66502911c65e56")), + index: 2345813180163742962'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd8ac112850aa690da757eac4bd7726d222e04c48e22ded62e24880fa4419948cbf5a2325fe3e1bcee205f733a308a39b")), + withdrawal_credentials: Eth2Digest.fromHex("0xb796c0757bcc940a422de5d3f8fc4aa130f7c9db954846330a23dc021bea4b61"), + amount: 15859650167034453942'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x2f470357ded569d4fe968b5da6619cbeb414271e71ec7abc8e0e6c7c962b1932934bef085f682bc6af358670bdaf80572dd4ee3fdf80711e60205868aad5859971a858f30eaeee2883bad62b5c4e6ada3ea38ae1ab516f294a16b18c099fa760")), + index: 3956355178667798015'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x98410af351e5be94f9d37f7cc9f97a85e9bd0dad"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xd96132438444f4582e21aaa4950d907a84d56f5edaf5d4262439210d6b6aae00ef67d15caa1e95040484b977ba677f31"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xe640e25259ffe5aa8b481e98684b41a14f3d2192"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xfb8bad5edefcf4a76157dd4df48c345b10966ebe21c5265519a3d166ee6f43b92bc67707a7bcc478c05cb5d5aaa5e217"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x6544a67710ed5b8466aea7bb74de9e275c7a7338"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xae821baad66de4d33dc8a8ea9088ab97cce0be2f1be1243c3c640377fd57f3f7389087ace339f953d52372d198300f8c"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x48f380f0b267ceec6fbe39f80b7108991acf97b5"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x2c9a9040e72e095e347f8ba9ad33947a1ec5ffddaa2e86a112fd73c30af209625f1bf19eb7b4fcee28409707679781d1"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x04fb4574aa211ef818aa9c13135f20f4694b8ce3"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x8d381b3ee22253692bd5861ede4c0d62cb2f6c90df6afd180831ec183ac3f8bcccbbfb5fa1f3ee38d5c3871ca8e28ba3"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ConsolidationRequest( + source_address: ExecutionAddress.fromHex("0x459b669c12e0acba7faa0ba7e6233644ee3d6b80"), + source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x6d00f156d7db5c9f2a0f1dd38917c5a0062f7ed54436f35e6e363e5db15ea60434482236614e41e37a25b0fcaf19ea5c")), + target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xc13b30ba7af6c7be66f9af3bf6c6b837a54eb67a88ca19b156285327da4ad7a24205356a862bb7805ccae30f78b2bcc9"))) + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x086322b79160568c7d096747ef351338ddc93f252dab1df3ef65aaf24723d2c3"), + fee_recipient: ExecutionAddress.fromHex("0x03c6998b5a3ff1c98538c2333d279f2b1cc59f7f"), + state_root: Eth2Digest.fromHex("0x446d99a7e9fd2c327fbd445dbfb3b3e3a895cdfa6f208496dd09c0f84f7ac0fd"), + receipts_root: Eth2Digest.fromHex("0xf4c74d5c59c46f1d9f916b32d8a12939cc2a379bae83153137de76415f6e5afe"), + logs_bloom: BloomLogs.fromHex("0x40f87c3729ba599c3e9bb749c48148ee0d5563db71cf0daaad3af95c45622d7b2a64204157a92a93cf0ffbe0052fb79eef83ba8389fe9d9e7646874b0636960e4eee86eeca00ba70f65b2046620264b795852def9beebb671f841e19ce07934b7c2f66301cc3c7dfa2606067cdeb04a564b87e56ff3650c7c6bbbc96b2de5ccf8e314ae74a26347371c315062532a1f1a2fe0c417ed5d12b6f81c3440c0d8b19d0cf8a030be83ee7ada6046d75098b6ee66664ead786a65ef5cdcb33c4634aa07cd7490abc0ea9ce722423a0cba1aecb379552e89483de43dd321cdaa8a005ab7e8e2a958038ca12e2b08709348a7f6daf34c488add1a0a21aed0da0b64251f9"), + prev_randao: Eth2Digest.fromHex("0x2ff08bd0b22bae8c3627f61b8da627fc367b3a60f93dbe48de1ca6f25ada489b"), + block_number: 10605470807350562909'u64, + gas_limit: 587854351728657338'u64, + gas_used: 8799032544585725320'u64, + timestamp: 18028498231539883963'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xfbe348f0c77be2ddbd3ec038e3aad88107625dc6e96b1fb3bbfdba8c737a3d7e"), + block_hash: Eth2Digest.fromHex("0xc545e833aa2ee5d708e041f4dcb44bda654372b3f5f660c683d12230303da729"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[89'u8, 59'u8, 131'u8, 146'u8, 186'u8, 180'u8, 208'u8, 76'u8, 69'u8, 40'u8, 29'u8, 211'u8, 97'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[208'u8, 136'u8, 157'u8, 0'u8, 120'u8, 231'u8, 99'u8, 33'u8, 31'u8, 210'u8, 80'u8, 203'u8, 24'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 225873861246030158'u64, validator_index: 3132710425326779052'u64, address: ExecutionAddress.fromHex("0x4d2573288e7949201c806877449e441801ba62c5"), amount: 9096383177302198854'u64.Gwei), + capella.Withdrawal(index: 2816791477401799195'u64, validator_index: 12199871733060832130'u64, address: ExecutionAddress.fromHex("0xd4e21e668d5e8b1c097cb250dc862bfd7f8a2b76"), amount: 7278220627858832735'u64.Gwei), + capella.Withdrawal(index: 12003547154719720523'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0xe888b3288bfaf8f979c93699cbabef6c1f156f19"), amount: 18446744073709551615'u64.Gwei), + ]), + blob_gas_used: 0, + excess_blob_gas: 1233408100755176706'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x16c6ba72f97bd60af3008e747aa0045eace969dd"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x79b68340894f69a82de6d6ac26b6cffd1f84be9008f7cec5a8f740c5dcd73103e50366cb45ec0c2a0984b37597011784"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xf950853d752ff1e8dfd3ffb9bdb504e851361060"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9924a9bf1759d436f9dcc185cdb646d06af53ddf9e86351b69bda506eaaf4b47739a0737ebfcb7d734d33237eb77983c"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x7ef709dcc026c545a1707a4161948637f4c1afce"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xfe1b2e2cd818d436f9cfd7ad7e9efb8e8940bff9ac2c5094793d26f9a50f76436e25b40d375d7b9d461ac7fac81887d3"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x1e6d99ec506e2b79322f77283f3e18dfc0561346"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x25931e58a52265a5a90f7004706cd736fdb762d50aff67039d5e0242039dfc49fd6670e6f4cf62639d7debe3efe5298b"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xcfba7f4aa4ff01d3d9de84dbe1761c79627a10c3188fb0a7c8adfa0d489e6441"), + fee_recipient: ExecutionAddress.fromHex("0x106b3bcaae4ff58dd837768be35c29c48571e4a4"), + state_root: Eth2Digest.fromHex("0xe6242399020361e70cb6b89701001fa8326251e6bae3b4ca1978eded8831d9a7"), + receipts_root: Eth2Digest.fromHex("0x3db0f9a05cc39be94414c3be28378d2b91ba3ff43ea2ea7e4e0a1874a0983f58"), + logs_bloom: BloomLogs.fromHex("0xd591169a3cc38e0837a76c4d7057f94c1ef08ad5af1778b1b06c3a0ec85201bfc659b18c49de831ce6b4a40f0d2800a9cc9001f74810c58473f9b973b720f84626cc9270b0428439b985043f5d9c3289ef8a794f5b8265e10e9fb9fa53a93887d270b8204f8f16cd968e295b0a06aa70e9f6f174733d251f3bfc644a7fb274b0138729f18c0e4382bd4bf0387870f633ed897a125ca854120c2885194f3180af4b62760db96da51f88ae1cd222f49b00fbbc1544eb0e98cea67e36368816f541723158d3691f3cf1509c65a51a8e68efb66c500dd6516ca1b02aeb4e0c13cf5bbead53672fb5a7a1863c8edfaf4eb9a4b4322a39d8643528bccf22493914fa01"), + prev_randao: Eth2Digest.fromHex("0x14fec0a1edb9c82dc9aa7fb7224791c51a3937e74e5da59646123867496460f2"), + block_number: 6272046003849350913'u64, + gas_limit: 15423951135645467684'u64, + gas_used: 3743939155619454195'u64, + timestamp: 8496536260448579184'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[152'u8]), + base_fee_per_gas: UInt256.fromHex("0xd8b104041bdc4c76a9735e2b4b45f0f3612e8962f672aaf511f06a94b48562c8"), + block_hash: Eth2Digest.fromHex("0x8ca67fec04b7e3bc5a01f5bb265b93b4488b58ec2ac7f2c3ced030311de2762e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[152'u8, 232'u8, 136'u8, 228'u8, 253'u8, 248'u8, 85'u8, 92'u8, 103'u8, 38'u8, 106'u8, 166'u8, 148'u8, 8'u8, 37'u8, 245'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[58'u8, 215'u8, 97'u8, 99'u8, 152'u8, 126'u8, 14'u8, 252'u8, 64'u8, 87'u8, 242'u8, 60'u8, 210'u8, 217'u8, 75'u8, 189'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 18405055677765556765'u64, validator_index: 13513833286292305941'u64, address: ExecutionAddress.fromHex("0xfe53af2bf3560b2157a683a545d4f898354f4d55"), amount: 911502'u64.Gwei), + ]), + blob_gas_used: 11215270247452431947'u64, + excess_blob_gas: 0, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x44142d2fd3abda9800ef805779e63c7ea88068f2b2509a92a2e05f61e0fc9ad1c2272e96db6ae6fdee235dff74917afe")), + withdrawal_credentials: Eth2Digest.fromHex("0x65d4629f775514b46c0e413f9bf42f52cdf46f75a2a2b7b22e2a2a6b635adee4"), + amount: 18375333628189344873'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x436fa460d6fce0b4df72719d42d3d7e992585fb95c573868478c2ea343af6755c702fa84cd5bd6d237688d6905261c52f9d45ae52acdfe95b6de2e34127df773fb0d32d231f138dfdc3c3837f68ba77e7586f64aa5dc45c2eb0d44a61fcb29df")), + index: 11602205279250285026'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb5ca0fc53760118a8c10c994d885d409fb93f07196f7a8bad868d5b2275f925db9119903e180d1b76b4aebe2ec2bd1d7")), + withdrawal_credentials: Eth2Digest.fromHex("0x7de076e071a5916c3c122a22fc9853b6c31712c7ddfe128216bd5d87784cc008"), + amount: 8755851176211479347'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x0b7a4a77b5554a3be5f9338c31158e9f0b0b5fc95e9ef176ca38183ceb3aaf214711af03ecf194091cbc99a11aa7a376d721b3c1e27e71447828326ee811a07f4680c5a73fb52106bfe9b66eadd40cf80f027f0db90e41c77c78552edaccf295")), + index: 659556622372086172'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xa80127ae927ef2fc72e527bee414d2a899e1050f"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x463d04b11a5f2b3a5ff5d93f7c20acb46b06d8a434d9dcbbcde024be06f50b6542ebca1a759d8cf8381e7142bce4bd1c"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x91e2ec291b66f267104a11157c46ef32fd40c22f"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xc05bcf497d5e305552b041c7a239536c938fff8bc755fadd28fd907f070f7f4a5553660a3351739a0b1bec2e6ec3d2aa"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x1281069954affabc619e8092861136ada40cb869"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x781f234560ec5d2197a33908a66fcb156330141f51212a51a0f0117417b5370f3fd0266c9dd1bf2c66d47eaf98375327"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x56855acbe00c442f0d20d489deb80fc02b31a173"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x805d72db2998bbfaf07d13f5328db300ea7a2fa156d049bf072590d61dca40ae142de4a204e36768f6e546af62d7e1fb"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x722d597ea5a6f82a0f9b06bd8af0449d18f78795"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x1de64f16597d52214d1a5987abc026398d310712ad0db48d48e747e7783204579a886bbd9a58a47704d9874a83726a50"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ConsolidationRequest( + source_address: ExecutionAddress.fromHex("0x70ce642845a24bd208442a6aeb263b5d9977926f"), + source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x581a1e6d7b11b2512426c8aacdc735470ba2b85e164a65062fabbf1341f6cd994ca0c8b2fa8640d679ad481abaa70555")), + target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x17d58eca3304640ac6da21ac5a629b32573cc99602971e7a751db3ec253e3e75810488fcd60c59dd43cc80ad9cbf66a1"))) + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x063bc56b731eeeff8bf1c33d88523a04a14fa0c745eb3c750139842d88244982"), + fee_recipient: ExecutionAddress.fromHex("0x415b1cd5b42709a3724ab2f6f50a6dab7399d7ca"), + state_root: Eth2Digest.fromHex("0xf261abf37066b8dc5c868946346c98aae445adbb48e6dd05969fbb49267a276e"), + receipts_root: Eth2Digest.fromHex("0x5a337b7ee29d98e22b461f43b7a87e52d89fda2e7a3487ea92873be04a49ea68"), + logs_bloom: BloomLogs.fromHex("0x01817fd642526acdd8b57b4fc2fb58aba269095ce220ae5770004055f550918778021eae3abeffff1b3fa9fba50ff8d532fd8e2e67da7bdcca1cf9505179f19f595f5d9f09b98d5bc7d1ecb22527255e8e161ca2124c5fedbb59527f91a242671177e33a6fa377d585ebdbd6d9ff2bf80bec3695657441e35da43861f14b9a7e65ed475c323ece62d84aed7262cf3fd2b06ba03695e2e26e5e58fc5b8b99d519fda879587e3764930e3921aa15b2ee8691ea0e738030acb8832ca353d3bb63fbc0150c532b842cd053abeae8238c9ffe6f4b2b7210dc862c48843ae2a9088ecdb8c258592a0feb5215b8c9ad494ad896379d86e0ac89e6cd8765003ac5c95cce"), + prev_randao: Eth2Digest.fromHex("0xb28f434f3f40e40693b0c1726a018e2b3bc13c41608a2ca71aa5c8bf61829287"), + block_number: 14597257287993827247'u64, + gas_limit: 9090926713872599867'u64, + gas_used: 17391976671717618186'u64, + timestamp: 13439825139187707720'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[73'u8, 163'u8, 138'u8, 201'u8, 62'u8, 1'u8, 37'u8, 90'u8, 157'u8]), + base_fee_per_gas: UInt256.fromHex("0x8a42339ef76757729ef6c4536b3b59255b18d7085d8ba786275b2076fc55b3c6"), + block_hash: Eth2Digest.fromHex("0xb3f6ec11b285a105833f5b68b67e8e23c85c28df2362a13a76db705f110fce8c"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5477557954669138518'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x4b840b26a19377c64b870be600aa336a40ae46ed"), amount: 42381'u64.Gwei), + capella.Withdrawal(index: 0'u64, validator_index: 1'u64, address: ExecutionAddress.fromHex("0x3d22a723824a2944ea9accc8653002bf7d61a10a"), amount: 2799163561369818755'u64.Gwei), + ]), + blob_gas_used: 69111814634726666'u64, + excess_blob_gas: 10785611890433610477'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x027404a69d1a1a8b931d0deb6ef4c90cc23fe74e"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x144cd543ddf6cc88499595246d2373629467e69048b4c638824b8c4d82296fb635028f495c7516174670ed1c5b320462"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x748168ee6835196ae76808fe3232a422b40e42a7"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5e024d736b5c4d340929745f59b7d681eeb151107f895a87d534491b5af13fbf7bed890a2f41dc8debacf2f65fce2c20"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ConsolidationRequest( + source_address: ExecutionAddress.fromHex("0xc80ff3b9e9f68f8a64b9207600adfe37ba1fad50"), + source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9495309c1e65aa3ba8097bf1bee00be1f067910a8abcc897f5752eab5962387973e394caf9c873ea71c958c3c08e1b4f")), + target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xf1a12eaa4fe32257839694fdf8fb17083d6c35fe20d045db01ffa1b45721021b68efc2a7f7f5360493bc1f0902ff121e"))) + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xb31c41d39ef7e9a9b905cc93d82264415024d7daef48d886f1b3bc0fd6545edb"), + fee_recipient: ExecutionAddress.fromHex("0x5ad4b6c0d6b986e775f3a9ae2be73a330ba9f87c"), + state_root: Eth2Digest.fromHex("0x01dbc857a3d8994cf10cd1be3b2018be0e26ba54a5456e10a6e5729328a0b5f5"), + receipts_root: Eth2Digest.fromHex("0xa51e9cb9893bd7d73a8fd4e5267d80ddcb29d998814cfa9980dbae50ef101aff"), + logs_bloom: BloomLogs.fromHex("0xf1280db0ef6bb796e70dfef3b0bafa62690ef1e8f14a237856bae5dbe29dfd43ac789c53305ab5b0b7cc48ed53d1236ab9433a5352dac55b6e0a3ff90e9e815e2ce16fe5574c87f0066090c39b811996e2974da0bdb8bb59eb044bbb6bc2d7f8241093c7143a7c9892be85ea4284258ea2477f6a677d424efb6469724d641bbdc3f9254529b6af5cc5f5a77dad49c1a59ae37c19ffc69f6e331139b6ebac306ea09460dc0fc5791ef2cfb9e7bf29d662872e30b94384be90416df03bef5cf5a2339af4745f2f620fd1320d3fb79848692719cb8956b8efd427c9c0cc3ea6efb8f84feae0075ed10ec5c6243074e6004849712d8d1dd97ebb2948fcdf1d020c6e"), + prev_randao: Eth2Digest.fromHex("0xc8a27f0b7850de04e3d794b9e9d4f144c356f864401c3f802927faf4b88b47ac"), + block_number: 10821099926525463598'u64, + gas_limit: 7115919978619568727'u64, + gas_used: 1, + timestamp: 5900615379943209755'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[56'u8, 176'u8, 67'u8, 30'u8, 11'u8, 27'u8, 136'u8, 121'u8, 86'u8, 17'u8, 4'u8, 121'u8, 11'u8, 222'u8, 158'u8, 78'u8, 56'u8, 66'u8, 243'u8]), + base_fee_per_gas: UInt256.fromHex("0xfbaacdba879288838ff725df19b7a31148ec5a24e7989441544d6dec1c980034"), + block_hash: Eth2Digest.fromHex("0x04616c0808df7a1bc177bc48cb6ed865125fbbac2fa3e3c36f33a5f1c48a23fd"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 143666'u64, validator_index: 849676'u64, address: ExecutionAddress.fromHex("0xbf06178f996afec7c9d3cb488e812f32aafe4242"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 560588584813483246'u64, validator_index: 18446744073709551615'u64, address: ExecutionAddress.fromHex("0x1a1b89bf52af0d4a8eff759986ffd93cf4464114"), amount: 13046900622089392610'u64.Gwei), + ]), + blob_gas_used: 1, + excess_blob_gas: 10155937412879977460'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5333b0180b311e552ce6b94225290f3e948b601845d628ae8137bee6e5fc8ef65d2eb2948cd564f48f40a39107d425a0")), + withdrawal_credentials: Eth2Digest.fromHex("0x311c904177ac7dab28a516a2306e47550b373338232eb146993204120e838a1e"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xf1dad35f740e178ef1aac4df7470becd0bb2d54767c04cda321ec2ff9e74fdd9ab1e42d65fcf2e1fbaa42f0f0de36e7d58f300de706ce634886c6883b36c517cdc411c236d984ed9568f39111d562360c1f61a066b30a0e7b724b4f5bc5d34b2")), + index: 5781210920531179973'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xfd253bde6458c872a3052a365ed5fca973dad3a0bef826f46a14c866bda1bbbc1c54c8117c89ec6fb514cb358af293dc")), + withdrawal_credentials: Eth2Digest.fromHex("0xd9471e69c21bdfefe367eebff0f5500573ded27a7793f9a1f9149f6997f750bf"), + amount: 439091423098684932'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xddb1aa7c758a9513fd8ad0a0cd3332a9b9411d7a0795e08591f363b5b4887b4cd4e4d22c87ac9c62a5aed65e3325cb4451d9c37539c1a9d6d84e69f38ddb0b7fb27e6ed7d744b95f5dbaff6b17794fd627842c652884f46c293251bbc0c8970a")), + index: 16197400268122174810'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x08dbad1402daa1c3e58e1cac5bdaa36704c9d21df7772d734f4fec1f770140dd4779646794d47c4df0c55adc130b89ea")), + withdrawal_credentials: Eth2Digest.fromHex("0x3969600fb0033db2f9bf9718367ffffdc6044f53dd397042d89c822887a72bc5"), + amount: 18281837285233220396'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x655e809ad38376a8d7fdd895a30d8a1ac52861864f67e1ce885cc40cbdf3ff27a8a6f8cb1b33f74254c5bfef90de22f6b1c724e888d284438995fab628ecdc5278319435192ed259b56ab6d2f18ad3ba53aa534e85fa802e15c1a1ec9fe3b7e1")), + index: 15032238460111462081'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xc8bcdf0144cd4eb45e62b4fa76b7d5963fa912ec"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x4569a134a3f6e0ac638b19e8d88c9010f7281449f78adcbad225d11d2358790b2454504ac56209ac54cf66d5df779bce"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x308d3b908ce2fb2ebd207120422994608d8c3354"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x3deec67ff0f69aeeeddf322043b694ed4ec79aa2cd2414797bb95da5691b2b9731d3fe3d3627684d022241f80504f3ad"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ConsolidationRequest( + source_address: ExecutionAddress.fromHex("0xfa3b832100b4deb83db5776ebb5c920b88c5ee4f"), + source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xc414a06a2bfafdb6ccde87c98b99de8124cfedf66b86832cae0ada7005c4939608282a7b947d43b322918765f1cdb1fd")), + target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x0b4c6a47a37b9fa0633348712fc45033dbd7ab958c8aa8a2c99dbdb325917728586b4dab8846da152df1a51c8301fd9f"))) + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0xf6cba3ced37c08da230babbf9d1e360661e5a21ac235fefa75cbe756f15809de"), + fee_recipient: ExecutionAddress.fromHex("0x0c080349793b7f43fb3ee9101889e7d32e02c01d"), + state_root: Eth2Digest.fromHex("0x6a33580fc482e9783d66bee9276f42b74a2cbc2b7434fc408a6ba9df77db0ceb"), + receipts_root: Eth2Digest.fromHex("0xd896daff74ffd6ffcc088adba01aea52af82d861b7ff649265a750e5995dcf31"), + logs_bloom: BloomLogs.fromHex("0xec00c3385b735b6a4088ed066bdb088e7826a2830fd13a1a1525c4590eb08baeba81bb511bbf2db2c0547c69c10b5c6c1bf5c8e5a7931584e6ed8ed7357431e1e2391fc0e61a060baf8984a6fd5c04c68fe0f28f94281d0db663b1b2fdaad9b51d3a12bb9fba255c923dea5ce45dd68ec2c5afc9fd13a0e24d234a3c8c5f255e7d62d48a8e01fb5c1eaf0c7a68a616ac935416fe3332943d78eb28a48a180e2bee26e85d786583ae0609a8b98e1045738f054aa12bef97593cd16d8d795314bfff33c51b397afa2299a4a64244817e5a07cdcd75eb4c4c06e8e943d8d1db8e65f17368ab6175c3e14daad0b99fd0f1050feebadf9db8fe8f1c19ed867f4df676"), + prev_randao: Eth2Digest.fromHex("0xdcd37bc148c25afa7e320009ce19567108745ef5ed57781f55df1d73b707e26e"), + block_number: 13754339262807377549'u64, + gas_limit: 5250261236890759949'u64, + gas_used: 1335844244115849195'u64, + timestamp: 16758901654456753273'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[28'u8, 8'u8, 171'u8, 122'u8, 126'u8, 38'u8, 142'u8, 246'u8, 162'u8, 197'u8, 241'u8, 216'u8, 158'u8, 184'u8, 73'u8, 191'u8, 208'u8, 5'u8, 79'u8, 231'u8, 254'u8, 55'u8, 126'u8, 97'u8, 184'u8, 78'u8, 36'u8, 80'u8, 160'u8, 124'u8, 188'u8, 176'u8]), + base_fee_per_gas: UInt256.fromHex("0x0ea1185e0ac50d1e2cc0be7229c846528380def25f7d8860cf366e6edd793be0"), + block_hash: Eth2Digest.fromHex("0xb471874aa6e8987deee40902d59537fed8af3e9b6ae2f8b476ddb051629b3b09"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[231'u8, 215'u8, 225'u8, 83'u8, 163'u8, 187'u8, 111'u8, 141'u8, 246'u8, 57'u8, 238'u8, 163'u8, 25'u8, 91'u8, 114'u8, 111'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[93'u8, 42'u8, 101'u8, 80'u8, 160'u8, 252'u8, 158'u8, 121'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[164'u8, 98'u8, 105'u8, 179'u8, 25'u8, 33'u8, 130'u8, 239'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5378768050415100863'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0x3d84c03e4c18979ee8288bd58b24989580f0a590"), amount: 815393520574223128'u64.Gwei), + capella.Withdrawal(index: 17328504288784263137'u64, validator_index: 305278'u64, address: ExecutionAddress.fromHex("0xa00491dfbee05f23fc7ddcfcb1b27b2855334e81"), amount: 7734460020873819187'u64.Gwei), + capella.Withdrawal(index: 0'u64, validator_index: 444647'u64, address: ExecutionAddress.fromHex("0x0689ed39160f4b4c20138f300b3b2502e6d6ab5a"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 834083'u64, validator_index: 10715076713456342424'u64, address: ExecutionAddress.fromHex("0x07ee24f650e7254d10d61b832db7174128bf22b4"), amount: 17794546242151296198'u64.Gwei), + ]), + blob_gas_used: 7080212387270627767'u64, + excess_blob_gas: 17322910515629142083'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xf08f319d0ceaed0b05713852711ac610c213b902e2173d8db62f1eb6aa3a6beaca49c48e76bcc5a25ed6a16d949fc2cd")), + withdrawal_credentials: Eth2Digest.fromHex("0x166df75e231abc5e67a30cbe8f8392df207b0a203784d5cfccc8d757472defb4"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xaadc232ca2439def6d7ef995342870dd330c245f46e5cd42fcf1a86a491f65baf722d4d8cad5faf0c66920b17bbad2d92bee6db09afee46839beff07db973e8515da6c77741396a4c844400c7d5f2f9cb815a4fc14dc12e85dfa1e265c8f8e52")), + index: 11769346303267269586'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x4ea1b17de1819b452f77c0ec61ca191225cd3d21bd94ebaa8f63eaf87b2a7e131b45688d8187b5853e25193bee3f5586")), + withdrawal_credentials: Eth2Digest.fromHex("0xabff3296e33aa3656c2911cc07ed003b5520db5ad937c60b3ba70423d25de9ce"), + amount: 13132016002583744347'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xc544cafb21de7664dc3f6e49fb1d972bb9b0e84672889c29116cc08af20191c09d1078f70f5ebdfadfae76092cd5bc3328709703ec0aede57f8a339a2cea50d76f3b14b26dca2d6d66c5775190896040d91c38ebe45b642ed48a224c300f1353")), + index: 0), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x926949c6a561ac127c2d6e7fb2fac3d3df36abdb91aaf857f923cd43645bfb76bf75c4afae07aafe5f4c7bd8d2aff312")), + withdrawal_credentials: Eth2Digest.fromHex("0xbd953da5243317a12f8088fbd1483795ed953b05f49e4c82b7b95a93c7fb3347"), + amount: 12812987719379600277'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xac73e1dfb07bae2ee700bf7cd09a10a39595491047e708d4e47c7d7149f40853657ca564beda87b00e4bc164122c0973ccd9df366b274dafd8bd949881c5ad6fee9f0abcfad2677481f41ca4a5df978ae1f26d783609772706c9c3ef1c35a54f")), + index: 18434818685702059208'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x013f9a9161f2e1a9235ab5ffc2e8968cdfed7126341ab0e0f3ab176546a3e2cd3d0d9c8523542ebbbaea50b6f096af47")), + withdrawal_credentials: Eth2Digest.fromHex("0x7be93c7783e230acb77ff4fa480299c5e295f7516325b73e4c4efd987d6a590d"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x97ea0a8e3f3e73fb11ded1814f4232e8bfb1e7b71bce608f3f181e5609bdaab3ffde52b1ff98d94c3d02ffefa6b3716cd83deda00888224f24716619f685c940da205910227b976bedf7f0cfc16262e2ec48dd837509326c97e329fe666846ab")), + index: 8630770799181013738'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x4e4c648248758aaba856a20f8496700f036a9177"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x96902ac59a4940715d171f1d6ec3e03b0c1557fc0100abb930b6626917b9792aabd48ec1bc1e37737c582fe11c966658"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xa99cc4727a81a0abfb662fe28748133420938dae"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x10f3cea6d52558a866988352bef57525f708aecb5fb392af8453e306cf7c5da68aea8a544d71db63dc1057317b00feb7"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xe13404d88c1418f69c92ed12d256382a462ecf4e"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xf8f8cffff4aa7bec351b9e084274b6e47c536671bd559c7fbf110985e684a58c0384ffc314c23c4441c0f17ce33bd767"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x6f9427252a6fa414a6501e0761cf92f0839f3bbe"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x4ca4f660800c2cfa68827299ddcbfddcf2cb01c51dcaf5af1abc5e8f05164846ca26f1c8c884a3e674a22dbfc0d9fa7b"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x14bce680ec1a632aac5f77cb4d5eca52f74bd1e6"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xb4f363283d5276f12a6c2c98c58484c6a6e8e3c7f5b3adfc044d2de76365bef427f8b9ac1e321baa7a611447010f9e8d"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x62ce6a6d68578309c4730f96f98a809d4b4225fc3d37a285daf26288b10f9590"), + fee_recipient: ExecutionAddress.fromHex("0x8c892b06f1e9c877c310b6eccefb20fcf5e00227"), + state_root: Eth2Digest.fromHex("0x578f93b83206e3239c69f51cc8e59cd89087260cda9f0efc892aa2ffb2bf386e"), + receipts_root: Eth2Digest.fromHex("0xa4ac657af8e0dad66ec74f4f66b246fe0089485e2810071fa556c09ea585059f"), + logs_bloom: BloomLogs.fromHex("0x18d67e640f9ad3a24deb7e3f8cbe0ba8224cf9cb9e67b2fd6c774fac7aa3f4adca2befe8322962cf000cb89c3e352433cf1aade51ceac9fe69966a8a89f7985030a301eb690e7eb20b5ac3b315930ee5397b6d65b03a1131b94e7f3505ef030877e460e9195b742e943716d9875a3e2e9998236d3565d622216af1721b658a12fe7d82a62619b4f2d042f146305ff1ad1bf394437340735eac9e962b3fe67597793d1151ec87fcb5f0056837c5813c75c4a0f94d91da71299b3780f250ee31eb9f106e3c443f0ba05213da05177238909fd9e60de9484e091b91dead82debc020929d1f14e79b610af3d15bf9c3757e62bb32a69523c1bd576e5c5d4bc2ef0a6"), + prev_randao: Eth2Digest.fromHex("0x552627eb969604e7d4ed1e631b74b2410dea7f4dbd49511bda390e3b9da8bf60"), + block_number: 7763671958353664038'u64, + gas_limit: 3930616259240751958'u64, + gas_used: 7960068863134244743'u64, + timestamp: 18446744073709551615'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[227'u8, 111'u8, 127'u8, 243'u8, 191'u8, 237'u8, 88'u8, 146'u8, 146'u8, 236'u8, 162'u8, 237'u8, 164'u8, 177'u8, 249'u8, 52'u8, 1'u8, 26'u8, 187'u8, 208'u8, 244'u8, 234'u8, 113'u8, 199'u8, 30'u8, 209'u8, 197'u8, 63'u8, 126'u8, 104'u8, 143'u8, 30'u8]), + base_fee_per_gas: UInt256.fromHex("0x6bcd9684e1bc8f4fc5d089e0bf5fed35a8bf3039808d030bb9eb1ff7147180b5"), + block_hash: Eth2Digest.fromHex("0x9e2505de9f245873565b553e7215abff698bdfcee1dbd93e40eb295dd84e7f45"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[140'u8, 134'u8, 173'u8, 70'u8, 168'u8, 181'u8, 221'u8, 210'u8, 25'u8, 142'u8, 168'u8, 139'u8, 77'u8, 134'u8, 203'u8, 219'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 0'u64, validator_index: 780337'u64, address: ExecutionAddress.fromHex("0xf0ab5949e96d8befa8090fe5612d9c45beea0c8f"), amount: 2246589958612652012'u64.Gwei), + ]), + blob_gas_used: 0, + excess_blob_gas: 9638659159857567769'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x0d7bd99094b190c06d115f727bab3974676f30feda394294d2fd7250443e3514868fca6c749b42bf6cf70c9fbea48d53")), + withdrawal_credentials: Eth2Digest.fromHex("0x983b0d33e8325a806a21d0ac9bb262e565ca7e094d578876a89501a8985413d9"), + amount: 6392806474408369626'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xac560bee8d8dd4dad94f2bd5b480e7799f7a8445adf3e0070747f8b5724d442453fbba2f332cc69af3a450dce80249b6b7afe19340f4fc5dc54a5c0e56cd4c484c94c61480bc56c75eef44e55c1288bd58739b8354caa93da5d2502bb38546df")), + index: 7086745948630243467'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x91810ed86a3244c89274f94fd510532cf12d7074"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xbb480d96367f62ab5790cbfdeeac6344e21774681edd0afe64c50b48f4d07795e584468821788948c7d8c151733ad01f"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xe16b15a5256815cf6d338498a5cb0e8ec0d5bfec"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x79b49178606e2a5cda067c04b982d445df7b41d09d4361e5498b7a454d0e8a37a6975da56c3bd20694a3fcb467f7ff59"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x4f8251c361a23171de8648d1e96c91fea2cc5a691dcd884e3a957dc8f6a8802a"), + fee_recipient: ExecutionAddress.fromHex("0x7da9175abaf6e4e400e0ee516fd3ab07dd659f2a"), + state_root: Eth2Digest.fromHex("0x1bd3a5da4c266dd396b8209288e68be066176ebe64cd4c17c4c6cdccaf03577e"), + receipts_root: Eth2Digest.fromHex("0x16133c4fe31f0487e700514160acf9257458a6ee716be8043cb6c532f84ef614"), + logs_bloom: BloomLogs.fromHex("0x5ca3807e674d69536b33337d798deaeb9fa6c7cbab7aef1473e6a6614f6f2c74ef85ee3632612b9c1e78d2a63e0b2f58d48d71e8d62e38510bc2f307680497cb965153b43392b8aa2dcd91a766356eab3ff1b4a6c4b037d61df1a8a4c6d3fa0e3c57a299a1c0a7382052ac25c412f2d2356c302e326fa0cfb570354e31e2f8046b80e2690ba69ec7c284c2df8ad23d16764cbc0ba28516f3c31aa89da3e3286106dcecc835b3007a17f33c4962efc3c9b0f5bff14c783e414ba60d35b79ab33ccd0151c34a94efc461d0df0a994085373f33275a4cd6839603632409b670072a4554f1c9342c03cd403a6feb67b23d3a075707ca89b77bad64e24a6ab79446ad"), + prev_randao: Eth2Digest.fromHex("0x6353ec5b94b9112f25e66de48b532ff5610c63f34c50a02fdf64af6c9d0ef2f4"), + block_number: 16866969889068542818'u64, + gas_limit: 5116920640663397560'u64, + gas_used: 13292402101416991817'u64, + timestamp: 1, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[136'u8, 133'u8, 189'u8, 60'u8, 229'u8, 217'u8, 70'u8, 145'u8, 136'u8, 97'u8, 175'u8, 23'u8, 183'u8, 73'u8]), + base_fee_per_gas: UInt256.fromHex("0xe1307a28a2868b4d934aefdde7bbd09b0644b5c422d2c680770775cb44623512"), + block_hash: Eth2Digest.fromHex("0x11e23850b143b8b4dd8394ee1f2cebf073068502d04dde00000925cf23ff55cc"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[]), + blob_gas_used: 4954178403284176013'u64, + excess_blob_gas: 1, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x08396e3d726ff055f903e2b4e7b743fd8c128f4b"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x01c1c045960d8121bc8ab57c4728dfb3c07289818df71893c002352eca51c54f03db8840f608607bea01bd7b0f02284d"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xc7fefcefc468685bc9b8cdd3c4e1ae643952b254"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x816cae90cab4ca290dfaf9f32b7ad508bd82095ec815cd55b9399eee91208d30f79e548951bfdddc60b7e7560f2b9e1b"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x7eef42203641e2f5c21779289b6c48d24d578887"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x738dfea8a133b5fd384bd6242fa58f1119bcfed0cfca93899c95f1670d1460b905134cc91eabb429d2147b5f147d5d1f"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x032d5223828ee1c8943fdacfbcd25ce4bb2eacfd"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xf42315c025ae7ef0e8a04175441e9617b0e315a9e7c8fc5f0a0bba4efc9775fea3a8af9b40c4aa37633718ccb5b3260d"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ConsolidationRequest( + source_address: ExecutionAddress.fromHex("0x548760f25ecda293ef4950d60520003770b31964"), + source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x1e384047c673119fbed6c635e11f4db74edddd17cc6e51634f5eea100a21a07012fc9b89d2c7677c282bab0d1136cead")), + target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9454bddf457231bf55c91db6a018a0501e97e31d0cb2e7fa180910b75aa1a98e80739885ba4a878df2ef7ac3f2db9fad"))) + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x0c67b44b492590ffb9e6d2a63c84714821be7526ce1c337c06276e33a62b7b93"), + fee_recipient: ExecutionAddress.fromHex("0x1d16dbe66ead2ba8afb8594acaf8d536be08dac3"), + state_root: Eth2Digest.fromHex("0xeeb40e334aff8512435b5908a8dd3c06993cadca8bc44e9a6c28c6003162c6a9"), + receipts_root: Eth2Digest.fromHex("0xefa5b7de19da2333bfb7bfa814a306f904fef2ff4f8b1154314649a56fea3c8d"), + logs_bloom: BloomLogs.fromHex("0x4ebbaff6a56343a6bc0170aca2e2ba303f3e3f972c88539ef84e402740e3c9e21c6951d461baf56eec14c06ca0e95f4921079d0d82e9dd46e73f3fa76417246217ff9c5425f19b0f8b2a735ee522c1bc377a2b079099430d0f9316164f5930456245534bbe138d0a19ee58bb13a0d724723a6fa50e39b8a7ad5804f92ab43c24782e27dbb32789408cdd716af9a0b0cb1e2f3aee0bcb5aa4088c0cf1528fad466f3d71d906649becf25f405f619dead731e0831efb522b5faee7a39ca28128effc79977816d50ae23745ab96b80dc7f548aa5d43b0d5c331fdc1ce080a4d63e19942ecb4df8f56397b2ef67d017f2d2de9296e1fd8036ed8592f5a89553c4642"), + prev_randao: Eth2Digest.fromHex("0x5d3c3ac25330e1cd3a516003315ed24bd2dc6cd31d389639cce4b6ae4a3ac8cf"), + block_number: 10891095348111649307'u64, + gas_limit: 13670668340379820434'u64, + gas_used: 1482104080767186829'u64, + timestamp: 6602476120092784163'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[223'u8, 228'u8, 253'u8, 3'u8, 38'u8, 218'u8, 253'u8, 87'u8, 206'u8, 243'u8, 168'u8, 113'u8]), + base_fee_per_gas: UInt256.fromHex("0x972a01f27d586035ce5fb233118e52652ebbf89f6d39558a41b27c8840c849b1"), + block_hash: Eth2Digest.fromHex("0x9280fa96a569e7c25b2dfc12a141d3edd24acf2fbfa19ee72e5a1fd5dba25a11"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[116'u8, 179'u8, 195'u8, 80'u8, 193'u8, 73'u8, 187'u8, 64'u8, 41'u8, 251'u8, 55'u8, 90'u8, 161'u8, 30'u8, 221'u8, 210'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 820354'u64, validator_index: 626992'u64, address: ExecutionAddress.fromHex("0x4abb3f9a694bf6b27be97e24290ca6826b23c5d0"), amount: 100271'u64.Gwei), + ]), + blob_gas_used: 0, + excess_blob_gas: 4396492484488695305'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9aa3ec3541db18dc4f7bd8e3111a3f00c0d7c5c096a4cf312e3c91a10ca1a91802c4b7b8bbd657dd30af4f3c365a70ba")), + withdrawal_credentials: Eth2Digest.fromHex("0xf26e0fb84321ae08d027c81a3e8b113263c01ba0b5e8b258089e496854c4571f"), + amount: 14325001783554754582'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xe3654532d224f33eba82bb7f487098c687c180592f8d6406af9d13e8019f417f4bac5ab12c4da72d85f90af2ba18ae4f1f27984033ee63687635db7a69375b38b48168575926def4ba0cd2322a3d970436ed788627fbb4889bba989114da9b82")), + index: 0), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5960755c394a07ae7c11ab0260a033eb22b0a0f957be785a513878d0ef04cd3b46af090fd6e2bbd930cc345f81f209e9")), + withdrawal_credentials: Eth2Digest.fromHex("0xa86195129950eb6a8df3190107c2b84e8ad8fdff7b0720d84c42fab9de51e38a"), + amount: 279514025671376926'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x121632563dca7d7a560e5b243d7f27dc7dc72319f1486f67cb41751c5f5a42bd9f8efdd14e3f811e03c84e3ba36295a0cb2313bb9792cfc7d80a1669f0adc30934440adbd665ef96b3c30a2762cbaf932e6eb1b4a1c93063ec7f0b6f6aa2a9db")), + index: 10368232928814555152'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x7bee235a632b5f79831f376843209740d409b9f8"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x8f40af9186eb70dea2f3105785a930511368e60d2235055c34a0be1a591c5b580eed67542c89a0f8a024c4a6bd1f9bb7"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0x72fdf4c5a62970c6d6c9ee395eec4dfd6fcca4de"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x540a810f4e9ad62bca1d677e9135d519100012f6f12a8f5105623762ba5de3782cb3baaf63c4a32cf03a036127d6d009"))), + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xd3a0f8518063d55c61423dce1bfcd2abd9a27a62"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x82bec5cd588df021e98087c703b995075ee1cfde2257eebed5e27f53a3a16903479fa2e6864ab3c3c397cd25b6ba3d4f"))), + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x7a9d6ab34c0314959d5bdceb0bd80f142e59e5e2addedcd178612303897e7a8a"), + fee_recipient: ExecutionAddress.fromHex("0x3425bc529b4791f5fdb7dd365501199b2f81e578"), + state_root: Eth2Digest.fromHex("0x4eb1a9a3c4b9392325a14f3f8efbc0b3cc3bfc2d7e9992377abd84af6c556db5"), + receipts_root: Eth2Digest.fromHex("0x094e9114d3487925f6818140978e4db64d8306083a8e5c987657e21c3a1995bd"), + logs_bloom: BloomLogs.fromHex("0x0815701b4689d0bb7f80fb1485ad3255a66b890725a1d2d66b4fc66678e2d08784c21ef583401493d5dda1549eda32303b7d102edc72b9fe1d696ab459294a88db0d7263abdf982ddf59ce008b8ac734565de79c269dfc18a36709ca91a3cd50516725e9fa9d98302fa0322254382aab0cdf1f95f2397579f7219bd7ab096ef1f00d7b1131b0055bff65ae9954cb22959adbc40983840ae3b85358fd205bdf6ac6bcf723047ffc53a094a06c2039935b6ef579efc618bf4127a6e4e531f6d97c17789be639691ef87fa5540cf732a184a0e09d5c60866ecd0be0a04bc94317712c395d84c2cec90f43f4807048bf1a93e3e6520a1a7c59092e2e391abf9d2e68"), + prev_randao: Eth2Digest.fromHex("0x349eec90244f3d812002732cd833952969b27a463def04291051137344c89c41"), + block_number: 5715688900321967041'u64, + gas_limit: 17172684770312311722'u64, + gas_used: 9286597649062725614'u64, + timestamp: 195835912833125491'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[34'u8, 35'u8, 209'u8, 45'u8, 117'u8]), + base_fee_per_gas: UInt256.fromHex("0x7b5b4e48b3daadecb9724a74d426a86ffb5c5f8abd43469b4e3fe2a728b5a645"), + block_hash: Eth2Digest.fromHex("0xc71c294b5562af30b9e2b03e76cec0cc6d8b50694219404aaed2ace8f756a22e"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[178'u8, 142'u8, 115'u8, 217'u8, 56'u8, 74'u8, 150'u8, 16'u8, 244'u8, 148'u8, 19'u8, 33'u8, 89'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[195'u8, 248'u8, 42'u8, 129'u8, 151'u8, 119'u8, 232'u8, 235'u8, 245'u8, 240'u8, 113'u8, 157'u8, 235'u8, 158'u8, 160'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[16'u8, 27'u8, 72'u8, 107'u8, 18'u8, 210'u8, 127'u8, 78'u8])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 5186085670428433087'u64, validator_index: 156817'u64, address: ExecutionAddress.fromHex("0xf8d93a548c4b243e66f4f73b29da342a0fab04de"), amount: 18446744073709551615'u64.Gwei), + capella.Withdrawal(index: 9475052657186699106'u64, validator_index: 759532'u64, address: ExecutionAddress.fromHex("0x97559fac3168c6ee81b0f0b0b88563080ca24769"), amount: 4852567582077527137'u64.Gwei), + ]), + blob_gas_used: 11199168226748373856'u64, + excess_blob_gas: 13194543368024635634'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xe4476f7d26f357eeb0a2c31eca0febf37a9bbd8bb28810101b3d62832fbc63ecf6ae6019bbea00bbf1b786ccd4e5143e")), + withdrawal_credentials: Eth2Digest.fromHex("0xc9b68e2b8e85dc344cb56a8f2b1930ebad58094a8724e64d7de0b7d39178abb1"), + amount: 6807629444642690487'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x742db20aaebafe1bde890ff9a00901d9b8e2ff5e1f27ec96d0adcd4d058fc4b7dc8545931f686c71180035d90eb61c107f96b6f401b75afaa4f4824bc9085c8bf7618f86e64e04d0b0779e54dfc6b9188c4dce82a70e383298403025ef634e6c")), + index: 8242431675098722712'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9cbfe60e6b7fd6ca80f047492eee67fe83391b71ae1d70e2e6e7143c096e4059897f3033cf01a266209b974f1accf9d1")), + withdrawal_credentials: Eth2Digest.fromHex("0xdcfd039ba7148cc07212f227be45fdc329a499b8b0ab074dda9c6fa0f4534066"), + amount: 17558068707432308727'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x8e274ccbdef898449a07a296386e5983ec423f7ddee02bb9d480ec99dca4f5074b8f6cf469758a45586f031e2ae0a5448aa133531cddf88e9bd2b9fae191fdc817c1989124f1866753fbc833f79fb78f89677df12bc6d288693e5362f2a972bd")), + index: 15922103202526011942'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + WithdrawalRequest( + source_address: ExecutionAddress.fromHex("0xe368e59ddc49ffac6818f01b4be692a517b6838e"), + validator_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x9c7a489a7498cada308db339f80aafeeff5e38ef7dc5803344a725b3b7f23d6d6162a33798a69660417b8fffb51c3d50"))) + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ConsolidationRequest( + source_address: ExecutionAddress.fromHex("0x45c3398e59b885ccf52ef5d36ab2acc3c3f9d584"), + source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x47faa2f4d2bc6e1b2c8366db1e4300fb6fb099f26c9e0cd53b87b22f4fd038751b8fef08f6c1e636116c95874bab5bb1")), + target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x632e3e022a91046f0a6769abfd159b998321363c79d77b7bc139359fafb4cce331322599fc05fd8c5b1d6aef94e810ed"))) + ]), + ), + (electra.ExecutionPayload)( + parent_hash: Eth2Digest.fromHex("0x806a868f0f31e8f519fa6339ad18c414dba17feb03aaf6ca3775b152bac64f3b"), + fee_recipient: ExecutionAddress.fromHex("0xa2bcc8b793c4a5d4e0f68251d2f22e1ff4366d2c"), + state_root: Eth2Digest.fromHex("0x6979ac9545f31eaf7ed8bd227cd7cbd1017492b892bcc118f7417ea87d50d412"), + receipts_root: Eth2Digest.fromHex("0xca0ac1828fae211c9d0fd7ab763460d89f9da0669d082c68b9fdca3ca1b59123"), + logs_bloom: BloomLogs.fromHex("0x0656423dc7b375cee4f5c3bedc500eaff2da91d0dd5f4e695933c92a2a6af7441200a41177bcae7912839f993a733aa2bb82976f08180a901e63c588a26dc9ccc58f477eccbb08aa932d512bfc765a57527acd04c585af23f48f389420890d06877d8a0f523cb90be10dbc73cb5b11e808f5c6c90c6fc3a9434dab462f2977eacf79146b35ee2372aae8a6fe3628cbe21a8988fd9546b25581b6d998462f9af7f653d3a4702a4a63b9f26cc7d2f72e18a3918fa9b65ed81d23ac0a64dd8f3f878f745fcb4de9ad144ae9565288d7bf90e6d356f49cc242d000e988fe76e0196f0c5b24bdf9dc501222e54f64861e0d45dda2bdf09e5fb290a1ec6dce39b02883"), + prev_randao: Eth2Digest.fromHex("0xc986211f6550cb787e89140d8856531ec309f652e2a871e2715c1dd055448074"), + block_number: 7781035717593646205'u64, + gas_limit: 9088183223170031827'u64, + gas_used: 0, + timestamp: 1844848381084178223'u64, + extra_data: List[byte, MAX_EXTRA_DATA_BYTES].init(@[]), + base_fee_per_gas: UInt256.fromHex("0xaac988479abbe95e03cc214e7b99795c4ec117bfe4da06e4624e94b262b015e2"), + block_hash: Eth2Digest.fromHex("0x14137d373f6e6110b3fe3c1d743a4f84547ad3d59d0b42598b794ff601e97e38"), + transactions: List[bellatrix.Transaction, MAX_TRANSACTIONS_PER_PAYLOAD].init(@[List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[10'u8, 28'u8, 79'u8, 238'u8, 85'u8, 206'u8, 161'u8, 222'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[144'u8, 222'u8, 190'u8, 14'u8, 247'u8, 119'u8, 95'u8, 48'u8, 238'u8, 50'u8, 180'u8, 12'u8, 216'u8]), List[byte, Limit MAX_BYTES_PER_TRANSACTION].init(@[])]), + withdrawals: List[capella.Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD].init(@[ + capella.Withdrawal(index: 428032'u64, validator_index: 18218455002493563835'u64, address: ExecutionAddress.fromHex("0x389fe5e57a13de364b852d7e2cebc2add2cb7510"), amount: 726634'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 0'u64, address: ExecutionAddress.fromHex("0xc6a0db1d09160cec69bda14b444c46745e09c96b"), amount: 742028'u64.Gwei), + capella.Withdrawal(index: 858390'u64, validator_index: 326055'u64, address: ExecutionAddress.fromHex("0x6a861508a89443c763d5daf15dab44a8a45147fc"), amount: 597242'u64.Gwei), + capella.Withdrawal(index: 18446744073709551615'u64, validator_index: 17239721441660215355'u64, address: ExecutionAddress.fromHex("0x1450447dc71e28e312c7de7034523cd322eabc98"), amount: 18446744073709551615'u64.Gwei), + ]), + blob_gas_used: 6943026604784588438'u64, + excess_blob_gas: 4081254329996628499'u64, + deposit_requests: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD].init(@[ + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0xdb77124f3289375b57590aa624baa5feabd0cb05d9b849ddf7fb6c6a19ae6e0e9b2b5f0b5619f8114d2e84f86387b8b1")), + withdrawal_credentials: Eth2Digest.fromHex("0xda71d922d0c2f43e0e743d15acf61fbbc235cd7e5a6b5d3ddf0a8f99c09e5423"), + amount: 8900470305881875693'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x0359d1b9bb630af7adedef569b58902f861eabd6832fdac38f4ea9fcee0687d5b32beb1762707bb7f197cc7cb7e56a2c5071f0c20647fe133bc807f8656d55ba454adc7c0c82e1d91b6ee2015c659595a29b20c75fdc9eb09c1dd181ca30cde3")), + index: 7027910908460072698'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x766195f078501722f6c2250140a793ca7c7e4eedf04a08d7a9046790347feba8b43a07824c279c3382e30dac18e24dc9")), + withdrawal_credentials: Eth2Digest.fromHex("0x8033ec1a06aba2965b7e5a44c3195aadf60c733e54cd737c3f08183ba15fc91c"), + amount: 18016967842448743237'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xfe46ea45efda7361cfbc8a5436dac3d2906176f219f38e477106a7a1bcb7efa726097a058553f0df0336bc982fcc7ff0ec99a085032d853f0a865639581bf40c06d463a6341f40a0bb5a149e1052ee9cbb60948cb9e673d12dc26979b7c75150")), + index: 2199989485519321583'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x3da140a6919e15bbce6592e20deb726c7f49490de1d785f2c6dccacf042a73b3baaf7a8a78b2b845bb91dd94bb4516e1")), + withdrawal_credentials: Eth2Digest.fromHex("0xd7ca318f49e1acc9dd1b42088b59d7321cbf61ab08deb200b507569a84b45a6d"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0xdb1d2894d5f853b0bf89dc64d977608ac2774d8c5f4f59566f4ee3a723caf13b4eb66aca7495dfced5068057516b1ba6106e2af198bb5a0a78ecc47cace8b6e0b570b13b23d58827f756f8947d12187c4f804b49924f9beaa669f5d8690513b0")), + index: 2386861599472159894'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x551918d44e257d9a00f2e9307eb6735d5da6dcb6b372a0c80d35b167afca47f6087e0fb2fbd8d3846977bb1975b431b5")), + withdrawal_credentials: Eth2Digest.fromHex("0x23d544fec453c12e55f24488f48870115d07946ba266621aa03997f8340ba0c9"), + amount: 15504548595993808618'u64.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x8be2d5ec33930f835ba523c8db1d5c47e7719a8844a2339f9a7497df2687efe009dbee6429accd5794272609b3f75ba25c959c7daa30e87f0eada1268363de1afd86656162f95a5b7a76eebae76c8cb3619045fd0050224b77ff1567e590a42f")), + index: 17558896845903288827'u64), + DepositRequest( + pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x920b41013a660d49b8ec1651d7ed869b0812cab03ff409e32b29beb8d8d74744d5d2375e40afa7da019408552026017a")), + withdrawal_credentials: Eth2Digest.fromHex("0xb8f6d6891169e1fa957873ae437ac92f650dbf32f0ce5dbede96926ccf755d52"), + amount: 0.Gwei, + signature: ValidatorSig(blob: hexToByteArray[96]("0x232d34989ba30727e4ae0aa874a4bfc3934d61d0295d8f1c5f8416523f5cd05a3181a03543ff7318c4f4b9207d006267dde451177612bd888f69b43ebea83a4289cd6615526160d7ecf2a09842d4c2e90ae9f207a440a348ed8ef31e0cf1fe8b")), + index: 4403524705240661292'u64), + ]), + withdrawal_requests: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD].init(@[ + ]), + consolidation_requests: List[ConsolidationRequest, Limit MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD].init(@[ + ConsolidationRequest( + source_address: ExecutionAddress.fromHex("0xaa3e4b371bd5d3c907eae23ce4c4f6b5dfe0cb65"), + source_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x5bfc2cffb681249ff93734c176a8bac7cb207859a77658019f7fadf0a49f8f5b2496c7fcb2a270ea99f9a80f15b95ac1")), + target_pubkey: ValidatorPubKey(blob: hexToByteArray[48]("0x495170003efda9e294e95cd4d80c903b4fe6c48846b1c8fcbca71b21837e6ca8ffecd0f224aead3e1088ae755a882ae5"))) + ]), + )] + + for executionPayload in executionPayloads: + check: + executionPayload == asConsensusType( + asEngineExecutionPayload(executionPayload)) \ No newline at end of file diff --git a/tests/test_gossip_validation.nim b/tests/test_gossip_validation.nim index 9c167db5c..c6084fd06 100644 --- a/tests/test_gossip_validation.nim +++ b/tests/test_gossip_validation.nim @@ -181,6 +181,28 @@ suite "Gossip validation " & preset(): fut_1_0.waitFor().error()[0] == ValidationResult.Reject fut_1_1.waitFor().isOk() + block: + pool[].nextAttestationEpoch.setLen(0) # reset for test + check: + att_1_0.data == att_1_1.data + beacon_committee[0] != beacon_committee[1] # Different validator + var + broken_1_0 = att_1_0 + broken_1_1 = att_1_1 + broken_1_0.signature = att_1_1.signature + broken_1_1.signature = att_1_0.signature + # The signatures were swapped and no longer match their pubkeys; + # the individual attestations are invalid but their aggregate validates! + let + fut_1_0 = validateAttestation( + pool, batchCrypto, broken_1_0, beaconTime, subnet, true) + fut_1_1 = validateAttestation( + pool, batchCrypto, broken_1_1, beaconTime, subnet, true) + + check: + fut_1_0.waitFor().error()[0] == ValidationResult.Reject + fut_1_1.waitFor().error()[0] == ValidationResult.Reject + suite "Gossip validation - Altair": let cfg = block: var res = defaultRuntimeConfig diff --git a/tests/test_keymanager_api.nim b/tests/test_keymanager_api.nim index 5473b8967..f35ec84bf 100644 --- a/tests/test_keymanager_api.nim +++ b/tests/test_keymanager_api.nim @@ -298,8 +298,7 @@ proc startBeaconNode(basePort: int) {.raises: [CatchableError].} = "--keymanager-port=" & $(basePort + PortKind.KeymanagerBN.ord), "--keymanager-token-file=" & tokenFilePath, "--suggested-fee-recipient=" & $defaultFeeRecipient, - "--doppelganger-detection=off", - "--debug-forkchoice-version=stable"], it)) + "--doppelganger-detection=off"], it)) except Exception as exc: # TODO fix confutils exceptions raiseAssert exc.msg diff --git a/tests/test_toblindedblock.nim b/tests/test_toblindedblock.nim index b63400636..41f62f14b 100644 --- a/tests/test_toblindedblock.nim +++ b/tests/test_toblindedblock.nim @@ -116,28 +116,16 @@ template deneb_steps() = do_check suite "Blinded block conversions": - test "Bellatrix toSignedBlindedBlock": - var b = default(bellatrix.SignedBeaconBlock) - do_check - bellatrix_steps - - test "Capella toSignedBlindedBlock": - var b = default(capella.SignedBeaconBlock) - do_check - bellatrix_steps - capella_steps - - test "Deneb toSignedBlindedBlock": - var b = default(deneb.SignedBeaconBlock) - do_check - bellatrix_steps - capella_steps - deneb_steps - - test "Electra toSignedBlindedBlock": - var b = default(electra.SignedBeaconBlock) - do_check - bellatrix_steps - capella_steps - deneb_steps - debugComment "add electra_steps" \ No newline at end of file + withAll(ConsensusFork): + when consensusFork >= ConsensusFork.Bellatrix: + test $consensusFork & " toSignedBlindedBeaconBlock": + var b = default(consensusFork.SignedBeaconBlock) + do_check + bellatrix_steps + when consensusFork >= ConsensusFork.Capella: + capella_steps + when consensusFork >= ConsensusFork.Deneb: + deneb_steps + when consensusFork >= ConsensusFork.Electra: + debugComment "add electra_steps" + static: doAssert high(ConsensusFork) == ConsensusFork.Electra diff --git a/tests/test_validator_bucket_sort.nim b/tests/test_validator_bucket_sort.nim new file mode 100644 index 000000000..d48b42e85 --- /dev/null +++ b/tests/test_validator_bucket_sort.nim @@ -0,0 +1,260 @@ +# beacon_chain +# Copyright (c) 2024 Status Research & Development GmbH +# Licensed and distributed under either of +# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). +# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). +# at your option. This file may not be copied, modified, or distributed except according to those terms. + +{.push raises: [].} +{.used.} + +import std/typetraits +import ".."/beacon_chain/spec/crypto, unittest2 + +from std/sequtils import mapIt +from ".."/beacon_chain/validator_bucket_sort import + BucketSortedValidators, add, findValidatorIndex, sortValidatorBuckets +from ".."/beacon_chain/spec/datatypes/base import + HashedValidatorPubKey, HashedValidatorPubKeyItem, Validator, ValidatorIndex, + fromHex, pubkey, `==` +from ".."/beacon_chain/spec/eth2_merkleization import hash_tree_root + +let pubkeys = [ + ValidatorPubKey.fromHex("0xd52edb450c9fdad41ce16d724be7b986a5422f8a791b68a370ef86045a85147cf8f7a6342034958d46a136965b622c48"), + ValidatorPubKey.fromHex("0x6f343f3c55183fc6c980e7597ac47c14b59322e22be9109e7ad8412f5b0e5c918b4e6dd60e5b98eb8d2501a94b2fb022"), + ValidatorPubKey.fromHex("0x5e40d512d91a27aa60e95fa10acb60a8a5dc6d85f2238e6418bfd4ebf44215270301f9e15564dde2c2b628fe80e7f970"), + ValidatorPubKey.fromHex("0x4ae23aea68bfd30022d4efdde1b4428f23317a70fb6df716dc16ccde96b74174c2f8cd18237bdb7ae900acbaba8cad70"), + ValidatorPubKey.fromHex("0x032fc41fa7fc1a44a1f38d73a3465974c2048bb347a9fcb261b93fc6581009d7c9870f0e1a21d619069d5250456cd5ca"), + ValidatorPubKey.fromHex("0x8cea40c0986bc0dc51b664e846a08948112987903b6ffe462b77f092dc43e752dfefaad738810c43364b2f2ed24a5988"), + ValidatorPubKey.fromHex("0xc663a799c732d544a835251935fc5be18eb365806279863877ff2f9308779106816a48be235b4b5d9dcaf42bdf1119f7"), + ValidatorPubKey.fromHex("0xc5682345f202d59614089a6fd5c2375adf8e40316bb69114474f1861c9a6791cc512c0133860353a4bb35d659f3fcd14"), + ValidatorPubKey.fromHex("0x593c3b4d962ff759945f70afa98d3d653fb4c73a2808a4f30472d972cdfd12df7535ba5ba88f3c5e8a59ff844129949f"), + ValidatorPubKey.fromHex("0xabc272512d7a861c0bc190c23cdef8d4d6b9b159d9f53aaf8834c8f521edf416b850d6c14b4c040bac7ceaa1be117e98"), + ValidatorPubKey.fromHex("0xd6dc377e866b762ab63dc2155be71bf24624855e255332dc48a175a9024e71057ad4ad351d7b5aeee944afaaff5d4e1b"), + ValidatorPubKey.fromHex("0x9af21f5d70846185023f70f7841f2f6323c27307c3e54025f103ba359c856b76d3c06f0a09b4669e4838187805253467"), + ValidatorPubKey.fromHex("0x92312221300b0707c401d3163f951babaeb4121fa7222dafebba8b8cf91928567477b4b2c249af446a759ef13d990a0c"), + ValidatorPubKey.fromHex("0x37c2731f409eafdb4bb5a1722e33cc39ab8dcf87eb7b4702aca0dcfdceea15002c1b697124eb6f1f83bd807cafb0ff43"), + ValidatorPubKey.fromHex("0xac72cfe3b2a0c549f608746fd0c3daa7195c42e05157f8d8b10bd84b1d04bff763eb6bf74620be8bcdba0ea4704630ee"), + ValidatorPubKey.fromHex("0x6cab2ab1fd15489aae21becc2cfb8923513bacce9d9773c3ad35ef7535a6e92d3a78de4d103e2ed88a818f872de331f2"), + ValidatorPubKey.fromHex("0x99138fe703da75af5571e3994e7c0b6bba06cb2a4a4978e4b41e52e06af7c1c928105bb5fae878d16934529c96883e97"), + ValidatorPubKey.fromHex("0x850c61b9bf24be2470fe0b1ead466d9b93ea4b4d41980f2f6c82eef9b526d68bf6be613b4e7653b79267829a4107dd30"), + ValidatorPubKey.fromHex("0x310ddff78f82b2ea039f6077b099f4e8e148da97d35a14140cdf5754db933034d15a58085ff91522e2722504a6ebdc87"), + ValidatorPubKey.fromHex("0x331103905b6cc0da6ef1fc2e10cb6c9feed110a5a09fed5f32f56416ea814e80961fdf81455a6483de18c40e1f3bb718"), + ValidatorPubKey.fromHex("0x8f4a32c968cb197581a3c4cec214d33736026997d1a4dc9538c932b3d859dd0547a7a06a08a9115c2c2a4fdfccaa07d2"), + ValidatorPubKey.fromHex("0xda87a0a9a300057c1f4a196f9e8947a1f461aca3be84799ac9a187c4ecb0f6450cc15e64d30b30da4f5cf2848808b9ab"), + ValidatorPubKey.fromHex("0x91e197089e1a351f0f6b1d4777c464edffac62067162133c01185074d520cbefd4e661d978cf04f9832804cb636e7a5f"), + ValidatorPubKey.fromHex("0xf0e76be22bf4afd4ea3730ef7dd0156b777e2835d828deee887881263affa33bf4685ad18fa05d09e87481a4c89c345c"), + ValidatorPubKey.fromHex("0x4a0276deca3b176cd6fe0b648f0fc418568c0c9d29d607e74e02c17852b72e636e681f4be63b0b1ad842db3efe0518c2"), + ValidatorPubKey.fromHex("0x7ad942fe106ee88c214bd5e34078b2c98849ba594a4e266a8548c1b5e44bd151135fa5a720323927c142af19fd1e74b1"), + ValidatorPubKey.fromHex("0x0648a3a4f9cf10e8f8881902549e0b7c6b207e72d5498e54503e1497ccfc03954a7440dfa0cd5ba62f80234bd99733ca"), + ValidatorPubKey.fromHex("0x5d569974f21599857609ec27e11cd2b9c007209790fe36e0cc5ff1bef0c83c07eddc84602ae04a3b803b158fa8d8a7df"), + ValidatorPubKey.fromHex("0x63290edbc38bfa204b7fd4b3fba3f677f00a54897b4c62c83ff5a1d0a905f64d2ea73ab9fa903d86c3ac8e5c91f66cc2"), + ValidatorPubKey.fromHex("0xc56363e2f8a19dcb1c9fa0b446b9c2e6a93218250df814da9566c4ceaeb116a4d60031ec60b89c23e0e911dccc301e34"), + ValidatorPubKey.fromHex("0x68c143f8c1cf0dc47345526bfd5123ed31edcbf393673352fe948107f5317ddcf8934814657879da7a1ec5782d13fdc4"), + ValidatorPubKey.fromHex("0x6e1c7d1ca0056d721a94cda0a776b68d447b1706882e04ed7ca7356d61d7d08c9c2aaf782e9c3f0c4c6e4758ca6c9228"), + ValidatorPubKey.fromHex("0x12d410ee83662b4506546e912ada2e0273f27279fdc46565d0c862e262bdbe98f91466a5bfa4e65660fd8e5a4da28543"), + ValidatorPubKey.fromHex("0x039b3ebfcc2d6f181b40da2b63d94406c440f2c32547e69560bb137a295886c3e82b7ac5aa18e14bfe080b805ae75197"), + ValidatorPubKey.fromHex("0x02875a3d83a806329b612096329959eec1a2300d9740a2c94d030dc5c99c6c0c62bd5f832b615d36cc165bc304e7a892"), + ValidatorPubKey.fromHex("0xfc0acd4ca1e1ea234b39219af5c899a743332e33a17be2dcb10bfed72e4d437fd2693ac1ae1dcec2d189a9689b0b53ff"), + ValidatorPubKey.fromHex("0x8104b3b199bf0261b1584fe269e5599266bd60cbd201205565e139fbe4a9577f48f71cebae7f7cf434cf07f66cc51ec9"), + ValidatorPubKey.fromHex("0xcfe998a8989f5318aee192e185e87a51b96aeec479d37f00cdcfafe534f514c316a10c4ba311c076cae6b192386dc25a"), + ValidatorPubKey.fromHex("0x44d7bcaebb2da8001982540c8917da5ff950750d90e5b788f2c35262b58efca64dfe3df46793380016a9d24b521c3920"), + ValidatorPubKey.fromHex("0x2b7fd53635b1effa086d6db933b65bfbca85160ed731fa8b5c77a8b726b4c5b61ff56d88d57f3e4fece8c593df18f2b3"), + ValidatorPubKey.fromHex("0x642e56b532e08e4cb75d619ed3b360ad1971584e338638b7d5716672922e513465c3fb13d26d381e7b21ffe9bc8e428f"), + ValidatorPubKey.fromHex("0x61820ec30590c9e75b06b0cc454686067fc6db1d329814aaf1a31e3e3defe50f41ee15c106e3602c4931e131032787db"), + ValidatorPubKey.fromHex("0xdc41f2c1504c90f44ba32b7e9d8e069d9c788a125f45df163c65c56cf22f5823e7614b2fcd5cec7c14a276b67e0fa7b8"), + ValidatorPubKey.fromHex("0x079d59adc0ac14e2c7397a23c3debcb080d1378ad4ac6a091daeb12f1d134c063ce4629bdf0880172017b81bed0064ec"), + ValidatorPubKey.fromHex("0x41e0b5b8befce0add67f48a9b485307105e3772aae012777c6afa62304f67a7407dd0c16b791754076549eba2b7a18a8"), + ValidatorPubKey.fromHex("0xd36e7623ae93544eaa5868e50936797bddffb2b3b66728b38f0c479f1640c60e82ad887b960e6c9340526da8a030f5b2"), + ValidatorPubKey.fromHex("0x8986816ba54e777b2c6045a805b11c08bb1f64898a6786428da9efc2ae466cb940fa3c11feacfdeeba87df9b3ce3e93f"), + ValidatorPubKey.fromHex("0x5ea844f61fe1710c19cb67e5daec1c3ba0fc203ab23598b1c9cfae6f4ab9d9f127d50d0b9cebf64d7650f66c06ca5596"), + ValidatorPubKey.fromHex("0x3e77eef77d7573362dffd75800d7554ad41f4349b3a2ab72d6fe031bf3c42bf283f985b933ac142de581079371018fdc"), + ValidatorPubKey.fromHex("0xa848afaf6d44d43e2f072bf3cf82e1ae6a8c63cda627c12d95a43e6ac4f20b8a9213a723d642c95ae2bd66bccadb8467"), + ValidatorPubKey.fromHex("0xb0b1b8582a84cbc5f43585c9d2e2b9d34f0788977f5004d6e21b12bfd5cd7165d72fba0da182f13aa44af63f9045da3e"), + ValidatorPubKey.fromHex("0x4f5517fe02d94b1eeee0a294b4f7d6064f8a3eb3fd6f31801ab7545be1dc290f26972515b23018b23efa9a812f648b6b"), + ValidatorPubKey.fromHex("0xa0f040547549deccd5cdc3a0a3a91974754fdc8177763adfc25ffb7704f8ca5e83985db3f276fadb1c113fb279720a05"), + ValidatorPubKey.fromHex("0x7dd6ae00b240244b0e49cf7538a5021e6725d3b87b909e797c7d9c6947c3b29353ff61c128ad36db66b77f197308ba04"), + ValidatorPubKey.fromHex("0xdc824ba613c5ddf2c112f0ca3bb91e6d7bfcbfd340b1e611183b8bf8c4cc37d1b843909f2c9db8353de6938834516fa2"), + ValidatorPubKey.fromHex("0xb085822d9549b0b674591015525f0846ec00ef3ff52b1107592285d0a75b757708a54fcfe5655f28473c33ae4d43ee5c"), + ValidatorPubKey.fromHex("0xab704b4be6cbbbe0f9176fd3dccbf2c0272e4f42538d5f4844a288820179f7c799d051c501e78ee3848484e1818d8456"), + ValidatorPubKey.fromHex("0x12c3c3fa284bd55ebbe82abce576c104929a909e9d78eba2f595ce42822ffe52c427ad61923f48107b1639e4bd99a45b"), + ValidatorPubKey.fromHex("0x64c86e12cdc8091c0b0e317abc073a71c96df04e1fb2235219a1289d3ce62b323fc1a226f0b298ee5596bbebabdacaf5"), + ValidatorPubKey.fromHex("0x1d5cc7e50da341a6f6931dc9fb4df6a37d21545281b9fdc2836182e2f45ff2a2a6e9181ab5d4893125fea6495fe68dd3"), + ValidatorPubKey.fromHex("0x923573206c1b1a75716339eb61f489b10d5811a280dd15333f980374ca63664741e16d911f8372ff74714ec79662683f"), + ValidatorPubKey.fromHex("0x7c1fe9a7ab8da368228a27f575cbb36aa9ce2e68d60c336184f02b985b5c13a7d09cbe315895a1da5f1f86d713f94417"), + ValidatorPubKey.fromHex("0xbb85e9cdac2db9a2dda61480082f3ed0f683db798219cdbfadac846c7b374f90a8c6784c95b53676b631152077619ee5"), + ValidatorPubKey.fromHex("0x58db99741e4c904ec1444a9c23c287eeea88de3c647c9dd9ed45e8230b7ed0bf080d546ae4597af148b69809df07e73c"), + ValidatorPubKey.fromHex("0x2208988a10feef0f7ec1550e8ef8c14c786de0bd647e5b3d10d3b884c8521af0ce59ba1a8583afe888b9348d2e1ed7d5"), + ValidatorPubKey.fromHex("0xd11cd69262896cf2a19a52928b7fcba8cd1c1661d0c938ffbfb4482283f53b44435af5695ce10fddc9315393aeda57ef"), + ValidatorPubKey.fromHex("0x4a568216203673c3f895529c194c2ca172d613e8f866dd9ee5e8db9b5b681942c7b5634c2349689a6753e1d1113d062e"), + ValidatorPubKey.fromHex("0x7ceb8add4aebaf802c3e8b37f85076a6de8c6d7007dcb92fa7b4da028a571f9dae41338b8d3f2446db4335ffbff7f083"), + ValidatorPubKey.fromHex("0xfda68482093ff5780855a139008ba695a1bd74864cb4ff72451caa5a46f8db497b44baecc93ead6aacd34c9ac92522d4"), + ValidatorPubKey.fromHex("0x8483c152bf17da7df9f3e7102d2fdd143b7649a95920263c8231ce6e80f01a849ae62064f2d03d6dcb89024d07ef9f33"), + ValidatorPubKey.fromHex("0x33ea02799800edf1c7660f1acf923f33913f2eaa89944c3b8ca4e44a2d061a1c6e4286ca92251bc0f3b11c535824aa0e"), + ValidatorPubKey.fromHex("0x46e3fdc0b5b6df3147a95ccfdfe66373bdbf96e6d5eed7306428f986778dd3b9eecb0bc5e568213b0b3faee7ce6caa79"), + ValidatorPubKey.fromHex("0xac9df2f76111be4c822a91d24a85291f55ed4ae4c574803781018360f83cc395fee9a3e56d92fc34d2f74f4dcd81c19d"), + ValidatorPubKey.fromHex("0xe6724c500b1573fee191980bdf4d8e30086bc2f2460ac775d9ceec553d4870f314fae83d04b9d9f17dc1bec64e1b5260"), + ValidatorPubKey.fromHex("0xb45d08842d2721b18d17209081b5b95ed2b9198c0dd47d16117834e1b96913071f5afe5abe53206a10103baeadbc4314"), + ValidatorPubKey.fromHex("0x8badb39dec9b9c348e4833797ac1f7fc84f7bac557d1bed58096144f48b8cda5fd8ddbe21e278f0b6d5c9aed6c90f783"), + ValidatorPubKey.fromHex("0x5fd79ebdc6f58defee05a823c9d793dfdc4b0c43ddbd1eb74c3432f59d069fe026ead5b1c925626ed9f915aee6f91247"), + ValidatorPubKey.fromHex("0x7763334ab10953dea5bffac69dea12eb53f0cd46947f04334d417223040453cfbe0f658d6f1e22a79c09807bdf3ee2c1"), + ValidatorPubKey.fromHex("0xf2df734e8b11d562900079828c2cde7dca86a2d63cf57813c67bab47fc627f1bb773d70015a486a1a2cd09b4a04c1b28"), + ValidatorPubKey.fromHex("0xd0c621f5bb524fb68aa3631b4a0629bf6bc210fe30e237d9caf8bfb476686b82eb8e8460062d187d6e2699ddc8988c0c"), + ValidatorPubKey.fromHex("0x10eb53f3ba6d355e301c785a2f204294c6a63233edee9cc135791815d086c9a8604c0d46baca6abe8c7a58e708e2106a"), + ValidatorPubKey.fromHex("0x4244a5380986232f8fb39f9396be04e6c504c3b1f87e9672d7154d09b97f0fa86cae849aac06b30ce993e00e126cf5b0"), + ValidatorPubKey.fromHex("0x2382850a411c389df2afdd2a03a6196b451893e2674d11e0b8ac6914ffa53c7a1ced201cc1390a3aa1a2879dcdfa143b"), + ValidatorPubKey.fromHex("0xa20189e31ecc6a8c2002a9dec9645aada8f01dbaa6f22f7efcc10e1de109f2528edcbe768f1baf78b8ecba189d70e28b"), + ValidatorPubKey.fromHex("0xd1f4e4ebedcc39544148157f4a5279def61a8dda08c087afbcc85e85f5fe8a244972e26077cfc1820c0c85814adfad6e"), + ValidatorPubKey.fromHex("0xf62d8f1b982babdffcc6616f8b2ac54fac5224c7a1fb66121079b9a521aff4f2ade3cd7aa40baa838e522a927179ac82"), + ValidatorPubKey.fromHex("0x7e0c87bbf88d5762dfca69732bb36525d11a755fde736f28088bc17958cb8d5745a923a56c6c0b4e98c0ffd9623f9816"), + ValidatorPubKey.fromHex("0xbf1d6ae7fd84bee92a4e22bd73b3869402504736ff5af0da6e02181ae2506a248ca4e969a82ea0304a93b6bb68d29435"), + ValidatorPubKey.fromHex("0x8ec4826fcde422ba62d222274fda595cd988d27fa0ffcbc91ab7ace22d2c9617a94ba008064a5f159801dc3b1956d96f"), + ValidatorPubKey.fromHex("0x068bee5a0d17f286962fdf71fe6e9d8b2d05f8203ecf2fbc0672003ec18a53636062dabd430715b8599f1111091417dd"), + ValidatorPubKey.fromHex("0xc0e15eadc90fbf93e2deccdd58cb13b30fea11913ca39c2ee42ddf74201dae1e84553ce8c6818d91658cb8ae97573c24"), + ValidatorPubKey.fromHex("0x5a0e0446883b0a0f09ea42faffc02ebf25407159503f5b430a216a54b1b9a4272765314c267ee2f3be8fe101208a28fd"), + ValidatorPubKey.fromHex("0xc22aa9c85a08126c371c19163c940c459a478a7391cabfb170a352faa30687ef571568d4ad327a6fe69652cd0daa33af"), + ValidatorPubKey.fromHex("0xc53c961a6977d4711914b2852ac231e6dae019ce13555e189bcae94b1786f0bb3b3e8ad173c3f029758ecbc0c0b1c6f0"), + ValidatorPubKey.fromHex("0x925aefdfeaeea3402ddd678a7069c20183fed9a11f7f866215788177ba9ae9d2914874866c2dd78f79f81495ce172352"), + ValidatorPubKey.fromHex("0x4aca00821c817196db75be87cb044f36466c65e5ea3ca90c60353b3927107bdbd8ec0775dfe8c08ea123801f4443d01b"), + ValidatorPubKey.fromHex("0xb84960b4042210498cd2ab478685a1b65e2a4e3bbf2e813440e38f38659def0e5ebe9514316f125634e23ae398fa2458"), + ValidatorPubKey.fromHex("0x3dbee79b334a30be85c82ae64331ab0bd7ce371c2b5cc734212f079209a845d0f45393bbca97ffad203e0af81af4325b"), + ValidatorPubKey.fromHex("0xfd9e33dec3e8ebeeb2ec64297ace2997dc6ecf148d98067cc3aabf2419a2788160c4d670836419672eebd663999ba53b"), + ValidatorPubKey.fromHex("0xdd9de04d992ecd5991ed84567803f2195b9c0cbbf74968e60c2272ba59f741fb07e84eefd970a0507b36ad7e4bd56e7e"), + ValidatorPubKey.fromHex("0xdc8e45cb11fdf996418a930033d5fcb64ec69cf6ac4cf31bd371bd3fd576e370b98cd817caf18ad5f0074b24f7d27720"), + ValidatorPubKey.fromHex("0x341aabda461da1de4a70c254b4fb2a9d4a811a9b4c3f25559653d959d893636e1308fa18bfbfd6b4dc880ce989573425"), + ValidatorPubKey.fromHex("0xce846e2b8e9a1d7ea6e20c0645c710c5226b3fed662bb9e03f61d7d53c61fe3f1708737169f31b845905b553dccf98ea"), + ValidatorPubKey.fromHex("0xdd72c08651f9df0a7b1c765629fa498047c88013f767f46a2e5cf3fb1f677c3945c6fc68a4aa5c906acdbc07a7f5760d"), + ValidatorPubKey.fromHex("0x20bcc1ff7e47478d7427991ec79a4817a64359f83efa76ab9b5d6167abd989e984dc085546cbdec53e0b1250d808184e"), + ValidatorPubKey.fromHex("0xe16752498b4556447924ebfa1917c85e6c40591ee929051bfa3d73c64103c35823cc127b619ad418cdf574bf9e7bc8fc"), + ValidatorPubKey.fromHex("0x98f28110b52e2e86650bfd9410466c2ea331ed808eaa237e251c35aceef5df3b7ab22bdfd31adcceb3d4f53c6453936c"), + ValidatorPubKey.fromHex("0xd77b4fd7d53ebfd061ce285f872202892eb80fdef197474db4afccaf42ab3ce49ac9b5cea4762dd921d0ce82b0a94db4"), + ValidatorPubKey.fromHex("0xe3839842a9395a842c95f8ce12d252b1b9a9a530a63f211c5c0e86eed44f22dfccd255aab099d1831add9758e6edc630"), + ValidatorPubKey.fromHex("0x73ffbe5ed3bfc887ef2471c5503108d49d63ee01bbef1f1632a0d51ab9993bc0a2ef722f77a4fc5408b441a85c6d1319"), + ValidatorPubKey.fromHex("0x3fb9dc92802a74998079db011129cb47962f6b000992a378951dcd4a0d7e2c46ffe514495343f8b0f98fdcde454512e3"), + ValidatorPubKey.fromHex("0xff1bc41f9168a35c8e2cff51cb3cb2f0dcb81e98fd51fedc199127398736efe56438b840cd744c76529cda980de65962"), + ValidatorPubKey.fromHex("0x1abe1a28095abfd698c3a36a833a7441d4889022411319957eeab7ea3076d6fc6e0651b9f8913c92984e481da7efdd40"), + ValidatorPubKey.fromHex("0xc7953e7a922afa0881c729f087874ad765afebb2b6e4fc579186f7cb09a4760786cac8ffe969af4dbabd769516077b40"), + ValidatorPubKey.fromHex("0xa66b38b24acb204c04396cb960cb6669d41aa56f001ba36eb4ccdeb13d32bb896376312dc8c4827ab76581daf07cd389"), + ValidatorPubKey.fromHex("0x2414b7202ffdbf4a35464e67def794c4e1bbaf9c31049057b86208897a36bd658fd89639156213db67b31714a7ee1685"), + ValidatorPubKey.fromHex("0x1420677d08036c8d79d096b403768b5ebab97eff3faa52eba05d609382dfdfa71de966046cf8ee2013a440e916c17f5e"), + ValidatorPubKey.fromHex("0x23b555fafcec0d7415bce9d67583a6a5c21711715a64821c97d11f9878dbf87ee9a1dafcdf5bce3e5a883055e342a801"), + ValidatorPubKey.fromHex("0x37a3cef1dd8a764fe729c31038f316be87fa1c52ab1e4d25acfda5a57dac9fe58a4f6ed1fec50f7c486b5f266caa7424"), + ValidatorPubKey.fromHex("0x3dbfcf3210d3e9bcd4aff7051bb05f990eddaf04d95fd35b5fa357f90bcdf737171d1ed66a2e259eaa02fde016de6cde"), + ValidatorPubKey.fromHex("0x204aad5834d57cd257d8cf9da85af8962bb22a1afb374a1a2dd7c354311d6171bc27f64528306ffd5ed95c381a04dde1"), + ValidatorPubKey.fromHex("0x7d17a7d7a6c19d639da6037187371887ddbea526b0f8617e21ad393777d45058341c701c7500df80088690e83281b9ff"), + ValidatorPubKey.fromHex("0x6b268fe10926fd28de688ae1445fa76283896e12976545ee0e1529c330fa4b019b26b0a93ffb307e9f85806e1252cdd4"), + ValidatorPubKey.fromHex("0x31a4abc22802945fe326e2aab04d6ddc45c95d611350753eeff4ea43429b71dfe6bb12af8a0e89a9cd70ec135cdac8db"), + ValidatorPubKey.fromHex("0x2543a88b52f538004b486a00b58d3fc3bd4d6455633a1b5b3e2b838b1c43af0d8c657d1cb92c2fdab3dee471d427ff40"), + ValidatorPubKey.fromHex("0xa83ccefa4afbf8ceb2c73985ec6319f581f860920dcae1239af0a186e41399ac1918bc61d509e79169fa0c3ecb2bf727"), + ValidatorPubKey.fromHex("0x2c78cb837292eb207833a869c68538cf816846fb35d56e3af8b3b44bbd665018d4a0d070ad67dc569578b5ad07c5ab49"), + ValidatorPubKey.fromHex("0xb4c53e9c4ce3bfa7adf62a5c1de27d7d98ad0b68f5396603a6dea962e62484580b49ca3b93adbcae962045131992cabe"), + ValidatorPubKey.fromHex("0xa23c5aa88788a6b79c65df394da8816bd0c77843a3b3c45e0e25352e62f4fe617eee32ce6ccd776c5d9e3f9818d9dc04"), + ValidatorPubKey.fromHex("0xb675283ad1e4c818d97ab1c25eb8de03a28dd879a609e75e38abc3312abee8f817f4b375f3da1a5a8d26b0b78640ae93"), + ValidatorPubKey.fromHex("0xdad0b657aad9e2bbcdadaa2b21fda5e5abac21bcd7cc03629293d94e8653d388b9edf2bad61b5d5786af423483fc27a5"), + ValidatorPubKey.fromHex("0x024188d12bf492f5f7609ebb33a296a98ea174bbd85b2835297b939f0e3730901c46169b9fb9df45148cfc630ce07d7a"), + ValidatorPubKey.fromHex("0x75254539b896b7fefbdc9ccf3fde2a91c45a5e3882b2b53588568204a0a8bb97dd6fc8bb4f3bae67cf9393a48281601a"), + ValidatorPubKey.fromHex("0x4f647f752c4f63389e102a4b481a78fb7e16d536220c002f3a5c3f3aa3c72165370c0977fbcb58a2561ff5387974ca1b"), + ValidatorPubKey.fromHex("0xc67038bba68c2024268c7447639ffb4e96a737d8622878aa99141caedfe661a500740b94a4fb145e6440d633b900da4a"), + ValidatorPubKey.fromHex("0xbd6034a4dc88cde34713844b596f7738ddc373f30f4224cb665e854c75ebe2ad0f95a28db4b02efb82d9450c6c54b691"), + ValidatorPubKey.fromHex("0x982c60e8d94ba0d74f412d65fc8a567e2437ab274c664793d7a499f34bba9750678b995df5609d2dc9b5b1e35470ab89"), + ValidatorPubKey.fromHex("0xdf7065fc6c930e9e2ec2fc3a1ac774dfd95a275906ea43df5f7149776fbe866a3488443f9de3e59636af9a596efdda8c"), + ValidatorPubKey.fromHex("0x65cfdae721d55a7ea55026c39be299b79f28a825cae5356db8736088adde30cbe937fad2e942e27ec79a8eba887d0d97"), + ValidatorPubKey.fromHex("0xf7ca9f90e803f34565ca40c8b396f81fb4ec0a0f08e884c2ad34196122df59bd3a4cbe1612537b02f1e7a5fb191f853e"), + ValidatorPubKey.fromHex("0x3d81e3b6cbd7db0241e0626d64e00a8b0c8e64a66ec55a2872a4a322a73c684b9df612b8fc5b7949e7ee077c8de12886"), + ValidatorPubKey.fromHex("0xace1bbd8e0aba9c435184bdcce9a3663e792c3116acf1263f7f72be8f820a3fa89af62e0a042be940c0dfa62ab365c51"), + ValidatorPubKey.fromHex("0xed3d6d0cc64d402ab80e03b4de7b64bddfbf468434d2fa1501645f5e0b131451d0bb757c6cd99a74ef7f2c09a1844b88"), + ValidatorPubKey.fromHex("0x47b009c3c6d143e41ca9019b0cd9c9c80a9ad1265dd3733fd8a0844eefa358e72eed6186f28693f1c2e7d40dfd93daa2"), + ValidatorPubKey.fromHex("0x07fedce8f0d3c73e19a8e2d9a1e945756db7278e5f3bff1e8475628c02be32ad1374bb8826af1c05355e20d1d6f58a79"), + ValidatorPubKey.fromHex("0xb8e036e20e29eb8cb10efc07633a91080a00fb4e8981cc1a6c32f104ac544f51cd772f11865c80124b626831c70311db"), + ValidatorPubKey.fromHex("0x2152cf952943c4d978dbc5133d0f660d47291a3c7046c6c341b5361b415c9b260e34a60d72e95ac582c0ee173fbe298c"), + ValidatorPubKey.fromHex("0x2b2ec6c9303d0339c6ce9ad76fabe70b9172d2e3d7a65c25c8ca54c9532e2b243e4f434c8e4f6eaf31ee4ad579ef5047"), + ValidatorPubKey.fromHex("0xf97ac5f9e876dfead5c28faa5b81a03cd0d5d10db3255e07007c397a39ab5b3951fa5019c7d50511e32eeb217c022f97"), + ValidatorPubKey.fromHex("0x5df30c40e47b7e99b3d886a519c67a328bdeeb4bffbdb35b3b2fb1a255b2310ae6ec82fd4bb7cbef473c76c1b21fb6af"), + ValidatorPubKey.fromHex("0xedc08e12bf6dfcb5a488e2edb4c1ff3c3500aa3b86a8601d5e50d14b78b8f3a559728952a8dc4329d173d60244321014"), + ValidatorPubKey.fromHex("0x08e51326bcd56617f60192af020cd96c279f7861dddba86db7103517cc85598665f8a5c972573049684406c20d49ba9a"), + ValidatorPubKey.fromHex("0x67969f8cc333aa4df3b89ad7e3fb9ee9aa9338513e0a5854f86c0a53fdd0de0161ec61768d48bf6b09ce280f6bfbc2d8"), + ValidatorPubKey.fromHex("0x764ae0456941595a1723cb791a58ad5cc9f69171a2c88868d2be3c9711f2d69faa6fa18d2c676461c429d105ce0c438f"), + ValidatorPubKey.fromHex("0x0fc3c8805a22c1ac9e0279855cb9af40fb565f4ae634d8684cda925962b539d90b6695556af3c4ded7b0f59bc3164992"), + ValidatorPubKey.fromHex("0x56d97dfffdb4c0510712557668f16c71b5e23f863a85189488fbfd9fda22fcaabcf6a89c2038424baf333f77e3e08750"), + ValidatorPubKey.fromHex("0xf5402659851950b1d780be1adbc24bb00555cf958511efe449894278298ca5eaea06dc95aea24a7dfdb26d5e511a9c49"), + ValidatorPubKey.fromHex("0x93799b8575c4af7982b047996cf559a3caa6bed72c956506dfd8c52ce5a2b155ee65ff74a87c00e4023c39e684b52c50"), + ValidatorPubKey.fromHex("0x1e18ebd851e9bb41746c25249d9bf298235504172a3af7818c8645c78a63fbad7f51678774dd37c91ec7aa45ebf71b2c"), + ValidatorPubKey.fromHex("0x93b8f1f1f2dcc9241362ac8427180d0ad4289bdce419dc509a84659310e52424cbc5591cd97f8f1bf06d50222048eaae"), + ValidatorPubKey.fromHex("0xccbfc97454592b224136af85c87f553b118d88dcb67c9a77739c0715063e0c93cea1b323ff2d03eea6d807cb1fe91662"), + ValidatorPubKey.fromHex("0x05152fd70ac2916791bac13e4537141f5e48a4b3478e2434ec9a28bb7bd1f3322cd50e4b4ff71013e8a10690998e1615"), + ValidatorPubKey.fromHex("0xb586758d3a23c2568c327540620ac96227c0bae313ad867c066b2c8d44fe8eef40069fc27cb65dcc2b2716492d530c8a"), + ValidatorPubKey.fromHex("0x0e042382adde45efb4fcb15c246aadc72a6600456528db1206a012e35149a673fbc18144f025b4f48ba1d60832e954cc"), + ValidatorPubKey.fromHex("0x7e2d4015b9d19bfb8425f119f0e0de99cd18c63f6687d302d6129b690ab6d981c93b43b795af870444020fd21d44eeda"), + ValidatorPubKey.fromHex("0x0f21d5d7ab25cebc9e669eb7817bd58726811766551e4672b9c48f4401d18aacda6be15cee76bbb3428581bd958226b2"), + ValidatorPubKey.fromHex("0xa8a5610bbfa03b641646a9132aa6858cd2969f116cea3774f3429e82acdcdcd6276d5a8ddb629f2a43cadf1c11d47b86"), + ValidatorPubKey.fromHex("0xcf9a6236b081a03821714c6f3fe1e0c3cad6e364c70590a06bdb974a0989b0296a5aec31f776c448617f95f22bf35f37"), + ValidatorPubKey.fromHex("0x5fdf7cb380287d3b1e185d6444e67707c8c8138f26b4d21b0863b451f5024d9f6c36b560a7abcf9ebfebeb7857d22c91"), + ValidatorPubKey.fromHex("0x8f7ca4292265224d5cc9e2e5c1b2e28ac201cc2890ef0bb2a1d1448a99f1a9a0d871bd87523c15f81bc600b7adcd614f"), + ValidatorPubKey.fromHex("0x271f9d3c83947315f645a329fe31f930496d1325315e0b0303929db1fea279cbbb7abfbd63cdf1cf6a55d689377c3eb0"), + ValidatorPubKey.fromHex("0x3f062a6d6a9f29554680951605415013c20d6cecaa53c2a540520204bfbe30f4324652379da800f71cf515bdfd0c0356"), + ValidatorPubKey.fromHex("0xcc0247bd8e379d26b23ee118407e9c31f57d2c4b37b5fbeca93108702ef40030b74fcf1b1291f58792cc01e3d08d915a"), + ValidatorPubKey.fromHex("0x0a815516a56da73e476e715a9dbb1f97a24362fb9c9e304d18df5e25ad63e9a7074d343e4e7cc82a02a250c68cc1f7b8"), + ValidatorPubKey.fromHex("0xb4f606c8452095c153e5fa9b8d99a9e9ef150ebaa48de46941926f0d627b0f964ef5132bbd8a41c64433c62c9a839f1e"), + ValidatorPubKey.fromHex("0x48d2406f1c49ac30da158f8d5f9e93f3329b78edc2b6788f3c1d073cd4a5b5d5f28b4d9da3c8af6b431afc1ad1e6189a"), + ValidatorPubKey.fromHex("0x222bc67ec7b3a01e5435fe36fa3e65e1a780503c7dce5ad2016971f468eda413787cc7131d109e1025c23a23bc518897"), + ValidatorPubKey.fromHex("0x4def4bbc0a1724866755e37fbceb92a2182d9f2b646f0accca3e17e134c70e224d0e10f3280a4fdce36965bd8e97ce9f"), + ValidatorPubKey.fromHex("0xacc34baaf23f47ebb0bfb33bb8d3f6d7db33a2a43357b44814be37d5a05b1ed87de18628692eeed7f701802fc600eb76"), + ValidatorPubKey.fromHex("0xc15fd7a4df0b23726de242a7a98df1cdf0073be7f15d9f2b63cb76c20b19c961412f1bfb1b57660f2bc4316c745044d3"), + ValidatorPubKey.fromHex("0x213202d275fc352a3717809ad83d2845d375cdec756dc246c5624c01a99c64b35c89ebdd5c4e5680151e7a14558fece8"), + ValidatorPubKey.fromHex("0xee9804870785865e8b2fed70a18c4540839174b7b4372199c9aead159a5e33fb10ed2c55367c77c6ea19e46e6f68b76e"), + ValidatorPubKey.fromHex("0x85c220efc7552b4da736a1488f828948a00395490eef5d7455584cd4ff153daf2097d92f54f7afaacbac36ab0aa14770"), + ValidatorPubKey.fromHex("0x02f8e0af7f55aa635be0fb8542a96365baadeb96953b269adf93ebdeff121a292c3a760bc02b0dcc11a4fc7d0f5fd016"), + ValidatorPubKey.fromHex("0x68dcfdc8a0111ef6dd3d9e66a74e72e00c9ef74e84a29d446da4a52188142438c6448241d27aff2d5bd29f33dd5af53d"), + ValidatorPubKey.fromHex("0x11746eedf0dbd72974e1fe05760bb1c8f433b1356e89eb3ebff8b80998d5cb5a0039a30d66a96697efae6304d0c622d9"), + ValidatorPubKey.fromHex("0xf8d4089b72130d41f204d2a8041e8ca9253c097cc96a30944e24a9f2d367ec718d4812cba6aa9cb76ffe4e709faf279e"), + ValidatorPubKey.fromHex("0x1b268552b698c1b5f03df6a24ef167431ea50daa2d46091382acd7ee81a32c59f95be51699b7ff6b5005f1100fa2d79f"), + ValidatorPubKey.fromHex("0xf8a2120edc919bd33930eab1053636c661d9d5c76c431ea36b061b47863bd064fdf92ccb403f14b849f963540b907872"), + ValidatorPubKey.fromHex("0x62ed9fc80d29b0b718badf1b6a86bea6870ae6a42dc49a010aa540a54f2dbccdd5bfea6423e9f9364b06862066497676"), + ValidatorPubKey.fromHex("0x63b9989f1cdf949ef56b9bb930975a3d6de7478ecf5a7e13663596a2ac46487c13141c5f8a214159b7d9a6bd66482065"), + ValidatorPubKey.fromHex("0x5bec9e3cc45d40749bd1ec8bb94293c2100237741d53e2ea5563dbdb262effca4959be6938871d878a83a85108c5e5f4"), + ValidatorPubKey.fromHex("0xe016535d3988fedc2d5c0e970ed32fc260ef6552e4966b587f045f6b295c519a2944f757387c44838316ed5db1f18821"), + ValidatorPubKey.fromHex("0x58d2ce59fb8d93ab87c6a13c04261cdb29455528405770426dc56f21a0fc81d93b8071c9619dc06e978d7f54a7998d37"), + ValidatorPubKey.fromHex("0x0d8e02c02eced67122964d422c00cf94650261e456374534bd75776915abd0ab6ecb272175ff4721576533f81efcbef9"), + ValidatorPubKey.fromHex("0xbd1d1f66acf0cc16b259c03192fd23df1f0255904cbc1e57d45e2ddb23aa90e5e86e3763016c41d91a969913a84204df"), + ValidatorPubKey.fromHex("0xb44d6e213628d3c881a2bc70ffe347824c53d5f37adbadb955dfcdbfa5e7dc098a629ee0f1a8723b8f13530dc56479af"), + ValidatorPubKey.fromHex("0x6570a77a68ba5522b56ced31052f2f7f3c29ffae668cd8741c122b1b84913349c3d8d19dcff9e3f3576094f55273f047"), + ValidatorPubKey.fromHex("0x59f4ce46b322c54f4f416ad8d94a1dcbd04198036849337f88bc3c6f7d757f49a9b6cd18ca6f5b296fbef45ee5105aca"), + ValidatorPubKey.fromHex("0xdc8808fce77f5bb51990163bd58408a0864c502651e8291d74f3fb85044ff343e5eaa4b74ac7d15596e15938f894c2c3")] + +func findValidatorIndexBruteforce( + validators: openArray[Validator], bsv: BucketSortedValidators, + h2: ValidatorPubKey): Opt[ValidatorIndex] = + for validatorIndex in bsv.extraItems: + if validators[validatorIndex.distinctBase].pubkey == h2: + return Opt.some validatorIndex.ValidatorIndex + for validatorIndex in bsv.bucketSorted: + if validators[validatorIndex].pubkey == h2: + return Opt.some validatorIndex.ValidatorIndex + Opt.none ValidatorIndex + +suite "ValidatorPubKey bucket sort": + setup: + var hashedPubkeyItems = mapIt(pubkeys, HashedValidatorPubKeyItem( + key: it.get, root: hash_tree_root(it.get))) + let + hashedPubkeys = mapIt(hashedPubkeyItems, HashedValidatorPubKey( + value: unsafeAddr it)) + validators = mapIt(hashedPubkeys, Validator(pubkeyData: it)) + + test "one-shot construction": + let bsv = sortValidatorBuckets( + validators.toOpenArray(0, 7*validators.len div 8)) + for vidx in 0 ..< validators.len: + check findValidatorIndex(validators, bsv[], validators[vidx].pubkey) == + findValidatorIndexBruteforce(validators, bsv[], validators[vidx].pubkey) + + test "incremental construction": + let bsv = sortValidatorBuckets([]) + template rv: untyped = validators.toOpenArray(0, 7*validators.len div 8) + for vidx in 0 ..< len(rv): + bsv[].add vidx.ValidatorIndex + for vidx, validator in validators: + let foundIdx = findValidatorIndex(rv, bsv[], validator.pubkey) + check: + foundIdx == findValidatorIndexBruteforce(rv, bsv[], validator.pubkey) + foundIdx.isOk == (vidx < rv.len) \ No newline at end of file diff --git a/tests/teststateutil.nim b/tests/teststateutil.nim index 2eb8a12d1..93105cc0a 100644 --- a/tests/teststateutil.nim +++ b/tests/teststateutil.nim @@ -10,13 +10,12 @@ import chronicles, ./mocking/mock_deposits, - ../beacon_chain/spec/[ - forks, state_transition, state_transition_block] + ../beacon_chain/spec/[forks, state_transition] -from ".."/beacon_chain/bloomfilter import constructBloomFilter +from ".."/beacon_chain/validator_bucket_sort import sortValidatorBuckets from ".."/beacon_chain/spec/state_transition_epoch import - get_validator_balance_after_epoch, process_epoch - + get_validator_balance_after_epoch, get_next_slot_expected_withdrawals, + process_epoch func round_multiple_down(x: Gwei, n: Gwei): Gwei = ## Round the input to the previous multiple of "n" @@ -39,7 +38,7 @@ proc valid_deposit(state: var ForkyHashedBeaconState) = 0.Gwei doAssert process_deposit( defaultRuntimeConfig, state.data, - constructBloomFilter(state.data.validators.asSeq)[], deposit, {}).isOk + sortValidatorBuckets(state.data.validators.asSeq)[], deposit, {}).isOk doAssert state.data.validators.len == pre_val_count + 1 doAssert state.data.balances.len == pre_val_count + 1 doAssert state.data.balances.item(validator_index) == pre_balance + deposit.data.amount @@ -102,6 +101,9 @@ proc getTestStates*( if tmpState[].kind == consensusFork: result.add assignClone(tmpState[]) +from std/sequtils import allIt +from ".."/beacon_chain/spec/beaconstate import get_expected_withdrawals + proc checkPerValidatorBalanceCalc*( state: deneb.BeaconState | electra.BeaconState): bool = var @@ -109,10 +111,9 @@ proc checkPerValidatorBalanceCalc*( cache: StateCache let tmpState = newClone(state) # slow, but tolerable for tests discard process_epoch(defaultRuntimeConfig, tmpState[], {}, cache, info) - for i in 0 ..< tmpState.balances.len: - if tmpState.balances.item(i) != get_validator_balance_after_epoch( - defaultRuntimeConfig, state, default(UpdateFlags), cache, info, - i.ValidatorIndex): - return false - true + allIt(0 ..< tmpState.balances.len, + tmpState.balances.item(it) == get_validator_balance_after_epoch( + defaultRuntimeConfig, state, cache, info, it.ValidatorIndex)) and + get_expected_withdrawals(tmpState[]) == get_next_slot_expected_withdrawals( + defaultRuntimeConfig, state, cache, info) diff --git a/vendor/nim-bearssl b/vendor/nim-bearssl index 646fa2152..667b40440 160000 --- a/vendor/nim-bearssl +++ b/vendor/nim-bearssl @@ -1 +1 @@ -Subproject commit 646fa2152b11980c24bf34b3e214b479c9d25f21 +Subproject commit 667b40440a53a58e9f922e29e20818720c62d9ac diff --git a/vendor/nim-blscurve b/vendor/nim-blscurve index 1d0d886cd..d5d595a59 160000 --- a/vendor/nim-blscurve +++ b/vendor/nim-blscurve @@ -1 +1 @@ -Subproject commit 1d0d886cdcb17b25108c7b904f84819629c0e4fb +Subproject commit d5d595a59ca906898c51af7f9511a01082435393 diff --git a/vendor/nim-chronos b/vendor/nim-chronos index 1b9d9253e..dc3847e4d 160000 --- a/vendor/nim-chronos +++ b/vendor/nim-chronos @@ -1 +1 @@ -Subproject commit 1b9d9253e89445d585d0fff39cc0d19254fdfd0d +Subproject commit dc3847e4d6733dfc3811454c2a9c384b87343e26 diff --git a/vendor/nim-eth b/vendor/nim-eth index ebfe63b9b..cc6d88962 160000 --- a/vendor/nim-eth +++ b/vendor/nim-eth @@ -1 +1 @@ -Subproject commit ebfe63b9b6523a1823e4505f0972d81047a77cf5 +Subproject commit cc6d88962e4a22170361b576534246bd57974d80 diff --git a/vendor/nim-eth2-scenarios b/vendor/nim-eth2-scenarios index fc7a45a73..4748d8387 160000 --- a/vendor/nim-eth2-scenarios +++ b/vendor/nim-eth2-scenarios @@ -1 +1 @@ -Subproject commit fc7a45a731736248b96ad5827a8356c0e14d3b8c +Subproject commit 4748d838797fd42bcb57c38f682adcb4522a152a diff --git a/vendor/nim-json-rpc b/vendor/nim-json-rpc index 8e1cdb182..e27c10ad4 160000 --- a/vendor/nim-json-rpc +++ b/vendor/nim-json-rpc @@ -1 +1 @@ -Subproject commit 8e1cdb18230f7e7172b4b4aa503b0d66fe530942 +Subproject commit e27c10ad4172e67f71a78044f53de073e7401390 diff --git a/vendor/nim-kzg4844 b/vendor/nim-kzg4844 index 2f5cee7be..7bd7f115d 160000 --- a/vendor/nim-kzg4844 +++ b/vendor/nim-kzg4844 @@ -1 +1 @@ -Subproject commit 2f5cee7bea0d62e2b502ff668f752bda7f3eb0c4 +Subproject commit 7bd7f115db8983be2549ce1a55891355c404fdc0 diff --git a/vendor/nim-metrics b/vendor/nim-metrics index 5f5e0f843..4337ccd62 160000 --- a/vendor/nim-metrics +++ b/vendor/nim-metrics @@ -1 +1 @@ -Subproject commit 5f5e0f84349775069d048a6aa6194c1df383abb5 +Subproject commit 4337ccd62c0b7d57492402dd4cb838ddc0c78a84 diff --git a/vendor/nim-normalize b/vendor/nim-normalize index b828f0703..331d1a252 160000 --- a/vendor/nim-normalize +++ b/vendor/nim-normalize @@ -1 +1 @@ -Subproject commit b828f07037c87382b7f20f96e6cca6e85788dd25 +Subproject commit 331d1a252f309f5d0813f7cdbabafc15606369a2 diff --git a/vendor/nim-results b/vendor/nim-results index e2adf66b8..410afe8ac 160000 --- a/vendor/nim-results +++ b/vendor/nim-results @@ -1 +1 @@ -Subproject commit e2adf66b8bc2f41606e8469a5f0a850d1e545b55 +Subproject commit 410afe8acdda0b746582883e951243b6652dee3c diff --git a/vendor/nim-secp256k1 b/vendor/nim-secp256k1 index 194b715b1..4470f49bc 160000 --- a/vendor/nim-secp256k1 +++ b/vendor/nim-secp256k1 @@ -1 +1 @@ -Subproject commit 194b715b16766e383b5aef92dd779fb182faf45d +Subproject commit 4470f49bcd6bcbfb59f0eeb67315ca9ddac0bdc0 diff --git a/vendor/nim-sqlite3-abi b/vendor/nim-sqlite3-abi index 262fa35f0..acd3c3274 160000 --- a/vendor/nim-sqlite3-abi +++ b/vendor/nim-sqlite3-abi @@ -1 +1 @@ -Subproject commit 262fa35f092cb254abd6eff2a9d46b99392a6dca +Subproject commit acd3c327433784226b412757bdb5455b5be04c55 diff --git a/vendor/nim-ssz-serialization b/vendor/nim-ssz-serialization index 776be028d..9380db03e 160000 --- a/vendor/nim-ssz-serialization +++ b/vendor/nim-ssz-serialization @@ -1 +1 @@ -Subproject commit 776be028de407d7e0a2ca8ac3e0b0a0902413ff6 +Subproject commit 9380db03e7db00e7e75a401f38b87e2cfb848f6c diff --git a/vendor/nim-stew b/vendor/nim-stew index bb086e69d..af07b0a70 160000 --- a/vendor/nim-stew +++ b/vendor/nim-stew @@ -1 +1 @@ -Subproject commit bb086e69da967ad235ed6c31247769e75b318e61 +Subproject commit af07b0a70dbd5528cbca9d944b0aa8b7bea92963 diff --git a/vendor/nim-stint b/vendor/nim-stint index 9d2b382c5..7c81df9ad 160000 --- a/vendor/nim-stint +++ b/vendor/nim-stint @@ -1 +1 @@ -Subproject commit 9d2b382c5dc34f0d6bbd93b2a5d65dde85067e0f +Subproject commit 7c81df9adc80088f46a4c2b8bf2a46c26fab057c diff --git a/vendor/nim-toml-serialization b/vendor/nim-toml-serialization index 24bbfcb8e..cb1fc73f3 160000 --- a/vendor/nim-toml-serialization +++ b/vendor/nim-toml-serialization @@ -1 +1 @@ -Subproject commit 24bbfcb8e4e256883fc959dc6f5c15fe7a84fca5 +Subproject commit cb1fc73f3519fed5f3a8fbfa90afc9a96d5f5f5c diff --git a/vendor/nim-unicodedb b/vendor/nim-unicodedb index 3db16f8ec..8c8959d84 160000 --- a/vendor/nim-unicodedb +++ b/vendor/nim-unicodedb @@ -1 +1 @@ -Subproject commit 3db16f8ece5d0eba310c8f1ed812c6ff5a21a34a +Subproject commit 8c8959d84c12ecda6ea14c67bd68675b1936f8cf diff --git a/vendor/sepolia b/vendor/sepolia index f53301cf3..b97e62eee 160000 --- a/vendor/sepolia +++ b/vendor/sepolia @@ -1 +1 @@ -Subproject commit f53301cf3268363c36e22f0205111350276e41ac +Subproject commit b97e62eee42362d7f85f7167ddfa19fe3635562d