diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml index 07677c1c73e3..446612b44250 100644 --- a/.github/workflows/fuzz.yml +++ b/.github/workflows/fuzz.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: - go-version: '1.22.3' + go-version: '1.22.10' - id: list uses: shogo82148/actions-go-fuzz/list@v0 with: @@ -36,7 +36,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: - go-version: '1.22.3' + go-version: '1.22.10' - uses: shogo82148/actions-go-fuzz/run@v0 with: packages: ${{ matrix.package }} diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 3e4ebb522a4a..2fbeaf602bf5 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -31,7 +31,7 @@ jobs: - name: Set up Go 1.22 uses: actions/setup-go@v4 with: - go-version: '1.22.6' + go-version: '1.22.10' - name: Run Gosec Security Scanner run: | # https://github.com/securego/gosec/issues/469 export PATH=$PATH:$(go env GOPATH)/bin @@ -48,7 +48,7 @@ jobs: - name: Set up Go 1.22 uses: actions/setup-go@v4 with: - go-version: '1.22.6' + go-version: '1.22.10' id: go - name: Golangci-lint @@ -64,7 +64,7 @@ jobs: - name: Set up Go 1.x uses: actions/setup-go@v4 with: - go-version: '1.22.6' + go-version: '1.22.10' id: go - name: Check out code into the Go module directory diff --git a/.golangci.yml b/.golangci.yml index 2b97b973fa4c..445203a9f435 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -6,7 +6,7 @@ run: - proto - tools/analyzers timeout: 10m - go: '1.22.6' + go: '1.22.10' linters: enable-all: true diff --git a/CHANGELOG.md b/CHANGELOG.md index cb3f3be55d74..9b983e9755bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,9 @@ The format is based on Keep a Changelog, and this project adheres to Semantic Ve - Log before blob filesystem cache warm-up. - New design for the attestation pool. [PR](https://github.com/prysmaticlabs/prysm/pull/14324) - Add field param placeholder for Electra blob target and max to pass spec tests. +- Add EIP-7691: Blob throughput increase. +- SSZ files generation: Remove the `// Hash: ...` header. +- Add Fulu fork boilerplate. ### Changed @@ -29,19 +32,27 @@ The format is based on Keep a Changelog, and this project adheres to Semantic Ve - Limit consolidating by validator's effective balance. - Use 16-bit random value for proposer and sync committee selection filter. - Re-organize the content of the `*.proto` files (No functional change). +- Updated spec definition electra `process_registry_updates`. +- Updated Electra spec definition for `process_epoch`. +- Update our `go-libp2p-pubsub` dependency. +- Re-organize the content of files to ease the creation of a new fork boilerplate. ### Deprecated ### Removed +- Cleanup ProcessSlashings method to remove unnecessary argument. +- Remove `/proto/eth/v2` directory. [PR](https://github.com/prysmaticlabs/prysm/pull/14765) ### Fixed - Added check to prevent nil pointer deference or out of bounds array access when validating the BLSToExecutionChange on an impossibly nil validator. +- EIP-7691: Ensure new blobs subnets are subscribed on epoch in advance. ### Security +- go version upgrade to 1.22.10 for CVE CVE-2024-34156 ## [v5.2.0](https://github.com/prysmaticlabs/prysm/compare/v5.1.2...v5.2.0) @@ -145,7 +156,7 @@ Notable features: - Removed finalized validator index cache, no longer needed. - Removed validator queue position log on key reload and wait for activation. - Removed outdated spectest exclusions for EIP-6110. -- Removed support for starting a beacon node with a deterministic interop genesis state via interop flags. Alteratively, create a genesis state with prysmctl and use `--genesis-state`. This removes about 9Mb (~11%) of unnecessary code and dependencies from the final production binary. +- Removed support for starting a beacon node with a deterministic interop genesis state via interop flags. Alternatively, create a genesis state with prysmctl and use `--genesis-state`. This removes about 9Mb (~11%) of unnecessary code and dependencies from the final production binary. - Removed kzg proof check from blob reconstructor. ### Fixed @@ -159,7 +170,7 @@ Notable features: - Fix `--backfill-oldest-slot` handling - this flag was totally broken, the code would always backfill to the default slot [pr](https://github.com/prysmaticlabs/prysm/pull/14584) - Fix keymanager API should return corrected error format for malformed tokens - Fix keymanager API so that get keys returns an empty response instead of a 500 error when using an unsupported keystore. -- Small log imporvement, removing some redundant or duplicate logs +- Small log improvement, removing some redundant or duplicate logs - EIP7521 - Fixes withdrawal bug by accounting for pending partial withdrawals and deducting already withdrawn amounts from the sweep balance. [PR](https://github.com/prysmaticlabs/prysm/pull/14578) - unskip electra merkle spec test - Fix panic in validator REST mode when checking status after removing all keys @@ -189,7 +200,7 @@ meantime we are issuing a patch that recovers from the panic to prevent the node This only impacts the v5.1.1 release beacon api event stream endpoints. This endpoint is used by the prysm REST mode validator (a feature which requires the validator to be configured to use the beacon -api intead of prysm's stock grpc endpoints) or accessory software that connects to the events api, +api instead of prysm's stock grpc endpoints) or accessory software that connects to the events api, like https://github.com/ethpandaops/ethereum-metrics-exporter ### Fixed @@ -432,7 +443,7 @@ Updating to this release is recommended at your earliest convenience, especially - use time.NewTimer() to avoid possible memory leaks - paranoid underflow protection without error handling - Fix CommitteeAssignments to not return every validator -- Fix dependent root retrival genesis case +- Fix dependent root retrieval genesis case - Restrict Dials From Discovery - Always close cache warm chan to prevent blocking - Keep only the latest value in the health channel @@ -584,7 +595,7 @@ block profit. If you want to preserve the existing behavior, set --local-block-v - handle special case of batch size=1 - Always Set Inprogress Boolean In Cache - Builder APIs: adding headers to post endpoint -- Rename mispelled variable +- Rename misspelled variable - allow blob by root within da period - Rewrite Pruning Implementation To Handle EIP 7045 - Set default fee recipient if tracked val fails @@ -654,7 +665,7 @@ Known Issues - Support beacon_committee_selections - /eth/v1/beacon/deposit_snapshot - Docker images now have coreutils pre-installed -- da_waited_time_milliseconds tracks total time waiting for data availablity check in ReceiveBlock +- da_waited_time_milliseconds tracks total time waiting for data availability check in ReceiveBlock - blob_written, blob_disk_count, blob_disk_bytes new metrics for tracking blobs on disk - Backfill supports blob backfilling - Add mainnet deneb fork epoch config @@ -829,7 +840,7 @@ and Raspberry Pi users. - Add Goerli Deneb Fork Epoch - Use deneb key for deneb state in saveStatesEfficientInternal - Initialize Inactivity Scores Correctly -- Excluse DA wait time for chain processing time +- Excludes DA wait time for chain processing time - Initialize sig cache for verification.Initializer - Verify roblobs - KZG Commitment inclusion proof verifier @@ -862,7 +873,7 @@ and Raspberry Pi users. - Exit early if blob by root request is empty - Request missing blobs while processing pending queue - Check blob exists before requesting from peer -- Passing block as arugment for sidecar validation +- Passing block as argument for sidecar validation #### Blob Management @@ -1159,13 +1170,13 @@ _Most of the PRs here involve shifting our http endpoints to using vanilla http - Remove no-op cancel func - Update Terms of Service - fix head slot in log -- DEPRECTATION: Remove exchange transition configuration call +- DEPRECATION: Remove exchange transition configuration call - fix segmentation fork when Capella for epoch is MaxUint64 - Return Error Gracefully When Removing 4881 Flag - Add zero length check on indices during NextSyncCommitteeIndices - Replace Empty Slice Literals with Nil Slices - Refactor Error String Formatting According to Go Best Practices -- Fix redundant type converstion +- Fix redundant type conversion - docs: fix typo - Add Clarification To Sync Committee Cache - Fix typos @@ -1187,7 +1198,7 @@ small set of users. ### Security -No security issues in thsi release. +No security issues in this release. ## [v4.1.0](https://github.com/prysmaticlabs/prysm/compare/v4.0.8...v4.1.0) - 2023-08-22 @@ -1703,7 +1714,7 @@ notes [here](https://hackmd.io/TtyFurRJRKuklG3n8lMO9Q). This release is **strong Note: The released docker images are using the portable version of the blst cryptography library. The Prysm team will release docker images with the non-portable blst library as the default image. In the meantime, you can compile docker images with blst non-portable locally with the `--define=blst_modern=true` bazel flag, use the "-modern-" assets -attached to releases, or set environment varaible USE_PRYSM_MODERN=true when using prysm.sh. +attached to releases, or set environment variable USE_PRYSM_MODERN=true when using prysm.sh. ### Added @@ -2052,7 +2063,7 @@ There are some known issues with this release. - Beacon node can bootstrap from non-genesis state (i.e bellatrix state) - Refactor bytesutil, add support for go1.20 slice to array conversions - Add Span information for attestation record save request -- Matric addition +- Metric addition - Identify invalid signature within batch verification - Support for getting consensus values from beacon config - EIP-4881: Spec implementation @@ -2118,7 +2129,7 @@ See [flashbots/mev-boost#404](https://github.com/flashbots/mev-boost/issues/404) - Added more histogram metrics for block arrival latency times block_arrival_latency_milliseconds - Priority queue RetrieveByKey now uses read lock instead of write lock - Use custom types for certain ethclient requests. Fixes an issue when using prysm on gnosis chain. -- Updted forkchoice endpoint /eth/v1/debug/forkchoice (was /eth/v1/debug/beacon/forkchoice) +- Updated forkchoice endpoint /eth/v1/debug/forkchoice (was /eth/v1/debug/beacon/forkchoice) - Include empty fields in builder json client. - Computing committee assignments for slots older than the oldest historical root in the beacon state is now forbidden @@ -2350,7 +2361,7 @@ There are no security updates in this release. removed: `GetBeaconState`, `ProduceBlock`, `ListForkChoiceHeads`, `ListBlocks`, `SubmitValidatorRegistration`, `GetBlock`, `ProposeBlock` - API: Forkchoice method `GetForkChoice` has been removed. - All previously deprecated feature flags have been - removed. `--enable-active-balance-cache`, `--correctly-prune-canonical-atts`, `--correctly-insert-orphaned-atts`, `--enable-next-slot-state-cache`, `--enable-batch-gossip-verification`, `--enable-get-block-optimizations`, `--enable-balance-trie-computation`, `--disable-next-slot-state-cache`, `--attestation-aggregation-strategy`, `--attestation-aggregation-force-opt-maxcover`, `--pyrmont`, `--disable-get-block-optimizations`, `--disable-proposer-atts-selection-using-max-cover`, `--disable-optimized-balance-update`, `--disable-active-balance-cache`, `--disable-balance-trie-computation`, `--disable-batch-gossip-verification`, `--disable-correctly-prune-canonical-atts`, `--disable-correctly-insert-orphaned-atts`, `--enable-native-state`, `--enable-peer-scorer`, `--enable-gossip-batch-aggregation`, `--experimental-disable-boundry-checks` + removed. `--enable-active-balance-cache`, `--correctly-prune-canonical-atts`, `--correctly-insert-orphaned-atts`, `--enable-next-slot-state-cache`, `--enable-batch-gossip-verification`, `--enable-get-block-optimizations`, `--enable-balance-trie-computation`, `--disable-next-slot-state-cache`, `--attestation-aggregation-strategy`, `--attestation-aggregation-force-opt-maxcover`, `--pyrmont`, `--disable-get-block-optimizations`, `--disable-proposer-atts-selection-using-max-cover`, `--disable-optimized-balance-update`, `--disable-active-balance-cache`, `--disable-balance-trie-computation`, `--disable-batch-gossip-verification`, `--disable-correctly-prune-canonical-atts`, `--disable-correctly-insert-orphaned-atts`, `--enable-native-state`, `--enable-peer-scorer`, `--enable-gossip-batch-aggregation`, `--experimental-disable-boundary-checks` - Validator Web API: Removed unused ImportAccounts and DeleteAccounts rpc options ### Fixed @@ -2747,7 +2758,7 @@ notes [here](https://github.com/prysmaticlabs/prysm-web-ui/releases/tag/v1.0.0) - Added uint64 overflow protection - Sync committee pool returns empty slice instead of nil on cache miss - Improved description of datadir flag -- Simplied web password requirements +- Simplified web password requirements - Web JWT tokens no longer expire. - Updated keymanager protos - Watch and update jwt secret when auth token file updated on disk. @@ -2758,7 +2769,7 @@ notes [here](https://github.com/prysmaticlabs/prysm-web-ui/releases/tag/v1.0.0) - Refactor for weak subjectivity sync implementation - Update naming for Atlair previous epoch attester - Remove duplicate MerkleizeTrieLeaves method. -- Add explict error for validator flag checks on out of bound positions +- Add explicit error for validator flag checks on out of bound positions - Simplify method to check if the beacon chain client should update the justified epoch value. - Rename web UI performance endpoint to "summary" - Refactor powchain service to be more functional @@ -2784,7 +2795,7 @@ notes [here](https://github.com/prysmaticlabs/prysm-web-ui/releases/tag/v1.0.0) Upstream go-ethereum is now used with familiar go.mod tooling. - Removed duplicate aggergation validation p2p pipelines. - Metrics calculation removed extra condition -- Removed superflous errors from peer scoring parameters registration +- Removed superfluous errors from peer scoring parameters registration ### Fixed diff --git a/WORKSPACE b/WORKSPACE index 8575c6896a31..9fa4a648bc31 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -182,7 +182,7 @@ load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_depe go_rules_dependencies() go_register_toolchains( - go_version = "1.22.4", + go_version = "1.22.10", nogo = "@//:nogo", ) diff --git a/api/client/builder/client_test.go b/api/client/builder/client_test.go index 02070acdb3d6..816363469bb6 100644 --- a/api/client/builder/client_test.go +++ b/api/client/builder/client_test.go @@ -16,7 +16,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/config/params" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" - types "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" v1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" eth "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" @@ -124,7 +123,7 @@ func TestClient_RegisterValidator(t *testing.T) { func TestClient_GetHeader(t *testing.T) { ctx := context.Background() expectedPath := "/eth/v1/builder/header/23/0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2/0x93247f2209abcacf57b75a51dafae777f9dd38bc7053d1af526f220a7489a6d3a2753e5f3e8b1cfe39b56f43611df74a" - var slot types.Slot = 23 + var slot primitives.Slot = 23 parentHash := ezDecode(t, "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2") pubkey := ezDecode(t, "0x93247f2209abcacf57b75a51dafae777f9dd38bc7053d1af526f220a7489a6d3a2753e5f3e8b1cfe39b56f43611df74a") t.Run("server error", func(t *testing.T) { @@ -370,7 +369,7 @@ func TestSubmitBlindedBlock(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(withdrawals)) assert.Equal(t, uint64(1), withdrawals[0].Index) - assert.Equal(t, types.ValidatorIndex(1), withdrawals[0].ValidatorIndex) + assert.Equal(t, primitives.ValidatorIndex(1), withdrawals[0].ValidatorIndex) assert.DeepEqual(t, ezDecode(t, "0xcf8e0d4e9587369b2301d0790347320302cc0943"), withdrawals[0].Address) assert.Equal(t, uint64(1), withdrawals[0].Amount) }) @@ -409,7 +408,7 @@ func TestSubmitBlindedBlock(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(withdrawals)) assert.Equal(t, uint64(1), withdrawals[0].Index) - assert.Equal(t, types.ValidatorIndex(1), withdrawals[0].ValidatorIndex) + assert.Equal(t, primitives.ValidatorIndex(1), withdrawals[0].ValidatorIndex) assert.DeepEqual(t, ezDecode(t, "0xcf8e0d4e9587369b2301d0790347320302cc0943"), withdrawals[0].Address) assert.Equal(t, uint64(1), withdrawals[0].Amount) require.NotNil(t, blobBundle) diff --git a/api/server/structs/block.go b/api/server/structs/block.go index c53ce6a663ae..288d6c781639 100644 --- a/api/server/structs/block.go +++ b/api/server/structs/block.go @@ -14,6 +14,10 @@ type SignedMessageJsoner interface { SigString() string } +// ---------------------------------------------------------------------------- +// Phase 0 +// ---------------------------------------------------------------------------- + type SignedBeaconBlock struct { Message *BeaconBlock `json:"message"` Signature string `json:"signature"` @@ -48,6 +52,29 @@ type BeaconBlockBody struct { VoluntaryExits []*SignedVoluntaryExit `json:"voluntary_exits"` } +type SignedBeaconBlockHeaderContainer struct { + Header *SignedBeaconBlockHeader `json:"header"` + Root string `json:"root"` + Canonical bool `json:"canonical"` +} + +type SignedBeaconBlockHeader struct { + Message *BeaconBlockHeader `json:"message"` + Signature string `json:"signature"` +} + +type BeaconBlockHeader struct { + Slot string `json:"slot"` + ProposerIndex string `json:"proposer_index"` + ParentRoot string `json:"parent_root"` + StateRoot string `json:"state_root"` + BodyRoot string `json:"body_root"` +} + +// ---------------------------------------------------------------------------- +// Altair +// ---------------------------------------------------------------------------- + type SignedBeaconBlockAltair struct { Message *BeaconBlockAltair `json:"message"` Signature string `json:"signature"` @@ -83,6 +110,10 @@ type BeaconBlockBodyAltair struct { SyncAggregate *SyncAggregate `json:"sync_aggregate"` } +// ---------------------------------------------------------------------------- +// Bellatrix +// ---------------------------------------------------------------------------- + type SignedBeaconBlockBellatrix struct { Message *BeaconBlockBellatrix `json:"message"` Signature string `json:"signature"` @@ -155,6 +186,44 @@ type BlindedBeaconBlockBodyBellatrix struct { ExecutionPayloadHeader *ExecutionPayloadHeader `json:"execution_payload_header"` } +type ExecutionPayload struct { + ParentHash string `json:"parent_hash"` + FeeRecipient string `json:"fee_recipient"` + StateRoot string `json:"state_root"` + ReceiptsRoot string `json:"receipts_root"` + LogsBloom string `json:"logs_bloom"` + PrevRandao string `json:"prev_randao"` + BlockNumber string `json:"block_number"` + GasLimit string `json:"gas_limit"` + GasUsed string `json:"gas_used"` + Timestamp string `json:"timestamp"` + ExtraData string `json:"extra_data"` + BaseFeePerGas string `json:"base_fee_per_gas"` + BlockHash string `json:"block_hash"` + Transactions []string `json:"transactions"` +} + +type ExecutionPayloadHeader struct { + ParentHash string `json:"parent_hash"` + FeeRecipient string `json:"fee_recipient"` + StateRoot string `json:"state_root"` + ReceiptsRoot string `json:"receipts_root"` + LogsBloom string `json:"logs_bloom"` + PrevRandao string `json:"prev_randao"` + BlockNumber string `json:"block_number"` + GasLimit string `json:"gas_limit"` + GasUsed string `json:"gas_used"` + Timestamp string `json:"timestamp"` + ExtraData string `json:"extra_data"` + BaseFeePerGas string `json:"base_fee_per_gas"` + BlockHash string `json:"block_hash"` + TransactionsRoot string `json:"transactions_root"` +} + +// ---------------------------------------------------------------------------- +// Capella +// ---------------------------------------------------------------------------- + type SignedBeaconBlockCapella struct { Message *BeaconBlockCapella `json:"message"` Signature string `json:"signature"` @@ -229,6 +298,46 @@ type BlindedBeaconBlockBodyCapella struct { BLSToExecutionChanges []*SignedBLSToExecutionChange `json:"bls_to_execution_changes"` } +type ExecutionPayloadCapella struct { + ParentHash string `json:"parent_hash"` + FeeRecipient string `json:"fee_recipient"` + StateRoot string `json:"state_root"` + ReceiptsRoot string `json:"receipts_root"` + LogsBloom string `json:"logs_bloom"` + PrevRandao string `json:"prev_randao"` + BlockNumber string `json:"block_number"` + GasLimit string `json:"gas_limit"` + GasUsed string `json:"gas_used"` + Timestamp string `json:"timestamp"` + ExtraData string `json:"extra_data"` + BaseFeePerGas string `json:"base_fee_per_gas"` + BlockHash string `json:"block_hash"` + Transactions []string `json:"transactions"` + Withdrawals []*Withdrawal `json:"withdrawals"` +} + +type ExecutionPayloadHeaderCapella struct { + ParentHash string `json:"parent_hash"` + FeeRecipient string `json:"fee_recipient"` + StateRoot string `json:"state_root"` + ReceiptsRoot string `json:"receipts_root"` + LogsBloom string `json:"logs_bloom"` + PrevRandao string `json:"prev_randao"` + BlockNumber string `json:"block_number"` + GasLimit string `json:"gas_limit"` + GasUsed string `json:"gas_used"` + Timestamp string `json:"timestamp"` + ExtraData string `json:"extra_data"` + BaseFeePerGas string `json:"base_fee_per_gas"` + BlockHash string `json:"block_hash"` + TransactionsRoot string `json:"transactions_root"` + WithdrawalsRoot string `json:"withdrawals_root"` +} + +// ---------------------------------------------------------------------------- +// Deneb +// ---------------------------------------------------------------------------- + type SignedBeaconBlockContentsDeneb struct { SignedBlock *SignedBeaconBlockDeneb `json:"signed_block"` KzgProofs []string `json:"kzg_proofs"` @@ -317,6 +426,50 @@ type BlindedBeaconBlockBodyDeneb struct { BlobKzgCommitments []string `json:"blob_kzg_commitments"` } +type ExecutionPayloadDeneb struct { + ParentHash string `json:"parent_hash"` + FeeRecipient string `json:"fee_recipient"` + StateRoot string `json:"state_root"` + ReceiptsRoot string `json:"receipts_root"` + LogsBloom string `json:"logs_bloom"` + PrevRandao string `json:"prev_randao"` + BlockNumber string `json:"block_number"` + GasLimit string `json:"gas_limit"` + GasUsed string `json:"gas_used"` + Timestamp string `json:"timestamp"` + ExtraData string `json:"extra_data"` + BaseFeePerGas string `json:"base_fee_per_gas"` + BlockHash string `json:"block_hash"` + Transactions []string `json:"transactions"` + Withdrawals []*Withdrawal `json:"withdrawals"` + BlobGasUsed string `json:"blob_gas_used"` + ExcessBlobGas string `json:"excess_blob_gas"` +} + +type ExecutionPayloadHeaderDeneb struct { + ParentHash string `json:"parent_hash"` + FeeRecipient string `json:"fee_recipient"` + StateRoot string `json:"state_root"` + ReceiptsRoot string `json:"receipts_root"` + LogsBloom string `json:"logs_bloom"` + PrevRandao string `json:"prev_randao"` + BlockNumber string `json:"block_number"` + GasLimit string `json:"gas_limit"` + GasUsed string `json:"gas_used"` + Timestamp string `json:"timestamp"` + ExtraData string `json:"extra_data"` + BaseFeePerGas string `json:"base_fee_per_gas"` + BlockHash string `json:"block_hash"` + TransactionsRoot string `json:"transactions_root"` + WithdrawalsRoot string `json:"withdrawals_root"` + BlobGasUsed string `json:"blob_gas_used"` + ExcessBlobGas string `json:"excess_blob_gas"` +} + +// ---------------------------------------------------------------------------- +// Electra +// ---------------------------------------------------------------------------- + type SignedBeaconBlockContentsElectra struct { SignedBlock *SignedBeaconBlockElectra `json:"signed_block"` KzgProofs []string `json:"kzg_proofs"` @@ -407,141 +560,112 @@ type BlindedBeaconBlockBodyElectra struct { ExecutionRequests *ExecutionRequests `json:"execution_requests"` } -type SignedBeaconBlockHeaderContainer struct { - Header *SignedBeaconBlockHeader `json:"header"` - Root string `json:"root"` - Canonical bool `json:"canonical"` +type ( + ExecutionRequests struct { + Deposits []*DepositRequest `json:"deposits"` + Withdrawals []*WithdrawalRequest `json:"withdrawals"` + Consolidations []*ConsolidationRequest `json:"consolidations"` + } + + ExecutionPayloadElectra = ExecutionPayloadDeneb + ExecutionPayloadHeaderElectra = ExecutionPayloadHeaderDeneb +) + +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- + +type SignedBeaconBlockContentsFulu struct { + SignedBlock *SignedBeaconBlockFulu `json:"signed_block"` + KzgProofs []string `json:"kzg_proofs"` + Blobs []string `json:"blobs"` } -type SignedBeaconBlockHeader struct { - Message *BeaconBlockHeader `json:"message"` - Signature string `json:"signature"` +type BeaconBlockContentsFulu struct { + Block *BeaconBlockFulu `json:"block"` + KzgProofs []string `json:"kzg_proofs"` + Blobs []string `json:"blobs"` } -type BeaconBlockHeader struct { - Slot string `json:"slot"` - ProposerIndex string `json:"proposer_index"` - ParentRoot string `json:"parent_root"` - StateRoot string `json:"state_root"` - BodyRoot string `json:"body_root"` +type SignedBeaconBlockFulu struct { + Message *BeaconBlockFulu `json:"message"` + Signature string `json:"signature"` } -type ExecutionPayload struct { - ParentHash string `json:"parent_hash"` - FeeRecipient string `json:"fee_recipient"` - StateRoot string `json:"state_root"` - ReceiptsRoot string `json:"receipts_root"` - LogsBloom string `json:"logs_bloom"` - PrevRandao string `json:"prev_randao"` - BlockNumber string `json:"block_number"` - GasLimit string `json:"gas_limit"` - GasUsed string `json:"gas_used"` - Timestamp string `json:"timestamp"` - ExtraData string `json:"extra_data"` - BaseFeePerGas string `json:"base_fee_per_gas"` - BlockHash string `json:"block_hash"` - Transactions []string `json:"transactions"` +var _ SignedMessageJsoner = &SignedBeaconBlockFulu{} + +func (s *SignedBeaconBlockFulu) MessageRawJson() ([]byte, error) { + return json.Marshal(s.Message) } -type ExecutionPayloadHeader struct { - ParentHash string `json:"parent_hash"` - FeeRecipient string `json:"fee_recipient"` - StateRoot string `json:"state_root"` - ReceiptsRoot string `json:"receipts_root"` - LogsBloom string `json:"logs_bloom"` - PrevRandao string `json:"prev_randao"` - BlockNumber string `json:"block_number"` - GasLimit string `json:"gas_limit"` - GasUsed string `json:"gas_used"` - Timestamp string `json:"timestamp"` - ExtraData string `json:"extra_data"` - BaseFeePerGas string `json:"base_fee_per_gas"` - BlockHash string `json:"block_hash"` - TransactionsRoot string `json:"transactions_root"` +func (s *SignedBeaconBlockFulu) SigString() string { + return s.Signature } -type ExecutionPayloadCapella struct { - ParentHash string `json:"parent_hash"` - FeeRecipient string `json:"fee_recipient"` - StateRoot string `json:"state_root"` - ReceiptsRoot string `json:"receipts_root"` - LogsBloom string `json:"logs_bloom"` - PrevRandao string `json:"prev_randao"` - BlockNumber string `json:"block_number"` - GasLimit string `json:"gas_limit"` - GasUsed string `json:"gas_used"` - Timestamp string `json:"timestamp"` - ExtraData string `json:"extra_data"` - BaseFeePerGas string `json:"base_fee_per_gas"` - BlockHash string `json:"block_hash"` - Transactions []string `json:"transactions"` - Withdrawals []*Withdrawal `json:"withdrawals"` +type BeaconBlockFulu struct { + Slot string `json:"slot"` + ProposerIndex string `json:"proposer_index"` + ParentRoot string `json:"parent_root"` + StateRoot string `json:"state_root"` + Body *BeaconBlockBodyFulu `json:"body"` } -type ExecutionPayloadHeaderCapella struct { - ParentHash string `json:"parent_hash"` - FeeRecipient string `json:"fee_recipient"` - StateRoot string `json:"state_root"` - ReceiptsRoot string `json:"receipts_root"` - LogsBloom string `json:"logs_bloom"` - PrevRandao string `json:"prev_randao"` - BlockNumber string `json:"block_number"` - GasLimit string `json:"gas_limit"` - GasUsed string `json:"gas_used"` - Timestamp string `json:"timestamp"` - ExtraData string `json:"extra_data"` - BaseFeePerGas string `json:"base_fee_per_gas"` - BlockHash string `json:"block_hash"` - TransactionsRoot string `json:"transactions_root"` - WithdrawalsRoot string `json:"withdrawals_root"` +type BeaconBlockBodyFulu struct { + RandaoReveal string `json:"randao_reveal"` + Eth1Data *Eth1Data `json:"eth1_data"` + Graffiti string `json:"graffiti"` + ProposerSlashings []*ProposerSlashing `json:"proposer_slashings"` + AttesterSlashings []*AttesterSlashingElectra `json:"attester_slashings"` + Attestations []*AttestationElectra `json:"attestations"` + Deposits []*Deposit `json:"deposits"` + VoluntaryExits []*SignedVoluntaryExit `json:"voluntary_exits"` + SyncAggregate *SyncAggregate `json:"sync_aggregate"` + ExecutionPayload *ExecutionPayloadElectra `json:"execution_payload"` + BLSToExecutionChanges []*SignedBLSToExecutionChange `json:"bls_to_execution_changes"` + BlobKzgCommitments []string `json:"blob_kzg_commitments"` + ExecutionRequests *ExecutionRequests `json:"execution_requests"` } -type ExecutionPayloadDeneb struct { - ParentHash string `json:"parent_hash"` - FeeRecipient string `json:"fee_recipient"` - StateRoot string `json:"state_root"` - ReceiptsRoot string `json:"receipts_root"` - LogsBloom string `json:"logs_bloom"` - PrevRandao string `json:"prev_randao"` - BlockNumber string `json:"block_number"` - GasLimit string `json:"gas_limit"` - GasUsed string `json:"gas_used"` - Timestamp string `json:"timestamp"` - ExtraData string `json:"extra_data"` - BaseFeePerGas string `json:"base_fee_per_gas"` - BlockHash string `json:"block_hash"` - Transactions []string `json:"transactions"` - Withdrawals []*Withdrawal `json:"withdrawals"` - BlobGasUsed string `json:"blob_gas_used"` - ExcessBlobGas string `json:"excess_blob_gas"` +type BlindedBeaconBlockFulu struct { + Slot string `json:"slot"` + ProposerIndex string `json:"proposer_index"` + ParentRoot string `json:"parent_root"` + StateRoot string `json:"state_root"` + Body *BlindedBeaconBlockBodyFulu `json:"body"` } -type ExecutionPayloadElectra = ExecutionPayloadDeneb +type SignedBlindedBeaconBlockFulu struct { + Message *BlindedBeaconBlockFulu `json:"message"` + Signature string `json:"signature"` +} -type ExecutionPayloadHeaderDeneb struct { - ParentHash string `json:"parent_hash"` - FeeRecipient string `json:"fee_recipient"` - StateRoot string `json:"state_root"` - ReceiptsRoot string `json:"receipts_root"` - LogsBloom string `json:"logs_bloom"` - PrevRandao string `json:"prev_randao"` - BlockNumber string `json:"block_number"` - GasLimit string `json:"gas_limit"` - GasUsed string `json:"gas_used"` - Timestamp string `json:"timestamp"` - ExtraData string `json:"extra_data"` - BaseFeePerGas string `json:"base_fee_per_gas"` - BlockHash string `json:"block_hash"` - TransactionsRoot string `json:"transactions_root"` - WithdrawalsRoot string `json:"withdrawals_root"` - BlobGasUsed string `json:"blob_gas_used"` - ExcessBlobGas string `json:"excess_blob_gas"` +var _ SignedMessageJsoner = &SignedBlindedBeaconBlockFulu{} + +func (s *SignedBlindedBeaconBlockFulu) MessageRawJson() ([]byte, error) { + return json.Marshal(s.Message) } -type ExecutionPayloadHeaderElectra = ExecutionPayloadHeaderDeneb +func (s *SignedBlindedBeaconBlockFulu) SigString() string { + return s.Signature +} -type ExecutionRequests struct { - Deposits []*DepositRequest `json:"deposits"` - Withdrawals []*WithdrawalRequest `json:"withdrawals"` - Consolidations []*ConsolidationRequest `json:"consolidations"` +type BlindedBeaconBlockBodyFulu struct { + RandaoReveal string `json:"randao_reveal"` + Eth1Data *Eth1Data `json:"eth1_data"` + Graffiti string `json:"graffiti"` + ProposerSlashings []*ProposerSlashing `json:"proposer_slashings"` + AttesterSlashings []*AttesterSlashingElectra `json:"attester_slashings"` + Attestations []*AttestationElectra `json:"attestations"` + Deposits []*Deposit `json:"deposits"` + VoluntaryExits []*SignedVoluntaryExit `json:"voluntary_exits"` + SyncAggregate *SyncAggregate `json:"sync_aggregate"` + ExecutionPayloadHeader *ExecutionPayloadHeaderElectra `json:"execution_payload_header"` + BLSToExecutionChanges []*SignedBLSToExecutionChange `json:"bls_to_execution_changes"` + BlobKzgCommitments []string `json:"blob_kzg_commitments"` + ExecutionRequests *ExecutionRequests `json:"execution_requests"` } + +type ( + ExecutionPayloadFulu = ExecutionPayloadDeneb + ExecutionPayloadHeaderFulu = ExecutionPayloadHeaderDeneb +) diff --git a/api/server/structs/conversions_block.go b/api/server/structs/conversions_block.go index de61ed3bda9a..d3258b405215 100644 --- a/api/server/structs/conversions_block.go +++ b/api/server/structs/conversions_block.go @@ -19,6 +19,10 @@ import ( var ErrUnsupportedConversion = errors.New("Could not determine api struct type to use for value") +// ---------------------------------------------------------------------------- +// Phase 0 +// ---------------------------------------------------------------------------- + func (h *SignedBeaconBlockHeader) ToConsensus() (*eth.SignedBeaconBlockHeader, error) { if h == nil { return nil, errNilValue @@ -205,6 +209,133 @@ func (b *BeaconBlock) ToConsensus() (*eth.BeaconBlock, error) { }, nil } +func BeaconBlockHeaderFromConsensus(h *eth.BeaconBlockHeader) *BeaconBlockHeader { + return &BeaconBlockHeader{ + Slot: fmt.Sprintf("%d", h.Slot), + ProposerIndex: fmt.Sprintf("%d", h.ProposerIndex), + ParentRoot: hexutil.Encode(h.ParentRoot), + StateRoot: hexutil.Encode(h.StateRoot), + BodyRoot: hexutil.Encode(h.BodyRoot), + } +} + +func BeaconBlockFromConsensus(b *eth.BeaconBlock) *BeaconBlock { + return &BeaconBlock{ + Slot: fmt.Sprintf("%d", b.Slot), + ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), + ParentRoot: hexutil.Encode(b.ParentRoot), + StateRoot: hexutil.Encode(b.StateRoot), + Body: &BeaconBlockBody{ + RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), + Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), + Graffiti: hexutil.Encode(b.Body.Graffiti), + ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), + AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), + Attestations: AttsFromConsensus(b.Body.Attestations), + Deposits: DepositsFromConsensus(b.Body.Deposits), + VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), + }, + } +} + +func SignedBeaconBlockMessageJsoner(block interfaces.ReadOnlySignedBeaconBlock) (SignedMessageJsoner, error) { + pb, err := block.Proto() + if err != nil { + return nil, err + } + switch pbStruct := pb.(type) { + case *eth.SignedBeaconBlock: + return SignedBeaconBlockPhase0FromConsensus(pbStruct), nil + case *eth.SignedBeaconBlockAltair: + return SignedBeaconBlockAltairFromConsensus(pbStruct), nil + case *eth.SignedBlindedBeaconBlockBellatrix: + return SignedBlindedBeaconBlockBellatrixFromConsensus(pbStruct) + case *eth.SignedBeaconBlockBellatrix: + return SignedBeaconBlockBellatrixFromConsensus(pbStruct) + case *eth.SignedBlindedBeaconBlockCapella: + return SignedBlindedBeaconBlockCapellaFromConsensus(pbStruct) + case *eth.SignedBeaconBlockCapella: + return SignedBeaconBlockCapellaFromConsensus(pbStruct) + case *eth.SignedBlindedBeaconBlockDeneb: + return SignedBlindedBeaconBlockDenebFromConsensus(pbStruct) + case *eth.SignedBeaconBlockDeneb: + return SignedBeaconBlockDenebFromConsensus(pbStruct) + case *eth.SignedBlindedBeaconBlockElectra: + return SignedBlindedBeaconBlockElectraFromConsensus(pbStruct) + case *eth.SignedBeaconBlockElectra: + return SignedBeaconBlockElectraFromConsensus(pbStruct) + case *eth.SignedBlindedBeaconBlockFulu: + return SignedBlindedBeaconBlockFuluFromConsensus(pbStruct) + case *eth.SignedBeaconBlockFulu: + return SignedBeaconBlockFuluFromConsensus(pbStruct) + default: + return nil, ErrUnsupportedConversion + } +} + +func SignedBeaconBlockPhase0FromConsensus(b *eth.SignedBeaconBlock) *SignedBeaconBlock { + return &SignedBeaconBlock{ + Message: BeaconBlockFromConsensus(b.Block), + Signature: hexutil.Encode(b.Signature), + } +} + +func ExecutionPayloadFromConsensus(payload *enginev1.ExecutionPayload) (*ExecutionPayload, error) { + baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) + if err != nil { + return nil, err + } + transactions := make([]string, len(payload.Transactions)) + for i, tx := range payload.Transactions { + transactions[i] = hexutil.Encode(tx) + } + + return &ExecutionPayload{ + ParentHash: hexutil.Encode(payload.ParentHash), + FeeRecipient: hexutil.Encode(payload.FeeRecipient), + StateRoot: hexutil.Encode(payload.StateRoot), + ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), + LogsBloom: hexutil.Encode(payload.LogsBloom), + PrevRandao: hexutil.Encode(payload.PrevRandao), + BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), + GasLimit: fmt.Sprintf("%d", payload.GasLimit), + GasUsed: fmt.Sprintf("%d", payload.GasUsed), + Timestamp: fmt.Sprintf("%d", payload.Timestamp), + ExtraData: hexutil.Encode(payload.ExtraData), + BaseFeePerGas: baseFeePerGas, + BlockHash: hexutil.Encode(payload.BlockHash), + Transactions: transactions, + }, nil +} + +func ExecutionPayloadHeaderFromConsensus(payload *enginev1.ExecutionPayloadHeader) (*ExecutionPayloadHeader, error) { + baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) + if err != nil { + return nil, err + } + + return &ExecutionPayloadHeader{ + ParentHash: hexutil.Encode(payload.ParentHash), + FeeRecipient: hexutil.Encode(payload.FeeRecipient), + StateRoot: hexutil.Encode(payload.StateRoot), + ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), + LogsBloom: hexutil.Encode(payload.LogsBloom), + PrevRandao: hexutil.Encode(payload.PrevRandao), + BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), + GasLimit: fmt.Sprintf("%d", payload.GasLimit), + GasUsed: fmt.Sprintf("%d", payload.GasUsed), + Timestamp: fmt.Sprintf("%d", payload.Timestamp), + ExtraData: hexutil.Encode(payload.ExtraData), + BaseFeePerGas: baseFeePerGas, + BlockHash: hexutil.Encode(payload.BlockHash), + TransactionsRoot: hexutil.Encode(payload.TransactionsRoot), + }, nil +} + +// ---------------------------------------------------------------------------- +// Altair +// ---------------------------------------------------------------------------- + func (b *SignedBeaconBlockAltair) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { if b == nil { return nil, errNilValue @@ -337,6 +468,40 @@ func (b *BeaconBlockAltair) ToConsensus() (*eth.BeaconBlockAltair, error) { }, nil } +func BeaconBlockAltairFromConsensus(b *eth.BeaconBlockAltair) *BeaconBlockAltair { + return &BeaconBlockAltair{ + Slot: fmt.Sprintf("%d", b.Slot), + ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), + ParentRoot: hexutil.Encode(b.ParentRoot), + StateRoot: hexutil.Encode(b.StateRoot), + Body: &BeaconBlockBodyAltair{ + RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), + Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), + Graffiti: hexutil.Encode(b.Body.Graffiti), + ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), + AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), + Attestations: AttsFromConsensus(b.Body.Attestations), + Deposits: DepositsFromConsensus(b.Body.Deposits), + VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), + SyncAggregate: &SyncAggregate{ + SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), + SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), + }, + }, + } +} + +func SignedBeaconBlockAltairFromConsensus(b *eth.SignedBeaconBlockAltair) *SignedBeaconBlockAltair { + return &SignedBeaconBlockAltair{ + Message: BeaconBlockAltairFromConsensus(b.Block), + Signature: hexutil.Encode(b.Signature), + } +} + +// ---------------------------------------------------------------------------- +// Bellatrix +// ---------------------------------------------------------------------------- + func (b *SignedBeaconBlockBellatrix) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { if b == nil { return nil, errNilValue @@ -759,6 +924,90 @@ func (b *BlindedBeaconBlockBellatrix) ToConsensus() (*eth.BlindedBeaconBlockBell }, nil } +func BlindedBeaconBlockBellatrixFromConsensus(b *eth.BlindedBeaconBlockBellatrix) (*BlindedBeaconBlockBellatrix, error) { + payload, err := ExecutionPayloadHeaderFromConsensus(b.Body.ExecutionPayloadHeader) + if err != nil { + return nil, err + } + + return &BlindedBeaconBlockBellatrix{ + Slot: fmt.Sprintf("%d", b.Slot), + ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), + ParentRoot: hexutil.Encode(b.ParentRoot), + StateRoot: hexutil.Encode(b.StateRoot), + Body: &BlindedBeaconBlockBodyBellatrix{ + RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), + Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), + Graffiti: hexutil.Encode(b.Body.Graffiti), + ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), + AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), + Attestations: AttsFromConsensus(b.Body.Attestations), + Deposits: DepositsFromConsensus(b.Body.Deposits), + VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), + SyncAggregate: &SyncAggregate{ + SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), + SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), + }, + ExecutionPayloadHeader: payload, + }, + }, nil +} + +func SignedBlindedBeaconBlockBellatrixFromConsensus(b *eth.SignedBlindedBeaconBlockBellatrix) (*SignedBlindedBeaconBlockBellatrix, error) { + blindedBlock, err := BlindedBeaconBlockBellatrixFromConsensus(b.Block) + if err != nil { + return nil, err + } + return &SignedBlindedBeaconBlockBellatrix{ + Message: blindedBlock, + Signature: hexutil.Encode(b.Signature), + }, nil +} + +func BeaconBlockBellatrixFromConsensus(b *eth.BeaconBlockBellatrix) (*BeaconBlockBellatrix, error) { + payload, err := ExecutionPayloadFromConsensus(b.Body.ExecutionPayload) + if err != nil { + return nil, err + } + + return &BeaconBlockBellatrix{ + Slot: fmt.Sprintf("%d", b.Slot), + ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), + ParentRoot: hexutil.Encode(b.ParentRoot), + StateRoot: hexutil.Encode(b.StateRoot), + Body: &BeaconBlockBodyBellatrix{ + RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), + Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), + Graffiti: hexutil.Encode(b.Body.Graffiti), + ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), + AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), + Attestations: AttsFromConsensus(b.Body.Attestations), + Deposits: DepositsFromConsensus(b.Body.Deposits), + VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), + SyncAggregate: &SyncAggregate{ + SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), + SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), + }, + ExecutionPayload: payload, + }, + }, nil +} + +func SignedBeaconBlockBellatrixFromConsensus(b *eth.SignedBeaconBlockBellatrix) (*SignedBeaconBlockBellatrix, error) { + block, err := BeaconBlockBellatrixFromConsensus(b.Block) + if err != nil { + return nil, err + } + return &SignedBeaconBlockBellatrix{ + Message: block, + Signature: hexutil.Encode(b.Signature), + }, nil +} + +// ---------------------------------------------------------------------------- +// Capella +// ---------------------------------------------------------------------------- + func (b *SignedBeaconBlockCapella) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { if b == nil { return nil, errNilValue @@ -1227,28 +1476,168 @@ func (b *BlindedBeaconBlockCapella) ToConsensus() (*eth.BlindedBeaconBlockCapell }, nil } -func (b *SignedBeaconBlockContentsDeneb) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { - if b == nil { - return nil, errNilValue - } - - signedDenebBlock, err := b.SignedBlock.ToConsensus() +func BlindedBeaconBlockCapellaFromConsensus(b *eth.BlindedBeaconBlockCapella) (*BlindedBeaconBlockCapella, error) { + payload, err := ExecutionPayloadHeaderCapellaFromConsensus(b.Body.ExecutionPayloadHeader) if err != nil { - return nil, server.NewDecodeError(err, "SignedBlock") - } - proofs := make([][]byte, len(b.KzgProofs)) - for i, proof := range b.KzgProofs { - proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i)) - } + return nil, err } - blbs := make([][]byte, len(b.Blobs)) - for i, blob := range b.Blobs { - blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i)) - } + + return &BlindedBeaconBlockCapella{ + Slot: fmt.Sprintf("%d", b.Slot), + ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), + ParentRoot: hexutil.Encode(b.ParentRoot), + StateRoot: hexutil.Encode(b.StateRoot), + Body: &BlindedBeaconBlockBodyCapella{ + RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), + Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), + Graffiti: hexutil.Encode(b.Body.Graffiti), + ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), + AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), + Attestations: AttsFromConsensus(b.Body.Attestations), + Deposits: DepositsFromConsensus(b.Body.Deposits), + VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), + SyncAggregate: &SyncAggregate{ + SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), + SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), + }, + ExecutionPayloadHeader: payload, + BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges), + }, + }, nil +} + +func SignedBlindedBeaconBlockCapellaFromConsensus(b *eth.SignedBlindedBeaconBlockCapella) (*SignedBlindedBeaconBlockCapella, error) { + blindedBlock, err := BlindedBeaconBlockCapellaFromConsensus(b.Block) + if err != nil { + return nil, err + } + return &SignedBlindedBeaconBlockCapella{ + Message: blindedBlock, + Signature: hexutil.Encode(b.Signature), + }, nil +} + +func BeaconBlockCapellaFromConsensus(b *eth.BeaconBlockCapella) (*BeaconBlockCapella, error) { + payload, err := ExecutionPayloadCapellaFromConsensus(b.Body.ExecutionPayload) + if err != nil { + return nil, err + } + + return &BeaconBlockCapella{ + Slot: fmt.Sprintf("%d", b.Slot), + ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), + ParentRoot: hexutil.Encode(b.ParentRoot), + StateRoot: hexutil.Encode(b.StateRoot), + Body: &BeaconBlockBodyCapella{ + RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), + Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), + Graffiti: hexutil.Encode(b.Body.Graffiti), + ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), + AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), + Attestations: AttsFromConsensus(b.Body.Attestations), + Deposits: DepositsFromConsensus(b.Body.Deposits), + VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), + SyncAggregate: &SyncAggregate{ + SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), + SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), + }, + ExecutionPayload: payload, + BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges), + }, + }, nil +} + +func SignedBeaconBlockCapellaFromConsensus(b *eth.SignedBeaconBlockCapella) (*SignedBeaconBlockCapella, error) { + block, err := BeaconBlockCapellaFromConsensus(b.Block) + if err != nil { + return nil, err + } + return &SignedBeaconBlockCapella{ + Message: block, + Signature: hexutil.Encode(b.Signature), + }, nil +} + +func ExecutionPayloadCapellaFromConsensus(payload *enginev1.ExecutionPayloadCapella) (*ExecutionPayloadCapella, error) { + baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) + if err != nil { + return nil, err + } + transactions := make([]string, len(payload.Transactions)) + for i, tx := range payload.Transactions { + transactions[i] = hexutil.Encode(tx) + } + + return &ExecutionPayloadCapella{ + ParentHash: hexutil.Encode(payload.ParentHash), + FeeRecipient: hexutil.Encode(payload.FeeRecipient), + StateRoot: hexutil.Encode(payload.StateRoot), + ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), + LogsBloom: hexutil.Encode(payload.LogsBloom), + PrevRandao: hexutil.Encode(payload.PrevRandao), + BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), + GasLimit: fmt.Sprintf("%d", payload.GasLimit), + GasUsed: fmt.Sprintf("%d", payload.GasUsed), + Timestamp: fmt.Sprintf("%d", payload.Timestamp), + ExtraData: hexutil.Encode(payload.ExtraData), + BaseFeePerGas: baseFeePerGas, + BlockHash: hexutil.Encode(payload.BlockHash), + Transactions: transactions, + Withdrawals: WithdrawalsFromConsensus(payload.Withdrawals), + }, nil +} + +func ExecutionPayloadHeaderCapellaFromConsensus(payload *enginev1.ExecutionPayloadHeaderCapella) (*ExecutionPayloadHeaderCapella, error) { + baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) + if err != nil { + return nil, err + } + + return &ExecutionPayloadHeaderCapella{ + ParentHash: hexutil.Encode(payload.ParentHash), + FeeRecipient: hexutil.Encode(payload.FeeRecipient), + StateRoot: hexutil.Encode(payload.StateRoot), + ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), + LogsBloom: hexutil.Encode(payload.LogsBloom), + PrevRandao: hexutil.Encode(payload.PrevRandao), + BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), + GasLimit: fmt.Sprintf("%d", payload.GasLimit), + GasUsed: fmt.Sprintf("%d", payload.GasUsed), + Timestamp: fmt.Sprintf("%d", payload.Timestamp), + ExtraData: hexutil.Encode(payload.ExtraData), + BaseFeePerGas: baseFeePerGas, + BlockHash: hexutil.Encode(payload.BlockHash), + TransactionsRoot: hexutil.Encode(payload.TransactionsRoot), + WithdrawalsRoot: hexutil.Encode(payload.WithdrawalsRoot), + }, nil +} + +// ---------------------------------------------------------------------------- +// Deneb +// ---------------------------------------------------------------------------- + +func (b *SignedBeaconBlockContentsDeneb) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { + if b == nil { + return nil, errNilValue + } + + signedDenebBlock, err := b.SignedBlock.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, "SignedBlock") + } + proofs := make([][]byte, len(b.KzgProofs)) + for i, proof := range b.KzgProofs { + proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i)) + } + } + blbs := make([][]byte, len(b.Blobs)) + for i, blob := range b.Blobs { + blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i)) + } } blk := ð.SignedBeaconBlockContentsDeneb{ Block: signedDenebBlock, @@ -1833,103 +2222,657 @@ func (b *BlindedBeaconBlockDeneb) ToGeneric() (*eth.GenericBeaconBlock, error) { return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedDeneb{BlindedDeneb: blindedBlock}, IsBlinded: true}, nil } -func (b *SignedBeaconBlockContentsElectra) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { - if b == nil { - return nil, errNilValue - } - - signedElectraBlock, err := b.SignedBlock.ToConsensus() +func BeaconBlockContentsDenebFromConsensus(b *eth.BeaconBlockContentsDeneb) (*BeaconBlockContentsDeneb, error) { + block, err := BeaconBlockDenebFromConsensus(b.Block) if err != nil { - return nil, server.NewDecodeError(err, "SignedBlock") + return nil, err } - proofs := make([][]byte, len(b.KzgProofs)) + proofs := make([]string, len(b.KzgProofs)) for i, proof := range b.KzgProofs { - proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i)) - } + proofs[i] = hexutil.Encode(proof) } - blbs := make([][]byte, len(b.Blobs)) + blbs := make([]string, len(b.Blobs)) for i, blob := range b.Blobs { - blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i)) - } + blbs[i] = hexutil.Encode(blob) } - blk := ð.SignedBeaconBlockContentsElectra{ - Block: signedElectraBlock, + return &BeaconBlockContentsDeneb{ + Block: block, KzgProofs: proofs, Blobs: blbs, - } - return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_Electra{Electra: blk}}, nil -} - -func (b *SignedBeaconBlockContentsElectra) ToUnsigned() *BeaconBlockContentsElectra { - return &BeaconBlockContentsElectra{ - Block: b.SignedBlock.Message, - KzgProofs: b.KzgProofs, - Blobs: b.Blobs, - } + }, nil } -func (b *BeaconBlockContentsElectra) ToGeneric() (*eth.GenericBeaconBlock, error) { - block, err := b.ToConsensus() +func SignedBeaconBlockContentsDenebFromConsensus(b *eth.SignedBeaconBlockContentsDeneb) (*SignedBeaconBlockContentsDeneb, error) { + block, err := SignedBeaconBlockDenebFromConsensus(b.Block) if err != nil { return nil, err } - return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_Electra{Electra: block}}, nil -} - -func (b *BeaconBlockContentsElectra) ToConsensus() (*eth.BeaconBlockContentsElectra, error) { - if b == nil { - return nil, errNilValue - } - - electraBlock, err := b.Block.ToConsensus() - if err != nil { - return nil, server.NewDecodeError(err, "Block") - } - proofs := make([][]byte, len(b.KzgProofs)) + proofs := make([]string, len(b.KzgProofs)) for i, proof := range b.KzgProofs { - proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i)) - } + proofs[i] = hexutil.Encode(proof) } - blbs := make([][]byte, len(b.Blobs)) + + blbs := make([]string, len(b.Blobs)) for i, blob := range b.Blobs { - blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i)) - } + blbs[i] = hexutil.Encode(blob) } - return ð.BeaconBlockContentsElectra{ - Block: electraBlock, - KzgProofs: proofs, - Blobs: blbs, + + return &SignedBeaconBlockContentsDeneb{ + SignedBlock: block, + KzgProofs: proofs, + Blobs: blbs, }, nil } -func (b *BeaconBlockElectra) ToConsensus() (*eth.BeaconBlockElectra, error) { - if b == nil { - return nil, errNilValue - } - if b.Body == nil { - return nil, server.NewDecodeError(errNilValue, "Body") - } - if b.Body.Eth1Data == nil { - return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data") - } - if b.Body.SyncAggregate == nil { - return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate") +func BlindedBeaconBlockDenebFromConsensus(b *eth.BlindedBeaconBlockDeneb) (*BlindedBeaconBlockDeneb, error) { + blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments)) + for i := range b.Body.BlobKzgCommitments { + blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i]) } - if b.Body.ExecutionPayload == nil { - return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayload") + payload, err := ExecutionPayloadHeaderDenebFromConsensus(b.Body.ExecutionPayloadHeader) + if err != nil { + return nil, err } - slot, err := strconv.ParseUint(b.Slot, 10, 64) - if err != nil { + return &BlindedBeaconBlockDeneb{ + Slot: fmt.Sprintf("%d", b.Slot), + ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), + ParentRoot: hexutil.Encode(b.ParentRoot), + StateRoot: hexutil.Encode(b.StateRoot), + Body: &BlindedBeaconBlockBodyDeneb{ + RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), + Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), + Graffiti: hexutil.Encode(b.Body.Graffiti), + ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), + AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), + Attestations: AttsFromConsensus(b.Body.Attestations), + Deposits: DepositsFromConsensus(b.Body.Deposits), + VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), + SyncAggregate: &SyncAggregate{ + SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), + SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), + }, + ExecutionPayloadHeader: payload, + BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges), + BlobKzgCommitments: blobKzgCommitments, + }, + }, nil +} + +func SignedBlindedBeaconBlockDenebFromConsensus(b *eth.SignedBlindedBeaconBlockDeneb) (*SignedBlindedBeaconBlockDeneb, error) { + block, err := BlindedBeaconBlockDenebFromConsensus(b.Message) + if err != nil { + return nil, err + } + return &SignedBlindedBeaconBlockDeneb{ + Message: block, + Signature: hexutil.Encode(b.Signature), + }, nil +} + +func BeaconBlockDenebFromConsensus(b *eth.BeaconBlockDeneb) (*BeaconBlockDeneb, error) { + baseFeePerGas, err := sszBytesToUint256String(b.Body.ExecutionPayload.BaseFeePerGas) + if err != nil { + return nil, err + } + transactions := make([]string, len(b.Body.ExecutionPayload.Transactions)) + for i, tx := range b.Body.ExecutionPayload.Transactions { + transactions[i] = hexutil.Encode(tx) + } + blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments)) + for i := range b.Body.BlobKzgCommitments { + blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i]) + } + + return &BeaconBlockDeneb{ + Slot: fmt.Sprintf("%d", b.Slot), + ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), + ParentRoot: hexutil.Encode(b.ParentRoot), + StateRoot: hexutil.Encode(b.StateRoot), + Body: &BeaconBlockBodyDeneb{ + RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), + Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), + Graffiti: hexutil.Encode(b.Body.Graffiti), + ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), + AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), + Attestations: AttsFromConsensus(b.Body.Attestations), + Deposits: DepositsFromConsensus(b.Body.Deposits), + VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), + SyncAggregate: &SyncAggregate{ + SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), + SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), + }, + ExecutionPayload: &ExecutionPayloadDeneb{ + ParentHash: hexutil.Encode(b.Body.ExecutionPayload.ParentHash), + FeeRecipient: hexutil.Encode(b.Body.ExecutionPayload.FeeRecipient), + StateRoot: hexutil.Encode(b.Body.ExecutionPayload.StateRoot), + ReceiptsRoot: hexutil.Encode(b.Body.ExecutionPayload.ReceiptsRoot), + LogsBloom: hexutil.Encode(b.Body.ExecutionPayload.LogsBloom), + PrevRandao: hexutil.Encode(b.Body.ExecutionPayload.PrevRandao), + BlockNumber: fmt.Sprintf("%d", b.Body.ExecutionPayload.BlockNumber), + GasLimit: fmt.Sprintf("%d", b.Body.ExecutionPayload.GasLimit), + GasUsed: fmt.Sprintf("%d", b.Body.ExecutionPayload.GasUsed), + Timestamp: fmt.Sprintf("%d", b.Body.ExecutionPayload.Timestamp), + ExtraData: hexutil.Encode(b.Body.ExecutionPayload.ExtraData), + BaseFeePerGas: baseFeePerGas, + BlockHash: hexutil.Encode(b.Body.ExecutionPayload.BlockHash), + Transactions: transactions, + Withdrawals: WithdrawalsFromConsensus(b.Body.ExecutionPayload.Withdrawals), + BlobGasUsed: fmt.Sprintf("%d", b.Body.ExecutionPayload.BlobGasUsed), + ExcessBlobGas: fmt.Sprintf("%d", b.Body.ExecutionPayload.ExcessBlobGas), + }, + BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges), + BlobKzgCommitments: blobKzgCommitments, + }, + }, nil +} + +func SignedBeaconBlockDenebFromConsensus(b *eth.SignedBeaconBlockDeneb) (*SignedBeaconBlockDeneb, error) { + block, err := BeaconBlockDenebFromConsensus(b.Block) + if err != nil { + return nil, err + } + return &SignedBeaconBlockDeneb{ + Message: block, + Signature: hexutil.Encode(b.Signature), + }, nil +} + +func ExecutionPayloadDenebFromConsensus(payload *enginev1.ExecutionPayloadDeneb) (*ExecutionPayloadDeneb, error) { + baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) + if err != nil { + return nil, err + } + transactions := make([]string, len(payload.Transactions)) + for i, tx := range payload.Transactions { + transactions[i] = hexutil.Encode(tx) + } + + return &ExecutionPayloadDeneb{ + ParentHash: hexutil.Encode(payload.ParentHash), + FeeRecipient: hexutil.Encode(payload.FeeRecipient), + StateRoot: hexutil.Encode(payload.StateRoot), + ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), + LogsBloom: hexutil.Encode(payload.LogsBloom), + PrevRandao: hexutil.Encode(payload.PrevRandao), + BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), + GasLimit: fmt.Sprintf("%d", payload.GasLimit), + GasUsed: fmt.Sprintf("%d", payload.GasUsed), + Timestamp: fmt.Sprintf("%d", payload.Timestamp), + ExtraData: hexutil.Encode(payload.ExtraData), + BaseFeePerGas: baseFeePerGas, + BlockHash: hexutil.Encode(payload.BlockHash), + Transactions: transactions, + Withdrawals: WithdrawalsFromConsensus(payload.Withdrawals), + BlobGasUsed: fmt.Sprintf("%d", payload.BlobGasUsed), + ExcessBlobGas: fmt.Sprintf("%d", payload.ExcessBlobGas), + }, nil +} + +func ExecutionPayloadHeaderDenebFromConsensus(payload *enginev1.ExecutionPayloadHeaderDeneb) (*ExecutionPayloadHeaderDeneb, error) { + baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) + if err != nil { + return nil, err + } + + return &ExecutionPayloadHeaderDeneb{ + ParentHash: hexutil.Encode(payload.ParentHash), + FeeRecipient: hexutil.Encode(payload.FeeRecipient), + StateRoot: hexutil.Encode(payload.StateRoot), + ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), + LogsBloom: hexutil.Encode(payload.LogsBloom), + PrevRandao: hexutil.Encode(payload.PrevRandao), + BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), + GasLimit: fmt.Sprintf("%d", payload.GasLimit), + GasUsed: fmt.Sprintf("%d", payload.GasUsed), + Timestamp: fmt.Sprintf("%d", payload.Timestamp), + ExtraData: hexutil.Encode(payload.ExtraData), + BaseFeePerGas: baseFeePerGas, + BlockHash: hexutil.Encode(payload.BlockHash), + TransactionsRoot: hexutil.Encode(payload.TransactionsRoot), + WithdrawalsRoot: hexutil.Encode(payload.WithdrawalsRoot), + BlobGasUsed: fmt.Sprintf("%d", payload.BlobGasUsed), + ExcessBlobGas: fmt.Sprintf("%d", payload.ExcessBlobGas), + }, nil +} + +// ---------------------------------------------------------------------------- +// Electra +// ---------------------------------------------------------------------------- + +func (b *SignedBeaconBlockContentsElectra) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { + if b == nil { + return nil, errNilValue + } + + signedElectraBlock, err := b.SignedBlock.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, "SignedBlock") + } + proofs := make([][]byte, len(b.KzgProofs)) + for i, proof := range b.KzgProofs { + proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i)) + } + } + blbs := make([][]byte, len(b.Blobs)) + for i, blob := range b.Blobs { + blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i)) + } + } + blk := ð.SignedBeaconBlockContentsElectra{ + Block: signedElectraBlock, + KzgProofs: proofs, + Blobs: blbs, + } + return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_Electra{Electra: blk}}, nil +} + +func (b *SignedBeaconBlockContentsElectra) ToUnsigned() *BeaconBlockContentsElectra { + return &BeaconBlockContentsElectra{ + Block: b.SignedBlock.Message, + KzgProofs: b.KzgProofs, + Blobs: b.Blobs, + } +} + +func (b *BeaconBlockContentsElectra) ToGeneric() (*eth.GenericBeaconBlock, error) { + block, err := b.ToConsensus() + if err != nil { + return nil, err + } + + return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_Electra{Electra: block}}, nil +} + +func (b *BeaconBlockContentsElectra) ToConsensus() (*eth.BeaconBlockContentsElectra, error) { + if b == nil { + return nil, errNilValue + } + + electraBlock, err := b.Block.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, "Block") + } + proofs := make([][]byte, len(b.KzgProofs)) + for i, proof := range b.KzgProofs { + proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i)) + } + } + blbs := make([][]byte, len(b.Blobs)) + for i, blob := range b.Blobs { + blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i)) + } + } + return ð.BeaconBlockContentsElectra{ + Block: electraBlock, + KzgProofs: proofs, + Blobs: blbs, + }, nil +} + +func (b *BeaconBlockElectra) ToConsensus() (*eth.BeaconBlockElectra, error) { + if b == nil { + return nil, errNilValue + } + if b.Body == nil { + return nil, server.NewDecodeError(errNilValue, "Body") + } + if b.Body.Eth1Data == nil { + return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data") + } + if b.Body.SyncAggregate == nil { + return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate") + } + if b.Body.ExecutionPayload == nil { + return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayload") + } + + slot, err := strconv.ParseUint(b.Slot, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "Slot") + } + proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "ProposerIndex") + } + parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "ParentRoot") + } + stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "StateRoot") + } + randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.RandaoReveal") + } + depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot") + } + depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount") + } + blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash") + } + graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.Graffiti") + } + proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ProposerSlashings") + } + attesterSlashings, err := AttesterSlashingsElectraToConsensus(b.Body.AttesterSlashings) + if err != nil { + return nil, server.NewDecodeError(err, "Body.AttesterSlashings") + } + atts, err := AttsElectraToConsensus(b.Body.Attestations) + if err != nil { + return nil, server.NewDecodeError(err, "Body.Attestations") + } + deposits, err := DepositsToConsensus(b.Body.Deposits) + if err != nil { + return nil, server.NewDecodeError(err, "Body.Deposits") + } + exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits) + if err != nil { + return nil, server.NewDecodeError(err, "Body.VoluntaryExits") + } + syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits") + } + syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature") + } + payloadParentHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.ParentHash, common.HashLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ParentHash") + } + payloadFeeRecipient, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.FeeRecipient, fieldparams.FeeRecipientLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.FeeRecipient") + } + payloadStateRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.StateRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.StateRoot") + } + payloadReceiptsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.ReceiptsRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ReceiptsRoot") + } + payloadLogsBloom, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.LogsBloom, fieldparams.LogsBloomLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.LogsBloom") + } + payloadPrevRandao, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.PrevRandao, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.PrevRandao") + } + payloadBlockNumber, err := strconv.ParseUint(b.Body.ExecutionPayload.BlockNumber, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlockNumber") + } + payloadGasLimit, err := strconv.ParseUint(b.Body.ExecutionPayload.GasLimit, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.GasLimit") + } + payloadGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayload.GasUsed, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.GasUsed") + } + payloadTimestamp, err := strconv.ParseUint(b.Body.ExecutionPayload.Timestamp, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.Timestamp") + } + payloadExtraData, err := bytesutil.DecodeHexWithMaxLength(b.Body.ExecutionPayload.ExtraData, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ExtraData") + } + payloadBaseFeePerGas, err := bytesutil.Uint256ToSSZBytes(b.Body.ExecutionPayload.BaseFeePerGas) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BaseFeePerGas") + } + payloadBlockHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.BlockHash, common.HashLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlockHash") + } + err = slice.VerifyMaxLength(b.Body.ExecutionPayload.Transactions, fieldparams.MaxTxsPerPayloadLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.Transactions") + } + txs := make([][]byte, len(b.Body.ExecutionPayload.Transactions)) + for i, tx := range b.Body.ExecutionPayload.Transactions { + txs[i], err = bytesutil.DecodeHexWithMaxLength(tx, fieldparams.MaxBytesPerTxLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Transactions[%d]", i)) + } + } + err = slice.VerifyMaxLength(b.Body.ExecutionPayload.Withdrawals, fieldparams.MaxWithdrawalsPerPayload) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.Withdrawals") + } + withdrawals := make([]*enginev1.Withdrawal, len(b.Body.ExecutionPayload.Withdrawals)) + for i, w := range b.Body.ExecutionPayload.Withdrawals { + withdrawalIndex, err := strconv.ParseUint(w.WithdrawalIndex, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].WithdrawalIndex", i)) + } + validatorIndex, err := strconv.ParseUint(w.ValidatorIndex, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].ValidatorIndex", i)) + } + address, err := bytesutil.DecodeHexWithLength(w.ExecutionAddress, common.AddressLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].ExecutionAddress", i)) + } + amount, err := strconv.ParseUint(w.Amount, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].Amount", i)) + } + withdrawals[i] = &enginev1.Withdrawal{ + Index: withdrawalIndex, + ValidatorIndex: primitives.ValidatorIndex(validatorIndex), + Address: address, + Amount: amount, + } + } + + payloadBlobGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayload.BlobGasUsed, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlobGasUsed") + } + payloadExcessBlobGas, err := strconv.ParseUint(b.Body.ExecutionPayload.ExcessBlobGas, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ExcessBlobGas") + } + + if b.Body.ExecutionRequests == nil { + return nil, server.NewDecodeError(errors.New("nil execution requests"), "Body.ExequtionRequests") + } + + depositRequests := make([]*enginev1.DepositRequest, len(b.Body.ExecutionRequests.Deposits)) + for i, d := range b.Body.ExecutionRequests.Deposits { + depositRequests[i], err = d.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionRequests.Deposits[%d]", i)) + } + } + + withdrawalRequests := make([]*enginev1.WithdrawalRequest, len(b.Body.ExecutionRequests.Withdrawals)) + for i, w := range b.Body.ExecutionRequests.Withdrawals { + withdrawalRequests[i], err = w.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionRequests.Withdrawals[%d]", i)) + } + } + + consolidationRequests := make([]*enginev1.ConsolidationRequest, len(b.Body.ExecutionRequests.Consolidations)) + for i, c := range b.Body.ExecutionRequests.Consolidations { + consolidationRequests[i], err = c.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionRequests.Consolidations[%d]", i)) + } + } + + blsChanges, err := SignedBLSChangesToConsensus(b.Body.BLSToExecutionChanges) + if err != nil { + return nil, server.NewDecodeError(err, "Body.BLSToExecutionChanges") + } + err = slice.VerifyMaxLength(b.Body.BlobKzgCommitments, fieldparams.MaxBlobCommitmentsPerBlock) + if err != nil { + return nil, server.NewDecodeError(err, "Body.BlobKzgCommitments") + } + blobKzgCommitments := make([][]byte, len(b.Body.BlobKzgCommitments)) + for i, b := range b.Body.BlobKzgCommitments { + kzg, err := bytesutil.DecodeHexWithLength(b, fieldparams.BLSPubkeyLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.BlobKzgCommitments[%d]", i)) + } + blobKzgCommitments[i] = kzg + } + return ð.BeaconBlockElectra{ + Slot: primitives.Slot(slot), + ProposerIndex: primitives.ValidatorIndex(proposerIndex), + ParentRoot: parentRoot, + StateRoot: stateRoot, + Body: ð.BeaconBlockBodyElectra{ + RandaoReveal: randaoReveal, + Eth1Data: ð.Eth1Data{ + DepositRoot: depositRoot, + DepositCount: depositCount, + BlockHash: blockHash, + }, + Graffiti: graffiti, + ProposerSlashings: proposerSlashings, + AttesterSlashings: attesterSlashings, + Attestations: atts, + Deposits: deposits, + VoluntaryExits: exits, + SyncAggregate: ð.SyncAggregate{ + SyncCommitteeBits: syncCommitteeBits, + SyncCommitteeSignature: syncCommitteeSig, + }, + ExecutionPayload: &enginev1.ExecutionPayloadDeneb{ + ParentHash: payloadParentHash, + FeeRecipient: payloadFeeRecipient, + StateRoot: payloadStateRoot, + ReceiptsRoot: payloadReceiptsRoot, + LogsBloom: payloadLogsBloom, + PrevRandao: payloadPrevRandao, + BlockNumber: payloadBlockNumber, + GasLimit: payloadGasLimit, + GasUsed: payloadGasUsed, + Timestamp: payloadTimestamp, + ExtraData: payloadExtraData, + BaseFeePerGas: payloadBaseFeePerGas, + BlockHash: payloadBlockHash, + Transactions: txs, + Withdrawals: withdrawals, + BlobGasUsed: payloadBlobGasUsed, + ExcessBlobGas: payloadExcessBlobGas, + }, + BlsToExecutionChanges: blsChanges, + BlobKzgCommitments: blobKzgCommitments, + ExecutionRequests: &enginev1.ExecutionRequests{ + Deposits: depositRequests, + Withdrawals: withdrawalRequests, + Consolidations: consolidationRequests, + }, + }, + }, nil +} + +func (b *SignedBeaconBlockElectra) ToConsensus() (*eth.SignedBeaconBlockElectra, error) { + if b == nil { + return nil, errNilValue + } + + sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength) + if err != nil { + return nil, server.NewDecodeError(err, "Signature") + } + block, err := b.Message.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, "Message") + } + return ð.SignedBeaconBlockElectra{ + Block: block, + Signature: sig, + }, nil +} + +func (b *SignedBlindedBeaconBlockElectra) ToConsensus() (*eth.SignedBlindedBeaconBlockElectra, error) { + if b == nil { + return nil, errNilValue + } + + sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength) + if err != nil { + return nil, server.NewDecodeError(err, "Signature") + } + blindedBlock, err := b.Message.ToConsensus() + if err != nil { + return nil, err + } + return ð.SignedBlindedBeaconBlockElectra{ + Message: blindedBlock, + Signature: sig, + }, nil +} + +func (b *SignedBlindedBeaconBlockElectra) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { + if b == nil { + return nil, errNilValue + } + sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength) + if err != nil { + return nil, server.NewDecodeError(err, "Signature") + } + blindedBlock, err := b.Message.ToConsensus() + if err != nil { + return nil, err + } + return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_BlindedElectra{BlindedElectra: ð.SignedBlindedBeaconBlockElectra{ + Message: blindedBlock, + Signature: sig, + }}, IsBlinded: true}, nil +} + +func (b *BlindedBeaconBlockElectra) ToConsensus() (*eth.BlindedBeaconBlockElectra, error) { + if b == nil { + return nil, errNilValue + } + if b.Body == nil { + return nil, server.NewDecodeError(errNilValue, "Body") + } + if b.Body.Eth1Data == nil { + return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data") + } + if b.Body.SyncAggregate == nil { + return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate") + } + if b.Body.ExecutionPayloadHeader == nil { + return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayloadHeader") + } + + slot, err := strconv.ParseUint(b.Slot, 10, 64) + if err != nil { return nil, server.NewDecodeError(err, "Slot") } proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64) @@ -1956,7 +2899,7 @@ func (b *BeaconBlockElectra) ToConsensus() (*eth.BeaconBlockElectra, error) { if err != nil { return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount") } - blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength) + blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, fieldparams.RootLength) if err != nil { return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash") } @@ -1992,112 +2935,77 @@ func (b *BeaconBlockElectra) ToConsensus() (*eth.BeaconBlockElectra, error) { if err != nil { return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature") } - payloadParentHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.ParentHash, common.HashLength) + payloadParentHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.ParentHash, common.HashLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ParentHash") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ParentHash") } - payloadFeeRecipient, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.FeeRecipient, fieldparams.FeeRecipientLength) + payloadFeeRecipient, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.FeeRecipient, fieldparams.FeeRecipientLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.FeeRecipient") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.FeeRecipient") } - payloadStateRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.StateRoot, fieldparams.RootLength) + payloadStateRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.StateRoot, fieldparams.RootLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.StateRoot") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.StateRoot") } - payloadReceiptsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.ReceiptsRoot, fieldparams.RootLength) + payloadReceiptsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.ReceiptsRoot, fieldparams.RootLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ReceiptsRoot") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ReceiptsRoot") } - payloadLogsBloom, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.LogsBloom, fieldparams.LogsBloomLength) + payloadLogsBloom, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.LogsBloom, fieldparams.LogsBloomLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.LogsBloom") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.LogsBloom") } - payloadPrevRandao, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.PrevRandao, fieldparams.RootLength) + payloadPrevRandao, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.PrevRandao, fieldparams.RootLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.PrevRandao") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.PrevRandao") } - payloadBlockNumber, err := strconv.ParseUint(b.Body.ExecutionPayload.BlockNumber, 10, 64) + payloadBlockNumber, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.BlockNumber, 10, 64) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlockNumber") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BlockNumber") } - payloadGasLimit, err := strconv.ParseUint(b.Body.ExecutionPayload.GasLimit, 10, 64) + payloadGasLimit, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.GasLimit, 10, 64) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.GasLimit") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.GasLimit") } - payloadGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayload.GasUsed, 10, 64) + payloadGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.GasUsed, 10, 64) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.GasUsed") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.GasUsed") } - payloadTimestamp, err := strconv.ParseUint(b.Body.ExecutionPayload.Timestamp, 10, 64) + payloadTimestamp, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.Timestamp, 10, 64) if err != nil { return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.Timestamp") } - payloadExtraData, err := bytesutil.DecodeHexWithMaxLength(b.Body.ExecutionPayload.ExtraData, fieldparams.RootLength) + payloadExtraData, err := bytesutil.DecodeHexWithMaxLength(b.Body.ExecutionPayloadHeader.ExtraData, fieldparams.RootLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ExtraData") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ExtraData") } - payloadBaseFeePerGas, err := bytesutil.Uint256ToSSZBytes(b.Body.ExecutionPayload.BaseFeePerGas) + payloadBaseFeePerGas, err := bytesutil.Uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BaseFeePerGas") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BaseFeePerGas") } - payloadBlockHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.BlockHash, common.HashLength) + payloadBlockHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.BlockHash, common.HashLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlockHash") + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BlockHash") } - err = slice.VerifyMaxLength(b.Body.ExecutionPayload.Transactions, fieldparams.MaxTxsPerPayloadLength) + payloadTxsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.TransactionsRoot, fieldparams.RootLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.Transactions") - } - txs := make([][]byte, len(b.Body.ExecutionPayload.Transactions)) - for i, tx := range b.Body.ExecutionPayload.Transactions { - txs[i], err = bytesutil.DecodeHexWithMaxLength(tx, fieldparams.MaxBytesPerTxLength) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Transactions[%d]", i)) - } + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.TransactionsRoot") } - err = slice.VerifyMaxLength(b.Body.ExecutionPayload.Withdrawals, fieldparams.MaxWithdrawalsPerPayload) + payloadWithdrawalsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.WithdrawalsRoot, fieldparams.RootLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayload.Withdrawals") - } - withdrawals := make([]*enginev1.Withdrawal, len(b.Body.ExecutionPayload.Withdrawals)) - for i, w := range b.Body.ExecutionPayload.Withdrawals { - withdrawalIndex, err := strconv.ParseUint(w.WithdrawalIndex, 10, 64) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].WithdrawalIndex", i)) - } - validatorIndex, err := strconv.ParseUint(w.ValidatorIndex, 10, 64) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].ValidatorIndex", i)) - } - address, err := bytesutil.DecodeHexWithLength(w.ExecutionAddress, common.AddressLength) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].ExecutionAddress", i)) - } - amount, err := strconv.ParseUint(w.Amount, 10, 64) - if err != nil { - return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].Amount", i)) - } - withdrawals[i] = &enginev1.Withdrawal{ - Index: withdrawalIndex, - ValidatorIndex: primitives.ValidatorIndex(validatorIndex), - Address: address, - Amount: amount, - } + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.WithdrawalsRoot") } - - payloadBlobGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayload.BlobGasUsed, 10, 64) + payloadBlobGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.BlobGasUsed, 10, 64) if err != nil { return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlobGasUsed") } - payloadExcessBlobGas, err := strconv.ParseUint(b.Body.ExecutionPayload.ExcessBlobGas, 10, 64) + payloadExcessBlobGas, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.ExcessBlobGas, 10, 64) if err != nil { return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ExcessBlobGas") } - if b.Body.ExecutionRequests == nil { - return nil, server.NewDecodeError(errors.New("nil execution requests"), "Body.ExequtionRequests") + return nil, server.NewDecodeError(errors.New("nil execution requests"), "Body.ExecutionRequests") } - depositRequests := make([]*enginev1.DepositRequest, len(b.Body.ExecutionRequests.Deposits)) for i, d := range b.Body.ExecutionRequests.Deposits { depositRequests[i], err = d.ToConsensus() @@ -2138,12 +3046,13 @@ func (b *BeaconBlockElectra) ToConsensus() (*eth.BeaconBlockElectra, error) { } blobKzgCommitments[i] = kzg } - return ð.BeaconBlockElectra{ + + return ð.BlindedBeaconBlockElectra{ Slot: primitives.Slot(slot), ProposerIndex: primitives.ValidatorIndex(proposerIndex), ParentRoot: parentRoot, StateRoot: stateRoot, - Body: ð.BeaconBlockBodyElectra{ + Body: ð.BlindedBeaconBlockBodyElectra{ RandaoReveal: randaoReveal, Eth1Data: ð.Eth1Data{ DepositRoot: depositRoot, @@ -2160,24 +3069,24 @@ func (b *BeaconBlockElectra) ToConsensus() (*eth.BeaconBlockElectra, error) { SyncCommitteeBits: syncCommitteeBits, SyncCommitteeSignature: syncCommitteeSig, }, - ExecutionPayload: &enginev1.ExecutionPayloadElectra{ - ParentHash: payloadParentHash, - FeeRecipient: payloadFeeRecipient, - StateRoot: payloadStateRoot, - ReceiptsRoot: payloadReceiptsRoot, - LogsBloom: payloadLogsBloom, - PrevRandao: payloadPrevRandao, - BlockNumber: payloadBlockNumber, - GasLimit: payloadGasLimit, - GasUsed: payloadGasUsed, - Timestamp: payloadTimestamp, - ExtraData: payloadExtraData, - BaseFeePerGas: payloadBaseFeePerGas, - BlockHash: payloadBlockHash, - Transactions: txs, - Withdrawals: withdrawals, - BlobGasUsed: payloadBlobGasUsed, - ExcessBlobGas: payloadExcessBlobGas, + ExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderDeneb{ + ParentHash: payloadParentHash, + FeeRecipient: payloadFeeRecipient, + StateRoot: payloadStateRoot, + ReceiptsRoot: payloadReceiptsRoot, + LogsBloom: payloadLogsBloom, + PrevRandao: payloadPrevRandao, + BlockNumber: payloadBlockNumber, + GasLimit: payloadGasLimit, + GasUsed: payloadGasUsed, + Timestamp: payloadTimestamp, + ExtraData: payloadExtraData, + BaseFeePerGas: payloadBaseFeePerGas, + BlockHash: payloadBlockHash, + TransactionsRoot: payloadTxsRoot, + WithdrawalsRoot: payloadWithdrawalsRoot, + BlobGasUsed: payloadBlobGasUsed, + ExcessBlobGas: payloadExcessBlobGas, }, BlsToExecutionChanges: blsChanges, BlobKzgCommitments: blobKzgCommitments, @@ -2190,63 +3099,251 @@ func (b *BeaconBlockElectra) ToConsensus() (*eth.BeaconBlockElectra, error) { }, nil } -func (b *SignedBeaconBlockElectra) ToConsensus() (*eth.SignedBeaconBlockElectra, error) { +func (b *BlindedBeaconBlockElectra) ToGeneric() (*eth.GenericBeaconBlock, error) { + if b == nil { + return nil, errNilValue + } + + blindedBlock, err := b.ToConsensus() + if err != nil { + return nil, err + } + return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedElectra{BlindedElectra: blindedBlock}, IsBlinded: true}, nil +} + +func SignedBeaconBlockContentsElectraFromConsensus(b *eth.SignedBeaconBlockContentsElectra) (*SignedBeaconBlockContentsElectra, error) { + block, err := SignedBeaconBlockElectraFromConsensus(b.Block) + if err != nil { + return nil, err + } + + proofs := make([]string, len(b.KzgProofs)) + for i, proof := range b.KzgProofs { + proofs[i] = hexutil.Encode(proof) + } + + blbs := make([]string, len(b.Blobs)) + for i, blob := range b.Blobs { + blbs[i] = hexutil.Encode(blob) + } + + return &SignedBeaconBlockContentsElectra{ + SignedBlock: block, + KzgProofs: proofs, + Blobs: blbs, + }, nil +} + +func BlindedBeaconBlockElectraFromConsensus(b *eth.BlindedBeaconBlockElectra) (*BlindedBeaconBlockElectra, error) { + blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments)) + for i := range b.Body.BlobKzgCommitments { + blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i]) + } + payload, err := ExecutionPayloadHeaderElectraFromConsensus(b.Body.ExecutionPayloadHeader) + if err != nil { + return nil, err + } + + return &BlindedBeaconBlockElectra{ + Slot: fmt.Sprintf("%d", b.Slot), + ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), + ParentRoot: hexutil.Encode(b.ParentRoot), + StateRoot: hexutil.Encode(b.StateRoot), + Body: &BlindedBeaconBlockBodyElectra{ + RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), + Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), + Graffiti: hexutil.Encode(b.Body.Graffiti), + ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), + AttesterSlashings: AttesterSlashingsElectraFromConsensus(b.Body.AttesterSlashings), + Attestations: AttsElectraFromConsensus(b.Body.Attestations), + Deposits: DepositsFromConsensus(b.Body.Deposits), + VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), + SyncAggregate: &SyncAggregate{ + SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), + SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), + }, + ExecutionPayloadHeader: payload, + BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges), + BlobKzgCommitments: blobKzgCommitments, + ExecutionRequests: ExecutionRequestsFromConsensus(b.Body.ExecutionRequests), + }, + }, nil +} + +func BeaconBlockContentsElectraFromConsensus(b *eth.BeaconBlockContentsElectra) (*BeaconBlockContentsElectra, error) { + block, err := BeaconBlockElectraFromConsensus(b.Block) + if err != nil { + return nil, err + } + proofs := make([]string, len(b.KzgProofs)) + for i, proof := range b.KzgProofs { + proofs[i] = hexutil.Encode(proof) + } + blbs := make([]string, len(b.Blobs)) + for i, blob := range b.Blobs { + blbs[i] = hexutil.Encode(blob) + } + return &BeaconBlockContentsElectra{ + Block: block, + KzgProofs: proofs, + Blobs: blbs, + }, nil +} + +func ExecutionRequestsFromConsensus(er *enginev1.ExecutionRequests) *ExecutionRequests { + return &ExecutionRequests{ + Deposits: DepositRequestsFromConsensus(er.Deposits), + Withdrawals: WithdrawalRequestsFromConsensus(er.Withdrawals), + Consolidations: ConsolidationRequestsFromConsensus(er.Consolidations), + } +} + +func SignedBlindedBeaconBlockElectraFromConsensus(b *eth.SignedBlindedBeaconBlockElectra) (*SignedBlindedBeaconBlockElectra, error) { + block, err := BlindedBeaconBlockElectraFromConsensus(b.Message) + if err != nil { + return nil, err + } + return &SignedBlindedBeaconBlockElectra{ + Message: block, + Signature: hexutil.Encode(b.Signature), + }, nil +} + +func BeaconBlockElectraFromConsensus(b *eth.BeaconBlockElectra) (*BeaconBlockElectra, error) { + payload, err := ExecutionPayloadElectraFromConsensus(b.Body.ExecutionPayload) + if err != nil { + return nil, err + } + blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments)) + for i := range b.Body.BlobKzgCommitments { + blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i]) + } + + return &BeaconBlockElectra{ + Slot: fmt.Sprintf("%d", b.Slot), + ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), + ParentRoot: hexutil.Encode(b.ParentRoot), + StateRoot: hexutil.Encode(b.StateRoot), + Body: &BeaconBlockBodyElectra{ + RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), + Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), + Graffiti: hexutil.Encode(b.Body.Graffiti), + ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), + AttesterSlashings: AttesterSlashingsElectraFromConsensus(b.Body.AttesterSlashings), + Attestations: AttsElectraFromConsensus(b.Body.Attestations), + Deposits: DepositsFromConsensus(b.Body.Deposits), + VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), + SyncAggregate: &SyncAggregate{ + SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), + SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), + }, + ExecutionPayload: payload, + BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges), + BlobKzgCommitments: blobKzgCommitments, + ExecutionRequests: ExecutionRequestsFromConsensus(b.Body.ExecutionRequests), + }, + }, nil +} + +func SignedBeaconBlockElectraFromConsensus(b *eth.SignedBeaconBlockElectra) (*SignedBeaconBlockElectra, error) { + block, err := BeaconBlockElectraFromConsensus(b.Block) + if err != nil { + return nil, err + } + return &SignedBeaconBlockElectra{ + Message: block, + Signature: hexutil.Encode(b.Signature), + }, nil +} + +var ( + ExecutionPayloadElectraFromConsensus = ExecutionPayloadDenebFromConsensus + ExecutionPayloadHeaderElectraFromConsensus = ExecutionPayloadHeaderDenebFromConsensus +) + +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- + +func (b *SignedBeaconBlockContentsFulu) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { if b == nil { return nil, errNilValue } - sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength) + signedFuluBlock, err := b.SignedBlock.ToConsensus() if err != nil { - return nil, server.NewDecodeError(err, "Signature") + return nil, server.NewDecodeError(err, "SignedBlock") } - block, err := b.Message.ToConsensus() - if err != nil { - return nil, server.NewDecodeError(err, "Message") + proofs := make([][]byte, len(b.KzgProofs)) + for i, proof := range b.KzgProofs { + proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i)) + } } - return ð.SignedBeaconBlockElectra{ - Block: block, - Signature: sig, - }, nil + blbs := make([][]byte, len(b.Blobs)) + for i, blob := range b.Blobs { + blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i)) + } + } + blk := ð.SignedBeaconBlockContentsFulu{ + Block: signedFuluBlock, + KzgProofs: proofs, + Blobs: blbs, + } + return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_Fulu{Fulu: blk}}, nil } -func (b *SignedBlindedBeaconBlockElectra) ToConsensus() (*eth.SignedBlindedBeaconBlockElectra, error) { - if b == nil { - return nil, errNilValue +func (b *SignedBeaconBlockContentsFulu) ToUnsigned() *BeaconBlockContentsFulu { + return &BeaconBlockContentsFulu{ + Block: b.SignedBlock.Message, + KzgProofs: b.KzgProofs, + Blobs: b.Blobs, } +} - sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength) - if err != nil { - return nil, server.NewDecodeError(err, "Signature") - } - blindedBlock, err := b.Message.ToConsensus() +func (b *BeaconBlockContentsFulu) ToGeneric() (*eth.GenericBeaconBlock, error) { + block, err := b.ToConsensus() if err != nil { return nil, err } - return ð.SignedBlindedBeaconBlockElectra{ - Message: blindedBlock, - Signature: sig, - }, nil + + return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_Fulu{Fulu: block}}, nil } -func (b *SignedBlindedBeaconBlockElectra) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { +func (b *BeaconBlockContentsFulu) ToConsensus() (*eth.BeaconBlockContentsFulu, error) { if b == nil { return nil, errNilValue } - sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength) + + fuluBlock, err := b.Block.ToConsensus() if err != nil { - return nil, server.NewDecodeError(err, "Signature") + return nil, server.NewDecodeError(err, "Block") } - blindedBlock, err := b.Message.ToConsensus() - if err != nil { - return nil, err + proofs := make([][]byte, len(b.KzgProofs)) + for i, proof := range b.KzgProofs { + proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i)) + } } - return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_BlindedElectra{BlindedElectra: ð.SignedBlindedBeaconBlockElectra{ - Message: blindedBlock, - Signature: sig, - }}, IsBlinded: true}, nil + blbs := make([][]byte, len(b.Blobs)) + for i, blob := range b.Blobs { + blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i)) + } + } + return ð.BeaconBlockContentsFulu{ + Block: fuluBlock, + KzgProofs: proofs, + Blobs: blbs, + }, nil } -func (b *BlindedBeaconBlockElectra) ToConsensus() (*eth.BlindedBeaconBlockElectra, error) { +func (b *BeaconBlockFulu) ToConsensus() (*eth.BeaconBlockFulu, error) { if b == nil { return nil, errNilValue } @@ -2259,8 +3356,8 @@ func (b *BlindedBeaconBlockElectra) ToConsensus() (*eth.BlindedBeaconBlockElectr if b.Body.SyncAggregate == nil { return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate") } - if b.Body.ExecutionPayloadHeader == nil { - return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayloadHeader") + if b.Body.ExecutionPayload == nil { + return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayload") } slot, err := strconv.ParseUint(b.Slot, 10, 64) @@ -2291,7 +3388,7 @@ func (b *BlindedBeaconBlockElectra) ToConsensus() (*eth.BlindedBeaconBlockElectr if err != nil { return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount") } - blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, fieldparams.RootLength) + blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength) if err != nil { return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash") } @@ -2327,77 +3424,112 @@ func (b *BlindedBeaconBlockElectra) ToConsensus() (*eth.BlindedBeaconBlockElectr if err != nil { return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature") } - payloadParentHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.ParentHash, common.HashLength) + payloadParentHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.ParentHash, common.HashLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ParentHash") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ParentHash") } - payloadFeeRecipient, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.FeeRecipient, fieldparams.FeeRecipientLength) + payloadFeeRecipient, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.FeeRecipient, fieldparams.FeeRecipientLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.FeeRecipient") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.FeeRecipient") } - payloadStateRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.StateRoot, fieldparams.RootLength) + payloadStateRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.StateRoot, fieldparams.RootLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.StateRoot") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.StateRoot") } - payloadReceiptsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.ReceiptsRoot, fieldparams.RootLength) + payloadReceiptsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.ReceiptsRoot, fieldparams.RootLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ReceiptsRoot") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ReceiptsRoot") } - payloadLogsBloom, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.LogsBloom, fieldparams.LogsBloomLength) + payloadLogsBloom, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.LogsBloom, fieldparams.LogsBloomLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.LogsBloom") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.LogsBloom") } - payloadPrevRandao, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.PrevRandao, fieldparams.RootLength) + payloadPrevRandao, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.PrevRandao, fieldparams.RootLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.PrevRandao") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.PrevRandao") } - payloadBlockNumber, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.BlockNumber, 10, 64) + payloadBlockNumber, err := strconv.ParseUint(b.Body.ExecutionPayload.BlockNumber, 10, 64) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BlockNumber") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlockNumber") } - payloadGasLimit, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.GasLimit, 10, 64) + payloadGasLimit, err := strconv.ParseUint(b.Body.ExecutionPayload.GasLimit, 10, 64) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.GasLimit") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.GasLimit") } - payloadGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.GasUsed, 10, 64) + payloadGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayload.GasUsed, 10, 64) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.GasUsed") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.GasUsed") } - payloadTimestamp, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.Timestamp, 10, 64) + payloadTimestamp, err := strconv.ParseUint(b.Body.ExecutionPayload.Timestamp, 10, 64) if err != nil { return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.Timestamp") } - payloadExtraData, err := bytesutil.DecodeHexWithMaxLength(b.Body.ExecutionPayloadHeader.ExtraData, fieldparams.RootLength) + payloadExtraData, err := bytesutil.DecodeHexWithMaxLength(b.Body.ExecutionPayload.ExtraData, fieldparams.RootLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ExtraData") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ExtraData") } - payloadBaseFeePerGas, err := bytesutil.Uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas) + payloadBaseFeePerGas, err := bytesutil.Uint256ToSSZBytes(b.Body.ExecutionPayload.BaseFeePerGas) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BaseFeePerGas") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BaseFeePerGas") } - payloadBlockHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.BlockHash, common.HashLength) + payloadBlockHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayload.BlockHash, common.HashLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BlockHash") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlockHash") } - payloadTxsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.TransactionsRoot, fieldparams.RootLength) + err = slice.VerifyMaxLength(b.Body.ExecutionPayload.Transactions, fieldparams.MaxTxsPerPayloadLength) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.TransactionsRoot") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.Transactions") } - payloadWithdrawalsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.WithdrawalsRoot, fieldparams.RootLength) + txs := make([][]byte, len(b.Body.ExecutionPayload.Transactions)) + for i, tx := range b.Body.ExecutionPayload.Transactions { + txs[i], err = bytesutil.DecodeHexWithMaxLength(tx, fieldparams.MaxBytesPerTxLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Transactions[%d]", i)) + } + } + err = slice.VerifyMaxLength(b.Body.ExecutionPayload.Withdrawals, fieldparams.MaxWithdrawalsPerPayload) if err != nil { - return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.WithdrawalsRoot") + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.Withdrawals") } - payloadBlobGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.BlobGasUsed, 10, 64) + withdrawals := make([]*enginev1.Withdrawal, len(b.Body.ExecutionPayload.Withdrawals)) + for i, w := range b.Body.ExecutionPayload.Withdrawals { + withdrawalIndex, err := strconv.ParseUint(w.WithdrawalIndex, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].WithdrawalIndex", i)) + } + validatorIndex, err := strconv.ParseUint(w.ValidatorIndex, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].ValidatorIndex", i)) + } + address, err := bytesutil.DecodeHexWithLength(w.ExecutionAddress, common.AddressLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].ExecutionAddress", i)) + } + amount, err := strconv.ParseUint(w.Amount, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionPayload.Withdrawals[%d].Amount", i)) + } + withdrawals[i] = &enginev1.Withdrawal{ + Index: withdrawalIndex, + ValidatorIndex: primitives.ValidatorIndex(validatorIndex), + Address: address, + Amount: amount, + } + } + + payloadBlobGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayload.BlobGasUsed, 10, 64) if err != nil { return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlobGasUsed") } - payloadExcessBlobGas, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.ExcessBlobGas, 10, 64) + payloadExcessBlobGas, err := strconv.ParseUint(b.Body.ExecutionPayload.ExcessBlobGas, 10, 64) if err != nil { return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ExcessBlobGas") } + if b.Body.ExecutionRequests == nil { - return nil, server.NewDecodeError(errors.New("nil execution requests"), "Body.ExecutionRequests") + return nil, server.NewDecodeError(errors.New("nil execution requests"), "Body.ExequtionRequests") } + depositRequests := make([]*enginev1.DepositRequest, len(b.Body.ExecutionRequests.Deposits)) for i, d := range b.Body.ExecutionRequests.Deposits { depositRequests[i], err = d.ToConsensus() @@ -2438,13 +3570,12 @@ func (b *BlindedBeaconBlockElectra) ToConsensus() (*eth.BlindedBeaconBlockElectr } blobKzgCommitments[i] = kzg } - - return ð.BlindedBeaconBlockElectra{ + return ð.BeaconBlockFulu{ Slot: primitives.Slot(slot), ProposerIndex: primitives.ValidatorIndex(proposerIndex), ParentRoot: parentRoot, StateRoot: stateRoot, - Body: ð.BlindedBeaconBlockBodyElectra{ + Body: ð.BeaconBlockBodyFulu{ RandaoReveal: randaoReveal, Eth1Data: ð.Eth1Data{ DepositRoot: depositRoot, @@ -2461,24 +3592,24 @@ func (b *BlindedBeaconBlockElectra) ToConsensus() (*eth.BlindedBeaconBlockElectr SyncCommitteeBits: syncCommitteeBits, SyncCommitteeSignature: syncCommitteeSig, }, - ExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderElectra{ - ParentHash: payloadParentHash, - FeeRecipient: payloadFeeRecipient, - StateRoot: payloadStateRoot, - ReceiptsRoot: payloadReceiptsRoot, - LogsBloom: payloadLogsBloom, - PrevRandao: payloadPrevRandao, - BlockNumber: payloadBlockNumber, - GasLimit: payloadGasLimit, - GasUsed: payloadGasUsed, - Timestamp: payloadTimestamp, - ExtraData: payloadExtraData, - BaseFeePerGas: payloadBaseFeePerGas, - BlockHash: payloadBlockHash, - TransactionsRoot: payloadTxsRoot, - WithdrawalsRoot: payloadWithdrawalsRoot, - BlobGasUsed: payloadBlobGasUsed, - ExcessBlobGas: payloadExcessBlobGas, + ExecutionPayload: &enginev1.ExecutionPayloadDeneb{ + ParentHash: payloadParentHash, + FeeRecipient: payloadFeeRecipient, + StateRoot: payloadStateRoot, + ReceiptsRoot: payloadReceiptsRoot, + LogsBloom: payloadLogsBloom, + PrevRandao: payloadPrevRandao, + BlockNumber: payloadBlockNumber, + GasLimit: payloadGasLimit, + GasUsed: payloadGasUsed, + Timestamp: payloadTimestamp, + ExtraData: payloadExtraData, + BaseFeePerGas: payloadBaseFeePerGas, + BlockHash: payloadBlockHash, + Transactions: txs, + Withdrawals: withdrawals, + BlobGasUsed: payloadBlobGasUsed, + ExcessBlobGas: payloadExcessBlobGas, }, BlsToExecutionChanges: blsChanges, BlobKzgCommitments: blobKzgCommitments, @@ -2491,436 +3622,321 @@ func (b *BlindedBeaconBlockElectra) ToConsensus() (*eth.BlindedBeaconBlockElectr }, nil } -func (b *BlindedBeaconBlockElectra) ToGeneric() (*eth.GenericBeaconBlock, error) { +func (b *SignedBeaconBlockFulu) ToConsensus() (*eth.SignedBeaconBlockFulu, error) { + if b == nil { + return nil, errNilValue + } + + sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength) + if err != nil { + return nil, server.NewDecodeError(err, "Signature") + } + block, err := b.Message.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, "Message") + } + return ð.SignedBeaconBlockFulu{ + Block: block, + Signature: sig, + }, nil +} + +func (b *SignedBlindedBeaconBlockFulu) ToConsensus() (*eth.SignedBlindedBeaconBlockFulu, error) { + if b == nil { + return nil, errNilValue + } + + sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength) + if err != nil { + return nil, server.NewDecodeError(err, "Signature") + } + blindedBlock, err := b.Message.ToConsensus() + if err != nil { + return nil, err + } + return ð.SignedBlindedBeaconBlockFulu{ + Message: blindedBlock, + Signature: sig, + }, nil +} + +func (b *SignedBlindedBeaconBlockFulu) ToGeneric() (*eth.GenericSignedBeaconBlock, error) { if b == nil { return nil, errNilValue } - - blindedBlock, err := b.ToConsensus() + sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength) + if err != nil { + return nil, server.NewDecodeError(err, "Signature") + } + blindedBlock, err := b.Message.ToConsensus() if err != nil { return nil, err } - return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedElectra{BlindedElectra: blindedBlock}, IsBlinded: true}, nil + return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_BlindedFulu{BlindedFulu: ð.SignedBlindedBeaconBlockFulu{ + Message: blindedBlock, + Signature: sig, + }}, IsBlinded: true}, nil } -func BeaconBlockHeaderFromConsensus(h *eth.BeaconBlockHeader) *BeaconBlockHeader { - return &BeaconBlockHeader{ - Slot: fmt.Sprintf("%d", h.Slot), - ProposerIndex: fmt.Sprintf("%d", h.ProposerIndex), - ParentRoot: hexutil.Encode(h.ParentRoot), - StateRoot: hexutil.Encode(h.StateRoot), - BodyRoot: hexutil.Encode(h.BodyRoot), +func (b *BlindedBeaconBlockFulu) ToConsensus() (*eth.BlindedBeaconBlockFulu, error) { + if b == nil { + return nil, errNilValue } -} - -func BeaconBlockFromConsensus(b *eth.BeaconBlock) *BeaconBlock { - return &BeaconBlock{ - Slot: fmt.Sprintf("%d", b.Slot), - ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), - ParentRoot: hexutil.Encode(b.ParentRoot), - StateRoot: hexutil.Encode(b.StateRoot), - Body: &BeaconBlockBody{ - RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), - Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), - Graffiti: hexutil.Encode(b.Body.Graffiti), - ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), - AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), - Attestations: AttsFromConsensus(b.Body.Attestations), - Deposits: DepositsFromConsensus(b.Body.Deposits), - VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), - }, + if b.Body == nil { + return nil, server.NewDecodeError(errNilValue, "Body") + } + if b.Body.Eth1Data == nil { + return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data") + } + if b.Body.SyncAggregate == nil { + return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate") + } + if b.Body.ExecutionPayloadHeader == nil { + return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayloadHeader") } -} -func SignedBeaconBlockMessageJsoner(block interfaces.ReadOnlySignedBeaconBlock) (SignedMessageJsoner, error) { - pb, err := block.Proto() + slot, err := strconv.ParseUint(b.Slot, 10, 64) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Slot") } - switch pbStruct := pb.(type) { - case *eth.SignedBeaconBlock: - return SignedBeaconBlockPhase0FromConsensus(pbStruct), nil - case *eth.SignedBeaconBlockAltair: - return SignedBeaconBlockAltairFromConsensus(pbStruct), nil - case *eth.SignedBlindedBeaconBlockBellatrix: - return SignedBlindedBeaconBlockBellatrixFromConsensus(pbStruct) - case *eth.SignedBeaconBlockBellatrix: - return SignedBeaconBlockBellatrixFromConsensus(pbStruct) - case *eth.SignedBlindedBeaconBlockCapella: - return SignedBlindedBeaconBlockCapellaFromConsensus(pbStruct) - case *eth.SignedBeaconBlockCapella: - return SignedBeaconBlockCapellaFromConsensus(pbStruct) - case *eth.SignedBlindedBeaconBlockDeneb: - return SignedBlindedBeaconBlockDenebFromConsensus(pbStruct) - case *eth.SignedBeaconBlockDeneb: - return SignedBeaconBlockDenebFromConsensus(pbStruct) - case *eth.SignedBlindedBeaconBlockElectra: - return SignedBlindedBeaconBlockElectraFromConsensus(pbStruct) - case *eth.SignedBeaconBlockElectra: - return SignedBeaconBlockElectraFromConsensus(pbStruct) - default: - return nil, ErrUnsupportedConversion + proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "ProposerIndex") } -} - -func SignedBeaconBlockPhase0FromConsensus(b *eth.SignedBeaconBlock) *SignedBeaconBlock { - return &SignedBeaconBlock{ - Message: BeaconBlockFromConsensus(b.Block), - Signature: hexutil.Encode(b.Signature), + parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "ParentRoot") } -} - -func BeaconBlockAltairFromConsensus(b *eth.BeaconBlockAltair) *BeaconBlockAltair { - return &BeaconBlockAltair{ - Slot: fmt.Sprintf("%d", b.Slot), - ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), - ParentRoot: hexutil.Encode(b.ParentRoot), - StateRoot: hexutil.Encode(b.StateRoot), - Body: &BeaconBlockBodyAltair{ - RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), - Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), - Graffiti: hexutil.Encode(b.Body.Graffiti), - ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), - AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), - Attestations: AttsFromConsensus(b.Body.Attestations), - Deposits: DepositsFromConsensus(b.Body.Deposits), - VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), - SyncAggregate: &SyncAggregate{ - SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), - SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), - }, - }, + stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "StateRoot") } -} - -func SignedBeaconBlockAltairFromConsensus(b *eth.SignedBeaconBlockAltair) *SignedBeaconBlockAltair { - return &SignedBeaconBlockAltair{ - Message: BeaconBlockAltairFromConsensus(b.Block), - Signature: hexutil.Encode(b.Signature), + randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.RandaoReveal") } -} - -func BlindedBeaconBlockBellatrixFromConsensus(b *eth.BlindedBeaconBlockBellatrix) (*BlindedBeaconBlockBellatrix, error) { - payload, err := ExecutionPayloadHeaderFromConsensus(b.Body.ExecutionPayloadHeader) + depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot") } - - return &BlindedBeaconBlockBellatrix{ - Slot: fmt.Sprintf("%d", b.Slot), - ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), - ParentRoot: hexutil.Encode(b.ParentRoot), - StateRoot: hexutil.Encode(b.StateRoot), - Body: &BlindedBeaconBlockBodyBellatrix{ - RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), - Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), - Graffiti: hexutil.Encode(b.Body.Graffiti), - ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), - AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), - Attestations: AttsFromConsensus(b.Body.Attestations), - Deposits: DepositsFromConsensus(b.Body.Deposits), - VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), - SyncAggregate: &SyncAggregate{ - SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), - SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), - }, - ExecutionPayloadHeader: payload, - }, - }, nil -} - -func SignedBlindedBeaconBlockBellatrixFromConsensus(b *eth.SignedBlindedBeaconBlockBellatrix) (*SignedBlindedBeaconBlockBellatrix, error) { - blindedBlock, err := BlindedBeaconBlockBellatrixFromConsensus(b.Block) + depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount") } - return &SignedBlindedBeaconBlockBellatrix{ - Message: blindedBlock, - Signature: hexutil.Encode(b.Signature), - }, nil -} - -func BeaconBlockBellatrixFromConsensus(b *eth.BeaconBlockBellatrix) (*BeaconBlockBellatrix, error) { - payload, err := ExecutionPayloadFromConsensus(b.Body.ExecutionPayload) + blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, fieldparams.RootLength) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash") } - - return &BeaconBlockBellatrix{ - Slot: fmt.Sprintf("%d", b.Slot), - ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), - ParentRoot: hexutil.Encode(b.ParentRoot), - StateRoot: hexutil.Encode(b.StateRoot), - Body: &BeaconBlockBodyBellatrix{ - RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), - Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), - Graffiti: hexutil.Encode(b.Body.Graffiti), - ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), - AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), - Attestations: AttsFromConsensus(b.Body.Attestations), - Deposits: DepositsFromConsensus(b.Body.Deposits), - VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), - SyncAggregate: &SyncAggregate{ - SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), - SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), - }, - ExecutionPayload: payload, - }, - }, nil -} - -func SignedBeaconBlockBellatrixFromConsensus(b *eth.SignedBeaconBlockBellatrix) (*SignedBeaconBlockBellatrix, error) { - block, err := BeaconBlockBellatrixFromConsensus(b.Block) + graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.Graffiti") + } + proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ProposerSlashings") + } + attesterSlashings, err := AttesterSlashingsElectraToConsensus(b.Body.AttesterSlashings) + if err != nil { + return nil, server.NewDecodeError(err, "Body.AttesterSlashings") + } + atts, err := AttsElectraToConsensus(b.Body.Attestations) + if err != nil { + return nil, server.NewDecodeError(err, "Body.Attestations") + } + deposits, err := DepositsToConsensus(b.Body.Deposits) + if err != nil { + return nil, server.NewDecodeError(err, "Body.Deposits") + } + exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits) + if err != nil { + return nil, server.NewDecodeError(err, "Body.VoluntaryExits") + } + syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits") + } + syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature") + } + payloadParentHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.ParentHash, common.HashLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ParentHash") + } + payloadFeeRecipient, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.FeeRecipient, fieldparams.FeeRecipientLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.FeeRecipient") + } + payloadStateRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.StateRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.StateRoot") + } + payloadReceiptsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.ReceiptsRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ReceiptsRoot") + } + payloadLogsBloom, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.LogsBloom, fieldparams.LogsBloomLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.LogsBloom") } - return &SignedBeaconBlockBellatrix{ - Message: block, - Signature: hexutil.Encode(b.Signature), - }, nil -} - -func BlindedBeaconBlockCapellaFromConsensus(b *eth.BlindedBeaconBlockCapella) (*BlindedBeaconBlockCapella, error) { - payload, err := ExecutionPayloadHeaderCapellaFromConsensus(b.Body.ExecutionPayloadHeader) + payloadPrevRandao, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.PrevRandao, fieldparams.RootLength) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.PrevRandao") } - - return &BlindedBeaconBlockCapella{ - Slot: fmt.Sprintf("%d", b.Slot), - ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), - ParentRoot: hexutil.Encode(b.ParentRoot), - StateRoot: hexutil.Encode(b.StateRoot), - Body: &BlindedBeaconBlockBodyCapella{ - RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), - Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), - Graffiti: hexutil.Encode(b.Body.Graffiti), - ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), - AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), - Attestations: AttsFromConsensus(b.Body.Attestations), - Deposits: DepositsFromConsensus(b.Body.Deposits), - VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), - SyncAggregate: &SyncAggregate{ - SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), - SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), - }, - ExecutionPayloadHeader: payload, - BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges), - }, - }, nil -} - -func SignedBlindedBeaconBlockCapellaFromConsensus(b *eth.SignedBlindedBeaconBlockCapella) (*SignedBlindedBeaconBlockCapella, error) { - blindedBlock, err := BlindedBeaconBlockCapellaFromConsensus(b.Block) + payloadBlockNumber, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.BlockNumber, 10, 64) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BlockNumber") } - return &SignedBlindedBeaconBlockCapella{ - Message: blindedBlock, - Signature: hexutil.Encode(b.Signature), - }, nil -} - -func BeaconBlockCapellaFromConsensus(b *eth.BeaconBlockCapella) (*BeaconBlockCapella, error) { - payload, err := ExecutionPayloadCapellaFromConsensus(b.Body.ExecutionPayload) + payloadGasLimit, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.GasLimit, 10, 64) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.GasLimit") } - - return &BeaconBlockCapella{ - Slot: fmt.Sprintf("%d", b.Slot), - ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), - ParentRoot: hexutil.Encode(b.ParentRoot), - StateRoot: hexutil.Encode(b.StateRoot), - Body: &BeaconBlockBodyCapella{ - RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), - Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), - Graffiti: hexutil.Encode(b.Body.Graffiti), - ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), - AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), - Attestations: AttsFromConsensus(b.Body.Attestations), - Deposits: DepositsFromConsensus(b.Body.Deposits), - VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), - SyncAggregate: &SyncAggregate{ - SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), - SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), - }, - ExecutionPayload: payload, - BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges), - }, - }, nil -} - -func SignedBeaconBlockCapellaFromConsensus(b *eth.SignedBeaconBlockCapella) (*SignedBeaconBlockCapella, error) { - block, err := BeaconBlockCapellaFromConsensus(b.Block) + payloadGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.GasUsed, 10, 64) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.GasUsed") } - return &SignedBeaconBlockCapella{ - Message: block, - Signature: hexutil.Encode(b.Signature), - }, nil -} - -func BeaconBlockContentsDenebFromConsensus(b *eth.BeaconBlockContentsDeneb) (*BeaconBlockContentsDeneb, error) { - block, err := BeaconBlockDenebFromConsensus(b.Block) + payloadTimestamp, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.Timestamp, 10, 64) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.Timestamp") } - proofs := make([]string, len(b.KzgProofs)) - for i, proof := range b.KzgProofs { - proofs[i] = hexutil.Encode(proof) + payloadExtraData, err := bytesutil.DecodeHexWithMaxLength(b.Body.ExecutionPayloadHeader.ExtraData, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ExtraData") } - blbs := make([]string, len(b.Blobs)) - for i, blob := range b.Blobs { - blbs[i] = hexutil.Encode(blob) + payloadBaseFeePerGas, err := bytesutil.Uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BaseFeePerGas") } - return &BeaconBlockContentsDeneb{ - Block: block, - KzgProofs: proofs, - Blobs: blbs, - }, nil -} - -func SignedBeaconBlockContentsDenebFromConsensus(b *eth.SignedBeaconBlockContentsDeneb) (*SignedBeaconBlockContentsDeneb, error) { - block, err := SignedBeaconBlockDenebFromConsensus(b.Block) + payloadBlockHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.BlockHash, common.HashLength) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BlockHash") } - - proofs := make([]string, len(b.KzgProofs)) - for i, proof := range b.KzgProofs { - proofs[i] = hexutil.Encode(proof) + payloadTxsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.TransactionsRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.TransactionsRoot") } - - blbs := make([]string, len(b.Blobs)) - for i, blob := range b.Blobs { - blbs[i] = hexutil.Encode(blob) + payloadWithdrawalsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.WithdrawalsRoot, fieldparams.RootLength) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.WithdrawalsRoot") } - - return &SignedBeaconBlockContentsDeneb{ - SignedBlock: block, - KzgProofs: proofs, - Blobs: blbs, - }, nil -} - -func BlindedBeaconBlockDenebFromConsensus(b *eth.BlindedBeaconBlockDeneb) (*BlindedBeaconBlockDeneb, error) { - blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments)) - for i := range b.Body.BlobKzgCommitments { - blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i]) + payloadBlobGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.BlobGasUsed, 10, 64) + if err != nil { + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlobGasUsed") } - payload, err := ExecutionPayloadHeaderDenebFromConsensus(b.Body.ExecutionPayloadHeader) + payloadExcessBlobGas, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.ExcessBlobGas, 10, 64) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ExcessBlobGas") + } + if b.Body.ExecutionRequests == nil { + return nil, server.NewDecodeError(errors.New("nil execution requests"), "Body.ExecutionRequests") + } + depositRequests := make([]*enginev1.DepositRequest, len(b.Body.ExecutionRequests.Deposits)) + for i, d := range b.Body.ExecutionRequests.Deposits { + depositRequests[i], err = d.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionRequests.Deposits[%d]", i)) + } } - return &BlindedBeaconBlockDeneb{ - Slot: fmt.Sprintf("%d", b.Slot), - ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), - ParentRoot: hexutil.Encode(b.ParentRoot), - StateRoot: hexutil.Encode(b.StateRoot), - Body: &BlindedBeaconBlockBodyDeneb{ - RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), - Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), - Graffiti: hexutil.Encode(b.Body.Graffiti), - ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), - AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), - Attestations: AttsFromConsensus(b.Body.Attestations), - Deposits: DepositsFromConsensus(b.Body.Deposits), - VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), - SyncAggregate: &SyncAggregate{ - SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), - SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), - }, - ExecutionPayloadHeader: payload, - BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges), - BlobKzgCommitments: blobKzgCommitments, - }, - }, nil -} + withdrawalRequests := make([]*enginev1.WithdrawalRequest, len(b.Body.ExecutionRequests.Withdrawals)) + for i, w := range b.Body.ExecutionRequests.Withdrawals { + withdrawalRequests[i], err = w.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionRequests.Withdrawals[%d]", i)) + } + } -func SignedBlindedBeaconBlockDenebFromConsensus(b *eth.SignedBlindedBeaconBlockDeneb) (*SignedBlindedBeaconBlockDeneb, error) { - block, err := BlindedBeaconBlockDenebFromConsensus(b.Message) - if err != nil { - return nil, err + consolidationRequests := make([]*enginev1.ConsolidationRequest, len(b.Body.ExecutionRequests.Consolidations)) + for i, c := range b.Body.ExecutionRequests.Consolidations { + consolidationRequests[i], err = c.ToConsensus() + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionRequests.Consolidations[%d]", i)) + } } - return &SignedBlindedBeaconBlockDeneb{ - Message: block, - Signature: hexutil.Encode(b.Signature), - }, nil -} -func BeaconBlockDenebFromConsensus(b *eth.BeaconBlockDeneb) (*BeaconBlockDeneb, error) { - baseFeePerGas, err := sszBytesToUint256String(b.Body.ExecutionPayload.BaseFeePerGas) + blsChanges, err := SignedBLSChangesToConsensus(b.Body.BLSToExecutionChanges) if err != nil { - return nil, err + return nil, server.NewDecodeError(err, "Body.BLSToExecutionChanges") } - transactions := make([]string, len(b.Body.ExecutionPayload.Transactions)) - for i, tx := range b.Body.ExecutionPayload.Transactions { - transactions[i] = hexutil.Encode(tx) + err = slice.VerifyMaxLength(b.Body.BlobKzgCommitments, fieldparams.MaxBlobCommitmentsPerBlock) + if err != nil { + return nil, server.NewDecodeError(err, "Body.BlobKzgCommitments") } - blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments)) - for i := range b.Body.BlobKzgCommitments { - blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i]) + blobKzgCommitments := make([][]byte, len(b.Body.BlobKzgCommitments)) + for i, b := range b.Body.BlobKzgCommitments { + kzg, err := bytesutil.DecodeHexWithLength(b, fieldparams.BLSPubkeyLength) + if err != nil { + return nil, server.NewDecodeError(err, fmt.Sprintf("Body.BlobKzgCommitments[%d]", i)) + } + blobKzgCommitments[i] = kzg } - return &BeaconBlockDeneb{ - Slot: fmt.Sprintf("%d", b.Slot), - ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), - ParentRoot: hexutil.Encode(b.ParentRoot), - StateRoot: hexutil.Encode(b.StateRoot), - Body: &BeaconBlockBodyDeneb{ - RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), - Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), - Graffiti: hexutil.Encode(b.Body.Graffiti), - ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings), - AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings), - Attestations: AttsFromConsensus(b.Body.Attestations), - Deposits: DepositsFromConsensus(b.Body.Deposits), - VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits), - SyncAggregate: &SyncAggregate{ - SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits), - SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature), + return ð.BlindedBeaconBlockFulu{ + Slot: primitives.Slot(slot), + ProposerIndex: primitives.ValidatorIndex(proposerIndex), + ParentRoot: parentRoot, + StateRoot: stateRoot, + Body: ð.BlindedBeaconBlockBodyFulu{ + RandaoReveal: randaoReveal, + Eth1Data: ð.Eth1Data{ + DepositRoot: depositRoot, + DepositCount: depositCount, + BlockHash: blockHash, + }, + Graffiti: graffiti, + ProposerSlashings: proposerSlashings, + AttesterSlashings: attesterSlashings, + Attestations: atts, + Deposits: deposits, + VoluntaryExits: exits, + SyncAggregate: ð.SyncAggregate{ + SyncCommitteeBits: syncCommitteeBits, + SyncCommitteeSignature: syncCommitteeSig, }, - ExecutionPayload: &ExecutionPayloadDeneb{ - ParentHash: hexutil.Encode(b.Body.ExecutionPayload.ParentHash), - FeeRecipient: hexutil.Encode(b.Body.ExecutionPayload.FeeRecipient), - StateRoot: hexutil.Encode(b.Body.ExecutionPayload.StateRoot), - ReceiptsRoot: hexutil.Encode(b.Body.ExecutionPayload.ReceiptsRoot), - LogsBloom: hexutil.Encode(b.Body.ExecutionPayload.LogsBloom), - PrevRandao: hexutil.Encode(b.Body.ExecutionPayload.PrevRandao), - BlockNumber: fmt.Sprintf("%d", b.Body.ExecutionPayload.BlockNumber), - GasLimit: fmt.Sprintf("%d", b.Body.ExecutionPayload.GasLimit), - GasUsed: fmt.Sprintf("%d", b.Body.ExecutionPayload.GasUsed), - Timestamp: fmt.Sprintf("%d", b.Body.ExecutionPayload.Timestamp), - ExtraData: hexutil.Encode(b.Body.ExecutionPayload.ExtraData), - BaseFeePerGas: baseFeePerGas, - BlockHash: hexutil.Encode(b.Body.ExecutionPayload.BlockHash), - Transactions: transactions, - Withdrawals: WithdrawalsFromConsensus(b.Body.ExecutionPayload.Withdrawals), - BlobGasUsed: fmt.Sprintf("%d", b.Body.ExecutionPayload.BlobGasUsed), - ExcessBlobGas: fmt.Sprintf("%d", b.Body.ExecutionPayload.ExcessBlobGas), + ExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderDeneb{ + ParentHash: payloadParentHash, + FeeRecipient: payloadFeeRecipient, + StateRoot: payloadStateRoot, + ReceiptsRoot: payloadReceiptsRoot, + LogsBloom: payloadLogsBloom, + PrevRandao: payloadPrevRandao, + BlockNumber: payloadBlockNumber, + GasLimit: payloadGasLimit, + GasUsed: payloadGasUsed, + Timestamp: payloadTimestamp, + ExtraData: payloadExtraData, + BaseFeePerGas: payloadBaseFeePerGas, + BlockHash: payloadBlockHash, + TransactionsRoot: payloadTxsRoot, + WithdrawalsRoot: payloadWithdrawalsRoot, + BlobGasUsed: payloadBlobGasUsed, + ExcessBlobGas: payloadExcessBlobGas, }, - BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges), + BlsToExecutionChanges: blsChanges, BlobKzgCommitments: blobKzgCommitments, + ExecutionRequests: &enginev1.ExecutionRequests{ + Deposits: depositRequests, + Withdrawals: withdrawalRequests, + Consolidations: consolidationRequests, + }, }, }, nil } -func SignedBeaconBlockDenebFromConsensus(b *eth.SignedBeaconBlockDeneb) (*SignedBeaconBlockDeneb, error) { - block, err := BeaconBlockDenebFromConsensus(b.Block) +func (b *BlindedBeaconBlockFulu) ToGeneric() (*eth.GenericBeaconBlock, error) { + if b == nil { + return nil, errNilValue + } + + blindedBlock, err := b.ToConsensus() if err != nil { return nil, err } - return &SignedBeaconBlockDeneb{ - Message: block, - Signature: hexutil.Encode(b.Signature), - }, nil + return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedFulu{BlindedFulu: blindedBlock}, IsBlinded: true}, nil } -func BeaconBlockContentsElectraFromConsensus(b *eth.BeaconBlockContentsElectra) (*BeaconBlockContentsElectra, error) { - block, err := BeaconBlockElectraFromConsensus(b.Block) +func BeaconBlockContentsFuluFromConsensus(b *eth.BeaconBlockContentsFulu) (*BeaconBlockContentsFulu, error) { + block, err := BeaconBlockFuluFromConsensus(b.Block) if err != nil { return nil, err } @@ -2932,15 +3948,15 @@ func BeaconBlockContentsElectraFromConsensus(b *eth.BeaconBlockContentsElectra) for i, blob := range b.Blobs { blbs[i] = hexutil.Encode(blob) } - return &BeaconBlockContentsElectra{ + return &BeaconBlockContentsFulu{ Block: block, KzgProofs: proofs, Blobs: blbs, }, nil } -func SignedBeaconBlockContentsElectraFromConsensus(b *eth.SignedBeaconBlockContentsElectra) (*SignedBeaconBlockContentsElectra, error) { - block, err := SignedBeaconBlockElectraFromConsensus(b.Block) +func SignedBeaconBlockContentsFuluFromConsensus(b *eth.SignedBeaconBlockContentsFulu) (*SignedBeaconBlockContentsFulu, error) { + block, err := SignedBeaconBlockFuluFromConsensus(b.Block) if err != nil { return nil, err } @@ -2955,29 +3971,29 @@ func SignedBeaconBlockContentsElectraFromConsensus(b *eth.SignedBeaconBlockConte blbs[i] = hexutil.Encode(blob) } - return &SignedBeaconBlockContentsElectra{ + return &SignedBeaconBlockContentsFulu{ SignedBlock: block, KzgProofs: proofs, Blobs: blbs, }, nil } -func BlindedBeaconBlockElectraFromConsensus(b *eth.BlindedBeaconBlockElectra) (*BlindedBeaconBlockElectra, error) { +func BlindedBeaconBlockFuluFromConsensus(b *eth.BlindedBeaconBlockFulu) (*BlindedBeaconBlockFulu, error) { blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments)) for i := range b.Body.BlobKzgCommitments { blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i]) } - payload, err := ExecutionPayloadHeaderElectraFromConsensus(b.Body.ExecutionPayloadHeader) + payload, err := ExecutionPayloadHeaderFuluFromConsensus(b.Body.ExecutionPayloadHeader) if err != nil { return nil, err } - return &BlindedBeaconBlockElectra{ + return &BlindedBeaconBlockFulu{ Slot: fmt.Sprintf("%d", b.Slot), ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), ParentRoot: hexutil.Encode(b.ParentRoot), StateRoot: hexutil.Encode(b.StateRoot), - Body: &BlindedBeaconBlockBodyElectra{ + Body: &BlindedBeaconBlockBodyFulu{ RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), Graffiti: hexutil.Encode(b.Body.Graffiti), @@ -2998,27 +4014,19 @@ func BlindedBeaconBlockElectraFromConsensus(b *eth.BlindedBeaconBlockElectra) (* }, nil } -func ExecutionRequestsFromConsensus(er *enginev1.ExecutionRequests) *ExecutionRequests { - return &ExecutionRequests{ - Deposits: DepositRequestsFromConsensus(er.Deposits), - Withdrawals: WithdrawalRequestsFromConsensus(er.Withdrawals), - Consolidations: ConsolidationRequestsFromConsensus(er.Consolidations), - } -} - -func SignedBlindedBeaconBlockElectraFromConsensus(b *eth.SignedBlindedBeaconBlockElectra) (*SignedBlindedBeaconBlockElectra, error) { - block, err := BlindedBeaconBlockElectraFromConsensus(b.Message) +func SignedBlindedBeaconBlockFuluFromConsensus(b *eth.SignedBlindedBeaconBlockFulu) (*SignedBlindedBeaconBlockFulu, error) { + block, err := BlindedBeaconBlockFuluFromConsensus(b.Message) if err != nil { return nil, err } - return &SignedBlindedBeaconBlockElectra{ + return &SignedBlindedBeaconBlockFulu{ Message: block, Signature: hexutil.Encode(b.Signature), }, nil } -func BeaconBlockElectraFromConsensus(b *eth.BeaconBlockElectra) (*BeaconBlockElectra, error) { - payload, err := ExecutionPayloadElectraFromConsensus(b.Body.ExecutionPayload) +func BeaconBlockFuluFromConsensus(b *eth.BeaconBlockFulu) (*BeaconBlockFulu, error) { + payload, err := ExecutionPayloadFuluFromConsensus(b.Body.ExecutionPayload) if err != nil { return nil, err } @@ -3027,12 +4035,12 @@ func BeaconBlockElectraFromConsensus(b *eth.BeaconBlockElectra) (*BeaconBlockEle blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i]) } - return &BeaconBlockElectra{ + return &BeaconBlockFulu{ Slot: fmt.Sprintf("%d", b.Slot), ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex), ParentRoot: hexutil.Encode(b.ParentRoot), StateRoot: hexutil.Encode(b.StateRoot), - Body: &BeaconBlockBodyElectra{ + Body: &BeaconBlockBodyFulu{ RandaoReveal: hexutil.Encode(b.Body.RandaoReveal), Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data), Graffiti: hexutil.Encode(b.Body.Graffiti), @@ -3053,181 +4061,18 @@ func BeaconBlockElectraFromConsensus(b *eth.BeaconBlockElectra) (*BeaconBlockEle }, nil } -func SignedBeaconBlockElectraFromConsensus(b *eth.SignedBeaconBlockElectra) (*SignedBeaconBlockElectra, error) { - block, err := BeaconBlockElectraFromConsensus(b.Block) +func SignedBeaconBlockFuluFromConsensus(b *eth.SignedBeaconBlockFulu) (*SignedBeaconBlockFulu, error) { + block, err := BeaconBlockFuluFromConsensus(b.Block) if err != nil { return nil, err } - return &SignedBeaconBlockElectra{ + return &SignedBeaconBlockFulu{ Message: block, Signature: hexutil.Encode(b.Signature), }, nil } -func ExecutionPayloadFromConsensus(payload *enginev1.ExecutionPayload) (*ExecutionPayload, error) { - baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) - if err != nil { - return nil, err - } - transactions := make([]string, len(payload.Transactions)) - for i, tx := range payload.Transactions { - transactions[i] = hexutil.Encode(tx) - } - - return &ExecutionPayload{ - ParentHash: hexutil.Encode(payload.ParentHash), - FeeRecipient: hexutil.Encode(payload.FeeRecipient), - StateRoot: hexutil.Encode(payload.StateRoot), - ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), - LogsBloom: hexutil.Encode(payload.LogsBloom), - PrevRandao: hexutil.Encode(payload.PrevRandao), - BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), - GasLimit: fmt.Sprintf("%d", payload.GasLimit), - GasUsed: fmt.Sprintf("%d", payload.GasUsed), - Timestamp: fmt.Sprintf("%d", payload.Timestamp), - ExtraData: hexutil.Encode(payload.ExtraData), - BaseFeePerGas: baseFeePerGas, - BlockHash: hexutil.Encode(payload.BlockHash), - Transactions: transactions, - }, nil -} - -func ExecutionPayloadCapellaFromConsensus(payload *enginev1.ExecutionPayloadCapella) (*ExecutionPayloadCapella, error) { - baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) - if err != nil { - return nil, err - } - transactions := make([]string, len(payload.Transactions)) - for i, tx := range payload.Transactions { - transactions[i] = hexutil.Encode(tx) - } - - return &ExecutionPayloadCapella{ - ParentHash: hexutil.Encode(payload.ParentHash), - FeeRecipient: hexutil.Encode(payload.FeeRecipient), - StateRoot: hexutil.Encode(payload.StateRoot), - ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), - LogsBloom: hexutil.Encode(payload.LogsBloom), - PrevRandao: hexutil.Encode(payload.PrevRandao), - BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), - GasLimit: fmt.Sprintf("%d", payload.GasLimit), - GasUsed: fmt.Sprintf("%d", payload.GasUsed), - Timestamp: fmt.Sprintf("%d", payload.Timestamp), - ExtraData: hexutil.Encode(payload.ExtraData), - BaseFeePerGas: baseFeePerGas, - BlockHash: hexutil.Encode(payload.BlockHash), - Transactions: transactions, - Withdrawals: WithdrawalsFromConsensus(payload.Withdrawals), - }, nil -} - -func ExecutionPayloadDenebFromConsensus(payload *enginev1.ExecutionPayloadDeneb) (*ExecutionPayloadDeneb, error) { - baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) - if err != nil { - return nil, err - } - transactions := make([]string, len(payload.Transactions)) - for i, tx := range payload.Transactions { - transactions[i] = hexutil.Encode(tx) - } - - return &ExecutionPayloadDeneb{ - ParentHash: hexutil.Encode(payload.ParentHash), - FeeRecipient: hexutil.Encode(payload.FeeRecipient), - StateRoot: hexutil.Encode(payload.StateRoot), - ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), - LogsBloom: hexutil.Encode(payload.LogsBloom), - PrevRandao: hexutil.Encode(payload.PrevRandao), - BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), - GasLimit: fmt.Sprintf("%d", payload.GasLimit), - GasUsed: fmt.Sprintf("%d", payload.GasUsed), - Timestamp: fmt.Sprintf("%d", payload.Timestamp), - ExtraData: hexutil.Encode(payload.ExtraData), - BaseFeePerGas: baseFeePerGas, - BlockHash: hexutil.Encode(payload.BlockHash), - Transactions: transactions, - Withdrawals: WithdrawalsFromConsensus(payload.Withdrawals), - BlobGasUsed: fmt.Sprintf("%d", payload.BlobGasUsed), - ExcessBlobGas: fmt.Sprintf("%d", payload.ExcessBlobGas), - }, nil -} - -var ExecutionPayloadElectraFromConsensus = ExecutionPayloadDenebFromConsensus - -func ExecutionPayloadHeaderFromConsensus(payload *enginev1.ExecutionPayloadHeader) (*ExecutionPayloadHeader, error) { - baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) - if err != nil { - return nil, err - } - - return &ExecutionPayloadHeader{ - ParentHash: hexutil.Encode(payload.ParentHash), - FeeRecipient: hexutil.Encode(payload.FeeRecipient), - StateRoot: hexutil.Encode(payload.StateRoot), - ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), - LogsBloom: hexutil.Encode(payload.LogsBloom), - PrevRandao: hexutil.Encode(payload.PrevRandao), - BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), - GasLimit: fmt.Sprintf("%d", payload.GasLimit), - GasUsed: fmt.Sprintf("%d", payload.GasUsed), - Timestamp: fmt.Sprintf("%d", payload.Timestamp), - ExtraData: hexutil.Encode(payload.ExtraData), - BaseFeePerGas: baseFeePerGas, - BlockHash: hexutil.Encode(payload.BlockHash), - TransactionsRoot: hexutil.Encode(payload.TransactionsRoot), - }, nil -} - -func ExecutionPayloadHeaderCapellaFromConsensus(payload *enginev1.ExecutionPayloadHeaderCapella) (*ExecutionPayloadHeaderCapella, error) { - baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) - if err != nil { - return nil, err - } - - return &ExecutionPayloadHeaderCapella{ - ParentHash: hexutil.Encode(payload.ParentHash), - FeeRecipient: hexutil.Encode(payload.FeeRecipient), - StateRoot: hexutil.Encode(payload.StateRoot), - ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), - LogsBloom: hexutil.Encode(payload.LogsBloom), - PrevRandao: hexutil.Encode(payload.PrevRandao), - BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), - GasLimit: fmt.Sprintf("%d", payload.GasLimit), - GasUsed: fmt.Sprintf("%d", payload.GasUsed), - Timestamp: fmt.Sprintf("%d", payload.Timestamp), - ExtraData: hexutil.Encode(payload.ExtraData), - BaseFeePerGas: baseFeePerGas, - BlockHash: hexutil.Encode(payload.BlockHash), - TransactionsRoot: hexutil.Encode(payload.TransactionsRoot), - WithdrawalsRoot: hexutil.Encode(payload.WithdrawalsRoot), - }, nil -} - -func ExecutionPayloadHeaderDenebFromConsensus(payload *enginev1.ExecutionPayloadHeaderDeneb) (*ExecutionPayloadHeaderDeneb, error) { - baseFeePerGas, err := sszBytesToUint256String(payload.BaseFeePerGas) - if err != nil { - return nil, err - } - - return &ExecutionPayloadHeaderDeneb{ - ParentHash: hexutil.Encode(payload.ParentHash), - FeeRecipient: hexutil.Encode(payload.FeeRecipient), - StateRoot: hexutil.Encode(payload.StateRoot), - ReceiptsRoot: hexutil.Encode(payload.ReceiptsRoot), - LogsBloom: hexutil.Encode(payload.LogsBloom), - PrevRandao: hexutil.Encode(payload.PrevRandao), - BlockNumber: fmt.Sprintf("%d", payload.BlockNumber), - GasLimit: fmt.Sprintf("%d", payload.GasLimit), - GasUsed: fmt.Sprintf("%d", payload.GasUsed), - Timestamp: fmt.Sprintf("%d", payload.Timestamp), - ExtraData: hexutil.Encode(payload.ExtraData), - BaseFeePerGas: baseFeePerGas, - BlockHash: hexutil.Encode(payload.BlockHash), - TransactionsRoot: hexutil.Encode(payload.TransactionsRoot), - WithdrawalsRoot: hexutil.Encode(payload.WithdrawalsRoot), - BlobGasUsed: fmt.Sprintf("%d", payload.BlobGasUsed), - ExcessBlobGas: fmt.Sprintf("%d", payload.ExcessBlobGas), - }, nil -} - -var ExecutionPayloadHeaderElectraFromConsensus = ExecutionPayloadHeaderDenebFromConsensus +var ( + ExecutionPayloadFuluFromConsensus = ExecutionPayloadDenebFromConsensus + ExecutionPayloadHeaderFuluFromConsensus = ExecutionPayloadHeaderDenebFromConsensus +) diff --git a/api/server/structs/conversions_lightclient.go b/api/server/structs/conversions_lightclient.go index a0479f6e39f9..f533a77f2882 100644 --- a/api/server/structs/conversions_lightclient.go +++ b/api/server/structs/conversions_lightclient.go @@ -176,9 +176,9 @@ func lightClientHeaderToJSON(header interfaces.LightClientHeader) (json.RawMessa if err != nil { return nil, err } - ex, ok := exInterface.Proto().(*enginev1.ExecutionPayloadHeaderElectra) + ex, ok := exInterface.Proto().(*enginev1.ExecutionPayloadHeaderDeneb) if !ok { - return nil, fmt.Errorf("execution data is not %T", &enginev1.ExecutionPayloadHeaderElectra{}) + return nil, fmt.Errorf("execution data is not %T", &enginev1.ExecutionPayloadHeaderDeneb{}) } execution, err := ExecutionPayloadHeaderElectraFromConsensus(ex) if err != nil { diff --git a/api/server/structs/conversions_state.go b/api/server/structs/conversions_state.go index 043b8e5a6517..f7fec1e1a484 100644 --- a/api/server/structs/conversions_state.go +++ b/api/server/structs/conversions_state.go @@ -11,6 +11,10 @@ import ( var errPayloadHeaderNotFound = errors.New("expected payload header not found") +// ---------------------------------------------------------------------------- +// Phase 0 +// ---------------------------------------------------------------------------- + func BeaconStateFromConsensus(st beaconState.BeaconState) (*BeaconState, error) { srcBr := st.BlockRoots() br := make([]string, len(srcBr)) @@ -97,6 +101,10 @@ func BeaconStateFromConsensus(st beaconState.BeaconState) (*BeaconState, error) }, nil } +// ---------------------------------------------------------------------------- +// Altair +// ---------------------------------------------------------------------------- + func BeaconStateAltairFromConsensus(st beaconState.BeaconState) (*BeaconStateAltair, error) { srcBr := st.BlockRoots() br := make([]string, len(srcBr)) @@ -202,6 +210,10 @@ func BeaconStateAltairFromConsensus(st beaconState.BeaconState) (*BeaconStateAlt }, nil } +// ---------------------------------------------------------------------------- +// Bellatrix +// ---------------------------------------------------------------------------- + func BeaconStateBellatrixFromConsensus(st beaconState.BeaconState) (*BeaconStateBellatrix, error) { srcBr := st.BlockRoots() br := make([]string, len(srcBr)) @@ -320,6 +332,10 @@ func BeaconStateBellatrixFromConsensus(st beaconState.BeaconState) (*BeaconState }, nil } +// ---------------------------------------------------------------------------- +// Capella +// ---------------------------------------------------------------------------- + func BeaconStateCapellaFromConsensus(st beaconState.BeaconState) (*BeaconStateCapella, error) { srcBr := st.BlockRoots() br := make([]string, len(srcBr)) @@ -457,6 +473,10 @@ func BeaconStateCapellaFromConsensus(st beaconState.BeaconState) (*BeaconStateCa }, nil } +// ---------------------------------------------------------------------------- +// Deneb +// ---------------------------------------------------------------------------- + func BeaconStateDenebFromConsensus(st beaconState.BeaconState) (*BeaconStateDeneb, error) { srcBr := st.BlockRoots() br := make([]string, len(srcBr)) @@ -594,6 +614,10 @@ func BeaconStateDenebFromConsensus(st beaconState.BeaconState) (*BeaconStateDene }, nil } +// ---------------------------------------------------------------------------- +// Electra +// ---------------------------------------------------------------------------- + func BeaconStateElectraFromConsensus(st beaconState.BeaconState) (*BeaconStateElectra, error) { srcBr := st.BlockRoots() br := make([]string, len(srcBr)) @@ -775,3 +799,189 @@ func BeaconStateElectraFromConsensus(st beaconState.BeaconState) (*BeaconStateEl PendingConsolidations: PendingConsolidationsFromConsensus(pc), }, nil } + +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- + +func BeaconStateFuluFromConsensus(st beaconState.BeaconState) (*BeaconStateFulu, error) { + srcBr := st.BlockRoots() + br := make([]string, len(srcBr)) + for i, r := range srcBr { + br[i] = hexutil.Encode(r) + } + srcSr := st.StateRoots() + sr := make([]string, len(srcSr)) + for i, r := range srcSr { + sr[i] = hexutil.Encode(r) + } + srcHr, err := st.HistoricalRoots() + if err != nil { + return nil, err + } + hr := make([]string, len(srcHr)) + for i, r := range srcHr { + hr[i] = hexutil.Encode(r) + } + srcVotes := st.Eth1DataVotes() + votes := make([]*Eth1Data, len(srcVotes)) + for i, e := range srcVotes { + votes[i] = Eth1DataFromConsensus(e) + } + srcVals := st.Validators() + vals := make([]*Validator, len(srcVals)) + for i, v := range srcVals { + vals[i] = ValidatorFromConsensus(v) + } + srcBals := st.Balances() + bals := make([]string, len(srcBals)) + for i, b := range srcBals { + bals[i] = fmt.Sprintf("%d", b) + } + srcRm := st.RandaoMixes() + rm := make([]string, len(srcRm)) + for i, m := range srcRm { + rm[i] = hexutil.Encode(m) + } + srcSlashings := st.Slashings() + slashings := make([]string, len(srcSlashings)) + for i, s := range srcSlashings { + slashings[i] = fmt.Sprintf("%d", s) + } + srcPrevPart, err := st.PreviousEpochParticipation() + if err != nil { + return nil, err + } + prevPart := make([]string, len(srcPrevPart)) + for i, p := range srcPrevPart { + prevPart[i] = fmt.Sprintf("%d", p) + } + srcCurrPart, err := st.CurrentEpochParticipation() + if err != nil { + return nil, err + } + currPart := make([]string, len(srcCurrPart)) + for i, p := range srcCurrPart { + currPart[i] = fmt.Sprintf("%d", p) + } + srcIs, err := st.InactivityScores() + if err != nil { + return nil, err + } + is := make([]string, len(srcIs)) + for i, s := range srcIs { + is[i] = fmt.Sprintf("%d", s) + } + currSc, err := st.CurrentSyncCommittee() + if err != nil { + return nil, err + } + nextSc, err := st.NextSyncCommittee() + if err != nil { + return nil, err + } + execData, err := st.LatestExecutionPayloadHeader() + if err != nil { + return nil, err + } + srcPayload, ok := execData.Proto().(*enginev1.ExecutionPayloadHeaderDeneb) + if !ok { + return nil, errPayloadHeaderNotFound + } + payload, err := ExecutionPayloadHeaderElectraFromConsensus(srcPayload) + if err != nil { + return nil, err + } + srcHs, err := st.HistoricalSummaries() + if err != nil { + return nil, err + } + hs := make([]*HistoricalSummary, len(srcHs)) + for i, s := range srcHs { + hs[i] = HistoricalSummaryFromConsensus(s) + } + nwi, err := st.NextWithdrawalIndex() + if err != nil { + return nil, err + } + nwvi, err := st.NextWithdrawalValidatorIndex() + if err != nil { + return nil, err + } + drsi, err := st.DepositRequestsStartIndex() + if err != nil { + return nil, err + } + dbtc, err := st.DepositBalanceToConsume() + if err != nil { + return nil, err + } + ebtc, err := st.ExitBalanceToConsume() + if err != nil { + return nil, err + } + eee, err := st.EarliestExitEpoch() + if err != nil { + return nil, err + } + cbtc, err := st.ConsolidationBalanceToConsume() + if err != nil { + return nil, err + } + ece, err := st.EarliestConsolidationEpoch() + if err != nil { + return nil, err + } + pbd, err := st.PendingDeposits() + if err != nil { + return nil, err + } + ppw, err := st.PendingPartialWithdrawals() + if err != nil { + return nil, err + } + pc, err := st.PendingConsolidations() + if err != nil { + return nil, err + } + + return &BeaconStateFulu{ + GenesisTime: fmt.Sprintf("%d", st.GenesisTime()), + GenesisValidatorsRoot: hexutil.Encode(st.GenesisValidatorsRoot()), + Slot: fmt.Sprintf("%d", st.Slot()), + Fork: ForkFromConsensus(st.Fork()), + LatestBlockHeader: BeaconBlockHeaderFromConsensus(st.LatestBlockHeader()), + BlockRoots: br, + StateRoots: sr, + HistoricalRoots: hr, + Eth1Data: Eth1DataFromConsensus(st.Eth1Data()), + Eth1DataVotes: votes, + Eth1DepositIndex: fmt.Sprintf("%d", st.Eth1DepositIndex()), + Validators: vals, + Balances: bals, + RandaoMixes: rm, + Slashings: slashings, + PreviousEpochParticipation: prevPart, + CurrentEpochParticipation: currPart, + JustificationBits: hexutil.Encode(st.JustificationBits()), + PreviousJustifiedCheckpoint: CheckpointFromConsensus(st.PreviousJustifiedCheckpoint()), + CurrentJustifiedCheckpoint: CheckpointFromConsensus(st.CurrentJustifiedCheckpoint()), + FinalizedCheckpoint: CheckpointFromConsensus(st.FinalizedCheckpoint()), + InactivityScores: is, + CurrentSyncCommittee: SyncCommitteeFromConsensus(currSc), + NextSyncCommittee: SyncCommitteeFromConsensus(nextSc), + LatestExecutionPayloadHeader: payload, + NextWithdrawalIndex: fmt.Sprintf("%d", nwi), + NextWithdrawalValidatorIndex: fmt.Sprintf("%d", nwvi), + HistoricalSummaries: hs, + DepositRequestsStartIndex: fmt.Sprintf("%d", drsi), + DepositBalanceToConsume: fmt.Sprintf("%d", dbtc), + ExitBalanceToConsume: fmt.Sprintf("%d", ebtc), + EarliestExitEpoch: fmt.Sprintf("%d", eee), + ConsolidationBalanceToConsume: fmt.Sprintf("%d", cbtc), + EarliestConsolidationEpoch: fmt.Sprintf("%d", ece), + PendingDeposits: PendingDepositsFromConsensus(pbd), + PendingPartialWithdrawals: PendingPartialWithdrawalsFromConsensus(ppw), + PendingConsolidations: PendingConsolidationsFromConsensus(pc), + }, nil +} diff --git a/api/server/structs/state.go b/api/server/structs/state.go index 9704a75d4013..d34529a3335f 100644 --- a/api/server/structs/state.go +++ b/api/server/structs/state.go @@ -180,3 +180,43 @@ type BeaconStateElectra struct { PendingPartialWithdrawals []*PendingPartialWithdrawal `json:"pending_partial_withdrawals"` PendingConsolidations []*PendingConsolidation `json:"pending_consolidations"` } + +type BeaconStateFulu struct { + GenesisTime string `json:"genesis_time"` + GenesisValidatorsRoot string `json:"genesis_validators_root"` + Slot string `json:"slot"` + Fork *Fork `json:"fork"` + LatestBlockHeader *BeaconBlockHeader `json:"latest_block_header"` + BlockRoots []string `json:"block_roots"` + StateRoots []string `json:"state_roots"` + HistoricalRoots []string `json:"historical_roots"` + Eth1Data *Eth1Data `json:"eth1_data"` + Eth1DataVotes []*Eth1Data `json:"eth1_data_votes"` + Eth1DepositIndex string `json:"eth1_deposit_index"` + Validators []*Validator `json:"validators"` + Balances []string `json:"balances"` + RandaoMixes []string `json:"randao_mixes"` + Slashings []string `json:"slashings"` + PreviousEpochParticipation []string `json:"previous_epoch_participation"` + CurrentEpochParticipation []string `json:"current_epoch_participation"` + JustificationBits string `json:"justification_bits"` + PreviousJustifiedCheckpoint *Checkpoint `json:"previous_justified_checkpoint"` + CurrentJustifiedCheckpoint *Checkpoint `json:"current_justified_checkpoint"` + FinalizedCheckpoint *Checkpoint `json:"finalized_checkpoint"` + InactivityScores []string `json:"inactivity_scores"` + CurrentSyncCommittee *SyncCommittee `json:"current_sync_committee"` + NextSyncCommittee *SyncCommittee `json:"next_sync_committee"` + LatestExecutionPayloadHeader *ExecutionPayloadHeaderElectra `json:"latest_execution_payload_header"` + NextWithdrawalIndex string `json:"next_withdrawal_index"` + NextWithdrawalValidatorIndex string `json:"next_withdrawal_validator_index"` + HistoricalSummaries []*HistoricalSummary `json:"historical_summaries"` + DepositRequestsStartIndex string `json:"deposit_requests_start_index"` + DepositBalanceToConsume string `json:"deposit_balance_to_consume"` + ExitBalanceToConsume string `json:"exit_balance_to_consume"` + EarliestExitEpoch string `json:"earliest_exit_epoch"` + ConsolidationBalanceToConsume string `json:"consolidation_balance_to_consume"` + EarliestConsolidationEpoch string `json:"earliest_consolidation_epoch"` + PendingDeposits []*PendingDeposit `json:"pending_deposits"` + PendingPartialWithdrawals []*PendingPartialWithdrawal `json:"pending_partial_withdrawals"` + PendingConsolidations []*PendingConsolidation `json:"pending_consolidations"` +} diff --git a/beacon-chain/blockchain/execution_engine.go b/beacon-chain/blockchain/execution_engine.go index c95a928b2830..d15c698864db 100644 --- a/beacon-chain/blockchain/execution_engine.go +++ b/beacon-chain/blockchain/execution_engine.go @@ -362,15 +362,16 @@ func (s *Service) getPayloadAttribute(ctx context.Context, st state.BeaconState, return emptyAttri } - var attr payloadattribute.Attributer - switch st.Version() { - case version.Deneb, version.Electra: + v := st.Version() + + if v >= version.Deneb { withdrawals, _, err := st.ExpectedWithdrawals() if err != nil { log.WithError(err).Error("Could not get expected withdrawals to get payload attribute") return emptyAttri } - attr, err = payloadattribute.New(&enginev1.PayloadAttributesV3{ + + attr, err := payloadattribute.New(&enginev1.PayloadAttributesV3{ Timestamp: uint64(t.Unix()), PrevRandao: prevRando, SuggestedFeeRecipient: val.FeeRecipient[:], @@ -381,13 +382,18 @@ func (s *Service) getPayloadAttribute(ctx context.Context, st state.BeaconState, log.WithError(err).Error("Could not get payload attribute") return emptyAttri } - case version.Capella: + + return attr + } + + if v >= version.Capella { withdrawals, _, err := st.ExpectedWithdrawals() if err != nil { log.WithError(err).Error("Could not get expected withdrawals to get payload attribute") return emptyAttri } - attr, err = payloadattribute.New(&enginev1.PayloadAttributesV2{ + + attr, err := payloadattribute.New(&enginev1.PayloadAttributesV2{ Timestamp: uint64(t.Unix()), PrevRandao: prevRando, SuggestedFeeRecipient: val.FeeRecipient[:], @@ -397,8 +403,12 @@ func (s *Service) getPayloadAttribute(ctx context.Context, st state.BeaconState, log.WithError(err).Error("Could not get payload attribute") return emptyAttri } - case version.Bellatrix: - attr, err = payloadattribute.New(&enginev1.PayloadAttributes{ + + return attr + } + + if v >= version.Bellatrix { + attr, err := payloadattribute.New(&enginev1.PayloadAttributes{ Timestamp: uint64(t.Unix()), PrevRandao: prevRando, SuggestedFeeRecipient: val.FeeRecipient[:], @@ -407,12 +417,12 @@ func (s *Service) getPayloadAttribute(ctx context.Context, st state.BeaconState, log.WithError(err).Error("Could not get payload attribute") return emptyAttri } - default: - log.WithField("version", st.Version()).Error("Could not get payload attribute due to unknown state version") - return emptyAttri + + return attr } - return attr + log.WithField("version", version.String(st.Version())).Error("Could not get payload attribute due to unknown state version") + return emptyAttri } // removeInvalidBlockAndState removes the invalid block, blob and its corresponding state from the cache and DB. diff --git a/beacon-chain/cache/attestation.go b/beacon-chain/cache/attestation.go index 2108ac9d84cd..817ddef5680f 100644 --- a/beacon-chain/cache/attestation.go +++ b/beacon-chain/cache/attestation.go @@ -53,7 +53,7 @@ func NewAttestationCache() *AttestationCache { // // - For unaggregated attestations, it adds the attestation bit to attestation bits of the running aggregate, // which is the first aggregate for the slot. -// - For aggregated attestations, it appends the attestation to the existng list of attestations for the slot. +// - For aggregated attestations, it appends the attestation to the existing list of attestations for the slot. func (c *AttestationCache) Add(att ethpb.Att) error { if att.IsNil() { log.Debug("Attempted to add a nil attestation to the attestation cache") diff --git a/beacon-chain/core/altair/epoch_spec_test.go b/beacon-chain/core/altair/epoch_spec_test.go index 4b2a4c427898..2f7051d69d34 100644 --- a/beacon-chain/core/altair/epoch_spec_test.go +++ b/beacon-chain/core/altair/epoch_spec_test.go @@ -105,7 +105,7 @@ func TestProcessSlashings_NotSlashed(t *testing.T) { } s, err := state_native.InitializeFromProtoAltair(base) require.NoError(t, err) - newState, err := epoch.ProcessSlashings(s, params.BeaconConfig().ProportionalSlashingMultiplierAltair) + newState, err := epoch.ProcessSlashings(s) require.NoError(t, err) wanted := params.BeaconConfig().MaxEffectiveBalance assert.Equal(t, wanted, newState.Balances()[0], "Unexpected slashed balance") @@ -176,7 +176,7 @@ func TestProcessSlashings_SlashedLess(t *testing.T) { original := proto.Clone(tt.state) s, err := state_native.InitializeFromProtoAltair(tt.state) require.NoError(t, err) - newState, err := epoch.ProcessSlashings(s, params.BeaconConfig().ProportionalSlashingMultiplierAltair) + newState, err := epoch.ProcessSlashings(s) require.NoError(t, err) assert.Equal(t, tt.want, newState.Balances()[0], "ProcessSlashings({%v}) = newState; newState.Balances[0] = %d", original, newState.Balances()[0]) }) @@ -192,6 +192,6 @@ func TestProcessSlashings_BadValue(t *testing.T) { } s, err := state_native.InitializeFromProtoAltair(base) require.NoError(t, err) - _, err = epoch.ProcessSlashings(s, params.BeaconConfig().ProportionalSlashingMultiplierAltair) + _, err = epoch.ProcessSlashings(s) require.ErrorContains(t, "addition overflows", err) } diff --git a/beacon-chain/core/altair/transition.go b/beacon-chain/core/altair/transition.go index a7526e346b8c..67d1661a02bf 100644 --- a/beacon-chain/core/altair/transition.go +++ b/beacon-chain/core/altair/transition.go @@ -69,11 +69,7 @@ func ProcessEpoch(ctx context.Context, state state.BeaconState) error { } // Modified in Altair and Bellatrix. - proportionalSlashingMultiplier, err := state.ProportionalSlashingMultiplier() - if err != nil { - return err - } - state, err = e.ProcessSlashings(state, proportionalSlashingMultiplier) + state, err = e.ProcessSlashings(state) if err != nil { return err } diff --git a/beacon-chain/core/blocks/genesis.go b/beacon-chain/core/blocks/genesis.go index d3d687faa534..2b140909c1d7 100644 --- a/beacon-chain/core/blocks/genesis.go +++ b/beacon-chain/core/blocks/genesis.go @@ -198,7 +198,7 @@ func NewGenesisBlockForState(ctx context.Context, st state.BeaconState) (interfa SyncCommitteeBits: make([]byte, fieldparams.SyncCommitteeLength/8), SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), }, - ExecutionPayload: &enginev1.ExecutionPayloadElectra{ + ExecutionPayload: &enginev1.ExecutionPayloadDeneb{ ParentHash: make([]byte, 32), FeeRecipient: make([]byte, 20), StateRoot: make([]byte, 32), diff --git a/beacon-chain/core/blocks/withdrawals_test.go b/beacon-chain/core/blocks/withdrawals_test.go index 72e4bf7659a2..9a6f290d7556 100644 --- a/beacon-chain/core/blocks/withdrawals_test.go +++ b/beacon-chain/core/blocks/withdrawals_test.go @@ -1152,7 +1152,7 @@ func TestProcessWithdrawals(t *testing.T) { } st, err = state_native.InitializeFromProtoUnsafeElectra(spb) require.NoError(t, err) - p, err = consensusblocks.WrappedExecutionPayloadElectra(&enginev1.ExecutionPayloadElectra{Withdrawals: test.Args.Withdrawals}) + p, err = consensusblocks.WrappedExecutionPayloadDeneb(&enginev1.ExecutionPayloadDeneb{Withdrawals: test.Args.Withdrawals}) require.NoError(t, err) default: t.Fatalf("Add a beacon state setup for version %s", version.String(fork)) diff --git a/beacon-chain/core/electra/deposits.go b/beacon-chain/core/electra/deposits.go index c77adb6040ef..11c4363d6eaa 100644 --- a/beacon-chain/core/electra/deposits.go +++ b/beacon-chain/core/electra/deposits.go @@ -15,7 +15,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" "github.com/prysmaticlabs/prysm/v5/monitoring/tracing/trace" enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" - eth "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/runtime/version" "github.com/prysmaticlabs/prysm/v5/time/slots" @@ -273,7 +272,7 @@ func ProcessPendingDeposits(ctx context.Context, st state.BeaconState, activeBal isChurnLimitReached := false var pendingDepositsToBatchVerify []*ethpb.PendingDeposit - var pendingDepositsToPostpone []*eth.PendingDeposit + var pendingDepositsToPostpone []*ethpb.PendingDeposit depBalToConsume, err := st.DepositBalanceToConsume() if err != nil { diff --git a/beacon-chain/core/electra/registry_updates.go b/beacon-chain/core/electra/registry_updates.go index 5a85f41cb1be..07424568e1af 100644 --- a/beacon-chain/core/electra/registry_updates.go +++ b/beacon-chain/core/electra/registry_updates.go @@ -18,23 +18,24 @@ import ( // // Spec pseudocode definition: // -// def process_registry_updates(state: BeaconState) -> None: -// # Process activation eligibility and ejections -// for index, validator in enumerate(state.validators): -// if is_eligible_for_activation_queue(validator): -// validator.activation_eligibility_epoch = get_current_epoch(state) + 1 +// def process_registry_updates(state: BeaconState) -> None: +// # Process activation eligibility and ejections +// for index, validator in enumerate(state.validators): +// if is_eligible_for_activation_queue(validator): # [Modified in Electra:EIP7251] +// validator.activation_eligibility_epoch = get_current_epoch(state) + 1 // -// if ( -// is_active_validator(validator, get_current_epoch(state)) -// and validator.effective_balance <= EJECTION_BALANCE -// ): -// initiate_validator_exit(state, ValidatorIndex(index)) +// if ( +// is_active_validator(validator, get_current_epoch(state)) +// and validator.effective_balance <= EJECTION_BALANCE +// ): +// initiate_validator_exit(state, ValidatorIndex(index)) # [Modified in Electra:EIP7251] // -// # Activate all eligible validators -// activation_epoch = compute_activation_exit_epoch(get_current_epoch(state)) -// for validator in state.validators: -// if is_eligible_for_activation(state, validator): -// validator.activation_epoch = activation_epoch +// # Activate all eligible validators +// # [Modified in Electra:EIP7251] +// activation_epoch = compute_activation_exit_epoch(get_current_epoch(state)) +// for validator in state.validators: +// if is_eligible_for_activation(state, validator): +// validator.activation_epoch = activation_epoch func ProcessRegistryUpdates(ctx context.Context, st state.BeaconState) error { currentEpoch := time.CurrentEpoch(st) ejectionBal := params.BeaconConfig().EjectionBalance @@ -90,8 +91,8 @@ func ProcessRegistryUpdates(ctx context.Context, st state.BeaconState) error { } } + // Activate all eligible validators. for _, idx := range eligibleForActivation { - // Activate all eligible validators. v, err := st.ValidatorAtIndex(idx) if err != nil { return err diff --git a/beacon-chain/core/electra/transition.go b/beacon-chain/core/electra/transition.go index 886de1fde0e2..2a9f8a358096 100644 --- a/beacon-chain/core/electra/transition.go +++ b/beacon-chain/core/electra/transition.go @@ -40,14 +40,17 @@ var ( // process_justification_and_finalization(state) // process_inactivity_updates(state) // process_rewards_and_penalties(state) -// process_registry_updates(state) -// process_slashings(state) +// process_registry_updates(state) # [Modified in Electra:EIP7251] +// process_slashings(state) # [Modified in Electra:EIP7251] // process_eth1_data_reset(state) -// process_pending_deposits(state) # New in EIP7251 -// process_pending_consolidations(state) # New in EIP7251 -// process_effective_balance_updates(state) +// process_pending_deposits(state) # [New in Electra:EIP7251] +// process_pending_consolidations(state) # [New in Electra:EIP7251] +// process_effective_balance_updates(state) # [Modified in Electra:EIP7251] // process_slashings_reset(state) // process_randao_mixes_reset(state) +// process_historical_summaries_update(state) +// process_participation_flag_updates(state) +// process_sync_committee_updates(state) func ProcessEpoch(ctx context.Context, state state.BeaconState) error { _, span := trace.StartSpan(ctx, "electra.ProcessEpoch") defer span.End() @@ -75,16 +78,10 @@ func ProcessEpoch(ctx context.Context, state state.BeaconState) error { if err != nil { return errors.Wrap(err, "could not process rewards and penalties") } - if err := ProcessRegistryUpdates(ctx, state); err != nil { return errors.Wrap(err, "could not process registry updates") } - - proportionalSlashingMultiplier, err := state.ProportionalSlashingMultiplier() - if err != nil { - return err - } - state, err = ProcessSlashings(state, proportionalSlashingMultiplier) + state, err = ProcessSlashings(state) if err != nil { return err } @@ -92,7 +89,6 @@ func ProcessEpoch(ctx context.Context, state state.BeaconState) error { if err != nil { return err } - if err = ProcessPendingDeposits(ctx, state, primitives.Gwei(bp.ActiveCurrentEpoch)); err != nil { return err } @@ -102,7 +98,6 @@ func ProcessEpoch(ctx context.Context, state state.BeaconState) error { if err = ProcessEffectiveBalanceUpdates(state); err != nil { return err } - state, err = ProcessSlashingsReset(state) if err != nil { return err @@ -115,17 +110,14 @@ func ProcessEpoch(ctx context.Context, state state.BeaconState) error { if err != nil { return err } - state, err = ProcessParticipationFlagUpdates(state) if err != nil { return err } - _, err = ProcessSyncCommitteeUpdates(ctx, state) if err != nil { return err } - return nil } diff --git a/beacon-chain/core/electra/upgrade.go b/beacon-chain/core/electra/upgrade.go index acf6c6261bbb..47c3bf500c0a 100644 --- a/beacon-chain/core/electra/upgrade.go +++ b/beacon-chain/core/electra/upgrade.go @@ -240,7 +240,7 @@ func UpgradeToElectra(beaconState state.BeaconState) (state.BeaconState, error) InactivityScores: inactivityScores, CurrentSyncCommittee: currentSyncCommittee, NextSyncCommittee: nextSyncCommittee, - LatestExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderElectra{ + LatestExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderDeneb{ ParentHash: payloadHeader.ParentHash(), FeeRecipient: payloadHeader.FeeRecipient(), StateRoot: payloadHeader.StateRoot(), diff --git a/beacon-chain/core/electra/upgrade_test.go b/beacon-chain/core/electra/upgrade_test.go index c80aef5f1854..4c6ab89ef838 100644 --- a/beacon-chain/core/electra/upgrade_test.go +++ b/beacon-chain/core/electra/upgrade_test.go @@ -102,7 +102,7 @@ func TestUpgradeToElectra(t *testing.T) { header, err := mSt.LatestExecutionPayloadHeader() require.NoError(t, err) - protoHeader, ok := header.Proto().(*enginev1.ExecutionPayloadHeaderElectra) + protoHeader, ok := header.Proto().(*enginev1.ExecutionPayloadHeaderDeneb) require.Equal(t, true, ok) prevHeader, err := preForkState.LatestExecutionPayloadHeader() require.NoError(t, err) @@ -111,7 +111,7 @@ func TestUpgradeToElectra(t *testing.T) { wdRoot, err := prevHeader.WithdrawalsRoot() require.NoError(t, err) - wanted := &enginev1.ExecutionPayloadHeaderElectra{ + wanted := &enginev1.ExecutionPayloadHeaderDeneb{ ParentHash: prevHeader.ParentHash(), FeeRecipient: prevHeader.FeeRecipient(), StateRoot: prevHeader.StateRoot(), diff --git a/beacon-chain/core/epoch/epoch_processing.go b/beacon-chain/core/epoch/epoch_processing.go index 19464abaa91d..67b7e3b53385 100644 --- a/beacon-chain/core/epoch/epoch_processing.go +++ b/beacon-chain/core/epoch/epoch_processing.go @@ -144,22 +144,13 @@ func ProcessRegistryUpdates(ctx context.Context, st state.BeaconState) (state.Be // ProcessSlashings processes the slashed validators during epoch processing, // // def process_slashings(state: BeaconState) -> None: -// epoch = get_current_epoch(state) -// total_balance = get_total_active_balance(state) -// adjusted_total_slashing_balance = min(sum(state.slashings) * PROPORTIONAL_SLASHING_MULTIPLIER, total_balance) -// if state.version == electra: -// increment = EFFECTIVE_BALANCE_INCREMENT # Factored out from total balance to avoid uint64 overflow -// penalty_per_effective_balance_increment = adjusted_total_slashing_balance // (total_balance // increment) -// for index, validator in enumerate(state.validators): -// if validator.slashed and epoch + EPOCHS_PER_SLASHINGS_VECTOR // 2 == validator.withdrawable_epoch: -// increment = EFFECTIVE_BALANCE_INCREMENT # Factored out from penalty numerator to avoid uint64 overflow -// penalty_numerator = validator.effective_balance // increment * adjusted_total_slashing_balance -// penalty = penalty_numerator // total_balance * increment -// if state.version == electra: // effective_balance_increments = validator.effective_balance // increment // penalty = penalty_per_effective_balance_increment * effective_balance_increments -// decrease_balance(state, ValidatorIndex(index), penalty) -func ProcessSlashings(st state.BeaconState, slashingMultiplier uint64) (state.BeaconState, error) { +func ProcessSlashings(st state.BeaconState) (state.BeaconState, error) { + slashingMultiplier, err := st.ProportionalSlashingMultiplier() + if err != nil { + return nil, errors.Wrap(err, "could not get proportional slashing multiplier") + } currentEpoch := time.CurrentEpoch(st) totalBalance, err := helpers.TotalActiveBalance(st) if err != nil { diff --git a/beacon-chain/core/epoch/epoch_processing_test.go b/beacon-chain/core/epoch/epoch_processing_test.go index f9bb3b594923..27394af1cc6b 100644 --- a/beacon-chain/core/epoch/epoch_processing_test.go +++ b/beacon-chain/core/epoch/epoch_processing_test.go @@ -32,7 +32,7 @@ func TestProcessSlashings_NotSlashed(t *testing.T) { } s, err := state_native.InitializeFromProtoPhase0(base) require.NoError(t, err) - newState, err := epoch.ProcessSlashings(s, params.BeaconConfig().ProportionalSlashingMultiplier) + newState, err := epoch.ProcessSlashings(s) require.NoError(t, err) wanted := params.BeaconConfig().MaxEffectiveBalance assert.Equal(t, wanted, newState.Balances()[0], "Unexpected slashed balance") @@ -111,7 +111,7 @@ func TestProcessSlashings_SlashedLess(t *testing.T) { s, err := state_native.InitializeFromProtoPhase0(tt.state) require.NoError(t, err) helpers.ClearCache() - newState, err := epoch.ProcessSlashings(s, params.BeaconConfig().ProportionalSlashingMultiplier) + newState, err := epoch.ProcessSlashings(s) require.NoError(t, err) assert.Equal(t, tt.want, newState.Balances()[0], "ProcessSlashings({%v}) = newState; newState.Balances[0] = %d", original, newState.Balances()[0]) }) @@ -365,7 +365,7 @@ func TestProcessSlashings_BadValue(t *testing.T) { } s, err := state_native.InitializeFromProtoPhase0(base) require.NoError(t, err) - _, err = epoch.ProcessSlashings(s, params.BeaconConfig().ProportionalSlashingMultiplier) + _, err = epoch.ProcessSlashings(s) require.ErrorContains(t, "addition overflows", err) } @@ -514,7 +514,7 @@ func TestProcessSlashings_SlashedElectra(t *testing.T) { s, err := state_native.InitializeFromProtoElectra(tt.state) require.NoError(t, err) helpers.ClearCache() - newState, err := epoch.ProcessSlashings(s, params.BeaconConfig().ProportionalSlashingMultiplierBellatrix) + newState, err := epoch.ProcessSlashings(s) require.NoError(t, err) assert.Equal(t, tt.want, newState.Balances()[0], "ProcessSlashings({%v}) = newState; newState.Balances[0] = %d", original, newState.Balances()[0]) }) diff --git a/beacon-chain/core/fulu/BUILD.bazel b/beacon-chain/core/fulu/BUILD.bazel new file mode 100644 index 000000000000..ce65b492a905 --- /dev/null +++ b/beacon-chain/core/fulu/BUILD.bazel @@ -0,0 +1,37 @@ +load("@prysm//tools/go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["upgrade.go"], + importpath = "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/fulu", + visibility = ["//visibility:public"], + deps = [ + "//beacon-chain/core/helpers:go_default_library", + "//beacon-chain/core/time:go_default_library", + "//beacon-chain/state:go_default_library", + "//beacon-chain/state/state-native:go_default_library", + "//config/params:go_default_library", + "//consensus-types/primitives:go_default_library", + "//proto/engine/v1:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//time/slots:go_default_library", + "@com_github_pkg_errors//:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = ["upgrade_test.go"], + deps = [ + ":go_default_library", + "//beacon-chain/core/helpers:go_default_library", + "//beacon-chain/core/time:go_default_library", + "//config/params:go_default_library", + "//consensus-types/primitives:go_default_library", + "//proto/engine/v1:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//testing/require:go_default_library", + "//testing/util:go_default_library", + "//time/slots:go_default_library", + ], +) diff --git a/beacon-chain/core/fulu/upgrade.go b/beacon-chain/core/fulu/upgrade.go new file mode 100644 index 000000000000..ff2961609074 --- /dev/null +++ b/beacon-chain/core/fulu/upgrade.go @@ -0,0 +1,184 @@ +package fulu + +import ( + "sort" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/time" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" + state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native" + "github.com/prysmaticlabs/prysm/v5/config/params" + "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" + enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" + ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/v5/time/slots" +) + +// UpgradeToFulu updates inputs a generic state to return the version Fulu state. +// https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/fork.md#upgrading-the-state +func UpgradeToFulu(beaconState state.BeaconState) (state.BeaconState, error) { + currentSyncCommittee, err := beaconState.CurrentSyncCommittee() + if err != nil { + return nil, err + } + nextSyncCommittee, err := beaconState.NextSyncCommittee() + if err != nil { + return nil, err + } + prevEpochParticipation, err := beaconState.PreviousEpochParticipation() + if err != nil { + return nil, err + } + currentEpochParticipation, err := beaconState.CurrentEpochParticipation() + if err != nil { + return nil, err + } + inactivityScores, err := beaconState.InactivityScores() + if err != nil { + return nil, err + } + payloadHeader, err := beaconState.LatestExecutionPayloadHeader() + if err != nil { + return nil, err + } + txRoot, err := payloadHeader.TransactionsRoot() + if err != nil { + return nil, err + } + wdRoot, err := payloadHeader.WithdrawalsRoot() + if err != nil { + return nil, err + } + wi, err := beaconState.NextWithdrawalIndex() + if err != nil { + return nil, err + } + vi, err := beaconState.NextWithdrawalValidatorIndex() + if err != nil { + return nil, err + } + summaries, err := beaconState.HistoricalSummaries() + if err != nil { + return nil, err + } + historicalRoots, err := beaconState.HistoricalRoots() + if err != nil { + return nil, err + } + excessBlobGas, err := payloadHeader.ExcessBlobGas() + if err != nil { + return nil, err + } + blobGasUsed, err := payloadHeader.BlobGasUsed() + if err != nil { + return nil, err + } + + earliestExitEpoch := helpers.ActivationExitEpoch(time.CurrentEpoch(beaconState)) + preActivationIndices := make([]primitives.ValidatorIndex, 0) + compoundWithdrawalIndices := make([]primitives.ValidatorIndex, 0) + if err = beaconState.ReadFromEveryValidator(func(index int, val state.ReadOnlyValidator) error { + if val.ExitEpoch() != params.BeaconConfig().FarFutureEpoch && val.ExitEpoch() > earliestExitEpoch { + earliestExitEpoch = val.ExitEpoch() + } + if val.ActivationEpoch() == params.BeaconConfig().FarFutureEpoch { + preActivationIndices = append(preActivationIndices, primitives.ValidatorIndex(index)) + } + if helpers.HasCompoundingWithdrawalCredential(val) { + compoundWithdrawalIndices = append(compoundWithdrawalIndices, primitives.ValidatorIndex(index)) + } + return nil + }); err != nil { + return nil, err + } + + earliestExitEpoch++ // Increment to find the earliest possible exit epoch + + // note: should be the same in prestate and post beaconState. + // we are deviating from the specs a bit as it calls for using the post beaconState + tab, err := helpers.TotalActiveBalance(beaconState) + if err != nil { + return nil, errors.Wrap(err, "failed to get total active balance") + } + + s := ðpb.BeaconStateFulu{ + GenesisTime: beaconState.GenesisTime(), + GenesisValidatorsRoot: beaconState.GenesisValidatorsRoot(), + Slot: beaconState.Slot(), + Fork: ðpb.Fork{ + PreviousVersion: beaconState.Fork().CurrentVersion, + CurrentVersion: params.BeaconConfig().FuluForkVersion, + Epoch: time.CurrentEpoch(beaconState), + }, + LatestBlockHeader: beaconState.LatestBlockHeader(), + BlockRoots: beaconState.BlockRoots(), + StateRoots: beaconState.StateRoots(), + HistoricalRoots: historicalRoots, + Eth1Data: beaconState.Eth1Data(), + Eth1DataVotes: beaconState.Eth1DataVotes(), + Eth1DepositIndex: beaconState.Eth1DepositIndex(), + Validators: beaconState.Validators(), + Balances: beaconState.Balances(), + RandaoMixes: beaconState.RandaoMixes(), + Slashings: beaconState.Slashings(), + PreviousEpochParticipation: prevEpochParticipation, + CurrentEpochParticipation: currentEpochParticipation, + JustificationBits: beaconState.JustificationBits(), + PreviousJustifiedCheckpoint: beaconState.PreviousJustifiedCheckpoint(), + CurrentJustifiedCheckpoint: beaconState.CurrentJustifiedCheckpoint(), + FinalizedCheckpoint: beaconState.FinalizedCheckpoint(), + InactivityScores: inactivityScores, + CurrentSyncCommittee: currentSyncCommittee, + NextSyncCommittee: nextSyncCommittee, + LatestExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderDeneb{ + ParentHash: payloadHeader.ParentHash(), + FeeRecipient: payloadHeader.FeeRecipient(), + StateRoot: payloadHeader.StateRoot(), + ReceiptsRoot: payloadHeader.ReceiptsRoot(), + LogsBloom: payloadHeader.LogsBloom(), + PrevRandao: payloadHeader.PrevRandao(), + BlockNumber: payloadHeader.BlockNumber(), + GasLimit: payloadHeader.GasLimit(), + GasUsed: payloadHeader.GasUsed(), + Timestamp: payloadHeader.Timestamp(), + ExtraData: payloadHeader.ExtraData(), + BaseFeePerGas: payloadHeader.BaseFeePerGas(), + BlockHash: payloadHeader.BlockHash(), + TransactionsRoot: txRoot, + WithdrawalsRoot: wdRoot, + ExcessBlobGas: excessBlobGas, + BlobGasUsed: blobGasUsed, + }, + NextWithdrawalIndex: wi, + NextWithdrawalValidatorIndex: vi, + HistoricalSummaries: summaries, + + DepositRequestsStartIndex: params.BeaconConfig().UnsetDepositRequestsStartIndex, + DepositBalanceToConsume: 0, + ExitBalanceToConsume: helpers.ActivationExitChurnLimit(primitives.Gwei(tab)), + EarliestExitEpoch: earliestExitEpoch, + ConsolidationBalanceToConsume: helpers.ConsolidationChurnLimit(primitives.Gwei(tab)), + EarliestConsolidationEpoch: helpers.ActivationExitEpoch(slots.ToEpoch(beaconState.Slot())), + PendingDeposits: make([]*ethpb.PendingDeposit, 0), + PendingPartialWithdrawals: make([]*ethpb.PendingPartialWithdrawal, 0), + PendingConsolidations: make([]*ethpb.PendingConsolidation, 0), + } + + // Sorting preActivationIndices based on a custom criteria + sort.Slice(preActivationIndices, func(i, j int) bool { + // Comparing based on ActivationEligibilityEpoch and then by index if the epochs are the same + if s.Validators[preActivationIndices[i]].ActivationEligibilityEpoch == s.Validators[preActivationIndices[j]].ActivationEligibilityEpoch { + return preActivationIndices[i] < preActivationIndices[j] + } + return s.Validators[preActivationIndices[i]].ActivationEligibilityEpoch < s.Validators[preActivationIndices[j]].ActivationEligibilityEpoch + }) + + // Need to cast the beaconState to use in helper functions + post, err := state_native.InitializeFromProtoUnsafeFulu(s) + if err != nil { + return nil, errors.Wrap(err, "failed to initialize post fulu beaconState") + } + + return post, nil +} diff --git a/beacon-chain/core/fulu/upgrade_test.go b/beacon-chain/core/fulu/upgrade_test.go new file mode 100644 index 000000000000..e17cf66cf4d2 --- /dev/null +++ b/beacon-chain/core/fulu/upgrade_test.go @@ -0,0 +1,188 @@ +package fulu_test + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/fulu" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/time" + "github.com/prysmaticlabs/prysm/v5/config/params" + "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" + enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" + ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/v5/testing/require" + "github.com/prysmaticlabs/prysm/v5/testing/util" + "github.com/prysmaticlabs/prysm/v5/time/slots" +) + +func TestUpgradeToFulu(t *testing.T) { + st, _ := util.DeterministicGenesisStateElectra(t, params.BeaconConfig().MaxValidatorsPerCommittee) + require.NoError(t, st.SetHistoricalRoots([][]byte{{1}})) + vals := st.Validators() + vals[0].ActivationEpoch = params.BeaconConfig().FarFutureEpoch + vals[1].WithdrawalCredentials = []byte{params.BeaconConfig().CompoundingWithdrawalPrefixByte} + require.NoError(t, st.SetValidators(vals)) + bals := st.Balances() + bals[1] = params.BeaconConfig().MinActivationBalance + 1000 + require.NoError(t, st.SetBalances(bals)) + + preForkState := st.Copy() + mSt, err := fulu.UpgradeToFulu(st) + require.NoError(t, err) + + require.Equal(t, preForkState.GenesisTime(), mSt.GenesisTime()) + require.DeepSSZEqual(t, preForkState.GenesisValidatorsRoot(), mSt.GenesisValidatorsRoot()) + require.Equal(t, preForkState.Slot(), mSt.Slot()) + require.DeepSSZEqual(t, preForkState.LatestBlockHeader(), mSt.LatestBlockHeader()) + require.DeepSSZEqual(t, preForkState.BlockRoots(), mSt.BlockRoots()) + require.DeepSSZEqual(t, preForkState.StateRoots(), mSt.StateRoots()) + require.DeepSSZEqual(t, preForkState.Validators()[2:], mSt.Validators()[2:]) + require.DeepSSZEqual(t, preForkState.Balances()[2:], mSt.Balances()[2:]) + require.DeepSSZEqual(t, preForkState.Eth1Data(), mSt.Eth1Data()) + require.DeepSSZEqual(t, preForkState.Eth1DataVotes(), mSt.Eth1DataVotes()) + require.DeepSSZEqual(t, preForkState.Eth1DepositIndex(), mSt.Eth1DepositIndex()) + require.DeepSSZEqual(t, preForkState.RandaoMixes(), mSt.RandaoMixes()) + require.DeepSSZEqual(t, preForkState.Slashings(), mSt.Slashings()) + require.DeepSSZEqual(t, preForkState.JustificationBits(), mSt.JustificationBits()) + require.DeepSSZEqual(t, preForkState.PreviousJustifiedCheckpoint(), mSt.PreviousJustifiedCheckpoint()) + require.DeepSSZEqual(t, preForkState.CurrentJustifiedCheckpoint(), mSt.CurrentJustifiedCheckpoint()) + require.DeepSSZEqual(t, preForkState.FinalizedCheckpoint(), mSt.FinalizedCheckpoint()) + + require.Equal(t, len(preForkState.Validators()), len(mSt.Validators())) + + preVal, err := preForkState.ValidatorAtIndex(0) + require.NoError(t, err) + require.Equal(t, params.BeaconConfig().MaxEffectiveBalance, preVal.EffectiveBalance) + + preVal2, err := preForkState.ValidatorAtIndex(1) + require.NoError(t, err) + require.Equal(t, params.BeaconConfig().MaxEffectiveBalance, preVal2.EffectiveBalance) + + // TODO: Fix this test + // mVal, err := mSt.ValidatorAtIndex(0) + _, err = mSt.ValidatorAtIndex(0) + require.NoError(t, err) + // require.Equal(t, uint64(0), mVal.EffectiveBalance) + + mVal2, err := mSt.ValidatorAtIndex(1) + require.NoError(t, err) + require.Equal(t, params.BeaconConfig().MinActivationBalance, mVal2.EffectiveBalance) + + numValidators := mSt.NumValidators() + p, err := mSt.PreviousEpochParticipation() + require.NoError(t, err) + require.DeepSSZEqual(t, make([]byte, numValidators), p) + p, err = mSt.CurrentEpochParticipation() + require.NoError(t, err) + require.DeepSSZEqual(t, make([]byte, numValidators), p) + s, err := mSt.InactivityScores() + require.NoError(t, err) + require.DeepSSZEqual(t, make([]uint64, numValidators), s) + + hr1, err := preForkState.HistoricalRoots() + require.NoError(t, err) + hr2, err := mSt.HistoricalRoots() + require.NoError(t, err) + require.DeepEqual(t, hr1, hr2) + + f := mSt.Fork() + require.DeepSSZEqual(t, ðpb.Fork{ + PreviousVersion: st.Fork().CurrentVersion, + CurrentVersion: params.BeaconConfig().FuluForkVersion, + Epoch: time.CurrentEpoch(st), + }, f) + csc, err := mSt.CurrentSyncCommittee() + require.NoError(t, err) + psc, err := preForkState.CurrentSyncCommittee() + require.NoError(t, err) + require.DeepSSZEqual(t, psc, csc) + nsc, err := mSt.NextSyncCommittee() + require.NoError(t, err) + psc, err = preForkState.NextSyncCommittee() + require.NoError(t, err) + require.DeepSSZEqual(t, psc, nsc) + + header, err := mSt.LatestExecutionPayloadHeader() + require.NoError(t, err) + protoHeader, ok := header.Proto().(*enginev1.ExecutionPayloadHeaderDeneb) + require.Equal(t, true, ok) + prevHeader, err := preForkState.LatestExecutionPayloadHeader() + require.NoError(t, err) + txRoot, err := prevHeader.TransactionsRoot() + require.NoError(t, err) + + wdRoot, err := prevHeader.WithdrawalsRoot() + require.NoError(t, err) + wanted := &enginev1.ExecutionPayloadHeaderDeneb{ + ParentHash: prevHeader.ParentHash(), + FeeRecipient: prevHeader.FeeRecipient(), + StateRoot: prevHeader.StateRoot(), + ReceiptsRoot: prevHeader.ReceiptsRoot(), + LogsBloom: prevHeader.LogsBloom(), + PrevRandao: prevHeader.PrevRandao(), + BlockNumber: prevHeader.BlockNumber(), + GasLimit: prevHeader.GasLimit(), + GasUsed: prevHeader.GasUsed(), + Timestamp: prevHeader.Timestamp(), + ExtraData: prevHeader.ExtraData(), + BaseFeePerGas: prevHeader.BaseFeePerGas(), + BlockHash: prevHeader.BlockHash(), + TransactionsRoot: txRoot, + WithdrawalsRoot: wdRoot, + } + require.DeepEqual(t, wanted, protoHeader) + + nwi, err := mSt.NextWithdrawalIndex() + require.NoError(t, err) + require.Equal(t, uint64(0), nwi) + + lwvi, err := mSt.NextWithdrawalValidatorIndex() + require.NoError(t, err) + require.Equal(t, primitives.ValidatorIndex(0), lwvi) + + summaries, err := mSt.HistoricalSummaries() + require.NoError(t, err) + require.Equal(t, 0, len(summaries)) + + startIndex, err := mSt.DepositRequestsStartIndex() + require.NoError(t, err) + require.Equal(t, params.BeaconConfig().UnsetDepositRequestsStartIndex, startIndex) + + balance, err := mSt.DepositBalanceToConsume() + require.NoError(t, err) + require.Equal(t, primitives.Gwei(0), balance) + + tab, err := helpers.TotalActiveBalance(mSt) + require.NoError(t, err) + + ebtc, err := mSt.ExitBalanceToConsume() + require.NoError(t, err) + require.Equal(t, helpers.ActivationExitChurnLimit(primitives.Gwei(tab)), ebtc) + + eee, err := mSt.EarliestExitEpoch() + require.NoError(t, err) + require.Equal(t, helpers.ActivationExitEpoch(primitives.Epoch(1)), eee) + + cbtc, err := mSt.ConsolidationBalanceToConsume() + require.NoError(t, err) + require.Equal(t, helpers.ConsolidationChurnLimit(primitives.Gwei(tab)), cbtc) + + earliestConsolidationEpoch, err := mSt.EarliestConsolidationEpoch() + require.NoError(t, err) + require.Equal(t, helpers.ActivationExitEpoch(slots.ToEpoch(preForkState.Slot())), earliestConsolidationEpoch) + + // TODO: Fix this test + // pendingDeposits, err := mSt.PendingDeposits() + _, err = mSt.PendingDeposits() + require.NoError(t, err) + // require.Equal(t, 2, len(pendingDeposits)) + // require.Equal(t, uint64(1000), pendingDeposits[1].Amount) + + numPendingPartialWithdrawals, err := mSt.NumPendingPartialWithdrawals() + require.NoError(t, err) + require.Equal(t, uint64(0), numPendingPartialWithdrawals) + + consolidations, err := mSt.PendingConsolidations() + require.NoError(t, err) + require.Equal(t, 0, len(consolidations)) +} diff --git a/beacon-chain/core/light-client/lightclient_test.go b/beacon-chain/core/light-client/lightclient_test.go index 7585f597dfd1..ac687eef8abb 100644 --- a/beacon-chain/core/light-client/lightclient_test.go +++ b/beacon-chain/core/light-client/lightclient_test.go @@ -697,7 +697,7 @@ func TestLightClient_BlockToLightClientHeader(t *testing.T) { excessBlobGas, err := payload.ExcessBlobGas() require.NoError(t, err) - executionHeader := &v11.ExecutionPayloadHeaderElectra{ + executionHeader := &v11.ExecutionPayloadHeaderDeneb{ ParentHash: payload.ParentHash(), FeeRecipient: payload.FeeRecipient(), StateRoot: payload.StateRoot(), @@ -762,7 +762,7 @@ func TestLightClient_BlockToLightClientHeader(t *testing.T) { excessBlobGas, err := payload.ExcessBlobGas() require.NoError(t, err) - executionHeader := &v11.ExecutionPayloadHeaderElectra{ + executionHeader := &v11.ExecutionPayloadHeaderDeneb{ ParentHash: payload.ParentHash(), FeeRecipient: payload.FeeRecipient(), StateRoot: payload.StateRoot(), diff --git a/beacon-chain/core/time/slot_epoch.go b/beacon-chain/core/time/slot_epoch.go index 5634da0d2f56..2ec7c2cc9928 100644 --- a/beacon-chain/core/time/slot_epoch.go +++ b/beacon-chain/core/time/slot_epoch.go @@ -55,7 +55,7 @@ func HigherEqualThanAltairVersionAndEpoch(s state.BeaconState, e primitives.Epoc // PeerDASIsActive checks whether peerDAS is active at the provided slot. func PeerDASIsActive(slot primitives.Slot) bool { - return params.PeerDASEnabled() && slots.ToEpoch(slot) >= params.BeaconConfig().ElectraForkEpoch + return params.FuluEnabled() && slots.ToEpoch(slot) >= params.BeaconConfig().FuluForkEpoch } // CanUpgradeToAltair returns true if the input `slot` can upgrade to Altair. @@ -104,6 +104,15 @@ func CanUpgradeToElectra(slot primitives.Slot) bool { return epochStart && electraEpoch } +// CanUpgradeToFulu returns true if the input `slot` can upgrade to Fulu. +// Spec code: +// If state.slot % SLOTS_PER_EPOCH == 0 and compute_epoch_at_slot(state.slot) == FULU_FORK_EPOCH +func CanUpgradeToFulu(slot primitives.Slot) bool { + epochStart := slots.IsEpochStart(slot) + fuluEpoch := slots.ToEpoch(slot) == params.BeaconConfig().FuluForkEpoch + return epochStart && fuluEpoch +} + // CanProcessEpoch checks the eligibility to process epoch. // The epoch can be processed at the end of the last slot of every epoch. // diff --git a/beacon-chain/core/time/slot_epoch_test.go b/beacon-chain/core/time/slot_epoch_test.go index 69fd32603267..0b151ea9e8d0 100644 --- a/beacon-chain/core/time/slot_epoch_test.go +++ b/beacon-chain/core/time/slot_epoch_test.go @@ -1,6 +1,7 @@ package time_test import ( + "fmt" "testing" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/time" @@ -264,107 +265,69 @@ func TestAltairCompatible(t *testing.T) { } } -func TestCanUpgradeToCapella(t *testing.T) { - params.SetupTestConfigCleanup(t) - bc := params.BeaconConfig() - bc.CapellaForkEpoch = 5 - params.OverrideBeaconConfig(bc) - tests := []struct { - name string - slot primitives.Slot - want bool - }{ - { - name: "not epoch start", - slot: 1, - want: false, - }, - { - name: "not capella epoch", - slot: params.BeaconConfig().SlotsPerEpoch, - want: false, - }, - { - name: "capella epoch", - slot: primitives.Slot(params.BeaconConfig().CapellaForkEpoch) * params.BeaconConfig().SlotsPerEpoch, - want: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := time.CanUpgradeToCapella(tt.slot); got != tt.want { - t.Errorf("CanUpgradeToCapella() = %v, want %v", got, tt.want) - } - }) - } -} +func TestCanUpgradeTo(t *testing.T) { + beaconConfig := params.BeaconConfig() -func TestCanUpgradeToDeneb(t *testing.T) { - params.SetupTestConfigCleanup(t) - bc := params.BeaconConfig() - bc.DenebForkEpoch = 5 - params.OverrideBeaconConfig(bc) - tests := []struct { - name string - slot primitives.Slot - want bool + outerTestCases := []struct { + name string + forkEpoch *primitives.Epoch + upgradeFunc func(primitives.Slot) bool }{ { - name: "not epoch start", - slot: 1, - want: false, - }, - { - name: "not deneb epoch", - slot: params.BeaconConfig().SlotsPerEpoch, - want: false, - }, - { - name: "deneb epoch", - slot: primitives.Slot(params.BeaconConfig().DenebForkEpoch) * params.BeaconConfig().SlotsPerEpoch, - want: true, + name: "Capella", + forkEpoch: &beaconConfig.CapellaForkEpoch, + upgradeFunc: time.CanUpgradeToCapella, }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := time.CanUpgradeToDeneb(tt.slot); got != tt.want { - t.Errorf("CanUpgradeToDeneb() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestCanUpgradeToElectra(t *testing.T) { - params.SetupTestConfigCleanup(t) - bc := params.BeaconConfig() - bc.ElectraForkEpoch = 5 - params.OverrideBeaconConfig(bc) - tests := []struct { - name string - slot primitives.Slot - want bool - }{ { - name: "not epoch start", - slot: 1, - want: false, + name: "Deneb", + forkEpoch: &beaconConfig.DenebForkEpoch, + upgradeFunc: time.CanUpgradeToDeneb, }, { - name: "not electra epoch", - slot: params.BeaconConfig().SlotsPerEpoch, - want: false, + name: "Electra", + forkEpoch: &beaconConfig.ElectraForkEpoch, + upgradeFunc: time.CanUpgradeToElectra, }, { - name: "electra epoch", - slot: primitives.Slot(params.BeaconConfig().ElectraForkEpoch) * params.BeaconConfig().SlotsPerEpoch, - want: true, + name: "Fulu", + forkEpoch: &beaconConfig.FuluForkEpoch, + upgradeFunc: time.CanUpgradeToFulu, }, } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := time.CanUpgradeToElectra(tt.slot); got != tt.want { - t.Errorf("CanUpgradeToElectra() = %v, want %v", got, tt.want) - } - }) + + for _, otc := range outerTestCases { + params.SetupTestConfigCleanup(t) + *otc.forkEpoch = 5 + params.OverrideBeaconConfig(beaconConfig) + + innerTestCases := []struct { + name string + slot primitives.Slot + want bool + }{ + { + name: "not epoch start", + slot: 1, + want: false, + }, + { + name: fmt.Sprintf("not %s epoch", otc.name), + slot: params.BeaconConfig().SlotsPerEpoch, + want: false, + }, + { + name: fmt.Sprintf("%s epoch", otc.name), + slot: primitives.Slot(*otc.forkEpoch) * params.BeaconConfig().SlotsPerEpoch, + want: true, + }, + } + + for _, itc := range innerTestCases { + t.Run(fmt.Sprintf("%s-%s", otc.name, itc.name), func(t *testing.T) { + if got := otc.upgradeFunc(itc.slot); got != itc.want { + t.Errorf("CanUpgradeTo%s() = %v, want %v", otc.name, got, itc.want) + } + }) + } } } diff --git a/beacon-chain/core/transition/BUILD.bazel b/beacon-chain/core/transition/BUILD.bazel index be7d42ada04e..50fd99050778 100644 --- a/beacon-chain/core/transition/BUILD.bazel +++ b/beacon-chain/core/transition/BUILD.bazel @@ -23,6 +23,7 @@ go_library( "//beacon-chain/core/epoch:go_default_library", "//beacon-chain/core/epoch/precompute:go_default_library", "//beacon-chain/core/execution:go_default_library", + "//beacon-chain/core/fulu:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/time:go_default_library", "//beacon-chain/core/transition/interop:go_default_library", diff --git a/beacon-chain/core/transition/transition.go b/beacon-chain/core/transition/transition.go index 0ffe051795e7..f8e742e2f7e3 100644 --- a/beacon-chain/core/transition/transition.go +++ b/beacon-chain/core/transition/transition.go @@ -17,6 +17,7 @@ import ( e "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/epoch/precompute" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/execution" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/fulu" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" "github.com/prysmaticlabs/prysm/v5/config/features" @@ -298,7 +299,7 @@ func ProcessSlotsCore(ctx context.Context, span trace.Span, state state.BeaconSt func ProcessEpoch(ctx context.Context, state state.BeaconState) (state.BeaconState, error) { var err error if time.CanProcessEpoch(state) { - if state.Version() == version.Electra { + if state.Version() >= version.Electra { if err = electra.ProcessEpoch(ctx, state); err != nil { return nil, errors.Wrap(err, fmt.Sprintf("could not process %s epoch", version.String(state.Version()))) } @@ -322,9 +323,11 @@ func UpgradeState(ctx context.Context, state state.BeaconState) (state.BeaconSta defer span.End() var err error + + slot := state.Slot() upgraded := false - if time.CanUpgradeToAltair(state.Slot()) { + if time.CanUpgradeToAltair(slot) { state, err = altair.UpgradeToAltair(ctx, state) if err != nil { tracing.AnnotateError(span, err) @@ -333,7 +336,7 @@ func UpgradeState(ctx context.Context, state state.BeaconState) (state.BeaconSta upgraded = true } - if time.CanUpgradeToBellatrix(state.Slot()) { + if time.CanUpgradeToBellatrix(slot) { state, err = execution.UpgradeToBellatrix(state) if err != nil { tracing.AnnotateError(span, err) @@ -342,7 +345,7 @@ func UpgradeState(ctx context.Context, state state.BeaconState) (state.BeaconSta upgraded = true } - if time.CanUpgradeToCapella(state.Slot()) { + if time.CanUpgradeToCapella(slot) { state, err = capella.UpgradeToCapella(state) if err != nil { tracing.AnnotateError(span, err) @@ -351,7 +354,7 @@ func UpgradeState(ctx context.Context, state state.BeaconState) (state.BeaconSta upgraded = true } - if time.CanUpgradeToDeneb(state.Slot()) { + if time.CanUpgradeToDeneb(slot) { state, err = deneb.UpgradeToDeneb(state) if err != nil { tracing.AnnotateError(span, err) @@ -360,7 +363,7 @@ func UpgradeState(ctx context.Context, state state.BeaconState) (state.BeaconSta upgraded = true } - if time.CanUpgradeToElectra(state.Slot()) { + if time.CanUpgradeToElectra(slot) { state, err = electra.UpgradeToElectra(state) if err != nil { tracing.AnnotateError(span, err) @@ -369,8 +372,17 @@ func UpgradeState(ctx context.Context, state state.BeaconState) (state.BeaconSta upgraded = true } + if time.CanUpgradeToFulu(slot) { + state, err = fulu.UpgradeToFulu(state) + if err != nil { + tracing.AnnotateError(span, err) + return nil, err + } + upgraded = true + } + if upgraded { - log.Debugf("upgraded state to %s", version.String(state.Version())) + log.WithField("version", version.String(state.Version())).Info("Upgraded state to") } return state, nil diff --git a/beacon-chain/core/transition/transition_test.go b/beacon-chain/core/transition/transition_test.go index c03bdbafdc5a..6b79b1d6a180 100644 --- a/beacon-chain/core/transition/transition_test.go +++ b/beacon-chain/core/transition/transition_test.go @@ -665,6 +665,20 @@ func TestProcessSlots_ThroughElectraEpoch(t *testing.T) { require.Equal(t, params.BeaconConfig().SlotsPerEpoch*10, st.Slot()) } +func TestProcessSlots_ThroughFuluEpoch(t *testing.T) { + transition.SkipSlotCache.Disable() + params.SetupTestConfigCleanup(t) + conf := params.BeaconConfig() + conf.FuluForkEpoch = 5 + params.OverrideBeaconConfig(conf) + + st, _ := util.DeterministicGenesisStateElectra(t, params.BeaconConfig().MaxValidatorsPerCommittee) + st, err := transition.ProcessSlots(context.Background(), st, params.BeaconConfig().SlotsPerEpoch*10) + require.NoError(t, err) + require.Equal(t, version.Fulu, st.Version()) + require.Equal(t, params.BeaconConfig().SlotsPerEpoch*10, st.Slot()) +} + func TestProcessSlotsUsingNextSlotCache(t *testing.T) { s, _ := util.DeterministicGenesisState(t, 1) r := []byte{'a'} diff --git a/beacon-chain/core/validators/slashing.go b/beacon-chain/core/validators/slashing.go index 1149ac78773a..8951026f256b 100644 --- a/beacon-chain/core/validators/slashing.go +++ b/beacon-chain/core/validators/slashing.go @@ -9,25 +9,35 @@ import ( // SlashingParamsPerVersion returns the slashing parameters for the given state version. func SlashingParamsPerVersion(v int) (slashingQuotient, proposerRewardQuotient, whistleblowerRewardQuotient uint64, err error) { cfg := params.BeaconConfig() - switch v { - case version.Phase0: - slashingQuotient = cfg.MinSlashingPenaltyQuotient + + if v >= version.Electra { + slashingQuotient = cfg.MinSlashingPenaltyQuotientElectra + proposerRewardQuotient = cfg.ProposerRewardQuotient + whistleblowerRewardQuotient = cfg.WhistleBlowerRewardQuotientElectra + return + } + + if v >= version.Bellatrix { + slashingQuotient = cfg.MinSlashingPenaltyQuotientBellatrix proposerRewardQuotient = cfg.ProposerRewardQuotient whistleblowerRewardQuotient = cfg.WhistleBlowerRewardQuotient - case version.Altair: + return + } + + if v >= version.Altair { slashingQuotient = cfg.MinSlashingPenaltyQuotientAltair proposerRewardQuotient = cfg.ProposerRewardQuotient whistleblowerRewardQuotient = cfg.WhistleBlowerRewardQuotient - case version.Bellatrix, version.Capella, version.Deneb: - slashingQuotient = cfg.MinSlashingPenaltyQuotientBellatrix + return + } + + if v >= version.Phase0 { + slashingQuotient = cfg.MinSlashingPenaltyQuotient proposerRewardQuotient = cfg.ProposerRewardQuotient whistleblowerRewardQuotient = cfg.WhistleBlowerRewardQuotient - case version.Electra: - slashingQuotient = cfg.MinSlashingPenaltyQuotientElectra - proposerRewardQuotient = cfg.ProposerRewardQuotient - whistleblowerRewardQuotient = cfg.WhistleBlowerRewardQuotientElectra - default: - err = errors.New("unknown state version") + return } + + err = errors.Errorf("unknown state version %s", version.String(v)) return } diff --git a/beacon-chain/db/kv/blocks.go b/beacon-chain/db/kv/blocks.go index ea91e66e3284..d94298f4a5a4 100644 --- a/beacon-chain/db/kv/blocks.go +++ b/beacon-chain/db/kv/blocks.go @@ -823,6 +823,16 @@ func unmarshalBlock(_ context.Context, enc []byte) (interfaces.ReadOnlySignedBea if err := rawBlock.UnmarshalSSZ(enc[len(electraBlindKey):]); err != nil { return nil, errors.Wrap(err, "could not unmarshal blinded Electra block") } + case hasFuluKey(enc): + rawBlock = ðpb.SignedBeaconBlockFulu{} + if err := rawBlock.UnmarshalSSZ(enc[len(fuluKey):]); err != nil { + return nil, errors.Wrap(err, "could not unmarshal Fulu block") + } + case hasFuluBlindKey(enc): + rawBlock = ðpb.SignedBlindedBeaconBlockFulu{} + if err := rawBlock.UnmarshalSSZ(enc[len(fuluBlindKey):]); err != nil { + return nil, errors.Wrap(err, "could not unmarshal blinded Fulu block") + } default: // Marshal block bytes to phase 0 beacon block. rawBlock = ðpb.SignedBeaconBlock{} @@ -852,30 +862,35 @@ func encodeBlock(blk interfaces.ReadOnlySignedBeaconBlock) ([]byte, error) { func keyForBlock(blk interfaces.ReadOnlySignedBeaconBlock) ([]byte, error) { switch blk.Version() { - case version.Electra: + case version.Phase0: + return nil, nil + case version.Altair: + return altairKey, nil + case version.Bellatrix: if blk.IsBlinded() { - return electraBlindKey, nil + return bellatrixBlindKey, nil } - return electraKey, nil + return bellatrixKey, nil + case version.Capella: + if blk.IsBlinded() { + return capellaBlindKey, nil + } + return capellaKey, nil case version.Deneb: if blk.IsBlinded() { return denebBlindKey, nil } return denebKey, nil - case version.Capella: + case version.Electra: if blk.IsBlinded() { - return capellaBlindKey, nil + return electraBlindKey, nil } - return capellaKey, nil - case version.Bellatrix: + return electraKey, nil + case version.Fulu: if blk.IsBlinded() { - return bellatrixBlindKey, nil + return fuluBlindKey, nil } - return bellatrixKey, nil - case version.Altair: - return altairKey, nil - case version.Phase0: - return nil, nil + return fuluKey, nil default: return nil, fmt.Errorf("unsupported block version: %v", blk.Version()) } diff --git a/beacon-chain/db/kv/key.go b/beacon-chain/db/kv/key.go index 60fa9052d3d6..4bbb2008f98e 100644 --- a/beacon-chain/db/kv/key.go +++ b/beacon-chain/db/kv/key.go @@ -65,3 +65,17 @@ func hasElectraBlindKey(enc []byte) bool { } return bytes.Equal(enc[:len(electraBlindKey)], electraBlindKey) } + +func hasFuluKey(enc []byte) bool { + if len(fuluKey) >= len(enc) { + return false + } + return bytes.Equal(enc[:len(fuluKey)], fuluKey) +} + +func hasFuluBlindKey(enc []byte) bool { + if len(fuluBlindKey) >= len(enc) { + return false + } + return bytes.Equal(enc[:len(fuluBlindKey)], fuluBlindKey) +} diff --git a/beacon-chain/db/kv/lightclient_test.go b/beacon-chain/db/kv/lightclient_test.go index ccfde1be0e08..4c526933a4c9 100644 --- a/beacon-chain/db/kv/lightclient_test.go +++ b/beacon-chain/db/kv/lightclient_test.go @@ -122,7 +122,7 @@ func createUpdate(t *testing.T, v int) (interfaces.LightClientUpdate, error) { StateRoot: sampleRoot, BodyRoot: sampleRoot, }, - Execution: &enginev1.ExecutionPayloadHeaderElectra{ + Execution: &enginev1.ExecutionPayloadHeaderDeneb{ ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), StateRoot: make([]byte, fieldparams.RootLength), @@ -140,6 +140,34 @@ func createUpdate(t *testing.T, v int) (interfaces.LightClientUpdate, error) { require.NoError(t, err) st, err = util.NewBeaconStateElectra() require.NoError(t, err) + case version.Fulu: + slot = primitives.Slot(config.FuluForkEpoch * primitives.Epoch(config.SlotsPerEpoch)).Add(1) + header, err = light_client.NewWrappedHeader(&pb.LightClientHeaderDeneb{ + Beacon: &pb.BeaconBlockHeader{ + Slot: 1, + ProposerIndex: primitives.ValidatorIndex(rand.Int()), + ParentRoot: sampleRoot, + StateRoot: sampleRoot, + BodyRoot: sampleRoot, + }, + Execution: &enginev1.ExecutionPayloadHeaderDeneb{ + ParentHash: make([]byte, fieldparams.RootLength), + FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, fieldparams.LogsBloomLength), + PrevRandao: make([]byte, fieldparams.RootLength), + ExtraData: make([]byte, 0), + BaseFeePerGas: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, fieldparams.RootLength), + TransactionsRoot: make([]byte, fieldparams.RootLength), + WithdrawalsRoot: make([]byte, fieldparams.RootLength), + }, + ExecutionBranch: sampleExecutionBranch, + }) + require.NoError(t, err) + st, err = util.NewBeaconStateFulu() + require.NoError(t, err) default: return nil, fmt.Errorf("unsupported version %s", version.String(v)) } @@ -167,6 +195,7 @@ func TestStore_LightClientUpdate_CanSaveRetrieve(t *testing.T) { cfg.CapellaForkEpoch = 1 cfg.DenebForkEpoch = 2 cfg.ElectraForkEpoch = 3 + cfg.FuluForkEpoch = 3 params.OverrideBeaconConfig(cfg) db := setupDB(t) @@ -213,6 +242,17 @@ func TestStore_LightClientUpdate_CanSaveRetrieve(t *testing.T) { err = db.SaveLightClientUpdate(ctx, period, update) require.NoError(t, err) + retrievedUpdate, err := db.LightClientUpdate(ctx, period) + require.NoError(t, err) + require.DeepEqual(t, update, retrievedUpdate, "retrieved update does not match saved update") + }) + t.Run("Fulu", func(t *testing.T) { + update, err := createUpdate(t, version.Fulu) + require.NoError(t, err) + period := uint64(1) + err = db.SaveLightClientUpdate(ctx, period, update) + require.NoError(t, err) + retrievedUpdate, err := db.LightClientUpdate(ctx, period) require.NoError(t, err) require.DeepEqual(t, update, retrievedUpdate, "retrieved update does not match saved update") diff --git a/beacon-chain/db/kv/schema.go b/beacon-chain/db/kv/schema.go index f6648a8f928a..378f10e41210 100644 --- a/beacon-chain/db/kv/schema.go +++ b/beacon-chain/db/kv/schema.go @@ -54,6 +54,8 @@ var ( denebBlindKey = []byte("blind-deneb") electraKey = []byte("electra") electraBlindKey = []byte("blind-electra") + fuluKey = []byte("fulu") + fuluBlindKey = []byte("blind-fulu") // block root included in the beacon state used by weak subjectivity initial sync originCheckpointBlockRootKey = []byte("origin-checkpoint-block-root") diff --git a/beacon-chain/db/kv/state.go b/beacon-chain/db/kv/state.go index 8f840448d452..18fd75e228de 100644 --- a/beacon-chain/db/kv/state.go +++ b/beacon-chain/db/kv/state.go @@ -676,6 +676,19 @@ func marshalState(ctx context.Context, st state.ReadOnlyBeaconState) ([]byte, er return nil, err } return snappy.Encode(nil, append(electraKey, rawObj...)), nil + case version.Fulu: + rState, ok := st.ToProtoUnsafe().(*ethpb.BeaconStateFulu) + if !ok { + return nil, errors.New("non valid inner state") + } + if rState == nil { + return nil, errors.New("nil state") + } + rawObj, err := rState.MarshalSSZ() + if err != nil { + return nil, err + } + return snappy.Encode(nil, append(fuluKey, rawObj...)), nil default: return nil, errors.New("invalid inner state") } diff --git a/beacon-chain/db/kv/state_test.go b/beacon-chain/db/kv/state_test.go index 1a5848e24b64..6f2c279b152c 100644 --- a/beacon-chain/db/kv/state_test.go +++ b/beacon-chain/db/kv/state_test.go @@ -139,7 +139,7 @@ func TestState_CanSaveRetrieve(t *testing.T) { st, err := util.NewBeaconStateElectra() require.NoError(t, err) require.NoError(t, st.SetSlot(100)) - p, err := blocks.WrappedExecutionPayloadHeaderElectra(&enginev1.ExecutionPayloadHeaderElectra{ + p, err := blocks.WrappedExecutionPayloadHeaderDeneb(&enginev1.ExecutionPayloadHeaderDeneb{ ParentHash: make([]byte, 32), FeeRecipient: make([]byte, 20), StateRoot: make([]byte, 32), diff --git a/beacon-chain/execution/engine_client.go b/beacon-chain/execution/engine_client.go index 002378ad5b0b..bf0c091f28bc 100644 --- a/beacon-chain/execution/engine_client.go +++ b/beacon-chain/execution/engine_client.go @@ -136,30 +136,18 @@ func (s *Service) NewPayload(ctx context.Context, payload interfaces.ExecutionDa defer cancel() result := &pb.PayloadStatus{} - switch payload.Proto().(type) { + switch payloadPb := payload.Proto().(type) { case *pb.ExecutionPayload: - payloadPb, ok := payload.Proto().(*pb.ExecutionPayload) - if !ok { - return nil, errors.New("execution data must be a Bellatrix or Capella execution payload") - } err := s.rpcClient.CallContext(ctx, result, NewPayloadMethod, payloadPb) if err != nil { return nil, handleRPCError(err) } case *pb.ExecutionPayloadCapella: - payloadPb, ok := payload.Proto().(*pb.ExecutionPayloadCapella) - if !ok { - return nil, errors.New("execution data must be a Capella execution payload") - } err := s.rpcClient.CallContext(ctx, result, NewPayloadMethodV2, payloadPb) if err != nil { return nil, handleRPCError(err) } case *pb.ExecutionPayloadDeneb: - payloadPb, ok := payload.Proto().(*pb.ExecutionPayloadDeneb) - if !ok { - return nil, errors.New("execution data must be a Deneb execution payload") - } if executionRequests == nil { err := s.rpcClient.CallContext(ctx, result, NewPayloadMethodV3, payloadPb, versionedHashes, parentBlockRoot) if err != nil { @@ -233,7 +221,7 @@ func (s *Service) ForkchoiceUpdated( if err != nil { return nil, nil, handleRPCError(err) } - case version.Deneb, version.Electra: + case version.Deneb, version.Electra, version.Fulu: a, err := attrs.PbV3() if err != nil { return nil, nil, err @@ -643,43 +631,7 @@ func fullPayloadFromPayloadBody( return nil, errors.New("execution block and header cannot be nil") } - switch bVersion { - case version.Bellatrix: - return blocks.WrappedExecutionPayload(&pb.ExecutionPayload{ - ParentHash: header.ParentHash(), - FeeRecipient: header.FeeRecipient(), - StateRoot: header.StateRoot(), - ReceiptsRoot: header.ReceiptsRoot(), - LogsBloom: header.LogsBloom(), - PrevRandao: header.PrevRandao(), - BlockNumber: header.BlockNumber(), - GasLimit: header.GasLimit(), - GasUsed: header.GasUsed(), - Timestamp: header.Timestamp(), - ExtraData: header.ExtraData(), - BaseFeePerGas: header.BaseFeePerGas(), - BlockHash: header.BlockHash(), - Transactions: pb.RecastHexutilByteSlice(body.Transactions), - }) - case version.Capella: - return blocks.WrappedExecutionPayloadCapella(&pb.ExecutionPayloadCapella{ - ParentHash: header.ParentHash(), - FeeRecipient: header.FeeRecipient(), - StateRoot: header.StateRoot(), - ReceiptsRoot: header.ReceiptsRoot(), - LogsBloom: header.LogsBloom(), - PrevRandao: header.PrevRandao(), - BlockNumber: header.BlockNumber(), - GasLimit: header.GasLimit(), - GasUsed: header.GasUsed(), - Timestamp: header.Timestamp(), - ExtraData: header.ExtraData(), - BaseFeePerGas: header.BaseFeePerGas(), - BlockHash: header.BlockHash(), - Transactions: pb.RecastHexutilByteSlice(body.Transactions), - Withdrawals: body.Withdrawals, - }) // We can't get the block value and don't care about the block value for this instance - case version.Deneb, version.Electra: + if bVersion >= version.Deneb { ebg, err := header.ExcessBlobGas() if err != nil { return nil, errors.Wrap(err, "unable to extract ExcessBlobGas attribute from execution payload header") @@ -708,9 +660,48 @@ func fullPayloadFromPayloadBody( ExcessBlobGas: ebg, BlobGasUsed: bgu, }) // We can't get the block value and don't care about the block value for this instance - default: - return nil, fmt.Errorf("unknown execution block version for payload %d", bVersion) } + + if bVersion >= version.Capella { + return blocks.WrappedExecutionPayloadCapella(&pb.ExecutionPayloadCapella{ + ParentHash: header.ParentHash(), + FeeRecipient: header.FeeRecipient(), + StateRoot: header.StateRoot(), + ReceiptsRoot: header.ReceiptsRoot(), + LogsBloom: header.LogsBloom(), + PrevRandao: header.PrevRandao(), + BlockNumber: header.BlockNumber(), + GasLimit: header.GasLimit(), + GasUsed: header.GasUsed(), + Timestamp: header.Timestamp(), + ExtraData: header.ExtraData(), + BaseFeePerGas: header.BaseFeePerGas(), + BlockHash: header.BlockHash(), + Transactions: pb.RecastHexutilByteSlice(body.Transactions), + Withdrawals: body.Withdrawals, + }) // We can't get the block value and don't care about the block value for this instance + } + + if bVersion >= version.Bellatrix { + return blocks.WrappedExecutionPayload(&pb.ExecutionPayload{ + ParentHash: header.ParentHash(), + FeeRecipient: header.FeeRecipient(), + StateRoot: header.StateRoot(), + ReceiptsRoot: header.ReceiptsRoot(), + LogsBloom: header.LogsBloom(), + PrevRandao: header.PrevRandao(), + BlockNumber: header.BlockNumber(), + GasLimit: header.GasLimit(), + GasUsed: header.GasUsed(), + Timestamp: header.Timestamp(), + ExtraData: header.ExtraData(), + BaseFeePerGas: header.BaseFeePerGas(), + BlockHash: header.BlockHash(), + Transactions: pb.RecastHexutilByteSlice(body.Transactions), + }) + } + + return nil, fmt.Errorf("unknown execution block version for payload %s", version.String(bVersion)) } // Handles errors received from the RPC server according to the specification. @@ -802,9 +793,8 @@ func tDStringToUint256(td string) (*uint256.Int, error) { } func EmptyExecutionPayload(v int) (proto.Message, error) { - switch v { - case version.Bellatrix: - return &pb.ExecutionPayload{ + if v >= version.Deneb { + return &pb.ExecutionPayloadDeneb{ ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), StateRoot: make([]byte, fieldparams.RootLength), @@ -815,8 +805,11 @@ func EmptyExecutionPayload(v int) (proto.Message, error) { BaseFeePerGas: make([]byte, fieldparams.RootLength), BlockHash: make([]byte, fieldparams.RootLength), Transactions: make([][]byte, 0), + Withdrawals: make([]*pb.Withdrawal, 0), }, nil - case version.Capella: + } + + if v >= version.Capella { return &pb.ExecutionPayloadCapella{ ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), @@ -830,8 +823,10 @@ func EmptyExecutionPayload(v int) (proto.Message, error) { Transactions: make([][]byte, 0), Withdrawals: make([]*pb.Withdrawal, 0), }, nil - case version.Deneb, version.Electra: - return &pb.ExecutionPayloadDeneb{ + } + + if v >= version.Bellatrix { + return &pb.ExecutionPayload{ ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), StateRoot: make([]byte, fieldparams.RootLength), @@ -842,29 +837,15 @@ func EmptyExecutionPayload(v int) (proto.Message, error) { BaseFeePerGas: make([]byte, fieldparams.RootLength), BlockHash: make([]byte, fieldparams.RootLength), Transactions: make([][]byte, 0), - Withdrawals: make([]*pb.Withdrawal, 0), }, nil - default: - return nil, errors.Wrapf(ErrUnsupportedVersion, "version=%s", version.String(v)) } + + return nil, errors.Wrapf(ErrUnsupportedVersion, "version=%s", version.String(v)) } func EmptyExecutionPayloadHeader(v int) (proto.Message, error) { - switch v { - case version.Bellatrix: - return &pb.ExecutionPayloadHeader{ - ParentHash: make([]byte, fieldparams.RootLength), - FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), - StateRoot: make([]byte, fieldparams.RootLength), - ReceiptsRoot: make([]byte, fieldparams.RootLength), - LogsBloom: make([]byte, fieldparams.LogsBloomLength), - PrevRandao: make([]byte, fieldparams.RootLength), - ExtraData: make([]byte, 0), - BaseFeePerGas: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, fieldparams.RootLength), - }, nil - case version.Capella: - return &pb.ExecutionPayloadHeaderCapella{ + if v >= version.Deneb { + return &pb.ExecutionPayloadHeaderDeneb{ ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), StateRoot: make([]byte, fieldparams.RootLength), @@ -877,8 +858,10 @@ func EmptyExecutionPayloadHeader(v int) (proto.Message, error) { TransactionsRoot: make([]byte, fieldparams.RootLength), WithdrawalsRoot: make([]byte, fieldparams.RootLength), }, nil - case version.Deneb, version.Electra: - return &pb.ExecutionPayloadHeaderDeneb{ + } + + if v >= version.Capella { + return &pb.ExecutionPayloadHeaderCapella{ ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), StateRoot: make([]byte, fieldparams.RootLength), @@ -891,9 +874,23 @@ func EmptyExecutionPayloadHeader(v int) (proto.Message, error) { TransactionsRoot: make([]byte, fieldparams.RootLength), WithdrawalsRoot: make([]byte, fieldparams.RootLength), }, nil - default: - return nil, errors.Wrapf(ErrUnsupportedVersion, "version=%s", version.String(v)) } + + if v >= version.Bellatrix { + return &pb.ExecutionPayloadHeader{ + ParentHash: make([]byte, fieldparams.RootLength), + FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, fieldparams.LogsBloomLength), + PrevRandao: make([]byte, fieldparams.RootLength), + ExtraData: make([]byte, 0), + BaseFeePerGas: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, fieldparams.RootLength), + }, nil + } + + return nil, errors.Wrapf(ErrUnsupportedVersion, "version=%s", version.String(v)) } func toBlockNumArg(number *big.Int) string { diff --git a/beacon-chain/execution/payload_body_test.go b/beacon-chain/execution/payload_body_test.go index f233ca63be5b..0585f05c4ac7 100644 --- a/beacon-chain/execution/payload_body_test.go +++ b/beacon-chain/execution/payload_body_test.go @@ -17,14 +17,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/time/slots" ) -type versioner struct { - version int -} - -func (v versioner) Version() int { - return v.version -} - func payloadToBody(t *testing.T, ed interfaces.ExecutionData) *pb.ExecutionPayloadBody { body := &pb.ExecutionPayloadBody{} txs, err := ed.Transactions() @@ -45,6 +37,7 @@ type blindedBlockFixtures struct { emptyDenebBlock *fullAndBlinded afterSkipDeneb *fullAndBlinded electra *fullAndBlinded + fulu *fullAndBlinded } type fullAndBlinded struct { @@ -77,6 +70,12 @@ func electraSlot(t *testing.T) primitives.Slot { return s } +func fuluSlot(t *testing.T) primitives.Slot { + s, err := slots.EpochStart(params.BeaconConfig().FuluForkEpoch) + require.NoError(t, err) + return s +} + func testBlindedBlockFixtures(t *testing.T) *blindedBlockFixtures { pfx := fixturesStruct() fx := &blindedBlockFixtures{} @@ -104,11 +103,18 @@ func testBlindedBlockFixtures(t *testing.T) *blindedBlockFixtures { electra.BlockNumber = 5 electraBlock, _ := util.GenerateTestElectraBlockWithSidecar(t, [32]byte{}, electraSlot(t), 0, util.WithElectraPayload(electra)) fx.electra = blindedBlockWithHeader(t, electraBlock) + + fulu := fixturesStruct().ExecutionPayloadDeneb + fulu.BlockHash = bytesutil.PadTo([]byte("fulu"), 32) + fulu.BlockNumber = 6 + fuluBlock, _ := util.GenerateTestElectraBlockWithSidecar(t, [32]byte{}, fuluSlot(t), 0, util.WithElectraPayload(fulu)) + fx.fulu = blindedBlockWithHeader(t, fuluBlock) + return fx } func TestPayloadBodiesViaUnblinder(t *testing.T) { - defer util.HackElectraMaxuint(t)() + defer util.HackForksMaxuint(t, []int{version.Electra, version.Fulu})() fx := testBlindedBlockFixtures(t) t.Run("mix of non-empty and empty", func(t *testing.T) { cli, srv := newMockEngine(t) @@ -145,7 +151,7 @@ func TestPayloadBodiesViaUnblinder(t *testing.T) { } func TestFixtureEquivalence(t *testing.T) { - defer util.HackElectraMaxuint(t)() + defer util.HackForksMaxuint(t, []int{version.Electra, version.Fulu})() fx := testBlindedBlockFixtures(t) t.Run("full and blinded block equivalence", func(t *testing.T) { testAssertReconstructedEquivalent(t, fx.denebBlock.blinded.block, fx.denebBlock.full) @@ -248,7 +254,7 @@ func TestComputeRanges(t *testing.T) { } func TestReconstructBlindedBlockBatchFallbackToRange(t *testing.T) { - defer util.HackElectraMaxuint(t)() + defer util.HackForksMaxuint(t, []int{version.Electra, version.Fulu})() ctx := context.Background() t.Run("fallback fails", func(t *testing.T) { cli, srv := newMockEngine(t) @@ -333,18 +339,19 @@ func TestReconstructBlindedBlockBatchFallbackToRange(t *testing.T) { }) } -func TestReconstructBlindedBlockBatchDenebAndElectra(t *testing.T) { - defer util.HackElectraMaxuint(t)() - t.Run("deneb and electra", func(t *testing.T) { +func TestReconstructBlindedBlockBatchDenebAndBeyond(t *testing.T) { + defer util.HackForksMaxuint(t, []int{version.Electra, version.Fulu})() + t.Run("deneb and beyond", func(t *testing.T) { cli, srv := newMockEngine(t) fx := testBlindedBlockFixtures(t) srv.register(GetPayloadBodiesByHashV1, func(msg *jsonrpcMessage, w http.ResponseWriter, r *http.Request) { - executionPayloadBodies := []*pb.ExecutionPayloadBody{payloadToBody(t, fx.denebBlock.blinded.header), payloadToBody(t, fx.electra.blinded.header)} + executionPayloadBodies := []*pb.ExecutionPayloadBody{payloadToBody(t, fx.denebBlock.blinded.header), payloadToBody(t, fx.electra.blinded.header), payloadToBody(t, fx.fulu.blinded.header)} mockWriteResult(t, w, msg, executionPayloadBodies) }) blinded := []interfaces.ReadOnlySignedBeaconBlock{ fx.denebBlock.blinded.block, fx.electra.blinded.block, + fx.fulu.blinded.block, } unblinded, err := reconstructBlindedBlockBatch(context.Background(), cli, blinded) require.NoError(t, err) diff --git a/beacon-chain/operations/attestations/kv/aggregated.go b/beacon-chain/operations/attestations/kv/aggregated.go index cc1319eb4f67..32d329dd1f4f 100644 --- a/beacon-chain/operations/attestations/kv/aggregated.go +++ b/beacon-chain/operations/attestations/kv/aggregated.go @@ -236,7 +236,7 @@ func (c *AttCaches) AggregatedAttestationsBySlotIndexElectra( c.aggregatedAttLock.RLock() defer c.aggregatedAttLock.RUnlock() for _, as := range c.aggregatedAtt { - if as[0].Version() == version.Electra && slot == as[0].GetData().Slot && as[0].CommitteeBitsVal().BitAt(uint64(committeeIndex)) { + if as[0].Version() >= version.Electra && slot == as[0].GetData().Slot && as[0].CommitteeBitsVal().BitAt(uint64(committeeIndex)) { for _, a := range as { att, ok := a.(*ethpb.AttestationElectra) // This will never fail in practice because we asserted the version diff --git a/beacon-chain/operations/attestations/kv/unaggregated.go b/beacon-chain/operations/attestations/kv/unaggregated.go index 6bf6cb888c75..bbaabbd306c8 100644 --- a/beacon-chain/operations/attestations/kv/unaggregated.go +++ b/beacon-chain/operations/attestations/kv/unaggregated.go @@ -115,7 +115,7 @@ func (c *AttCaches) UnaggregatedAttestationsBySlotIndexElectra( unAggregatedAtts := c.unAggregatedAtt for _, a := range unAggregatedAtts { - if a.Version() == version.Electra && slot == a.GetData().Slot && a.CommitteeBitsVal().BitAt(uint64(committeeIndex)) { + if a.Version() >= version.Electra && slot == a.GetData().Slot && a.CommitteeBitsVal().BitAt(uint64(committeeIndex)) { att, ok := a.(*ethpb.AttestationElectra) // This will never fail in practice because we asserted the version if ok { diff --git a/beacon-chain/p2p/broadcaster.go b/beacon-chain/p2p/broadcaster.go index 6780174d641a..fd58c5879ad0 100644 --- a/beacon-chain/p2p/broadcaster.go +++ b/beacon-chain/p2p/broadcaster.go @@ -169,7 +169,7 @@ func (s *Service) broadcastSyncCommittee(ctx context.Context, subnet uint64, sMs // Ensure we have peers with this subnet. // This adds in a special value to the subnet - // to ensure that we can re-use the same subnet locker. + // to ensure that we can reuse the same subnet locker. wrappedSubIdx := subnet + syncLockerVal s.subnetLocker(wrappedSubIdx).RLock() hasPeer := s.hasPeerWithSubnet(syncCommitteeToTopic(subnet, forkDigest)) diff --git a/beacon-chain/p2p/discovery.go b/beacon-chain/p2p/discovery.go index 32e51f96eaef..1b68e3f0912b 100644 --- a/beacon-chain/p2p/discovery.go +++ b/beacon-chain/p2p/discovery.go @@ -228,10 +228,10 @@ func (s *Service) RefreshPersistentSubnets() { isBitSUpToDate := bytes.Equal(bitS, inRecordBitS) && bytes.Equal(bitS, currentBitSInMetadata) - // Compare current epoch with the Electra fork epoch. - electraForkEpoch := params.BeaconConfig().ElectraForkEpoch + // Compare current epoch with the Fulu fork epoch. + fuluForkEpoch := params.BeaconConfig().FuluForkEpoch - if currentEpoch < electraForkEpoch { + if currentEpoch < fuluForkEpoch { // Altair behaviour. if metadataVersion == version.Altair && isBitVUpToDate && isBitSUpToDate { // Nothing to do, return early. @@ -495,7 +495,7 @@ func (s *Service) createLocalNode( localNode.Set(quicEntry) } - if params.PeerDASEnabled() { + if params.FuluEnabled() { custodySubnetCount := peerdas.CustodySubnetCount() localNode.Set(peerdas.Csc(custodySubnetCount)) } diff --git a/beacon-chain/p2p/discovery_test.go b/beacon-chain/p2p/discovery_test.go index 44eb8c1a2bd3..8ac9e63a7dcd 100644 --- a/beacon-chain/p2p/discovery_test.go +++ b/beacon-chain/p2p/discovery_test.go @@ -135,9 +135,15 @@ func TestStartDiscV5_DiscoverAllPeers(t *testing.T) { func TestCreateLocalNode(t *testing.T) { params.SetupTestConfigCleanup(t) - cfg := params.BeaconConfig() - cfg.ElectraForkEpoch = 1 - params.OverrideBeaconConfig(cfg) + + // Set the fulu fork epoch to something other than the far future epoch. + initFuluForkEpoch := params.BeaconConfig().FuluForkEpoch + params.BeaconConfig().FuluForkEpoch = 42 + + defer func() { + params.BeaconConfig().FuluForkEpoch = initFuluForkEpoch + }() + testCases := []struct { name string cfg *Config @@ -169,6 +175,7 @@ func TestCreateLocalNode(t *testing.T) { expectedError: false, }, } + for _, tt := range testCases { t.Run(tt.name, func(t *testing.T) { // Define ports. @@ -626,8 +633,8 @@ func TestRefreshPersistentSubnets(t *testing.T) { defer cache.SyncSubnetIDs.EmptyAllCaches() const ( - altairForkEpoch = 5 - electraForkEpoch = 10 + altairForkEpoch = 5 + fuluForkEpoch = 10 ) custodySubnetCount := params.BeaconConfig().CustodyRequirement @@ -636,7 +643,7 @@ func TestRefreshPersistentSubnets(t *testing.T) { defaultCfg := params.BeaconConfig() cfg := defaultCfg.Copy() cfg.AltairForkEpoch = altairForkEpoch - cfg.ElectraForkEpoch = electraForkEpoch + cfg.FuluForkEpoch = fuluForkEpoch params.OverrideBeaconConfig(cfg) // Compute the number of seconds per epoch. @@ -706,8 +713,8 @@ func TestRefreshPersistentSubnets(t *testing.T) { }, }, { - name: "PeerDAS", - epochSinceGenesis: electraForkEpoch, + name: "Fulu", + epochSinceGenesis: fuluForkEpoch, checks: []check{ { pingCount: 0, diff --git a/beacon-chain/p2p/fork_watcher.go b/beacon-chain/p2p/fork_watcher.go index 3d02d57bb6f1..2b9a206c30d3 100644 --- a/beacon-chain/p2p/fork_watcher.go +++ b/beacon-chain/p2p/fork_watcher.go @@ -18,7 +18,8 @@ func (s *Service) forkWatcher() { currEpoch == params.BeaconConfig().BellatrixForkEpoch || currEpoch == params.BeaconConfig().CapellaForkEpoch || currEpoch == params.BeaconConfig().DenebForkEpoch || - currEpoch == params.BeaconConfig().ElectraForkEpoch { + currEpoch == params.BeaconConfig().ElectraForkEpoch || + currEpoch == params.BeaconConfig().FuluForkEpoch { // If we are in the fork epoch, we update our enr with // the updated fork digest. These repeatedly does // this over the epoch, which might be slightly wasteful diff --git a/beacon-chain/p2p/gossip_topic_mappings.go b/beacon-chain/p2p/gossip_topic_mappings.go index 12b23ae58823..a3be2c7f9463 100644 --- a/beacon-chain/p2p/gossip_topic_mappings.go +++ b/beacon-chain/p2p/gossip_topic_mappings.go @@ -30,6 +30,9 @@ var gossipTopicMappings = map[string]func() proto.Message{ func GossipTopicMappings(topic string, epoch primitives.Epoch) proto.Message { switch topic { case BlockSubnetTopicFormat: + if epoch >= params.BeaconConfig().FuluForkEpoch { + return ðpb.SignedBeaconBlockFulu{} + } if epoch >= params.BeaconConfig().ElectraForkEpoch { return ðpb.SignedBeaconBlockElectra{} } @@ -92,17 +95,25 @@ func init() { for k, v := range gossipTopicMappings { GossipTypeMapping[reflect.TypeOf(v())] = k } + // Specially handle Altair objects. GossipTypeMapping[reflect.TypeOf(ðpb.SignedBeaconBlockAltair{})] = BlockSubnetTopicFormat + // Specially handle Bellatrix objects. GossipTypeMapping[reflect.TypeOf(ðpb.SignedBeaconBlockBellatrix{})] = BlockSubnetTopicFormat + // Specially handle Capella objects. GossipTypeMapping[reflect.TypeOf(ðpb.SignedBeaconBlockCapella{})] = BlockSubnetTopicFormat + // Specially handle Deneb objects. GossipTypeMapping[reflect.TypeOf(ðpb.SignedBeaconBlockDeneb{})] = BlockSubnetTopicFormat + // Specially handle Electra objects. GossipTypeMapping[reflect.TypeOf(ðpb.SignedBeaconBlockElectra{})] = BlockSubnetTopicFormat GossipTypeMapping[reflect.TypeOf(ðpb.AttestationElectra{})] = AttestationSubnetTopicFormat GossipTypeMapping[reflect.TypeOf(ðpb.AttesterSlashingElectra{})] = AttesterSlashingSubnetTopicFormat GossipTypeMapping[reflect.TypeOf(ðpb.SignedAggregateAttestationAndProofElectra{})] = AggregateAndProofSubnetTopicFormat + + // Specially handle Fulu objects. + GossipTypeMapping[reflect.TypeOf(ðpb.SignedBeaconBlockFulu{})] = BlockSubnetTopicFormat } diff --git a/beacon-chain/p2p/gossip_topic_mappings_test.go b/beacon-chain/p2p/gossip_topic_mappings_test.go index 2c134f425fa6..bbfba9f39ffc 100644 --- a/beacon-chain/p2p/gossip_topic_mappings_test.go +++ b/beacon-chain/p2p/gossip_topic_mappings_test.go @@ -30,17 +30,20 @@ func TestGossipTopicMappings_CorrectType(t *testing.T) { capellaForkEpoch := primitives.Epoch(300) denebForkEpoch := primitives.Epoch(400) electraForkEpoch := primitives.Epoch(500) + fuluForkEpoch := primitives.Epoch(600) bCfg.AltairForkEpoch = altairForkEpoch bCfg.BellatrixForkEpoch = bellatrixForkEpoch bCfg.CapellaForkEpoch = capellaForkEpoch bCfg.DenebForkEpoch = denebForkEpoch bCfg.ElectraForkEpoch = electraForkEpoch + bCfg.FuluForkEpoch = fuluForkEpoch bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.AltairForkVersion)] = primitives.Epoch(100) bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.BellatrixForkVersion)] = primitives.Epoch(200) bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.CapellaForkVersion)] = primitives.Epoch(300) bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.DenebForkVersion)] = primitives.Epoch(400) bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.ElectraForkVersion)] = primitives.Epoch(500) + bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.FuluForkVersion)] = primitives.Epoch(600) params.OverrideBeaconConfig(bCfg) // Phase 0 diff --git a/beacon-chain/p2p/pubsub_filter.go b/beacon-chain/p2p/pubsub_filter.go index 2239f972bac6..8852062aa12c 100644 --- a/beacon-chain/p2p/pubsub_filter.go +++ b/beacon-chain/p2p/pubsub_filter.go @@ -78,6 +78,11 @@ func (s *Service) CanSubscribe(topic string) bool { log.WithError(err).Error("Could not determine Electra fork digest") return false } + fuluForkDigest, err := forks.ForkDigestFromEpoch(params.BeaconConfig().FuluForkEpoch, s.genesisValidatorsRoot) + if err != nil { + log.WithError(err).Error("Could not determine Fulu fork digest") + return false + } switch parts[2] { case fmt.Sprintf("%x", phase0ForkDigest): case fmt.Sprintf("%x", altairForkDigest): @@ -85,6 +90,7 @@ func (s *Service) CanSubscribe(topic string) bool { case fmt.Sprintf("%x", capellaForkDigest): case fmt.Sprintf("%x", denebForkDigest): case fmt.Sprintf("%x", electraForkDigest): + case fmt.Sprintf("%x", fuluForkDigest): default: return false } diff --git a/beacon-chain/p2p/rpc_topic_mappings.go b/beacon-chain/p2p/rpc_topic_mappings.go index cabc097f561e..1bb6b906e4e0 100644 --- a/beacon-chain/p2p/rpc_topic_mappings.go +++ b/beacon-chain/p2p/rpc_topic_mappings.go @@ -71,16 +71,16 @@ const ( // RPCBlobSidecarsByRangeTopicV1 is a topic for requesting blob sidecars // in the slot range [start_slot, start_slot + count), leading up to the current head block as selected by fork choice. - // Protocol ID: /eth2/beacon_chain/req/blob_sidecars_by_range/1/ - New in deneb. + // /eth2/beacon_chain/req/blob_sidecars_by_range/1/ - New in deneb. RPCBlobSidecarsByRangeTopicV1 = protocolPrefix + BlobSidecarsByRangeName + SchemaVersionV1 - // RPCBlobSidecarsByRootTopicV1 is a topic for requesting blob sidecars by their block root. New in deneb. - // /eth2/beacon_chain/req/blob_sidecars_by_root/1/ + // RPCBlobSidecarsByRootTopicV1 is a topic for requesting blob sidecars by their block root. + // /eth2/beacon_chain/req/blob_sidecars_by_root/1/ - New in deneb. RPCBlobSidecarsByRootTopicV1 = protocolPrefix + BlobSidecarsByRootName + SchemaVersionV1 - // RPCDataColumnSidecarsByRootTopicV1 is a topic for requesting data column sidecars by their block root. New in PeerDAS. - // /eth2/beacon_chain/req/data_column_sidecars_by_root/1 + // RPCDataColumnSidecarsByRootTopicV1 is a topic for requesting data column sidecars by their block root. + // /eth2/beacon_chain/req/data_column_sidecars_by_root/1 - New in Fulu. RPCDataColumnSidecarsByRootTopicV1 = protocolPrefix + DataColumnSidecarsByRootName + SchemaVersionV1 - // RPCDataColumnSidecarsByRangeTopicV1 is a topic for requesting data column sidecars by their slot. New in PeerDAS. - // /eth2/beacon_chain/req/data_column_sidecars_by_range/1 + // RPCDataColumnSidecarsByRangeTopicV1 is a topic for requesting data column sidecars by their slot. + // /eth2/beacon_chain/req/data_column_sidecars_by_range/1 - New in Fulu. RPCDataColumnSidecarsByRangeTopicV1 = protocolPrefix + DataColumnSidecarsByRangeName + SchemaVersionV1 // V2 RPC Topics @@ -90,9 +90,18 @@ const ( RPCBlocksByRootTopicV2 = protocolPrefix + BeaconBlocksByRootsMessageName + SchemaVersionV2 // RPCMetaDataTopicV2 defines the v2 topic for the metadata rpc method. RPCMetaDataTopicV2 = protocolPrefix + MetadataMessageName + SchemaVersionV2 + // RPCBlobSidecarsByRangeTopicV2 defines the v2 topic for the blob sidecars by range rpc method. + RPCBlobSidecarsByRangeTopicV2 = protocolPrefix + BlobSidecarsByRangeName + SchemaVersionV2 + // RPCBlobSidecarsByRootTopicV2 defines the v2 topic for the blob sidecars by root rpc method. + RPCBlobSidecarsByRootTopicV2 = protocolPrefix + BlobSidecarsByRootName + SchemaVersionV2 // V3 RPC Topics + // RPCMetaDataTopicV3 defines the v3 topic for the metadata rpc method. RPCMetaDataTopicV3 = protocolPrefix + MetadataMessageName + SchemaVersionV3 + // RPCBlobSidecarsByRangeTopicV3 defines the v3 topic for the blob sidecars by range rpc method. + RPCBlobSidecarsByRangeTopicV3 = protocolPrefix + BlobSidecarsByRangeName + SchemaVersionV3 + // RPCBlobSidecarsByRootTopicV3 defines the v3 topic for the blob sidecars by root rpc method. + RPCBlobSidecarsByRootTopicV3 = protocolPrefix + BlobSidecarsByRootName + SchemaVersionV3 ) // RPC errors for topic parsing. @@ -155,8 +164,8 @@ var altairMapping = map[string]bool{ MetadataMessageName: true, } -// Maps all the RPC messages which are to updated with peerDAS fork epoch. -var peerDASMapping = map[string]bool{ +// Maps all the RPC messages which are to updated in fulu. +var fuluMapping = map[string]bool{ MetadataMessageName: true, } @@ -305,9 +314,9 @@ func TopicFromMessage(msg string, epoch primitives.Epoch) (string, error) { version = SchemaVersionV2 } - // Check if the message is to be updated in peerDAS. - isPeerDAS := epoch >= params.BeaconConfig().ElectraForkEpoch - if isPeerDAS && peerDASMapping[msg] { + // Check if the message is to be updated in fulu. + isFulu := epoch >= params.BeaconConfig().FuluForkEpoch + if isFulu && fuluMapping[msg] { version = SchemaVersionV3 } diff --git a/beacon-chain/p2p/subnets.go b/beacon-chain/p2p/subnets.go index 40a283b9ec44..3177f334378a 100644 --- a/beacon-chain/p2p/subnets.go +++ b/beacon-chain/p2p/subnets.go @@ -574,7 +574,7 @@ func syncBitvector(record *enr.Record) (bitfield.Bitvector4, error) { } // The subnet locker is a map which keeps track of all -// mutexes stored per subnet. This locker is re-used +// mutexes stored per subnet. This locker is reused // between both the attestation, sync and blob subnets. // Sync subnets are stored by (subnet+syncLockerVal). // Blob subnets are stored by (subnet+blobSubnetLockerVal). diff --git a/beacon-chain/p2p/types/object_mapping.go b/beacon-chain/p2p/types/object_mapping.go index 4d693775ebf6..7a502f39d174 100644 --- a/beacon-chain/p2p/types/object_mapping.go +++ b/beacon-chain/p2p/types/object_mapping.go @@ -67,7 +67,12 @@ func InitializeDataMaps() { }, bytesutil.ToBytes4(params.BeaconConfig().ElectraForkVersion): func() (interfaces.ReadOnlySignedBeaconBlock, error) { return blocks.NewSignedBeaconBlock( - ðpb.SignedBeaconBlockElectra{Block: ðpb.BeaconBlockElectra{Body: ðpb.BeaconBlockBodyElectra{ExecutionPayload: &enginev1.ExecutionPayloadElectra{}}}}, + ðpb.SignedBeaconBlockElectra{Block: ðpb.BeaconBlockElectra{Body: ðpb.BeaconBlockBodyElectra{ExecutionPayload: &enginev1.ExecutionPayloadDeneb{}}}}, + ) + }, + bytesutil.ToBytes4(params.BeaconConfig().FuluForkVersion): func() (interfaces.ReadOnlySignedBeaconBlock, error) { + return blocks.NewSignedBeaconBlock( + ðpb.SignedBeaconBlockFulu{Block: ðpb.BeaconBlockFulu{Body: ðpb.BeaconBlockBodyFulu{ExecutionPayload: &enginev1.ExecutionPayloadDeneb{}}}}, ) }, } @@ -87,9 +92,12 @@ func InitializeDataMaps() { return wrapper.WrappedMetadataV1(ðpb.MetaDataV1{}), nil }, bytesutil.ToBytes4(params.BeaconConfig().DenebForkVersion): func() (metadata.Metadata, error) { - return wrapper.WrappedMetadataV2(ðpb.MetaDataV2{}), nil + return wrapper.WrappedMetadataV1(ðpb.MetaDataV1{}), nil }, bytesutil.ToBytes4(params.BeaconConfig().ElectraForkVersion): func() (metadata.Metadata, error) { + return wrapper.WrappedMetadataV1(ðpb.MetaDataV1{}), nil + }, + bytesutil.ToBytes4(params.BeaconConfig().FuluForkVersion): func() (metadata.Metadata, error) { return wrapper.WrappedMetadataV2(ðpb.MetaDataV2{}), nil }, } @@ -114,6 +122,9 @@ func InitializeDataMaps() { bytesutil.ToBytes4(params.BeaconConfig().ElectraForkVersion): func() (ethpb.Att, error) { return ðpb.AttestationElectra{}, nil }, + bytesutil.ToBytes4(params.BeaconConfig().FuluForkVersion): func() (ethpb.Att, error) { + return ðpb.AttestationElectra{}, nil + }, } // Reset our aggregate attestation map. @@ -136,5 +147,8 @@ func InitializeDataMaps() { bytesutil.ToBytes4(params.BeaconConfig().ElectraForkVersion): func() (ethpb.SignedAggregateAttAndProof, error) { return ðpb.SignedAggregateAttestationAndProofElectra{}, nil }, + bytesutil.ToBytes4(params.BeaconConfig().FuluForkVersion): func() (ethpb.SignedAggregateAttAndProof, error) { + return ðpb.SignedAggregateAttestationAndProofElectra{}, nil + }, } } diff --git a/beacon-chain/p2p/utils.go b/beacon-chain/p2p/utils.go index b1b97cedecdc..408f5ddd35cf 100644 --- a/beacon-chain/p2p/utils.go +++ b/beacon-chain/p2p/utils.go @@ -78,7 +78,7 @@ func privKey(cfg *Config) (*ecdsa.PrivateKey, error) { } // If the StaticPeerID flag is not set and if peerDAS is not enabled, return the private key. - if !(cfg.StaticPeerID || params.PeerDASEnabled()) { + if !(cfg.StaticPeerID || params.FuluEnabled()) { return ecdsaprysm.ConvertFromInterfacePrivKey(priv) } diff --git a/beacon-chain/rpc/eth/beacon/handlers.go b/beacon-chain/rpc/eth/beacon/handlers.go index 04ace1525715..c90c84daa25c 100644 --- a/beacon-chain/rpc/eth/beacon/handlers.go +++ b/beacon-chain/rpc/eth/beacon/handlers.go @@ -354,6 +354,29 @@ func (s *Server) publishBlindedBlockSSZ(ctx context.Context, w http.ResponseWrit httputil.HandleError(w, api.VersionHeader+" header is required", http.StatusBadRequest) } + fuluBlock := ð.SignedBlindedBeaconBlockFulu{} + if err = fuluBlock.UnmarshalSSZ(body); err == nil { + genericBlock := ð.GenericSignedBeaconBlock{ + Block: ð.GenericSignedBeaconBlock_BlindedFulu{ + BlindedFulu: fuluBlock, + }, + } + if err = s.validateBroadcast(ctx, r, genericBlock); err != nil { + httputil.HandleError(w, err.Error(), http.StatusBadRequest) + return + } + s.proposeBlock(ctx, w, genericBlock) + return + } + if versionHeader == version.String(version.Fulu) { + httputil.HandleError( + w, + fmt.Sprintf("Could not decode request body into %s consensus block: %v", version.String(version.Fulu), err.Error()), + http.StatusBadRequest, + ) + return + } + electraBlock := ð.SignedBlindedBeaconBlockElectra{} if err = electraBlock.UnmarshalSSZ(body); err == nil { genericBlock := ð.GenericSignedBeaconBlock{ @@ -508,6 +531,27 @@ func (s *Server) publishBlindedBlock(ctx context.Context, w http.ResponseWriter, var consensusBlock *eth.GenericSignedBeaconBlock + var fuluBlock *structs.SignedBlindedBeaconBlockFulu + if err = unmarshalStrict(body, &fuluBlock); err == nil { + consensusBlock, err = fuluBlock.ToGeneric() + if err == nil { + if err = s.validateBroadcast(ctx, r, consensusBlock); err != nil { + httputil.HandleError(w, err.Error(), http.StatusBadRequest) + return + } + s.proposeBlock(ctx, w, consensusBlock) + return + } + } + if versionHeader == version.String(version.Fulu) { + httputil.HandleError( + w, + fmt.Sprintf("Could not decode request body into %s consensus block: %v", version.String(version.Fulu), err.Error()), + http.StatusBadRequest, + ) + return + } + var electraBlock *structs.SignedBlindedBeaconBlockElectra if err = unmarshalStrict(body, &electraBlock); err == nil { consensusBlock, err = electraBlock.ToGeneric() @@ -692,6 +736,39 @@ func (s *Server) publishBlockSSZ(ctx context.Context, w http.ResponseWriter, r * return } + fuluBlock := ð.SignedBeaconBlockContentsFulu{} + if err = fuluBlock.UnmarshalSSZ(body); err == nil { + genericBlock := ð.GenericSignedBeaconBlock{ + Block: ð.GenericSignedBeaconBlock_Fulu{ + Fulu: fuluBlock, + }, + } + if err = s.validateBroadcast(ctx, r, genericBlock); err != nil { + if errors.Is(err, errEquivocatedBlock) { + b, err := blocks.NewSignedBeaconBlock(genericBlock) + if err != nil { + httputil.HandleError(w, err.Error(), http.StatusBadRequest) + return + } + if err := s.broadcastSeenBlockSidecars(ctx, b, genericBlock.GetFulu().Blobs, genericBlock.GetFulu().KzgProofs); err != nil { + log.WithError(err).Error("Failed to broadcast blob sidecars") + } + } + httputil.HandleError(w, err.Error(), http.StatusBadRequest) + return + } + s.proposeBlock(ctx, w, genericBlock) + return + } + if versionHeader == version.String(version.Fulu) { + httputil.HandleError( + w, + fmt.Sprintf("Could not decode request body into %s consensus block: %v", version.String(version.Fulu), err.Error()), + http.StatusBadRequest, + ) + return + } + electraBlock := ð.SignedBeaconBlockContentsElectra{} if err = electraBlock.UnmarshalSSZ(body); err == nil { genericBlock := ð.GenericSignedBeaconBlock{ @@ -867,6 +944,37 @@ func (s *Server) publishBlock(ctx context.Context, w http.ResponseWriter, r *htt var consensusBlock *eth.GenericSignedBeaconBlock + var fuluBlockContents *structs.SignedBeaconBlockContentsFulu + if err = unmarshalStrict(body, &fuluBlockContents); err == nil { + consensusBlock, err = fuluBlockContents.ToGeneric() + if err == nil { + if err = s.validateBroadcast(ctx, r, consensusBlock); err != nil { + if errors.Is(err, errEquivocatedBlock) { + b, err := blocks.NewSignedBeaconBlock(consensusBlock) + if err != nil { + httputil.HandleError(w, err.Error(), http.StatusBadRequest) + return + } + if err := s.broadcastSeenBlockSidecars(ctx, b, consensusBlock.GetFulu().Blobs, consensusBlock.GetFulu().KzgProofs); err != nil { + log.WithError(err).Error("Failed to broadcast blob sidecars") + } + } + httputil.HandleError(w, err.Error(), http.StatusBadRequest) + return + } + s.proposeBlock(ctx, w, consensusBlock) + return + } + } + if versionHeader == version.String(version.Fulu) { + httputil.HandleError( + w, + fmt.Sprintf("Could not decode request body into %s consensus block: %v", version.String(version.Fulu), err.Error()), + http.StatusBadRequest, + ) + return + } + var electraBlockContents *structs.SignedBeaconBlockContentsElectra if err = unmarshalStrict(body, &electraBlockContents); err == nil { consensusBlock, err = electraBlockContents.ToGeneric() @@ -1081,13 +1189,16 @@ func (s *Server) validateConsensus(ctx context.Context, b *eth.GenericSignedBeac var blobs [][]byte var proofs [][]byte - switch { - case blk.Version() == version.Electra: - blobs = b.GetElectra().Blobs - proofs = b.GetElectra().KzgProofs - case blk.Version() == version.Deneb: + switch blk.Version() { + case version.Deneb: blobs = b.GetDeneb().Blobs proofs = b.GetDeneb().KzgProofs + case version.Electra: + blobs = b.GetElectra().Blobs + proofs = b.GetElectra().KzgProofs + case version.Fulu: + blobs = b.GetFulu().Blobs + proofs = b.GetFulu().KzgProofs default: return nil } diff --git a/beacon-chain/rpc/eth/beacon/handlers_pool_test.go b/beacon-chain/rpc/eth/beacon/handlers_pool_test.go index 5ff2e5d228ae..be3f31a3883e 100644 --- a/beacon-chain/rpc/eth/beacon/handlers_pool_test.go +++ b/beacon-chain/rpc/eth/beacon/handlers_pool_test.go @@ -1991,7 +1991,7 @@ func TestSubmitAttesterSlashings(t *testing.T) { _, ok := broadcaster.BroadcastMessages[0].(*ethpbv1alpha1.AttesterSlashing) assert.Equal(t, true, ok) }) - t.Run("accross-fork", func(t *testing.T) { + t.Run("across-fork", func(t *testing.T) { attestationData1.Slot = params.BeaconConfig().SlotsPerEpoch attestationData2.Slot = params.BeaconConfig().SlotsPerEpoch slashing := ðpbv1alpha1.AttesterSlashing{ @@ -2147,7 +2147,7 @@ func TestSubmitAttesterSlashings(t *testing.T) { _, ok := broadcaster.BroadcastMessages[0].(*ethpbv1alpha1.AttesterSlashingElectra) assert.Equal(t, true, ok) }) - t.Run("accross-fork", func(t *testing.T) { + t.Run("across-fork", func(t *testing.T) { attestationData1.Slot = params.BeaconConfig().SlotsPerEpoch attestationData2.Slot = params.BeaconConfig().SlotsPerEpoch slashing := ðpbv1alpha1.AttesterSlashingElectra{ diff --git a/beacon-chain/rpc/eth/beacon/handlers_test.go b/beacon-chain/rpc/eth/beacon/handlers_test.go index 7defd71f55c9..183b26ad1d88 100644 --- a/beacon-chain/rpc/eth/beacon/handlers_test.go +++ b/beacon-chain/rpc/eth/beacon/handlers_test.go @@ -302,6 +302,38 @@ func TestGetBlockV2(t *testing.T) { require.NoError(t, err) assert.DeepEqual(t, blk, b) }) + t.Run("fulu", func(t *testing.T) { + b := util.NewBeaconBlockFulu() + b.Block.Slot = 123 + sb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + mockBlockFetcher := &testutil.MockBlocker{BlockToReturn: sb} + mockChainService := &chainMock.ChainService{ + FinalizedRoots: map[[32]byte]bool{}, + } + s := &Server{ + OptimisticModeFetcher: mockChainService, + FinalizationFetcher: mockChainService, + Blocker: mockBlockFetcher, + } + + request := httptest.NewRequest(http.MethodGet, "http://foo.example/eth/v2/beacon/blocks/{block_id}", nil) + request.SetPathValue("block_id", "head") + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + + s.GetBlockV2(writer, request) + require.Equal(t, http.StatusOK, writer.Code) + resp := &structs.GetBlockV2Response{} + require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp)) + assert.Equal(t, version.String(version.Fulu), resp.Version) + sbb := &structs.SignedBeaconBlockFulu{Message: &structs.BeaconBlockFulu{}} + require.NoError(t, json.Unmarshal(resp.Data.Message, sbb.Message)) + sbb.Signature = resp.Data.Signature + blk, err := sbb.ToConsensus() + require.NoError(t, err) + assert.DeepEqual(t, blk, b) + }) t.Run("execution optimistic", func(t *testing.T) { b := util.NewBeaconBlockBellatrix() sb, err := blocks.NewSignedBeaconBlock(b) @@ -518,6 +550,29 @@ func TestGetBlockSSZV2(t *testing.T) { require.NoError(t, err) assert.DeepEqual(t, sszExpected, writer.Body.Bytes()) }) + t.Run("fulu", func(t *testing.T) { + b := util.NewBeaconBlockFulu() + b.Block.Slot = 123 + sb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + + s := &Server{ + Blocker: &testutil.MockBlocker{BlockToReturn: sb}, + } + + request := httptest.NewRequest(http.MethodGet, "http://foo.example/eth/v2/beacon/blocks/{block_id}", nil) + request.SetPathValue("block_id", "head") + request.Header.Set("Accept", api.OctetStreamMediaType) + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + + s.GetBlockV2(writer, request) + require.Equal(t, http.StatusOK, writer.Code) + assert.Equal(t, version.String(version.Fulu), writer.Header().Get(api.VersionHeader)) + sszExpected, err := b.MarshalSSZ() + require.NoError(t, err) + assert.DeepEqual(t, sszExpected, writer.Body.Bytes()) + }) } func TestGetBlockAttestations(t *testing.T) { @@ -1035,6 +1090,35 @@ func TestGetBlindedBlock(t *testing.T) { require.NoError(t, err) assert.DeepEqual(t, blk, b) }) + t.Run("fulu", func(t *testing.T) { + b := util.NewBlindedBeaconBlockFulu() + sb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + + mockChainService := &chainMock.ChainService{} + s := &Server{ + OptimisticModeFetcher: mockChainService, + FinalizationFetcher: mockChainService, + Blocker: &testutil.MockBlocker{BlockToReturn: sb}, + } + + request := httptest.NewRequest(http.MethodGet, "http://foo.example/eth/v1/beacon/blinded_blocks/{block_id}", nil) + request.SetPathValue("block_id", "head") + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + + s.GetBlindedBlock(writer, request) + require.Equal(t, http.StatusOK, writer.Code) + resp := &structs.GetBlockV2Response{} + require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp)) + assert.Equal(t, version.String(version.Fulu), resp.Version) + sbb := &structs.SignedBlindedBeaconBlockFulu{Message: &structs.BlindedBeaconBlockFulu{}} + require.NoError(t, json.Unmarshal(resp.Data.Message, sbb.Message)) + sbb.Signature = resp.Data.Signature + blk, err := sbb.ToConsensus() + require.NoError(t, err) + assert.DeepEqual(t, blk, b) + }) t.Run("execution optimistic", func(t *testing.T) { b := util.NewBlindedBeaconBlockBellatrix() sb, err := blocks.NewSignedBeaconBlock(b) @@ -1349,11 +1433,12 @@ func TestPublishBlock(t *testing.T) { t.Run("Electra", func(t *testing.T) { v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { - block, ok := req.Block.(*eth.GenericSignedBeaconBlock_Electra) - converted, err := structs.SignedBeaconBlockContentsElectraFromConsensus(block.Electra) + // Convert back Fulu to Electra when there is at least one difference between Electra and Fulu blocks. + block, ok := req.Block.(*eth.GenericSignedBeaconBlock_Fulu) + converted, err := structs.SignedBeaconBlockContentsFuluFromConsensus(block.Fulu) require.NoError(t, err) - var signedblock *structs.SignedBeaconBlockContentsElectra - err = json.Unmarshal([]byte(rpctesting.ElectraBlockContents), &signedblock) + var signedblock *structs.SignedBeaconBlockContentsFulu + err = json.Unmarshal([]byte(rpctesting.FuluBlockContents), &signedblock) require.NoError(t, err) require.DeepEqual(t, converted, signedblock) return ok @@ -1369,6 +1454,29 @@ func TestPublishBlock(t *testing.T) { server.PublishBlock(writer, request) assert.Equal(t, http.StatusOK, writer.Code) }) + t.Run("Fulu", func(t *testing.T) { + v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) + v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { + block, ok := req.Block.(*eth.GenericSignedBeaconBlock_Fulu) + converted, err := structs.SignedBeaconBlockContentsFuluFromConsensus(block.Fulu) + require.NoError(t, err) + var signedblock *structs.SignedBeaconBlockContentsFulu + err = json.Unmarshal([]byte(rpctesting.FuluBlockContents), &signedblock) + require.NoError(t, err) + require.DeepEqual(t, converted, signedblock) + return ok + })) + server := &Server{ + V1Alpha1ValidatorServer: v1alpha1Server, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader([]byte(rpctesting.FuluBlockContents))) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + server.PublishBlock(writer, request) + assert.Equal(t, http.StatusOK, writer.Code) + }) t.Run("invalid block", func(t *testing.T) { server := &Server{ SyncChecker: &mockSync.Sync{IsSyncing: false}, @@ -1555,7 +1663,8 @@ func TestPublishBlockSSZ(t *testing.T) { t.Run("Electra", func(t *testing.T) { v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { - _, ok := req.Block.(*eth.GenericSignedBeaconBlock_Electra) + // Convert back Fulu to Electra when there is at least one difference between Electra and Fulu blocks. + _, ok := req.Block.(*eth.GenericSignedBeaconBlock_Fulu) return ok })) server := &Server{ @@ -1563,16 +1672,42 @@ func TestPublishBlockSSZ(t *testing.T) { SyncChecker: &mockSync.Sync{IsSyncing: false}, } - var blk structs.SignedBeaconBlockContentsElectra - err := json.Unmarshal([]byte(rpctesting.ElectraBlockContents), &blk) + var blk structs.SignedBeaconBlockContentsFulu + err := json.Unmarshal([]byte(rpctesting.FuluBlockContents), &blk) require.NoError(t, err) genericBlock, err := blk.ToGeneric() require.NoError(t, err) - ssz, err := genericBlock.GetElectra().MarshalSSZ() + ssz, err := genericBlock.GetFulu().MarshalSSZ() require.NoError(t, err) request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader(ssz)) request.Header.Set("Content-Type", api.OctetStreamMediaType) - request.Header.Set(api.VersionHeader, version.String(version.Electra)) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + server.PublishBlock(writer, request) + assert.Equal(t, http.StatusOK, writer.Code) + }) + t.Run("Fulu", func(t *testing.T) { + v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) + v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { + _, ok := req.Block.(*eth.GenericSignedBeaconBlock_Fulu) + return ok + })) + server := &Server{ + V1Alpha1ValidatorServer: v1alpha1Server, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + + var blk structs.SignedBeaconBlockContentsFulu + err := json.Unmarshal([]byte(rpctesting.FuluBlockContents), &blk) + require.NoError(t, err) + genericBlock, err := blk.ToGeneric() + require.NoError(t, err) + ssz, err := genericBlock.GetFulu().MarshalSSZ() + require.NoError(t, err) + request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader(ssz)) + request.Header.Set("Content-Type", api.OctetStreamMediaType) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) writer := httptest.NewRecorder() writer.Body = &bytes.Buffer{} server.PublishBlock(writer, request) @@ -1760,11 +1895,12 @@ func TestPublishBlindedBlock(t *testing.T) { t.Run("Blinded Electra", func(t *testing.T) { v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { - block, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedElectra) - converted, err := structs.BlindedBeaconBlockElectraFromConsensus(block.BlindedElectra.Message) + // Convert back Fulu to Electra when there is at least one difference between Electra and Fulu blocks. + block, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedFulu) + converted, err := structs.BlindedBeaconBlockFuluFromConsensus(block.BlindedFulu.Message) require.NoError(t, err) - var signedblock *structs.SignedBlindedBeaconBlockElectra - err = json.Unmarshal([]byte(rpctesting.BlindedElectraBlock), &signedblock) + var signedblock *structs.SignedBlindedBeaconBlockFulu + err = json.Unmarshal([]byte(rpctesting.BlindedFuluBlock), &signedblock) require.NoError(t, err) require.DeepEqual(t, converted, signedblock.Message) return ok @@ -1781,6 +1917,30 @@ func TestPublishBlindedBlock(t *testing.T) { server.PublishBlindedBlock(writer, request) assert.Equal(t, http.StatusOK, writer.Code) }) + t.Run("Blinded Fulu", func(t *testing.T) { + v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) + v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { + block, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedFulu) + converted, err := structs.BlindedBeaconBlockFuluFromConsensus(block.BlindedFulu.Message) + require.NoError(t, err) + var signedblock *structs.SignedBlindedBeaconBlockFulu + err = json.Unmarshal([]byte(rpctesting.BlindedFuluBlock), &signedblock) + require.NoError(t, err) + require.DeepEqual(t, converted, signedblock.Message) + return ok + })) + server := &Server{ + V1Alpha1ValidatorServer: v1alpha1Server, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + + request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader([]byte(rpctesting.BlindedFuluBlock))) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + server.PublishBlindedBlock(writer, request) + assert.Equal(t, http.StatusOK, writer.Code) + }) t.Run("invalid block", func(t *testing.T) { server := &Server{ SyncChecker: &mockSync.Sync{IsSyncing: false}, @@ -1968,7 +2128,8 @@ func TestPublishBlindedBlockSSZ(t *testing.T) { t.Run("Electra", func(t *testing.T) { v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { - _, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedElectra) + // Convert back Fulu to Electra when there is at least one difference between Electra and Fulu blocks. + _, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedFulu) return ok })) server := &Server{ @@ -1976,16 +2137,42 @@ func TestPublishBlindedBlockSSZ(t *testing.T) { SyncChecker: &mockSync.Sync{IsSyncing: false}, } - var blk structs.SignedBlindedBeaconBlockElectra - err := json.Unmarshal([]byte(rpctesting.BlindedElectraBlock), &blk) + var blk structs.SignedBlindedBeaconBlockFulu + err := json.Unmarshal([]byte(rpctesting.BlindedFuluBlock), &blk) require.NoError(t, err) genericBlock, err := blk.ToGeneric() require.NoError(t, err) - ssz, err := genericBlock.GetBlindedElectra().MarshalSSZ() + ssz, err := genericBlock.GetBlindedFulu().MarshalSSZ() require.NoError(t, err) request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader(ssz)) request.Header.Set("Content-Type", api.OctetStreamMediaType) - request.Header.Set(api.VersionHeader, version.String(version.Electra)) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + server.PublishBlindedBlock(writer, request) + assert.Equal(t, http.StatusOK, writer.Code) + }) + t.Run("Fulu", func(t *testing.T) { + v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) + v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { + _, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedFulu) + return ok + })) + server := &Server{ + V1Alpha1ValidatorServer: v1alpha1Server, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + + var blk structs.SignedBlindedBeaconBlockFulu + err := json.Unmarshal([]byte(rpctesting.BlindedFuluBlock), &blk) + require.NoError(t, err) + genericBlock, err := blk.ToGeneric() + require.NoError(t, err) + ssz, err := genericBlock.GetBlindedFulu().MarshalSSZ() + require.NoError(t, err) + request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader(ssz)) + request.Header.Set("Content-Type", api.OctetStreamMediaType) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) writer := httptest.NewRecorder() writer.Body = &bytes.Buffer{} server.PublishBlindedBlock(writer, request) @@ -2165,11 +2352,12 @@ func TestPublishBlockV2(t *testing.T) { t.Run("Electra", func(t *testing.T) { v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { - block, ok := req.Block.(*eth.GenericSignedBeaconBlock_Electra) - converted, err := structs.SignedBeaconBlockContentsElectraFromConsensus(block.Electra) + // Convert back Fulu to Electra when there is at least one difference between Electra and Fulu blocks. + block, ok := req.Block.(*eth.GenericSignedBeaconBlock_Fulu) + converted, err := structs.SignedBeaconBlockContentsFuluFromConsensus(block.Fulu) require.NoError(t, err) - var signedblock *structs.SignedBeaconBlockContentsElectra - err = json.Unmarshal([]byte(rpctesting.ElectraBlockContents), &signedblock) + var signedblock *structs.SignedBeaconBlockContentsFulu + err = json.Unmarshal([]byte(rpctesting.FuluBlockContents), &signedblock) require.NoError(t, err) require.DeepEqual(t, converted, signedblock) return ok @@ -2186,6 +2374,30 @@ func TestPublishBlockV2(t *testing.T) { server.PublishBlockV2(writer, request) assert.Equal(t, http.StatusOK, writer.Code) }) + t.Run("Fulu", func(t *testing.T) { + v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) + v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { + block, ok := req.Block.(*eth.GenericSignedBeaconBlock_Fulu) + converted, err := structs.SignedBeaconBlockContentsFuluFromConsensus(block.Fulu) + require.NoError(t, err) + var signedblock *structs.SignedBeaconBlockContentsFulu + err = json.Unmarshal([]byte(rpctesting.FuluBlockContents), &signedblock) + require.NoError(t, err) + require.DeepEqual(t, converted, signedblock) + return ok + })) + server := &Server{ + V1Alpha1ValidatorServer: v1alpha1Server, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + + request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader([]byte(rpctesting.FuluBlockContents))) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + server.PublishBlockV2(writer, request) + assert.Equal(t, http.StatusOK, writer.Code) + }) t.Run("invalid block", func(t *testing.T) { server := &Server{ SyncChecker: &mockSync.Sync{IsSyncing: false}, @@ -2385,7 +2597,8 @@ func TestPublishBlockV2SSZ(t *testing.T) { t.Run("Electra", func(t *testing.T) { v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { - _, ok := req.Block.(*eth.GenericSignedBeaconBlock_Electra) + // Convert back Fulu to Electra when there is at least one difference between Electra and Fulu blocks. + _, ok := req.Block.(*eth.GenericSignedBeaconBlock_Fulu) return ok })) server := &Server{ @@ -2393,16 +2606,42 @@ func TestPublishBlockV2SSZ(t *testing.T) { SyncChecker: &mockSync.Sync{IsSyncing: false}, } - var blk structs.SignedBeaconBlockContentsElectra - err := json.Unmarshal([]byte(rpctesting.ElectraBlockContents), &blk) + var blk structs.SignedBeaconBlockContentsFulu + err := json.Unmarshal([]byte(rpctesting.FuluBlockContents), &blk) require.NoError(t, err) genericBlock, err := blk.ToGeneric() require.NoError(t, err) - ssz, err := genericBlock.GetElectra().MarshalSSZ() + ssz, err := genericBlock.GetFulu().MarshalSSZ() require.NoError(t, err) request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader(ssz)) request.Header.Set("Content-Type", api.OctetStreamMediaType) - request.Header.Set(api.VersionHeader, version.String(version.Electra)) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + server.PublishBlockV2(writer, request) + assert.Equal(t, http.StatusOK, writer.Code) + }) + t.Run("Fulu", func(t *testing.T) { + v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) + v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { + _, ok := req.Block.(*eth.GenericSignedBeaconBlock_Fulu) + return ok + })) + server := &Server{ + V1Alpha1ValidatorServer: v1alpha1Server, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + + var blk structs.SignedBeaconBlockContentsFulu + err := json.Unmarshal([]byte(rpctesting.FuluBlockContents), &blk) + require.NoError(t, err) + genericBlock, err := blk.ToGeneric() + require.NoError(t, err) + ssz, err := genericBlock.GetFulu().MarshalSSZ() + require.NoError(t, err) + request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader(ssz)) + request.Header.Set("Content-Type", api.OctetStreamMediaType) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) writer := httptest.NewRecorder() writer.Body = &bytes.Buffer{} server.PublishBlockV2(writer, request) @@ -2603,11 +2842,12 @@ func TestPublishBlindedBlockV2(t *testing.T) { t.Run("Blinded Electra", func(t *testing.T) { v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { - block, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedElectra) - converted, err := structs.BlindedBeaconBlockElectraFromConsensus(block.BlindedElectra.Message) + // Convert back Fulu to Electra when there is at least one difference between Electra and Fulu blocks. + block, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedFulu) + converted, err := structs.BlindedBeaconBlockFuluFromConsensus(block.BlindedFulu.Message) require.NoError(t, err) - var signedblock *structs.SignedBlindedBeaconBlockElectra - err = json.Unmarshal([]byte(rpctesting.BlindedElectraBlock), &signedblock) + var signedblock *structs.SignedBlindedBeaconBlockFulu + err = json.Unmarshal([]byte(rpctesting.BlindedFuluBlock), &signedblock) require.NoError(t, err) require.DeepEqual(t, converted, signedblock.Message) return ok @@ -2624,6 +2864,30 @@ func TestPublishBlindedBlockV2(t *testing.T) { server.PublishBlindedBlockV2(writer, request) assert.Equal(t, http.StatusOK, writer.Code) }) + t.Run("Blinded Fulu", func(t *testing.T) { + v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) + v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { + block, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedFulu) + converted, err := structs.BlindedBeaconBlockFuluFromConsensus(block.BlindedFulu.Message) + require.NoError(t, err) + var signedblock *structs.SignedBlindedBeaconBlockFulu + err = json.Unmarshal([]byte(rpctesting.BlindedFuluBlock), &signedblock) + require.NoError(t, err) + require.DeepEqual(t, converted, signedblock.Message) + return ok + })) + server := &Server{ + V1Alpha1ValidatorServer: v1alpha1Server, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + + request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader([]byte(rpctesting.BlindedFuluBlock))) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + server.PublishBlindedBlockV2(writer, request) + assert.Equal(t, http.StatusOK, writer.Code) + }) t.Run("invalid block", func(t *testing.T) { server := &Server{ SyncChecker: &mockSync.Sync{IsSyncing: false}, @@ -2823,7 +3087,8 @@ func TestPublishBlindedBlockV2SSZ(t *testing.T) { t.Run("Electra", func(t *testing.T) { v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { - _, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedElectra) + // Convert back Fulu to Electra when there is at least one difference between Electra and Fulu blocks. + _, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedFulu) return ok })) server := &Server{ @@ -2831,16 +3096,42 @@ func TestPublishBlindedBlockV2SSZ(t *testing.T) { SyncChecker: &mockSync.Sync{IsSyncing: false}, } - var blk structs.SignedBlindedBeaconBlockElectra - err := json.Unmarshal([]byte(rpctesting.BlindedElectraBlock), &blk) + var blk structs.SignedBlindedBeaconBlockFulu + err := json.Unmarshal([]byte(rpctesting.BlindedFuluBlock), &blk) require.NoError(t, err) genericBlock, err := blk.ToGeneric() require.NoError(t, err) - ssz, err := genericBlock.GetBlindedElectra().MarshalSSZ() + ssz, err := genericBlock.GetBlindedFulu().MarshalSSZ() require.NoError(t, err) request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader(ssz)) request.Header.Set("Content-Type", api.OctetStreamMediaType) - request.Header.Set(api.VersionHeader, version.String(version.Electra)) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + server.PublishBlindedBlock(writer, request) + assert.Equal(t, http.StatusOK, writer.Code) + }) + t.Run("Fulu", func(t *testing.T) { + v1alpha1Server := mock2.NewMockBeaconNodeValidatorServer(ctrl) + v1alpha1Server.EXPECT().ProposeBeaconBlock(gomock.Any(), mock.MatchedBy(func(req *eth.GenericSignedBeaconBlock) bool { + _, ok := req.Block.(*eth.GenericSignedBeaconBlock_BlindedFulu) + return ok + })) + server := &Server{ + V1Alpha1ValidatorServer: v1alpha1Server, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + + var blk structs.SignedBlindedBeaconBlockFulu + err := json.Unmarshal([]byte(rpctesting.BlindedFuluBlock), &blk) + require.NoError(t, err) + genericBlock, err := blk.ToGeneric() + require.NoError(t, err) + ssz, err := genericBlock.GetBlindedFulu().MarshalSSZ() + require.NoError(t, err) + request := httptest.NewRequest(http.MethodPost, "http://foo.example", bytes.NewReader(ssz)) + request.Header.Set("Content-Type", api.OctetStreamMediaType) + request.Header.Set(api.VersionHeader, version.String(version.Fulu)) writer := httptest.NewRecorder() writer.Body = &bytes.Buffer{} server.PublishBlindedBlock(writer, request) diff --git a/beacon-chain/rpc/eth/config/handlers_test.go b/beacon-chain/rpc/eth/config/handlers_test.go index 579eb8f71838..8cb9e7ffd3ba 100644 --- a/beacon-chain/rpc/eth/config/handlers_test.go +++ b/beacon-chain/rpc/eth/config/handlers_test.go @@ -79,6 +79,8 @@ func TestGetSpec(t *testing.T) { config.DenebForkEpoch = 105 config.ElectraForkVersion = []byte("ElectraForkVersion") config.ElectraForkEpoch = 107 + config.FuluForkVersion = []byte("FuluForkVersion") + config.FuluForkEpoch = 109 config.BLSWithdrawalPrefixByte = byte('b') config.ETH1AddressWithdrawalPrefixByte = byte('c') config.GenesisDelay = 24 @@ -189,7 +191,7 @@ func TestGetSpec(t *testing.T) { data, ok := resp.Data.(map[string]interface{}) require.Equal(t, true, ok) - assert.Equal(t, 158, len(data)) + assert.Equal(t, 162, len(data)) for k, v := range data { t.Run(k, func(t *testing.T) { switch k { @@ -267,6 +269,10 @@ func TestGetSpec(t *testing.T) { assert.Equal(t, "0x"+hex.EncodeToString([]byte("ElectraForkVersion")), v) case "ELECTRA_FORK_EPOCH": assert.Equal(t, "107", v) + case "FULU_FORK_VERSION": + assert.Equal(t, "0x"+hex.EncodeToString([]byte("FuluForkVersion")), v) + case "FULU_FORK_EPOCH": + assert.Equal(t, "109", v) case "MIN_ANCHOR_POW_BLOCK_DIFFICULTY": assert.Equal(t, "1000", v) case "BLS_WITHDRAWAL_PREFIX": @@ -530,6 +536,10 @@ func TestGetSpec(t *testing.T) { assert.Equal(t, "6", v) case "MAX_BLOBS_PER_BLOCK_ELECTRA": assert.Equal(t, "9", v) + case "MAX_REQUEST_BLOB_SIDECARS_ELECTRA": + assert.Equal(t, "1152", v) + case "MAX_REQUEST_BLOB_SIDECARS_FULU": + assert.Equal(t, "1536", v) default: t.Errorf("Incorrect key: %s", k) } diff --git a/beacon-chain/rpc/eth/debug/handlers.go b/beacon-chain/rpc/eth/debug/handlers.go index 8f8b6b8f9601..f50acec64106 100644 --- a/beacon-chain/rpc/eth/debug/handlers.go +++ b/beacon-chain/rpc/eth/debug/handlers.go @@ -94,6 +94,12 @@ func (s *Server) getBeaconStateV2(ctx context.Context, w http.ResponseWriter, id httputil.HandleError(w, errMsgStateFromConsensus+": "+err.Error(), http.StatusInternalServerError) return } + case version.Fulu: + respSt, err = structs.BeaconStateFuluFromConsensus(st) + if err != nil { + httputil.HandleError(w, errMsgStateFromConsensus+": "+err.Error(), http.StatusInternalServerError) + return + } default: httputil.HandleError(w, "Unsupported state version", http.StatusInternalServerError) return diff --git a/beacon-chain/rpc/eth/debug/handlers_test.go b/beacon-chain/rpc/eth/debug/handlers_test.go index 007a1d9c9d61..e501247f8f6f 100644 --- a/beacon-chain/rpc/eth/debug/handlers_test.go +++ b/beacon-chain/rpc/eth/debug/handlers_test.go @@ -195,6 +195,34 @@ func TestGetBeaconStateV2(t *testing.T) { require.NoError(t, json.Unmarshal(resp.Data, st)) assert.Equal(t, "123", st.Slot) }) + t.Run("Fulu", func(t *testing.T) { + fakeState, err := util.NewBeaconStateFulu() + require.NoError(t, err) + require.NoError(t, fakeState.SetSlot(123)) + chainService := &blockchainmock.ChainService{} + s := &Server{ + Stater: &testutil.MockStater{ + BeaconState: fakeState, + }, + HeadFetcher: chainService, + OptimisticModeFetcher: chainService, + FinalizationFetcher: chainService, + } + + request := httptest.NewRequest(http.MethodGet, "http://example.com/eth/v2/debug/beacon/states/{state_id}", nil) + request.SetPathValue("state_id", "head") + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + + s.GetBeaconStateV2(writer, request) + require.Equal(t, http.StatusOK, writer.Code) + resp := &structs.GetBeaconStateV2Response{} + require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp)) + assert.Equal(t, version.String(version.Fulu), resp.Version) + st := &structs.BeaconStateElectra{} + require.NoError(t, json.Unmarshal(resp.Data, st)) + assert.Equal(t, "123", st.Slot) + }) t.Run("execution optimistic", func(t *testing.T) { parentRoot := [32]byte{'a'} blk := util.NewBeaconBlock() diff --git a/beacon-chain/rpc/eth/events/events.go b/beacon-chain/rpc/eth/events/events.go index 6caf6a9d6b6f..d8aaec6b5bcd 100644 --- a/beacon-chain/rpc/eth/events/events.go +++ b/beacon-chain/rpc/eth/events/events.go @@ -380,7 +380,7 @@ func (es *eventStreamer) writeOutbox(ctx context.Context, w *streamingResponseWr case <-ctx.Done(): return ctx.Err() case rf := <-es.outbox: - // We don't want to call Flush until we've exhausted all the writes - it's always preferrable to + // We don't want to call Flush until we've exhausted all the writes - it's always preferable to // just keep draining the outbox and rely on the underlying Write code to flush+block when it // needs to based on buffering. Whenever we fill the buffer with a string of writes, the underlying // code will flush on its own, so it's better to explicitly flush only once, after we've totally diff --git a/beacon-chain/rpc/eth/light-client/handlers_test.go b/beacon-chain/rpc/eth/light-client/handlers_test.go index d2aaa2209890..8679c25c0913 100644 --- a/beacon-chain/rpc/eth/light-client/handlers_test.go +++ b/beacon-chain/rpc/eth/light-client/handlers_test.go @@ -46,6 +46,7 @@ func TestLightClientHandler_GetLightClientBootstrap(t *testing.T) { cfg.CapellaForkEpoch = 2 cfg.DenebForkEpoch = 3 cfg.ElectraForkEpoch = 4 + cfg.FuluForkEpoch = 5 params.OverrideBeaconConfig(cfg) t.Run("altair", func(t *testing.T) { @@ -250,6 +251,47 @@ func TestLightClientHandler_GetLightClientBootstrap(t *testing.T) { require.Equal(t, hexutil.Encode(blockHeader.Header.BodyRoot), respHeader.Beacon.BodyRoot) require.Equal(t, strconv.FormatUint(uint64(blockHeader.Header.Slot), 10), respHeader.Beacon.Slot) + require.NotNil(t, resp.Data.CurrentSyncCommittee) + require.NotNil(t, resp.Data.CurrentSyncCommitteeBranch) + }) + t.Run("fulu", func(t *testing.T) { + l := util.NewTestLightClient(t).SetupTestFulu(false) // result is same for true and false + + slot := primitives.Slot(params.BeaconConfig().FuluForkEpoch * primitives.Epoch(params.BeaconConfig().SlotsPerEpoch)).Add(1) + blockRoot, err := l.Block.Block().HashTreeRoot() + require.NoError(t, err) + + mockBlocker := &testutil.MockBlocker{BlockToReturn: l.Block} + mockChainService := &mock.ChainService{Optimistic: true, Slot: &slot} + mockChainInfoFetcher := &mock.ChainService{Slot: &slot} + s := &Server{ + Stater: &testutil.MockStater{StatesBySlot: map[primitives.Slot]state.BeaconState{ + slot: l.State, + }}, + Blocker: mockBlocker, + HeadFetcher: mockChainService, + ChainInfoFetcher: mockChainInfoFetcher, + } + request := httptest.NewRequest("GET", "http://foo.com/", nil) + request.SetPathValue("block_root", hexutil.Encode(blockRoot[:])) + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + + s.GetLightClientBootstrap(writer, request) + require.Equal(t, http.StatusOK, writer.Code) + var resp structs.LightClientBootstrapResponse + err = json.Unmarshal(writer.Body.Bytes(), &resp) + require.NoError(t, err) + var respHeader structs.LightClientHeader + err = json.Unmarshal(resp.Data.Header, &respHeader) + require.NoError(t, err) + require.Equal(t, "electra", resp.Version) + + blockHeader, err := l.Block.Header() + require.NoError(t, err) + require.Equal(t, hexutil.Encode(blockHeader.Header.BodyRoot), respHeader.Beacon.BodyRoot) + require.Equal(t, strconv.FormatUint(uint64(blockHeader.Header.Slot), 10), respHeader.Beacon.Slot) + require.NotNil(t, resp.Data.CurrentSyncCommittee) require.NotNil(t, resp.Data.CurrentSyncCommitteeBranch) }) @@ -1821,7 +1863,7 @@ func createUpdate(t *testing.T, v int) (interfaces.LightClientUpdate, error) { StateRoot: sampleRoot, BodyRoot: sampleRoot, }, - Execution: &enginev1.ExecutionPayloadHeaderElectra{ + Execution: &enginev1.ExecutionPayloadHeaderDeneb{ ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), StateRoot: make([]byte, fieldparams.RootLength), @@ -1839,6 +1881,34 @@ func createUpdate(t *testing.T, v int) (interfaces.LightClientUpdate, error) { require.NoError(t, err) st, err = util.NewBeaconStateElectra() require.NoError(t, err) + case version.Fulu: + slot = primitives.Slot(config.FuluForkEpoch * primitives.Epoch(config.SlotsPerEpoch)).Add(1) + header, err = light_client.NewWrappedHeader(&pb.LightClientHeaderDeneb{ + Beacon: &pb.BeaconBlockHeader{ + Slot: 1, + ProposerIndex: primitives.ValidatorIndex(rand.Int()), + ParentRoot: sampleRoot, + StateRoot: sampleRoot, + BodyRoot: sampleRoot, + }, + Execution: &enginev1.ExecutionPayloadHeaderDeneb{ + ParentHash: make([]byte, fieldparams.RootLength), + FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, fieldparams.LogsBloomLength), + PrevRandao: make([]byte, fieldparams.RootLength), + ExtraData: make([]byte, 0), + BaseFeePerGas: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, fieldparams.RootLength), + TransactionsRoot: make([]byte, fieldparams.RootLength), + WithdrawalsRoot: make([]byte, fieldparams.RootLength), + }, + ExecutionBranch: sampleExecutionBranch, + }) + require.NoError(t, err) + st, err = util.NewBeaconStateFulu() + require.NoError(t, err) default: return nil, fmt.Errorf("unsupported version %s", version.String(v)) } diff --git a/beacon-chain/rpc/eth/shared/testing/json.go b/beacon-chain/rpc/eth/shared/testing/json.go index efff535b279d..5b70080f53a4 100644 --- a/beacon-chain/rpc/eth/shared/testing/json.go +++ b/beacon-chain/rpc/eth/shared/testing/json.go @@ -1858,6 +1858,8 @@ var BlindedElectraBlock = fmt.Sprintf(`{ "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505" }`, attestationCommitteeBits) +var BlindedFuluBlock = BlindedElectraBlock + var DenebBlockContents = fmt.Sprintf(`{ "signed_block":{ "message": { @@ -2295,3 +2297,5 @@ var ElectraBlockContents = fmt.Sprintf(`{ }`, attestationCommitteeBits, Blob) var Blob = `0xe3078ecee8c4625a862b8abab2e220be24d7bcbb6b72dbcf0a2afa6b6b5ea77afb84bfa2ec47e6fbce8f3d4fa8a46b70a1db8adaec6cb2bdd1c36cda64ecfc9128aecf2d1b73c7ffe75dbac4efb9e49a5f05bda1df6f7caad2ebcea7fe9919de9afefc6581f2b7bfeac8bcdbfbaec107fdcdaf3cbe765898c01ada724ebca0aaf356ba584aec7a9f2e44d07ae60ed29347dbe0930ee05ada11b861d24a7f1e5afbcca9eaea56e714eca0a54194e6da9e2a34dfa3d2cebe6c1c9eeed7fde1ce8af8ed66d9a63273df5240d20e0e2b3cdffcf6ae8aa1698fb2204adcdd1e79afc4a4fecc7e096edee38c9bb9980dfac02518ff88dc44b20a664dcbb34661da4df5af8f97ac41dfb7cdaec2acc91cb3bb7acceabb1db6f0cbe71fe2580ed83d056d7ebaf87e4a1dac19143d6b889782ae0c7aa65e4af3feb4c7da479a1a3b6f102cf7c1dfd26b6ee2baafc281297be1fcf5e032dbde78a67123a920bf5b6bfefdb8dd94a86b6eefde5e7f9d683acf6a0c3b1ea013a5dfdf54be6a6cb3ae262fecffeee90bff4f556bfc4e9dddffdd4756611f8facb8666637aa3dcefcf1bfca29dda307c349b0cef9f0ec40bfeb1cfd4aaa8a85570487c4f834ab12ecbbfe1bdf932abd1d484b7d9e7efdba6215d34c6201da6ed9f907a50197b5067f7cd7d01ba94b1af82efbc8e9ef5d781ff1efecececfff36fafb16957bbffad95fbafb14ccfe2a2bf570bf90a6f98fc660d80c712f13d0d630d4710eefcd27603bfb3cb1b2c1e3d6c7bcdc537d80f7eb31ed785de8b47a4119415c83b352cef30d23dad7f3c701162aa37db213da385785aacc79faa5f5f6ec4bff4cbf51e82f56ad33870ae74fdc7dd2dbd8d76ff92a8446f723a8e42c79bdfde1c6b61bdafa97a9cc25ae83a3d9b1e493f5fc5e5999fbfebe1c0879dbf4d64d14e0ca6abe8b0b7dda5b95fc65370aaded9086ab27d0e2fbdbe7eaebf0abfe0befb3aa844eec5c563275daae53daeefebf8ce92abec499becabcfdfc8dbbf60cebf00e45195dd8ba2e3bc1cfd80f1aabbcc0cd805e402addee1aaeb99d4dcef8b37d6767d96c671f1d9115fa5a69dc14603ea8db1aeee78cdccafcef8dc8e7dedc821dfd8a6ede6f15aa797dfb3f5ebb2bbff023eeddce3b3a2f4ea041aa07e513a928dbf7eed9184fb54fc12385c4e494cea1e6bf00bf6f1560edfd027f5c98bd1a4ee38a3b14e2f2ae07ebdcd663ae1aacd5b1aeba14bae9f14cbeb4bfed399e9b0285cf1efee8f2ab31dfdf33b5e3defbd6ae6ab5b18e9e19cc5a35a8b1d76f9f90ae38cb564fe386da0a586d0dde1c7c80f19a442c365aa1f1c10fdb1765f6bf21dac76aa1e8ecbc31f8909605456aa1bf5d10851cc6c6c9ecee8cce790e4fcaccaecdde7a4f5a40cc20d18de0978132cdc4e5aa53b97ac84d942dbcd23bf0c8bb3c02bc87d0f3ac518b482d87dfa411aa795aee85a5b55c3b4e136cfc43fed3dbdcf2def75309ddaf34bed3cfa1bed1ccf0b4c5b8dd14a69e3edfb5ec17a2affda52193c372cecfb1cceb8274edcc9e49576d629de561602880ebce92a68200a441bbd0c1556ccc2aeb16fcaa78db1fdd755acc6c762fecedba1f2b78e9b5bcbf494e6178b63ca8d4f40ffc7e3bd4a16dbfd7db2e4e6dfe10a47f0cd6196ca7a2f4b33efa514dee868d0a21c6dadb909aad1eeb05eb3fcc7d144b1eaabfadbe027e3cafb4e4c8d7e0d2cfbcfba535200478f33f6a04eaffdaaac1508ab6971ab84e6845a528bc91d5d9bbdd1c873589e896c300d069ffce5ceaad93e460d992ec6b1becff291aec8eed5dd9df92ff389dfecef3dedf41ddebfb7186cfaae9df2ba8eb9fb331cdfbfa5ca5040ade7cfbc6e6d9719e4626dbc66d9bc6ceb8cdf2cffff78fe2f077cfdd7320e6e2dfe44eabcbfedae887ecc8d55f7844983cf4ec54956aa6fcdb9cf0e37d9ecc77fe1f8e8cc5e568dcf5e2d83e1daea5cabf7fdd8bacc4996163a168bf28458eaaa39fecb4fae8cd0fcbdb09bc8f41fc5fe332ce455caddc4a8fa8594b5f0d0109acfadfaacacdca2c59fac1a20a414cfd9a4efeab415be18e9a18eaeeda0faceb64a2aaa58ddbbaafb29dbff8f4b52ced51bbac4ed67ccf4cb711ac14e8bf58f17d50e729bafc3be97bb4e6354f855feecb504fa2f35efb184abde5f29ee1ae2c394be8efa2cad872b624ac2de8febcc55da95aa5b3998de83dd4deb3acd3a9fa4aaac50fc6e7c15fba147f0cf0bb7c62d675559cc95e4abaedefe4e1cfeadfb71efb5deed5351c8c5f56e4b99b13de9ffe6fdb27f4e20fe325af01c8e5a949a0d9ddbbf9500506baab9b19a5fd7222dbe63cedcbbddcc6e8d66ab2b05273acb9bc04d48dae12d4fbca9ed26fdd93fa75e010dc5e388cf3d082ffe6bb3f55ac4703ec56fdd1700eef433bd601aff0f321aaf4d3cc6dff15c7c719a0e2f7fc6882c9d4b88b78f750cb7ba1ae67ccf19b61f55c3d236cd0c5dc0e9cfbe0bf903bbedb2bd9e2e88ee8ca61b3fedffb4bbeeba18a3eac0f4c087abfdcfa279e9b9672dea173ece706a1a1bb04e937d52ad3d2ed27c3be082dcca4eeac9a2adfafab1ccfb15b7ecefcbaaf6dfab4eedff1baa59be84eb1dca03d81f0c6befdeee1ef2bc4c343c1bcab0b6fa7481ae4d9db769bedbd5d94fdb41992c9cffeca918b6fbccefcec37d55a6efcc7c03cebf1180be704daf2d9bce12ab6e09acb84b8accec9d34ab83fa7281eddc2b6a3ddbca9eebbf535db14153faa7aca596c2daadef89ca3dcc8da4f96751a38235c83f6d87ab57c47e72be6d9aa410d4d7bcf9d6d563ce8cbeba7ad6827a1c71b5ce31c1ee2c80fce8ac7c9e6ec8fe5d6e1a1a81db61adaddbaae52d07db73cac7e5cbcab253ef1cc3b7494cca8beda70f6adff3c7b730ff00faa39d655fb447abe997fadcd298d9385ebcdba5cd9f97b53c0a0bdb7bddb5eecee609c8dfb12e001ce4aeada75e85e0ef8f6a1cea84bee6aaddca7876b79f1ebd639dfa3b9890fbe7d80f5cecadcf37daaaa5b6c5142f951eafd7c16c533ab826ae1ce236f7603b2bd23e6629de1dfcb17ddc52f42780eb333f04fd2149aaac49f258a0e4cbc97aae3943d8edbc646f3f4ec652a195ead95a3e1310cfa8dceddd187de4bbb369a7abae6e8d95333bee5a53e6e5ecff7b8849eace10e8cdfbf5a3e4fff70c4e638ef22c7bae4355caefa0fb7b36baca793ad5d1be0ce93ef35fec8eeb8fac83a5da4cea7ccbab2e5b1ed5acb22197b3a75eb1fcde1e3dcd0a51aaf655790e58fabdc3aadefebbaed828fdbfefa98baaabda5d5b203aca7fc5369b62364d4a57c7c3e3cd77ac0d3de428b5ce61e93c05d8f11db6e3b0adc9c1ffabaa998ca827d8d87b69fb12caf5c6b0f70c7f989044c3dc8c8baebaafe0ccacaebaaae6026e596bc92e1bd6dcdc524ab90f3ae0ff0d1d252bf37c777f3addd72dbdeb9e2a79b563110fc623bed79ade04aab96e319621e69fde576eef79cc0e6a7b292f8faadedd9fc720fcbccfb7fcec60f930e4fbee3b4a2f1a091894c5447666f15f8a2a3f2e2cff0d1630ab2e8cbce90b4ecd8eb18fe741e8abbca937b8a430afa8f1a18b2ccb966fb42fd7237b1a8ac23c085b9229c4ccd0589e7f7a636dbabb7b706afa1be145216caff4e56cbb04ed36005a65202e1fb8bf6d7d2065d2ab64fa45fdbfbda455aaa10ecf9a51fed69d784dac36833aabc47f9aa2a3e0c60d6cef59cacabde633735f5dba4d5b3aac7c8064d2a2adff84c2f9763c58cfe0c794ca5bfec7ec65e8e3930ed78bcdf8e2203b04ee8bdb69faf6ea94aea5496fcf8aadeb233da3ccd4bdeead54aeffd3f8cebf50fcaaf55ffadbae92ece813e3d83aecfcf0cfb9d16d4c9a2e7ad3f972fd69197b84e2915d8bd84d0ca98acb296da9dece7dac0b7f068e2aaaa6f1cdf8559fb57e09fdda81cb30ea8bbf58a4e6d42bd9bced5c32a0d1a834ef33d37a31e9d07febdfdfc211defa2c5d4deafcdd9efac0da96ac77f921f3f7eec06418f2c434c66cfa1242f21b247caf08bd33dc8f78ca9abbcafefbaf67ff7ae4bcb6924f1edc88761e70eba8dc2a97dc31cbde7932cffee930163f916db61bc2c793edddcaf4429857cee1be109cfbfaeadb0c49ba6c8dba6ff7a2f47c05d3c3c3bc5c434fb058a807b09b1a2e94fa9a8fa4e2fac6268665acbdcaeaf7ab05e5ec2ec0f48601150e7c7aefdbe97ddfc09eb2f1f22a50513d7dfefa60cbcd7e42dcce8bceb2feca4d0ee4143b8848df89ce121df5acda10fe45ef707aceaad6504edb2aaaf668aab4ed3f1a1bfc5f88a009c307dcc396f0e5ea51ef484fbdbccefd110fd85cafe5c78ec95b35d63d0fd9fbc4ccdee95055fb23accaa875bda9ffde534bb9dabeecaf3e90d7f5bc5dd15dffac15fd811300adfdc66573abe0869df8c3a495db6ddef7beda9d52c28f31a5afaee99c3f64ace76acd8812dce37be20d9f4cad7b56a6dfd1f0a1edab62b3eafd30aeaaa6cd02afe6bc04d3fa38ea79d5d8ecba5c04ffecfa13cde8e54ccffdd812c192fa9fdfaaadfaa2bafcc7b3debcc6d84bdcdae4b3aeda5bd0b9acbeb39fd7ebc2eff082ecde91e1eac63cfaf1d4efe94f6ad44acaf5fd3d5feaaab6ebace2cf5ced0c02bce1b933fd0aacdcc8eeee9fa60e2ad5991eac44cf86eaccdbcb5ede1bc89e346bddeaf6032197dac0ab0ce8cd1f2bbf19bcdc0eb6b098e3b62bbb3edb62a8aca92bb8d4d01aaf1fca82ea3a4efb927ac507cecb93ce14eda836cdd83bae1a4eab4cad9f6f975a56ab8ab0ada8faea40ffb9f1f4f2c6d574dc5f1e1defc5a9ab5e0deb735b49fb3b6d10fe8eb3f51f77fffffccc6a1c57b17bf10285bdac91abc9c993f403ece1b85e1df7ffcf7bddf486ea3e9ffb838dcecddb89afb85fe30874b0b8add794cf3344baf161b9baff96b08ea04ddfa7232a66e2a1decafcdeb4a26e3bbac8089c63bcc4fdf3d42ca5d6d454aebadddb7614c81f53f5eee7f6d82edb98e042afeabdedaf573de15bb0a25c48cb1cdd22e1517ffe370db7f6bb1d4eab8236ca466fede9cd3fbb88eb5e1dec8e994aef3cc80c346aafbaa25ccce5d9b5a4caceb5ea7fbf7e4d5bd16c21fb16ec7d7da21b3d7fdc31ec54be605eeb921fa6f5c998a4fc2ce1ec059c6a6faca7e10ec7dad9cccfc4c08c0dc69cae4b7aeec96e8d49becaba3f43dbfdd29a4dddf3bf0ecd2e4ea1a76f816f00c7cb12b51182420697fde6859b6a01aecbbfdb02fdc6cfcde4a6d1e98de70d5a6dbaf42f7a2ddf4d5412a8ed5f36c719bf22261d783abeec2ae6da933d04e4aace69194ad52654dc48a9bf49ab84d0a41c9dc6c6fde6647ef0e1cfe7e5cf05dc15ebd632bead5a385f6da2114faea1d88baaabb99f7adae24d3b0ecf1fc8c9d0b1fccec2d6b2ae4bfacedde489be4bca282a1a8cfafad7ff2eee628da39fcdcb34a123f66aa6cfc9efaabc3cd819d23c8abdfbab31adff1c5f7131ed6b8bbd5aec4bfbb9a2b8fce8aa7c70ceb7fa774b26dbaefa786e449aa3794f7b3558cc84b2fc2df1a2d311f9d429f4d91c2fcd9cd07c0dfd924cd5e495851ec7433353beddc94326dbadcef6e0ffde56b6351312b2a306d4f4eca6eb2bbd19980f3567c5b02ae822717adaeb90aa843bd90c6368157b2622fb1ae69baf7a1ee3dbbf9c5c295f825ddb25f1791b13a7dbd2cedbe1ceecfa0bcca3cf92b8c7f7f7ffce9e982dbe7ca9e6f4fdf3b852a1479fbfb263814ba75beebaa1af0ff4acdfbc225d4e281069acf20f03ddceada3b9ab42a92adeb72f52a0a2e2bbcca6ac35fc39e74e910fbf0dfeeafc3accbf2f4c3ff88ba31a469bec96daff2adf1232eb6fdeefa7b764793b46f291bc27669d57e5ff60ea4eb88dab8f2834c4d26b2940e60376f524b119fb9881c4ac9644fdfae5d6656d7cd25136714a94af50dffcfe9583143abe0ad3ac9ffe6b42c2a5ae2d3456e5bb9231ef6e15f0cf6ff413ec07bbacc26cbe7c8f33ddb7c1eeb407f382a44ed12cad18abbbbfb0add2bc81a078b54da80d90bdc50396a7171ee577efb9577caa460c1c8debcf669481f4bc67ca15888c94b8381cfad6beafcfac41eb7fc0a7eb521667dc80ef3fd0b10f6decd72af98dfeedbac2a7bde4b481da60bbd6e8ee09a9bfb59beee7900aefb2c89d7f0d2ef6f2706031d6e2da3dc95cde1caf4bcfc4fcba7071aecde8bf870aa67feeaf4a8caebaf7c31ee1afe69fcfa4ad66e9afd9434c0ff898a9d82ba8de1b7cfeeeadfaa0d5bf57ccdcdc3a5bcfb0ddfd14b14cd6ccaf94119ccb13c8ea02f6edf652ee0f8c8beeb496d5c1aaa5ba4aebd0eae4ba190e38bd80416ba4ace6e5ed1fee4bfd1cbcac618a3b2eaa9bcf6851c2400e2cf7ae2aa5e7dc1aa61badc0944d4aee7f2adaf7e87bd6d6abcae1ccfcfeb7ff75acfdbbdcbb5157d49b7bbba76b8aba0f4768cc0acb8c549777ed5caaa6263774fa1ceb5aab25a64a92cd0dc2e2ddb448c36c8bbcc2a5cce68ce9c17890538ccfefecdb58aefb3aeeaad745a80b8b0bf7e751c8bcee6d293ed1abafe46fec88fbaef4b28c220cb36dbb7fe01b856afa6d8b748bdbf5f13c6dbd0ac9f2fdc0bdbf8a1454cbefbf22761aaa4fb0564ab569c7f78a91ddbfcfca466e3de9a1d4c8d3b9fdf1eb352aef54bdbd03accbd8ab35cdfbde2abe80eafbf3f3e9d8c1b4deba76ddaaab8b6d486fa2b92817fdbaeb1ade398a7d6eae2349c04e8bdaca4a1410cdcb9277cbe3d414aa57f6d2bba4aef3f1c8564bae93b2b3cface3ddcf63c3dacd67bc4dbd6f9a2e09eec18723a5da60b47eaeaadaecdf4f48d6ccf9ad873cfbb3bf8a4d31abcf79ddac7f2bd8e55107e2ecea8c7fab1df7d1d5dcadcf62afff4cb7ceb32cdb6f319a55476cfeaf0d5e2301b4ccb4cf9d08ac909f42f0daff13b6f0a7b2a7eb9e0d4ff7e63819bfeb5e37d595f26abf92fdee8aa7a2ec674ee4ff9ec25e837b2e63aba21fbfc5eeaeaeef9906685b52bc4bdda5d2fd65957a0dde7c680ea5e6fb324da2fdd551ff2fbb9f911b84c5babafb7dbb032ed0b88ffb2cbd06eedbbdc9faf9fb8ce5afc19febcaeca9f99c448887b91dc55fd62768acfa81c5ecb5d1a0eeea963cd8cfa0f80dfe17c150ca0dea0c18130eeb1a88fdbd6a31123dcbcb015cfece7ed2f31f0aab6fbd2c82bf7f2c9b4e19ce613daf0e07b5bf37dcc9c3f4d09ae2fb55e212bdda94d1ead77aaf9ce4b0ff658fc1e5d69b97ae757bcbe4fcf85b984d92357b64bb21e6dd253e141be9441cdfb706cd7e7edf0d1d7a3defddb1ef27b1785a560fccb5cdbb26ad4ceaafe4bfc9471aeb2db61773f522fb5ebe17c5679bba785f7123a47b2babe2b45fbf4e1ec92c1400cb5c2d6b4b75c9cfa018bb1ad425ca1e5f1decab7dcec177450b952d84ed6d8e18a6844dc34eeaf30cdee4cbe0d4ec56c5dddf5fc36f2ba6bdbdf19a99eca8460feed3dcd9cbeb4cce7d1ed0d668ad8d86aa2d7fac046b0a51dbbdfeedacb56f0a5db7eeabcfad863e6ef1a4ce9219febff0cd9f9a5edcb5898addeec181f41faf7bc0e1c7aeb961473cc4eb8acac46b7db6c79cfbcecee17a01010697b1ca5380ce438c93fc4f0fd26cb114dadca528c32dabcbaebeb478e6cfd35dd95e67dd13dc2df6f8fdbd2d0f54edda6c73ea63cd7d9232ef760f40eb0895b14eb1d2b093f61908e5f2673d4bd7d9363aaddbea90f878fa7f9fdd6628f5e7adaec780f88e4cd4c8cd8fdea5c4cbd09caea7ebbaecae999aaec0ceffa6db6598720edb1145eb479fdacabfdfc58a8727ffd05a9515ac0dae0acdc082c1dddcbb6cba729d25f208b00bd03c7f36e44effbe6c1ca7c2b0daa46cdafad4c4d01afed1b4f2c2af6b3fcfccd33963de2e85a3ffe1cfefbc7b9dedc27fa153dabc462dad095fe800cf1e6990d03bf94deee2c0cfca5441f397c1bfbb6ffe90a13dbadaea22baf7878ee8ee6b9febcc9b95eac4a1dba1cc28a816bd1d37caff08bbffbee004b0bf200fa1c7f968fadbe49ab76fb0ebe475a7cadf943eb0cebf7df87bf9fbf8aee807d4bc9fc53d7fef5aff32f3eabfa5ddafcfeb4f4b0d9dc2e6fd50695f1fe3a0bba14cd2eb94b5d97c8bddf74e9a47208d21105e3ed92cd78afbd3ee13cbb1cfdbcda6bd8fe31ded1dd255d09cd8e9d616bfe3fc9ad2165e6d98571db8eb779d70bcdf3ab75cade3e7a4dcded77ca5a1ed77cd0b203f03755ee5fdec84f97af902ecefd2a122d0a0ea1ec267ce2be7f6bb331e632bddfcc1dc32a6ae8f5e6662afaf9f7ff430eb412c071fdce1bc8e908ee1e17bfc3e6ef1e6a77577efd302ea9bcc3b10e1ebf11eb2aa7bf663d2e8ea286daeedb1dad3115bd3edbaacfbf9deedecc28bedce2fbb19ec10df16d739b003efbadf50e94c5cb8ba8f5ae4b639b3f6bc7e7bdf416bee17d09b771bd9baea355d63c69fcb909af4d73de7b120c6dee5cfeabeeec2059fc69f06252caa9baef1c5d33bdc6334adac49dbb8f1fef2cdbf41c42f5ebcdfc54bbddf5841c8aeffb58a6f3db38f8c9ccf25d4e7f3fc89e177624c6b698d33af5eb3900efe830c94af8feacc7a2a363a58128fb9cbedf2b9b6bede41f6cdb70ff55e5bfbbae417c92fa6a84d4f30ffa83aa34796cb6ab1dffeef7df937dc490ea7c9ad34e5f70f67f1b3bfda319ca1ee65bdfd9aaa9f44b809bcbc09a4f3dc974dcdd87bd22a6acbaf0457b38d3add82be44748d7b00c9665bbf1aeef96e58e6d89f2c5d6ec3adab6a9fee16f29be5204a191bb3bfd5061fed19e5c69302be04d96e67bfffbf1dee44123fa6ad799cfd6955bceada21caafe9350e03a01704dd4f6ecd4ef9bbd35e6f3cad57c9db744dbc4ceaf5f0e5eebacc1f2d5b8ebec5d48aa39daffc9c7d1a3acaaa7d72d06c96441306bbdb81d9b951be4f1eda8f6fa1c0eacbedc71fd3d1439803ebba3b56e11ce2071ed6495a6fb69acc6dfcf1718afeabe6fbf7973f8e0acc117f220bd68fa0e7723cd4adc84eb7ba490cbed9eff0d0aeefe1a94ccf1dafdc8c65dcdadff8c1cf9ddecb9c09bada29caecdaee2cbedf8b780661ab4e696d1f69ff8cbefa9920e8cad924e8ba766bc8541cba6f7ca850d3f63e27e0ecb40bbdcb9b7cd7bfda9aa4d0efe1de4d06dac08606efc9c16accddc22aed4f2d53da35d8d241770c9b157d09216ec5e0f59edeef93c4bbf223e8b2c2c863ccc37ee2c2d07bfd964dfbfc66db44cc2a1cfbb5ba23aedca07c753b0a0cdb3be2e68c07b3546af624ad0f9d4f3d1fe0cda95c3de9db51f3aab1e90df5d1e2e30389fbf350eed613f3a1eac940bd77990975436f152abd7cdc0ae49642d0ca2958e8d8eee5a6cec4ab9d852b16a261a8af537fde21e59a970acd5d3c784efa2534056bd827df9aec046dbcc2ecccb5b0df9653ef4a7ad2c64ce3d4afcbeaf7fcfc1a8a6fef2a5afbdcd7f6dba58edc7168ef149a9bda5b2f9422deeeaace01db0eb4dc9c1fa8d5a89c3b8e92fd4c7b81e6e7df39e47617fdcebec9329d5bfd6078587b08a7d0890ac7a0f2a54b8e3e3f28f4ddbaaed0de2aaafc8f3e5e7f39ffbca28f5e1abfd9c5ffa1f7adc36a68edece08a66c1d3ecea56572b5c1abfd39709cb8decc0cddc54ff7dcb2eb93cfd7acccc5126cee21c3e4ea91cffb4e5182dee6bc11bd721dda301cf41e42d5abd8418e3e5af3df6d5acffd012faffbac88cf23d68ceafd3f0cceffd4809bcdad320211b7a032ee09e51da61d22448db0a590dfe3a97e892ebb3ab736d0aa6d6d96d6d2ad18b0fd6eae2d0ec374bad124aeb2b4a1adb0d7f3fbc740a0be9a12ef5da86ba5c3d40c9e203dc07f81a062c7acfd410a4e6bdfa19c8df1f1d8aa995679e7d493ce760edb1e8dad0c2adfcc62b0abaacbcd88ef90f5efa4e20adfe5fc7a1024b4eaf8d42e4cbd2dbbaa48e0bbd9a1761cb2e7ad119f3652da3181cb55f8ac9aff93cb8d23e361deeca4dae907acaf09dbaebcafacf4ae3ea78edfc3e1793dbcc0a8585b0352faa31c4cf60cef8483982afb0df1e7c5cbe270674c8ebcae667fea4cbd3ca8d7e112fdb96d7ff3ea3dedd909b1c28900a57a69bd5cbaccaff6bab2d8a7fbaaeda11f2ce6ff856ae51e029db6717bcadb79d73a99a56e5ef35dfc5af3af7f15f2f6fb7a91a08be9e8af979382337acab6d750638f0e9eabe5fe4820da5dce1bcbaefc3feefef2f6cbb664a5beda1bc702e7fc7c5f1fbf03236a8dab3fefbc05eababbbc97cb14bcaf7c8ba3a8de71639b9d4a9efb0f8f26dcc3bac5fc0b4497917e35eeae493ba6eb47fa1748c5e6aacd79940739fd11aaa91d9d9d3c17e1fddfe2cf1c14deae07545b71043be9ccc9deef6d4d947bc01ebb3dd9c09cafca4dea4f69f1e74bba0eda5e6c96ffc0f0b0a58bbfadff3ade7cecae0f1d419a3ad7e89e7bed01bccd3f449b0ef1fe4eb9ecb0fbdee65defaece4f1b1444842dcbaacdcffbaacb2c054aaa31f9dadd5ca22cfa367b5fae0c7fccb434c0a1ca4fa3eadd8f9ec0bccfeaeb94afb9eac9269df81cce3cef8424f8ee09afdf8bd346b9314b91ddf976cabaaff5d27ed4ffd9e4b53e63d68630d7e55afb8d6bcfc4c13bc89d2acefef68e82d5649a8cdcfd01baa129600511b3cf8ab0d94b68e98f42ffa60decb26720edaf50259afaaf4dedbe13e72e9fbea2e4943fbf777b72ac9a1caaca9eaf9267ab851dc44fa5a9add92e22ada4f0c6fcdff3eafbb842bf8d52d8cd57ee6def44b670eb46f08ad2f08fc9caeecbab6f928beb4aa4fcab5e6bcccda1e3c61aac6cd85a9b274dca9ebdafedd66dfd7bebabac13540a8cadd5c6b7c2bd0c043a625ba2d2ca6e7aa559e2aeebeedbe85b0d539679eb9df6fcc932d27984b25aaecba93f0c2c9cbed6419b56532d2e0c80ac4956da2bbe3bda939670c851a5cf55cd71b8cb810ae2d034ede81b9effaa4eab44bd0dc7c69ac96be4fa2d511fea982e6fce8aa9bb0fca304efff4c1261f2e0bc042bdbfe6299e1eeac2ba7400ebe8aecae85c5bdc24b6e102febcff721edcb2bef81f7cc1c8e2b4b4e544e2a37b081af96ef18eb6bbaa1dac3f73a53bf4aa8f68bf2f0bdbead885cfd25ac5bd53caa4ee4a433e528e8dd5eebcef375a7bcac7ddd4c4f9cfcb8f7a2aef0c5b66aeba577385e3a3ffcbf7d705cc4beaffedb0ccced0e0ccac5aef6c254f0ccc7d65ddedaa5a0d3cd7567c93f28a0e1c0af7ca738d7ab0d096dcdebbacefcc6bcc16ee1a1f224fd6a94e3b2c2d8b78f9ccccfde1edbf4fcbc065a3d08e1c19146ae556ee3e1d1b32daa5f1b4be2f80adfd06ee7ec24bd4dc8aa7cbae33bbfed50bbebe8603e474fde208cdb8bdcb93bc62c7bced97ebca1c01ac9bae23bfedc7d888b7fef3aa0c3949fcaf4b3ffea1b6e3da9defeb9ae99aafc94e97db56c704caebe845e5bdbc6faebda40fc206d48f09a339141fbbe6a38030dd52d2f0f5b9f09ddb12b8f0ecadfc545df243c028ada2a6c877f558deedabef2e4b97b3d2a36c6919bce4d8fbad0f5cb163bcabcaf6eb644665b0828d04acaba9be4c4dfdc4b59fbaa55f5d966a41884aa87f3f4af2ea27d8eca1781deeb44c32d3f5a833cfde73a9a0a75dfad0a5a2feded1bf075c0af3cb47f107f1ec347dbbbcd2e78dca630daa089c6c8eb69ce9adde2744b0dea5b3337db5abd1ddcbdffaed2fb0be24daf4714a8008189bd1c0a8e411e5b5eea346607ea60cead0289ac1bf334ac0afac94bfe762cde4aa21f2c5ff686a4a6dd9ecd8e27f00be2efe0801488cefdfc722599b1fa4ddfa94bbde8db9d5a430aee2a2bfda15fc86bcadead9679d41bff7f8fadbbcea3d9b829e8decde446f5efbfccbda815f4fbec66b3caab0bccbdd06a2aefecff4bddb2c9bf5898ae655cd4cbdd9ba9aedac7ec78b1fbffef51ec6db4ab28ae7e85b80bb7cfe586b8ec9abf6def036d78bacfabedd5aa2e1b1d9667f5aae46dadfd793a00bdeb7eeee164852064ad848761fc1bafcfaadc3c21dc7e57ee7fa844a8aa1d9ee32567cca3fd1a0e108f8f4cde3c50b6d80ddbebb493fa8d5ae324a6d229aaa8b81e7c5efb6ab3810dbbb30bfbbd6e4c3deb0c6cf8c5619c30c1dbfbac7c8925ac364e5d4f3066513912be3ad9aded8b1e73c95bffbea4bb2dcda7ebb5ce7bdbaae1d72e997ecf81f71bac1e3f6bfbaf51fddbfbcda79c02cbdfce0446efce69f72fd39ceba4af9cadadffee6cb52cb672ddfdfc0da4f46fdd6cdd0e68cc66e0a2de3f3d3afa1b70f42d49dbd3cf95f32eaeb936947f8de4a810eff41fcce901737cac73bee92db006b1735c0a0b919abea8f887322dcfed9e8ae6edde8e42e8da9a059c5eecdcad9caebffd9cbb916a21460eaf6eeb481ccc41377ffbeaeebf70833bfa2f9cc8f0dc3df4eab5eecd9d9d8ae66eacfa7c7bb2d51360ad7a7adccf7ac4401bc96a419bce85e98b0353ebe457cb6b228efb8dcfdfcceefea9d9ee485afc764af4baae67b88e8e9803bc7e6bed8c2ffcec4b210b9ac1b9a15fe6dccd63bcba0dc53e789d1b02acccb3d834b3bfd3d0cb8c80f4bf9da4ece4ff286e16c7a1d2eea31e82eedbd6fd3aae8c5031ea2914deebaefbf01fdf48d696a6ada8b13faf0bdd5126ea1bbc758bfcffd6d0fdc1fbadbcdfbbb5f7d947cbeaedfb3668ee788b631bca58c1db3c55e4de1ac571a6c1b9ce1af4d88f39c9abefba128e2ff40c48e7af841ebae6feb2eabe4fc5aef54a55fda0b94b1ad0ad9b6fc26e04a5c919cca9ba1aa5bfddc81deea0acf239164b55eccbdce674d467f2f3bebf05092daf6aac8a66dfe5efebce64e14dbbecdffdf645ae4aec2befec35f916ed9bb82b36a2ab5c1e8f266ddb1a70fef2a4bd3cf8f9e71cddc8c7be19a93ff8c6fc98a19f6a7c986d90f0d1ebc950497d8a0d6fd49dc9e6f237da1ed7cb4681b7305aeea80ffec7da2d4eed97ee8124caab90af7e0a3b0a0eaedbdc5efe5a89eeec22aedfc29ca1879e2ea813201cc7be594bfe9fdd7dabca37daf2cea9e3aa40ed2d22dd6653b63eabc5eedb2cbc6cceaeea49fadcc6aafa0837febce0d41ea4ff7befad7507a0f6afc92b8de1bcaecb3e11fc3266a60090ec342c3c0cc363d72e11a5eca95d4ef9b2badb813681af2e5bbf5aa1aa9bbbfed5dbfcee2adcec9abe161d4d6aec0ff743c7ef7d2fd95b7d27831ad863c48a0ce61ea801a7eb18e4ae454afef0d51ba55a719f0436aaaa8b26e1860ea5e4c8b11d1a258e5d4e9fc4f3c33e18b35fda7bdfddfebfe41c1ebdebd2bbedb34bffdccdecdcde6eaebc0cce76ec4a13c4a1c8ddcacd0adde2f4588aeef63f3fc33f613aa42831215cfde9c508a5cd2fee1e446cba942a19a2e8efc5adf6301aaf937301cbdaad38ab4ceac5bac7ae576f3aef98fcab97ffdf4fe81d2ffccd6bda2e28ce8e918dda98beb64fff100b1dc9a556133cac119c9ffeee4d4addeacafbbdabefe0db3cb48eb06f8d46526be73cfdd06607dfaba73a5ffaadddbf2ba23a14e6f2e2bbaf1a3bd4f5ceabcde119b7af89ed90e5c9ff88fb0a2f6f7d8eb1c3dafd3c8cfd52d7afbcbb1ce1debb84f9708eca3c37bcc14ab8b56ed62ed1a64decffffb69da0c09afacf2bbba2aaddcc0bcb51d274e8d2a5adfd367f0ba50ebdee7ecd07b4fadebd99dfbc7f1eca840a1d83b1f9b8cc6ac9f9b5f21eca2dd5cfb5af8a8b3dd9769e0ec7620f4cd23b2cd4fa0a8ec7cdfff8f451af1afa27f7fdf010a66a962f6fb015c32a6cd53ce7b35ebce4a6f6c7e868dbbbe21fa2ce8efb569d6b379bde7afb4bd6b4c5761d92ede1cbfe5af9bc42a114c21fde478d4c6d5a94edaf95efeec2d67d7f486b84f7b24eef5295eebcf3c3c1ece2cfd369cd4ccfeccb1edb04b162d899bdef35faee327ceece11b17cf3c3ec68e9dab88ffc9942efdce03bbfddd3e7421ed847d8577633c0fb8f0afd47c9b6eff791bde78c2f9bdb01d67aafbb861fae89ca2adfb51d8420db39101f16fed569a6edef3c92a4dbebf74fdc423a1dfdff13c5bcaa9a32c0dca986ca14ceb54dddaa40ea1b21d3bbf7a761aeadede77b6aba2cfb35eaadaa642edc03337c0eca213e8ae51c32ff61798378ca2ab370796daa38efa417860a740e27abce38c1ab8ce0bf0a1ab58cacd13330ff9c2fc74bf7de87b2103361c6d8dd09f5e45ce5edbbea819afbdda5f5782a1b8595feffcbf8e6cd10bdbd6a5dbcd486cbb99eab1c71bff7fadcfc78d31fba7efb15bb7f5e9e4391e4dc46fac8cecac692e97feeefbea85780dc834a8f9ddcb6a5ccc45f0ae5ee42914902d1c6916c78cf187cadd39fcba6a596e75fcd178607e3781beffacf76bf05d00cb70501fff494ebb0aa24c165e2ec8bd8fa91f8a8eac12b8e6aecfbb1418ca8713d0cfd0dc4f6ab1ab63ba39da63226cdcbac81cfca8f040dfbfdb6b1cdcf5e6a1335e56cbab72bbee3053f1f3a2bace8dfaeedc9daa6c9a2f8d77e35dcbd1fc29b61acfefba3dbce54cfc82ab881d6be35ac2bf5326fa6fefb2dbed80648e1b16bc0de51964f9bf5531c21aff09edca821fda33ba2c4ef179c87ace0b0b09bbabdf3f7e2d387e45a1cddf1a0f3853281f39b5cdde67a4eabbe6e38b800bca1faa8a3d545fdec553d62e57c0c3002f7b9c217edbbc4e6bb1f8bfea56c7ded8a7c981cfc4d6f9af03beaf5ddde4bff386ed5bb7eaa4218449bf3e5df2808b3a1dcaa8afaa3abe48b48b4044e1ed4c3c6cc5b1cfec50c5a22ba9dacd81140b6d374bdae09fff4aeaa0fcc7bd2b4b70bcbbf0dde3deaa4fc14bd17bfe0f5fdebe98a1e80d3c1a9ead8ac151fa8213269c3e67ebcfc6b115cfcdda44ad84ba9ecdab619f2831e4efdfacdc896aebf05fc5c4876c9bbbdd2eb61c2a502ca61eacb4d9a1a8ecf5fe6d4bd977cbccd91c97a7f4106d00dd1b4ed002477082722b26ab8a5caf316179422dda0c4af52efd6bd0ae9adf8f270432fde70ae5340a8d8022ed8f2bc5da7a7db667e85ddb2bf0dda0cdee42c8a91f6174e8f0dc9eb5d451fe5fd3b8aecf332cb204abb7afd90a150fe535d8ef4eb42b6fcee66a6e7a9e39d8e0b69ae8d4103ca6a3c2ae6cc28ffc5c4f1f40dafeedba0ca8f2daa8b7ca5e3da2c4dfb6fc44ca4a02dabff72acef98b1d031fb2c9ee421e722c064cec61bd92a4edc3b5d0e55d926a33dab2abce3fd31ed1c2009bb4b443c3753ca11edfaa4aa906fafe3c07ba12fa11fb44e3aabe131f7c95fdc3e20e27fbacbe3fbabfc1ac3a62d3e3d75b5bc8ff30001ecd3d23c80c3b4bb048d7e228ae10a7fcdaf9c3a4736cdd7bc57b2a612b7ec5e8d12b50abc4b2fd4ba8ba20b55cba48beecc0a6c8cd944202483faa9ac2605035bfb1fab98208d2a1908dcc3ce72d0d9c04ca6a8ce27cb0273e29bcf0cc4cf2ae79ff78ce64f6a4a047d788fac0fcf79406cbec24e7ad82b9bfed0d10119be2c23a1a9c02cc05591c99af789fcfc92be2eaf98faabaa058fda500afcab232600b3dacf1f17fcc45aff670b1deecfe9babb0552d46252d7edc794bbb0331d51fbc25e6a1a921b893baaae6575ae24d82cd527739feea0dfcf26ae9a4ed6644ac60f6108c7eb961c3acc5d007c0e2a0141b2da5b8f4e85fec3e2b7f275f47bf417e4bc5bbadd7632faeba32a0e481d7b8fed3ab9711cdd4c7dbdc716ffdb3af7a3e05ccc83564ca1fe5affdbf51a20fa7be4b85c8d9929d24bbfbe897cd67b1bf1fefbd9c7cbdbdf0a32fada822b7647a1c1510635cac979edf333164bfa2e7bc18e9eafcdaaabea4b95acc648eff2ffe45d352cf02a5a2e40cd2d2db5abb73e18fe16e4cf47c1b222dbb0848d5a5d12eff5bdf1aa52bff9f8aefaaff6ddaaceddac79bfd5eee7f2b18de2ad3deae8bb2245430ea2181fd49ee8419bda96eed1bcba93d30dde6b54ccaaa1c45de7cbcdbb977bad9fa42fda02ffe6c7aee7df14721b12a1eacb13dab90e18ceede8cc9ff6be49fd0e011ce467a5b5c9a49cc8f705fec8fd0284cad1ee1f1df34e8fb3e28de0631c6e7558a538af8eab7ad63b5e2bf009b73ac226c10a979b0d4ff47ccb71995523fd5cfe5bd96e94ec27a3da8dd8ccbea91fe5e8d4e8c9cbac75d01af11b8da4cfbcdd0fcbc515a4adfacbd2d6eefe7bde46f45892add4eccf8db4ac18bb6eeee7afb3ed5cd1b3c297ef34ba6b6ac8b1d1f117d56e2bb76c5b31f25ac0d4a0ddd46ac6dda8a5b8064ba1ca4cbeac1168f3a2a357bffe7eab9fdae7c3ca749cadbfdc8c965cd009f6ba3b6debaa4f16dfc006a4a76928affea2781cb2db7efcfadfabaee5b0f1596eaadc725fbe855d7069a5da0cf2c5b483f1ba4de1eb1fac7fda2dc70d84f17d47afa07968ab3b81dee22ecc0475ad7a061ac7193adea1a7df97eb28bba3d2342d6c3b4d0b3b0ad4c9afbb3dfc1850dd33ba6633ac5b8c34cfdf3dc317b77d02bdfdfa6e97d7fa184eaedb1948d62ab8cc35a1854499afd9161febd4a9b2f8cfec3ff9ad7f6faefa2ce65110d12cefaab7c462ba19d15a0acba85d4a9c79b1946fead2a580badd7dd0b00294a16cb2a4cde1e9f929796ba8333c45bfc2345b09bb0f4babc4dda29d971581da4ece8fa13962d9ffe9cefdfc5c8f3f62aabffe2cce9b1cc5cdf36defd055f5304bdce62bcf851a38209dbaf7ddaa07e4f4d0f445039fe8fff6ef6d1ae7ca48c62aaaad39afc9ddf6828b7428c684fe1b73465ebea95fed8d5ebd2dc7feafcde2b9ccd3e19bf5de98151efd60b93edfd1556dd7af3857bfc59bc37d029b2bea8a4a5a5efc0ddec401be106a5c9fd3abbafdb3ceb99c2b7b927212ec485d02e4af566a283cc5e7ac1b0a09cdea6e16edcd9be6f906d8e2e5ea5ed96d62eef84b5c95a710fea34b9bb693247bd5c27cded11e7bebcbdafd896a0ffc8cabb3ae8ccbbcbcd2f6c329e1df8fb7b7dcfbabd1daccf8a82dfecf707fb8d191ada048bb0fe7c8d90842e9d9eca1ed23aebfa812a7a89d51cd766cd6df8ecca7dc4dee178cb7de6e8efaafceaa77efcbec0b879de2ff56ecbfccbadad72d6d0dfa8eac1faf7bebb40d69bc47c4aed2e7aad7252a1ebff0eacf0b62718b605c9be9fabd0056086be5eebfdce5f6576f179deadda96dd8ae9fcb0dd5a80eed8bbbe2a07c5fd5a8e3ff6a0e4fa3bc285dba5cca3bd9bb84eebf3dff4e595fdaca57d97fae65b5e55f6dcf099ab33d5e6a57c43e9fb9dd5effef6fdf01e3e5d94d1a65dd64913fbf079ca4bfcff0fd7db64962911c9a0c9cf62a28fbe2b140f31c76bd85ab3d41b1d8f01c450dd4aaa39dd9cdb7dc0abe01e04eba3adbc43433cdbdcb9f1c0ce46aace9a2fdbc523f2c6ea7cdaa3dc475212adff2d3be0fcbec0e85ec41c1fae7a3accc6bce52e0d204f1622d94b37bafad7ddfe295bbd97ebf07ecc72f03b8aad80d709c72ac654fc4ba9f261dce83e4ec9fdd6a7eaecb4e2b64ccabd65a675c2ebaafea829fdbabcef881b1b2b0aeee16cbc722feb951dfecfc1da8f989fc5f14a829e2ed1fb1f21f8cb7d69031cfdc4d7a35c6fcf3f2fb4bbe5acedbaf5a701ad61b0c1662b3226b0ed7cd30228da85aec8dc096dab9dbfc9e39ef6016c75b328b50d032df87ebd8cda9cccb1e9f32d6bcdbecf2d8a679bc4b5c35bab3ebdbb9e86c133b8b185eb1fb3cafd20f558c8f27c15c6eb1f1fa7b2575b1fd3dd806c868d36bbba850065c18ee891bea9563dddfcba58dcbfbe3c4a86d9a4dfee92c7f1ba98fe1ea03c9deef2f5e2a95d740a00b525797b713bc05108293a1f55cb2adccd1cb375b7b50e5d8a5953fc3c7e0376cb36dffef0b1ab2cef57f6ca7f4db4d52eceedcdc1acc21c7da9efe2d79b7ebeb5abaeeaadbfba22dfdfdfc0d591cbcaeee480dfcaecfbc778c7ba8eb7faaf2fb067cf4c5a18ec51ec03aead9bd5ea20eedc6b062c2e7a8907d9cbc5a8a9cacd1aace7ecf255bad409d68b36564cf9bcf0ad0ce0be94d6bb6ead25cfcbcbe3d8711d6abac37d31fe20ec729ce20e6a54967b4d5d5c9739ca2ff7fd790eabd9ff4ce7df4ee4cded3ebcdcbbb9f2bbbc8bbdcf1b5df67e701059daecf8c4fedd0e63faed4bcbf0957e4b2f7f647efe79a5f7c6bab4b3a4f8af226dcbe4c37b37fbceb7fb4ace8d2adc4b6643a626cef76efbc653c4bd65dccdcbaac41dd48ae7aaeacddbcacf7d48e3b634bdbdbbcbccae8603becfd012c6e69dd63a9dea68c0389f91c0c4d8b2a05b9be57bb64d4ed7d5d6aae37b3aed5ab651e28b8dba7d3de68dcd7ae271fefd67b7632efbadcd73bdaaac3f93d913af2bf32791de8dee44c5cc2c863f1e5c7cafda2f1a9c9abeffd84fe0cb7fdd3af4512aaff9659e9d363caaf369ccaa98345f697c9fe650400a1e4538ccd1410d48d41a8178ad4a832f0c1f8cd1a41ef8110a5cee4a7045402a550bedc1df41d782fcbe562bf6ecfa163e97f34f712cfa9de08e831f3a7b6e888defb660081f47b1d7be4e9b2ff3e9ab9909e1acea7960c1fda0e295cf62acdf9adb02aef138bb0a0a998bfb61cf1611563d3a97e8bf9085dfaf8d84d86a81e89080d8ee6b6d6768bfde0aa9c7ceefc2accadc3eea5427bc276ab7edcaf6abd194f4cca9e57d20a748db2d8376ba30ce6daf0f1abcfa2cc3057532aefec0c78ec3dee2abaee5ff810fcbe701efc7cbe4dae6cdebba97bceb6a5f8e520f9e10bbefa5a9c1bff02802ed84faacde02aa0cdf926c314faed12ec9af1feacc3a59ccdab6d1cbc5edb78abcffebd7fa13fcc2caa959cc9c1adffd5c5dabfebafcfb6ef546d30077a5bcb0bad2b693e5b3152dd73ed9afc6bbc72faf63fe2fd39eff1ded9e5caefe2635707b03efe2eabc9bd8e5605faeaa2e9ef5dba2a2b659d2fbb0b8b4174fb22add0395b7f3b4a73b7e4d21ed6235a49f520790cc297f3cfb56abf19ffaea3f615ea11a086887f6bbf2d4fc2a4094cf9bcf5ecb1a35bb2f3055860ffefe9fcccc5bc6c4cfad10caaeda5fe85cfabd4ce66d3ab5c372243a6ab21ebcba9bb9ebab2cb86a7a4bf2ca0c82c05c0ed1bde4ee4f05812bf196870fe8d3ea0c417fd3973497dcbaccf1d661e0e8f05088837ba53fe54e1faa3e5bcc0ae5c6da613d3db3234eae6c90adbdfb9ffe56af0ad28cff7fbadadc7d7f589fa352ae18aab65f6cda97c5dba343c7cce4ce5be7c522c9b3fcce6ad10e04f95e2dcbf12bcdc292bdfcc6deda65c7cfea0112dfb2caaf8d54ee5ca4b5484db99ad7e71dee8d08b4fabbd14abc1a3f03541dde9f94efeaa6e1dfd90170cccacb69be7af2a7dbf86320ff5ab9ef5dd660ccaa9f261f96ca5f5e0e44f00b1fdb3083fc3aae6af65bcb71f3939b73a155aff8e2cfc7ebc02afa3fcf5965f3ba9f5ff3fcf7fcf2cf0e46b33cb0edbbf41cd6a94fddf3ba4be8bebca9b0efacbb8f2c5f59ca35befacc3f1b300da18b15abc9ef311b7c9b87cffc375072020525bb36bfbbefccf386fcc1b5feebd93cc713e544a9f3cc2005e5d4af971fba9b9ae1b74de70bf0cdedae5d6d22a825cd91bc63d2fafe5fb69ef9d3db9f412bd7f08adb5dc70ca56ce0ab6fd3fb2eea9c4b5b7d27cac3b8b4121a73e5eaf8f9eb5bef51eb7ddc87e19bfffadd87abadac2dea99ff0e6ca8af1db7ef0c048ce9f924fdb1def9f1bcea7e2deac0771cc0ccd7bfea3b3ea2fb98f03a4cdee954c6ee08acc033f5e08ba46f87eeb56f3c7349bff3e0cc7e54feb647beb4855713499bdffa2bfe4c6efaa1d6daf64dcb9e0495bb4b9fb0cf302ffe0ef92073cab9966bbfb7cbbabd95b5481e9d6d88b11d2efd3a25daaed08bc1cbfaceedca023ba7ffb102ffabdf878ee0fdcdecfa6ecaade06c29ae06036edde24a56ae1a28f22eda51b89ad6fdebf82f7075bbb5feae7bfc6a86e43fd974c5df6b07d5baae561f45fce35dd7bd8a308fefffb835ecb6d2044abd0f8ff3ba5dc80ffa45f26caecc2dff41ed0baf03f8325feace5b8cbaaed74c08386d14d77fc7eebe2a766b4c127c9ba412b6d6bae130a921cd3a2d9ec91fba1b4dcf24a82aeeb6a5cf479ccf46e75fa0ab514c4bef38fab6fd5f27a2ecbcefb9c87eaef2cd7cd01cfed9a72ed25a2eacfbed86e169d035b27cdadcce66e8cccbda1b83b5ab563f9b4a7adabede6bf5e92ed55d3eedc2a5ec3d4030a01cf0fff49c1bfcb9b5ba6013fec63ad2fcc18a8696ea7bbe9fcca8e18577b3bf4db546b2b039b416a13fc001ddcb19fbae5ccc4d6fec27f1f4cc1d77b271cbe5cbf5f0df595c1b12ca36ebbea3ad14dabb21368fa7a498fb9f2fdeaa5a4ae02ee34f0e292d8083dd00c22fedda603d05db8d291937fab444f9a5d2be0a8fc56cdf6daeea66d3fbb3a579a319f27ded0e7737c7c2f4e6fa8cce67119e9c03da176628f857ed0d7d5b09391b9be2fbcda45eb8bdefbbfcaab719a6babcbee8f7c13ad0e9d799ea514bacaecb37dfcfe0282b90ad90d4f85c8f5c2fc3ddee3f25aeeb74ad6abff8ef94073fa973f52e56c1fece3c9d7f32d2c30c31be3edd3a7a79ddbe0ee8eaf7fdcdef50d784c60ee115fa6bce8f6d3b0bf6a305e7df9406b6302538b55369bb900426dee2447ce9b00e9ba37ca91cc76f5d6a347edc82e11f348dfa971c5ad5bfc159f66e1b3abf03fc8c80b1ca7c173e87fa7ec1b5e32aebee07e0e817ddd6374dfcca4840ecf88c0acad4c25d3d35e3758eae98e386e3abc9fba3a46d4d094ed59ba9f75b9653d6bdacfffb2d394cecdb17e4e406592d33dfcaecce9af75bd9d4c674b9a7f2c4f9cdd6e67bcc1809fbde7fbcf40aeabfb853681b6332bbbfdce4c25f629ae2efa2376c3acedc0ebdd4cb03bdca881f64bee8c42eb9afa9b1e3bff67fa0d24fbf11fe0da152ab6befa4e3380f85b2ac4d0b6d1fbaa0f52b8feb4e41508a8892cf2e774d8cbcfa84931e7612e8bf1af167b627e9ada0d9d540bebb424b36bffffb9164ede7d19b28b46ace227d8d23a7e385d97dbd8e954dfdbbe046dc1735a3d946fcebaec41e977d3f8d4d996ca53fe588ecf7bd2fa7cbb5fdec788a4c0110feb67fea5befdd50c51eef50bd1ee84171671e49eefce10cd4fb38433a1167b8c60e3a503c50e2dd7ad2d0c8aaebef67b24f0f0e7d4cd8e3c9c25a25a82885f4aaebc4dd66cddcc36c6cd5b23147fa329af28fe9c8c974998ec4cd2abea72bbeafc8cabaa70db7e99dc3a28c7bfad2fdc4dcccee7fa8fff5dadfb31effc6a96ddcb60b4bfc0cc1fe96c3bef3dffd9a697e25ecadcbf9ea014ebdacaaed69b9a6bfaac043afac6d13cd11a0d2dfe36cdcc3569cd3d467bfc13edb4ccecf2fac8a2d81defba0629d767ce1e33f54de8ea17a2813b6e868fc9bddccca808cf101ed41c7a3b3fb05bbc0292fd6bacf031dda14cbb67ebd9fab292fddceffcafee49acbafb0d1d854b2ef5c9ad0ca5c57c3fac1cd7281affdb73e6418ba25efc3c8c721cacb0ad550fad8add55a2177bf536a0aab1cede6d36bd883da9db1c7adcbae540ebe9e7400b5e51f2eefec6fde68696d3d92b3eddeaf3b9d7aa5e2ee2bc1adf4c3746aac7f8ca6ed9dada76dcb5adca6e5dbc10eab4ad2eb4d903ce5d9adbaafb0bf554b27e54a8b2bdfa60090bc0238ea7c7d753341deedd4baecbb5accadc22dca9dad4fef3bec07c68192ad13f3f194d56c222e39b411b31ac4fcf7c0d8153d0c53ee857d93ec0e078e13754be6b7e9ff0ed966d0f1fc9bc63419d1cdfb0ab1a2f9f2ba13fe2ff71d8307b77fdb202fcb2bb6e4e3dafb8bd9e9de20be2decadf80294c5ec2e3e77ecce0a4ac9bd3dcd5a87a622e53b6a7cccddecad43acebdcbd4ad656d62ca7710a3a29e9430b09c9d5c7f437c41a3b486deeffbc7cfbf2bac16e7db5caaccc497f0c09d7b2f9c51ecacdfedddedda7f6eee0de4dc11afca8bffbd53371efccaff77e4aad9fab7fec58ddff6c4aba6ea214fadc6ced4e1047daaff4ab89a8f0aba4e6ea0f6b011023a5e53ef9e76c5f2f566ddfe4e2d62e1cf08e63baab61d9b5dea8c8d2ce3e18c2c3317d824a2a9cfb3c431d56e258dfafda81ee67a07ad80fb9af6916abece6d5c74fdcf2b8d10a61ab0c4eae03906fa610abc78a73adb7ea3cbfca035c00b64cd566d0367e5d85c05b1396fbb9adcb4fd81ae4197c9edd9c5b5cb6deac9afd6dab08decbed7ebdb03198ed234135338acd667db3e9d1e4403c0378136e21c81c0fbcf673f2851fcada0f128ad64c58ce8eb8dc713cb24ff1adbec4adbd40da2f5ebdcff4e1aeda7eede191d7fdeccdcce891ba3dc858be6a4cb22f3b9c09cbc4e28dde7c3d925fc5d31569b5a9c6ae85c41a8118daededce4b9a434ced2a311edb5955247c03b5f9be40d356ac0eda45588c8e027a1c4c1fe2f0f6beddafcaf3eab5e4faaa1a59fdacc0aefccafccbb03ca30eee36f220bbfadaaeed3cd5a8dc7b3f087e95de1d97f2efdb2dceaa0e6e02f689eed90a5abb8c934dad44f85123c21a1abd4e011f4dfd55839cceaa788419621fc082862501fddef8c54ffbdfea7b3d61b37e7dd9e7a18ad058e9edada1d8c0e8eeeae84ea6e938cfae4d7bcff42ce19b49badda1b45adcc80a73e0c38bc6cbe6bccf7aeeb65fe3ca8be8e7d8d84caceb27cbab4f1baccf5bf16fe0ca0a1b46ddbcebcdfb658ca9f92da4fc3cff201dca83ba3c971dc37bab15f44cf17ad7c4f0b72ba46bb169c1d8fdfd4f2f9e8c109d0dc14d29f39be60bfeacfa2fa473cd7c172afcddabb66cf089bccfefadef7c4e82a3f38db87ac7cad29bbb3bd02a0f57ddcac0c9b3bd80ba365bf976e08acbe3c5d8bfbdd320809b64dded39ac298a961e725fe5b13d8f496edcf6ab30e9fd4f94bfd97baf0fae02f81dba840efddd7d63fba91c7d7b6ac222ebeafd3ad1fbe6de5cfae0d1d08ac7b5fe435e5af9faa91c5d6b519cf3ad6bccad1cbb83ea52efc1d4fadcd1d906fdebcb35dd0df07ceabfd2e210a5bf60ad9c91cb9b18fc76a977bf4c9e2feacbe1c8fa98bfacaff4df61edeb9e1ebae3b3bf8d6dea5e9dc207bdf3f0e34ceeab41bbe00a7a3d56a5fff4feeb95b0effdbe4a8eb49c58b4ddcb0fbda2c4aaed35b066a44da5bfb7bd89bb70be33c6acac2bb1f65dcb3afc9da6bfbdacf7c8aef0d72fb900d4a6a0acd1c47393dafca1c5144f3bbebf6b228ee9e8ebd00e6e6c8af50fab33d0eaa7a60ed18507ed45ea88977461bdd8aa40faa889eab556dab7dedead49eac93cb50c89d7a6a97fcd4a17c5feb8ae6a42dcacde3305df43ab2e58c477baedd75d03bb2ccbc4d7edbfebbe3a3ead2ca4f3cfc850fcdfa2e84efc1e60c216abfeccb31a7dabc47ca6fbabb6f9ce559e7faf8bd9cebb88f0f296efcd6bd7bf0ddbbc9db9d8642abefa798b8e9988b9caa901f2d663acdcdb00efbe513cb9ab450bb50606efa1ea7ad21f3ad83cfdd0f2a6a271196a4642f712beb8be8bcebfb33d9ba8d133edbb9a5cbf92cce8a51fc8aefabbf47d2be91f5fdcdce76c6891fcf04d7fadfc9e709ac4cb6b7ff56529353bdd0fef1a150ff5d19b0db4d1a98a0be429c94fbf7ecc1a7ff0fffbb52bf9fffd7bfe7c1f7cd2c8f2e57063ebd7ebaed6b81d827dd3cdbe8a5e8805e44a3288301aebc83a555ac927be2fccceae74174a64467f4eaa91d2ac4fffa51d7ee4788a8fd6a10e8dc1b6e15b596a0476f449f9facc70ecec125aadca109ab8f66dbcdd7e856f3abdfcdd944edaa4bdd8fefe1ab5ecb6bb79fdeca5cf5190ba8da051ccba46ffddb7ff4ae695fefff8f8d2d0ec63b88e78ea7aebfbfef1fc5969df08700d0868175e27deeb270bbb1ab8fb6167fc32fadc5fb2b8ed3d0fd395e98afc81fdebe81bee01cb2ca385eca0d8f3afc5aacaefc9c1efbabdcecdc9ac3b62d893faef266de1edfe852b6da0ff6fa056e449dbdbfb3fb76fcd3c5c57eb2a26d79b1c5bfa6a39ed6bd8d975d534652e0dda60ddefaaadf0ea79f176ce0cef8aeffceb3d98cd51c8b9acc93cfa1fbe76db28ab6119f2d79bba1cc36010c1eda9549d2ab855d8ce1a9fa5e0faefb9eb408a7fec6176780b2d2e99450cc8dec1baddbaf9e2ef2a3ca4800de52dede2beaca2feccae663ecabffdd7cee1d5da5eeeada912d334a7ea3bc043c5cedecaaabfefedb0cd9a340a1e9c58d615b5a864ab3d0934b711ced0ebeb584163a48bca7f46aa8afd2480b5f8da39576facc9862e8716c20d43a5a8e92a13fc77b1ccadd2cfec6ee6a0388cbbaec6268dc11efff37ca3cffae90079fdfdd88bbe1bcd48e91577cfdec0512f8de4cd0ca5c3ce4ff56bb0ef9bdec88ab9e5cea18bcbcbb4bb4ffdf5e5a8da8fbfbb9eafb071da26feee46de7f6904236a13ceb796e66cf8ffb7e8b4fcba25b880e36db866ec709edbc84ff1288b0511e1bca2d078b8cf503877faad92f3ca02deab06a5cae0143b9b42d50b4af6b0d6f405bddea0035aba1614aa479eb810d8caceabaefbac2f769bf175ee4e9ab5f16d98d7d85c88d954e8d8810cbd13f3bbceef9b19bda0fbd9ca6be328fc2dd64bbe08922af37c32771fb83a628a1ae545ff8a4fa4b6f54bbbee5e612da18bdf21b1a5262f40d65fdb64ceb7e7cc4fef673ee3dfafe449d7355ac964148e61b08eb3ab71583b46fadbf48d8f0f4a9fd3b46a67ccffacfcbf7ee4aee9eae0dec3cd0fe7c7f8ddea140e9dfa86bddf39c5817cff6b3ddc2627c4df3dd83bce9bbd5d7880e99cb14cbbc079a2bc9e4eccdafb42c69315a8caa88055b691beabd2eaafadb9b8cf2cb240fb86be24d3de9f3df8fc7dd07e05bee2bed6eb757aff630464f604b0cf9a5d5db1e1bd7fb5bea897ba66809b7e2f4623f2d5a5df430b8aa3d23ee3514ba174bc95a0e343574fe5f4b11fb3f33d7443f1673e41180ad2bdbfdafefb3c9fbe232d9a6f16ca683c26203c5ed92aaf15b86eb1fdc2fbf84bde56e27ebddbf510aebf1cdd8be8caa9dff19ff72fd8ee7d3a8987efee2efcaf0cd80fbbb7cc3a2dad59b7bac6eccad7c1cbaefbfb9362141bbba8fbc2019ac6c5c6a6ccecff8acc359ea30d63f94c2bee5ca1450e47e0dcfeef526d6ecce580fca2bce9ecc755681de6748c50fa95b19531f1194b5c0ee1cdbb2afc6e604e5a03a910d7416c49c4d6eb128efcf2ac9ef4d015dedf044e54dfef007b5bfa1788c879410acbfd92e825dcab1e6a5acc0adacbcff1fd7b09cbc8f8ee3306559141ced65b913c9fea2d08c9da626dc1d4dd3edb8aa98eea527a5fc3ff936bfaf13cf289a5e3571f63fe75afabec6d1ad8e1d9133a0bcfc39f8b01ec281fca06ab61b23aeddbac5db8e4c51f6bbc7cef39bd0cedff0f2eb5cf244c00c6b80ff4f0ccf38e3e656ebbace5d0c4bde46c7f37b3b8ddf369ddcd4d8ead41d7dded53f803f25a1d84c925c25adcbdf78c25a6ef7e48bec7bbdeb2f5bfa6f8cee7d87d4383d161b1eabfac5e7cdcaf5ff92bbe37dff9f2bd0a6cc12b24343cdf3ea9f2c3f82fbe2bb18d31b997deeff386bec7ac727e9e9ff89dafacac4729cb6bb71878d639448cab52523bf81f0cdcd0d7af29df2deb5cbcbb44d1f6ca70eea7f32fe08a56d5dee46ecded5c03c61bdcc7cedc0ef0cbce142fde4998c4ef1414d0d8e3a913f0074c1ed73b1aa567f2ccba7da2bfec01ac8d9edba948962adcaf43205afddfb552bc0dfca42dbcbe676852da4daca619efbca48f298edeee8027ff58df6f3bb7f9fa5e9c8de688bcd31d7b77a978dacf5e31e8eca5e0cd2cbdc3df95d3ecde870ffcc7445bb3ee6f29bf4db19f65096fee9ac8ea4d1de50eb6ef15bfc01cceaad0064f656ef4c068a19a712dfcb64dcdde3442becb74475199d848af790c83c4dc45bfed3ec9c83cbb923ecef71c91c7dfbcbaf34daada3f9eacd322cfefc05c8000380c334c099aceec523dd8bd6bf6ce3105fdfcd7af9dedc50a8e7e1d10e0ff2f4a4f00ef8eb94fc35ed0cb9cdb3957af9a09bfaee30fbaec68aa1d50abdde5d2a6082cebb6f7bda1e377d618fd4cbf2b1a8ccbb4883f0a6ef87faaa8c4d57bea8bfd5e5fc3ce4cb4bca7bbeb9a03a9b725ebacda7d9991fe5c94dbe3a1647fdf1ecd9fffb2bdb0caa0b91ad760d837cc6bc69ca26d2ffb0165f4d73ca0f7e6889e9fc3fa5f36b56bfe75678e3db0cdacc3d577df0abd86a02e7dd8bd62f7f8b46f8cbfec2f250df025da3eca9397d83c73628afe769e74d0f8c88ca6b7eabf9c5f8bd4ffaeecfa94e04d36ae0f5decb4028ab1b954a4b4c33aa668c2efc3df320efffffa7b05deabe16be4afbb2ff612a66696a9ed929ca17ecaa7eeeef6ddea8445e5d1d0cdaba56e493cdfeca6dbbe12a8c056f0449cec5b4cebb45e6b2ba0eff80beb484d6fca94cbecd5f590c0782fecf87b4bed6ba2843ec6257de7f79dbd2b2edaa80d9d0ccceb924a59dfd9adbdc282f1a725d5dead258b2296d1adefdb3aa14e6542bfbfcd6af49490ce41bafd1d6ad6ffe9f0d70fccbba2541ed88938dff38ec5e57b856742bce12fdbea7f8a71a57653a3de397f6eb1294dcce2fd7f5c8d63ac3abea39b1adcd9abf6e432d4dad32eefd87bff88f2e78f546b1ce4c44b7ef2ef3d1afcd8e95dfde26b805bc36d85442e1aae65ea3c10e8d1d3db8bba0aedc4a229607dc5aba62da5294c6e1e52b132aa0acacd9a7eeee71a398a3eb1353d6a3f68b3f13cacd6dde33cc42d8f3febfec7df51b6beea4630e23ab2a5c93c106b9390f310e95b623535baaafb391d5cac87aa3cbc332e5ec8baeec343bdeca5bbc31ebe9d7bfad0ac8d4ef6e79302d94beeedcec5f12ed63dafe3fe0a3fc37f28b9ddd3315a9ab4b07f26e0ec4b4a5c2b7c55b6748e1efc585898c3e951af9dbf1821e0eab51187bbfb85c67ded1b9fcbcd4f8c1ceb87decaafb38bbc7aadfeab70e04fcc508f1d41dab6ad4ebffeadf0cdcece5c65a4edaca3fe372bedb0c3ebdb9b3cabd54fb93bdf5cdccf57476bbfe8f35df4f90ff16fd0eabead2b7a19d0f21107708a74df3b0dff55e4d928c8fcc55df73d8dbddacc77328d4df9ec59fc7ea576ce5cbb3e49bafd7159b3cef7fae2de0aaecdbce39d7faaf7cada1d7de988fbae416e3401209d0eb0e68ce11dba6de924faf1db0aefd2cff4eeb13601fbceedbbeedde2c5bddd7d4534dbfcddd09366bca6dfcfd0b3ddafaeccaefe953d18c85b05381f6dddc65381a81f51c89e2cad0a74d1e4de81588a9d27b1d2db4d3e245ae7271cc881aa5b8528b8acb9fc7814d71f766eb7fdb95c22ff3f2eaaece7bfbd112c115ddb369cdb20ee43e031d1a6b06cd1ad9a0e64bdd74bfddaeb6a8fb56082de6fcada2aff2bdb3af55cac6aed6bbfa3d33ea93d6ae4ddeb2d4e4e75bfa7cdcaedd1ffad2ab8a1ffacfdd7a9eecacafc82fefc6cbbaa8caaa60141ce4fccfa69a377d1522bbd55cbb1d071b2a7b1d5d5ff6d0d36d8b53924afb0c5bedf7eb14bd5fc169aefe5daf7b5f7b19af09e2f94682aab0ad4dbd3d68e0949e8fd4234adebb3299d309c3edd58abead53c3ba74791eddecea0a208c3da448f6052b21fee17e58633780fd654a1e9d8cd97fab5cbcb0fccd19ce94d872deac381b6ee7dbebec57aa3773ae1530376e7338a3baa2f1e8ebcb78a0f71dd37d04e77c3df497a5b5728cc7eade1e22c979708e904174b18b0be471c77df2a6ed4e0b99baffe5b1ddaec4ae4d1fb7d4cb7be6dd2ff4c57aa7cf659cf84ea7acb19816dcbb9a9fea8cbce5dea0a0c592dd0141ccab3cf12ee2bf45dbd64996736440632e46cf5eb1effa70fcc12a1aca0fc8ee05952c006f59a21755f94a1adcca46c292abeddeedec5c8c360fa9defe9a8dc6e1b2a625baafa81cb92f4aebef8af3afe2c1a686f3a19c307d5c112f0db99aadf2ad51d7b4c182cba4dcf768f9eb0b2fa0447a4b38fa9ae5358e6ebfadbb24754d70ea4bdafdaffefd22e723da5cb417ad9b9a19cab15b2e7b0254a3b24d1a71bc8d7b4ff6aaa5b4c6abdc85de065049268e7eaa2f0cabecf23fd540cdfcfa67faf46ff5bf062b1dcc3d370eaf70ddc7ccff407bd7e1dedeaecfcfffebd29d4c7a1ed2dd2c5869df28f1f33eca1ae0c5024a3dc7cd488e85e18f26275dfba76edbf0f82ace46c33b50bcb961eff3e8826a3bcfbdd85a2bc78e6debb50ac1401dcaed4dfdae7f161a9d841c69c35a58080781dbdbd93c1caf562a73fc44e8ca49cd8bce5bbcadc660e3da1a78d1a54dffdece5a76fbf4b292a0c58b3ba798ccc8eff4dfa4d73a4c3cf26499ad6181b5aa1ebdf8ccb2cec7ce030baee18aa3bcbccb16f574aa9f3a2b078ee8aea8f641dcfc40defe7c8a49b0af8d83542f0fcbfdb6c472a883ce457fef18eb4139cfe6403fbaefb88eaaaa3ed78dad23fcee71350b0d1b6c8b0e4287d3ff1edd22e81dc3d0e1e81e816ff0df0bbc3bfc3f250a7c55ee664f85cb3d040db8a7eac01a35667f2b2907e6ad85d279379d2af08a3af46c8af361eab5f7cdca6f93c71db1caf3067e8381cf4655a155bd60742b5aac8b09fc275fb0cbfc0ed6cfcd229dcacbe927796d20ef4efdb0ed4c4aee70e99cbfbbf624feac7cd0bf7edfd478ac1a509e4bd710bfdd2a4b1df2c8cf7ae86cd5e7f18a742c7dd2cdbeebff4c10be5e8bf8d0cafffb03548e65afdcac063c6c27d5e2e6dd6a40ce3aea32709cc999d8d8b31f1a65aacbc4daa8faaf68660e02efaddeaf9b6ac8bf9a61cade1ad10be6e552721aecfb599b8e61ff5c1f0fdb8f9de96212f5577cd1fe041762e6b7e3bb93d07a2c1ce1a8f4d333f9f62f9c9ee76052ff68efc7d4b46fa59a36dfa1cb1f871d8f0ad21f5ba9f8dcbafda38d2913837b6fcb944df83f9fcfdbeec6fa7e53d07b25ae0fe5dc64698af48c857df4038ecbc1bf3bf2a45b4da0c385c954f69c113e9b1dcfd59ce265cdf46cfef893cb3fcffaa04df3e08a80eb3c69a6d6bcaedeabe1ad9cc7d0dc5f880aff1ca1bcbcd16469efc4a9adc5b8077aa8adb1ec3a62216df650c8ae956a74f7c83bac1d871b1ada59a1d66ddd6c1e0ca8b923e4f3bc95b9eacdbe6ef9ccbeea2b3d2ffceccfa5dafb5ad37bb368d35db7d619a3380a773cc4bf5f625fad3dd0a3dd160bfbcb174aaf8b58f1dec2cf7137c55cbabf4e3c06bbbdaec3cd49dafdcd2bb9e1abcaab1dfd78fe4cdfa0feddeedaf0a27bfadf7d4d06ce7274f7f95ee50432deed16734cf0e049ed33f0ebfbfb2097bfeaa2cbfa35cb7bef55e72c3aea8aaf5f7e5c4cbcf62f5d2cf650da17784c49dffccf1d7aaab0b0616aadeca55beddcdb9eef714aa69cf6c8e3b6b5a4d4fdfc3c7dbf9ef0bf1ee8c88116255b71aeef98faaded31dded7e3db3e3ded6e0dd53d81c9658ee1d8279d2c4ff4eddcc5d94771e63fe44c45de96c2ea3393a17531bab6ef72bb9db1cdefcba1a8e62b04e62f5f3c553f3b6bb22f1ae5bffbb09b1aab3f0875efab62b3cad7c45fddebbb5b7fffdfb3e21ee2c53ca2cdc2c4baedcbbe5917e2b2d5b253bbaf5fbbf58cfde7eccd7db1ccc2dff91fc1de53aecfac87ace7cd16aed303cebbe8120cdc79071b98c1fdc0dfa7fca66124cf1be411e6f1bef8daed38ffb0b2100cc06e3351ae53b21ded32430d1c2046dfc3e4bdb1acf94f5cfc5cfa2a9c3a9bbd2fad5c8586fdae0ccbfdfbc7aafdf9c387b36ab3c1c5cd8042a6cb0e1cfa03dfeaceeaa9baae8df09c8fed13ccd1da15ee68f93c2c4acddc3efba62bf24aeed6db41920652cfb701dceee2aca659d5771e82efa9aef9bd9e31bcfc2f95dcc976c53079ec3dc481fc17b9cdedbaaacd6a5b7dd3c60964ac87560eb6a8ff2155eed39ec00e31b0d245bbf5952a31ffedc58ece4dc60ffc9cdaab8bda41b391b1c3a81badeb3db9fc437adbb8cfb2ceb8b0e2894ce369bd03aa96f8c4db11bb594aae65d6add9ad7ebab93c714ecb7eff2eb2b09d18de14f3da18bde2acbcccb95ba4cadbfb96effaae0cef013ae1897ac5ab4a94433f0be50ace8fc5c2ccd31f42b353a7b588f0befddad821250cf20acbf85effb9fe07c9fb6de77cfca68cf4ebab8b8df7adefeb0e59fb7f4afbc3f30e3af02ca5c1cec32cfdb4a5bcc30ddbb6ceecadb7ee595fbe4d3b60cad1aaaf318e440ebe44ebc83ecab729d0ddcf47ce1daf712c69d1e9afecc6d5c3538a34db0cef1ca0a51ede9e9f988dfbeb9afe63956ba6775e4ded809bdc3edafd1ddc9acfdcaf789fdbd1ded0bde966c2f34f600b3c959aaabcdb3f97ea2e94db92d87bd359e940df3a0334ecfa0dcf31d44d9cbb91fded625dcfe835e40e16aacb0b5be6fdca81dfdaad88fd8c86d09b1bc756d7e42cb50d5f390dc8005d166aa0036e3ac6cbb5a194140e7aa7792df7ef94c4db5c98ad0c2c99cf5cb43a7e7d25fba9b16a8be675bcfdbb9169fc78ddfc44cf85fc95ee21d9f0fde1bd2fd005c8dafca8401bd3847a433eefff5949f9fb4ffcef6da2fb5d3818acd70dccc4ee85dbeea9d2baf4343e412a42905449017b535a3e8eeee7c9d3fbcfa1e56cc9cffdef40eee40f33a8ea66d1abfe4addb1cd6adddb1ff8fa15ef34e05fdea2b3c4a6190d6efc3adfaf887d4e0d2fc1de7b22cd995bb63669ad2ebf32aa918a0cfd9da6b32ce9aa5f2fadec03dd02a03f3ff1c045d071ac0d1b6a2aeadddbc284ebea7f18345ffa3c2c2aecdbddac1ffcddfe788ee7af41498a631b84f1bd3fa8e9dfea5bafad439fa7eabe3b0f67f1e7f4aef2f0ec7dcaa6bffbe0b02bdac7bed83e4caeacad8e9b676bfe2bec80cea48a00b8aa599a1d1562494dea6ca2dacccdd8ae5fd55f8f4dca5ff6abec6cecf00a6cde4c26fdfac3cb3ce4bab290fffe10cf7ca6bd3dd45b07f4bceb7543fbf4ccb9a5b9a2bfe1f3dea5bfc23bf77c98caa4398e9818cbbbf2236f8142abdd682ba68e999cbc1bbfee79a5beace5b3815c0cd54b02040dfca8c99e8b6db6f98bfa6c7efcf3f6b5d5c3a722a3e3bdbfc277accd5bfa8c5873d489aedf5a3c93fe9a4c6a0c9eeead6ff3579fc422cdb55b02db715cbddbbcf5d0de6c2ac6da0f4fbb59b45e9acfeddf43edfddb03eb974e97adbed1db0cdaef657fc8e5a1abefee3f8bc670a0f8a5c790caba43529bcb7e2afdf283ab85af441fbbbd042a4eff8fb8568f75e5bbfab16de7d06d57a6b1208a1fa5a5da11ffb9f84be161ddd5ebe54e3dc0deb3b9ed1a430535188f23b65d53eda6faedb0bcdf4cfaab6adc11bec2c5c840f6323663bff0e46fca3eed7d8ac2c041cd4beb4a32678f33ecaaa21dc0d18fda5dbd2deee7bbf7dcbfe7ef5ed8e5ed2dfc6da17125d5bf6ab65a089aa63e7f9dccfddea9aad4eb31e7efdfc31a7ab6829ef1f11880c4ebbc8931bb727a6d5aaefbf65bce947c60ef37e6d50a9fbd4c93e8cee81e7a0f7ac04cd2fc0ec87cfe5cdbdaf1ef8f23c6e965d75a4528d5cdad89f1bffbbcc360da594f2c8ac3def9ae5fee9331fb3fe2983d02c9cb01e6a394fdd5e3ef5e0eef7addd3d0142bd8d3b60bc898de0cdc15bec9b794adc30f081aaeeb7e052663f793e7ade7fa024cf71ef92bfb2f8fc01dd93fbadb77ec07f2244b3dcbe095a24bdad5f10d51a99c4e246dddc2d2df8fffba34ded9f9fcf5dce0efd9cb9810c1a14e514cfbc7fadc923a601ed7ad191c76a3e9100bdcffc611bcf6adfdba9f2b591696e13a57ed7bef206a4ad8beee54fc03faa4a27b41f2d861dbb0dcff8ab9c12e762beca13874540ecb5d2767ebbeebbfeca8b32fe7aaf699b432c1792f82640bec6abdb87e3414505bc8db9708cc16fcfc19aaceae0fbcfcbe68e50a8b24b4dbff1d9dfecba7625e3445eecdade10adde3bf017ca68dd480efdaa7fbca1e7039f1e2f20ef061b02d08e5bf769e2ea23854d3a60f8074bea127d30e0ec39efcc53d1b4b10ac4d2aa4c56fe9f178fadba6b32bd79cfc6dcb482dda4bb15b3cd082bbee81b8bad4bbd4ab98ee679413d352cb221d7bd3a3e162a317b58df7e9cf5f10a1ef161fa54b9c0bb5b51efb1ca6846a000949a4f3ae0dea3badf1cacd763ffddeaf51f0bdde8ae3ce56f00b91a7d2bfc6eae142bbbedf0f4b2aade8f5e365ad29c753afa9c48e5fa6d77e6dd07aca9a922ba94fce8fb1122ffab3a744140a087b20edcab15e70599f677bb01aed9bdcc2ef10d5d2845b2a6d6c607cfe0dea4fefe1d3f96a280d2d4fcdc5d61bb5a7eb7f6dfa278bcddefba3c6f5a69738a0027b814bd84aee015a32fbdf5e267d62bfa31b809ae68fadd37dbf3bed6ddf71e999829bcf1fc7aeadad738c7ec02fefdd28f407c8cd498ed04d2bb1c5dbf18aefeae10da51be91afb7eda5f27eb7dedfbc32d70cb289ea0fbc8a4c2d26b8c0aa75ce355b26b6d7e3a2decf098ead7ec2ceae22c0ffea7b9a5a4246861d9e9ab1d9cfc9be31da595e7e0a1e5ccaaa574bbf3b5bff825264f18cc5bbeab317d6c6ac440efec6b80e8c74dc3a618bbc59bff1ea49a586afbec0fb6d9a0be61e72aabd4cbf3cea4c38ff7bbbbe7deaddcf28ec11a6a67efa823daf1bfd4ec9b4fc01e7a5ae58eefeba21c7c9ffc2eb675551cb6bb68d7fc9eef420b4e49dfaf4f6e714199751ccfb8218d169edc543c576a77ae8dbfbbb63a2cc7dc5cc95a1eae72f6ef2e42a8cc9a9f520ab8942ebde57b8cbc4285d5905e6adefb0bb3febd75003e0d584ee19b1121c1defbe2cacdcaefc78b0c6f35bda70cc31c24ebffdcbc1b6d68334ba02112b6dda8d226a565b45ae7cf6af45f8db31aa5ea3fbba699aabe9dbd1f2eb2bdded9f9d0d3cdffb92bbb5e42a80ddecc50c61ddfe80e670ea81bcef5cb87bceb3bf52cc064d0dacb565dbf26c2485abbbbda9baba4afb8de6efb5afdedce2e5bdb7d8be2076ed715fb485da8c0be420ebbf67f17bc2fb0caa23ad71ccfcbbee6ce8d2fa5eb1a86fa92edfb2c3636ce73b81a3326c1769b4ff5aea47efcd7fa2fbf8ecd0e15ae1dabd9873f7a2db18c44a780cb53bb811c5cf216f1b7a05ddc994c4bc4db7beebca6f0eaeaffeda50fadd047999e52df0b31d0fd6c7eee8fa653eef6bf8bcc27f7e6d1feec56bfc2b128bbf1cffced0a223ddc6acd3d8cbc1ee99cac922a8bcdaa72a51f4affcae18f7aaa7edfb41aae04f8daec40df6c5c2fbaa5ed5ae0ad8cb5ff015d985584a75ef6cabdb29385d6edfd96fdc6e9179454cf24beb4a2a0b063ccdcdeb4d2a9754ff8af7e5ea5a5f700dfacdcaab38ea48f4ddb94c3e929345a00c1caa76ceab040abc12e2e1c4ae905112959017fa07314f7bfc426452b2cab7d7e54d23acdcdeca564d6cf1b5effc4322be3b86bf05353facc5e040ac3cc5a911d606bcbccdce9feda748914eaece8cd0ba3a8df8bc36b81ab9cfd42aadd2394fcd6e62f9e75df50aaed2a1ddfb33b4dce982fadee1ade37a02fee36e8d19f7fdce7daddd4793fac5030c4d4a7abfcd0baaefadedea5a9e8dba95a8af26f3b693dae6c9caac0ba8bee62db4afef41b6bfd4a18cffffb94173bead55bfd84dacd2de2b0f15cbf3386bd6dfcd5da0cadab0befd278f4c39de66331e18c6daea1d3af5fca73ddfc7c642acea0433ebdf1c932e3e6db9da22866ee2dface2b0ffdcc7ce94accb413fdbf4206fe4d2c8d77af8b422bda45c46bcf2c3dfbd5ad20ef2abdc68dcd88e152ef884a32191ef5bca6de79ff8cd3a79c325ddbaabb561e8be555d6bbbf630982e9dedcfe84ffb5bf4d01a640baaba337a63ef7165b25e0bfb994ce8c7ddef6fceccc10adaebf73f3eeb9ea4173a696dad2c67e747ab2c9ca2573a41fb9a16c3cecffbb4913c3edb0daf71afa4becc53dfaef9fa1f2ecdb0b3fee46e34867f9a9c3fd7e9eea483a5bcdd7c401e8a2f0b35fc50e6afb6b84c5bb2dc0abff08aaad5efb9eb75e2b10f55e4a40c3d095bf19d89f4bf1808540aa833bff076667e445c0ec3de103bd156ca03cc1f02eac53c5a72aeb3b02e19b29c43ccbf8633a498bfbb80d61441ad92db9449d9b7114dacfdf3a46adadf19fabff8bc2a04b10cfbe14341ccb34c2c635ceb6dd2fabb5c6a0ebafc21f43fc5efdfe7665e157d29df6dccbba3dae73cfae01cc15d6945dfe5b18cc0a3a3bdccf30d7cda7e8c8c7cc66dab3931f35eccdcd7143b6182141c39ec45bb5d7f3ac0f7d88de7b1e6b37fab0a32bd4a456fe2c68fd0b113aaae5a08bdfaec4af9ec4be6d92a1463b4c4a44a4cd81d9e40d9a6ab5dddfdb4ef09c65a9cd67dbbf5c3ecceebff7e8a072fcfcac4d17cd256acc5bee307e5b69c88ed7fb7a6abb3dcedb67cd803b166ecd988fa67a9d1a0fd14e2fcae21324eeabcc8d9d4d03e8694e772e0b392bc66cc90dbc99416af0bf42ba50f6dfbacee8ebff5dcb7e118e8979b2e7e7cddcd4f64000d9ea8ff5a151f3b0d21ee970dc96e5fe8eae7eb181fbe3c8ece6deb3cbd3b3cf09cf12adaff2e22cbf2fce0bfdc99d25bff10ff21dab766d720c37edc8fa9bf6832fa790aacc85e3ebebf0eb8f00e14c2c35fed724fbb08ca6a05f8bb5c19684a90dab22f0cde34a4d0b7cc9cb4aa1f8bafea768ca4dbfafa7486ebca3bdfab46fd9cf13ad63c485e146b5fe2dfb84447ddefafb4cc4b2ae4bb5c995bed31cf0fd2dbeb3bea8f29629b3a71b10e8b428ce72ba642e1dbdc69c4b4ed02cd4d0fc7b72d4ece6c2ec8d8bf8ec7d65edd4573ac3aa6ee92dd166a1f4d5ebfdc4ecf915ecec2142ccfee4687d4b62acdc0d7c12fce1cf541c5fdebee2deecf3dfbd2bd231dead714cbe5df062523cd7abac3cceffbed5c14abfddc49d7fa9ec7b8fda9a63dfaef9dc137f0fa36958e286f5ca8f9ffe8304bfc3b71c06f704fd0ef59f863a5b4d01282a1cef7b0824dfd39c92379afe0acd9c7b9c5ed79cbf9b13ec78f5f7e86ba8e672cac6a0d70e3d5f9fcdddede59feddbecbdc64af3151dbb9bf6be15cdabda4deca957ba9afbe6ba68abbb2ff878fb8e30f10463c141f7baf253edceede72fc8b5b9f1d2ddb6eceb445ec0c013ab5c8c8af4bbe1d5422d0f7169a5d3aebe7a7380ea0d2d87decffdda94ef2b3346fdc718ba7214e0d3aadfc1b5f9a7b6023563d3fcecd01cf8fe52d867ff23dd6ee4ca72da3dfd1c1db01bf7766e3fae910c26d7ab4d32e4427d7b441cccafb4e1c8f70ce3286604caddebdadbbc3c99537e9df4ddb590c87b3c297f8deaa50ff5cebbffdcb28ad8dba6e7ec1a72b2a14bdbdec5da79af90e8befa72be518cffe2fcdf873e8e8ae1aafae8dab4854dca8210fce4f3c6b0ef86d8b5cbf2c584d7f9175c848eb157cd6e2bc64c62ebaa13ca1aa050027dc0abdb9f4c3e6a2d22c4bedda10e3d67bb0bffc9b8dfbf7ff4e0bbbdfabd00d7bfbeaafdce2b1087d2ac5221fd9b8da5f2c68884348daacafffc2a4075bcdbbcdebaab265befdceddfa8b27c43b49e12dfc786ef5eabc8abafa0c8dedaf9d60fdeaac7d8f0bbefadab673d5dcdaa2d0a735c5e3d69b3eb7ac2a3a70f441bce0d86bfdcac7db8df15aa5e5a5aae7fadbfaf7cf41a1aae6dbe2a26d73b570d60c51ba2befafe8bbaac0accd25f280ecedca06a2eea1b1ec1dd7975ccb516b91e3b68734badecd73daabbdfbbdfbceef85cbf0b58495c24fdfff81bfe880364fd841fe23dc8c1fafafd2dec2df68eae29acb9cee67daece5ed8f850d6ccc2ba0ae49df72df48d6d8caed6cd390df464be7c33ef2df7d7cfaa9d5f6a133f2ecef8afdbcaee34b1abcdbeda7f1dcfdb7af1dfdb4b9cecd7fc6c1bbd41604aa34302bb4b78ba3f170e6e510a01ae6f29edcd23065ebc13baec0efca3b65a4c32aa0d1ab6f0e0547cebedfd11897b5dda4edceb541db087141eb8c9d9dc2aa6facdd6ecb6c5df1be3bddbd429e2dddabdacc6495e63b3c4bed6c36bfc75f49fcdf44c9ddae0b1aecbe6ffebd0ed426d2bae3275bdbfee9a108efbe7eeccdd311daa3c685aafe9bc3cbe639de8cbc4dbff8780d1556677bbfedcc1a3d46629229fcaaa4bedba016eafaa4f91dcbe06e4129e0ca71e073d2aa9c3a6abc0ebb0ea40cc2c881ff8bafb6c161e21b7cfacc8bf5bdf6dffa2e0daa8eded8bccfce47dffddf39f99bd2d94cf5f1d6faf6a9d1cb654ba55d4bfdbbfdf56bde5ca9f19ab3c50e5dfd5edfe7ab1cdfa33b8c0dc4fd5b65e21d85e07d52eceb2747b11c21a64b5ce3cfabde9af4555e2a7c79c1538b31d2ed367a7c21fb7d27dcfbfc263c51f362e62fbb834de1d4e67c25116b4d39ea7bceadb95aad1c7c57adcf0aa6b3c5f1c8a0f4d9fa4fdf36ca894caccd3a2dacec7fc5b5961399c0bddecfbde4156aaf3b1c9f6a0c11affbbabdcfe1a93ed22aaa7cdbdfee4efbae7e8ad03cbcd7e0f7da8cbaebe4faa1abcfb029d82c0ab61daa5dce3930314ddeb31f58cf2bdf6c99afd6d89612bdf5aee4f9617b8ce7ec0fd08b42eca1dde36c4ebcd6295eddfdd81e9ac66eaaf5ef12d4c045a3a2873fcf946e9fb2bb45e30d4fb82efd97bf7d51ff8429d5445cf90e29c50ac4b2e7f0d960f8c9af23f7b61c3d3633e2e1dd8ab8a8aea7abbacbbe4b1dadaf9a0fea14ab9fde0dede3a07a28eafb9c0cbcbafada46bcdcc240aeb52dcca0ff98f6bcaa24ebca0e7208dfaeffcff4edbbe4a2dcd7184ba46c0ab0ab51ffc99fdf76d77b41fcdd7cff924b6d79fa6c315af7fe63dec5f0a1fa185323f1ba0c8ad523c0d34ddffeb1eee219a5e5caf05c9c4eabbda77aa3c8dd8aabdc7ebb4ebc7bdbf6dcab6294ccf9eb115afaa2ccca2c5fcdac4f1eef0aebcbfad427b9ebc26cba6ac91c449f3f106e0d55b088bffcaac5a6a2d9a3f9beec0d83db49beef02efadd8cb9df4bec8d14bba9fbfb89d85f43a2c1ebb100dfa97ef9fc3e3fe0dea5d5db1e79fdd4604dd0dc492a2509becc1d0cad7fb4c01daeb00f2d8518cf4ba23dfec5dc0defc0aec571decc9ede6bba5c3e36eb5a121a8faae6f21f6d41c49b4fabe806a5d174bf892f948ffaa35ede467c0eafacc9c884e165bd728e315b5cada2b20246bcec5de4a25ccfb17bddfbe2a3addd8ae34b6227f0f997de42fda5f5445fd4b2198aafc7b5b3681b80f3dbdbdcbe4b3f461e5f6a6838718acd4f3a5aefb5e0abdc2f2dba5eea97f5a702c4607fadd72befe75a1442bbba7dbdba5648ae5857b1bcfb243691be0d5a571cbb820f56ebbd0b87ee853c3e7b18a29c69b512abcef8acdc14d3fccc7bcc6ad7cbb2ef76d5fd8f6f031137868d9b25a41c535dd7bb83f84070ea6affbc0d9fbacee00402f0cbb0be18a5eaf76ee3baeccbbd7ecb1fd4a5d7cdca7eaa08901d955aaea26a5a7da9fd8deb5a3c7bebcb4b226a47f7efea4e15bacbbcb7ade0c9d4567b1ccf7fafbc11af4faef8db7a77e85a4be5e9bbfcde372decebd21ce0acd315ce0e3fe20cf2e54bdd407ec6c10983add9e38ea1cfb4d75fba90fdcfe5d6afcd1a568e9824a77a2830c3d87caca5aff818a36babde22adc38aedee0dda1b9e3bd253bcfdea08df97a7e03edd757ec0d2cbfaea01cbbe2da4d309df375ebab827e0bc2cab2e99b0d2d5b23afa8ad64ff19bcec32e36fcd66aaabba8980dab9cb1fe2943af57edab5f46affcb06cdb9ffd5a67e6feffb347dae9fdbd9f2b6a1001ea881fbabbff71a488fd4c4ced8f897bf08bff27c5c1adb7de6abeac1583bbeba7c02398abcccdd9b75cbadfc6565aeb0b580aed618ee896eacc7b1078a990dad5be017db207fc55bf31ae77edae07dcaadddc83aa746bae6d1ca4aff9effefc1ace18dc0ced2c6b3b3ec6ef85aed960d299df79ac97e1c3c3d3626c0b6fab33afeddfae21a6cd5ecbaa56c769d44f3d6b041a24a2af93e60d9d2270d848aeb4d1efa3b6fea42f5ba5e75cf27d993b490ae2cfcd65f0421b32d1db7ae5b99ccbc9eec9acaeec2e29f4171f844ecdedc9538eac0d65bfedd2bc3b3b9a4541b3e01f2af8f2266a004dc29ebdadffb9c866d5aa323cbbc7d6dbcceeca0dfd5e09dd5d82c88d5a09da5e8314bb79aadaf0e7b488abcdfbbdaa0b71de7c19d30215b6ddc4fbc0fb95fec129b04ae253a6bf5abc7df4b8d49ced8fcb19005a6deda1dfffd1f258a7f4ed16ebf27dd10dd83acafbd4e6f957e41cfbfe72aa417ab5f2cfeec61efc6c6cee9f6efb3ab79ca5dad5d8e48ffb9833f6d3166f2bf6bfefcd5addb7b4e1c60e9794ef7daa3fedaaba47b2c9ebd6ad67c2d6aa53752dcfda2c16a8ef28eda23c72c544fc1e4e7bad52a40a99fc7de0133af83959e360978ca5a41cec5c98a2f9bccd141daa8ccf682bcfc7366d2ab1ed9bbdac6a3811f3dcd4f43ccd273a278414131ed7b00fa7462eadb7ae3ba627a461daed8c8d49a4ff48adeff89ff6cbbddbe6883cddaf30414ca7fb7aaddf709dd6f667d7de02ccddebb5ebb14e3b7ed464e7bd6b01cf4bcddb694e2c725cd7fefacacf6e6cdb8efcfeabb5d4799f7277ef703c3d907c9eab3b0eec8ddf7cc264e583fb37ef4dace9734bfa7ef12cc51c53d238f0f1acfa8b4fcc90909ca43ae38f0f3c7daf3b58bc1cdb1f5abeb120dbecd90ce490c27bfab1220523bcc81f2a2ba3b7958d0fefc9af36faaa951873fbd0d487286d671a81974dbdcbddb8e8cc2fcc4c154f8f79ae2a9bc1ded7decdcacf89ea91bf6cddddcbeb6f174dceb4eb4df220aac298abf404d6be942ee7bbbf09ae21cbb34db23abaac228a895d072cece483ccf50f362eaf1f7488b0aca5dd0c5df5d5f0cdccb1db8ebeb84babd9b6d7133357cbf6a4b1f0cb89d02fe4172bd5755edaa03ff57af41ebe22f64c3bc2ddd935019eae27110c5e417bdd354c9d5daec2a29b04483f3fff36dc3c221f5d13e04f3fcadcffcefdadadcacada8abb93a63b6f5d328085f54c6bb4da6f5ceef3dea642adcb57efcfefafc3eed9d2babaa97c8acd80b083bcba6b0cbb2b0bbc6ffba2bde9dd60f533dbeabdeea16caf3a60f59fb5c0f068cf37e2d615713ae16a773e49a6d606cb2ae48d95bce6d16bb8cfe43e4286fb54cf6ed9fbd08a4a2b4119852daca099bebd99859e64bbdebb983c5bdbce07be5c996cfedfb688d24f1a25db333d1ff5e690ccbb0ad45a2ff26ffbbbe53dede918b220b4e3ef0adaad3c9aff04962dab1fbaf476c1b1c60b2eb7edd3c99fbebecb8fcac676a5350b9ebbafed40a4ebbd756bb99218a8b2dfbdcd55e6a71af128d8a2a443cee49e89defc60b1e8b8cb7a1acbf07ca3bcaca83dddf8f283eee9efc33db8c0da57d2bea6dc1d88ce03fc6fe4eeebcc7ab345e16c0115be0f8c3eabe598aafecbcfb71ef6032f509cda93edfb227ebfabef287cfb0c8239bca08dbd5d26cf65fe8380856538a1efbcbfd76e5fc6f8bd23bba43a8f6dd0cd408c9ec0820f9bbed2bc3b2640fabc51f3ce1dfc3bb6b3eefea5a5c5dbbccdb4d50fe2fb4febd2a15cdbcd0ae0edae6748bc9dd9e7883fd84eedcf4ccbf4ca6cba4af1a53b499bedbf8a32beddf1f48657c7674078b1b75b1dbf3af2e4aebbb5c24cfccd7cd651d84a5ab3a4c7bfbf206fe3bccad471e051eaf97aaf7dd7937f4089e3a72397ec4cf6ac32ea229b72ca4e761aec6dee10aecee7e3eea7a491aecfb2f89ebb2a2d2943a6ef10cef62dad58bdd48a27281abaeec15dbf4168cd481e0cbfd43cb45a8abf3965eee1986ada7e4ecd778ee000b3bdb02a2ef91ca5f455724aeac4dab4614e4aebdb5371effa4a285406d04c53db5f6faf1e0b7d7cb7becefbdcccdc09e2ddaccd34ed339fc0811a7572af47baeead5d47edbacecdf78d3cef99cd313cfaebd6b5b414dfbce6d4c3fbc5e95e508fff0fb5ac48c88eefac7aacd437d55bf975ca832fc50c1dbce7d7991f2eeb56c93a5ad7cebf94bad669730e084d1cbccbb47abea27b3dbc9d766aeee0f02682bd4c45b12a6f152e4ad04aba9b0a1bfd0cfd3d31fc7a684fcdfa48d341bf6dd8e3ac93e8737e77dbac6cbebeab1b8976f8ff4d2c22e692a7affcc730b706b69eacc0cdaa5efa76b3ae54ef8e24b988067abaecdc78882f6ca32f0bc1746abbd6c79f0e2dbcf7a9863f16a6bdb17c5fb85531744b36c6c6930d71a15ede1a2134a82c2e4f2fcf6aafb9c7dbcb768f3405a6c9eeffea9169cb6281c6fd52edb5a8bac8ae4839d8c7a09f2cecb7cbcc7fe37d1166acdbeafdddbdbaa1cdda9ce1c17e07fcda58bd9a8dfa87bf0ee8603e48fc5aeb0de0bdc872deedf7e50a14e1d99fb8a8e5e169ad17fccf34fdd4f44eb3e40ca3f96ceda4dc9dbcb423c1cb66b6f34f5bc029cbb9701999e81d9cf7d8fe34acefcaeb2ec92fd66ff2fb3873a48dbadf85dbcb5adf2a6edb904b3afebd67a2f63f33c2b5a998fa008fa8c8ccd64aeaf327dfe5cf5d8b5ec31c4c034c338016059f845d6333e4d2a71a12fea197baabdd3fbdc20c4cc8aa4e5d62ddeed1d46ffdbfd1a97f6ff56313cde61ce5e85738ddaa8fe4c26aabd8aaefd2cf26fccae9a7d5a4bbfee2fbecc87976425ce951af12ce4f8dcaa7ef4eb3ea040dfee294c52c1b5b57ed3813ea86aaf7cc8f4c2ef8f60c779ef949debdd2dbeec56aae2fa13be0e3a7a33ffe3bcbcbe67b01ca458ceeccd56e7849d8d44d2bff7daeedaead5ccde2d64985c2fb35a24af05fab1cb9c4e03ccd34c5bf6fb2f9df839e9baeac79c9cfef56d7bdbc4fb5eaca9eb9154e3ecf2dd6ef9b43c26f1f9b781af0c13a9fb996c949cc0e4acdf79dccc3a876daafb30892661354df158bbacff3b6fd2a3df0ec7357ae8d0332fabe39cecfd66733deadea0ad86e73fbaee9163f67edf75caeede1f8134bd2e456f8249a4d3efe5fcda62ee76afadb00ec5a6e9ea7ac5fef9e99fd8ccb4df88c8bb6a85c1cac6ef9acb9447eb6c9d9c3be438df3c4f87be93fc2efb67acbc9c3f16c7d8f84aff2c38a36b8c7f0efdb79f9a2af2230acfaaca9ef71ededf0ac53377f39f7b3102e11d928baaaabf513d2eff17db89b742bdcccbebda1a1f579abe45bf472ffaacbf25e6a6a0f0b98feafcfd39cba91a5de473b0ba6beb45c73ea59acba52ceed25dd68a0c64823ebed4b40edfe852baef23ffae21ea7b3c8d542cd7ed15e11fec1a1d9d2d6cfcbec8a625b1e5f1b4ebd6bf3e2e84bec9b78bef1bd7b8a0cacec4d852b2ccfa722ffdebbce9bc85ad68ae78ec0291ea2cbfdb9baafdd7fb54f9d4d03b12cedbedeec5c4a07baad005bbaa3ab575a1aff6a3ee5edecfea80fa522d31f23af24b6e4ebbff68d2c4f5e77e7e7dc4df1455fb0c05abe9eaf1edabe74e4ec84bf0f7861300f39bf9f8ab2b30d28e8fffd620aae06f9f2aba445ae8fb267bfed56ce97c5d83eac2a9c0d6cefafb53c45e82ecbb5f982038c05ff0f96f5ba31d9f4bb7e5fe8fe4a1bd8ddf194ad6dd1ef0121cd74eb6e8e3ed1e0d6ccccdb7043d1f505f7592f2aba19632aeb45bceedbdc74a8f5bda1de5dbfaf654b430deec051c0bdbc1dc0af74cd097fcab1e3dbfee671c274fd953afeb0aab63f5e53a3d5024ed814401cca6feda5ec1c3616cda9aacfd84d2ee1f54f240dc77b73194250648d08cb566cdaaa203aa75d2bffce43e5a70dc9e25ddf1a782714ecfbf2464c3ef63a71ddd4edacaf41d77ab6ea5ef98de5cfd5e52ffb0edc518d6cbbdb43076cf42ff4aadeebefd8d930709d21e2c26b2feb6fb5d908384ee5bcbfd34fcefed6a4571f90df1a1fd2cdf97db272378242f9f3205b7a2338a38a0cfeee8f26cb52a626b5c4c804b2bf50cbcecab1f916bad72372bbfefb9ee03fbefbaca4af83eec7b5ecca6e6ad55de7ab9a11edf5b8cad82781c0facbecad6f499c3ddfdd70002ea0d7cd8c561dcdcdf64d96750f92b7cc25df31d400ee4398831fbe536d4aeddccafce9ffdc9e4ba6ac7eabe439ebb64a45dfa09510041c86817bddebd48d6c5254fcbe0dfc893f53cf35a3bdb060d7a27c6dae1bbbf0bc8e7ddccc0bbe60be1fed361ca21e5e1df9cea1dc3ddeb4bad6fcadfccb77d8bf4ab6dfb7acaa8a1ecb1abec92ec7fe1afe86538be49db1e9ecadadd5d1eec5aa98513ce2f00b24213b39ce0a4dda27ef91b5ef630fa705fa2efbbeaca1670c26eeab1ec4149006a9f49a63e7da5aadd769dda7fe01d4ef62c78bef2aeabed234e5fa7f4deefe4a24b35a1cb6541ebad95efff3ecca7f49abb8fc9a9eacccac28c2f9ddd88aeeb8216d735afa8cf9ea1aed5c8cfeea4d5e79027eadcc963caa6c4abda89b11dea2224c6b34e7fb6e4ecfed67fbb75f06fb8c2e09eb2eccc716a526e1d63abe96effa4da10c0da6b2bdbb40826aa55149f625275b4dccfc8a9ff7ceaffb3ffde02bb663d32bf362c33cd94a6a1da977c8007adfab72fcdad7ec5c3aaeb5ef0fd5006fa831298d8df7cf1ffb620c98f38ca4d91c1e10c8f0ec6f7fc67e338acefacd9ddca8aafecc7aac05d4beed6fb35ef7bfdbe127795ddd78cd2a38c8d165bdfadb434c3cd4e0da4b24d2b8edca0d2cccc5f5c9ac081b4f0e06bb4bbcaf4c1c784c8e00b3a47dbc4ace4bd8c014ff402084a84cf94a1ec64feea15ebe8224a206eb3e2b7d2b4f72b069cda5fee46ddcf5013cc4a6e3f6addd8493533dae9cf3b97ba8ef8a58bdd599836bc7cdad0d3c1f3538022f43f3fc3dcacce045ebb5dabbbe8993acdd10409eb9fe3cd0c17729b77f8ecfa01dbdddf9bf18e827975a2aeeb09cb3eac2bce3d8a50ec6667a6688bf7aa0a52d3f32cf9f89d77bd414e7aa456fd90029a06b717d0b20eafd322bdbbef27af7d6722e9d20ce8c88eaa09c6eed3e17c769e7a9f05db1751e2cf03d37ddd3c8a6f8e752b527e64b73d432d39e18ca450ed53def9b8045be8d06a3be7af1dda36b1f8882a72b677fd29ae546bd2f98eafe26eb0a9f9072fd225d82b390f01e990a9f3f3de86c32bd7ad2dc16dc51eaa8dd3ede7390ec1691979bfbbfb530f8daaedaccdf003d753a8fb276dbcbef60baeebaf33db10a95fa61a7aa3eaafb86f5efbe1a417b45c405f55f25fcd48f6cfd1a0b3bbbaf43ac783d04838ef74ebd68c60fcd6cdcda7d9bf2b8bda835f88b96fffd8fdf5ffbf47bbc9a558a0af0d8a3d2320c2238e4d7dff4b00b39bf6d65ecb1dc5b295e5102ab1c75c1ce1edd3baeefc69c714be13645a5a6a4b43ec8df4a3bbdae57a2bae70d6c294cf4968e3bf74e59cf47af3e38b6f4ad5f83f9c3fd7adeee71def8c523e83de1aeee58d64ed11eef8aac1ed22dfffe369768de12bd3dc1baeadbf09dde7769e8d3d63a0fcc9b1aa5e47d0bccaab6d9e3ba68dabbc8cd1d4ddad0db6aec53d30f80d968e9b6deab4e9f4a3c1dff6c7aec62799cab772f993f2b9bc51da0adb07f5f330bddc470dfbfc021f6ec6e0a7b13cab9ad35c0ea29f6e05ae0adf2eafc1ffde233543cfcbd2c1f2db37df7acbdd5a3dfab13c0d251ebba5efc53b4893f4e53af4bd41d2340bccdffc0dd63bd5c2d1595314acd0a5dced8bc0b654dbdcea6e61d158daaa22bc3ea8ae3b547baba53e59dbd7c9f7e04a548da55322acb27cd584bcacafbebbb0609fbe5c7af5bfc0c1cdd33fdbefccc1aa6f453a6f56312c378eeac8adede3ce86cdaf440162abcba864cbfc27f5be07f5dbd50d4175eb1819783fbc231cb9f3ae1209bcef0c136fe21ed294a8495025f1c24f78dac55be00d1494dcc6d5dfeebf7f1ffbc2276dad3f8042cae73eba1e5cb135a06efff2a15a500456b36e190ce84a9daafdab570f9966dfbd0d6ee6fd5cc3e34cbeff5a81d000acce6f1bef0f0043c4ba7b55cbd972cab76698afd9b2edc0beacc42286fcdbfca90dfd6f693987d185efbea5bf860af4c4e95cdd97caba0ae7f699eea37f1f26f624feea96dc06fd8a1f6eef22f5c4d22d190be41ad03e8c049f74a042a1f452bdbafc1dbea9cc8bdcc2badd40d1c0f16daac3c2dc1cdec7e16fcae83adafdce8c6243ca5cb1d4d7da5cadf5d3741fcc032e824ddaa27bd23ee29506a24aabef432df5a4acfdb06a6038bd8501e427eaf2c87a7740a2fc7d9135f7ed171fbaad657c2d77dc5afbfc0a7acc37e575cb76aefa28abbf39c29cecea6bf1dddf0c4ee1bd7e503a3feb5233ea2cdbe05dbf1a7c1a29dfbe1b438bfddfa94b096a7a662d081cab540fc891d93b1cb8a09a0c3c2e7f8992fcc51adb20daf426956c6c8dc1774c96f80abe66eed32670ef0cc6e3cfd51eddbe49f14d8ac14ea4edc2dcb8ccea7beba8a88a76e53f65bddb282f54fad3f7a4badfe4c7865cf38de88760c0073f67c0ec4fe59f9ff4faf21a1facd4a6d2edfaa4e327185c17b0d97ebbb82ffa9818a83d0a438ec2d0edecd69134ea72ec73fab37a53acde2e8bbd0ceb7c5846d1ab4a139e2ff2f7de6e2c9c0b8e4daebfbcadf5e3bb6bb409adb5bdc5d966b4fea4fbfdcb71b5e02ac91fdc04cfebc396b5215fcaff2f3c8d651fe57df49cbdb0d979becf6b7c89693afc5c3ccefab36bd84d49c2e5aaf2cc9e75ded9e4da385c7afcacb728acafc26d6dbb2dcee18e626075fc2812aaa769d4fcfdeb3b74b28bfcc8ae3ec78cdac34f1fd80feacfbd858fbd6b6febeca51dffc36068fd47dea1c9f901ea2b5a0fff0ecfbcb25c0607c2b5d50550272d3ee6ae18b371eedeebddf2eab4221448edfa9a9c7c4ceaf732d1f7934051b59f3d2dca6e2a5a8151fde5f1c9bcc9ac585f7acefa9fc2dd9dd90eed1b092924d7882a1ca5fdeb0cf1cc0fd2b7aeeda4d6afe5dbd0782aed3d7bcdd7ba2e1f51b38befdae6dc76aacd3af6cd39c3fd920d7f950edf7aef3e4ea6fafbde4d8a1f88ff548d5e4fbefacbf95cc1f5ccbbde5e078da8c34f1ed9edad81f0da531adfc32444efc5bfb5e4ebadcfde2e2daaccf3ecd2deef5b0ee4dde15322c65bc52dca98c9c2a97f3c5dfd6da4cdb17b2b38b4b820e09e625ad03b0ca6fd85fdafdf1957afa16342fca26babac284c7c2ec0195b18fd594bc3d2ccdcaedbe5018ac3c9c434c81d853378add180caa7de953abf6efccfbbdbeaa0efccb996d9838c62a8d6e0eef98a538ffd295dfdeac71448f8ad5a7008325da56f2fc9dfcd9fd823eacc8fb1d00bb57df1b3bac10fe51c4be8df2fb5dee6b4f80be4ccc0bf17ad4aecf488d6d2dae0fd2e0aafff243fc717d0ab094aa1d620dd157acdbcacfdbc15f1c419cda295d94aeeed0f4adabe9e8532bac6b799f87dbfc1f7624b5bd74aa272f5efc2b395cdd187a5b36ceec1984cb16a2db4a7abfbb0c5afaa3ce4acabcf78afbfc9beab74faa4affbed6b74db11766a09dc2d33ad43a1d0f65b9ff0abeb86aa9e741b84abeabaf1badde5a077d9dd9502a39bde08bfea3b7f15f6def14482fdeb56eac528ab1ae866cbb1c0bb3d6f4bc9dad0f89faa3116d393ee9ffffbcadcb4dda200e599581c3c9b8e0f3275c3e7b9bca98abb0fa456d8e0dea8fa8f669a0901f1f50dda0356cbafbfee84486ddd4decf2bd54a7c4aa005db8dae6a6b8aab47dae598cab66cb2a9fa1ed6ba55fe345cac5f9a98abc6e4ae87559cd4c43f7f2edefcd88b0332ff7ec603e7986cdeacd28c95d1dad17d21b40e308ac4c550f353b3bb2d8ad84c4ee42975bfbcdad1dce5c5b28cbef3aff1e9bafce50cfeb76ffdc6d893fbec9c5f1fff7ea91fdf1bf1e7e20915c8eef2abfcdaae47c02aeb8f09aa5d63ea0dcf7cefd8c2d1bb63bfb1e9bea418ebe7ea0b5ac59a8ee23ef8adc49fe2a5439ec5efbdc28bd84be7e2d8b4cfb3e58839cc0aeb9b3409ae77f301a124472bfd6bcfd3eeecf8c9fc780ddd0d55efe35de4a04fb17d5d450cb24bd6106b75843fcc8573c3fdbea87dd7cc7b58eefa02aff1fc1bcdc957ac78ff31db760e1b040bad79c38b6fc07c9638beffc06f0bfbcce91737f0c9c6fd58bbfbdeaee9822d3bf65dfdeb7c6e5fca914b6cce008dbce2e6e2bd77aefdc0a3aecfaa28c4eb3afb3fb8aadd5699b7002a7265ef94c4bc7c76de3ba2aa0fddd9b87d9faa3e00a1e3ffefe8e819c88c1a36693c2f1cb4fe9a60a6cdc416cd62f7d3ab2b93735e6750eddfaf4bcafeecba7ace4f82c49e6fd2dd9b60fcfbf13fad7ac4c1bd4ed855add69444f664b58b16de6b3702a1fb54ae1e8c996cd739af71fb7c0f97d2452dabfd0faf1deb7ae1477041d8815957ae0a432b4ce0ec9acf0cdd5fec9c52b30adb4acbde4f8d6ce7aad2bab4c804c60aab1bcf8f7219eb3f2c5a247a81f9de26c8d6dbacf26bfbe74ac4b36cfe83849eab505efcca64a473c4dc5bfa5f35af295b2ca1fe39fcddc2e8d802b2eaee3539cfa15e1ee35c8cdef88bca55486762e2defcb1d8faa5e4142ec02f7c73dbfd484e7f3ae84fab4f4e2cdf0117d521cc65ffb2a3a61913be481ccccbd5d14283cab2e0c84e52e10836e61ccccfcacb384bef09fcc8ef80e80a84f0bfddeab14e1d6fd2e068b49bfd85eb663a5fbdada4cc54f77c1dffdfac3dfb69a21aa3c528ddf50e3ac34a7bcdc4aab0d1af5f35d22bf9ffb4a6cf38ae4a8d3bfc2d8ef5f43ac2f0beb46f5f89fb1aa7c0e1eb25c63df7ee04ca27d0fcc3ac6ebfba38becfbb3477fbd3d9fcc005ebfb5ea232caf1108a6591507fda282c407e5f04e5db6e0aca68d3fcdf8bf87cd1139f0bd30ab8a684b7a1ee37ba7e2de9ee5af328f0afb547aab1fdfbfef2fbf5bf7b5bd9d734e642dc4a784ab8af0a58b1e39323ae571a9f10baa6ab53054df3dde6def8f3bfad61ddd5ee3608137d7a6fadc64db0d8c67dccd099ad1e7c94acc895a096f37ec80dc64b19f0ab2b60cf4ec76fc941dd4deaf4f5f6d9adcfcecedc5aa46be759fc0aa4abdbaeb8a0b1b4c88f2b5ccd64cb19ffacf50dafcd4d4b3f60deaf4d1e7918df14ef6afa2b0fcc37d9c34c8fd0a0f81df320599dbd974dabfc1d217eabfb0dde14a9b8ddacf946dad46d2b12ebba7dfcbd8d2eb5abbd9d6ebd7110dbee0ea4a2c1d9ea194e96fc207abfe4f15cece67d4e3edb30200d0ee4b8f310daa2296aab0acbfab2f900298ea19390f7c2c30aa492e4e34db6cf7b4eeca02142eb3696ecad2dcdfb35107ba39d0caa2728bfa6656d3cb3edc8e5f6944c99edf8a0fd2daf08ba3edb0aad070dfac84e0adbb00ed375bc6f16d3ff173e71bab66af5020ddeb003e1f859070dca9d7cee57c63aebf68f7c3a3d3c82d3ceea5db3e6fb96e5ece2ecd05accac105aa88850f59ddd978ea3c8cd7e21dd2a09ff5bbdce8dca9db1bfb1dfc77bb1bce521dfebf91a9ffab91cc3daadf5237b49febc1ff6e4e316fbfceee9d4be9aaeef8f6a276bd73117df1c0aa0620d5d8d98be5dae10c8aaec72a8edfddada8ed75a5aa9ad55b4a29e9e0fdc7bcfa5ab026bb96a55aba4ed76d8aca87cac981fee42bbdfca8a3a5b9e7efbfcc00297c05dddcffcd19dffde6eaab9a3f2d2f8ccfd63345be1e792d3caaa68b6aae644cfb29d5e2b3e16bf3fa7d1bcb0f7a4da1ddf4a8db8594b9dda9bbbbc4abbdcdef8d7bfa37fe28d6aed917f1764d96b3e02a64ac6722fbebffce58ed7682c434fbff6adec73e4921d0aa67bb2e7b4afaff4fcec7facce5b638d0e647e25dff09ba0ed9f4edef4fe7e570ba50ec8b1bafdb19dde9cefebd6e20b127e57ecbecfb1dfc010e98ced25cfacce50d924263fe3931c65e44fe07ac673695d67dce58c26cecadc1b6f8eb8f4f6e74a26d4ffab614a8697f0f30dadcb263b0a4afbfe06c5d33adbcbd7cd0ee1fcf4ea69b2df6dddfdec42efafbb8bb8c7cadcfee8691c9e3564cbd8ce252e89bb5bcf927dc88a2d517caafd3714b1cbfcdcbef9ae383ea8abc83fdc93cba3aa72bcee257dbf8083a7582afddaf645f9c8d75df0b64eff05c1cfdafbecbe82aafaedddb7ed00490fa369f0ba2105bb4c86f76a8e0ffc77fb4918c60230bd4e69ae0f6fbcdadb3edb31b394b6aaf9cd98de3d3bcd416e9bc4b4ca715cf243e6adc7dadf477ad0ccdbdd9b11c049dcfa7f2afeaecfa8d75daa29a0c392dd1bc78abd5efb9faffa81aeef7dd77234f67d403e4cb5cde5fc44a284bc27f7c625bb31dd15aefacea675f2db0c29cd49d9caeb8dfad54c817deb732a2331386b3fe7ed9d1a61e23aaab23c6d86239bcb0e7d3e8b068426e5fcac1839ade17b2bfcf1e4151e4dcf20f64868ac62fd4fb2cf44d893991aebd3d29fc6072b0da10c349bcacab9acf68c9dbc3eee6c5cf9219c8acb67dfbec8dbff97fae99d2546b7babbbbf1bbcc2ca1ae0ea6deeedddd5a179a0ae76b7c6d8dbbdd6b5c400ebd34a1cfeefa9a244dadbadd88897b8785fbb9ecf02aa5b9c7baff9fae80eff5b65fb35abfd3abd41f65b656cc8ffafadfceb2d3bbc07a694cda81b83bccae96dba47ebcae3ba52f8f94bbe810466e29f9bbfdbc6bc730eebef226b08dbe00bf0e96031d848bd64d95cd39cee3b8b9df6a9fcf6b9e7a57b91f30aebcb655516e6bebdc92de2bd52e9fb9eb8df8d495edd14f1eab5a9ece6bcb9cbdefb54b54bc0f7c6f68d5ed1e9bd4dcbb873f1cb4e4caca3eef4aa12b068acfa0af99f37eb9abbfba4f1c9dcc1ee8c85da474a9f067d17459190f36be06accaa735da27fd9e21f0d073c2930cc9b51cddd81a12a46ef87eeee1f1aa94fb6a05eb8b7d8fdbf6da32cd62104fbaba68b3ec6f1b3c4ff9d3b2096cadd097124ffce3d0bb11cb3b102eeb55d58f416ccff4b10e32f64527bba1bd3594abf0775c283b93d4aace47dee1a040dba4e2411b36bca3f5cda62d1f7ab0b207ff3798de8dcfbb49f57073cdfeabcf5beeafbda781872583d6e9bfec143e1f3d962a4eb75f94abbff61289ebf0bbf4f6ebdeed64bd69a4a3fd83c2b4f211ad2c221aa946adf0e7ff0ad732bc3ca5be41ec12ec9a8a458fbe5956d3b6c72eb7dded5b32ff4eedcbc9c2ed4a6e4e7ea55bc0b328cdede49ac8593faea41bffaea7ae0ab7c2c6ae24f409accbe0e0fa82091f65eea6ffcbad85eff30d76d9f8c40bc8b0a9cf4c73cb879b3769f05a76c2bbb3eddeccb0efd787ac03dbaaba888a2c56abeaaace860df96b4fc81d8bac1d1ed18e8b30c6ed7cc83ed86a42a5e618a6a4beaf0341a66941fed10ec4bd7b40cef0cfb6f05deee39cb2029d0edf3aa961bee2fdcb9bab1e4faa62b4fc50a8abe2f6de3ded6bbcc612aafbc28b7b11f9dd7167ce91b7cfd2858a0db5e03ca2dd4fd4ce1b1a7ade5cfe2fd67070921587a76a6df54a2e589ae0b84a40dafb93d074ed3fdf5a1b2ace12d0a65ddcc5dc1891beeb1ab2dcfa6bee5aef2ab3a68224dad417023eebd3e4af66344c7ec0cde7bb5537f59caaeb2814fdafcd1cff8d745a9df36f5ebb9945f1dcfc7b1ee8bfeba17ecb87dacaebd6fcca1ff301bc0adea418d8fd2defb3bb43cf023d5cfddccf602ed7dd68e72da9e36f733ecd8fee8b66405abbad2edb3cadfeec9c98718343b7aaf53c71b7db55fb0cf1ff3fa0db7bbbfdc78bedad4f3ada02caf09e3a7dc2cced03e888e2ee20ab2a07a9a74a1afccdd84edefed40ad1abd62b7dedb954dc8e0d2dca88e31bd25aa2ba2c2bcddb0cfdef9ad614deb9eec159feab03392feb376b54e726adccd5666e8fdaf130b6f1e2e472de3ae16adfa205cd45e6c67776fbf6c75daddff6bdea24e3b7de7cf2afc54aa270d5a562480ac91fbaacbc7705eece6fc6116ec3b44ede8a1b261b1e4becdc594143f9cee740c599cec1ca81e2eecfcfee3aa0bcb72a8e7e3c6eed27e024d105ae7c5aaad45dc52e45dc0f253d77e47d9efaac6686fdca6ac9c52e0f32a9aefea089faaab0cb24a02ed3734ecbefe69ebee1e73a7e4f3cfe7f7cbfed33bd333fca5865ebeaa2bd8f7af0cd83b31e04f4ab6deecd56debce5aba93213e7f9cbd632cb7886bdb84eff7a0be63a857edd544ae9c3f89b4125c6cc3ebfe3cef3f7bcbb055a6ab22fe80c61ff96e0fcce0ec34ac1ec84d59689aff6f38cdacad66d7ab71c26d0b77ecc9576e5f4ea14f4c0dab7fd04d0da4eb7feb1fcc1c82f17e0f5bfaffb9b1a5104741f6f5cd6accada374a7cebe1859adc03cce17523e9beea0cc5541b0e0bc1ff7ee969abcc6a6299cafbca7606ef733d8b10676ddaa7d773cce6ec749df6a9359b4bdad99cfff931ff407edaa02733d1edffdc625db7002c21fdbb9e37e51a527c9cf93ad8d3d1f5244cf9b5b9fa58fd4a989ac6aaa4c5ed4b631eadbebfa3fa6b110deabccfdd7bf3cacba6b38b3c2d50ed33627dcc6eb576b15e13dee5dea5c3122b0bcfde7f5dce3bc12ea2fdbdd0ae2aaea6e3a2f3b9d1e4cf2bef0e5ffa12a66ee36384ffbdb15be5bcba1fedca17de8d60ebcd57cebb1ec4edcd7ff81c5aa5dc3bb721ab578ecbc234eaaba1b8aa7fec1db84ffab703ef207d4acdcdc0397a5dcea50bffae4cf5e2f55a0ba24afb1eafaabe0dedecba7fbe3b75b1df1caaaf384a57d94b0f9b1d4ccdbae72dcdca464a2ba26ae6cd1fcb7ebd6ba1dc6d01317fb25cb4ab419f059d956fdb26cdaa4db8a8383c91c0dd253887ca19aad7dfa2d29beba91b9122605b0134bb51484bc2db053cf1fe3f7ad5d7c4bf2b71bfb1bd35cfcc7a3ecce9c608fd3270cf8385f54e9a09cd7ced7b4f307ae9d4bcbcbcdf82c06c0cf8aba115e35fdacadb2e45f0bdb027afaed2af1efebd95bcecabda8efebd71e2be2c0d1f3c22d2cf91edc297592fec5fde8b038604baf25d5dd796c49d48d2e9f613bddced3baed86f48c9ac436cdda8f169cadbd06773cac934ded2cfbfeaccece39a50e09fcfc9cdd40a3c5f9483fe525e8b9d1d513dcc43cdac2ccccda79edb0c2e66abf94a8adafdcceadaaaabdc65fc1a88ac6dbebab0307dfbbd8d021f8dff58b9aa1e8b170b660ab5cee701a9c1eae505b623d065f30fcabceb41b69be1bcbecf051feea8f4f02c85fceaa4c0b2d77ffdeefe4ffb8eeaf6daa4f3d72bb6f6aed0ca1a32fbd03e5ae7cdb0ae3e60fee6e3dbd98c8a0afe9404f6adfc23c490f3ec473fc7ccbaedcecc15e6e243d94bf643a2fbd8e068d9e38898876116a4ead75f8693771cbbccf470b7e1eba9c4bc7eaeb37625c0e9ff6ef48d5fee72beddd8d0fae312dc6bb4b3e2b438cc11be4e88edd520cd252a45dbf0fa9b59fab9af14ee48deede7a41cc2151b51b30eca2ca1c5f7fdf0ba622d0d859c2dcc76b8a372a35adf6e2cca7a431ebb56379f9415be5ef8d37b1ac59ba95e6a5ddc82ba7ecbf1cbac1e47fcf32f3d9dfca331edeaeaacea846c8d666c8fa722320723b9ccf5abf0decbd5d1dbfdc63ef87e2b9e3faafe6311eeab031c6d5cfbd5e2fd4a4ecf2e7bc3aa35aa1fc13d9ece5ebbecf23ba66bed3deec69fab8ff857a7b46ccf89a2dadaf4935f7afaacbee46fc223f9c4f54af7eb5507fc1c45bddf97a18ff486aeb209602b92704e443fff5fe767cdfdfeadbbf3f2a421db7f331587cce7d175b1c94ae592f5db2ae1eba048cfb894c7b37bbd00ce2d1f0fa11abff5e00a4eb10eadf9f48bf91014e9a9edbabfebd035bca8be5e25c7c54f41bfed033ed6c063de4caeeb04be56acc109d14cbb5beac7e7b12febf39aba644b0f20460f57ed34cbab4f2d2db0dd5ab84af3600c1da1cc1c38a9a1c28d0fdcc9dc834bb899c5dfd656b15bf5a66f92da91692d4dce39c0b6f8ca5e8951af0ddb7da7fa8adcc9f7aca4bbc542fd87e348ad773fa51dc8b010aa459fbc77de433b38d8a99f7fd89a5b426d54eabbafc30d1bb8e73c25b6b8ef45bfcdf13d5c6dcb1d1dab8521cdf7ce6bbcba9d43d7392b62e18e3a6fdfef791971818b4ac2c61f1dd13dd780d3ebf82dd2814d4dababc379ffdfd4d1d5d1b5b892efaa9bebfaeca643ea36ff77e3f130831cbded1ff56ab6efa46e0b9af5c89dc9df2856850968d2b409a6444156e5827fda8d52efb1edd8b5dc0cc6b4358b1ccef13f3ffffeaa754fef89bbbb5f52285201cf948bccb741ac0cdbf0caa2e4cddffffdf352b15864836b5c0cb4ffeb9513255afcc55faccce9dd605118b899d38ce9bd8dff8e64a2bcdc7afbd380d2d3a9ddf3029a7a2157f6bc495d8bea93c7e17ab1ff28202cba2e8bfbe7c4982ffa7ca4d8fe62bb3d2b396fe83e7fbefefee62da9b6dd0a9fe5dec16b3cccfd7d6efdf0fce7f34efdaeae204bdcb611ccd1be4dd6f17b0afaf8ce323767b6de1e0aab3d88e862feee84afc1caeed5b591d9fde5a5cdc48481cbafa6ccfcd77c2b2e2d2bcedb9b04ec25eedaf79ae25c3f8608ffcf4cb7d2ec6a00bf94f2bfe4c9ac9ee36dfafdec929c3a29dde2b99f66abac702917de766e2f9637ec5bbfc3cb8cd631a3eddb08d8e31e6dd0ef6631cffb77f1fe3db1ec61da5626d9c2e76bdb6c1e3cc0488a79beeebd58ea545a284d4ee3d3c284d4eaef2deb7cdc971afaaaf8cbe39fe3e2aca0c1ef6dd0c53ca6bbbdf47dcbb57b36ac5543b103258ad867b22b790be343570b5fb39acc28b2cfc04c89efb46fecc4d236dbcfaead0c2341bd6c23c0ca741d6e6f868fb60ecabe04f8332d3c4c09c321596beeff5d6ae9d3e0079a9ec5e0eaf1aca1fc8534bc9d058ebb8c02c9b77c97976e71bb1eb9b68dfcf35a3941afaf9acccbdf40b7ddfd8ee78351e9539a3d2ed47c68f8c3946efecafe450d584fd5c123e6d27a123d80cad8adcf6eadf5fa09feacca4713fbafc285b4bfae8bafe4d28dfe7799d9faab7effcfcdd9f86e31ada737d4ced2786d37d0a5fe5b9651bcff3b131f7c7fae6385b0fa95d750d17f508189d115a4cc1f7cdcf0f5d7a01af59203a847ee422ed0e8cfc79a52adcdeafcee9f314db20a262cacfdeaba1bcebf37b9a9aa8bccabfdcdcb55086cafe1433e42aff35e70ff591282bd9d9e3dac7e8eecd399bab8adedce3ebedcd5ebcb96fdfd93c7c6073f57cf04efd83ce7c594e5fc0a0ba399fdfaa45513fc7dd32cc0cc2ecbaa98dddff646aeabad1c1a9a3eba964e5e4bb9c53ac9ea65af02dc7bfd3edbb97cf9eb0cffe531dfbf3eb5bd6b051c45d236ab24d5e8c2f8d8c89e3fcbb9d5110dd0ca1562b9dcbd809a2573b9abffabfd2d22a67a3a28f5e7849d2bb83a4fecdf83d06acfba0afe8b70f5e630baad1fbb9fa9b31dedb9bc5ffabebe7f4f36b0b7e05eba8cf4e121cd7b8ef4abdc22f0cfdcf1fe1bf1aaf39b68a788adf62cb1fca3c0fd975bc7918dfd98ed28ba143afbba6ace0baa7db29c25dddb0fe6a89e5dd43d8b2190c2a0f09fb2c25d729c2b16a8793e1b697cd4bbee879d446f4e87cd933faa0ced0dea7ec24bb9abd1edab58edd24c1ceacd771c7c5da7b20ec81c873a8eed4f5d5aeddd5cd043c41233bfbdfb1e0af0a663bdc06e2be9f02bb9bafde8cc9efac9b9478add0a92a87cc2d8bab313b24cfdcec2e8df6e9d5384d69ed40dc2dbc61736ac6df1f8dd1d7c9c4b3dec9aec7923fe73187c0a38bd5dfbb191bbc476eef3a8acf8b7dc22d8f27d7adfa8330b94cafbf1cafaf05bf936a5e887d246a8a4b9b568f777dd61feb886d76d9f06e0d83e6eba2d4eb4abd3eaa6acc81cbb89c7a09fac8bfbfc1da15c162f1deed7e0bfce2057200db2cfbdd9cfa00e839abdbfdbe2a5b3edee20b9c6cbad9ff5ac81c7259f5ccae5cd587cbd4ccdeabffccb4ffd7d10f0d0cdb6adca7d1302d1c39eaabba6c2cfbd5ec9a5e05ecac1d0eaabf97a29d5e8b00a415afc3a22d1fe0f375eafc6afa5da9c65bca27eee0d718fa2dcaecdadc0c6fb4cfaceaac19eabaebe6e2ce3a35747fa1fcf7eed0a3308c1ea8fefb00835ab10dc93a5bbe1bae99caec1c22c41fe9fd62bf400d91e07ebbebcaeeafeac902aaeac23fd516fd72bafd0c549eafaf5b70a978bb7aeab74cec0366ff8aa8e87a9f68eeedfc63f958d55e0dd0dfea421adaca729fddc4b2acdf8bbcd4267bd18a329d602bbc53a28c71da9ee1cf6eccefcf4aecec76ed64acbfcbbae3cefffe4cf8ddf6ad22f27fbdb39f23e8f73e3a3575dbaf76f45bf4dfbd5bbeb7c8b82f1d4ef50ef97d8dbaec38a3801bad96abeeec398b9da4f7a2b8a1b3ffbbfb50dfb0a6a4ba512eab0842ff05d9dd2104f3c208a09cdea09a5d74f9934d4e5dfadaacf4ab47baa828de7cdc6ce2ae28fe1faa9e30fdf5dea2520ae4ed6a653defc8c0bb56d6bbba2bf84482ecf573690aedc34ef2cebddf574b42b6ad6d44761ffa481f609ca42ebe493da2bebcac4dbc49a8ac1c3aea45c60fdca3b4acaaa219a53eb97bb7a3b6f1eb9cfdcdd8fd19846fc229b2bcb87df110d4030fc8bacdcffc64cdc285dafc498fb7ef4d2f1bdcf9ba9dfe137e4e3bbffffbe15fdefefaafdfbf3df8ec5cde99c3edd785f80a5a1eaa0f7fbf925e8a08e0dd111c8a9abc4e57ccc9dccbbdac15c0ebf609b46afa5d865bcfd01f6bcfdcc0a8eafb24f4b264ea63a2fed34f1dbb618cebbfaa22d8aefea7134cb804c6f5d693dfaeca6ef9a76b3eb2beeafc253b8230bbb8abfbd02c2cdfd5f6564efac9cfb6dec7e52848a1dc8dfcc400a190b6cddc1743255edb2dd0dcd3673bcbeaac0facfe941f59db2dce8ae180262062b69f1c69f77dd6a53256fe4ed75ae9bc06fddcadff024bc7ba1e832c2bd07e2f619afdd5bb0dcf37caabb0d3da0b2bd63cbf6dfb058c18df2aa5497daab75bf1ccd4657ca6e01ddfbe2c3f2f383ad3dbd3d4dfe82a7d0f92be5fabaeedfe9cbdf8d08fe4754f6eb48bee5a1c5cfd0cc1fe8dcbcffa5fd07509bd5803f50cddebaf1befcef4385d51e60f02aadcb85242ed55aaafa71bc4cfbcb28ac9112edffa0acbb29efefdc0e9ddb6d58aacabbaaa75e3fe0bf823ffff8a2d3755ea1aabf67e8a2ff1bcdbf4bffabfdb110b574448fecffb4fb08fa36c07fa0d5f2dda5bd9ab8d7ecaf4f6c540dfd76b8aefe81cdaa86f64dd406ad632311fde0feaa1d0fc2f3342d1de8dfbcf7b42a81aa6fa4edf493feb6cd237c3bb27b9a05badc40df0afa11797a737ff2f85bbe80dcacccfbbdca9df49c47bb5cd14dcff346d294b8fceb729686bbcfdabfb0d0eef57f592811cf7fcbac4ddff38bed58653d5d12cccbe6faacb03e2e88bc8db0fb1a8aa1c6e64cc09672caaefeea15cec89a0f4cf2158b2bd4cb01ef7c9a9733de4df1bde8271bdc4ba72ed8ffaaf2d1d255a4dcdc2b7eccbbcc22ef93edfd0b4c3edcc5dfbea1f5acecc8ea276a8c63f97d5dc46843c6d2d57a7ecdfd8d84d6beefc8e0f991ce39c70cef99b5ffbb86e6141bbccdba1837bcda43bd39fe3caa7d1eeccec8debcacb3a4a6df3fb6bbcc3866cfdbea514329b8e19bc0bb2efbee0bbb4a9eda7accfc1d55ffccceb0dda6ee8ded20fd9515bd53a4e525db6a2dce0092784560b17b710b9aa3ef2952bffec5a5dc99e3f52c0b5badfbd8acf4d5736ffe9995f4e3a3a4e6aec2bfcdbad9cbfdc51caf32befc6a15dc94a336debca3b410cafcb6e9abdcfbbfb837d953aaa07d2d6fe0e5dddaafde7cb696f5a8f3d0cbaf43bc5265fa3cf4e8cfe8d11afcb487dbdfccdfdc1511a3fff35b938df13ee9b5c9a6ad028a80600d4afecbbe0beba72aee4b0035ddca68d29c6c7a3fda9beb0f66b73e7cd3aa11d160d2b6471417e467e72abce0a1bf715fe9bcaa9faa0fa845414aebc2effcc17a6dfc1a06da2a8109b6da21aedacb8fff05974c25e6a6ac9f5ceaf1ddf28a32a75ab5a9df1afc01dac1f4b68cb2ebba2dc261e9a1d6fda3fbdb1b4b6bded2be1865f8c6cb5ce93e2cdfbfebb68eac9de60fbc503be7eff7afab362aee81cde7fb7556bcbba6ba9fe3bee5301fe342eac2a33ef0e4510de45182e3e3dbfbcbd953d5aeddda6fe0f51d5bdfb8b9d4f5ed4cdcb2a032ab02c5ce79a6d2cb7dbfeafd9dde4121f0357e1ddcb2daaa6b28d1fa65d5fa1db9e3bcefe1b0b795acb81acfdbddc6ea5626b3a3baa02a12df6fa74f1ecb42ce5c6f0eab6d4ff44601aa8bdf21fef6e21765dced297cebaadeeb2ebaaedec0caceea5ef0ab40d9002eeff4acac62f9dffee0b6ea4d53a2bc26cf38c714ea086a182099abb44d8ae3bfb4b4aba10a3e5a7bf179c3e22e437969ffd81aae83c6fece59afe97ff5beb5c4d3a7ed8b04fadbbedf004a2af07dfdaf5b7eccb825e5e1e6ab68cef1b95e0d3dca0b9b3386809e44cecdfdb50ef76c55125c6ad0a93bedac282f84efde455bf2bc94e26dcf2d1e5fdb7e40caad6bf01faea3fbffb315a588958e1dbfbb76fa1b4644af27a43ebf4607b3cb4cc01d8fa1d2db3d39e1eef1e3cacafdcdffad1887ac0e596e8ac8bdd0abfee1c4dbd5eef54f98d4575e42676eca83f1acd12af2abce9d4dcdbf1d31cd09b41deb577d265af3cddfe0397b5ab7f6dd9a1eb2c2fcbc5ecb36b0f05fa54838bdbd3e6e5cd96be09d9fbcf73ec964e6c19ad3949209be9b193df97fcb78bce9c8df790f41eca7e7d04b7b8422af2a34b27d87b51fcfcba1f2ad88d57b5dc525febda4beaffae63ee24c3767b3f22ba007bb3494ebfb15cbbf90bc090cd6d5bc951e1db607a533148d8c4d5aef4ce3a8841cb9ec6c459255ef00fb4167735070da5dffa5bdb8b85cd8cd0bffe99bc617d40152c9e74cdd3eac11e8072dcb5cf5e5ed7ef8a7f2e25020db8a82a59a362b599a1e3e63d9b845da3afcb1160bf227bfdabff2248602d1522c5fe993460cd1220de1dee42879dde457462051cb6c5a5dbbbade008ac9bb8f713fadfd92d13eaeae8cfde8cc4cfceed577ba31fff8aeb2aaeb02a5ce45c8adaaef7664548e088ddbc422d1c46cad2af5647df071060bfe95fc565ff744f2dcae5baec2b7dddfc1ccb06ce8f1d6e596bdc9ce51418a812a0359bcc4c16be6beb60cbf3876d42c91db3800e24aecb58a5a3e2e2edb4d7fe587d4848f53eace3cc0bc96be4fbbd0d13c63bebe198b0cfbcbf935cbded5a5ceacbf6994db248d04abed42688adbe83a3fcbfc4faeffcfc26a558baab9390db9fb68ac1df8721486c77c0fe375a25ebf9ccb44feacecf19c9b350fedbd7a4e77a2caacef4243b7b1f0b2effc18942ac4d7edbacf6aacedcdb389ebfcec63035c44ab09b3acefd0dcedaad37aceb92debf1fcda5afadf997d874ffc4b8bf3ac2bcf4effaca0daefe2ff2a496bf5a8dc4da4eeb93f08bdc9507b6128ed0c8751ed465cd653ded6ab7dfebbbb73edb69ae024d868f57a1f227d60568a9eacd39c4caef072f6b3c05eadf015fc06dff465bdca65ede49c3d30fcebadd0c9af7a0e177f81510ccc975470abf9a1a44693e798156b0c63efb3ddc744f457ea2be7d31eb5282db6298d4e6904029bbf9aecb43fb1f464aae391efe7cee6ceae7685d50503b9fcc7146b4befabab24cfb2b164aa3ec1e046b88e54dfadfdc86dfeaecfeab72fecc44fb6acd3f07cc9065c3afab0fbc6a0dc8bad5d4651c9adbfeb36e2b42ca60cbd4f30f4ee4770f1dfdcacab6f8eac52df6ac6649dabcb8de9c5ee5af6ea520debccc0f1b7ed599c96bed32d0ffc5d1e0862d79ba1d5d531bad85bbed588ffebfcf6b0ee0ba169df02ec1b6d6bc8bdb1fedb2abd0ae964fefbb5e3700ebf91d01bcef09cdfffc20e612ebd721017e6494d0a1dcf241cca2a43fc234c04b6bef7be779db6e6cafbf623eeffb776adff483c13ee2550fee6f874bf1bebb9843be55babbedc0bf0c5daa39bfc7429b07f675c707cb83d419c83d6f02d32531ddf23708fb68fdc61c96ac99eaa828de3d0cb02dd5fcaa9518adafbfa052fc6b9e8fe94a9e0eb420dcb320e6c5eea7faab2ea372cb1f90908f2d8c4d3d8a99a5dd6abbf90bbe610b5bebcb85d59d3b4184f474d86ed4ff7f1b9ee4ecbcff3eca267cb1adab3b00cb2e831cc283cefcf797ed8d3286b8b2241dc012e89c8ffeeea7c8e11bf9e9cabe6d1da00d5f5fac52cdc07a8028bbfaf911f0162e0aed492cb33ede16e59f0092b730d1b2c1b1cd63ead3e3a62e3eb1d5eced5a1e842da5df3bfdf5a12eabcd44c5968fbdee7c8b669d5fd7f7c3f44dd413e1f4c3b18d75aaccba743c1fd95fea324a25f2cdff8fbea9faee42c56aa42c56dd5989e625dff5075e87cf8ff626361cfce86faef41e0d7dcfed59aaec566f9be1c05cbfb74c6f3a3fac83dfacc74d9c91a02ef7aef08dff5e6ee95e5afed9b14ac7ad76f31afc2efeb632aada7524fdfe1aef8dcbf39aee3bc6fe553bb74adf4e03c1fdcc2a024a53ed08aadbefa8bf62803d52cbad6bfc97b2e9bf80fbd151b9161307e310efa6098a6f9bccb44d82d117c3ebfe6bbdcd6c4ef2fc1abe905c8cb87d5cd7dcc7bd32ca6dcdb44fcf78fac63df27afeefb23baaf665fe87a5135c05ca419ad028d2dcafa05bcdcdf5a0d451104876b4bae4ae3d60b4abb0cece374846a8bef74ddba62c788fccb63b7a9bbea5bff539bfcc6983e7fe55de49a81eceb3df786a9093bacedcb7f43a36aaa7acf57e7fe38153b4fb03dead5d3a9bac9b541da2dbbd15eab67192ed0bd135ad6cf58d8cbf661d63182c332bf25b1f95c13afa6bd7b6abc41d54e0fbf32e07717d7cb440e61cf671d1d64b066df1320757e73088fcfa22f863d0a8fcfdfbd0e670deecedd3f0085f16e6b55ca25dc0ef65c1adfaf5169a12dd0b96cafbdf956edaf7ab76fa35beb6e3d349c9fd3f8bba7f6eadeb1a5eb9f9b572f4afa06fd3ca2493f22d77ebad578ab184b96fffffb4a7b1f1aab05eb414f4d0aad5cb64b05f15e1d94b6b25afa42b76de2f9308ce0feebd810193e52b0acfdadebf16f04ab28d6eef27ac9bfb44bb72ac6d91f6b4b8ee2d96123af5b8ef191bcefedbebabaa2ccacedac0860ddeedcda6b5cc69b9fbcd2a16ff6cccbc10e1ecab1ca7622ccdd054b9cd7a3b7d400a38ff2a85ec5cd3ccd8ebf9bacefb1f351fc0dadeb271d44d946a01a85b6b3a0fd9d85245e7b67dff32fb1efcac7e70d8934eccd0a17b3c2a8764b2e7150efdfeed7f91b64c623b36f0bc67256fddf0cb2ac5de80342f2fee33dbac16f5a091c11bed1f28decbefefdbdb326ccd7b6a2e92a1b9dcd9245bdce72cb3bef2cebae3bd3adbce12ece60cfd2bff4acd61d93bbae5fe77cc3ae9dae6c24e46062df8c6d8fac39499403d52d0e6052d2402cac1aefcc3a5bff476fab60dda2bafaa3dd88d692cde151ec13dc2dd69d0285d9c439817cff3dc6d030c973cba7a7da475d2ed99f9bcced21faffcffebaa82bae4afba14f3727ca4b487cfa8eedb2bd4f81c3fa9de9359dcdb9b580faefc6f7e080baefce6c7fcb72ca12829fcf70ff7b691b17601ba7d2f9699fde7312b52cf80cef8ce247bef6b85fb0ee1a45db5d29af810acbe519adfb5abedeb8dedb400f299d6c6f6efe165940fbffafb852deba608b1d9fe76f4fda2cc053aba30c399d7dcb8344295eefddc99b7e9fc5ceead2ae1e0d071cdab5c5c7672cc6a690897d29110c6e67bc850546b5a16ef4f7dfab05bcefea207ca645bb70d95dff947c78ebf037082c743542ceedaeb6aeedfe2cabf9e0bd2dfff60ebe7a83dca3d307b2b92de270e415d7cca5d5d49c1b17c22a98b29493dde20c881c1c83d67ead3fdf6d8f0ca3cfbadd975cdf3aefa519cfe6d8b9997dec5afff36cdde81bbfc27d25fcaed0ef6edae22f05dabebbbffc8f839ccadac7aeb88ba1f0b951e0aac192bf0ce4879cae25d3d6ca7204fec273ac4fd66e66fbdba0c50ad44b1cd6dddd4b61d6e42c3bd2bab90dbbfa0b4ce849aeca95f1a032a1ec7606d52d446f1da8f6bf3bfcbf1e16f9f8668c27d2912947a6be4cd10495aea222532aa8ccaecded4fdafcef4d7c62d9b661211efd09bf1fd6c70cc76e986bbeeec4dfb80ea54dfefc0f3ab9e0d0e84713a8d716dd528f4e0fd67aadecd0ce6eabeed4eeef3a873c9fdaa8a7e280bfb96e6948c1ecea24405e45076fc4aa3c31dd449eef8aa1e3aea53ffa70353efdefd7eb670f39c38fafbabdc6d1d941fede5c42eccbac68ffc2d9fb34a50947d987e5e8cf90a7cf3a5f9f6ffb6cf5ad387ea7eb1b9bcccec8ed9acae8e4a0e51a5b3e2641fdf9f5bbeb523c56a735ece68ded252a0aaffc05bd2344d78e5cb8b5661fb0bb91aa32dca92ca7b9eb37c7e52f6e56f2bcbdba90daf01ebaaf3bafb2abfa8e5c6fac372861c42ce4d76fb4c2e5179d1b770e8a595b24b04d7d31e2ffcfbd0be0cdebfd72e81a66ef915ad757b42eb809ded69e718f4b31cdddfc7ad3586767f9936fabdcefcdbbd8bedc8d6dcb0bcd2ffceccce39fdfac276be263eaefc603a0ca5af1c2eba3b6b3c82fbb0badec90edbe7fab4aeddb35fb9eaafeffcd40c3e078df5a6e7abde4bb3d4cd3b894f560c59ffedb1fb9c67c4c534af9011294deca5ac1b9cd63a50224acc44194fd0ae7fbbcb8f4c8e7d43f6cb7aa2c821b17fea0560a4ad0c2b42d6cd8ff33cdcb4df5a6f88af5cff65ed81e5cf7c8bf57f536cb07a8fd78fee314f6f8b712a5efb4c75a0cae48a6759199036c3ddedcfde88a967f8eb9f2fb3bf52ebffdccf41bf2dba3afcca0b66ab3b6eec7dcd2fe0b194d53e6ed92b3adc22afaebaaccbdb6b81428cc56dcfc1f25b76cdcfbe2e4fca04831fe2acbd96da6afd1f5fadb3bd9e1bcf3a1bc02a63fefdc4369a4ecdf24f9707f81e0b1adbbbbbf6cdbb3dfbe8f2f2f21f5bd391ccddaa98af8ab8caa3e2a8af5ee91c39b2a4ff04ddd01684838df9eff7e422bf3070c9f3d83d0e32bab6d48c376f68348c40aa5cacbcec17ef3a3b9d4f6fe5aaecfddea602616bbaf2f1d1dd1ecc9dbcaea943c4faa55fa703dfd00e678ff279ec7b9be04adeebcbfcb3fbd2ea476dbd0b1e9b604ab4f3fc1fe4343adaa5aa1e9a5cf994eed6afeda5ccf5662dd4a11f6c3d42ea9fc6d7a1df6b974dcba5bf34ffb1f7bdf70adeb763ab40b5be3abed45dd4fad86bcebdd3dbaedd2ce0ba854e880737d93b24d7e8b2dc369cbfe0dffff86f7f83d4dcc4da4cba9a446344f10bad8faec7bbfd391e1b70e3dfc5e58ccb5f2009ce0a9cedfcbf24f917aa381f86f53fe8ad0f597b2dc8af24fc1511a7162fa68bee6d39faabbdf3cd9e5f2e2d7e8ac6fef9a8ec64d6c3c5cafb1dc4ebcab9cc1aab297a3ebfcffb0fe1bf2731f02a6bf64ab70a89345cbe45dd3b2aa68c0f2adf415abffbb72bd2f95b1bb26efca5d1ff5bdacad9db8dd8d77e9e787bb7a88ebedcac8cd0603f0187eac2ebcdad36bef9ba0e718a03bdda00fe0ad2bd3b1fb3a24fb6935645217b5edcf6b0f67f1b4ddd0a44aabf2e5cafd58aa4fb65cabe90bbf9d8ae68a4d3dc1cdbedf5ac42a3a1f994e4fa2290653bc9d18e0cb63145efb4cca20fc418b8ce8ff65fdcd326e5bbe1f02e8388c2af5aef14dfeb16283c2f3d82cfcdc6afb93f96e8ebec7a54da9f1cc9922ed25b8da19bbab3c8358f6fbb2fa675c2e07fd53a1b14bed6ba31ab54f5dd53d629fc6e754e24e8f67d5f73ec3a884becaa5f4ed85f2afd8afbdede830cb0ff1ec6ab1efaca4bafdacdefd310a4be3d193f9c8ac27b78abca1ccbff5849cea3ff500b9f4f4bea7d64dcff2de6cb1f8afbcdbfcabaaf667e817acc1ba5de80374ae1e9f62eba2e5b7ca153c2d3cbb58f4bdc8acdec5bcf33f1dbe5e10f5904ac850dbf8feee147efe15cfadef43def10393355da1bec348b570eada01cbeeae6ac0fc5ae20870df5afba1ba7b7c2cd7dbbbc248e36deae8e9e7ba36ebedefd45f81ef42413f9d4c7b1c246fb4db57e66e8dea4efce6d45ed1bfdef25cc0cc7a8a80b5270ec3d85bd8e9dcca5b6ed3efaf0c1eea1537ef1f4f3272e2ab03c9d382b14bcc945718cee341be34a0753e2f32dba7d3a35ccc5c452cc74d86d9342b73a5b033f0257222dcf9d2bf75a431c5d92bd8e5584d4aa8d642f366c7aa65bec5122ff9bd59c7cfaebac669bdced61fd5e04b24eecf4ff7f55ebb1bab01aa56d3a1327d43b593cffa5f2ec9fab8918aeacb34347a6f47ca95b427bdad7cf1cda2f3e358ffad12f26c18dbbb315c2d5ccaceab294ea118f9cece5cbafc1c53fafbae4faddd1dafe0d2e507af4b10eaf49d4c3baaa13eecf68d88fecdf37c0a4dec43daddce7e998bb4cc15cd8dd5c360b1e02b60a9dab3ed3c8feaafde6e18c0e17c38d3acb7ffa3d1350b0fd772430e9cc282ea7fcdb1cfc61d6cdc41fc0f33b2bf1dbed6ab42d559abaeeda38f2efd15a0aedbe73c13c46555fc1208de24c3c8ef20c9dc1cefd959c8305dfbbd7624c3bfa904c5889cc9cffa69d4eb7c5c4d9552293c1dbc5b4dab04063042eb7e6c25ecce02e3ae1fff1712656a5aa16ff62eadf61afbf56ddd9b72badb7d0c07cf38c338ec58eb4ffae2d0ad5dd9a31c664d5cacd06935339df476b9db9ee8dc9d8cf6d7532df2891b51a32dcba7c3c24a5dc4de9bec99fe24999c2fbef16cb3e9cbefbefea6eaaa0838534a09aba02ebec1bf319bef71c6de3bdf5ff4fdc9c93abc96a4b9b5341cab109db83ac4e07a2ee16bbb4f82b65e3ebcce7681fcbdc4b9d756fb09dae23b56b2d1ca261ead6972b5681f20b879f9b1db7ce559e2ac306633fa98c5fb9bdd24a6a0c54f4739ef7e462c2abde8fd047a78408ebc5c0a6dfe2fad8dd4da85f019d2f5fd4b3e57ff1e896dce2bfbbef0ffee7eabc117bfec2e0c0db639a5386bd74a0adfef759a1e0a9aa7644ae792e8d1ae40c6d3c2f6e7213c56a19d1ee8cf20acdefefd4fd8fdba20b44ab4a1ce3f0674e0f9dd231071efde77baa12ebeefafec5cc977cfcf5b9a4ac9e09bb39e77cff10ecfc722f5c1a69ec584aa4e4f3243c25ffbc1ee456c96e90efddb78155ec723d8b77ddc2f279eac4adbad030c9ef1c3aaa74e5efa6bfee6076a6cf8c2ccbd0c4a767eabc8ad3def8862eebd23ea401ff9625f20e4dcbf9482a006cc8fab7bfcacded3dde17ffdbfdaecfc2aaa64d0dcba201acc3fdfbe9b3c814cfcfbeefd3e071a9f5ab9bc93e91ea130234621b1dad19c946325b04a76d2a1d09de9b4ec5cc6c49ecbfacbba7fd4ecbc07ebcfce5bf8bb5615cace5b17ef09f04f8db9eb78c0b23c4eb1cbd3ca96bcbfff63da2f5fc5ee4bb37cacf5d29415eba5f2d9bcd9c095b16cfbdd08fedd6add82bf00eca2f9e8e902db8cc8ea6c32a171337e6e54276d3faa8ea8daacec316a71e037a52c0402bc90fddacf3e4dea6fa0edf9167cbd2b8bb0b2c99e964ec5cb9fe430ce4b953de6aff78eff328bcb1ccd48f7d5f0ba0aea36bde44b3aed023176bec2e49f36cebeafbb0bb9f0fcfbaef390bca2b1bdf012dffd6fa4c8fab91290ceea28965af132a08858c05e6eb20c5f1410cdae9d49b95ca113c74df6e4f09251bf9e1ec75eab3d6acf207ddd8fd7f6a5d793468c2b9f7fdd9d67c29c98dcc51566b5b42addec93cfca4d34c27df88f0d9abcb3bc4a0d3bc8f1adc9b27be28abf7dff2eeddd5825dfabccfcbc2f9e8c8bbfa09dbc7979330078d77c4effbdbbb4cdfccc0fbc8536b8eabf9f94acd8fb4d517b4b0eb5f17beb6b8fdaf2b3d9abe9becaadaaa080d06e2f332be85b4cf1ed73e8f55deb0ca3eab0b5c8beb5917a465e38bba23f6fb92cac4eeaaebc73993ebe9a14c9009f79b50ce178de1edbee612f39ee9b5d8ab1cfae783cbfee2daa86f7d5b5abafae7ae7c0ee7fb5e1129f28bce3e28ffadb8f3a0c03bdeb576bf497a6f66f61027bef1eab1bef346cfb5cc505ab2c2d0b356ffe4e1a1f0fabdd6f2d7c34474eac6a92e52c0dd82c14badd3db637d72f9bc7c3ede5cbebff76a92f36efcbbeab1e3be93db5edaafc3ac63b0893e6935ffb3b32fed183ef50c6162bb422fb69eaf9a856b1cc6a6b4e05a11484a2696b2ab3de1dfbfd6f6537ca129a522d6c1fb8c3dcfc0ae1bfbcbebb708dcecfaa717a36eec9f66a68ac2e7cdfdb7eff9d5033a58e9765efa0dbb9f8d4b0a28af72db8f0e3bf6bb180c3e190cead5abeedcfb067c3b78d018cb2e4abdf6d6ccd62818eca99d3fbedf628bed8ddaaceec8e65ebb566f41aeec83e5c7d7801d3ed0d073bdf3d52b1dc37536a161d52775e37c3dbc12e6e12dad8b31c5b69aeb0af3ea2bb164f4c9afa93dea6eaa9d652eb149a407583bdada35c1dca39a85ec1fcd3c69a7982324eeccc8d3cb92a5ebdeca7027a3f646bef7727faf4e3de3c668bd2edc86ca5b4c1fe87d4b5fe4e1afdbfc66dbeed9ce2f4d50aaadeeeed38baecf1fcfcfd7484c5eadd059c3caba457dbfc1ad58e1cbcded98e76aebcaff9c240eccdbaf7bb1cebadd7b67c95f260beacd5aebc2eef6f9dcaadaef6ebf67a01f90b8a54ee2fcd6f7e0256d1fca4e70f3913abbae674d2afe3bacebebe57efdbd3d2a4bb8f1ce6c0ef7cc6f673d20db99cbdd4b1c77d0b98fc92aac3b389dd8602aaa5df95bdf1646b1d70d07d81ef059cdb2af477ec02f5caa1bfe48f9baac14defdcc9bd337df9a2fc7c1addeb4ca44fa75dd0a7adba343eadb9f8ded3a89dbd010b5eb119eba9ded7b4bd8ec1e39bc7fcbaa0f5bdbb0c6f4ff780cfa67ab7a12e1e06e4e7ff9c8a113cc52ce5eaef2acbe8fa90483c5ba0f31fc15ace8a2d19b1dcef1dd0a2fadab8edc6b4cbe629bda98fa0be3b65aab6bb1e9f5dbde14def7cbd54e5affa5e45acb28a32bbefcde7c6d8012fb0f02b3ce0e0ea3ea9f5a3ba0f0fd1c2220b69dead21f6debee01b7fa6e73586fe83bf662e63088dfc65eace06ce34d01bbaa7d0e4caad9aee5ae9d08d32a5e9a023f0ac17a7efb3becf7f47287c6d7d8ba5019f726e2c7a09fb0fadccc76e6bebb56eccc3ae2c07c99a94edcceeb5384a60ed0bdc95dfb89e27209ef4bdc0d25cecdbba3bc83b5d7bce103da2f68dcd17a480fe6b0efa6f1c0caaabe316d3cbdf309f7c5e07d94fc65dc6c7a3b9763ce8452081acada2b8e20e37edcbbccafd0ffa3ea2121c62b5ba82f8b87b7ee5dd614a74acd6b867ce1ebeb9cd6c15f761ea6a2be83d3c18f98a899322debb666cbe1ddecdc8bfedce51e2fd2669436a058f081fb7f2ad53b3caabc9ecce5e7f3dcd9ab73ecc295b2720e38bf3f3b9a9ca20b6faf3c5161e45f0e5c0ebf8b0fb04fec61d54477fd3bbcd8c4e4bdd65a5cfd5e74cef02c17ffacdaa5d486f7e5a55cc2cf1d6e842eefaf7f27cae270ca30adf024deb81c8aedd86904deef543ef92eddff90f94acd1189ff8fda08ffff26c6ab292dc1be148ae0ed27eebd3aafde764a01521fb5428cbbeabacdcae18c841665ffbc1bf99f7ae98e66f3d0d8afa50f08c4bcc5ade311550f7a74c61adc70f4feac4ffdf24970ce6f7f2cf5a065c2eb3468fbdbf0f2aeacbb2bf33cefdc0dc9c6df37fe1369baf0d5b7a434fdd8da492e9e4434acebf9fb8de77cfe40fdb6fa6fe647ef1a393afc66fcf62ca8b8fccfeac0bfbf37b20d1d07bbd7cf0f730d2cb0d985d6ec5bfe04ca30c0d107ed0a382df9e1e2273aadcc3dc0dd5b6a0e59ad2f3e3eb6b74f074ddcf6fde9a2ecb99ed39a1bcaffea2bef46eaca1d7a8358dc7d8e3fdaa5abbfcd99b6114025a07d67fe9fe11ee783cdd309437d581358ccdda598fef581bbddd90f155a8af8b04efac2bd4b7728bdbbbadb2f17e4cc72f071c43da9c6ae691b1abc8c7ba8ba078db6dba25ff05cb41aa6befce5ae420a4d67ecffe5fadee749d5eef0ca8d1ffc1ec877caafad104abc32def2c8d0abad0eaecbe4afafc3d2bbe66cfe1e0a2aadb76db8647f9fba8a2fae3fcaa87cecbb12e05aef01dbfeccf0a9ad23596beafb1ffddbad084d93c1fccbbf37eadfb4b4ee57bdb634708cd11e99866e0bd1d78af79acabfbf7dabde55f15dc83c9cdec73f7bf50f4fa64be45aa7a19fcd1c3a499eaadeee8bc5d2284eff7882c2a5ecabbc5edcb18fc9cbcdaa6ad9dd391cbfeecc02ee68ee9ae0bceff42d17a62bed3faffecf63bfee3fc35e89d5915fc71a20fdfe9a7adc1a9adfeafadf1ff563fef8aa98751eeaccd0fce2bf239ec3e8abfef5ffe54bfd7a6f5bdb3b3349af68f629c38fedee5524de9e8abb646b60d8ebcee8c6dbd9543af8a55d0b1d5b0cce2405dcc49b9846da1a0ee60b5afdc6cc8fb1a2dcb592cf81905343ae69e57f556c551dad4ccc9b269ddd0bf171a03cd3d3f74eb75653dedac0fb5fa48e72cc40b5e11cd6eac66fae51393e80eabd89dabbf01d27dbf1d2c2ee5d1fba77deafe2effeabad8c9ffdcfabb2b7c969affdf0825dea7efb16a69b36d4f51cbbbfd7e1ce8b8a9f7ae210cb248aada0cf2e1880b5e2def03d4fcdac91f2a8da0ed63fdfa71afdeeacafa2fccbbde0ffdd6baefc60340f869140bebbaebef4ff55c1403746077df3e9e708e86b5d0b0fcfbcceea4dead13bdff874830b81beab92ddaad41e5d8bfae36ed7a8aab01eb615fce99bc2e1b84d32236cd2b8edc87b2f7ec4cc9fc8059eaaa763b0c939b3519bb1d3ddcfc39adf3dfe8717fd685bf3d02e3f8d458f5c0a88acefb2efee4e050ae14eef1cfe6180dbfcf6383dbf97edfed27729d0dbf06bbd69ecdaa0f5e03bc23ce99edacaa3d9e9fca97e4a8562c61d30f5abce1ffb95e2703781dad7b3388b7213ce32ff406ffdfdff98eeca14c51d3629bbb4243ca8e572ef24c346cacfa7904a2bd2aa4632e02235b4c626bd4cfdcf2874fcb78ec5778eba0da9af40dfffbb31ac2ecabea2ff707bbf91541c929d8daf0ced3ac489efcfb3caff8f82ba3b81dfbb9107a53c685aed9bdd86ddb4aba0e42ec02ee5ed3a4cecb032af062bfbb6db43de3bb4df763530ccacf9edcf2cdeb2ace05fc48769bed1f3354d4eb4adfdb5c3aa4c0e2cda638c126061303fac09deffde7d64d3934cca27c75ddfed7d6c90ffb5f3f2c5fab5724e7faffce693d983eb6dc7dfdd6d5fa11b1ecce15489a4cb5c4b01ffe667e1430906d3706e777dd7bbae95cc11be77debea8911af585aeb98c83acad0acf2b4add5ed9d4cddd9fbdcfdd8bf9e1accabcdd311248a3db3ca84ededeb5c7dc380aeae89ef8787a80ce2e82bba1a52a4a0ce4f43a30fa0bbaae3daa4e7a6c561205ca7f68bcee3eabbcb2328f54bd147ec7622bbafbd2eb527bd9dce8ccff94fc125b3cc509d3cfffc689c0fbee0ef0afc7164bf3f6baa676a9caafbc741fecca40ec47a1ae9150fd21777baacdf84cacd342d5f25a9bb7ccdcaeaedabeb54d26b337329bd1734bddbf2e4e6b5daec7e5bccb2ea77bf00b360a1ec131e5b8e93ac1b7f6b517481ec45ab7ceb88aec2c8e9d6afb65bd034a9faeb62391bad1cb5ddd921dc66de229b63cdb7dc5f36447162cdfeeafb123ebf5c3ceccc583b6d13e6e766bd78a7ab3cceefbff237c20329d196adfa43caaee2cd8e1fafefd8244fe7349d1e96c90dcfbafbc8d32aaeebaad04e8fe3f86f8cfe661ef7f153095a1e46ef2da5ea119c0537eb7b43f4728a4e8cba08da45373db482d9ce7b921da97e6c9e5fdbd9ecdfd9abced783b5f3cce034e7bed7be9e0277b82b9f7d7db7da7f25f998d4e1eb526d739a867d60293f6afe00bc74ac9cdbac62e7d3ad865f793cf0f0bb7c70a7bf48a78cd83c3ee5c1b66aed0c66ef7b0dacacb5abe5de549593601ebdca1ac76e04fcbccad43707cb3d9acacbfdbd9ae8de715fc20403bc402ca4e5e07f56edafee5fe5dbc0aff9cbbe91474cde7d3920f8a5c2b198f95e0badba508a7ef59d52ef8b41f9be70ecc30dcbcbf2f3db866d0f3ef7af1facadaef92e633efb4ba6a1f9b9e54031d5a0efec1bae8aadaea56d408e903c60e4e4fd83fb2debe4afcba236df92ccc639210068b4a19c64e83ec9a9d3c0c0addefec408fcb845bcdb5dc6e42d9feac1c26b0a4f1395bde69caee2f9faa28039d847ddeb6bd9f03fcac1a79e8efb88dbdee424e2ab1193aaa876c16fdc4bdd4caa9bee437b1ec60fcbe41ab9cbd04c1cede1f5ebdba9e70d68fbb97410da6d324f6b55442e12be6f5658fc54dafdfa8b3193cea845aaf784dfd925d61f1bb71dff2f4a5cd3aff3bd8d06e8717dd35dfc84203b7bbb8bde9c3d1e278fde76cbef6511048d8024f31f6be55be1d1effc51641cfabbaaadffae395218ec0facb1d25face54f2d17bbb597fe2dda8b644715cfd6b6e2f616978466feff76cf4ac44fddbeef5caa6ad7de28334dbff1a6bac5a9262aacfa10bd29c6f7ac1aeef138ee5fff82ffa6bd5a2bf9323c18b81df7c4bfead867dac2b3b064cef33e7ac7b05dfcc65d8c7c0ced21cb4d3aaeeff6f7d8033d2e5180dfbbcf6d8c2beddd7ff8aefc1cfce27cc7e8a8d5fa8a1596d5a655b3afc1281f6e65c0a0a4c91bc0ac6d546eeaaebccdf599aa29cfa06fa33fcb7cbfdfe87c8d4e0aacb13a71ec62deeccece7aeeaabbf5ccf3e8ee7cda1ba0c45ddf99cabfdf9da1c7c4aed86f9fbea2ca7caadfcc78c109cf6994a01f5aeefba25e8e614d67bca2fc550ae7edbfbd3d9deccf87dd10557a201f9a67b4acdadfd3ae43fa42d106cf8cda5fa4efd5cfff6f70eba48af7b89ef5f18044cf43adb21fd3ef9c3eaa70aa06e4efa07dbfebb29a8adf7aabbcb24bbe04152ca4cc920cafed6fa1f2eaddd2cfad3bbcef8f5a8bbba520c1d62dddc5e2b2f62aaa94d4f8cba4400bf2ff5c5fea7b6541aa6ca0afeb325cbd1bdab8db5a30d0fe46b62f242c2db17db28ade9f7bc3aad5e8c5d7f19cddbfdc7dba0abdfdb5336db5a6ed7db9107dcdba1e0df2ef3ae13cec69bedbec92fac984e4b09556e5c78beef5c6905f62fdbeed4b4f61a55a4aa86530eaa181aa4fac1c2cc84adc0a17dcc8e08a40d0df3862de7dfe93943aa2da1363ebfa1180f3cddc0af9fbf81ba4c0d4bcdc1ac8ccc1f770cc07c65b9a30fcabd9d4202ea0d7d831a0bdb9e97abbd7e19c1f66d0eaffdc66ea2b6fa1c11fb8ee6a00bde8add7f5a785a8cdcbaff0a55e902622cbbf33bbfff9bd6033aeafc8ecfbde0c5aaeeefe321c89b2e77fec88ed814b96178a5c5af3f9f60ef3c70bb5d8eafa4dd6ef940fbdccdaa1ee5eaa557c94fdc58af99d154333cba62e5da8ad90c37e7afdc5d3f8f573a84a2defbdf5dae490fbae4b5573a1916dde804b2be2af59f74cc6296b150bf4eaebbad8e2f1fdbb5bb19aaf460ae5d5ae7df49fd8fbd73debb6fcddabb1d60c3bd9f2f4b81c92ebcf7d15441ac96cddedcfece4ea997e43afbfc9e5d7c7819a0700a8acf5e83bb0e6915830a767a634e87beabdde3afbd56db740c36a24ddc5bba559cffc5cae5ad5a0b6abfadc5c7cdddaae109eaac69c1bd8cf0fb7573e22c5999ec2e18f66ab81bb3acd6d995bb5bc8cc20bff6fb23a5e1bc4cd9aa5fe3ef49f3fd4cec8fdd785be49b5b1b14c1bc309de4ad55beee34ff7c8ba2112ff7129cc638c09b6d8bfaac53e8783bd11e427e4e55ef81c9cfd5bfc4fa463ac8bdad90aa29fa1addbc29bcfb5f7f98bf2737cfa4caabbd6fbe68b92cf8a98ebae9ed8ee82feebe7f8e518fae0c6edf20ed315e743ec5ad17196aa0aff37839be1bedfe0cadebb2d309bbac0ce38c7c63dcd7cd4cb77ac9e5620fffccde589dda8eddac1cda1d5d895dbfb6bd1efd78676cde80c52ef59ad22ee3d42635bdddffa2b2d777bdcafae3d7476c14e7e2a08ebeaebd5f7ca8544c8dd61c5b5c2d11f0ec45ee56c701d0cfa404fdbee4d58cf6e4dcab8529ceabd2bddb5b0ad67a631310c401a987b0be5d7a26ce5ec7a894a42e1eb1fe6c5128aef2b779169efa2fc7d9f4adbb0bae1c2eff9ff8a4e11ebbc1ae28f8bcadcbf6657de18842bbb4abdd0ce1a6acf9357cfaaec47a4e8d5de9f04ccb33e75f3c719208edd92ccf4314ea2c58fa9f988fd2d3ec0cadf9b8be99cb5ad952893c3fa27c8c8a87d1e8d89e5002ddb686782cec4f492deff7b06dffe0cbda6d311bc9f63e118c2ff0eb894128fb7b8b9ea5360b9f05e4e750a9ecbf44eae76adaad064a6c06d5048cf99e603e1946e2b75cca0bfcc240bb2ed7dab8074eaa4d5c0cbc5ad53ca4642d2bcf0e62ba77aee9b6dc8be84dccfecdcd6ed1b0bcb8ac5ef2c6fdb7b18c1a0ed8c1dd6fb647f59d5dd07d2bf3116bb47bc752d144b1a4bafbdd2e6181dead3f2e6d2bdbf3fcae57aacaa9e188253cccf354c2b6efc2edf7208c5bb5294dbdedfadad1fd31f9cb4eb5c9eb19ebef8edebc1aebb73fbcad9bdb2dbdbca3431ba590df5122c33edc3f6ad2a557e3ced1a64f389bcf84d8abaee439e2d56d829bd9d63fba73f95fbdcfedea1b12eef08ec23c3c2fad4c0ecf9d1fe7e6b8c5aca8dabab4edece32596dde79f2bb78f30f3ce4f3f76adb8acafb1f8520f48b5c22348efb2ace3becd9ffd33f6cb1ab39976cec3281cd1dbf6fede6a3bdc2dd53e4a1d4b88e5be975be30122ed3611facc31c3eccfc4799c0eac595de390bc0c8f6de656eabd78929caab6bfcfc4ee25ec1badc2cebeaea8e3bee916ef2fc592cabefa7a5e227302fb6cdaff513bb3c2feb0e5182be6f35bf8fb0ccc3f0772dd7ee99d3acaea2d7fac3637ef5e3eb0eccc1ddffb068109882f36eeed1cc3ebe3acfcefc17b8bb5b312fbc67ee8dadee337f58fbdac4bada18aadfecfe2ed2fef051deccf2fd7ae3ee3fcfd793feb4fd3bd9c8fd19dded2fb1e96dafc9936d7c195b2d1ebeecdeb58dfd71cd7438dc91464c3d9a582bcbdccae52ac70c8a67baf346ecbfa1a9a8d662abba8baca4342efacd9a00bdc629cd49b91c4ea2883749b9b08be4497c4fbf83066fcb1eff606e6bfa2bd94c69c82dbd95374bf8dfdad46defc6f1b695ef5a5147ecafab1d6b8cffacfcd2c6343feefe6ddaff6ac5ecde4416bf2d279a66a7594ab3ef8dcf22efad52faf9de934c80387d9e5b0f35aead187770064da0dfedeee7d4289d56fe5f5cb106d4776705dac0c4fd6bb9eccaf5cc38750fc2c3e062dcb1bb835cd7c8ac0cfac3c2e5cb02ca3c7bbc3a7636eeabbceb45be5b52d20d6fa6fcc5daedbbd69a31a116cf8abaccbab3bda7fccffcdcd484f7fc39cdbf782db4760a57459e296245ebca63f51c2dccb7ad8caecff749efa51dbeca02dfaf6cffa49f4c8afb1b0ddabccc4cc3f99cacc68ec34a72bcb0cf6afea83f06fdfef5fcddcb3a5d3b2f4515edfffd26d58dd5bff5b823fbedf40b14afcaab09ba47d20f6caa010be294bcbc0c811ec1b87badb6a2be488b9c2f9a3e1bbe9b924b1aac2f962d7ecbd6c7cb1916aaf2d40fa6cc063dfcf5ad16edcd53ae63cc81bdbb6aeadb0dfeced3cf80a8de9e128c2f7fa61ebd608e26b3ec87490a76ca986768bbb9decedd8daa803c9b0d65608fd0dcc38e7a67de97d9ca6ce6d15cefe4aabdfb00d596acddafacce1ace22aaa6dfeced1c6acabdc3da20523b1d2e2ffffc71cc73c0e70ec531bc3eec8e6117add64ae4e1fcbebaacaf6af2e1cbbaac470e2ecfdcdcd04acec92cdefabbf143acccb3c8dd0b6aaa953da556d4f2eccdc4acc9fea1d95ab6ca1e8b8efc87e2e21b2df8f00af6654fd7dafb7f1c21cd550c9ce36d7b540fc37588bde64b242fec58cba11ca8efa2ab1f5bdcf8566e756e2b438f929ddc1bdc187aba83aceef15557efdbdbe51fbe71cf7ee747bedd34ff9eae68db79cfdeda98dcbaa8f6fd262cd0bb5e62b91bcfd8ffcfdc3ddacbf0f79566bcaaea0fc776cdc62babfa6340dfcd21a7ff354bff77c928ee2fffcf870bb9435374a08c203e391ebba6ed2bbbbfc08efba09abeafe5fa2a7da5a88d8093ee7ce0cdcd31bdb97acdfda88aebee7f6eecf434faead8c03516e3e141d0870b8ad6382dc5d358fedb12ed4d636d001bc87fea47825a6da588628d9fd5cd0a0fa15fef25cc7e7b50448c67571efcf1bf823b58241eaa816da415f8fc4e0ee1ade554d419aa6b01ccdee0d96a0b9ceeabed8bd55f0caee5d1adff12c44385d231abec8c8dbfa69fc7bddbc2fedbbf66cd9ef95c2c428461081fca89eddaedc8f83cbf5733154d2700f8c35f4be7dcf538b308b5349119baf24c248eb3b81db78524ca6d7cfcdc57acebfde03dfdae606cfd0e0baee8870decc22218f32db17bdbbe688ae4f65682dd12a9eb2dcf6f456652b2f38c99cf01606551f8ab4afcb0664d6ac66a9c34582d6cff71f0da32073caeefca7da63db39aafb0ab3ec70ba8bf34fdcdfa64975045b862768ed59a8c4ced5f97ffafacafa4850adefe4faa3e4ae3cd0b6714e15e1da5204eafe6c3e7fadc7adc12de3fad25aeb8796e6b70b8f0bf14f481daead7b53c825fea35d3ace4c4f28e2ad4dccb29680f9fd0c4c8aad6958ebfebe0c79aafceafdab355127d2a0c1d23cd2bc1ac9cedc483907ea808bf0e22baa6bffdcedf95dadabceb3f9aadafeb326ad84ea582dfc5e66aaea0e77d3dfbba0eb1e7bdd1452ffd8beaaacbaeca3521a84fdcefba1e3c24fc39c41e743be8de2caaf1f7ca1dc481eceb8ebdbe71a5e5f21b0ab4e48160d0e2f8b76cead0aa5fa77e14f6e8c92e36883a5d8bad3efdb832006589a48273b06f36eabdfa5bcb10ef2d0c77dbefed1add6abacea2b55db15c1eefbb548407d8c0c89ae70baf9c0c4fb02c124ad6bfb62171cafdc096cb0fbb3d4fdceae6adf61a163a3fae5a7cf21e5fd02dae96aa37dccbf8e10cd927daedfa0bc7bcbd7ee0aba6eefd69bd7bd8fbf67dc8f4b2e9395c020e1f46c7897fb1cf62c7c33f133f9264cffc70baa81c6bdfe272d9d3b4ecdda70ef1f8aebd0eeaac1ee04cceb1e8bbfc1266c9ccfc20fe1496b4faeefdfedfd15c49e178c4f04fcf5c160a0d5fccbff5192c4c45e6678fcd8fa27cef4efebbd5ade0eaaf27906d8b737acef5f32def9e1b0ea0141bae4aa6c32baa1d98fac2e1decabffcacd9ced63310f454e0ed47ced55dad98cb4eafcc4cedcc7dfaa08db075de937c1cee4addf74e74f28c7cd95f8db70efffebe23baa1aebebd7e37b9a60ae5960be698be8d3aec233cedbcb5a8acadaa6d17bcfeddb92c754aadfbbf5e611b3a4bb024108b17a600ee62cddde25bdebfd5ebedcecc8b74afbec0bec096fde1766c7a36bbffa9e95ef0355ba6a1cad9af405e8f8fd53fd072ad381befa8ede8c2fa3b1920619f1f93bacbb0b4aef7555bcce35d5b7de83b99c7b7e5db8cbc8afcfce0183eba1abc38379e7833e36c60cccc090f0feb2f9cdbefb479f4c62f06c501b0fbecbdc6d94ecbacdc1cf4cc83fa15ec38df9a0db13bc9b043e3718b21d8c1c05674f4c4ef5e1d6794d52f83cc1919a33de91a9c72fdbc8c6e4faa00a83be25bfafc96edaecd1e0f8adfbe83383f7a52a51ccbd3ea4e0f9ab39ee07fc1edf32adf2f8486d0efcf17bd26aeabb9f5d0d6bca988bebd2a95e07aeced2f27b36a12bcaf6bc7cef4fadcdb765e0a1b8aad3f47a8ae1ff3c0bdca14c1dbaf81d3a66daf7b9a0ba07ae5c64326eaf7108367ad0ecca5e6358a593f6221cb84dfecc05b9834a4db23dcf0a5ce0b1dfb321ddf8ab03f5a6aa7d15ec231b3adcacd7b8219ff899d58c73ad2dd0be2e0167f9fcade23904b2f7586a45f1bbaac037cf5cdf018fab812bf8aeda4fcdd2cfe3c38af9e85106efa5b2ca5cacde5486bea5fb5f2a2ce4a1ed1d69bd5e4bef83d4f14cba5de40acca62da2f492dcd7beebf201266cca9fa8f119e9b5edeb6eadfc74ab1aadfdcffbaa6a8cae4f59befdc5122ba7ce3a0f3a75ccbf5a4257edf73dc94cd0f2488fadef0c3545849ee12e9b506a62319c4a6ec608acd014edc01e9ac2c70dd1bfd6de16fed3f5c5b9eff6fcc9ddfcbd9137d9abdcffdeed5b622d1dadf2e588e65fd438d7857c6b6e4a75fd84ae9f96ca3d449d69f7f0bfa4dc808a4cb3dd1abff26bc71dc9a748bbe2ffb32eaf8946aa90fcceadd54a787fde34b1cc2627d88b9bb9aec03045e6f772fba805207ba99dcbfd1b0f6ae3b36cd655e6f7e3acc6ebd9e4cbacc35afb0b153ff4b404da73c127dd5e6a7cdf0ca2359e95ba32ddba568c6ba5f1bd4cf90951b6c3e45fc4abc84aeffbebda5e41adf03fba1ad1faa7cacb8cbd3de99a5e793bfbd257a34dd9bb3bc03ec8cfcd820fa87ba994214eb2ccacf8df4d2efbc9bafab565a33d02d11e3f9fb0a5dd4ec5affff7bebc020abcdf78753ffc08cef5fb41c339a590578c06b77bee7c5cb4ea453cef8b14db2f821839ebed31b39e837bbd3c4e5a22acefec9fbab6ae5ebf13bffe7a7f713a0dbf4ce1d7cc2fdf2111b7c11e6014c5d8938adee41e0caefe55d77bfeee12388d08344f3b21cd67b851975b1153a9cb1fe1af09daf28ebdf13bf547a1037bcc21ea49ac0e2725a981d23acc02da384726023cda8fadd82edd2dfe962e43ffd97eef4b3aa3b5be6c81cfc0caa9b0c6d6c39e8df12b84df11986dd661a0cad34cb745ef5aed8c913d63eeffd7b997f50dab1eedfbf2b4c3b0828daaaefe96aba24cd5d2573a632c2f57fd2a00ce65b6127afe1a9eebccdb8dffec1eeb62cf7f5d6dbfffdbd9c23bfc29917a5f3bbdf181771b6bc9e3fb0483abde0c0308afdebab9ce8e508f37507dfcebf3c3f2af7a2cce0df2f6bb71fafa1e2a17afaab6beacd5e9cd4feae7dfafd8d5286cbaa03155ee5d30c1d0addf2eb1c06cbfdc57f41ebfded4aae70b4a629f797ca7c2ff93b98ceaaf6ddfbdd1e10a14141ba9fc4bce7fa6e678f6a088bdbdeacbd897ceef8a7f1f0c59519b50cbaec2cda3f38349e95da28bed3af47beeda7a4ec6b8fbc0e7785aabc6df2edb435357a1ae0282acf04f1ff2e7f4ca809e76f0a69ea9f5a2b7ecdd3aeabfcf9f381ebb48a857a19daa19b4def106ebffaf7dadecfccab37ca45fdce899a6b56bd3e63fafdeee6cf396b1779fbfe95aed42c8fadadc0e31fc1cf51c2ac633fd73fe0d7cb17cbc6e8fb9e8bc3c8e44b9933cb2286f43e2d4e7bdba27aa8d5acbbf47d284c26ecfdefb6aeea1f27dda938ebe48ce39f7edf18bed5dbafc3bfffc3cb21166afe27e2a9fbcf4ab9353d080f36bc34e540fe720fdef339abafcc10dbc1ffb16ce5d7a2d416cb84ef636a3a40115522fd75ecf48f3b1f0582eb8b5ffca9fbeb9f93f2cac8ee8ddb62b56e826490abe4d8d3ba43f54a49fa670ea9bb0d7ee4c006c3eb9a3ec3a1dd72a2d8adac1c1cfa08bebe797aad5548c226adebbbb960dc4edbec9efaef18837a93c6dd6b8dcf2672ff5f1bd2fd89ac7cdd534fd2a3ae743863b855ceeeef0d2bd5c42369d8fa23ccafbed1453d790f95ac1af5df761a5784770e5e33aacc0ddbf57bd107b692dbbd33ddddcf7ebf7de24cebcc287f80eeae5e2c5f0bb06b6e7d3adcd6dedba252484dbcd56af6df1afa7cc2a92dfb43e935bacfbfbdeb3f7cc4e14d0bfb02baafddfccf578260bc3e73da1aafdf34bbd6e8bbb01ee8ccce491ceff4ca0bb5525fc34b9fceb1abb3f7fec33a6a8bc352fbb47e74e3aaa80cca0cbbe4d7b125f090feb095b6ebbe1bc7663e0576da63870aa3b31a2adfb416bdbd99cf3a6e933db3bf182c1c17d830a6efeaf1dc1aca7fe1b376fda2cae11ad095a7804a96b958fc065d7554ad65cfe7b572c50b71ee9569efede1698e55e2dd4efe0d8bda7fafe3fac2ab86edfa4c1cde7dee3b9e2decec8e4ce7a2b8408aaec521189977484b684a986ba17d71f111c91ebb1cbb1afd6ee6c8e649945bf748cacbc4cbf0dd4b0da1ed4ab35f21bdb05aee2dbbdc2b4f6a80ebc58d6432d171f6be3acbb7b3ba349408eba0e4ba14f63f7d908bfbe1c3f3fa03aeaa51d38ef7ffc7a97dadad45a65deef8031ea5d6ad97c0ec1fccbd4ea8ee6be78b7f8b8cfdc9c6d4536aeec3dd8beade1ce3bbeb6edf6eae9aff3bb6d2ed6cef22194cf6bbc1bea650f8fb06230ecef54ccf02f627cc72b6ace2a8536b0dd58821e963bdba6bfde51e8b551bdbcde27adfe03efa4ab33fceb2473df07e817442db37c62e1d6cdc8134e41bd5faecb730d3bfb9adb14060172eab1b8190375f5275b71a88d2913bc4ae2bee8aecce7eebaa88e7a8cb1272ba432c3efad3b3f0d3fa75569f754b2eb4a5e5afdbb560b7929e5f858acf3dd3eca3b6d374727a68eea5c5db7beb8f1ae9d8e2f1c25cfb74456e8d60dffb8cc2fa9acefb6cb141a13dfded6143e0288a78acbaebb1055d6b1a5eaf1e1cfdfc83f65cc2882f8cda58be0efacb200cd77d9b2e6e6b02cf47acc2b665eb4cebcc003a1ad947be5e6e2c9ba8ad73a22bbca7f3bdeb31c35a7c700006bfdfde2ca7f328eb1e3ccfabf3bec5dc33a45b83f9f6da1df346fcb53362ce8ad9115f2df7e49f07b09bd6ae85c04cbac8bea75fdd2ed40eccaf0bb3d6eb81292c169e1f99905ca3b3f843e04c8fdee57fdb072b4ecc976d64e1dbab7142c1d4b11aace50b1ec895ad78dfbabadc3418afd9bda37f8752b539e2d6e91e59af36227b77b468c5f6c47d53a51ba6ac97e9a5a2adc9f0bec65bf7eaebaf70bdd31108db31bce4ac9a0eacff5ebb2dfadeaacce059837d7bec8bd6f08a2bbcead1ae7dfd2ec1af744b1ed56f62d72e4adcb2dbbfbc304dc0e0b2b02afca0f8cef6be9b3d76a812dde6fcd8bf7a30aa1ad2acdfb8fd1bb7af7feb90ac03ebc3e534b25dc57d948b9b43eda1fef333fc1fa0608d0f31f74904fd15e8fa44cfbc7c282a8da97cb61d89c6e5dc9f40bc7c185dabeec0ffb8b2a296bed406ef09bcbbdeadaedaa2cdab9bf5e1fb2b1bc3beeea819c10cc5469510eeacca012bf1913ac88aec4abca7a93eaaee6363e2eada239fe6aa05c13cb7ebb0dc91a464bc9ea0e4ff461c51a5bfb47fc307c7fafc89feb8fad8c67aaa78dcbbaebbe95dedf0edaa7d113e805deaf049ddbe819e6b0a79d2245eac8c7f25a04eea3db5de7af814267e0f121e0b20c1eeee515bce8e7d23bc2b02ac94bf45bfbbc1adfa7de82c5cbadc27c62dda30f430bae4a1c761eaafc954b5bddc54dffdeba6718a1d17603c9f32c1b13ff4cdaa48e90a15caf42dd1dfddfdad4f54ce5bed7c07eab985c56e8e250d3bb50298ac52b0eddbf4deedfe7035e6fd41cf47c7ef7e01ed2ce889be7cdfa5d4eccaa7eabb3dcdcc1da68cfca1d3fcfb977bba497c517f95397d4dbe52dc00cf50e52c734ecab3ab948de4dbec238cc01bcca9d1bbd8f4eadbfceba2eb8e602374f7bcfcfcebfccfb12dcee69fcd24ec8549f5f0d92b5eadebea5dad077ad292c87aef16ebc14cd7377a0fdbedfe6fc15eebe07eea71bfde01601be36febaadb3ae2dca0acde6ca39b55fde11811959bbb69db19523b846b4b8d5d89e9cf94bc0b130cf7f12bbfc6aeadee99c2c4e44b66a6b1addfe136a9caca2cb4ebd7c8a8499d0581d1c5d13a9c50ddde1d76bf24ce407fecfcfd6b2c3afdd82ae1ac03bd2dbf8edecfd3f3c1afe4add4dcb2ea58df0cb8efdc07bf5baba2ddc4ca2730cc3e8dda2ecd712fcdac302f9f5bdebb00a783b9f7e2affbb12da52086ed9e66ee3fafd7100be224dd03c1e6ec5ce8c66ca440d4f2803ebbbae63dee4faf4da06bbca3f5d386cef9c1afe8fbad7c1ad5eea85eaeff21e8d4daa6bef5ea2d12fd94c54bb5e3dff3cb50bca988dc405e2fd2030dcf7afca9bc86bab364eed6acda2bd52ff1aac04d6ecaea77bad6ef854fb9923ad9dec11e88a6f0ff80228cb2d982514d5c223ddfb4a8a8450ebd2cf544a3bdedaba6a422faf78ca3c766dc8f6a7d69d9d79ddc19fdd8a145accb307cd1eef372dc0dd95dc75eec1d6db2efc34ab357ddd7aacf4de9b1adb4aa5d1f441ec107beefada59dbb70abdbfce2fcbf2f22dbad60c440eb2928dbdb0c63bdbbe866ced7dab7fb1f5b0485f4bdf69fa06ffe46cea14aefc7a9966afcc6b9c0d8afcf828e3b5afd5f6dffafbceaabf09e8e0f51ff0b4b100caeadffbdcd5666fccc3c28196d430ea15f9c6feadaecea47a1d92c36ec67aed7adcf2e1ca85dc64acb9a2d9a6d3015f4e8ff364d5ad1adfeb608145c9be926fe147ce92befddcbfc3ea016e1558f3e2baecf0af7c5cf6af55b934ffaeb5d9e1c8ddfd35cbbf77df6c2bdda10f42522e6fad9bfcbb51fb6fc98cf9c52d5fbe17a3ef7c2326cd6143b342daeed22ccf883d0fbcddbb81c4fed2d4cd36ebfecfeaccb1da648ebafc6944fccc8d7fbfdd152c4da527c3dc6e0ff200cbbd7c2d3e51758ddb03b66ae3eef6d7ddf888990770ffb92cf33efeaffb6b8de6948fd7cbcfa7b8cdeb3cb1a9dc3bcdff16a233809e70ae0e5d8073dfef14e21578bba77d4dcbb9704a4e74f98d40f2c4fdba6622a55d0ffcf538cff77b29f0abbf72db0c40ed6dcc0ce4f1cfb2941c183fdaabc93acc8ccecdfc2c9b73f9ac5b6adac316aaa0be45aaff08d8beefc8cb4eefc7ed707a6670d6ce02dfbfefa38e7a5d1a666b1b9eecc951f1e15bb5bbaeba5f4500d204d00055ebce66ab1c3a3cfc7001fd6df5fea2dedddcc0dec15f88a13dbf34bae60b2cd5cd449f8ade66fd5b9ab79c4174ec81b0b942cfab1861aea4b752b943be5bdeba02ff2d16c91fba3cbee04bca0ff7bb1ff3947d2d0d12fcdf7f96c048aedb33bce0addd3768ebcaeef4d5aee5ba46e87fd48aff3cb0eaeeaae8d7dc1d9bafa326b93d81df61a078b73bbdcf6b7eff382efa0eab9eb5dd6eafc9391ec99e245291674f82ae59943bfd5a48f4f775f8cf76b67ff6dd17a21d3679e1df1dc2dcbbc6484bafa5882191a1eb5eb3e7cb4ea3c8ab30c0463f630758d2bacc95d6d0acaaafcbd5c67c22a13db9a3a5e84b5aeea62ba6e0d0bdd0527ddcf0c4219f8138ed1c8c8d6b6f9d10b78f06f94a33790bfeb4b7112588792f01e9bbf549f35afffcc9cbf7a63b3ef5cf31d7f9e8fcc70aeb4d8ab61ee214929fb5c895f68cfb277dfc6a1eea0b1cdb89d914da9ebb34e6af54535a4b622f4daebad33ccff8ef1606dfffe8d82f2a40a65a9e90e58f65e0ce1e6b0976fdbcbb4ea05f37fda5ff4acc907bec9dd5a103ff0afce24daec68c9b8cadcb4c0ef98a5c8a4d5ff97cd0cdac6a1b7ee1fc78e8d70ad5209e3bc10af2046f4235a7b483c5cece6d1aedfada063d7d3df35fd4c4c3bfc58d84dc69a3bb3dfb0cf09bbf195beec088af73e1d2b7a3cbeaf5e78af5752031dd0feef4d6e262fff2fda6d772e1c7d9144877caa56ddfa93aa2272e6aa974d18dcde012a9ab2cc2cf47d23aaeed5b5bef5d34cab67b744c739d6ab0409fbaa878bebbdccd3446a0fd0ec51e1efbddfab82aeedf1ed885adafb49acbf8fa3cdb77419cda3db6d695b5be3c11f79502f14a94de45074dce9cb1130e8e8bec6ce8fa6c5d6e1abee081dd674ff407ce3b754bc8caacce449bab9abf9c7c5d3f9ebeef6f4ac16c98824ba2fa92bcc280ccf703afce8d634c5fc0b6e22fb96feadf9afa6ff4f33a63e3be45f3ff1bbf6d6c027faef7fe4eaf6e94fb5cdf30cbeacc2927d0e23e4abecdea1db8edccaccf76a0e8dbbe6fd013ee7fa5069e64cf3fb97faa7fe9ddcf76edaa51d4317242b437d273bffbe452897a0c7ed3bd0b2caffe3b94a1a3d5cb3a524baf119a9d8ba0b4b94a909fcb22a3efe7e4cf3ad0512d6ddfaaa942c984cbf91dd7ae1d3b336f377b2dcd9fe9c9c5654ccdc56aa9592fe3b9d338df8cd9db5eed7a50d3e48a1adfc41e0ba3f0053a5aaa504a8df43c8cdeab264d1159bcc3a5e5eb6647cb1917ef50b14aeead28ff6f9feca14301ce9fc4ee103ce328e0e0a9ef563325edd7ca5ece66c85affe200490fad170d8029b78dc722d9e1f6cf3cdbb1dc5ed3acba41fcb7cc4d66fe611fefedc95389e41181ffb33dab62ef7ddb6e51aae5d5ddf4e3bafabbd966daebda3dc56d54bddb67064cee3d8b998e4f031d41e3b5aeb30babffdac53f8fdceccd4c0ac829b5b0524f887c4e3ae22db06c1bfb75ca162b949f85d6060c35d3e48c3a4b32b0f52fa58dce4a5aae2a5bd1beb6b3135abf71ef476cfd5308c801face9f1cb7084fdabc63116d1abfabdcbd0eb0da5c364bcab8c1153e80dcf7a7bffddfbf867e5cfed1318be0fdcaedad0169faeea2cefc81724f8fb94888fbbc6d677cb4c2305dea7dceafc423e24dedfcc0cfa1339bb18b119f75e8109aeef70f8ff023da9856a710aef6aa884af54d9537b4ab04a1f4ff8f5b0adcc2ae5cef2ed5c6baa342edbf8ecf5cb5ea9ecfb176e5c3313d0e6eaa9d2fe198140fa92d571dbc04bc454bba18dad3bd90cf26118ffe020ce2bb0e1f3ec7d6bbba13fbab316de4bdc2fee20ea6958fc46531417e7e8e8eca7a7dcacf0d15ef0be9cd70f06fdc1ada3c1a3fd0590fcf704b8f1ecd5b38dbdedfaaaf4abeebefaebc4efaf90ccd3bce206bea9612d2e9acd5ac2c10ebca3710170ef32a82392c4b67e62edba3fe6e675e13513405ae1fadfff4f58f305b3104cc382ab4a38fbeddc3e9dceefa6be23cedb41eb22eecff193d8fefa3bfa4e5e3c69aab3e982ae9c016fed81e66bfe53aeeddf34053bd82385b6d1fd4378bcefea13017f9b76c73a2f507bfb7dcba264d5b6e8bc962ca52a991ff8bdbebda59e77fe9c62fcef1415a993ffe4cad9fa3a96984489bd9edcb1a4bb134735cbe7d6bbbc1df6dec8809a45aaecab1bcaebaf06fbfe90cbd8dab61f50bca34156b47f4de94cb3075d37e9c7ae8f7f540ed6cdd9ed7dcffb90d24add5dbfefd06ca1e6ebcc4ba52dd7dabc8106acccc7ad0a4dfff94d9ccc1b104bccfcdccb8e3d6c1dc3f88acc4e3fbcf5df561fd7a0b1eba7dd58f7c9b05d9eae7c5da7d5dbd4df7ffa1dfcb34f9fe0ef3bbaaba9cbabee477cdbc9f0f1064ee1c1fc1ebce136995bfb7c8cd22dee5fdcbdeb1f457dd7302caac50dc5d9ea07fe01cecc5a7cfebc915e8c7eedd68dc1178dbef71c9771f3c7e1febee6ddedf6cdcceccf2a3af1a93a3bb4eaa508f72adfa6d33b9b358cfca16d4f7dbe3ea07bb331dc552be2145932b6bf94deabf7aeb0efd59b7be6ca30ddcdad948a87b1044bad23cddd45abb2bae5bda00d4eededcfebc38525f58aab0c5c7dcafe8c6fcf0f44dfa44d38f4fd1faae2e6bff4cc205def25be1d1db0b50f2a57d9af0caddb95eee0ba96c435d2cb737b7aeb6d43ffa29882eaaf2ba84f9fe1a7bc10ef0ec856257a8a58d9dca1c47a6e214dcfedbfb2e4e5d8a5729fa2db9e61b2abdb5aa39addebc3e7a6ed4d24fdfbdd5edf21cb770df102c4edea8b6b0dedbe1e8aabe8cfb8cee5820e6bae44dd4d22a1e65fce8bbec9ebf7bab8db20e4e690068168732ade64edbfaa4164abcb5202dedc8e1fbae9551ac8c2f01a1ddda29fedbf45de5cff09b8bdcdc21bfa660ae5ad6deacbc0cabda1d63abfd5be47bf8e47babffd0ecfabbcdc99bef9f1d5c5a4ea0fbac9fc3c49e9f56640fa5afe6ede1d03ab98dc417adbf06aaafda17f4f5babc83e12cdedcdc92fc1bddc6007efaecf38a7ee3a231ab7e3fea538305e1d0aee81ad84b188fc4515da14ace9ae82471f2ee50cca0bad2f324e1eb88df5a55d8fb4faef71b9cbb50f8611d43cb9f83e40d562ddde15fbecdc0ead901df4f8aa25ad1dbba35ee4ff37da9d46eccbd51a4c03df52d42c1c2fe82f930c9dbbcace5c86d38a79b5fda30aca8c46ef7ba95cbacf11ae39e0d200de44c5ac6adf350eaeedc82d4cc8b7c37a67a3bacac95dab3eb4ac3dd83e5237ddea307ebebc9bfeb8d3b8c2a4020a67e19dfba305555f2c22f4db7c0707008257ead57d0fb9d01ed6bb5a84ee1afd86f1ceedf8cf2d59251c21222c67c86dcfdc92a21daeea401fa9cb7a165adb0e9cd739aa3ca7a145ddbfdfe8c5e2f2b1bbdf1cc3ffdae9e49f15f7cbc3bebdbb49acbaeb5abbcbbae7b891a5fe7a4b0b5c1d7ac26ec6ccce3bdb822cb5c41ea5ea06586f49fe08bfce04edb2306bcaf5f6ef1e987b343ef5dc10b6ad45bcd219cce26adff0d12bbae7c15b5bc5d5ad11b573b931beac50ac53f4ddfeed5de1dd5aeba82f7ffbd6dd5aaa6b7a1f3ded71c8b2a1ad9f337bbbf447ab2f4c7bf04ecb88b37b1c44efc3c12ce9daee28ffca447f388ddb5f9c0fcd4042d08241be3aea1e6dedb02fded70aab5c7c7843e990dcd2a93b3a9f208c9be3ffefc241a6daa9e6effc7d9d1ccd4ad11abb82dce281afbde2bfc3faef4500ae10e36fc90b6ee231f42e4de8d1bb67a5cb6502f26d2ad2fdcd379f0f0cfc29c0dcb33fba67ced17dbcb5ecf5afe7a4f505f5ecfb2e20e11adafd51dbb70dc63effbe81cbc67d5a38dfabfe66da42e8e09f420e4ef21d54ed112b6c51f9e6de590b4bea72581ddcafbcd2062a693addea977d8c6f42e44508cbf57e8d9b0bec9b5ed482c392d1d6b7bcbef16a3f89b446ea3dc90650dc3b0cfeb6f3edbcdd3c76fd694a268a4e15c6ec8c137cf9a9e76caa9c7edfb5203ced03ecff2cb7caaaa2abd5f77ee874ff7d4d7fc2cbc2875952c358bd4a1b1facae59ee83bfcebc5be7b6038b4d67794de3d4abc4cdacadfb0dc19e3daa42e4cfe26bdfa64a70a39f0e2eed5f7ca86fcea7ad4ab1d6faefbc24a9a3fdebf7ebabf0ca5ceb9270e4f7cbbe23b2fdfb0ec93dbf6f1daf5fc4cbcdeaadd8ced3032eb785cfed83605618cfeb20b74dbd9dbede9ddcdcbf6f1efc5d0e529ff24e3ffdd5ad0aab7b3bbd9a2f8c05bbee448a8ee8fb46afb3ea1905eabfdff3cc1c7ae65ba0ba2390160de6d9f75cc7daab2acd6659af93e291bb7a4e02853fad4adc0aeaedcb77fd672a65efdfc0aa57aaa2f15aaf6cd34fc60b1bba8f1d2bc96de82d7ee2a31b24bf7eae80430d7af2f0d883a0c8b3bc28bec8cc3ac6efe3c5353e211475cef82d2f1e7c53ef0ace6e0939ba59baf718b719f4e967cda08d0cbece3a60fbd9effb75cb52fcc0dad5bbefe4d1f7cfbfc0cca9c06f53fbaba19ac382f5a18bea27cd9d0cc1dece7dac3bc7ae63ce71aed6caa5a5ef6a4edb9e66dc6c3d489e17dab6f942566bf3f65fb45adb0f77f2cca8dd3b8cc5dde7196e193f2dc8fca15e272e2d0dae1a0c17fad5fa296f1a27a0eae8bfabc38c28c2d6dc0361f6bcec4f0bed6cab5726def4b564ecaa8b80dcc9e3c21c7839d54ccad2abdc88ea47f2127ae96e8f41d4674f46b04a6ff7eef3e5dcb4b7078cb6706bf8edec2f30bba58c96fc8e7b3dcf6dcb6acca40a42afaff3ea73dcd8ce2bddb55c65eef6c4f8b2c676b7e32e6f8d6fabcb5afcfe5c978c17091381911d4ffcdba7315abbed1f4dbf72dabd76053faeca562a2c9dc96fdf3a3a54adeeefbec36e2b1b4f4984ecc5ba7f1d34ba376ab4f0fcc4c72e887d6c33cbae1cc90f31b7d99d7f096f62f3ed9fbba88eef2cdb5feac0fd30c3be5efdfbade0eb4bcbab3f38cf42bb89dc4fbd0f8a7caf39f0dae4edededea17669bbaeae2fdfc231df5fa87dbf6deb41ad67ae813a1416b549050ed02acbfed8acb7cbeabf2a7a3c18602fa0dfadaedcf2bcfaa5dd0fdb9b39dfbd56ecc801ce078af6924f5ab76c1ac4b7daf34a6fd1aec4f9ffd13f8ec89f9f47c7dffc575d7ddaafff6ed18513a4d070776eccd33afb3b9ebd46ae7f3fde0821c8afa8de5eebafa7e55b85fac023ea3ccad1dcbdbb0e1d869707517c8fc0c45ce21dcdbfb1fc2757886739adbfacdc2bf7bd8d980996c05e17d87113c72e56a1eb2c1dabdf76549f2ffb882e5c6928ede090fad1abaf784ad28ad6ad292e98900ff982409ea707ebc6304ed79444c3ee059cb3e1ceeeacbd1e4ac23d5ae5a237bae75a8ddb11acc4d32e7af2bfa3382fbb921e6617f5ed4c3e9e3bf79def807efebdcfddbacda6bf4c0b76ccc28efe7aaf8cc4dcc4f1e00f8f96c05254fe86bbebbacde28ebdc0ef0c4c973469834b1a1e27dbdb5b9ed7dec79e187cfdc9fabcada8e7e3dfcc0cfdd2381e4ef2981a4c2975add70c2cfac327a09aef0fa7256bef58aa314cdfed5ad1bf8cec6fd48dee9a993e7cff4aff08bcaeda3dce8ff43cb2e54224317fcdebed4cfffe9e8acd4ee6bedfc4eb5755e375b9ed49ed4e9e00c7a2e931bcf90b1bbda4ebc73020c5c1367125b6aaaacb14aa3d6f210ab4c0baf89ea6f33e230be6eed9482debfbaad9cabeda3db6ce154dd9734adfb64c3d9defa84be5b35c01cdaab6c4eb782b4cbbbbabc61a7fbc1cb25ec46bb2affb50e3b536feafe6ea7eabd69fcd0e1fcacb14bfd7e1deb52c3fe6a61d78bce4e8ebdef6bbb210a5dee6fcba66bbca5fdffacea7dbece63ab42af9afeea3c2c9b1580fe2dec9c9606eababa2a7bafabbd6eccd34b0ece0d5efeb210288ceceadffe3c75dccda6a3983c8041ecb1fc65ae8edec9e63febe295dfadf6e4ffde29b31ff89ffec4de8fac4e9f260e1264a79f9628db94b419c69a4afeeb9ebadcf4cff5ed4ecbe5eaee4c2acb0fdc4a077e07aee9f92121f2a70234301ac7a733acd682749f83f13ed8537a21eb18bcfb65a28d44d5b5caa80c5c1d4deeaccabf6dda448b4bbf68c61bcc651a5ccc7aab9ecfcfc5acf8e12adee00efcce66a94099f05f9c3dfb0c9b0a89714c3d7e0bea874a2fdd0922fb0cbbbb9f0aa95a0caa0dacc0e497cb41fc41addfeac307bff7dadab0fbbdf4edad28ceffef943dc7a95f3b2f542b7ce0abda38df85db9828ac03c9d830f72ecddf6eed5d2dab0aabf82a12b32e9b9e8ccf9524dcf86eca50d7acbd9f2db07cb77d1bafe7bdcde9c2b6ebf78dd7cdc358bc5b712bbd8fb37ffc7fd4eaafefdb0bfdc1ee2f4da98ba7cfa0cae9cde79c5dc11e40dcb344a618bef5d0fddd938dac92493c5dc6ba1b6bf51c48bc0bd3c2a0eaeaf095c06e3f06ffaa9762ec5c3cfdfebe9e69fd6acae3f72cabc02c75b4bbef9fc4fb13abb9acd88fd5f3a5f7baee24beab3a6aebdfacafd9c7395fddd1484cbcadf68fcdcfc9c3757a1ba8a892ed5ab8646bb5c368b7661dd048a45fd2112679a28a058e2ebde8ecb4ce38bfdf4b740e72acdcd9ab6fcae4f8eef44adcbecc2ad91fd4c2aecbdee314bdfcb061b646daad0c3cc9a91370d22a00d66fb2892bab7bdcecfac6632d238fed80b6fee96513cc660ce1bf34b93bdb91af3e1d19f2cebabf5d5bbbaadb54cc269edefee4d4ddfcbecb5dafb588dd6cac3f2589eb3bfdbd0b99fed5aabfc9dbffa17f94cddadb505adca2012eede7560b2ccb264a8aacd2faaafb86abc44c77ec47e18e8c7bb1fc58f578bca6cc05be0ceedfbbd76b5d7a65fcc84bfceacb8dfcb3b0afffe97e63ba72bcdeac4790faba71179c6be75f018b0afb48db60750b41b596eb3d77e9adcbdef8eba5cdd1b8f2d4696073fbaf84eac07db07cedabff0e9d7fdd882f97f44ce77a8fa83ce34326dc7bf9e19bc7211d1e0fe5bcaea3385b22f09e1cfcaa01fd51dbcf9a8f35be67e2021a5a25a6eb9120deb0a0cac668e3545ff10bcbcdfe7ce641ddc7b2ed8cb0fe332c4dc73e7cbe63060ede4d7da3dfacc6b1ad70da4c58c70bc5b679c11e4bcac9e8fc7bb96af23eaeacc5469bfb3588abcc41de26a6740d8ae5aceb5e0d3c3e63362d6088aaa4fdc6e87bfe32a49e0ce78dcea26d9dbc2ab1c2255f8a094d86fcfc2fd4b7ad6a4232eecf870be3bdd9b5ded600d8443c73efbf21bcc1ec6d3e3ccc1b5b39babdfef125d225e31df8881dcfcbc12e0d7f5d7fbd1a29ce0effc61bdbbcd1e0d8ea44fe29fad05cfca4a67c9e24d59ba44def1f3f349130f2a66827c8a7020a3fdfe956bdda9fadfdabd2ea29cfb65d867f088dad8bb88f9a1c8ffeaa1689d7d4f8cce1439ff53b76eccbe1b2b655e3b8c9b3655964ce2b07cd76eeabab2ffcccbfdfe6f6bf92ca1c0bcc0ab1f8083bccef4bf52edcf34bc4b80dca3bdf7ba6cccdcb4f2d41dd554f9674a3fb8a4e4a643bc4b49bf2cda0abd20747c7dc8eb5f4ab0f7f7a0a1f9cfcb653ac34da8dfb88d485bf3f1021b853ffed4dcc9eba3bc8448b06d0fe8d3fe7b4fb7f20e21c8fbf45f2631e33c7dbfb8feaba089e4dbbecdca5277b2c89be7a1e9fbc750671ec2f4fe32b32de4a2465ddeeaacaace43d3ab74ccc6266d21bdbbd515f6edae53ebdf855f9dec0150f92e4cbc2d9e6bdbf77fe3e46facb2fa33acbf2cb3ab8bc8b2eab42323c6659d9bcfddf9ea87a5dd23339b02d9ab35ef84fdc42e22bd481d81ea4d33ae0561b6eadbdb6a130c49c5c1f6d7faddf6cd25b87baf49fffb9769b8adc316fced6fa8aa2edfa399adc7fbcea41544f7a8add3d023ecca3f17cae1977fefc23220f1f9a2ecb56c91ea625b9ee03cecfe58e4282520eeb91cfbdb18dce012bb7efacee73abaaa5ddc75beaabbb33ca2fb9eaaaec9d3e960eb88feee485cdfb9ffdac16bbbbf9c7b7a1ebc9b07fcefb88d6f6a47fe7c2a342d645f1acfec5c794c1cf36aeff35febfddb8eecf000ca81fbbdcb55b53a661ae5dcdabda28f3d04aaab37f279d37a1e82adf686a5b0bfcab3ec6b9fb0c484badfdea2ac9fbcaa9c3da53dddbcaba2d5bb9a15a7f4cf58673d29ce68899f87ee9dfddc0fddeecbbeb600f941f4ba6b1f8dcecc6bd9a5759cfdf688ada6c01df78d32aa6dbcd8145f5528e793f07fdd97ec777ec28ccb36de6edfeba35cce1358eeea17996795783c2ce5c2c23fca60171ac89b8c18ae4aa7fece5141a3bc34e2383932ffc73ecaaeecb05c617db2aaf4077f62cfdb4b9e05346fa9cb82ffde6d9f6a4e9fbb1e49dacffd94597e393bdf9efaf848fcfd3441bbd1a9dfe9e8bbd29a7efb9bbca9dcd1c7dc32fc026a9de74df70b8cacbbcbd5e4054a9dec5e80d0d9d7bcddacbacaefb9dcbf47cbbfbb503abc8411d6a7e7ccdc6fa90cfe8f8ad05cdca8ffa4e75fb9b81be08757c1dfb43dddf3ebcaf1bd4dd4f0c8962ec3c5bdca4c9bb0e4a951addce9d1ed87c0e39ffc3a7a189fd8a62dcb7bbe10d9248efb3de2758ab2ca0ab668fc8cc8cbbd5639aa7f2f3b802f3c699aea8e91ed8a58df11f2c4be4eb8a8eed5bd5ca9a225e8e8af37c2aec7d714be7ad0ac7ed64dbdc50251cf9ddb0c23af834ffe0892a8ebfbceea6f471cefecb3afe87f21debcd5010fd3bf79d3ee2af252f2612a2d78ce5d6e7cb0ad9b10edbaf07fa4c1caef66add93a0bfeedce38b17e6b2db88676c2c5cbaeb67f2d4facc925cb7b0efacddfe35ded7defe5e977e15c71997ef0479d97dacdffcbf2c0c06b3fe8d0bc9a71d7fdebbb2e910b1e3004b5ca88288f1a2bf84ceda3e5e1a66672cec6bb759db7faf6fffea4da7fa462f8b418157a90c14d8c1c75beadca0919043baea22dfc6b6d32aecebf7fdc1cf2ed5f7f58fc7c0c0ec55faf0da4ecdce7d1e97faf6af180412f5be6a44d9c64928ab33b6a2cac30def3389db95f7f32eb56ade3232dcab0c7b6a850d2afd70ed2bcfc0db9e0dbd46fbaf5d5bf31d97c6b26e3fa9908cd9aced2833ead9c2e4ec870d1e9b7fbf2233d1ec64aafde62ac0f8dc6b216afdd2b47b6caeeee40376ecbec0369aaca715dfdb77b99b0f7de8cc1cd6111ccc9e7ba81dfa16d36ad9cfbc8bd0b5df3b23dbfd91bc0a0debea0c1b7feef77eefbc1fa2f8eedb5f746f652c1f8639cbe67d30d9ba729dfebe41ddcc3ca1ff6cc4e7bba7c4fb2028b291b880f6aff9db3fbe8fc27f0150c408fa0eceef5ea736f8ade2b7d5fba43f487ae4980efacbcbd80dea9b2aa04ce4b8746ecc2fadfcbbc4122ab49f6d7a86341eedeae55c31748cafc29bbd4558949eff8724abf99ee54be6da344fecc8cf27ede8225a05fc5dafee1a131f060e92a2fbe83faf595bcebb6ba51eb2f6b2aa76a1f4cbcfa4c8ebdaa98a0a56151ad13ddda5aebfb2bbed57daab66a61ac77cbbed19ddc8a6537eafb4c86ca6dc2fd584a2ecd76abcafaa9866e81a8e5f5ecefd9bb5787f9d4aabefb83bef7abf597cbbfca8a932a6be19a28fb0a88eadfda2cdc342d14327506d094589eb95f4b6bba54e46741106f7211ef4c77df0ccfdcfadfa4995ea973f5f13ec1f9cdadbc1b6b48d2a11767d9ba5e7c807b0af2fa2fbbd03d69337ff17ccd63b0ac17d24a0de4dfe9aaee86bc7d0fdea34b52ca9ea66fdfde50e4d47bd71e10661ccbef40788d0e7d03eea42768a73f2ccc6badef6f6eb753eb6c03bd6acc1a420eb3c300afbfe8a3edceb02f6ebdfa7cabeafce6c0cad46dbea3a29587f0b068e389ae869b5ae47fafebfced6dea3a8b66dd4e6bca24cc3ffd1acec7a7fae6132dacbd9ec97f7d4b9f9cbdfefce60a9b6ffcfeb2effd62354b8f20c2b2dadbf0eec119edc74bed3aff645f51fd90621af8abb55d9cdc37e52dc90b3054bbc23a5fbc19dddd6c1e8f2d3fe57ad4cae2dae9fac15caa2ead9ee7e33be6c47ec516bce5fb6cf10e5ee4232ba8cebf5e7401f6c0b5bfe9b2804c9b92942e1fc8bba31bb26c404002284a2c58f583d8085cb97cce17e20ad7feeccceb478fec56c7aea01e8580eadbe8a65f5737cfb4d4d6d7ce30b16b6a2eb5fc5cfb36eff87fa1ddae6b8cfafcdb88d8de57e8e4c458af9df33ac57195af0bd40dfd4e09be761fd60faeb68d73fdbcf9edb1c27af0eb0e4993e4ed61bebcdc483eebb27aa36f2ecd2accb2d9d7edcd717be1cfe732fd7aedb4db28fa7ae12f1caae3c3f81aaf7dd6b0ed3566641aafc5be96e1304ddb48abb63e4ee0a316b699b66e6bbf2fcfde85dc9046c234edc8a9a987c687fa7a94e354f2f3c0230e109afbabe78d013cb015af289c49de59b8087eacb83ce50995eedc4b96d8e11c97c22d2f130b2afeb6f9d4dcedee4fc3fbcdb98165e11ccd6d5ddbe0f4cedcc8ce1ef012c3ddb3d17119a7bff8b1e9cffbafd0ab6bc5db68d5a2f50bebf92cf8df4cec32df1daf6f391b1bedfbd8f6cdddb5ae8a4afdbf05eba3f7f1b887a9994703edacf454d7bd6674baec2a0be83faf9862be5cacc8f6eab8d4323bf45d1fde09f4bce66b37c77763bd583f9a1e7cd3ddcee9adbabc58f304dce1aebccceaa24c23d9d09cbcd2ae3ad2ace95ab2adea70a9cfe5d5ce55d2cf1ccaeef7d371dfd75670cb9d4f3661ef2c5bb03946dc7cef49ebfb65df1ebdfafe26a82cfff1bc962fe277cfdbeb2d2fce36fa7c7ee1a6e75e0db68d6ae984abd55d0b80c2a3b3840c85a754819f56172da86ffffb6727bc5e1e832eaccf9082d5d903bb03ea96fab94c57cdafa9c9e4614a46adba4f09326eff20d63fc1f8fc5beec0f9f2ecdc3e7ed53deebb926df74abf1c50d82dd74a177cc271ea511af6363f8bd9bf9d4f08022029eba76acf7b617efbfb8ffa61a2663ce74c81956fb14f3a61dc6f8b80513ca9da0fa45ecde0ff980c83b5e8e8372dfbe50af0a6d26ebcde2cda6d7d0bc7bed0bd2184b8599ca626cc6170653e1e5f5cec15ac382e51bf61d21fcf7cbc9c8d49f66394332ec0ff2d80814f8aa5d06fbeddc31ef8b30ecbf74caa8b58fc8e49952ecedfa8675fac9ad5082cdb6dde939aaab7cf8bed96cbd4f1fe14916a79fbdfe5be6dd78f8a2ebfa6fcfe3de0b0b8bb4fb8f5dfc6ce8aedfecf7a5c9022f37aa98f08dc2e372b32ea18482b3def8a8ba8ae24aa1e63eea5174925982aa1b7d96e453bcd2e6370f9bfda23f1e1b2eea46bffcd97a47ae307d8da9ee8baf1b2eab8565da4dbefeaaa180bfcdbb580cf2002de1fe3c87b8ae6adccef1ca2f542bfdf8c8b1cfaefc4cbf9bbf0ccbadbf9f12b345cada0d98518daa4ddea459adbec72b07f9493bcee7fdf5a069eebb9f9dba86ed49fbd65e4faa04cd0696121609fe68e23ffe98f59b28b52a3263c57acbe5ccbeeed4a20df9aba219dba8fa5c72a7f478f61a1bbe51a7afd3bbf3a1cfe49ffa2ef285bcda6bf5e3f89657050e93a5648bac02ef8c3eec8250bb686a8f7895df53b4bf77d6f20649abc7b49ee9d3f4ddb696e04e36a2ce91abd907fc97eae5ff0baa9ee68eaa8cc4cd08fdcccc77c72d2b28f7cef4efde2a4538fca8cdc34fc77df7fe801add213c034fddab2c3c3bcdd55f7c046bf7d4f2f0df24a2bbed0fac12abaeeb23ebfaf5615eeca18cca7c52e43cef40b0fc5d3ecff55e9bcaa71cbd0aab6395183cbfdd4ef9b33dbbe3dce8bab3c0adf6a6ebcaaaf26c4bc8ce5cc183b6f0d620c3ebaad3ef3a5d3c2522d70fb50cafcbc744c3c3793aca5562b9edde573224afbc2abbba677131cfd5742ffb79b21c7b19f91703fd3bc5b4ce042619696d5c73d38e734c2bd37f8abca8c3c9cdcc842f57cb1aade81bd8f5caf5c767dd8b0dd74e5c3bf310e910fa6e69e9775ffc3373cb3ed6617fdb29f4deff3bfb02ecfe93cebdea82d7273d14fbaae400ba302fe3e0bea9b27ccbecc8de15acfd9b45c2d275e380acbdfa0c42199753346e38bbbdfacdbb5c63394e88c71ee1ee58496f7a7e3afda6e1f4e02e0ae70bbf0beb8de13ecdf0aabcf5fbc739ce088ad544cfa5c3aef3bffd4da900fb02672f32caddcbbf44e7cd0a4fed8f1bb3c37aef0b43df0d7e308e50bc9e2d1b6ebd5e5412f8cc325edf64a509c9a4deaefd580bda502c0e657f76edc8fa93967e0384acecddf9cf2918fbbffadddec7843cc4aeeb0e232ed7c9d0a5d6fec7bae7a09d6db9abeda3dff7e4764f456fcc194d2d23eecd29bb3ef2d1f6d1d99bcf09ef57dc89df82ee65ab5c1cb9e5fa30aad709087e15d9c95fb266fdfbfc9c625ac77ca4d3ca385cadecbdccee3fe6caf69ef8a5065a7ea25acb653ad5f98f2dbaefd9cad462b5141f5cf5df6b9fca0ebb79f50d9f9c818de557abbc7bd3baaada8abb4eb4a7a47eaeebe2d30ebec5ecfc75a49edcace722765da6daeaedd18dbfd3a4bebadcfade577beea1782b41f64e7a7ac878b6a356cae9ecb28af236bbef8dc79bbf6127f0abc657ed5b79ef93ecee98bf5705b5f92efc9a0ec847ddbc9b4668056861ef477b86cdae87289ab8dfb01fa03be29c4b7a1e600c444e96e888bb1eb46ff9abdafebac5a09a544eaaa427d654bfdd99e658aea82b8c7e3ebfe9284e49e1e8e9e8bbff199988e96ec4bf8bbe96ffeefa6d2849d5f0d4cacf7fae9dfb2ccc23d83caa3f1bb1aabdce8ebf4edcdecab7467bc3d0b2bf3baa40bbceabb9cbea5abbcf5bd03b2e8aebd3fcc7aabd5bcfed83da787c5ad57dd6f6d51be75dc5d5dcfc6d12206b0cbcabf6f82f0ecd9a355bc0a16fed9ee479c252931ea45be3becfd814ce6eaf536cbb9ba12ac42dbb7ac0f4327cf8e7afbe56dea9beb24cd6ae43dc21f5aed611dca9fbcd3dcf2e7d979cab801ae973d1dfdfdbf9cdaf9ac6198557b7a1c0cdcf46a03e022410e28d2abc0a71ce1329df61ee4cd3d19ed049cbb7a8d70bbefb617b633ff134ceeac2c667b53445c4a5df3a4ccd34b4efeebf921ffe7601aad3b0c04cffad3a8bbfaa5edacea6a7ede7ac7a8decdd917cbc9b59e2fea17e3c1fabf11d023d82edde8fbdf1e4fbeb221f1d7ca42835faf313dd9189dcf1212e4adba3b62b1e0d663e8d60c40ac02ed33fc8f063f8afb8beaa82eaab2fb6cfc43bdcda8902525cf11e7afca82c03b0e5bcdac4cd9c6fed46deddfd6b92ecddb21cc52a1d45fcb9faad3d7cddead6cd95bd52cf6031664cda0a715cf6c0bcebcf3fa41f3f0ac25ebbe8fc8af88f7afea2fcbbec4fbb2beb27f170e860b3ee1eae60e9fe43961af4f5a5cabfe3c15b49b74f28dcbf9ceed3dc27bb18da8e96b558a3b481ab2fd75ac084b102aa593ea32b80aefe4e3d3ac09fc5e7b09d84bf1e9ec81b4a1faa8ce0dbffeea0cf8833dacdf3020e3c9d07a693c62014e8bd37340cafabfde63f9b6275a3dbc1ac9cceebdd75bbbfba3e0b5c4cefbd60dfcba08c70dfe3ceeacc73f1cc7d70ecc9aab6faf3bfd574be8ac81cee7373512aa1a2fa36baadb8e08da0ab58dd92a1431da223454e4ccedad45881365b73c82cb789d7ec5c0a93dccb2d4aeb3692be46bfad952bbf4ec27c97c39e709b20330a169b7d5b90021e24e122bbadee24ca2a161f21a523dddef45bb3e13638a54ac7ade56b8f14b7bdcaad28efebac66b0ffed1e2eadd1ebc9b2ed6da78f610cc65faa75cedeabc4f614fbdfd070f52345f5b5c00af32fd2bee7c4a0b3025984d1892c0a72f36df7e1eeb1bd0b0fd448c9d99da65eb047dc772101efbe7e0da96ef1a9ee30a32863cfb8bc5c4e8eddfdbad4f4cad08facb1e6e08f3d9d4dacd73c41def737edcfda4cc5fb19980f667e107ca9cffbbe699d9efcdbaeeeff8d7f01dafba08af99fdfa36d7054e82094e09ade0b14cf238c6dfec95ad897a9dbbb2c859c829ecc8cf4d7d5c3a05805aafac51a95dbdfccd870a2c15bea1fb70fd408fddbddfbf05d3ad7e7cdbfb7c3c20a71a411ef3cf8abfbdf50fdab66cccfaf15fe20abcc8fae2b34f270e0202b1bbc91ccadafeec8c209edb35ccfb9469ca5d9adcfdfc9acb1c6defaf35a7fd8c54b1f9fffbbaebb294c089a70e9fbd5eb0b4eab7dd830c28a6d840bd7ba74719c5bc951dafbfe09c72d55fce7de4ea8a08fcb09276baf7cbefff6f0d043df03baecd7ba68f5bc3d9a0bc09f02fcef9e0abdd5a4184741ff1f8b5ed8d3eae388b9f9462e4371a8c680cba41f81f9dce07ecddd684ee5d532de00c5e9b58ab8cbc5cffcc6922756a0d064e84ea55a5baafcf29e272bd98bc4ae5d3eea799fda0e55e722b7c42bfca4cb2a0471e1ecdbbca0fe32ada9047c60d9ff5235cca6e8eb6ada43963cbcafdff2eb0e9c34e8b2dd3a4067ac65fe4acabfcb9d3aa5aad28cea0ee9bf2f603e5dfff47510ff3a796a3df2f3da0ebdffb87aeda03cce8febcc4ba13e8386fe30b1cebacc338b1aa52dba7bb880c72cf7ffd757097c6428dfeaf4134baf27bb5ea28dfbe39d31b64597d9cf462a2b860f2d3fed0167dee3f1ebb8f21bff9dcf6f9799265d9804dca3e4e1d36f7b5b02f95afa6f8cae923d82369f5d2fcacd33bbdbafeac5c26754baf14a04f046b8ac1e907a8fba0e0d80c0fc6bc768beadd41f39c1d111d2b6b2fe5d7dbbcdcabfbfacb04ebafdc0d7eb5e2fed249d8561f3cd6c1d5c57722ab2bc4af19efddafcfdf8fedfcbce06ba4d82e41fcb3bb9b70cc30b6accaab54aa912bdece76eeca6a2032ebbdf0aa9acbcace80bfeb2d9aaad0aabd3aaaec0fb5eea38eb7bddde50aaed84f439babab1de4c6b60b84965a23bb058edd5dcb0e4ba2dca3dce5afcc9fc11adcf18ac682aacdc8f575a53d3e6240794ebd59c10639ba7adf3322352d9ab9578bfc88d0cddbfba1ccbfc1dd88b78cc3e734ccde327cc14a2227b19aaa1af8bc9bacfd29c5eaf924cf8df6f60f87073fa0bb388a05f6e9b860ba5adaa3a62ced21d23cded375c939ec9c374e2c81cf0b4fb5ade8ca0b1ce0d7000edfe1bbfaf13cfe8fffbb64d1efcf41e3af85ccafc3bebb13ff8f48b3d0dcc3cfc5b5adbef8fbde5db73bcfdedccee7916d4acaa1a693edc81794a249c7ea9435efca5fba3e9ccfc839aeeead2c38c853796dc13ecbae8af00fc7fffeca4368cc1bcdc2e75f4fe88845c7db6cda266620cb9b1ae8abdadda4de8f221cfbd5d3cde76cce9ecaf93cc6dcb0ae3caea76da97dc876b8dd01fc8a703c6b2146c032e5be26df0dca0c5d0a953667c3ea67a08e6c4633878330d2caaca3e4e8b8e07efc67bfcf3945acfaffe011eabdbb2af5feb3da681a09041e8ccabb2abe094db6b0171ddedafe9cdea72a3ecae34c6f8e97b77f8961eaeb16bff9117946cbddfb236b7c066a4bbbcabc7cef13493b9bb828f5e7f34ce0387fb6e15ade89ddf8feffcb45476f20c21db85ab957fe98a2a8bb2f78266e48a91eb5f6a1079d9f1de9b726ba8ebb5f61ee5ded3e338c3b19ca1fb97f3d371acb9898fd6bae6cad3aaba2fce0aaa5cf7b44fd1054e0dfb26992ddb4220afb167463dc73aadbeffab58ef6ea33d4aab47e1ddefa7ddefaf744bd9638fc77a6abe39efac7a5a1ad9c30cf453668e8a15e8b02296ce6693abaff0d251084af3d3bafdaebfb1f1e0f617ca41ee0ea7c79f5c1b0e245efd81d16acd9f2bc7ebcfb3bbfac28908f7ad44b0de2a97dddad6398b1d31fece1dfca2b3f519334dd01c8a9f34a2cb9a4c7e493eae9e11a8ffc2e7747c56341b9c45bac253bcdfe8f28af1d5daeae19bbf8afcba7ca1c20eedefc1de223e6a8fbeda11af36ab10b08ceeb3223fc415a8aefba2c2e4ccb789b15ef5e31a823e3cbeaf04c48b98ab32e390da577fec2fa8bfb7d8a3efa5f90c68ffbcbc64e8fccefd4db75e9dff78baa6c8c6ac15bfe9e7bca8b2ef14a48dfaed511dd4a0ca1c4f74c1706e7ceb9edb584536cccdddf22a2dabf54f62dc5afdab64fcc1ebcde199fb4fcb4bae0d6daee54b3a3f4ae4af2fd33b13c27f3f97bbef0f6ee8218ef778c3bee130cfdd4ba33bd0a8db1659d69b0c741dcc3761330dacea70e4b6583bbcbbb4cdd13fd6c97d44543d9cbaca08fffe98df09ffffb732dcac6b4dcdafac0daeee0b6ab7b47a738a8df5d769fce9b4bac33135f793d9a476feaa65727b121a1d37cff8f370c5af086bc6b46e65aadcb9bbcbc066e4af1eb79c14c1b0c2c45a75f8ddb666c3967a299d0c5ac6e941cad0f01fd5bfecaa1be2fefcf19bba5d9331c54ea6bb1cdc051ecd762b876b775ef5bbc4ff6ec6ed09ba0ff386d4ef7f77aeceecc6dafdaf36cbab57ef0b3eb8a3aaffd72fa0bccdafaadbfc0bf90cffab9b02b094f0e8fc354d8caef66bbfebcd9eb03ec3dc1cbfecffad6edcb376f2e39c0dcdcbb08983aecb7bcdba61d7a43fcdaeeca2d45a4fdcc502a3ed19d7c8de028dd918874aef509adfd113afc7630900deca93de023bfaaacafb13fc28c35aadc9cc6c4cc85f02bbbd5bcb181cbdeecdc20be26fdd8c6acbfbfb1ba0b1f21e5ef1a8acb1b9c41eb4c8a4a2ecd8296dd62a0cc6c00e8cf124fd6e0c31ee63a7c068cd73db676f69d63652d9e8fdb7abdda6e6b6bbe635e5c9d5dbd8f93c6d2e1dfcd6494f5aefdb0608a6b3eecec11af63da9feacc77277bdedf4cc2f04908fa2e33aa3efcea30f94a63c3bb56bb494a6e5ecb17bd3ddbc76ba3db8ecf0feebdc5be94b0a79b8c85cc5d5ddaffdbae1edea1bfe1addfc5ca87ac7efd2a7d1db150acbee21f555de8cdac19bcaccde8bb3bbb7035e5a0d1c7edfea089e328ef8b0d614fe7f57d5cef094a97b9fc6fd211e97b7aa0beaccefdde1e80db9f18a59d4761bdaac34eca6c4bd7dcadf4c9c937c13cfbfe24ebfe82bef5b10f123bedb761a3ee96d247c2532bec66536fde332b0d62a0d13c3def3ab51e3e5e18f53ee06c48ebaa9302c274afe021caa1260b15ade3ecda6263ce37b5e2ede0c3eb043debff57212a2db2647bd4d6bc4027d2af3a488cf6d34df741b0ba448b36a8a6dfb9b3095bc7f13efcb42c92b5dc5e6ef2ca5b01acc0017b67ec7cfa8fee2b2bde0cb3baa1c18159edfd654977ae6afcff372e752fd032ba8e44e0b7be17ceaaabc7bdbbfe9f808daefc2d3db685e5ff7c50bf8289f2665da8409a4b312769629b8d19c02a7d379b260b3ecd771e6a7206caf5d5c9cd7fd4c8a1bed5db0b2fda8c9fe2734ecf656d0b92c87a5abadcb8f0ce8d559f7ae29efcc6d095f4aaff7a5ec7dbd5f73c84ec65aaf4fa5ebd3f7e5cacf7631867c1aea3ec4fe2ab47daf30c250b2f27c0de3753ca1cc0f9b8f38bafc4dd20dcef665aa3330a116744828da88eb5dfbbe2458b4dfdb77f07e1ddb2bc2ab88afa2d8f0dec6ebfe8ba45da27866d66b7ec2df85f4986742d82f2c302aa22ed722fba0cda3105b8ad84a3553c0dacd6d6f06efa0bbfe1bbcaca84c8adc047217aebb1e7f350aef9b5b71ac5f2f0ab2df0fc8baa04371c5ed363f5814adeac6efda6cfce0cdbd35acffbfbbb50ed181cb4bcecbf86bcac5e26d4bdcf13bfa97a4bcc1ed4eecdbe3bda42f24ec6beaa451ae66629bd3d162bea8a32aae81ff78c6d8d4a5a8ff6babbd1a0eaddeb2dfc4ce485335f27bc4a8f72e2681cd84fb37dca79bedc0fcf7dfafc6cd9b19afcd11c2d74f9de0ebdefd112cd0550d6143f4211c41e0e0552aafcf6cedfe3bee36eb37d40b75f3e2bf96adddbfdfaabcff2fd42de7df6f1dcc446d8ceff7b0ba0cd0ca7fcabfeddddbccbfa02faef728af4b23abe626fbc8c7d8a8dca5e5dfb0dfcf28af6a3e1d2baa4ba17bca54d901cbedcbd457cfefb4fa98d6d52c63addaaef9aaa670f78ecf28bf8f8ad64bd7fb88f3ceed27ff5b541ed0c6faa485bedefbb979cd16ae8a4d27222ac14dcce14a85bcbef1c8d28fefc760aa8a0ffdfedc5e32fc6aabcfeacdf3cf3f2a2dabb47e3ec6af9f4cbe399ad9e6df5a561d9dfd9e9835bc9ded628e85a0a2fe0e1dff5f5ad43e8cac01337dbd6e0cf619b886a73d487d770d107ab9e9eb2abb4c84f6ded10cdbdedd4dae27eaf2cb18c4847f8c3371c523f97dbd2efc3d65ebe619135b77ea7d13087b349f76e9deab9dd11ac46dd9bad419cef641535a112443efa3e0eecfef726cbefc5efad482cbcbcbea50fe72f053ddf686fbcd7ed2fcfe1dc015fb458a5ae2ec7f2caf783d23ffe116fe59a1cdbcaef68beeac2dc33abec19cb47c740cde8ebf230dfd9258e6adfef94c7668045ddbc0c8da1004ca9a10a773e3bfe6f19acae67ccbc0294fdfbc9cfef3337f6a48350b376ae56d73da8fe3a04b2d61b901e7dc3eff31bfce5db7ebaf87aecbaf2a6acfd21cbda520aacc4cdb47b4ff50ff344a52a5be31a61bccffdf4aca5c2a244bedd4ff02cfcf5d3156380a82fc0efd8504f94bdef2bddd71baeaeced03a52ecdea1bdbde2de4a2cece69d48edf2bee3a7f9ad66fe8eac3f12ddbcdcc7423f85495754d7dab41eaca58bb4ebdacdb1fafe46eaaf0fd1eddb4cfca39fdbf5d6d9babd3ed2b6138cf99a9eed8b48aa08cd48ad5dcea2aac1e7c7baf171dcecfcfa1dbe0dec877b10e2f530be8eaceea205c0490bbfcad6b0ddfaab776e18fcde0e895301b645ed6ccf0cfeee9ec5b86ea1baedbbadbd8133eb25fd71dbbbc7fb8ceffb2ebe2d4514ca0372eda63e70543daaeb9e806aacfef0bafe3d18dbbdf6f75f5dbeae3da2f8dbc7ec9a6aea855d42a0f5fe93aaabce77422a51cfefe31a40ff3ecbdb40ea2c9deed4b0ab4ba05f93b7cdb2618ebd9e64ed879cffbcc62cfddd5acdc1421adef7d044da9fdbdb03ca6704b6bee4fd267f2dbc5acfc87054dd74ee02fbc5b4ccaf90698cc2619c54239c2fd668d1a12bcc9eaeb0efc9b8c7d4d1adfbefa8ca5ee40ecaeb7afab52338037fd6fec1c74a68ef0e74efbbe7ae1efaea19f4aec79dabdb472ae0ea87ef2fa59e4b2bb4ace7f4a0ce8a7dcbc7bdef43ac2c8d74a76dfc20f4a5c7be8c38b9f7c9d9d1e1a95a0bff6dd2213d3f1f898bfbe7be2b5f2c6ddba884ca24a60ffedd0e9cefcfac4ffef89babf3aede783c565cdafcd6cf8ef17ad0ddd434ec8bfdbefcacf6aaec3f2fff1bf4bc26f42bb3d91cbed60a9fdedfcd91a2e3fdd3bbebaeeffad86edd6492d7cd1adbea47451d7fd270ea50c80ea6812112bc5bb1f9711be7a53ab32607b2bafaf564b1c5f1de0d4039f20c6fc67a5efac367a4dfa3e45edfe7561ddeb5ef7ecfcabccbe681ca62cb48faaea2c98f526ba15ef51aaecb2edaaac28ec5e8eb0cbfaacccc87bfc1433dee045ac2bd55bfb6cccccd236e722d5ac75ce3f682f7f87bd892e4edfbabef748bda9148ecac3bedff2bb023e76d03f9d507019ed06499eed0d353d2b4496bae4e41c92818fcfcdb1ed0bfb9f28bb49b6ebb5ac9ff8a46b694912f00cbc92266ba58a55968d5d404e058fdaf2efebccf4da6e1e1deabd910dfd5aa99f83501fbbb2fc145bc4aeefebb1afbdbd2b0b23dffd6db14fcf6a98160fa2ca69944428bde5cfa01b0d17fddfeb23116886ce3fea37868f5ba944f7ecc0d7d7df50ec6efb6efbf4edea0abd9940ad4c3af4afa568e50b3a2b4c24dbf1f81dd06221eec86aad2cafdc2aed2f2ca18310f7ace0adaec8da05124874095a1da54d6d2fde6e6fdd9c930fac9f71fae95a57bcf52e25a48f985dc2170ebbff76fd5c1bbc728f3dc2da27de173cee77db7f7adec0b9dce4c9ebef02097d6cc8da300d14caacac659dafdcee845fd0eb3e8deb895d7dd3abdfce3caf3656f0dcde0ebe47daa1ea593475a9edcc31583ae2e9c4356b357de1cfb8ba0d78f23caea5dffd664f117c8433064fb99eccd7be0cfb89adbfecc6d0e3ff0a2dda42daf11a363a43eff9c34a8ecbbeaa3c69b98dbf6b3fbcb68a5076e2a76ab46a00ffc0e07025fc4cef8b4b21f21f23610f909dccbaa61ad0af03cfb0cee9d0fedfcf02748fb2bdedf13b4da5ed3c0fabadddbb7f6f178004cd2f9096166d1ad3add4f8dcae646b7bfee74fa8cb7a2b94be1ffd52721ae23bb4571adebba99d5aa5b89f437cacc5040bcadcbedc14f2464dcb01345ac8fcfc7abfacd9afd0dc3719fab4cbbae4ceec6fe5e6e84cf1a6adee72cf131ad7eafd1f4c1f5e0e6cab4aeb7bd0607f6e0e5baae01c62d7c85cc644fb05f0f2e7bfc14d4361eb96e832bcaefec9ccccbbbb2effa87dbeeba7ecb2ddd49c71bbe119afed3c4d7cacf214297eacd58440a98633a6afd35fa6d7cfe292568dbb5db5ba55b48cdfa6ae9ef6c1d41024d8a4b1a0faa29a2ff613a10fd50bad1d3e968b40fb0aa388790098b9e24c26ebce9cec4a2baf9e1724b10ddd36b0492c9e8b0ccfa4c2ffde781ff4aa498ad7775c48e89660ced6dbbd9a4bed9f5a472fa5c0be019f5a1daae87c6f9dcaddba2582e3f6fabfdb67dbd3a0fce94f1ceaac333ae7ef5fc0a8a84ac36de6b3ed9caf46fce01ab3bd5c47e56ea5fb6ec3f1eb82dab9dffee24ad3a45a0debedd1dbdbfaadbaa0f5777eeebd44b89bdba45177abe7f6b99bab6b3b0fb1ef316369667ddbc5d0e67beea73775fe1bd8febb67dbd9edd6cdff43c3ca7645aba5d86e11db117a61ffab1e6d6c35c502eff35d58dbeb7a1c051fa00db8d237dddcaeffae31255c2fbbabca2fb541da6f9a3fbe0e1a354a74a5fec1d4aecbcffa86dd8c3a6b068fcf0ffcefc4a0191db69ca1c9aebbb5abe7c4f4eb8bc54e692bcdf93e8f4d181eefade07c976aa95a7387c6d7bb971ec96eb633cad97189e2aacedacf2207ee3a4c6e94a848c09af17dbcbdbe3bb8c4baa8287abf1b08d42c4868e5bf6ddc33feba308e4aa1e9abc3fd7cfc75fad65eb59b1da08db33cf05d5ede1bfb98bd8de88e37fc6653ef43cca9bcfa8c3b1cdecfb74d4c0e4b4cc69d6df3e0adeade4e2eb4c39f1cf4f2a1bffa27f3b1debda7c7231abc6aec5d389ae68ad1f1a9bcc73daaa1e5c6bdf14b6c2f3dbeafc2be73caeb0fca4c48538bf47039aa1a9d1a64105fea9fd7bdfdda767163dc4aa7fa47cdbfecf3bd1c8c84aef13fd8ff6d5e4353eb91e02ba129d7f8362ddbeade0fcc7838c60dce964ebdaa9b376bab23b39901b32da6837e7145cd025eeb61a304fce1da8d5ec90faf2f8c6b86b51be82161db91efe90bf2fff8bddf64681c3fcc61f2d4833b85ebbc4c8bd8b2aae61bfd21411235d71730967ae762bde90ac9f68dc0c7fbba28fd9e1a6dc7a67ffabce7ec57db8242eecaea79b00e8abbe2f7cb88f8c2ed71af0bcfeed279e8d94de582044e39ec87dca337cce68fbec558a6caf9366a2cd02aed1a1723b6caff6defedb006a00375e77fe205fe90ef73e6b18dcfafe645f5e9915ff4fb17ccdfca2f58291f5ffc258f66fdb5585e79222ddba6ce77ddf58114e85d0c66ddcabda5dd197ded01a3f6352def0f4ddabe0fa95e0d4bdfccdaccda3a948dfb19bfbcbcf9e9bccc003db64ef7dddd2253b239ebf2bed4ed580bd033c0fc55c6aa56ccd1651ec056e7e7bddb2ec42ca9da039cc0a397b2adaf0d9b13bc4ca5bcf26ab6a3ab5944fc563ba6d493eca8cdcbd1cc0eae45f1cafb57d059e7accd7cf49cd9efbffbd0ff431cab5baafb2714be5bc9ad622dcac0fac3abed804ee6f3051d35d6a58ae0dbcbe359bad67d5c9feba9efcfeadd51bafe1c3a3c541aa7bba51de4cba6e74aecf40ee07f509acef85db5dad6be0e3ad9c43ec19badf1fb879eb0cc0e8979c06f0ad40f1bdecc7720afee5c5258f10ddc0365504e66e9bded1facbabddfdc6abe0add1a31daaebeaed8ecedcd2fcef5fcc4c34dbdf387aad365dec0087cb0c987fa3543e25eccf7bec46a1cae24b66cfc987de2ceff2fe3d0bda1cadd4fb64610d3fb9e5ba345dd3337affa324d93c68eebf19de69ce5db4fd3aa95960fffc0dceecd96d04291c898ddd6a1eab388b9cd762cb0dacfaef83734bfbe0a3e5eb69cd63d834d4c92b00761fbebdd8c8e7281ad7ccf409aee7ccecbf3d1ac856115f1ada932547ef9ce85bcacad02dabf95ce4d4bbddaf8eb1f210f7b2c9e67daa0d81acefdd641a3ab0ecb1fdbc46488aee2bd582b831fe4dadeee4f6bf5fa6bac55454cca3e06edca197fcc8bb8e49dfdde1fcddd574f9e0fee1e66dfdc3f91f844ddefcdb3a9f452deeedc71f9dbbe4d19d0f1b9fcedf9a26cff71b05b942b24ddcfb178a1be3beba1d1e3010afd0f6cf8004eb5dbaa2b04d6aaceae505bdfa7504fddfec5ad6e48f8dce6e1003efd40dafefc1dee6ab9043cfb2f238bdf61e84adff9d6fbc68d9eca6bff7badb430af62e7fbf18b64f3a355affe9d28ffad0560305ebaaaf49e242567a2b47741dfffdda1dfcbccb790deaba3f30b4e447bf2703131dfd887bed1c6f3bcd0f4a2f807d17f89dd4130ed76aaecff700d6cb9cedb55b9fa0c8b86aeac804d88dc0ea42a9111efb9937d70fabe6ebd928893bbda6f7fcbe14db74cc07897b3605fec3459d2fa8fe13995cef09650a90e8ee14a8fcc2ef63f4ebdfffc372aed4847d684ad79dcec3ce2f8b3230e927c2dfe1ee01d987986f8bd48fda890cecadc4cbfc4565cd984dbcd21b3d44e8100a63d346632c7bc433b3eadf4bffc14b95be4f8fdfaaba31d010ed14df496167bbd5bc5abcec9551f38bb0ebbea126fed3a6ad31abbc98ce196d2a693cdd79c44909c406cfe8bccdcdeaa9fcdbb5b1f9ce7545a15f55f1fbcb35cbda56cae493f2daec8dea33ada56c4a6aa6ccf96f4db7fb6b35eeafcd2190fd1cddffc4c40194e0adff928ab89b1026ffce4c6aebc2e7fa5be19dc6d9ad3ef1f68d6bc22d46ed8aef60768f7b90a3234dc174c5c3b7694adcbfb273bdcfc5fad609dfaf7a99a9337defb0fa36cf09ccbd8de3f099dc07110ca2f8a74d7e2cdc67cbfe7ccfdaec7c2cebc66179f98ca793c8fddaaebce58edb1f8cbfa07bda6bf5f2d5bade395d6fbcd897dbefeebcb521ed4da90ce551dce57b552cdab0193ea1fc3b3ff1666db80b226d1e5c90ad2e4bff1cfed9a240c1188cae6627b889baeef2bbbdae72ab3adcbea16a14afb95acaaa8d304acb16c7bdc9e10addaae81f0fbf3005dfa02effbc72ce0e2c597803c9ddc64a18c0b6fb5b2be63cbbc8540bd5c56278fca7a4c017c89f57658bcd0089daac8ec84a499a6cb1f3cfec874f22b46057e773e24da1ead9cefbda9e9d08f8b7db9c45fa5ccd0ee956bcabce52dae07b9f7b9f7aaceb3971207ada3e4350ce7813b8ee3fc7dde2b4a62b911aa2bf25f1c2f4c7ad7a2be34c9b0a06a7daed124c4e2b22cdc115ffa91c3eff25d2ab6f61d3776bcc81ffbbe04aeb96175cb1dddfa9c84a7a9eef3ff7edcebb1e12afae66a85eaba5b9ef15bfd0cbdd60fe8dbf7dbf17df906caad7fc6a9cedafb8f2bd11f4eb37f88e07f8da43fffab03fba7dfce0d452ead84fdcdd4dacc28ca246a0d0fcdd1c7d85db8a36086aaeee2edb9b4ab9cabe14ede716deaef6c4f0e701b4ba85fe0b6769e52bbbdec72a3afd6e6fe040474b15a5dcfb38eafb69cb7e9caeec3bdc9deabd4f5aadf1603bc1adafee097cb9b3f4dfd540ac7ef6f1ca46aecdca942fc0c9e775f39a5f75fb7f1c0fcfeb7ea0d17bc180c355cfd2ecffad8ed0d0423a462b3cd6edbdf3f19fed4ad05999fc92f27bb0f1908878a3f5acac1aaf56ac3e3f233fbc75ff0fb0d6e81e22c4bdee4ba0ce9dc83334c4c9c9ee8650984c68df2af0d15fd6cde11aa85d9d55de0d0b446dfccbdf4dfce71aac4fafb9d0ee236d858928f28cfe4558c77c0a34f0fcd1ebdeeefe3034cbada5edadaab77f57b823bf7c23ea4afcbb9e9ed86aabdc985c967aa0026fea9df87ac3c99fce87bd9aaa5ea993d7d50b9af4c132caad98adb244b3c2df00cfdcba551c2a09df4efbab7cef3f264e49ea6ac5645dffc4077fdf854747bbcd7108638faaf198a7fca2bc24ef2abef429b0abdf592f1ee0ab3e92bd316b84f0c20f8fb33fe7ee7bb25dfea0d5f2bf440fbcaf4edaefcd6caf87faffeccedcac1faf7c6de7da0f56c314fabbdaa6acf1967b397ac509b33645b76ece1ea9ca41c68ae59a84b7be515fceefbd0cfbdb3ed7ed5ede4c7e79b1b2c7a7131cbef73ed8c5702ebbd241abea2afb8ce5fd4a435babaae81a74a23b1f545858aeceff66e7ccd7e49f0d31ffc2b92a4b8cb4aff5f290c25b8f0d8b7871af7b5e34e02b89aabe9ecd00dcaebcb6bbdc1e7adaa895527aa47c5a2a1dc0a27ba4ba4cedaa50fdecbbc0ee730ff30e78c44c5fdcfeccb6b2e25e9ebac07e32283addbabe41dcd1e4ebdff041a34b7c031dd9e1cdbbedfbeceb571959e40ebf204dcc54429daba62ccaf800b598e8d0064df6b5849e6cfcd22d3aefc38fadc07cf7e9d7031cf8ae11bfadd1e18beaeacb55ff161f26ee41ce3a6cda461c3bcc2b0c163a0b2ec927b795039aeaeaab9be1e2ca9ce2a532f5cfbc2b13ddf00fbbf4ef87c075c99eb96cf45fac35ac88e1b22f6ecbfeced7efb8ac26a3eecfe76a13ebd5d4086b571c53174c6a89255c4baff22aee409f26ef27981c27b4b67ce267ceaeab31b7eab8adf0bba24f5eb2192a5bef0a8522ef6e1c66f2fce2fc4aff2f5b1ee4a7abbf3ebc09ccc06c231ead4b4b04f8ef8ddf59a34acafcc42b3a99bf1bd33e3ffed458bccb79736dcbd2e15e0bcad23c3dcdeeebdffcefbccaead2cafaafa188463ca5f8cebdfe0c505c0cc4ebedd8caffcff1abed174c61dfab59ab3ed0067ba2ad39d7def88a53bc8dccbbba7a4ba8ce1fcb822edcdf224fd586da537a442281a23a6f1baa4b21873aa5344b3aea20d782543aeaedd1cb9a680cfe1c208a48a17eac9cbabcff6807f4948324afaf2cbfa19e0ee1edddca279a9e0a0aa5d99a1bd5b128c9baf0f83d7400a13dd5c268c2ac3aadedd67f7fa59256b7edd4386ece0ec1d1f2983adb25e0a9b0b1aa3d32ddb9dcb26d58ceec2f02d39fb4e232cad0fcce37ebfbc922dc11519cf9925c1b0de1152546c8d714e40dd4b1c1e3fadbd5fec452bad5b2fe362d6d358faf5e9afb666dee831dbfae690c1ab76ec6f6eaff7e3ffc225cfb426aedafd6fbb37dfe371b84a8e60d55ed1d8c64ef4f96d832d3fa69fb4cabf6fcaf8fe66fbcbbc3fffae6a39647be37c8a1bd3e946afdf17b644b2dc34928c98aa4d50ec70acdbf5ec041ab5fe389ed6877f274dddbade41e7eb1d5d7998e7a6e1ea7aaffeb42a44aaf0ce7f9bfcb6b9ddfd2c34f7cbb75331afd751bb2a8ebcebeaae394b388cf1f70cffe97f131dbcd3ccf419a63acaec620e4be7aa8db8df33e928f45f5b942c1ba0bf2fd0a6de9b36c947b05efda13cffd94a5c8b1b2c8ab1adfbb44d7affbacaf5f9d6f6e15b2df90ce3c0f9f53be10e69fe627a4d3ab4d79c99cf75fecdb3cc2f7cbdaa24c84cc07db5a21cbad482a2faffe24bdd2f0ace504436bb68edc30ae60efb3534baafed9ecd4112f1128c4216ae2551df29ba7158fcc278b19609cbcff0ae6daccd1b8cd1ccc3761ed8a6facd1dbf2cc72fb991afe70adbadf419ee1aedebc93b24bd28e2fefe2a2cfac38e78ac582cd60ed83e8f2de54dfadb3a52d4aaafaf3d3addbe13fa337a4d0f050eec96ce103aec5babdece9090e70d2b059da2aecabf9b79fb55ab65aab0bcd0d6aca7acdb665f04551b85ab14a080dbb40fffb69ace5ff0dfe3e5a79b3fadac524e910eadc1eca51459d6da1cef8d131fa95baead63af5e754ece737ec3d29e49d1becce4d62e9cc9ddcd753db0aacff5a9a4dd5b0ae8ce8c14bcfbce75a3be2d0f902cc3afd7b76db65bf4aab463643bff99dfb225dcceb71ed400de2d2eea4b7ddf5f5fadfff4742d9ccb81c4ab2b38f8fe3ad5abb8e3a31e28e6e691b74b51dfb40b99c8dccb3a63d3b21f1ab307354eebb0abe5cf45d2cd6eacb13f3c63a6aeab38f21ceeb78b85ae2c8f3f140336bc5eef6e62f4b55aaae9c6852d31739d8af9eed12a76387aa0826d9641eb1ccdb99cbec3dc3db4bfa69ab64713ce640e2db9524dd33ff6d2b82fc57a36f372ff6a637f3db1b7aad8aef38e8a2d4adb25df3c951dce141bee729ded992efb173ac25916be3cca2df3a05c4d0cf0bd5b05d1b0cf768addce3732e25b1e87ec79077e4bd6ea055e5c0f1c46d4dfa521afc7cd2fab9aa926d4fd60dfe5b79df25f7afff9b8d65bdac73ffdec4e0a69f66156bd51fdf42ecfdbcd67b5eba9dc433ed7dba89be4c3fe4fdd61ceebefe8278dfc16e7beb0820c1fbfed6c52ae23dcb736ee0982328b722464cd3b4d1e9906a27afa28b455eeb2b006e7fdff28e2e6cd9ff355f0dadc6e62ebfb6d35f2adbffab0dfc20be860c3ab70dccde11a801fe1cc9aac73b6d2abaf2c67fa265adfe3cc2bb7dac79aaa20f3df49b199db58abdf14e58ca7ab7ac07317d2fcf20f1d7bf8a2cbd3de6c9caf49e6f9e445abefc92d6b3edb6fbac9f75b6c0975bf9afdade5acbbeadbabd4aa017dc9de9d0d6ee7e5bc091924428bec8a6bcca2409b1afb68d2db804ce7a1eb9ef52bf0a6bab8e5bfbdcbeaaff68e5fdd2e3c4a04a542eafbcddda63eaf27d22b1b87b8b03ade75a7feeb2335cbbc77cacfcbf7a6ef4fef2db3eed8b697e5e06aca8d6a597ceef00acab7aaeaeac39c6bddd856b570eb62cb9103f2fadc5f2f31fdaefccdb57d5f36edacfbcbafbc9fb3c750ca95e882a5dfb9b00cddfcfbc54f5f9acf2f05f9c96baf3338d9fecc6fdeed239088f96390b91c1b44d6cd30beea87e429c432cb59fa1c3cac7c33f5f4d03bad2d5e27b2dba18bc37d9d687e650e4abbb4bd08307f06762a89a37a16ceba722cabe6fcfecc424acee6f8c2ef4b027010cdcfdb85afc8f41fdddfbdf9cf515cda3f7e9ccb1afba946f5267b0fcfa1d2eb12e4d1af40d661eac4cabdfba61b755c1cc0cbcda6e5cfde791fcb4b92e029ddc29abd6cc1ab955bfbdbc1cd04df5576810948eb4d76aaffd47ceae811ddb8dca2aa45c310ed9c25162c8ba0b7ab4f62b8c9edfac521e62bc8b4af88efc81be2facbdc438be8cfccde557ce3ab6adfeee56d6ac629cca87dafb2dd3cd8d6ededfbbef5e7533211afdad36d4faff3e0bd3bd97b41667fcfaf5fe8bdcfe93190d31e0abd6eec052c92520a962118e2ebc6017cd87fdaaa2ed8792cec40cb5608cf40fa8ba09dcec23d0d8ecdd08d7a8c1d2bc697dac9fc0513b30c585fffcfd77c3e6fbbad5c64cd38ee42cccf530edc3f0bb7fa7efb7d5a1d1cb5c497f4a4986febcfbaeef69b3ae05c282a45fe0ff1ca4dffc1a3b1dddd1a53cfd5a79b9ae62ddaebecc995ef5ade23691f8312a1c9f2176abda4ae8edba49e1e48caa31d7962bdda7ed2c7ff4bf58ce57ccd9f3bcbf5ebe211fb8b1f0cbd2e5b1343b7a1e2e34fad6dfadfb84417b13f993e91daadbb8f0dca76aff40e94be5acd294c7ffb1d77ebc4caa704fe0bf5868ba80bc5c7dc1fc260635c96ceea6beeea8d4ff0c1ddd6fe24fded9cadcca5db8e223bc7ca4ac1bb80dd6edd2aa4b0a20257ac5d9d5e1c3ffbf87d2e8c1744ea6061e3ef9aecdf55c48fdefc2bcff6319cebbcdabe751157be74abe66ecd3f3c939cdcd0cb88fca910a74df6c8fc6b48807eef5a2a34be217b5988f0da6df5114fcd52c6576eb7f3b0d9b8d4a8847deefbfcf4ec3cf2eff3fb6b0cc08d7db87ef9e9a7b8d76b2fbfebd546a26fc15dea6dc0cb6feaad34b0bc9bf8496adeefbaf2c0a86cd3f02b11a65f60acee041d87abef2f3bcfa01a06ae2295bbc02e7bbb9369d3fbbe147d0dfcbca367efbf4955cbf3b5d5ebe6b7f09d93e17ad8dce54e16e9ce8b95f9de0dd6582a9a35d5e9e00cbd7debdcafaf34ff7a25d18bf188dab605060d74e70cfb1ceedd18dafdf3a987e1278f0deff19bddab31e747b32ebf5d10ccaecc9a1bc4930dfaa76e6eccbc97c3defeb3ebd5240bd5aa86bd0a8a5d28b5fbece1a8b7d8e2e2fb8cc75cfc05fd97eafdaa61daea9d66bb7e089a2b2fdbeca04b1d1d9bdddfe0d0e0b7cff2bc12c2b9fd1615c80e3bca55e5dbcedca2f1ea65ebb7cdad1a69634b4c5c7ee752893e7545af2daa4c428a1ddc433516bad7914bf74a3a2f677802fdea38afdb77bb0dcfb4ddedaaaec80d9ea2ca3a7fd90deeeecafdffbb0cb77acce761ffe8bb4ff95bb7fdfd9eb31daea4ebfebd9a1aacaaadcef9d2bbf76e9bbe9e8198180eee0fa8abcdabd0375e7aded743b4035de8661068aa6fc13fcd1be7edf6f83d2d98f3804c553926cbcfef63daf131dea5c76dffa1e2c941ee27182d55cc10eb2df3acdbd33e41c2168ff5e3ebf1c7c4d2bd72311e2eb8087c57bdfbaacf5efc53bb9e6ebcfca5ccabdf8fdcbc946c7accb57c3be33b7fdb4fed4b2b81ca0abde6a2557c79aafedb4de59259b3c0f9779eaa9646a96d5808f6389fa3fb4a4169aeaccbbedb803673d35e6d3fbc1b66346bcc894e8beecbbfb88f5be05ab11dfbe6da7be2e271d190e47c36f56db1fa39fff5db44d9cdbad7e2f9406bf9a43cbeb9a7cfb162c2bad7f77c2d9bfed6307d2afada1402cdb0df6a5bc0e2af655fb102cff34afabd3a11c4cd9f015125ff04bcd1ea06bcddaedbb1fed6ba69c2aaf4634c0e8adfa02d73d04af849bfed278f1eadb6ec9fe26cbc4a8e69f44e4eefa4d8eeea4b3b8d94b241e3960c909a6ba1d8f4abb31cbeaf1321beafafaa8c126da47e6ad2a2ae6c79dffaf9dbf2c6f0f0e395afd0248c1bdb9f3bbbe4841c1f3589d906fa82deceef62ae8fb9952cac1b4eac99f5e1dbfdbdca21c9b6b7f7e25ccc8a2b7ce9dc2cde6607dabcb82e5dbfdf064de8b2b93ab785cc6bbdcafbe2ee7fb41066d8ef8a7d6e61bba979f36befe433afcadfdc85be0f526d980bbd9cf0bbbb40faeabdeac5f9b0decb1ec51da5e72d89290a5933bcb8b92cd738309bc9ef2effb643b54de300fc1ccfa7ffc13ff6ce8f87cfc246126c8f97d7fc1a0db572dee2eea377806bf08c2dec05cbe0d3c340e7dccae9796de6b7163ddac7efe5eec62ca8ebdd8bad5041cd8ed5aec1fa1ae48ae7db1ea37bbb2ddb7aedae0f4caaa4c48f22ae3957f2dec91b5ff6c1fa0feaa45e17eadbfc46bbd0cb9a77da0a1f2f4e7b2bec3a4d00c3c0c55dfb6deedba254406d27e1fb7faba1acbe6cc6dfe3d0ddb0b1e6edcd50ecbe56da59e9bd75befb76facbefa0dcde72acdef194a6c1b3aea4e9f5d2347aafe12fe4baf5318c3a9fd5f27f014cf0ccfedcd3d32f4a3af0fc784c2fcabddb0e9ecae3e0b48ee574e55e3e6a17d92b12ebdcc1b6cbfe71ae0cd02e9fd6a2d77c2a245eb0cef90dee0ac2aa6b422f69a87cbab5edc12db8a48df734a96b0b3e0c6772feaea12f87befe5ca5aea9e7a23df73c3073845c11ac5595cfa81ff9d2f4babe1fc82fa3ab6a20fe6643441397de2d4edee4838a812c63dfff9f7bdcefbf40c20e0e026d3f7b4befcc86a99f2a1ad6a73dffef4a74d124f3970fa78af5e19e690acfb7595b690fbb1d83a3e0f2feeccaed47451a99bde504c1abf8d0a36bffd0a2d7b051fc05dfeec82ed7fccb2dcbfffbabd9f9cfef5bfa2e2c5b7fbe1af8ee8b32ad3b8a7e7b0598b8dda06949d8f3dd9aa1fd5fa865cfbc0b1c2bedeb250df3f09deecc5ee65367df8f7c9eeee5bdaf251fffb05e10f3fd3bde3fd462dca3c8ce0a8fdae34ebe9812c4db23e51bcbbd1b9f53cd8d72e4b9cc15e79cacefa3ee4effd8ecfffbaaa141749ecadfccbe276aa9fa6dd6b1ab87ab4837bccfb2a4fcf4bfe9c3f0780c6f9f8b7bd6d812fe68d6aeac7dffaf8db8a85a45a2efc03b0eba8c3ab7edd9d191caa6b34ea7d45e9bebff43c18f868e71acdaff6be2be3c54b98ee47a16c10e4fcd5ba050ce9aaa50c57ec3ea592aaaf544ec6c2c8fdeccb3eb9bcb7cfea493cadaa5a7c44e061c58f8eb17bfa08a4dcc947d245ca09d43ce5f9f0a1c853ed3b5257cfcfb29dd5116ece5fc60baadbb9b37a55dec16ddfe2b9e11eee778bdaddbacbbcddb1fd0dec4dceccdaddc8b52ddbab92c2b73b8c6c4bb0c3df18ed9cfe03e169cb3bf90e7acada801bcae9ae84c913afa912851de811cae53cb5ecca2bdf11bf4ba8a82d10c653e2cfb3c50fe5ec25ed934156dbed11f37ed8bc3e6fed5c0f9540dcdfc1effb3cffc43ddbc394fc858bdbede4b9f431dc88f5dced31d14fbb902f9adaab02c219663fa8ebef97bd2fbe4e59b0fca3ddd8d988def23de6453f660a2eed74436d0a65dff2fbf6d3ab3a2fa7c7bbd8ce76cafc5a93686df1ccf3d30c1aecab544a0c25bea5bd8fdfcf72dba7e8cbea0af75fb39674ccf7eecc57e97894bcc0fea0f8c62b954bbb292d9c6ebc18a8f2d25cf4c645a2bc9eedbd68bdf90328cde89bd795a4b2c713b966dbb3164a59ef9c2e7c7fdce1fde1d258cb0cf27b0dce8ed4ef52ecffcb5fa2fcf354c8dfa6aa2e9ecc3aa3ea63dcd52a06a3732978a72a38d28d842c4bd9be06af9cdedf8218e7efed37ae38fc4572eac7d6eb2fdc8fd3520cbfaa845bb3d7fd715ff2d9c5fedfe9ba3dfca2aa41bcdabc18acc6d0eb50f22ac23ccd8911aa9750e26732da730c7ca9b8ebe440f77493aa09764c1bc156b5cefb8d7f2228dea0ee3edf5ec886a81cad57ec00be23fed3c4784d4bc0cdcf0ff8b0a27cdee0980eced60cfade29eebefd3f8ac25ee75d6cc37e499df3ef8a177e183fac1bebcbab3596c2fe87f3b5f8fbfec2657fc5f3ceb2850c772dad0bde75195949b770d03abffdae0ebcec369ab49ca1c1860e79f2e7c41e3dc8c71a601a37abfb932c11622cdebdb5fd3d4a5a31e60afb54def28f518d5fb9b5180602e20f3affbebfcb85ce60f3dcdaacdf5adfab167eedf3cbbd3d5caed8a83e4fe64d80adef39951e7bdf85ae6ab3e3d8a2cdb7cfb6f4e8cf9feacc4226e0667ec4bebae01d7b8d4c77f2ce396c6e19c4ecac58337948c3adff8cf0495b7bdb0bbbaaafaac9f90d6c207e8c65c15f6cda9d5f79dfea4ddb175f6bdfbbd1ac8bb4aba1c10c85f946f54e42c62dee4a2eaf2dc10b29ce60a6a46ebf4e8f1362bf3b1d445f32447866eddb695ac1ecaa6e49058d0fa70cabf77d1e5135f2ae198bd3fa040dedafe1b6ce4be4c0bd5ac6fb89c1552b076aac9cf9ed7ccfc28f0df009de130db5ed6018f733bd5ddcce88b8aa524e6dbcc905c796449e088cece75f11bbf0f240fbdcedffd1cc22a72de24ec60eacf7989a7dabf505939e3a0ae915e22ddcc05d2be031ccfaf3cab4f1ef1f95efc6bfc422b77be6dbade2e3da86ec137dc72bd9fcadf7ddf683c62bfd2c0fc35eebeb6aba6c8a2a1cf48a4f942c4a8ff2aea1a4c65facdfb904efce8dd4b7fbd08f3f487fecf9fcfb5d2eceb15ff1de11d21ce64cbae7a2c919e60c8fea9ad1bb79b6fc2dae5e6a5beb2dd677fcdd81f7be7cacafdfac318a4fccd61b5e0a4b1cb027cbfaedacab15f4b3d296b48f4cb8afbfbdd3e5899cfaf38acfe5e7e6d1f0f647358a57f3c7c410cb5e35cacf75ea0cfe9e82ffd2839edcfa7df6a0c7c38cbbc7e93e5be4f9d8c1ca2b87863eafefe4da342d1472faa1dbfdb0cbf741ca617da2f89df1df6ddadeee10d38e09e1bfa71db74adcfcd9ed644ba50fb153dca4dced46ecd5d2dd2a825d0e877edee7ae8c43a0197facd6fdad0c3fface83aadb4fe9e6cfc2f70a6972a76edebbed61bf8498ba081e7f7edcf64e4638341aa8c2bffe0f64e789ee4fb547b2eefe786a8025dffbb9ef1fcdcab20ccd91c6c1d99ca6accb1ae0d168fe7def12072fbdaeaf91b68e4d47b1dcaebeb7cb7f9754b8d742a3cfb73b4f520e6ddeda40ecfbd03513fcd53daeb4f782df72ea5ac8c9abe5b33cfb344b607ddff0c91bd088109c5e77aadeff68cc3144eb506e466f5bede4b90cbcef70baaebafb8cebcffc8cbddd309f3db424edf0eb5aa38e9a9722a3d4ebac1fa9cdd7c2f3f8dc0142fa2269a82ea3f7e1bf0c6abef10dbfff5bee9f0dd83d0dd6bf7fd4c8ff2c1a193beb5b4ec3ffc3a00afcff0ebcb5fdbf8a9eae5442a946efc9e0287ae52b5ca96d1bcf305eb22deb9662041aab35aaa91f5dba98c7ecd82ffc1f2a3459213f7cab23759fefa7e8f7dafeca18d0cb6b10a77bb3bcaffd7a7be3fa67e828eb1b1b5229e02dae56159a6b80fba0fc3f7c1bed9c8f53e7a2fe9bffaf6dd6043ccbdec7bab66aac25e6b8fa3fdb5eb18ef9aa6e04a3c8b4cd504e0bf9ad10ad118e0a0efcdfa052a8a0c7bf5be6a21b981b70e0daa9ae35abf2fce418ca3e9ffac8d4bae8df6215d3eb0fea1facebfee1d6cba54bd61236ce3b0b82bd614decc6904a36a4a3cce1e0da4fd4cfd44fee743d41ce433b027258aa8eaaae9cf4fc3e5544cbea4dcede808dd729db39cab725bbb60a42f3e4ff0f7ad51e260af41cff59422cb164390ccaa9ebdced979adb17cbc8c27deb8ea144e14935bfee1cfe8ef3f3c85ede816f5e4ff4b37d3a8bf93bc34b0ce027e4ddcea959bebcdaaec6bd540cf2b5ffc3deae0a49fafa2ad3aaba8b5c3d2ea1ca1c2b3d9df344b650edeaed7439415472c05dfca3e96ac64b0cc3ac3cf4bf3e697a35eedb0abebf15dbaea37b8ef4a5c4ca5dbcc1a17aade50fbd83bdb531ee16516dbc6ca3cfaab1deaaaffcb68afdea29e44f210b67fe2068a02f2212eaca9c1cdc129a98bcbe7df1cb070e50ef0e425ee6a5face2aeacab73ab2cdb2f6ef0ba21bb490add5abfbfb99fa32a7cca9efdfdeee9aabe229884fccf2838cd96a9fe7ba199da7bde1bdabad552dba4adf48655ac3df52eda1df119f2dc3a9fefa3cb61d7dc0665c4b2bfcebdd5fc67dcc1b03e5f8ae10d96feff41b2d9dd0b691733cecbc9e71075800e77fa7ceaef401a1a836a6a75582a19579ef44d0c9cf1eedf6dab35eea41bbed8eedf8d6ad08ddfeb4cafdcb1a96b838f12f7e4fdaff4df48feefc0c0bf3c79179dbd3ed7de1dd55ccb55de906b11854b19bc8e6d1c8b0d0c8c20fdc2e62bc5e96dbf76ca3386cd1e8f99b8a5a4ea240e6aa77008bade3a118dcaca7dfc5d435e9fc9dd7fa1ce2cdfacd7cc57d07adbb0b6c9b9817581d987c0fc7b1d6d0a7a52baa9b18c39114fcc2e71a9583143a60d63ab1e32c0f96c0aa44ad9190de9120d2ad3bb2f41ab422c9bfe11df049aeafee11e8a7b87faed87ad21d8e21bcd90dc8acaabf8e3eebfdab8ca15d9f8729f11c00b66bbfddbd741b85bfaadf9d3d8affd4ea44be7f10faeb67dedccbd1e8b7b8122c7aedac8e74fba4caeac0bf58aca0abc4247fd3ade7edddfadbe0ea328214eb5d25b8fe8d65dff90ec7b45f6ccd9e7fd4dcfce2d5009f6b5b845cabcfa3b7a6fe5d0f9be4dcdd4b8de60ea7ed540b1e5039ccf31ab14d9bfaedbfc14bccf94c4aedf6a13a7b2c7bc320ee60a99c755c7f0dd1d1151d8ab4cbdd76e2e610fefd2ffe16c2db11fccc96cf8cacae7ce8c96bddb5a48a84123581431afc84dffefbbbd621c96a58fde0afcdcf2f187fee518a53e5847ab2dab5757e756b1a3e8f1aadb77fedd6b4ad201601b0fcbc5b41e7dfe7e5d4a668df6482dea4f9c6ad0c01eb02e9c580defa98afaf74c9d69e15bbbb20f89086decadfaaffd6ebd7c41cd1af1412b5a914a4b2d2d1b37d1f6996cbdccdce472fded28bcdbded48acf1e3eb42d7eaade8fdcda88adaca5f9317cbbd42caf2fcffc1adaa8f22a897b6bbefebecb2e718aad4f2d0c8f7ea6e1f3ed1faabd253dc6e2ceb2d11a214f5d1dbc44dc234a3ffff9ede3b9adc57d0ddc8ff0dd2d38cfeb00ebfd57d3d54b4add9fd1b8e4e4f0c15c7e8a08deef5bc02b3accfdeee84c9a6205d38d6d7eebeed10fe8999ebf4dbcc77ba6bc718319cfd20b48feb9b05fc3c0dc56ac03f8a2ef90aed0fa3d7bd2678cc17bd8f0ef57b6a332c3da7b335b90b0d507bff4ca6ffbbff4ab58df0d83de64d71b5ede09ebafa7e0bc5b43611bbffa2eaa38adc648d6e98cbdd3cefaf40abfc865e6ac42befdfa1df41deb5eaead7014aedabcb54a620ad6db3f6c2a3cb3dfaebac6f9ee2cf5dfc4a7ccde270ebca77be3aa2ccea0b980aa96a07851f30be7e53729bbac8ef7db7aabef93dbcfe24752b8e1cb4db285a25fa0ba2aeadb2eb0333f7ebe0bc103206d965a0dbfeadacdc7a26b8cb487ca6ee77abd7f011dc2de2fcdeb3eb2dd6ade6b4fbd79e25fd6b84dbbc0e926a9e42d35dc6f9071ae0e1984adbc20012c1bebb4abaaf91f24ed24d5ddc02523ccd9ca4c0cdc5bcfdf85a972fd6b23a9c0270e1244a9cfbd7b6b81db55a5da92efba1a2ac9185fe5ed5e7bdbe1eedadf2d129f7ce98c2dc59fab7906e2baea57ad1952dcdd18beddec34e2aa575aea508cb3bba9e17762c81cfccd53b9dabde3a4aeadcb2aee5e9bf55b8f752ace04e929fdfd3d1ccc96dd9a45196e1b6b2dfe2082abb8eae545ee6a2ae3e77a70ea9dd5cc3fad6e0503b9acaa945afdc85afc62f40e77ebdf5a6c6de35df6eb15e65a47cfecf3a1fffce5e59adc328cbd25267a3594d0f0558aace9236a4bd1caa5109d7b5c3590a01cbddb527ddb469deb3dd4d88ac1c8ab39f6d6762def2e7ab193edb7c1ccaaf6aadcded2f1ecf92c5f16a94fb160ffa1c8a4f6aeaed799db2379ded0c6b56a54af6dbe4b6aa91343ace9ef8a36ac71cefbda4aa14769fdc0d3befeecab36dd08abb3836afebcadbe35fc0eba0d2beae44dc7ee48fc52a19932e0b84f97ea49aa0a257eb7cbabdef29937eeeab91fc9f8184a1d0eca34aeaebccbb6cfdda3df4af9eebcaa0a539feafdbcab3dbdceabda676aeefed8cffad6bfbf05dfafcade32954dfde24a0646fcfde0bbceb1fa6edfffbfef56871caa0467f52e65edb8b9ee7b4678f14ac2e0e28f9dac9e89dc708a24854084ceb6bf58dcc121a7adce1fd1fedfbc01fc9dfddc3dba47ab9eceffc6df2220e2b0eada9efc8e40fabcd25f0dbcc767deac43289e152ffe24b643c7aa9ff7be67724daaa299cf7df094b6cbb6abf55eade33dd2e23f76fe9235fef562333aeb7f158ed2aefe019584d32c8711ccdcdb7a925c695ca6ec35d0c23892dcc8cf69290b22cea1ac697dc9ec86a35ffca907ed48ec03b1ef5f73dca6de4f92191e3ed1edf2728dbbc85b3676f2b2afdb0cdec17e4dfede300166ba620c06cfa31ebfd3b8ca13b6337f6058e98b31ebf0b2bcf2ba9cf2d6fdb44e0f1e9e7e9aa7f3f5ebf0aa434aaddcda30f46dab4e9324c61bd76e88dead4024fe68c6872f3ff7bbc1b9eeca6723ee45dd4eef91de61df0fe4eee1fa385ec869ae7e5f6c8d8ead668ae67eceb03a4dd701bf1ca56bcae4478adee966eab2bbedf751d7b8f04d7edffadbc62fbdcb9ca353feabed9eddeb0c6db5a10eeee1d8aeafa340d1df7278a2d1dbeaf9666ed1ee4ae5f4bbddd7f8cb311bcfb32ac80e46b7b9567752abffad506c95b9c1badea1e597bdadd45a8ff1add93ddeee6fbe15caa230a9eaaa4d57e8bbbe37cee1ab4ac3f4feda5a08bdb9dacced1f4abdd8caa8affa9e00b4efc6bf4c94c22dcfb6d4e5fdad9f142a9d78ea9f0fbddc5de3720b131aec918e3aaea9cdc2f1daed79ee3bb0dd3e434cb17f78f56dbaf7996f8c4e7f37a5f298b5fdcaff2a659d51fa36fbe6fb5f3c69c24cc5b74b2ec0b8ceaddfb8cdfcc8229844088acc88e65a7f2daaebe224ad96d2fa6cd6ad2afddf53a023e2eebf63ddaefdeff5a696cf3b1c04e3ed79da5e24db7f956d87ebd68f2e815844dd54b3b2a181738dfbe6ae3d8f16c3d76a75c30b33083aa81654a0e695a41a3fbdfef98a86b47daecbe7fca7bf50d57b1dbbee7ed7d3c6debe9d1e3eeb967c9bc7f25f583339fadfc51d526f8469bea633eac9dc241da5e6dbc5d9dd6f7ba50267c2a734773809cde16f1fee7079afafbb1459bbd20ebcb554a23f8584ab8b3ab013cd8bd0ccca3f1066d018404ffc0a76c7dffb3faa16b3aaf6419af89ef69ee6cbaa6a9d9cf9850b9ab67b773a56ba16fa258b9e4aa0adce4921e5cfedfb9f146891dc47cdab2e3246f0daa47fbd70d963e29bd0b5b6fa3ffa9e87cbb8ccea5fe04b457903c9fd610bcff87d91fcc53b4f414ffca8d26d2f7ba75cb1aa2353b304a902fea6e856fafcaee09ef0456cb87eef7887d09a2472dbcfcf6bf75bad2dfd7948ec23e7cacbb070ac1cc6ac91845dbc6aadc8f4ffe1e31a6c1fe63f0bc0d7dc43061b8daedae2fdd315185cc4080738c53bae55f827f188b8ef9e0ff84aafbffcab25231ebfc0dcb2ecceb7aed44c75aabcb32488ffd5c5d1d9bc9f433f3e6c3eabbfd111ed5d4eef9fabf341d571a71d6c70cf69f2cec01ff345d1cbcf7cbed38f3ce59a13ac6cd1efbe65f711cba24b3a5f190b21ee37e5e9ca9b5ce0863dd59d8b9199feeb6d3db8dbd58eacb87ea288fff22791d6b892b124066bb88fb563535850cfb19bceeb1d9bdae139bbfeb85d0b279874228aaa25c9b9914bd98eefb6ee83eab666df2dffcca6abee58b5e4b37711a98bcf4db4a5563be13e4dcade7e7f38171eccf4a96a6510b9d3123a73ddf1c42dbcffa6498ecb3abf9facfced271ff6dc3b78dcdeece1ef3310fe199e02ede32fdafb3e0cb9d0ba06a542e6c3b71a4a209e23f1dcfca9bbfa5ffcf82b16bedeaf3cbdcaecb887eee8ecd08f132e57ebde3cf82f875b4013fee0aec399549177601bac38837e5ffcf35bcd1fe373cffc1c4679a60610cd4dd69e5a09b12fa3effe6ef67c923bfa7c2bceecfef9f190328a4d54b601bd3aa060cd21cd8c385da2bafeb9bbbaba74eced25ffa9cadd0d2ad5d32fb9ece569badacfeb595f1cbce2dc11fba389caca7aeedffed014f49f7c5dfed35eba9ea25dbb54dad3bcf1ac6dfc71d6415f35de1512b09cf1cb0273e3c4054410d8daa4bb93d8aa9cf6791e0a4eba803db270775d8519123b639fccef201dd0c3beccff0d3ae72abeabd5e95f52dfaf9a3bdec7e17ee921fc6935fa7555fbc2e7a05bff8bdcf5063d7b5edc3b8ffee39efa8ba6cc91e584dd098b8833f2dce3e4dfbbce7d0c31f9e70c1bcd8a3cb19d5ce8fce7542d6ce1756919c0b9bed46fa93caccbecbed8ed501cf0dfbefaab80f8bc0fa6eef1e4951fdb31463d82d48cbfbc929abc02ce13ca1cf8d0ec1fc88d8f1bbc94c0b9e3ed6e20e6c80d6bf06c2c8ce37a30920d1b96740889f72b0f26b2296af44383fedf26a7d0e639c8e5d7cac962f166d336c8c3ddd2ddefafc4ff8a73fc4da11daebbca2fcac86bac1f3870260b1a520d4d297ac22df60729e06ea2d03fd8f5b0d6649fa7ae2bb5c5cd2ef3aedfcc99ec5ed7acedc30b14af0beaacee58e28cefd3cb975da7df4207b278df3f767ff8927b3cd23783ad2bec11acedc1a6cb7b921751ba1f0eeb9c4160c39cbded3aaef77aef50d184835dcc5ad9d565a3eddaa0ac5fa1e8d34aadc9fff7e7fefd10c7f3c8caa0cae4220b5cef5ce5c59de3fb4483b2e0422afdea4fe6b622309ccef85dae5d9cb4bcfbcfe54d0311c5d90999cadc9bcdf61be0bdd479529b2c1eacd02f6b2f4f62c82ae2d1e2b3d9eac7cd00747ff8ceaf8bd077fcf1afdcfed05ae98b6be05f9acf1abf2da00ff7e7eec12b3c8dbb7a4cc55aefcfdc2e0adf2eabdb4ee47bbdbeefd8f19add88d4ce3fbb8eaef90d906acffdd5d394afe910870fe56ca6bb2dec361ffd50e2a280df38139cd122c8dadca2c3a9ebacd30bf3f1ed0ffe87baeeccab4d851d6fe2a6261e2ed3f0bac1c8833986e1cb28d4a2e3c81bf3cce4ba7bffafbd9d9db7ad04bed4a2da5c91dba8734990dbb2d3a194e324cf1f743ec1db0c5dacdda0a31af2b19dbbed8a8dcc0f7c5ccce9abffcfd9c0837e1c4da8facb19ecf62d0ed0d93be4e647eae8f39ba8fa693afacdcfdea4f46ee3b1fb05312eb52cda561ae9bf601fe1d562efdbb0cadfbd8baaaeacad8433cceeebead05ad53b32fef5e327dee5a34aa861ebaa9dc2a3a1ebb340ff9762f5ed7bf1fccc5b8d5535da5c5a4e3aa2dec9b59beeea90fbcc08db87df06dd4cdc7d582f0c0eba66e0c8d1afaf7c6bc4bc4cc9f08c30e662add5d3cf4d2ff41fdba8109d468cda5d8caae8567cfe313ebe721e9ec7c3b5333b0e6b6cffafa0c50fcec756ecd42e082e09a20fadb0703ae7d317488cfddacdfbd533e36a00cc89c1bd3724cec85637d5c1bb30ae52d878ef65ee5dd9cb46bbdedadfbecef8defee0583d64aeae32eccba5dd67bebbd93ea232075f625e984facdaaaeb0a3bd1edb5ee6afd5abaa4ef2b893ced39e948fd91e176548d6fdb0b01bdaa27bd7acb0e344fcb3e63a33e87e2edb3bd07414005ced37a3bd952aee5ce5dcddf9caaeebced344b4cd6cdf4cc3c33a679b67bd539c2108b25f5deaea964e3dcb3fcd9aaabbefd1bfe1de7a4b05dd9f5b63bf7bcceacdd766aef142a720a9c663cc839ade15401b72ea1908c37e7b6bcb168dcd2cfc3dadadcfe2cded8fcfb8de9cc1eff73eedfc29b63ca45471efccde89fbedff158bffab38d201ee4ceda6fe8cc5f76ca203c7de9a4ebca76f6eaf5a40f0ebeebefa05bda2a347e1451f4be0dc0d526abbcdcbeca5e873ade2faa5e54a09eaa43e203d77eadeba3cf8fd161fadf2c26b493c5d04ba4be6a307c6172a27ecf3aa09ea0e28bc53a8c55afb08bcff638cebdeecf48a88c1c8c2a352b9bfb53d2e28cd70c051fffbcf433e28067f63bbdafd7bbf129273ffd90e08ba2828ffad7ff8a5a1fae03252da8cd7ffa4fa46db5ba0b2796acdd4c5fdf311f0d7ad3140f732b4d0c583faffa72a3bbb5b91cb442c15fdae8d7f823fbbe384dbcea14c83efcc6ccebecd68af0c27e0829ddcb0a53b0811aedcec60d08ea7ea4ec88429bccf31677b4fcf73b2db6f4ea6de5d3aab79a782b414a11bbf54da2d412bbccf7fdb0f21f9b9aa0e4e1aeabf36ecc61fa4bfed1cb07e46612de1bf73cdac97d98e33eaad8488d610d852dd7ddb092ffddeb19f9de397add5deddbd77eefc3d6ba63c6fc7fb5df85fcb0a5decfca6fe1a1ce1ec9d8ebcffefc5d3a87c0acfc54c16389ea57ea857a6e8e8bbbbba7dff57fefa9e2b547f66106c28ec9d120de94b4aaac5116bc333cbd2b6fd345c30a2ec5f0bd0e344fa7f2e50faab8f4a941bd0cb09475312c21f26a8dd46ba86dcdedfbf3b76a86b4dee13e5e84ace0f15178c3c81cd0c100a537b2cf26ff6beffbbae36f0aadde36cfea0f5a9daed8d38f7facee9aac3d559ba0acdba3b053fefd31ab54154aaae71b6b6c7c5e4cb0aaa9e3ec299ba1ddda4e28d36faa8e7caa5ce4eec4b5d3cb38d83a94b0c75af6efff02292cdabfc7abdeb4e9cd511cb4bd486080e40c4cfebf1ced3a0de5cedab96c91cbf97faebddffdfa44a7f19f84bcd09018ae8ecedd02f3f0ab20818e3b4a08f71cfccce5bef15384be17eb65d0c4dd6cbb6acaf0f2efb58cc8cb1cee93bdb6d962bccaaceb6abea0c2a2a26debafbc1d8c83ededb5ca5455f10efe31735ba7cb88ecf46f4dc77dfbdfe58dacb994ea2d4bb74d06d1afcab8ebc5790f8ec9d9cbc8ccadd961dbd23b10f982fe1a52b9a6cc8bfeabc7b3c34f2dc8f7ed508d8fab44d3f89aa436942b4efde5b3f67dbac506a5b54d9a69fd1bad9ebe83acc4a666569ee3e4a82c0a921befc70b59cb78be00f31fda4a6ba89ab52cbab5befe3e56deaca58692a23dbcedee73175e6bbee72e6a6c3776cb81be4fb336bfd5ffe721660a58bbf81dde56e475a85c87eb97f165dc4ce5bbae6ee099f11daf43d8d35e1cf4bc30b2b5bccae1d533c580ecf1b7bb2eefb6ca8f5b405d3ef95ecccf5a054ac5c0d3dbabc987eea7575ebb1f000cce17258e5fdaf38afb98fd5ffddd14ca9f67b62c811e42c118bb7cce0bd0adcd5a3cfe7aeceadd6c5c5aa5a0f7d8dd3e37f939fdef8c1dc33ca14a5ed669bf53eab5dea64eefed1ec9cea6b5255c773bad3de3db42ee661deea90fdaf37a0dfdf6b55d15d82c98157be7edaa1baccfda5a1daba6fed5e0e05f556845384e9ac5f6a19ff1e2c8461ae11bbe1832efcdf92cdd5da3cddfe004d7287d389a2e2de52b9fbf926ee41f6fc116fcc5d2d6f078ac4bb1a31b6b6ceed98e26aab4f2875e07535419d28a5e3dd5d2cd104edd7685cf62dee3dfe2aebf097f76f938dfb6e1f84f99dacad7d84c1bc4a8491dcb99cdff8ff05edef9b6253f36298a705df4eee7ca6e52dfe5c81dfc3173fb9f969bfa56b4ae26dda7f3bbefc1cfdab9abacedc8dfc4ebafbf0fefbf07c8e3939feb4ed299e18b57fddbd9f8aa3ae5f28be5c0cc0cb8a2250ad2afd5a0fca411834eba3dbccbb4c17e2ebcdda1bd1d7da13cc7ec6289cec7bcc5d02d50d5e9a8abd3b87dd19d3def615ae1febaff132992bdcdac834aa6f79baf7df677bd8f3fa0ccf81cfd2f55204efea9dca829b80cb2bf4aa419fac1d998f20f70eadad3a4c5c7ab7fd4fed4cdf24d6912d7c9ba54c5aaed7ae3b4e1d85a6a9bf0aab5a6cf4aab17a1bdccfaddd552bb13aa674e69e93962e0dd6eaa1098a67a1939783aaacf6cce9feac6e62cf3c2dbdd1bc54f0eeca20dcde4fb651e1dac82eec3326de4410c7cddbceba2f42d6387838e69fef6c216ff9fcb6ee67cb9d6fdead79ecfddbaa6f6553e312de58ca6db83fa2b2fdadee8d9afeb0d4d179c640c626e9f38bddbf0cb50fe7ea02da34caed4e1dbf3a54aa9f1bb8e8d8f7dedcda546f5cff92ff00a50fff1a761e7b05a54eaeb4cdcbc014aadfbd0e5a5e722ccb3e385bca5ef54fa6a617722d5b8c783bef6c039f39d1db794b94dd87ee53adf6e30ea3ac64a10a08eecd64d2ff55c11c15bbaaf97d16c5d1a815c16eaa1a5ead84fddade697f5d50572637b09c3abe4400ab22e7f7cae55958f6c77f1b0e50aabde4f5c9d5966cfa572fcca64bb7e4dbc6e33e6fbb2fd4aafc6dd613a359efd1497f0a1bb5ddcac8baaeb25fc04cd4bb7bafe91deceb255b2f0f23fad924f86c4b29bcfdac793cbc7a2edce2cfeeaad255cfb6a653c6c95bede55ca51356bed0c63fc9bac31225b99cd699e0f4bcbe1fa3bf33dbd5d64e7f1aafddebffd1fad8efb5cd6b797b9fdde7fcbfa8e23eb90c6adc30af7291f054cee00fc8dcf9dd3e8c1bfbbdbac6d61ededf4f71bfdf330aec9df40484bb3038b1a1ea097e8f2dff1242b8afe039ddcad25e38406fef0a7e70a2f7d3d12fe82cb5a54ae8ca456ee51bcee3850d55ff64962f4cddeae7ee6d8a73a20065ff7eaa9ffbc28b35df8d0786bcf9bbf6e987b64edfb83b863471ffd3c6e028cdadadff2662aaef6dba9de67dcf29f32bfcda6a96e2c0667bf96ab90a3e0dbcc80fe5f5cc94201dd5c29d1c78505ad598a9ae0e527ecefad39eceff8d82fcd8ffe2d62bc322bfd0f40daf5d91fbdf99f4d53f95bf9e3e4fbf98dcde2a2d6fdfa719ded127ccfdecf1bca31adda8ac1be559ca10abf1ebfa09f44f3915cbcd8e9e9a1d4dc7d3e5032eab1d94968d5e5ac449756762d5127dd1df006c4a8a366c1cdc45c08fc0986e889afa652a8bfed0bbabaa3a4ff5254e4d409a807be0e80ee0142f690f0cf33dcaaff0d4f078334da53cbccfbc18a8fb22e798154310956938411ef9c5aeefeb1d12dbb6dc0bc7ad1cd3f8dbf25ec10ae4aeaab15e1965b648ea7e8ad8ffc33662e0cddce7e685aa940fdabddd86b9afa39ccdfeb3f4adfdfa6d8218515fac9e405fcdd8c7cbea2f4ee5c6fffda3cfcb5decf0c09fd4cdbf87a9f72bf5baaa3ffb746505f38c9d6889aa1f1c7cb63f3f3f329953ffcaddd9f0ed7fe32fefa023088036d2c632e70bb5cdebd6499626aaa76b87ad81d944d4dce23ab682bc3c361f5ce186bb4dd3eff92dbee55b019c654ff325466c8cf3a9186483f6ddd6dfb5f4f6d2039feaebbd4beefd684abe4f461640d5c5f1a1bfba8a91c2a2dadbb1d8a7d932b6eefed8ae82bad52ddac6464f141bb2dca9bb9de1becbdda521efcd9dfb0deb40cb02fb8e611bf8bbfdd3af813dc1d8682ad494ebeaef4cdd69edc3e2fc1ad76cdc223630fdd6acf77a40c47a24aa8cec6e24183f8816d588efdda4eb4aab5cbb1d8b5ec8ca34c470e6b26f26ebf7adf065e7fdeb1c1ecce359cdd7bbda1eb2d52ddaebb00cae323ebbbc04fd4a2c13b3dc0644dfacdae7bb62e1f5a158dfdfef4c4dd83c8da8b0adc1fdbc0eb05cc903becece082e907eedee574b760da9c1bb32e6d8af7e7adc7d800fb245ebf5ab04acd7e6d142ee6b0ebe78dc5f0ffe3fa4c7940eea5b9e06a3f8dfacc036ea66ed1ba5605c4b1b4075a54c852ce9912f9aed88cfeca7bd90e80efd3ce98627a233ce44ee56ad62e9e25fa0e2b8d1ab3f8579dbc47763ae138db4f190df1ed4dde7beb0b6a0dc2b20cfb3f7c9bcefd4b3fc158dcb3adb033123ccbdfdd3bb82ce27acf453da9aa1bf47df278b2f0289dbb876ba70cdaaa5207cf4dd267cec783bcd8d7cbd8fc62b4a0c3b2cad94dad8c1efaaed13cad639ceeffff860626fe836be4adfc6f667ca5bda34fbe74e5c36acd5c0fe3f624ccd27a70bed404243bf41beaadb4eef7d5eaa0eeb24bccdbad2f2513c8d08dbbd9f0da52e7ff0f7aca7da106de3ee9c2314f8f9161ec0cd5e0edae4f9dd4efe1bbf8cae18cbd90f12d0d787f8b446abef1d7567cf6193eb47eeaebd51cab93eab1a1da8172ffe768bcc355d97184efb0dbad7c91deacefd3a04c7b29aacbfcf0f03fc22d0f10bdbcfebcdc0993e1eb3208ac201a72029baedfdf9f68cbdc6310d3dad0d0acc774cc77de627dd9cd7cbfae4f7af3dad08fa5d20a8b3b41f8ead7cf5f2bce4cdd6d1daafdf5e2efd317abc94e6bea6dd8fd8b829e6ce2f4eb698bc26730febcc08ba83e413e9dacefd2ca48ddf39c17b3a3a1f6dbb0de8e96c394a281eaef6abdc3e4d7c594afc6f649b25df03aee61d7c90aab9fcaf3c41bd5fb4b7115ea1545ebf3d4a78ce2cc7dcdc4d730ad9f9aa7bc8f11ca5fdfa0ded8fabfd1d3cf5ee7cab3e9c8d2f53b6acb5dbb5ed88a7da1b8421926e57cf9a5c68aea5c5ac7ea7d00afe2a4bb4f5ecee11cf2d3e7d4fb3243969da441b6ff5ef3ad8eedefccbaa91cea73a6b808879de7fe2edbfd5afeefc2e7f3e68c1de1aa8d6ad3e1d6be2e48067d1da9ba9dd4cfb4efdebfeb8d0e9129bcb4ecbd8eb3cbcdefbea299beff1dfe36a0da4bfd4fd6ddcdd2c1f77a167ab1c0d3f4e0121324aa4e3a8f42e38d8b3cb2dee1bfbfbde6ed9441f7c10aac9a80fe4daeadae49dda18caf2f3fbc482eeac8cfeab7b3e7a6bba8fcde74f7dafe5e27a90fbaafeefbccac0bdef65a02b4cdafa394cac3e0dde31aad4cc0ddcfe9a2362e9edd2c9ae2be91767d4defdefef4a38d6ee07bd3fe06834e5c804cc3bb2bce2a0aefca7ac49a41d65cadbab78a90225ae6edf63bd713ed93c0ab7d35d8d00623494ca08eccb9171229c1cd3d1806d25157de19a0d1c53b3dfb9aed2e3f8e5d0e78bd91dfbdbb57ece8fcb7c65e56b30fb0b75acc4dc3c0bba809b96bbbd808a7a1c0fd5b9afc172134eceba0eedfa4a70ccecc3fc531b7d9325e34adb93bd7da26ca11ad4abe2c66c42b0d3cbc8ef455aebccc30cbfd3dff0a5693d38bfa4f23ecebf5e42ba8cc86decbbdabc7e833bae03ea1d567f0fabf0a0c54994af7cc80dcf684722f1bfa7a77e2b16ae6baafef4fef92eae55ebbf36aa0f404a1fdfbd1cd7d2752b6f6eeac4cb354f92735b9ca5e8cc8bcb03ac894aaacf97ead12fbecc5c423d8a86b4f41928fd537a2ecbe57d691ede7d0b8a3db6f70abbcef7f6ebf1cdc3434210181dec41bf5be76cfc52464f6bebef6ad168ae204ec06ead1e6e5dc7cecf21656bbcce8a9c9f6d5be7a1cd656c21628b6ceb28d3d65b5d8afeb7ecf04fbeeadff1dd4ba1c922ebb829ebebf5da85c1bbeb5565125ed4a6c36fa491f1bd42aa1fed8d1882a5b01af1ffb28c87a3349a0df1bac1bab6aeefdefc9f34debb16acefc1bee058fcbaa0d5138cbc54e7dbe7d766dcda34d9a51eeec89aadaa6aa2f75a75abce7ad0bea22b7b14b9a8efae9aa0088dbce0f321c70ccb1c6afe86d58dffa3dfad1c1aa9be035aeaa0ffafc0b68ffb6e9a6944ca46debada27ebe4bceafac44afc5d31af04cdeaac9c2c918beefb3c1bcc8bd8ae2ab32cc99ff4b37ac7a6ecd67551aae5f02cd58ff5eb543a907224ea4e73af32e837cbbeaa6bbd06a2ec9bf7c59828fe21d4faf2aece37fa09d3bba8274bf7d2bfcb71feefdebaffcfe0cdb2d942e1dd9b3d11ed6ffd66c87288f68ab651de675e28ccbea33b10de6ac405305772d616fca9e4e16e7cc522e09f14831d26c4fdaeac1f9fbeef6fd4e7cf7eda2caecdf6351af7b37ce070d9b2660b861509ee63dea3c38e71ef9b10ae28a93afdf26cf7bde48abeaeb5674cce0c08102cdbd09ec14c691fdec8bcee16f1dd87f5b31bef3a10dd0faccefce3caafe205fcbb9bcef34acb422ba7d3d5530fef5d5c04570b90e2a95b51c3e3c53da1b5237bdfccafb5dae469bfaba3fcfdfd06a8f0a5e7b66e2caa6b8d188cff7b5ada73ee9b97b7fcbbc3b9bdaf86b2b55a5b00f9e4c1bc8f460ac3feb0e7a1ade2ff5dd582bffde5a1fcc06beac2fa28f571eeb1f4f5cde2d35bb8ee1ee284ab181c5f049a6ee6633b5e0acad7f0eed50e38cdd78593b32538c13d6acf7fb346fbdd874bd8b094a42923ee1df64cfb6dcd0d87e33ccfaade48e619db94387f90775edaec161fad5c0748c01ace105cfacd81b03d51d7a60ccbf43775db638fbbda0c3e7cda6feeadee238a5fccb65896efdd3febaff5a2d0c1ddf746f4fea7d7c5dbbe335bd8befcf69b8ffd9ef35e23fff5e20443bb7fc0adef49aa23ac343fbe8b75cea4cd96a1bfb42abebbb53a4538f7de3f8c630d353cbea2747bd36d7debfba2091cc925bea8fa7b108c0d62bd3e2e983be4d0dd50afaffb8a8aa48b5a87dce9f82fbdf9ee82ee0c81eaeeea69ebf5defad85f66ff0dfbda6cefcdfb1ae8089e97d4d230ef17376a74b2dacefe5ac2a78d75a3f64a2bd2ec4438ba6adff0df21fdaa4b85fc91cfd2955e84dac8efcfab3d7fa7cfffaa0a7385f0fd4fafbef40a0b939d8521ea6da2c9dad97bdfff8f56bf8d24b0f2d1f4bc8b2ae21b43f8cfccaf4bd216d545f1dadde450d8c5360d2dd88b30a5afe2fcb1e9176a2f34c6f2c3f94e3f2ae6bc4bedae525d52e2ba2c4f9a1edddb50f1ed0bbccae2797c2ecfedf8f652df9d8f0fb50ddbdf920f884a59c01e964f30b1fecdc2c477ae4b2808d3de6f211eba7a8f8fddd601a0464fd08fdca5115f2a19d5ba809c7200cb3cacbecab52b28477fd59b55aaf4fec40ce0d82cda4def5ec556cf938847cafaad903f4c4ca3f7dd74dcfbc7b2a3eb770a0a6eb9c6bf9ebde5a38dedf4eae05f29ee121ecdee9690b1adaa6cbbbecaac402bcdfd4298be2bd5aa28ec78d0a42e4cbca0ec33e911ac5ff02aabb5fb6e48bfb879ca7cdb8e34e072bde6fad7ad02e0a5eb68b0fcafdbb2daedb36d1fb4f2ffdb1cfcb7ada54c0d9e276a428c5f1ac0b861629b4df756a6bb0fd68ad5cbbbce6feee8bb7ef8c540e88f7dee705aa7caf2bbe60afe1616bb4cadf4bcf5e4dd9d1ccc3ce4cdf5b3fc0a5ffb1f2945dc61f4f33342dcd386bcefccfc1b4c7bac78cce75a1efb243b5cce6df1c186a35c0d5c0bdb520ef8eeddfa57aebda316fece80e66ebdedcbd9ddff6efd32aa30aa0dfab5cd4febf3ecdafd2d0ade7d3aa20841ea9cc2dd5fc4fca914f36aa75bffc51df44ba396eb13909ff2b2d3b0c9bebe9bfdd4b6dc6e67a97ebecc47140fffeeecc0d31aebcefe465bf6fd138ffd993676a4b4fc5fbedb1fcfc8a48ab33878bf5db81e7aeffbcef5d11f51a3aadcc3bbe4bd42c87dde44a1a2e4fe2dcd8ebbbbe36ce1f68db0ccfd3adf8a9fb9fc4e3898c65b87a4ed3b5a3dea1bd06c879bbefce51ecf2f656d96cacf80cf3cb8cfc8a38ef6fc26faf26a2dadcbf6ce883cfcabdfbfc922d26dc61ce7ad2a8e2b091ef4f9685ea6de102441e194b53ec7ac8d4bc0df791b2e62bd9deeefc9dc6dca5a9fc23e70e3026fb3b1afafb375cc2b0269991cbe57b9c6bdc43d24d8ecf6bf9fff1eca07eb69feecae1c101ff50ff731cbe88e1b099a830ac51e231a1d3afb0caea381e697affd8255d83bde297ed8d6da4a7b1e8a40be96c69b28b19fd5df04babbc4c838ab0d39a4c2c2a2eceb9dabfbb9320516ecfe6bd24b970c9e5c7eeea59b8cfadf1a089da141fca3dab481aecaf3c32a1a1eae0b4db7c52c9ce2ddfb9b8cffffc51afc3ef3bd2cbe35f6e5a455da1d2fdbfa86f9fdef24baaee8b8790df17fa5e2825dd86ffeb796c3d8dcfeaeeab73e7bedbcad2e1cbed3d125eedbb34fcb4bf88dbcb07c4c4a2f7eaf9edc06527a22f34f7e0b62dc53c9393444d4aeef0a7c5f74ac38adea23b65a0d1da60138eedd6e5b7c78d3fee1da3d7d24e3e1ab1ee96131b5ba1c5ff719d3dc56f3bcebb0fda6562fccdda88cb2b985cc1b824c3c8873adcc1602f832b5dbcbba5d72e868c8dbd8d7ecaed1d7188a7a94ecca0dd3afa6ac8a8e1d8492b86b6140c91fe787a8e0f3cbfec5b0dadbed60ba62acefba9f11b41d5e39aefacba3a9647019e50909843af8ace879e27a62ff56c23525bfbe8884afdb570358fa5d47fdc4ff3c60da1714d0af0df0dcdca835d732aef6d7e62c36ee024dcee4ebef002a24cdcbaa9b10e62f3ff8acb0ecb2df501662daba3e1a3ae5d3d16157bf9186ee4a4ecc1ab990db14ad2bd903dca1c02dcee9a5a8c3eae6befe19ce4ecff5b9aa1e2e074aaedea695b9fddd1ad8b1fcb7d4b3bfbe4a6bdebdb1cbca8ada1c6cdeb9cfc083aebc34b6cc14daf6692cd7c5ac978c0f9bef08678ba99e4cdefe2561e9abfd3fc6c7cc216cb4f518a0fb69d1bfd300aec106af30dbcc6c7edca5fffd48dfd3b671f07bbd4ee1e6e1a6b5ee7ffeb9875aef52e4757bb0bd30d8cdc277b75bcf2df6307de6dfa69bbfc9a9c848c2f3ac0670de7b8abfd30e2bcabeef39aef1c7238679adabf1dfe9beec2d40abce00bcd0223ea079fdfe451d1c5aff985e83fcf492b3e92dd205faa3bfaa0efdcbe4efe8235ceafb674ee573b4a179ed021f8fbd2b91dfca6a81bd3df26e60ade0e0286eebb6dfec2e9abb47bfb9fafce1c38cfde2c595fc2d86d5f20c12c665cf5e4ef63d6eb3e8c77a4fd3f31da041abbbdcfd2b629cba2a4abe262daadbff62ecddcf0ce7ebaa9c071acdd1ebfab5da3abd2e7e84b75a7d9d7f13eedff7f5402ec048bb83a4e849dfdd6cc9bdab867d4aca9eaecedbdcf0ad5e0c56cb8ab2ac6b234bc9837e1d6438dcd9cbfade477bbe4f356f84af2052eac1f8af94afede79cc3ae2fdec11beb720f243efa2ef5763fe4fdebe55b162f765119baa2ed5f8d4eab8aed83fd3cbe9dc39454e7b631eefb0bcf60ca91e634ec5b9725f7deabad2ceebaab0eefbd8c22d02eafc2b6b2b3dee6836ad213cd7b79ce8fa25cfd1ebbfdee3cda770c7e604fe2f6ead2d4bc06cadeca1fea47e38af6a8cdef7d084470f1dba2f24df01649cefb74ba0de0c7b8d419e5f3ebbbb71acea1da2fc3d05bb64aaf7d0eea75b0efbef78dafcc943c35b2bd5fdcbccfbfe5c5cea08f4e55e74dafef2bbbaef20cafbbad7a205ca9be2eefec83b9e96a4fb8bb4eff86fdee05ce23bbed4d78e69f44a12e398929eabed23e0dbcca9ee57a566f1f01b7af6ed9d2a9a07bfa2bca7fda2ed19f0b37aa980fcecec78fabe1e3fa0ff61e5c3dbd4bcfb5e87857c3fda2db83e8a8dedcd1b6ddd0cbd9a13a12bede8969eddaae4dc228db628bddcd2eb3a0f9ffaaff8f4eada3cff7310cbe5a09c7c8595e6d9dffddbeea8e7cc6e4bc15fd7f8433cae29a5803979dbbe4cb6d0a0d36163b6904ee795216d4b82ef9bdb350fcbce8a33c1cbef932228dbc4ab447bb207b7cad2464df4ebaedefbade52dba7577e0ce5abe72e3fd851eed3f38de84f0115c1f5b8aec019e11fc486dfa00757eac2df2be90eea19cfbd9ed9ef5b8daeb2c6e53d9fded1780f603dffc3bfeadf036aac30138004e4f1f2ed6ab07eee54f57bacaadec4415ddcfbe080dcfdcdacab162ab97cec062bdcaaefebfac771e2e7cffeee45b95def2dcbbe8ac7c09615cb5022ef1daaa17fdbc4ccea8b99cfc9dcf9c7fbd8e7ea89daffcac39392d04521113140e7eefe23eac46cccffa0fa4828cc3d66f90af116fed91b0fcfd0c7e1d2bcf3b929fe5ecb24480af95abf30d3dbceae7dae8bc2e82ac6dbfebd6e0992ee2fe75b9326ac3e5ba39b35fd7eedc1cf6e3f09ab23cadddeeeff983702a3a9cef381a1182af2bdc3e29f5a96e58af1e11df3c504cf115c3dcdd44a4ff3fce7ccbbbb83b3f2d1fa4caefcc83eaf6ea161c74d58d1447579ebf27ecbdaa74c31fbd571d16a07ceccd4ecabf7e06b1a6d311d9e1abe13ec404fc64908aa64f10e8acd63bae4cad87be343aea7ce190cbef46db83210afdceb8eb11c7b8df2446ebc0869b0cfcfedb613bbabe6ac91fa2e159a8bfd5dfd12e5ffefc1ee54a6caedfdeda05e60b6a3f3fd9377eba68ddaff9b455b02be492bda4f0fbaffd346c04f766d2a4fb45ef4ca085d95ce6a71c8efbe2fbbb2ca7fe80a92da3e66dbebeedb0cd446cbc4be96db641abe9bdecf43a7ddcbbd15bdfebdd581d7fb34e7718a1ee56e5f7ad1d029735ade8ef01a8bad6fce919be607ec7bbade65e3ef38a78d9ea8fb3a9e80bdb4ec56ef3db8ff833ac84233302e2076ef9ccecdf46a50f4e462a306c972f3abffcec398cf59f836db1b9d0fc379487f12b87e04d57f72bea09ea8721a6ce3afd76e42d3fccf7a553c80f7e0ef5c6d2d35db98c0b6baa5fe781b55bc69a5a00ffb19f3bddd0b3fd9f9948bbfaeea9c3f7cbeae0b2feed116bdaaaeabfae7dced8a5dafd6fea20459e2fca01b6d6a7adc6dcddd09d8cf97dbeafcdf11aa4ec0481741ef0c110abdaabffb24ddb91138bf9c3b8b505df7fa6a4e88370ea7eaf518f6761b308d7e2aaf07bf65efb93e3f5f9ab087fa3fc690e5f25eeebfdfac625bf98b62bb7b0ce41bfbf2cf7582985dd8fbadddfd7e7cab2af95acf7b14040a072b14f80eef55757ebadba7bc2394fbc9d56b7fdab023c53fed92bbb6ad6a3e3a6439f2c226d8db7bdc77ad25cbae5b5a5848ea94c6eefdf8fc754afe94d6aa4a4db8bc4f0f5f4b607ac13bdd3b6ab4ccc2e8aafda4dcf08a4eadf3ddeebf3dcfa730c1bc5e7a574dc5bcef11cea71d4b3bd13e6b1dc3e3a436dd92ab4d96c2d5ceb4e7e2d26ecbe6ccce10d9ed64e0eff4c6fb8a58164c1f3790cbfcfe6efd891fc4dcf99a4bf4d0c3b5ff2b75a5750a976cecedb5c53dec9d1195abec8af2fcee5dfc7deaa4c9eeb428744a0ff0dcee574bed94f54c17cd70debc25cf7cfe489fa82b4bc3eab2eedbab58e6b9aeb8dfa4c3ae5bce37a1bbccf3acfbc5b7a76f73d49867b3fd0f8be83afdefcafde18c4aacb82e31ccbcb484e48ea27b5e0fe2acf8ee717cfba05152ae6c1ab7cfb959cc41dc218ad930ac89d44a1fa15daa4ceacac4aaa556c9038ff8ddd8c56984bf4a42c45495fdfd0b8c3fe4f9d7c44235721adcecb611e8a7ffb2f1b3cebd4dea8275b12a58fd849a5b7dbd0affef79cfd2ce10e697a66bd5a788b16173a49fe88eddeefbf6825bcd0aa74fd2e968bfdbb2f7bd7e1bc5dff9d0f27debb66bdd4d446c1a29ba6fee8ed53ff37d7d6ee170b6fedd5c40d60ddb208b6ac7da7e2ba129b7fef0e72addd1722b8026126b20c47f27fdb0fa2e9a309a093f9dec1f97c9a642be7cbdfe0f4f7ca4b855b35915248f39abfc7d381fcfd7fbc816bdccafceb7faf06c1ef9bc8b39dffe9a72ffca79e48a8cdd4463ca5d8aaaf238c60bb46c18bcd01ea3fcd9f0dbc9f39011b6cce7cc9eccb735b5ea9eecfc95e51aaab675cfdbbdb0bfc4a9cb742a3311acbedfc3d7ba307ef5faeafdcfccc533ab638272fc8c7bd8d477697e38ebce0e3c2cb924effdd4f55deaab6efecb12f70af41f2cb9fb2ab4bbe0e6aaceed5bd9ade8bbdf2c155eb49a7dfa366c9bb6ef0eb1980b8bbe8d1afa4451aa176749fb94ddd1bfb9e27c9bdd35ce5abfd8bd7edbbf70c29d6abcbc4a1b37a964acbb6ed31f9ec5ba9a06dc2c3235ab04bbaa0aeeef9dfbecbef3ac69a4697c1d7c8cf6dd20a7fe8efeed6d2cdb0506c53f41a2f1ad0e20a92df8bcaddec3b0a2a8d0bbf5bdcf2d1daf6f35cdb072285ecbcdb9539fc2cac4cbf1dc8fd22d0fbf8e4d99cb04aa2496b8fb51bcda9db114bbd63842c08dfa8b83a8d01f73f7f1509ee38ce75b7a5c0a5cad8b70e45ac6ef03c916cbd183f6caf8a3802cdc54fefed71a6df146429f4dd6d1aa4fe0fea27bf222d583ca40ae329b8e45c64fd6fac3f385265af1c023320df581da243b72c1dd5e17392dcd6c84ddefcddcd3cc0db3d3cca19ab0cac330d7bbabacf4d4f1216aac30ed09e8d1eefd1bac23535c4b5a7abd56baf0edb1f6cbf6d4ffc9cbf24a6adcbfb3ad48ee3299a6fc74fbbeefc1832ed673dac4e73db3ed7bd83072f38fd432a037d506bdd9590e780b6aedf1e88f04bd9ee0446ace6fbbfcd4d01db2406ae8ee8adcb67ff6a7f4e405bbcba08b68caadc37ff2da23d4bc8fbfb7aefa1ffe1a95fdb5a8c1d6bdbeae116f15dcfb5a80cbf5b9be1a7304f85a3dd71bc55fcbad6e58a2a9dda599dee2ed2bbfaf6b20dddbaf3dd663b17cbd65decea492adb265bf860aef9a3f8e5ffb61e40ee56dfbb145fafb08bb7abdbe17ccde650cac6c2dcdd26a2b85bb4eef0ef0d9cc067e8e286beca4cdbf445636aa7d3aecd5afbb009d9aa3fd7e20aee9dad7dadbbb40ab74f83e09fb1df77efff8b93556dffedefa7a5ab281b8f1920532aaab25852ef6acdfae5e4fdb0e5ecb7bd7ccffbeecedd7fb5791c06da5aee3af2ec7b224e526ad1fa953d3929aa6e72d85ad0858eb69cbee3662e861c2efd6ef141adb3bf5b001bceb8ef3afb3c7eb31c3ea3fd9ba1d1fbbbedb8199e0ccae23aafec73afffe1f0532a6fc32bda497382d11dbaf5ce1b97b0c2ebecc8d5e0b80cdb7eed98003f09b4730fe6acda7ec3f9728b68f54e3045abed53dddf699d3df85ef526df5cfa392d6febd864e0a1fb4fec047be6e06127ade6e1dc6dba31099964e76b024dbf4ce6e1ab46c5582a82aca4fac4edc1beafefd8cde38cbfcf5f18045db436ad2710ddc0dd3d0da7f43d28cb69a00fb3fc7847d50db20ccb7d2cbdc2e55c1f46c95f7d31cfa7ac86bef61d3ec04edbeef23d0ed9fd497cd3aae3ea9b91923a5fafe1accf3c3c90839cecc4a9cceeecfd3dfcfd799e2e6cb3a085aa6ebe97fb99caa1aafea41dfcf0afe2faad927ac3adc1dce3d4fe05474ccbe9b6d6e7d29f682ecd15f4ac6960dabeed1f6fb372cdcfe022e87d9a30fb10d317ea0df9d3dfabcfb8ad2cf96c59735add2e6dba6fd30ce8ed692021d0eadddee5aa6c3a4ea9e3be0aa2cfabaa5917b41b60b77f53fd10739636baeddd00c4ca0087d7ab931abcfec432947e165991efff3fd672d8ed4cda9f39bf7cb64da775acfdc41f7b407fe3bfed48a06ff2cb53d0ddadbccae57cbd58fbf9e39bdc464fa710fd3befb9c5b4f5bacc6ac8f62acfe0c2c44180efdbdd171318fd719f21720b07d1aa3839cfcc8ae708a3f6cbfa409faf5d69eea9f4cc58586d88ae81b1edbff470a1bcb9b1aadcb1e04ef0bbf99fad2a5edcb3f96bf0bf6ddaf7ccba9c325d3fdfcb1e8ffae6be22fbbb76b3cdf60cdaec82663a6b4cb6aede7c44cb9cde77a80b5c3c7a78beb2b082e4c8f6c79a5a53f01c18a421aceddcade937a7ea2c74c9fd22ae04933fcec9bb1a0c69dac5df52deca86fca964ecf4db7da793c5f034c3ceff121101fc6ab146bfbb15ac7bd7d2cb188488d5dae7a0dabba1ef9d1181158dcccbbaa75d75f2d8dbd76c162da74a71b1decd9f4332ad9cdde5cfe56cb66d166a7fbfae91f3ccd1c5e067bee59217cc2f2784cb6fcd081abf95ea6ca95edffbebede6b3eef0cfdf64ef1fce60c1cf33c9c3526adc0a9c9e9d33b8bd8e7eaf4f757deeda0b8a21b6cfd14a2cba8ae6816afcc59da26de4eb45faaa642597fac3b2b4cc0bfcb1152fa8d2a5acb962f8d8e9f80eece4c5b68cd11bd9f88a11c8af6c05be48df0953feced98421c93eefc1ad6c4f6eff0da930ee099c1bc28349f7a4a7c4d2ae919e3434ba1dc5f23cdda4c6b2bffe7d4d35df91eb7bb198d4deae7a8efe2aa9c5af2afeba4eb2cfedee37bfcdfea4c3d29afc9091fa2b2357cedf4c22e2af3358aa595f19e3bbf6d797fa5a39db99dcbfedd549b3dd8f7f6dff7c000d231a33a4e0dd7d749c9581c5feceb0acbfaafe63ee15a90da4d7a5baca25007ad9eba0efa5f7ba77a72b488a8e88a9a2cb1c2fb62afa633f0d1ec9e2de7b0087422b7bbd0a8e15bd03f5f191afd7ef3de5568f7ae0cfec9e737cd4dde6bdbf02da5bf8bebb98327c6117275e0fa57dce2eb9afeed3cbf1388cefdbda4ee05ddadfbbbeda55f5ac70b0bcacebba030a21d08fc044c9a37f2ef1949a8fef8c3bf1bfd91d43db1c45bee6717d016dd0f6f6ebfeef1c9cacfbb7c7e1fac24df4eea0bbd5de66bb27cfd678b2b14578944a72fa2214fe7c2da24a21b8fc0d5ccfc76f0d5cadabaaacfc1e63ebeb1a2ea4edc7c3efbcafafd74deacfe75cdecc63f0d91b95aa3dabdde54436c511c2fdc1e78dcba0eee9f0d2bba9df37eeb2aa2eceefccf2caa00f429cdab4ba9089db62f2e8ab19abc56a0a2a9e8c1afad27b58681f2c9d35fe08d3b7f05e0252abc0fc695fba2985fe011e4caf8bcfdb4e2517cac3e3e2ef1bdc5bab24fbccb94dbcaed99e64b8bdbdfc1e8efd319b7a2deee7d45fa7a05ce692699ecacbb72df0ef812bbdb614a63fcff7e3bfdec221245b6dbfd26573e61a12d5e3470dadb7df53fabddfdeae1a0e99f568ecaaa9f3e4ff8b1ef7546c1cacc6a6baadcc6f6e8ea8acbaaebb0cbb1eaccf269b1adad1eedfe64ecfd82b86004da812ba9a2c0af99cbf1c30a82d4167782b1325ec1ebb30409ffbf0bdff4fa8edc18982d0d1d03116b4e18ec9da1da8aa6a6fcb8d2eb5ddbbc3a5bb7fcb87bedfa4c98dcfa0bba8adcc5cfbfcb1dba6bd48b0f99fbe8a2ca48f1c2a6cf182ab5c0efbf509e33f5062df2dcc7959ca7d0fd1eba6ce72f9dcdab97e69944a7c5b283ec94d4aa01fcbdfb25abd50bae75a7fbba7c52d2cadbce4ffb2db1cc33fa6dfb3e173abc9467f0c4ff35dd0dcb1e550410013e0bead1ffb4ddcac617f14cdbb1515e77dbf19df0bb2efaedce3f2b0f992ba2c4d1a3cd1fa15c0b6bcba3fd2afdcded76290dcd3ce86bbdf125d93b08dfe8caca45efaa3d28a20b8ac1bcee1caf0dabb1ceb3a4d62691b2bec138d7a64fbcf7dcf2c066b742ee95e726299d9ed8f0aeaaeded85bfebe36f984ac3fc32ce05505dfb062beaf7229fed6eb5ea927c53edf2f49be35f4dccb2d4d9cac3d190137ecfd4ef5d55cc7bf79f867c8ae0c4b42fbed52c7a7b2cede341c68cd4cbb6756b594cd9dc3981dfcef559ef0fcb6bbec2c7fadc7dd8a9a49cec17ccb8b0e3cc5f5873d483fc1478b22dff3f6b4c2ceed48da03f7729435af2fd11738a40adafebb7d9ef2e010ccf601a51c7edbbbcb6d50de2ad04ee5e7f6c2aa89bcde90a931c1acaf14df3e3a9aef551bb14b93c047200bd9be9bfaf53daffbba4faabe9bb2caae83a0c1b5bff7ff0ea6aaddfc9f6eefa0bff67d4d82958aead9f3a9decd71cd93ff7eb4f41cbd005d0b9b1423fe6dcbdba599ae42faeefdcdcdda60249f77f7ae92294dbbe7b15b9dbc0d7ffb0a588cc45a1f40f7b354c659aa0bd5a4de8bacdffca47f3bdc22e2d38211e3cfbbdc1b6abb466b7e4eb9ab6e6e6e842ebd07fdcec520d2a3912c27f855d2dd0edf6f0c68ad0f4f9baef2debff579d7bf3b6d1f2bed9674dc7e7bbbbd84cddefdac5f48d3dccbad1b1cb6b8b8bf0daf3b871d40e6ae98cadbff525fbb9ff8ee47dcfc5f3af8e1aaeb286e1b0080ab5e8bac2fd3b1cba15f8a1b0a5d5e2f5ccae5f11d5b1be17adec6f1a819792de1ef47bef7a63a3836580e7d74a3a0fd792f6c311bb9e51dd83e994e1e4b0c1b32d73b797e4be806fd20c5df71c42b9771fcdbc05d44c73fca04e41ebdef620e3b8fac67c87feecc61fcfbc4f3a83f4b2a0f313c2848c0ecc4b1875aa09cc2ceefbc7fff64025aa21e6b384fdeaf6beb2c1ca5c3bb6dd0dadaa96bd26fa559a4204ff1bb1e5ebbcb2db60bb8fbe28da5f44562533aab2efbeca3aef2dab6bd22c6fecb41dbb3ddc5894ffec65f55df08d06ffb9904de867b954ebbe9b9c6b26c690fd509a4a6acfffd0ecac9ff601f1d1ccbd1f517ff98e823bdded4df4a039ab6ea4cb6bc442bda4efcb94bd3d850c046ee69e9e3bff4fe5fb2bed62bbfb7e0fed8876fecfcdd1de165ef282bbfa83e7bd8dfb5abb65fea4ba19a2dafa035f16fdfdb203b9fb8cf5ff7f04a2dcdcb1b2200e7d9604d5cb3ff8af9244a4847fe7dceed89feb03bec9f0faf0fd2daf013235ff9cbffc2cfb3abb0bfcd97fbc9739b2ef10ce673cf03f1c17d986a8f20bfcffd95fcd5dde4f4bae1eb94cabeff0b11ec15a63d9e8b38e1235b9a5c86eba5c64fe86de7475eb8c1ae8ab2c90b86ef37e3fab1d8caf57da857cea9abd9fdaf2bf5ada00b46a6fabf8a15ab20facacd67ac6326c0d159015c1bf5cc2dbe84e7f6cade4fdfcba094c1ec4245b31f5dc1facde44fc76665dfb10b4b6af7ff77a1db3c06eeebdb2732a4266287c6bafd73e596aec9edecd65ebc3bfbade740fa44f095acb128faa8fffc1d9fbaacf5bafa8758f05edf065c1ca37fbe2e1cc9c5d35a2a5e2e5b76dc5ac9929d25463079fab27a7af26ec41a1abf3c4f387e4e8cbffaccd5bc70a8d3cd4acaac5d456cfce69b8af9ba3cd0e03105b0ee68eedeed2fbb5ea8f0e140a561da71914c11703fcd8e8c6cd2d0eec0eeacd6f8bbf7420e6cf3dbb6575ef3eda77e7f0cb1df8a1a74cb4cdbbecb7dc0bddcaf49b94f2f6bdc6cd32ba36db8f24cedca9becce7f22620ad38cabcf39a2454fd2eb60ed4fbaa849a7d958b4ec9bed3ba901181fd2ffe551258ed30ba785d6b31910b76a97f8a3afd894e1d2ed01c72a0155a18d497bb91ad75c0ca52ae2be4caec92bbe0c77d5179d34e2571c74a9ede5cb2d31ab472bf33617bcb8338fa701dbd03e6a416b61cab1a28de778fcab8988cae3ffdbb56f1a0d857aecbb4330d3cda8a73dae8dd0d7caffbe1d50ee271a20223ec154dccc10a59bdbbfcc3ddbb0d73d6079d8ad5ebafdbfef8fccaefdfcd500b0cd458c647a714df0cde0c5cab4f0e5c15ef54af3fe5c5ad4a9fc5a6515db262dcfbf5f2987ab18caecb4f68cfab6dbcfb5e434cadb77eebe4b1dce4d5bfd580114c43177e8a6a1a0c39dcf480abe5f7d9bf20aaa1a92207cbf050eddefa61aa2dfbdf7ca8d5fdec5aece5cde3db8fc4549e77579cdb88d259f4813c16be92a67adb4837ea6e0d60d68f3c6f05eefcf8b1b271b1b26c74e63d8153c8b00799cbfc1cace5adeb5b5de3cf5b204efbb185ad09f267041bdb31c6a0ac09efaeef3b05fe630debcd69feff7e5459cfcf13f9e3c5db11e68936acfafdbdd276d9dd4f8cfa14253e84226871cae3cb5c9e5bac39ffe886df7ad06e57f408e39ce75f138ca4ad4d1f6aeee4bbb142eadb9c3dff123bd2f6c5009c6d417fbf0dccead0bbd3fede2ddcc0fcdac25e15e6c7ad34f20e3ceda39c89ed21f54f2e2a8c85c34f0c1d39ef6535bff2c6dc7ab6eead9ef0fe8ad1decb108975b4bde045c2ed0927e15bae71e4468ea3b875fb5e79caebd063d851048eedfaa4aaa5ad9f7b8b1f80ab2dceca58d380b1c977ac7d6996abb97b70ae558fd9dfd1b70aeac5c0936ddca99b2a5aaaace65f31bdffeb2def275a1ef4ffedb0feb110de61b72b14de6d02cadfccdc8cdccfa89f1c3bfecc39b184217dcf1b653b6ada63f60bb1c022e57ce8ba8a3bfe364eee1ad8907648dbbc5ac26c33e97e8ffdc2cead9356f7aea1bfa3bca1bfd06ee656c0ca9fbd7bbac1f85f4e5e1d4b5ac2d22afb9cdc208a56c8cbc5a7acc07fc68ac9dc9c8202bfdf5abebbed6cdedb4b4a5c52c503ccbc0abe0a5d665bdaeef7c126e62daf5eebed8af7c674f4daf6d8ff0b2be9344df201cc1b3efd5a62c7c278c69a4b03a1be04abfecfb5decafe938ad5950644a302dc86aa10ffaa21befeb9ef929a9df103bab7c7deb0ddf1e4f9e0b0c5cdaacfdaf1f1caf32dad438cecb8bd6e29e7a18bd5ffffb6630ba98d5a5ee6eced51130c6cbebf3e91a9da4ccdb5eed871d0bddcab06fd5bdd4f53c8ea3f17cbe5d0dca4dfebd383084be4b2992eefbff25654fe98687da5faeda9decba9eeaebfaafd1d9a21fbf7d6aa4b1665ca494f8efea8f3a5d0fbf1d9511cef7e5d79e2a29042eaa196bd48705d341dfcb7aeeee864efa0f764d37d2af07034a1c686abc9ff0dc6f6486d63afe82ebeee1d994cdd13ea7629b7be4ecd31d59bdda7520e6a28fdf7a38038dd758aa6a2a67af09e93fcf6dceecfa4dd945cfd19c5ae46bca7d0fd11f19e853df40f42bda163b532b76eacc1585cf7bbe9f1fbd610e5b6fc8cd8a3e6aac62b23790ba6bc6cedecd16fbfabb8bda806fea0ee4aabfda16abe4eae1bc5eadeb4dbfdb4f12439acc5b39ffbc37efda9d4df6a937384d2ef10b0c5ba5cdb8f5ecb3ac054d7656fe30caf90bd4436726f3abee83008ff53c03b9bdfee6cd7ceeea0c0a5800dc251692e2e3a4173dacaaaabfdf04c9924c14f5ab3955faffaff4f2c6bffbbca7806ee3f85d3dc920f0e3bad0ca43f958909dfa9ffc6e9fded0bacfce384ccaa7ffc5c6bc2cf13bedff3cad1cbdfbffbbedbb8fcf7ee5ce488cd9970648cfe4eeeccf302507afd9ececd361bffb5ec8f5a8bc5bae78b0cb8d744a861aea23f48436efe799c02fe6ef668f9709def8ea3217cefdec61bf15709c4dca269a8dbaee4afd7b955db7b59bb4ca2daac85dbe3ce4d5fcf12aa610f8b80f3ccf1cca87cf55eebfc4f31cc4da6bc6859b06fdeea7a3a019c04f44d8d84ef32b48db55a501be4369fea6e8f67aba5dd1b12c211a3b2ec2cf33cecadc5ac6b98f7ab08d1db75e49926c48c36cea4aa838ff0bb4a08adad3bbe4faa5f87bc6bc57ce04130cabcbefb7797c15c7616c2e1ce0de802d23b09f2e5fd2ec83c4dd1bbac9144adde8cba7a1257270f1fe4795392bddaa5daa981f817dddf770faac61b5da06b4d9c4f158fd11abce0cfebc950d5bccfacb26c2cf3e14caeb4edfa9aa7f9d4fabecedc204d85bce23c7e08dd0d9c7aad935a8482b0d311b4dd71d7ebe4b4db3bd6cbae7d7baa43d0a6ecc0e489da3d92dfdffa45899b48db10cabfecafe0b6df8e00f2d06538da5b18e2ee511d1f229bbf7cea949ecce68094d8c1ebeee31af3c3b01bc3a96aeb53ffc690a46b1c851af09c8d4aac1ae59ad4907412bfe1f9f7aebf605f24f77d2a3e2ac71257bbbac61a5dda8e934e0b4cfdcb56532e39fed67ba3b3ebaef7db7566b5d60cc16f470ff8e50a3713e15abc1cef7ac80556e4fffa4c4bb6288b4f0d6ea1a5e9bfda44fe619a8908d6be97da8bad6beaaaceeb2a2c4dedbecf0fec48f06bb0ef36cbfcb42fea0cde92aabbcf41d27824eaf6a3ec5ded2efcb454be14d193fb70bdc98db7c1261b1aeaf97db2e124ebda15b3e4ecd7e650bf45e31264a41dc62bf4f2bdfefcbd9fbe7eb5c3b565feba8d916c13191deb4637597eba1b2e9f807d06dbb6af8ea17dbbfe4bc4b2ddfc90ca83a60d46e644ff536a38fde4d917cea2cf722febdbe35ef455f77ccd4e78ff7fec38bf1aef5f73ebaf8fd7aed6dce05a4d0dd3ff0a9dcdd98c99dbc3edc30b176b0aaaab65daa5e22cafdc5d31b6e856c7d1ff1ab0dd8cf29cffaae5b6e235ed4e1ce0989fa74bdabc5d040cbe6ce9a7b4bcf82a1fe3ef5aede6ae348a63055b60449a864755d8f37c69ddffecb32a4db6c2a0677450682e3bc8504b7fc71bca9dcc22d84ed9e9128d08803b926d90b55cec4ff94d1bbbca4edefd969cc3619abafad06ce5bdeefc1d11caa03bdae66a41b2fe1dbbaebae038d91f6e0d6972ccd6c463bfadc7ddd526bc3c88e5a9aacbca8bbdaa2ceab0ea9483b613d6e03167ff39cdcebdd9c77bdf7aa8e4709fdebfebb15c6cae72cbcd104651f06f3cdb7c9e8762a691d7ef1ea11d67e693dce3b7abb2af7d850ffaf38a28ff7a75b225cfd0d8572b08048fae17fe58e9cd4471f168356aa859cdeead3bd56c8d289b17143aeafae523fb4e5f3b2a9d88fa8ecc455b62f29f0dcaa4cab54d0a768b12e1e3d3af6dbae4c9aac61ad2673f7bae0f9ac4389e7f84b35d5bdec8acaeebb1ab9af1a87d62457d5ad298ebe77bdda8ecd19fe1db1eb05af438b0457bcf3a78a0ddc029782133a0ee812af251e7a2ea1f707bf262b9bacc66d48a50c4ffbf8abd54ec1ed9abce0b004bf22fb3eedc4ccadbac16caff8d767f4a9db163aa45122b200bad8d8205aff7d5f8928bda82eecfc2b85a52f28ece6ff5acaf6907a1eb7a1bbdcff3e78faaeced98a7dfff46a7f9e41ad39aecaad4d9aacbbcdc3bd8b42b83bd8ad466dace828b3caf0972ebdbf3ca7ba2dc3a4fddb08c6bf451c317b9db99cd4c4dcbaeaa95c6f23a62bbd16123aa5eaf9f6ce4c5b3df68f964df0dd71edcac30ac7fb66e4f3aa98bfc7cd27a1d012ecbfaeb29ece06f2f8d5bc462da5d28b9f8a3e6cdcfa7c278dba56d189c6ffde85166e2caef5595c7b6293bfae7d3ab4d94bf3acb792307b4ae3860f1a75cfcebdeaeef8bcdee27c2abe5ab15c227c6ada15eda16b70ddec6433de467fd4beccb198b9cdcb04fa058720c402fafabfcac0cdf48cf4e5af064d1ab1c64c8c03a7bf78540cdfa82bdce948ff8cbac79e6edde3dafdaffdddf57de6fd01efffc7fb5c5ac066bd0e94d4dadffcbb2e8bcc7c1bc69de4d1d2766bdde4433ed7021385eab7ccb8656ce3a90f77de98d2d8db5cbc6a4650e3ba905a756be53a5e7abfa7fcf5987a976d5ebfdec3ffb42c031e346affcb7cd6ddd3eee9009d397002f4aadc4eb4167cf4ed4f7f25cfcd22c28bf0a32ccef39e71d09ec029419c4fd2b7e51e35cfcdabb9b5fda7fb344c288c27e377a8d9afb3d6e154bf9b2b2028ae2163edecba26d05b06a9c90c4b51f3ba5d9688c8194de2b70edfcbf0f7e53ca4b7bfb9d2d0e629f06a2fc71f9edcee5f7bbd8d0b415b4a32ae4f272cabaec470c8ac2a1afaf825338ac1cbe67ae2354dbdaecd4cb0d6e7d296aafc8ec7e09f27dcea01f4ffe1ead77ffcb4d630a11c10fe8b91e9f027daadc19bb2b4b860ff28c0cebded0ce86f1d60a513b58efbcb9e5ad7fee49bba98ed19cd960477fb3930e6dde8ecc04c68dbefe4ef8ead95f4ffd1acfefd1df174bd7518876e1a0a57e7eded9a4b3abbfafc9db5b695afda73b228bc21047a70e4a63b9bfb8f6bfc1a6ed9da25d94d0d5ff5d3f8765bc89cdec7e16a34e34ce1eb10a6ff429296bddf68adbd4bc52aaa61cdbcbdf1c44c9cd33a03caabcdb13568733e023fad3038c8b0b77f70abc7ebb80fdcec9dc8acac22b166c5011e987a80feae3a690b6dcb3402a56c06d0bb5a6abbbaba6df7beb579cde1e30aeeda5f04ada97f365f48cc249bdfdab05bebdbadb44ee09ccdedacab45b345b8fb89cacfdbdc92bfe3381edeeef8e9f7d7cc6125690acbcedb7dbedc414acada12dc646fa78fa77bbd6fbedf08a0e2bddcba9f5fae93eab1ec69c8e5f0ddbfedde5bf4392aa6e6f58a724caa6add8fce3f94483b0ebccce1b3e268b50b3e6da3ed12cf75eabe7af1cbbe5571daa5ffbc99b8f5aadbc7ddcca11bf5c5a4f0aa36c0a4085458a36c392edecde61477afcef98fbabdb0bf6050dac2fcfc3d414bc198bb8bf24bff7bbb7abc3f2fcdffc03da0f8356eca2f8178862f0ca4de83d9a350fca648894e2c7ccc352bd73b39eb9abe655ca7ffbf2defacdf008af328f9b75bb784ac8670af559ea2afb23dbfc462ec40f4f3469970bf1aa393cdad6348afc97ac92ca5d5dbfd1978cbb775977d2bacc48b1d0a834cfe35dadd4eac11c4490bbca9e4cf6e1eafcfcaf3cbad8a20eca3b0796bf3a9b2bbc47abcb2a404842be4aa76cc4abfec8a47a0aefffc44e9cacb8974469ddafee0d1b9b1b6bbedf587bf1e26da1d2c684c4bfff584e4282ae4424ddc141dd43dddb299a6a0ed8ef2f78fa7ab68af3e5ce99bb4aa9bfe18a901dadbdc6def93e51afa6f953f94ff121beddca6826fe8f20cc66147acec01dc75fcea0fd3efcc7eab03339cae22e1674ad6277acdf5b7a30e3fc5ca1a30c6ee5caaecea6c6ffce4cf2a92dd3f68dc51f6bb42c43b2f6ada70e27220eb4a6ebaea4ee9cd71bdb0be0bc9cefbe20bedc9b0f184b9eac8b56b0503bc22122a1c8f0d3af0b37cce0d24afce3ebcf3b983a56bfb12b1fbda5dae62188ff2cb7cd73d60a8e2bb1cbfbdbaaf8acb32a8ae23bddf5b062aa3fe79e13ebdbc1aebffcf3b1dad4a92304fd1c2dab614fd82b1febeeedebc202068b0fa1df850e5e5f9ac6bff24ed22daa90b6c44f2a3ad94e07ff35bfd9be25142ab6ad96b1b5e5efaaff58ffc1d34debef8cafcde6fdf9ee8cd2f4cec3af1d767d18eadecffd71f2ccbf169c49c1edfca8fe3faad1a67f0242ed5da471b97aee81ec5f5d6ef23ccd2ab3d5b85df0acfcc9edd9808bc5f8ac5c1ee4af6ebbc40f1ecad24d8c86aa54a14a54df7ee1aff2e66be66658aab9fcf2f1cc2b2c6c826df4ba6996ebddef910da513acbb46af6cb7aaebea6fa968cbfaf682c5204f80bce1f4cfea8d1edc24ebd1e1c1588a5e95e7fededdecbd3bad96ceb8b04ace74465d16b6ca0fcfed5e34d0ac70a394d1b379df40d787cc9dc439cac3ffab3f15c2f0bc1ba76b5d8a1fbedb07e5bf5accea409687abd7da060cd8bdbc3fffcdf027c9e544d16bfaaa9b72cc540c7dd3f5e06fc7dcacecebf79fed4f98d84af5c5fe22af4904f89cb01ad0bcafe4ac5a4bdb0843712ddeedda17bcace4407adfb4c5d1a26e65aa6a52c99f22c129c29669d25bff30c89edc1c9fe5bfe9ef8d7b75bb832bebd21344f25d8d3d28489b6fbe673eecf4e5fdcbd928dae29aead1c61ff642ab3c77737fdf4eee520b5ca0c99abebe1fd6068aa31667db3dca3e1da1cd63be50c6c6de5fdd9cd8f02ce58b48535d685b79f7fbf1e056cebd5a9ff8c7d39f2eda6fe7bbad5da21feff4dffd91ac573bead5d0ccb4dc8dab9ad37ecfa7cabcae6e9cd3bf8db65aabfa69358dde5a546bae25bb8ae80acace29f3bd209e60bb2bab407da849a14d6d7ed605f7c5a9f4dbcfd6edff1dcf8d5faafed0c5b6a3ade0bdb6d8dceab1bfdc3225ce045190eda0f01dcbf3c8eb4b33e42f01ee5cbca74fa07dc502c8fc23bcd25f35f4f0fb829907b3e90aaddfdeda3cfbb78cde2dc5a679edd60f0f4ed699ccacee226aab7aba8aabd94d65ea204c4a02d27cfce50ac9d4b054ef848b566a7a112b8ebdc947afba97f8962e6bab20ef02e7adcafdaaedab8ccbb2cb04de0acf888d1f0d9b7c51e03df0138d48d3eb53fb0816fa2dd75babc15202a30c6abab8bd212faafcac0e57d0c3ec8e7f6f97ec9e5f0bdf5c80b68aca327a1eb8f863965e2ddfe4f08a0f3be9fd58c72afcb6dd0b0c2e88b6a3d4353bed988783c9ad1f7dfa5cef1ecfeab87bb3b54c6385c2afacba7deed6ee11aa8df03f1bba0e5b46e9bfbbeabdac10233cc0a6acae9be1fd1ea6c19dde32e9f4b546aaec4763e7c3a5bf0689f09c5d8cf8c5375afdbd8f5e8eb90aaec1af812f1a13e4a9af0c6decfe7869465ceeebbb852c0ddace73d5fc00be92f01019f2cede12faeca1c9d8c6b310afad5e26ccb00a903f4f0573e8f0f43aacbfa793e01ce2fe1ddba7bbdc922431efcfdfddcca0ff9bff035c61ac8d8ef1914e9c15b2b1b1aebb3edbe6f5cb44349d65d65c03f0ab8abac6bff8c76f5a2fd9df3fbccd9ad31af2dcadd3ccc0a5d9e0efcebcaaf4bce0e9bd882826aa84088d3cebaef4dee0b0e6bcec60cb8cc8447d1fe7de81cc48c9d7a0d451ffd0cf2e0ac1a1f4ea631231fa4f6ed4baf37ac3848beaaf8ab53b45ddcc95b45c5ffdc3223cd8d9c7583fec8ebdd3586606a744bdbe25a537d1edd1faa58af91d39da9fefcced7c9bb8aa09cc1aad9e991fcd3fee8752e96d1ee5ba79c6c8458fa2d4faafbe7058dafe8fa3c4dbade4fecb6b1e03d76ef2abaca5da906f305ddce740ac152eeed95fb974c9cf57c2e489c9ac0ccc2e1d4f91da1bbc2e756f6f24eddcad7de2c998bcc4bfa0d5e02d0dbba33c152e2cbbf1cfd8aebfdbaa9eba29ea6776debecedce7b72bebfbaf2b8ddd64f07f7c28f79a6bb1fc6b8fdf44d5c4b51689dcb80f209741adeadb7e8c1626c3ef3d2d6ff0e1cb5ab80bb49947ce3abdabbb12cdd9eac9c0baea2bc281827ff9f6c8698cf47c61e1c07c373c3e1a766c679fccfe149b1b8e92befecd5ccf7f027ee9f25ac8b78bbb58a7c9545aabb68415a97a7154e9b4e1cdeebf1a30eaca39c703c913ba0e1dbdfef1646b3ec33baa40c9d0ddb0816b2c9c5dd9fb6f7a5d59eca7bddcc81283765bce6bc2a4f30a5abfdaeda0cd48f1736be5fb27e230bca7b9e92d00dc9ee2a7059b4eefcbfef29b4eacd03e976fce5e9fadb9d051cebbf7f941d8b640424a25afe369dc00f94bed4fa452feb1e5cea39cc3a57fac6badd8fa6c38feeb3fdbea187bcaaf0b5a1fb4b8e457fd6332802aa6dcc5dacfdefe47ec8b6e07a62dedcdf11db4eecaffc074eddcb56ef83eddd96217f6bebb8fef18bbef1ef7558e8bc3d215d9f22d854e5fe7f155f73db54a05f3e520efdaef5bed0aecb62aeca77bad1da97daecc852a049e2e9fe36fed729db7bfbffad5b91991aff1ed0c38c254ae1dfcae8fd58d3dab7eb50aee77539a231a7da89ddc2ec5ac18b2fd30db19fac28e1ebacba08ed6604b8caa47f71a9aefcdd9b4e107085ed76e0eb6c1c811dc203419b95d958be0f3be01cfa28aae4f5b1fbee7226b3502f3aeb6f575ab28a23bfdd53aba4dde47daafce1bcd5fc64fc71fe454779f809574bddd0cf20ea41af4ddf16b26cbf069465f7adf554d54c0489cf039b620953d78064cbaec8a41b7eadb1cbbd8fdff3e7da4c0a00ec5a470adec8b08793e9cfcb5f7eacb3e0a7ae8f7ec87adca242ff001fad0ffde9a9ece202eed62695d8a53af6ffa06e26b5b261658c49f3f9a1293eef40e10b7fffa68e4c6cc9b1cbd8e0fce8c2dae166d1bb12bcea9cc63f72e0bed0764efacaaafe4e1fc8feafc6e9d2faafe1f2f07dfeb8ab6fbe941e9f6acc1bde4cf11b5ca7fbbccb9ddff1dd92c347dcb914796b3ecaa24be9fa5bed7ee69516b8f9baea9f8e4573dbbf8e591ddb5bb18d63bd2f1ebefbda5dd778cb305ffb72e6b2a9ee7ebc0dc37f9d1caf6ec70d8d0bf05e82f82cb81a0ec0fab0fa92605373aac837cbb29f8f24bc3d94901ab7ded8bddb64f3ac7cedca7615dddcadcba645acfec371daef69201fbbebacbd30f3f298fc853edfcb24c86bc90425a36fdce4b5cab6ca4819daf0ef9decb0e18f0e4cbc52e9ef452583be8af61a09b3dfcd3a5f7d8cdadb2839de93f8f0c47feecad7da385fdab1f8f1f9c1cebe2f857ebaab354960bad4ffbda8dd24c5be72c5f8ba4dcc4b7a46d11ea3214f3b1a7ae66fcdfd2a21edeba9d66c4bbf76e2eadb8ee86deabdd4bc7eaddefea2862cfbe1bcda48058aeea6b10bdfbb5fa4aaeb5fafe935fc7dfa5676ae3e67bacb6a9b0d617686e98c2aff3cbc1963b316be68cbfd7afa6b2cac3488ad4e882bca6f67ca6e899cf324fbba45a78753bc58cd37efeeefe85db2ffc512ec8b1adba67c6b1f6dcac40a8fa1bc166a2ca2045e81e507da9f7be29ddad96d2f9f2dfc08e5f5ba4e06f7f579b7adc86f7750b20bf3c85fc4f2ab8721ef2521e0aa6cdbc7f504cdada5ca9bca03cb8d12acae474ae4c8c9cbea8eeee65ced81ff6a8de7ef8968dbacc108d9ef4d00bc174e1cfeb49edc8dff022bebace3dd70f1b92bfd6dbf5b3c3e759f289911090deb1cb51ccbc991ae42b0dfe528edfd5b12aaeaff4237d9cec8f15137a3f85dee0200a68c052dff96ddbaa4b662cf194c16fb35debdaaa115cb7ddd6b37cf33ef7ee8b93369ae183455daad9aa1d90d5dcf111cd175086d0bc9aef2a7feecdeb6607ac985cb2ae2dfeca9bbf85b35b044eb1ffbeec3f1ce193ed1fdc4d4ad6f0da1f9ae33c4ecedeabeb9c4f9f3e810c6bafa513c654ffacc4bad10bab9acf79d5ef43efba99ce5cfae68dddf0695c4acaad76d7be51bbb1dbb71fca50ecb049febef848efee4d04ea99c3bfebe91a5162ec3c6abbfc05d91b844b8d68ca527a0f11eb53ab3aea4b1affffafebfa23ffbd8ee04a5fea3cb0ab5bd39b45b0f9f0d1ccaddeca0ffb1618aea12485520fdbf01a6dcefaf1deddbfd31b3fd03a0d9bc02abbdbffcb1eddcd64fe8d5ad05d5a4effc9213b754afc7a5bca7382a53c5425eaeb5eec581c2e9ec92afea02105fac2404eb233de142bbb1d0aaaef6ad5c6893ee3acb7c33d2ebb1fffd504aee020f876f8822aaeffa2b6f6dd95babdbd2f5de1acf9b5e9efa1ceb782206e0bd24dd2ddc4d6637cf4129da46efe25f3e33277aab1bfc1eca13accee4abb478d8aa3cdd337e78cccd7fedcaa9dfab9ea35f2ab29a8122b7e9b9afcf7faeddeaec79dc860606fdc64c82709c35fb15cac88ad4bbefd971b6ffbd9ebfcd1cc7a4193ea6e68fe88f34601839b8abd08a64aeedeba32be321ac72c1ebccec8d8ccdfe46bacf6bb7ba05ea5d7d3b857efaa17ecf075f2721629d42e56d9d7e7a3cd2bea68f4ad022eebdc57e2cdd797e476d35546eed6ab2ffecaf80c65dbfadacb250caac5bb3b5dc5794c08fe7b65f5a6e822b1a8f7cb1214bbf900de29e25fceadbdbadc1aabd198da0d2dd4a94bdca4ecfa4875cebac62d9ebd3cf84da4dc3436dbd8426903cda63cffca5f5d9ca99fa9938db7a156c2ffbe82a7c918eb65dfc0241e7328cdc75f12fd5a6d10fa3ec77a83ccebaaff755b7cc8b03bb1dd7634d6e6c037c46a696a3bfcfc356e69ad5e5fed71fd02ce310fa9ed5a67e51df9f96cce4b8a3fbcdf2fbe9d4537633b43cedb58cdeacb3d45ac9a78f6cb90a9ec34cfc96b22ccca56a98a9d1aa1ace29c54fdf3eb05d4cdb90d5cffcaeb4d8b0ed0fe09f6786cf5f2d44dcca10febfcdb8c9f2fb03c058f4dd6f9a9ced931b98aaabd1a7abd889ac0adbcf08f0f310d57c3a4a18caaba6bb27f120ce2f01e57aaab3a7b7fdefeea4345af5c6cacebf07112a3557004dbccbe4bef9fbfdfad69fa993bfdbbbd8e4eee35baac56dbbb1ad04326cfedbcfed3badeabf8ccab2883f2a9cde0ebed7befc737bf48b8bcd84bed1b7fd0cdca8bd55fc2ec3a4cabcedd8a25cd5dd5ccdfab3bd664caa3e1ea6eebad9e3c8bca33293eabc78dbe109c99e29e6cbaf5d08e8e4a6108dca58fdf42da6e25bcdf0bafd9b3a76baf8be35dadf5ee3fee040cfdf2bc6ebf0ebd92d075ff9fddf3a8fca9b4b9eaa3baed2d3f93581fc5ecdff6ddbcdfd8ba27bb0d3cdfe263c3cabbcdec08e57cc6bca02a9c400bd0de7bf66d13dbee829aed0f5abe2cb60f459cb44b786fef739d074ec7f37bbf4ecf710388ea669eeee64fa8bcf1dcfbedac4baf6c2dc378f6e78f2eb82ec5abc1b87069666abc3d7b87f4bde2bdd1edfe7eabaae27cd34ed1aa77bb44b17053eac0617adbea9ecb2f252eb6ce83ba4cddfcaf5fefc9bdacf2d43b7dbd28b8c737ddb09f6bb99a3a0f1fe6b1baae1547c108040bdfaece48891c6ace9ecc60bfdeffea2dfbef4ef093dd9fe18f31cb6dbac3ffeebfb8bafa243ad2aa391cc3ea88cf11fca6e1cde97acb9dadfefbce53af0f91cfe5ba48ebdcdbb5a11a0fded6409f546afdfb638e3f5ffce7cdc3cecd9dcf505d5a3bafacb9fdcaab58eb6e577b48a1a3f75bddeb1abfebd5bd1ab7cdae8ac18eab824f9ffae9abe8cbfacdb6deac1c02e93defd5a625bdbfcede7efce4a8cf13bcdaeecafae7c74db0e2ac5d85d3b28fbb5bfd5bcdf6ad2dd1deaa429beccf5ff6ab5dce89a92dbbc5221aaa193b5dbcd4adaa1db1fffaef747ffcdf9cbccff7a7e20b3f3ceec08d2ae004f7402b6dcc5bf10d1dec0685de84cfb9ffbedbfdd2ed437092e460ade9bfbadbfdaa9d6413ada2d8cfbaac5d8496e9f3f00a0deac9448dfdcefb29e9e5c28a69d334ea0e8cc57ddea7cbc7c45497d59ebaae627e451d9faaf35251ca5e86afc61274c9d6bf4ebe3bfdcfecbec780c3f20a29b1bcebde5b35cbfeafb0ebcabf6865bb1fbd99cfd6683addcb4e885a3a7e08d9ecdb696ef0b90785e519ffb652fa75bfb8dbe5bbc4eca010cf2cfc98330cef9dcd56deaec3afe1bb8ace3018eb10b8fcc8ea7b2eca096183acff41dccbf1cdac4d64fae3ed0edfc20277ea97ff144a3f809ecec2e699f7ffbe5da54aac0ea39d3ea7102dbf226ac806d07a7cffc602dd5dca7a88e8eec18dcdacae10c3b3ef5c325be136923dd7fc62ccfdee0ef380a9be4d89dcdbdcdcec560febac1501f377abf5f3ddc57aaca2faaffa37c490bbd5339a9fb3a1d5a145bf40fc97ed8cae35da31bb121b8dfbcf4bde06c817c8df949af1e35ceed4c1b7248d4d25dfb75b4bcccfda6aa9ffe57cd985ea02fb0338de9a43daee2d028bc1b7f4b2cfc32266f1bef19b0c03f53fc62e2c58db9998ee7be0bde4ad5f8bac0eaa7a3bfc2edb79cfde1bcfc85aaea9bbc3ec0dda6398eefe5b6e1a440c94e3b8ae4ea3f4a16f29cdefdecf49ab9ac58f87d811b3dd6dbeff7d328bcded2a1cabcedfc3ae7d073501f6c877e2b6822efe46b1ea3b69fcfa29971ad938cfc34bd4dfdb3be3a7a7f7d54314dd2d13c87c4dcffc3be79ddedeae27544cdda357ab8cbdfec318abcdb84e3c82f6972f3f2e07df51ed8e969ed9dafa3230c8caef0f4438e19c3eb2d83bea9988dab37d19adad78cb31de21eb4a2a3fe7fef1d72409f4d2b0dbb2603b0279aabd7bff22206ea8b3178f4ffd25f2c2e1d11df9edeaec10bd4b8d178b0bcbc8cadb75f75e86bb3fe4dacbba0f40db5031750e5f6e2be91ee32dfbeaa11be7ca775d521ea1d7a2fc76f44ad0a038fd8db01463ee3aa6dab3456a1edbdc3bc241b1fa0ba537aa3ebfaea319ab97f269ddafff120dde3d91343ddefdc9dd1b5ff324cf9218d3627e741d165678afed7fd24cf1966b119b91c75adea6db2a3a106425ef7d6ed715964fa909dc2a4348b31e1db6f39d83c5f2db6eecc8ee4f1be24a8e7edafef6ee05a45d4a2a8f72f3858d5aeed865ccc2d82e4bff9deb9fd94ca212a3cd8e0afa7e2affa9806e325c24fe8fa2d80ba4e2cfb5f1b032fddcee7f3e14fcf2ddd6d666abeaaac488faab5d75e09dcfee436eecce2dc29fe1ed2577a5cdb3ab7c2bf34cca3b6bab8e6436f55ecd0c91d9958cc5d7aa06fdea3faee78af3edfed3acf1edf2f4edfbdb65bba4eae8c26fbbbb273f1cd2681b5d84eadf683c9e0bae26bd7ef3be3c1909bb49afeaff1265d5d1674f8fdb0d2d04ccf4657bbed3770fefc302ddaa46ec7e52ccef7ad9a8eb2e6fbf0b1d7f1ccdf3a7bfdfafdee8b8a67625bbee09aedb7719427af364502b7df114759b1d4c838f5f72fc76ec7bbabd06d49eecbf22f79732eeebb1b607068baa40fcf6bfb8e2225c9da6bb62dfd2a7f1f2bbbe48dbc357e6b2aedac8ae499bdee2eb4fdba528d59beff79ffbf67dafdb86ccc161c3fb0fddd9455da73e8b5aadfe0c9a3e2c29fcba27ddb1fa7a50ca84573b38e78daac2c42fbbfd2f1cfa98e9e130cfda262e0ab55703dbceaadcfc62ad29d95accecc0ad50dfee8ec449cbd8ebfbe0777977cfb35d3f3d38dffd53ff6d483f951bc5fb98bd46f57079f32bf8a1fff124f335a79d6d31feff9ce9fceecddf0ab1a8ba9339a5b5eee8c8eba416d3ceba25a2cbf577cdfbd8122a976cbdb4467f575d6dfcdabf50598db028909fcac21d7ccfcbf7fd4cb3e304beb2260ebcbb2fccaeab65b9d592cf4d1786a84db39887cbda0b5f14e17576124a696b9cc32f3786cbd90cf4ab4ec3ea5cfa78b5bbde7c53feeb8efcbc09bd5a4fe8bb8b4b4f6a77dd0ecde2354d9cee7bdfca0bcee282dbc25f5931cf5effcafb38862f8ded3ddedac0a71fdea23e50ff1f72ef273d80dff32afcfffa6f773dfade7ab1ccc828d6edfeccda0cda2af2ecd7f9b0d8fb5c81bfdf55aeae615bf6fe131f289d03a8fbcc891e348c3001dd69038804403ead326b3c335b7d3bfe6cf63efefd760c37caac5b2f1821cbfecdc97aa0e44b93ca9eff9ff38ab6fcf6f4fd1caf5188ad1ac2ae26d3b0cffa2cba0e6edccfef02eeedeea6e8ceaf2d8c1eebdaecfbec854fa42aead150fdd39d5de2c8b57d3ef51dfa5e1fecc5eaf2ccaf2effb32a17fad3c6b42d58c6cc6b33ddbcbdeda18bec057de5f9c88bd111de9ca2e78a5faddcc3a00dd4aa8d8bda6ffd72fa687edff606fe6d037fdbf6aeb355af2cfbdd0bedeac196f8bcc40b1ed3fd3c87f6a209b70bfbbbc3b5a7c13fcb502ada4b02cddb7dc9eebae2aa0ff94f8d7a7866bb43c4bcc7ddcbfffc4640654326fab4cd0ba0457cd3ecb74c07bc3ffd0dee632c3daeeafcac93c0d5edbe9c0a56fa68a677e5aaedc3ba5e2bbfdd06f7e03498c1fd3461cea9c9df0bc300ec6cd8ae1ff6c2cbfe0f8290e1739b8babbb91032fe7aab20c9ca431124592f357efc7a892605caf7af9f5ea39939fdb83f8cd42a8debbffb0fc3c5dbd72e9cf40720ba175db1eb68da563cb0aebedefecda1be6b0eb0affafd26b6fdd87aaf5a1e0ea4dcba2319cabab596ff9dde5da1a9e8dd04fbaeaddacbbfb62fffc991abee21a3c1facbe9f561f22aa1ffedb8a1eb672eccde22244eafef6ff1d8efcb50ec1c28635cbefaded98cf2c260817b6bcd2bdccf783a5d694a83303fda05fbced36033418c06ab9d9e20f179cd1d2b0fe4cc6cfaf04ced9e712c28d7ce6fd19f2b4a05bd3c216bfe6feda5fadfdddb5afac7de84dde9ccb474f18a1dd1f9a34bcab4ae1b9f6d3967d4fabc2f5a7adfceea5692bc2c8eaa6beaf6f127da5aa0ace539a5ff591cd7fdf543fb32fd976789ff7b9dcadccf4df77d9a5dcbd56bd7663e77afa8b4fd5eb9054f3f1dd710914a6a6de0d499cca39e4df1b157caa79b1f7b13d07618cde9adfd089fb4b1b304139b7c89d2f5674f0eb5ae9c6ecf32740af602f5c5ddca550baf7eb1f86a2b5bdde47cb9ca2a12e809f7034e3ad6c7fcc9742efc1eba7b9ba69d93f3f0d98b7fbfed64fbb0f3c7cc94348b090bacd7fe75c7b4f9d6a83bc40cc5e83e12fc2c33bf7dcce1731933d25bedcdd6f311c7f99dafa5ebf250cf24528b3e5b26ea07f7dd7fe5f9ee2efbd3abf55b9826179588feee6efdf6bacb9d69f8c39eda97f0d9ee28ad1ef1fe89cdeffecad2cea5c2604ac936f0ba04d1df0ffeb8fbc9b42627ec459cc1ea35eba8bdb299ae1aa29aec23f3fbdbe86affabc3de7cfaefff0bedff5a0e9ec4f08f288bf9d575bae1d2fef7332bbd5aaabc7af61b81b6a70a87fea1a430825feddb5f75d23ead515b53020dd2d3ffea9c12ad1a8667ebb8e1caa6fda8f6da2cc0af3261f86bd8defecd0f9dbf5e0cb3dab91d4d59fede9f612cfbdfe396e033ffa6dafb9ecda8de3de319ea0edb60dcb14fcded6eefbe2e0dbe41ad7ecedfc5cdc6afc7b7b0f1de3cd680bbec3c9f400db186ae5239ea2c5488eadf78b3a99ada5b857fc01946afab4ccae0e7db65a58183df5becd98a9b70ecbb709d4d2f4ac2e9899a8b71bbd34379abd126faee09fa428ab2bebebbbd4a3aafbcfd6b1bb0b05ec1a43cbddfb1d3b992369aa555a89a47e072a274ab53f02cf94a3da83daa81fc9e3bbf8fd9c0ab5bfa39a1ee72f87bd4396b6b12475a0ef8a68f5bea4b31efaac9c8fe3b1b49d78cfa39ced7dceecddbf8eea51ef8b2602aedeb02ad5597108b712c638d5e2d1ccbe3a6410b4983e52fb940abe4d3f3dfaa0adcfcdce252e3165bdadc071efea5b22ff5f1e51b0f8cb58065ef4ba7a1cdc6c2f033bd3538cab0e750fefa2b5a7127cbff6d58fd4839c43af579b5c82c114acaa5fad9dcf46ee3dbbfdb85410f1eee187652638ef733fbc5873751fcdad20240f23cc6a0bf5130f0cff5cbfd0c80fa2a5fc306fd0eeeb7afec8c8c6aedf806b01fe0a65a49960e5d5eb13fca1eebddddf3756e0d684fcde612c233aecca278b53f76a8b8e747a9cdd31f0adbf1d5fbe2a938e7aaff6cabacdd5aaa7f1ffaa6cbcbed4cdb37fbfa2d5bb9d6c150181e22ed40efe1c53c02b1aa9cfe3b68f4b353dc5caa5cfb9d5ebeff1e62b3ca8ba3b43bf0baa81fcda8cb06cf3be04cab9e2fccbefe5fa4f09be1bbcdf0dabe4af455c9bc9ded5370fc8a44fde8ec96ccf5ac3e0c20d2b9d69ed12b87e7eccd9e08f25f304cee5bbcd41b9beacc3ffbe3ec989d9faaa0a11ddfab47edd8e85e91b52bad037969ce1ae6bb4f28c4bf511751af591dbb317112ce691fdc2be1fceaa8481f6adc4fb43e68bebb0d4a93b77ef6a07d3edee5b20e56aa4abcfdcfdff31ef23f2a7160e00ffa3d8f8fdb7acd6dae3ddbaedf76c2d808eeee467e26e3f04b2a553deffcaf8a7fbd746925be42fe146a56063bf1feb33cdc28bbb0ddae9e8a2bead0f27b83efe8dc1aaa5f6aaafb6e6cf57dcb0c3f2ee49d4ccfc66b90b702ffccefa509bb62faca7bda316fc7aef9c9d86befadab0571bd6ccce31d0f93f7deab8bcc716b6c6bcb1b4dec6e92ed49cd9caa259ad62aaac6cbdaaedbba55b42ac90ad3c213fe0c59ff3d16ffb0fedea3f910a45f69a1c3dfa5ef63e8c3af12dfe5a9e211fa92d9ad9cd1fb580ab50d1afea6c2c3d3cff5ecccbce63d3bad3ac18ae50b0f166230bfc5a582aaf34adbfd05a9bc63aad7dec2e2dbe3337c96ca3d207de0aceaddcf304fffce4c7beda69d9ca7a19ceaffaccf3525aaab7f3a1bb3e6e62777e9cc67ffa4da4e1e52d5e89e4564fe4fc37dde6cbf1ca98cfbad509ef1df062f9ecec0ba27bbeedc6c947fe844049a3e8e97bb2166adab6118be875b3bbbe75cdd4a7f57828c6e0b35270f257e3fea36d65e51a45431c8995e15b78b35f7b1bb6faffdf6bebfbfecd3db007ede82d83fe6b81e73de58d93b6ac4a4a7bbb9d240fb80ffdbc9ec061eaabccf361fc5d3f322c8a5ccb6acc2c0c8bec5a2c5c341fca94bc0c5eecdc0b08707766bda0d0ce2fa10b0b31a9aecfbeb1be9c5192fdd5ecf683b1f69cdfb5fdf6c2725135deda035c9a8bec755af712c5dcbfc40deeb24f8324c06b2e7fdfc74127c3a4ade9666bbb115a05fad0516deb93bb9dfbe8828703cfe3f5b40fefe9d5514b06529ee306edd67edb32d0bcef9b027aac9dfdca24f1ffa62beb1d6ea3f77d264dfbdebfd82fcd92a9389d7dac3dbacfe3becdfd2a784f4390c4a65c8a6138485bff692c001dfcd1c6f87309fd9fa4bcae9eecab2692731df4e86a46263295ff174385ba9c1d6711bfcee99fcebb9c1cf5bcab1ee5f2345e6cbcefde444c8e0066e6fdd4e2e26aa5bb0dcec4ecbdacf4ee920ed19dee6ec62cfafd88ce278d12f9dc4fe42cca5dde597eea4cadeea986efecb2fd0fbb438e9f6c1aff99f41aa46937bada8a42da9ac31abb5edbdfabc3514defebf88dac9e22a2a5bd031fb3014b8c07be21b0bee5cfefdaf6acdf4df0c8d42fc0a3a0c9fdf67cda93cd5a6f181d724da2ef31726abbd7eb2de463905f3eab2ba995a1b55fd09da580f09cfd9a4bfbb45d742dd1da36c2dbef00af73c5beccfc6cdcf1d0afef03cfe3ee3daf0e7433b5ee5abbfab3570fce94c7921cc75dbab70d3a213f8bfa10c7af3bce8ef5aefb3adeddec4bde5abd41baacc1db6c6d24ae13b8245a1dc57eda5cde15daac8675bf3c2587adb1eac70772adb42a09061e3fcbbd6ed5e8c0d424fb2ac589ba7e4059835a95950bb25af3cee7edc15fcda8c31365bddcc22ac1bfe1cdd5cb22d5b27f1d0ba9eeabf84db0cf0e8cacaad7cd5eee4d59dddbb1f3f02ad6ddcccbce4c00e8ac7d559cfd72eeaa9b67c89dfdfdadcadff7ef23c0a75eab56f5f5890e80b37d943a87cd4d6f2ab383947c3db180bc9a0b10fea8ffff94a8398af31a2f3a9a058fb22dfbb3ec00b5bdfba5fee78b0d6f1ccca41c0e11d72de9ddf1ff6ae29b47503dee1d73b3badee1b3cac974a636e5a9ea8582fb25a2ac7444bf5b615821fb7ac7fcafc950ccf6a0b5a3543735b80ae527ded5e8996c3c9b8404a59f5a4decdf41aa076ee8a8b6fd26ea2cf01ae1edba3f46d32b3d8e7c2bc1c5b6a8fc1b5c6ba284c867dadecb19ac211fb25abcfdaddb2f9a481f42bcbbdd45f20feadbcfff8dd4c129221c8b9dd2daafce6ab72fbd15c9dc31ba63baddbfc17c94b003de1cb0faf9df5dac707e6f2efa5efda0ecebeea14a9cee696e9a5ecbd4298a24149ccc7aaafd7aedf62f613ea5c6c668eb505cd35d3d54bd1fcdd5a1c75bbecfecc6dbca88d8c844fdc842a12f9a6d29cebad1adb6a5acfdb0edc88deac1e02bf1a623df7aefd1d5b71ae42f72154906bb03b05c2bfd267bebe04c9aba47f58be8df8becdeab65c700ea96abef64ae7bbb1d364fdc0da6ea97db855efecba2cef2c388b4ef217753bec2ec0d88dc7a456fb9cee6beed1dcf7e6bfea51fade18a8af87bfe0b137ebc0e6c69a8b0b5b637d391cd839eccd889ec32ab0ec1e12dd8a8ecd85ded77adaaba9cec994bb6bb8ecf777b29dcaecb7dcbc2bd03b44cefd41c0fdfee32d0ec9d7ea39ee72fce9ff47c2e008eb51e5e134b7bf48a09be9a0bbe94dc5ca0debe599e9e5b3f79b3a10bcf6f0d95bebac6b30ab028e9b849854a79bfacba9a2911cfae2449d8ae015a720bcdb33fcde0aea4b87cc0c5abd62c51eb8e89454049d83efed6cec2f7fee544dacecebefc0acf6c6ed5dba9f4aa1320ade5eef6cc8aaec9a8db90765abe2cbdee02a4c9818fa52b1d23db8ac0d1e6c7de7b6247f6e7adcd12fc6b1df6d63d5dedae8710e42ea8176ffb2d41065e9baf54cb6ec499dbf4a2c76697ac9b0ff65e02f9f34cf4aa806a065e4f7e70a41668be5ebeb2bdf98dca4fbdb66855d5b1d8f6822f794efbdcc9e56fd2eeeaa3e1e9f07b22cf5a4ee1eafa2a7aeccd5b506dfca5eb0d4dff46ecf99db060aa0afcf8fc4d9e00ffb5ec2eff8e06681cfdae57ecd7b1f4be36b23ea5bea3b4d7aedb42c7c483c23d03e835dcfbc16ed9eba9fe7ba88ffacfcaf4d051a7c21b03621e7adad811afc34c7be8cb4beb96ad5a262bcb2c3d7883fc0f0afbfddaefa51edeb0fcc03e04b35d3e2c0df3c57d5d51fbe48e2aafbe9363ecf61ded37835b1e133bd4c6196827ceec7cfadf365b5adec722d4b45df8883abddcd3bbba9b3246d1cd0b5baa8d0f33afd0eab91c8fb9705d67b3081597f8ccbfdcdfe94a10ee9eafee2fbc9dbea077a10bcc6b7bb5a9cc6eee7abda39d7e00bfadf783772c98ef13f0cd2dca2a3ad332cdb4634e988b21aadb52d4b5c7ade2ee0c4d248855a7ab174bbefd396547d4eae4be0406a31fafcd2df2bab2c996ca7c1d0c01d15b6b15e3afe553dc1cd675e21ce8effbeaa8b0aa38461e6bdfe42f47caf4dad6033e0e6eb09d18b32fba1d5a5fdd39fd6ff612950c1a7f178f1119adda695bae8d86bdb0c0ea853e1add3e044bbc8cc5fc1df87f0bdd5a9fd07b34daac5aab1dbcc51e9bbc1ed5fb9e2a542eea0fbd2450ac5bd9d0b904172fb3dfb58cd77ccccdfdba6d2c9e38cf0a2fee5ff53c3ab50b78bafc475e00ce7e5186fddcef4cd6a9b5c2decfcdc3cac26d6c6cc0a5b19560ab4c4baaebeee34eaa3e8e5b8811decf8347abcd025ba81063370598a7589b445ab79f41b20bcacaae5bf6cbffa7d72ffccb2cbbb0c56e4860aefbf19d3e6a2bd567abf399d0df95aacf8e7ffb3ba3d3bdbb2fe2d4bb7dc604d4fddc81ae01d9e4bfcf0dd45ee7008d71b719fff55b379a8df907c53bb43c561bbdbd1e452afa7ba3c1a4d911ac2ff9b259eb243f72b816af0079e88ad20fb2eeabc14bf9ff8e6b1bb25ac9b2dd1ea958cd50aeaf59161caaff06cbdf9a4ccba4e18ee8a9ab7caff67b4e3b7855e9b5a558fd06167c962c58868a919a070ba4fac9cbdbd4af24cccd58208921bacb8743f17ba776c1bdd0bbbcafcf7d0cdbcbd7b009ad7d1ae88fff006fa365c5b1dbeba9fa9a0e9dacee3b164cac609ff0e0aef68e8fc3f16cdf6fcdafdbfaabd8abba1fe75fc7bf34eeadf8c64cd02d1ded5724da2154e9cd542a1ea907c673ad7ae7e37a9b4fb92aa976b84a39d09feec11a266bd5eeb9bb5d9ad07ee309dddabdd4dde0eb8cf12bccbdddc285cd23c22626976cc5967ea301adebb6e6eec3598dc863faeedb1df05be55c69c20bc7dda588fe8ff2bffde6e6c080acb9f83cbeada2cec1052aeb53ed35459c2063c98aef9c8feb04ff6ffcab9fc0d8cbdc2dac67c6f7d66db74abedfa2a61cf9a9fb11c3d228f8c1ed6823e3ffaeabc540f9006a0df8d1fba73397ec5f7c681ad8f16abfa4249da7df2dd0c67ff7bfa389c1eaad6c322be154e40faf13aaee6ed9d2b9804a82af2ee6eb17eccbf7a54b4e53ccdc4e0f7fd28c048ddb74ea91d9cbacbcada3beb82deb95efc095e0e9fcb2f4218f4f106be47bcb5d3ceec38edcb17a3e5fade27ebfc3b54d23a0ccef2aaaab9438f8efce0bbef1dbad649987e4906fddcbd9231af63bddcbffe0160edd8b4a3fa56f6df5b0b1e8eef9164cd5cdd71fa3fcbd5769ecd911aafb782c4b75e0dfc3caa36ce14ad7c3d6cefe2a25a6a8ac6ce7b7eb44fedaeecede51dbf7368baba94aabfbfeadc2775710bb57aab6d35c2d5c4634d04bfbcdf47ca161b2eb922c2deccecca67cbcf55ed6ec8ffee94c6c2a127b46274ed32e6dcb83ec81b9cc184aee1fa6c367f34ad35dc4dbb26f7a597b8bf6b0f18a9d72bf5d1bb8deeacfa88c30dee92ab68a0dcacddf3fbabaec3142b6501d4b6bf2503b79df6e4f8b311e42db5c8dd6bc1dbf7db6ee56c2ababadd2d28de719f1dcb93c4ebc71fca1be4c572cca51c72bcaf1b0d7c05177ec7af67894eed2eb04fdedf0d217e9ebc7ef47ded9cf27dd6a4b67328e82aeea20fc7fddfdb9b56faea9abe10fcea6a8c339030d2b518968fa2878dd4e1b133e9ba8e090760bd72ae17ff0dd0325ad3deecf81fa7f1e952696ba7ecc9e5edab3b971940d80ab5114bf6098b4ee90c04bbfedd2aaaab2dc7beeb3ebd802fdf1caee1a0a0cedf2a5dfa0ff3c2c67c83ffe1867a311dbd62ecb3795dcf5baa1ee2a4e63f9724e72deb9ff1ea472fa1fbbbacbef85afe9bae7e85b5acbcaafdbacee0aa8790d6f390fc0e1567aa16c56dbbf1fad6fcbc90aeb74eb61d7c09ee57a54c209bfd217eced632464b46e4c52b27dcd9aaacf0abaf69185f9bda253cf6d28c20f46cefa3bbc45ed79adbc9effd460fad4304a561ef0ad14fcf0bbd930c3deb1bf9cab7c1d5b9da8077bfbfc11e3ffdee5a88fc7c7dce5cdf1ab5ea22fae25476db59f88971b7a6dd8f14e7cf13aed9aaefb73e2ebba2cfae7bbd4a0d7cb2c1622c159b8dd43a75ed85140bda0afbd79dbc0c37e49243f0f63fec9aa1b1ed0e293b8abace3c4edc67bd9dcc5d2fffe4fcccbbd97d093c44e14dd428e9eea563134d6aed0b698bbcfa01feca297abefa8da4eccd8a6a5ad8ae99ceecdde3054a56caf77cece6d62ffabecaedbfeb0340036b4df96df166d4cbce4672bdafaadfe126cf9bf0aca7c7f1df89bdf1a194decb17e898a44efaec234ec72799850280ffc93aabf0bdbcfa3b0def135ebce2e62d6cd52dff7c23cb35996a8a4ba85bb6811377e7bd3c15162eddcac337f99b4e1c535e1565f92905767da2cbfab5af020443beed376571ad736beeccf3afce3ef5950b1f9a0b8792b948c2498d0e427e62a1c2c8781e93aa29ad13ea4ba24cf0220a5165b597e1edcb9c2ddb3a54471dfbcbde5d5dec198cfbb94f9dde8f5c9be9dddd5ff4bede64360f28558bbe6dcc8ecdfdba0b551b04d3fdd11629dc36cabe39dd8d8ddef0e71b4df2fa2aef383f0a334153411bfa8b7e34b24686faa04a4f5dc8cbeb0fd646ef4bb2f67baca4f150e2a16befddf3ba1fb9ababc022e0baf6353c30c8fe5050b21cc19bf4bac5e03cb3daa2e4f28f3acf932beff34e1adc86dd2f1580120dbeafbec08b1b0ee8b3a60f2cf2ecddea8dcbb5efc8bde1e481ae5885abab2b89c52918fa67c53a0a731cc787c04c1db2aa9dbd25e09ddc38cbd9eff7bef31a4a5c50adf9c8fbeeaef17d6dcd58a6a4eb4daef9ece1264adeba5b81ac0fcfb66ee6eafe5b0e0d23cb8e4bdf2cda2a8ab213effa000dac44e130bea89fe82ffd63dfff95ceafa2c2ece8cf3adcff3eb0b76c93121794a94dbfcbdfae0a7fed33fd1bdddbfdf5a9befa0d611a3db0dcccafb75bdef8234ffb88fda822ac495b4d3cdd2ea3b2ddd0ceda5a9cdf64ebd8e50fb66706dff86eaab0b492f6720d61feaccfbd95c6ac8f9744e1a18c7ddcaa6ea32d0eacdbeb5be490e509de9b29be0ebb6d5e8af0b9be99cbbec91f7494a425f5a44d0a9c660d1d5770ae6b1c1ced9112db0e0d04af2cf47aa49c1dba65de9f3c6428da3ae6fed68dd8e986dc4c1f950e4aa2cac88bdbc9b63dacf9de13dc73a9c006f4d79eecdacc196b74cd8cd05d5c282c90dabb3c1df19efed0c535dc96d0b8cd2dede98718a439efa6a3da062a2b75e49cec2bbc4cbe9d2bcac4237acb619f46b5423cefbcdfd7970b3b04fda46f31ecb4e8fb6dcccaf8fdd7896a1b55abedad7f1a72c3a3d6dc38b8dd95d69fae1a03ecd5e94dda05b1cbe869d777ee1eb9cfe64f5a07deea07f8f7ecd8da18c7bddb57b9f6ac998c8e1cc02c2ec6f6ba7c0a89abb0be3662612b4ac91a363f03795ca2defea0cae4d3436dad0af1bb9edddd422fdf4a8cfe9d57eced5ed7ebdf6b6b500baf93d848fd35ee3d66aaa383aae47d44f5cc5c97cbd0cc9cade59fdcfeba5ed5b6abf0d2aa2bdaeee9ba8bddecba3ac025c25c9e1dd5e60de5ea0bf4ee47edb43291e40d04660e8d66ea3d38bbffc724f1fff1dbc8fd9f476cdb1a4cedeac2c697c35cd8bbcefda60ded2ec9dcaada46f2eb903aad72914c750707bfbfb2bfb7808b6c2afdbd7bcb8ecddcfb376f898a89dd9f85a4e051ecac4acb859a9deb60afeadfbb61d7b0ae11eae23a981109221435cab68edaabd3ea4d83604664ad883bcbe25dfd1956b1e1153cf12deb53de212f69f2b55dad976a696badf9cc4a4a2d76e8daa63eae6e6810bcee294fc2bd4a81cf99cee83eeafed6e87bad0683e17fa8f20d12dc8baafbaf14ad8c1a1393a2bcceff332ccdf0cddecdd01a5c90e5cabbfee3ab50a92bafcebadbf3f012daf0dd3c8b5b9e0ee4d6471a1ea07fd3ddd3a87d7bef38a629f334cda74cb9f2195a5d4fea09e5054bfa9afda2ed2feee014aa47effc3bb68c24ef2af3e4afe57b51e3bdbda709df7dc5a39ccfb74fff40eecd96bd09ee10270bed9e08606cc304ddbfce8f7b16f180614e4f6fde58ffc5d5efdcc283e1fe3dc28b4ca5ccd4c234bddc3f5a5eb6ebb01c7bb8fe03c99717b00f93cee37c9d5c69e31e2bda86f48380f2ec3b9cf095feda3c158e4bc2b3dbba37ded177e016cd05b7d185e0c912bcd7bbcda5160efdb3e3f9ca176bfd7df91dc5a066afedc4d5cb9d3fac0d9b9d30158c239ebec81dbad34ea33bdca3eb1104f9912ff7d8f7a5ff2eaf3f0be4ccad26dbf3ccad9e0cef9cad4db9abb2afa4606eea3e6bca41ca5a0da6b4f9e52ba78d6f558caada5f3fe84bed8a2ef8668c65dde3229a2afbdaec71fd00ccb5a9bf6f7f7cd2e228ded13ac98713c0c0fb75fcdb3eebfbe5039bf8a844cdfab3b223afdbef96045593abaccffbeaffbe4e7a324f8bdaf6b4f1ed443b77246bfdef5fa7ce3e79ea6af844cf7232fd01f0bbbfc2583400c0e0bdab18fa0f10ef2bdb0d67a426387cd8afdfccbb83dbe40466098959aa334cb12be8baa2e9bedd48552aa8fbc9aaaf5ee106adf54f82a18aaaced0a88daeabfe4e9b3c76a39ab570ce77cebcf3dbf4d55065ebfeeaf7635c04bb1b1b1fbdf00a042835db1703ebbf4a984dcf3accaee812ac18b94ae2d05dd4df219cca71fd2bcd2eb470812d613fd4245bf4a28a4d6d1a6bc2a74d9bc8b88de49b90fbe8dc9d1ace77b1dc6aac69e595dacd83d3fc66df7db8926baad08b0490dfd897f3f0f0fd04a615e32dbfbc2fb2bcb2bd388c989bafb3cbaadd6bbdeca1d17ebe6b38dccdaca9b4a4bb8aa79efae78554b2597acaaeccefdccafbeda87fea159b25bb8fc2b2efdf395923df142ca1d3b29fab4d9d28bc692bb1f8d2f9be133cafb5f3dfc36da8accfcfd443d5b2fed6e0e16fcbdbd3a221000e10ce2286eafa9cedea9dffa625cfdb21bf6eaee51d9bb4ee3c4f56ef1ecac7aaada45eb27ac6fbdbd4cb1806f1067eaa4cbaa0fdcac7fffcc19ba1d9d8186ae7e2c3efee24fd2f6d57cf1e491add5f47cbe4bff68113d672bb4a7f355d2de0e6ce7c0fc97e4bd13eacefd5ca7d8cfeef5eef3c43dafcc3eb37dde9cbae1323de4ee1be6dbdab7cddd6c1e2e5eb8ecc8eacced9d7bed9c6ebb4cbe9cd112f4cc61cace8e3859afefe6e140bd5e5f8ecaeddd6f53ac4b0acdacc5bfbbb251bac28ceefd9322e3cea0ec2a1f9dbbbaed7dafb70c61ed7da69dd0437ebf0e40de5855e80cce32f4d718f67fc7353b62a550fa7af48b8db65460d18ed01a7e3f5acbada8db9e6f9e5eaaaec88c555efbbba0ffaed0ebdcdde7df87efecc9d61e3c225c14afcde95c6f1ea374f83e2aa9beb89aa3c980c8052bb3e81d0d3ad5f2cc8af8f1eba69ac62f83ae088b3bebb19945dfefbb5e52a4260ca8d4f2ded26bf78fd5f0ad8a369affe6499c6510ac9f3bc8bfb1192a8fc7cb3eebefd87a468b47fd8d5acebd6f0febfbdeea40dc1ff3dfa9faded33f8da6ffdcd9d395c9178edfe126cd329ccb6aa956cfebc877ae5733ead0d1eafb612da3dd4869da5fa8b23eba063fdde0bdd764ed0cd4d69e3beb24c7fdfe26e0e2ebfb54706abeced452f95875bbaf814e661b588e7188dfafba3eac4d50e68fcf41fdbd5468f9802f46cedcd9d3ded3ebe072ed2ff9bfad51cb04dacf06ce7ffa2d43b4182a6b0afebac91cc65fbd4a35c4ab2dc38e5bf0ab5b3b4de54aa3eb08a5fd2f64d78b57665b0fa2ace7cce7ee7da4bbdf329eeb7d8e4b0c9583adaf340fa1ecebbf8c6045ee6b9de3b26e85a1c8583c13cf9dde06eefd067350eec8e86b91bb4aa1f3a75ca9c8faca5cb0cf85b9a2cb6aa66e22d0386a3fdeffdfa6a5aedea8d5d1fad1b6fdbdeeceadbdef781d2ded915acf1a5a35baee0feb9dce54b4f6a492639654fbb6f2eadc45d42bb2dccdc83bf8584647da5f4daeff54a95bcfbd6e1324af6cd0df1cebcdb7f0caea8813cb164a2ce3ddcff8ee6cfc6acbb5c669bdbbd0fe08c959f9ecf5f89dfefcafdadfdd0addaecb9c63dfa37dcb28840299caed58fdcbbcb2d77df23f598aeb1d7512bfbdbe5941fc1ebd6bccf459be236129ab7db60e5adf04bdaaadbbd0cc8fe43ed6fb5e895ca8aebd8afdf3bc5aaef4dedc71c5264a7dc9c7b8fe206d0de68fdfeb5c48cdec1bade8abca552eece752a0ae6fb0a9d7ad152cccfdbcc3868f4181e9c4ecbbad5cb48f728d3cd5e4ee2bba75f7f8e111279a41acc5bdc7ea9e376518ddfaef5102920628ae2ea66f5e4da6f7850d241e95da3bf3fd5bb3bbe905b3bb8fcf2bdbd508ba6e3a3d28369dd4ec26d947be15b0f6a6a82e9d3b6cd35e6ea9bdeb2160d23d9f0e5ca91def929ecfc6c3c18829bfc2d539ddde8dc36effed5cad110467bef2e6c063bc30c3ff5e560ae084fc1dcd2d2b6cf5c420b83d5e8510afdbfb5b2c3e6cd13bd8a690fe5bcea2250409c4da99ef3ee7bb48c9fdf029dabae97a13d2073ae9bab7ecd6b24644cd5f07c6af5de57ec2336d7dcfdb0dedf90393cd307a8596edb6b3dce434e5e7cea5f32df923c39aaaf7a1f0aad2fe8a5e69be02d0a2384ccc9bf6b44e10765cfd11d2cb07c40f0d4d4efe439c3b02e55af2ceaecf71cef2674e2bfb2badd5ddc9ecaf8c2dde042ab7d624ba9d3a56b3b0ef916d3f0b6d2afd83c6b9c7a5295bb3e8989ac1aaf7a279aa7f78ce9f07b5f6dc6fd4731af4d45fac39efd2e2cfcffdc4d7b7affafbf6dfd9cd2baf8e7e6efbf5bc137f5fcc2540e789e4f77a6eaec93cac28830d9b4a7266eafbfaf95ad4eb2e8ad6f918225dccc0dbfaee801c2ced9daf9dc715868ecb80a1843fbe5880e16a6e6f9b555630a1add7f1231fcde3d3ef10cdeebeb39dcdce70ddfecc908aee6ab47c0c401e85e05dde4e38b39f3b26cf48cfbeeaeeefe313e0ef0bb64b0d4adcf7bbbf1a00bcd8ac47ff10b0decfdd14d4c6dedfd0cbd9d1131deafc68e3fb1749c74c8a68bad34538c2fd6a13d75dabc89f060c85bbcc60364cf8dfcba9bcb55bcd062f34e3d851198e760ca0ea2880a3b8004f77e8dcfade8d8e7a868d74dfb97fbafde5cae0b7baebda98f003c9dbf0da5bd5709b5a5edacbf0d1f2ac71a6dd5ce0e20de1fd53aaa84c2ec2f8ae08927f958edfc77cab8ae47a210c3fb1bd4cb33aed6b6cacf2b4f5cd0f24750ddcbd2771b0c199bb0fee9abb13cdf1a4f97352b355205f1a77ab06533af5cbd508dff5eea094bbafff7dc9bcb29fcb9aced92c0eb9f88d66ff1520cedeb98edc1cc0eeea7a9fbe1dbed7bcd861fcbc9fa5b1f39fa211c8d3ba54ee7dfa0aac9ea2e46b23aacbaf8339af4c2e7c06ae7facab3e79a7df5ea1b752ce1db74fed02b8fd06ccc1ad05ef1aad26b6aa1352eeb767d43d263d82e0e4ed2c4a9d2baa6288b91dd024fa39b8cc912ab07b61961b5d702fec16cbea0058d68fde1b0e6d3ae6a3898ff1eb705cfa1b1dc4bdd31b1c1cddbac2eff8def7faff7fa18cb8b5cab2ddc6eaa89fc118efdc5b4b2ce2eccdf9f5a626c5bef9fbca8d8507d836b86b58f22cf1bd70cfaefb3fec6cb7f63afb29bf541c1d3830beb300127cfc76bc4af4fa8fca2cb72da1db0f0750afd4def0fd716c6753439ea4d1d0cb48a9fc025c2b48dab7e3e6fcfc49aae8a7fc3d3e913cffa598a803bca6bcea25635b5cb79e107b543c55dcc78cfef2ad6926e1caabacca849ef052eaaa31aa3bb9e5babfdf9b50b44cddfea0de7d2e68bb8d5ba76bd7699be75d44bfbbbcfd39fa3a2cb8f15aae24bcf5b0a58fb06a5a2fe28fb8f5eaadc8eedddf9eeabd8d04db9febeb8cff9a34c1f8aa3b53d37d27ddac025f4302fc34e468997d6f0de7b74312153f0c20c3fc31d09b744e7fe4ac79dd5293b24480ef1f5a11ee1bcedf3ca6b7bea4ee69a17a2a2a984e5ee67235e2b681d68bc1429e8bc88d02e329ebaae6ffc049e29ded65e4c09b42a15407aded8386a8d9d3b06c5b7ffe07750b13b1eb8b5a2022afa255e79fe328d8bb1dd861dbdd776bfa53f782cedbf6db93d06d056ced3cbb6e8feadaabd7d3bb4fc3acb0a0b9abdce1975b40414e37a052cadeebfb9af7c3ba4b1c4e04b09b112dedb13e2cf5c64f65bd4dfedd0e9ced63c1aeb3712af38579b627c31b69a7ed44e84bface3c5bccea84f8c6e99d375ce82deebca014369e29c9ef0a1ff9ecdea351c1dcd51ca31651fe61ede6c0e9a4ac3b805ded4cecd59d72afd9d9817f9b6c9fcfecb53b66daf398f2fc2c4add912634d9df2bbdaa555d92bc81cc2fa1a9a3bfeebddac1a94fb7bde5ad36f7822d5fdfe5a13572b0f545dc67b925b5ecd4f54b45fad26beed5dce3ac0d352a3a3bcefaaf018c8abcfadcff4f9db496daaf98f5b3e0a106b5efbf7cc98babaf09ceaf8e8fca57acdf81fa5f6aba2b8b6c0f0058c9db32baa6ebef84ed7efbe988ec930bc0dc73d63f9ba9efcb737ffb14fcfb91f11a1ec8bf5adc7daba9fe223a7ad2fbfbca60e4ed962a4c2feffcae98445c56afec573bf1fdfc4c7bd24ddea5abb26de74e22b251a1591dded73deeaabc6bc6c5aaec28eeb13f444acb0e66fb7a0b1bff77a1d0dddcc6a409ebeb36d85eae6fd6af1b6272fc97bfffe50eef60e1f3b7f7c8bf67a09b25def45f631ce8c256bce7bf6ac00fd94bee85aac5aecc9471f3ed11e307fddcc7490f28e68546ae6cde624aa35af0c5a6f5620efaddce62bf6d9ddc1bedbd5dec9d0debe0f2acef6c33dda26f8fe97aa6269e20cc346ce870eb11dbd0dce2da0ed7bb72af865e5faf1a2cad5dab88bcadd813d02e0ed3fc042b8c69fdceb29bfe5de3e3f91eb7f0ead270e952bcc29afdadbc5c3fcdea06ceeaeba8c0abcf1ea10bbc7b4c9fa7e722b6cbc4bd9be1366f63c249ccade33dca1be5ff5cb64b2feadcad030a3cfcf2ff60c6df106a029de8e3a1def7fcecfd65ba3a81cda70780561a08c98d1fa6aafd7babfbbad6f87ca82beea7dc96bf240c77bbc7dfdeaa6728986b40bf78118ee4b9d0a32d3296daff380a9d6f9ef1c2c939e515b8cf0fef7c3faf690ca8e955c2f4407971afefd9bdbd740fdceadfa0dfab8afddcafc21deabe1ca7f1acfc6f9aafebe4e7dbca427fdcc2ac5ddf23f0c9b4c53f31edfcbd0e39f284202b4cbc46744157ab85b9d1f954baacd5e3fddc69363a6ea6ca7fe9cafdcfcdbe9f7adbec288cc9fabfd7b4d4dcac8838eecb9820ee40e6c8c3a84d795661ab1d0bbba256fa984c058e0025eaf5db92c2cbcddda9f4c2f8a71c51336b1c8e6b0a50eabdad1bce8082bfadeed1e60a6f673a1d1de1badebdb9732efbc3cbd6fbf7cc2f1d7ec44e64fedb8cecee1c5ec88e1b6fdc28216d400ccc2cda15f920aaebafd1941bd8832b91104e962e1a477fc4be0b0cf0a2c5ab2ab7013c2bfe96ca8c6f75dce0b9efaca88efac9a5e3933ff25bae70bc7b8bbc7d17da2b81275cd20df80bb79abfbf466ff87a3ba6b7ef4e5efb7c66c56e2c5b7802fd8eecbd9b2d2cce751a3e1d5ad5bb9e10a646d203a5e94cd86ae7e2d60b58bcc3e0d9e9dc5d4c89eb6aed965eee8893f3c6d9fe844ebfbafc4bff2c1aacb18b254f8490f50de5acd841c5d4dcb9cb73f2faa227a9efd67dbd15a92e21fd0ab3214e62a2e2c9d87da19cbea4bbaef5d0cecfa7844ef657db8b6fa2fcaddfedfbc52e89626a707fe78d4aec6c0fcd1f36b5e875ba10da1545d9c7d55d7e8cf95fdcf0507d30bd5d2af16663866e4ddff2e5a8efeb8a300a8c7acdebacf988bc214bd42a0d3aa86f70900a0ebec328c223eb7ff2d5c22db9daa1e7fa9dd71d875b52f94fb6afafeeeea2dc9cfe671c80de3d9dcfba1a31e4de1fdf208fad81634c112080f7ed1b1dae2d8e1edfdb77f64ccec545ed8bcd59fd6dbc5cea3f582262a4480dd08509e533c1aec85cd549ccf0e52f645cde8ecdf90dc1ce2b3aafb3dcdd94abeceedba043d215fb7c934dddf4f5fdedf26fabed1cfb9dd04a7c79cab23c7383d8bb4bede1c932e7fccbbaceac7c96d3153bdfc09b1beb9c3ffeedd168f8c152aee98bd3a6289fea78c1c4efe8efeb448aba125ddf8ad8fdbbdaa69cccf198ab02beb950cdda58cfe66a77294badc9c9c8bbb32993ddeec24840a66efcffc47e396b51b1e7edaafbf77101ddeb4b53c7fbd4f4ef3648f37beb5d1ec29ec6a83d477fbdfcb401cf91eabebbdf9c0c71e8ebecbdab240910fabe437bd781d9f5ed4d9e96d989418bbc1ecc9db2be8b3e46afff9c9f7e9ae10a43bdb8eb0ccc8d66fff1bf514597ffacf30fef13e5f9cc84dcedd99cd55e8d4db7e2c7ad0c78bd786314fa3785af8157e1aafe2210cc3d151a1efafeaea5bd5ca6aceeba7a1dba1e8b89b17ecee208cd90be9da9cf8daf5a76a236facb8f53d2472c24785789ab04eaea6f5fc4873ec02f8aa985c52df4f2ededdf09a4f76c290f0c1fefb20e11681b05aa3850e725bcadd51def2b8e71ddb81e88f6f38ece8d5cd7fc6d3f3738f349db92f15e312f9acd248a768fb4096ccffa8bbeb15ad5954bd9d6db6dbff2d86ccaf3cfe437f98815e76544a55e49e6ac539153beefc8ead4dd1a46d1cd4acf9ec75c68d831aad9e2f0a0bee0dfca631efabced47459fd0bbadefe1ff1c8ba1b0cc0bcdbfe219aee9fb2ff19a53a8dbbd79ffe181c7ab3d50d7beea81bd95b9188df5ecab141d56da594b66cff6818a4d0c58ae0ec69ba7cb35a7698fdef6fbc1cbc61a5ce7ef27bdfed901b3861a63dc26e8a6e9d9bfb95554ba3be4f46dc5efcc979b8ab332dbc29b78f50abf07ecfcb95120357d096922772dde74a6942c3ae80ec8451fc90d5cf6be27c53df9ac0bafa2f0aaec1dfe7aa3b21d5ff34f8509496a2a5c2fd39754dcef8afbbff5ce2bcdca7ef1c1c7bcab9ce0dbecbfccf1e7baedaac24eacc9100e7361c8c035fdf2aebc039ab4a5df5d93dc6ba83ed9d8703b6f79c34f66acae23bb2d6fd80a0dad3f4155716a5cc04af2a34fdcee92d2a70cb468b72d8b4a0fceaa8bb17a9bcafacc04c647a1877bb46113646e500cdfb6ea7e1d0b2cf89bacca0927ac7dedcd2d71fad80cb6b42fdb0b3a7e8dc68d9edebfc6adc13b4a4dfd7b4bfa3c751d003151b27ed63a09680e5adf762dffba1d1eed7ce8b50de884e4b2fab7afceba190fe020ac8dc7fccac5c96fbb79fb4ae30bb9f5d0f9dc1a7a65d82052f039fd38bd2fea7d4477478e9fa015f41c25e0f3696a1e3de69dac2b3ddc6645c1ecb8ecbe5ece0c5aada72fdc5be1ebecef38bfaba6a1710a8e776bbe3d3b2adb3dc9e4d6db5c95e5fb12fd3562c2980b44bfaa0de47cc2bcb45fdccb7b9be58aa530dc0ecfb08fdcf16201bea15fd56d8027a4cbcbeeefeb2f4f2ce32c976f9891d6d0cb00ffd65acdd6c494554db4dface8cf5d001bdd7308a67dd34e38b6298cec14b1841da47bdaeab6cbae042fcbaeb769843fab9d1848b331f47e1afd5cf07c5bb93f36be72fab893f5dda18dbfaaca9affc63e5cbbf4a92ce352f3b3ab0a4ce6d90d1c59aeffdc606f49a32f76caeb4f5e923cebbc2f444ae27d5ce318c7026cc2631f33fa581ffc0ba2a2eac90abcc9bbc7f0e4ad05a9bec86c8b1bbbac335afb8cc0c38ddb327dcdb2af778b6c29bb8fa5224dab2f5f298da139a1ac3d1177852fb58313cbcc9edcbdedfeda2b3efbc3a0a49fa67dbadb25cc2b997873b3bed40749a0c7ef9c7b64f41abf6c1dc8483ba4baf6ab80cddbeb1baeab526050dfef8afb7cac7ad017a4cbe3e50b9b03b6e4e6bb4ebb3a1ad256951a86d7fc5bafd8d4f8d4fbc389de4b47bbfde33a2fa5d1e6bd6d3a85b5c423b3005ff7eef3fc1eecdca50f703b8a4ebaa3621eda6fbaca7c8d7cb0e4c3fc70c4d0cc963189cbaffac7438a1dde650e7baafad87be1d1f1f514d1bf72ba16ade89de134aa7fde6bd774daaf65bfb90bf0529e3af0a9bda6eddfe6cceae18e775ba11eceaeeeb9cbb23aff4bcea71f79f2d63efb707fbcd9f6ad38baaaf9ada2b0ccb8d5139d44a465a2c408b43346beff70eab6df006b2efcc3cde4748d26ed4aabfbf022377fababcfd2eb17a7181acbfca0dfe2ed1df080e2beb30d981f7a8914d9804a6e3cfbcb2ee8caaf2ffe9dd795fb253a6bcb5a0d6bc257e4bc8c5e0fbf12ad0e1bcbba4742b2fd6db46bbcfda3ef173a70ae02beb621eb2efe473c79a7af8d8fcc61b8fdfdd4cc88c7b35716edfcabeea6cad93651c66a0abc5d25aa0e1f1feee678845bfa2acdc5dc0eedbfeed07be2ef4b1af4fbdc9ed98c00cceeed8b951a9ddfded61ec3d75a5dc05bd6c4c0cb2e3c0618ddaba7ff185f8ac270ab59be19ab02a84286664094ceff6810e1e505a0aa5cc273ea2cd8ebcffb6bcee63e0b4b8fe9d440c2ff98b7bca7cdd17946a8fb6d4ee9f5f9ee8fca65188cfe2afb0cfdcfd4ee552f2fabd4d1cba7097adaaab0a63d8cf4cd21db6206d55fabddcefc0fd454dd0feaf6889854eec2c0bdd03aa8bf8ba3cd6da4ab59dc1bdf1bec9576ce9e4509cf04ceb2bcc9a70e2aacbbe1eb6aaa384d63b04afac6b55a7df12ff17d7e0ec46e41fcc93d5fb970d031a0fce7ffef1af6f32db4af15e0ddbf3e4ee27b71edffc924ad99d5d35f60abe7b697f46ebedfc38d06f418871cefba3cb477bf2e9abbd4d35a887ea7dc9d22ba42cae1a96f5e0e3da20deeefbd4fde40c657e89fc0a1391a3c59e356bcceba90d1f0afab1af5af91f0cc24fe6dfeece2d1dd7eff25b51681dc2cbe49cc04d39cf1f0d3620a59a2621a80986ba4f76dfcfa1205a3f09045c0c450afd1cbcd2cc13afda5b05df30f43afad6cfe9c9986be1b91c6ee9ad79e13b7471fb0ad03333a8c36a60d296b1be5653ba6e6aea8d27fabccb3c1d5dc0bf6a05f4657a070a23f0f28aababc74ec5e509cd0c4df19e1be302ef3e9ee26429bb7a5f625469f1f109bafa8b3cbaef33f2d992ffbd15c4abe7b92943ad187c40ceebdbcd9a6cacaa7af752a4aaf108cc7cdc214694d2fc87f6fd70b9ced3d31f0810bc2a0cafdaa6e0e1b2c0ec667e6bc026ffad0d5efece3dab4636bfd4fdac60c6fea8d96fb4be1ef8fe3f72f4a57e8cf985ee7eed2f5c4cdff3a47ff6dbbff014a4a9aa9c7ff7dca5b59f1ffd6bf58eca77c2bb478857e8eab9267dfdef63aa5bfcf84ea74fbefa421eef8af7a8c0c2ded21461a7ec441ef6bbf4d8dd64901d0f12f1c85e857149079b83fca8d11302ac6f712eead7f6c71b13358af1df2d271e688f2aaf3c8fba5b4b87b01cb49e6dcfc7cfceb9fddd6298afdd4afccc0fccdabbcbef20027269d6cd7448dd5bfedd743c021fce76b50826ff21469b24bdea3bd8d4692decc4f82ecbd5cef45e1eadca6bd9df88ebdd1fef2c82ee3ee1e23a1c49b6a26b898de0b81ec109d6a26edb24e3e5a5d20a79cd32cc9badd8bcfb83cba0ba29f6b31cc3ee423d541eaeb4e4f3caefeacf949ee018294e0bcbdf16eee6ebaf554db9c47b2edbdb8adea3eaca247a340c6a0cf7f31ae4323ccc1daf1a91c9cf1481e6fa12affcaca80555717e1b1f1a8c32aae8cdec7fbeb2d5fdaf7eead5ad92a7567f32e13c85edbee3b5b1acf75bbb8fb30ccfbac028bb9d2ca9aa6d6b6c346b4bd1cc8b56bbc234916ef453fb099aa9fd2e5adaeedef8f2201a86de1ef26e56aa2d48c91d4ee5deb10671f00f8be8a4d1bbd71ad8df2f0b675fac6ae4fc0ecea8fa7b823d3bb6e04e8fffa8dedce13befd7192ee7a948e271db52fb71c4aab81e96a72b04ca4cdb805a119cc76f1fdc5ae72b41456ba9f10adac7dbf78e76ee33556b7cc2d32303f265d33da51c2f4caccdea414fabecee3f41fab490e2968f44e7efeacb42bbebaf053a94819fe6bbca190d8b4fc3d1eabfc62a2aac14feedfafc1cbdaade76355b529412fcc2e4c98fb687aab44ce00ceeffc312fac0df06c0af9c8febfcb5fec6aa1767f1ed5f000f6a6fb2deb377e2fbb0e33fbbe7c68ab92a79ed0fda2ccfdfce2ebfd644cfec44db1641083b3e5eae961a049dd2ab4bf0f33c6c26268b5632a3eadd70c3bc6018e68ac9b1bcbab8572ffeb78a1185de5f0cbaf3bb1dadd217c0cfb0693ca3bcd4eedfa7ed87feef1e4e3f62a5ae0f9c3d5fb6e55c1a18ddef5b6a0f2ddfafcb1b8961871d0bc9617ba2eb7d07d8efedc10e947fbbc44ab7dcbcd9f0a8db39ece959bdfda505bbeb3ceba788d04964e4746f16aad227ff6b0d1ea99cda3fcf3bfbf666832f8a49518d4e60ebd8dbafc1eedd6e09d7e1cc4f7c9ea1e7bddcbabba3a96eb348f3addeb31e5df2f4bc52ab9fd7eaebeedfd1f33d990967cf01841eff1d6cdccaee4852f428c2adf5a172dfc2ce4f3ff23edeadcd501093c8b33fcf07cbcbeb1ffcacf3a380f5ff66559b6be8adddacefa6651dfc8e6fcc3f273c6a8b6dfa5ef8efab66cbe67efe0441753f0d713b82eefd182b0cd144169c342bccb0c3bb122b73bff89bfeff27fef797ea14ffef5815a6eed6b9b605da3ee74c39fea7edff0cb78bc7da225e8af73bddcf7f6cc7aa6b91c2cb117755fee024fed9b2abab96e1aabdca772fd5fa56dc5be0dd26fb5f5d305c63ab1bc1c9239fbded94cae0a7777b0aaeea5034bc405c01b69e3b597ef7ad1bca7facbc1e3b590ab8dc6bfb5c205ff72ba10edadc17d8cb2a55fad702bad30fbdddbdc5cee42be8af9cf6df43abd08ba89758da5b0157ceeca08ee2ac885f9fb09c77df14cbd8e5f10a2058bc5bc211a421f64754a8fcbf0ff68d372644e2b841aa4af6d79c4fd0bdc47c0d42f21b2b81fee93a22714fecdddb38d4aac9cad621ca9ea6fcaa67eed2dfec95d38d229ad7c37960f0d8dab16f768d03ee604f8dfb31d4ca42ae05acbfdb3efe3caafc3df74a18afb5f03c4ecc2fc34aaadbbc8d187eb0e4eeb2c744affb2f75f03c8da6525c9fbc4f0b477e295990d8570dbee425acdb4a6dba73aaf59be82bccb3d5ff2eab0ca5e9a810dc8f6bb58a8d3f25a27af1bce95a4eea2fde0430a88d55328bbc70c9a8cfce7dadb0e7c0e9e5561d1059cabbdb1aae5c2d7f2ede3e1cba0dfcbb6818dcaffbd36f7dce0386e0e6b0dfc8fb5b59f7e06e39eca3ee953dfa4a0c506ee6bc2faad1a9e1f1b320cc0201104a6f39cf3a27c6e455de4df1d2f3f3c3191ab7ccc1eacbad070b2d9da4d0d81f3ce5dbb0f94fc9cec0cd0d0b3f2c828e6342c7e715dfac0fb890c17a3bf31b5adaf5cc6e3fe45fa1015a39f53dfd9dfadb8af6500e95a1eeb9e5d23dccfc3026da71ae588b3cbd472d1b122e6ea05ad5e730cb482fdc37a368a2ef74baa8faafebfc7acabd0cd70ba1c7aecc2ffcf0690bbdf5ddf533d7da0a3601fbd39aab1aa86ad2bd70eb46ea43486fd7abf196131c7f813f718a3b0b9eac9eb84ecd5cdb7f4ec337849b04abb9cc08464bf7ba8dd3bb01d7eede5b6764b1cf5b93cb83ef6f6040695c27f3ecbcfd6fddc72c4c8c0f9388172db3d40abb8df374dc3d5cae8562a06abafcfe0dec03b72f60fffc6acbd1e787fc71aa6deadea8b2bfff6a5f06b44b001a911eccd56cb8e95a1aeef4cebc6c42a9ef442c1bde98e75ae031e5963bbbcf6996b45721acf7d36c4d8b73ab5e6b3805325d13aa83daf12dc2d1d6cbdfc9f4c91bc8bfa5b0aae69effc41d3aacfabb25b772c40a9af058bfbfbbd5f9b19ee5f79a4db9f2bebfc6099e4aaa08bd82dfcc2de36cf0ded3cca8cafceefcebfa893adeaab8c5d6760cafaa9b7f4f7ae8960d2a62de48ed8aacaca00eee9b0e9daf01e83943f8c3bc755f18a875cbab6d481877a05da33ac7d9bad8daffc7551ad09a0c5ccbffe8bc506c1b3c1715a04758be51fd4fb4b9cf9a61cb246ca6affab96ced5f57c97aeacc4d2bf4ab9d1dde4146dfc2cf4c4259b4e74d1dfee1cd1d2bc2b70e4fda2b7e14b1ad000fabc93b6ad73b63de85fce8fb5b0e1bdb161ba91defebe2dbfc7bb56192b7bfa29e1efe85a84b87a1c1f7fd1e7a094488fc344e959ecdb2e98f510e958c1d39faafe348a5fdce0a81cc481f02e33de030efd37c53c6c27c6edd8e022169e556f8e8dbb61a15e05eafa06d7be683af4f8cf9cb4bb6f2c52eda28f9cf8ce55f92996eae1013326ddc1ddf7d47f20efb7a98f2d008c8c882dd5a69b46e8db4a9e3a8f233babfabaab9591f6b38f5b320a6f97a4ed3dcb3fea4e46c2facc8f4c8f23ef93c40b0b97a0bc4f305bc71e8faad8affb8d8f491dfefbcb42b37b1dcfcf4a51cfde72e7ad4d3b0a42df75d2f9bd85dd7e332c0e0e59cf29cd8df570eba6ad054dfaec3869ef63eaa4ab2f779cb5c2cf9fab789f9f5e6927c571acbc2bbd4ef8ac48ef2c45f0ddc6a3f8dc3bf64de5dce3dad35ffc3bff77dd76ff80aacc921bbed21aecb6b20fdfeba37cf2edc8b249bf0e38c05eef58e6075c77a7ccd4efa4cbdf5cbc7fbdc7eb705cc75fdb1ff0b304fa3da997b4f696a43f6b7f58ee0dadc7e6deeee8da075249ac4b4cb86f4eaea67d6b7be50be1e2bcdad74efbfb6dcfaefe6aa0b40b27ca6a99cec98e34439a5309bebfceedad616f2f6ceaf28bcb6bdcc48e996b5f5448dcca5ca9ee8c21afcfa390f9bf2253fce5835f595ba0bf1f5fe2e7b41252e6fb9d210f48ffb46e5680a7afb55afed9c11bfdad1d2e6eca509efbf9aec18fdea7ecccbfb9daad9e77fe3fdfb4b0e3a69a234d0aefcbaaf3fcbb45a37845661aa3a17e2e1f5d7f4715fda7b56d14cfce6ac33f7e3f4f6ba7deaadbaffdce9c1a10eefcc7fed0a50df109b4a1fe6e4d297f65c74cc4a32323cbecf86416435caa6e8ba7efdae91ccbc579a53ba8d4dcc5e95df1a463ae4af9ceb428c80f0d753caa39a02fc6c07baed19c47af079ad8b6f4abb3dcdd07fd5de291a17d032eb09dabea6ae97babf7680dc22aeb6ffabc7ea744d6cbe65e0cb14edae1dbbb628cf6e4ff5b43302edb273c8df730f4091c343f7f4df98fb4f6d5afed6ca4f025709e6cb875d4685c7ce7ffcc3b9fb44d4f25ff6bbd3ed4b0b5fa6ad6b98d4ec1eb063c8becbd1b7f4a8afdfcf4caec88b0c8306fbfeadd0e62dd625eed22d85ff5cb1660ddb77d12bf4db53abdb7dfd6b4fb6abe66f0497d019dffb64f7df13cd277a2f5fbe88c5e65d57a1c5f8ecdf271aeedf1d48b657dbce412ea7f0be7b4c87b296ac66b084a47ea2d3d23cdb410cd94ecaa3af15cfd868d3f64eaceb04c72150741688bba935616a88efe625801df06f2f9c0c582feebc49f94d27eb6ce8121ebd9f52865f2fc21ef6e0a25b01d0d1efdcd306ecef2edced4cb3cdacc044bcfdee81cd7d7d617c99e6bc77b7d50b1da1f42dace1df516eefa77dbac8ba5c6d28fc537e37cfe1d20a9ac8dba11e60a5ffb4dabfda3ae6a36b5aaa15ac8f2fc02bf9b534b7caace0e938fef1dbd75dffbffc143b1abce29fe0dfa9fdea7eed22ef6fec7e09ab2c59d7cf2d911363a9a3bde9bd174dcb9f69a1b1ef19ef0aea516f8acfc5ac1083f048fe9761331cfc6eebbadab3a359c05bddc85e03a777cda2e5a5473c61a91241b1dbd8dc0bcd4c24a6a430db2bfb33c3a1b4e3cce8eeb76ead99d733caf6a55ebf42ab89698fc51a5e46aa4f24c3ccfcf78d4c58d9adbf9a81ffd8ffeec3f6a5ce1eb2118fcfae9f8f2adadf38a77a1bdd0bd34c97ffcc4ca81a17ae51d45bfe15f0facdeb0f95b8841fb90adafe1eef1fbcdada91aed2d98dea825df783172acdbf8cd3cd6cf924c933a4c95c028cf31be9fd6d23cfcd352e1c699ef1cc574cd9f419441f2c07652da974abbe9f638ad2c0bb8042a49f4ba66add2cbfbccbe2f79577cacdf49baedb3b7feac0ddcf4aeb33a1e98a0f09491fa6bcff5ddd5da99ddf10c485b513aad48a66a072b7ddee7c58cf973fada8a4a66eff816b0b6ee06b9c46bb04bea9b2ccafeaf01edeacdddd81fedb104a65bca7bbbf1eadda6b9da84fceac5ab0de34ac28aaefdeea7da626b3bc2a58ad8f2edfc20a1f0deea31bbae13ea2f79593d8eceb8c1af0f122274fcb6d56beff9f68b07fdd15cfa81208ddad89bcb033af8eba826f66d51b1fef2fcb0abcabe4c717abee6fe71e9bab0a80fc4dd337dc8eddb7ee3d05aac0e3e8fb0cdf3a6d951a8dbc5b4f9ba4f712af0d35ae25866caab76ddde931c0aa037dfcfa202defdbbcdd94af3bfdff6eac1c37e7cdeeaddadbd18b59ed8de85e2ee8bf2fdc63bef0cab71a66f5cd26b81dcd6cdb001ebb4fa204da0ddaeccc5aeb0cc7b18c9322a6ff3a400b1bb0efd1a07e782a7d7dbf747d1fb40a792b56f63cc78728e08baf5d24ca06ddcefeea2c88d11eb26c8e7dca5d5b7cdfb30dbeb50d6d7b8c75cd94dbeee8a588c4465b6cf62d2fc7fee82f896566afd04edf21d2b8bcdf40eedfba2e3b0b15bbc980b4d4bc16b0ecc5cac5cf8eedeb3c34ffdceef064ff534da6ff1aac7b6fd8992ab2fa1d9bc5cfb71da6cee3a2c49adefdd7f67ede1cbbeea7fb3aba19cbbf6e8eda74c115d7b09bb5d5cde2fe8a6d537adedfebadc7bef3cf6f16f76bf6faf00f3217a47669eb2949ff107ccd2f16bcf9c963090d711bf1bdffc55f0b9250c0a7f121cde228dca1a0c0ace0bfee7ace128b0aaf096e25fc6bb4b1a01abef9bdedd47d02245f6af722c3ab8c97e47dbeba79a9e3abd448f8e5f12a220c134ebcabeace61dcfebeaea4ed4a2f95ead3aaacc74f56fbd9557bf23a31b0c9d0adcfac82e78f402e115d6cd2b9a6e79d4463eb2c8ca04be44c1006eb57e4ad7f0c1dc79e6aae16464c1ed776204176d8efcbc0be1b3c4741cceebdf60e5411e42a3025543ee7784ceeba9b79bb709c5cf00fafc9e4fdeb5c6ab8c1a81fb5d734bc1e0b2a0936dc8c7fc03bd11df6feb92fb0b488394e84988d05df90cdb31c3d39ee7bc5f0a4ccaa82012f1a8fbf2a5cd1baabadc9c6fd9d779a4b285ccf889aa1ef9f1f4d6b1c69717e77df50e4dcaadcdccea2afa82dadf705e26e7d4e20a8b16ac68c51752f2c4c5f8baafacfce0ce8bc6fb9eba1bae433dc8bf27bdae2c9b69c2b61e514abc2961c02c38e8c35754faeac49135a8bdc6591cd2ed7fe640fa342b2aac12fc3b1fd32593ebd8be22fe1addbca8dfe0b3aac1ac943ef98f5ac86ef2fb9ec60ba4fd16cbf3aee8d8479a3ffe9fad9b60a5be6d8fd58c4c7edaebdefeec9b67f96caa34dbc3534bda2dba6daf2a49c3b13de67bd8707ae48ca1cbbeb60a60d34b3fbad943eea03c7cb60672a1d84034054f856dbc6ad506dacf1b61acd9cc632f33bc1b9f4066efdc6b2897973cc1ac7cce0d4e360466dafbca24abc58e737313b6c8aab7a3dbee50bdf4c774fcaacafcfb8a63b47de2e6e4a9adf093ddca35fe8baebba4c4a3e0c66834308b6b2ab8bc7792226987a9db6b1cd915aa91c1ab3ad1dad37cbeaf157b8deaec0d7e5ed4befaed02787cfcafc5eed9c61cccaad6ae650ecdfd74e91ba89bddfdfa7c0f28e4ad4e00a7ca31ab4bec1f9c5add8afefd4a64f8b57e1ffc70c2c8ed699be8c7668bb61f4cd481ea6d35f74da4cdf4d1af51bd15efc50def32fa27811ef83e8979f9934be286f0b0fbe118fa3c5e71ecbbbc22d1ea101afacb01f247a0c7dd3bb684a4a3b69b0f0c7eb5b5c6c648da0c9271775f86aee3e3b93ceb8921ab96cca16c2caff5150ab47a4ce52020be07ba95e425bc4d8d6fd3a8d8513c6ba0b06cd5d979ce53aa15d518d937cd0ddb2e1bd5faa84e6ecccaae78114071d7ddf4733187c4774efbb06beecc4ba788bdd694baac5cad6fb68a1b9ddc8e2aa198ce2ffdf9ab2080fdafea22209e0a71aec928951a81a4b3ad02bfcbfa2c0db01d7dc00abcc5c8daacafca661a56dc8178f1b9f2aacbbc5de4bffcbdcb1b03b22fabdb8fcd3a12af7dff9b50f1dd02d966a2bd9dedc5a99dbe441bb9615f801b822cd527b3aafebf331542ced74a7ccff4d4e06cee120ca1a8d57eaa7fde42affbfa86e089eff12b1ace39b32379103ff62ae6cd605c43cf6abda17bc0eeefbb5c5eefbb28f42d254ad70efe2b92ab1d4a5ae38d68ce85dfdd64ab0f1cc9ca024c33e363b0fae78c5abf6fdd1addccabc0310dfdaafdce06d689f4dcd47c4cadaffad9f3e5fb852c0cdfef8adf7a4ba59266c43fae9129439f8907a1963a603aaefaa8af99cfdf2712e4fbccef23fe9e8eca8ad02d281ab85bbbff66e54f2d47bf9cf51beacac9564c51622fd8be7a88b4fd472bf7c8f8e3c0663fe4f8f8983da1cb05e1df4f2ccdeaaa2fa2ef0e701bf4cb40940dd15195434dea41aea9199bd1c502ad0ce00aef63fa1f0a6b4adb145dd3cac5d1fa0d3bed20bfc4d6d7736aac0dfdccbea4336d5ac0beaeb0f9d2eef08161ee743fce9effad23eeafe7575ecdbb40ebbdbfbe86cf1e1f6afb2acb8edd237a615fee06ca1c532bceed6f1e3a7da2a2c90d24129cc0bcbaa86fad8c9b6f3c5d78c5d5cf04f6b70ec4e2bfb6eca58952aba0cfe558afed4fa6ffffc26922afd6e0ba2e5ea2ece8cb3faf3fbf4cc2ccb885d885c0c3bc786fbdec5dac7bc3aed0ddee33cdeed9acbb92ebdeca23b511d7040bcfdc7682cbce176dadbd87b0808def6ca1aefab93fd7bcd3fc5d88bdbcbe0bb763bba817ce6c2b5a0067be7f9eea2bccdaff1dabd16de5a6c7075b4ba1f0aa702be412ee78a9d95ccbce5b899efe7cb5ff31a0c57eab3aef23adc3dccba0ca24e7bc5b9757cacbda8b01aff12a3bb9a06e1d0fee0290fab8a3dd9acf29cff3cc337fd10ff054c9f5c861e1c4007ba2a06aeff882440c27ba69dcabc24c3572f622f6cf22a2fd65e8dafa12b6dabf638eeb2c4f9d34ad44a90ddd3b92fee60b48ec865a3fe2d63495eac94d5830eaa294cb34dfacc5fdece0b5e7cfb4dafdc3b8edebf68ffae260adf5e5d7430da7bdaa49959ee90d49fee2fc34f707accb8ef4dc0dec897234f4ceeeab5eac034332b760f9adef0cfdbf2ff82ff6ac3dd8f0e6b0eb9dcf6c757aff7c7e8dafd50f41d32cd37f3e970c7dea84fdc72fbb132cbb91c7ebe85039d89c5d49ee7fccafa91f6ece4ef31ccab37ba7b08652b8a577bfdccee631d8da190ce5bf9ad81a6eb4abaca34ce82d480d5a0c2e711215d9b9bea90f4c13470b1f983aca0fd2f7d6fce71eab7d03e0aeeeef8d42413de67be5a752e3cf08ebca9a0196f54abab5d2ee50eaffd2daee4f9696fb8a8ba5efb98386f651dc5efaed6c606b2f6fc5496e876d3d6f6bae61b23fc1d4fcab0bca53c65a343eabbb0a3cac08bc9eceef30bac4aef2ad38cbbef9ffb75ae6dcaa764aeee35e144bfbccacec8f0be9a233366f8bf3b968fcca0275d0e37fd2adbbd568d08108eebfdc51ef57fea3ce9fcde6e4cdc5188b3eccfc5e9a30c4aebbd2c5e06f5a34ce1820ea2b594573d61c9e7a369c8ddf1fc4edd56ebc13972b39d7f80dcad3a29e93ef4c93ac4441ff4aaf72d155d486df610e7baee5df0bde22d6dae1bad86e2c9e361fbfe38eee10a019e1a923b9eef2eeecb05e826b4c9bdf3f7bf67f1dfb24fb73fffd76ef6c0a7e2f36caddb5d130c74eeccc8af2edcd0fd3dd3beeb9808d84d3a8cf1b92f4e8a54ea63edbd5aa615e58ce3b9fba60dceecef1591bfeed7f4d63baefda1de2cb02bd508ab7f0768e253b91ccfb2a172bd6bd5be2c60841aaa079ad4ae9427ecfcbb9d30a8ebf4ae4ba3ee69c2fc008f7f2f9e3235dfff1720e675fedab8c727defadeb2afd923ddb12e8777fbabcbb026f771dc086ddcb56ed567eb2dd7c8851c71895a06d1f32ebcd0d8eafcab3d0c5aea0bdbb60ce1c1bffaadbbfa6bf65306fc396e587c333ad799a05d74e81c885c707d16def101bcfee1ab6ab5394f1d82ba9ed08aeab3a671dc4f3309e5daf554eb5455a7cecba68a3dfeeacde124ce1e7e0fbbb74cd59e907ed68feae6c0ea1decec8db3eeed273aedad0c2caffae1a0cd8fe0fe0baad9caf3aeeb12f20fd64fa1baf23e5ed3a35f49c7decadeab9f69598dfc6e7f7bd56ecf07ad3985c0faef18f5cbab2dfb067ad674339a7b03244edf6abadf2a42bfa8b80edc4edceaec2be6cfcc8ad455f0dfb901ce0a3c03bfeadfc4884fe70e385cfacde31ad28acfcd9dfa1fe4a2b9becedd6f777d3cbdb93daeb57bccefe3fecabe06fac40ff0acdda2ec0dbd4f1fcb3def5d7df7f7d30f3e1a0ecdbf75d7251fabf513edf1cfa2a423b217d325dcf9beeb5aee4bf647eb18f347fd7fb97e4cc5cda21e0b7b349ddacbbe7b8081dc7d26e6fb88b3e45fe93ced2a8dc009fec5df3ac23dcf3e5c910bb5f9cb3b57ef541ceb6fe3e7e00c425ff4caeaba96495cd9ca062b76aea40ec33cddbeacf2ff6fbefabe9cbde8ab8cfd9ef5cad692e114ca5dcb01ab3fdb68f33f8d337e2fb12a5b7ed4adbed12af4ccffbc8fa0bae4e8eee7a9a16bbd5d2ef5551dad1821db3c9c903dbfd2b2ef2c2b37eeddfef9d7a64a51b7c3c0d2cbaa6f2d8aec40a779e7fa66654d1dae1c858165f8d38fcf3fe6ed409166f6acc958d2edcb0cc56c5afecf2239662e648f2286a8f2f7eed95aa4dd3fbb3b8f5e5ec0bcdd9fd2db8d7822c11c27d0e74f5446ac64f84bdecdde71e9f92dbac88df844e74aac57f5de6324d412f7bad2cae2ac2b80b9dab56435d874bdd5e6aafe5a25af4d499c0afabc22c4cdae95caaade2a226b9ae028f1beabb6ac0b7756d8963e2a52fc7fd1f39eccaacc90947a0c7e5634d4b43bd0dc472aba281aa4cb935eb2fe5a9b5b6efe8aa7d1e0ae3be19c9cbed82b238dc0ffdab50990a74a960da8dab45cd168c85494faaeea079eedec2bf8e6f69942f86cf596caed8d6eaa8d7274c86b6ceff2acc0258b6ad8fcd6fb5ac854d7d88f3a9698d6641ea37baf3295be1cac4a4e5f48a7ec02dc2f47d3fcf92eecc2fcfc1fae1dbd6095db51ee1d2d4d984e270bfdfc574d3b2ee58a86e05f11df6ecdde958def8a2afcd3d6c354f7be2cf38fae5a79e4f5ca72d1ad1ad1aa6ab7a777df9a5e943c434ca8b56044cd4f5eff66b45fdeefe045903fe10cfaf9be4dee56a9ad4c9a4e7511af82de48e7f0ebea718df3ac44ab6c4b297b18899ea0b16cf62f764c0a5e9c9f44bb6acb9ac89c8d2b954a5b52ccdaaeeeb4c5032fb38aae1c5c6caef0ecfa7a5ccefba75c01727aea21bedfa1a63f4e64db4fd7ad1dc22cc174fada1472ab1ad54d56abb3cb8f3acb321cec46d72f8f6df65aaef2d078ce7ee51ef2f5f86c08dc39c93a20adfbde28c20fbdb3532ee114eae7c6f9c4557cc32ff10dbed3ccdb02d30caf4c5d2bfba699cd8beb58e0bfcec2139c97efde025abd03cadcb7a64c98ccf3b7ddde44bdee12bba0948ff014ac5e0ef5fbc99d61aba2f619cdca73fd51f0a98ab102a0f235ec4e2fbf552092dbe67d2bfc6cf6ed754acd38ebe426f763324c3d7dde410bbb8d6beabb376f2a5a5498fbdb4fdd7af47b2ee6ad2dec91091f119bda2cd5d2bf9848dfee78addedec8ba91900bacda4f1e2ef8b20a9a96683d4ef55c7bafdec1dca6c6faf65eeb8bce7de6bd0fe90e68ccae7bacfa4ecef9ab3c406fe0cf513e89399cb2a0c2357aecfe0ca3f1cc5aaff3d0ad9952b04ba1ec10846dd6c3eeaae3fedf87c731af12c25cb44d4ad13cbdd0c8fc10e4a43dbcbd82f462ba6fc5da36f346d17f37d7e165a73df3dba87b6d6e0ba57faed68a041bafa9936c4dbcf4582dfb2acabeaeacefa9c9d0a5b2fdfffa2081f9cceea236d4bd1c90ce7ddeedfd8dc85d4c5c07afabe80c0698ca3d6fac77d5eebc29a1ff9c59ff8dea8fb6a73d3636942f2fb1f563b53ed671664f181de6a226c6ebb28ab819ca4b6c6f55b7211f7dde5f466e6ebdcd3e5cd225cccebab2ec9c2cfcc0deae3939efbe46d7b35c8e76d4cfe0a6edd7dcfa2bbcdceb42e7c4ee0c4a9ef92c3ed321d456ae1ade9cbefabaec2a27b4ec9ababa1d9719e78bdf94bdbdcd44a9a5e1eaddbcecff26fcb6e2f5ad27ef05ef89c406eeead13e05e9efddd5b878a77cfe20adec5bdf0a73fff2ba44fd7cdb46b5cde5f44bddeabcc67f18d8cefead27bfa6ccd6079eaafce606e2dfbbe843f6fbffb3d17f1f96b4fdae3d4daa99471bf671fccd705adda3107fd8f3cfb658aacfb5eca6f8423eabfa1fdbed6acf34bc8c533cc2ecee43abe76438caf17fbade2ecd3fa0aac9a48cf5e38b6ef10d029c32fc2bcb7bbff932c924e9cd6dfa049fbb8eb0dbcf2cb8c3cdf63aa5cb0ccaadcc09accf5e5b6b965dbad6640e647cc6ebea50e28c1a1beadd4bad401b1b500e5a4cfef0e48b3bc4da3a0b24cb6d56acee0cbd2497aecd35cc3bca02bbdafcd91ef8777b5db1d99e810f0d86123af73427adfda303fffff42cead85ce1cd05eeecce67bf1f6314deb0ed53ee94f2dba9ba7eae9dfa24efadce3c1cc02dd21a3f3c4a4b9dbb2eaab942643dcfea091a10189ab760b3af8a81c748afa9c2aff55c84cfd3b5767dcea8e2da678e86dba19dc59603646a7d359052a4faddde4be3bab7715dfba0acf5bb3d017b9ce5f965df6b1dd4a2cf0bfebaa1a12611822a69a3fe0bc2db5183cb4cb1ef5ef3d8dae9fbbcfd7b43adade85d2df0f5fd0a6cefe4beca56c24e3a0ab89ce615aca99d7d71f46fc2cd9378eec70cfe6b3c8dedbb989dac7ef08c8fd8eecd11b42cdd9f9d14eaef31bbb08bb29b47badb0b3ecb4edc86ebebf3b9dbdde145dad1667c5af4de0f25ddd58f63efadfc7aa61ccbf874afa2a5aabe4faaccd4e9bb91eecde6017fdacf6caa22ec9a45070fa354e9107cdc478a76c3ccc0c8427f00a3cef30bf46cb272cb9bccef7ad4cd89dfaf12a428f37d0c1eaf7afacb75f00ae276df7a4aae9f34aceab3ae4a68c1348e2d4cbde0efd0d5abf8ae7dd3bc903875db7aabd3deecbfeee0228c06231ffdb6612c255dc4c3f4511da28b50fde56bac35f94eabf1aef9cdb9d7cc016bcbcaf2bd8eda8baf4afafc852878156c214dfb4e67457d7cbded0baeedd047b26cde5ac736c010d4fb82ed6ebebea5ffc3ebcda8e79364e93aaba15ce57c5f32fb37736b8abd8f273cf6bcd16181bd8c6f8fda5f18f32e0baad1c37f9cdbe4b99349bbadb5bd8afb9e8aee071fbae73ba3dfddf130ee0b971857d3fe2ff85f6de9f5d7bcb24faf9b12d87d7fbe92d0fa2a45bc64c2ed3ac188a11adfbf154fccb9f22c6fc881201bd0a5eefecaa07ed1bfa77dc8cb2e275a6b75cace71540d9443f2baffdbd9884c09c31feccf4abbdaaaa8bac2dc2fd14ac0ca392b8bb5ce858bb2e464abf42cabbaed8cdab30a838ec7c21157c3bfad2a05f733e07bbc8ff3cb6be9eea5fcc9e77c86cdafdbcadc4ae2cf1f452e2819f66cc0aa9efededf23ab87dc75ecfc0c3ddce3f674dada6b3e37e62a9b30966fdaa0967398fd20f43f7991bd7becacdf272feba25c878fa636a57a1ce0aee70d2ba934578b86f83ff7ae85b2f94abe3ecf17b8504cb0cd69dabe7b9bc5fb2f3edd8a1f200e2bb1fa5dffe29dffda2874fecd8efeaca4bc146bfe900ad7bbee435b116d25dcc801db28bfb5f7dac6cb882dafddb4acc24b6fee943527dac3375b9fee8a740709f87dfcbbebbd13cfb4fd243ddeaa4b440eb00498ca38c2ec7c1f86f28cb81b978acd242a50abdd0c3e39c736bf6e943078f38fc9bbaac113d8b5a43c1bf9d8ebd49d0ff2c7e186e05e0eea9108bf0a88c4dabb18dc053b283bcaa4b58c09f2fc0b1cb3bef677c2b128fc1fd93cfef88b7cf4ed0f18ac4ffed5f51502e89cf23ef421caafe26ee075ec1caecb18ecefceaa08fae15825c3d45e7bbcefbe7e5c35ff7ba94cce0bff3a5ca4f0bb597cd4ccb8de3baf9b44bd450b1a9e4f7dd874bce3985cc96ecde6fcb2e061efefac5a25bb38efa5699aa80d6affede86c1ed7794644cd30a7bad204303b87ba6f4d5ca9fc311fd77f9fbd0c5208affcd8089f30ecff3fe0a0cda6ec24ab444bcde7c7afe2badeaea39d6bcebd4d4efd8f54bb8ddc956208f1de9bd7d6921d3aadce53bc76eec9b74461afeecf7c09e3f3abd3bfcc9453eb17afa5d067f7728fbd7ca50f43fc11871b7f3d9c2e4642cdea1a0b8bdc00228ee2db71cef84d9194c0f9b1ebf54d02044ba9b9e8cd789c57ace8270bb61ddda87dcf222ec2ada3b7ac4b2a596daa1067b3448fac30f9db7a6bf9ba5cc7fdb2b491d331fdccfafb53df5dcf805dff6f2ac3178845ab2f9ca4b8ebbc3acdccb9da668deee5aa06216ebd342b7815ff8d6cef7fe34ddad84480c6696a1b4a31cfe7bfde03c0fc1c39fa3e37aa12fca9dc705579b898e7ad30a2ac7cef9bc2dadd432ff74b49dbfa42e22cdc21d0fb587f6ae7af9edb418aeeeb8c4a5d27f7549c81e6aa5495fe1acf1ab1adadadcbd186eba0a944edcceeeb4abd7bdba0eea3cb5ecd6e97bb43a9e52af99ece9eed20be67c9b8e376de2aa50941b57be0d8ffe9e4df8126b1bc67b79aec42aeb5cdbdbe006b7e3e9a79facff2bd07643c23b0ce4dcff1046ab88cbdd859179a5c565e4b3d1eb0bb3d3c854fdbe56a2d7af8ed1ee324c9f1fa66fee7ff1b1a90eb028cbd4fe9fd5adbb1e7251f0bd22e7e0a9cdb73b1ab01b847bbe4097eabea04ebdcb2cbadaceefbcfb1da5fdff6cae580a1714e95c1e3c103ccbfc2efec917d9bc3e3c26f399bedc5ca0fbce7c8e6fbeedcecd54ddbf9db8feb6d2bccc3018850cfbd7d2ab1dcae13aa2c6bd79cc74e7fac36d2d3839a01cece2d3bd53b9ec5f56e4e6eb8fca39d688b6b58feec3823c0788ddbdebff5afbfcee08dbcde9bd9ec2e0c371822ca6dbc5ec51324f486fa7b11fdfb1c99ffdcb77caafce1875cbdfcabf5fba7263a8c76ff0992cc83fd5cad43fefccf10b39e5a7cedec434547eeb3e48a07ca02f5cd57be8efdefda83acdbbafbdbd13aafced4aea4feba4df3a882dbf41de4a5f4bbbe6474ce691e3ee0e0e05ac2958dbdfd7cf7e16eb7e037edf47dacb2b3b06bb35feefa4ee3c73eb833de77fcff321fb41bcedada3f1aab6cd85da62823faac1bc73bd3b8721f2eabc8bcadc0d5bc2de2e05ec3904a875e2a2a35805ff70a8eb4ff13eb04e49b0783d62beebb3241b1d1dad63ebc56d9079c56cd3ab2aeafa7c4ee0cf5ff3ff86c3e4e6df11e0acecaf3beb04bcc3d7053227698aa3ddaea1de08ad8776cdab372cc7bda6cbce3f65c97d013acad0eaa7981aebb5b5c36dcaf5f7cdc384f0aa302b35920a9dc075c3c2b3dff2ab004d1efe5a6b4def6eec08dfe7fc0fe0d3c9a9be84d98dc4ee6d2cbb6bc1b3c4c5646e372a06ba2ada9e3dec09cb007aab1da0e0d0f0787bbbfaadf104c1bf5c0ef9298e14fadeafdc856edc1be403edfda4c4aaa5f4eee2f5b177ba1dafa14faaddbeab7dc8f528baa4add34ebfdad9fe887edfbb9ced900afeecc9ceebac50ad774dfff47f6fa45449c05da2e85188b641ff9dc1ea3fb71fa4bbc568e5e63fec961f2a68afcd121fdbbda3fea7fec4d04cce24c62e62ccae67e620ca1ab88c460e60e10159540e145ead922ffd9a8a76ac02bdac4f98bf4a7fe54b755b52e4add8ac79fd6cfe0dab24efadff0aa8b7f92bcccd9e1ceeaae7bed7ec2e0d71cdc66cf08526240cffb806d43c7df4a29c56b2f2c3d2affe0bdfbe2bf9b6efe05785ffaabc1f5ebc5abad9ce69a003fd0f3a7094f9af3efb8ad21e02ed38d04d4d50ce54a3e3100cbb66deaff5d448f8f284a69f84b08eb23ea795d4ceefcab22faafa4876e87c57dbc5eae173c1d3b1ce85ccfd373b3af89aaf1907ece4abe154c7dd530edfb3caaefe3e77d63e833499a3decbe0ecd9e7e837a7d37dfccefbf4a45bde3cf130bfbee741b3cb0f7c820cecbfdedbb97c6b628d6fb32eeea2ee6adab6b15025fcd2a3bb464ea8abaadcfbfddffeca93ba6ec2facfdd7a39cfc3c01ae4eb194eebc02a5efcdf16926e2b7fceead06bf912aab96ff45ca0208aef52d5cde4948a22b9dace24c53b2300b24f94d98ac3648e4c1abab319a9704ae038e5d5c29c0f4763026da2320aca7aa7cc932b3bbadbad3dacd6703a77cdc1cdaa8f410e98adda8bcff366ce2bd5a3f48cbef7cfa3ec7b4ae8fd3d8b846977bc9e2e6abd9a4b177ed10ce7da4accce3ebfecfbf4e5ba6ff3ec66538e1d23f2ef671bc02f66ae05fb42a2fe2b71a015e3e2054efb6bc083d68e7afda378a8de0a67baf2a8594b8150dead75beaddbcef7eed251a582df825af31adfe580d0bce73b3ee81cb42f1d4acced00c7beba6a5e4b2bdeeccf6fcb84a1dccddc736b45d3e85bbe7b71fcadda47e4fdcba2352aa21845b51db45baac3f7f4cfaf1eacbd8fc0f5b9878f09f1454d0bfb76abdd2efb73d7bbdb5f72eef42fc84bcddabbbe33a7c4b4ac179a3d0aba775dadcdc2aaecfce54501581c01cc7180f3f0b9aff2ca6e9ad3fad5c867c4ce298ff31a9cdc5fa6cf8c1bb98dbd742c7a97fac9fa8ff3bad5da4eca0b9d1e6edbef15c07bb5ce6a7bbbd0d7c4558744703055b9db759f6fdf26996d07aaecfe997dd1efed6b4692fbfccf0fc1ecc01da64303b2bdccee8812ac556798cf9e6077fd591f1353ca1b894b6d12fb86ddefefd03fefc04aebf2124aeabdc16afecabe4d0ff3fdcb3deb66ecbff31acdacd9b46a2fcaf1d3bcc8f80b8c5a6b91bfce8d5649dadd90eadc00f30a755f8bebb2f79799f9effda4f680d21ae8dc0d725a17dae3ef29a15ee0ce865edaae4130ce438e36b0912d7d13edcbd9c0b2fbbff66947f84b8c7985f45c7c363adb467deec13ed8ee3c0cee67222b074cec9bed0593ca35215bd1bcdcb30ffe509df0d2a0b98ce9f67d5fade6a6417dee7eb53efc4db8dafa8dde7257ded0cafadb5abdc6c1aedf85b1de4b9ba0b414e3f75aaf2a061cfa1e0b473feafaec6c0aad06f1de57af1b24a452cee64bd20f65cd9c20d800d987c45281b72fbbfffa552fb7ec60fdbee0b5af07ddcd4f11bdca2ae651ea7e8b335816ccc05ec2ab334fe4dafccb8a26bef4cbeec91bbaaccd0aed2cc7cf57984fb1fe713cc9783defd94fb62088fabc6a78bf2d922a139c9faddef06e3f9332d0a33696e3cefcfce8e871f1be8a0c710084a74cc7fd51eed4ff7bc0ab02a6b2267fe5ac8afdde8d8ec695dac3d40eaa2247db93d87fad8c14a7c4fedaebeb7db1c1938e56436dfbc3ddae38e7df2fb0cc9f9581bc7adfbebd20eab369865e12e4f9aa71a0baf95dcbc46c6cfee2edc9eb220a8e4bbe28faab6e78aacb719fbb0332cdb36fa11a85abbceb45b8faa70f5d1dc66e8abba541e6bc2ffe823fb4ccfd967eedba10cbc740c6ac98aef2e2d346dfd27eed90bdfcaee33af6ed582a3f1df8d10e9cefe391dc3990cb4bf8d6a7ad3cdfd2faf01af4bb27a5ec3dedc325b8cdbeacfefe9c3bfefb9e3db4ae1a48de084e28dedbbfe8e4cf17ea8eb8a1e1d42dae8f934588beb1db67eea39b1bd42efca62957f23efedc41fe4c1c6bc85c06f587f7fcdfd7c0ab26ce90c03faffe6ea9dd603dbcf295b2a1ec4e27ad68975a5af3fdcb90b4bac46de6d90f6a6f6abc83b0cf75956d78fd1360d66bdb5fbc436f79c3c6605b952e6684f659bb1f4ddb5eeb5dfe51bf84b1b9fdd430700ec1b99bfab5e8124574ec46ee6c10eb7583ccd5c6dddf72455fd12facabacbca6d180cd7fecf723abae81bcbab6f9eb76475fad45c2056cebdfd176a5a5eac5c7c6eeec41edae47c6b1102f86c3cecbba6d6b2cedcecfb9cd200fee97fdfefef3ba9abef31f4c0fc6fa8e24eecf75ffde2d582beca15fd1ca913928ab83fa4b4e6e28cb62aa6bf80adbfb65b0a704c3fdbb1f0a8ac8bb1b6b6dffa6df2bd6d3efa39ec0952f5c3fecf437cc55711cbcc6ede7c7898b6ed447c08c8ede0ecde7fad90f678aed85cb0346cb1088c25c4b7eeae0d1e438f9bc5cb45425c8fddf8ba56ead6af77dc6bcd3e0daf5b948e59fbdc36b73177f04a4afeb4e6bdad1cdaafb40df2e6f1deece30c6117c508fef3534c1fb1f3aaceb39cbb74979384ed055b72a85dbaa3189ef6eeab5ffefe996de18ebd40b6a21de4fde8cf2f5e75898adf318fd96b3e01e3d8d6c5aad06cd0afa0ba82fe0f8ce6bf71ff9d17fcc59c64c15d2a0eb8dcee16e5972e8c40f1bbfdca8bc8dac94c8b428e5be1c7e7fde50d106bc7e7cd09dfcfdbdad09ecb5d0bb79ecc6b785e27a4ddfafa9ceedbcdd38ec603ba1a1bccceca68a097ee218be5a6f63a41dc8fa3ccf3f2d6b1b79f4b7a638a7f5aa0bbbac0b0200aa96ae47ccf6c7c10b78ebbaaa822a0a6323ec72943c3294bec0cf08ff6c6d4bed4adaaeac5be0a6df35870fcabd1d393ae8c5bd7c3f3f7f3d6519333daca54bbcaef804cf1fbbf1d7a3e556cdce4b57a5c91fcd0a95ddaae543fa5493cefafdcafb63f9a7850bd4cce63dea2e63febaee42dd3bddd6eedceab304bbcb3cb5e3a58fa3aa704ba23afb1cd7ed8ff9909b70a1613c1fffdaaa130e89cb12b597befa680c6ccbbdf1d2b9abf9eaf2ba697fc9e1a6340bb33fd6be11c08c5eacafe991bffe926f4d6e4de7ba94fdff5b8bb3cee0aeb6187c68d8cabc8bed77ff54a8ed3ba87ed96dd1098ed8481bfad3219dd096e1140b3eefb6c07bccb6f5d2a9f4ffcbf57cb1831ddf0db3b346f0dc4232a9a0fdc4ea3bfbbbe94cb49b4ab6a01c116e9f1c3322d3121fe69cca90c0fee37dce6d4fec6e9c2d6d25ccd466bd909e9d97e5ddde0b96d8adbfd6f332ad3c293af5dd9dad3e8ef688c63eb28d3a6f83afbf4babbcd716405f6e7edc143d0bfa0effb0d6ab915c859de5d81f3e4cbd9adfdcb4dcb890f37bc1c1b7ae9d1f2cdd432e2d72264d9ff07f67ceabdeceab22c50748e622ecae1d09cd1abcfd5fafd6ac363deaaa4bbfaabd961abbd9d0c4ee96dcfc2d822e51c9a825b57421afbbd628320a5ca8f0cbbeccebc625faef878fa7eef12f6fff1abe57fae1683675a9efceaead868ea073111a64cd5eeadc22bc6fd3fcfca1fa3bf96e3ee5c1895ada074d137da81aacabe458e20f50bcad7802eaacfcb88fb45438bdbfb486dc65f030fd276e2707befcbb52e73731eac048a15ec4f80f7a27ecedb56ece7ffb32cec16d2a1e3f063fd75ae27abb39cd3d22989acaa95e71838374ca6d53a3ab7deab3d9aea4b9ef9e8ca74fffea033baa4b6fc0dd4489ca20661f2c0f28deefbfb2ec5fce3f4beaeb43f3aa4bd1b9faac40ddb40ebcead9605ffefb11b2c4da67742fa6579e98fbbc23a22096ccc51927c94d0a755f305cddc442c1ce45dca3d9c611950dc4fb546daafa8c0bfacfcc552cc3bac230b3ab026caae8605b7cff6f3d0ad8edc443ef9c6c4a875dc1a686ebcdecfcafe8fca0af3d2b479a5ad3c02eca591b82c216cfa77ec77a5c12e2f6d9af38cfc9e0dc7d6cb32e1d9fcc0ada8f87ed40a0d4b2aba8c4b0aede373f6ee4cd971ed58eabbe4fc8df5443c0ee6ca316ba7dcdb74bfd2d68800faf06fe0dff116435acbd7ca6f6443dd29daad8ecad53f9dbe739a6c1b22f68764aab7d95cbf29d4fdcec6f9ba68e90edd2fdc909a81dd70c6efdfe17d40f64a91d1b6ce5f7c3cacba0eb4f3b76041e0d1c83e4c7040e74dea76b47fff1ba937eaeabd23db6aeacff59b27b3bf866b5fbceb13f746b04ecb558d8fce4aa5ceae865027f0ee5e0a58b81ac800f3103cabd47dd9ece5066bb9bc7a35ba29bb5ae533ac8bfc4d55b2fe3ba625e18ffb4c9ba17becd16bad2fc3fe49fa3cf1dc1a5cafdff89edfada53a7a42da1677e1c7caafdfad6eadfcf82bf3babaeeb5fba82cef5302cbdc733afae5ab95ef2cf806c1e623f5f9a027ded2dea55bddbef07ea8c339af3ad555a9c2de41b100fdd51fa3b1ab619a6c1db0a948a81927caefd167de40dacfe10eb00e41bdd70810e46c187d42360edeae4acbdccd31b5cf193662a7d96d149ae32bdeb42ebbabd4401b3fc5eb8e8f0371b1baf04b0edc8eaebfb3ca9acbabdf9bcb49bcc19bdfb4cdce9d3ef6ffdc8e5e2a99b4e7fbabfaaea8edd15df5aa1baa64bfef64120bdb6ea46f20f420e80951cfe7eaa8474be0abcdf7f6d5cdfe38ffc15fcff33cbea93a9c2befe4ead1a50c9e985feffc9ebabdc4dda9629c8ef77b6d9eb31a5b4b0784df9f579e9ac7dfdf7a71ff180b2dff4bbccfc6fc5e8b0c1e628d9dd20fed1206c1caf21efacbb290bfbe63b4ba3ce6abfb6a78fd2f6ccda6245d6743b8eb479eba54aefe5feededd05d0deb37a1c01e49a683efb59ed8c614dca9ddededcee87bb44de12aa95a4d15e4b3f7beb5ab1993f4ffaf4d0af5bed4e48b0faa5ebadffa17b6805f922b321bdd90fdfbdfa252f0a38a33f7ffab488dcb77beaec6da837c5dced7dad0bafe5ff2a8adcca702dbb9a161da47a75b2dd28cafd552801ddd17dd3e81eb9eea248dd5ffd24bdf11e31f077b4a14f509f3506abfb1a0d0ba73c43019a5c9ec3c14d9c225db893dcbe90eec0da2a943618fc0f8c8bd4fab3c8e8f78db7cf0577a2cd277feab5e3615eacb1fdb19b6dc87dcd416eaee3ded0b1b1eae6c7ec6ceb5af78aa450c6ac5bc1968c8ac7ef2e3d8bebad8b9b3b7917a8ba21adf791a6b64fa6fd7ccb4dbfc1879ebbbef81f3ecc2a572eecab07aa69e3c149f214226acefb2a2ecc9e1edef14f3b8b16ea25ec3dedb444e3c4ffd6f400baaa359cb1dbc5a6a53fc6f0ada76b82ec5e548f4a931dccc6222afb4e80f136f94a3c060add59acacfdc4681669ad630a1e2dc6ad80aa39f66bbf792b815ab81b1dcc3dab56cd9e63adfb6ddd657463b646febdbe6a2dfc0eef6a48b15facaa916a67276bd80acba49a94cc3f0dddde8bd4c145c0aabdf6dfeacfea4c28d48dbaecc5cc57cbeee9dbeef3fea8c690cd3a1ab186cd408fdad3933cb0a09e538e9bdbe74ddde4ee2f9092c48f02e1696f63996d5026fa0c7779e5fbdef855ccfdead6adfd1a607a4e1a57c6f224c37f2fccb6f7bfec4683d4437b9b2cc79f36c9f46f2f5fcff4fcc4c1838bd239a841c8d55a0621e3deb40cebee39c0dbcf449e700be94dbaf9f4f05df2b03fe4dd1b685e66db7f3caf1cedecdd59ecfa4d962322cb22b7d8c03dfbd6f6cb81ab59bf6b244cf44ae62f6d5acc1b63edd0fabf3009fb1ef628b3d93b8ccb21abefc56c80ea4fd11baf9312f89ebed4fbde84adfaddbca67d7aaedef4ecd4aa183dfcb9bdecae95bdf53f8fc2249f0a46ebacc4aa97b38deba4babfcbc46aec62cbbbfd00c8b495ae08f35ebd7b9c15ea1eb891d86eddf6a5d5ed35cdf9ff927dace9ded8552afbbc2ed0dfa529e2eac4035cd1baaf30da5ccd2bac641c3e3b1949e7f43ee0b87dae4041bec27ccdc9de3ef0a6d1ffd3d0fb90a7d928f34f8ad4ba9bcaf06a235cbf2daee3ebb51bffda3f9fb3dddc5ebacba70f6fcab975caa3aa4734e2903d1e5e4366eedea4f7ffeac7bebfe4149cf40ff2cdc891effe0a3e04df0ae8c8fa3eec8a454eedcad054ce9d9b7a53aa7a6e7abe1aabbe0e5a9cebdfe84ce2aadb032a6cbeaf1eba9cfdc3edbfefd9e7e1ce03b5df6b6a2c51ffcb418e55a6ef20ef90633a6d28feddbcea97cd7dfdc1e6e93ef4ce31f6aee4c5cd6bb32b182ecdaba0d4e45cebb891b577ddfcd2ba0fbdbfd299a7bbc6d59e9c9c097aa1101de62b5ba3b89bf377ab6f70e6ab7cef299e8dafb3e330d6eeaca2b46db67dad437c243afd8afeb1a0ead24537e4a9e9d2dbeda9c908ac67426a0d4acd17b7bc11c6080d552dc16cbb67f0db4ccd68553ae912ac939e9deba4c69ca738dcb12a8bcdbfe95ffec9f5f4dabffda121f99dfcacecfcc17d2abea440ec17b6793cc081d3aabc89fb661a0e57ec58dfd5bd5d0fbf66acfbbf26beaf3daaf0baab9cd7df7f5e7afefcb4704d7fb60467dc061fc214fed4b1c08f6d21aa802c0bf3cfe457d6fc2edc0ed0aedb3760afa8beb805f2c51ffea55bacdb4e86a909afdfe4db9b20cafddaa65c3f13da4ed20c45f7e7d39ecf5eab2b760def3bf6aac965e7c72ffd5e4aa0fbfbd869b36febfd82bc97a7e9dfffcd7450aed29d87b4bed8cae3f1147ad2bbe705bc97dcbd8ac712e165bc13f3cdc8ffd693f335b3dc332adc9ef0c0a05c2d271da6da5cceb2f4af6978f21bf5dafbd8f2bcae8d302ac5bddab528aaf1f3eac5ad45bafcfa36d0d0f2adebbccf13c09a4bbf1edbf` + +var FuluBlockContents = ElectraBlockContents diff --git a/beacon-chain/rpc/eth/validator/handlers_block.go b/beacon-chain/rpc/eth/validator/handlers_block.go index 88ebda185fd3..1f229e1719d6 100644 --- a/beacon-chain/rpc/eth/validator/handlers_block.go +++ b/beacon-chain/rpc/eth/validator/handlers_block.go @@ -299,6 +299,18 @@ func (s *Server) produceBlockV3(ctx context.Context, w http.ResponseWriter, r *h handleProduceElectraV3(w, isSSZ, electraBlockContents, v1alpha1resp.PayloadValue, consensusBlockValue) return } + blindedFuluBlockContents, ok := v1alpha1resp.Block.(*eth.GenericBeaconBlock_BlindedFulu) + if ok { + w.Header().Set(api.VersionHeader, version.String(version.Fulu)) + handleProduceBlindedFuluV3(w, isSSZ, blindedFuluBlockContents, v1alpha1resp.PayloadValue, consensusBlockValue) + return + } + fuluBlockContents, ok := v1alpha1resp.Block.(*eth.GenericBeaconBlock_Fulu) + if ok { + w.Header().Set(api.VersionHeader, version.String(version.Fulu)) + handleProduceFuluV3(w, isSSZ, fuluBlockContents, v1alpha1resp.PayloadValue, consensusBlockValue) + return + } } func getConsensusBlockValue(ctx context.Context, blockRewardsFetcher rewards.BlockRewardsFetcher, i interface{} /* block as argument */) (string, *httputil.DefaultJsonError) { @@ -670,3 +682,74 @@ func handleProduceElectraV3( Data: jsonBytes, }) } + +func handleProduceBlindedFuluV3( + w http.ResponseWriter, + isSSZ bool, + blk *eth.GenericBeaconBlock_BlindedFulu, + executionPayloadValue string, + consensusPayloadValue string, +) { + if isSSZ { + sszResp, err := blk.BlindedFulu.MarshalSSZ() + if err != nil { + httputil.HandleError(w, err.Error(), http.StatusInternalServerError) + return + } + httputil.WriteSsz(w, sszResp, "blindedFuluBlockContents.ssz") + return + } + blindedBlock, err := structs.BlindedBeaconBlockFuluFromConsensus(blk.BlindedFulu) + if err != nil { + httputil.HandleError(w, err.Error(), http.StatusInternalServerError) + return + } + jsonBytes, err := json.Marshal(blindedBlock) + if err != nil { + httputil.HandleError(w, err.Error(), http.StatusInternalServerError) + return + } + httputil.WriteJson(w, &structs.ProduceBlockV3Response{ + Version: version.String(version.Fulu), + ExecutionPayloadBlinded: true, + ExecutionPayloadValue: executionPayloadValue, + ConsensusBlockValue: consensusPayloadValue, + Data: jsonBytes, + }) +} + +func handleProduceFuluV3( + w http.ResponseWriter, + isSSZ bool, + blk *eth.GenericBeaconBlock_Fulu, + executionPayloadValue string, + consensusBlockValue string, +) { + if isSSZ { + sszResp, err := blk.Fulu.MarshalSSZ() + if err != nil { + httputil.HandleError(w, err.Error(), http.StatusInternalServerError) + return + } + httputil.WriteSsz(w, sszResp, "fuluBlockContents.ssz") + return + } + + blockContents, err := structs.BeaconBlockContentsFuluFromConsensus(blk.Fulu) + if err != nil { + httputil.HandleError(w, err.Error(), http.StatusInternalServerError) + return + } + jsonBytes, err := json.Marshal(blockContents) + if err != nil { + httputil.HandleError(w, err.Error(), http.StatusInternalServerError) + return + } + httputil.WriteJson(w, &structs.ProduceBlockV3Response{ + Version: version.String(version.Fulu), + ExecutionPayloadBlinded: false, + ExecutionPayloadValue: executionPayloadValue, // mev not available at this point + ConsensusBlockValue: consensusBlockValue, + Data: jsonBytes, + }) +} diff --git a/beacon-chain/rpc/lookup/blocker.go b/beacon-chain/rpc/lookup/blocker.go index ded0e1120b83..55f5cd978e18 100644 --- a/beacon-chain/rpc/lookup/blocker.go +++ b/beacon-chain/rpc/lookup/blocker.go @@ -487,12 +487,12 @@ func (p *BeaconDbBlocker) Blobs(ctx context.Context, id string, indices map[uint blockSlot := b.Block().Slot() // Get the first peerDAS epoch. - electraForkEpoch := params.BeaconConfig().ElectraForkEpoch + fuluForkEpoch := params.BeaconConfig().FuluForkEpoch // Compute the first peerDAS slot. peerDASStartSlot := primitives.Slot(math.MaxUint64) - if electraForkEpoch != primitives.Epoch(math.MaxUint64) { - peerDASStartSlot, err = slots.EpochStart(electraForkEpoch) + if fuluForkEpoch != primitives.Epoch(math.MaxUint64) { + peerDASStartSlot, err = slots.EpochStart(fuluForkEpoch) if err != nil { return nil, &core.RpcError{Err: errors.Wrap(err, "could not calculate peerDAS start slot"), Reason: core.Internal} } diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/blocks.go b/beacon-chain/rpc/prysm/v1alpha1/validator/blocks.go index 49f13afcb8db..7ac22d33395f 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/blocks.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/blocks.go @@ -170,6 +170,17 @@ func sendVerifiedBlocks(stream ethpb.BeaconNodeValidator_StreamBlocksAltairServe return nil } b.Block = ðpb.StreamBlocksResponse_ElectraBlock{ElectraBlock: phBlk} + case version.Fulu: + pb, err := data.SignedBlock.Proto() + if err != nil { + return errors.Wrap(err, "could not get protobuf block") + } + phBlk, ok := pb.(*ethpb.SignedBeaconBlockFulu) + if !ok { + log.Warn("Mismatch between version and block type, was expecting SignedBeaconBlockFulu") + return nil + } + b.Block = ðpb.StreamBlocksResponse_FuluBlock{FuluBlock: phBlk} } if err := stream.Send(b); err != nil { diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block.go b/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block.go index a4510e69eead..6567cfa96fb9 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block.go @@ -26,34 +26,46 @@ func (vs *Server) constructGenericBeaconBlock(sBlk interfaces.SignedBeaconBlock, bidStr := primitives.WeiToBigInt(winningBid).String() switch sBlk.Version() { - case version.Electra: - return vs.constructElectraBlock(blockProto, isBlinded, bidStr, blobsBundle), nil - case version.Deneb: - return vs.constructDenebBlock(blockProto, isBlinded, bidStr, blobsBundle), nil - case version.Capella: - return vs.constructCapellaBlock(blockProto, isBlinded, bidStr), nil - case version.Bellatrix: - return vs.constructBellatrixBlock(blockProto, isBlinded, bidStr), nil - case version.Altair: - return vs.constructAltairBlock(blockProto), nil case version.Phase0: return vs.constructPhase0Block(blockProto), nil + case version.Altair: + return vs.constructAltairBlock(blockProto), nil + case version.Bellatrix: + return vs.constructBellatrixBlock(blockProto, isBlinded, bidStr), nil + case version.Capella: + return vs.constructCapellaBlock(blockProto, isBlinded, bidStr), nil + case version.Deneb: + return vs.constructDenebBlock(blockProto, isBlinded, bidStr, blobsBundle), nil + case version.Electra: + return vs.constructElectraBlock(blockProto, isBlinded, bidStr, blobsBundle), nil + case version.Fulu: + return vs.constructFuluBlock(blockProto, isBlinded, bidStr, blobsBundle), nil default: return nil, fmt.Errorf("unknown block version: %d", sBlk.Version()) } } // Helper functions for constructing blocks for each version -func (vs *Server) constructElectraBlock(blockProto proto.Message, isBlinded bool, payloadValue string, bundle *enginev1.BlobsBundle) *ethpb.GenericBeaconBlock { +func (vs *Server) constructPhase0Block(pb proto.Message) *ethpb.GenericBeaconBlock { + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Phase0{Phase0: pb.(*ethpb.BeaconBlock)}} +} + +func (vs *Server) constructAltairBlock(pb proto.Message) *ethpb.GenericBeaconBlock { + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Altair{Altair: pb.(*ethpb.BeaconBlockAltair)}} +} + +func (vs *Server) constructBellatrixBlock(pb proto.Message, isBlinded bool, payloadValue string) *ethpb.GenericBeaconBlock { if isBlinded { - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedElectra{BlindedElectra: blockProto.(*ethpb.BlindedBeaconBlockElectra)}, IsBlinded: true, PayloadValue: payloadValue} + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedBellatrix{BlindedBellatrix: pb.(*ethpb.BlindedBeaconBlockBellatrix)}, IsBlinded: true, PayloadValue: payloadValue} } - electraContents := ðpb.BeaconBlockContentsElectra{Block: blockProto.(*ethpb.BeaconBlockElectra)} - if bundle != nil { - electraContents.KzgProofs = bundle.Proofs - electraContents.Blobs = bundle.Blobs + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Bellatrix{Bellatrix: pb.(*ethpb.BeaconBlockBellatrix)}, IsBlinded: false, PayloadValue: payloadValue} +} + +func (vs *Server) constructCapellaBlock(pb proto.Message, isBlinded bool, payloadValue string) *ethpb.GenericBeaconBlock { + if isBlinded { + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedCapella{BlindedCapella: pb.(*ethpb.BlindedBeaconBlockCapella)}, IsBlinded: true, PayloadValue: payloadValue} } - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Electra{Electra: electraContents}, IsBlinded: false, PayloadValue: payloadValue} + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Capella{Capella: pb.(*ethpb.BeaconBlockCapella)}, IsBlinded: false, PayloadValue: payloadValue} } func (vs *Server) constructDenebBlock(blockProto proto.Message, isBlinded bool, payloadValue string, bundle *enginev1.BlobsBundle) *ethpb.GenericBeaconBlock { @@ -68,24 +80,26 @@ func (vs *Server) constructDenebBlock(blockProto proto.Message, isBlinded bool, return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Deneb{Deneb: denebContents}, IsBlinded: false, PayloadValue: payloadValue} } -func (vs *Server) constructCapellaBlock(pb proto.Message, isBlinded bool, payloadValue string) *ethpb.GenericBeaconBlock { +func (vs *Server) constructElectraBlock(blockProto proto.Message, isBlinded bool, payloadValue string, bundle *enginev1.BlobsBundle) *ethpb.GenericBeaconBlock { if isBlinded { - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedCapella{BlindedCapella: pb.(*ethpb.BlindedBeaconBlockCapella)}, IsBlinded: true, PayloadValue: payloadValue} + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedElectra{BlindedElectra: blockProto.(*ethpb.BlindedBeaconBlockElectra)}, IsBlinded: true, PayloadValue: payloadValue} } - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Capella{Capella: pb.(*ethpb.BeaconBlockCapella)}, IsBlinded: false, PayloadValue: payloadValue} + electraContents := ðpb.BeaconBlockContentsElectra{Block: blockProto.(*ethpb.BeaconBlockElectra)} + if bundle != nil { + electraContents.KzgProofs = bundle.Proofs + electraContents.Blobs = bundle.Blobs + } + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Electra{Electra: electraContents}, IsBlinded: false, PayloadValue: payloadValue} } -func (vs *Server) constructBellatrixBlock(pb proto.Message, isBlinded bool, payloadValue string) *ethpb.GenericBeaconBlock { +func (vs *Server) constructFuluBlock(blockProto proto.Message, isBlinded bool, payloadValue string, bundle *enginev1.BlobsBundle) *ethpb.GenericBeaconBlock { if isBlinded { - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedBellatrix{BlindedBellatrix: pb.(*ethpb.BlindedBeaconBlockBellatrix)}, IsBlinded: true, PayloadValue: payloadValue} + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedFulu{BlindedFulu: blockProto.(*ethpb.BlindedBeaconBlockFulu)}, IsBlinded: true, PayloadValue: payloadValue} } - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Bellatrix{Bellatrix: pb.(*ethpb.BeaconBlockBellatrix)}, IsBlinded: false, PayloadValue: payloadValue} -} - -func (vs *Server) constructAltairBlock(pb proto.Message) *ethpb.GenericBeaconBlock { - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Altair{Altair: pb.(*ethpb.BeaconBlockAltair)}} -} - -func (vs *Server) constructPhase0Block(pb proto.Message) *ethpb.GenericBeaconBlock { - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Phase0{Phase0: pb.(*ethpb.BeaconBlock)}} + fuluContents := ðpb.BeaconBlockContentsFulu{Block: blockProto.(*ethpb.BeaconBlockFulu)} + if bundle != nil { + fuluContents.KzgProofs = bundle.Proofs + fuluContents.Blobs = bundle.Blobs + } + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Fulu{Fulu: fuluContents}, IsBlinded: false, PayloadValue: payloadValue} } diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block_test.go index 9a8365d3c0fa..f40b369a57f2 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block_test.go @@ -22,6 +22,21 @@ func TestConstructGenericBeaconBlock(t *testing.T) { require.ErrorContains(t, "block cannot be nil", err) }) + // Test for Fulu version + t.Run("fulu block", func(t *testing.T) { + eb := util.NewBeaconBlockFulu() + b, err := blocks.NewSignedBeaconBlock(eb) + require.NoError(t, err) + r1, err := eb.Block.HashTreeRoot() + require.NoError(t, err) + result, err := vs.constructGenericBeaconBlock(b, nil, primitives.ZeroWei()) + require.NoError(t, err) + r2, err := result.GetFulu().Block.HashTreeRoot() + require.NoError(t, err) + require.Equal(t, r1, r2) + require.Equal(t, result.IsBlinded, false) + }) + // Test for Electra version t.Run("electra block", func(t *testing.T) { eb := util.NewBeaconBlockElectra() diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go index b7cac99db8c3..2a90df16f19a 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go @@ -631,6 +631,9 @@ func blobsAndProofs(req *ethpb.GenericSignedBeaconBlock) ([][]byte, [][]byte, er case req.GetElectra() != nil: dbBlockContents := req.GetElectra() return dbBlockContents.Blobs, dbBlockContents.KzgProofs, nil + case req.GetFulu() != nil: + dbBlockContents := req.GetFulu() + return dbBlockContents.Blobs, dbBlockContents.KzgProofs, nil default: return nil, nil, errors.Errorf("unknown request type provided: %T", req) } diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_builder_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_builder_test.go index 81dee365cda6..0a2c16ccaec1 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_builder_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_builder_test.go @@ -18,7 +18,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" - v1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/testing/require" logTest "github.com/sirupsen/logrus/hooks/test" @@ -159,7 +158,7 @@ func createState( BlockRoots: make([][]byte, 1), CurrentJustifiedCheckpoint: justified, FinalizedCheckpoint: finalized, - LatestExecutionPayloadHeader: &v1.ExecutionPayloadHeader{ + LatestExecutionPayloadHeader: &enginev1.ExecutionPayloadHeader{ BlockHash: payloadHash[:], }, LatestBlockHeader: ðpb.BeaconBlockHeader{ diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_empty_block.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_empty_block.go index 01ea1d46df18..4c9a8349a112 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_empty_block.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_empty_block.go @@ -16,6 +16,11 @@ func getEmptyBlock(slot primitives.Slot) (interfaces.SignedBeaconBlock, error) { var err error epoch := slots.ToEpoch(slot) switch { + case epoch >= params.BeaconConfig().FuluForkEpoch: + sBlk, err = blocks.NewSignedBeaconBlock(ðpb.SignedBeaconBlockFulu{Block: ðpb.BeaconBlockFulu{Body: ðpb.BeaconBlockBodyFulu{}}}) + if err != nil { + return nil, status.Errorf(codes.Internal, "Could not initialize block for proposal: %v", err) + } case epoch >= params.BeaconConfig().ElectraForkEpoch: sBlk, err = blocks.NewSignedBeaconBlock(ðpb.SignedBeaconBlockElectra{Block: ðpb.BeaconBlockElectra{Body: ðpb.BeaconBlockBodyElectra{}}}) if err != nil { diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_empty_block_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_empty_block_test.go index 122dc1fcccf2..906dbbb88835 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_empty_block_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_empty_block_test.go @@ -19,6 +19,7 @@ func Test_getEmptyBlock(t *testing.T) { config.CapellaForkEpoch = 3 config.DenebForkEpoch = 4 config.ElectraForkEpoch = 5 + config.FuluForkEpoch = 6 params.OverrideBeaconConfig(config) tests := []struct { @@ -71,6 +72,15 @@ func Test_getEmptyBlock(t *testing.T) { return b }, }, + { + name: "fulu", + slot: primitives.Slot(params.BeaconConfig().FuluForkEpoch) * params.BeaconConfig().SlotsPerEpoch, + want: func() interfaces.ReadOnlySignedBeaconBlock { + b, err := blocks.NewSignedBeaconBlock(ðpb.SignedBeaconBlockFulu{Block: ðpb.BeaconBlockFulu{Body: ðpb.BeaconBlockBodyFulu{}}}) + require.NoError(t, err) + return b + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_execution_payload.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_execution_payload.go index d491daa22ba0..e220ac58b611 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_execution_payload.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_execution_payload.go @@ -136,7 +136,7 @@ func (vs *Server) getLocalPayloadFromEngine( } var attr payloadattribute.Attributer switch st.Version() { - case version.Deneb, version.Electra: + case version.Deneb, version.Electra, version.Fulu: withdrawals, _, err := st.ExpectedWithdrawals() if err != nil { return nil, err diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go index 4ce0ff683467..00a20e115a34 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go @@ -617,7 +617,7 @@ func TestServer_GetBeaconBlock_Electra(t *testing.T) { Graffiti: genesis.Block.Body.Graffiti, Eth1Data: genesis.Block.Body.Eth1Data, SyncAggregate: ðpb.SyncAggregate{SyncCommitteeBits: scBits[:], SyncCommitteeSignature: make([]byte, 96)}, - ExecutionPayload: &enginev1.ExecutionPayloadElectra{ + ExecutionPayload: &enginev1.ExecutionPayloadDeneb{ ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), StateRoot: make([]byte, fieldparams.RootLength), @@ -646,7 +646,7 @@ func TestServer_GetBeaconBlock_Electra(t *testing.T) { require.NoError(t, err) timeStamp, err := slots.ToTime(beaconState.GenesisTime(), electraSlot+1) require.NoError(t, err) - payload := &enginev1.ExecutionPayloadElectra{ + payload := &enginev1.ExecutionPayloadDeneb{ Timestamp: uint64(timeStamp.Unix()), ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), @@ -680,6 +680,131 @@ func TestServer_GetBeaconBlock_Electra(t *testing.T) { require.NoError(t, err) } +func TestServer_GetBeaconBlock_Fulu(t *testing.T) { + db := dbutil.SetupDB(t) + ctx := context.Background() + transition.SkipSlotCache.Disable() + + params.SetupTestConfigCleanup(t) + cfg := params.BeaconConfig().Copy() + cfg.FuluForkEpoch = 6 + cfg.ElectraForkEpoch = 5 + cfg.DenebForkEpoch = 4 + cfg.CapellaForkEpoch = 3 + cfg.BellatrixForkEpoch = 2 + cfg.AltairForkEpoch = 1 + params.OverrideBeaconConfig(cfg) + beaconState, privKeys := util.DeterministicGenesisState(t, 64) + + stateRoot, err := beaconState.HashTreeRoot(ctx) + require.NoError(t, err, "Could not hash genesis state") + + genesis := b.NewGenesisBlock(stateRoot[:]) + util.SaveBlock(t, ctx, db, genesis) + + parentRoot, err := genesis.Block.HashTreeRoot() + require.NoError(t, err, "Could not get signing root") + require.NoError(t, db.SaveState(ctx, beaconState, parentRoot), "Could not save genesis state") + require.NoError(t, db.SaveHeadBlockRoot(ctx, parentRoot), "Could not save genesis state") + + fuluSlot, err := slots.EpochStart(params.BeaconConfig().FuluForkEpoch) + require.NoError(t, err) + + var scBits [fieldparams.SyncAggregateSyncCommitteeBytesLength]byte + dr := []*enginev1.DepositRequest{{ + Pubkey: bytesutil.PadTo(privKeys[0].PublicKey().Marshal(), 48), + WithdrawalCredentials: bytesutil.PadTo([]byte("wc"), 32), + Amount: 123, + Signature: bytesutil.PadTo([]byte("sig"), 96), + Index: 456, + }} + wr := []*enginev1.WithdrawalRequest{ + { + SourceAddress: bytesutil.PadTo([]byte("sa"), 20), + ValidatorPubkey: bytesutil.PadTo(privKeys[1].PublicKey().Marshal(), 48), + Amount: 789, + }, + } + cr := []*enginev1.ConsolidationRequest{ + { + SourceAddress: bytesutil.PadTo([]byte("sa"), 20), + SourcePubkey: bytesutil.PadTo(privKeys[1].PublicKey().Marshal(), 48), + TargetPubkey: bytesutil.PadTo(privKeys[2].PublicKey().Marshal(), 48), + }, + } + blk := ðpb.SignedBeaconBlockFulu{ + Block: ðpb.BeaconBlockFulu{ + Slot: fuluSlot + 1, + ParentRoot: parentRoot[:], + StateRoot: genesis.Block.StateRoot, + Body: ðpb.BeaconBlockBodyFulu{ + RandaoReveal: genesis.Block.Body.RandaoReveal, + Graffiti: genesis.Block.Body.Graffiti, + Eth1Data: genesis.Block.Body.Eth1Data, + SyncAggregate: ðpb.SyncAggregate{SyncCommitteeBits: scBits[:], SyncCommitteeSignature: make([]byte, 96)}, + ExecutionPayload: &enginev1.ExecutionPayloadDeneb{ + ParentHash: make([]byte, fieldparams.RootLength), + FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, fieldparams.LogsBloomLength), + PrevRandao: make([]byte, fieldparams.RootLength), + BaseFeePerGas: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, fieldparams.RootLength), + }, + ExecutionRequests: &enginev1.ExecutionRequests{ + Withdrawals: wr, + Deposits: dr, + Consolidations: cr, + }, + }, + }, + } + + blkRoot, err := blk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, err, "Could not get signing root") + require.NoError(t, db.SaveState(ctx, beaconState, blkRoot), "Could not save genesis state") + require.NoError(t, db.SaveHeadBlockRoot(ctx, blkRoot), "Could not save genesis state") + + random, err := helpers.RandaoMix(beaconState, slots.ToEpoch(beaconState.Slot())) + require.NoError(t, err) + timeStamp, err := slots.ToTime(beaconState.GenesisTime(), fuluSlot+1) + require.NoError(t, err) + payload := &enginev1.ExecutionPayloadDeneb{ + Timestamp: uint64(timeStamp.Unix()), + ParentHash: make([]byte, fieldparams.RootLength), + FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, fieldparams.LogsBloomLength), + PrevRandao: random, + BaseFeePerGas: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, fieldparams.RootLength), + } + proposerServer := getProposerServer(db, beaconState, parentRoot[:]) + ed, err := blocks.NewWrappedExecutionData(payload) + require.NoError(t, err) + proposerServer.ExecutionEngineCaller = &mockExecution.EngineClient{ + PayloadIDBytes: &enginev1.PayloadIDBytes{1}, + GetPayloadResponse: &blocks.GetPayloadResponse{ExecutionData: ed}, + } + + randaoReveal, err := util.RandaoReveal(beaconState, 0, privKeys) + require.NoError(t, err) + + graffiti := bytesutil.ToBytes32([]byte("eth2")) + require.NoError(t, err) + req := ðpb.BlockRequest{ + Slot: fuluSlot + 1, + RandaoReveal: randaoReveal, + Graffiti: graffiti[:], + } + + _, err = proposerServer.GetBeaconBlock(ctx, req) + require.NoError(t, err) +} + func TestServer_GetBeaconBlock_Optimistic(t *testing.T) { params.SetupTestConfigCleanup(t) cfg := params.BeaconConfig().Copy() diff --git a/beacon-chain/slasher/doc.go b/beacon-chain/slasher/doc.go index 46efb460b2af..44c09e2a0b55 100644 --- a/beacon-chain/slasher/doc.go +++ b/beacon-chain/slasher/doc.go @@ -129,7 +129,7 @@ A chunk value is stored on 2 bytes (uint16). ==> A chunk takes 8192 bytes = 8KB There is 4096 epochs / 16 epochs per chunk = 256 chunks per batch of 256 validators. -Storing all values fo a batch of 256 validators takes 256 * 8KB = 2MB +Storing all values of a batch of 256 validators takes 256 * 8KB = 2MB With 1_048_576 validators, we need 4096 * 2MB = 8GB Storing both MIN and MAX spans for 1_048_576 validators takes 16GB. diff --git a/beacon-chain/state/state-native/getters_payload_header.go b/beacon-chain/state/state-native/getters_payload_header.go index a3b156b3ead8..d269058ade8a 100644 --- a/beacon-chain/state/state-native/getters_payload_header.go +++ b/beacon-chain/state/state-native/getters_payload_header.go @@ -17,14 +17,17 @@ func (b *BeaconState) LatestExecutionPayloadHeader() (interfaces.ExecutionData, b.lock.RLock() defer b.lock.RUnlock() - switch b.version { - case version.Bellatrix: - return blocks.WrappedExecutionPayloadHeader(b.latestExecutionPayloadHeader.Copy()) - case version.Capella: - return blocks.WrappedExecutionPayloadHeaderCapella(b.latestExecutionPayloadHeaderCapella.Copy()) - case version.Deneb, version.Electra: + if b.version >= version.Deneb { return blocks.WrappedExecutionPayloadHeaderDeneb(b.latestExecutionPayloadHeaderDeneb.Copy()) - default: - return nil, fmt.Errorf("unsupported version (%s) for latest execution payload header", version.String(b.version)) } + + if b.version >= version.Capella { + return blocks.WrappedExecutionPayloadHeaderCapella(b.latestExecutionPayloadHeaderCapella.Copy()) + } + + if b.version >= version.Bellatrix { + return blocks.WrappedExecutionPayloadHeader(b.latestExecutionPayloadHeader.Copy()) + } + + return nil, fmt.Errorf("unsupported version (%s) for latest execution payload header", version.String(b.version)) } diff --git a/beacon-chain/state/state-native/getters_state.go b/beacon-chain/state/state-native/getters_state.go index b4512a8a2744..5e0e461a8bd1 100644 --- a/beacon-chain/state/state-native/getters_state.go +++ b/beacon-chain/state/state-native/getters_state.go @@ -222,6 +222,46 @@ func (b *BeaconState) ToProtoUnsafe() interface{} { PendingPartialWithdrawals: b.pendingPartialWithdrawals, PendingConsolidations: b.pendingConsolidations, } + case version.Fulu: + return ðpb.BeaconStateFulu{ + GenesisTime: b.genesisTime, + GenesisValidatorsRoot: gvrCopy[:], + Slot: b.slot, + Fork: b.fork, + LatestBlockHeader: b.latestBlockHeader, + BlockRoots: br, + StateRoots: sr, + HistoricalRoots: b.historicalRoots.Slice(), + Eth1Data: b.eth1Data, + Eth1DataVotes: b.eth1DataVotes, + Eth1DepositIndex: b.eth1DepositIndex, + Validators: vals, + Balances: bals, + RandaoMixes: rm, + Slashings: b.slashings, + PreviousEpochParticipation: b.previousEpochParticipation, + CurrentEpochParticipation: b.currentEpochParticipation, + JustificationBits: b.justificationBits, + PreviousJustifiedCheckpoint: b.previousJustifiedCheckpoint, + CurrentJustifiedCheckpoint: b.currentJustifiedCheckpoint, + FinalizedCheckpoint: b.finalizedCheckpoint, + InactivityScores: inactivityScores, + CurrentSyncCommittee: b.currentSyncCommittee, + NextSyncCommittee: b.nextSyncCommittee, + LatestExecutionPayloadHeader: b.latestExecutionPayloadHeaderDeneb, + NextWithdrawalIndex: b.nextWithdrawalIndex, + NextWithdrawalValidatorIndex: b.nextWithdrawalValidatorIndex, + HistoricalSummaries: b.historicalSummaries, + DepositRequestsStartIndex: b.depositRequestsStartIndex, + DepositBalanceToConsume: b.depositBalanceToConsume, + ExitBalanceToConsume: b.exitBalanceToConsume, + EarliestExitEpoch: b.earliestExitEpoch, + ConsolidationBalanceToConsume: b.consolidationBalanceToConsume, + EarliestConsolidationEpoch: b.earliestConsolidationEpoch, + PendingDeposits: b.pendingDeposits, + PendingPartialWithdrawals: b.pendingPartialWithdrawals, + PendingConsolidations: b.pendingConsolidations, + } default: return nil } @@ -428,6 +468,46 @@ func (b *BeaconState) ToProto() interface{} { PendingPartialWithdrawals: b.pendingPartialWithdrawalsVal(), PendingConsolidations: b.pendingConsolidationsVal(), } + case version.Fulu: + return ðpb.BeaconStateFulu{ + GenesisTime: b.genesisTime, + GenesisValidatorsRoot: gvrCopy[:], + Slot: b.slot, + Fork: b.forkVal(), + LatestBlockHeader: b.latestBlockHeaderVal(), + BlockRoots: br, + StateRoots: sr, + HistoricalRoots: b.historicalRoots.Slice(), + Eth1Data: b.eth1DataVal(), + Eth1DataVotes: b.eth1DataVotesVal(), + Eth1DepositIndex: b.eth1DepositIndex, + Validators: b.validatorsVal(), + Balances: b.balancesVal(), + RandaoMixes: rm, + Slashings: b.slashingsVal(), + PreviousEpochParticipation: b.previousEpochParticipationVal(), + CurrentEpochParticipation: b.currentEpochParticipationVal(), + JustificationBits: b.justificationBitsVal(), + PreviousJustifiedCheckpoint: b.previousJustifiedCheckpointVal(), + CurrentJustifiedCheckpoint: b.currentJustifiedCheckpointVal(), + FinalizedCheckpoint: b.finalizedCheckpointVal(), + InactivityScores: b.inactivityScoresVal(), + CurrentSyncCommittee: b.currentSyncCommitteeVal(), + NextSyncCommittee: b.nextSyncCommitteeVal(), + LatestExecutionPayloadHeader: b.latestExecutionPayloadHeaderDeneb.Copy(), + NextWithdrawalIndex: b.nextWithdrawalIndex, + NextWithdrawalValidatorIndex: b.nextWithdrawalValidatorIndex, + HistoricalSummaries: b.historicalSummariesVal(), + DepositRequestsStartIndex: b.depositRequestsStartIndex, + DepositBalanceToConsume: b.depositBalanceToConsume, + ExitBalanceToConsume: b.exitBalanceToConsume, + EarliestExitEpoch: b.earliestExitEpoch, + ConsolidationBalanceToConsume: b.consolidationBalanceToConsume, + EarliestConsolidationEpoch: b.earliestConsolidationEpoch, + PendingDeposits: b.pendingDepositsVal(), + PendingPartialWithdrawals: b.pendingPartialWithdrawalsVal(), + PendingConsolidations: b.pendingConsolidationsVal(), + } default: return nil } @@ -553,3 +633,13 @@ func ProtobufBeaconStateElectra(s interface{}) (*ethpb.BeaconStateElectra, error } return pbState, nil } + +// ProtobufBeaconStateFulu transforms an input into beacon state Fulu in the form of protobuf. +// Error is returned if the input is not type protobuf beacon state. +func ProtobufBeaconStateFulu(s interface{}) (*ethpb.BeaconStateFulu, error) { + pbState, ok := s.(*ethpb.BeaconStateFulu) + if !ok { + return nil, errors.New("input is not type pb.BeaconStateFulu") + } + return pbState, nil +} diff --git a/beacon-chain/state/state-native/getters_withdrawal_test.go b/beacon-chain/state/state-native/getters_withdrawal_test.go index bc3895006f24..1fc8f188a743 100644 --- a/beacon-chain/state/state-native/getters_withdrawal_test.go +++ b/beacon-chain/state/state-native/getters_withdrawal_test.go @@ -64,7 +64,7 @@ func TestNextWithdrawalValidatorIndex(t *testing.T) { } func TestExpectedWithdrawals(t *testing.T) { - for _, stateVersion := range []int{version.Capella, version.Deneb, version.Electra} { + for _, stateVersion := range []int{version.Capella, version.Deneb, version.Electra, version.Fulu} { t.Run(version.String(stateVersion), func(t *testing.T) { t.Run("no withdrawals", func(t *testing.T) { s := state_native.EmptyStateFromVersion(t, stateVersion) diff --git a/beacon-chain/state/state-native/hasher.go b/beacon-chain/state/state-native/hasher.go index 96303cde4fef..781b244827f5 100644 --- a/beacon-chain/state/state-native/hasher.go +++ b/beacon-chain/state/state-native/hasher.go @@ -41,6 +41,8 @@ func ComputeFieldRootsWithHasher(ctx context.Context, state *BeaconState) ([][]b fieldRoots = make([][]byte, params.BeaconConfig().BeaconStateDenebFieldCount) case version.Electra: fieldRoots = make([][]byte, params.BeaconConfig().BeaconStateElectraFieldCount) + case version.Fulu: + fieldRoots = make([][]byte, params.BeaconConfig().BeaconStateFuluFieldCount) default: return nil, fmt.Errorf("unknown state version %s", version.String(state.version)) } diff --git a/beacon-chain/state/state-native/setters_eth1_test.go b/beacon-chain/state/state-native/setters_eth1_test.go index a42a93c14eda..ccfa745f6b5b 100644 --- a/beacon-chain/state/state-native/setters_eth1_test.go +++ b/beacon-chain/state/state-native/setters_eth1_test.go @@ -5,7 +5,6 @@ import ( state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native" "github.com/prysmaticlabs/prysm/v5/config/params" - eth "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/testing/require" ) @@ -32,7 +31,7 @@ func BenchmarkAppendEth1DataVotes(b *testing.B) { ref := st.Copy() for i := 0; i < b.N; i++ { - err := ref.AppendEth1DataVotes(ð.Eth1Data{DepositCount: uint64(i)}) + err := ref.AppendEth1DataVotes(ðpb.Eth1Data{DepositCount: uint64(i)}) require.NoError(b, err) ref = st.Copy() } diff --git a/beacon-chain/state/state-native/setters_payload_header.go b/beacon-chain/state/state-native/setters_payload_header.go index 5011cb674867..535af82065e3 100644 --- a/beacon-chain/state/state-native/setters_payload_header.go +++ b/beacon-chain/state/state-native/setters_payload_header.go @@ -45,7 +45,7 @@ func (b *BeaconState) SetLatestExecutionPayloadHeader(val interfaces.ExecutionDa b.markFieldAsDirty(types.LatestExecutionPayloadHeaderCapella) return nil case *enginev1.ExecutionPayloadDeneb: - if b.version != version.Deneb && b.version != version.Electra { + if !(b.version >= version.Deneb) { return fmt.Errorf("wrong state version (%s) for deneb execution payload", version.String(b.version)) } latest, err := consensusblocks.PayloadToHeaderDeneb(val) @@ -70,7 +70,7 @@ func (b *BeaconState) SetLatestExecutionPayloadHeader(val interfaces.ExecutionDa b.markFieldAsDirty(types.LatestExecutionPayloadHeaderCapella) return nil case *enginev1.ExecutionPayloadHeaderDeneb: - if b.version != version.Deneb && b.version != version.Electra { + if !(b.version >= version.Deneb) { return fmt.Errorf("wrong state version (%s) for deneb execution payload header", version.String(b.version)) } b.latestExecutionPayloadHeaderDeneb = header diff --git a/beacon-chain/state/state-native/setters_payload_header_test.go b/beacon-chain/state/state-native/setters_payload_header_test.go index b9f806591815..74dda536a19c 100644 --- a/beacon-chain/state/state-native/setters_payload_header_test.go +++ b/beacon-chain/state/state-native/setters_payload_header_test.go @@ -35,7 +35,7 @@ func TestSetLatestExecutionPayloadHeader(t *testing.T) { }(), func() interfaces.ExecutionData { e := util.NewBeaconBlockElectra().Block.Body.ExecutionPayload - ee, err := blocks.WrappedExecutionPayloadElectra(e) + ee, err := blocks.WrappedExecutionPayloadDeneb(e) require.NoError(t, err) return ee }(), diff --git a/beacon-chain/state/state-native/spec_parameters.go b/beacon-chain/state/state-native/spec_parameters.go index 7c955e92c1d2..c82fe42d83ef 100644 --- a/beacon-chain/state/state-native/spec_parameters.go +++ b/beacon-chain/state/state-native/spec_parameters.go @@ -6,25 +6,33 @@ import ( ) func (b *BeaconState) ProportionalSlashingMultiplier() (uint64, error) { - switch b.version { - case version.Bellatrix, version.Capella, version.Deneb, version.Electra: + if b.version >= version.Bellatrix { return params.BeaconConfig().ProportionalSlashingMultiplierBellatrix, nil - case version.Altair: + } + + if b.version >= version.Altair { return params.BeaconConfig().ProportionalSlashingMultiplierAltair, nil - case version.Phase0: + } + + if b.version >= version.Phase0 { return params.BeaconConfig().ProportionalSlashingMultiplier, nil } + return 0, errNotSupported("ProportionalSlashingMultiplier", b.version) } func (b *BeaconState) InactivityPenaltyQuotient() (uint64, error) { - switch b.version { - case version.Bellatrix, version.Capella, version.Deneb, version.Electra: + if b.version >= version.Bellatrix { return params.BeaconConfig().InactivityPenaltyQuotientBellatrix, nil - case version.Altair: + } + + if b.version >= version.Altair { return params.BeaconConfig().InactivityPenaltyQuotientAltair, nil - case version.Phase0: + } + + if b.version >= version.Phase0 { return params.BeaconConfig().InactivityPenaltyQuotient, nil } + return 0, errNotSupported("InactivityPenaltyQuotient", b.version) } diff --git a/beacon-chain/state/state-native/state_trie.go b/beacon-chain/state/state-native/state_trie.go index 66f2fbf89d88..b2a22212ca87 100644 --- a/beacon-chain/state/state-native/state_trie.go +++ b/beacon-chain/state/state-native/state_trie.go @@ -25,90 +25,90 @@ import ( "google.golang.org/protobuf/proto" ) -var phase0Fields = []types.FieldIndex{ - types.GenesisTime, - types.GenesisValidatorsRoot, - types.Slot, - types.Fork, - types.LatestBlockHeader, - types.BlockRoots, - types.StateRoots, - types.HistoricalRoots, - types.Eth1Data, - types.Eth1DataVotes, - types.Eth1DepositIndex, - types.Validators, - types.Balances, - types.RandaoMixes, - types.Slashings, - types.PreviousEpochAttestations, - types.CurrentEpochAttestations, - types.JustificationBits, - types.PreviousJustifiedCheckpoint, - types.CurrentJustifiedCheckpoint, - types.FinalizedCheckpoint, -} - -var altairFields = []types.FieldIndex{ - types.GenesisTime, - types.GenesisValidatorsRoot, - types.Slot, - types.Fork, - types.LatestBlockHeader, - types.BlockRoots, - types.StateRoots, - types.HistoricalRoots, - types.Eth1Data, - types.Eth1DataVotes, - types.Eth1DepositIndex, - types.Validators, - types.Balances, - types.RandaoMixes, - types.Slashings, - types.PreviousEpochParticipationBits, - types.CurrentEpochParticipationBits, - types.JustificationBits, - types.PreviousJustifiedCheckpoint, - types.CurrentJustifiedCheckpoint, - types.FinalizedCheckpoint, - types.InactivityScores, - types.CurrentSyncCommittee, - types.NextSyncCommittee, -} - -var bellatrixFields = append(altairFields, types.LatestExecutionPayloadHeader) - -var capellaFields = append( - altairFields, - types.LatestExecutionPayloadHeaderCapella, - types.NextWithdrawalIndex, - types.NextWithdrawalValidatorIndex, - types.HistoricalSummaries, -) - -var denebFields = append( - altairFields, - types.LatestExecutionPayloadHeaderDeneb, - types.NextWithdrawalIndex, - types.NextWithdrawalValidatorIndex, - types.HistoricalSummaries, -) - -var electraFields = append( - altairFields, - types.LatestExecutionPayloadHeaderDeneb, - types.NextWithdrawalIndex, - types.NextWithdrawalValidatorIndex, - types.HistoricalSummaries, - types.DepositRequestsStartIndex, - types.DepositBalanceToConsume, - types.ExitBalanceToConsume, - types.EarliestExitEpoch, - types.ConsolidationBalanceToConsume, - types.EarliestConsolidationEpoch, - types.PendingDeposits, - types.PendingPartialWithdrawals, - types.PendingConsolidations, +var ( + phase0Fields = []types.FieldIndex{ + types.GenesisTime, + types.GenesisValidatorsRoot, + types.Slot, + types.Fork, + types.LatestBlockHeader, + types.BlockRoots, + types.StateRoots, + types.HistoricalRoots, + types.Eth1Data, + types.Eth1DataVotes, + types.Eth1DepositIndex, + types.Validators, + types.Balances, + types.RandaoMixes, + types.Slashings, + types.PreviousEpochAttestations, + types.CurrentEpochAttestations, + types.JustificationBits, + types.PreviousJustifiedCheckpoint, + types.CurrentJustifiedCheckpoint, + types.FinalizedCheckpoint, + } + + altairFields = []types.FieldIndex{ + types.GenesisTime, + types.GenesisValidatorsRoot, + types.Slot, + types.Fork, + types.LatestBlockHeader, + types.BlockRoots, + types.StateRoots, + types.HistoricalRoots, + types.Eth1Data, + types.Eth1DataVotes, + types.Eth1DepositIndex, + types.Validators, + types.Balances, + types.RandaoMixes, + types.Slashings, + types.PreviousEpochParticipationBits, + types.CurrentEpochParticipationBits, + types.JustificationBits, + types.PreviousJustifiedCheckpoint, + types.CurrentJustifiedCheckpoint, + types.FinalizedCheckpoint, + types.InactivityScores, + types.CurrentSyncCommittee, + types.NextSyncCommittee, + } + + bellatrixFields = append(altairFields, types.LatestExecutionPayloadHeader) + + capellaFields = append( + altairFields, + types.LatestExecutionPayloadHeaderCapella, + types.NextWithdrawalIndex, + types.NextWithdrawalValidatorIndex, + types.HistoricalSummaries, + ) + + denebFields = append( + altairFields, + types.LatestExecutionPayloadHeaderDeneb, + types.NextWithdrawalIndex, + types.NextWithdrawalValidatorIndex, + types.HistoricalSummaries, + ) + + electraFields = append( + denebFields, + types.DepositRequestsStartIndex, + types.DepositBalanceToConsume, + types.ExitBalanceToConsume, + types.EarliestExitEpoch, + types.ConsolidationBalanceToConsume, + types.EarliestConsolidationEpoch, + types.PendingDeposits, + types.PendingPartialWithdrawals, + types.PendingConsolidations, + ) + + fuluFields = electraFields ) const ( @@ -118,12 +118,14 @@ const ( capellaSharedFieldRefCount = 13 denebSharedFieldRefCount = 13 electraSharedFieldRefCount = 16 + fuluSharedFieldRefCount = 16 experimentalStatePhase0SharedFieldRefCount = 5 experimentalStateAltairSharedFieldRefCount = 5 experimentalStateBellatrixSharedFieldRefCount = 6 experimentalStateCapellaSharedFieldRefCount = 7 experimentalStateDenebSharedFieldRefCount = 7 experimentalStateElectraSharedFieldRefCount = 10 + experimentalStateFuluSharedFieldRefCount = 10 ) // InitializeFromProtoPhase0 the beacon state from a protobuf representation. @@ -151,10 +153,16 @@ func InitializeFromProtoDeneb(st *ethpb.BeaconStateDeneb) (state.BeaconState, er return InitializeFromProtoUnsafeDeneb(proto.Clone(st).(*ethpb.BeaconStateDeneb)) } +// InitializeFromProtoElectra the beacon state from a protobuf representation. func InitializeFromProtoElectra(st *ethpb.BeaconStateElectra) (state.BeaconState, error) { return InitializeFromProtoUnsafeElectra(proto.Clone(st).(*ethpb.BeaconStateElectra)) } +// InitializeFromProtoFulu the beacon state from a protobuf representation. +func InitializeFromProtoFulu(st *ethpb.BeaconStateFulu) (state.BeaconState, error) { + return InitializeFromProtoUnsafeFulu(proto.Clone(st).(*ethpb.BeaconStateFulu)) +} + // InitializeFromProtoUnsafePhase0 directly uses the beacon state protobuf fields // and sets them as fields of the BeaconState type. func InitializeFromProtoUnsafePhase0(st *ethpb.BeaconState) (state.BeaconState, error) { @@ -832,6 +840,131 @@ func InitializeFromProtoUnsafeElectra(st *ethpb.BeaconStateElectra) (state.Beaco return b, nil } +// InitializeFromProtoUnsafeElectra directly uses the beacon state protobuf fields +// and sets them as fields of the BeaconState type. +func InitializeFromProtoUnsafeFulu(st *ethpb.BeaconStateFulu) (state.BeaconState, error) { + if st == nil { + return nil, errors.New("received nil state") + } + + hRoots := customtypes.HistoricalRoots(make([][32]byte, len(st.HistoricalRoots))) + for i, r := range st.HistoricalRoots { + hRoots[i] = bytesutil.ToBytes32(r) + } + + fieldCount := params.BeaconConfig().BeaconStateFuluFieldCount + b := &BeaconState{ + version: version.Fulu, + genesisTime: st.GenesisTime, + genesisValidatorsRoot: bytesutil.ToBytes32(st.GenesisValidatorsRoot), + slot: st.Slot, + fork: st.Fork, + latestBlockHeader: st.LatestBlockHeader, + historicalRoots: hRoots, + eth1Data: st.Eth1Data, + eth1DataVotes: st.Eth1DataVotes, + eth1DepositIndex: st.Eth1DepositIndex, + slashings: st.Slashings, + previousEpochParticipation: st.PreviousEpochParticipation, + currentEpochParticipation: st.CurrentEpochParticipation, + justificationBits: st.JustificationBits, + previousJustifiedCheckpoint: st.PreviousJustifiedCheckpoint, + currentJustifiedCheckpoint: st.CurrentJustifiedCheckpoint, + finalizedCheckpoint: st.FinalizedCheckpoint, + currentSyncCommittee: st.CurrentSyncCommittee, + nextSyncCommittee: st.NextSyncCommittee, + latestExecutionPayloadHeaderDeneb: st.LatestExecutionPayloadHeader, + nextWithdrawalIndex: st.NextWithdrawalIndex, + nextWithdrawalValidatorIndex: st.NextWithdrawalValidatorIndex, + historicalSummaries: st.HistoricalSummaries, + depositRequestsStartIndex: st.DepositRequestsStartIndex, + depositBalanceToConsume: st.DepositBalanceToConsume, + exitBalanceToConsume: st.ExitBalanceToConsume, + earliestExitEpoch: st.EarliestExitEpoch, + consolidationBalanceToConsume: st.ConsolidationBalanceToConsume, + earliestConsolidationEpoch: st.EarliestConsolidationEpoch, + pendingDeposits: st.PendingDeposits, + pendingPartialWithdrawals: st.PendingPartialWithdrawals, + pendingConsolidations: st.PendingConsolidations, + + dirtyFields: make(map[types.FieldIndex]bool, fieldCount), + dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount), + stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount), + rebuildTrie: make(map[types.FieldIndex]bool, fieldCount), + valMapHandler: stateutil.NewValMapHandler(st.Validators), + } + + if features.Get().EnableExperimentalState { + b.blockRootsMultiValue = NewMultiValueBlockRoots(st.BlockRoots) + b.stateRootsMultiValue = NewMultiValueStateRoots(st.StateRoots) + b.randaoMixesMultiValue = NewMultiValueRandaoMixes(st.RandaoMixes) + b.balancesMultiValue = NewMultiValueBalances(st.Balances) + b.validatorsMultiValue = NewMultiValueValidators(st.Validators) + b.inactivityScoresMultiValue = NewMultiValueInactivityScores(st.InactivityScores) + b.sharedFieldReferences = make(map[types.FieldIndex]*stateutil.Reference, experimentalStateElectraSharedFieldRefCount) + } else { + bRoots := make([][32]byte, fieldparams.BlockRootsLength) + for i, r := range st.BlockRoots { + bRoots[i] = bytesutil.ToBytes32(r) + } + b.blockRoots = bRoots + + sRoots := make([][32]byte, fieldparams.StateRootsLength) + for i, r := range st.StateRoots { + sRoots[i] = bytesutil.ToBytes32(r) + } + b.stateRoots = sRoots + + mixes := make([][32]byte, fieldparams.RandaoMixesLength) + for i, m := range st.RandaoMixes { + mixes[i] = bytesutil.ToBytes32(m) + } + b.randaoMixes = mixes + + b.balances = st.Balances + b.validators = st.Validators + b.inactivityScores = st.InactivityScores + + b.sharedFieldReferences = make(map[types.FieldIndex]*stateutil.Reference, electraSharedFieldRefCount) + } + + for _, f := range fuluFields { + b.dirtyFields[f] = true + b.rebuildTrie[f] = true + b.dirtyIndices[f] = []uint64{} + trie, err := fieldtrie.NewFieldTrie(f, types.BasicArray, nil, 0) + if err != nil { + return nil, err + } + b.stateFieldLeaves[f] = trie + } + + // Initialize field reference tracking for shared data. + b.sharedFieldReferences[types.HistoricalRoots] = stateutil.NewRef(1) + b.sharedFieldReferences[types.Eth1DataVotes] = stateutil.NewRef(1) + b.sharedFieldReferences[types.Slashings] = stateutil.NewRef(1) + b.sharedFieldReferences[types.PreviousEpochParticipationBits] = stateutil.NewRef(1) + b.sharedFieldReferences[types.CurrentEpochParticipationBits] = stateutil.NewRef(1) + b.sharedFieldReferences[types.LatestExecutionPayloadHeaderDeneb] = stateutil.NewRef(1) // New in Electra. + b.sharedFieldReferences[types.HistoricalSummaries] = stateutil.NewRef(1) // New in Capella. + b.sharedFieldReferences[types.PendingDeposits] = stateutil.NewRef(1) // New in Electra. + b.sharedFieldReferences[types.PendingPartialWithdrawals] = stateutil.NewRef(1) // New in Electra. + b.sharedFieldReferences[types.PendingConsolidations] = stateutil.NewRef(1) // New in Electra. + if !features.Get().EnableExperimentalState { + b.sharedFieldReferences[types.BlockRoots] = stateutil.NewRef(1) + b.sharedFieldReferences[types.StateRoots] = stateutil.NewRef(1) + b.sharedFieldReferences[types.RandaoMixes] = stateutil.NewRef(1) + b.sharedFieldReferences[types.Balances] = stateutil.NewRef(1) + b.sharedFieldReferences[types.Validators] = stateutil.NewRef(1) + b.sharedFieldReferences[types.InactivityScores] = stateutil.NewRef(1) + } + + state.Count.Inc() + // Finalizer runs when dst is being destroyed in garbage collection. + runtime.SetFinalizer(b, finalizerCleanup) + return b, nil +} + // Copy returns a deep copy of the beacon state. func (b *BeaconState) Copy() state.BeaconState { b.lock.RLock() @@ -851,6 +984,8 @@ func (b *BeaconState) Copy() state.BeaconState { fieldCount = params.BeaconConfig().BeaconStateDenebFieldCount case version.Electra: fieldCount = params.BeaconConfig().BeaconStateElectraFieldCount + case version.Fulu: + fieldCount = params.BeaconConfig().BeaconStateFuluFieldCount } dst := &BeaconState{ @@ -947,6 +1082,8 @@ func (b *BeaconState) Copy() state.BeaconState { dst.sharedFieldReferences = make(map[types.FieldIndex]*stateutil.Reference, experimentalStateDenebSharedFieldRefCount) case version.Electra: dst.sharedFieldReferences = make(map[types.FieldIndex]*stateutil.Reference, experimentalStateElectraSharedFieldRefCount) + case version.Fulu: + dst.sharedFieldReferences = make(map[types.FieldIndex]*stateutil.Reference, experimentalStateFuluSharedFieldRefCount) } } else { switch b.version { @@ -962,6 +1099,8 @@ func (b *BeaconState) Copy() state.BeaconState { dst.sharedFieldReferences = make(map[types.FieldIndex]*stateutil.Reference, denebSharedFieldRefCount) case version.Electra: dst.sharedFieldReferences = make(map[types.FieldIndex]*stateutil.Reference, electraSharedFieldRefCount) + case version.Fulu: + dst.sharedFieldReferences = make(map[types.FieldIndex]*stateutil.Reference, fuluSharedFieldRefCount) } } @@ -1056,6 +1195,8 @@ func (b *BeaconState) initializeMerkleLayers(ctx context.Context) error { b.dirtyFields = make(map[types.FieldIndex]bool, params.BeaconConfig().BeaconStateDenebFieldCount) case version.Electra: b.dirtyFields = make(map[types.FieldIndex]bool, params.BeaconConfig().BeaconStateElectraFieldCount) + case version.Fulu: + b.dirtyFields = make(map[types.FieldIndex]bool, params.BeaconConfig().BeaconStateFuluFieldCount) default: return fmt.Errorf("unknown state version (%s) when computing dirty fields in merklization", version.String(b.version)) } diff --git a/beacon-chain/state/stategen/replay_test.go b/beacon-chain/state/stategen/replay_test.go index bc03583d89e1..eac26cfc1ecf 100644 --- a/beacon-chain/state/stategen/replay_test.go +++ b/beacon-chain/state/stategen/replay_test.go @@ -158,6 +158,8 @@ func TestReplayBlocks_ThroughFutureForkBoundaries(t *testing.T) { bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.DenebForkVersion)] = 4 bCfg.ElectraForkEpoch = 5 bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.ElectraForkVersion)] = 5 + bCfg.FuluForkEpoch = 6 + bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.FuluForkVersion)] = 6 params.OverrideBeaconConfig(bCfg) beaconState, _ := util.DeterministicGenesisState(t, 32) diff --git a/beacon-chain/sync/BUILD.bazel b/beacon-chain/sync/BUILD.bazel index 6378d7e1e125..69690a8c2f82 100644 --- a/beacon-chain/sync/BUILD.bazel +++ b/beacon-chain/sync/BUILD.bazel @@ -253,7 +253,6 @@ go_test( "//encoding/bytesutil:go_default_library", "//network/forks:go_default_library", "//proto/engine/v1:go_default_library", - "//proto/eth/v2:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/attestation:go_default_library", "//proto/prysm/v1alpha1/metadata:go_default_library", diff --git a/beacon-chain/sync/backfill/verify_test.go b/beacon-chain/sync/backfill/verify_test.go index 19253ba7fcfe..f5e86003cdd2 100644 --- a/beacon-chain/sync/backfill/verify_test.go +++ b/beacon-chain/sync/backfill/verify_test.go @@ -1,6 +1,7 @@ package backfill import ( + "math" "testing" "github.com/ethereum/go-ethereum/common/hexutil" @@ -19,14 +20,21 @@ import ( ) func TestDomainCache(t *testing.T) { - cfg := params.MainnetConfig() + cfg := params.MainnetConfig().Copy() + // This hack is needed not to have both Electra and Fulu fork epoch both set to the future max epoch. + // It can be removed once the Electra fork version has been set to a real value. + for version := range cfg.ForkVersionSchedule { + if cfg.ForkVersionNames[version] == "electra" { + cfg.ForkVersionSchedule[version] = math.MaxUint64 - 1 + } + } + vRoot, err := hexutil.Decode("0x0011223344556677889900112233445566778899001122334455667788990011") dType := cfg.DomainBeaconProposer require.NoError(t, err) require.Equal(t, 32, len(vRoot)) fsched := forks.NewOrderedSchedule(cfg) - dc, err := newDomainCache(vRoot, - dType, fsched) + dc, err := newDomainCache(vRoot, dType, fsched) require.NoError(t, err) require.Equal(t, len(fsched), len(dc.forkDomains)) for i := range fsched { diff --git a/beacon-chain/sync/blobs_test.go b/beacon-chain/sync/blobs_test.go index 8415a8c4fec1..5b22de484fb7 100644 --- a/beacon-chain/sync/blobs_test.go +++ b/beacon-chain/sync/blobs_test.go @@ -220,8 +220,16 @@ func (c *blobsTestCase) setup(t *testing.T) (*Service, []blocks.ROBlob, func()) byRootRate := params.BeaconConfig().MaxRequestBlobSidecars * uint64(params.BeaconConfig().MaxBlobsPerBlock(0)) byRangeRate := params.BeaconConfig().MaxRequestBlobSidecars * uint64(params.BeaconConfig().MaxBlobsPerBlock(0)) + byRootRateElectra := params.BeaconConfig().MaxRequestBlobSidecarsElectra * uint64(params.BeaconConfig().MaxBlobsPerBlock(0)) + byRangeRateElectra := params.BeaconConfig().MaxRequestBlobSidecarsElectra * uint64(params.BeaconConfig().MaxBlobsPerBlock(0)) + byRootRateFulu := params.BeaconConfig().MaxRequestBlobSidecarsFulu * uint64(params.BeaconConfig().MaxBlobsPerBlock(0)) + byRangeRateFulu := params.BeaconConfig().MaxRequestBlobSidecarsFulu * uint64(params.BeaconConfig().MaxBlobsPerBlock(0)) s.setRateCollector(p2p.RPCBlobSidecarsByRootTopicV1, leakybucket.NewCollector(0.000001, int64(byRootRate), time.Second, false)) s.setRateCollector(p2p.RPCBlobSidecarsByRangeTopicV1, leakybucket.NewCollector(0.000001, int64(byRangeRate), time.Second, false)) + s.setRateCollector(p2p.RPCBlobSidecarsByRootTopicV2, leakybucket.NewCollector(0.000001, int64(byRootRateElectra), time.Second, false)) + s.setRateCollector(p2p.RPCBlobSidecarsByRangeTopicV2, leakybucket.NewCollector(0.000001, int64(byRangeRateElectra), time.Second, false)) + s.setRateCollector(p2p.RPCBlobSidecarsByRootTopicV3, leakybucket.NewCollector(0.000001, int64(byRootRateFulu), time.Second, false)) + s.setRateCollector(p2p.RPCBlobSidecarsByRangeTopicV3, leakybucket.NewCollector(0.000001, int64(byRangeRateFulu), time.Second, false)) return s, sidecars, cleanup } diff --git a/beacon-chain/sync/data_columns_sampling_test.go b/beacon-chain/sync/data_columns_sampling_test.go index d8db3af96f40..d1c8a0a6eaa4 100644 --- a/beacon-chain/sync/data_columns_sampling_test.go +++ b/beacon-chain/sync/data_columns_sampling_test.go @@ -199,7 +199,7 @@ func setupDataColumnSamplerTest(t *testing.T, blobCount uint64) (*dataSamplerTes ctx: context.Background(), p2pSvc: p2pSvc, peers: []*p2ptest.TestP2P{}, - ctxMap: map[[4]byte]int{{245, 165, 253, 66}: version.Electra}, + ctxMap: map[[4]byte]int{{245, 165, 253, 66}: version.Fulu}, chainSvc: chainSvc, blockProcessedData: blockProcessedData, blobs: blobs, diff --git a/beacon-chain/sync/decode_pubsub_test.go b/beacon-chain/sync/decode_pubsub_test.go index 1ae8f0dd6ede..009737227807 100644 --- a/beacon-chain/sync/decode_pubsub_test.go +++ b/beacon-chain/sync/decode_pubsub_test.go @@ -129,6 +129,8 @@ func TestExtractDataType(t *testing.T) { require.NoError(t, err) electraDigest, err := signing.ComputeForkDigest(params.BeaconConfig().ElectraForkVersion, params.BeaconConfig().ZeroHash[:]) require.NoError(t, err) + fuluDigest, err := signing.ComputeForkDigest(params.BeaconConfig().FuluForkVersion, params.BeaconConfig().ZeroHash[:]) + require.NoError(t, err) type args struct { digest []byte @@ -278,6 +280,22 @@ func TestExtractDataType(t *testing.T) { wantAggregate: ðpb.SignedAggregateAttestationAndProofElectra{}, wantErr: false, }, + { + name: "fulu fork version", + args: args{ + digest: fuluDigest[:], + chain: &mock.ChainService{ValidatorsRoot: [32]byte{}}, + }, + wantBlock: func() interfaces.ReadOnlySignedBeaconBlock { + wsb, err := blocks.NewSignedBeaconBlock(ðpb.SignedBeaconBlockFulu{Block: ðpb.BeaconBlockFulu{Body: ðpb.BeaconBlockBodyFulu{ExecutionPayload: &enginev1.ExecutionPayloadDeneb{}}}}) + require.NoError(t, err) + return wsb + }(), + wantMd: wrapper.WrappedMetadataV1(ðpb.MetaDataV1{}), + wantAtt: ðpb.AttestationElectra{}, + wantAggregate: ðpb.SignedAggregateAttestationAndProofElectra{}, + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/beacon-chain/sync/fork_watcher_test.go b/beacon-chain/sync/fork_watcher_test.go index 643dc8e3b6c1..fc6c49d6ebcd 100644 --- a/beacon-chain/sync/fork_watcher_test.go +++ b/beacon-chain/sync/fork_watcher_test.go @@ -188,6 +188,95 @@ func TestService_CheckForNextEpochFork(t *testing.T) { assert.Equal(t, true, rpcMap[p2p.RPCBlobSidecarsByRootTopicV1+s.cfg.p2p.Encoding().ProtocolSuffix()], "topic doesn't exist") }, }, + { + name: "electra fork in the next epoch", + svcCreator: func(t *testing.T) *Service { + peer2peer := p2ptest.NewTestP2P(t) + gt := time.Now().Add(-4 * oneEpoch()) + vr := [32]byte{'A'} + chainService := &mockChain.ChainService{ + Genesis: gt, + ValidatorsRoot: vr, + } + bCfg := params.BeaconConfig().Copy() + bCfg.ElectraForkEpoch = 5 + params.OverrideBeaconConfig(bCfg) + params.BeaconConfig().InitializeForkSchedule() + ctx, cancel := context.WithCancel(context.Background()) + r := &Service{ + ctx: ctx, + cancel: cancel, + cfg: &config{ + p2p: peer2peer, + chain: chainService, + clock: startup.NewClock(gt, vr), + initialSync: &mockSync.Sync{IsSyncing: false}, + }, + chainStarted: abool.New(), + subHandler: newSubTopicHandler(), + } + return r + }, + currEpoch: 4, + wantErr: false, + postSvcCheck: func(t *testing.T, s *Service) { + genRoot := s.cfg.clock.GenesisValidatorsRoot() + digest, err := forks.ForkDigestFromEpoch(5, genRoot[:]) + assert.NoError(t, err) + assert.Equal(t, true, s.subHandler.digestExists(digest)) + rpcMap := make(map[string]bool) + for _, p := range s.cfg.p2p.Host().Mux().Protocols() { + rpcMap[string(p)] = true + } + assert.Equal(t, true, rpcMap[p2p.RPCBlobSidecarsByRangeTopicV2+s.cfg.p2p.Encoding().ProtocolSuffix()], "topic doesn't exist") + assert.Equal(t, true, rpcMap[p2p.RPCBlobSidecarsByRootTopicV2+s.cfg.p2p.Encoding().ProtocolSuffix()], "topic doesn't exist") + }, + }, + { + name: "fulu fork in the next epoch", + svcCreator: func(t *testing.T) *Service { + peer2peer := p2ptest.NewTestP2P(t) + gt := time.Now().Add(-4 * oneEpoch()) + vr := [32]byte{'A'} + chainService := &mockChain.ChainService{ + Genesis: gt, + ValidatorsRoot: vr, + } + bCfg := params.BeaconConfig().Copy() + bCfg.FuluForkEpoch = 5 + params.OverrideBeaconConfig(bCfg) + params.BeaconConfig().InitializeForkSchedule() + ctx, cancel := context.WithCancel(context.Background()) + r := &Service{ + ctx: ctx, + cancel: cancel, + cfg: &config{ + p2p: peer2peer, + chain: chainService, + clock: startup.NewClock(gt, vr), + initialSync: &mockSync.Sync{IsSyncing: false}, + }, + chainStarted: abool.New(), + subHandler: newSubTopicHandler(), + } + return r + }, + currEpoch: 4, + wantErr: false, + postSvcCheck: func(t *testing.T, s *Service) { + genRoot := s.cfg.clock.GenesisValidatorsRoot() + digest, err := forks.ForkDigestFromEpoch(5, genRoot[:]) + assert.NoError(t, err) + assert.Equal(t, true, s.subHandler.digestExists(digest)) + rpcMap := make(map[string]bool) + for _, p := range s.cfg.p2p.Host().Mux().Protocols() { + rpcMap[string(p)] = true + } + assert.Equal(t, true, rpcMap[p2p.RPCBlobSidecarsByRangeTopicV3+s.cfg.p2p.Encoding().ProtocolSuffix()], "topic doesn't exist") + assert.Equal(t, true, rpcMap[p2p.RPCBlobSidecarsByRootTopicV3+s.cfg.p2p.Encoding().ProtocolSuffix()], "topic doesn't exist") + assert.Equal(t, true, rpcMap[p2p.RPCMetaDataTopicV3+s.cfg.p2p.Encoding().ProtocolSuffix()], "topic doesn't exist") + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/beacon-chain/sync/initial-sync/blocks_fetcher.go b/beacon-chain/sync/initial-sync/blocks_fetcher.go index 840109227dd0..599b726c1a51 100644 --- a/beacon-chain/sync/initial-sync/blocks_fetcher.go +++ b/beacon-chain/sync/initial-sync/blocks_fetcher.go @@ -337,29 +337,29 @@ func (f *blocksFetcher) handleRequest(ctx context.Context, start primitives.Slot return response } - // Compute the first electra slot. - firstElectraSlot, err := slots.EpochStart(params.BeaconConfig().ElectraForkEpoch) + // Compute the first Fulu slot. + firstFuluSlot, err := slots.EpochStart(params.BeaconConfig().FuluForkEpoch) if err != nil { - firstElectraSlot = math.MaxUint64 + firstFuluSlot = math.MaxUint64 } - // Find the first block with a slot greater than or equal to the first electra slot. + // Find the first block with a slot greater than or equal to the first Fulu slot. // (Blocks are sorted by slot) - firstElectraIndex := sort.Search(len(response.bwb), func(i int) bool { - return response.bwb[i].Block.Block().Slot() >= firstElectraSlot + firstFuluIndex := sort.Search(len(response.bwb), func(i int) bool { + return response.bwb[i].Block.Block().Slot() >= firstFuluSlot }) - preElectraBwbs := response.bwb[:firstElectraIndex] - postElectraBwbs := response.bwb[firstElectraIndex:] + preFuluBwbs := response.bwb[:firstFuluIndex] + postFuluBwbs := response.bwb[firstFuluIndex:] // Fetch blobs. - if err := f.fetchBlobsFromPeer(ctx, preElectraBwbs, response.pid, peers); err != nil { + if err := f.fetchBlobsFromPeer(ctx, preFuluBwbs, response.pid, peers); err != nil { response.err = err return response } // Fetch data columns. - response.err = f.fetchDataColumnsFromPeers(ctx, postElectraBwbs, nil, delay, batchSize) + response.err = f.fetchDataColumnsFromPeers(ctx, postFuluBwbs, nil, delay, batchSize) return response } diff --git a/beacon-chain/sync/initial-sync/blocks_fetcher_test.go b/beacon-chain/sync/initial-sync/blocks_fetcher_test.go index 61a33f912f55..cf6f7dc35a6a 100644 --- a/beacon-chain/sync/initial-sync/blocks_fetcher_test.go +++ b/beacon-chain/sync/initial-sync/blocks_fetcher_test.go @@ -1473,7 +1473,7 @@ func createAndConnectPeer( } func defaultMockChain(t *testing.T, currentSlot uint64) (*mock.ChainService, *startup.Clock) { - de := params.BeaconConfig().ElectraForkEpoch + de := params.BeaconConfig().FuluForkEpoch df, err := forks.Fork(de) require.NoError(t, err) denebBuffer := params.BeaconConfig().MinEpochsForBlobsSidecarsRequest + 1000 @@ -1712,7 +1712,7 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { // ------ // Fork epochs. - electraForkEpoch primitives.Epoch + fuluForkEpoch primitives.Epoch // Current slot. currentSlot uint64 @@ -1740,39 +1740,39 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { isError bool }{ { - name: "Electra fork epoch is set to far futur epoch", - electraForkEpoch: primitives.Epoch(math.MaxUint64), + name: "Fulu fork epoch is set to far futur epoch", + fuluForkEpoch: primitives.Epoch(math.MaxUint64), blocksParams: []blockParams{ - {slot: 1, hasBlobs: true}, // Before Electra fork epoch - {slot: 2, hasBlobs: true}, // Before Electra fork epoch - {slot: 3, hasBlobs: true}, // Before Electra fork epoch + {slot: 1, hasBlobs: true}, // Before Fulu fork epoch + {slot: 2, hasBlobs: true}, // Before Fulu fork epoch + {slot: 3, hasBlobs: true}, // Before Fulu fork epoch }, batchSize: 32, addedRODataColumns: [][]int{nil, nil, nil}, isError: false, }, { - name: "All blocks are before Electra fork epoch", - electraForkEpoch: 1, - currentSlot: 40, + name: "All blocks are before Fulu fork epoch", + fuluForkEpoch: 1, + currentSlot: 40, blocksParams: []blockParams{ - {slot: 25, hasBlobs: false}, // Before Electra fork epoch - {slot: 26, hasBlobs: false}, // Before Electra fork epoch - {slot: 27, hasBlobs: false}, // Before Electra fork epoch - {slot: 28, hasBlobs: false}, // Before Electra fork epoch + {slot: 25, hasBlobs: false}, // Before Fulu fork epoch + {slot: 26, hasBlobs: false}, // Before Fulu fork epoch + {slot: 27, hasBlobs: false}, // Before Fulu fork epoch + {slot: 28, hasBlobs: false}, // Before Fulu fork epoch }, batchSize: 32, addedRODataColumns: [][]int{nil, nil, nil, nil}, isError: false, }, { - name: "All blocks with commitments are before Electra fork epoch", - electraForkEpoch: 1, - currentSlot: 40, + name: "All blocks with commitments are before Fulu fork epoch", + fuluForkEpoch: 1, + currentSlot: 40, blocksParams: []blockParams{ - {slot: 25, hasBlobs: false}, // Before Electra fork epoch - {slot: 26, hasBlobs: true}, // Before Electra fork epoch - {slot: 27, hasBlobs: true}, // Before Electra fork epoch + {slot: 25, hasBlobs: false}, // Before Fulu fork epoch + {slot: 26, hasBlobs: true}, // Before Fulu fork epoch + {slot: 27, hasBlobs: true}, // Before Fulu fork epoch {slot: 32, hasBlobs: false}, {slot: 33, hasBlobs: false}, }, @@ -1780,13 +1780,13 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { addedRODataColumns: [][]int{nil, nil, nil, nil, nil}, }, { - name: "Some blocks with blobs but without any missing data columns", - electraForkEpoch: 1, - currentSlot: 40, + name: "Some blocks with blobs but without any missing data columns", + fuluForkEpoch: 1, + currentSlot: 40, blocksParams: []blockParams{ - {slot: 25, hasBlobs: false}, // Before Electra fork epoch - {slot: 26, hasBlobs: true}, // Before Electra fork epoch - {slot: 27, hasBlobs: true}, // Before Electra fork epoch + {slot: 25, hasBlobs: false}, // Before Fulu fork epoch + {slot: 26, hasBlobs: true}, // Before Fulu fork epoch + {slot: 27, hasBlobs: true}, // Before Fulu fork epoch {slot: 32, hasBlobs: false}, {slot: 33, hasBlobs: true}, }, @@ -1802,12 +1802,12 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { isError: false, }, { - name: "Some blocks with blobs with missing data columns - one round needed", - electraForkEpoch: 1, - currentSlot: 40, + name: "Some blocks with blobs with missing data columns - one round needed", + fuluForkEpoch: 1, + currentSlot: 40, blocksParams: []blockParams{ - {slot: 25, hasBlobs: false}, // Before Electra fork epoch - {slot: 27, hasBlobs: true}, // Before Electra fork epoch + {slot: 25, hasBlobs: false}, // Before Fulu fork epoch + {slot: 27, hasBlobs: true}, // Before Fulu fork epoch {slot: 32, hasBlobs: false}, {slot: 33, hasBlobs: true}, {slot: 34, hasBlobs: true}, @@ -1909,9 +1909,9 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { isError: false, }, { - name: "Some blocks with blobs with missing data columns - partial responses", - electraForkEpoch: 1, - currentSlot: 40, + name: "Some blocks with blobs with missing data columns - partial responses", + fuluForkEpoch: 1, + currentSlot: 40, blocksParams: []blockParams{ {slot: 33, hasBlobs: true}, {slot: 34, hasBlobs: true}, @@ -1962,9 +1962,9 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { }, }, { - name: "Some blocks with blobs with missing data columns - first response is invalid", - electraForkEpoch: 1, - currentSlot: 40, + name: "Some blocks with blobs with missing data columns - first response is invalid", + fuluForkEpoch: 1, + currentSlot: 40, blocksParams: []blockParams{ {slot: 38, hasBlobs: true}, }, @@ -1996,7 +1996,7 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { }, { name: "Some blocks with blobs with missing data columns - first response is empty", - electraForkEpoch: 1, + fuluForkEpoch: 1, currentSlot: 40, blocksParams: []blockParams{{slot: 38, hasBlobs: true}}, storedDataColumns: []map[int]bool{{38: true, 102: true}}, @@ -2024,7 +2024,7 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { }, { name: "Some blocks with blobs with missing data columns - no response at all", - electraForkEpoch: 1, + fuluForkEpoch: 1, currentSlot: 40, blocksParams: []blockParams{{slot: 38, hasBlobs: true}}, storedDataColumns: []map[int]bool{{38: true, 102: true}}, @@ -2045,9 +2045,9 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { isError: true, }, { - name: "Some blocks with blobs with missing data columns - request has to be split", - electraForkEpoch: 1, - currentSlot: 40, + name: "Some blocks with blobs with missing data columns - request has to be split", + fuluForkEpoch: 1, + currentSlot: 40, blocksParams: []blockParams{ {slot: 32, hasBlobs: true}, {slot: 33, hasBlobs: true}, {slot: 34, hasBlobs: true}, {slot: 35, hasBlobs: true}, // 4 {slot: 36, hasBlobs: true}, {slot: 37, hasBlobs: true}, // 6 @@ -2163,8 +2163,8 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { roBlocks[i] = roBlock } - // Set the Electra fork epoch. - params.BeaconConfig().ElectraForkEpoch = tc.electraForkEpoch + // Set the Fulu fork epoch. + params.BeaconConfig().FuluForkEpoch = tc.fuluForkEpoch // Save the blocks in the store. storage := make(map[[fieldparams.RootLength]byte][]int) @@ -2223,7 +2223,7 @@ func TestFetchDataColumnsFromPeers(t *testing.T) { // Create the block fetcher. blocksFetcher := newBlocksFetcher(ctx, &blocksFetcherConfig{ clock: clock, - ctxMap: map[[4]byte]int{{245, 165, 253, 66}: version.Electra}, + ctxMap: map[[4]byte]int{{245, 165, 253, 66}: version.Fulu}, p2p: p2pSvc, bs: blobStorageSummarizer, cv: newDataColumnsVerifierFromInitializer(ini), diff --git a/beacon-chain/sync/initial-sync/round_robin.go b/beacon-chain/sync/initial-sync/round_robin.go index 2a529a6e3328..56133e47eec3 100644 --- a/beacon-chain/sync/initial-sync/round_robin.go +++ b/beacon-chain/sync/initial-sync/round_robin.go @@ -179,20 +179,20 @@ func (s *Service) processFetchedDataRegSync( return } - // Compute the first electra slot. - firstElectraSlot, err := slots.EpochStart(params.BeaconConfig().ElectraForkEpoch) + // Compute the first Fulu slot. + firstFuluSlot, err := slots.EpochStart(params.BeaconConfig().FuluForkEpoch) if err != nil { - firstElectraSlot = math.MaxUint64 + firstFuluSlot = math.MaxUint64 } - // Find the first block with a slot greater than or equal to the first electra slot. + // Find the first block with a slot greater than or equal to the first Fulu slot. // (Blocks are sorted by slot) - firstElectraIndex := sort.Search(len(bwb), func(i int) bool { - return bwb[i].Block.Block().Slot() >= firstElectraSlot + firstFuluIndex := sort.Search(len(bwb), func(i int) bool { + return bwb[i].Block.Block().Slot() >= firstFuluSlot }) - preElectraBwbs := bwb[:firstElectraIndex] - postElectraBwbs := bwb[firstElectraIndex:] + preFuluBwbs := bwb[:firstFuluIndex] + postFuluBwbs := bwb[firstFuluIndex:] blobBatchVerifier := verification.NewBlobBatchVerifier(s.newBlobVerifier, verification.InitsyncBlobSidecarRequirements) lazilyPersistentStore := das.NewLazilyPersistentStore(s.cfg.BlobStorage, blobBatchVerifier) @@ -200,11 +200,11 @@ func (s *Service) processFetchedDataRegSync( log := log.WithField("firstSlot", data.bwb[0].Block.Block().Slot()) logPre := log - if len(preElectraBwbs) > 0 { - logPre = logPre.WithField("firstUnprocessed", preElectraBwbs[0].Block.Block().Slot()) + if len(preFuluBwbs) > 0 { + logPre = logPre.WithField("firstUnprocessed", preFuluBwbs[0].Block.Block().Slot()) } - for _, b := range preElectraBwbs { + for _, b := range preFuluBwbs { log := logPre.WithFields(syncFields(b.Block)) if err := lazilyPersistentStore.Persist(s.clock.CurrentSlot(), b.Blobs...); err != nil { @@ -227,13 +227,13 @@ func (s *Service) processFetchedDataRegSync( } logPost := log - if len(postElectraBwbs) > 0 { - logPost = log.WithField("firstUnprocessed", postElectraBwbs[0].Block.Block().Slot()) + if len(postFuluBwbs) > 0 { + logPost = log.WithField("firstUnprocessed", postFuluBwbs[0].Block.Block().Slot()) } lazilyPersistentStoreColumn := das.NewLazilyPersistentStoreColumn(s.cfg.BlobStorage) - for _, b := range postElectraBwbs { + for _, b := range postFuluBwbs { log := logPost.WithFields(syncFields(b.Block)) if err := lazilyPersistentStoreColumn.PersistColumns(s.clock.CurrentSlot(), b.Columns...); err != nil { @@ -375,7 +375,7 @@ func validUnprocessed(ctx context.Context, bwb []blocks.BlockWithROBlobs, headSl return bwb[nonProcessedIdx:], nil } -func (s *Service) processPreElectraBatchedBlocks( +func (s *Service) processPreFuluBatchedBlocks( ctx context.Context, bwbs []blocks.BlockWithROBlobs, bFunc batchBlockReceiverFn, @@ -402,13 +402,13 @@ func (s *Service) processPreElectraBatchedBlocks( } if err := bFunc(ctx, blocks.BlockWithROBlobsSlice(bwbs).ROBlocks(), persistentStore); err != nil { - return errors.Wrap(err, "process pre-electra blocks") + return errors.Wrap(err, "process pre-Fulu blocks") } return nil } -func (s *Service) processPostElectraBatchedBlocks( +func (s *Service) processPostFuluBatchedBlocks( ctx context.Context, bwbs []blocks.BlockWithROBlobs, bFunc batchBlockReceiverFn, @@ -434,7 +434,7 @@ func (s *Service) processPostElectraBatchedBlocks( } if err := bFunc(ctx, blocks.BlockWithROBlobsSlice(bwbs).ROBlocks(), persistentStoreColumn); err != nil { - return errors.Wrap(err, "process post-electra blocks") + return errors.Wrap(err, "process post-Fulu blocks") } return nil @@ -467,26 +467,26 @@ func (s *Service) processBatchedBlocks( errParentDoesNotExist, firstBlock.Block().ParentRoot(), firstBlock.Block().Slot()) } - // Compute the first electra slot. - firstElectraSlot, err := slots.EpochStart(params.BeaconConfig().ElectraForkEpoch) + // Compute the first Fulu slot. + firstFuluSlot, err := slots.EpochStart(params.BeaconConfig().FuluForkEpoch) if err != nil { - firstElectraSlot = math.MaxUint64 + firstFuluSlot = math.MaxUint64 } - // Find the first block with a slot greater than or equal to the first electra slot. + // Find the first block with a slot greater than or equal to the first Fulu slot. // (Blocks are sorted by slot) - firstElectraIndex := sort.Search(len(bwbs), func(i int) bool { - return bwbs[i].Block.Block().Slot() >= firstElectraSlot + firstFuluIndex := sort.Search(len(bwbs), func(i int) bool { + return bwbs[i].Block.Block().Slot() >= firstFuluSlot }) - preElectraBwbs, postElectraBwbs := bwbs[:firstElectraIndex], bwbs[firstElectraIndex:] + preFuluBwbs, postFuluBwbs := bwbs[:firstFuluIndex], bwbs[firstFuluIndex:] - if err := s.processPreElectraBatchedBlocks(ctx, preElectraBwbs, bFunc, genesis, firstBlock); err != nil { - return errors.Wrap(err, "process pre-electra blocks") + if err := s.processPreFuluBatchedBlocks(ctx, preFuluBwbs, bFunc, genesis, firstBlock); err != nil { + return errors.Wrap(err, "process pre-Fulu blocks") } - if err := s.processPostElectraBatchedBlocks(ctx, postElectraBwbs, bFunc, genesis, firstBlock); err != nil { - return errors.Wrap(err, "process post-electra blocks") + if err := s.processPostFuluBatchedBlocks(ctx, postFuluBwbs, bFunc, genesis, firstBlock); err != nil { + return errors.Wrap(err, "process post-Fulu blocks") } return nil diff --git a/beacon-chain/sync/rate_limiter.go b/beacon-chain/sync/rate_limiter.go index fe299e9e8749..bc35ff3e6ff0 100644 --- a/beacon-chain/sync/rate_limiter.go +++ b/beacon-chain/sync/rate_limiter.go @@ -88,6 +88,8 @@ func newRateLimiter(p2pProvider p2p.P2P) *limiter { topicMap[addEncoding(p2p.RPCBlobSidecarsByRootTopicV1)] = blobCollector // BlobSidecarsByRangeV1 topicMap[addEncoding(p2p.RPCBlobSidecarsByRangeTopicV1)] = blobCollector + topicMap[addEncoding(p2p.RPCBlobSidecarsByRootTopicV2)] = blobCollector + topicMap[addEncoding(p2p.RPCBlobSidecarsByRangeTopicV2)] = blobCollector // DataColumnSidecarsByRootV1 topicMap[addEncoding(p2p.RPCDataColumnSidecarsByRootTopicV1)] = columnCollector diff --git a/beacon-chain/sync/rate_limiter_test.go b/beacon-chain/sync/rate_limiter_test.go index 1514b6459b39..b1c22a4c45ff 100644 --- a/beacon-chain/sync/rate_limiter_test.go +++ b/beacon-chain/sync/rate_limiter_test.go @@ -18,7 +18,7 @@ import ( func TestNewRateLimiter(t *testing.T) { rlimiter := newRateLimiter(mockp2p.NewTestP2P(t)) - assert.Equal(t, 15, len(rlimiter.limiterMap), "correct number of topics not registered") + assert.Equal(t, 17, len(rlimiter.limiterMap), "correct number of topics not registered") } func TestNewRateLimiter_FreeCorrectly(t *testing.T) { diff --git a/beacon-chain/sync/rpc.go b/beacon-chain/sync/rpc.go index f8ffeee27e08..fb145bb13876 100644 --- a/beacon-chain/sync/rpc.go +++ b/beacon-chain/sync/rpc.go @@ -38,33 +38,38 @@ type rpcHandler func(context.Context, interface{}, libp2pcore.Stream) error // rpcHandlerByTopicFromFork returns the RPC handlers for a given fork index. func (s *Service) rpcHandlerByTopicFromFork(forkIndex int) (map[string]rpcHandler, error) { - switch forkIndex { - // PhaseO: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#messages - case version.Phase0: + // Fulu: https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md#messages + if forkIndex >= version.Fulu { return map[string]rpcHandler{ - p2p.RPCStatusTopicV1: s.statusRPCHandler, - p2p.RPCGoodByeTopicV1: s.goodbyeRPCHandler, - p2p.RPCBlocksByRangeTopicV1: s.beaconBlocksByRangeRPCHandler, - p2p.RPCBlocksByRootTopicV1: s.beaconBlocksRootRPCHandler, - p2p.RPCPingTopicV1: s.pingHandler, - p2p.RPCMetaDataTopicV1: s.metaDataHandler, + p2p.RPCStatusTopicV1: s.statusRPCHandler, + p2p.RPCGoodByeTopicV1: s.goodbyeRPCHandler, + p2p.RPCBlocksByRangeTopicV2: s.beaconBlocksByRangeRPCHandler, + p2p.RPCBlocksByRootTopicV2: s.beaconBlocksRootRPCHandler, + p2p.RPCPingTopicV1: s.pingHandler, + p2p.RPCMetaDataTopicV3: s.metaDataHandler, // Modified in Fulu + p2p.RPCBlobSidecarsByRootTopicV3: s.blobSidecarByRootRPCHandler, // Modified in Fulu + p2p.RPCBlobSidecarsByRangeTopicV3: s.blobSidecarsByRangeRPCHandler, // Modified in Fulu + p2p.RPCDataColumnSidecarsByRootTopicV1: s.dataColumnSidecarByRootRPCHandler, // Added in Fulu + p2p.RPCDataColumnSidecarsByRangeTopicV1: s.dataColumnSidecarsByRangeRPCHandler, // Added in Fulu }, nil + } - // Altair: https://github.com/ethereum/consensus-specs/tree/dev/specs/altair#messages - // Bellatrix: https://github.com/ethereum/consensus-specs/tree/dev/specs/bellatrix#messages - // Capella: https://github.com/ethereum/consensus-specs/tree/dev/specs/capella#messages - case version.Altair, version.Bellatrix, version.Capella: + // Electra: https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/p2p-interface.md#messages + if forkIndex >= version.Electra { return map[string]rpcHandler{ - p2p.RPCStatusTopicV1: s.statusRPCHandler, - p2p.RPCGoodByeTopicV1: s.goodbyeRPCHandler, - p2p.RPCBlocksByRangeTopicV2: s.beaconBlocksByRangeRPCHandler, // Modified in Altair - p2p.RPCBlocksByRootTopicV2: s.beaconBlocksRootRPCHandler, // Modified in Altair - p2p.RPCPingTopicV1: s.pingHandler, - p2p.RPCMetaDataTopicV2: s.metaDataHandler, // Modified in Altair + p2p.RPCStatusTopicV1: s.statusRPCHandler, + p2p.RPCGoodByeTopicV1: s.goodbyeRPCHandler, + p2p.RPCBlocksByRangeTopicV2: s.beaconBlocksByRangeRPCHandler, + p2p.RPCBlocksByRootTopicV2: s.beaconBlocksRootRPCHandler, + p2p.RPCPingTopicV1: s.pingHandler, + p2p.RPCMetaDataTopicV2: s.metaDataHandler, + p2p.RPCBlobSidecarsByRootTopicV2: s.blobSidecarByRootRPCHandler, // Modified in Electra + p2p.RPCBlobSidecarsByRangeTopicV2: s.blobSidecarsByRangeRPCHandler, // Modified in Electra }, nil + } // Deneb: https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/p2p-interface.md#messages - case version.Deneb: + if forkIndex >= version.Deneb { return map[string]rpcHandler{ p2p.RPCStatusTopicV1: s.statusRPCHandler, p2p.RPCGoodByeTopicV1: s.goodbyeRPCHandler, @@ -75,25 +80,35 @@ func (s *Service) rpcHandlerByTopicFromFork(forkIndex int) (map[string]rpcHandle p2p.RPCBlobSidecarsByRootTopicV1: s.blobSidecarByRootRPCHandler, // Added in Deneb p2p.RPCBlobSidecarsByRangeTopicV1: s.blobSidecarsByRangeRPCHandler, // Added in Deneb }, nil + } - // Electra: https://github.com/ethereum/consensus-specs/blob/dev/specs/_features/eip7594/p2p-interface.md#messages - case version.Electra: + // Capella: https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/p2p-interface.md#messages + // Bellatrix: https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/p2p-interface.md#messages + // Altair: https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/p2p-interface.md#messages + if forkIndex >= version.Altair { return map[string]rpcHandler{ - p2p.RPCStatusTopicV1: s.statusRPCHandler, - p2p.RPCGoodByeTopicV1: s.goodbyeRPCHandler, - p2p.RPCBlocksByRangeTopicV2: s.beaconBlocksByRangeRPCHandler, - p2p.RPCBlocksByRootTopicV2: s.beaconBlocksRootRPCHandler, - p2p.RPCPingTopicV1: s.pingHandler, - p2p.RPCMetaDataTopicV3: s.metaDataHandler, // Modified in Electra - p2p.RPCBlobSidecarsByRootTopicV1: s.blobSidecarByRootRPCHandler, - p2p.RPCBlobSidecarsByRangeTopicV1: s.blobSidecarsByRangeRPCHandler, - p2p.RPCDataColumnSidecarsByRootTopicV1: s.dataColumnSidecarByRootRPCHandler, // Added in Electra - p2p.RPCDataColumnSidecarsByRangeTopicV1: s.dataColumnSidecarsByRangeRPCHandler, // Added in Electra + p2p.RPCStatusTopicV1: s.statusRPCHandler, + p2p.RPCGoodByeTopicV1: s.goodbyeRPCHandler, + p2p.RPCBlocksByRangeTopicV2: s.beaconBlocksByRangeRPCHandler, // Modified in Altair + p2p.RPCBlocksByRootTopicV2: s.beaconBlocksRootRPCHandler, // Modified in Altair + p2p.RPCPingTopicV1: s.pingHandler, + p2p.RPCMetaDataTopicV2: s.metaDataHandler, // Modified in Altair }, nil + } - default: - return nil, errors.Errorf("RPC handler not found for fork index %d", forkIndex) + // PhaseO: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#messages + if forkIndex >= version.Phase0 { + return map[string]rpcHandler{ + p2p.RPCStatusTopicV1: s.statusRPCHandler, + p2p.RPCGoodByeTopicV1: s.goodbyeRPCHandler, + p2p.RPCBlocksByRangeTopicV1: s.beaconBlocksByRangeRPCHandler, + p2p.RPCBlocksByRootTopicV1: s.beaconBlocksRootRPCHandler, + p2p.RPCPingTopicV1: s.pingHandler, + p2p.RPCMetaDataTopicV1: s.metaDataHandler, + }, nil } + + return nil, errors.Errorf("RPC handler not found for fork index %d", forkIndex) } // rpcHandlerByTopic returns the RPC handlers for a given epoch. @@ -101,6 +116,10 @@ func (s *Service) rpcHandlerByTopicFromEpoch(epoch primitives.Epoch) (map[string // Get the beacon config. beaconConfig := params.BeaconConfig() + if epoch >= beaconConfig.FuluForkEpoch { + return s.rpcHandlerByTopicFromFork(version.Fulu) + } + if epoch >= beaconConfig.ElectraForkEpoch { return s.rpcHandlerByTopicFromFork(version.Electra) } diff --git a/beacon-chain/sync/rpc_beacon_blocks_by_root_test.go b/beacon-chain/sync/rpc_beacon_blocks_by_root_test.go index b77232978661..373bafb7f21f 100644 --- a/beacon-chain/sync/rpc_beacon_blocks_by_root_test.go +++ b/beacon-chain/sync/rpc_beacon_blocks_by_root_test.go @@ -31,7 +31,6 @@ import ( leakybucket "github.com/prysmaticlabs/prysm/v5/container/leaky-bucket" "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" - eth "github.com/prysmaticlabs/prysm/v5/proto/eth/v2" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/testing/assert" "github.com/prysmaticlabs/prysm/v5/testing/require" @@ -451,7 +450,7 @@ func TestConstructPendingBlobsRequest(t *testing.T) { require.NoError(t, bs.Save(vscs[i])) } - expected := []*eth.BlobIdentifier{ + expected := []*ethpb.BlobIdentifier{ {Index: 1, BlockRoot: root[:]}, } actual, err = s.constructPendingBlobsRequest(root, count, 100) @@ -466,7 +465,7 @@ func TestFilterUnknownIndices(t *testing.T) { blockRoot := [32]byte{} count := 5 - expected := []*eth.BlobIdentifier{ + expected := []*ethpb.BlobIdentifier{ {Index: 3, BlockRoot: blockRoot[:]}, {Index: 4, BlockRoot: blockRoot[:]}, } diff --git a/beacon-chain/sync/rpc_blob_sidecars_by_range.go b/beacon-chain/sync/rpc_blob_sidecars_by_range.go index 0374e9dd61aa..c399b6c9042e 100644 --- a/beacon-chain/sync/rpc_blob_sidecars_by_range.go +++ b/beacon-chain/sync/rpc_blob_sidecars_by_range.go @@ -98,9 +98,22 @@ func (s *Service) blobSidecarsByRangeRPCHandler(ctx context.Context, msg interfa return err } + beaconConfig := params.BeaconConfig() + currentSlot := s.cfg.chain.CurrentSlot() + currentEpoch := slots.ToEpoch(currentSlot) + var batch blockBatch wQuota := params.BeaconConfig().MaxRequestBlobSidecars + + if currentEpoch >= beaconConfig.ElectraForkEpoch { + wQuota = beaconConfig.MaxRequestBlobSidecarsElectra + } + + if currentEpoch >= beaconConfig.FuluForkEpoch { + wQuota = beaconConfig.MaxRequestBlobSidecarsFulu + } + for batch, ok = batcher.next(ctx, stream); ok; batch, ok = batcher.next(ctx, stream) { batchStart := time.Now() wQuota, err = s.streamBlobBatch(ctx, batch, wQuota, stream) diff --git a/beacon-chain/sync/rpc_blob_sidecars_by_root.go b/beacon-chain/sync/rpc_blob_sidecars_by_root.go index 7d197cc4b83a..53be92d096e2 100644 --- a/beacon-chain/sync/rpc_blob_sidecars_by_root.go +++ b/beacon-chain/sync/rpc_blob_sidecars_by_root.go @@ -13,9 +13,11 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/p2p/types" "github.com/prysmaticlabs/prysm/v5/cmd/beacon-chain/flags" "github.com/prysmaticlabs/prysm/v5/config/params" + "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" "github.com/prysmaticlabs/prysm/v5/monitoring/tracing" "github.com/prysmaticlabs/prysm/v5/monitoring/tracing/trace" + "github.com/prysmaticlabs/prysm/v5/time/slots" "github.com/sirupsen/logrus" ) @@ -34,7 +36,8 @@ func (s *Service) blobSidecarByRootRPCHandler(ctx context.Context, msg interface } blobIdents := *ref - if err := validateBlobByRootRequest(blobIdents); err != nil { + cs := s.cfg.clock.CurrentSlot() + if err := validateBlobByRootRequest(blobIdents, cs); err != nil { s.cfg.p2p.Peers().Scorers().BadResponsesScorer().Increment(stream.Conn().RemotePeer()) s.writeErrorResponseToStream(responseCodeInvalidRequest, err.Error(), stream) return err @@ -49,7 +52,6 @@ func (s *Service) blobSidecarByRootRPCHandler(ctx context.Context, msg interface } // Compute the oldest slot we'll allow a peer to request, based on the current slot. - cs := s.cfg.clock.CurrentSlot() minReqSlot, err := BlobRPCMinValidSlot(cs) if err != nil { return errors.Wrapf(err, "unexpected error computing min valid blob request slot, current_slot=%d", cs) @@ -104,9 +106,30 @@ func (s *Service) blobSidecarByRootRPCHandler(ctx context.Context, msg interface return nil } -func validateBlobByRootRequest(blobIdents types.BlobSidecarsByRootReq) error { - if uint64(len(blobIdents)) > params.BeaconConfig().MaxRequestBlobSidecars { +func validateBlobByRootRequest(blobIdents types.BlobSidecarsByRootReq, slot primitives.Slot) error { + beaconConfig := params.BeaconConfig() + epoch := slots.ToEpoch(slot) + blobIdentCount := uint64(len(blobIdents)) + + if epoch >= beaconConfig.FuluForkEpoch { + if blobIdentCount > beaconConfig.MaxRequestBlobSidecarsFulu { + return types.ErrMaxBlobReqExceeded + } + + return nil + } + + if epoch >= beaconConfig.ElectraForkEpoch { + if blobIdentCount > beaconConfig.MaxRequestBlobSidecarsElectra { + return types.ErrMaxBlobReqExceeded + } + + return nil + } + + if blobIdentCount > beaconConfig.MaxRequestBlobSidecars { return types.ErrMaxBlobReqExceeded } + return nil } diff --git a/beacon-chain/sync/rpc_chunked_response.go b/beacon-chain/sync/rpc_chunked_response.go index 0b6d9ce0eea6..03c3aaf32a48 100644 --- a/beacon-chain/sync/rpc_chunked_response.go +++ b/beacon-chain/sync/rpc_chunked_response.go @@ -70,6 +70,12 @@ func WriteBlockChunk(stream libp2pcore.Stream, tor blockchain.TemporalOracle, en return err } obtainedCtx = digest[:] + case version.Fulu: + digest, err := forks.ForkDigestFromEpoch(params.BeaconConfig().FuluForkEpoch, valRoot[:]) + if err != nil { + return err + } + obtainedCtx = digest[:] default: return errors.Wrapf(ErrUnrecognizedVersion, "block version %d is not recognized", blk.Version()) } diff --git a/beacon-chain/sync/rpc_data_column_sidecars_by_root.go b/beacon-chain/sync/rpc_data_column_sidecars_by_root.go index 824e54501461..7dae8053a04a 100644 --- a/beacon-chain/sync/rpc_data_column_sidecars_by_root.go +++ b/beacon-chain/sync/rpc_data_column_sidecars_by_root.go @@ -209,7 +209,7 @@ func DataColumnsRPCMinValidSlot(current primitives.Slot) (primitives.Slot, error } minReqEpochs := params.BeaconConfig().MinEpochsForDataColumnSidecarsRequest currEpoch := slots.ToEpoch(current) - minStart := params.BeaconConfig().ElectraForkEpoch + minStart := params.BeaconConfig().FuluForkEpoch if currEpoch > minReqEpochs && currEpoch-minReqEpochs > minStart { minStart = currEpoch - minReqEpochs } diff --git a/beacon-chain/sync/rpc_metadata.go b/beacon-chain/sync/rpc_metadata.go index 42b1cc7f27ef..bdc0b1e80224 100644 --- a/beacon-chain/sync/rpc_metadata.go +++ b/beacon-chain/sync/rpc_metadata.go @@ -70,7 +70,7 @@ func (s *Service) metaDataHandler(_ context.Context, _ interface{}, stream libp2 switch streamVersion { case p2p.SchemaVersionV1: switch metadataVersion { - case version.Altair, version.Electra: + case version.Altair, version.Fulu: metadata = wrapper.WrappedMetadataV0( &pb.MetaDataV0{ Attnets: metadata.AttnetsBitfield(), @@ -87,7 +87,7 @@ func (s *Service) metaDataHandler(_ context.Context, _ interface{}, stream libp2 SeqNumber: metadata.SequenceNumber(), Syncnets: bitfield.Bitvector4{byte(0x00)}, }) - case version.Electra: + case version.Fulu: metadata = wrapper.WrappedMetadataV1( &pb.MetaDataV1{ Attnets: metadata.AttnetsBitfield(), @@ -184,13 +184,13 @@ func (s *Service) sendMetaDataRequest(ctx context.Context, peerID peer.ID) (meta } // Defensive check to ensure valid objects are being sent. - topicVersion := "" + var topicVersion string switch msg.Version() { case version.Phase0: topicVersion = p2p.SchemaVersionV1 case version.Altair: topicVersion = p2p.SchemaVersionV2 - case version.Electra: + case version.Fulu: topicVersion = p2p.SchemaVersionV3 } diff --git a/beacon-chain/sync/rpc_metadata_test.go b/beacon-chain/sync/rpc_metadata_test.go index c7f59d20a108..3bb2402c2490 100644 --- a/beacon-chain/sync/rpc_metadata_test.go +++ b/beacon-chain/sync/rpc_metadata_test.go @@ -101,7 +101,7 @@ func TestMetadataRPCHandler_SendMetadataRequest(t *testing.T) { params.SetupTestConfigCleanup(t) beaconChainConfig := params.BeaconConfig().Copy() beaconChainConfig.AltairForkEpoch = 5 - beaconChainConfig.ElectraForkEpoch = 15 + beaconChainConfig.FuluForkEpoch = 15 params.OverrideBeaconConfig(beaconChainConfig) params.BeaconConfig().InitializeForkSchedule() @@ -144,7 +144,7 @@ func TestMetadataRPCHandler_SendMetadataRequest(t *testing.T) { }), }, { - name: "Phase0-Electra", + name: "Phase0-Fulu", topic: p2p.RPCMetaDataTopicV1, epochsSinceGenesisPeer1: 0, epochsSinceGenesisPeer2: 15, @@ -191,7 +191,7 @@ func TestMetadataRPCHandler_SendMetadataRequest(t *testing.T) { }), }, { - name: "Altair-Electra", + name: "Altair-Fulu", topic: p2p.RPCMetaDataTopicV2, epochsSinceGenesisPeer1: 5, epochsSinceGenesisPeer2: 15, @@ -208,7 +208,7 @@ func TestMetadataRPCHandler_SendMetadataRequest(t *testing.T) { }), }, { - name: "Electra-Phase0", + name: "Fulu-Phase0", topic: p2p.RPCMetaDataTopicV3, epochsSinceGenesisPeer1: 15, epochsSinceGenesisPeer2: 0, @@ -224,7 +224,7 @@ func TestMetadataRPCHandler_SendMetadataRequest(t *testing.T) { }), }, { - name: "Electra-Altair", + name: "Fulu-Altair", topic: p2p.RPCMetaDataTopicV3, epochsSinceGenesisPeer1: 15, epochsSinceGenesisPeer2: 5, @@ -241,7 +241,7 @@ func TestMetadataRPCHandler_SendMetadataRequest(t *testing.T) { }), }, { - name: "Electra-Electra", + name: "Fulu-Fulu", topic: p2p.RPCMetaDataTopicV3, epochsSinceGenesisPeer1: 15, epochsSinceGenesisPeer2: 15, diff --git a/beacon-chain/sync/rpc_send_request.go b/beacon-chain/sync/rpc_send_request.go index d7742bdb48d9..94b00c074b25 100644 --- a/beacon-chain/sync/rpc_send_request.go +++ b/beacon-chain/sync/rpc_send_request.go @@ -21,7 +21,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" - pb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/runtime/version" "github.com/prysmaticlabs/prysm/v5/time/slots" "github.com/sirupsen/logrus" @@ -173,8 +172,20 @@ func SendBlobsByRangeRequest(ctx context.Context, tor blockchain.TemporalOracle, } defer closeStream(stream, log) - maxBlobsPerBlock := uint64(params.BeaconConfig().MaxBlobsPerBlock(req.StartSlot)) - max := params.BeaconConfig().MaxRequestBlobSidecars + beaconConfig := params.BeaconConfig() + + maxBlobsPerBlock := uint64(beaconConfig.MaxBlobsPerBlock(req.StartSlot)) + max := beaconConfig.MaxRequestBlobSidecars + startEpoch := slots.ToEpoch(req.StartSlot) + + if startEpoch >= beaconConfig.ElectraForkEpoch { + max = beaconConfig.MaxRequestBlobSidecarsElectra + } + + if startEpoch >= beaconConfig.FuluForkEpoch { + max = beaconConfig.MaxRequestBlobSidecarsFulu + } + if max > req.Count*maxBlobsPerBlock { max = req.Count * maxBlobsPerBlock } @@ -189,7 +200,9 @@ func SendBlobSidecarByRoot( ctx context.Context, tor blockchain.TemporalOracle, p2pApi p2p.P2P, pid peer.ID, ctxMap ContextByteVersions, req *p2ptypes.BlobSidecarsByRootReq, slot primitives.Slot, ) ([]blocks.ROBlob, error) { - if uint64(len(*req)) > params.BeaconConfig().MaxRequestBlobSidecars { + beaconConfig := params.BeaconConfig() + + if uint64(len(*req)) > beaconConfig.MaxRequestBlobSidecars { return nil, errors.Wrapf(p2ptypes.ErrMaxBlobReqExceeded, "length=%d", len(*req)) } @@ -204,8 +217,18 @@ func SendBlobSidecarByRoot( } defer closeStream(stream, log) - max := params.BeaconConfig().MaxRequestBlobSidecars - maxBlobCount := params.BeaconConfig().MaxBlobsPerBlock(slot) + max := beaconConfig.MaxRequestBlobSidecars + epoch := slots.ToEpoch(slot) + + if epoch >= beaconConfig.ElectraForkEpoch { + max = beaconConfig.MaxRequestBlobSidecarsElectra + } + + if epoch >= beaconConfig.FuluForkEpoch { + max = beaconConfig.MaxRequestBlobSidecarsFulu + } + + maxBlobCount := beaconConfig.MaxBlobsPerBlock(slot) if max > uint64(len(*req)*maxBlobCount) { max = uint64(len(*req) * maxBlobCount) } @@ -276,7 +299,7 @@ func SendDataColumnSidecarsByRootRequest( } // dataColumnValidatorFromRangeReq verifies that the slot of the data column sidecar is within the bounds of the request. -func dataColumnValidatorFromRangeReq(req *pb.DataColumnSidecarsByRangeRequest) DataColumnResponseValidation { +func dataColumnValidatorFromRangeReq(req *ethpb.DataColumnSidecarsByRangeRequest) DataColumnResponseValidation { end := req.StartSlot + primitives.Slot(req.Count) return func(sc blocks.RODataColumn) bool { @@ -299,7 +322,7 @@ func dataColumnValidatorFromRangeReq(req *pb.DataColumnSidecarsByRangeRequest) D } // dataColumnIndexValidatorFromRangeReq verifies that the data column sidecar is requested in the request. -func dataColumnIndexValidatorFromRangeReq(req *pb.DataColumnSidecarsByRangeRequest) DataColumnResponseValidation { +func dataColumnIndexValidatorFromRangeReq(req *ethpb.DataColumnSidecarsByRangeRequest) DataColumnResponseValidation { columnIds := make(map[uint64]bool) for _, col := range req.Columns { columnIds[col] = true @@ -341,7 +364,7 @@ func SendDataColumnSidecarsByRangeRequest( p2pApi p2p.P2P, pid peer.ID, ctxMap ContextByteVersions, - req *pb.DataColumnSidecarsByRangeRequest, + req *ethpb.DataColumnSidecarsByRangeRequest, ) ([]blocks.RODataColumn, error) { topic, err := p2p.TopicFromMessage(p2p.DataColumnSidecarsByRangeName, slots.ToEpoch(tor.CurrentSlot())) if err != nil { @@ -444,12 +467,12 @@ func readChunkedDataColumnSideCar( return nil, errors.Errorf("unrecognized fork digest %#x", ctxBytes) } - // Check if we are on debeb. + // Check if we are on Fulu. // Only deneb is supported at this time, because we lack a fork-spanning interface/union type for blobs. - if msgVersion < version.Electra { + if msgVersion < version.Fulu { return nil, errors.Errorf( "unexpected context bytes for DataColumnSidecar, ctx=%#x, msgVersion=%v, minimalSupportedVersion=%v", - ctxBytes, version.String(msgVersion), version.String(version.Electra), + ctxBytes, version.String(msgVersion), version.String(version.Fulu), ) } @@ -672,8 +695,7 @@ func readChunkedBlobSidecar(stream network.Stream, encoding encoder.NetworkEncod if !found { return b, errors.Wrapf(errBlobUnmarshal, fmt.Sprintf("unrecognized fork digest %#x", ctxb)) } - // Only deneb and electra are supported at this time, because we lack a fork-spanning interface/union type for blobs. - // In electra, there's no changes to blob type. + // Only Deneb and beyond are supported at this time, because we lack a fork-spanning interface/union type for blobs. if v < version.Deneb { return b, fmt.Errorf("unexpected context bytes for BlobSidecar, ctx=%#x, v=%s", ctxb, version.String(v)) } diff --git a/beacon-chain/sync/subscriber.go b/beacon-chain/sync/subscriber.go index f7e395b12c32..04107a039679 100644 --- a/beacon-chain/sync/subscriber.go +++ b/beacon-chain/sync/subscriber.go @@ -117,7 +117,8 @@ func (s *Service) registerSubscribers(epoch primitives.Epoch, digest [4]byte) { s.persistentAndAggregatorSubnetIndices, s.attesterSubnetIndices, ) - // Altair Fork Version + + // New gossip topic in Altair if params.BeaconConfig().AltairForkEpoch <= epoch { s.subscribe( p2p.SyncContributionAndProofSubnetTopicFormat, @@ -135,7 +136,7 @@ func (s *Service) registerSubscribers(epoch primitives.Epoch, digest [4]byte) { ) } - // New Gossip Topic in Capella + // New gossip topic in Capella if params.BeaconConfig().CapellaForkEpoch <= epoch { s.subscribe( p2p.BlsToExecutionChangeSubnetTopicFormat, @@ -145,20 +146,36 @@ func (s *Service) registerSubscribers(epoch primitives.Epoch, digest [4]byte) { ) } - // New Gossip Topic in Deneb, removed in Electra + // New gossip topic in Deneb, removed in Electra if params.BeaconConfig().DenebForkEpoch <= epoch && epoch < params.BeaconConfig().ElectraForkEpoch { s.subscribeWithParameters( p2p.BlobSubnetTopicFormat, s.validateBlob, s.blobSubscriber, digest, - func(primitives.Slot) []uint64 { return sliceFromCount(params.BeaconConfig().BlobsidecarSubnetCount) }, + func(currentSlot primitives.Slot) []uint64 { + return sliceFromCount(params.BeaconConfig().BlobsidecarSubnetCount) + }, + func(currentSlot primitives.Slot) []uint64 { return []uint64{} }, + ) + } + + // New gossip topic in Electra, removed in Fulu + if params.BeaconConfig().ElectraForkEpoch <= epoch && epoch < params.BeaconConfig().FuluForkEpoch { + s.subscribeWithParameters( + p2p.BlobSubnetTopicFormat, + s.validateBlob, + s.blobSubscriber, + digest, + func(currentSlot primitives.Slot) []uint64 { + return sliceFromCount(params.BeaconConfig().BlobsidecarSubnetCountElectra) + }, func(currentSlot primitives.Slot) []uint64 { return []uint64{} }, ) } - // New Gossip Topic in Electra - if params.BeaconConfig().ElectraForkEpoch <= epoch { + // New gossip topic in Fulu + if params.BeaconConfig().FuluForkEpoch <= epoch { s.subscribeWithParameters( p2p.DataColumnSubnetTopicFormat, s.validateDataColumn, @@ -442,7 +459,14 @@ func (s *Service) subscribeToSubnets( description = topicFormat[pos+1:] } - log.WithField("digest", fmt.Sprintf("%#x", digest)).Warningf("%s subnets with this digest are no longer valid, unsubscribing from all of them.", description) + if pos := strings.LastIndex(description, "_"); pos != -1 { + description = description[:pos] + } + + log.WithFields(logrus.Fields{ + "digest": fmt.Sprintf("%#x", digest), + "subnets": description, + }).Debug("Subnets with this digest are no longer valid, unsubscribing from all of them") s.reValidateSubscriptions(subscriptions, []uint64{}, topicFormat, digest) return false } diff --git a/beacon-chain/sync/validate_blob.go b/beacon-chain/sync/validate_blob.go index 6fe0f7ee9e11..1f06929b708e 100644 --- a/beacon-chain/sync/validate_blob.go +++ b/beacon-chain/sync/validate_blob.go @@ -58,7 +58,7 @@ func (s *Service) validateBlob(ctx context.Context, pid peer.ID, msg *pubsub.Mes } // [REJECT] The sidecar is for the correct subnet -- i.e. compute_subnet_for_blob_sidecar(sidecar.index) == subnet_id. - want := fmt.Sprintf("blob_sidecar_%d", computeSubnetForBlobSidecar(blob.Index)) + want := fmt.Sprintf("blob_sidecar_%d", computeSubnetForBlobSidecar(blob.Index, blob.Slot())) if !strings.Contains(*msg.Topic, want) { log.WithFields(blobFields(blob)).Debug("Sidecar index does not match topic") return pubsub.ValidationReject, fmt.Errorf("wrong topic name: %s", *msg.Topic) @@ -169,8 +169,12 @@ func blobFields(b blocks.ROBlob) logrus.Fields { } } -func computeSubnetForBlobSidecar(index uint64) uint64 { - return index % params.BeaconConfig().BlobsidecarSubnetCount +func computeSubnetForBlobSidecar(index uint64, slot primitives.Slot) uint64 { + subnetCount := params.BeaconConfig().BlobsidecarSubnetCount + if slots.ToEpoch(slot) >= params.BeaconConfig().ElectraForkEpoch { + subnetCount = params.BeaconConfig().BlobsidecarSubnetCountElectra + } + return index % subnetCount } // saveInvalidBlobToTemp as a block ssz. Writes to temp directory. diff --git a/cmd/validator/slashing-protection/import.go b/cmd/validator/slashing-protection/import.go index 3aa91085c78b..5f62bd991683 100644 --- a/cmd/validator/slashing-protection/import.go +++ b/cmd/validator/slashing-protection/import.go @@ -33,7 +33,7 @@ func importSlashingProtectionJSON(cliCtx *cli.Context) error { ) // Check if a minimal database is requested - isDatabaseMimimal := cliCtx.Bool(features.EnableMinimalSlashingProtection.Name) + isDatabaseMinimal := cliCtx.Bool(features.EnableMinimalSlashingProtection.Name) // Get the data directory from the CLI context. dataDir := cliCtx.String(cmd.DataDirFlag.Name) @@ -45,7 +45,7 @@ func importSlashingProtectionJSON(cliCtx *cli.Context) error { } // Ensure that the database is found under the specified directory or its subdirectories - if isDatabaseMimimal { + if isDatabaseMinimal { found, _, err = file.RecursiveDirFind(filesystem.DatabaseDirName, dataDir) } else { found, _, err = file.RecursiveFileFind(kv.ProtectionDbFileName, dataDir) @@ -63,7 +63,7 @@ func importSlashingProtectionJSON(cliCtx *cli.Context) error { log.Infof(message, dataDir) // Open the validator database. - if isDatabaseMimimal { + if isDatabaseMinimal { valDB, err = filesystem.NewStore(dataDir, nil) } else { valDB, err = kv.NewKVStore(cliCtx.Context, dataDir, nil) diff --git a/config/params/config.go b/config/params/config.go index 734f56172bc6..9a8cf88abdea 100644 --- a/config/params/config.go +++ b/config/params/config.go @@ -146,6 +146,7 @@ type BeaconChainConfig struct { BeaconStateCapellaFieldCount int // BeaconStateCapellaFieldCount defines how many fields are in beacon state post upgrade to Capella. BeaconStateDenebFieldCount int // BeaconStateDenebFieldCount defines how many fields are in beacon state post upgrade to Deneb. BeaconStateElectraFieldCount int // BeaconStateElectraFieldCount defines how many fields are in beacon state post upgrade to Electra. + BeaconStateFuluFieldCount int // BeaconStateFuluFieldCount defines how many fields are in beacon state post upgrade to Fulu. // Slasher constants. WeakSubjectivityPeriod primitives.Epoch // WeakSubjectivityPeriod defines the time period expressed in number of epochs were proof of stake network should validate block headers and attestations for slashable events. @@ -166,6 +167,8 @@ type BeaconChainConfig struct { DenebForkEpoch primitives.Epoch `yaml:"DENEB_FORK_EPOCH" spec:"true"` // DenebForkEpoch is used to represent the assigned fork epoch for deneb. ElectraForkVersion []byte `yaml:"ELECTRA_FORK_VERSION" spec:"true"` // ElectraForkVersion is used to represent the fork version for electra. ElectraForkEpoch primitives.Epoch `yaml:"ELECTRA_FORK_EPOCH" spec:"true"` // ElectraForkEpoch is used to represent the assigned fork epoch for electra. + FuluForkVersion []byte `yaml:"FULU_FORK_VERSION" spec:"true"` // FuluForkVersion is used to represent the fork version for fulu. + FuluForkEpoch primitives.Epoch `yaml:"FULU_FORK_EPOCH" spec:"true"` // FuluForkEpoch is used to represent the assigned fork epoch for fulu. ForkVersionSchedule map[[fieldparams.VersionLength]byte]primitives.Epoch // Schedule of fork epochs by version. ForkVersionNames map[[fieldparams.VersionLength]byte]string // Human-readable names of fork versions. @@ -228,12 +231,15 @@ type BeaconChainConfig struct { ExecutionEngineTimeoutValue uint64 // ExecutionEngineTimeoutValue defines the seconds to wait before timing out engine endpoints with execution payload execution semantics (newPayload, forkchoiceUpdated). // Subnet value - BlobsidecarSubnetCount uint64 `yaml:"BLOB_SIDECAR_SUBNET_COUNT"` // BlobsidecarSubnetCount is the number of blobsidecar subnets used in the gossipsub protocol. + BlobsidecarSubnetCount uint64 `yaml:"BLOB_SIDECAR_SUBNET_COUNT"` // BlobsidecarSubnetCount is the number of blobsidecar subnets used in the gossipsub protocol. + BlobsidecarSubnetCountElectra uint64 `yaml:"BLOB_SIDECAR_SUBNET_COUNT_ELECTRA"` // BlobsidecarSubnetCountElectra is the number of blobsidecar subnets used in the gossipsub protocol post Electra hard fork. // Values introduced in Deneb hard fork MaxPerEpochActivationChurnLimit uint64 `yaml:"MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT" spec:"true"` // MaxPerEpochActivationChurnLimit is the maximum amount of churn allotted for validator activation. MinEpochsForBlobsSidecarsRequest primitives.Epoch `yaml:"MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS" spec:"true"` // MinEpochsForBlobsSidecarsRequest is the minimum number of epochs the node will keep the blobs for. MaxRequestBlobSidecars uint64 `yaml:"MAX_REQUEST_BLOB_SIDECARS" spec:"true"` // MaxRequestBlobSidecars is the maximum number of blobs to request in a single request. + MaxRequestBlobSidecarsElectra uint64 `yaml:"MAX_REQUEST_BLOB_SIDECARS_ELECTRA" spec:"true"` // MaxRequestBlobSidecarsElectra is the maximum number of blobs to request in a single request after the electra epoch. + MaxRequestBlobSidecarsFulu uint64 `yaml:"MAX_REQUEST_BLOB_SIDECARS_FULU" spec:"true"` // MaxRequestBlobSidecarsFulu is the maximum number of blobs to request in a single request after the fulu epoch. MaxRequestBlocksDeneb uint64 `yaml:"MAX_REQUEST_BLOCKS_DENEB" spec:"true"` // MaxRequestBlocksDeneb is the maximum number of blocks in a single request after the deneb epoch. // Values introduce in Electra upgrade @@ -285,6 +291,7 @@ type BeaconChainConfig struct { // Deprecated_MaxBlobsPerBlock defines the max blobs that could exist in a block. // Deprecated: This field is no longer supported. Avoid using it. DeprecatedMaxBlobsPerBlock int `yaml:"MAX_BLOBS_PER_BLOCK" spec:"true"` + // DeprecatedMaxBlobsPerBlockElectra defines the max blobs that could exist in a block post Electra hard fork. // Deprecated: This field is no longer supported. Avoid using it. DeprecatedMaxBlobsPerBlockElectra int `yaml:"MAX_BLOBS_PER_BLOCK_ELECTRA" spec:"true"` @@ -309,6 +316,7 @@ func configForkSchedule(b *BeaconChainConfig) map[[fieldparams.VersionLength]byt fvs[bytesutil.ToBytes4(b.CapellaForkVersion)] = b.CapellaForkEpoch fvs[bytesutil.ToBytes4(b.DenebForkVersion)] = b.DenebForkEpoch fvs[bytesutil.ToBytes4(b.ElectraForkVersion)] = b.ElectraForkEpoch + fvs[bytesutil.ToBytes4(b.FuluForkVersion)] = b.FuluForkEpoch return fvs } @@ -331,6 +339,7 @@ func ConfigForkVersions(b *BeaconChainConfig) map[[fieldparams.VersionLength]byt bytesutil.ToBytes4(b.CapellaForkVersion): version.Capella, bytesutil.ToBytes4(b.DenebForkVersion): version.Deneb, bytesutil.ToBytes4(b.ElectraForkVersion): version.Electra, + bytesutil.ToBytes4(b.FuluForkVersion): version.Fulu, } } @@ -372,32 +381,36 @@ func (b *BeaconChainConfig) MaximumGossipClockDisparityDuration() time.Duration // TargetBlobsPerBlock returns the target number of blobs per block for the given slot, // accounting for changes introduced by the Electra fork. func (b *BeaconChainConfig) TargetBlobsPerBlock(slot primitives.Slot) int { - if primitives.Epoch(slot.DivSlot(32)) >= b.ElectraForkEpoch { + epoch := primitives.Epoch(slot.DivSlot(32)) + + if epoch >= b.ElectraForkEpoch { return b.DeprecatedTargetBlobsPerBlockElectra } + return b.DeprecatedMaxBlobsPerBlock / 2 } -// MaxBlobsPerBlock returns the maximum number of blobs per block for the given slot, -// adjusting for the Electra fork. +// MaxBlobsPerBlock returns the maximum number of blobs per block for the given slot. func (b *BeaconChainConfig) MaxBlobsPerBlock(slot primitives.Slot) int { - if primitives.Epoch(slot.DivSlot(32)) >= b.ElectraForkEpoch { + epoch := primitives.Epoch(slot.DivSlot(32)) + + if epoch >= b.ElectraForkEpoch { return b.DeprecatedMaxBlobsPerBlockElectra } + return b.DeprecatedMaxBlobsPerBlock } -// DenebEnabled centralizes the check to determine if code paths -// that are specific to deneb should be allowed to execute. This will make it easier to find call sites that do this -// kind of check and remove them post-deneb. +// DenebEnabled centralizes the check to determine if code paths that are specific to deneb should be allowed to execute. +// This will make it easier to find call sites that do this kind of check and remove them post-deneb. func DenebEnabled() bool { return BeaconConfig().DenebForkEpoch < math.MaxUint64 } -// PeerDASEnabled centralizes the check to determine if code paths -// that are specific to peerdas should be allowed to execute. -func PeerDASEnabled() bool { - return BeaconConfig().ElectraForkEpoch < math.MaxUint64 +// FuluEnabled centralizes the check to determine if code paths that are specific to Fulu should be allowed to execute. +// This will make it easier to find call sites that do this kind of check and remove them post-fulu. +func FuluEnabled() bool { + return BeaconConfig().FuluForkEpoch < math.MaxUint64 } // WithinDAPeriod checks if the block epoch is within MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS of the given current epoch. diff --git a/config/params/interop.go b/config/params/interop.go index 44c2c048aa50..c997646ae98f 100644 --- a/config/params/interop.go +++ b/config/params/interop.go @@ -12,6 +12,7 @@ func InteropConfig() *BeaconChainConfig { c.CapellaForkVersion = []byte{3, 0, 0, 235} c.DenebForkVersion = []byte{4, 0, 0, 235} c.ElectraForkVersion = []byte{5, 0, 0, 235} + c.FuluForkVersion = []byte{6, 0, 0, 235} c.InitializeForkSchedule() return c diff --git a/config/params/loader.go b/config/params/loader.go index 880c33e0f509..b56ae276340d 100644 --- a/config/params/loader.go +++ b/config/params/loader.go @@ -217,6 +217,8 @@ func ConfigToYaml(cfg *BeaconChainConfig) []byte { fmt.Sprintf("DENEB_FORK_VERSION: %#x", cfg.DenebForkVersion), fmt.Sprintf("ELECTRA_FORK_EPOCH: %d", cfg.ElectraForkEpoch), fmt.Sprintf("ELECTRA_FORK_VERSION: %#x", cfg.ElectraForkVersion), + fmt.Sprintf("FULU_FORK_EPOCH: %d", cfg.FuluForkEpoch), + fmt.Sprintf("FULU_FORK_VERSION: %#x", cfg.FuluForkVersion), fmt.Sprintf("EPOCHS_PER_SUBNET_SUBSCRIPTION: %d", cfg.EpochsPerSubnetSubscription), fmt.Sprintf("ATTESTATION_SUBNET_EXTRA_BITS: %d", cfg.AttestationSubnetExtraBits), fmt.Sprintf("ATTESTATION_SUBNET_PREFIX_BITS: %d", cfg.AttestationSubnetPrefixBits), diff --git a/config/params/loader_test.go b/config/params/loader_test.go index 7471e529bf30..a4a8ea0a79d8 100644 --- a/config/params/loader_test.go +++ b/config/params/loader_test.go @@ -24,31 +24,22 @@ import ( // These are variables that we don't use in Prysm. (i.e. future hardfork, light client... etc) // IMPORTANT: Use one field per line and sort these alphabetically to reduce conflicts. var placeholderFields = []string{ - "BLOB_SIDECAR_SUBNET_COUNT_EIP7594", - "BLOB_SIDECAR_SUBNET_COUNT_ELECTRA", + "BLOB_SIDECAR_SUBNET_COUNT_FULU", "BYTES_PER_LOGS_BLOOM", // Compile time constant on ExecutionPayload.logs_bloom. "EIP6110_FORK_EPOCH", "EIP6110_FORK_VERSION", "EIP7002_FORK_EPOCH", "EIP7002_FORK_VERSION", - "EIP7594_FORK_EPOCH", - "EIP7594_FORK_VERSION", "EIP7732_FORK_EPOCH", "EIP7732_FORK_VERSION", - "FIELD_ELEMENTS_PER_BLOB", // Compile time constant. - "FULU_FORK_EPOCH", - "FULU_FORK_VERSION", + "FIELD_ELEMENTS_PER_BLOB", // Compile time constant. "KZG_COMMITMENT_INCLUSION_PROOF_DEPTH", // Compile time constant on BlobSidecar.commitment_inclusion_proof. - "MAX_BLOBS_PER_BLOCK_EIP7594", "MAX_BLOBS_PER_BLOCK_FULU", "MAX_BLOB_COMMITMENTS_PER_BLOCK", // Compile time constant on BeaconBlockBodyDeneb.blob_kzg_commitments. "MAX_BYTES_PER_TRANSACTION", // Used for ssz of EL transactions. Unused in Prysm. "MAX_EXTRA_DATA_BYTES", // Compile time constant on ExecutionPayload.extra_data. - "MAX_REQUEST_BLOB_SIDECARS_EIP7594", - "MAX_REQUEST_BLOB_SIDECARS_ELECTRA", - "MAX_REQUEST_BLOB_SIDECARS_FULU", - "MAX_REQUEST_PAYLOADS", // Compile time constant on BeaconBlockBody.ExecutionRequests - "MAX_TRANSACTIONS_PER_PAYLOAD", // Compile time constant on ExecutionPayload.transactions. + "MAX_REQUEST_PAYLOADS", // Compile time constant on BeaconBlockBody.ExecutionRequests + "MAX_TRANSACTIONS_PER_PAYLOAD", // Compile time constant on ExecutionPayload.transactions. "NUMBER_OF_CUSTODY_GROUPS", "REORG_HEAD_WEIGHT_THRESHOLD", "TARGET_NUMBER_OF_PEERS", @@ -160,6 +151,7 @@ func assertEqualConfigs(t *testing.T, name string, fields []string, expected, ac assert.Equal(t, expected.CapellaForkEpoch, actual.CapellaForkEpoch, "%s: CapellaForkEpoch", name) assert.Equal(t, expected.DenebForkEpoch, actual.DenebForkEpoch, "%s: DenebForkEpoch", name) assert.Equal(t, expected.ElectraForkEpoch, actual.ElectraForkEpoch, "%s: ElectraForkEpoch", name) + assert.Equal(t, expected.FuluForkEpoch, actual.FuluForkEpoch, "%s: FuluForkEpoch", name) assert.Equal(t, expected.SqrRootSlotsPerEpoch, actual.SqrRootSlotsPerEpoch, "%s: SqrRootSlotsPerEpoch", name) assert.DeepEqual(t, expected.GenesisForkVersion, actual.GenesisForkVersion, "%s: GenesisForkVersion", name) assert.DeepEqual(t, expected.AltairForkVersion, actual.AltairForkVersion, "%s: AltairForkVersion", name) @@ -167,6 +159,7 @@ func assertEqualConfigs(t *testing.T, name string, fields []string, expected, ac assert.DeepEqual(t, expected.CapellaForkVersion, actual.CapellaForkVersion, "%s: CapellaForkVersion", name) assert.DeepEqual(t, expected.DenebForkVersion, actual.DenebForkVersion, "%s: DenebForkVersion", name) assert.DeepEqual(t, expected.ElectraForkVersion, actual.ElectraForkVersion, "%s: ElectraForkVersion", name) + assert.DeepEqual(t, expected.FuluForkVersion, actual.FuluForkVersion, "%s: FuluForkVersion", name) assertYamlFieldsMatch(t, name, fields, expected, actual) } diff --git a/config/params/mainnet_config.go b/config/params/mainnet_config.go index ea54f939eeaa..7f1b2a3167b9 100644 --- a/config/params/mainnet_config.go +++ b/config/params/mainnet_config.go @@ -29,6 +29,8 @@ const ( mainnetDenebForkEpoch = 269568 // March 13, 2024, 13:55:35 UTC // Electra Fork Epoch for mainnet config mainnetElectraForkEpoch = math.MaxUint64 // Far future / to be defined + // Fulu Fork Epoch for mainnet config + mainnetFuluForkEpoch = math.MaxUint64 // Far future / to be defined ) var mainnetNetworkConfig = &NetworkConfig{ @@ -195,6 +197,7 @@ var mainnetBeaconConfig = &BeaconChainConfig{ BeaconStateCapellaFieldCount: 28, BeaconStateDenebFieldCount: 28, BeaconStateElectraFieldCount: 37, + BeaconStateFuluFieldCount: 37, // Slasher related values. WeakSubjectivityPeriod: 54000, @@ -217,6 +220,8 @@ var mainnetBeaconConfig = &BeaconChainConfig{ DenebForkEpoch: mainnetDenebForkEpoch, ElectraForkVersion: []byte{5, 0, 0, 0}, ElectraForkEpoch: mainnetElectraForkEpoch, + FuluForkVersion: []byte{6, 0, 0, 0}, + FuluForkEpoch: mainnetFuluForkEpoch, // New values introduced in Altair hard fork 1. // Participation flag indices. @@ -268,7 +273,8 @@ var mainnetBeaconConfig = &BeaconChainConfig{ ExecutionEngineTimeoutValue: 8, // 8 seconds default based on: https://github.com/ethereum/execution-apis/blob/main/src/engine/specification.md#core // Subnet value - BlobsidecarSubnetCount: 6, + BlobsidecarSubnetCount: 6, + BlobsidecarSubnetCountElectra: 9, MaxPerEpochActivationChurnLimit: 8, MinEpochsForBlobsSidecarsRequest: 4096, @@ -323,6 +329,8 @@ var mainnetBeaconConfig = &BeaconChainConfig{ DeprecatedMaxBlobsPerBlock: 6, DeprecatedMaxBlobsPerBlockElectra: 9, DeprecatedTargetBlobsPerBlockElectra: 6, + MaxRequestBlobSidecarsElectra: 1152, + MaxRequestBlobSidecarsFulu: 1536, } // MainnetTestConfig provides a version of the mainnet config that has a different name @@ -344,6 +352,7 @@ func FillTestVersions(c *BeaconChainConfig, b byte) { c.CapellaForkVersion = make([]byte, fieldparams.VersionLength) c.DenebForkVersion = make([]byte, fieldparams.VersionLength) c.ElectraForkVersion = make([]byte, fieldparams.VersionLength) + c.FuluForkVersion = make([]byte, fieldparams.VersionLength) c.GenesisForkVersion[fieldparams.VersionLength-1] = b c.AltairForkVersion[fieldparams.VersionLength-1] = b @@ -351,6 +360,7 @@ func FillTestVersions(c *BeaconChainConfig, b byte) { c.CapellaForkVersion[fieldparams.VersionLength-1] = b c.DenebForkVersion[fieldparams.VersionLength-1] = b c.ElectraForkVersion[fieldparams.VersionLength-1] = b + c.FuluForkVersion[fieldparams.VersionLength-1] = b c.GenesisForkVersion[0] = 0 c.AltairForkVersion[0] = 1 @@ -358,4 +368,5 @@ func FillTestVersions(c *BeaconChainConfig, b byte) { c.CapellaForkVersion[0] = 3 c.DenebForkVersion[0] = 4 c.ElectraForkVersion[0] = 5 + c.FuluForkVersion[0] = 5 } diff --git a/config/params/minimal_config.go b/config/params/minimal_config.go index e4c33d220acc..b09721061315 100644 --- a/config/params/minimal_config.go +++ b/config/params/minimal_config.go @@ -85,7 +85,6 @@ func MinimalSpecConfig() *BeaconChainConfig { minimalConfig.FarFutureEpoch = math.MaxUint64 minimalConfig.FarFutureSlot = math.MaxUint64 - // New Altair params minimalConfig.AltairForkVersion = []byte{1, 0, 0, 1} // Highest byte set to 0x01 to avoid collisions with mainnet versioning minimalConfig.AltairForkEpoch = math.MaxUint64 minimalConfig.BellatrixForkVersion = []byte{2, 0, 0, 1} @@ -96,6 +95,8 @@ func MinimalSpecConfig() *BeaconChainConfig { minimalConfig.DenebForkEpoch = math.MaxUint64 minimalConfig.ElectraForkVersion = []byte{5, 0, 0, 1} minimalConfig.ElectraForkEpoch = math.MaxUint64 + minimalConfig.FuluForkVersion = []byte{6, 0, 0, 1} + minimalConfig.FuluForkEpoch = math.MaxUint64 minimalConfig.SyncCommitteeSize = 32 minimalConfig.InactivityScoreBias = 4 diff --git a/config/params/testdata/e2e_config.yaml b/config/params/testdata/e2e_config.yaml index d264fbb6188c..95b088b1d643 100644 --- a/config/params/testdata/e2e_config.yaml +++ b/config/params/testdata/e2e_config.yaml @@ -47,6 +47,9 @@ DENEB_FORK_EPOCH: 12 # Electra ELECTRA_FORK_VERSION: 0x050000fd ELECTRA_FORK_EPOCH: 18446744073709551615 +# Fulu +FULU_FORK_VERSION: 0x060000fd +FULU_FORK_EPOCH: 18446744073709551615 # Time parameters diff --git a/config/params/testnet_e2e_config.go b/config/params/testnet_e2e_config.go index a82c02ec16b7..7ab00ef30d67 100644 --- a/config/params/testnet_e2e_config.go +++ b/config/params/testnet_e2e_config.go @@ -8,6 +8,7 @@ const ( CapellaE2EForkEpoch = 10 DenebE2EForkEpoch = 12 ElectraE2EForkEpoch = math.MaxUint64 + FuluE2EForkEpoch = math.MaxUint64 ) // E2ETestConfig retrieves the configurations made specifically for E2E testing. @@ -44,6 +45,7 @@ func E2ETestConfig() *BeaconChainConfig { e2eConfig.CapellaForkEpoch = CapellaE2EForkEpoch e2eConfig.DenebForkEpoch = DenebE2EForkEpoch e2eConfig.ElectraForkEpoch = ElectraE2EForkEpoch + e2eConfig.FuluForkEpoch = FuluE2EForkEpoch // Terminal Total Difficulty. e2eConfig.TerminalTotalDifficulty = "480" @@ -56,6 +58,7 @@ func E2ETestConfig() *BeaconChainConfig { e2eConfig.CapellaForkVersion = []byte{3, 0, 0, 253} e2eConfig.DenebForkVersion = []byte{4, 0, 0, 253} e2eConfig.ElectraForkVersion = []byte{5, 0, 0, 253} + e2eConfig.FuluForkVersion = []byte{6, 0, 0, 253} e2eConfig.InitializeForkSchedule() return e2eConfig @@ -88,6 +91,7 @@ func E2EMainnetTestConfig() *BeaconChainConfig { e2eConfig.CapellaForkEpoch = CapellaE2EForkEpoch e2eConfig.DenebForkEpoch = DenebE2EForkEpoch e2eConfig.ElectraForkEpoch = ElectraE2EForkEpoch + e2eConfig.FuluForkEpoch = FuluE2EForkEpoch // Terminal Total Difficulty. e2eConfig.TerminalTotalDifficulty = "480" @@ -100,6 +104,7 @@ func E2EMainnetTestConfig() *BeaconChainConfig { e2eConfig.CapellaForkVersion = []byte{3, 0, 0, 254} e2eConfig.DenebForkVersion = []byte{4, 0, 0, 254} e2eConfig.ElectraForkVersion = []byte{5, 0, 0, 254} + e2eConfig.FuluForkVersion = []byte{6, 0, 0, 254} // Deneb changes. e2eConfig.MinPerEpochChurnLimit = 2 diff --git a/config/params/testnet_holesky_config.go b/config/params/testnet_holesky_config.go index 03cefd8988fe..a3dec6cc3975 100644 --- a/config/params/testnet_holesky_config.go +++ b/config/params/testnet_holesky_config.go @@ -41,6 +41,8 @@ func HoleskyConfig() *BeaconChainConfig { cfg.DenebForkVersion = []byte{0x05, 0x1, 0x70, 0x0} cfg.ElectraForkEpoch = math.MaxUint64 cfg.ElectraForkVersion = []byte{0x06, 0x1, 0x70, 0x0} // TODO: Define holesky fork version for electra. This is a placeholder value. + cfg.FuluForkEpoch = math.MaxUint64 + cfg.FuluForkVersion = []byte{0x07, 0x1, 0x70, 0x0} // TODO: Define holesky fork version for fulu. This is a placeholder value. cfg.TerminalTotalDifficulty = "0" cfg.DepositContractAddress = "0x4242424242424242424242424242424242424242" cfg.EjectionBalance = 28000000000 diff --git a/config/params/testnet_sepolia_config.go b/config/params/testnet_sepolia_config.go index 80a00cc96178..5eaccf4ed5cf 100644 --- a/config/params/testnet_sepolia_config.go +++ b/config/params/testnet_sepolia_config.go @@ -46,6 +46,8 @@ func SepoliaConfig() *BeaconChainConfig { cfg.DenebForkVersion = []byte{0x90, 0x00, 0x00, 0x73} cfg.ElectraForkEpoch = math.MaxUint64 cfg.ElectraForkVersion = []byte{0x90, 0x00, 0x00, 0x74} // TODO: Define sepolia fork version for electra. This is a placeholder value. + cfg.FuluForkEpoch = math.MaxUint64 + cfg.FuluForkVersion = []byte{0x90, 0x00, 0x00, 0x75} // TODO: Define sepolia fork version for fulu. This is a placeholder value. cfg.TerminalTotalDifficulty = "17000000000000000" cfg.DepositContractAddress = "0x7f02C3E3c98b133055B8B348B2Ac625669Ed295D" cfg.InitializeForkSchedule() diff --git a/config/params/testutils.go b/config/params/testutils.go index 7c79e0aa6583..d0c2c18a2eac 100644 --- a/config/params/testutils.go +++ b/config/params/testutils.go @@ -9,17 +9,22 @@ import ( func SetupTestConfigCleanup(t testing.TB) { prevDefaultBeaconConfig := mainnetBeaconConfig.Copy() temp := configs.getActive().Copy() + undo, err := SetActiveWithUndo(temp) if err != nil { t.Fatal(err) } + prevNetworkCfg := networkConfig.Copy() + t.Cleanup(func() { mainnetBeaconConfig = prevDefaultBeaconConfig + err = undo() if err != nil { t.Fatal(err) } + networkConfig = prevNetworkCfg }) } diff --git a/consensus-types/blocks/execution.go b/consensus-types/blocks/execution.go index 0c75f1d43128..919deb0335d5 100644 --- a/consensus-types/blocks/execution.go +++ b/consensus-types/blocks/execution.go @@ -864,8 +864,6 @@ func WrappedExecutionPayloadHeaderDeneb(p *enginev1.ExecutionPayloadHeaderDeneb) return w, nil } -var WrappedExecutionPayloadHeaderElectra = WrappedExecutionPayloadHeaderDeneb - // IsNil checks if the underlying data is nil. func (e executionPayloadHeaderDeneb) IsNil() bool { return e.p == nil @@ -1024,8 +1022,6 @@ func WrappedExecutionPayloadDeneb(p *enginev1.ExecutionPayloadDeneb) (interfaces return w, nil } -var WrappedExecutionPayloadElectra = WrappedExecutionPayloadDeneb - // IsNil checks if the underlying data is nil. func (e executionPayloadDeneb) IsNil() bool { return e.p == nil diff --git a/consensus-types/blocks/factory.go b/consensus-types/blocks/factory.go index 37aa22a410dc..0d8f61f9e30a 100644 --- a/consensus-types/blocks/factory.go +++ b/consensus-types/blocks/factory.go @@ -74,6 +74,14 @@ func NewSignedBeaconBlock(i interface{}) (interfaces.SignedBeaconBlock, error) { return initBlindedSignedBlockFromProtoElectra(b) case *eth.GenericSignedBeaconBlock_BlindedElectra: return initBlindedSignedBlockFromProtoElectra(b.BlindedElectra) + case *eth.GenericSignedBeaconBlock_Fulu: + return initSignedBlockFromProtoFulu(b.Fulu.Block) + case *eth.SignedBeaconBlockFulu: + return initSignedBlockFromProtoFulu(b) + case *eth.SignedBlindedBeaconBlockFulu: + return initBlindedSignedBlockFromProtoFulu(b) + case *eth.GenericSignedBeaconBlock_BlindedFulu: + return initBlindedSignedBlockFromProtoFulu(b.BlindedFulu) default: return nil, errors.Wrapf(ErrUnsupportedSignedBeaconBlock, "unable to create block from type %T", i) } @@ -124,6 +132,14 @@ func NewBeaconBlock(i interface{}) (interfaces.ReadOnlyBeaconBlock, error) { return initBlindedBlockFromProtoElectra(b) case *eth.GenericBeaconBlock_BlindedElectra: return initBlindedBlockFromProtoElectra(b.BlindedElectra) + case *eth.GenericBeaconBlock_Fulu: + return initBlockFromProtoFulu(b.Fulu.Block) + case *eth.BeaconBlockFulu: + return initBlockFromProtoFulu(b) + case *eth.BlindedBeaconBlockFulu: + return initBlindedBlockFromProtoFulu(b) + case *eth.GenericBeaconBlock_BlindedFulu: + return initBlindedBlockFromProtoFulu(b.BlindedFulu) default: return nil, errors.Wrapf(errUnsupportedBeaconBlock, "unable to create block from type %T", i) } @@ -154,6 +170,10 @@ func NewBeaconBlockBody(i interface{}) (interfaces.ReadOnlyBeaconBlockBody, erro return initBlockBodyFromProtoElectra(b) case *eth.BlindedBeaconBlockBodyElectra: return initBlindedBlockBodyFromProtoElectra(b) + case *eth.BeaconBlockBodyFulu: + return initBlockBodyFromProtoFulu(b) + case *eth.BlindedBeaconBlockBodyFulu: + return initBlindedBlockBodyFromProtoFulu(b) default: return nil, errors.Wrapf(errUnsupportedBeaconBlockBody, "unable to create block body from type %T", i) } @@ -233,6 +253,19 @@ func BuildSignedBeaconBlock(blk interfaces.ReadOnlyBeaconBlock, signature []byte return nil, errIncorrectBlockVersion } return NewSignedBeaconBlock(ð.SignedBeaconBlockElectra{Block: pb, Signature: signature}) + case version.Fulu: + if blk.IsBlinded() { + pb, ok := pb.(*eth.BlindedBeaconBlockFulu) + if !ok { + return nil, errIncorrectBlockVersion + } + return NewSignedBeaconBlock(ð.SignedBlindedBeaconBlockFulu{Message: pb, Signature: signature}) + } + pb, ok := pb.(*eth.BeaconBlockFulu) + if !ok { + return nil, errIncorrectBlockVersion + } + return NewSignedBeaconBlock(ð.SignedBeaconBlockFulu{Block: pb, Signature: signature}) default: return nil, errUnsupportedBeaconBlock } @@ -280,7 +313,8 @@ func checkPayloadAgainstHeader(wrappedPayload, payloadHeader interfaces.Executio // BuildSignedBeaconBlockFromExecutionPayload takes a signed, blinded beacon block and converts into // a full, signed beacon block by specifying an execution payload. -func BuildSignedBeaconBlockFromExecutionPayload(blk interfaces.ReadOnlySignedBeaconBlock, payload interface{}) (interfaces.SignedBeaconBlock, error) { // nolint:gocognit +// nolint:gocognit +func BuildSignedBeaconBlockFromExecutionPayload(blk interfaces.ReadOnlySignedBeaconBlock, payload interface{}) (interfaces.SignedBeaconBlock, error) { if err := BeaconBlockIsNil(blk); err != nil { return nil, err } @@ -472,7 +506,7 @@ func BuildSignedBeaconBlockFromExecutionPayload(blk interfaces.ReadOnlySignedBea Signature: sig[:], } case version.Electra: - p, ok := payload.(*enginev1.ExecutionPayloadElectra) + p, ok := payload.(*enginev1.ExecutionPayloadDeneb) if !ok { return nil, errors.New("payload not of Electra type") } @@ -536,6 +570,71 @@ func BuildSignedBeaconBlockFromExecutionPayload(blk interfaces.ReadOnlySignedBea }, Signature: sig[:], } + case version.Fulu: + p, ok := payload.(*enginev1.ExecutionPayloadDeneb) + if !ok { + return nil, errors.New("payload not of Fulu type") + } + blsToExecutionChanges, err := b.Body().BLSToExecutionChanges() + if err != nil { + return nil, err + } + commitments, err := b.Body().BlobKzgCommitments() + if err != nil { + return nil, err + } + var atts []*eth.AttestationElectra + if b.Body().Attestations() != nil { + atts = make([]*eth.AttestationElectra, len(b.Body().Attestations())) + for i, att := range b.Body().Attestations() { + a, ok := att.(*eth.AttestationElectra) + if !ok { + return nil, fmt.Errorf("attestation has wrong type (expected %T, got %T)", ð.Attestation{}, att) + } + atts[i] = a + } + } + var attSlashings []*eth.AttesterSlashingElectra + if b.Body().AttesterSlashings() != nil { + attSlashings = make([]*eth.AttesterSlashingElectra, len(b.Body().AttesterSlashings())) + for i, slashing := range b.Body().AttesterSlashings() { + s, ok := slashing.(*eth.AttesterSlashingElectra) + if !ok { + return nil, fmt.Errorf("attester slashing has wrong type (expected %T, got %T)", ð.AttesterSlashing{}, slashing) + } + attSlashings[i] = s + } + } + + er, err := b.Body().ExecutionRequests() + if err != nil { + return nil, err + } + + fullBlock = ð.SignedBeaconBlockFulu{ + Block: ð.BeaconBlockFulu{ + Slot: b.Slot(), + ProposerIndex: b.ProposerIndex(), + ParentRoot: parentRoot[:], + StateRoot: stateRoot[:], + Body: ð.BeaconBlockBodyFulu{ + RandaoReveal: randaoReveal[:], + Eth1Data: b.Body().Eth1Data(), + Graffiti: graffiti[:], + ProposerSlashings: b.Body().ProposerSlashings(), + AttesterSlashings: attSlashings, + Attestations: atts, + Deposits: b.Body().Deposits(), + VoluntaryExits: b.Body().VoluntaryExits(), + SyncAggregate: syncAgg, + ExecutionPayload: p, + BlsToExecutionChanges: blsToExecutionChanges, + BlobKzgCommitments: commitments, + ExecutionRequests: er, + }, + }, + Signature: sig[:], + } default: return nil, errors.New("Block not of known type") } diff --git a/consensus-types/blocks/getters.go b/consensus-types/blocks/getters.go index 4aef3478baef..6d0911643852 100644 --- a/consensus-types/blocks/getters.go +++ b/consensus-types/blocks/getters.go @@ -75,6 +75,11 @@ func (b *SignedBeaconBlock) Copy() (interfaces.SignedBeaconBlock, error) { return initBlindedSignedBlockFromProtoElectra(pb.(*eth.SignedBlindedBeaconBlockElectra).Copy()) } return initSignedBlockFromProtoElectra(pb.(*eth.SignedBeaconBlockElectra).Copy()) + case version.Fulu: + if b.IsBlinded() { + return initBlindedSignedBlockFromProtoFulu(pb.(*eth.SignedBlindedBeaconBlockFulu).Copy()) + } + return initSignedBlockFromProtoFulu(pb.(*eth.SignedBeaconBlockFulu).Copy()) default: return nil, errIncorrectBlockVersion } @@ -131,6 +136,15 @@ func (b *SignedBeaconBlock) PbGenericBlock() (*eth.GenericSignedBeaconBlock, err return ð.GenericSignedBeaconBlock{ Block: ð.GenericSignedBeaconBlock_Electra{Electra: pb.(*eth.SignedBeaconBlockContentsElectra)}, }, nil + case version.Fulu: + if b.IsBlinded() { + return ð.GenericSignedBeaconBlock{ + Block: ð.GenericSignedBeaconBlock_BlindedFulu{BlindedFulu: pb.(*eth.SignedBlindedBeaconBlockFulu)}, + }, nil + } + return ð.GenericSignedBeaconBlock{ + Block: ð.GenericSignedBeaconBlock_Fulu{Fulu: pb.(*eth.SignedBeaconBlockContentsFulu)}, + }, nil default: return nil, errIncorrectBlockVersion } @@ -153,7 +167,7 @@ func (b *SignedBeaconBlock) ToBlinded() (interfaces.ReadOnlySignedBeaconBlock, e } if b.version >= version.Electra { - p, ok := payload.Proto().(*enginev1.ExecutionPayloadElectra) + p, ok := payload.Proto().(*enginev1.ExecutionPayloadDeneb) if !ok { return nil, fmt.Errorf("%T is not an execution payload header of Deneb version", p) } @@ -369,6 +383,11 @@ func (b *SignedBeaconBlock) MarshalSSZ() ([]byte, error) { return pb.(*eth.SignedBlindedBeaconBlockElectra).MarshalSSZ() } return pb.(*eth.SignedBeaconBlockElectra).MarshalSSZ() + case version.Fulu: + if b.IsBlinded() { + return pb.(*eth.SignedBlindedBeaconBlockFulu).MarshalSSZ() + } + return pb.(*eth.SignedBeaconBlockFulu).MarshalSSZ() default: return []byte{}, errIncorrectBlockVersion } @@ -406,6 +425,11 @@ func (b *SignedBeaconBlock) MarshalSSZTo(dst []byte) ([]byte, error) { return pb.(*eth.SignedBlindedBeaconBlockElectra).MarshalSSZTo(dst) } return pb.(*eth.SignedBeaconBlockElectra).MarshalSSZTo(dst) + case version.Fulu: + if b.IsBlinded() { + return pb.(*eth.SignedBlindedBeaconBlockFulu).MarshalSSZTo(dst) + } + return pb.(*eth.SignedBeaconBlockFulu).MarshalSSZTo(dst) default: return []byte{}, errIncorrectBlockVersion } @@ -447,12 +471,18 @@ func (b *SignedBeaconBlock) SizeSSZ() int { return pb.(*eth.SignedBlindedBeaconBlockElectra).SizeSSZ() } return pb.(*eth.SignedBeaconBlockElectra).SizeSSZ() + case version.Fulu: + if b.IsBlinded() { + return pb.(*eth.SignedBlindedBeaconBlockFulu).SizeSSZ() + } + return pb.(*eth.SignedBeaconBlockFulu).SizeSSZ() default: panic(incorrectBlockVersion) } } // UnmarshalSSZ unmarshals the signed beacon block from its relevant ssz form. +// nolint:gocognit func (b *SignedBeaconBlock) UnmarshalSSZ(buf []byte) error { var newBlock *SignedBeaconBlock switch b.version { @@ -564,6 +594,28 @@ func (b *SignedBeaconBlock) UnmarshalSSZ(buf []byte) error { return err } } + case version.Fulu: + if b.IsBlinded() { + pb := ð.SignedBlindedBeaconBlockFulu{} + if err := pb.UnmarshalSSZ(buf); err != nil { + return err + } + var err error + newBlock, err = initBlindedSignedBlockFromProtoFulu(pb) + if err != nil { + return err + } + } else { + pb := ð.SignedBeaconBlockFulu{} + if err := pb.UnmarshalSSZ(buf); err != nil { + return err + } + var err error + newBlock, err = initSignedBlockFromProtoFulu(pb) + if err != nil { + return err + } + } default: return errIncorrectBlockVersion } @@ -642,6 +694,11 @@ func (b *BeaconBlock) HashTreeRoot() ([field_params.RootLength]byte, error) { return pb.(*eth.BlindedBeaconBlockElectra).HashTreeRoot() } return pb.(*eth.BeaconBlockElectra).HashTreeRoot() + case version.Fulu: + if b.IsBlinded() { + return pb.(*eth.BlindedBeaconBlockFulu).HashTreeRoot() + } + return pb.(*eth.BeaconBlockFulu).HashTreeRoot() default: return [field_params.RootLength]byte{}, errIncorrectBlockVersion } @@ -678,6 +735,11 @@ func (b *BeaconBlock) HashTreeRootWith(h *ssz.Hasher) error { return pb.(*eth.BlindedBeaconBlockElectra).HashTreeRootWith(h) } return pb.(*eth.BeaconBlockElectra).HashTreeRootWith(h) + case version.Fulu: + if b.IsBlinded() { + return pb.(*eth.BlindedBeaconBlockFulu).HashTreeRootWith(h) + } + return pb.(*eth.BeaconBlockFulu).HashTreeRootWith(h) default: return errIncorrectBlockVersion } @@ -715,6 +777,11 @@ func (b *BeaconBlock) MarshalSSZ() ([]byte, error) { return pb.(*eth.BlindedBeaconBlockElectra).MarshalSSZ() } return pb.(*eth.BeaconBlockElectra).MarshalSSZ() + case version.Fulu: + if b.IsBlinded() { + return pb.(*eth.BlindedBeaconBlockFulu).MarshalSSZ() + } + return pb.(*eth.BeaconBlockFulu).MarshalSSZ() default: return []byte{}, errIncorrectBlockVersion } @@ -752,6 +819,11 @@ func (b *BeaconBlock) MarshalSSZTo(dst []byte) ([]byte, error) { return pb.(*eth.BlindedBeaconBlockElectra).MarshalSSZTo(dst) } return pb.(*eth.BeaconBlockElectra).MarshalSSZTo(dst) + case version.Fulu: + if b.IsBlinded() { + return pb.(*eth.BlindedBeaconBlockFulu).MarshalSSZTo(dst) + } + return pb.(*eth.BeaconBlockFulu).MarshalSSZTo(dst) default: return []byte{}, errIncorrectBlockVersion } @@ -793,12 +865,18 @@ func (b *BeaconBlock) SizeSSZ() int { return pb.(*eth.BlindedBeaconBlockElectra).SizeSSZ() } return pb.(*eth.BeaconBlockElectra).SizeSSZ() + case version.Fulu: + if b.IsBlinded() { + return pb.(*eth.BlindedBeaconBlockFulu).SizeSSZ() + } + return pb.(*eth.BeaconBlockFulu).SizeSSZ() default: panic(incorrectBodyVersion) } } // UnmarshalSSZ unmarshals the beacon block from its relevant ssz form. +// nolint:gocognit func (b *BeaconBlock) UnmarshalSSZ(buf []byte) error { var newBlock *BeaconBlock switch b.version { @@ -910,6 +988,28 @@ func (b *BeaconBlock) UnmarshalSSZ(buf []byte) error { return err } } + case version.Fulu: + if b.IsBlinded() { + pb := ð.BlindedBeaconBlockFulu{} + if err := pb.UnmarshalSSZ(buf); err != nil { + return err + } + var err error + newBlock, err = initBlindedBlockFromProtoFulu(pb) + if err != nil { + return err + } + } else { + pb := ð.BeaconBlockFulu{} + if err := pb.UnmarshalSSZ(buf); err != nil { + return err + } + var err error + newBlock, err = initBlockFromProtoFulu(pb) + if err != nil { + return err + } + } default: return errIncorrectBlockVersion } @@ -948,6 +1048,11 @@ func (b *BeaconBlock) AsSignRequestObject() (validatorpb.SignRequestObject, erro return &validatorpb.SignRequest_BlindedBlockElectra{BlindedBlockElectra: pb.(*eth.BlindedBeaconBlockElectra)}, nil } return &validatorpb.SignRequest_BlockElectra{BlockElectra: pb.(*eth.BeaconBlockElectra)}, nil + case version.Fulu: + if b.IsBlinded() { + return &validatorpb.SignRequest_BlindedBlockFulu{BlindedBlockFulu: pb.(*eth.BlindedBeaconBlockFulu)}, nil + } + return &validatorpb.SignRequest_BlockFulu{BlockFulu: pb.(*eth.BeaconBlockFulu)}, nil default: return nil, errIncorrectBlockVersion } @@ -987,6 +1092,11 @@ func (b *BeaconBlock) Copy() (interfaces.ReadOnlyBeaconBlock, error) { return initBlindedBlockFromProtoElectra(pb.(*eth.BlindedBeaconBlockElectra).Copy()) } return initBlockFromProtoElectra(pb.(*eth.BeaconBlockElectra).Copy()) + case version.Fulu: + if b.IsBlinded() { + return initBlindedBlockFromProtoFulu(pb.(*eth.BlindedBeaconBlockFulu).Copy()) + } + return initBlockFromProtoFulu(pb.(*eth.BeaconBlockFulu).Copy()) default: return nil, errIncorrectBlockVersion } @@ -1103,14 +1213,15 @@ func (b *BeaconBlockBody) BLSToExecutionChanges() ([]*eth.SignedBLSToExecutionCh // BlobKzgCommitments returns the blob kzg commitments in the block. func (b *BeaconBlockBody) BlobKzgCommitments() ([][]byte, error) { - switch b.version { - case version.Phase0, version.Altair, version.Bellatrix, version.Capella: - return nil, consensus_types.ErrNotSupported("BlobKzgCommitments", b.version) - case version.Deneb, version.Electra: + if b.version >= version.Deneb { return b.blobKzgCommitments, nil - default: - return nil, errIncorrectBlockVersion } + + if b.version >= version.Phase0 { + return nil, consensus_types.ErrNotSupported("BlobKzgCommitments", b.version) + } + + return nil, errIncorrectBlockVersion } // ExecutionRequests returns the execution requests @@ -1157,6 +1268,11 @@ func (b *BeaconBlockBody) HashTreeRoot() ([field_params.RootLength]byte, error) return pb.(*eth.BlindedBeaconBlockBodyElectra).HashTreeRoot() } return pb.(*eth.BeaconBlockBodyElectra).HashTreeRoot() + case version.Fulu: + if b.IsBlinded() { + return pb.(*eth.BlindedBeaconBlockBodyFulu).HashTreeRoot() + } + return pb.(*eth.BeaconBlockBodyFulu).HashTreeRoot() default: return [field_params.RootLength]byte{}, errIncorrectBodyVersion } diff --git a/consensus-types/blocks/getters_test.go b/consensus-types/blocks/getters_test.go index 6be8940e7b6f..29cc86644d88 100644 --- a/consensus-types/blocks/getters_test.go +++ b/consensus-types/blocks/getters_test.go @@ -613,7 +613,7 @@ func hydrateBeaconBlockBodyElectra() *eth.BeaconBlockBodyElectra { SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength), SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), }, - ExecutionPayload: &pb.ExecutionPayloadElectra{ + ExecutionPayload: &pb.ExecutionPayloadDeneb{ ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, 20), StateRoot: make([]byte, fieldparams.RootLength), diff --git a/consensus-types/blocks/proofs.go b/consensus-types/blocks/proofs.go index 4bd114af9f1e..c5ffb2a7db52 100644 --- a/consensus-types/blocks/proofs.go +++ b/consensus-types/blocks/proofs.go @@ -43,6 +43,8 @@ func ComputeBlockBodyFieldRoots(ctx context.Context, blockBody *BeaconBlockBody) fieldRoots = make([][]byte, 12) case version.Electra: fieldRoots = make([][]byte, 13) + case version.Fulu: + fieldRoots = make([][]byte, 13) default: return nil, fmt.Errorf("unknown block body version %s", version.String(blockBody.version)) } diff --git a/consensus-types/blocks/proto.go b/consensus-types/blocks/proto.go index 1cb29d535e2d..5c056ea99b3b 100644 --- a/consensus-types/blocks/proto.go +++ b/consensus-types/blocks/proto.go @@ -156,6 +156,33 @@ func (b *SignedBeaconBlock) Proto() (proto.Message, error) { // nolint:gocognit Block: block, Signature: b.signature[:], }, nil + case version.Fulu: + if b.IsBlinded() { + var block *eth.BlindedBeaconBlockFulu + if blockMessage != nil { + var ok bool + block, ok = blockMessage.(*eth.BlindedBeaconBlockFulu) + if !ok { + return nil, errIncorrectBlockVersion + } + } + return ð.SignedBlindedBeaconBlockFulu{ + Message: block, + Signature: b.signature[:], + }, nil + } + var block *eth.BeaconBlockFulu + if blockMessage != nil { + var ok bool + block, ok = blockMessage.(*eth.BeaconBlockFulu) + if !ok { + return nil, errIncorrectBlockVersion + } + } + return ð.SignedBeaconBlockFulu{ + Block: block, + Signature: b.signature[:], + }, nil default: return nil, errors.New("unsupported signed beacon block version") } @@ -337,6 +364,39 @@ func (b *BeaconBlock) Proto() (proto.Message, error) { // nolint:gocognit StateRoot: b.stateRoot[:], Body: body, }, nil + case version.Fulu: + if b.IsBlinded() { + var body *eth.BlindedBeaconBlockBodyFulu + if bodyMessage != nil { + var ok bool + body, ok = bodyMessage.(*eth.BlindedBeaconBlockBodyFulu) + if !ok { + return nil, errIncorrectBodyVersion + } + } + return ð.BlindedBeaconBlockFulu{ + Slot: b.slot, + ProposerIndex: b.proposerIndex, + ParentRoot: b.parentRoot[:], + StateRoot: b.stateRoot[:], + Body: body, + }, nil + } + var body *eth.BeaconBlockBodyFulu + if bodyMessage != nil { + var ok bool + body, ok = bodyMessage.(*eth.BeaconBlockBodyFulu) + if !ok { + return nil, errIncorrectBodyVersion + } + } + return ð.BeaconBlockFulu{ + Slot: b.slot, + ProposerIndex: b.proposerIndex, + ParentRoot: b.parentRoot[:], + StateRoot: b.stateRoot[:], + Body: body, + }, nil default: return nil, errors.New("unsupported beacon block version") @@ -344,6 +404,7 @@ func (b *BeaconBlock) Proto() (proto.Message, error) { // nolint:gocognit } // Proto converts the beacon block body to a protobuf object. +// nolint:gocognit func (b *BeaconBlockBody) Proto() (proto.Message, error) { if b == nil { return nil, nil @@ -510,10 +571,10 @@ func (b *BeaconBlockBody) Proto() (proto.Message, error) { }, nil case version.Electra: if b.IsBlinded() { - var ph *enginev1.ExecutionPayloadHeaderElectra + var ph *enginev1.ExecutionPayloadHeaderDeneb var ok bool if b.executionPayloadHeader != nil { - ph, ok = b.executionPayloadHeader.Proto().(*enginev1.ExecutionPayloadHeaderElectra) + ph, ok = b.executionPayloadHeader.Proto().(*enginev1.ExecutionPayloadHeaderDeneb) if !ok { return nil, errPayloadHeaderWrongType } @@ -534,10 +595,10 @@ func (b *BeaconBlockBody) Proto() (proto.Message, error) { ExecutionRequests: b.executionRequests, }, nil } - var p *enginev1.ExecutionPayloadElectra + var p *enginev1.ExecutionPayloadDeneb var ok bool if b.executionPayload != nil { - p, ok = b.executionPayload.Proto().(*enginev1.ExecutionPayloadElectra) + p, ok = b.executionPayload.Proto().(*enginev1.ExecutionPayloadDeneb) if !ok { return nil, errPayloadWrongType } @@ -557,12 +618,65 @@ func (b *BeaconBlockBody) Proto() (proto.Message, error) { BlobKzgCommitments: b.blobKzgCommitments, ExecutionRequests: b.executionRequests, }, nil + case version.Fulu: + if b.IsBlinded() { + var ph *enginev1.ExecutionPayloadHeaderDeneb + var ok bool + if b.executionPayloadHeader != nil { + ph, ok = b.executionPayloadHeader.Proto().(*enginev1.ExecutionPayloadHeaderDeneb) + if !ok { + return nil, errPayloadHeaderWrongType + } + } + return ð.BlindedBeaconBlockBodyFulu{ + RandaoReveal: b.randaoReveal[:], + Eth1Data: b.eth1Data, + Graffiti: b.graffiti[:], + ProposerSlashings: b.proposerSlashings, + AttesterSlashings: b.attesterSlashingsElectra, + Attestations: b.attestationsElectra, + Deposits: b.deposits, + VoluntaryExits: b.voluntaryExits, + SyncAggregate: b.syncAggregate, + ExecutionPayloadHeader: ph, + BlsToExecutionChanges: b.blsToExecutionChanges, + BlobKzgCommitments: b.blobKzgCommitments, + ExecutionRequests: b.executionRequests, + }, nil + } + var p *enginev1.ExecutionPayloadDeneb + var ok bool + if b.executionPayload != nil { + p, ok = b.executionPayload.Proto().(*enginev1.ExecutionPayloadDeneb) + if !ok { + return nil, errPayloadWrongType + } + } + return ð.BeaconBlockBodyFulu{ + RandaoReveal: b.randaoReveal[:], + Eth1Data: b.eth1Data, + Graffiti: b.graffiti[:], + ProposerSlashings: b.proposerSlashings, + AttesterSlashings: b.attesterSlashingsElectra, + Attestations: b.attestationsElectra, + Deposits: b.deposits, + VoluntaryExits: b.voluntaryExits, + SyncAggregate: b.syncAggregate, + ExecutionPayload: p, + BlsToExecutionChanges: b.blsToExecutionChanges, + BlobKzgCommitments: b.blobKzgCommitments, + ExecutionRequests: b.executionRequests, + }, nil default: return nil, errors.New("unsupported beacon block body version") } } +// ---------------------------------------------------------------------------- +// Phase 0 +// ---------------------------------------------------------------------------- + func initSignedBlockFromProtoPhase0(pb *eth.SignedBeaconBlock) (*SignedBeaconBlock, error) { if pb == nil { return nil, errNilBlock @@ -580,170 +694,155 @@ func initSignedBlockFromProtoPhase0(pb *eth.SignedBeaconBlock) (*SignedBeaconBlo return b, nil } -func initSignedBlockFromProtoAltair(pb *eth.SignedBeaconBlockAltair) (*SignedBeaconBlock, error) { +func initBlockFromProtoPhase0(pb *eth.BeaconBlock) (*BeaconBlock, error) { if pb == nil { return nil, errNilBlock } - block, err := initBlockFromProtoAltair(pb.Block) + body, err := initBlockBodyFromProtoPhase0(pb.Body) if err != nil { return nil, err } - b := &SignedBeaconBlock{ - version: version.Altair, - block: block, - signature: bytesutil.ToBytes96(pb.Signature), + b := &BeaconBlock{ + version: version.Phase0, + slot: pb.Slot, + proposerIndex: pb.ProposerIndex, + parentRoot: bytesutil.ToBytes32(pb.ParentRoot), + stateRoot: bytesutil.ToBytes32(pb.StateRoot), + body: body, } return b, nil } -func initSignedBlockFromProtoBellatrix(pb *eth.SignedBeaconBlockBellatrix) (*SignedBeaconBlock, error) { +func initBlockBodyFromProtoPhase0(pb *eth.BeaconBlockBody) (*BeaconBlockBody, error) { if pb == nil { - return nil, errNilBlock + return nil, errNilBlockBody } - block, err := initBlockFromProtoBellatrix(pb.Block) - if err != nil { - return nil, err - } - b := &SignedBeaconBlock{ - version: version.Bellatrix, - block: block, - signature: bytesutil.ToBytes96(pb.Signature), + b := &BeaconBlockBody{ + version: version.Phase0, + randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), + eth1Data: pb.Eth1Data, + graffiti: bytesutil.ToBytes32(pb.Graffiti), + proposerSlashings: pb.ProposerSlashings, + attesterSlashings: pb.AttesterSlashings, + attestations: pb.Attestations, + deposits: pb.Deposits, + voluntaryExits: pb.VoluntaryExits, } return b, nil } -func initSignedBlockFromProtoCapella(pb *eth.SignedBeaconBlockCapella) (*SignedBeaconBlock, error) { - if pb == nil { - return nil, errNilBlock - } - - block, err := initBlockFromProtoCapella(pb.Block) - if err != nil { - return nil, err - } - b := &SignedBeaconBlock{ - version: version.Capella, - block: block, - signature: bytesutil.ToBytes96(pb.Signature), - } - return b, nil -} +// ---------------------------------------------------------------------------- +// Altair +// ---------------------------------------------------------------------------- -func initSignedBlockFromProtoDeneb(pb *eth.SignedBeaconBlockDeneb) (*SignedBeaconBlock, error) { +func initSignedBlockFromProtoAltair(pb *eth.SignedBeaconBlockAltair) (*SignedBeaconBlock, error) { if pb == nil { return nil, errNilBlock } - block, err := initBlockFromProtoDeneb(pb.Block) + block, err := initBlockFromProtoAltair(pb.Block) if err != nil { return nil, err } b := &SignedBeaconBlock{ - version: version.Deneb, + version: version.Altair, block: block, signature: bytesutil.ToBytes96(pb.Signature), } return b, nil } -func initSignedBlockFromProtoElectra(pb *eth.SignedBeaconBlockElectra) (*SignedBeaconBlock, error) { +func initBlockFromProtoAltair(pb *eth.BeaconBlockAltair) (*BeaconBlock, error) { if pb == nil { return nil, errNilBlock } - block, err := initBlockFromProtoElectra(pb.Block) + body, err := initBlockBodyFromProtoAltair(pb.Body) if err != nil { return nil, err } - b := &SignedBeaconBlock{ - version: version.Electra, - block: block, - signature: bytesutil.ToBytes96(pb.Signature), + b := &BeaconBlock{ + version: version.Altair, + slot: pb.Slot, + proposerIndex: pb.ProposerIndex, + parentRoot: bytesutil.ToBytes32(pb.ParentRoot), + stateRoot: bytesutil.ToBytes32(pb.StateRoot), + body: body, } return b, nil } -func initBlindedSignedBlockFromProtoBellatrix(pb *eth.SignedBlindedBeaconBlockBellatrix) (*SignedBeaconBlock, error) { +func initBlockBodyFromProtoAltair(pb *eth.BeaconBlockBodyAltair) (*BeaconBlockBody, error) { if pb == nil { - return nil, errNilBlock + return nil, errNilBlockBody } - block, err := initBlindedBlockFromProtoBellatrix(pb.Block) - if err != nil { - return nil, err - } - b := &SignedBeaconBlock{ - version: version.Bellatrix, - block: block, - signature: bytesutil.ToBytes96(pb.Signature), + b := &BeaconBlockBody{ + version: version.Altair, + randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), + eth1Data: pb.Eth1Data, + graffiti: bytesutil.ToBytes32(pb.Graffiti), + proposerSlashings: pb.ProposerSlashings, + attesterSlashings: pb.AttesterSlashings, + attestations: pb.Attestations, + deposits: pb.Deposits, + voluntaryExits: pb.VoluntaryExits, + syncAggregate: pb.SyncAggregate, } return b, nil } -func initBlindedSignedBlockFromProtoCapella(pb *eth.SignedBlindedBeaconBlockCapella) (*SignedBeaconBlock, error) { - if pb == nil { - return nil, errNilBlock - } - - block, err := initBlindedBlockFromProtoCapella(pb.Block) - if err != nil { - return nil, err - } - b := &SignedBeaconBlock{ - version: version.Capella, - block: block, - signature: bytesutil.ToBytes96(pb.Signature), - } - return b, nil -} +// ---------------------------------------------------------------------------- +// Bellatrix +// ---------------------------------------------------------------------------- -func initBlindedSignedBlockFromProtoDeneb(pb *eth.SignedBlindedBeaconBlockDeneb) (*SignedBeaconBlock, error) { +func initSignedBlockFromProtoBellatrix(pb *eth.SignedBeaconBlockBellatrix) (*SignedBeaconBlock, error) { if pb == nil { return nil, errNilBlock } - block, err := initBlindedBlockFromProtoDeneb(pb.Message) + block, err := initBlockFromProtoBellatrix(pb.Block) if err != nil { return nil, err } b := &SignedBeaconBlock{ - version: version.Deneb, + version: version.Bellatrix, block: block, signature: bytesutil.ToBytes96(pb.Signature), } return b, nil } -func initBlindedSignedBlockFromProtoElectra(pb *eth.SignedBlindedBeaconBlockElectra) (*SignedBeaconBlock, error) { +func initBlindedSignedBlockFromProtoBellatrix(pb *eth.SignedBlindedBeaconBlockBellatrix) (*SignedBeaconBlock, error) { if pb == nil { return nil, errNilBlock } - block, err := initBlindedBlockFromProtoElectra(pb.Message) + block, err := initBlindedBlockFromProtoBellatrix(pb.Block) if err != nil { return nil, err } b := &SignedBeaconBlock{ - version: version.Electra, + version: version.Bellatrix, block: block, signature: bytesutil.ToBytes96(pb.Signature), } return b, nil } -func initBlockFromProtoPhase0(pb *eth.BeaconBlock) (*BeaconBlock, error) { +func initBlockFromProtoBellatrix(pb *eth.BeaconBlockBellatrix) (*BeaconBlock, error) { if pb == nil { return nil, errNilBlock } - body, err := initBlockBodyFromProtoPhase0(pb.Body) + body, err := initBlockBodyFromProtoBellatrix(pb.Body) if err != nil { return nil, err } b := &BeaconBlock{ - version: version.Phase0, + version: version.Bellatrix, slot: pb.Slot, proposerIndex: pb.ProposerIndex, parentRoot: bytesutil.ToBytes32(pb.ParentRoot), @@ -753,17 +852,17 @@ func initBlockFromProtoPhase0(pb *eth.BeaconBlock) (*BeaconBlock, error) { return b, nil } -func initBlockFromProtoAltair(pb *eth.BeaconBlockAltair) (*BeaconBlock, error) { +func initBlindedBlockFromProtoBellatrix(pb *eth.BlindedBeaconBlockBellatrix) (*BeaconBlock, error) { if pb == nil { return nil, errNilBlock } - body, err := initBlockBodyFromProtoAltair(pb.Body) + body, err := initBlindedBlockBodyFromProtoBellatrix(pb.Body) if err != nil { return nil, err } b := &BeaconBlock{ - version: version.Altair, + version: version.Bellatrix, slot: pb.Slot, proposerIndex: pb.ProposerIndex, parentRoot: bytesutil.ToBytes32(pb.ParentRoot), @@ -773,97 +872,107 @@ func initBlockFromProtoAltair(pb *eth.BeaconBlockAltair) (*BeaconBlock, error) { return b, nil } -func initBlockFromProtoBellatrix(pb *eth.BeaconBlockBellatrix) (*BeaconBlock, error) { +func initBlockBodyFromProtoBellatrix(pb *eth.BeaconBlockBodyBellatrix) (*BeaconBlockBody, error) { if pb == nil { - return nil, errNilBlock + return nil, errNilBlockBody } - body, err := initBlockBodyFromProtoBellatrix(pb.Body) - if err != nil { + p, err := WrappedExecutionPayload(pb.ExecutionPayload) + // We allow the payload to be nil + if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { return nil, err } - b := &BeaconBlock{ - version: version.Bellatrix, - slot: pb.Slot, - proposerIndex: pb.ProposerIndex, - parentRoot: bytesutil.ToBytes32(pb.ParentRoot), - stateRoot: bytesutil.ToBytes32(pb.StateRoot), - body: body, - } - return b, nil -} - -func initBlindedBlockFromProtoBellatrix(pb *eth.BlindedBeaconBlockBellatrix) (*BeaconBlock, error) { - if pb == nil { - return nil, errNilBlock + b := &BeaconBlockBody{ + version: version.Bellatrix, + randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), + eth1Data: pb.Eth1Data, + graffiti: bytesutil.ToBytes32(pb.Graffiti), + proposerSlashings: pb.ProposerSlashings, + attesterSlashings: pb.AttesterSlashings, + attestations: pb.Attestations, + deposits: pb.Deposits, + voluntaryExits: pb.VoluntaryExits, + syncAggregate: pb.SyncAggregate, + executionPayload: p, + } + return b, nil +} + +func initBlindedBlockBodyFromProtoBellatrix(pb *eth.BlindedBeaconBlockBodyBellatrix) (*BeaconBlockBody, error) { + if pb == nil { + return nil, errNilBlockBody } - body, err := initBlindedBlockBodyFromProtoBellatrix(pb.Body) - if err != nil { + ph, err := WrappedExecutionPayloadHeader(pb.ExecutionPayloadHeader) + // We allow the payload to be nil + if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { return nil, err } - b := &BeaconBlock{ - version: version.Bellatrix, - slot: pb.Slot, - proposerIndex: pb.ProposerIndex, - parentRoot: bytesutil.ToBytes32(pb.ParentRoot), - stateRoot: bytesutil.ToBytes32(pb.StateRoot), - body: body, + b := &BeaconBlockBody{ + version: version.Bellatrix, + randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), + eth1Data: pb.Eth1Data, + graffiti: bytesutil.ToBytes32(pb.Graffiti), + proposerSlashings: pb.ProposerSlashings, + attesterSlashings: pb.AttesterSlashings, + attestations: pb.Attestations, + deposits: pb.Deposits, + voluntaryExits: pb.VoluntaryExits, + syncAggregate: pb.SyncAggregate, + executionPayloadHeader: ph, } return b, nil } -func initBlockFromProtoCapella(pb *eth.BeaconBlockCapella) (*BeaconBlock, error) { +// ---------------------------------------------------------------------------- +// Capella +// ---------------------------------------------------------------------------- + +func initSignedBlockFromProtoCapella(pb *eth.SignedBeaconBlockCapella) (*SignedBeaconBlock, error) { if pb == nil { return nil, errNilBlock } - body, err := initBlockBodyFromProtoCapella(pb.Body) + block, err := initBlockFromProtoCapella(pb.Block) if err != nil { return nil, err } - b := &BeaconBlock{ - version: version.Capella, - slot: pb.Slot, - proposerIndex: pb.ProposerIndex, - parentRoot: bytesutil.ToBytes32(pb.ParentRoot), - stateRoot: bytesutil.ToBytes32(pb.StateRoot), - body: body, + b := &SignedBeaconBlock{ + version: version.Capella, + block: block, + signature: bytesutil.ToBytes96(pb.Signature), } return b, nil } -func initBlockFromProtoDeneb(pb *eth.BeaconBlockDeneb) (*BeaconBlock, error) { +func initBlindedSignedBlockFromProtoCapella(pb *eth.SignedBlindedBeaconBlockCapella) (*SignedBeaconBlock, error) { if pb == nil { return nil, errNilBlock } - body, err := initBlockBodyFromProtoDeneb(pb.Body) + block, err := initBlindedBlockFromProtoCapella(pb.Block) if err != nil { return nil, err } - b := &BeaconBlock{ - version: version.Deneb, - slot: pb.Slot, - proposerIndex: pb.ProposerIndex, - parentRoot: bytesutil.ToBytes32(pb.ParentRoot), - stateRoot: bytesutil.ToBytes32(pb.StateRoot), - body: body, + b := &SignedBeaconBlock{ + version: version.Capella, + block: block, + signature: bytesutil.ToBytes96(pb.Signature), } return b, nil } -func initBlockFromProtoElectra(pb *eth.BeaconBlockElectra) (*BeaconBlock, error) { +func initBlockFromProtoCapella(pb *eth.BeaconBlockCapella) (*BeaconBlock, error) { if pb == nil { return nil, errNilBlock } - body, err := initBlockBodyFromProtoElectra(pb.Body) + body, err := initBlockBodyFromProtoCapella(pb.Body) if err != nil { return nil, err } b := &BeaconBlock{ - version: version.Electra, + version: version.Capella, slot: pb.Slot, proposerIndex: pb.ProposerIndex, parentRoot: bytesutil.ToBytes32(pb.ParentRoot), @@ -893,149 +1002,150 @@ func initBlindedBlockFromProtoCapella(pb *eth.BlindedBeaconBlockCapella) (*Beaco return b, nil } -func initBlindedBlockFromProtoDeneb(pb *eth.BlindedBeaconBlockDeneb) (*BeaconBlock, error) { +func initBlockBodyFromProtoCapella(pb *eth.BeaconBlockBodyCapella) (*BeaconBlockBody, error) { if pb == nil { - return nil, errNilBlock + return nil, errNilBlockBody } - body, err := initBlindedBlockBodyFromProtoDeneb(pb.Body) - if err != nil { + p, err := WrappedExecutionPayloadCapella(pb.ExecutionPayload) + // We allow the payload to be nil + if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { return nil, err } - b := &BeaconBlock{ - version: version.Deneb, - slot: pb.Slot, - proposerIndex: pb.ProposerIndex, - parentRoot: bytesutil.ToBytes32(pb.ParentRoot), - stateRoot: bytesutil.ToBytes32(pb.StateRoot), - body: body, + b := &BeaconBlockBody{ + version: version.Capella, + randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), + eth1Data: pb.Eth1Data, + graffiti: bytesutil.ToBytes32(pb.Graffiti), + proposerSlashings: pb.ProposerSlashings, + attesterSlashings: pb.AttesterSlashings, + attestations: pb.Attestations, + deposits: pb.Deposits, + voluntaryExits: pb.VoluntaryExits, + syncAggregate: pb.SyncAggregate, + executionPayload: p, + blsToExecutionChanges: pb.BlsToExecutionChanges, } return b, nil } -func initBlindedBlockFromProtoElectra(pb *eth.BlindedBeaconBlockElectra) (*BeaconBlock, error) { +func initBlindedBlockBodyFromProtoCapella(pb *eth.BlindedBeaconBlockBodyCapella) (*BeaconBlockBody, error) { if pb == nil { - return nil, errNilBlock + return nil, errNilBlockBody } - body, err := initBlindedBlockBodyFromProtoElectra(pb.Body) - if err != nil { + ph, err := WrappedExecutionPayloadHeaderCapella(pb.ExecutionPayloadHeader) + // We allow the payload to be nil + if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { return nil, err } - b := &BeaconBlock{ - version: version.Electra, - slot: pb.Slot, - proposerIndex: pb.ProposerIndex, - parentRoot: bytesutil.ToBytes32(pb.ParentRoot), - stateRoot: bytesutil.ToBytes32(pb.StateRoot), - body: body, + b := &BeaconBlockBody{ + version: version.Capella, + randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), + eth1Data: pb.Eth1Data, + graffiti: bytesutil.ToBytes32(pb.Graffiti), + proposerSlashings: pb.ProposerSlashings, + attesterSlashings: pb.AttesterSlashings, + attestations: pb.Attestations, + deposits: pb.Deposits, + voluntaryExits: pb.VoluntaryExits, + syncAggregate: pb.SyncAggregate, + executionPayloadHeader: ph, + blsToExecutionChanges: pb.BlsToExecutionChanges, } return b, nil } -func initBlockBodyFromProtoPhase0(pb *eth.BeaconBlockBody) (*BeaconBlockBody, error) { +// ---------------------------------------------------------------------------- +// Deneb +// ---------------------------------------------------------------------------- + +func initSignedBlockFromProtoDeneb(pb *eth.SignedBeaconBlockDeneb) (*SignedBeaconBlock, error) { if pb == nil { - return nil, errNilBlockBody + return nil, errNilBlock } - b := &BeaconBlockBody{ - version: version.Phase0, - randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), - eth1Data: pb.Eth1Data, - graffiti: bytesutil.ToBytes32(pb.Graffiti), - proposerSlashings: pb.ProposerSlashings, - attesterSlashings: pb.AttesterSlashings, - attestations: pb.Attestations, - deposits: pb.Deposits, - voluntaryExits: pb.VoluntaryExits, + block, err := initBlockFromProtoDeneb(pb.Block) + if err != nil { + return nil, err + } + b := &SignedBeaconBlock{ + version: version.Deneb, + block: block, + signature: bytesutil.ToBytes96(pb.Signature), } return b, nil } -func initBlockBodyFromProtoAltair(pb *eth.BeaconBlockBodyAltair) (*BeaconBlockBody, error) { +func initBlindedSignedBlockFromProtoDeneb(pb *eth.SignedBlindedBeaconBlockDeneb) (*SignedBeaconBlock, error) { if pb == nil { - return nil, errNilBlockBody + return nil, errNilBlock } - b := &BeaconBlockBody{ - version: version.Altair, - randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), - eth1Data: pb.Eth1Data, - graffiti: bytesutil.ToBytes32(pb.Graffiti), - proposerSlashings: pb.ProposerSlashings, - attesterSlashings: pb.AttesterSlashings, - attestations: pb.Attestations, - deposits: pb.Deposits, - voluntaryExits: pb.VoluntaryExits, - syncAggregate: pb.SyncAggregate, + block, err := initBlindedBlockFromProtoDeneb(pb.Message) + if err != nil { + return nil, err + } + b := &SignedBeaconBlock{ + version: version.Deneb, + block: block, + signature: bytesutil.ToBytes96(pb.Signature), } return b, nil } -func initBlockBodyFromProtoBellatrix(pb *eth.BeaconBlockBodyBellatrix) (*BeaconBlockBody, error) { +func initBlockFromProtoDeneb(pb *eth.BeaconBlockDeneb) (*BeaconBlock, error) { if pb == nil { - return nil, errNilBlockBody + return nil, errNilBlock } - p, err := WrappedExecutionPayload(pb.ExecutionPayload) - // We allow the payload to be nil - if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { + body, err := initBlockBodyFromProtoDeneb(pb.Body) + if err != nil { return nil, err } - b := &BeaconBlockBody{ - version: version.Bellatrix, - randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), - eth1Data: pb.Eth1Data, - graffiti: bytesutil.ToBytes32(pb.Graffiti), - proposerSlashings: pb.ProposerSlashings, - attesterSlashings: pb.AttesterSlashings, - attestations: pb.Attestations, - deposits: pb.Deposits, - voluntaryExits: pb.VoluntaryExits, - syncAggregate: pb.SyncAggregate, - executionPayload: p, + b := &BeaconBlock{ + version: version.Deneb, + slot: pb.Slot, + proposerIndex: pb.ProposerIndex, + parentRoot: bytesutil.ToBytes32(pb.ParentRoot), + stateRoot: bytesutil.ToBytes32(pb.StateRoot), + body: body, } return b, nil } -func initBlindedBlockBodyFromProtoBellatrix(pb *eth.BlindedBeaconBlockBodyBellatrix) (*BeaconBlockBody, error) { +func initBlindedBlockFromProtoDeneb(pb *eth.BlindedBeaconBlockDeneb) (*BeaconBlock, error) { if pb == nil { - return nil, errNilBlockBody + return nil, errNilBlock } - ph, err := WrappedExecutionPayloadHeader(pb.ExecutionPayloadHeader) - // We allow the payload to be nil - if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { + body, err := initBlindedBlockBodyFromProtoDeneb(pb.Body) + if err != nil { return nil, err } - b := &BeaconBlockBody{ - version: version.Bellatrix, - randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), - eth1Data: pb.Eth1Data, - graffiti: bytesutil.ToBytes32(pb.Graffiti), - proposerSlashings: pb.ProposerSlashings, - attesterSlashings: pb.AttesterSlashings, - attestations: pb.Attestations, - deposits: pb.Deposits, - voluntaryExits: pb.VoluntaryExits, - syncAggregate: pb.SyncAggregate, - executionPayloadHeader: ph, + b := &BeaconBlock{ + version: version.Deneb, + slot: pb.Slot, + proposerIndex: pb.ProposerIndex, + parentRoot: bytesutil.ToBytes32(pb.ParentRoot), + stateRoot: bytesutil.ToBytes32(pb.StateRoot), + body: body, } return b, nil } -func initBlockBodyFromProtoCapella(pb *eth.BeaconBlockBodyCapella) (*BeaconBlockBody, error) { +func initBlockBodyFromProtoDeneb(pb *eth.BeaconBlockBodyDeneb) (*BeaconBlockBody, error) { if pb == nil { return nil, errNilBlockBody } - p, err := WrappedExecutionPayloadCapella(pb.ExecutionPayload) + p, err := WrappedExecutionPayloadDeneb(pb.ExecutionPayload) // We allow the payload to be nil if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { return nil, err } b := &BeaconBlockBody{ - version: version.Capella, + version: version.Deneb, randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), eth1Data: pb.Eth1Data, graffiti: bytesutil.ToBytes32(pb.Graffiti), @@ -1047,22 +1157,23 @@ func initBlockBodyFromProtoCapella(pb *eth.BeaconBlockBodyCapella) (*BeaconBlock syncAggregate: pb.SyncAggregate, executionPayload: p, blsToExecutionChanges: pb.BlsToExecutionChanges, + blobKzgCommitments: pb.BlobKzgCommitments, } return b, nil } -func initBlindedBlockBodyFromProtoCapella(pb *eth.BlindedBeaconBlockBodyCapella) (*BeaconBlockBody, error) { +func initBlindedBlockBodyFromProtoDeneb(pb *eth.BlindedBeaconBlockBodyDeneb) (*BeaconBlockBody, error) { if pb == nil { return nil, errNilBlockBody } - ph, err := WrappedExecutionPayloadHeaderCapella(pb.ExecutionPayloadHeader) + ph, err := WrappedExecutionPayloadHeaderDeneb(pb.ExecutionPayloadHeader) // We allow the payload to be nil if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { return nil, err } b := &BeaconBlockBody{ - version: version.Capella, + version: version.Deneb, randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), eth1Data: pb.Eth1Data, graffiti: bytesutil.ToBytes32(pb.Graffiti), @@ -1074,11 +1185,90 @@ func initBlindedBlockBodyFromProtoCapella(pb *eth.BlindedBeaconBlockBodyCapella) syncAggregate: pb.SyncAggregate, executionPayloadHeader: ph, blsToExecutionChanges: pb.BlsToExecutionChanges, + blobKzgCommitments: pb.BlobKzgCommitments, } return b, nil } -func initBlockBodyFromProtoDeneb(pb *eth.BeaconBlockBodyDeneb) (*BeaconBlockBody, error) { +// ---------------------------------------------------------------------------- +// Electra +// ---------------------------------------------------------------------------- + +func initSignedBlockFromProtoElectra(pb *eth.SignedBeaconBlockElectra) (*SignedBeaconBlock, error) { + if pb == nil { + return nil, errNilBlock + } + + block, err := initBlockFromProtoElectra(pb.Block) + if err != nil { + return nil, err + } + b := &SignedBeaconBlock{ + version: version.Electra, + block: block, + signature: bytesutil.ToBytes96(pb.Signature), + } + return b, nil +} + +func initBlindedSignedBlockFromProtoElectra(pb *eth.SignedBlindedBeaconBlockElectra) (*SignedBeaconBlock, error) { + if pb == nil { + return nil, errNilBlock + } + + block, err := initBlindedBlockFromProtoElectra(pb.Message) + if err != nil { + return nil, err + } + b := &SignedBeaconBlock{ + version: version.Electra, + block: block, + signature: bytesutil.ToBytes96(pb.Signature), + } + return b, nil +} + +func initBlockFromProtoElectra(pb *eth.BeaconBlockElectra) (*BeaconBlock, error) { + if pb == nil { + return nil, errNilBlock + } + + body, err := initBlockBodyFromProtoElectra(pb.Body) + if err != nil { + return nil, err + } + b := &BeaconBlock{ + version: version.Electra, + slot: pb.Slot, + proposerIndex: pb.ProposerIndex, + parentRoot: bytesutil.ToBytes32(pb.ParentRoot), + stateRoot: bytesutil.ToBytes32(pb.StateRoot), + body: body, + } + return b, nil +} + +func initBlindedBlockFromProtoElectra(pb *eth.BlindedBeaconBlockElectra) (*BeaconBlock, error) { + if pb == nil { + return nil, errNilBlock + } + + body, err := initBlindedBlockBodyFromProtoElectra(pb.Body) + if err != nil { + return nil, err + } + b := &BeaconBlock{ + version: version.Electra, + slot: pb.Slot, + proposerIndex: pb.ProposerIndex, + parentRoot: bytesutil.ToBytes32(pb.ParentRoot), + stateRoot: bytesutil.ToBytes32(pb.StateRoot), + body: body, + } + return b, nil +} + +func initBlockBodyFromProtoElectra(pb *eth.BeaconBlockBodyElectra) (*BeaconBlockBody, error) { if pb == nil { return nil, errNilBlockBody } @@ -1088,25 +1278,30 @@ func initBlockBodyFromProtoDeneb(pb *eth.BeaconBlockBodyDeneb) (*BeaconBlockBody if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { return nil, err } + er := pb.ExecutionRequests + if er == nil { + er = &enginev1.ExecutionRequests{} + } b := &BeaconBlockBody{ - version: version.Deneb, - randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), - eth1Data: pb.Eth1Data, - graffiti: bytesutil.ToBytes32(pb.Graffiti), - proposerSlashings: pb.ProposerSlashings, - attesterSlashings: pb.AttesterSlashings, - attestations: pb.Attestations, - deposits: pb.Deposits, - voluntaryExits: pb.VoluntaryExits, - syncAggregate: pb.SyncAggregate, - executionPayload: p, - blsToExecutionChanges: pb.BlsToExecutionChanges, - blobKzgCommitments: pb.BlobKzgCommitments, + version: version.Electra, + randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), + eth1Data: pb.Eth1Data, + graffiti: bytesutil.ToBytes32(pb.Graffiti), + proposerSlashings: pb.ProposerSlashings, + attesterSlashingsElectra: pb.AttesterSlashings, + attestationsElectra: pb.Attestations, + deposits: pb.Deposits, + voluntaryExits: pb.VoluntaryExits, + syncAggregate: pb.SyncAggregate, + executionPayload: p, + blsToExecutionChanges: pb.BlsToExecutionChanges, + blobKzgCommitments: pb.BlobKzgCommitments, + executionRequests: er, } return b, nil } -func initBlindedBlockBodyFromProtoDeneb(pb *eth.BlindedBeaconBlockBodyDeneb) (*BeaconBlockBody, error) { +func initBlindedBlockBodyFromProtoElectra(pb *eth.BlindedBeaconBlockBodyElectra) (*BeaconBlockBody, error) { if pb == nil { return nil, errNilBlockBody } @@ -1116,30 +1311,113 @@ func initBlindedBlockBodyFromProtoDeneb(pb *eth.BlindedBeaconBlockBodyDeneb) (*B if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { return nil, err } + er := pb.ExecutionRequests + if er == nil { + er = &enginev1.ExecutionRequests{} + } b := &BeaconBlockBody{ - version: version.Deneb, - randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), - eth1Data: pb.Eth1Data, - graffiti: bytesutil.ToBytes32(pb.Graffiti), - proposerSlashings: pb.ProposerSlashings, - attesterSlashings: pb.AttesterSlashings, - attestations: pb.Attestations, - deposits: pb.Deposits, - voluntaryExits: pb.VoluntaryExits, - syncAggregate: pb.SyncAggregate, - executionPayloadHeader: ph, - blsToExecutionChanges: pb.BlsToExecutionChanges, - blobKzgCommitments: pb.BlobKzgCommitments, + version: version.Electra, + randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), + eth1Data: pb.Eth1Data, + graffiti: bytesutil.ToBytes32(pb.Graffiti), + proposerSlashings: pb.ProposerSlashings, + attesterSlashingsElectra: pb.AttesterSlashings, + attestationsElectra: pb.Attestations, + deposits: pb.Deposits, + voluntaryExits: pb.VoluntaryExits, + syncAggregate: pb.SyncAggregate, + executionPayloadHeader: ph, + blsToExecutionChanges: pb.BlsToExecutionChanges, + blobKzgCommitments: pb.BlobKzgCommitments, + executionRequests: er, } return b, nil } -func initBlockBodyFromProtoElectra(pb *eth.BeaconBlockBodyElectra) (*BeaconBlockBody, error) { +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- + +func initSignedBlockFromProtoFulu(pb *eth.SignedBeaconBlockFulu) (*SignedBeaconBlock, error) { + if pb == nil { + return nil, errNilBlock + } + + block, err := initBlockFromProtoFulu(pb.Block) + if err != nil { + return nil, err + } + b := &SignedBeaconBlock{ + version: version.Fulu, + block: block, + signature: bytesutil.ToBytes96(pb.Signature), + } + return b, nil +} + +func initBlindedSignedBlockFromProtoFulu(pb *eth.SignedBlindedBeaconBlockFulu) (*SignedBeaconBlock, error) { + if pb == nil { + return nil, errNilBlock + } + + block, err := initBlindedBlockFromProtoFulu(pb.Message) + if err != nil { + return nil, err + } + b := &SignedBeaconBlock{ + version: version.Fulu, + block: block, + signature: bytesutil.ToBytes96(pb.Signature), + } + return b, nil +} + +func initBlockFromProtoFulu(pb *eth.BeaconBlockFulu) (*BeaconBlock, error) { + if pb == nil { + return nil, errNilBlock + } + + body, err := initBlockBodyFromProtoFulu(pb.Body) + if err != nil { + return nil, err + } + b := &BeaconBlock{ + version: version.Fulu, + slot: pb.Slot, + proposerIndex: pb.ProposerIndex, + parentRoot: bytesutil.ToBytes32(pb.ParentRoot), + stateRoot: bytesutil.ToBytes32(pb.StateRoot), + body: body, + } + return b, nil +} + +func initBlindedBlockFromProtoFulu(pb *eth.BlindedBeaconBlockFulu) (*BeaconBlock, error) { + if pb == nil { + return nil, errNilBlock + } + + body, err := initBlindedBlockBodyFromProtoFulu(pb.Body) + if err != nil { + return nil, err + } + b := &BeaconBlock{ + version: version.Fulu, + slot: pb.Slot, + proposerIndex: pb.ProposerIndex, + parentRoot: bytesutil.ToBytes32(pb.ParentRoot), + stateRoot: bytesutil.ToBytes32(pb.StateRoot), + body: body, + } + return b, nil +} + +func initBlockBodyFromProtoFulu(pb *eth.BeaconBlockBodyFulu) (*BeaconBlockBody, error) { if pb == nil { return nil, errNilBlockBody } - p, err := WrappedExecutionPayloadElectra(pb.ExecutionPayload) + p, err := WrappedExecutionPayloadDeneb(pb.ExecutionPayload) // We allow the payload to be nil if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { return nil, err @@ -1149,7 +1427,7 @@ func initBlockBodyFromProtoElectra(pb *eth.BeaconBlockBodyElectra) (*BeaconBlock er = &enginev1.ExecutionRequests{} } b := &BeaconBlockBody{ - version: version.Electra, + version: version.Fulu, randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), eth1Data: pb.Eth1Data, graffiti: bytesutil.ToBytes32(pb.Graffiti), @@ -1167,12 +1445,12 @@ func initBlockBodyFromProtoElectra(pb *eth.BeaconBlockBodyElectra) (*BeaconBlock return b, nil } -func initBlindedBlockBodyFromProtoElectra(pb *eth.BlindedBeaconBlockBodyElectra) (*BeaconBlockBody, error) { +func initBlindedBlockBodyFromProtoFulu(pb *eth.BlindedBeaconBlockBodyFulu) (*BeaconBlockBody, error) { if pb == nil { return nil, errNilBlockBody } - ph, err := WrappedExecutionPayloadHeaderElectra(pb.ExecutionPayloadHeader) + ph, err := WrappedExecutionPayloadHeaderDeneb(pb.ExecutionPayloadHeader) // We allow the payload to be nil if err != nil && !errors.Is(err, consensus_types.ErrNilObjectWrapped) { return nil, err @@ -1182,7 +1460,7 @@ func initBlindedBlockBodyFromProtoElectra(pb *eth.BlindedBeaconBlockBodyElectra) er = &enginev1.ExecutionRequests{} } b := &BeaconBlockBody{ - version: version.Electra, + version: version.Fulu, randaoReveal: bytesutil.ToBytes96(pb.RandaoReveal), eth1Data: pb.Eth1Data, graffiti: bytesutil.ToBytes32(pb.Graffiti), diff --git a/consensus-types/blocks/testing/factory.go b/consensus-types/blocks/testing/factory.go index 79599b84134e..c8af23911be6 100644 --- a/consensus-types/blocks/testing/factory.go +++ b/consensus-types/blocks/testing/factory.go @@ -32,7 +32,10 @@ func NewSignedBeaconBlockFromGeneric(gb *eth.GenericSignedBeaconBlock) (interfac return blocks.NewSignedBeaconBlock(bb.BlindedDeneb) case *eth.GenericSignedBeaconBlock_Electra: return blocks.NewSignedBeaconBlock(bb.Electra.Block) - // Generic Signed Beacon Block Deneb can't be used here as it is not a block, but block content with blobs + // Generic Signed Beacon Block Deneb can't be used here as it is not a block, but block content with blobs + case *eth.GenericSignedBeaconBlock_Fulu: + return blocks.NewSignedBeaconBlock(bb.Fulu.Block) + // Generic Signed Beacon Block Deneb can't be used here as it is not a block, but block content with blobs default: return nil, errors.Wrapf(blocks.ErrUnsupportedSignedBeaconBlock, "unable to create block from type %T", gb) } diff --git a/consensus-types/wrapper/metadata.go b/consensus-types/wrapper/metadata.go index 361dd79c823f..3fb22d201061 100644 --- a/consensus-types/wrapper/metadata.go +++ b/consensus-types/wrapper/metadata.go @@ -287,5 +287,5 @@ func (m MetadataV2) MetadataObjV2() *pb.MetaDataV2 { // Version returns the fork version of the underlying object. func (MetadataV2) Version() int { - return version.Electra + return version.Fulu } diff --git a/deps.bzl b/deps.bzl index 3ab08a229280..3a52492fb1a7 100644 --- a/deps.bzl +++ b/deps.bzl @@ -1950,8 +1950,8 @@ def prysm_deps(): name = "com_github_libp2p_go_libp2p_pubsub", build_file_proto_mode = "disable_global", importpath = "github.com/libp2p/go-libp2p-pubsub", - sum = "h1:PENNZjSfk8KYxANRlpipdS7+BfLmOl3L2E/6vSNjbdI=", - version = "v0.12.0", + sum = "h1:Z1fzkKuRAd+U1oxbTbWUtTTzAWaX21jqoLxVIStzp+Y=", + version = "v0.12.1-0.20241230202526-bf5b58384331", ) go_repository( name = "com_github_libp2p_go_libp2p_testing", diff --git a/encoding/ssz/detect/configfork.go b/encoding/ssz/detect/configfork.go index 327b68198cd4..a88d33a70fd8 100644 --- a/encoding/ssz/detect/configfork.go +++ b/encoding/ssz/detect/configfork.go @@ -88,6 +88,8 @@ func FromForkVersion(cv [fieldparams.VersionLength]byte) (*VersionedUnmarshaler, fork = version.Deneb case bytesutil.ToBytes4(cfg.ElectraForkVersion): fork = version.Electra + case bytesutil.ToBytes4(cfg.FuluForkVersion): + fork = version.Fulu default: return nil, errors.Wrapf(ErrForkNotFound, "version=%#x", cv) } @@ -163,6 +165,16 @@ func (cf *VersionedUnmarshaler) UnmarshalBeaconState(marshaled []byte) (s state. if err != nil { return nil, errors.Wrapf(err, "failed to init state trie from state, detected fork=%s", forkName) } + case version.Fulu: + st := ðpb.BeaconStateFulu{} + err = st.UnmarshalSSZ(marshaled) + if err != nil { + return nil, errors.Wrapf(err, "failed to unmarshal state, detected fork=%s", forkName) + } + s, err = state_native.InitializeFromProtoUnsafeFulu(st) + if err != nil { + return nil, errors.Wrapf(err, "failed to init state trie from state, detected fork=%s", forkName) + } default: return nil, fmt.Errorf("unable to initialize BeaconState for fork version=%s", forkName) } @@ -213,6 +225,8 @@ func (cf *VersionedUnmarshaler) UnmarshalBeaconBlock(marshaled []byte) (interfac blk = ðpb.SignedBeaconBlockDeneb{} case version.Electra: blk = ðpb.SignedBeaconBlockElectra{} + case version.Fulu: + blk = ðpb.SignedBeaconBlockFulu{} default: forkName := version.String(cf.Fork) return nil, fmt.Errorf("unable to initialize ReadOnlyBeaconBlock for fork version=%s at slot=%d", forkName, slot) @@ -250,6 +264,8 @@ func (cf *VersionedUnmarshaler) UnmarshalBlindedBeaconBlock(marshaled []byte) (i blk = ðpb.SignedBlindedBeaconBlockDeneb{} case version.Electra: blk = ðpb.SignedBlindedBeaconBlockElectra{} + case version.Fulu: + blk = ðpb.SignedBlindedBeaconBlockFulu{} default: forkName := version.String(cf.Fork) return nil, fmt.Errorf("unable to initialize ReadOnlyBeaconBlock for fork version=%s at slot=%d", forkName, slot) diff --git a/encoding/ssz/detect/configfork_test.go b/encoding/ssz/detect/configfork_test.go index d417eeeb1fd9..de7bdcac1375 100644 --- a/encoding/ssz/detect/configfork_test.go +++ b/encoding/ssz/detect/configfork_test.go @@ -46,8 +46,8 @@ func TestSlotFromBlock(t *testing.T) { } func TestByState(t *testing.T) { - undo := util.HackElectraMaxuint(t) - defer undo() + defer util.HackForksMaxuint(t, []int{version.Electra, version.Fulu})() + bc := params.BeaconConfig() altairSlot, err := slots.EpochStart(bc.AltairForkEpoch) require.NoError(t, err) @@ -59,6 +59,8 @@ func TestByState(t *testing.T) { require.NoError(t, err) electraSlot, err := slots.EpochStart(bc.ElectraForkEpoch) require.NoError(t, err) + fuluSlot, err := slots.EpochStart(bc.FuluForkEpoch) + require.NoError(t, err) cases := []struct { name string version int @@ -101,6 +103,12 @@ func TestByState(t *testing.T) { slot: electraSlot, forkversion: bytesutil.ToBytes4(bc.ElectraForkVersion), }, + { + name: "fulu", + version: version.Fulu, + slot: fuluSlot, + forkversion: bytesutil.ToBytes4(bc.FuluForkVersion), + }, } for _, c := range cases { st, err := stateForVersion(c.version) @@ -135,6 +143,8 @@ func stateForVersion(v int) (state.BeaconState, error) { return util.NewBeaconStateDeneb() case version.Electra: return util.NewBeaconStateElectra() + case version.Fulu: + return util.NewBeaconStateFulu() default: return nil, fmt.Errorf("unrecognized version %d", v) } @@ -142,8 +152,8 @@ func stateForVersion(v int) (state.BeaconState, error) { func TestUnmarshalState(t *testing.T) { ctx := context.Background() - undo := util.HackElectraMaxuint(t) - defer undo() + defer util.HackForksMaxuint(t, []int{version.Electra, version.Fulu})() + bc := params.BeaconConfig() altairSlot, err := slots.EpochStart(bc.AltairForkEpoch) require.NoError(t, err) @@ -155,6 +165,8 @@ func TestUnmarshalState(t *testing.T) { require.NoError(t, err) electraSlot, err := slots.EpochStart(bc.ElectraForkEpoch) require.NoError(t, err) + fuluSlot, err := slots.EpochStart(bc.FuluForkEpoch) + require.NoError(t, err) cases := []struct { name string version int @@ -197,6 +209,12 @@ func TestUnmarshalState(t *testing.T) { slot: electraSlot, forkversion: bytesutil.ToBytes4(bc.ElectraForkVersion), }, + { + name: "fulu", + version: version.Fulu, + slot: fuluSlot, + forkversion: bytesutil.ToBytes4(bc.FuluForkVersion), + }, } for _, c := range cases { st, err := stateForVersion(c.version) @@ -222,8 +240,8 @@ func TestUnmarshalState(t *testing.T) { } func TestDetectAndUnmarshalBlock(t *testing.T) { - undo := util.HackElectraMaxuint(t) - defer undo() + defer util.HackForksMaxuint(t, []int{version.Electra, version.Fulu})() + altairS, err := slots.EpochStart(params.BeaconConfig().AltairForkEpoch) require.NoError(t, err) bellaS, err := slots.EpochStart(params.BeaconConfig().BellatrixForkEpoch) @@ -234,6 +252,8 @@ func TestDetectAndUnmarshalBlock(t *testing.T) { require.NoError(t, err) electraS, err := slots.EpochStart(params.BeaconConfig().ElectraForkEpoch) require.NoError(t, err) + fuluS, err := slots.EpochStart(params.BeaconConfig().FuluForkEpoch) + require.NoError(t, err) cases := []struct { b func(*testing.T, primitives.Slot) interfaces.ReadOnlySignedBeaconBlock name string @@ -284,6 +304,11 @@ func TestDetectAndUnmarshalBlock(t *testing.T) { b: signedTestBlockElectra, slot: electraS, }, + { + name: "first slot of fulu", + b: signedTestBlockFulu, + slot: fuluS, + }, { name: "bellatrix block in altair slot", b: signedTestBlockBellatrix, @@ -320,14 +345,15 @@ func TestDetectAndUnmarshalBlock(t *testing.T) { } func TestUnmarshalBlock(t *testing.T) { - undo := util.HackElectraMaxuint(t) - defer undo() + defer util.HackForksMaxuint(t, []int{version.Electra, version.Fulu})() + genv := bytesutil.ToBytes4(params.BeaconConfig().GenesisForkVersion) altairv := bytesutil.ToBytes4(params.BeaconConfig().AltairForkVersion) bellav := bytesutil.ToBytes4(params.BeaconConfig().BellatrixForkVersion) capellaV := bytesutil.ToBytes4(params.BeaconConfig().CapellaForkVersion) denebV := bytesutil.ToBytes4(params.BeaconConfig().DenebForkVersion) electraV := bytesutil.ToBytes4(params.BeaconConfig().ElectraForkVersion) + fuluV := bytesutil.ToBytes4(params.BeaconConfig().FuluForkVersion) altairS, err := slots.EpochStart(params.BeaconConfig().AltairForkEpoch) require.NoError(t, err) bellaS, err := slots.EpochStart(params.BeaconConfig().BellatrixForkEpoch) @@ -338,6 +364,8 @@ func TestUnmarshalBlock(t *testing.T) { require.NoError(t, err) electraS, err := slots.EpochStart(params.BeaconConfig().ElectraForkEpoch) require.NoError(t, err) + fuluS, err := slots.EpochStart(params.BeaconConfig().FuluForkEpoch) + require.NoError(t, err) cases := []struct { b func(*testing.T, primitives.Slot) interfaces.ReadOnlySignedBeaconBlock name string @@ -398,6 +426,12 @@ func TestUnmarshalBlock(t *testing.T) { version: electraV, slot: electraS, }, + { + name: "first slot of fulu", + b: signedTestBlockFulu, + version: fuluV, + slot: fuluS, + }, { name: "bellatrix block in altair slot", b: signedTestBlockBellatrix, @@ -442,14 +476,15 @@ func TestUnmarshalBlock(t *testing.T) { } func TestUnmarshalBlindedBlock(t *testing.T) { - undo := util.HackElectraMaxuint(t) - defer undo() + defer util.HackForksMaxuint(t, []int{version.Electra, version.Fulu})() + genv := bytesutil.ToBytes4(params.BeaconConfig().GenesisForkVersion) altairv := bytesutil.ToBytes4(params.BeaconConfig().AltairForkVersion) bellav := bytesutil.ToBytes4(params.BeaconConfig().BellatrixForkVersion) capellaV := bytesutil.ToBytes4(params.BeaconConfig().CapellaForkVersion) denebV := bytesutil.ToBytes4(params.BeaconConfig().DenebForkVersion) electraV := bytesutil.ToBytes4(params.BeaconConfig().ElectraForkVersion) + fuluV := bytesutil.ToBytes4(params.BeaconConfig().FuluForkVersion) altairS, err := slots.EpochStart(params.BeaconConfig().AltairForkEpoch) require.NoError(t, err) bellaS, err := slots.EpochStart(params.BeaconConfig().BellatrixForkEpoch) @@ -460,6 +495,8 @@ func TestUnmarshalBlindedBlock(t *testing.T) { require.NoError(t, err) electraS, err := slots.EpochStart(params.BeaconConfig().ElectraForkEpoch) require.NoError(t, err) + fuluS, err := slots.EpochStart(params.BeaconConfig().FuluForkEpoch) + require.NoError(t, err) cases := []struct { b func(*testing.T, primitives.Slot) interfaces.ReadOnlySignedBeaconBlock name string @@ -527,6 +564,12 @@ func TestUnmarshalBlindedBlock(t *testing.T) { version: electraV, slot: electraS, }, + { + name: "first slot of fulu", + b: signedTestBlindedBlockFulu, + version: fuluV, + slot: fuluS, + }, { name: "genesis block in altair slot", b: signedTestBlockGenesis, @@ -563,6 +606,10 @@ func TestUnmarshalBlindedBlock(t *testing.T) { } } +// ---------------------------------------------------------------------------- +// Phase 0 +// ---------------------------------------------------------------------------- + func signedTestBlockGenesis(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { b := util.NewBeaconBlock() b.Block.Slot = slot @@ -571,6 +618,10 @@ func signedTestBlockGenesis(t *testing.T, slot primitives.Slot) interfaces.ReadO return s } +// ---------------------------------------------------------------------------- +// Altair +// ---------------------------------------------------------------------------- + func signedTestBlockAltair(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { b := util.NewBeaconBlockAltair() b.Block.Slot = slot @@ -579,6 +630,10 @@ func signedTestBlockAltair(t *testing.T, slot primitives.Slot) interfaces.ReadOn return s } +// ---------------------------------------------------------------------------- +// Bellatrix +// ---------------------------------------------------------------------------- + func signedTestBlockBellatrix(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { b := util.NewBeaconBlockBellatrix() b.Block.Slot = slot @@ -595,6 +650,10 @@ func signedTestBlindedBlockBellatrix(t *testing.T, slot primitives.Slot) interfa return s } +// ---------------------------------------------------------------------------- +// Capella +// ---------------------------------------------------------------------------- + func signedTestBlockCapella(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { b := util.NewBeaconBlockCapella() b.Block.Slot = slot @@ -611,6 +670,10 @@ func signedTestBlindedBlockCapella(t *testing.T, slot primitives.Slot) interface return s } +// ---------------------------------------------------------------------------- +// Deneb +// ---------------------------------------------------------------------------- + func signedTestBlockDeneb(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { b := util.NewBeaconBlockDeneb() b.Block.Slot = slot @@ -619,6 +682,18 @@ func signedTestBlockDeneb(t *testing.T, slot primitives.Slot) interfaces.ReadOnl return s } +func signedTestBlindedBlockDeneb(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { + b := util.NewBlindedBeaconBlockDeneb() + b.Message.Slot = slot + s, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return s +} + +// ---------------------------------------------------------------------------- +// Electra +// ---------------------------------------------------------------------------- + func signedTestBlockElectra(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { b := util.NewBeaconBlockElectra() b.Block.Slot = slot @@ -627,16 +702,28 @@ func signedTestBlockElectra(t *testing.T, slot primitives.Slot) interfaces.ReadO return s } -func signedTestBlindedBlockDeneb(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { - b := util.NewBlindedBeaconBlockDeneb() +func signedTestBlindedBlockElectra(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { + b := util.NewBlindedBeaconBlockElectra() b.Message.Slot = slot s, err := blocks.NewSignedBeaconBlock(b) require.NoError(t, err) return s } -func signedTestBlindedBlockElectra(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { - b := util.NewBlindedBeaconBlockElectra() +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- + +func signedTestBlockFulu(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { + b := util.NewBeaconBlockFulu() + b.Block.Slot = slot + s, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return s +} + +func signedTestBlindedBlockFulu(t *testing.T, slot primitives.Slot) interfaces.ReadOnlySignedBeaconBlock { + b := util.NewBlindedBeaconBlockFulu() b.Message.Slot = slot s, err := blocks.NewSignedBeaconBlock(b) require.NoError(t, err) diff --git a/go.mod b/go.mod index f764536e084c..9ce49ecd1a52 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/prysmaticlabs/prysm/v5 go 1.22.0 -toolchain go1.22.4 +toolchain go1.22.10 require ( github.com/MariusVanDerWijden/FuzzyVM v0.0.0-20240209103030-ec53fa766bf8 @@ -45,7 +45,7 @@ require ( github.com/kr/pretty v0.3.1 github.com/libp2p/go-libp2p v0.36.5 github.com/libp2p/go-libp2p-mplex v0.9.0 - github.com/libp2p/go-libp2p-pubsub v0.12.0 + github.com/libp2p/go-libp2p-pubsub v0.12.1-0.20241230202526-bf5b58384331 github.com/libp2p/go-mplex v0.7.0 github.com/logrusorgru/aurora v2.0.3+incompatible github.com/manifoldco/promptui v0.7.0 diff --git a/go.sum b/go.sum index 8b9db5827ca8..ffcc2e0b195d 100644 --- a/go.sum +++ b/go.sum @@ -590,8 +590,8 @@ github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl9 github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8= github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og= -github.com/libp2p/go-libp2p-pubsub v0.12.0 h1:PENNZjSfk8KYxANRlpipdS7+BfLmOl3L2E/6vSNjbdI= -github.com/libp2p/go-libp2p-pubsub v0.12.0/go.mod h1:Oi0zw9aw8/Y5GC99zt+Ef2gYAl+0nZlwdJonDyOz/sE= +github.com/libp2p/go-libp2p-pubsub v0.12.1-0.20241230202526-bf5b58384331 h1:Z1fzkKuRAd+U1oxbTbWUtTTzAWaX21jqoLxVIStzp+Y= +github.com/libp2p/go-libp2p-pubsub v0.12.1-0.20241230202526-bf5b58384331/go.mod h1:m0gpUOyrXKXdE7c8FNQ9/HLfWbxaEw7xku45w+PaqZo= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY= diff --git a/hack/update-go-ssz.sh b/hack/update-go-ssz.sh index 3e48660f2bce..344cd521f918 100755 --- a/hack/update-go-ssz.sh +++ b/hack/update-go-ssz.sh @@ -20,5 +20,7 @@ for ((i = 0; i < arraylength; i++)); do destination=${file_list[i]#*$searchstring} color "34" "$destination" chmod 644 "$destination" - cp -R -L "${file_list[i]}" "$destination" + + # Copy to destination while removing the `// Hash: ...` line from the file header. + sed '/\/\/ Hash: /d' "${file_list[i]}" > "$destination" done diff --git a/proto/engine/v1/electra.go b/proto/engine/v1/electra.go index c6e3af5554ab..5c619414691c 100644 --- a/proto/engine/v1/electra.go +++ b/proto/engine/v1/electra.go @@ -8,9 +8,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/config/params" ) -type ExecutionPayloadElectra = ExecutionPayloadDeneb -type ExecutionPayloadHeaderElectra = ExecutionPayloadHeaderDeneb - var ( drExample = &DepositRequest{} drSize = drExample.SizeSSZ() diff --git a/proto/engine/v1/engine.ssz.go b/proto/engine/v1/engine.ssz.go index d84a45a7f321..b298fb0891a0 100644 --- a/proto/engine/v1/engine.ssz.go +++ b/proto/engine/v1/engine.ssz.go @@ -1,5 +1,4 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: 78d3fe6d1bab334f38e2169af092f457086963f788a35fd9c6d765c746a6b6e8 package enginev1 import ( diff --git a/proto/eth/v1/gateway.ssz.go b/proto/eth/v1/gateway.ssz.go index d6e37516c67c..d423f91d3ab7 100644 --- a/proto/eth/v1/gateway.ssz.go +++ b/proto/eth/v1/gateway.ssz.go @@ -1,5 +1,4 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: d06a72227c2f5e350916cce3e89f4e855135a2a22f6ea263dedc68fa506c1ba7 package v1 import ( diff --git a/proto/eth/v2/BUILD.bazel b/proto/eth/v2/BUILD.bazel deleted file mode 100644 index 37b7368c46b8..000000000000 --- a/proto/eth/v2/BUILD.bazel +++ /dev/null @@ -1,102 +0,0 @@ -############################################################################## -# Common -############################################################################## - -load("@rules_proto//proto:defs.bzl", "proto_library") - -# gazelle:ignore -proto_library( - name = "proto", - srcs = [ - "ssz.proto", - "version.proto", - ":ssz_proto_files", - ], - visibility = ["//visibility:public"], - deps = [ - "//proto/engine/v1:proto", - "//proto/eth/ext:proto", - "//proto/eth/v1:proto", - ], -) - -############################################################################## -# Go -############################################################################## -load("@io_bazel_rules_go//go:def.bzl", "go_library") -load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") -load("//proto:ssz_proto_library.bzl", "ssz_proto_files") -load("//tools:ssz.bzl", "SSZ_DEPS", "ssz_gen_marshal") - -ssz_gen_marshal( - name = "ssz_generated_files", - go_proto = ":go_proto", - out = "grpc.ssz.go", - includes = [ - "//consensus-types/primitives:go_default_library", - "//proto/engine/v1:go_default_library", - "//proto/eth/v1:go_default_library", - ], - objs = [ - "BlsToExecutionChange", - "SignedBeaconBlockAltair", - "SignedBeaconBlockBellatrix", - "SignedBlindedBeaconBlockBellatrix", - "SignedBeaconBlockCapella", - "SignedBlindedBeaconBlockCapella", - "SignedBeaconBlockDeneb", - "SignedBlindedBeaconBlockDeneb", - "BlsToExecutionChange", - "SignedBlsToExecutionChange", - "SignedBeaconBlockContentsDeneb", - "BeaconBlockContentsDeneb", - "SyncCommittee", - "BlobIdentifier", - ], -) - -go_proto_library( - name = "go_proto", - compilers = [ - "@com_github_prysmaticlabs_protoc_gen_go_cast//:go_cast_grpc", - ], - importpath = "github.com/prysmaticlabs/prysm/v5/proto/eth/v2", - proto = ":proto", - visibility = ["//visibility:public"], - deps = [ - "//consensus-types/primitives:go_default_library", - "//proto/engine/v1:go_default_library", - "//proto/eth/ext:go_default_library", - "//proto/eth/v1:go_default_library", - "@com_github_golang_protobuf//proto:go_default_library", - "@com_github_prysmaticlabs_go_bitfield//:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - ":ssz_generated_files", - "custom.go", - ], - embed = [":go_proto"], - importpath = "github.com/prysmaticlabs/prysm/v5/proto/eth/v2", - visibility = ["//visibility:public"], - deps = SSZ_DEPS, -) - -ssz_proto_files( - name = "ssz_proto_files", - srcs = [ - "beacon_block.proto", - "beacon_lightclient.proto", - "sync_committee.proto", - "validator.proto", - "withdrawals.proto", - ], - config = select({ - "//conditions:default": "mainnet", - "//proto:ssz_mainnet": "mainnet", - "//proto:ssz_minimal": "minimal", - }), -) diff --git a/proto/eth/v2/beacon_block.pb.go b/proto/eth/v2/beacon_block.pb.go deleted file mode 100755 index d499629d898d..000000000000 --- a/proto/eth/v2/beacon_block.pb.go +++ /dev/null @@ -1,4192 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.1 -// source: proto/eth/v2/beacon_block.proto - -package eth - -import ( - reflect "reflect" - sync "sync" - - github_com_prysmaticlabs_prysm_v5_consensus_types_primitives "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" - v11 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" - _ "github.com/prysmaticlabs/prysm/v5/proto/eth/ext" - v1 "github.com/prysmaticlabs/prysm/v5/proto/eth/v1" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type BeaconBlockContainerV2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Block: - // - // *BeaconBlockContainerV2_Phase0Block - // *BeaconBlockContainerV2_AltairBlock - // *BeaconBlockContainerV2_BellatrixBlock - // *BeaconBlockContainerV2_CapellaBlock - // *BeaconBlockContainerV2_DenebContents - Block isBeaconBlockContainerV2_Block `protobuf_oneof:"block"` -} - -func (x *BeaconBlockContainerV2) Reset() { - *x = BeaconBlockContainerV2{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BeaconBlockContainerV2) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeaconBlockContainerV2) ProtoMessage() {} - -func (x *BeaconBlockContainerV2) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeaconBlockContainerV2.ProtoReflect.Descriptor instead. -func (*BeaconBlockContainerV2) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{0} -} - -func (m *BeaconBlockContainerV2) GetBlock() isBeaconBlockContainerV2_Block { - if m != nil { - return m.Block - } - return nil -} - -func (x *BeaconBlockContainerV2) GetPhase0Block() *v1.BeaconBlock { - if x, ok := x.GetBlock().(*BeaconBlockContainerV2_Phase0Block); ok { - return x.Phase0Block - } - return nil -} - -func (x *BeaconBlockContainerV2) GetAltairBlock() *BeaconBlockAltair { - if x, ok := x.GetBlock().(*BeaconBlockContainerV2_AltairBlock); ok { - return x.AltairBlock - } - return nil -} - -func (x *BeaconBlockContainerV2) GetBellatrixBlock() *BeaconBlockBellatrix { - if x, ok := x.GetBlock().(*BeaconBlockContainerV2_BellatrixBlock); ok { - return x.BellatrixBlock - } - return nil -} - -func (x *BeaconBlockContainerV2) GetCapellaBlock() *BeaconBlockCapella { - if x, ok := x.GetBlock().(*BeaconBlockContainerV2_CapellaBlock); ok { - return x.CapellaBlock - } - return nil -} - -func (x *BeaconBlockContainerV2) GetDenebContents() *BeaconBlockContentsDeneb { - if x, ok := x.GetBlock().(*BeaconBlockContainerV2_DenebContents); ok { - return x.DenebContents - } - return nil -} - -type isBeaconBlockContainerV2_Block interface { - isBeaconBlockContainerV2_Block() -} - -type BeaconBlockContainerV2_Phase0Block struct { - Phase0Block *v1.BeaconBlock `protobuf:"bytes,1,opt,name=phase0_block,json=phase0Block,proto3,oneof"` -} - -type BeaconBlockContainerV2_AltairBlock struct { - AltairBlock *BeaconBlockAltair `protobuf:"bytes,2,opt,name=altair_block,json=altairBlock,proto3,oneof"` -} - -type BeaconBlockContainerV2_BellatrixBlock struct { - BellatrixBlock *BeaconBlockBellatrix `protobuf:"bytes,3,opt,name=bellatrix_block,json=bellatrixBlock,proto3,oneof"` -} - -type BeaconBlockContainerV2_CapellaBlock struct { - CapellaBlock *BeaconBlockCapella `protobuf:"bytes,4,opt,name=capella_block,json=capellaBlock,proto3,oneof"` -} - -type BeaconBlockContainerV2_DenebContents struct { - DenebContents *BeaconBlockContentsDeneb `protobuf:"bytes,5,opt,name=deneb_contents,json=denebContents,proto3,oneof"` -} - -func (*BeaconBlockContainerV2_Phase0Block) isBeaconBlockContainerV2_Block() {} - -func (*BeaconBlockContainerV2_AltairBlock) isBeaconBlockContainerV2_Block() {} - -func (*BeaconBlockContainerV2_BellatrixBlock) isBeaconBlockContainerV2_Block() {} - -func (*BeaconBlockContainerV2_CapellaBlock) isBeaconBlockContainerV2_Block() {} - -func (*BeaconBlockContainerV2_DenebContents) isBeaconBlockContainerV2_Block() {} - -type SignedBeaconBlockContainer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Message: - // - // *SignedBeaconBlockContainer_Phase0Block - // *SignedBeaconBlockContainer_AltairBlock - // *SignedBeaconBlockContainer_BellatrixBlock - // *SignedBeaconBlockContainer_CapellaBlock - // *SignedBeaconBlockContainer_DenebBlock - Message isSignedBeaconBlockContainer_Message `protobuf_oneof:"message"` - Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedBeaconBlockContainer) Reset() { - *x = SignedBeaconBlockContainer{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBeaconBlockContainer) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBeaconBlockContainer) ProtoMessage() {} - -func (x *SignedBeaconBlockContainer) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBeaconBlockContainer.ProtoReflect.Descriptor instead. -func (*SignedBeaconBlockContainer) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{1} -} - -func (m *SignedBeaconBlockContainer) GetMessage() isSignedBeaconBlockContainer_Message { - if m != nil { - return m.Message - } - return nil -} - -func (x *SignedBeaconBlockContainer) GetPhase0Block() *v1.BeaconBlock { - if x, ok := x.GetMessage().(*SignedBeaconBlockContainer_Phase0Block); ok { - return x.Phase0Block - } - return nil -} - -func (x *SignedBeaconBlockContainer) GetAltairBlock() *BeaconBlockAltair { - if x, ok := x.GetMessage().(*SignedBeaconBlockContainer_AltairBlock); ok { - return x.AltairBlock - } - return nil -} - -func (x *SignedBeaconBlockContainer) GetBellatrixBlock() *BeaconBlockBellatrix { - if x, ok := x.GetMessage().(*SignedBeaconBlockContainer_BellatrixBlock); ok { - return x.BellatrixBlock - } - return nil -} - -func (x *SignedBeaconBlockContainer) GetCapellaBlock() *BeaconBlockCapella { - if x, ok := x.GetMessage().(*SignedBeaconBlockContainer_CapellaBlock); ok { - return x.CapellaBlock - } - return nil -} - -func (x *SignedBeaconBlockContainer) GetDenebBlock() *BeaconBlockDeneb { - if x, ok := x.GetMessage().(*SignedBeaconBlockContainer_DenebBlock); ok { - return x.DenebBlock - } - return nil -} - -func (x *SignedBeaconBlockContainer) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type isSignedBeaconBlockContainer_Message interface { - isSignedBeaconBlockContainer_Message() -} - -type SignedBeaconBlockContainer_Phase0Block struct { - Phase0Block *v1.BeaconBlock `protobuf:"bytes,1,opt,name=phase0_block,json=phase0Block,proto3,oneof"` -} - -type SignedBeaconBlockContainer_AltairBlock struct { - AltairBlock *BeaconBlockAltair `protobuf:"bytes,2,opt,name=altair_block,json=altairBlock,proto3,oneof"` -} - -type SignedBeaconBlockContainer_BellatrixBlock struct { - BellatrixBlock *BeaconBlockBellatrix `protobuf:"bytes,3,opt,name=bellatrix_block,json=bellatrixBlock,proto3,oneof"` -} - -type SignedBeaconBlockContainer_CapellaBlock struct { - CapellaBlock *BeaconBlockCapella `protobuf:"bytes,4,opt,name=capella_block,json=capellaBlock,proto3,oneof"` -} - -type SignedBeaconBlockContainer_DenebBlock struct { - DenebBlock *BeaconBlockDeneb `protobuf:"bytes,5,opt,name=deneb_block,json=denebBlock,proto3,oneof"` -} - -func (*SignedBeaconBlockContainer_Phase0Block) isSignedBeaconBlockContainer_Message() {} - -func (*SignedBeaconBlockContainer_AltairBlock) isSignedBeaconBlockContainer_Message() {} - -func (*SignedBeaconBlockContainer_BellatrixBlock) isSignedBeaconBlockContainer_Message() {} - -func (*SignedBeaconBlockContainer_CapellaBlock) isSignedBeaconBlockContainer_Message() {} - -func (*SignedBeaconBlockContainer_DenebBlock) isSignedBeaconBlockContainer_Message() {} - -type SignedBeaconBlockContentsContainer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Message: - // - // *SignedBeaconBlockContentsContainer_Phase0Block - // *SignedBeaconBlockContentsContainer_AltairBlock - // *SignedBeaconBlockContentsContainer_BellatrixBlock - // *SignedBeaconBlockContentsContainer_CapellaBlock - // *SignedBeaconBlockContentsContainer_DenebContents - Message isSignedBeaconBlockContentsContainer_Message `protobuf_oneof:"message"` -} - -func (x *SignedBeaconBlockContentsContainer) Reset() { - *x = SignedBeaconBlockContentsContainer{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBeaconBlockContentsContainer) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBeaconBlockContentsContainer) ProtoMessage() {} - -func (x *SignedBeaconBlockContentsContainer) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBeaconBlockContentsContainer.ProtoReflect.Descriptor instead. -func (*SignedBeaconBlockContentsContainer) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{2} -} - -func (m *SignedBeaconBlockContentsContainer) GetMessage() isSignedBeaconBlockContentsContainer_Message { - if m != nil { - return m.Message - } - return nil -} - -func (x *SignedBeaconBlockContentsContainer) GetPhase0Block() *v1.SignedBeaconBlock { - if x, ok := x.GetMessage().(*SignedBeaconBlockContentsContainer_Phase0Block); ok { - return x.Phase0Block - } - return nil -} - -func (x *SignedBeaconBlockContentsContainer) GetAltairBlock() *SignedBeaconBlockAltair { - if x, ok := x.GetMessage().(*SignedBeaconBlockContentsContainer_AltairBlock); ok { - return x.AltairBlock - } - return nil -} - -func (x *SignedBeaconBlockContentsContainer) GetBellatrixBlock() *SignedBeaconBlockBellatrix { - if x, ok := x.GetMessage().(*SignedBeaconBlockContentsContainer_BellatrixBlock); ok { - return x.BellatrixBlock - } - return nil -} - -func (x *SignedBeaconBlockContentsContainer) GetCapellaBlock() *SignedBeaconBlockCapella { - if x, ok := x.GetMessage().(*SignedBeaconBlockContentsContainer_CapellaBlock); ok { - return x.CapellaBlock - } - return nil -} - -func (x *SignedBeaconBlockContentsContainer) GetDenebContents() *SignedBeaconBlockContentsDeneb { - if x, ok := x.GetMessage().(*SignedBeaconBlockContentsContainer_DenebContents); ok { - return x.DenebContents - } - return nil -} - -type isSignedBeaconBlockContentsContainer_Message interface { - isSignedBeaconBlockContentsContainer_Message() -} - -type SignedBeaconBlockContentsContainer_Phase0Block struct { - Phase0Block *v1.SignedBeaconBlock `protobuf:"bytes,1,opt,name=phase0_block,json=phase0Block,proto3,oneof"` -} - -type SignedBeaconBlockContentsContainer_AltairBlock struct { - AltairBlock *SignedBeaconBlockAltair `protobuf:"bytes,2,opt,name=altair_block,json=altairBlock,proto3,oneof"` -} - -type SignedBeaconBlockContentsContainer_BellatrixBlock struct { - BellatrixBlock *SignedBeaconBlockBellatrix `protobuf:"bytes,3,opt,name=bellatrix_block,json=bellatrixBlock,proto3,oneof"` -} - -type SignedBeaconBlockContentsContainer_CapellaBlock struct { - CapellaBlock *SignedBeaconBlockCapella `protobuf:"bytes,4,opt,name=capella_block,json=capellaBlock,proto3,oneof"` -} - -type SignedBeaconBlockContentsContainer_DenebContents struct { - DenebContents *SignedBeaconBlockContentsDeneb `protobuf:"bytes,5,opt,name=deneb_contents,json=denebContents,proto3,oneof"` -} - -func (*SignedBeaconBlockContentsContainer_Phase0Block) isSignedBeaconBlockContentsContainer_Message() { -} - -func (*SignedBeaconBlockContentsContainer_AltairBlock) isSignedBeaconBlockContentsContainer_Message() { -} - -func (*SignedBeaconBlockContentsContainer_BellatrixBlock) isSignedBeaconBlockContentsContainer_Message() { -} - -func (*SignedBeaconBlockContentsContainer_CapellaBlock) isSignedBeaconBlockContentsContainer_Message() { -} - -func (*SignedBeaconBlockContentsContainer_DenebContents) isSignedBeaconBlockContentsContainer_Message() { -} - -type BlindedBeaconBlockContainer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Block: - // - // *BlindedBeaconBlockContainer_Phase0Block - // *BlindedBeaconBlockContainer_AltairBlock - // *BlindedBeaconBlockContainer_BellatrixBlock - // *BlindedBeaconBlockContainer_CapellaBlock - // *BlindedBeaconBlockContainer_DenebBlock - Block isBlindedBeaconBlockContainer_Block `protobuf_oneof:"block"` -} - -func (x *BlindedBeaconBlockContainer) Reset() { - *x = BlindedBeaconBlockContainer{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlindedBeaconBlockContainer) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlindedBeaconBlockContainer) ProtoMessage() {} - -func (x *BlindedBeaconBlockContainer) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlindedBeaconBlockContainer.ProtoReflect.Descriptor instead. -func (*BlindedBeaconBlockContainer) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{3} -} - -func (m *BlindedBeaconBlockContainer) GetBlock() isBlindedBeaconBlockContainer_Block { - if m != nil { - return m.Block - } - return nil -} - -func (x *BlindedBeaconBlockContainer) GetPhase0Block() *v1.BeaconBlock { - if x, ok := x.GetBlock().(*BlindedBeaconBlockContainer_Phase0Block); ok { - return x.Phase0Block - } - return nil -} - -func (x *BlindedBeaconBlockContainer) GetAltairBlock() *BeaconBlockAltair { - if x, ok := x.GetBlock().(*BlindedBeaconBlockContainer_AltairBlock); ok { - return x.AltairBlock - } - return nil -} - -func (x *BlindedBeaconBlockContainer) GetBellatrixBlock() *BlindedBeaconBlockBellatrix { - if x, ok := x.GetBlock().(*BlindedBeaconBlockContainer_BellatrixBlock); ok { - return x.BellatrixBlock - } - return nil -} - -func (x *BlindedBeaconBlockContainer) GetCapellaBlock() *BlindedBeaconBlockCapella { - if x, ok := x.GetBlock().(*BlindedBeaconBlockContainer_CapellaBlock); ok { - return x.CapellaBlock - } - return nil -} - -func (x *BlindedBeaconBlockContainer) GetDenebBlock() *BlindedBeaconBlockDeneb { - if x, ok := x.GetBlock().(*BlindedBeaconBlockContainer_DenebBlock); ok { - return x.DenebBlock - } - return nil -} - -type isBlindedBeaconBlockContainer_Block interface { - isBlindedBeaconBlockContainer_Block() -} - -type BlindedBeaconBlockContainer_Phase0Block struct { - Phase0Block *v1.BeaconBlock `protobuf:"bytes,1,opt,name=phase0_block,json=phase0Block,proto3,oneof"` -} - -type BlindedBeaconBlockContainer_AltairBlock struct { - AltairBlock *BeaconBlockAltair `protobuf:"bytes,2,opt,name=altair_block,json=altairBlock,proto3,oneof"` -} - -type BlindedBeaconBlockContainer_BellatrixBlock struct { - BellatrixBlock *BlindedBeaconBlockBellatrix `protobuf:"bytes,3,opt,name=bellatrix_block,json=bellatrixBlock,proto3,oneof"` -} - -type BlindedBeaconBlockContainer_CapellaBlock struct { - CapellaBlock *BlindedBeaconBlockCapella `protobuf:"bytes,4,opt,name=capella_block,json=capellaBlock,proto3,oneof"` -} - -type BlindedBeaconBlockContainer_DenebBlock struct { - DenebBlock *BlindedBeaconBlockDeneb `protobuf:"bytes,5,opt,name=deneb_block,json=denebBlock,proto3,oneof"` -} - -func (*BlindedBeaconBlockContainer_Phase0Block) isBlindedBeaconBlockContainer_Block() {} - -func (*BlindedBeaconBlockContainer_AltairBlock) isBlindedBeaconBlockContainer_Block() {} - -func (*BlindedBeaconBlockContainer_BellatrixBlock) isBlindedBeaconBlockContainer_Block() {} - -func (*BlindedBeaconBlockContainer_CapellaBlock) isBlindedBeaconBlockContainer_Block() {} - -func (*BlindedBeaconBlockContainer_DenebBlock) isBlindedBeaconBlockContainer_Block() {} - -type SignedBlindedBeaconBlockContainer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Message: - // - // *SignedBlindedBeaconBlockContainer_Phase0Block - // *SignedBlindedBeaconBlockContainer_AltairBlock - // *SignedBlindedBeaconBlockContainer_BellatrixBlock - // *SignedBlindedBeaconBlockContainer_CapellaBlock - // *SignedBlindedBeaconBlockContainer_DenebBlock - Message isSignedBlindedBeaconBlockContainer_Message `protobuf_oneof:"message"` - Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedBlindedBeaconBlockContainer) Reset() { - *x = SignedBlindedBeaconBlockContainer{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBlindedBeaconBlockContainer) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBlindedBeaconBlockContainer) ProtoMessage() {} - -func (x *SignedBlindedBeaconBlockContainer) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBlindedBeaconBlockContainer.ProtoReflect.Descriptor instead. -func (*SignedBlindedBeaconBlockContainer) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{4} -} - -func (m *SignedBlindedBeaconBlockContainer) GetMessage() isSignedBlindedBeaconBlockContainer_Message { - if m != nil { - return m.Message - } - return nil -} - -func (x *SignedBlindedBeaconBlockContainer) GetPhase0Block() *v1.BeaconBlock { - if x, ok := x.GetMessage().(*SignedBlindedBeaconBlockContainer_Phase0Block); ok { - return x.Phase0Block - } - return nil -} - -func (x *SignedBlindedBeaconBlockContainer) GetAltairBlock() *BeaconBlockAltair { - if x, ok := x.GetMessage().(*SignedBlindedBeaconBlockContainer_AltairBlock); ok { - return x.AltairBlock - } - return nil -} - -func (x *SignedBlindedBeaconBlockContainer) GetBellatrixBlock() *BlindedBeaconBlockBellatrix { - if x, ok := x.GetMessage().(*SignedBlindedBeaconBlockContainer_BellatrixBlock); ok { - return x.BellatrixBlock - } - return nil -} - -func (x *SignedBlindedBeaconBlockContainer) GetCapellaBlock() *BlindedBeaconBlockCapella { - if x, ok := x.GetMessage().(*SignedBlindedBeaconBlockContainer_CapellaBlock); ok { - return x.CapellaBlock - } - return nil -} - -func (x *SignedBlindedBeaconBlockContainer) GetDenebBlock() *BlindedBeaconBlockDeneb { - if x, ok := x.GetMessage().(*SignedBlindedBeaconBlockContainer_DenebBlock); ok { - return x.DenebBlock - } - return nil -} - -func (x *SignedBlindedBeaconBlockContainer) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type isSignedBlindedBeaconBlockContainer_Message interface { - isSignedBlindedBeaconBlockContainer_Message() -} - -type SignedBlindedBeaconBlockContainer_Phase0Block struct { - Phase0Block *v1.BeaconBlock `protobuf:"bytes,1,opt,name=phase0_block,json=phase0Block,proto3,oneof"` -} - -type SignedBlindedBeaconBlockContainer_AltairBlock struct { - AltairBlock *BeaconBlockAltair `protobuf:"bytes,2,opt,name=altair_block,json=altairBlock,proto3,oneof"` -} - -type SignedBlindedBeaconBlockContainer_BellatrixBlock struct { - BellatrixBlock *BlindedBeaconBlockBellatrix `protobuf:"bytes,3,opt,name=bellatrix_block,json=bellatrixBlock,proto3,oneof"` -} - -type SignedBlindedBeaconBlockContainer_CapellaBlock struct { - CapellaBlock *BlindedBeaconBlockCapella `protobuf:"bytes,4,opt,name=capella_block,json=capellaBlock,proto3,oneof"` -} - -type SignedBlindedBeaconBlockContainer_DenebBlock struct { - DenebBlock *BlindedBeaconBlockDeneb `protobuf:"bytes,5,opt,name=deneb_block,json=denebBlock,proto3,oneof"` -} - -func (*SignedBlindedBeaconBlockContainer_Phase0Block) isSignedBlindedBeaconBlockContainer_Message() {} - -func (*SignedBlindedBeaconBlockContainer_AltairBlock) isSignedBlindedBeaconBlockContainer_Message() {} - -func (*SignedBlindedBeaconBlockContainer_BellatrixBlock) isSignedBlindedBeaconBlockContainer_Message() { -} - -func (*SignedBlindedBeaconBlockContainer_CapellaBlock) isSignedBlindedBeaconBlockContainer_Message() { -} - -func (*SignedBlindedBeaconBlockContainer_DenebBlock) isSignedBlindedBeaconBlockContainer_Message() {} - -type SignedBlindedBeaconBlockContentsContainer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Message: - // - // *SignedBlindedBeaconBlockContentsContainer_Phase0Block - // *SignedBlindedBeaconBlockContentsContainer_AltairBlock - // *SignedBlindedBeaconBlockContentsContainer_BellatrixBlock - // *SignedBlindedBeaconBlockContentsContainer_CapellaBlock - // *SignedBlindedBeaconBlockContentsContainer_DenebBlock - Message isSignedBlindedBeaconBlockContentsContainer_Message `protobuf_oneof:"message"` -} - -func (x *SignedBlindedBeaconBlockContentsContainer) Reset() { - *x = SignedBlindedBeaconBlockContentsContainer{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBlindedBeaconBlockContentsContainer) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBlindedBeaconBlockContentsContainer) ProtoMessage() {} - -func (x *SignedBlindedBeaconBlockContentsContainer) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBlindedBeaconBlockContentsContainer.ProtoReflect.Descriptor instead. -func (*SignedBlindedBeaconBlockContentsContainer) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{5} -} - -func (m *SignedBlindedBeaconBlockContentsContainer) GetMessage() isSignedBlindedBeaconBlockContentsContainer_Message { - if m != nil { - return m.Message - } - return nil -} - -func (x *SignedBlindedBeaconBlockContentsContainer) GetPhase0Block() *v1.SignedBeaconBlock { - if x, ok := x.GetMessage().(*SignedBlindedBeaconBlockContentsContainer_Phase0Block); ok { - return x.Phase0Block - } - return nil -} - -func (x *SignedBlindedBeaconBlockContentsContainer) GetAltairBlock() *SignedBeaconBlockAltair { - if x, ok := x.GetMessage().(*SignedBlindedBeaconBlockContentsContainer_AltairBlock); ok { - return x.AltairBlock - } - return nil -} - -func (x *SignedBlindedBeaconBlockContentsContainer) GetBellatrixBlock() *SignedBlindedBeaconBlockBellatrix { - if x, ok := x.GetMessage().(*SignedBlindedBeaconBlockContentsContainer_BellatrixBlock); ok { - return x.BellatrixBlock - } - return nil -} - -func (x *SignedBlindedBeaconBlockContentsContainer) GetCapellaBlock() *SignedBlindedBeaconBlockCapella { - if x, ok := x.GetMessage().(*SignedBlindedBeaconBlockContentsContainer_CapellaBlock); ok { - return x.CapellaBlock - } - return nil -} - -func (x *SignedBlindedBeaconBlockContentsContainer) GetDenebBlock() *SignedBlindedBeaconBlockDeneb { - if x, ok := x.GetMessage().(*SignedBlindedBeaconBlockContentsContainer_DenebBlock); ok { - return x.DenebBlock - } - return nil -} - -type isSignedBlindedBeaconBlockContentsContainer_Message interface { - isSignedBlindedBeaconBlockContentsContainer_Message() -} - -type SignedBlindedBeaconBlockContentsContainer_Phase0Block struct { - Phase0Block *v1.SignedBeaconBlock `protobuf:"bytes,1,opt,name=phase0_block,json=phase0Block,proto3,oneof"` -} - -type SignedBlindedBeaconBlockContentsContainer_AltairBlock struct { - AltairBlock *SignedBeaconBlockAltair `protobuf:"bytes,2,opt,name=altair_block,json=altairBlock,proto3,oneof"` -} - -type SignedBlindedBeaconBlockContentsContainer_BellatrixBlock struct { - BellatrixBlock *SignedBlindedBeaconBlockBellatrix `protobuf:"bytes,3,opt,name=bellatrix_block,json=bellatrixBlock,proto3,oneof"` -} - -type SignedBlindedBeaconBlockContentsContainer_CapellaBlock struct { - CapellaBlock *SignedBlindedBeaconBlockCapella `protobuf:"bytes,4,opt,name=capella_block,json=capellaBlock,proto3,oneof"` -} - -type SignedBlindedBeaconBlockContentsContainer_DenebBlock struct { - DenebBlock *SignedBlindedBeaconBlockDeneb `protobuf:"bytes,5,opt,name=deneb_block,json=denebBlock,proto3,oneof"` -} - -func (*SignedBlindedBeaconBlockContentsContainer_Phase0Block) isSignedBlindedBeaconBlockContentsContainer_Message() { -} - -func (*SignedBlindedBeaconBlockContentsContainer_AltairBlock) isSignedBlindedBeaconBlockContentsContainer_Message() { -} - -func (*SignedBlindedBeaconBlockContentsContainer_BellatrixBlock) isSignedBlindedBeaconBlockContentsContainer_Message() { -} - -func (*SignedBlindedBeaconBlockContentsContainer_CapellaBlock) isSignedBlindedBeaconBlockContentsContainer_Message() { -} - -func (*SignedBlindedBeaconBlockContentsContainer_DenebBlock) isSignedBlindedBeaconBlockContentsContainer_Message() { -} - -type SignedBeaconBlockAltair struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message *BeaconBlockAltair `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedBeaconBlockAltair) Reset() { - *x = SignedBeaconBlockAltair{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBeaconBlockAltair) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBeaconBlockAltair) ProtoMessage() {} - -func (x *SignedBeaconBlockAltair) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBeaconBlockAltair.ProtoReflect.Descriptor instead. -func (*SignedBeaconBlockAltair) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{6} -} - -func (x *SignedBeaconBlockAltair) GetMessage() *BeaconBlockAltair { - if x != nil { - return x.Message - } - return nil -} - -func (x *SignedBeaconBlockAltair) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type SignedBeaconBlockBellatrix struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message *BeaconBlockBellatrix `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedBeaconBlockBellatrix) Reset() { - *x = SignedBeaconBlockBellatrix{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBeaconBlockBellatrix) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBeaconBlockBellatrix) ProtoMessage() {} - -func (x *SignedBeaconBlockBellatrix) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBeaconBlockBellatrix.ProtoReflect.Descriptor instead. -func (*SignedBeaconBlockBellatrix) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{7} -} - -func (x *SignedBeaconBlockBellatrix) GetMessage() *BeaconBlockBellatrix { - if x != nil { - return x.Message - } - return nil -} - -func (x *SignedBeaconBlockBellatrix) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type SignedBeaconBlockCapella struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message *BeaconBlockCapella `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedBeaconBlockCapella) Reset() { - *x = SignedBeaconBlockCapella{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBeaconBlockCapella) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBeaconBlockCapella) ProtoMessage() {} - -func (x *SignedBeaconBlockCapella) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBeaconBlockCapella.ProtoReflect.Descriptor instead. -func (*SignedBeaconBlockCapella) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{8} -} - -func (x *SignedBeaconBlockCapella) GetMessage() *BeaconBlockCapella { - if x != nil { - return x.Message - } - return nil -} - -func (x *SignedBeaconBlockCapella) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type SignedBeaconBlockDeneb struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message *BeaconBlockDeneb `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedBeaconBlockDeneb) Reset() { - *x = SignedBeaconBlockDeneb{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBeaconBlockDeneb) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBeaconBlockDeneb) ProtoMessage() {} - -func (x *SignedBeaconBlockDeneb) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBeaconBlockDeneb.ProtoReflect.Descriptor instead. -func (*SignedBeaconBlockDeneb) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{9} -} - -func (x *SignedBeaconBlockDeneb) GetMessage() *BeaconBlockDeneb { - if x != nil { - return x.Message - } - return nil -} - -func (x *SignedBeaconBlockDeneb) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type SignedBlindedBeaconBlockBellatrix struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message *BlindedBeaconBlockBellatrix `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedBlindedBeaconBlockBellatrix) Reset() { - *x = SignedBlindedBeaconBlockBellatrix{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBlindedBeaconBlockBellatrix) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBlindedBeaconBlockBellatrix) ProtoMessage() {} - -func (x *SignedBlindedBeaconBlockBellatrix) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBlindedBeaconBlockBellatrix.ProtoReflect.Descriptor instead. -func (*SignedBlindedBeaconBlockBellatrix) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{10} -} - -func (x *SignedBlindedBeaconBlockBellatrix) GetMessage() *BlindedBeaconBlockBellatrix { - if x != nil { - return x.Message - } - return nil -} - -func (x *SignedBlindedBeaconBlockBellatrix) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type SignedBlindedBeaconBlockCapella struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message *BlindedBeaconBlockCapella `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedBlindedBeaconBlockCapella) Reset() { - *x = SignedBlindedBeaconBlockCapella{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBlindedBeaconBlockCapella) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBlindedBeaconBlockCapella) ProtoMessage() {} - -func (x *SignedBlindedBeaconBlockCapella) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBlindedBeaconBlockCapella.ProtoReflect.Descriptor instead. -func (*SignedBlindedBeaconBlockCapella) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{11} -} - -func (x *SignedBlindedBeaconBlockCapella) GetMessage() *BlindedBeaconBlockCapella { - if x != nil { - return x.Message - } - return nil -} - -func (x *SignedBlindedBeaconBlockCapella) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type SignedBlindedBeaconBlockDeneb struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message *BlindedBeaconBlockDeneb `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedBlindedBeaconBlockDeneb) Reset() { - *x = SignedBlindedBeaconBlockDeneb{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBlindedBeaconBlockDeneb) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBlindedBeaconBlockDeneb) ProtoMessage() {} - -func (x *SignedBlindedBeaconBlockDeneb) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBlindedBeaconBlockDeneb.ProtoReflect.Descriptor instead. -func (*SignedBlindedBeaconBlockDeneb) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{12} -} - -func (x *SignedBlindedBeaconBlockDeneb) GetMessage() *BlindedBeaconBlockDeneb { - if x != nil { - return x.Message - } - return nil -} - -func (x *SignedBlindedBeaconBlockDeneb) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type BeaconBlockAltair struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` - ProposerIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,2,opt,name=proposer_index,json=proposerIndex,proto3" json:"proposer_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` - ParentRoot []byte `protobuf:"bytes,3,opt,name=parent_root,json=parentRoot,proto3" json:"parent_root,omitempty" ssz-size:"32"` - StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty" ssz-size:"32"` - Body *BeaconBlockBodyAltair `protobuf:"bytes,5,opt,name=body,proto3" json:"body,omitempty"` -} - -func (x *BeaconBlockAltair) Reset() { - *x = BeaconBlockAltair{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BeaconBlockAltair) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeaconBlockAltair) ProtoMessage() {} - -func (x *BeaconBlockAltair) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeaconBlockAltair.ProtoReflect.Descriptor instead. -func (*BeaconBlockAltair) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{13} -} - -func (x *BeaconBlockAltair) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.Slot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -func (x *BeaconBlockAltair) GetProposerIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { - if x != nil { - return x.ProposerIndex - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) -} - -func (x *BeaconBlockAltair) GetParentRoot() []byte { - if x != nil { - return x.ParentRoot - } - return nil -} - -func (x *BeaconBlockAltair) GetStateRoot() []byte { - if x != nil { - return x.StateRoot - } - return nil -} - -func (x *BeaconBlockAltair) GetBody() *BeaconBlockBodyAltair { - if x != nil { - return x.Body - } - return nil -} - -type BeaconBlockBellatrix struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` - ProposerIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,2,opt,name=proposer_index,json=proposerIndex,proto3" json:"proposer_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` - ParentRoot []byte `protobuf:"bytes,3,opt,name=parent_root,json=parentRoot,proto3" json:"parent_root,omitempty" ssz-size:"32"` - StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty" ssz-size:"32"` - Body *BeaconBlockBodyBellatrix `protobuf:"bytes,5,opt,name=body,proto3" json:"body,omitempty"` -} - -func (x *BeaconBlockBellatrix) Reset() { - *x = BeaconBlockBellatrix{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BeaconBlockBellatrix) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeaconBlockBellatrix) ProtoMessage() {} - -func (x *BeaconBlockBellatrix) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeaconBlockBellatrix.ProtoReflect.Descriptor instead. -func (*BeaconBlockBellatrix) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{14} -} - -func (x *BeaconBlockBellatrix) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.Slot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -func (x *BeaconBlockBellatrix) GetProposerIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { - if x != nil { - return x.ProposerIndex - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) -} - -func (x *BeaconBlockBellatrix) GetParentRoot() []byte { - if x != nil { - return x.ParentRoot - } - return nil -} - -func (x *BeaconBlockBellatrix) GetStateRoot() []byte { - if x != nil { - return x.StateRoot - } - return nil -} - -func (x *BeaconBlockBellatrix) GetBody() *BeaconBlockBodyBellatrix { - if x != nil { - return x.Body - } - return nil -} - -type BlindedBeaconBlockBellatrix struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` - ProposerIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,2,opt,name=proposer_index,json=proposerIndex,proto3" json:"proposer_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` - ParentRoot []byte `protobuf:"bytes,3,opt,name=parent_root,json=parentRoot,proto3" json:"parent_root,omitempty" ssz-size:"32"` - StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty" ssz-size:"32"` - Body *BlindedBeaconBlockBodyBellatrix `protobuf:"bytes,5,opt,name=body,proto3" json:"body,omitempty"` -} - -func (x *BlindedBeaconBlockBellatrix) Reset() { - *x = BlindedBeaconBlockBellatrix{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlindedBeaconBlockBellatrix) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlindedBeaconBlockBellatrix) ProtoMessage() {} - -func (x *BlindedBeaconBlockBellatrix) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlindedBeaconBlockBellatrix.ProtoReflect.Descriptor instead. -func (*BlindedBeaconBlockBellatrix) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{15} -} - -func (x *BlindedBeaconBlockBellatrix) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.Slot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -func (x *BlindedBeaconBlockBellatrix) GetProposerIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { - if x != nil { - return x.ProposerIndex - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) -} - -func (x *BlindedBeaconBlockBellatrix) GetParentRoot() []byte { - if x != nil { - return x.ParentRoot - } - return nil -} - -func (x *BlindedBeaconBlockBellatrix) GetStateRoot() []byte { - if x != nil { - return x.StateRoot - } - return nil -} - -func (x *BlindedBeaconBlockBellatrix) GetBody() *BlindedBeaconBlockBodyBellatrix { - if x != nil { - return x.Body - } - return nil -} - -type BeaconBlockCapella struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` - ProposerIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,2,opt,name=proposer_index,json=proposerIndex,proto3" json:"proposer_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` - ParentRoot []byte `protobuf:"bytes,3,opt,name=parent_root,json=parentRoot,proto3" json:"parent_root,omitempty" ssz-size:"32"` - StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty" ssz-size:"32"` - Body *BeaconBlockBodyCapella `protobuf:"bytes,5,opt,name=body,proto3" json:"body,omitempty"` -} - -func (x *BeaconBlockCapella) Reset() { - *x = BeaconBlockCapella{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BeaconBlockCapella) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeaconBlockCapella) ProtoMessage() {} - -func (x *BeaconBlockCapella) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeaconBlockCapella.ProtoReflect.Descriptor instead. -func (*BeaconBlockCapella) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{16} -} - -func (x *BeaconBlockCapella) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.Slot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -func (x *BeaconBlockCapella) GetProposerIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { - if x != nil { - return x.ProposerIndex - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) -} - -func (x *BeaconBlockCapella) GetParentRoot() []byte { - if x != nil { - return x.ParentRoot - } - return nil -} - -func (x *BeaconBlockCapella) GetStateRoot() []byte { - if x != nil { - return x.StateRoot - } - return nil -} - -func (x *BeaconBlockCapella) GetBody() *BeaconBlockBodyCapella { - if x != nil { - return x.Body - } - return nil -} - -type BlindedBeaconBlockCapella struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` - ProposerIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,2,opt,name=proposer_index,json=proposerIndex,proto3" json:"proposer_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` - ParentRoot []byte `protobuf:"bytes,3,opt,name=parent_root,json=parentRoot,proto3" json:"parent_root,omitempty" ssz-size:"32"` - StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty" ssz-size:"32"` - Body *BlindedBeaconBlockBodyCapella `protobuf:"bytes,5,opt,name=body,proto3" json:"body,omitempty"` -} - -func (x *BlindedBeaconBlockCapella) Reset() { - *x = BlindedBeaconBlockCapella{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlindedBeaconBlockCapella) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlindedBeaconBlockCapella) ProtoMessage() {} - -func (x *BlindedBeaconBlockCapella) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlindedBeaconBlockCapella.ProtoReflect.Descriptor instead. -func (*BlindedBeaconBlockCapella) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{17} -} - -func (x *BlindedBeaconBlockCapella) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.Slot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -func (x *BlindedBeaconBlockCapella) GetProposerIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { - if x != nil { - return x.ProposerIndex - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) -} - -func (x *BlindedBeaconBlockCapella) GetParentRoot() []byte { - if x != nil { - return x.ParentRoot - } - return nil -} - -func (x *BlindedBeaconBlockCapella) GetStateRoot() []byte { - if x != nil { - return x.StateRoot - } - return nil -} - -func (x *BlindedBeaconBlockCapella) GetBody() *BlindedBeaconBlockBodyCapella { - if x != nil { - return x.Body - } - return nil -} - -type BeaconBlockDeneb struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` - ProposerIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,2,opt,name=proposer_index,json=proposerIndex,proto3" json:"proposer_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` - ParentRoot []byte `protobuf:"bytes,3,opt,name=parent_root,json=parentRoot,proto3" json:"parent_root,omitempty" ssz-size:"32"` - StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty" ssz-size:"32"` - Body *BeaconBlockBodyDeneb `protobuf:"bytes,5,opt,name=body,proto3" json:"body,omitempty"` -} - -func (x *BeaconBlockDeneb) Reset() { - *x = BeaconBlockDeneb{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BeaconBlockDeneb) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeaconBlockDeneb) ProtoMessage() {} - -func (x *BeaconBlockDeneb) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeaconBlockDeneb.ProtoReflect.Descriptor instead. -func (*BeaconBlockDeneb) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{18} -} - -func (x *BeaconBlockDeneb) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.Slot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -func (x *BeaconBlockDeneb) GetProposerIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { - if x != nil { - return x.ProposerIndex - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) -} - -func (x *BeaconBlockDeneb) GetParentRoot() []byte { - if x != nil { - return x.ParentRoot - } - return nil -} - -func (x *BeaconBlockDeneb) GetStateRoot() []byte { - if x != nil { - return x.StateRoot - } - return nil -} - -func (x *BeaconBlockDeneb) GetBody() *BeaconBlockBodyDeneb { - if x != nil { - return x.Body - } - return nil -} - -type BlindedBeaconBlockDeneb struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` - ProposerIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,2,opt,name=proposer_index,json=proposerIndex,proto3" json:"proposer_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` - ParentRoot []byte `protobuf:"bytes,3,opt,name=parent_root,json=parentRoot,proto3" json:"parent_root,omitempty" ssz-size:"32"` - StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty" ssz-size:"32"` - Body *BlindedBeaconBlockBodyDeneb `protobuf:"bytes,5,opt,name=body,proto3" json:"body,omitempty"` -} - -func (x *BlindedBeaconBlockDeneb) Reset() { - *x = BlindedBeaconBlockDeneb{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlindedBeaconBlockDeneb) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlindedBeaconBlockDeneb) ProtoMessage() {} - -func (x *BlindedBeaconBlockDeneb) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlindedBeaconBlockDeneb.ProtoReflect.Descriptor instead. -func (*BlindedBeaconBlockDeneb) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{19} -} - -func (x *BlindedBeaconBlockDeneb) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.Slot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -func (x *BlindedBeaconBlockDeneb) GetProposerIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { - if x != nil { - return x.ProposerIndex - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) -} - -func (x *BlindedBeaconBlockDeneb) GetParentRoot() []byte { - if x != nil { - return x.ParentRoot - } - return nil -} - -func (x *BlindedBeaconBlockDeneb) GetStateRoot() []byte { - if x != nil { - return x.StateRoot - } - return nil -} - -func (x *BlindedBeaconBlockDeneb) GetBody() *BlindedBeaconBlockBodyDeneb { - if x != nil { - return x.Body - } - return nil -} - -type BeaconBlockBodyAltair struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RandaoReveal []byte `protobuf:"bytes,1,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty" ssz-size:"96"` - Eth1Data *v1.Eth1Data `protobuf:"bytes,2,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` - Graffiti []byte `protobuf:"bytes,3,opt,name=graffiti,proto3" json:"graffiti,omitempty" ssz-size:"32"` - ProposerSlashings []*v1.ProposerSlashing `protobuf:"bytes,4,rep,name=proposer_slashings,json=proposerSlashings,proto3" json:"proposer_slashings,omitempty" ssz-max:"16"` - AttesterSlashings []*v1.AttesterSlashing `protobuf:"bytes,5,rep,name=attester_slashings,json=attesterSlashings,proto3" json:"attester_slashings,omitempty" ssz-max:"2"` - Attestations []*v1.Attestation `protobuf:"bytes,6,rep,name=attestations,proto3" json:"attestations,omitempty" ssz-max:"128"` - Deposits []*v1.Deposit `protobuf:"bytes,7,rep,name=deposits,proto3" json:"deposits,omitempty" ssz-max:"16"` - VoluntaryExits []*v1.SignedVoluntaryExit `protobuf:"bytes,8,rep,name=voluntary_exits,json=voluntaryExits,proto3" json:"voluntary_exits,omitempty" ssz-max:"16"` - SyncAggregate *v1.SyncAggregate `protobuf:"bytes,9,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` -} - -func (x *BeaconBlockBodyAltair) Reset() { - *x = BeaconBlockBodyAltair{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BeaconBlockBodyAltair) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeaconBlockBodyAltair) ProtoMessage() {} - -func (x *BeaconBlockBodyAltair) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeaconBlockBodyAltair.ProtoReflect.Descriptor instead. -func (*BeaconBlockBodyAltair) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{20} -} - -func (x *BeaconBlockBodyAltair) GetRandaoReveal() []byte { - if x != nil { - return x.RandaoReveal - } - return nil -} - -func (x *BeaconBlockBodyAltair) GetEth1Data() *v1.Eth1Data { - if x != nil { - return x.Eth1Data - } - return nil -} - -func (x *BeaconBlockBodyAltair) GetGraffiti() []byte { - if x != nil { - return x.Graffiti - } - return nil -} - -func (x *BeaconBlockBodyAltair) GetProposerSlashings() []*v1.ProposerSlashing { - if x != nil { - return x.ProposerSlashings - } - return nil -} - -func (x *BeaconBlockBodyAltair) GetAttesterSlashings() []*v1.AttesterSlashing { - if x != nil { - return x.AttesterSlashings - } - return nil -} - -func (x *BeaconBlockBodyAltair) GetAttestations() []*v1.Attestation { - if x != nil { - return x.Attestations - } - return nil -} - -func (x *BeaconBlockBodyAltair) GetDeposits() []*v1.Deposit { - if x != nil { - return x.Deposits - } - return nil -} - -func (x *BeaconBlockBodyAltair) GetVoluntaryExits() []*v1.SignedVoluntaryExit { - if x != nil { - return x.VoluntaryExits - } - return nil -} - -func (x *BeaconBlockBodyAltair) GetSyncAggregate() *v1.SyncAggregate { - if x != nil { - return x.SyncAggregate - } - return nil -} - -type BeaconBlockBodyBellatrix struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RandaoReveal []byte `protobuf:"bytes,1,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty" ssz-size:"96"` - Eth1Data *v1.Eth1Data `protobuf:"bytes,2,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` - Graffiti []byte `protobuf:"bytes,3,opt,name=graffiti,proto3" json:"graffiti,omitempty" ssz-size:"32"` - ProposerSlashings []*v1.ProposerSlashing `protobuf:"bytes,4,rep,name=proposer_slashings,json=proposerSlashings,proto3" json:"proposer_slashings,omitempty" ssz-max:"16"` - AttesterSlashings []*v1.AttesterSlashing `protobuf:"bytes,5,rep,name=attester_slashings,json=attesterSlashings,proto3" json:"attester_slashings,omitempty" ssz-max:"2"` - Attestations []*v1.Attestation `protobuf:"bytes,6,rep,name=attestations,proto3" json:"attestations,omitempty" ssz-max:"128"` - Deposits []*v1.Deposit `protobuf:"bytes,7,rep,name=deposits,proto3" json:"deposits,omitempty" ssz-max:"16"` - VoluntaryExits []*v1.SignedVoluntaryExit `protobuf:"bytes,8,rep,name=voluntary_exits,json=voluntaryExits,proto3" json:"voluntary_exits,omitempty" ssz-max:"16"` - SyncAggregate *v1.SyncAggregate `protobuf:"bytes,9,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` - ExecutionPayload *v11.ExecutionPayload `protobuf:"bytes,10,opt,name=execution_payload,json=executionPayload,proto3" json:"execution_payload,omitempty"` -} - -func (x *BeaconBlockBodyBellatrix) Reset() { - *x = BeaconBlockBodyBellatrix{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BeaconBlockBodyBellatrix) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeaconBlockBodyBellatrix) ProtoMessage() {} - -func (x *BeaconBlockBodyBellatrix) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeaconBlockBodyBellatrix.ProtoReflect.Descriptor instead. -func (*BeaconBlockBodyBellatrix) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{21} -} - -func (x *BeaconBlockBodyBellatrix) GetRandaoReveal() []byte { - if x != nil { - return x.RandaoReveal - } - return nil -} - -func (x *BeaconBlockBodyBellatrix) GetEth1Data() *v1.Eth1Data { - if x != nil { - return x.Eth1Data - } - return nil -} - -func (x *BeaconBlockBodyBellatrix) GetGraffiti() []byte { - if x != nil { - return x.Graffiti - } - return nil -} - -func (x *BeaconBlockBodyBellatrix) GetProposerSlashings() []*v1.ProposerSlashing { - if x != nil { - return x.ProposerSlashings - } - return nil -} - -func (x *BeaconBlockBodyBellatrix) GetAttesterSlashings() []*v1.AttesterSlashing { - if x != nil { - return x.AttesterSlashings - } - return nil -} - -func (x *BeaconBlockBodyBellatrix) GetAttestations() []*v1.Attestation { - if x != nil { - return x.Attestations - } - return nil -} - -func (x *BeaconBlockBodyBellatrix) GetDeposits() []*v1.Deposit { - if x != nil { - return x.Deposits - } - return nil -} - -func (x *BeaconBlockBodyBellatrix) GetVoluntaryExits() []*v1.SignedVoluntaryExit { - if x != nil { - return x.VoluntaryExits - } - return nil -} - -func (x *BeaconBlockBodyBellatrix) GetSyncAggregate() *v1.SyncAggregate { - if x != nil { - return x.SyncAggregate - } - return nil -} - -func (x *BeaconBlockBodyBellatrix) GetExecutionPayload() *v11.ExecutionPayload { - if x != nil { - return x.ExecutionPayload - } - return nil -} - -type BlindedBeaconBlockBodyBellatrix struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RandaoReveal []byte `protobuf:"bytes,1,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty" ssz-size:"96"` - Eth1Data *v1.Eth1Data `protobuf:"bytes,2,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` - Graffiti []byte `protobuf:"bytes,3,opt,name=graffiti,proto3" json:"graffiti,omitempty" ssz-size:"32"` - ProposerSlashings []*v1.ProposerSlashing `protobuf:"bytes,4,rep,name=proposer_slashings,json=proposerSlashings,proto3" json:"proposer_slashings,omitempty" ssz-max:"16"` - AttesterSlashings []*v1.AttesterSlashing `protobuf:"bytes,5,rep,name=attester_slashings,json=attesterSlashings,proto3" json:"attester_slashings,omitempty" ssz-max:"2"` - Attestations []*v1.Attestation `protobuf:"bytes,6,rep,name=attestations,proto3" json:"attestations,omitempty" ssz-max:"128"` - Deposits []*v1.Deposit `protobuf:"bytes,7,rep,name=deposits,proto3" json:"deposits,omitempty" ssz-max:"16"` - VoluntaryExits []*v1.SignedVoluntaryExit `protobuf:"bytes,8,rep,name=voluntary_exits,json=voluntaryExits,proto3" json:"voluntary_exits,omitempty" ssz-max:"16"` - SyncAggregate *v1.SyncAggregate `protobuf:"bytes,9,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` - ExecutionPayloadHeader *v11.ExecutionPayloadHeader `protobuf:"bytes,10,opt,name=execution_payload_header,json=executionPayloadHeader,proto3" json:"execution_payload_header,omitempty"` -} - -func (x *BlindedBeaconBlockBodyBellatrix) Reset() { - *x = BlindedBeaconBlockBodyBellatrix{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlindedBeaconBlockBodyBellatrix) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlindedBeaconBlockBodyBellatrix) ProtoMessage() {} - -func (x *BlindedBeaconBlockBodyBellatrix) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlindedBeaconBlockBodyBellatrix.ProtoReflect.Descriptor instead. -func (*BlindedBeaconBlockBodyBellatrix) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{22} -} - -func (x *BlindedBeaconBlockBodyBellatrix) GetRandaoReveal() []byte { - if x != nil { - return x.RandaoReveal - } - return nil -} - -func (x *BlindedBeaconBlockBodyBellatrix) GetEth1Data() *v1.Eth1Data { - if x != nil { - return x.Eth1Data - } - return nil -} - -func (x *BlindedBeaconBlockBodyBellatrix) GetGraffiti() []byte { - if x != nil { - return x.Graffiti - } - return nil -} - -func (x *BlindedBeaconBlockBodyBellatrix) GetProposerSlashings() []*v1.ProposerSlashing { - if x != nil { - return x.ProposerSlashings - } - return nil -} - -func (x *BlindedBeaconBlockBodyBellatrix) GetAttesterSlashings() []*v1.AttesterSlashing { - if x != nil { - return x.AttesterSlashings - } - return nil -} - -func (x *BlindedBeaconBlockBodyBellatrix) GetAttestations() []*v1.Attestation { - if x != nil { - return x.Attestations - } - return nil -} - -func (x *BlindedBeaconBlockBodyBellatrix) GetDeposits() []*v1.Deposit { - if x != nil { - return x.Deposits - } - return nil -} - -func (x *BlindedBeaconBlockBodyBellatrix) GetVoluntaryExits() []*v1.SignedVoluntaryExit { - if x != nil { - return x.VoluntaryExits - } - return nil -} - -func (x *BlindedBeaconBlockBodyBellatrix) GetSyncAggregate() *v1.SyncAggregate { - if x != nil { - return x.SyncAggregate - } - return nil -} - -func (x *BlindedBeaconBlockBodyBellatrix) GetExecutionPayloadHeader() *v11.ExecutionPayloadHeader { - if x != nil { - return x.ExecutionPayloadHeader - } - return nil -} - -type BeaconBlockBodyCapella struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RandaoReveal []byte `protobuf:"bytes,1,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty" ssz-size:"96"` - Eth1Data *v1.Eth1Data `protobuf:"bytes,2,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` - Graffiti []byte `protobuf:"bytes,3,opt,name=graffiti,proto3" json:"graffiti,omitempty" ssz-size:"32"` - ProposerSlashings []*v1.ProposerSlashing `protobuf:"bytes,4,rep,name=proposer_slashings,json=proposerSlashings,proto3" json:"proposer_slashings,omitempty" ssz-max:"16"` - AttesterSlashings []*v1.AttesterSlashing `protobuf:"bytes,5,rep,name=attester_slashings,json=attesterSlashings,proto3" json:"attester_slashings,omitempty" ssz-max:"2"` - Attestations []*v1.Attestation `protobuf:"bytes,6,rep,name=attestations,proto3" json:"attestations,omitempty" ssz-max:"128"` - Deposits []*v1.Deposit `protobuf:"bytes,7,rep,name=deposits,proto3" json:"deposits,omitempty" ssz-max:"16"` - VoluntaryExits []*v1.SignedVoluntaryExit `protobuf:"bytes,8,rep,name=voluntary_exits,json=voluntaryExits,proto3" json:"voluntary_exits,omitempty" ssz-max:"16"` - SyncAggregate *v1.SyncAggregate `protobuf:"bytes,9,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` - ExecutionPayload *v11.ExecutionPayloadCapella `protobuf:"bytes,10,opt,name=execution_payload,json=executionPayload,proto3" json:"execution_payload,omitempty"` - BlsToExecutionChanges []*SignedBLSToExecutionChange `protobuf:"bytes,11,rep,name=bls_to_execution_changes,json=blsToExecutionChanges,proto3" json:"bls_to_execution_changes,omitempty" ssz-max:"16"` -} - -func (x *BeaconBlockBodyCapella) Reset() { - *x = BeaconBlockBodyCapella{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BeaconBlockBodyCapella) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeaconBlockBodyCapella) ProtoMessage() {} - -func (x *BeaconBlockBodyCapella) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeaconBlockBodyCapella.ProtoReflect.Descriptor instead. -func (*BeaconBlockBodyCapella) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{23} -} - -func (x *BeaconBlockBodyCapella) GetRandaoReveal() []byte { - if x != nil { - return x.RandaoReveal - } - return nil -} - -func (x *BeaconBlockBodyCapella) GetEth1Data() *v1.Eth1Data { - if x != nil { - return x.Eth1Data - } - return nil -} - -func (x *BeaconBlockBodyCapella) GetGraffiti() []byte { - if x != nil { - return x.Graffiti - } - return nil -} - -func (x *BeaconBlockBodyCapella) GetProposerSlashings() []*v1.ProposerSlashing { - if x != nil { - return x.ProposerSlashings - } - return nil -} - -func (x *BeaconBlockBodyCapella) GetAttesterSlashings() []*v1.AttesterSlashing { - if x != nil { - return x.AttesterSlashings - } - return nil -} - -func (x *BeaconBlockBodyCapella) GetAttestations() []*v1.Attestation { - if x != nil { - return x.Attestations - } - return nil -} - -func (x *BeaconBlockBodyCapella) GetDeposits() []*v1.Deposit { - if x != nil { - return x.Deposits - } - return nil -} - -func (x *BeaconBlockBodyCapella) GetVoluntaryExits() []*v1.SignedVoluntaryExit { - if x != nil { - return x.VoluntaryExits - } - return nil -} - -func (x *BeaconBlockBodyCapella) GetSyncAggregate() *v1.SyncAggregate { - if x != nil { - return x.SyncAggregate - } - return nil -} - -func (x *BeaconBlockBodyCapella) GetExecutionPayload() *v11.ExecutionPayloadCapella { - if x != nil { - return x.ExecutionPayload - } - return nil -} - -func (x *BeaconBlockBodyCapella) GetBlsToExecutionChanges() []*SignedBLSToExecutionChange { - if x != nil { - return x.BlsToExecutionChanges - } - return nil -} - -type BlindedBeaconBlockBodyCapella struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RandaoReveal []byte `protobuf:"bytes,1,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty" ssz-size:"96"` - Eth1Data *v1.Eth1Data `protobuf:"bytes,2,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` - Graffiti []byte `protobuf:"bytes,3,opt,name=graffiti,proto3" json:"graffiti,omitempty" ssz-size:"32"` - ProposerSlashings []*v1.ProposerSlashing `protobuf:"bytes,4,rep,name=proposer_slashings,json=proposerSlashings,proto3" json:"proposer_slashings,omitempty" ssz-max:"16"` - AttesterSlashings []*v1.AttesterSlashing `protobuf:"bytes,5,rep,name=attester_slashings,json=attesterSlashings,proto3" json:"attester_slashings,omitempty" ssz-max:"2"` - Attestations []*v1.Attestation `protobuf:"bytes,6,rep,name=attestations,proto3" json:"attestations,omitempty" ssz-max:"128"` - Deposits []*v1.Deposit `protobuf:"bytes,7,rep,name=deposits,proto3" json:"deposits,omitempty" ssz-max:"16"` - VoluntaryExits []*v1.SignedVoluntaryExit `protobuf:"bytes,8,rep,name=voluntary_exits,json=voluntaryExits,proto3" json:"voluntary_exits,omitempty" ssz-max:"16"` - SyncAggregate *v1.SyncAggregate `protobuf:"bytes,9,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` - ExecutionPayloadHeader *v11.ExecutionPayloadHeaderCapella `protobuf:"bytes,10,opt,name=execution_payload_header,json=executionPayloadHeader,proto3" json:"execution_payload_header,omitempty"` - BlsToExecutionChanges []*SignedBLSToExecutionChange `protobuf:"bytes,11,rep,name=bls_to_execution_changes,json=blsToExecutionChanges,proto3" json:"bls_to_execution_changes,omitempty" ssz-max:"16"` -} - -func (x *BlindedBeaconBlockBodyCapella) Reset() { - *x = BlindedBeaconBlockBodyCapella{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlindedBeaconBlockBodyCapella) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlindedBeaconBlockBodyCapella) ProtoMessage() {} - -func (x *BlindedBeaconBlockBodyCapella) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlindedBeaconBlockBodyCapella.ProtoReflect.Descriptor instead. -func (*BlindedBeaconBlockBodyCapella) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{24} -} - -func (x *BlindedBeaconBlockBodyCapella) GetRandaoReveal() []byte { - if x != nil { - return x.RandaoReveal - } - return nil -} - -func (x *BlindedBeaconBlockBodyCapella) GetEth1Data() *v1.Eth1Data { - if x != nil { - return x.Eth1Data - } - return nil -} - -func (x *BlindedBeaconBlockBodyCapella) GetGraffiti() []byte { - if x != nil { - return x.Graffiti - } - return nil -} - -func (x *BlindedBeaconBlockBodyCapella) GetProposerSlashings() []*v1.ProposerSlashing { - if x != nil { - return x.ProposerSlashings - } - return nil -} - -func (x *BlindedBeaconBlockBodyCapella) GetAttesterSlashings() []*v1.AttesterSlashing { - if x != nil { - return x.AttesterSlashings - } - return nil -} - -func (x *BlindedBeaconBlockBodyCapella) GetAttestations() []*v1.Attestation { - if x != nil { - return x.Attestations - } - return nil -} - -func (x *BlindedBeaconBlockBodyCapella) GetDeposits() []*v1.Deposit { - if x != nil { - return x.Deposits - } - return nil -} - -func (x *BlindedBeaconBlockBodyCapella) GetVoluntaryExits() []*v1.SignedVoluntaryExit { - if x != nil { - return x.VoluntaryExits - } - return nil -} - -func (x *BlindedBeaconBlockBodyCapella) GetSyncAggregate() *v1.SyncAggregate { - if x != nil { - return x.SyncAggregate - } - return nil -} - -func (x *BlindedBeaconBlockBodyCapella) GetExecutionPayloadHeader() *v11.ExecutionPayloadHeaderCapella { - if x != nil { - return x.ExecutionPayloadHeader - } - return nil -} - -func (x *BlindedBeaconBlockBodyCapella) GetBlsToExecutionChanges() []*SignedBLSToExecutionChange { - if x != nil { - return x.BlsToExecutionChanges - } - return nil -} - -type BlindedBeaconBlockBodyDeneb struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RandaoReveal []byte `protobuf:"bytes,1,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty" ssz-size:"96"` - Eth1Data *v1.Eth1Data `protobuf:"bytes,2,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` - Graffiti []byte `protobuf:"bytes,3,opt,name=graffiti,proto3" json:"graffiti,omitempty" ssz-size:"32"` - ProposerSlashings []*v1.ProposerSlashing `protobuf:"bytes,4,rep,name=proposer_slashings,json=proposerSlashings,proto3" json:"proposer_slashings,omitempty" ssz-max:"16"` - AttesterSlashings []*v1.AttesterSlashing `protobuf:"bytes,5,rep,name=attester_slashings,json=attesterSlashings,proto3" json:"attester_slashings,omitempty" ssz-max:"2"` - Attestations []*v1.Attestation `protobuf:"bytes,6,rep,name=attestations,proto3" json:"attestations,omitempty" ssz-max:"128"` - Deposits []*v1.Deposit `protobuf:"bytes,7,rep,name=deposits,proto3" json:"deposits,omitempty" ssz-max:"16"` - VoluntaryExits []*v1.SignedVoluntaryExit `protobuf:"bytes,8,rep,name=voluntary_exits,json=voluntaryExits,proto3" json:"voluntary_exits,omitempty" ssz-max:"16"` - SyncAggregate *v1.SyncAggregate `protobuf:"bytes,9,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` - ExecutionPayloadHeader *v11.ExecutionPayloadHeaderDeneb `protobuf:"bytes,10,opt,name=execution_payload_header,json=executionPayloadHeader,proto3" json:"execution_payload_header,omitempty"` - BlsToExecutionChanges []*SignedBLSToExecutionChange `protobuf:"bytes,11,rep,name=bls_to_execution_changes,json=blsToExecutionChanges,proto3" json:"bls_to_execution_changes,omitempty" ssz-max:"16"` - BlobKzgCommitments [][]byte `protobuf:"bytes,12,rep,name=blob_kzg_commitments,json=blobKzgCommitments,proto3" json:"blob_kzg_commitments,omitempty" ssz-max:"4096" ssz-size:"?,48"` -} - -func (x *BlindedBeaconBlockBodyDeneb) Reset() { - *x = BlindedBeaconBlockBodyDeneb{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlindedBeaconBlockBodyDeneb) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlindedBeaconBlockBodyDeneb) ProtoMessage() {} - -func (x *BlindedBeaconBlockBodyDeneb) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlindedBeaconBlockBodyDeneb.ProtoReflect.Descriptor instead. -func (*BlindedBeaconBlockBodyDeneb) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{25} -} - -func (x *BlindedBeaconBlockBodyDeneb) GetRandaoReveal() []byte { - if x != nil { - return x.RandaoReveal - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetEth1Data() *v1.Eth1Data { - if x != nil { - return x.Eth1Data - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetGraffiti() []byte { - if x != nil { - return x.Graffiti - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetProposerSlashings() []*v1.ProposerSlashing { - if x != nil { - return x.ProposerSlashings - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetAttesterSlashings() []*v1.AttesterSlashing { - if x != nil { - return x.AttesterSlashings - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetAttestations() []*v1.Attestation { - if x != nil { - return x.Attestations - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetDeposits() []*v1.Deposit { - if x != nil { - return x.Deposits - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetVoluntaryExits() []*v1.SignedVoluntaryExit { - if x != nil { - return x.VoluntaryExits - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetSyncAggregate() *v1.SyncAggregate { - if x != nil { - return x.SyncAggregate - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetExecutionPayloadHeader() *v11.ExecutionPayloadHeaderDeneb { - if x != nil { - return x.ExecutionPayloadHeader - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetBlsToExecutionChanges() []*SignedBLSToExecutionChange { - if x != nil { - return x.BlsToExecutionChanges - } - return nil -} - -func (x *BlindedBeaconBlockBodyDeneb) GetBlobKzgCommitments() [][]byte { - if x != nil { - return x.BlobKzgCommitments - } - return nil -} - -type BeaconBlockBodyDeneb struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RandaoReveal []byte `protobuf:"bytes,1,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty" ssz-size:"96"` - Eth1Data *v1.Eth1Data `protobuf:"bytes,2,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` - Graffiti []byte `protobuf:"bytes,3,opt,name=graffiti,proto3" json:"graffiti,omitempty" ssz-size:"32"` - ProposerSlashings []*v1.ProposerSlashing `protobuf:"bytes,4,rep,name=proposer_slashings,json=proposerSlashings,proto3" json:"proposer_slashings,omitempty" ssz-max:"16"` - AttesterSlashings []*v1.AttesterSlashing `protobuf:"bytes,5,rep,name=attester_slashings,json=attesterSlashings,proto3" json:"attester_slashings,omitempty" ssz-max:"2"` - Attestations []*v1.Attestation `protobuf:"bytes,6,rep,name=attestations,proto3" json:"attestations,omitempty" ssz-max:"128"` - Deposits []*v1.Deposit `protobuf:"bytes,7,rep,name=deposits,proto3" json:"deposits,omitempty" ssz-max:"16"` - VoluntaryExits []*v1.SignedVoluntaryExit `protobuf:"bytes,8,rep,name=voluntary_exits,json=voluntaryExits,proto3" json:"voluntary_exits,omitempty" ssz-max:"16"` - SyncAggregate *v1.SyncAggregate `protobuf:"bytes,9,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` - ExecutionPayload *v11.ExecutionPayloadDeneb `protobuf:"bytes,10,opt,name=execution_payload,json=executionPayload,proto3" json:"execution_payload,omitempty"` - BlsToExecutionChanges []*SignedBLSToExecutionChange `protobuf:"bytes,11,rep,name=bls_to_execution_changes,json=blsToExecutionChanges,proto3" json:"bls_to_execution_changes,omitempty" ssz-max:"16"` - BlobKzgCommitments [][]byte `protobuf:"bytes,12,rep,name=blob_kzg_commitments,json=blobKzgCommitments,proto3" json:"blob_kzg_commitments,omitempty" ssz-max:"4096" ssz-size:"?,48"` -} - -func (x *BeaconBlockBodyDeneb) Reset() { - *x = BeaconBlockBodyDeneb{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BeaconBlockBodyDeneb) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeaconBlockBodyDeneb) ProtoMessage() {} - -func (x *BeaconBlockBodyDeneb) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeaconBlockBodyDeneb.ProtoReflect.Descriptor instead. -func (*BeaconBlockBodyDeneb) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{26} -} - -func (x *BeaconBlockBodyDeneb) GetRandaoReveal() []byte { - if x != nil { - return x.RandaoReveal - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetEth1Data() *v1.Eth1Data { - if x != nil { - return x.Eth1Data - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetGraffiti() []byte { - if x != nil { - return x.Graffiti - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetProposerSlashings() []*v1.ProposerSlashing { - if x != nil { - return x.ProposerSlashings - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetAttesterSlashings() []*v1.AttesterSlashing { - if x != nil { - return x.AttesterSlashings - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetAttestations() []*v1.Attestation { - if x != nil { - return x.Attestations - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetDeposits() []*v1.Deposit { - if x != nil { - return x.Deposits - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetVoluntaryExits() []*v1.SignedVoluntaryExit { - if x != nil { - return x.VoluntaryExits - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetSyncAggregate() *v1.SyncAggregate { - if x != nil { - return x.SyncAggregate - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetExecutionPayload() *v11.ExecutionPayloadDeneb { - if x != nil { - return x.ExecutionPayload - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetBlsToExecutionChanges() []*SignedBLSToExecutionChange { - if x != nil { - return x.BlsToExecutionChanges - } - return nil -} - -func (x *BeaconBlockBodyDeneb) GetBlobKzgCommitments() [][]byte { - if x != nil { - return x.BlobKzgCommitments - } - return nil -} - -type SignedBeaconBlockContentsDeneb struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SignedBlock *SignedBeaconBlockDeneb `protobuf:"bytes,1,opt,name=signed_block,json=signedBlock,proto3" json:"signed_block,omitempty"` - KzgProofs [][]byte `protobuf:"bytes,2,rep,name=kzg_proofs,json=kzgProofs,proto3" json:"kzg_proofs,omitempty" ssz-max:"4096" ssz-size:"?,48"` - Blobs [][]byte `protobuf:"bytes,3,rep,name=blobs,proto3" json:"blobs,omitempty" ssz-max:"4096" ssz-size:"?,131072"` -} - -func (x *SignedBeaconBlockContentsDeneb) Reset() { - *x = SignedBeaconBlockContentsDeneb{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBeaconBlockContentsDeneb) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBeaconBlockContentsDeneb) ProtoMessage() {} - -func (x *SignedBeaconBlockContentsDeneb) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBeaconBlockContentsDeneb.ProtoReflect.Descriptor instead. -func (*SignedBeaconBlockContentsDeneb) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{27} -} - -func (x *SignedBeaconBlockContentsDeneb) GetSignedBlock() *SignedBeaconBlockDeneb { - if x != nil { - return x.SignedBlock - } - return nil -} - -func (x *SignedBeaconBlockContentsDeneb) GetKzgProofs() [][]byte { - if x != nil { - return x.KzgProofs - } - return nil -} - -func (x *SignedBeaconBlockContentsDeneb) GetBlobs() [][]byte { - if x != nil { - return x.Blobs - } - return nil -} - -type BeaconBlockContentsDeneb struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Block *BeaconBlockDeneb `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` - KzgProofs [][]byte `protobuf:"bytes,2,rep,name=kzg_proofs,json=kzgProofs,proto3" json:"kzg_proofs,omitempty" ssz-max:"4096" ssz-size:"?,48"` - Blobs [][]byte `protobuf:"bytes,3,rep,name=blobs,proto3" json:"blobs,omitempty" ssz-max:"4096" ssz-size:"?,131072"` -} - -func (x *BeaconBlockContentsDeneb) Reset() { - *x = BeaconBlockContentsDeneb{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BeaconBlockContentsDeneb) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeaconBlockContentsDeneb) ProtoMessage() {} - -func (x *BeaconBlockContentsDeneb) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeaconBlockContentsDeneb.ProtoReflect.Descriptor instead. -func (*BeaconBlockContentsDeneb) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{28} -} - -func (x *BeaconBlockContentsDeneb) GetBlock() *BeaconBlockDeneb { - if x != nil { - return x.Block - } - return nil -} - -func (x *BeaconBlockContentsDeneb) GetKzgProofs() [][]byte { - if x != nil { - return x.KzgProofs - } - return nil -} - -func (x *BeaconBlockContentsDeneb) GetBlobs() [][]byte { - if x != nil { - return x.Blobs - } - return nil -} - -type BlobIdentifier struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - BlockRoot []byte `protobuf:"bytes,1,opt,name=block_root,json=blockRoot,proto3" json:"block_root,omitempty" ssz-size:"32"` - Index uint64 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` -} - -func (x *BlobIdentifier) Reset() { - *x = BlobIdentifier{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlobIdentifier) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlobIdentifier) ProtoMessage() {} - -func (x *BlobIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_block_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlobIdentifier.ProtoReflect.Descriptor instead. -func (*BlobIdentifier) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_block_proto_rawDescGZIP(), []int{29} -} - -func (x *BlobIdentifier) GetBlockRoot() []byte { - if x != nil { - return x.BlockRoot - } - return nil -} - -func (x *BlobIdentifier) GetIndex() uint64 { - if x != nil { - return x.Index - } - return 0 -} - -var File_proto_eth_v2_beacon_block_proto protoreflect.FileDescriptor - -var file_proto_eth_v2_beacon_block_proto_rawDesc = []byte{ - 0x0a, 0x1f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x62, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x32, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x65, 0x78, - 0x74, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x74, - 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x77, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x26, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x76, - 0x31, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9f, 0x03, 0x0a, 0x16, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x68, 0x61, 0x73, 0x65, - 0x30, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x47, 0x0a, 0x0c, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, - 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, - 0x48, 0x00, 0x52, 0x0b, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x50, 0x0a, 0x0f, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, - 0x00, 0x52, 0x0e, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0x4a, 0x0a, 0x0d, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x48, 0x00, 0x52, - 0x0c, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x52, 0x0a, - 0x0e, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6e, 0x65, 0x62, - 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x42, 0x07, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xbd, 0x03, 0x0a, 0x1a, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x68, 0x61, - 0x73, 0x65, 0x30, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, - 0x0b, 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x47, 0x0a, 0x0c, - 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x50, 0x0a, 0x0f, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, - 0x69, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, - 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, - 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, - 0x69, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4a, 0x0a, 0x0d, 0x63, 0x61, 0x70, 0x65, 0x6c, - 0x6c, 0x61, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, - 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, - 0x6c, 0x6c, 0x61, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x44, 0x0a, 0x0b, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x48, 0x00, 0x52, 0x0a, 0x64, - 0x65, 0x6e, 0x65, 0x62, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, - 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, - 0x09, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcb, 0x03, 0x0a, 0x22, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x12, 0x47, 0x0a, 0x0c, 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x5f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0b, 0x70, - 0x68, 0x61, 0x73, 0x65, 0x30, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4d, 0x0a, 0x0c, 0x61, 0x6c, - 0x74, 0x61, 0x69, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x6c, - 0x74, 0x61, 0x69, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x56, 0x0a, 0x0f, 0x62, 0x65, 0x6c, - 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, - 0x00, 0x52, 0x0e, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, - 0x6c, 0x6c, 0x61, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x58, 0x0a, 0x0e, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x48, 0x00, 0x52, 0x0d, - 0x64, 0x65, 0x6e, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x09, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xab, 0x03, 0x0a, 0x1b, 0x42, 0x6c, 0x69, - 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x68, 0x61, 0x73, - 0x65, 0x30, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0b, - 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x47, 0x0a, 0x0c, 0x61, - 0x6c, 0x74, 0x61, 0x69, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, - 0x6c, 0x74, 0x61, 0x69, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x57, 0x0a, 0x0f, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, - 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, - 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, 0x00, 0x52, 0x0e, 0x62, - 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x51, 0x0a, - 0x0d, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, - 0x48, 0x00, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x4b, 0x0a, 0x0b, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x48, - 0x00, 0x52, 0x0a, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x07, 0x0a, - 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xd9, 0x03, 0x0a, 0x21, 0x53, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, - 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x48, 0x00, 0x52, 0x0b, 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x47, 0x0a, 0x0c, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x6c, 0x74, - 0x61, 0x69, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x57, 0x0a, 0x0f, 0x62, 0x65, 0x6c, 0x6c, - 0x61, 0x74, 0x72, 0x69, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, - 0x00, 0x52, 0x0e, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, - 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, - 0x65, 0x6c, 0x6c, 0x61, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4b, 0x0a, 0x0b, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, - 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, - 0x6e, 0x65, 0x62, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0xd9, 0x03, 0x0a, 0x29, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x69, - 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x12, 0x47, 0x0a, 0x0c, 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x68, - 0x61, 0x73, 0x65, 0x30, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4d, 0x0a, 0x0c, 0x61, 0x6c, 0x74, - 0x61, 0x69, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x6c, 0x74, - 0x61, 0x69, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x5d, 0x0a, 0x0f, 0x62, 0x65, 0x6c, 0x6c, - 0x61, 0x74, 0x72, 0x69, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x32, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, - 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, - 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, - 0x69, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x57, 0x0a, 0x0d, 0x63, 0x61, 0x70, 0x65, 0x6c, - 0x6c, 0x61, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, - 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, - 0x48, 0x00, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x51, 0x0a, 0x0b, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, - 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x44, 0x65, 0x6e, 0x65, 0x62, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x42, 0x09, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x7d, - 0x0a, 0x17, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x12, 0x3c, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, - 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x83, 0x01, - 0x0a, 0x1a, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x3f, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, 0x61, - 0x74, 0x72, 0x69, 0x78, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x22, 0x7f, 0x0a, 0x18, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, - 0x3d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, - 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, - 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x22, 0x7b, 0x0a, 0x16, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x3b, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x6e, - 0x65, 0x62, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, - 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x22, 0x91, 0x01, 0x0a, 0x21, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x69, 0x6e, - 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, - 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x46, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, - 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, - 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x1f, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, 0x44, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, - 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, - 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x89, 0x01, 0x0a, 0x1d, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x42, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, - 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x6e, - 0x65, 0x62, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, - 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x11, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, - 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, - 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, - 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, - 0x6f, 0x74, 0x12, 0x76, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, - 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, - 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0d, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0b, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, - 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, - 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x62, 0x6f, - 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, - 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xf8, 0x02, 0x0a, 0x14, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, - 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, - 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, - 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, - 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, - 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x76, 0x0a, 0x0e, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, - 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, - 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, - 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, - 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, - 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, - 0x6f, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, - 0x64, 0x79, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x52, 0x04, 0x62, 0x6f, 0x64, - 0x79, 0x22, 0x86, 0x03, 0x0a, 0x1b, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, - 0x78, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, - 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, - 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, - 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, - 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x76, 0x0a, 0x0e, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, - 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, - 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, - 0x32, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, - 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x44, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x42, 0x65, 0x6c, 0x6c, 0x61, - 0x74, 0x72, 0x69, 0x78, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xf4, 0x02, 0x0a, 0x12, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, - 0x61, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, - 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, - 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, - 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, - 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x76, 0x0a, 0x0e, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, - 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, - 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, - 0x32, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, - 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x42, 0x6f, 0x64, 0x79, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x52, 0x04, 0x62, 0x6f, 0x64, - 0x79, 0x22, 0x82, 0x03, 0x0a, 0x19, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, - 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, - 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, - 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, - 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, - 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x76, 0x0a, 0x0e, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, - 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, - 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, - 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, - 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, - 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, - 0x6f, 0x74, 0x12, 0x42, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, - 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xf0, 0x02, 0x0a, 0x10, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x59, 0x0a, 0x04, 0x73, - 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, - 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, - 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x76, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, - 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, - 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0a, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, - 0x02, 0x33, 0x32, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x39, - 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x44, 0x65, - 0x6e, 0x65, 0x62, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xfe, 0x02, 0x0a, 0x17, 0x42, 0x6c, - 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, - 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, - 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, - 0x12, 0x76, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, - 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, - 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, - 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, - 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6f, - 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x09, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x44, - 0x65, 0x6e, 0x65, 0x62, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xfa, 0x04, 0x0a, 0x15, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x41, 0x6c, - 0x74, 0x61, 0x69, 0x72, 0x12, 0x2b, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, - 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, - 0x02, 0x39, 0x36, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, - 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x65, 0x74, 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x65, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, - 0x02, 0x33, 0x32, 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, 0x58, 0x0a, - 0x12, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x06, 0x92, 0xb5, - 0x18, 0x02, 0x31, 0x36, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, - 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x61, 0x74, 0x74, 0x65, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, - 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x05, 0x92, 0xb5, 0x18, 0x01, 0x32, 0x52, 0x11, 0x61, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x49, 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x92, 0xb5, 0x18, 0x03, 0x31, 0x32, 0x38, 0x52, 0x0c, 0x61, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x64, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, - 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x55, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, - 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, - 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, - 0x52, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x73, - 0x12, 0x45, 0x0a, 0x0e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x41, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x22, 0xd0, 0x05, 0x0a, 0x18, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x42, 0x65, 0x6c, 0x6c, 0x61, - 0x74, 0x72, 0x69, 0x78, 0x12, 0x2b, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, - 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, - 0x02, 0x39, 0x36, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, - 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x65, 0x74, 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x65, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, - 0x02, 0x33, 0x32, 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, 0x58, 0x0a, - 0x12, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x06, 0x92, 0xb5, - 0x18, 0x02, 0x31, 0x36, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, - 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x61, 0x74, 0x74, 0x65, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, - 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x05, 0x92, 0xb5, 0x18, 0x01, 0x32, 0x52, 0x11, 0x61, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x49, 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x92, 0xb5, 0x18, 0x03, 0x31, 0x32, 0x38, 0x52, 0x0c, 0x61, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x64, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, - 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x55, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, - 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, - 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, - 0x52, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x73, - 0x12, 0x45, 0x0a, 0x0e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x41, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x51, 0x0a, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x10, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xea, 0x05, 0x0a, 0x1f, 0x42, - 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x2b, - 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x0c, 0x72, - 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x65, - 0x74, 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x65, 0x74, 0x68, 0x31, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x08, 0x67, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, 0x58, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, - 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x11, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, - 0x73, 0x12, 0x57, 0x0a, 0x12, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, - 0x42, 0x05, 0x92, 0xb5, 0x18, 0x01, 0x32, 0x52, 0x11, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, - 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x61, 0x74, - 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, - 0x92, 0xb5, 0x18, 0x03, 0x31, 0x32, 0x38, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x73, 0x12, 0x55, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, - 0x5f, 0x65, 0x78, 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, - 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x0e, 0x76, 0x6f, 0x6c, 0x75, - 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x73, 0x79, - 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x12, 0x64, 0x0a, 0x18, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, - 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0xc3, 0x06, 0x0a, 0x16, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x43, 0x61, 0x70, 0x65, 0x6c, - 0x6c, 0x61, 0x12, 0x2b, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, 0x65, 0x76, - 0x65, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, - 0x36, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, - 0x36, 0x0a, 0x09, 0x65, 0x74, 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x65, - 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, - 0x32, 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, 0x58, 0x0a, 0x12, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, - 0x31, 0x36, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, - 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, - 0x68, 0x69, 0x6e, 0x67, 0x42, 0x05, 0x92, 0xb5, 0x18, 0x01, 0x32, 0x52, 0x11, 0x61, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x49, - 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x07, 0x92, 0xb5, 0x18, 0x03, 0x31, 0x32, 0x38, 0x52, 0x0c, 0x61, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x64, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x08, 0x64, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x55, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, - 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, - 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x0e, - 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x73, 0x12, 0x45, - 0x0a, 0x0e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, - 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x52, 0x10, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x6c, 0x0a, 0x18, 0x62, 0x6c, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x4c, 0x53, 0x54, 0x6f, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x06, - 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x15, 0x62, 0x6c, 0x73, 0x54, 0x6f, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xdd, 0x06, - 0x0a, 0x1d, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, - 0x2b, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x0c, - 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x36, 0x0a, 0x09, - 0x65, 0x74, 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x65, 0x74, 0x68, 0x31, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x08, - 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, 0x58, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, - 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, - 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, - 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, - 0x67, 0x42, 0x05, 0x92, 0xb5, 0x18, 0x01, 0x32, 0x52, 0x11, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, - 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x61, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x07, 0x92, 0xb5, 0x18, 0x03, 0x31, 0x32, 0x38, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x73, 0x12, 0x55, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, - 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, - 0x78, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x0e, 0x76, 0x6f, 0x6c, - 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x73, - 0x79, 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x12, 0x6b, 0x0a, 0x18, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x52, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x6c, 0x0a, 0x18, 0x62, 0x6c, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x4c, 0x53, 0x54, 0x6f, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x06, - 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x15, 0x62, 0x6c, 0x73, 0x54, 0x6f, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x9d, 0x07, - 0x0a, 0x1b, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x2b, 0x0a, - 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x0c, 0x72, 0x61, - 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x65, 0x74, - 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x65, 0x74, 0x68, 0x31, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x08, 0x67, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, 0x58, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, - 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x11, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x57, 0x0a, 0x12, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, - 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, - 0x05, 0x92, 0xb5, 0x18, 0x01, 0x32, 0x52, 0x11, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, - 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x61, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x92, - 0xb5, 0x18, 0x03, 0x31, 0x32, 0x38, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x73, 0x12, 0x55, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, - 0x65, 0x78, 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, - 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6e, - 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x73, 0x79, 0x6e, - 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x12, 0x69, 0x0a, 0x18, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x44, 0x65, - 0x6e, 0x65, 0x62, 0x52, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x6c, 0x0a, 0x18, 0x62, - 0x6c, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x4c, 0x53, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, - 0x31, 0x36, 0x52, 0x15, 0x62, 0x6c, 0x73, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x62, 0x6c, 0x6f, - 0x62, 0x5f, 0x6b, 0x7a, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, - 0x38, 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x12, 0x62, 0x6c, 0x6f, 0x62, 0x4b, - 0x7a, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x83, 0x07, - 0x0a, 0x14, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, - 0x79, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x2b, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, - 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, - 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, - 0x65, 0x61, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x65, 0x74, 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x65, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, 0x67, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, - 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, - 0x58, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, - 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x06, - 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, - 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x61, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, - 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x05, 0x92, 0xb5, 0x18, 0x01, 0x32, 0x52, - 0x11, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x92, 0xb5, 0x18, 0x03, 0x31, 0x32, 0x38, 0x52, - 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, - 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, - 0x36, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x55, 0x0a, 0x0f, 0x76, - 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, - 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, - 0x31, 0x36, 0x52, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, - 0x74, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x79, 0x6e, - 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, - 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x11, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x52, - 0x10, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x6c, 0x0a, 0x18, 0x62, 0x6c, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x0b, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x4c, 0x53, 0x54, - 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x15, 0x62, 0x6c, 0x73, 0x54, 0x6f, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, - 0x42, 0x0a, 0x14, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x6b, 0x7a, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x10, 0x8a, - 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, - 0x12, 0x62, 0x6c, 0x6f, 0x62, 0x4b, 0x7a, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x4a, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x44, 0x65, 0x6e, 0x65, 0x62, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x12, 0x2f, 0x0a, 0x0a, 0x6b, 0x7a, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, - 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x09, 0x6b, 0x7a, 0x67, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0c, 0x42, 0x14, 0x8a, 0xb5, 0x18, 0x08, 0x3f, 0x2c, 0x31, 0x33, 0x31, 0x30, 0x37, 0x32, - 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x22, - 0xb0, 0x01, 0x0a, 0x18, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x37, 0x0a, 0x05, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x52, 0x05, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2f, 0x0a, 0x0a, 0x6b, 0x7a, 0x67, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x04, 0x3f, - 0x2c, 0x34, 0x38, 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x09, 0x6b, 0x7a, 0x67, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x14, 0x8a, 0xb5, 0x18, 0x08, 0x3f, 0x2c, 0x31, 0x33, 0x31, - 0x30, 0x37, 0x32, 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x05, 0x62, 0x6c, 0x6f, - 0x62, 0x73, 0x22, 0x4d, 0x0a, 0x0e, 0x42, 0x6c, 0x6f, 0x62, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x6f, - 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, - 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x42, 0x83, 0x01, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x42, 0x12, 0x53, 0x79, 0x6e, 0x63, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, - 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, - 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x3b, - 0x65, 0x74, 0x68, 0xaa, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, - 0x74, 0x68, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x5c, 0x45, 0x74, 0x68, 0x5c, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_proto_eth_v2_beacon_block_proto_rawDescOnce sync.Once - file_proto_eth_v2_beacon_block_proto_rawDescData = file_proto_eth_v2_beacon_block_proto_rawDesc -) - -func file_proto_eth_v2_beacon_block_proto_rawDescGZIP() []byte { - file_proto_eth_v2_beacon_block_proto_rawDescOnce.Do(func() { - file_proto_eth_v2_beacon_block_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_eth_v2_beacon_block_proto_rawDescData) - }) - return file_proto_eth_v2_beacon_block_proto_rawDescData -} - -var file_proto_eth_v2_beacon_block_proto_msgTypes = make([]protoimpl.MessageInfo, 30) -var file_proto_eth_v2_beacon_block_proto_goTypes = []interface{}{ - (*BeaconBlockContainerV2)(nil), // 0: ethereum.eth.v2.BeaconBlockContainerV2 - (*SignedBeaconBlockContainer)(nil), // 1: ethereum.eth.v2.SignedBeaconBlockContainer - (*SignedBeaconBlockContentsContainer)(nil), // 2: ethereum.eth.v2.SignedBeaconBlockContentsContainer - (*BlindedBeaconBlockContainer)(nil), // 3: ethereum.eth.v2.BlindedBeaconBlockContainer - (*SignedBlindedBeaconBlockContainer)(nil), // 4: ethereum.eth.v2.SignedBlindedBeaconBlockContainer - (*SignedBlindedBeaconBlockContentsContainer)(nil), // 5: ethereum.eth.v2.SignedBlindedBeaconBlockContentsContainer - (*SignedBeaconBlockAltair)(nil), // 6: ethereum.eth.v2.SignedBeaconBlockAltair - (*SignedBeaconBlockBellatrix)(nil), // 7: ethereum.eth.v2.SignedBeaconBlockBellatrix - (*SignedBeaconBlockCapella)(nil), // 8: ethereum.eth.v2.SignedBeaconBlockCapella - (*SignedBeaconBlockDeneb)(nil), // 9: ethereum.eth.v2.SignedBeaconBlockDeneb - (*SignedBlindedBeaconBlockBellatrix)(nil), // 10: ethereum.eth.v2.SignedBlindedBeaconBlockBellatrix - (*SignedBlindedBeaconBlockCapella)(nil), // 11: ethereum.eth.v2.SignedBlindedBeaconBlockCapella - (*SignedBlindedBeaconBlockDeneb)(nil), // 12: ethereum.eth.v2.SignedBlindedBeaconBlockDeneb - (*BeaconBlockAltair)(nil), // 13: ethereum.eth.v2.BeaconBlockAltair - (*BeaconBlockBellatrix)(nil), // 14: ethereum.eth.v2.BeaconBlockBellatrix - (*BlindedBeaconBlockBellatrix)(nil), // 15: ethereum.eth.v2.BlindedBeaconBlockBellatrix - (*BeaconBlockCapella)(nil), // 16: ethereum.eth.v2.BeaconBlockCapella - (*BlindedBeaconBlockCapella)(nil), // 17: ethereum.eth.v2.BlindedBeaconBlockCapella - (*BeaconBlockDeneb)(nil), // 18: ethereum.eth.v2.BeaconBlockDeneb - (*BlindedBeaconBlockDeneb)(nil), // 19: ethereum.eth.v2.BlindedBeaconBlockDeneb - (*BeaconBlockBodyAltair)(nil), // 20: ethereum.eth.v2.BeaconBlockBodyAltair - (*BeaconBlockBodyBellatrix)(nil), // 21: ethereum.eth.v2.BeaconBlockBodyBellatrix - (*BlindedBeaconBlockBodyBellatrix)(nil), // 22: ethereum.eth.v2.BlindedBeaconBlockBodyBellatrix - (*BeaconBlockBodyCapella)(nil), // 23: ethereum.eth.v2.BeaconBlockBodyCapella - (*BlindedBeaconBlockBodyCapella)(nil), // 24: ethereum.eth.v2.BlindedBeaconBlockBodyCapella - (*BlindedBeaconBlockBodyDeneb)(nil), // 25: ethereum.eth.v2.BlindedBeaconBlockBodyDeneb - (*BeaconBlockBodyDeneb)(nil), // 26: ethereum.eth.v2.BeaconBlockBodyDeneb - (*SignedBeaconBlockContentsDeneb)(nil), // 27: ethereum.eth.v2.SignedBeaconBlockContentsDeneb - (*BeaconBlockContentsDeneb)(nil), // 28: ethereum.eth.v2.BeaconBlockContentsDeneb - (*BlobIdentifier)(nil), // 29: ethereum.eth.v2.BlobIdentifier - (*v1.BeaconBlock)(nil), // 30: ethereum.eth.v1.BeaconBlock - (*v1.SignedBeaconBlock)(nil), // 31: ethereum.eth.v1.SignedBeaconBlock - (*v1.Eth1Data)(nil), // 32: ethereum.eth.v1.Eth1Data - (*v1.ProposerSlashing)(nil), // 33: ethereum.eth.v1.ProposerSlashing - (*v1.AttesterSlashing)(nil), // 34: ethereum.eth.v1.AttesterSlashing - (*v1.Attestation)(nil), // 35: ethereum.eth.v1.Attestation - (*v1.Deposit)(nil), // 36: ethereum.eth.v1.Deposit - (*v1.SignedVoluntaryExit)(nil), // 37: ethereum.eth.v1.SignedVoluntaryExit - (*v1.SyncAggregate)(nil), // 38: ethereum.eth.v1.SyncAggregate - (*v11.ExecutionPayload)(nil), // 39: ethereum.engine.v1.ExecutionPayload - (*v11.ExecutionPayloadHeader)(nil), // 40: ethereum.engine.v1.ExecutionPayloadHeader - (*v11.ExecutionPayloadCapella)(nil), // 41: ethereum.engine.v1.ExecutionPayloadCapella - (*SignedBLSToExecutionChange)(nil), // 42: ethereum.eth.v2.SignedBLSToExecutionChange - (*v11.ExecutionPayloadHeaderCapella)(nil), // 43: ethereum.engine.v1.ExecutionPayloadHeaderCapella - (*v11.ExecutionPayloadHeaderDeneb)(nil), // 44: ethereum.engine.v1.ExecutionPayloadHeaderDeneb - (*v11.ExecutionPayloadDeneb)(nil), // 45: ethereum.engine.v1.ExecutionPayloadDeneb -} -var file_proto_eth_v2_beacon_block_proto_depIdxs = []int32{ - 30, // 0: ethereum.eth.v2.BeaconBlockContainerV2.phase0_block:type_name -> ethereum.eth.v1.BeaconBlock - 13, // 1: ethereum.eth.v2.BeaconBlockContainerV2.altair_block:type_name -> ethereum.eth.v2.BeaconBlockAltair - 14, // 2: ethereum.eth.v2.BeaconBlockContainerV2.bellatrix_block:type_name -> ethereum.eth.v2.BeaconBlockBellatrix - 16, // 3: ethereum.eth.v2.BeaconBlockContainerV2.capella_block:type_name -> ethereum.eth.v2.BeaconBlockCapella - 28, // 4: ethereum.eth.v2.BeaconBlockContainerV2.deneb_contents:type_name -> ethereum.eth.v2.BeaconBlockContentsDeneb - 30, // 5: ethereum.eth.v2.SignedBeaconBlockContainer.phase0_block:type_name -> ethereum.eth.v1.BeaconBlock - 13, // 6: ethereum.eth.v2.SignedBeaconBlockContainer.altair_block:type_name -> ethereum.eth.v2.BeaconBlockAltair - 14, // 7: ethereum.eth.v2.SignedBeaconBlockContainer.bellatrix_block:type_name -> ethereum.eth.v2.BeaconBlockBellatrix - 16, // 8: ethereum.eth.v2.SignedBeaconBlockContainer.capella_block:type_name -> ethereum.eth.v2.BeaconBlockCapella - 18, // 9: ethereum.eth.v2.SignedBeaconBlockContainer.deneb_block:type_name -> ethereum.eth.v2.BeaconBlockDeneb - 31, // 10: ethereum.eth.v2.SignedBeaconBlockContentsContainer.phase0_block:type_name -> ethereum.eth.v1.SignedBeaconBlock - 6, // 11: ethereum.eth.v2.SignedBeaconBlockContentsContainer.altair_block:type_name -> ethereum.eth.v2.SignedBeaconBlockAltair - 7, // 12: ethereum.eth.v2.SignedBeaconBlockContentsContainer.bellatrix_block:type_name -> ethereum.eth.v2.SignedBeaconBlockBellatrix - 8, // 13: ethereum.eth.v2.SignedBeaconBlockContentsContainer.capella_block:type_name -> ethereum.eth.v2.SignedBeaconBlockCapella - 27, // 14: ethereum.eth.v2.SignedBeaconBlockContentsContainer.deneb_contents:type_name -> ethereum.eth.v2.SignedBeaconBlockContentsDeneb - 30, // 15: ethereum.eth.v2.BlindedBeaconBlockContainer.phase0_block:type_name -> ethereum.eth.v1.BeaconBlock - 13, // 16: ethereum.eth.v2.BlindedBeaconBlockContainer.altair_block:type_name -> ethereum.eth.v2.BeaconBlockAltair - 15, // 17: ethereum.eth.v2.BlindedBeaconBlockContainer.bellatrix_block:type_name -> ethereum.eth.v2.BlindedBeaconBlockBellatrix - 17, // 18: ethereum.eth.v2.BlindedBeaconBlockContainer.capella_block:type_name -> ethereum.eth.v2.BlindedBeaconBlockCapella - 19, // 19: ethereum.eth.v2.BlindedBeaconBlockContainer.deneb_block:type_name -> ethereum.eth.v2.BlindedBeaconBlockDeneb - 30, // 20: ethereum.eth.v2.SignedBlindedBeaconBlockContainer.phase0_block:type_name -> ethereum.eth.v1.BeaconBlock - 13, // 21: ethereum.eth.v2.SignedBlindedBeaconBlockContainer.altair_block:type_name -> ethereum.eth.v2.BeaconBlockAltair - 15, // 22: ethereum.eth.v2.SignedBlindedBeaconBlockContainer.bellatrix_block:type_name -> ethereum.eth.v2.BlindedBeaconBlockBellatrix - 17, // 23: ethereum.eth.v2.SignedBlindedBeaconBlockContainer.capella_block:type_name -> ethereum.eth.v2.BlindedBeaconBlockCapella - 19, // 24: ethereum.eth.v2.SignedBlindedBeaconBlockContainer.deneb_block:type_name -> ethereum.eth.v2.BlindedBeaconBlockDeneb - 31, // 25: ethereum.eth.v2.SignedBlindedBeaconBlockContentsContainer.phase0_block:type_name -> ethereum.eth.v1.SignedBeaconBlock - 6, // 26: ethereum.eth.v2.SignedBlindedBeaconBlockContentsContainer.altair_block:type_name -> ethereum.eth.v2.SignedBeaconBlockAltair - 10, // 27: ethereum.eth.v2.SignedBlindedBeaconBlockContentsContainer.bellatrix_block:type_name -> ethereum.eth.v2.SignedBlindedBeaconBlockBellatrix - 11, // 28: ethereum.eth.v2.SignedBlindedBeaconBlockContentsContainer.capella_block:type_name -> ethereum.eth.v2.SignedBlindedBeaconBlockCapella - 12, // 29: ethereum.eth.v2.SignedBlindedBeaconBlockContentsContainer.deneb_block:type_name -> ethereum.eth.v2.SignedBlindedBeaconBlockDeneb - 13, // 30: ethereum.eth.v2.SignedBeaconBlockAltair.message:type_name -> ethereum.eth.v2.BeaconBlockAltair - 14, // 31: ethereum.eth.v2.SignedBeaconBlockBellatrix.message:type_name -> ethereum.eth.v2.BeaconBlockBellatrix - 16, // 32: ethereum.eth.v2.SignedBeaconBlockCapella.message:type_name -> ethereum.eth.v2.BeaconBlockCapella - 18, // 33: ethereum.eth.v2.SignedBeaconBlockDeneb.message:type_name -> ethereum.eth.v2.BeaconBlockDeneb - 15, // 34: ethereum.eth.v2.SignedBlindedBeaconBlockBellatrix.message:type_name -> ethereum.eth.v2.BlindedBeaconBlockBellatrix - 17, // 35: ethereum.eth.v2.SignedBlindedBeaconBlockCapella.message:type_name -> ethereum.eth.v2.BlindedBeaconBlockCapella - 19, // 36: ethereum.eth.v2.SignedBlindedBeaconBlockDeneb.message:type_name -> ethereum.eth.v2.BlindedBeaconBlockDeneb - 20, // 37: ethereum.eth.v2.BeaconBlockAltair.body:type_name -> ethereum.eth.v2.BeaconBlockBodyAltair - 21, // 38: ethereum.eth.v2.BeaconBlockBellatrix.body:type_name -> ethereum.eth.v2.BeaconBlockBodyBellatrix - 22, // 39: ethereum.eth.v2.BlindedBeaconBlockBellatrix.body:type_name -> ethereum.eth.v2.BlindedBeaconBlockBodyBellatrix - 23, // 40: ethereum.eth.v2.BeaconBlockCapella.body:type_name -> ethereum.eth.v2.BeaconBlockBodyCapella - 24, // 41: ethereum.eth.v2.BlindedBeaconBlockCapella.body:type_name -> ethereum.eth.v2.BlindedBeaconBlockBodyCapella - 26, // 42: ethereum.eth.v2.BeaconBlockDeneb.body:type_name -> ethereum.eth.v2.BeaconBlockBodyDeneb - 25, // 43: ethereum.eth.v2.BlindedBeaconBlockDeneb.body:type_name -> ethereum.eth.v2.BlindedBeaconBlockBodyDeneb - 32, // 44: ethereum.eth.v2.BeaconBlockBodyAltair.eth1_data:type_name -> ethereum.eth.v1.Eth1Data - 33, // 45: ethereum.eth.v2.BeaconBlockBodyAltair.proposer_slashings:type_name -> ethereum.eth.v1.ProposerSlashing - 34, // 46: ethereum.eth.v2.BeaconBlockBodyAltair.attester_slashings:type_name -> ethereum.eth.v1.AttesterSlashing - 35, // 47: ethereum.eth.v2.BeaconBlockBodyAltair.attestations:type_name -> ethereum.eth.v1.Attestation - 36, // 48: ethereum.eth.v2.BeaconBlockBodyAltair.deposits:type_name -> ethereum.eth.v1.Deposit - 37, // 49: ethereum.eth.v2.BeaconBlockBodyAltair.voluntary_exits:type_name -> ethereum.eth.v1.SignedVoluntaryExit - 38, // 50: ethereum.eth.v2.BeaconBlockBodyAltair.sync_aggregate:type_name -> ethereum.eth.v1.SyncAggregate - 32, // 51: ethereum.eth.v2.BeaconBlockBodyBellatrix.eth1_data:type_name -> ethereum.eth.v1.Eth1Data - 33, // 52: ethereum.eth.v2.BeaconBlockBodyBellatrix.proposer_slashings:type_name -> ethereum.eth.v1.ProposerSlashing - 34, // 53: ethereum.eth.v2.BeaconBlockBodyBellatrix.attester_slashings:type_name -> ethereum.eth.v1.AttesterSlashing - 35, // 54: ethereum.eth.v2.BeaconBlockBodyBellatrix.attestations:type_name -> ethereum.eth.v1.Attestation - 36, // 55: ethereum.eth.v2.BeaconBlockBodyBellatrix.deposits:type_name -> ethereum.eth.v1.Deposit - 37, // 56: ethereum.eth.v2.BeaconBlockBodyBellatrix.voluntary_exits:type_name -> ethereum.eth.v1.SignedVoluntaryExit - 38, // 57: ethereum.eth.v2.BeaconBlockBodyBellatrix.sync_aggregate:type_name -> ethereum.eth.v1.SyncAggregate - 39, // 58: ethereum.eth.v2.BeaconBlockBodyBellatrix.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayload - 32, // 59: ethereum.eth.v2.BlindedBeaconBlockBodyBellatrix.eth1_data:type_name -> ethereum.eth.v1.Eth1Data - 33, // 60: ethereum.eth.v2.BlindedBeaconBlockBodyBellatrix.proposer_slashings:type_name -> ethereum.eth.v1.ProposerSlashing - 34, // 61: ethereum.eth.v2.BlindedBeaconBlockBodyBellatrix.attester_slashings:type_name -> ethereum.eth.v1.AttesterSlashing - 35, // 62: ethereum.eth.v2.BlindedBeaconBlockBodyBellatrix.attestations:type_name -> ethereum.eth.v1.Attestation - 36, // 63: ethereum.eth.v2.BlindedBeaconBlockBodyBellatrix.deposits:type_name -> ethereum.eth.v1.Deposit - 37, // 64: ethereum.eth.v2.BlindedBeaconBlockBodyBellatrix.voluntary_exits:type_name -> ethereum.eth.v1.SignedVoluntaryExit - 38, // 65: ethereum.eth.v2.BlindedBeaconBlockBodyBellatrix.sync_aggregate:type_name -> ethereum.eth.v1.SyncAggregate - 40, // 66: ethereum.eth.v2.BlindedBeaconBlockBodyBellatrix.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeader - 32, // 67: ethereum.eth.v2.BeaconBlockBodyCapella.eth1_data:type_name -> ethereum.eth.v1.Eth1Data - 33, // 68: ethereum.eth.v2.BeaconBlockBodyCapella.proposer_slashings:type_name -> ethereum.eth.v1.ProposerSlashing - 34, // 69: ethereum.eth.v2.BeaconBlockBodyCapella.attester_slashings:type_name -> ethereum.eth.v1.AttesterSlashing - 35, // 70: ethereum.eth.v2.BeaconBlockBodyCapella.attestations:type_name -> ethereum.eth.v1.Attestation - 36, // 71: ethereum.eth.v2.BeaconBlockBodyCapella.deposits:type_name -> ethereum.eth.v1.Deposit - 37, // 72: ethereum.eth.v2.BeaconBlockBodyCapella.voluntary_exits:type_name -> ethereum.eth.v1.SignedVoluntaryExit - 38, // 73: ethereum.eth.v2.BeaconBlockBodyCapella.sync_aggregate:type_name -> ethereum.eth.v1.SyncAggregate - 41, // 74: ethereum.eth.v2.BeaconBlockBodyCapella.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayloadCapella - 42, // 75: ethereum.eth.v2.BeaconBlockBodyCapella.bls_to_execution_changes:type_name -> ethereum.eth.v2.SignedBLSToExecutionChange - 32, // 76: ethereum.eth.v2.BlindedBeaconBlockBodyCapella.eth1_data:type_name -> ethereum.eth.v1.Eth1Data - 33, // 77: ethereum.eth.v2.BlindedBeaconBlockBodyCapella.proposer_slashings:type_name -> ethereum.eth.v1.ProposerSlashing - 34, // 78: ethereum.eth.v2.BlindedBeaconBlockBodyCapella.attester_slashings:type_name -> ethereum.eth.v1.AttesterSlashing - 35, // 79: ethereum.eth.v2.BlindedBeaconBlockBodyCapella.attestations:type_name -> ethereum.eth.v1.Attestation - 36, // 80: ethereum.eth.v2.BlindedBeaconBlockBodyCapella.deposits:type_name -> ethereum.eth.v1.Deposit - 37, // 81: ethereum.eth.v2.BlindedBeaconBlockBodyCapella.voluntary_exits:type_name -> ethereum.eth.v1.SignedVoluntaryExit - 38, // 82: ethereum.eth.v2.BlindedBeaconBlockBodyCapella.sync_aggregate:type_name -> ethereum.eth.v1.SyncAggregate - 43, // 83: ethereum.eth.v2.BlindedBeaconBlockBodyCapella.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderCapella - 42, // 84: ethereum.eth.v2.BlindedBeaconBlockBodyCapella.bls_to_execution_changes:type_name -> ethereum.eth.v2.SignedBLSToExecutionChange - 32, // 85: ethereum.eth.v2.BlindedBeaconBlockBodyDeneb.eth1_data:type_name -> ethereum.eth.v1.Eth1Data - 33, // 86: ethereum.eth.v2.BlindedBeaconBlockBodyDeneb.proposer_slashings:type_name -> ethereum.eth.v1.ProposerSlashing - 34, // 87: ethereum.eth.v2.BlindedBeaconBlockBodyDeneb.attester_slashings:type_name -> ethereum.eth.v1.AttesterSlashing - 35, // 88: ethereum.eth.v2.BlindedBeaconBlockBodyDeneb.attestations:type_name -> ethereum.eth.v1.Attestation - 36, // 89: ethereum.eth.v2.BlindedBeaconBlockBodyDeneb.deposits:type_name -> ethereum.eth.v1.Deposit - 37, // 90: ethereum.eth.v2.BlindedBeaconBlockBodyDeneb.voluntary_exits:type_name -> ethereum.eth.v1.SignedVoluntaryExit - 38, // 91: ethereum.eth.v2.BlindedBeaconBlockBodyDeneb.sync_aggregate:type_name -> ethereum.eth.v1.SyncAggregate - 44, // 92: ethereum.eth.v2.BlindedBeaconBlockBodyDeneb.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb - 42, // 93: ethereum.eth.v2.BlindedBeaconBlockBodyDeneb.bls_to_execution_changes:type_name -> ethereum.eth.v2.SignedBLSToExecutionChange - 32, // 94: ethereum.eth.v2.BeaconBlockBodyDeneb.eth1_data:type_name -> ethereum.eth.v1.Eth1Data - 33, // 95: ethereum.eth.v2.BeaconBlockBodyDeneb.proposer_slashings:type_name -> ethereum.eth.v1.ProposerSlashing - 34, // 96: ethereum.eth.v2.BeaconBlockBodyDeneb.attester_slashings:type_name -> ethereum.eth.v1.AttesterSlashing - 35, // 97: ethereum.eth.v2.BeaconBlockBodyDeneb.attestations:type_name -> ethereum.eth.v1.Attestation - 36, // 98: ethereum.eth.v2.BeaconBlockBodyDeneb.deposits:type_name -> ethereum.eth.v1.Deposit - 37, // 99: ethereum.eth.v2.BeaconBlockBodyDeneb.voluntary_exits:type_name -> ethereum.eth.v1.SignedVoluntaryExit - 38, // 100: ethereum.eth.v2.BeaconBlockBodyDeneb.sync_aggregate:type_name -> ethereum.eth.v1.SyncAggregate - 45, // 101: ethereum.eth.v2.BeaconBlockBodyDeneb.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayloadDeneb - 42, // 102: ethereum.eth.v2.BeaconBlockBodyDeneb.bls_to_execution_changes:type_name -> ethereum.eth.v2.SignedBLSToExecutionChange - 9, // 103: ethereum.eth.v2.SignedBeaconBlockContentsDeneb.signed_block:type_name -> ethereum.eth.v2.SignedBeaconBlockDeneb - 18, // 104: ethereum.eth.v2.BeaconBlockContentsDeneb.block:type_name -> ethereum.eth.v2.BeaconBlockDeneb - 105, // [105:105] is the sub-list for method output_type - 105, // [105:105] is the sub-list for method input_type - 105, // [105:105] is the sub-list for extension type_name - 105, // [105:105] is the sub-list for extension extendee - 0, // [0:105] is the sub-list for field type_name -} - -func init() { file_proto_eth_v2_beacon_block_proto_init() } -func file_proto_eth_v2_beacon_block_proto_init() { - if File_proto_eth_v2_beacon_block_proto != nil { - return - } - file_proto_eth_v2_withdrawals_proto_init() - if !protoimpl.UnsafeEnabled { - file_proto_eth_v2_beacon_block_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconBlockContainerV2); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBeaconBlockContainer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBeaconBlockContentsContainer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlindedBeaconBlockContainer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBlindedBeaconBlockContainer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBlindedBeaconBlockContentsContainer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBeaconBlockAltair); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBeaconBlockBellatrix); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBeaconBlockCapella); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBeaconBlockDeneb); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBlindedBeaconBlockBellatrix); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBlindedBeaconBlockCapella); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBlindedBeaconBlockDeneb); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconBlockAltair); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconBlockBellatrix); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlindedBeaconBlockBellatrix); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconBlockCapella); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlindedBeaconBlockCapella); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconBlockDeneb); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlindedBeaconBlockDeneb); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconBlockBodyAltair); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconBlockBodyBellatrix); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlindedBeaconBlockBodyBellatrix); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconBlockBodyCapella); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlindedBeaconBlockBodyCapella); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlindedBeaconBlockBodyDeneb); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconBlockBodyDeneb); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBeaconBlockContentsDeneb); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconBlockContentsDeneb); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlobIdentifier); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_proto_eth_v2_beacon_block_proto_msgTypes[0].OneofWrappers = []interface{}{ - (*BeaconBlockContainerV2_Phase0Block)(nil), - (*BeaconBlockContainerV2_AltairBlock)(nil), - (*BeaconBlockContainerV2_BellatrixBlock)(nil), - (*BeaconBlockContainerV2_CapellaBlock)(nil), - (*BeaconBlockContainerV2_DenebContents)(nil), - } - file_proto_eth_v2_beacon_block_proto_msgTypes[1].OneofWrappers = []interface{}{ - (*SignedBeaconBlockContainer_Phase0Block)(nil), - (*SignedBeaconBlockContainer_AltairBlock)(nil), - (*SignedBeaconBlockContainer_BellatrixBlock)(nil), - (*SignedBeaconBlockContainer_CapellaBlock)(nil), - (*SignedBeaconBlockContainer_DenebBlock)(nil), - } - file_proto_eth_v2_beacon_block_proto_msgTypes[2].OneofWrappers = []interface{}{ - (*SignedBeaconBlockContentsContainer_Phase0Block)(nil), - (*SignedBeaconBlockContentsContainer_AltairBlock)(nil), - (*SignedBeaconBlockContentsContainer_BellatrixBlock)(nil), - (*SignedBeaconBlockContentsContainer_CapellaBlock)(nil), - (*SignedBeaconBlockContentsContainer_DenebContents)(nil), - } - file_proto_eth_v2_beacon_block_proto_msgTypes[3].OneofWrappers = []interface{}{ - (*BlindedBeaconBlockContainer_Phase0Block)(nil), - (*BlindedBeaconBlockContainer_AltairBlock)(nil), - (*BlindedBeaconBlockContainer_BellatrixBlock)(nil), - (*BlindedBeaconBlockContainer_CapellaBlock)(nil), - (*BlindedBeaconBlockContainer_DenebBlock)(nil), - } - file_proto_eth_v2_beacon_block_proto_msgTypes[4].OneofWrappers = []interface{}{ - (*SignedBlindedBeaconBlockContainer_Phase0Block)(nil), - (*SignedBlindedBeaconBlockContainer_AltairBlock)(nil), - (*SignedBlindedBeaconBlockContainer_BellatrixBlock)(nil), - (*SignedBlindedBeaconBlockContainer_CapellaBlock)(nil), - (*SignedBlindedBeaconBlockContainer_DenebBlock)(nil), - } - file_proto_eth_v2_beacon_block_proto_msgTypes[5].OneofWrappers = []interface{}{ - (*SignedBlindedBeaconBlockContentsContainer_Phase0Block)(nil), - (*SignedBlindedBeaconBlockContentsContainer_AltairBlock)(nil), - (*SignedBlindedBeaconBlockContentsContainer_BellatrixBlock)(nil), - (*SignedBlindedBeaconBlockContentsContainer_CapellaBlock)(nil), - (*SignedBlindedBeaconBlockContentsContainer_DenebBlock)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_eth_v2_beacon_block_proto_rawDesc, - NumEnums: 0, - NumMessages: 30, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_proto_eth_v2_beacon_block_proto_goTypes, - DependencyIndexes: file_proto_eth_v2_beacon_block_proto_depIdxs, - MessageInfos: file_proto_eth_v2_beacon_block_proto_msgTypes, - }.Build() - File_proto_eth_v2_beacon_block_proto = out.File - file_proto_eth_v2_beacon_block_proto_rawDesc = nil - file_proto_eth_v2_beacon_block_proto_goTypes = nil - file_proto_eth_v2_beacon_block_proto_depIdxs = nil -} diff --git a/proto/eth/v2/beacon_block.proto b/proto/eth/v2/beacon_block.proto deleted file mode 100644 index 100bbec273f0..000000000000 --- a/proto/eth/v2/beacon_block.proto +++ /dev/null @@ -1,545 +0,0 @@ -// Copyright 2021 Prysmatic Labs. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -syntax = "proto3"; - -package ethereum.eth.v2; - -import "proto/eth/ext/options.proto"; -import "proto/eth/v1/attestation.proto"; -import "proto/eth/v1/beacon_block.proto"; -import "proto/eth/v2/withdrawals.proto"; -import "proto/engine/v1/execution_engine.proto"; - -option csharp_namespace = "Ethereum.Eth.V2"; -option go_package = "github.com/prysmaticlabs/prysm/v5/proto/eth/v2;eth"; -option java_multiple_files = true; -option java_outer_classname = "SyncCommitteeProto"; -option java_package = "org.ethereum.eth.v2"; -option php_namespace = "Ethereum\\Eth\\v2"; - -message BeaconBlockContainerV2 { - oneof block { - v1.BeaconBlock phase0_block = 1; - BeaconBlockAltair altair_block = 2; - BeaconBlockBellatrix bellatrix_block = 3; - BeaconBlockCapella capella_block = 4; - BeaconBlockContentsDeneb deneb_contents = 5; - } -} - -message SignedBeaconBlockContainer { - oneof message { - v1.BeaconBlock phase0_block = 1; - BeaconBlockAltair altair_block = 2; - BeaconBlockBellatrix bellatrix_block = 3; - BeaconBlockCapella capella_block = 4; - BeaconBlockDeneb deneb_block = 5; - } - - // 96 byte BLS signature from the validator that produced this block. - bytes signature = 6 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -message SignedBeaconBlockContentsContainer { - oneof message { - v1.SignedBeaconBlock phase0_block = 1; - SignedBeaconBlockAltair altair_block = 2; - SignedBeaconBlockBellatrix bellatrix_block = 3; - SignedBeaconBlockCapella capella_block = 4; - SignedBeaconBlockContentsDeneb deneb_contents = 5; - } -} - -// used in produce block -message BlindedBeaconBlockContainer { - oneof block { - v1.BeaconBlock phase0_block = 1; - BeaconBlockAltair altair_block = 2; - BlindedBeaconBlockBellatrix bellatrix_block = 3; - BlindedBeaconBlockCapella capella_block = 4; - BlindedBeaconBlockDeneb deneb_block = 5; - } -} - -// used in get block -message SignedBlindedBeaconBlockContainer { - oneof message { - v1.BeaconBlock phase0_block = 1; - BeaconBlockAltair altair_block = 2; - BlindedBeaconBlockBellatrix bellatrix_block = 3; - BlindedBeaconBlockCapella capella_block = 4; - BlindedBeaconBlockDeneb deneb_block = 5; - } - - // 96 byte BLS signature from the validator that produced this block. - bytes signature = 6 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -message SignedBlindedBeaconBlockContentsContainer { - oneof message { - v1.SignedBeaconBlock phase0_block = 1; - SignedBeaconBlockAltair altair_block = 2; - SignedBlindedBeaconBlockBellatrix bellatrix_block = 3; - SignedBlindedBeaconBlockCapella capella_block = 4; - SignedBlindedBeaconBlockDeneb deneb_block = 5; - } -} - -message SignedBeaconBlockAltair { - BeaconBlockAltair message = 1; - - // 96 byte BLS signature from the validator that produced this block. - bytes signature = 2 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -message SignedBeaconBlockBellatrix { - BeaconBlockBellatrix message = 1; - - // 96 byte BLS signature from the validator that produced this block. - bytes signature = 2 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -message SignedBeaconBlockCapella { - BeaconBlockCapella message = 1; - - // 96 byte BLS signature from the validator that produced this block. - bytes signature = 2 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -message SignedBeaconBlockDeneb { - BeaconBlockDeneb message = 1; - - // 96 byte BLS signature from the validator that produced this block. - bytes signature = 2 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -message SignedBlindedBeaconBlockBellatrix { - BlindedBeaconBlockBellatrix message = 1; - - // 96 byte BLS signature from the validator that produced this block. - bytes signature = 2 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -message SignedBlindedBeaconBlockCapella { - BlindedBeaconBlockCapella message = 1; - - // 96 byte BLS signature from the validator that produced this block. - bytes signature = 2 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -message SignedBlindedBeaconBlockDeneb { - BlindedBeaconBlockDeneb message = 1; - - // 96 byte BLS signature from the validator that produced this block. - bytes signature = 2 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -// The Ethereum consensus beacon block. The message does not contain a validator signature. -message BeaconBlockAltair { - // Beacon chain slot that this block represents. - uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; - - // Validator index of the validator that proposed the block header. - uint64 proposer_index = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; - - // 32 byte root of the parent block. - bytes parent_root = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // 32 byte root of the resulting state after processing this block. - bytes state_root = 4 [(ethereum.eth.ext.ssz_size) = "32"]; - - // The block body itself. - BeaconBlockBodyAltair body = 5; -} - -// The Ethereum consensus beacon block. The message does not contain a validator signature. -message BeaconBlockBellatrix { - // Beacon chain slot that this block represents. - uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; - - // Validator index of the validator that proposed the block header. - uint64 proposer_index = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; - - // 32 byte root of the parent block. - bytes parent_root = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // 32 byte root of the resulting state after processing this block. - bytes state_root = 4 [(ethereum.eth.ext.ssz_size) = "32"]; - - // The block body itself. - BeaconBlockBodyBellatrix body = 5; -} - -// The Ethereum consensus beacon block. The message does not contain a validator signature. -message BlindedBeaconBlockBellatrix { - // Beacon chain slot that this block represents. - uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; - - // Validator index of the validator that proposed the block header. - uint64 proposer_index = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; - - // 32 byte root of the parent block. - bytes parent_root = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // 32 byte root of the resulting state after processing this block. - bytes state_root = 4 [(ethereum.eth.ext.ssz_size) = "32"]; - - // The block body itself. - BlindedBeaconBlockBodyBellatrix body = 5; -} - -// The Ethereum consensus beacon block. The message does not contain a validator signature. -message BeaconBlockCapella { - // Beacon chain slot that this block represents. - uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; - - // Validator index of the validator that proposed the block header. - uint64 proposer_index = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; - - // 32 byte root of the parent block. - bytes parent_root = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // 32 byte root of the resulting state after processing this block. - bytes state_root = 4 [(ethereum.eth.ext.ssz_size) = "32"]; - - // The block body itself. - BeaconBlockBodyCapella body = 5; -} - -// The Ethereum consensus beacon block. The message does not contain a validator signature. -message BlindedBeaconBlockCapella { - // Beacon chain slot that this block represents. - uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; - - // Validator index of the validator that proposed the block header. - uint64 proposer_index = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; - - // 32 byte root of the parent block. - bytes parent_root = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // 32 byte root of the resulting state after processing this block. - bytes state_root = 4 [(ethereum.eth.ext.ssz_size) = "32"]; - - // The block body itself. - BlindedBeaconBlockBodyCapella body = 5; -} - -// The Ethereum consensus beacon block. The message does not contain a validator signature. -message BeaconBlockDeneb { - // Beacon chain slot that this block represents. - uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; - - // Validator index of the validator that proposed the block header. - uint64 proposer_index = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; - - // 32 byte root of the parent block. - bytes parent_root = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // 32 byte root of the resulting state after processing this block. - bytes state_root = 4 [(ethereum.eth.ext.ssz_size) = "32"]; - - // The beacon block body. - BeaconBlockBodyDeneb body = 5; -} - -// The Ethereum consensus beacon block. The message does not contain a validator signature. -message BlindedBeaconBlockDeneb { - // Beacon chain slot that this block represents. - uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; - - // Validator index of the validator that proposed the block header. - uint64 proposer_index = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; - // 32 byte root of the parent block. - bytes parent_root = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - // 32 byte root of the resulting state after processing this block. - bytes state_root = 4 [(ethereum.eth.ext.ssz_size) = "32"]; - - // The block body itself. - BlindedBeaconBlockBodyDeneb body = 5; -} - -message BeaconBlockBodyAltair { - // The validators RANDAO reveal 96 byte value. - bytes randao_reveal = 1 [(ethereum.eth.ext.ssz_size) = "96"]; - - // A reference to the Ethereum 1.x chain. - v1.Eth1Data eth1_data = 2; - - // 32 byte field of arbitrary data. This field may contain any data and - // is not used for anything other than a fun message. - bytes graffiti = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // Block operations - // Refer to spec constants at https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#max-operations-per-block - - // At most MAX_PROPOSER_SLASHINGS. - repeated v1.ProposerSlashing proposer_slashings = 4 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_ATTESTER_SLASHINGS. - repeated v1.AttesterSlashing attester_slashings = 5 [(ethereum.eth.ext.ssz_max) = "2"]; - - // At most MAX_ATTESTATIONS. - repeated v1.Attestation attestations = 6 [(ethereum.eth.ext.ssz_max) = "128"]; - - // At most MAX_DEPOSITS. - repeated v1.Deposit deposits = 7 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_VOLUNTARY_EXITS. - repeated v1.SignedVoluntaryExit voluntary_exits = 8 [(ethereum.eth.ext.ssz_max) = "16"]; - - // Sync aggregate object to track sync committee votes for light client support. [New in ] - v1.SyncAggregate sync_aggregate = 9; -} - -message BeaconBlockBodyBellatrix { - // The validators RANDAO reveal 96 byte value. - bytes randao_reveal = 1 [(ethereum.eth.ext.ssz_size) = "96"]; - - // A reference to the Ethereum 1.x chain. - v1.Eth1Data eth1_data = 2; - - // 32 byte field of arbitrary data. This field may contain any data and - // is not used for anything other than a fun message. - bytes graffiti = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // Block operations - // Refer to spec constants at https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#max-operations-per-block - - // At most MAX_PROPOSER_SLASHINGS. - repeated v1.ProposerSlashing proposer_slashings = 4 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_ATTESTER_SLASHINGS. - repeated v1.AttesterSlashing attester_slashings = 5 [(ethereum.eth.ext.ssz_max) = "2"]; - - // At most MAX_ATTESTATIONS. - repeated v1.Attestation attestations = 6 [(ethereum.eth.ext.ssz_max) = "128"]; - - // At most MAX_DEPOSITS. - repeated v1.Deposit deposits = 7 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_VOLUNTARY_EXITS. - repeated v1.SignedVoluntaryExit voluntary_exits = 8 [(ethereum.eth.ext.ssz_max) = "16"]; - - // Sync aggregate object to track sync committee votes for light client support. - v1.SyncAggregate sync_aggregate = 9; - - // Execution payload: the embedded execution payload of the block [New in Bellatrix] - ethereum.engine.v1.ExecutionPayload execution_payload = 10; -} - -message BlindedBeaconBlockBodyBellatrix { - // The validators RANDAO reveal 96 byte value. - bytes randao_reveal = 1 [(ethereum.eth.ext.ssz_size) = "96"]; - - // A reference to the Ethereum 1.x chain. - v1.Eth1Data eth1_data = 2; - - // 32 byte field of arbitrary data. This field may contain any data and - // is not used for anything other than a fun message. - bytes graffiti = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // Block operations - // Refer to spec constants at https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#max-operations-per-block - - // At most MAX_PROPOSER_SLASHINGS. - repeated v1.ProposerSlashing proposer_slashings = 4 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_ATTESTER_SLASHINGS. - repeated v1.AttesterSlashing attester_slashings = 5 [(ethereum.eth.ext.ssz_max) = "2"]; - - // At most MAX_ATTESTATIONS. - repeated v1.Attestation attestations = 6 [(ethereum.eth.ext.ssz_max) = "128"]; - - // At most MAX_DEPOSITS. - repeated v1.Deposit deposits = 7 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_VOLUNTARY_EXITS. - repeated v1.SignedVoluntaryExit voluntary_exits = 8 [(ethereum.eth.ext.ssz_max) = "16"]; - - // Sync aggregate object to track sync committee votes for light client support. - v1.SyncAggregate sync_aggregate = 9; - - // Execution payload header: the embedded execution payload of the block [New in Bellatrix] - ethereum.engine.v1.ExecutionPayloadHeader execution_payload_header = 10; -} - -message BeaconBlockBodyCapella { - // The validators RANDAO reveal 96 byte value. - bytes randao_reveal = 1 [(ethereum.eth.ext.ssz_size) = "96"]; - - // A reference to the Ethereum 1.x chain. - v1.Eth1Data eth1_data = 2; - - // 32 byte field of arbitrary data. This field may contain any data and - // is not used for anything other than a fun message. - bytes graffiti = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // Block operations - // Refer to spec constants at https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#max-operations-per-block - - // At most MAX_PROPOSER_SLASHINGS. - repeated v1.ProposerSlashing proposer_slashings = 4 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_ATTESTER_SLASHINGS. - repeated v1.AttesterSlashing attester_slashings = 5 [(ethereum.eth.ext.ssz_max) = "2"]; - - // At most MAX_ATTESTATIONS. - repeated v1.Attestation attestations = 6 [(ethereum.eth.ext.ssz_max) = "128"]; - - // At most MAX_DEPOSITS. - repeated v1.Deposit deposits = 7 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_VOLUNTARY_EXITS. - repeated v1.SignedVoluntaryExit voluntary_exits = 8 [(ethereum.eth.ext.ssz_max) = "16"]; - - // Sync aggregate object to track sync committee votes for light client support. - v1.SyncAggregate sync_aggregate = 9; - - // Execution payload: the embedded execution payload of the block [Modified in Capella] - ethereum.engine.v1.ExecutionPayloadCapella execution_payload = 10; - - // BLS To Execution Changes: signed messages to change withdrawal credentials [New in Capella] - repeated SignedBLSToExecutionChange bls_to_execution_changes = 11 [(ethereum.eth.ext.ssz_max) = "16"]; -} - -message BlindedBeaconBlockBodyCapella { - // The validators RANDAO reveal 96 byte value. - bytes randao_reveal = 1 [(ethereum.eth.ext.ssz_size) = "96"]; - - // A reference to the Ethereum 1.x chain. - v1.Eth1Data eth1_data = 2; - - // 32 byte field of arbitrary data. This field may contain any data and - // is not used for anything other than a fun message. - bytes graffiti = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // Block operations - // Refer to spec constants at https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#max-operations-per-block - - // At most MAX_PROPOSER_SLASHINGS. - repeated v1.ProposerSlashing proposer_slashings = 4 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_ATTESTER_SLASHINGS. - repeated v1.AttesterSlashing attester_slashings = 5 [(ethereum.eth.ext.ssz_max) = "2"]; - - // At most MAX_ATTESTATIONS. - repeated v1.Attestation attestations = 6 [(ethereum.eth.ext.ssz_max) = "128"]; - - // At most MAX_DEPOSITS. - repeated v1.Deposit deposits = 7 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_VOLUNTARY_EXITS. - repeated v1.SignedVoluntaryExit voluntary_exits = 8 [(ethereum.eth.ext.ssz_max) = "16"]; - - // Sync aggregate object to track sync committee votes for light client support. - v1.SyncAggregate sync_aggregate = 9; - - // Execution payload header: the embedded execution payload of the block [Modified in Capella] - ethereum.engine.v1.ExecutionPayloadHeaderCapella execution_payload_header = 10; - - // BLS To Execution Changes: signed messages to change withdrawal credentials [New in Capella] - repeated SignedBLSToExecutionChange bls_to_execution_changes = 11 [(ethereum.eth.ext.ssz_max) = "16"]; -} - -message BlindedBeaconBlockBodyDeneb { - // The validators RANDAO reveal 96 byte value. - bytes randao_reveal = 1 [(ethereum.eth.ext.ssz_size) = "96"]; - - // A reference to the Ethereum 1.x chain. - v1.Eth1Data eth1_data = 2; - // 32 byte field of arbitrary data. This field may contain any data and - // is not used for anything other than a fun message. - bytes graffiti = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - // Block operations - // Refer to spec constants at https://github.com/ethereum/consensus-specs/blob/dev/specs/core/0_beacon-chain.md#max-operations-per-block - // At most MAX_PROPOSER_SLASHINGS. - repeated v1.ProposerSlashing proposer_slashings = 4 [(ethereum.eth.ext.ssz_max) = "16"]; - // At most MAX_ATTESTER_SLASHINGS. - repeated v1.AttesterSlashing attester_slashings = 5 [(ethereum.eth.ext.ssz_max) = "2"]; - // At most MAX_ATTESTATIONS. - repeated v1.Attestation attestations = 6 [(ethereum.eth.ext.ssz_max) = "128"]; - // At most MAX_DEPOSITS. - repeated v1.Deposit deposits = 7 [(ethereum.eth.ext.ssz_max) = "16"]; - // At most MAX_VOLUNTARY_EXITS. - repeated v1.SignedVoluntaryExit voluntary_exits = 8 [(ethereum.eth.ext.ssz_max) = "16"]; - // Sync aggregate object to track sync committee votes for light client support. - v1.SyncAggregate sync_aggregate = 9; - - // Execution payload header: the embedded execution payload of the block [Modified in Deneb] - ethereum.engine.v1.ExecutionPayloadHeaderDeneb execution_payload_header = 10; - - // BLS To Execution Changes: signed messages to change withdrawal credentials [New in Capella] - repeated SignedBLSToExecutionChange bls_to_execution_changes = 11 [(ethereum.eth.ext.ssz_max) = "16"]; - - repeated bytes blob_kzg_commitments = 12 [(ethereum.eth.ext.ssz_size) = "?,48", (ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"]; -} - -message BeaconBlockBodyDeneb { - // The validators RANDAO reveal 96 byte value. - bytes randao_reveal = 1 [(ethereum.eth.ext.ssz_size) = "96"]; - - // A reference to the Ethereum 1.x chain. - v1.Eth1Data eth1_data = 2; - - // 32 byte field of arbitrary data. This field may contain any data and - // is not used for anything other than a fun message. - bytes graffiti = 3 [(ethereum.eth.ext.ssz_size) = "32"]; - - // Block operations - // Refer to spec constants at https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#max-operations-per-block - - // At most MAX_PROPOSER_SLASHINGS. - repeated v1.ProposerSlashing proposer_slashings = 4 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_ATTESTER_SLASHINGS. - repeated v1.AttesterSlashing attester_slashings = 5 [(ethereum.eth.ext.ssz_max) = "2"]; - - // At most MAX_ATTESTATIONS. - repeated v1.Attestation attestations = 6 [(ethereum.eth.ext.ssz_max) = "128"]; - - // At most MAX_DEPOSITS. - repeated v1.Deposit deposits = 7 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_VOLUNTARY_EXITS. - repeated v1.SignedVoluntaryExit voluntary_exits = 8 [(ethereum.eth.ext.ssz_max) = "16"]; - - // Sync aggregate object for the beacon chain to track sync committee votes. New in Altair network upgrade. - v1.SyncAggregate sync_aggregate = 9; - - // Execution payload from the execution chain. New in Bellatrix network upgrade. - ethereum.engine.v1.ExecutionPayloadDeneb execution_payload = 10; - - // At most MAX_BLS_TO_EXECUTION_CHANGES. New in Capella network upgrade. - repeated SignedBLSToExecutionChange bls_to_execution_changes = 11 [(ethereum.eth.ext.ssz_max) = "16"]; - - // At most MAX_BLOB_COMMITMENTS_PER_BLOCK. New in Deneb network upgrade. - repeated bytes blob_kzg_commitments = 12 [(ethereum.eth.ext.ssz_size) = "?,48", (ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"]; -} - -message SignedBeaconBlockContentsDeneb { - SignedBeaconBlockDeneb signed_block = 1; - repeated bytes kzg_proofs = 2 [(ethereum.eth.ext.ssz_size) = "?,48", (ethereum.eth.ext.ssz_max) = "4096"]; - repeated bytes blobs = 3 [(ethereum.eth.ext.ssz_size) = "?,blob.size", (ethereum.eth.ext.ssz_max) = "4096"]; -} - -message BeaconBlockContentsDeneb { - BeaconBlockDeneb block = 1; - repeated bytes kzg_proofs = 2 [(ethereum.eth.ext.ssz_size) = "?,48", (ethereum.eth.ext.ssz_max) = "4096"]; - repeated bytes blobs = 3 [(ethereum.eth.ext.ssz_size) = "?,blob.size", (ethereum.eth.ext.ssz_max) = "4096"]; -} - -message BlobIdentifier { - bytes block_root = 1 [(ethereum.eth.ext.ssz_size) = "32"]; - uint64 index = 2; -} \ No newline at end of file diff --git a/proto/eth/v2/beacon_lightclient.pb.go b/proto/eth/v2/beacon_lightclient.pb.go deleted file mode 100755 index e9f2f3704e5c..000000000000 --- a/proto/eth/v2/beacon_lightclient.pb.go +++ /dev/null @@ -1,1191 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.1 -// source: proto/eth/v2/beacon_lightclient.proto - -package eth - -import ( - reflect "reflect" - sync "sync" - - github_com_prysmaticlabs_prysm_v5_consensus_types_primitives "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" - v11 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" - _ "github.com/prysmaticlabs/prysm/v5/proto/eth/ext" - v1 "github.com/prysmaticlabs/prysm/v5/proto/eth/v1" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type LightClientHeader struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Beacon *v1.BeaconBlockHeader `protobuf:"bytes,1,opt,name=beacon,proto3" json:"beacon,omitempty"` -} - -func (x *LightClientHeader) Reset() { - *x = LightClientHeader{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientHeader) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientHeader) ProtoMessage() {} - -func (x *LightClientHeader) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientHeader.ProtoReflect.Descriptor instead. -func (*LightClientHeader) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{0} -} - -func (x *LightClientHeader) GetBeacon() *v1.BeaconBlockHeader { - if x != nil { - return x.Beacon - } - return nil -} - -type LightClientHeaderCapella struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Beacon *v1.BeaconBlockHeader `protobuf:"bytes,1,opt,name=beacon,proto3" json:"beacon,omitempty"` - Execution *v11.ExecutionPayloadHeaderCapella `protobuf:"bytes,2,opt,name=execution,proto3" json:"execution,omitempty"` - ExecutionBranch [][]byte `protobuf:"bytes,3,rep,name=execution_branch,json=executionBranch,proto3" json:"execution_branch,omitempty"` -} - -func (x *LightClientHeaderCapella) Reset() { - *x = LightClientHeaderCapella{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientHeaderCapella) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientHeaderCapella) ProtoMessage() {} - -func (x *LightClientHeaderCapella) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientHeaderCapella.ProtoReflect.Descriptor instead. -func (*LightClientHeaderCapella) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{1} -} - -func (x *LightClientHeaderCapella) GetBeacon() *v1.BeaconBlockHeader { - if x != nil { - return x.Beacon - } - return nil -} - -func (x *LightClientHeaderCapella) GetExecution() *v11.ExecutionPayloadHeaderCapella { - if x != nil { - return x.Execution - } - return nil -} - -func (x *LightClientHeaderCapella) GetExecutionBranch() [][]byte { - if x != nil { - return x.ExecutionBranch - } - return nil -} - -type LightClientHeaderDeneb struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Beacon *v1.BeaconBlockHeader `protobuf:"bytes,1,opt,name=beacon,proto3" json:"beacon,omitempty"` - Execution *v11.ExecutionPayloadHeaderDeneb `protobuf:"bytes,2,opt,name=execution,proto3" json:"execution,omitempty"` - ExecutionBranch [][]byte `protobuf:"bytes,3,rep,name=execution_branch,json=executionBranch,proto3" json:"execution_branch,omitempty"` -} - -func (x *LightClientHeaderDeneb) Reset() { - *x = LightClientHeaderDeneb{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientHeaderDeneb) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientHeaderDeneb) ProtoMessage() {} - -func (x *LightClientHeaderDeneb) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientHeaderDeneb.ProtoReflect.Descriptor instead. -func (*LightClientHeaderDeneb) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{2} -} - -func (x *LightClientHeaderDeneb) GetBeacon() *v1.BeaconBlockHeader { - if x != nil { - return x.Beacon - } - return nil -} - -func (x *LightClientHeaderDeneb) GetExecution() *v11.ExecutionPayloadHeaderDeneb { - if x != nil { - return x.Execution - } - return nil -} - -func (x *LightClientHeaderDeneb) GetExecutionBranch() [][]byte { - if x != nil { - return x.ExecutionBranch - } - return nil -} - -type LightClientHeaderContainer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Header: - // - // *LightClientHeaderContainer_HeaderAltair - // *LightClientHeaderContainer_HeaderCapella - // *LightClientHeaderContainer_HeaderDeneb - Header isLightClientHeaderContainer_Header `protobuf_oneof:"header"` -} - -func (x *LightClientHeaderContainer) Reset() { - *x = LightClientHeaderContainer{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientHeaderContainer) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientHeaderContainer) ProtoMessage() {} - -func (x *LightClientHeaderContainer) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientHeaderContainer.ProtoReflect.Descriptor instead. -func (*LightClientHeaderContainer) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{3} -} - -func (m *LightClientHeaderContainer) GetHeader() isLightClientHeaderContainer_Header { - if m != nil { - return m.Header - } - return nil -} - -func (x *LightClientHeaderContainer) GetHeaderAltair() *LightClientHeader { - if x, ok := x.GetHeader().(*LightClientHeaderContainer_HeaderAltair); ok { - return x.HeaderAltair - } - return nil -} - -func (x *LightClientHeaderContainer) GetHeaderCapella() *LightClientHeaderCapella { - if x, ok := x.GetHeader().(*LightClientHeaderContainer_HeaderCapella); ok { - return x.HeaderCapella - } - return nil -} - -func (x *LightClientHeaderContainer) GetHeaderDeneb() *LightClientHeaderDeneb { - if x, ok := x.GetHeader().(*LightClientHeaderContainer_HeaderDeneb); ok { - return x.HeaderDeneb - } - return nil -} - -type isLightClientHeaderContainer_Header interface { - isLightClientHeaderContainer_Header() -} - -type LightClientHeaderContainer_HeaderAltair struct { - HeaderAltair *LightClientHeader `protobuf:"bytes,1,opt,name=header_altair,json=headerAltair,proto3,oneof"` -} - -type LightClientHeaderContainer_HeaderCapella struct { - HeaderCapella *LightClientHeaderCapella `protobuf:"bytes,2,opt,name=header_capella,json=headerCapella,proto3,oneof"` -} - -type LightClientHeaderContainer_HeaderDeneb struct { - HeaderDeneb *LightClientHeaderDeneb `protobuf:"bytes,3,opt,name=header_deneb,json=headerDeneb,proto3,oneof"` -} - -func (*LightClientHeaderContainer_HeaderAltair) isLightClientHeaderContainer_Header() {} - -func (*LightClientHeaderContainer_HeaderCapella) isLightClientHeaderContainer_Header() {} - -func (*LightClientHeaderContainer_HeaderDeneb) isLightClientHeaderContainer_Header() {} - -type LightClientBootstrap struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Header *LightClientHeaderContainer `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` - CurrentSyncCommittee *SyncCommittee `protobuf:"bytes,2,opt,name=current_sync_committee,json=currentSyncCommittee,proto3" json:"current_sync_committee,omitempty"` - CurrentSyncCommitteeBranch [][]byte `protobuf:"bytes,3,rep,name=current_sync_committee_branch,json=currentSyncCommitteeBranch,proto3" json:"current_sync_committee_branch,omitempty"` -} - -func (x *LightClientBootstrap) Reset() { - *x = LightClientBootstrap{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientBootstrap) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientBootstrap) ProtoMessage() {} - -func (x *LightClientBootstrap) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientBootstrap.ProtoReflect.Descriptor instead. -func (*LightClientBootstrap) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{4} -} - -func (x *LightClientBootstrap) GetHeader() *LightClientHeaderContainer { - if x != nil { - return x.Header - } - return nil -} - -func (x *LightClientBootstrap) GetCurrentSyncCommittee() *SyncCommittee { - if x != nil { - return x.CurrentSyncCommittee - } - return nil -} - -func (x *LightClientBootstrap) GetCurrentSyncCommitteeBranch() [][]byte { - if x != nil { - return x.CurrentSyncCommitteeBranch - } - return nil -} - -type LightClientUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AttestedHeader *LightClientHeaderContainer `protobuf:"bytes,1,opt,name=attested_header,json=attestedHeader,proto3" json:"attested_header,omitempty"` - NextSyncCommittee *SyncCommittee `protobuf:"bytes,2,opt,name=next_sync_committee,json=nextSyncCommittee,proto3" json:"next_sync_committee,omitempty"` - NextSyncCommitteeBranch [][]byte `protobuf:"bytes,3,rep,name=next_sync_committee_branch,json=nextSyncCommitteeBranch,proto3" json:"next_sync_committee_branch,omitempty"` - FinalizedHeader *LightClientHeaderContainer `protobuf:"bytes,4,opt,name=finalized_header,json=finalizedHeader,proto3" json:"finalized_header,omitempty"` - FinalityBranch [][]byte `protobuf:"bytes,5,rep,name=finality_branch,json=finalityBranch,proto3" json:"finality_branch,omitempty"` - SyncAggregate *v1.SyncAggregate `protobuf:"bytes,6,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` - SignatureSlot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,7,opt,name=signature_slot,json=signatureSlot,proto3" json:"signature_slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` -} - -func (x *LightClientUpdate) Reset() { - *x = LightClientUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientUpdate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientUpdate) ProtoMessage() {} - -func (x *LightClientUpdate) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientUpdate.ProtoReflect.Descriptor instead. -func (*LightClientUpdate) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{5} -} - -func (x *LightClientUpdate) GetAttestedHeader() *LightClientHeaderContainer { - if x != nil { - return x.AttestedHeader - } - return nil -} - -func (x *LightClientUpdate) GetNextSyncCommittee() *SyncCommittee { - if x != nil { - return x.NextSyncCommittee - } - return nil -} - -func (x *LightClientUpdate) GetNextSyncCommitteeBranch() [][]byte { - if x != nil { - return x.NextSyncCommitteeBranch - } - return nil -} - -func (x *LightClientUpdate) GetFinalizedHeader() *LightClientHeaderContainer { - if x != nil { - return x.FinalizedHeader - } - return nil -} - -func (x *LightClientUpdate) GetFinalityBranch() [][]byte { - if x != nil { - return x.FinalityBranch - } - return nil -} - -func (x *LightClientUpdate) GetSyncAggregate() *v1.SyncAggregate { - if x != nil { - return x.SyncAggregate - } - return nil -} - -func (x *LightClientUpdate) GetSignatureSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.SignatureSlot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -type LightClientFinalityUpdateWithVersion struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Version Version `protobuf:"varint,1,opt,name=version,proto3,enum=ethereum.eth.v2.Version" json:"version,omitempty"` - Data *LightClientFinalityUpdate `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` -} - -func (x *LightClientFinalityUpdateWithVersion) Reset() { - *x = LightClientFinalityUpdateWithVersion{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientFinalityUpdateWithVersion) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientFinalityUpdateWithVersion) ProtoMessage() {} - -func (x *LightClientFinalityUpdateWithVersion) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientFinalityUpdateWithVersion.ProtoReflect.Descriptor instead. -func (*LightClientFinalityUpdateWithVersion) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{6} -} - -func (x *LightClientFinalityUpdateWithVersion) GetVersion() Version { - if x != nil { - return x.Version - } - return Version_PHASE0 -} - -func (x *LightClientFinalityUpdateWithVersion) GetData() *LightClientFinalityUpdate { - if x != nil { - return x.Data - } - return nil -} - -type LightClientFinalityUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AttestedHeader *LightClientHeaderContainer `protobuf:"bytes,1,opt,name=attested_header,json=attestedHeader,proto3" json:"attested_header,omitempty"` - FinalizedHeader *LightClientHeaderContainer `protobuf:"bytes,2,opt,name=finalized_header,json=finalizedHeader,proto3" json:"finalized_header,omitempty"` - FinalityBranch [][]byte `protobuf:"bytes,3,rep,name=finality_branch,json=finalityBranch,proto3" json:"finality_branch,omitempty"` - SyncAggregate *v1.SyncAggregate `protobuf:"bytes,4,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` - SignatureSlot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,5,opt,name=signature_slot,json=signatureSlot,proto3" json:"signature_slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` -} - -func (x *LightClientFinalityUpdate) Reset() { - *x = LightClientFinalityUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientFinalityUpdate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientFinalityUpdate) ProtoMessage() {} - -func (x *LightClientFinalityUpdate) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientFinalityUpdate.ProtoReflect.Descriptor instead. -func (*LightClientFinalityUpdate) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{7} -} - -func (x *LightClientFinalityUpdate) GetAttestedHeader() *LightClientHeaderContainer { - if x != nil { - return x.AttestedHeader - } - return nil -} - -func (x *LightClientFinalityUpdate) GetFinalizedHeader() *LightClientHeaderContainer { - if x != nil { - return x.FinalizedHeader - } - return nil -} - -func (x *LightClientFinalityUpdate) GetFinalityBranch() [][]byte { - if x != nil { - return x.FinalityBranch - } - return nil -} - -func (x *LightClientFinalityUpdate) GetSyncAggregate() *v1.SyncAggregate { - if x != nil { - return x.SyncAggregate - } - return nil -} - -func (x *LightClientFinalityUpdate) GetSignatureSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.SignatureSlot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -type LightClientOptimisticUpdateWithVersion struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Version Version `protobuf:"varint,1,opt,name=version,proto3,enum=ethereum.eth.v2.Version" json:"version,omitempty"` - Data *LightClientOptimisticUpdate `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` -} - -func (x *LightClientOptimisticUpdateWithVersion) Reset() { - *x = LightClientOptimisticUpdateWithVersion{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientOptimisticUpdateWithVersion) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientOptimisticUpdateWithVersion) ProtoMessage() {} - -func (x *LightClientOptimisticUpdateWithVersion) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientOptimisticUpdateWithVersion.ProtoReflect.Descriptor instead. -func (*LightClientOptimisticUpdateWithVersion) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{8} -} - -func (x *LightClientOptimisticUpdateWithVersion) GetVersion() Version { - if x != nil { - return x.Version - } - return Version_PHASE0 -} - -func (x *LightClientOptimisticUpdateWithVersion) GetData() *LightClientOptimisticUpdate { - if x != nil { - return x.Data - } - return nil -} - -type LightClientOptimisticUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AttestedHeader *LightClientHeaderContainer `protobuf:"bytes,1,opt,name=attested_header,json=attestedHeader,proto3" json:"attested_header,omitempty"` - SyncAggregate *v1.SyncAggregate `protobuf:"bytes,2,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` - SignatureSlot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,3,opt,name=signature_slot,json=signatureSlot,proto3" json:"signature_slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` -} - -func (x *LightClientOptimisticUpdate) Reset() { - *x = LightClientOptimisticUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientOptimisticUpdate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientOptimisticUpdate) ProtoMessage() {} - -func (x *LightClientOptimisticUpdate) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientOptimisticUpdate.ProtoReflect.Descriptor instead. -func (*LightClientOptimisticUpdate) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{9} -} - -func (x *LightClientOptimisticUpdate) GetAttestedHeader() *LightClientHeaderContainer { - if x != nil { - return x.AttestedHeader - } - return nil -} - -func (x *LightClientOptimisticUpdate) GetSyncAggregate() *v1.SyncAggregate { - if x != nil { - return x.SyncAggregate - } - return nil -} - -func (x *LightClientOptimisticUpdate) GetSignatureSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.SignatureSlot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -type LightClientUpdateWithVersion struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Version Version `protobuf:"varint,1,opt,name=version,proto3,enum=ethereum.eth.v2.Version" json:"version,omitempty"` - Data *LightClientUpdate `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` -} - -func (x *LightClientUpdateWithVersion) Reset() { - *x = LightClientUpdateWithVersion{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LightClientUpdateWithVersion) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LightClientUpdateWithVersion) ProtoMessage() {} - -func (x *LightClientUpdateWithVersion) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_beacon_lightclient_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LightClientUpdateWithVersion.ProtoReflect.Descriptor instead. -func (*LightClientUpdateWithVersion) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP(), []int{10} -} - -func (x *LightClientUpdateWithVersion) GetVersion() Version { - if x != nil { - return x.Version - } - return Version_PHASE0 -} - -func (x *LightClientUpdateWithVersion) GetData() *LightClientUpdate { - if x != nil { - return x.Data - } - return nil -} - -var File_proto_eth_v2_beacon_lightclient_proto protoreflect.FileDescriptor - -var file_proto_eth_v2_beacon_lightclient_proto_rawDesc = []byte{ - 0x0a, 0x25, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x62, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x65, 0x74, 0x68, 0x2f, 0x65, 0x78, 0x74, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, - 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, - 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, - 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x4f, 0x0a, - 0x11, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x22, 0xd2, - 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, 0x3a, 0x0a, 0x06, 0x62, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, - 0x06, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x52, 0x09, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x22, 0xce, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x3a, - 0x0a, 0x06, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x06, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x09, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x52, 0x09, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x22, 0x93, 0x02, 0x0a, 0x1a, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x6c, - 0x74, 0x61, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x67, - 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x12, 0x52, - 0x0a, 0x0e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, - 0x61, 0x48, 0x00, 0x52, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x61, 0x70, 0x65, 0x6c, - 0x6c, 0x61, 0x12, 0x4c, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x6e, - 0x65, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x44, 0x65, 0x6e, 0x65, - 0x62, 0x48, 0x00, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x44, 0x65, 0x6e, 0x65, 0x62, - 0x42, 0x08, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0xf4, 0x01, 0x0a, 0x14, 0x4c, - 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, - 0x72, 0x61, 0x70, 0x12, 0x43, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x54, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x12, 0x41, - 0x0a, 0x1d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x79, - 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x22, 0xac, 0x04, 0x0a, 0x11, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x54, 0x0a, 0x0f, 0x61, 0x74, 0x74, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0e, 0x61, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x4e, 0x0a, - 0x13, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x79, 0x6e, - 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x52, 0x11, 0x6e, 0x65, 0x78, 0x74, - 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x12, 0x3b, 0x0a, - 0x1a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x65, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x17, 0x6e, 0x65, 0x78, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x56, 0x0a, 0x10, 0x66, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x0f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x66, 0x69, 0x6e, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x45, 0x0a, 0x0e, 0x73, - 0x79, 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x12, 0x6c, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, - 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, - 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, - 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, - 0x74, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x6c, 0x6f, 0x74, - 0x22, 0x9a, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x69, - 0x74, 0x68, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa7, 0x03, - 0x0a, 0x19, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x54, 0x0a, 0x0f, 0x61, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x56, 0x0a, 0x10, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x6e, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x0e, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x12, 0x45, 0x0a, 0x0e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x79, 0x6e, - 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, - 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x6c, 0x0a, 0x0e, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, - 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, - 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x53, 0x6c, 0x6f, 0x74, 0x22, 0x9e, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x67, 0x68, - 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x73, 0x74, 0x69, - 0x63, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x69, 0x74, 0x68, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x73, 0x74, 0x69, 0x63, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa8, 0x02, 0x0a, 0x1b, 0x4c, 0x69, 0x67, - 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x54, 0x0a, 0x0f, 0x61, 0x74, 0x74, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0e, - 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x45, - 0x0a, 0x0e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, - 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x6c, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, - 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, - 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, - 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, - 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, - 0x6c, 0x6f, 0x74, 0x22, 0x8a, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x69, 0x74, 0x68, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x42, 0x83, 0x01, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x42, 0x12, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, - 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, - 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x3b, 0x65, - 0x74, 0x68, 0xaa, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x74, - 0x68, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5c, - 0x45, 0x74, 0x68, 0x5c, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_proto_eth_v2_beacon_lightclient_proto_rawDescOnce sync.Once - file_proto_eth_v2_beacon_lightclient_proto_rawDescData = file_proto_eth_v2_beacon_lightclient_proto_rawDesc -) - -func file_proto_eth_v2_beacon_lightclient_proto_rawDescGZIP() []byte { - file_proto_eth_v2_beacon_lightclient_proto_rawDescOnce.Do(func() { - file_proto_eth_v2_beacon_lightclient_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_eth_v2_beacon_lightclient_proto_rawDescData) - }) - return file_proto_eth_v2_beacon_lightclient_proto_rawDescData -} - -var file_proto_eth_v2_beacon_lightclient_proto_msgTypes = make([]protoimpl.MessageInfo, 11) -var file_proto_eth_v2_beacon_lightclient_proto_goTypes = []interface{}{ - (*LightClientHeader)(nil), // 0: ethereum.eth.v2.LightClientHeader - (*LightClientHeaderCapella)(nil), // 1: ethereum.eth.v2.LightClientHeaderCapella - (*LightClientHeaderDeneb)(nil), // 2: ethereum.eth.v2.LightClientHeaderDeneb - (*LightClientHeaderContainer)(nil), // 3: ethereum.eth.v2.LightClientHeaderContainer - (*LightClientBootstrap)(nil), // 4: ethereum.eth.v2.LightClientBootstrap - (*LightClientUpdate)(nil), // 5: ethereum.eth.v2.LightClientUpdate - (*LightClientFinalityUpdateWithVersion)(nil), // 6: ethereum.eth.v2.LightClientFinalityUpdateWithVersion - (*LightClientFinalityUpdate)(nil), // 7: ethereum.eth.v2.LightClientFinalityUpdate - (*LightClientOptimisticUpdateWithVersion)(nil), // 8: ethereum.eth.v2.LightClientOptimisticUpdateWithVersion - (*LightClientOptimisticUpdate)(nil), // 9: ethereum.eth.v2.LightClientOptimisticUpdate - (*LightClientUpdateWithVersion)(nil), // 10: ethereum.eth.v2.LightClientUpdateWithVersion - (*v1.BeaconBlockHeader)(nil), // 11: ethereum.eth.v1.BeaconBlockHeader - (*v11.ExecutionPayloadHeaderCapella)(nil), // 12: ethereum.engine.v1.ExecutionPayloadHeaderCapella - (*v11.ExecutionPayloadHeaderDeneb)(nil), // 13: ethereum.engine.v1.ExecutionPayloadHeaderDeneb - (*SyncCommittee)(nil), // 14: ethereum.eth.v2.SyncCommittee - (*v1.SyncAggregate)(nil), // 15: ethereum.eth.v1.SyncAggregate - (Version)(0), // 16: ethereum.eth.v2.Version -} -var file_proto_eth_v2_beacon_lightclient_proto_depIdxs = []int32{ - 11, // 0: ethereum.eth.v2.LightClientHeader.beacon:type_name -> ethereum.eth.v1.BeaconBlockHeader - 11, // 1: ethereum.eth.v2.LightClientHeaderCapella.beacon:type_name -> ethereum.eth.v1.BeaconBlockHeader - 12, // 2: ethereum.eth.v2.LightClientHeaderCapella.execution:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderCapella - 11, // 3: ethereum.eth.v2.LightClientHeaderDeneb.beacon:type_name -> ethereum.eth.v1.BeaconBlockHeader - 13, // 4: ethereum.eth.v2.LightClientHeaderDeneb.execution:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb - 0, // 5: ethereum.eth.v2.LightClientHeaderContainer.header_altair:type_name -> ethereum.eth.v2.LightClientHeader - 1, // 6: ethereum.eth.v2.LightClientHeaderContainer.header_capella:type_name -> ethereum.eth.v2.LightClientHeaderCapella - 2, // 7: ethereum.eth.v2.LightClientHeaderContainer.header_deneb:type_name -> ethereum.eth.v2.LightClientHeaderDeneb - 3, // 8: ethereum.eth.v2.LightClientBootstrap.header:type_name -> ethereum.eth.v2.LightClientHeaderContainer - 14, // 9: ethereum.eth.v2.LightClientBootstrap.current_sync_committee:type_name -> ethereum.eth.v2.SyncCommittee - 3, // 10: ethereum.eth.v2.LightClientUpdate.attested_header:type_name -> ethereum.eth.v2.LightClientHeaderContainer - 14, // 11: ethereum.eth.v2.LightClientUpdate.next_sync_committee:type_name -> ethereum.eth.v2.SyncCommittee - 3, // 12: ethereum.eth.v2.LightClientUpdate.finalized_header:type_name -> ethereum.eth.v2.LightClientHeaderContainer - 15, // 13: ethereum.eth.v2.LightClientUpdate.sync_aggregate:type_name -> ethereum.eth.v1.SyncAggregate - 16, // 14: ethereum.eth.v2.LightClientFinalityUpdateWithVersion.version:type_name -> ethereum.eth.v2.Version - 7, // 15: ethereum.eth.v2.LightClientFinalityUpdateWithVersion.data:type_name -> ethereum.eth.v2.LightClientFinalityUpdate - 3, // 16: ethereum.eth.v2.LightClientFinalityUpdate.attested_header:type_name -> ethereum.eth.v2.LightClientHeaderContainer - 3, // 17: ethereum.eth.v2.LightClientFinalityUpdate.finalized_header:type_name -> ethereum.eth.v2.LightClientHeaderContainer - 15, // 18: ethereum.eth.v2.LightClientFinalityUpdate.sync_aggregate:type_name -> ethereum.eth.v1.SyncAggregate - 16, // 19: ethereum.eth.v2.LightClientOptimisticUpdateWithVersion.version:type_name -> ethereum.eth.v2.Version - 9, // 20: ethereum.eth.v2.LightClientOptimisticUpdateWithVersion.data:type_name -> ethereum.eth.v2.LightClientOptimisticUpdate - 3, // 21: ethereum.eth.v2.LightClientOptimisticUpdate.attested_header:type_name -> ethereum.eth.v2.LightClientHeaderContainer - 15, // 22: ethereum.eth.v2.LightClientOptimisticUpdate.sync_aggregate:type_name -> ethereum.eth.v1.SyncAggregate - 16, // 23: ethereum.eth.v2.LightClientUpdateWithVersion.version:type_name -> ethereum.eth.v2.Version - 5, // 24: ethereum.eth.v2.LightClientUpdateWithVersion.data:type_name -> ethereum.eth.v2.LightClientUpdate - 25, // [25:25] is the sub-list for method output_type - 25, // [25:25] is the sub-list for method input_type - 25, // [25:25] is the sub-list for extension type_name - 25, // [25:25] is the sub-list for extension extendee - 0, // [0:25] is the sub-list for field type_name -} - -func init() { file_proto_eth_v2_beacon_lightclient_proto_init() } -func file_proto_eth_v2_beacon_lightclient_proto_init() { - if File_proto_eth_v2_beacon_lightclient_proto != nil { - return - } - file_proto_eth_v2_version_proto_init() - file_proto_eth_v2_sync_committee_proto_init() - if !protoimpl.UnsafeEnabled { - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientHeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientHeaderCapella); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientHeaderDeneb); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientHeaderContainer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientBootstrap); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientFinalityUpdateWithVersion); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientFinalityUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientOptimisticUpdateWithVersion); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientOptimisticUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LightClientUpdateWithVersion); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_proto_eth_v2_beacon_lightclient_proto_msgTypes[3].OneofWrappers = []interface{}{ - (*LightClientHeaderContainer_HeaderAltair)(nil), - (*LightClientHeaderContainer_HeaderCapella)(nil), - (*LightClientHeaderContainer_HeaderDeneb)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_eth_v2_beacon_lightclient_proto_rawDesc, - NumEnums: 0, - NumMessages: 11, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_proto_eth_v2_beacon_lightclient_proto_goTypes, - DependencyIndexes: file_proto_eth_v2_beacon_lightclient_proto_depIdxs, - MessageInfos: file_proto_eth_v2_beacon_lightclient_proto_msgTypes, - }.Build() - File_proto_eth_v2_beacon_lightclient_proto = out.File - file_proto_eth_v2_beacon_lightclient_proto_rawDesc = nil - file_proto_eth_v2_beacon_lightclient_proto_goTypes = nil - file_proto_eth_v2_beacon_lightclient_proto_depIdxs = nil -} diff --git a/proto/eth/v2/beacon_lightclient.proto b/proto/eth/v2/beacon_lightclient.proto deleted file mode 100644 index e52fe819dcca..000000000000 --- a/proto/eth/v2/beacon_lightclient.proto +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2023 Prysmatic Labs. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -syntax = "proto3"; - -package ethereum.eth.v2; - -import "proto/eth/ext/options.proto"; -import "proto/eth/v1/beacon_block.proto"; -import "proto/eth/v2/version.proto"; -import "proto/eth/v2/sync_committee.proto"; -import "proto/engine/v1/execution_engine.proto"; - -option csharp_namespace = "Ethereum.Eth.V2"; -option go_package = "github.com/prysmaticlabs/prysm/v5/proto/eth/v2;eth"; -option java_multiple_files = true; -option java_outer_classname = "SyncCommitteeProto"; -option java_package = "org.ethereum.eth.v2"; -option php_namespace = "Ethereum\\Eth\\v2"; - -// Beacon LightClient API related messages. - -message LightClientHeader { - v1.BeaconBlockHeader beacon = 1; -} - -message LightClientHeaderCapella { - v1.BeaconBlockHeader beacon = 1; - ethereum.engine.v1.ExecutionPayloadHeaderCapella execution = 2; - repeated bytes execution_branch = 3; -} - -message LightClientHeaderDeneb { - v1.BeaconBlockHeader beacon = 1; - ethereum.engine.v1.ExecutionPayloadHeaderDeneb execution = 2; - repeated bytes execution_branch = 3; -} - -message LightClientHeaderContainer { - oneof header { - LightClientHeader header_altair = 1; - LightClientHeaderCapella header_capella = 2; - LightClientHeaderDeneb header_deneb = 3; - } -} - - -message LightClientBootstrap { - LightClientHeaderContainer header = 1; - SyncCommittee current_sync_committee = 2; - repeated bytes current_sync_committee_branch = 3; -} - -message LightClientUpdate { - LightClientHeaderContainer attested_header = 1; - SyncCommittee next_sync_committee = 2; - repeated bytes next_sync_committee_branch = 3; - LightClientHeaderContainer finalized_header = 4; - repeated bytes finality_branch = 5; - v1.SyncAggregate sync_aggregate = 6; - uint64 signature_slot = 7 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; -} - -message LightClientFinalityUpdateWithVersion { - v2.Version version = 1; - LightClientFinalityUpdate data = 2; -} - -message LightClientFinalityUpdate { - LightClientHeaderContainer attested_header = 1; - LightClientHeaderContainer finalized_header = 2; - repeated bytes finality_branch = 3; - v1.SyncAggregate sync_aggregate = 4; - uint64 signature_slot = 5 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; -} - -message LightClientOptimisticUpdateWithVersion { - v2.Version version = 1; - LightClientOptimisticUpdate data = 2; -} - -message LightClientOptimisticUpdate { - LightClientHeaderContainer attested_header = 1; - v1.SyncAggregate sync_aggregate = 2; - uint64 signature_slot = 3 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; -} - -message LightClientUpdateWithVersion { - v2.Version version = 1; - LightClientUpdate data = 2; -} \ No newline at end of file diff --git a/proto/eth/v2/custom.go b/proto/eth/v2/custom.go deleted file mode 100644 index 678b71a39ff5..000000000000 --- a/proto/eth/v2/custom.go +++ /dev/null @@ -1,98 +0,0 @@ -package eth - -import ( - "bytes" - "fmt" - "math/bits" - - enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" - - v1 "github.com/prysmaticlabs/prysm/v5/proto/eth/v1" -) - -const ( - NextSyncCommitteeIndex = uint64(55) - FinalizedRootIndex = uint64(105) -) - -func (x *SyncCommittee) Equals(other *SyncCommittee) bool { - if len(x.Pubkeys) != len(other.Pubkeys) { - return false - } - for i := range x.Pubkeys { - if !bytes.Equal(x.Pubkeys[i], other.Pubkeys[i]) { - return false - } - } - return bytes.Equal(x.AggregatePubkey, other.AggregatePubkey) -} - -func FloorLog2(x uint64) int { - return bits.Len64(x - 1) -} - -func isEmptyWithLength(bb [][]byte, length uint64) bool { - if len(bb) == 0 { - return true - } - l := FloorLog2(length) - if len(bb) != l { - return false - } - for _, b := range bb { - if !bytes.Equal(b, []byte{}) { - return false - } - } - return true -} - -func (x *LightClientUpdate) IsSyncCommitteeUpdate() bool { - return !isEmptyWithLength(x.GetNextSyncCommitteeBranch(), NextSyncCommitteeIndex) -} - -func (x *LightClientUpdate) IsFinalityUpdate() bool { - return !isEmptyWithLength(x.GetFinalityBranch(), FinalizedRootIndex) -} - -func (x *LightClientHeaderContainer) GetBeacon() (*v1.BeaconBlockHeader, error) { - switch input := x.Header.(type) { - case *LightClientHeaderContainer_HeaderAltair: - return input.HeaderAltair.Beacon, nil - case *LightClientHeaderContainer_HeaderCapella: - return input.HeaderCapella.Beacon, nil - case *LightClientHeaderContainer_HeaderDeneb: - return input.HeaderDeneb.Beacon, nil - default: - return nil, fmt.Errorf("unknown header type: %T", input) - } -} - -func (x *LightClientHeaderContainer) GetExecutionHeaderCapella() (*enginev1.ExecutionPayloadHeaderCapella, error) { - switch input := x.Header.(type) { - case *LightClientHeaderContainer_HeaderCapella: - return input.HeaderCapella.Execution, nil - default: - return nil, fmt.Errorf("header type %T not Capella", input) - } -} - -func (x *LightClientHeaderContainer) GetExecutionHeaderDeneb() (*enginev1.ExecutionPayloadHeaderDeneb, error) { - switch input := x.Header.(type) { - case *LightClientHeaderContainer_HeaderDeneb: - return input.HeaderDeneb.Execution, nil - default: - return nil, fmt.Errorf("header type %T not Deneb", input) - } -} - -func (x *LightClientHeaderContainer) GetExecutionBranch() ([][]byte, error) { - switch input := x.Header.(type) { - case *LightClientHeaderContainer_HeaderCapella: - return input.HeaderCapella.ExecutionBranch, nil - case *LightClientHeaderContainer_HeaderDeneb: - return input.HeaderDeneb.ExecutionBranch, nil - default: - return nil, fmt.Errorf("wrong header type %T", input) - } -} diff --git a/proto/eth/v2/grpc.ssz.go b/proto/eth/v2/grpc.ssz.go deleted file mode 100644 index 121782fb1f58..000000000000 --- a/proto/eth/v2/grpc.ssz.go +++ /dev/null @@ -1,6305 +0,0 @@ -// Code generated by fastssz. DO NOT EDIT. -// Hash: d9f0bc4bc63fed6da5a3070d72cc575e0a5a496a8725d3d6b58e11a5b67acd5f -package eth - -import ( - ssz "github.com/prysmaticlabs/fastssz" - github_com_prysmaticlabs_prysm_v5_consensus_types_primitives "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" - v11 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" - v1 "github.com/prysmaticlabs/prysm/v5/proto/eth/v1" -) - -// MarshalSSZ ssz marshals the SignedBeaconBlockAltair object -func (s *SignedBeaconBlockAltair) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(s) -} - -// MarshalSSZTo ssz marshals the SignedBeaconBlockAltair object to a target array -func (s *SignedBeaconBlockAltair) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(100) - - // Offset (0) 'Message' - dst = ssz.WriteOffset(dst, offset) - if s.Message == nil { - s.Message = new(BeaconBlockAltair) - } - offset += s.Message.SizeSSZ() - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - dst = append(dst, s.Signature...) - - // Field (0) 'Message' - if dst, err = s.Message.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the SignedBeaconBlockAltair object -func (s *SignedBeaconBlockAltair) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 100 { - return ssz.ErrSize - } - - tail := buf - var o0 uint64 - - // Offset (0) 'Message' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return ssz.ErrOffset - } - - if o0 != 100 { - return ssz.ErrInvalidVariableOffset - } - - // Field (1) 'Signature' - if cap(s.Signature) == 0 { - s.Signature = make([]byte, 0, len(buf[4:100])) - } - s.Signature = append(s.Signature, buf[4:100]...) - - // Field (0) 'Message' - { - buf = tail[o0:] - if s.Message == nil { - s.Message = new(BeaconBlockAltair) - } - if err = s.Message.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the SignedBeaconBlockAltair object -func (s *SignedBeaconBlockAltair) SizeSSZ() (size int) { - size = 100 - - // Field (0) 'Message' - if s.Message == nil { - s.Message = new(BeaconBlockAltair) - } - size += s.Message.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the SignedBeaconBlockAltair object -func (s *SignedBeaconBlockAltair) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(s) -} - -// HashTreeRootWith ssz hashes the SignedBeaconBlockAltair object with a hasher -func (s *SignedBeaconBlockAltair) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Message' - if err = s.Message.HashTreeRootWith(hh); err != nil { - return - } - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - hh.PutBytes(s.Signature) - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the SignedBeaconBlockBellatrix object -func (s *SignedBeaconBlockBellatrix) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(s) -} - -// MarshalSSZTo ssz marshals the SignedBeaconBlockBellatrix object to a target array -func (s *SignedBeaconBlockBellatrix) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(100) - - // Offset (0) 'Message' - dst = ssz.WriteOffset(dst, offset) - if s.Message == nil { - s.Message = new(BeaconBlockBellatrix) - } - offset += s.Message.SizeSSZ() - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - dst = append(dst, s.Signature...) - - // Field (0) 'Message' - if dst, err = s.Message.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the SignedBeaconBlockBellatrix object -func (s *SignedBeaconBlockBellatrix) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 100 { - return ssz.ErrSize - } - - tail := buf - var o0 uint64 - - // Offset (0) 'Message' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return ssz.ErrOffset - } - - if o0 != 100 { - return ssz.ErrInvalidVariableOffset - } - - // Field (1) 'Signature' - if cap(s.Signature) == 0 { - s.Signature = make([]byte, 0, len(buf[4:100])) - } - s.Signature = append(s.Signature, buf[4:100]...) - - // Field (0) 'Message' - { - buf = tail[o0:] - if s.Message == nil { - s.Message = new(BeaconBlockBellatrix) - } - if err = s.Message.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the SignedBeaconBlockBellatrix object -func (s *SignedBeaconBlockBellatrix) SizeSSZ() (size int) { - size = 100 - - // Field (0) 'Message' - if s.Message == nil { - s.Message = new(BeaconBlockBellatrix) - } - size += s.Message.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the SignedBeaconBlockBellatrix object -func (s *SignedBeaconBlockBellatrix) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(s) -} - -// HashTreeRootWith ssz hashes the SignedBeaconBlockBellatrix object with a hasher -func (s *SignedBeaconBlockBellatrix) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Message' - if err = s.Message.HashTreeRootWith(hh); err != nil { - return - } - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - hh.PutBytes(s.Signature) - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the SignedBeaconBlockCapella object -func (s *SignedBeaconBlockCapella) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(s) -} - -// MarshalSSZTo ssz marshals the SignedBeaconBlockCapella object to a target array -func (s *SignedBeaconBlockCapella) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(100) - - // Offset (0) 'Message' - dst = ssz.WriteOffset(dst, offset) - if s.Message == nil { - s.Message = new(BeaconBlockCapella) - } - offset += s.Message.SizeSSZ() - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - dst = append(dst, s.Signature...) - - // Field (0) 'Message' - if dst, err = s.Message.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the SignedBeaconBlockCapella object -func (s *SignedBeaconBlockCapella) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 100 { - return ssz.ErrSize - } - - tail := buf - var o0 uint64 - - // Offset (0) 'Message' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return ssz.ErrOffset - } - - if o0 != 100 { - return ssz.ErrInvalidVariableOffset - } - - // Field (1) 'Signature' - if cap(s.Signature) == 0 { - s.Signature = make([]byte, 0, len(buf[4:100])) - } - s.Signature = append(s.Signature, buf[4:100]...) - - // Field (0) 'Message' - { - buf = tail[o0:] - if s.Message == nil { - s.Message = new(BeaconBlockCapella) - } - if err = s.Message.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the SignedBeaconBlockCapella object -func (s *SignedBeaconBlockCapella) SizeSSZ() (size int) { - size = 100 - - // Field (0) 'Message' - if s.Message == nil { - s.Message = new(BeaconBlockCapella) - } - size += s.Message.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the SignedBeaconBlockCapella object -func (s *SignedBeaconBlockCapella) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(s) -} - -// HashTreeRootWith ssz hashes the SignedBeaconBlockCapella object with a hasher -func (s *SignedBeaconBlockCapella) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Message' - if err = s.Message.HashTreeRootWith(hh); err != nil { - return - } - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - hh.PutBytes(s.Signature) - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the SignedBeaconBlockDeneb object -func (s *SignedBeaconBlockDeneb) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(s) -} - -// MarshalSSZTo ssz marshals the SignedBeaconBlockDeneb object to a target array -func (s *SignedBeaconBlockDeneb) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(100) - - // Offset (0) 'Message' - dst = ssz.WriteOffset(dst, offset) - if s.Message == nil { - s.Message = new(BeaconBlockDeneb) - } - offset += s.Message.SizeSSZ() - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - dst = append(dst, s.Signature...) - - // Field (0) 'Message' - if dst, err = s.Message.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the SignedBeaconBlockDeneb object -func (s *SignedBeaconBlockDeneb) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 100 { - return ssz.ErrSize - } - - tail := buf - var o0 uint64 - - // Offset (0) 'Message' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return ssz.ErrOffset - } - - if o0 != 100 { - return ssz.ErrInvalidVariableOffset - } - - // Field (1) 'Signature' - if cap(s.Signature) == 0 { - s.Signature = make([]byte, 0, len(buf[4:100])) - } - s.Signature = append(s.Signature, buf[4:100]...) - - // Field (0) 'Message' - { - buf = tail[o0:] - if s.Message == nil { - s.Message = new(BeaconBlockDeneb) - } - if err = s.Message.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the SignedBeaconBlockDeneb object -func (s *SignedBeaconBlockDeneb) SizeSSZ() (size int) { - size = 100 - - // Field (0) 'Message' - if s.Message == nil { - s.Message = new(BeaconBlockDeneb) - } - size += s.Message.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the SignedBeaconBlockDeneb object -func (s *SignedBeaconBlockDeneb) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(s) -} - -// HashTreeRootWith ssz hashes the SignedBeaconBlockDeneb object with a hasher -func (s *SignedBeaconBlockDeneb) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Message' - if err = s.Message.HashTreeRootWith(hh); err != nil { - return - } - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - hh.PutBytes(s.Signature) - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the SignedBlindedBeaconBlockBellatrix object -func (s *SignedBlindedBeaconBlockBellatrix) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(s) -} - -// MarshalSSZTo ssz marshals the SignedBlindedBeaconBlockBellatrix object to a target array -func (s *SignedBlindedBeaconBlockBellatrix) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(100) - - // Offset (0) 'Message' - dst = ssz.WriteOffset(dst, offset) - if s.Message == nil { - s.Message = new(BlindedBeaconBlockBellatrix) - } - offset += s.Message.SizeSSZ() - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - dst = append(dst, s.Signature...) - - // Field (0) 'Message' - if dst, err = s.Message.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the SignedBlindedBeaconBlockBellatrix object -func (s *SignedBlindedBeaconBlockBellatrix) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 100 { - return ssz.ErrSize - } - - tail := buf - var o0 uint64 - - // Offset (0) 'Message' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return ssz.ErrOffset - } - - if o0 != 100 { - return ssz.ErrInvalidVariableOffset - } - - // Field (1) 'Signature' - if cap(s.Signature) == 0 { - s.Signature = make([]byte, 0, len(buf[4:100])) - } - s.Signature = append(s.Signature, buf[4:100]...) - - // Field (0) 'Message' - { - buf = tail[o0:] - if s.Message == nil { - s.Message = new(BlindedBeaconBlockBellatrix) - } - if err = s.Message.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the SignedBlindedBeaconBlockBellatrix object -func (s *SignedBlindedBeaconBlockBellatrix) SizeSSZ() (size int) { - size = 100 - - // Field (0) 'Message' - if s.Message == nil { - s.Message = new(BlindedBeaconBlockBellatrix) - } - size += s.Message.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the SignedBlindedBeaconBlockBellatrix object -func (s *SignedBlindedBeaconBlockBellatrix) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(s) -} - -// HashTreeRootWith ssz hashes the SignedBlindedBeaconBlockBellatrix object with a hasher -func (s *SignedBlindedBeaconBlockBellatrix) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Message' - if err = s.Message.HashTreeRootWith(hh); err != nil { - return - } - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - hh.PutBytes(s.Signature) - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the SignedBlindedBeaconBlockCapella object -func (s *SignedBlindedBeaconBlockCapella) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(s) -} - -// MarshalSSZTo ssz marshals the SignedBlindedBeaconBlockCapella object to a target array -func (s *SignedBlindedBeaconBlockCapella) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(100) - - // Offset (0) 'Message' - dst = ssz.WriteOffset(dst, offset) - if s.Message == nil { - s.Message = new(BlindedBeaconBlockCapella) - } - offset += s.Message.SizeSSZ() - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - dst = append(dst, s.Signature...) - - // Field (0) 'Message' - if dst, err = s.Message.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the SignedBlindedBeaconBlockCapella object -func (s *SignedBlindedBeaconBlockCapella) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 100 { - return ssz.ErrSize - } - - tail := buf - var o0 uint64 - - // Offset (0) 'Message' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return ssz.ErrOffset - } - - if o0 != 100 { - return ssz.ErrInvalidVariableOffset - } - - // Field (1) 'Signature' - if cap(s.Signature) == 0 { - s.Signature = make([]byte, 0, len(buf[4:100])) - } - s.Signature = append(s.Signature, buf[4:100]...) - - // Field (0) 'Message' - { - buf = tail[o0:] - if s.Message == nil { - s.Message = new(BlindedBeaconBlockCapella) - } - if err = s.Message.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the SignedBlindedBeaconBlockCapella object -func (s *SignedBlindedBeaconBlockCapella) SizeSSZ() (size int) { - size = 100 - - // Field (0) 'Message' - if s.Message == nil { - s.Message = new(BlindedBeaconBlockCapella) - } - size += s.Message.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the SignedBlindedBeaconBlockCapella object -func (s *SignedBlindedBeaconBlockCapella) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(s) -} - -// HashTreeRootWith ssz hashes the SignedBlindedBeaconBlockCapella object with a hasher -func (s *SignedBlindedBeaconBlockCapella) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Message' - if err = s.Message.HashTreeRootWith(hh); err != nil { - return - } - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - hh.PutBytes(s.Signature) - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the SignedBlindedBeaconBlockDeneb object -func (s *SignedBlindedBeaconBlockDeneb) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(s) -} - -// MarshalSSZTo ssz marshals the SignedBlindedBeaconBlockDeneb object to a target array -func (s *SignedBlindedBeaconBlockDeneb) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(100) - - // Offset (0) 'Message' - dst = ssz.WriteOffset(dst, offset) - if s.Message == nil { - s.Message = new(BlindedBeaconBlockDeneb) - } - offset += s.Message.SizeSSZ() - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - dst = append(dst, s.Signature...) - - // Field (0) 'Message' - if dst, err = s.Message.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the SignedBlindedBeaconBlockDeneb object -func (s *SignedBlindedBeaconBlockDeneb) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 100 { - return ssz.ErrSize - } - - tail := buf - var o0 uint64 - - // Offset (0) 'Message' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return ssz.ErrOffset - } - - if o0 != 100 { - return ssz.ErrInvalidVariableOffset - } - - // Field (1) 'Signature' - if cap(s.Signature) == 0 { - s.Signature = make([]byte, 0, len(buf[4:100])) - } - s.Signature = append(s.Signature, buf[4:100]...) - - // Field (0) 'Message' - { - buf = tail[o0:] - if s.Message == nil { - s.Message = new(BlindedBeaconBlockDeneb) - } - if err = s.Message.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the SignedBlindedBeaconBlockDeneb object -func (s *SignedBlindedBeaconBlockDeneb) SizeSSZ() (size int) { - size = 100 - - // Field (0) 'Message' - if s.Message == nil { - s.Message = new(BlindedBeaconBlockDeneb) - } - size += s.Message.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the SignedBlindedBeaconBlockDeneb object -func (s *SignedBlindedBeaconBlockDeneb) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(s) -} - -// HashTreeRootWith ssz hashes the SignedBlindedBeaconBlockDeneb object with a hasher -func (s *SignedBlindedBeaconBlockDeneb) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Message' - if err = s.Message.HashTreeRootWith(hh); err != nil { - return - } - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - hh.PutBytes(s.Signature) - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BeaconBlockAltair object -func (b *BeaconBlockAltair) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BeaconBlockAltair object to a target array -func (b *BeaconBlockAltair) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(84) - - // Field (0) 'Slot' - dst = ssz.MarshalUint64(dst, uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - dst = ssz.MarshalUint64(dst, uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - dst = append(dst, b.ParentRoot...) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - dst = append(dst, b.StateRoot...) - - // Offset (4) 'Body' - dst = ssz.WriteOffset(dst, offset) - if b.Body == nil { - b.Body = new(BeaconBlockBodyAltair) - } - offset += b.Body.SizeSSZ() - - // Field (4) 'Body' - if dst, err = b.Body.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BeaconBlockAltair object -func (b *BeaconBlockAltair) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 84 { - return ssz.ErrSize - } - - tail := buf - var o4 uint64 - - // Field (0) 'Slot' - b.Slot = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[0:8])) - - // Field (1) 'ProposerIndex' - b.ProposerIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[8:16])) - - // Field (2) 'ParentRoot' - if cap(b.ParentRoot) == 0 { - b.ParentRoot = make([]byte, 0, len(buf[16:48])) - } - b.ParentRoot = append(b.ParentRoot, buf[16:48]...) - - // Field (3) 'StateRoot' - if cap(b.StateRoot) == 0 { - b.StateRoot = make([]byte, 0, len(buf[48:80])) - } - b.StateRoot = append(b.StateRoot, buf[48:80]...) - - // Offset (4) 'Body' - if o4 = ssz.ReadOffset(buf[80:84]); o4 > size { - return ssz.ErrOffset - } - - if o4 != 84 { - return ssz.ErrInvalidVariableOffset - } - - // Field (4) 'Body' - { - buf = tail[o4:] - if b.Body == nil { - b.Body = new(BeaconBlockBodyAltair) - } - if err = b.Body.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockAltair object -func (b *BeaconBlockAltair) SizeSSZ() (size int) { - size = 84 - - // Field (4) 'Body' - if b.Body == nil { - b.Body = new(BeaconBlockBodyAltair) - } - size += b.Body.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the BeaconBlockAltair object -func (b *BeaconBlockAltair) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BeaconBlockAltair object with a hasher -func (b *BeaconBlockAltair) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Slot' - hh.PutUint64(uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - hh.PutUint64(uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - hh.PutBytes(b.ParentRoot) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - hh.PutBytes(b.StateRoot) - - // Field (4) 'Body' - if err = b.Body.HashTreeRootWith(hh); err != nil { - return - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BeaconBlockBellatrix object -func (b *BeaconBlockBellatrix) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BeaconBlockBellatrix object to a target array -func (b *BeaconBlockBellatrix) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(84) - - // Field (0) 'Slot' - dst = ssz.MarshalUint64(dst, uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - dst = ssz.MarshalUint64(dst, uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - dst = append(dst, b.ParentRoot...) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - dst = append(dst, b.StateRoot...) - - // Offset (4) 'Body' - dst = ssz.WriteOffset(dst, offset) - if b.Body == nil { - b.Body = new(BeaconBlockBodyBellatrix) - } - offset += b.Body.SizeSSZ() - - // Field (4) 'Body' - if dst, err = b.Body.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BeaconBlockBellatrix object -func (b *BeaconBlockBellatrix) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 84 { - return ssz.ErrSize - } - - tail := buf - var o4 uint64 - - // Field (0) 'Slot' - b.Slot = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[0:8])) - - // Field (1) 'ProposerIndex' - b.ProposerIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[8:16])) - - // Field (2) 'ParentRoot' - if cap(b.ParentRoot) == 0 { - b.ParentRoot = make([]byte, 0, len(buf[16:48])) - } - b.ParentRoot = append(b.ParentRoot, buf[16:48]...) - - // Field (3) 'StateRoot' - if cap(b.StateRoot) == 0 { - b.StateRoot = make([]byte, 0, len(buf[48:80])) - } - b.StateRoot = append(b.StateRoot, buf[48:80]...) - - // Offset (4) 'Body' - if o4 = ssz.ReadOffset(buf[80:84]); o4 > size { - return ssz.ErrOffset - } - - if o4 != 84 { - return ssz.ErrInvalidVariableOffset - } - - // Field (4) 'Body' - { - buf = tail[o4:] - if b.Body == nil { - b.Body = new(BeaconBlockBodyBellatrix) - } - if err = b.Body.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockBellatrix object -func (b *BeaconBlockBellatrix) SizeSSZ() (size int) { - size = 84 - - // Field (4) 'Body' - if b.Body == nil { - b.Body = new(BeaconBlockBodyBellatrix) - } - size += b.Body.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the BeaconBlockBellatrix object -func (b *BeaconBlockBellatrix) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BeaconBlockBellatrix object with a hasher -func (b *BeaconBlockBellatrix) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Slot' - hh.PutUint64(uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - hh.PutUint64(uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - hh.PutBytes(b.ParentRoot) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - hh.PutBytes(b.StateRoot) - - // Field (4) 'Body' - if err = b.Body.HashTreeRootWith(hh); err != nil { - return - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BlindedBeaconBlockBellatrix object -func (b *BlindedBeaconBlockBellatrix) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BlindedBeaconBlockBellatrix object to a target array -func (b *BlindedBeaconBlockBellatrix) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(84) - - // Field (0) 'Slot' - dst = ssz.MarshalUint64(dst, uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - dst = ssz.MarshalUint64(dst, uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - dst = append(dst, b.ParentRoot...) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - dst = append(dst, b.StateRoot...) - - // Offset (4) 'Body' - dst = ssz.WriteOffset(dst, offset) - if b.Body == nil { - b.Body = new(BlindedBeaconBlockBodyBellatrix) - } - offset += b.Body.SizeSSZ() - - // Field (4) 'Body' - if dst, err = b.Body.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BlindedBeaconBlockBellatrix object -func (b *BlindedBeaconBlockBellatrix) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 84 { - return ssz.ErrSize - } - - tail := buf - var o4 uint64 - - // Field (0) 'Slot' - b.Slot = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[0:8])) - - // Field (1) 'ProposerIndex' - b.ProposerIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[8:16])) - - // Field (2) 'ParentRoot' - if cap(b.ParentRoot) == 0 { - b.ParentRoot = make([]byte, 0, len(buf[16:48])) - } - b.ParentRoot = append(b.ParentRoot, buf[16:48]...) - - // Field (3) 'StateRoot' - if cap(b.StateRoot) == 0 { - b.StateRoot = make([]byte, 0, len(buf[48:80])) - } - b.StateRoot = append(b.StateRoot, buf[48:80]...) - - // Offset (4) 'Body' - if o4 = ssz.ReadOffset(buf[80:84]); o4 > size { - return ssz.ErrOffset - } - - if o4 != 84 { - return ssz.ErrInvalidVariableOffset - } - - // Field (4) 'Body' - { - buf = tail[o4:] - if b.Body == nil { - b.Body = new(BlindedBeaconBlockBodyBellatrix) - } - if err = b.Body.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BlindedBeaconBlockBellatrix object -func (b *BlindedBeaconBlockBellatrix) SizeSSZ() (size int) { - size = 84 - - // Field (4) 'Body' - if b.Body == nil { - b.Body = new(BlindedBeaconBlockBodyBellatrix) - } - size += b.Body.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the BlindedBeaconBlockBellatrix object -func (b *BlindedBeaconBlockBellatrix) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BlindedBeaconBlockBellatrix object with a hasher -func (b *BlindedBeaconBlockBellatrix) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Slot' - hh.PutUint64(uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - hh.PutUint64(uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - hh.PutBytes(b.ParentRoot) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - hh.PutBytes(b.StateRoot) - - // Field (4) 'Body' - if err = b.Body.HashTreeRootWith(hh); err != nil { - return - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BeaconBlockCapella object -func (b *BeaconBlockCapella) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BeaconBlockCapella object to a target array -func (b *BeaconBlockCapella) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(84) - - // Field (0) 'Slot' - dst = ssz.MarshalUint64(dst, uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - dst = ssz.MarshalUint64(dst, uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - dst = append(dst, b.ParentRoot...) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - dst = append(dst, b.StateRoot...) - - // Offset (4) 'Body' - dst = ssz.WriteOffset(dst, offset) - if b.Body == nil { - b.Body = new(BeaconBlockBodyCapella) - } - offset += b.Body.SizeSSZ() - - // Field (4) 'Body' - if dst, err = b.Body.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BeaconBlockCapella object -func (b *BeaconBlockCapella) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 84 { - return ssz.ErrSize - } - - tail := buf - var o4 uint64 - - // Field (0) 'Slot' - b.Slot = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[0:8])) - - // Field (1) 'ProposerIndex' - b.ProposerIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[8:16])) - - // Field (2) 'ParentRoot' - if cap(b.ParentRoot) == 0 { - b.ParentRoot = make([]byte, 0, len(buf[16:48])) - } - b.ParentRoot = append(b.ParentRoot, buf[16:48]...) - - // Field (3) 'StateRoot' - if cap(b.StateRoot) == 0 { - b.StateRoot = make([]byte, 0, len(buf[48:80])) - } - b.StateRoot = append(b.StateRoot, buf[48:80]...) - - // Offset (4) 'Body' - if o4 = ssz.ReadOffset(buf[80:84]); o4 > size { - return ssz.ErrOffset - } - - if o4 != 84 { - return ssz.ErrInvalidVariableOffset - } - - // Field (4) 'Body' - { - buf = tail[o4:] - if b.Body == nil { - b.Body = new(BeaconBlockBodyCapella) - } - if err = b.Body.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockCapella object -func (b *BeaconBlockCapella) SizeSSZ() (size int) { - size = 84 - - // Field (4) 'Body' - if b.Body == nil { - b.Body = new(BeaconBlockBodyCapella) - } - size += b.Body.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the BeaconBlockCapella object -func (b *BeaconBlockCapella) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BeaconBlockCapella object with a hasher -func (b *BeaconBlockCapella) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Slot' - hh.PutUint64(uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - hh.PutUint64(uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - hh.PutBytes(b.ParentRoot) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - hh.PutBytes(b.StateRoot) - - // Field (4) 'Body' - if err = b.Body.HashTreeRootWith(hh); err != nil { - return - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BlindedBeaconBlockCapella object -func (b *BlindedBeaconBlockCapella) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BlindedBeaconBlockCapella object to a target array -func (b *BlindedBeaconBlockCapella) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(84) - - // Field (0) 'Slot' - dst = ssz.MarshalUint64(dst, uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - dst = ssz.MarshalUint64(dst, uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - dst = append(dst, b.ParentRoot...) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - dst = append(dst, b.StateRoot...) - - // Offset (4) 'Body' - dst = ssz.WriteOffset(dst, offset) - if b.Body == nil { - b.Body = new(BlindedBeaconBlockBodyCapella) - } - offset += b.Body.SizeSSZ() - - // Field (4) 'Body' - if dst, err = b.Body.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BlindedBeaconBlockCapella object -func (b *BlindedBeaconBlockCapella) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 84 { - return ssz.ErrSize - } - - tail := buf - var o4 uint64 - - // Field (0) 'Slot' - b.Slot = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[0:8])) - - // Field (1) 'ProposerIndex' - b.ProposerIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[8:16])) - - // Field (2) 'ParentRoot' - if cap(b.ParentRoot) == 0 { - b.ParentRoot = make([]byte, 0, len(buf[16:48])) - } - b.ParentRoot = append(b.ParentRoot, buf[16:48]...) - - // Field (3) 'StateRoot' - if cap(b.StateRoot) == 0 { - b.StateRoot = make([]byte, 0, len(buf[48:80])) - } - b.StateRoot = append(b.StateRoot, buf[48:80]...) - - // Offset (4) 'Body' - if o4 = ssz.ReadOffset(buf[80:84]); o4 > size { - return ssz.ErrOffset - } - - if o4 != 84 { - return ssz.ErrInvalidVariableOffset - } - - // Field (4) 'Body' - { - buf = tail[o4:] - if b.Body == nil { - b.Body = new(BlindedBeaconBlockBodyCapella) - } - if err = b.Body.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BlindedBeaconBlockCapella object -func (b *BlindedBeaconBlockCapella) SizeSSZ() (size int) { - size = 84 - - // Field (4) 'Body' - if b.Body == nil { - b.Body = new(BlindedBeaconBlockBodyCapella) - } - size += b.Body.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the BlindedBeaconBlockCapella object -func (b *BlindedBeaconBlockCapella) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BlindedBeaconBlockCapella object with a hasher -func (b *BlindedBeaconBlockCapella) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Slot' - hh.PutUint64(uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - hh.PutUint64(uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - hh.PutBytes(b.ParentRoot) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - hh.PutBytes(b.StateRoot) - - // Field (4) 'Body' - if err = b.Body.HashTreeRootWith(hh); err != nil { - return - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BeaconBlockDeneb object -func (b *BeaconBlockDeneb) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BeaconBlockDeneb object to a target array -func (b *BeaconBlockDeneb) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(84) - - // Field (0) 'Slot' - dst = ssz.MarshalUint64(dst, uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - dst = ssz.MarshalUint64(dst, uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - dst = append(dst, b.ParentRoot...) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - dst = append(dst, b.StateRoot...) - - // Offset (4) 'Body' - dst = ssz.WriteOffset(dst, offset) - if b.Body == nil { - b.Body = new(BeaconBlockBodyDeneb) - } - offset += b.Body.SizeSSZ() - - // Field (4) 'Body' - if dst, err = b.Body.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BeaconBlockDeneb object -func (b *BeaconBlockDeneb) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 84 { - return ssz.ErrSize - } - - tail := buf - var o4 uint64 - - // Field (0) 'Slot' - b.Slot = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[0:8])) - - // Field (1) 'ProposerIndex' - b.ProposerIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[8:16])) - - // Field (2) 'ParentRoot' - if cap(b.ParentRoot) == 0 { - b.ParentRoot = make([]byte, 0, len(buf[16:48])) - } - b.ParentRoot = append(b.ParentRoot, buf[16:48]...) - - // Field (3) 'StateRoot' - if cap(b.StateRoot) == 0 { - b.StateRoot = make([]byte, 0, len(buf[48:80])) - } - b.StateRoot = append(b.StateRoot, buf[48:80]...) - - // Offset (4) 'Body' - if o4 = ssz.ReadOffset(buf[80:84]); o4 > size { - return ssz.ErrOffset - } - - if o4 != 84 { - return ssz.ErrInvalidVariableOffset - } - - // Field (4) 'Body' - { - buf = tail[o4:] - if b.Body == nil { - b.Body = new(BeaconBlockBodyDeneb) - } - if err = b.Body.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockDeneb object -func (b *BeaconBlockDeneb) SizeSSZ() (size int) { - size = 84 - - // Field (4) 'Body' - if b.Body == nil { - b.Body = new(BeaconBlockBodyDeneb) - } - size += b.Body.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the BeaconBlockDeneb object -func (b *BeaconBlockDeneb) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BeaconBlockDeneb object with a hasher -func (b *BeaconBlockDeneb) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Slot' - hh.PutUint64(uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - hh.PutUint64(uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - hh.PutBytes(b.ParentRoot) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - hh.PutBytes(b.StateRoot) - - // Field (4) 'Body' - if err = b.Body.HashTreeRootWith(hh); err != nil { - return - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BlindedBeaconBlockDeneb object -func (b *BlindedBeaconBlockDeneb) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BlindedBeaconBlockDeneb object to a target array -func (b *BlindedBeaconBlockDeneb) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(84) - - // Field (0) 'Slot' - dst = ssz.MarshalUint64(dst, uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - dst = ssz.MarshalUint64(dst, uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - dst = append(dst, b.ParentRoot...) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - dst = append(dst, b.StateRoot...) - - // Offset (4) 'Body' - dst = ssz.WriteOffset(dst, offset) - if b.Body == nil { - b.Body = new(BlindedBeaconBlockBodyDeneb) - } - offset += b.Body.SizeSSZ() - - // Field (4) 'Body' - if dst, err = b.Body.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BlindedBeaconBlockDeneb object -func (b *BlindedBeaconBlockDeneb) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 84 { - return ssz.ErrSize - } - - tail := buf - var o4 uint64 - - // Field (0) 'Slot' - b.Slot = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[0:8])) - - // Field (1) 'ProposerIndex' - b.ProposerIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[8:16])) - - // Field (2) 'ParentRoot' - if cap(b.ParentRoot) == 0 { - b.ParentRoot = make([]byte, 0, len(buf[16:48])) - } - b.ParentRoot = append(b.ParentRoot, buf[16:48]...) - - // Field (3) 'StateRoot' - if cap(b.StateRoot) == 0 { - b.StateRoot = make([]byte, 0, len(buf[48:80])) - } - b.StateRoot = append(b.StateRoot, buf[48:80]...) - - // Offset (4) 'Body' - if o4 = ssz.ReadOffset(buf[80:84]); o4 > size { - return ssz.ErrOffset - } - - if o4 != 84 { - return ssz.ErrInvalidVariableOffset - } - - // Field (4) 'Body' - { - buf = tail[o4:] - if b.Body == nil { - b.Body = new(BlindedBeaconBlockBodyDeneb) - } - if err = b.Body.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BlindedBeaconBlockDeneb object -func (b *BlindedBeaconBlockDeneb) SizeSSZ() (size int) { - size = 84 - - // Field (4) 'Body' - if b.Body == nil { - b.Body = new(BlindedBeaconBlockBodyDeneb) - } - size += b.Body.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the BlindedBeaconBlockDeneb object -func (b *BlindedBeaconBlockDeneb) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BlindedBeaconBlockDeneb object with a hasher -func (b *BlindedBeaconBlockDeneb) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Slot' - hh.PutUint64(uint64(b.Slot)) - - // Field (1) 'ProposerIndex' - hh.PutUint64(uint64(b.ProposerIndex)) - - // Field (2) 'ParentRoot' - if size := len(b.ParentRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) - return - } - hh.PutBytes(b.ParentRoot) - - // Field (3) 'StateRoot' - if size := len(b.StateRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) - return - } - hh.PutBytes(b.StateRoot) - - // Field (4) 'Body' - if err = b.Body.HashTreeRootWith(hh); err != nil { - return - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BeaconBlockBodyAltair object -func (b *BeaconBlockBodyAltair) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BeaconBlockBodyAltair object to a target array -func (b *BeaconBlockBodyAltair) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(380) - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - dst = append(dst, b.RandaoReveal...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if dst, err = b.Eth1Data.MarshalSSZTo(dst); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - dst = append(dst, b.Graffiti...) - - // Offset (3) 'ProposerSlashings' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.ProposerSlashings) * 416 - - // Offset (4) 'AttesterSlashings' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - offset += 4 - offset += b.AttesterSlashings[ii].SizeSSZ() - } - - // Offset (5) 'Attestations' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.Attestations); ii++ { - offset += 4 - offset += b.Attestations[ii].SizeSSZ() - } - - // Offset (6) 'Deposits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.Deposits) * 1240 - - // Offset (7) 'VoluntaryExits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.VoluntaryExits) * 112 - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if dst, err = b.SyncAggregate.MarshalSSZTo(dst); err != nil { - return - } - - // Field (3) 'ProposerSlashings' - if size := len(b.ProposerSlashings); size > 16 { - err = ssz.ErrListTooBigFn("--.ProposerSlashings", size, 16) - return - } - for ii := 0; ii < len(b.ProposerSlashings); ii++ { - if dst, err = b.ProposerSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (4) 'AttesterSlashings' - if size := len(b.AttesterSlashings); size > 2 { - err = ssz.ErrListTooBigFn("--.AttesterSlashings", size, 2) - return - } - { - offset = 4 * len(b.AttesterSlashings) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.AttesterSlashings[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - if dst, err = b.AttesterSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (5) 'Attestations' - if size := len(b.Attestations); size > 128 { - err = ssz.ErrListTooBigFn("--.Attestations", size, 128) - return - } - { - offset = 4 * len(b.Attestations) - for ii := 0; ii < len(b.Attestations); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.Attestations[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.Attestations); ii++ { - if dst, err = b.Attestations[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (6) 'Deposits' - if size := len(b.Deposits); size > 16 { - err = ssz.ErrListTooBigFn("--.Deposits", size, 16) - return - } - for ii := 0; ii < len(b.Deposits); ii++ { - if dst, err = b.Deposits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (7) 'VoluntaryExits' - if size := len(b.VoluntaryExits); size > 16 { - err = ssz.ErrListTooBigFn("--.VoluntaryExits", size, 16) - return - } - for ii := 0; ii < len(b.VoluntaryExits); ii++ { - if dst, err = b.VoluntaryExits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BeaconBlockBodyAltair object -func (b *BeaconBlockBodyAltair) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 380 { - return ssz.ErrSize - } - - tail := buf - var o3, o4, o5, o6, o7 uint64 - - // Field (0) 'RandaoReveal' - if cap(b.RandaoReveal) == 0 { - b.RandaoReveal = make([]byte, 0, len(buf[0:96])) - } - b.RandaoReveal = append(b.RandaoReveal, buf[0:96]...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if err = b.Eth1Data.UnmarshalSSZ(buf[96:168]); err != nil { - return err - } - - // Field (2) 'Graffiti' - if cap(b.Graffiti) == 0 { - b.Graffiti = make([]byte, 0, len(buf[168:200])) - } - b.Graffiti = append(b.Graffiti, buf[168:200]...) - - // Offset (3) 'ProposerSlashings' - if o3 = ssz.ReadOffset(buf[200:204]); o3 > size { - return ssz.ErrOffset - } - - if o3 != 380 { - return ssz.ErrInvalidVariableOffset - } - - // Offset (4) 'AttesterSlashings' - if o4 = ssz.ReadOffset(buf[204:208]); o4 > size || o3 > o4 { - return ssz.ErrOffset - } - - // Offset (5) 'Attestations' - if o5 = ssz.ReadOffset(buf[208:212]); o5 > size || o4 > o5 { - return ssz.ErrOffset - } - - // Offset (6) 'Deposits' - if o6 = ssz.ReadOffset(buf[212:216]); o6 > size || o5 > o6 { - return ssz.ErrOffset - } - - // Offset (7) 'VoluntaryExits' - if o7 = ssz.ReadOffset(buf[216:220]); o7 > size || o6 > o7 { - return ssz.ErrOffset - } - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if err = b.SyncAggregate.UnmarshalSSZ(buf[220:380]); err != nil { - return err - } - - // Field (3) 'ProposerSlashings' - { - buf = tail[o3:o4] - num, err := ssz.DivideInt2(len(buf), 416, 16) - if err != nil { - return err - } - b.ProposerSlashings = make([]*v1.ProposerSlashing, num) - for ii := 0; ii < num; ii++ { - if b.ProposerSlashings[ii] == nil { - b.ProposerSlashings[ii] = new(v1.ProposerSlashing) - } - if err = b.ProposerSlashings[ii].UnmarshalSSZ(buf[ii*416 : (ii+1)*416]); err != nil { - return err - } - } - } - - // Field (4) 'AttesterSlashings' - { - buf = tail[o4:o5] - num, err := ssz.DecodeDynamicLength(buf, 2) - if err != nil { - return err - } - b.AttesterSlashings = make([]*v1.AttesterSlashing, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.AttesterSlashings[indx] == nil { - b.AttesterSlashings[indx] = new(v1.AttesterSlashing) - } - if err = b.AttesterSlashings[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (5) 'Attestations' - { - buf = tail[o5:o6] - num, err := ssz.DecodeDynamicLength(buf, 128) - if err != nil { - return err - } - b.Attestations = make([]*v1.Attestation, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.Attestations[indx] == nil { - b.Attestations[indx] = new(v1.Attestation) - } - if err = b.Attestations[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (6) 'Deposits' - { - buf = tail[o6:o7] - num, err := ssz.DivideInt2(len(buf), 1240, 16) - if err != nil { - return err - } - b.Deposits = make([]*v1.Deposit, num) - for ii := 0; ii < num; ii++ { - if b.Deposits[ii] == nil { - b.Deposits[ii] = new(v1.Deposit) - } - if err = b.Deposits[ii].UnmarshalSSZ(buf[ii*1240 : (ii+1)*1240]); err != nil { - return err - } - } - } - - // Field (7) 'VoluntaryExits' - { - buf = tail[o7:] - num, err := ssz.DivideInt2(len(buf), 112, 16) - if err != nil { - return err - } - b.VoluntaryExits = make([]*v1.SignedVoluntaryExit, num) - for ii := 0; ii < num; ii++ { - if b.VoluntaryExits[ii] == nil { - b.VoluntaryExits[ii] = new(v1.SignedVoluntaryExit) - } - if err = b.VoluntaryExits[ii].UnmarshalSSZ(buf[ii*112 : (ii+1)*112]); err != nil { - return err - } - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockBodyAltair object -func (b *BeaconBlockBodyAltair) SizeSSZ() (size int) { - size = 380 - - // Field (3) 'ProposerSlashings' - size += len(b.ProposerSlashings) * 416 - - // Field (4) 'AttesterSlashings' - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - size += 4 - size += b.AttesterSlashings[ii].SizeSSZ() - } - - // Field (5) 'Attestations' - for ii := 0; ii < len(b.Attestations); ii++ { - size += 4 - size += b.Attestations[ii].SizeSSZ() - } - - // Field (6) 'Deposits' - size += len(b.Deposits) * 1240 - - // Field (7) 'VoluntaryExits' - size += len(b.VoluntaryExits) * 112 - - return -} - -// HashTreeRoot ssz hashes the BeaconBlockBodyAltair object -func (b *BeaconBlockBodyAltair) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BeaconBlockBodyAltair object with a hasher -func (b *BeaconBlockBodyAltair) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - hh.PutBytes(b.RandaoReveal) - - // Field (1) 'Eth1Data' - if err = b.Eth1Data.HashTreeRootWith(hh); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - hh.PutBytes(b.Graffiti) - - // Field (3) 'ProposerSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.ProposerSlashings)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.ProposerSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (4) 'AttesterSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.AttesterSlashings)) - if num > 2 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.AttesterSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 2) - } - - // Field (5) 'Attestations' - { - subIndx := hh.Index() - num := uint64(len(b.Attestations)) - if num > 128 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Attestations { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 128) - } - - // Field (6) 'Deposits' - { - subIndx := hh.Index() - num := uint64(len(b.Deposits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Deposits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (7) 'VoluntaryExits' - { - subIndx := hh.Index() - num := uint64(len(b.VoluntaryExits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.VoluntaryExits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (8) 'SyncAggregate' - if err = b.SyncAggregate.HashTreeRootWith(hh); err != nil { - return - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BeaconBlockBodyBellatrix object -func (b *BeaconBlockBodyBellatrix) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BeaconBlockBodyBellatrix object to a target array -func (b *BeaconBlockBodyBellatrix) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(384) - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - dst = append(dst, b.RandaoReveal...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if dst, err = b.Eth1Data.MarshalSSZTo(dst); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - dst = append(dst, b.Graffiti...) - - // Offset (3) 'ProposerSlashings' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.ProposerSlashings) * 416 - - // Offset (4) 'AttesterSlashings' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - offset += 4 - offset += b.AttesterSlashings[ii].SizeSSZ() - } - - // Offset (5) 'Attestations' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.Attestations); ii++ { - offset += 4 - offset += b.Attestations[ii].SizeSSZ() - } - - // Offset (6) 'Deposits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.Deposits) * 1240 - - // Offset (7) 'VoluntaryExits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.VoluntaryExits) * 112 - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if dst, err = b.SyncAggregate.MarshalSSZTo(dst); err != nil { - return - } - - // Offset (9) 'ExecutionPayload' - dst = ssz.WriteOffset(dst, offset) - if b.ExecutionPayload == nil { - b.ExecutionPayload = new(v11.ExecutionPayload) - } - offset += b.ExecutionPayload.SizeSSZ() - - // Field (3) 'ProposerSlashings' - if size := len(b.ProposerSlashings); size > 16 { - err = ssz.ErrListTooBigFn("--.ProposerSlashings", size, 16) - return - } - for ii := 0; ii < len(b.ProposerSlashings); ii++ { - if dst, err = b.ProposerSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (4) 'AttesterSlashings' - if size := len(b.AttesterSlashings); size > 2 { - err = ssz.ErrListTooBigFn("--.AttesterSlashings", size, 2) - return - } - { - offset = 4 * len(b.AttesterSlashings) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.AttesterSlashings[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - if dst, err = b.AttesterSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (5) 'Attestations' - if size := len(b.Attestations); size > 128 { - err = ssz.ErrListTooBigFn("--.Attestations", size, 128) - return - } - { - offset = 4 * len(b.Attestations) - for ii := 0; ii < len(b.Attestations); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.Attestations[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.Attestations); ii++ { - if dst, err = b.Attestations[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (6) 'Deposits' - if size := len(b.Deposits); size > 16 { - err = ssz.ErrListTooBigFn("--.Deposits", size, 16) - return - } - for ii := 0; ii < len(b.Deposits); ii++ { - if dst, err = b.Deposits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (7) 'VoluntaryExits' - if size := len(b.VoluntaryExits); size > 16 { - err = ssz.ErrListTooBigFn("--.VoluntaryExits", size, 16) - return - } - for ii := 0; ii < len(b.VoluntaryExits); ii++ { - if dst, err = b.VoluntaryExits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (9) 'ExecutionPayload' - if dst, err = b.ExecutionPayload.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BeaconBlockBodyBellatrix object -func (b *BeaconBlockBodyBellatrix) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 384 { - return ssz.ErrSize - } - - tail := buf - var o3, o4, o5, o6, o7, o9 uint64 - - // Field (0) 'RandaoReveal' - if cap(b.RandaoReveal) == 0 { - b.RandaoReveal = make([]byte, 0, len(buf[0:96])) - } - b.RandaoReveal = append(b.RandaoReveal, buf[0:96]...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if err = b.Eth1Data.UnmarshalSSZ(buf[96:168]); err != nil { - return err - } - - // Field (2) 'Graffiti' - if cap(b.Graffiti) == 0 { - b.Graffiti = make([]byte, 0, len(buf[168:200])) - } - b.Graffiti = append(b.Graffiti, buf[168:200]...) - - // Offset (3) 'ProposerSlashings' - if o3 = ssz.ReadOffset(buf[200:204]); o3 > size { - return ssz.ErrOffset - } - - if o3 != 384 { - return ssz.ErrInvalidVariableOffset - } - - // Offset (4) 'AttesterSlashings' - if o4 = ssz.ReadOffset(buf[204:208]); o4 > size || o3 > o4 { - return ssz.ErrOffset - } - - // Offset (5) 'Attestations' - if o5 = ssz.ReadOffset(buf[208:212]); o5 > size || o4 > o5 { - return ssz.ErrOffset - } - - // Offset (6) 'Deposits' - if o6 = ssz.ReadOffset(buf[212:216]); o6 > size || o5 > o6 { - return ssz.ErrOffset - } - - // Offset (7) 'VoluntaryExits' - if o7 = ssz.ReadOffset(buf[216:220]); o7 > size || o6 > o7 { - return ssz.ErrOffset - } - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if err = b.SyncAggregate.UnmarshalSSZ(buf[220:380]); err != nil { - return err - } - - // Offset (9) 'ExecutionPayload' - if o9 = ssz.ReadOffset(buf[380:384]); o9 > size || o7 > o9 { - return ssz.ErrOffset - } - - // Field (3) 'ProposerSlashings' - { - buf = tail[o3:o4] - num, err := ssz.DivideInt2(len(buf), 416, 16) - if err != nil { - return err - } - b.ProposerSlashings = make([]*v1.ProposerSlashing, num) - for ii := 0; ii < num; ii++ { - if b.ProposerSlashings[ii] == nil { - b.ProposerSlashings[ii] = new(v1.ProposerSlashing) - } - if err = b.ProposerSlashings[ii].UnmarshalSSZ(buf[ii*416 : (ii+1)*416]); err != nil { - return err - } - } - } - - // Field (4) 'AttesterSlashings' - { - buf = tail[o4:o5] - num, err := ssz.DecodeDynamicLength(buf, 2) - if err != nil { - return err - } - b.AttesterSlashings = make([]*v1.AttesterSlashing, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.AttesterSlashings[indx] == nil { - b.AttesterSlashings[indx] = new(v1.AttesterSlashing) - } - if err = b.AttesterSlashings[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (5) 'Attestations' - { - buf = tail[o5:o6] - num, err := ssz.DecodeDynamicLength(buf, 128) - if err != nil { - return err - } - b.Attestations = make([]*v1.Attestation, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.Attestations[indx] == nil { - b.Attestations[indx] = new(v1.Attestation) - } - if err = b.Attestations[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (6) 'Deposits' - { - buf = tail[o6:o7] - num, err := ssz.DivideInt2(len(buf), 1240, 16) - if err != nil { - return err - } - b.Deposits = make([]*v1.Deposit, num) - for ii := 0; ii < num; ii++ { - if b.Deposits[ii] == nil { - b.Deposits[ii] = new(v1.Deposit) - } - if err = b.Deposits[ii].UnmarshalSSZ(buf[ii*1240 : (ii+1)*1240]); err != nil { - return err - } - } - } - - // Field (7) 'VoluntaryExits' - { - buf = tail[o7:o9] - num, err := ssz.DivideInt2(len(buf), 112, 16) - if err != nil { - return err - } - b.VoluntaryExits = make([]*v1.SignedVoluntaryExit, num) - for ii := 0; ii < num; ii++ { - if b.VoluntaryExits[ii] == nil { - b.VoluntaryExits[ii] = new(v1.SignedVoluntaryExit) - } - if err = b.VoluntaryExits[ii].UnmarshalSSZ(buf[ii*112 : (ii+1)*112]); err != nil { - return err - } - } - } - - // Field (9) 'ExecutionPayload' - { - buf = tail[o9:] - if b.ExecutionPayload == nil { - b.ExecutionPayload = new(v11.ExecutionPayload) - } - if err = b.ExecutionPayload.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockBodyBellatrix object -func (b *BeaconBlockBodyBellatrix) SizeSSZ() (size int) { - size = 384 - - // Field (3) 'ProposerSlashings' - size += len(b.ProposerSlashings) * 416 - - // Field (4) 'AttesterSlashings' - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - size += 4 - size += b.AttesterSlashings[ii].SizeSSZ() - } - - // Field (5) 'Attestations' - for ii := 0; ii < len(b.Attestations); ii++ { - size += 4 - size += b.Attestations[ii].SizeSSZ() - } - - // Field (6) 'Deposits' - size += len(b.Deposits) * 1240 - - // Field (7) 'VoluntaryExits' - size += len(b.VoluntaryExits) * 112 - - // Field (9) 'ExecutionPayload' - if b.ExecutionPayload == nil { - b.ExecutionPayload = new(v11.ExecutionPayload) - } - size += b.ExecutionPayload.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the BeaconBlockBodyBellatrix object -func (b *BeaconBlockBodyBellatrix) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BeaconBlockBodyBellatrix object with a hasher -func (b *BeaconBlockBodyBellatrix) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - hh.PutBytes(b.RandaoReveal) - - // Field (1) 'Eth1Data' - if err = b.Eth1Data.HashTreeRootWith(hh); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - hh.PutBytes(b.Graffiti) - - // Field (3) 'ProposerSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.ProposerSlashings)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.ProposerSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (4) 'AttesterSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.AttesterSlashings)) - if num > 2 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.AttesterSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 2) - } - - // Field (5) 'Attestations' - { - subIndx := hh.Index() - num := uint64(len(b.Attestations)) - if num > 128 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Attestations { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 128) - } - - // Field (6) 'Deposits' - { - subIndx := hh.Index() - num := uint64(len(b.Deposits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Deposits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (7) 'VoluntaryExits' - { - subIndx := hh.Index() - num := uint64(len(b.VoluntaryExits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.VoluntaryExits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (8) 'SyncAggregate' - if err = b.SyncAggregate.HashTreeRootWith(hh); err != nil { - return - } - - // Field (9) 'ExecutionPayload' - if err = b.ExecutionPayload.HashTreeRootWith(hh); err != nil { - return - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BlindedBeaconBlockBodyBellatrix object -func (b *BlindedBeaconBlockBodyBellatrix) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BlindedBeaconBlockBodyBellatrix object to a target array -func (b *BlindedBeaconBlockBodyBellatrix) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(384) - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - dst = append(dst, b.RandaoReveal...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if dst, err = b.Eth1Data.MarshalSSZTo(dst); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - dst = append(dst, b.Graffiti...) - - // Offset (3) 'ProposerSlashings' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.ProposerSlashings) * 416 - - // Offset (4) 'AttesterSlashings' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - offset += 4 - offset += b.AttesterSlashings[ii].SizeSSZ() - } - - // Offset (5) 'Attestations' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.Attestations); ii++ { - offset += 4 - offset += b.Attestations[ii].SizeSSZ() - } - - // Offset (6) 'Deposits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.Deposits) * 1240 - - // Offset (7) 'VoluntaryExits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.VoluntaryExits) * 112 - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if dst, err = b.SyncAggregate.MarshalSSZTo(dst); err != nil { - return - } - - // Offset (9) 'ExecutionPayloadHeader' - dst = ssz.WriteOffset(dst, offset) - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = new(v11.ExecutionPayloadHeader) - } - offset += b.ExecutionPayloadHeader.SizeSSZ() - - // Field (3) 'ProposerSlashings' - if size := len(b.ProposerSlashings); size > 16 { - err = ssz.ErrListTooBigFn("--.ProposerSlashings", size, 16) - return - } - for ii := 0; ii < len(b.ProposerSlashings); ii++ { - if dst, err = b.ProposerSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (4) 'AttesterSlashings' - if size := len(b.AttesterSlashings); size > 2 { - err = ssz.ErrListTooBigFn("--.AttesterSlashings", size, 2) - return - } - { - offset = 4 * len(b.AttesterSlashings) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.AttesterSlashings[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - if dst, err = b.AttesterSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (5) 'Attestations' - if size := len(b.Attestations); size > 128 { - err = ssz.ErrListTooBigFn("--.Attestations", size, 128) - return - } - { - offset = 4 * len(b.Attestations) - for ii := 0; ii < len(b.Attestations); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.Attestations[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.Attestations); ii++ { - if dst, err = b.Attestations[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (6) 'Deposits' - if size := len(b.Deposits); size > 16 { - err = ssz.ErrListTooBigFn("--.Deposits", size, 16) - return - } - for ii := 0; ii < len(b.Deposits); ii++ { - if dst, err = b.Deposits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (7) 'VoluntaryExits' - if size := len(b.VoluntaryExits); size > 16 { - err = ssz.ErrListTooBigFn("--.VoluntaryExits", size, 16) - return - } - for ii := 0; ii < len(b.VoluntaryExits); ii++ { - if dst, err = b.VoluntaryExits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (9) 'ExecutionPayloadHeader' - if dst, err = b.ExecutionPayloadHeader.MarshalSSZTo(dst); err != nil { - return - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BlindedBeaconBlockBodyBellatrix object -func (b *BlindedBeaconBlockBodyBellatrix) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 384 { - return ssz.ErrSize - } - - tail := buf - var o3, o4, o5, o6, o7, o9 uint64 - - // Field (0) 'RandaoReveal' - if cap(b.RandaoReveal) == 0 { - b.RandaoReveal = make([]byte, 0, len(buf[0:96])) - } - b.RandaoReveal = append(b.RandaoReveal, buf[0:96]...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if err = b.Eth1Data.UnmarshalSSZ(buf[96:168]); err != nil { - return err - } - - // Field (2) 'Graffiti' - if cap(b.Graffiti) == 0 { - b.Graffiti = make([]byte, 0, len(buf[168:200])) - } - b.Graffiti = append(b.Graffiti, buf[168:200]...) - - // Offset (3) 'ProposerSlashings' - if o3 = ssz.ReadOffset(buf[200:204]); o3 > size { - return ssz.ErrOffset - } - - if o3 != 384 { - return ssz.ErrInvalidVariableOffset - } - - // Offset (4) 'AttesterSlashings' - if o4 = ssz.ReadOffset(buf[204:208]); o4 > size || o3 > o4 { - return ssz.ErrOffset - } - - // Offset (5) 'Attestations' - if o5 = ssz.ReadOffset(buf[208:212]); o5 > size || o4 > o5 { - return ssz.ErrOffset - } - - // Offset (6) 'Deposits' - if o6 = ssz.ReadOffset(buf[212:216]); o6 > size || o5 > o6 { - return ssz.ErrOffset - } - - // Offset (7) 'VoluntaryExits' - if o7 = ssz.ReadOffset(buf[216:220]); o7 > size || o6 > o7 { - return ssz.ErrOffset - } - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if err = b.SyncAggregate.UnmarshalSSZ(buf[220:380]); err != nil { - return err - } - - // Offset (9) 'ExecutionPayloadHeader' - if o9 = ssz.ReadOffset(buf[380:384]); o9 > size || o7 > o9 { - return ssz.ErrOffset - } - - // Field (3) 'ProposerSlashings' - { - buf = tail[o3:o4] - num, err := ssz.DivideInt2(len(buf), 416, 16) - if err != nil { - return err - } - b.ProposerSlashings = make([]*v1.ProposerSlashing, num) - for ii := 0; ii < num; ii++ { - if b.ProposerSlashings[ii] == nil { - b.ProposerSlashings[ii] = new(v1.ProposerSlashing) - } - if err = b.ProposerSlashings[ii].UnmarshalSSZ(buf[ii*416 : (ii+1)*416]); err != nil { - return err - } - } - } - - // Field (4) 'AttesterSlashings' - { - buf = tail[o4:o5] - num, err := ssz.DecodeDynamicLength(buf, 2) - if err != nil { - return err - } - b.AttesterSlashings = make([]*v1.AttesterSlashing, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.AttesterSlashings[indx] == nil { - b.AttesterSlashings[indx] = new(v1.AttesterSlashing) - } - if err = b.AttesterSlashings[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (5) 'Attestations' - { - buf = tail[o5:o6] - num, err := ssz.DecodeDynamicLength(buf, 128) - if err != nil { - return err - } - b.Attestations = make([]*v1.Attestation, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.Attestations[indx] == nil { - b.Attestations[indx] = new(v1.Attestation) - } - if err = b.Attestations[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (6) 'Deposits' - { - buf = tail[o6:o7] - num, err := ssz.DivideInt2(len(buf), 1240, 16) - if err != nil { - return err - } - b.Deposits = make([]*v1.Deposit, num) - for ii := 0; ii < num; ii++ { - if b.Deposits[ii] == nil { - b.Deposits[ii] = new(v1.Deposit) - } - if err = b.Deposits[ii].UnmarshalSSZ(buf[ii*1240 : (ii+1)*1240]); err != nil { - return err - } - } - } - - // Field (7) 'VoluntaryExits' - { - buf = tail[o7:o9] - num, err := ssz.DivideInt2(len(buf), 112, 16) - if err != nil { - return err - } - b.VoluntaryExits = make([]*v1.SignedVoluntaryExit, num) - for ii := 0; ii < num; ii++ { - if b.VoluntaryExits[ii] == nil { - b.VoluntaryExits[ii] = new(v1.SignedVoluntaryExit) - } - if err = b.VoluntaryExits[ii].UnmarshalSSZ(buf[ii*112 : (ii+1)*112]); err != nil { - return err - } - } - } - - // Field (9) 'ExecutionPayloadHeader' - { - buf = tail[o9:] - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = new(v11.ExecutionPayloadHeader) - } - if err = b.ExecutionPayloadHeader.UnmarshalSSZ(buf); err != nil { - return err - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BlindedBeaconBlockBodyBellatrix object -func (b *BlindedBeaconBlockBodyBellatrix) SizeSSZ() (size int) { - size = 384 - - // Field (3) 'ProposerSlashings' - size += len(b.ProposerSlashings) * 416 - - // Field (4) 'AttesterSlashings' - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - size += 4 - size += b.AttesterSlashings[ii].SizeSSZ() - } - - // Field (5) 'Attestations' - for ii := 0; ii < len(b.Attestations); ii++ { - size += 4 - size += b.Attestations[ii].SizeSSZ() - } - - // Field (6) 'Deposits' - size += len(b.Deposits) * 1240 - - // Field (7) 'VoluntaryExits' - size += len(b.VoluntaryExits) * 112 - - // Field (9) 'ExecutionPayloadHeader' - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = new(v11.ExecutionPayloadHeader) - } - size += b.ExecutionPayloadHeader.SizeSSZ() - - return -} - -// HashTreeRoot ssz hashes the BlindedBeaconBlockBodyBellatrix object -func (b *BlindedBeaconBlockBodyBellatrix) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BlindedBeaconBlockBodyBellatrix object with a hasher -func (b *BlindedBeaconBlockBodyBellatrix) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - hh.PutBytes(b.RandaoReveal) - - // Field (1) 'Eth1Data' - if err = b.Eth1Data.HashTreeRootWith(hh); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - hh.PutBytes(b.Graffiti) - - // Field (3) 'ProposerSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.ProposerSlashings)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.ProposerSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (4) 'AttesterSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.AttesterSlashings)) - if num > 2 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.AttesterSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 2) - } - - // Field (5) 'Attestations' - { - subIndx := hh.Index() - num := uint64(len(b.Attestations)) - if num > 128 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Attestations { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 128) - } - - // Field (6) 'Deposits' - { - subIndx := hh.Index() - num := uint64(len(b.Deposits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Deposits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (7) 'VoluntaryExits' - { - subIndx := hh.Index() - num := uint64(len(b.VoluntaryExits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.VoluntaryExits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (8) 'SyncAggregate' - if err = b.SyncAggregate.HashTreeRootWith(hh); err != nil { - return - } - - // Field (9) 'ExecutionPayloadHeader' - if err = b.ExecutionPayloadHeader.HashTreeRootWith(hh); err != nil { - return - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BeaconBlockBodyCapella object -func (b *BeaconBlockBodyCapella) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BeaconBlockBodyCapella object to a target array -func (b *BeaconBlockBodyCapella) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(388) - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - dst = append(dst, b.RandaoReveal...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if dst, err = b.Eth1Data.MarshalSSZTo(dst); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - dst = append(dst, b.Graffiti...) - - // Offset (3) 'ProposerSlashings' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.ProposerSlashings) * 416 - - // Offset (4) 'AttesterSlashings' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - offset += 4 - offset += b.AttesterSlashings[ii].SizeSSZ() - } - - // Offset (5) 'Attestations' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.Attestations); ii++ { - offset += 4 - offset += b.Attestations[ii].SizeSSZ() - } - - // Offset (6) 'Deposits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.Deposits) * 1240 - - // Offset (7) 'VoluntaryExits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.VoluntaryExits) * 112 - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if dst, err = b.SyncAggregate.MarshalSSZTo(dst); err != nil { - return - } - - // Offset (9) 'ExecutionPayload' - dst = ssz.WriteOffset(dst, offset) - if b.ExecutionPayload == nil { - b.ExecutionPayload = new(v11.ExecutionPayloadCapella) - } - offset += b.ExecutionPayload.SizeSSZ() - - // Offset (10) 'BlsToExecutionChanges' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.BlsToExecutionChanges) * 172 - - // Field (3) 'ProposerSlashings' - if size := len(b.ProposerSlashings); size > 16 { - err = ssz.ErrListTooBigFn("--.ProposerSlashings", size, 16) - return - } - for ii := 0; ii < len(b.ProposerSlashings); ii++ { - if dst, err = b.ProposerSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (4) 'AttesterSlashings' - if size := len(b.AttesterSlashings); size > 2 { - err = ssz.ErrListTooBigFn("--.AttesterSlashings", size, 2) - return - } - { - offset = 4 * len(b.AttesterSlashings) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.AttesterSlashings[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - if dst, err = b.AttesterSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (5) 'Attestations' - if size := len(b.Attestations); size > 128 { - err = ssz.ErrListTooBigFn("--.Attestations", size, 128) - return - } - { - offset = 4 * len(b.Attestations) - for ii := 0; ii < len(b.Attestations); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.Attestations[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.Attestations); ii++ { - if dst, err = b.Attestations[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (6) 'Deposits' - if size := len(b.Deposits); size > 16 { - err = ssz.ErrListTooBigFn("--.Deposits", size, 16) - return - } - for ii := 0; ii < len(b.Deposits); ii++ { - if dst, err = b.Deposits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (7) 'VoluntaryExits' - if size := len(b.VoluntaryExits); size > 16 { - err = ssz.ErrListTooBigFn("--.VoluntaryExits", size, 16) - return - } - for ii := 0; ii < len(b.VoluntaryExits); ii++ { - if dst, err = b.VoluntaryExits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (9) 'ExecutionPayload' - if dst, err = b.ExecutionPayload.MarshalSSZTo(dst); err != nil { - return - } - - // Field (10) 'BlsToExecutionChanges' - if size := len(b.BlsToExecutionChanges); size > 16 { - err = ssz.ErrListTooBigFn("--.BlsToExecutionChanges", size, 16) - return - } - for ii := 0; ii < len(b.BlsToExecutionChanges); ii++ { - if dst, err = b.BlsToExecutionChanges[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BeaconBlockBodyCapella object -func (b *BeaconBlockBodyCapella) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 388 { - return ssz.ErrSize - } - - tail := buf - var o3, o4, o5, o6, o7, o9, o10 uint64 - - // Field (0) 'RandaoReveal' - if cap(b.RandaoReveal) == 0 { - b.RandaoReveal = make([]byte, 0, len(buf[0:96])) - } - b.RandaoReveal = append(b.RandaoReveal, buf[0:96]...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if err = b.Eth1Data.UnmarshalSSZ(buf[96:168]); err != nil { - return err - } - - // Field (2) 'Graffiti' - if cap(b.Graffiti) == 0 { - b.Graffiti = make([]byte, 0, len(buf[168:200])) - } - b.Graffiti = append(b.Graffiti, buf[168:200]...) - - // Offset (3) 'ProposerSlashings' - if o3 = ssz.ReadOffset(buf[200:204]); o3 > size { - return ssz.ErrOffset - } - - if o3 != 388 { - return ssz.ErrInvalidVariableOffset - } - - // Offset (4) 'AttesterSlashings' - if o4 = ssz.ReadOffset(buf[204:208]); o4 > size || o3 > o4 { - return ssz.ErrOffset - } - - // Offset (5) 'Attestations' - if o5 = ssz.ReadOffset(buf[208:212]); o5 > size || o4 > o5 { - return ssz.ErrOffset - } - - // Offset (6) 'Deposits' - if o6 = ssz.ReadOffset(buf[212:216]); o6 > size || o5 > o6 { - return ssz.ErrOffset - } - - // Offset (7) 'VoluntaryExits' - if o7 = ssz.ReadOffset(buf[216:220]); o7 > size || o6 > o7 { - return ssz.ErrOffset - } - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if err = b.SyncAggregate.UnmarshalSSZ(buf[220:380]); err != nil { - return err - } - - // Offset (9) 'ExecutionPayload' - if o9 = ssz.ReadOffset(buf[380:384]); o9 > size || o7 > o9 { - return ssz.ErrOffset - } - - // Offset (10) 'BlsToExecutionChanges' - if o10 = ssz.ReadOffset(buf[384:388]); o10 > size || o9 > o10 { - return ssz.ErrOffset - } - - // Field (3) 'ProposerSlashings' - { - buf = tail[o3:o4] - num, err := ssz.DivideInt2(len(buf), 416, 16) - if err != nil { - return err - } - b.ProposerSlashings = make([]*v1.ProposerSlashing, num) - for ii := 0; ii < num; ii++ { - if b.ProposerSlashings[ii] == nil { - b.ProposerSlashings[ii] = new(v1.ProposerSlashing) - } - if err = b.ProposerSlashings[ii].UnmarshalSSZ(buf[ii*416 : (ii+1)*416]); err != nil { - return err - } - } - } - - // Field (4) 'AttesterSlashings' - { - buf = tail[o4:o5] - num, err := ssz.DecodeDynamicLength(buf, 2) - if err != nil { - return err - } - b.AttesterSlashings = make([]*v1.AttesterSlashing, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.AttesterSlashings[indx] == nil { - b.AttesterSlashings[indx] = new(v1.AttesterSlashing) - } - if err = b.AttesterSlashings[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (5) 'Attestations' - { - buf = tail[o5:o6] - num, err := ssz.DecodeDynamicLength(buf, 128) - if err != nil { - return err - } - b.Attestations = make([]*v1.Attestation, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.Attestations[indx] == nil { - b.Attestations[indx] = new(v1.Attestation) - } - if err = b.Attestations[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (6) 'Deposits' - { - buf = tail[o6:o7] - num, err := ssz.DivideInt2(len(buf), 1240, 16) - if err != nil { - return err - } - b.Deposits = make([]*v1.Deposit, num) - for ii := 0; ii < num; ii++ { - if b.Deposits[ii] == nil { - b.Deposits[ii] = new(v1.Deposit) - } - if err = b.Deposits[ii].UnmarshalSSZ(buf[ii*1240 : (ii+1)*1240]); err != nil { - return err - } - } - } - - // Field (7) 'VoluntaryExits' - { - buf = tail[o7:o9] - num, err := ssz.DivideInt2(len(buf), 112, 16) - if err != nil { - return err - } - b.VoluntaryExits = make([]*v1.SignedVoluntaryExit, num) - for ii := 0; ii < num; ii++ { - if b.VoluntaryExits[ii] == nil { - b.VoluntaryExits[ii] = new(v1.SignedVoluntaryExit) - } - if err = b.VoluntaryExits[ii].UnmarshalSSZ(buf[ii*112 : (ii+1)*112]); err != nil { - return err - } - } - } - - // Field (9) 'ExecutionPayload' - { - buf = tail[o9:o10] - if b.ExecutionPayload == nil { - b.ExecutionPayload = new(v11.ExecutionPayloadCapella) - } - if err = b.ExecutionPayload.UnmarshalSSZ(buf); err != nil { - return err - } - } - - // Field (10) 'BlsToExecutionChanges' - { - buf = tail[o10:] - num, err := ssz.DivideInt2(len(buf), 172, 16) - if err != nil { - return err - } - b.BlsToExecutionChanges = make([]*SignedBLSToExecutionChange, num) - for ii := 0; ii < num; ii++ { - if b.BlsToExecutionChanges[ii] == nil { - b.BlsToExecutionChanges[ii] = new(SignedBLSToExecutionChange) - } - if err = b.BlsToExecutionChanges[ii].UnmarshalSSZ(buf[ii*172 : (ii+1)*172]); err != nil { - return err - } - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockBodyCapella object -func (b *BeaconBlockBodyCapella) SizeSSZ() (size int) { - size = 388 - - // Field (3) 'ProposerSlashings' - size += len(b.ProposerSlashings) * 416 - - // Field (4) 'AttesterSlashings' - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - size += 4 - size += b.AttesterSlashings[ii].SizeSSZ() - } - - // Field (5) 'Attestations' - for ii := 0; ii < len(b.Attestations); ii++ { - size += 4 - size += b.Attestations[ii].SizeSSZ() - } - - // Field (6) 'Deposits' - size += len(b.Deposits) * 1240 - - // Field (7) 'VoluntaryExits' - size += len(b.VoluntaryExits) * 112 - - // Field (9) 'ExecutionPayload' - if b.ExecutionPayload == nil { - b.ExecutionPayload = new(v11.ExecutionPayloadCapella) - } - size += b.ExecutionPayload.SizeSSZ() - - // Field (10) 'BlsToExecutionChanges' - size += len(b.BlsToExecutionChanges) * 172 - - return -} - -// HashTreeRoot ssz hashes the BeaconBlockBodyCapella object -func (b *BeaconBlockBodyCapella) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BeaconBlockBodyCapella object with a hasher -func (b *BeaconBlockBodyCapella) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - hh.PutBytes(b.RandaoReveal) - - // Field (1) 'Eth1Data' - if err = b.Eth1Data.HashTreeRootWith(hh); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - hh.PutBytes(b.Graffiti) - - // Field (3) 'ProposerSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.ProposerSlashings)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.ProposerSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (4) 'AttesterSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.AttesterSlashings)) - if num > 2 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.AttesterSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 2) - } - - // Field (5) 'Attestations' - { - subIndx := hh.Index() - num := uint64(len(b.Attestations)) - if num > 128 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Attestations { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 128) - } - - // Field (6) 'Deposits' - { - subIndx := hh.Index() - num := uint64(len(b.Deposits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Deposits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (7) 'VoluntaryExits' - { - subIndx := hh.Index() - num := uint64(len(b.VoluntaryExits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.VoluntaryExits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (8) 'SyncAggregate' - if err = b.SyncAggregate.HashTreeRootWith(hh); err != nil { - return - } - - // Field (9) 'ExecutionPayload' - if err = b.ExecutionPayload.HashTreeRootWith(hh); err != nil { - return - } - - // Field (10) 'BlsToExecutionChanges' - { - subIndx := hh.Index() - num := uint64(len(b.BlsToExecutionChanges)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.BlsToExecutionChanges { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BlindedBeaconBlockBodyCapella object -func (b *BlindedBeaconBlockBodyCapella) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BlindedBeaconBlockBodyCapella object to a target array -func (b *BlindedBeaconBlockBodyCapella) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(388) - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - dst = append(dst, b.RandaoReveal...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if dst, err = b.Eth1Data.MarshalSSZTo(dst); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - dst = append(dst, b.Graffiti...) - - // Offset (3) 'ProposerSlashings' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.ProposerSlashings) * 416 - - // Offset (4) 'AttesterSlashings' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - offset += 4 - offset += b.AttesterSlashings[ii].SizeSSZ() - } - - // Offset (5) 'Attestations' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.Attestations); ii++ { - offset += 4 - offset += b.Attestations[ii].SizeSSZ() - } - - // Offset (6) 'Deposits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.Deposits) * 1240 - - // Offset (7) 'VoluntaryExits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.VoluntaryExits) * 112 - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if dst, err = b.SyncAggregate.MarshalSSZTo(dst); err != nil { - return - } - - // Offset (9) 'ExecutionPayloadHeader' - dst = ssz.WriteOffset(dst, offset) - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = new(v11.ExecutionPayloadHeaderCapella) - } - offset += b.ExecutionPayloadHeader.SizeSSZ() - - // Offset (10) 'BlsToExecutionChanges' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.BlsToExecutionChanges) * 172 - - // Field (3) 'ProposerSlashings' - if size := len(b.ProposerSlashings); size > 16 { - err = ssz.ErrListTooBigFn("--.ProposerSlashings", size, 16) - return - } - for ii := 0; ii < len(b.ProposerSlashings); ii++ { - if dst, err = b.ProposerSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (4) 'AttesterSlashings' - if size := len(b.AttesterSlashings); size > 2 { - err = ssz.ErrListTooBigFn("--.AttesterSlashings", size, 2) - return - } - { - offset = 4 * len(b.AttesterSlashings) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.AttesterSlashings[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - if dst, err = b.AttesterSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (5) 'Attestations' - if size := len(b.Attestations); size > 128 { - err = ssz.ErrListTooBigFn("--.Attestations", size, 128) - return - } - { - offset = 4 * len(b.Attestations) - for ii := 0; ii < len(b.Attestations); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.Attestations[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.Attestations); ii++ { - if dst, err = b.Attestations[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (6) 'Deposits' - if size := len(b.Deposits); size > 16 { - err = ssz.ErrListTooBigFn("--.Deposits", size, 16) - return - } - for ii := 0; ii < len(b.Deposits); ii++ { - if dst, err = b.Deposits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (7) 'VoluntaryExits' - if size := len(b.VoluntaryExits); size > 16 { - err = ssz.ErrListTooBigFn("--.VoluntaryExits", size, 16) - return - } - for ii := 0; ii < len(b.VoluntaryExits); ii++ { - if dst, err = b.VoluntaryExits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (9) 'ExecutionPayloadHeader' - if dst, err = b.ExecutionPayloadHeader.MarshalSSZTo(dst); err != nil { - return - } - - // Field (10) 'BlsToExecutionChanges' - if size := len(b.BlsToExecutionChanges); size > 16 { - err = ssz.ErrListTooBigFn("--.BlsToExecutionChanges", size, 16) - return - } - for ii := 0; ii < len(b.BlsToExecutionChanges); ii++ { - if dst, err = b.BlsToExecutionChanges[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BlindedBeaconBlockBodyCapella object -func (b *BlindedBeaconBlockBodyCapella) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 388 { - return ssz.ErrSize - } - - tail := buf - var o3, o4, o5, o6, o7, o9, o10 uint64 - - // Field (0) 'RandaoReveal' - if cap(b.RandaoReveal) == 0 { - b.RandaoReveal = make([]byte, 0, len(buf[0:96])) - } - b.RandaoReveal = append(b.RandaoReveal, buf[0:96]...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if err = b.Eth1Data.UnmarshalSSZ(buf[96:168]); err != nil { - return err - } - - // Field (2) 'Graffiti' - if cap(b.Graffiti) == 0 { - b.Graffiti = make([]byte, 0, len(buf[168:200])) - } - b.Graffiti = append(b.Graffiti, buf[168:200]...) - - // Offset (3) 'ProposerSlashings' - if o3 = ssz.ReadOffset(buf[200:204]); o3 > size { - return ssz.ErrOffset - } - - if o3 != 388 { - return ssz.ErrInvalidVariableOffset - } - - // Offset (4) 'AttesterSlashings' - if o4 = ssz.ReadOffset(buf[204:208]); o4 > size || o3 > o4 { - return ssz.ErrOffset - } - - // Offset (5) 'Attestations' - if o5 = ssz.ReadOffset(buf[208:212]); o5 > size || o4 > o5 { - return ssz.ErrOffset - } - - // Offset (6) 'Deposits' - if o6 = ssz.ReadOffset(buf[212:216]); o6 > size || o5 > o6 { - return ssz.ErrOffset - } - - // Offset (7) 'VoluntaryExits' - if o7 = ssz.ReadOffset(buf[216:220]); o7 > size || o6 > o7 { - return ssz.ErrOffset - } - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if err = b.SyncAggregate.UnmarshalSSZ(buf[220:380]); err != nil { - return err - } - - // Offset (9) 'ExecutionPayloadHeader' - if o9 = ssz.ReadOffset(buf[380:384]); o9 > size || o7 > o9 { - return ssz.ErrOffset - } - - // Offset (10) 'BlsToExecutionChanges' - if o10 = ssz.ReadOffset(buf[384:388]); o10 > size || o9 > o10 { - return ssz.ErrOffset - } - - // Field (3) 'ProposerSlashings' - { - buf = tail[o3:o4] - num, err := ssz.DivideInt2(len(buf), 416, 16) - if err != nil { - return err - } - b.ProposerSlashings = make([]*v1.ProposerSlashing, num) - for ii := 0; ii < num; ii++ { - if b.ProposerSlashings[ii] == nil { - b.ProposerSlashings[ii] = new(v1.ProposerSlashing) - } - if err = b.ProposerSlashings[ii].UnmarshalSSZ(buf[ii*416 : (ii+1)*416]); err != nil { - return err - } - } - } - - // Field (4) 'AttesterSlashings' - { - buf = tail[o4:o5] - num, err := ssz.DecodeDynamicLength(buf, 2) - if err != nil { - return err - } - b.AttesterSlashings = make([]*v1.AttesterSlashing, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.AttesterSlashings[indx] == nil { - b.AttesterSlashings[indx] = new(v1.AttesterSlashing) - } - if err = b.AttesterSlashings[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (5) 'Attestations' - { - buf = tail[o5:o6] - num, err := ssz.DecodeDynamicLength(buf, 128) - if err != nil { - return err - } - b.Attestations = make([]*v1.Attestation, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.Attestations[indx] == nil { - b.Attestations[indx] = new(v1.Attestation) - } - if err = b.Attestations[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (6) 'Deposits' - { - buf = tail[o6:o7] - num, err := ssz.DivideInt2(len(buf), 1240, 16) - if err != nil { - return err - } - b.Deposits = make([]*v1.Deposit, num) - for ii := 0; ii < num; ii++ { - if b.Deposits[ii] == nil { - b.Deposits[ii] = new(v1.Deposit) - } - if err = b.Deposits[ii].UnmarshalSSZ(buf[ii*1240 : (ii+1)*1240]); err != nil { - return err - } - } - } - - // Field (7) 'VoluntaryExits' - { - buf = tail[o7:o9] - num, err := ssz.DivideInt2(len(buf), 112, 16) - if err != nil { - return err - } - b.VoluntaryExits = make([]*v1.SignedVoluntaryExit, num) - for ii := 0; ii < num; ii++ { - if b.VoluntaryExits[ii] == nil { - b.VoluntaryExits[ii] = new(v1.SignedVoluntaryExit) - } - if err = b.VoluntaryExits[ii].UnmarshalSSZ(buf[ii*112 : (ii+1)*112]); err != nil { - return err - } - } - } - - // Field (9) 'ExecutionPayloadHeader' - { - buf = tail[o9:o10] - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = new(v11.ExecutionPayloadHeaderCapella) - } - if err = b.ExecutionPayloadHeader.UnmarshalSSZ(buf); err != nil { - return err - } - } - - // Field (10) 'BlsToExecutionChanges' - { - buf = tail[o10:] - num, err := ssz.DivideInt2(len(buf), 172, 16) - if err != nil { - return err - } - b.BlsToExecutionChanges = make([]*SignedBLSToExecutionChange, num) - for ii := 0; ii < num; ii++ { - if b.BlsToExecutionChanges[ii] == nil { - b.BlsToExecutionChanges[ii] = new(SignedBLSToExecutionChange) - } - if err = b.BlsToExecutionChanges[ii].UnmarshalSSZ(buf[ii*172 : (ii+1)*172]); err != nil { - return err - } - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BlindedBeaconBlockBodyCapella object -func (b *BlindedBeaconBlockBodyCapella) SizeSSZ() (size int) { - size = 388 - - // Field (3) 'ProposerSlashings' - size += len(b.ProposerSlashings) * 416 - - // Field (4) 'AttesterSlashings' - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - size += 4 - size += b.AttesterSlashings[ii].SizeSSZ() - } - - // Field (5) 'Attestations' - for ii := 0; ii < len(b.Attestations); ii++ { - size += 4 - size += b.Attestations[ii].SizeSSZ() - } - - // Field (6) 'Deposits' - size += len(b.Deposits) * 1240 - - // Field (7) 'VoluntaryExits' - size += len(b.VoluntaryExits) * 112 - - // Field (9) 'ExecutionPayloadHeader' - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = new(v11.ExecutionPayloadHeaderCapella) - } - size += b.ExecutionPayloadHeader.SizeSSZ() - - // Field (10) 'BlsToExecutionChanges' - size += len(b.BlsToExecutionChanges) * 172 - - return -} - -// HashTreeRoot ssz hashes the BlindedBeaconBlockBodyCapella object -func (b *BlindedBeaconBlockBodyCapella) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BlindedBeaconBlockBodyCapella object with a hasher -func (b *BlindedBeaconBlockBodyCapella) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - hh.PutBytes(b.RandaoReveal) - - // Field (1) 'Eth1Data' - if err = b.Eth1Data.HashTreeRootWith(hh); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - hh.PutBytes(b.Graffiti) - - // Field (3) 'ProposerSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.ProposerSlashings)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.ProposerSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (4) 'AttesterSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.AttesterSlashings)) - if num > 2 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.AttesterSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 2) - } - - // Field (5) 'Attestations' - { - subIndx := hh.Index() - num := uint64(len(b.Attestations)) - if num > 128 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Attestations { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 128) - } - - // Field (6) 'Deposits' - { - subIndx := hh.Index() - num := uint64(len(b.Deposits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Deposits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (7) 'VoluntaryExits' - { - subIndx := hh.Index() - num := uint64(len(b.VoluntaryExits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.VoluntaryExits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (8) 'SyncAggregate' - if err = b.SyncAggregate.HashTreeRootWith(hh); err != nil { - return - } - - // Field (9) 'ExecutionPayloadHeader' - if err = b.ExecutionPayloadHeader.HashTreeRootWith(hh); err != nil { - return - } - - // Field (10) 'BlsToExecutionChanges' - { - subIndx := hh.Index() - num := uint64(len(b.BlsToExecutionChanges)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.BlsToExecutionChanges { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BlindedBeaconBlockBodyDeneb object -func (b *BlindedBeaconBlockBodyDeneb) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BlindedBeaconBlockBodyDeneb object to a target array -func (b *BlindedBeaconBlockBodyDeneb) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(392) - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - dst = append(dst, b.RandaoReveal...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if dst, err = b.Eth1Data.MarshalSSZTo(dst); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - dst = append(dst, b.Graffiti...) - - // Offset (3) 'ProposerSlashings' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.ProposerSlashings) * 416 - - // Offset (4) 'AttesterSlashings' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - offset += 4 - offset += b.AttesterSlashings[ii].SizeSSZ() - } - - // Offset (5) 'Attestations' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.Attestations); ii++ { - offset += 4 - offset += b.Attestations[ii].SizeSSZ() - } - - // Offset (6) 'Deposits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.Deposits) * 1240 - - // Offset (7) 'VoluntaryExits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.VoluntaryExits) * 112 - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if dst, err = b.SyncAggregate.MarshalSSZTo(dst); err != nil { - return - } - - // Offset (9) 'ExecutionPayloadHeader' - dst = ssz.WriteOffset(dst, offset) - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = new(v11.ExecutionPayloadHeaderDeneb) - } - offset += b.ExecutionPayloadHeader.SizeSSZ() - - // Offset (10) 'BlsToExecutionChanges' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.BlsToExecutionChanges) * 172 - - // Offset (11) 'BlobKzgCommitments' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.BlobKzgCommitments) * 48 - - // Field (3) 'ProposerSlashings' - if size := len(b.ProposerSlashings); size > 16 { - err = ssz.ErrListTooBigFn("--.ProposerSlashings", size, 16) - return - } - for ii := 0; ii < len(b.ProposerSlashings); ii++ { - if dst, err = b.ProposerSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (4) 'AttesterSlashings' - if size := len(b.AttesterSlashings); size > 2 { - err = ssz.ErrListTooBigFn("--.AttesterSlashings", size, 2) - return - } - { - offset = 4 * len(b.AttesterSlashings) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.AttesterSlashings[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - if dst, err = b.AttesterSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (5) 'Attestations' - if size := len(b.Attestations); size > 128 { - err = ssz.ErrListTooBigFn("--.Attestations", size, 128) - return - } - { - offset = 4 * len(b.Attestations) - for ii := 0; ii < len(b.Attestations); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.Attestations[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.Attestations); ii++ { - if dst, err = b.Attestations[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (6) 'Deposits' - if size := len(b.Deposits); size > 16 { - err = ssz.ErrListTooBigFn("--.Deposits", size, 16) - return - } - for ii := 0; ii < len(b.Deposits); ii++ { - if dst, err = b.Deposits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (7) 'VoluntaryExits' - if size := len(b.VoluntaryExits); size > 16 { - err = ssz.ErrListTooBigFn("--.VoluntaryExits", size, 16) - return - } - for ii := 0; ii < len(b.VoluntaryExits); ii++ { - if dst, err = b.VoluntaryExits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (9) 'ExecutionPayloadHeader' - if dst, err = b.ExecutionPayloadHeader.MarshalSSZTo(dst); err != nil { - return - } - - // Field (10) 'BlsToExecutionChanges' - if size := len(b.BlsToExecutionChanges); size > 16 { - err = ssz.ErrListTooBigFn("--.BlsToExecutionChanges", size, 16) - return - } - for ii := 0; ii < len(b.BlsToExecutionChanges); ii++ { - if dst, err = b.BlsToExecutionChanges[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (11) 'BlobKzgCommitments' - if size := len(b.BlobKzgCommitments); size > 4096 { - err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096) - return - } - for ii := 0; ii < len(b.BlobKzgCommitments); ii++ { - if size := len(b.BlobKzgCommitments[ii]); size != 48 { - err = ssz.ErrBytesLengthFn("--.BlobKzgCommitments[ii]", size, 48) - return - } - dst = append(dst, b.BlobKzgCommitments[ii]...) - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BlindedBeaconBlockBodyDeneb object -func (b *BlindedBeaconBlockBodyDeneb) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 392 { - return ssz.ErrSize - } - - tail := buf - var o3, o4, o5, o6, o7, o9, o10, o11 uint64 - - // Field (0) 'RandaoReveal' - if cap(b.RandaoReveal) == 0 { - b.RandaoReveal = make([]byte, 0, len(buf[0:96])) - } - b.RandaoReveal = append(b.RandaoReveal, buf[0:96]...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if err = b.Eth1Data.UnmarshalSSZ(buf[96:168]); err != nil { - return err - } - - // Field (2) 'Graffiti' - if cap(b.Graffiti) == 0 { - b.Graffiti = make([]byte, 0, len(buf[168:200])) - } - b.Graffiti = append(b.Graffiti, buf[168:200]...) - - // Offset (3) 'ProposerSlashings' - if o3 = ssz.ReadOffset(buf[200:204]); o3 > size { - return ssz.ErrOffset - } - - if o3 != 392 { - return ssz.ErrInvalidVariableOffset - } - - // Offset (4) 'AttesterSlashings' - if o4 = ssz.ReadOffset(buf[204:208]); o4 > size || o3 > o4 { - return ssz.ErrOffset - } - - // Offset (5) 'Attestations' - if o5 = ssz.ReadOffset(buf[208:212]); o5 > size || o4 > o5 { - return ssz.ErrOffset - } - - // Offset (6) 'Deposits' - if o6 = ssz.ReadOffset(buf[212:216]); o6 > size || o5 > o6 { - return ssz.ErrOffset - } - - // Offset (7) 'VoluntaryExits' - if o7 = ssz.ReadOffset(buf[216:220]); o7 > size || o6 > o7 { - return ssz.ErrOffset - } - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if err = b.SyncAggregate.UnmarshalSSZ(buf[220:380]); err != nil { - return err - } - - // Offset (9) 'ExecutionPayloadHeader' - if o9 = ssz.ReadOffset(buf[380:384]); o9 > size || o7 > o9 { - return ssz.ErrOffset - } - - // Offset (10) 'BlsToExecutionChanges' - if o10 = ssz.ReadOffset(buf[384:388]); o10 > size || o9 > o10 { - return ssz.ErrOffset - } - - // Offset (11) 'BlobKzgCommitments' - if o11 = ssz.ReadOffset(buf[388:392]); o11 > size || o10 > o11 { - return ssz.ErrOffset - } - - // Field (3) 'ProposerSlashings' - { - buf = tail[o3:o4] - num, err := ssz.DivideInt2(len(buf), 416, 16) - if err != nil { - return err - } - b.ProposerSlashings = make([]*v1.ProposerSlashing, num) - for ii := 0; ii < num; ii++ { - if b.ProposerSlashings[ii] == nil { - b.ProposerSlashings[ii] = new(v1.ProposerSlashing) - } - if err = b.ProposerSlashings[ii].UnmarshalSSZ(buf[ii*416 : (ii+1)*416]); err != nil { - return err - } - } - } - - // Field (4) 'AttesterSlashings' - { - buf = tail[o4:o5] - num, err := ssz.DecodeDynamicLength(buf, 2) - if err != nil { - return err - } - b.AttesterSlashings = make([]*v1.AttesterSlashing, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.AttesterSlashings[indx] == nil { - b.AttesterSlashings[indx] = new(v1.AttesterSlashing) - } - if err = b.AttesterSlashings[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (5) 'Attestations' - { - buf = tail[o5:o6] - num, err := ssz.DecodeDynamicLength(buf, 128) - if err != nil { - return err - } - b.Attestations = make([]*v1.Attestation, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.Attestations[indx] == nil { - b.Attestations[indx] = new(v1.Attestation) - } - if err = b.Attestations[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (6) 'Deposits' - { - buf = tail[o6:o7] - num, err := ssz.DivideInt2(len(buf), 1240, 16) - if err != nil { - return err - } - b.Deposits = make([]*v1.Deposit, num) - for ii := 0; ii < num; ii++ { - if b.Deposits[ii] == nil { - b.Deposits[ii] = new(v1.Deposit) - } - if err = b.Deposits[ii].UnmarshalSSZ(buf[ii*1240 : (ii+1)*1240]); err != nil { - return err - } - } - } - - // Field (7) 'VoluntaryExits' - { - buf = tail[o7:o9] - num, err := ssz.DivideInt2(len(buf), 112, 16) - if err != nil { - return err - } - b.VoluntaryExits = make([]*v1.SignedVoluntaryExit, num) - for ii := 0; ii < num; ii++ { - if b.VoluntaryExits[ii] == nil { - b.VoluntaryExits[ii] = new(v1.SignedVoluntaryExit) - } - if err = b.VoluntaryExits[ii].UnmarshalSSZ(buf[ii*112 : (ii+1)*112]); err != nil { - return err - } - } - } - - // Field (9) 'ExecutionPayloadHeader' - { - buf = tail[o9:o10] - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = new(v11.ExecutionPayloadHeaderDeneb) - } - if err = b.ExecutionPayloadHeader.UnmarshalSSZ(buf); err != nil { - return err - } - } - - // Field (10) 'BlsToExecutionChanges' - { - buf = tail[o10:o11] - num, err := ssz.DivideInt2(len(buf), 172, 16) - if err != nil { - return err - } - b.BlsToExecutionChanges = make([]*SignedBLSToExecutionChange, num) - for ii := 0; ii < num; ii++ { - if b.BlsToExecutionChanges[ii] == nil { - b.BlsToExecutionChanges[ii] = new(SignedBLSToExecutionChange) - } - if err = b.BlsToExecutionChanges[ii].UnmarshalSSZ(buf[ii*172 : (ii+1)*172]); err != nil { - return err - } - } - } - - // Field (11) 'BlobKzgCommitments' - { - buf = tail[o11:] - num, err := ssz.DivideInt2(len(buf), 48, 4096) - if err != nil { - return err - } - b.BlobKzgCommitments = make([][]byte, num) - for ii := 0; ii < num; ii++ { - if cap(b.BlobKzgCommitments[ii]) == 0 { - b.BlobKzgCommitments[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48])) - } - b.BlobKzgCommitments[ii] = append(b.BlobKzgCommitments[ii], buf[ii*48:(ii+1)*48]...) - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BlindedBeaconBlockBodyDeneb object -func (b *BlindedBeaconBlockBodyDeneb) SizeSSZ() (size int) { - size = 392 - - // Field (3) 'ProposerSlashings' - size += len(b.ProposerSlashings) * 416 - - // Field (4) 'AttesterSlashings' - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - size += 4 - size += b.AttesterSlashings[ii].SizeSSZ() - } - - // Field (5) 'Attestations' - for ii := 0; ii < len(b.Attestations); ii++ { - size += 4 - size += b.Attestations[ii].SizeSSZ() - } - - // Field (6) 'Deposits' - size += len(b.Deposits) * 1240 - - // Field (7) 'VoluntaryExits' - size += len(b.VoluntaryExits) * 112 - - // Field (9) 'ExecutionPayloadHeader' - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = new(v11.ExecutionPayloadHeaderDeneb) - } - size += b.ExecutionPayloadHeader.SizeSSZ() - - // Field (10) 'BlsToExecutionChanges' - size += len(b.BlsToExecutionChanges) * 172 - - // Field (11) 'BlobKzgCommitments' - size += len(b.BlobKzgCommitments) * 48 - - return -} - -// HashTreeRoot ssz hashes the BlindedBeaconBlockBodyDeneb object -func (b *BlindedBeaconBlockBodyDeneb) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BlindedBeaconBlockBodyDeneb object with a hasher -func (b *BlindedBeaconBlockBodyDeneb) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - hh.PutBytes(b.RandaoReveal) - - // Field (1) 'Eth1Data' - if err = b.Eth1Data.HashTreeRootWith(hh); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - hh.PutBytes(b.Graffiti) - - // Field (3) 'ProposerSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.ProposerSlashings)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.ProposerSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (4) 'AttesterSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.AttesterSlashings)) - if num > 2 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.AttesterSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 2) - } - - // Field (5) 'Attestations' - { - subIndx := hh.Index() - num := uint64(len(b.Attestations)) - if num > 128 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Attestations { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 128) - } - - // Field (6) 'Deposits' - { - subIndx := hh.Index() - num := uint64(len(b.Deposits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Deposits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (7) 'VoluntaryExits' - { - subIndx := hh.Index() - num := uint64(len(b.VoluntaryExits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.VoluntaryExits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (8) 'SyncAggregate' - if err = b.SyncAggregate.HashTreeRootWith(hh); err != nil { - return - } - - // Field (9) 'ExecutionPayloadHeader' - if err = b.ExecutionPayloadHeader.HashTreeRootWith(hh); err != nil { - return - } - - // Field (10) 'BlsToExecutionChanges' - { - subIndx := hh.Index() - num := uint64(len(b.BlsToExecutionChanges)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.BlsToExecutionChanges { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (11) 'BlobKzgCommitments' - { - if size := len(b.BlobKzgCommitments); size > 4096 { - err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096) - return - } - subIndx := hh.Index() - for _, i := range b.BlobKzgCommitments { - if len(i) != 48 { - err = ssz.ErrBytesLength - return - } - hh.PutBytes(i) - } - - numItems := uint64(len(b.BlobKzgCommitments)) - hh.MerkleizeWithMixin(subIndx, numItems, 4096) - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BeaconBlockBodyDeneb object -func (b *BeaconBlockBodyDeneb) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BeaconBlockBodyDeneb object to a target array -func (b *BeaconBlockBodyDeneb) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(392) - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - dst = append(dst, b.RandaoReveal...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if dst, err = b.Eth1Data.MarshalSSZTo(dst); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - dst = append(dst, b.Graffiti...) - - // Offset (3) 'ProposerSlashings' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.ProposerSlashings) * 416 - - // Offset (4) 'AttesterSlashings' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - offset += 4 - offset += b.AttesterSlashings[ii].SizeSSZ() - } - - // Offset (5) 'Attestations' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.Attestations); ii++ { - offset += 4 - offset += b.Attestations[ii].SizeSSZ() - } - - // Offset (6) 'Deposits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.Deposits) * 1240 - - // Offset (7) 'VoluntaryExits' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.VoluntaryExits) * 112 - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if dst, err = b.SyncAggregate.MarshalSSZTo(dst); err != nil { - return - } - - // Offset (9) 'ExecutionPayload' - dst = ssz.WriteOffset(dst, offset) - if b.ExecutionPayload == nil { - b.ExecutionPayload = new(v11.ExecutionPayloadDeneb) - } - offset += b.ExecutionPayload.SizeSSZ() - - // Offset (10) 'BlsToExecutionChanges' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.BlsToExecutionChanges) * 172 - - // Offset (11) 'BlobKzgCommitments' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.BlobKzgCommitments) * 48 - - // Field (3) 'ProposerSlashings' - if size := len(b.ProposerSlashings); size > 16 { - err = ssz.ErrListTooBigFn("--.ProposerSlashings", size, 16) - return - } - for ii := 0; ii < len(b.ProposerSlashings); ii++ { - if dst, err = b.ProposerSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (4) 'AttesterSlashings' - if size := len(b.AttesterSlashings); size > 2 { - err = ssz.ErrListTooBigFn("--.AttesterSlashings", size, 2) - return - } - { - offset = 4 * len(b.AttesterSlashings) - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.AttesterSlashings[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - if dst, err = b.AttesterSlashings[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (5) 'Attestations' - if size := len(b.Attestations); size > 128 { - err = ssz.ErrListTooBigFn("--.Attestations", size, 128) - return - } - { - offset = 4 * len(b.Attestations) - for ii := 0; ii < len(b.Attestations); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.Attestations[ii].SizeSSZ() - } - } - for ii := 0; ii < len(b.Attestations); ii++ { - if dst, err = b.Attestations[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (6) 'Deposits' - if size := len(b.Deposits); size > 16 { - err = ssz.ErrListTooBigFn("--.Deposits", size, 16) - return - } - for ii := 0; ii < len(b.Deposits); ii++ { - if dst, err = b.Deposits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (7) 'VoluntaryExits' - if size := len(b.VoluntaryExits); size > 16 { - err = ssz.ErrListTooBigFn("--.VoluntaryExits", size, 16) - return - } - for ii := 0; ii < len(b.VoluntaryExits); ii++ { - if dst, err = b.VoluntaryExits[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (9) 'ExecutionPayload' - if dst, err = b.ExecutionPayload.MarshalSSZTo(dst); err != nil { - return - } - - // Field (10) 'BlsToExecutionChanges' - if size := len(b.BlsToExecutionChanges); size > 16 { - err = ssz.ErrListTooBigFn("--.BlsToExecutionChanges", size, 16) - return - } - for ii := 0; ii < len(b.BlsToExecutionChanges); ii++ { - if dst, err = b.BlsToExecutionChanges[ii].MarshalSSZTo(dst); err != nil { - return - } - } - - // Field (11) 'BlobKzgCommitments' - if size := len(b.BlobKzgCommitments); size > 4096 { - err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096) - return - } - for ii := 0; ii < len(b.BlobKzgCommitments); ii++ { - if size := len(b.BlobKzgCommitments[ii]); size != 48 { - err = ssz.ErrBytesLengthFn("--.BlobKzgCommitments[ii]", size, 48) - return - } - dst = append(dst, b.BlobKzgCommitments[ii]...) - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BeaconBlockBodyDeneb object -func (b *BeaconBlockBodyDeneb) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 392 { - return ssz.ErrSize - } - - tail := buf - var o3, o4, o5, o6, o7, o9, o10, o11 uint64 - - // Field (0) 'RandaoReveal' - if cap(b.RandaoReveal) == 0 { - b.RandaoReveal = make([]byte, 0, len(buf[0:96])) - } - b.RandaoReveal = append(b.RandaoReveal, buf[0:96]...) - - // Field (1) 'Eth1Data' - if b.Eth1Data == nil { - b.Eth1Data = new(v1.Eth1Data) - } - if err = b.Eth1Data.UnmarshalSSZ(buf[96:168]); err != nil { - return err - } - - // Field (2) 'Graffiti' - if cap(b.Graffiti) == 0 { - b.Graffiti = make([]byte, 0, len(buf[168:200])) - } - b.Graffiti = append(b.Graffiti, buf[168:200]...) - - // Offset (3) 'ProposerSlashings' - if o3 = ssz.ReadOffset(buf[200:204]); o3 > size { - return ssz.ErrOffset - } - - if o3 != 392 { - return ssz.ErrInvalidVariableOffset - } - - // Offset (4) 'AttesterSlashings' - if o4 = ssz.ReadOffset(buf[204:208]); o4 > size || o3 > o4 { - return ssz.ErrOffset - } - - // Offset (5) 'Attestations' - if o5 = ssz.ReadOffset(buf[208:212]); o5 > size || o4 > o5 { - return ssz.ErrOffset - } - - // Offset (6) 'Deposits' - if o6 = ssz.ReadOffset(buf[212:216]); o6 > size || o5 > o6 { - return ssz.ErrOffset - } - - // Offset (7) 'VoluntaryExits' - if o7 = ssz.ReadOffset(buf[216:220]); o7 > size || o6 > o7 { - return ssz.ErrOffset - } - - // Field (8) 'SyncAggregate' - if b.SyncAggregate == nil { - b.SyncAggregate = new(v1.SyncAggregate) - } - if err = b.SyncAggregate.UnmarshalSSZ(buf[220:380]); err != nil { - return err - } - - // Offset (9) 'ExecutionPayload' - if o9 = ssz.ReadOffset(buf[380:384]); o9 > size || o7 > o9 { - return ssz.ErrOffset - } - - // Offset (10) 'BlsToExecutionChanges' - if o10 = ssz.ReadOffset(buf[384:388]); o10 > size || o9 > o10 { - return ssz.ErrOffset - } - - // Offset (11) 'BlobKzgCommitments' - if o11 = ssz.ReadOffset(buf[388:392]); o11 > size || o10 > o11 { - return ssz.ErrOffset - } - - // Field (3) 'ProposerSlashings' - { - buf = tail[o3:o4] - num, err := ssz.DivideInt2(len(buf), 416, 16) - if err != nil { - return err - } - b.ProposerSlashings = make([]*v1.ProposerSlashing, num) - for ii := 0; ii < num; ii++ { - if b.ProposerSlashings[ii] == nil { - b.ProposerSlashings[ii] = new(v1.ProposerSlashing) - } - if err = b.ProposerSlashings[ii].UnmarshalSSZ(buf[ii*416 : (ii+1)*416]); err != nil { - return err - } - } - } - - // Field (4) 'AttesterSlashings' - { - buf = tail[o4:o5] - num, err := ssz.DecodeDynamicLength(buf, 2) - if err != nil { - return err - } - b.AttesterSlashings = make([]*v1.AttesterSlashing, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.AttesterSlashings[indx] == nil { - b.AttesterSlashings[indx] = new(v1.AttesterSlashing) - } - if err = b.AttesterSlashings[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (5) 'Attestations' - { - buf = tail[o5:o6] - num, err := ssz.DecodeDynamicLength(buf, 128) - if err != nil { - return err - } - b.Attestations = make([]*v1.Attestation, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.Attestations[indx] == nil { - b.Attestations[indx] = new(v1.Attestation) - } - if err = b.Attestations[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - } - - // Field (6) 'Deposits' - { - buf = tail[o6:o7] - num, err := ssz.DivideInt2(len(buf), 1240, 16) - if err != nil { - return err - } - b.Deposits = make([]*v1.Deposit, num) - for ii := 0; ii < num; ii++ { - if b.Deposits[ii] == nil { - b.Deposits[ii] = new(v1.Deposit) - } - if err = b.Deposits[ii].UnmarshalSSZ(buf[ii*1240 : (ii+1)*1240]); err != nil { - return err - } - } - } - - // Field (7) 'VoluntaryExits' - { - buf = tail[o7:o9] - num, err := ssz.DivideInt2(len(buf), 112, 16) - if err != nil { - return err - } - b.VoluntaryExits = make([]*v1.SignedVoluntaryExit, num) - for ii := 0; ii < num; ii++ { - if b.VoluntaryExits[ii] == nil { - b.VoluntaryExits[ii] = new(v1.SignedVoluntaryExit) - } - if err = b.VoluntaryExits[ii].UnmarshalSSZ(buf[ii*112 : (ii+1)*112]); err != nil { - return err - } - } - } - - // Field (9) 'ExecutionPayload' - { - buf = tail[o9:o10] - if b.ExecutionPayload == nil { - b.ExecutionPayload = new(v11.ExecutionPayloadDeneb) - } - if err = b.ExecutionPayload.UnmarshalSSZ(buf); err != nil { - return err - } - } - - // Field (10) 'BlsToExecutionChanges' - { - buf = tail[o10:o11] - num, err := ssz.DivideInt2(len(buf), 172, 16) - if err != nil { - return err - } - b.BlsToExecutionChanges = make([]*SignedBLSToExecutionChange, num) - for ii := 0; ii < num; ii++ { - if b.BlsToExecutionChanges[ii] == nil { - b.BlsToExecutionChanges[ii] = new(SignedBLSToExecutionChange) - } - if err = b.BlsToExecutionChanges[ii].UnmarshalSSZ(buf[ii*172 : (ii+1)*172]); err != nil { - return err - } - } - } - - // Field (11) 'BlobKzgCommitments' - { - buf = tail[o11:] - num, err := ssz.DivideInt2(len(buf), 48, 4096) - if err != nil { - return err - } - b.BlobKzgCommitments = make([][]byte, num) - for ii := 0; ii < num; ii++ { - if cap(b.BlobKzgCommitments[ii]) == 0 { - b.BlobKzgCommitments[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48])) - } - b.BlobKzgCommitments[ii] = append(b.BlobKzgCommitments[ii], buf[ii*48:(ii+1)*48]...) - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockBodyDeneb object -func (b *BeaconBlockBodyDeneb) SizeSSZ() (size int) { - size = 392 - - // Field (3) 'ProposerSlashings' - size += len(b.ProposerSlashings) * 416 - - // Field (4) 'AttesterSlashings' - for ii := 0; ii < len(b.AttesterSlashings); ii++ { - size += 4 - size += b.AttesterSlashings[ii].SizeSSZ() - } - - // Field (5) 'Attestations' - for ii := 0; ii < len(b.Attestations); ii++ { - size += 4 - size += b.Attestations[ii].SizeSSZ() - } - - // Field (6) 'Deposits' - size += len(b.Deposits) * 1240 - - // Field (7) 'VoluntaryExits' - size += len(b.VoluntaryExits) * 112 - - // Field (9) 'ExecutionPayload' - if b.ExecutionPayload == nil { - b.ExecutionPayload = new(v11.ExecutionPayloadDeneb) - } - size += b.ExecutionPayload.SizeSSZ() - - // Field (10) 'BlsToExecutionChanges' - size += len(b.BlsToExecutionChanges) * 172 - - // Field (11) 'BlobKzgCommitments' - size += len(b.BlobKzgCommitments) * 48 - - return -} - -// HashTreeRoot ssz hashes the BeaconBlockBodyDeneb object -func (b *BeaconBlockBodyDeneb) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BeaconBlockBodyDeneb object with a hasher -func (b *BeaconBlockBodyDeneb) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'RandaoReveal' - if size := len(b.RandaoReveal); size != 96 { - err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) - return - } - hh.PutBytes(b.RandaoReveal) - - // Field (1) 'Eth1Data' - if err = b.Eth1Data.HashTreeRootWith(hh); err != nil { - return - } - - // Field (2) 'Graffiti' - if size := len(b.Graffiti); size != 32 { - err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) - return - } - hh.PutBytes(b.Graffiti) - - // Field (3) 'ProposerSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.ProposerSlashings)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.ProposerSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (4) 'AttesterSlashings' - { - subIndx := hh.Index() - num := uint64(len(b.AttesterSlashings)) - if num > 2 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.AttesterSlashings { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 2) - } - - // Field (5) 'Attestations' - { - subIndx := hh.Index() - num := uint64(len(b.Attestations)) - if num > 128 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Attestations { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 128) - } - - // Field (6) 'Deposits' - { - subIndx := hh.Index() - num := uint64(len(b.Deposits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.Deposits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (7) 'VoluntaryExits' - { - subIndx := hh.Index() - num := uint64(len(b.VoluntaryExits)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.VoluntaryExits { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (8) 'SyncAggregate' - if err = b.SyncAggregate.HashTreeRootWith(hh); err != nil { - return - } - - // Field (9) 'ExecutionPayload' - if err = b.ExecutionPayload.HashTreeRootWith(hh); err != nil { - return - } - - // Field (10) 'BlsToExecutionChanges' - { - subIndx := hh.Index() - num := uint64(len(b.BlsToExecutionChanges)) - if num > 16 { - err = ssz.ErrIncorrectListSize - return - } - for _, elem := range b.BlsToExecutionChanges { - if err = elem.HashTreeRootWith(hh); err != nil { - return - } - } - hh.MerkleizeWithMixin(subIndx, num, 16) - } - - // Field (11) 'BlobKzgCommitments' - { - if size := len(b.BlobKzgCommitments); size > 4096 { - err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096) - return - } - subIndx := hh.Index() - for _, i := range b.BlobKzgCommitments { - if len(i) != 48 { - err = ssz.ErrBytesLength - return - } - hh.PutBytes(i) - } - - numItems := uint64(len(b.BlobKzgCommitments)) - hh.MerkleizeWithMixin(subIndx, numItems, 4096) - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the SignedBeaconBlockContentsDeneb object -func (s *SignedBeaconBlockContentsDeneb) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(s) -} - -// MarshalSSZTo ssz marshals the SignedBeaconBlockContentsDeneb object to a target array -func (s *SignedBeaconBlockContentsDeneb) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(12) - - // Offset (0) 'SignedBlock' - dst = ssz.WriteOffset(dst, offset) - if s.SignedBlock == nil { - s.SignedBlock = new(SignedBeaconBlockDeneb) - } - offset += s.SignedBlock.SizeSSZ() - - // Offset (1) 'KzgProofs' - dst = ssz.WriteOffset(dst, offset) - offset += len(s.KzgProofs) * 48 - - // Offset (2) 'Blobs' - dst = ssz.WriteOffset(dst, offset) - offset += len(s.Blobs) * 131072 - - // Field (0) 'SignedBlock' - if dst, err = s.SignedBlock.MarshalSSZTo(dst); err != nil { - return - } - - // Field (1) 'KzgProofs' - if size := len(s.KzgProofs); size > 4096 { - err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096) - return - } - for ii := 0; ii < len(s.KzgProofs); ii++ { - if size := len(s.KzgProofs[ii]); size != 48 { - err = ssz.ErrBytesLengthFn("--.KzgProofs[ii]", size, 48) - return - } - dst = append(dst, s.KzgProofs[ii]...) - } - - // Field (2) 'Blobs' - if size := len(s.Blobs); size > 4096 { - err = ssz.ErrListTooBigFn("--.Blobs", size, 4096) - return - } - for ii := 0; ii < len(s.Blobs); ii++ { - if size := len(s.Blobs[ii]); size != 131072 { - err = ssz.ErrBytesLengthFn("--.Blobs[ii]", size, 131072) - return - } - dst = append(dst, s.Blobs[ii]...) - } - - return -} - -// UnmarshalSSZ ssz unmarshals the SignedBeaconBlockContentsDeneb object -func (s *SignedBeaconBlockContentsDeneb) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 12 { - return ssz.ErrSize - } - - tail := buf - var o0, o1, o2 uint64 - - // Offset (0) 'SignedBlock' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return ssz.ErrOffset - } - - if o0 != 12 { - return ssz.ErrInvalidVariableOffset - } - - // Offset (1) 'KzgProofs' - if o1 = ssz.ReadOffset(buf[4:8]); o1 > size || o0 > o1 { - return ssz.ErrOffset - } - - // Offset (2) 'Blobs' - if o2 = ssz.ReadOffset(buf[8:12]); o2 > size || o1 > o2 { - return ssz.ErrOffset - } - - // Field (0) 'SignedBlock' - { - buf = tail[o0:o1] - if s.SignedBlock == nil { - s.SignedBlock = new(SignedBeaconBlockDeneb) - } - if err = s.SignedBlock.UnmarshalSSZ(buf); err != nil { - return err - } - } - - // Field (1) 'KzgProofs' - { - buf = tail[o1:o2] - num, err := ssz.DivideInt2(len(buf), 48, 4096) - if err != nil { - return err - } - s.KzgProofs = make([][]byte, num) - for ii := 0; ii < num; ii++ { - if cap(s.KzgProofs[ii]) == 0 { - s.KzgProofs[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48])) - } - s.KzgProofs[ii] = append(s.KzgProofs[ii], buf[ii*48:(ii+1)*48]...) - } - } - - // Field (2) 'Blobs' - { - buf = tail[o2:] - num, err := ssz.DivideInt2(len(buf), 131072, 4096) - if err != nil { - return err - } - s.Blobs = make([][]byte, num) - for ii := 0; ii < num; ii++ { - if cap(s.Blobs[ii]) == 0 { - s.Blobs[ii] = make([]byte, 0, len(buf[ii*131072:(ii+1)*131072])) - } - s.Blobs[ii] = append(s.Blobs[ii], buf[ii*131072:(ii+1)*131072]...) - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the SignedBeaconBlockContentsDeneb object -func (s *SignedBeaconBlockContentsDeneb) SizeSSZ() (size int) { - size = 12 - - // Field (0) 'SignedBlock' - if s.SignedBlock == nil { - s.SignedBlock = new(SignedBeaconBlockDeneb) - } - size += s.SignedBlock.SizeSSZ() - - // Field (1) 'KzgProofs' - size += len(s.KzgProofs) * 48 - - // Field (2) 'Blobs' - size += len(s.Blobs) * 131072 - - return -} - -// HashTreeRoot ssz hashes the SignedBeaconBlockContentsDeneb object -func (s *SignedBeaconBlockContentsDeneb) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(s) -} - -// HashTreeRootWith ssz hashes the SignedBeaconBlockContentsDeneb object with a hasher -func (s *SignedBeaconBlockContentsDeneb) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'SignedBlock' - if err = s.SignedBlock.HashTreeRootWith(hh); err != nil { - return - } - - // Field (1) 'KzgProofs' - { - if size := len(s.KzgProofs); size > 4096 { - err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096) - return - } - subIndx := hh.Index() - for _, i := range s.KzgProofs { - if len(i) != 48 { - err = ssz.ErrBytesLength - return - } - hh.PutBytes(i) - } - - numItems := uint64(len(s.KzgProofs)) - hh.MerkleizeWithMixin(subIndx, numItems, 4096) - } - - // Field (2) 'Blobs' - { - if size := len(s.Blobs); size > 4096 { - err = ssz.ErrListTooBigFn("--.Blobs", size, 4096) - return - } - subIndx := hh.Index() - for _, i := range s.Blobs { - if len(i) != 131072 { - err = ssz.ErrBytesLength - return - } - hh.PutBytes(i) - } - - numItems := uint64(len(s.Blobs)) - hh.MerkleizeWithMixin(subIndx, numItems, 4096) - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BeaconBlockContentsDeneb object -func (b *BeaconBlockContentsDeneb) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BeaconBlockContentsDeneb object to a target array -func (b *BeaconBlockContentsDeneb) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - offset := int(12) - - // Offset (0) 'Block' - dst = ssz.WriteOffset(dst, offset) - if b.Block == nil { - b.Block = new(BeaconBlockDeneb) - } - offset += b.Block.SizeSSZ() - - // Offset (1) 'KzgProofs' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.KzgProofs) * 48 - - // Offset (2) 'Blobs' - dst = ssz.WriteOffset(dst, offset) - offset += len(b.Blobs) * 131072 - - // Field (0) 'Block' - if dst, err = b.Block.MarshalSSZTo(dst); err != nil { - return - } - - // Field (1) 'KzgProofs' - if size := len(b.KzgProofs); size > 4096 { - err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096) - return - } - for ii := 0; ii < len(b.KzgProofs); ii++ { - if size := len(b.KzgProofs[ii]); size != 48 { - err = ssz.ErrBytesLengthFn("--.KzgProofs[ii]", size, 48) - return - } - dst = append(dst, b.KzgProofs[ii]...) - } - - // Field (2) 'Blobs' - if size := len(b.Blobs); size > 4096 { - err = ssz.ErrListTooBigFn("--.Blobs", size, 4096) - return - } - for ii := 0; ii < len(b.Blobs); ii++ { - if size := len(b.Blobs[ii]); size != 131072 { - err = ssz.ErrBytesLengthFn("--.Blobs[ii]", size, 131072) - return - } - dst = append(dst, b.Blobs[ii]...) - } - - return -} - -// UnmarshalSSZ ssz unmarshals the BeaconBlockContentsDeneb object -func (b *BeaconBlockContentsDeneb) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size < 12 { - return ssz.ErrSize - } - - tail := buf - var o0, o1, o2 uint64 - - // Offset (0) 'Block' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return ssz.ErrOffset - } - - if o0 != 12 { - return ssz.ErrInvalidVariableOffset - } - - // Offset (1) 'KzgProofs' - if o1 = ssz.ReadOffset(buf[4:8]); o1 > size || o0 > o1 { - return ssz.ErrOffset - } - - // Offset (2) 'Blobs' - if o2 = ssz.ReadOffset(buf[8:12]); o2 > size || o1 > o2 { - return ssz.ErrOffset - } - - // Field (0) 'Block' - { - buf = tail[o0:o1] - if b.Block == nil { - b.Block = new(BeaconBlockDeneb) - } - if err = b.Block.UnmarshalSSZ(buf); err != nil { - return err - } - } - - // Field (1) 'KzgProofs' - { - buf = tail[o1:o2] - num, err := ssz.DivideInt2(len(buf), 48, 4096) - if err != nil { - return err - } - b.KzgProofs = make([][]byte, num) - for ii := 0; ii < num; ii++ { - if cap(b.KzgProofs[ii]) == 0 { - b.KzgProofs[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48])) - } - b.KzgProofs[ii] = append(b.KzgProofs[ii], buf[ii*48:(ii+1)*48]...) - } - } - - // Field (2) 'Blobs' - { - buf = tail[o2:] - num, err := ssz.DivideInt2(len(buf), 131072, 4096) - if err != nil { - return err - } - b.Blobs = make([][]byte, num) - for ii := 0; ii < num; ii++ { - if cap(b.Blobs[ii]) == 0 { - b.Blobs[ii] = make([]byte, 0, len(buf[ii*131072:(ii+1)*131072])) - } - b.Blobs[ii] = append(b.Blobs[ii], buf[ii*131072:(ii+1)*131072]...) - } - } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockContentsDeneb object -func (b *BeaconBlockContentsDeneb) SizeSSZ() (size int) { - size = 12 - - // Field (0) 'Block' - if b.Block == nil { - b.Block = new(BeaconBlockDeneb) - } - size += b.Block.SizeSSZ() - - // Field (1) 'KzgProofs' - size += len(b.KzgProofs) * 48 - - // Field (2) 'Blobs' - size += len(b.Blobs) * 131072 - - return -} - -// HashTreeRoot ssz hashes the BeaconBlockContentsDeneb object -func (b *BeaconBlockContentsDeneb) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BeaconBlockContentsDeneb object with a hasher -func (b *BeaconBlockContentsDeneb) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Block' - if err = b.Block.HashTreeRootWith(hh); err != nil { - return - } - - // Field (1) 'KzgProofs' - { - if size := len(b.KzgProofs); size > 4096 { - err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096) - return - } - subIndx := hh.Index() - for _, i := range b.KzgProofs { - if len(i) != 48 { - err = ssz.ErrBytesLength - return - } - hh.PutBytes(i) - } - - numItems := uint64(len(b.KzgProofs)) - hh.MerkleizeWithMixin(subIndx, numItems, 4096) - } - - // Field (2) 'Blobs' - { - if size := len(b.Blobs); size > 4096 { - err = ssz.ErrListTooBigFn("--.Blobs", size, 4096) - return - } - subIndx := hh.Index() - for _, i := range b.Blobs { - if len(i) != 131072 { - err = ssz.ErrBytesLength - return - } - hh.PutBytes(i) - } - - numItems := uint64(len(b.Blobs)) - hh.MerkleizeWithMixin(subIndx, numItems, 4096) - } - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BlobIdentifier object -func (b *BlobIdentifier) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BlobIdentifier object to a target array -func (b *BlobIdentifier) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - - // Field (0) 'BlockRoot' - if size := len(b.BlockRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.BlockRoot", size, 32) - return - } - dst = append(dst, b.BlockRoot...) - - // Field (1) 'Index' - dst = ssz.MarshalUint64(dst, b.Index) - - return -} - -// UnmarshalSSZ ssz unmarshals the BlobIdentifier object -func (b *BlobIdentifier) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size != 40 { - return ssz.ErrSize - } - - // Field (0) 'BlockRoot' - if cap(b.BlockRoot) == 0 { - b.BlockRoot = make([]byte, 0, len(buf[0:32])) - } - b.BlockRoot = append(b.BlockRoot, buf[0:32]...) - - // Field (1) 'Index' - b.Index = ssz.UnmarshallUint64(buf[32:40]) - - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BlobIdentifier object -func (b *BlobIdentifier) SizeSSZ() (size int) { - size = 40 - return -} - -// HashTreeRoot ssz hashes the BlobIdentifier object -func (b *BlobIdentifier) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BlobIdentifier object with a hasher -func (b *BlobIdentifier) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'BlockRoot' - if size := len(b.BlockRoot); size != 32 { - err = ssz.ErrBytesLengthFn("--.BlockRoot", size, 32) - return - } - hh.PutBytes(b.BlockRoot) - - // Field (1) 'Index' - hh.PutUint64(b.Index) - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the SyncCommittee object -func (s *SyncCommittee) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(s) -} - -// MarshalSSZTo ssz marshals the SyncCommittee object to a target array -func (s *SyncCommittee) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - - // Field (0) 'Pubkeys' - if size := len(s.Pubkeys); size != 512 { - err = ssz.ErrVectorLengthFn("--.Pubkeys", size, 512) - return - } - for ii := 0; ii < 512; ii++ { - if size := len(s.Pubkeys[ii]); size != 48 { - err = ssz.ErrBytesLengthFn("--.Pubkeys[ii]", size, 48) - return - } - dst = append(dst, s.Pubkeys[ii]...) - } - - // Field (1) 'AggregatePubkey' - if size := len(s.AggregatePubkey); size != 48 { - err = ssz.ErrBytesLengthFn("--.AggregatePubkey", size, 48) - return - } - dst = append(dst, s.AggregatePubkey...) - - return -} - -// UnmarshalSSZ ssz unmarshals the SyncCommittee object -func (s *SyncCommittee) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size != 24624 { - return ssz.ErrSize - } - - // Field (0) 'Pubkeys' - s.Pubkeys = make([][]byte, 512) - for ii := 0; ii < 512; ii++ { - if cap(s.Pubkeys[ii]) == 0 { - s.Pubkeys[ii] = make([]byte, 0, len(buf[0:24576][ii*48:(ii+1)*48])) - } - s.Pubkeys[ii] = append(s.Pubkeys[ii], buf[0:24576][ii*48:(ii+1)*48]...) - } - - // Field (1) 'AggregatePubkey' - if cap(s.AggregatePubkey) == 0 { - s.AggregatePubkey = make([]byte, 0, len(buf[24576:24624])) - } - s.AggregatePubkey = append(s.AggregatePubkey, buf[24576:24624]...) - - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the SyncCommittee object -func (s *SyncCommittee) SizeSSZ() (size int) { - size = 24624 - return -} - -// HashTreeRoot ssz hashes the SyncCommittee object -func (s *SyncCommittee) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(s) -} - -// HashTreeRootWith ssz hashes the SyncCommittee object with a hasher -func (s *SyncCommittee) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Pubkeys' - { - if size := len(s.Pubkeys); size != 512 { - err = ssz.ErrVectorLengthFn("--.Pubkeys", size, 512) - return - } - subIndx := hh.Index() - for _, i := range s.Pubkeys { - if len(i) != 48 { - err = ssz.ErrBytesLength - return - } - hh.PutBytes(i) - } - hh.Merkleize(subIndx) - } - - // Field (1) 'AggregatePubkey' - if size := len(s.AggregatePubkey); size != 48 { - err = ssz.ErrBytesLengthFn("--.AggregatePubkey", size, 48) - return - } - hh.PutBytes(s.AggregatePubkey) - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the BLSToExecutionChange object -func (b *BLSToExecutionChange) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(b) -} - -// MarshalSSZTo ssz marshals the BLSToExecutionChange object to a target array -func (b *BLSToExecutionChange) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - - // Field (0) 'ValidatorIndex' - dst = ssz.MarshalUint64(dst, uint64(b.ValidatorIndex)) - - // Field (1) 'FromBlsPubkey' - if size := len(b.FromBlsPubkey); size != 48 { - err = ssz.ErrBytesLengthFn("--.FromBlsPubkey", size, 48) - return - } - dst = append(dst, b.FromBlsPubkey...) - - // Field (2) 'ToExecutionAddress' - if size := len(b.ToExecutionAddress); size != 20 { - err = ssz.ErrBytesLengthFn("--.ToExecutionAddress", size, 20) - return - } - dst = append(dst, b.ToExecutionAddress...) - - return -} - -// UnmarshalSSZ ssz unmarshals the BLSToExecutionChange object -func (b *BLSToExecutionChange) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size != 76 { - return ssz.ErrSize - } - - // Field (0) 'ValidatorIndex' - b.ValidatorIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[0:8])) - - // Field (1) 'FromBlsPubkey' - if cap(b.FromBlsPubkey) == 0 { - b.FromBlsPubkey = make([]byte, 0, len(buf[8:56])) - } - b.FromBlsPubkey = append(b.FromBlsPubkey, buf[8:56]...) - - // Field (2) 'ToExecutionAddress' - if cap(b.ToExecutionAddress) == 0 { - b.ToExecutionAddress = make([]byte, 0, len(buf[56:76])) - } - b.ToExecutionAddress = append(b.ToExecutionAddress, buf[56:76]...) - - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the BLSToExecutionChange object -func (b *BLSToExecutionChange) SizeSSZ() (size int) { - size = 76 - return -} - -// HashTreeRoot ssz hashes the BLSToExecutionChange object -func (b *BLSToExecutionChange) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(b) -} - -// HashTreeRootWith ssz hashes the BLSToExecutionChange object with a hasher -func (b *BLSToExecutionChange) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'ValidatorIndex' - hh.PutUint64(uint64(b.ValidatorIndex)) - - // Field (1) 'FromBlsPubkey' - if size := len(b.FromBlsPubkey); size != 48 { - err = ssz.ErrBytesLengthFn("--.FromBlsPubkey", size, 48) - return - } - hh.PutBytes(b.FromBlsPubkey) - - // Field (2) 'ToExecutionAddress' - if size := len(b.ToExecutionAddress); size != 20 { - err = ssz.ErrBytesLengthFn("--.ToExecutionAddress", size, 20) - return - } - hh.PutBytes(b.ToExecutionAddress) - - hh.Merkleize(indx) - return -} - -// MarshalSSZ ssz marshals the SignedBLSToExecutionChange object -func (s *SignedBLSToExecutionChange) MarshalSSZ() ([]byte, error) { - return ssz.MarshalSSZ(s) -} - -// MarshalSSZTo ssz marshals the SignedBLSToExecutionChange object to a target array -func (s *SignedBLSToExecutionChange) MarshalSSZTo(buf []byte) (dst []byte, err error) { - dst = buf - - // Field (0) 'Message' - if s.Message == nil { - s.Message = new(BLSToExecutionChange) - } - if dst, err = s.Message.MarshalSSZTo(dst); err != nil { - return - } - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - dst = append(dst, s.Signature...) - - return -} - -// UnmarshalSSZ ssz unmarshals the SignedBLSToExecutionChange object -func (s *SignedBLSToExecutionChange) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size != 172 { - return ssz.ErrSize - } - - // Field (0) 'Message' - if s.Message == nil { - s.Message = new(BLSToExecutionChange) - } - if err = s.Message.UnmarshalSSZ(buf[0:76]); err != nil { - return err - } - - // Field (1) 'Signature' - if cap(s.Signature) == 0 { - s.Signature = make([]byte, 0, len(buf[76:172])) - } - s.Signature = append(s.Signature, buf[76:172]...) - - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the SignedBLSToExecutionChange object -func (s *SignedBLSToExecutionChange) SizeSSZ() (size int) { - size = 172 - return -} - -// HashTreeRoot ssz hashes the SignedBLSToExecutionChange object -func (s *SignedBLSToExecutionChange) HashTreeRoot() ([32]byte, error) { - return ssz.HashWithDefaultHasher(s) -} - -// HashTreeRootWith ssz hashes the SignedBLSToExecutionChange object with a hasher -func (s *SignedBLSToExecutionChange) HashTreeRootWith(hh *ssz.Hasher) (err error) { - indx := hh.Index() - - // Field (0) 'Message' - if err = s.Message.HashTreeRootWith(hh); err != nil { - return - } - - // Field (1) 'Signature' - if size := len(s.Signature); size != 96 { - err = ssz.ErrBytesLengthFn("--.Signature", size, 96) - return - } - hh.PutBytes(s.Signature) - - hh.Merkleize(indx) - return -} diff --git a/proto/eth/v2/ssz.pb.go b/proto/eth/v2/ssz.pb.go deleted file mode 100755 index 7e90a34fb9c3..000000000000 --- a/proto/eth/v2/ssz.pb.go +++ /dev/null @@ -1,188 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.1 -// source: proto/eth/v2/ssz.proto - -package eth - -import ( - reflect "reflect" - sync "sync" - - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type SSZContainer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Version Version `protobuf:"varint,1,opt,name=version,proto3,enum=ethereum.eth.v2.Version" json:"version,omitempty"` - ExecutionOptimistic bool `protobuf:"varint,2,opt,name=execution_optimistic,json=executionOptimistic,proto3" json:"execution_optimistic,omitempty"` - Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` - Finalized bool `protobuf:"varint,4,opt,name=finalized,proto3" json:"finalized,omitempty"` -} - -func (x *SSZContainer) Reset() { - *x = SSZContainer{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_ssz_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SSZContainer) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SSZContainer) ProtoMessage() {} - -func (x *SSZContainer) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_ssz_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SSZContainer.ProtoReflect.Descriptor instead. -func (*SSZContainer) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_ssz_proto_rawDescGZIP(), []int{0} -} - -func (x *SSZContainer) GetVersion() Version { - if x != nil { - return x.Version - } - return Version_PHASE0 -} - -func (x *SSZContainer) GetExecutionOptimistic() bool { - if x != nil { - return x.ExecutionOptimistic - } - return false -} - -func (x *SSZContainer) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -func (x *SSZContainer) GetFinalized() bool { - if x != nil { - return x.Finalized - } - return false -} - -var File_proto_eth_v2_ssz_proto protoreflect.FileDescriptor - -var file_proto_eth_v2_ssz_proto_rawDesc = []byte{ - 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x73, - 0x73, 0x7a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa7, 0x01, 0x0a, 0x0c, 0x53, 0x53, 0x5a, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x73, 0x74, 0x69, 0x63, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x42, - 0x79, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x42, 0x08, 0x53, 0x73, 0x7a, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, - 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, - 0x76, 0x32, 0x3b, 0x65, 0x74, 0x68, 0xaa, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x45, 0x74, 0x68, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x5c, 0x45, 0x74, 0x68, 0x5c, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -} - -var ( - file_proto_eth_v2_ssz_proto_rawDescOnce sync.Once - file_proto_eth_v2_ssz_proto_rawDescData = file_proto_eth_v2_ssz_proto_rawDesc -) - -func file_proto_eth_v2_ssz_proto_rawDescGZIP() []byte { - file_proto_eth_v2_ssz_proto_rawDescOnce.Do(func() { - file_proto_eth_v2_ssz_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_eth_v2_ssz_proto_rawDescData) - }) - return file_proto_eth_v2_ssz_proto_rawDescData -} - -var file_proto_eth_v2_ssz_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_proto_eth_v2_ssz_proto_goTypes = []interface{}{ - (*SSZContainer)(nil), // 0: ethereum.eth.v2.SSZContainer - (Version)(0), // 1: ethereum.eth.v2.Version -} -var file_proto_eth_v2_ssz_proto_depIdxs = []int32{ - 1, // 0: ethereum.eth.v2.SSZContainer.version:type_name -> ethereum.eth.v2.Version - 1, // [1:1] is the sub-list for method output_type - 1, // [1:1] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name -} - -func init() { file_proto_eth_v2_ssz_proto_init() } -func file_proto_eth_v2_ssz_proto_init() { - if File_proto_eth_v2_ssz_proto != nil { - return - } - file_proto_eth_v2_version_proto_init() - if !protoimpl.UnsafeEnabled { - file_proto_eth_v2_ssz_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SSZContainer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_eth_v2_ssz_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_proto_eth_v2_ssz_proto_goTypes, - DependencyIndexes: file_proto_eth_v2_ssz_proto_depIdxs, - MessageInfos: file_proto_eth_v2_ssz_proto_msgTypes, - }.Build() - File_proto_eth_v2_ssz_proto = out.File - file_proto_eth_v2_ssz_proto_rawDesc = nil - file_proto_eth_v2_ssz_proto_goTypes = nil - file_proto_eth_v2_ssz_proto_depIdxs = nil -} diff --git a/proto/eth/v2/ssz.proto b/proto/eth/v2/ssz.proto deleted file mode 100644 index 4ba494ce1a1e..000000000000 --- a/proto/eth/v2/ssz.proto +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2022 Prysmatic Labs. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -syntax = "proto3"; - -package ethereum.eth.v2; - -option csharp_namespace = "Ethereum.Eth.V2"; -option go_package = "github.com/prysmaticlabs/prysm/v5/proto/eth/v2;eth"; -option java_multiple_files = true; -option java_outer_classname = "SszProto"; -option java_package = "org.ethereum.eth.v2"; -option php_namespace = "Ethereum\\Eth\\v2"; - -import "proto/eth/v2/version.proto"; - -message SSZContainer { - Version version = 1; - bool execution_optimistic = 2; - bytes data = 3; - bool finalized = 4; -} \ No newline at end of file diff --git a/proto/eth/v2/sync_committee.pb.go b/proto/eth/v2/sync_committee.pb.go deleted file mode 100755 index 6311707f0a82..000000000000 --- a/proto/eth/v2/sync_committee.pb.go +++ /dev/null @@ -1,340 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.1 -// source: proto/eth/v2/sync_committee.proto - -package eth - -import ( - reflect "reflect" - sync "sync" - - github_com_prysmaticlabs_prysm_v5_consensus_types_primitives "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" - _ "github.com/prysmaticlabs/prysm/v5/proto/eth/ext" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type SubmitSyncCommitteeSignaturesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Data []*SyncCommitteeMessage `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` -} - -func (x *SubmitSyncCommitteeSignaturesRequest) Reset() { - *x = SubmitSyncCommitteeSignaturesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_sync_committee_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitSyncCommitteeSignaturesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitSyncCommitteeSignaturesRequest) ProtoMessage() {} - -func (x *SubmitSyncCommitteeSignaturesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_sync_committee_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitSyncCommitteeSignaturesRequest.ProtoReflect.Descriptor instead. -func (*SubmitSyncCommitteeSignaturesRequest) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_sync_committee_proto_rawDescGZIP(), []int{0} -} - -func (x *SubmitSyncCommitteeSignaturesRequest) GetData() []*SyncCommitteeMessage { - if x != nil { - return x.Data - } - return nil -} - -type SyncCommittee struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Pubkeys [][]byte `protobuf:"bytes,1,rep,name=pubkeys,proto3" json:"pubkeys,omitempty" ssz-size:"512,48"` - AggregatePubkey []byte `protobuf:"bytes,2,opt,name=aggregate_pubkey,json=aggregatePubkey,proto3" json:"aggregate_pubkey,omitempty" ssz-size:"48"` -} - -func (x *SyncCommittee) Reset() { - *x = SyncCommittee{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_sync_committee_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SyncCommittee) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SyncCommittee) ProtoMessage() {} - -func (x *SyncCommittee) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_sync_committee_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SyncCommittee.ProtoReflect.Descriptor instead. -func (*SyncCommittee) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_sync_committee_proto_rawDescGZIP(), []int{1} -} - -func (x *SyncCommittee) GetPubkeys() [][]byte { - if x != nil { - return x.Pubkeys - } - return nil -} - -func (x *SyncCommittee) GetAggregatePubkey() []byte { - if x != nil { - return x.AggregatePubkey - } - return nil -} - -type SyncCommitteeMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` - BeaconBlockRoot []byte `protobuf:"bytes,2,opt,name=beacon_block_root,json=beaconBlockRoot,proto3" json:"beacon_block_root,omitempty" ssz-size:"32"` - ValidatorIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,3,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` - Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SyncCommitteeMessage) Reset() { - *x = SyncCommitteeMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_sync_committee_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SyncCommitteeMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SyncCommitteeMessage) ProtoMessage() {} - -func (x *SyncCommitteeMessage) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_sync_committee_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SyncCommitteeMessage.ProtoReflect.Descriptor instead. -func (*SyncCommitteeMessage) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_sync_committee_proto_rawDescGZIP(), []int{2} -} - -func (x *SyncCommitteeMessage) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.Slot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -func (x *SyncCommitteeMessage) GetBeaconBlockRoot() []byte { - if x != nil { - return x.BeaconBlockRoot - } - return nil -} - -func (x *SyncCommitteeMessage) GetValidatorIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { - if x != nil { - return x.ValidatorIndex - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) -} - -func (x *SyncCommitteeMessage) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -var File_proto_eth_v2_sync_committee_proto protoreflect.FileDescriptor - -var file_proto_eth_v2_sync_committee_proto_rawDesc = []byte{ - 0x0a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x73, - 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x32, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, - 0x65, 0x78, 0x74, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0x61, 0x0a, 0x24, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x68, 0x0a, 0x0d, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x0a, 0x8a, 0xb5, 0x18, 0x06, 0x35, 0x31, 0x32, 0x2c, - 0x34, 0x38, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x31, 0x0a, 0x10, 0x61, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x52, 0x0f, 0x61, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x22, 0xc5, - 0x02, 0x0a, 0x14, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, - 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, - 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, - 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, - 0x6f, 0x74, 0x12, 0x32, 0x0a, 0x11, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, - 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x78, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, - 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, - 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, - 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, - 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x83, 0x01, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x42, 0x12, - 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, - 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, - 0x68, 0x2f, 0x76, 0x32, 0x3b, 0x65, 0x74, 0x68, 0xaa, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x74, 0x68, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0f, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x45, 0x74, 0x68, 0x5c, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_proto_eth_v2_sync_committee_proto_rawDescOnce sync.Once - file_proto_eth_v2_sync_committee_proto_rawDescData = file_proto_eth_v2_sync_committee_proto_rawDesc -) - -func file_proto_eth_v2_sync_committee_proto_rawDescGZIP() []byte { - file_proto_eth_v2_sync_committee_proto_rawDescOnce.Do(func() { - file_proto_eth_v2_sync_committee_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_eth_v2_sync_committee_proto_rawDescData) - }) - return file_proto_eth_v2_sync_committee_proto_rawDescData -} - -var file_proto_eth_v2_sync_committee_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_proto_eth_v2_sync_committee_proto_goTypes = []interface{}{ - (*SubmitSyncCommitteeSignaturesRequest)(nil), // 0: ethereum.eth.v2.SubmitSyncCommitteeSignaturesRequest - (*SyncCommittee)(nil), // 1: ethereum.eth.v2.SyncCommittee - (*SyncCommitteeMessage)(nil), // 2: ethereum.eth.v2.SyncCommitteeMessage -} -var file_proto_eth_v2_sync_committee_proto_depIdxs = []int32{ - 2, // 0: ethereum.eth.v2.SubmitSyncCommitteeSignaturesRequest.data:type_name -> ethereum.eth.v2.SyncCommitteeMessage - 1, // [1:1] is the sub-list for method output_type - 1, // [1:1] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name -} - -func init() { file_proto_eth_v2_sync_committee_proto_init() } -func file_proto_eth_v2_sync_committee_proto_init() { - if File_proto_eth_v2_sync_committee_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_proto_eth_v2_sync_committee_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitSyncCommitteeSignaturesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_sync_committee_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncCommittee); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_sync_committee_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncCommitteeMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_eth_v2_sync_committee_proto_rawDesc, - NumEnums: 0, - NumMessages: 3, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_proto_eth_v2_sync_committee_proto_goTypes, - DependencyIndexes: file_proto_eth_v2_sync_committee_proto_depIdxs, - MessageInfos: file_proto_eth_v2_sync_committee_proto_msgTypes, - }.Build() - File_proto_eth_v2_sync_committee_proto = out.File - file_proto_eth_v2_sync_committee_proto_rawDesc = nil - file_proto_eth_v2_sync_committee_proto_goTypes = nil - file_proto_eth_v2_sync_committee_proto_depIdxs = nil -} diff --git a/proto/eth/v2/sync_committee.proto b/proto/eth/v2/sync_committee.proto deleted file mode 100644 index e5aa96141378..000000000000 --- a/proto/eth/v2/sync_committee.proto +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2021 Prysmatic Labs. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -syntax = "proto3"; - -package ethereum.eth.v2; - -import "proto/eth/ext/options.proto"; - -option csharp_namespace = "Ethereum.Eth.V2"; -option go_package = "github.com/prysmaticlabs/prysm/v5/proto/eth/v2;eth"; -option java_multiple_files = true; -option java_outer_classname = "SyncCommitteeProto"; -option java_package = "org.ethereum.eth.v2"; -option php_namespace = "Ethereum\\Eth\\v2"; - -message SubmitSyncCommitteeSignaturesRequest { - repeated SyncCommitteeMessage data = 1; -} - -// SyncCommittee serves as committees to facilitate light client syncing to beacon chain. -message SyncCommittee { - repeated bytes pubkeys = 1 [(ethereum.eth.ext.ssz_size) = "sync_committee_bits.size,48"]; - bytes aggregate_pubkey = 2 [(ethereum.eth.ext.ssz_size) = "48"]; -} - -// Sync committee object to support light client. -message SyncCommitteeMessage { - // Slot to which this contribution pertains. - uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; - - // 32 byte block root for this signature. - bytes beacon_block_root = 2 [(ethereum.eth.ext.ssz_size) = "32"]; - - // Index of the validator that produced this signature. - uint64 validator_index = 3 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; - - // Signature by the validator over the block root of `slot`. - bytes signature = 4 [(ethereum.eth.ext.ssz_size) = "96"]; -} diff --git a/proto/eth/v2/validator.pb.go b/proto/eth/v2/validator.pb.go deleted file mode 100755 index 0377ae2c73b5..000000000000 --- a/proto/eth/v2/validator.pb.go +++ /dev/null @@ -1,547 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.1 -// source: proto/eth/v2/validator.proto - -package eth - -import ( - reflect "reflect" - sync "sync" - - github_com_prysmaticlabs_go_bitfield "github.com/prysmaticlabs/go-bitfield" - github_com_prysmaticlabs_prysm_v5_consensus_types_primitives "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" - _ "github.com/prysmaticlabs/prysm/v5/proto/eth/ext" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type ProduceBlockResponseV2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Version Version `protobuf:"varint,1,opt,name=version,proto3,enum=ethereum.eth.v2.Version" json:"version,omitempty"` - Data *BeaconBlockContainerV2 `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` -} - -func (x *ProduceBlockResponseV2) Reset() { - *x = ProduceBlockResponseV2{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_validator_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ProduceBlockResponseV2) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ProduceBlockResponseV2) ProtoMessage() {} - -func (x *ProduceBlockResponseV2) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_validator_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ProduceBlockResponseV2.ProtoReflect.Descriptor instead. -func (*ProduceBlockResponseV2) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_validator_proto_rawDescGZIP(), []int{0} -} - -func (x *ProduceBlockResponseV2) GetVersion() Version { - if x != nil { - return x.Version - } - return Version_PHASE0 -} - -func (x *ProduceBlockResponseV2) GetData() *BeaconBlockContainerV2 { - if x != nil { - return x.Data - } - return nil -} - -type ProduceBlindedBlockResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Version Version `protobuf:"varint,1,opt,name=version,proto3,enum=ethereum.eth.v2.Version" json:"version,omitempty"` - Data *BlindedBeaconBlockContainer `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` -} - -func (x *ProduceBlindedBlockResponse) Reset() { - *x = ProduceBlindedBlockResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_validator_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ProduceBlindedBlockResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ProduceBlindedBlockResponse) ProtoMessage() {} - -func (x *ProduceBlindedBlockResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_validator_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ProduceBlindedBlockResponse.ProtoReflect.Descriptor instead. -func (*ProduceBlindedBlockResponse) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_validator_proto_rawDescGZIP(), []int{1} -} - -func (x *ProduceBlindedBlockResponse) GetVersion() Version { - if x != nil { - return x.Version - } - return Version_PHASE0 -} - -func (x *ProduceBlindedBlockResponse) GetData() *BlindedBeaconBlockContainer { - if x != nil { - return x.Data - } - return nil -} - -type SyncCommitteeContribution struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` - BeaconBlockRoot []byte `protobuf:"bytes,2,opt,name=beacon_block_root,json=beaconBlockRoot,proto3" json:"beacon_block_root,omitempty" ssz-size:"32"` - SubcommitteeIndex uint64 `protobuf:"varint,3,opt,name=subcommittee_index,json=subcommitteeIndex,proto3" json:"subcommittee_index,omitempty"` - AggregationBits github_com_prysmaticlabs_go_bitfield.Bitvector128 `protobuf:"bytes,4,opt,name=aggregation_bits,json=aggregationBits,proto3" json:"aggregation_bits,omitempty" cast-type:"github.com/prysmaticlabs/go-bitfield.Bitvector128" ssz-size:"16"` - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SyncCommitteeContribution) Reset() { - *x = SyncCommitteeContribution{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_validator_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SyncCommitteeContribution) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SyncCommitteeContribution) ProtoMessage() {} - -func (x *SyncCommitteeContribution) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_validator_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SyncCommitteeContribution.ProtoReflect.Descriptor instead. -func (*SyncCommitteeContribution) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_validator_proto_rawDescGZIP(), []int{2} -} - -func (x *SyncCommitteeContribution) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { - if x != nil { - return x.Slot - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) -} - -func (x *SyncCommitteeContribution) GetBeaconBlockRoot() []byte { - if x != nil { - return x.BeaconBlockRoot - } - return nil -} - -func (x *SyncCommitteeContribution) GetSubcommitteeIndex() uint64 { - if x != nil { - return x.SubcommitteeIndex - } - return 0 -} - -func (x *SyncCommitteeContribution) GetAggregationBits() github_com_prysmaticlabs_go_bitfield.Bitvector128 { - if x != nil { - return x.AggregationBits - } - return github_com_prysmaticlabs_go_bitfield.Bitvector128(nil) -} - -func (x *SyncCommitteeContribution) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type ContributionAndProof struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AggregatorIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,1,opt,name=aggregator_index,json=aggregatorIndex,proto3" json:"aggregator_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` - Contribution *SyncCommitteeContribution `protobuf:"bytes,2,opt,name=contribution,proto3" json:"contribution,omitempty"` - SelectionProof []byte `protobuf:"bytes,3,opt,name=selection_proof,json=selectionProof,proto3" json:"selection_proof,omitempty" ssz-size:"96"` -} - -func (x *ContributionAndProof) Reset() { - *x = ContributionAndProof{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_validator_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContributionAndProof) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContributionAndProof) ProtoMessage() {} - -func (x *ContributionAndProof) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_validator_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ContributionAndProof.ProtoReflect.Descriptor instead. -func (*ContributionAndProof) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_validator_proto_rawDescGZIP(), []int{3} -} - -func (x *ContributionAndProof) GetAggregatorIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { - if x != nil { - return x.AggregatorIndex - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) -} - -func (x *ContributionAndProof) GetContribution() *SyncCommitteeContribution { - if x != nil { - return x.Contribution - } - return nil -} - -func (x *ContributionAndProof) GetSelectionProof() []byte { - if x != nil { - return x.SelectionProof - } - return nil -} - -type SignedContributionAndProof struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message *ContributionAndProof `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedContributionAndProof) Reset() { - *x = SignedContributionAndProof{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_validator_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedContributionAndProof) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedContributionAndProof) ProtoMessage() {} - -func (x *SignedContributionAndProof) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_validator_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedContributionAndProof.ProtoReflect.Descriptor instead. -func (*SignedContributionAndProof) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_validator_proto_rawDescGZIP(), []int{4} -} - -func (x *SignedContributionAndProof) GetMessage() *ContributionAndProof { - if x != nil { - return x.Message - } - return nil -} - -func (x *SignedContributionAndProof) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -var File_proto_eth_v2_validator_proto protoreflect.FileDescriptor - -var file_proto_eth_v2_validator_proto_rawDesc = []byte{ - 0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x1a, - 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x65, 0x78, 0x74, 0x2f, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x62, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x89, 0x01, 0x0a, 0x16, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x56, 0x32, 0x12, 0x32, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x56, 0x32, 0x52, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x93, 0x01, 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x65, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, - 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe7, 0x02, 0x0a, 0x19, - 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, - 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, - 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, - 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, - 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x32, 0x0a, 0x11, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, - 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x75, 0x62, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x66, 0x0a, 0x10, 0x61, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0c, 0x42, 0x3b, 0x82, 0xb5, 0x18, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, - 0x67, 0x6f, 0x2d, 0x62, 0x69, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x42, 0x69, 0x74, 0x76, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x32, 0x38, 0x8a, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x0f, - 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x12, - 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x93, 0x02, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x7a, - 0x0a, 0x10, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, - 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, - 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, - 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4e, 0x0a, 0x0c, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x32, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x0f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x0e, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x83, 0x01, 0x0a, 0x1a, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, - 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x42, 0x7f, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x42, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, - 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x3b, 0x65, 0x74, 0x68, 0xaa, 0x02, - 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x74, 0x68, 0x2e, 0x56, 0x32, - 0xca, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x45, 0x74, 0x68, 0x5c, - 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_proto_eth_v2_validator_proto_rawDescOnce sync.Once - file_proto_eth_v2_validator_proto_rawDescData = file_proto_eth_v2_validator_proto_rawDesc -) - -func file_proto_eth_v2_validator_proto_rawDescGZIP() []byte { - file_proto_eth_v2_validator_proto_rawDescOnce.Do(func() { - file_proto_eth_v2_validator_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_eth_v2_validator_proto_rawDescData) - }) - return file_proto_eth_v2_validator_proto_rawDescData -} - -var file_proto_eth_v2_validator_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_proto_eth_v2_validator_proto_goTypes = []interface{}{ - (*ProduceBlockResponseV2)(nil), // 0: ethereum.eth.v2.ProduceBlockResponseV2 - (*ProduceBlindedBlockResponse)(nil), // 1: ethereum.eth.v2.ProduceBlindedBlockResponse - (*SyncCommitteeContribution)(nil), // 2: ethereum.eth.v2.SyncCommitteeContribution - (*ContributionAndProof)(nil), // 3: ethereum.eth.v2.ContributionAndProof - (*SignedContributionAndProof)(nil), // 4: ethereum.eth.v2.SignedContributionAndProof - (Version)(0), // 5: ethereum.eth.v2.Version - (*BeaconBlockContainerV2)(nil), // 6: ethereum.eth.v2.BeaconBlockContainerV2 - (*BlindedBeaconBlockContainer)(nil), // 7: ethereum.eth.v2.BlindedBeaconBlockContainer -} -var file_proto_eth_v2_validator_proto_depIdxs = []int32{ - 5, // 0: ethereum.eth.v2.ProduceBlockResponseV2.version:type_name -> ethereum.eth.v2.Version - 6, // 1: ethereum.eth.v2.ProduceBlockResponseV2.data:type_name -> ethereum.eth.v2.BeaconBlockContainerV2 - 5, // 2: ethereum.eth.v2.ProduceBlindedBlockResponse.version:type_name -> ethereum.eth.v2.Version - 7, // 3: ethereum.eth.v2.ProduceBlindedBlockResponse.data:type_name -> ethereum.eth.v2.BlindedBeaconBlockContainer - 2, // 4: ethereum.eth.v2.ContributionAndProof.contribution:type_name -> ethereum.eth.v2.SyncCommitteeContribution - 3, // 5: ethereum.eth.v2.SignedContributionAndProof.message:type_name -> ethereum.eth.v2.ContributionAndProof - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name -} - -func init() { file_proto_eth_v2_validator_proto_init() } -func file_proto_eth_v2_validator_proto_init() { - if File_proto_eth_v2_validator_proto != nil { - return - } - file_proto_eth_v2_beacon_block_proto_init() - file_proto_eth_v2_version_proto_init() - if !protoimpl.UnsafeEnabled { - file_proto_eth_v2_validator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProduceBlockResponseV2); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_validator_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProduceBlindedBlockResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_validator_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncCommitteeContribution); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_validator_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContributionAndProof); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_validator_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedContributionAndProof); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_eth_v2_validator_proto_rawDesc, - NumEnums: 0, - NumMessages: 5, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_proto_eth_v2_validator_proto_goTypes, - DependencyIndexes: file_proto_eth_v2_validator_proto_depIdxs, - MessageInfos: file_proto_eth_v2_validator_proto_msgTypes, - }.Build() - File_proto_eth_v2_validator_proto = out.File - file_proto_eth_v2_validator_proto_rawDesc = nil - file_proto_eth_v2_validator_proto_goTypes = nil - file_proto_eth_v2_validator_proto_depIdxs = nil -} diff --git a/proto/eth/v2/validator.proto b/proto/eth/v2/validator.proto deleted file mode 100644 index 71bb0bdbf382..000000000000 --- a/proto/eth/v2/validator.proto +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2021 Prysmatic Labs. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -syntax = "proto3"; - -package ethereum.eth.v2; - -import "proto/eth/ext/options.proto"; -import "proto/eth/v2/beacon_block.proto"; -import "proto/eth/v2/version.proto"; - -option csharp_namespace = "Ethereum.Eth.V2"; -option go_package = "github.com/prysmaticlabs/prysm/v5/proto/eth/v2;eth"; -option java_multiple_files = true; -option java_outer_classname = "ValidatorProto"; -option java_package = "org.ethereum.eth.v2"; -option php_namespace = "Ethereum\\Eth\\v2"; - -message ProduceBlockResponseV2 { - Version version = 1; - BeaconBlockContainerV2 data = 2; -} - -message ProduceBlindedBlockResponse { - Version version = 1; - BlindedBeaconBlockContainer data = 2; -} - -// Aggregated sync committee object to support light client. -message SyncCommitteeContribution { - // Slot to which this contribution pertains. - uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; - - // 32 byte block root for this signature. - bytes beacon_block_root = 2 [(ethereum.eth.ext.ssz_size) = "32"]; - - // The subcommittee this contribution pertains to out of the broader sync committee. - uint64 subcommittee_index = 3; - - // A bit is set if a signature from the validator at the corresponding - // index in the subcommittee is present in the aggregate `signature`. - bytes aggregation_bits = 4 [(ethereum.eth.ext.ssz_size) = "sync_committee_aggregate_bytes.size", (ethereum.eth.ext.cast_type) = "sync_committee_aggregate_bits.type"]; - - // Signature by the validator(s) over the block root of `slot`. - bytes signature = 5 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -// Aggregated sync committee signature object with selection proof to support light client. -message ContributionAndProof { - // Index of the aggregator that produced this proof. - uint64 aggregator_index = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; - - SyncCommitteeContribution contribution = 2; - - // The selection proof itself. - bytes selection_proof = 3 [(ethereum.eth.ext.ssz_size) = "96"]; -} - -// Signed aggregated sync committee signature object with selection proof to support light client. -message SignedContributionAndProof { - ContributionAndProof message = 1; - - // Signature of the aggregator that produced `message`. - bytes signature = 4 [(ethereum.eth.ext.ssz_size) = "96"]; -} diff --git a/proto/eth/v2/version.pb.go b/proto/eth/v2/version.pb.go deleted file mode 100755 index 00cc5f383e01..000000000000 --- a/proto/eth/v2/version.pb.go +++ /dev/null @@ -1,151 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.1 -// source: proto/eth/v2/version.proto - -package eth - -import ( - reflect "reflect" - sync "sync" - - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Version int32 - -const ( - Version_PHASE0 Version = 0 - Version_ALTAIR Version = 1 - Version_BELLATRIX Version = 2 - Version_CAPELLA Version = 3 - Version_DENEB Version = 4 - Version_ELECTRA Version = 5 -) - -// Enum value maps for Version. -var ( - Version_name = map[int32]string{ - 0: "PHASE0", - 1: "ALTAIR", - 2: "BELLATRIX", - 3: "CAPELLA", - 4: "DENEB", - 5: "ELECTRA", - } - Version_value = map[string]int32{ - "PHASE0": 0, - "ALTAIR": 1, - "BELLATRIX": 2, - "CAPELLA": 3, - "DENEB": 4, - "ELECTRA": 5, - } -) - -func (x Version) Enum() *Version { - p := new(Version) - *p = x - return p -} - -func (x Version) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Version) Descriptor() protoreflect.EnumDescriptor { - return file_proto_eth_v2_version_proto_enumTypes[0].Descriptor() -} - -func (Version) Type() protoreflect.EnumType { - return &file_proto_eth_v2_version_proto_enumTypes[0] -} - -func (x Version) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Version.Descriptor instead. -func (Version) EnumDescriptor() ([]byte, []int) { - return file_proto_eth_v2_version_proto_rawDescGZIP(), []int{0} -} - -var File_proto_eth_v2_version_proto protoreflect.FileDescriptor - -var file_proto_eth_v2_version_proto_rawDesc = []byte{ - 0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2a, 0x55, 0x0a, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x48, 0x41, 0x53, - 0x45, 0x30, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x54, 0x41, 0x49, 0x52, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x45, 0x4c, 0x4c, 0x41, 0x54, 0x52, 0x49, 0x58, 0x10, 0x02, 0x12, - 0x0b, 0x0a, 0x07, 0x43, 0x41, 0x50, 0x45, 0x4c, 0x4c, 0x41, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, - 0x44, 0x45, 0x4e, 0x45, 0x42, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x4c, 0x45, 0x43, 0x54, - 0x52, 0x41, 0x10, 0x05, 0x42, 0x7d, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x42, 0x0c, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, - 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x3b, 0x65, 0x74, 0x68, 0xaa, - 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x74, 0x68, 0x2e, 0x56, - 0x32, 0xca, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x45, 0x74, 0x68, - 0x5c, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_proto_eth_v2_version_proto_rawDescOnce sync.Once - file_proto_eth_v2_version_proto_rawDescData = file_proto_eth_v2_version_proto_rawDesc -) - -func file_proto_eth_v2_version_proto_rawDescGZIP() []byte { - file_proto_eth_v2_version_proto_rawDescOnce.Do(func() { - file_proto_eth_v2_version_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_eth_v2_version_proto_rawDescData) - }) - return file_proto_eth_v2_version_proto_rawDescData -} - -var file_proto_eth_v2_version_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_eth_v2_version_proto_goTypes = []interface{}{ - (Version)(0), // 0: ethereum.eth.v2.Version -} -var file_proto_eth_v2_version_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_proto_eth_v2_version_proto_init() } -func file_proto_eth_v2_version_proto_init() { - if File_proto_eth_v2_version_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_eth_v2_version_proto_rawDesc, - NumEnums: 1, - NumMessages: 0, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_proto_eth_v2_version_proto_goTypes, - DependencyIndexes: file_proto_eth_v2_version_proto_depIdxs, - EnumInfos: file_proto_eth_v2_version_proto_enumTypes, - }.Build() - File_proto_eth_v2_version_proto = out.File - file_proto_eth_v2_version_proto_rawDesc = nil - file_proto_eth_v2_version_proto_goTypes = nil - file_proto_eth_v2_version_proto_depIdxs = nil -} diff --git a/proto/eth/v2/version.proto b/proto/eth/v2/version.proto deleted file mode 100644 index 6a16e9c77209..000000000000 --- a/proto/eth/v2/version.proto +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2021 Prysmatic Labs. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -syntax = "proto3"; - -package ethereum.eth.v2; - -option csharp_namespace = "Ethereum.Eth.V2"; -option go_package = "github.com/prysmaticlabs/prysm/v5/proto/eth/v2;eth"; -option java_multiple_files = true; -option java_outer_classname = "VersionProto"; -option java_package = "org.ethereum.eth.v2"; -option php_namespace = "Ethereum\\Eth\\v2"; - -// Version states the version of the returned accompanying message. -enum Version { - PHASE0 = 0; - ALTAIR = 1; - BELLATRIX = 2; - CAPELLA = 3; - DENEB = 4; - ELECTRA = 5; -} diff --git a/proto/eth/v2/withdrawals.pb.go b/proto/eth/v2/withdrawals.pb.go deleted file mode 100755 index a639b8a55d82..000000000000 --- a/proto/eth/v2/withdrawals.pb.go +++ /dev/null @@ -1,262 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.1 -// source: proto/eth/v2/withdrawals.proto - -package eth - -import ( - reflect "reflect" - sync "sync" - - github_com_prysmaticlabs_prysm_v5_consensus_types_primitives "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" - _ "github.com/prysmaticlabs/prysm/v5/proto/eth/ext" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type BLSToExecutionChange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ValidatorIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,1,opt,name=validator_index,json=validatorIndex,proto3" json:"validator_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` - FromBlsPubkey []byte `protobuf:"bytes,2,opt,name=from_bls_pubkey,json=fromBlsPubkey,proto3" json:"from_bls_pubkey,omitempty" ssz-size:"48"` - ToExecutionAddress []byte `protobuf:"bytes,3,opt,name=to_execution_address,json=toExecutionAddress,proto3" json:"to_execution_address,omitempty" ssz-size:"20"` -} - -func (x *BLSToExecutionChange) Reset() { - *x = BLSToExecutionChange{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_withdrawals_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BLSToExecutionChange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BLSToExecutionChange) ProtoMessage() {} - -func (x *BLSToExecutionChange) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_withdrawals_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BLSToExecutionChange.ProtoReflect.Descriptor instead. -func (*BLSToExecutionChange) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_withdrawals_proto_rawDescGZIP(), []int{0} -} - -func (x *BLSToExecutionChange) GetValidatorIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { - if x != nil { - return x.ValidatorIndex - } - return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) -} - -func (x *BLSToExecutionChange) GetFromBlsPubkey() []byte { - if x != nil { - return x.FromBlsPubkey - } - return nil -} - -func (x *BLSToExecutionChange) GetToExecutionAddress() []byte { - if x != nil { - return x.ToExecutionAddress - } - return nil -} - -type SignedBLSToExecutionChange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message *BLSToExecutionChange `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` -} - -func (x *SignedBLSToExecutionChange) Reset() { - *x = SignedBLSToExecutionChange{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v2_withdrawals_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SignedBLSToExecutionChange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SignedBLSToExecutionChange) ProtoMessage() {} - -func (x *SignedBLSToExecutionChange) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v2_withdrawals_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SignedBLSToExecutionChange.ProtoReflect.Descriptor instead. -func (*SignedBLSToExecutionChange) Descriptor() ([]byte, []int) { - return file_proto_eth_v2_withdrawals_proto_rawDescGZIP(), []int{1} -} - -func (x *SignedBLSToExecutionChange) GetMessage() *BLSToExecutionChange { - if x != nil { - return x.Message - } - return nil -} - -func (x *SignedBLSToExecutionChange) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -var File_proto_eth_v2_withdrawals_proto protoreflect.FileDescriptor - -var file_proto_eth_v2_withdrawals_proto_rawDesc = []byte{ - 0x0a, 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x2f, 0x77, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x32, 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x65, 0x78, 0x74, - 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfa, - 0x01, 0x0a, 0x14, 0x42, 0x4c, 0x53, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x78, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, - 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, - 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, - 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x2e, 0x0a, 0x0f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, 0x73, 0x5f, 0x70, 0x75, - 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, - 0x34, 0x38, 0x52, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x73, 0x50, 0x75, 0x62, 0x6b, 0x65, - 0x79, 0x12, 0x38, 0x0a, 0x14, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, - 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x32, 0x30, 0x52, 0x12, 0x74, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1a, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x4c, 0x53, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x4c, - 0x53, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, - 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x42, 0x81, 0x01, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x42, 0x10, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, - 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x32, 0x3b, 0x65, 0x74, - 0x68, 0xaa, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x74, 0x68, - 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x45, - 0x74, 0x68, 0x5c, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_proto_eth_v2_withdrawals_proto_rawDescOnce sync.Once - file_proto_eth_v2_withdrawals_proto_rawDescData = file_proto_eth_v2_withdrawals_proto_rawDesc -) - -func file_proto_eth_v2_withdrawals_proto_rawDescGZIP() []byte { - file_proto_eth_v2_withdrawals_proto_rawDescOnce.Do(func() { - file_proto_eth_v2_withdrawals_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_eth_v2_withdrawals_proto_rawDescData) - }) - return file_proto_eth_v2_withdrawals_proto_rawDescData -} - -var file_proto_eth_v2_withdrawals_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_proto_eth_v2_withdrawals_proto_goTypes = []interface{}{ - (*BLSToExecutionChange)(nil), // 0: ethereum.eth.v2.BLSToExecutionChange - (*SignedBLSToExecutionChange)(nil), // 1: ethereum.eth.v2.SignedBLSToExecutionChange -} -var file_proto_eth_v2_withdrawals_proto_depIdxs = []int32{ - 0, // 0: ethereum.eth.v2.SignedBLSToExecutionChange.message:type_name -> ethereum.eth.v2.BLSToExecutionChange - 1, // [1:1] is the sub-list for method output_type - 1, // [1:1] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name -} - -func init() { file_proto_eth_v2_withdrawals_proto_init() } -func file_proto_eth_v2_withdrawals_proto_init() { - if File_proto_eth_v2_withdrawals_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_proto_eth_v2_withdrawals_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BLSToExecutionChange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_eth_v2_withdrawals_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignedBLSToExecutionChange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_eth_v2_withdrawals_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_proto_eth_v2_withdrawals_proto_goTypes, - DependencyIndexes: file_proto_eth_v2_withdrawals_proto_depIdxs, - MessageInfos: file_proto_eth_v2_withdrawals_proto_msgTypes, - }.Build() - File_proto_eth_v2_withdrawals_proto = out.File - file_proto_eth_v2_withdrawals_proto_rawDesc = nil - file_proto_eth_v2_withdrawals_proto_goTypes = nil - file_proto_eth_v2_withdrawals_proto_depIdxs = nil -} diff --git a/proto/eth/v2/withdrawals.proto b/proto/eth/v2/withdrawals.proto deleted file mode 100644 index e4a5f026c18e..000000000000 --- a/proto/eth/v2/withdrawals.proto +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2022 Prysmatic Labs. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -syntax = "proto3"; - -package ethereum.eth.v2; - -import "proto/eth/ext/options.proto"; - -option csharp_namespace = "Ethereum.Eth.V2"; -option go_package = "github.com/prysmaticlabs/prysm/v5/proto/eth/v2;eth"; -option java_multiple_files = true; -option java_outer_classname = "WithdrawalsProto"; -option java_package = "org.ethereum.eth.v2"; -option php_namespace = "Ethereum\\Eth\\v2"; - -// The message requesting a BLS to execution withdrawal credentials change -message BLSToExecutionChange { - // The validator index requesting the change - uint64 validator_index = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; - - // The public key of the BLS address requesting the change - bytes from_bls_pubkey = 2 [(ethereum.eth.ext.ssz_size) = "48"]; - - // The new execution address to be the withdrawal credentials - bytes to_execution_address = 3 [(ethereum.eth.ext.ssz_size) = "20"]; -} - -// The signed version of a BLSToExecutionChange -message SignedBLSToExecutionChange { - // The BLSToExecutionChange message itself - BLSToExecutionChange message = 1; - - // The 96 byte BLS signature from the withdrawal address requesting the change - bytes signature = 2 [(ethereum.eth.ext.ssz_size) = "96"]; -} diff --git a/proto/migration/BUILD.bazel b/proto/migration/BUILD.bazel index 154b51281fe3..3ceb9c6913e3 100644 --- a/proto/migration/BUILD.bazel +++ b/proto/migration/BUILD.bazel @@ -5,14 +5,11 @@ go_library( srcs = [ "enums.go", "v1alpha1_to_v1.go", - "v1alpha1_to_v2.go", ], importpath = "github.com/prysmaticlabs/prysm/v5/proto/migration", visibility = ["//visibility:public"], deps = [ - "//encoding/bytesutil:go_default_library", "//proto/eth/v1:go_default_library", - "//proto/eth/v2:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "@com_github_pkg_errors//:go_default_library", ], diff --git a/proto/migration/v1alpha1_to_v2.go b/proto/migration/v1alpha1_to_v2.go deleted file mode 100644 index 9636be437d22..000000000000 --- a/proto/migration/v1alpha1_to_v2.go +++ /dev/null @@ -1,32 +0,0 @@ -package migration - -import ( - "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" - ethpbv2 "github.com/prysmaticlabs/prysm/v5/proto/eth/v2" - ethpbalpha "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" -) - -// V1Alpha1SyncCommitteeToV2 converts a v1alpha1 SyncCommittee object to its v2 equivalent. -func V1Alpha1SyncCommitteeToV2(alphaCommittee *ethpbalpha.SyncCommittee) *ethpbv2.SyncCommittee { - if alphaCommittee == nil { - return nil - } - - result := ðpbv2.SyncCommittee{ - Pubkeys: bytesutil.SafeCopy2dBytes(alphaCommittee.Pubkeys), - AggregatePubkey: bytesutil.SafeCopyBytes(alphaCommittee.AggregatePubkey), - } - return result -} - -func V2SyncCommitteeToV1Alpha1(committee *ethpbv2.SyncCommittee) *ethpbalpha.SyncCommittee { - if committee == nil { - return nil - } - - result := ðpbalpha.SyncCommittee{ - Pubkeys: bytesutil.SafeCopy2dBytes(committee.Pubkeys), - AggregatePubkey: bytesutil.SafeCopyBytes(committee.AggregatePubkey), - } - return result -} diff --git a/proto/prysm/v1alpha1/BUILD.bazel b/proto/prysm/v1alpha1/BUILD.bazel index fe510860a9c6..8022b3700370 100644 --- a/proto/prysm/v1alpha1/BUILD.bazel +++ b/proto/prysm/v1alpha1/BUILD.bazel @@ -176,8 +176,17 @@ ssz_electra_objs = [ ] ssz_fulu_objs = [ + "BeaconBlockBodyFulu", + "BeaconBlockContentsFulu", + "BeaconBlockFulu", + "BeaconStateFulu", + "BlindedBeaconBlockBodyFulu", + "BlindedBeaconBlockFulu", "DataColumnIdentifier", "DataColumnSidecar", + "SignedBeaconBlockContentsFulu", + "SignedBeaconBlockFulu", + "SignedBlindedBeaconBlockFulu" ] ssz_gen_marshal( diff --git a/proto/prysm/v1alpha1/altair.ssz.go b/proto/prysm/v1alpha1/altair.ssz.go index 1044e35b15cb..84c8e4b6672c 100644 --- a/proto/prysm/v1alpha1/altair.ssz.go +++ b/proto/prysm/v1alpha1/altair.ssz.go @@ -1,5 +1,4 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: 5b4ab4dc45576936fb5674ffd75bcac4513bd176968ccaab1ca0d4f9aad96c87 package eth import ( diff --git a/proto/prysm/v1alpha1/attestation/attestation_utils.go b/proto/prysm/v1alpha1/attestation/attestation_utils.go index 7c160a8cf43e..863bd380df24 100644 --- a/proto/prysm/v1alpha1/attestation/attestation_utils.go +++ b/proto/prysm/v1alpha1/attestation/attestation_utils.go @@ -65,7 +65,7 @@ func ConvertToIndexed(_ context.Context, attestation ethpb.Att, committees ...[] // AttestingIndices returns the attesting participants indices from the attestation data. // Committees are provided as an argument rather than an imported implementation from the spec definition. -// Having committees as an argument allows for re-use of beacon committees when possible. +// Having committees as an argument allows for reuse of beacon committees when possible. // // Spec pseudocode definition (Electra version): // @@ -254,7 +254,7 @@ func CheckPointIsEqual(checkPt1, checkPt2 *ethpb.Checkpoint) bool { // attestingIndicesPhase0 returns the attesting participants indices from the attestation data. // Committees are provided as an argument rather than an imported implementation from the spec definition. -// Having committees as an argument allows for re-use of beacon committees when possible. +// Having committees as an argument allows for reuse of beacon committees when possible. // // Spec pseudocode definition (Phase0 version): // diff --git a/proto/prysm/v1alpha1/beacon_block.go b/proto/prysm/v1alpha1/beacon_block.go index 1f14849e79f4..32b4167750d7 100644 --- a/proto/prysm/v1alpha1/beacon_block.go +++ b/proto/prysm/v1alpha1/beacon_block.go @@ -5,6 +5,10 @@ import ( enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" ) +// ---------------------------------------------------------------------------- +// Phase 0 +// ---------------------------------------------------------------------------- + // Copy -- func (sigBlock *SignedBeaconBlock) Copy() *SignedBeaconBlock { if sigBlock == nil { @@ -47,6 +51,107 @@ func (body *BeaconBlockBody) Copy() *BeaconBlockBody { } } +// Copy -- +func (data *Eth1Data) Copy() *Eth1Data { + if data == nil { + return nil + } + return &Eth1Data{ + DepositRoot: bytesutil.SafeCopyBytes(data.DepositRoot), + DepositCount: data.DepositCount, + BlockHash: bytesutil.SafeCopyBytes(data.BlockHash), + } +} + +// Copy -- +func (slashing *ProposerSlashing) Copy() *ProposerSlashing { + if slashing == nil { + return nil + } + return &ProposerSlashing{ + Header_1: slashing.Header_1.Copy(), + Header_2: slashing.Header_2.Copy(), + } +} + +// Copy -- +func (header *SignedBeaconBlockHeader) Copy() *SignedBeaconBlockHeader { + if header == nil { + return nil + } + return &SignedBeaconBlockHeader{ + Header: header.Header.Copy(), + Signature: bytesutil.SafeCopyBytes(header.Signature), + } +} + +// Copy -- +func (header *BeaconBlockHeader) Copy() *BeaconBlockHeader { + if header == nil { + return nil + } + parentRoot := bytesutil.SafeCopyBytes(header.ParentRoot) + stateRoot := bytesutil.SafeCopyBytes(header.StateRoot) + bodyRoot := bytesutil.SafeCopyBytes(header.BodyRoot) + return &BeaconBlockHeader{ + Slot: header.Slot, + ProposerIndex: header.ProposerIndex, + ParentRoot: parentRoot, + StateRoot: stateRoot, + BodyRoot: bodyRoot, + } +} + +// Copy -- +func (deposit *Deposit) Copy() *Deposit { + if deposit == nil { + return nil + } + return &Deposit{ + Proof: bytesutil.SafeCopy2dBytes(deposit.Proof), + Data: deposit.Data.Copy(), + } +} + +// Copy -- +func (depData *Deposit_Data) Copy() *Deposit_Data { + if depData == nil { + return nil + } + return &Deposit_Data{ + PublicKey: bytesutil.SafeCopyBytes(depData.PublicKey), + WithdrawalCredentials: bytesutil.SafeCopyBytes(depData.WithdrawalCredentials), + Amount: depData.Amount, + Signature: bytesutil.SafeCopyBytes(depData.Signature), + } +} + +// Copy -- +func (exit *SignedVoluntaryExit) Copy() *SignedVoluntaryExit { + if exit == nil { + return nil + } + return &SignedVoluntaryExit{ + Exit: exit.Exit.Copy(), + Signature: bytesutil.SafeCopyBytes(exit.Signature), + } +} + +// Copy -- +func (exit *VoluntaryExit) Copy() *VoluntaryExit { + if exit == nil { + return nil + } + return &VoluntaryExit{ + Epoch: exit.Epoch, + ValidatorIndex: exit.ValidatorIndex, + } +} + +// ---------------------------------------------------------------------------- +// Altair +// ---------------------------------------------------------------------------- + // Copy -- func (sigBlock *SignedBeaconBlockAltair) Copy() *SignedBeaconBlockAltair { if sigBlock == nil { @@ -90,6 +195,32 @@ func (body *BeaconBlockBodyAltair) Copy() *BeaconBlockBodyAltair { } } +// Copy -- +func (a *SyncAggregate) Copy() *SyncAggregate { + if a == nil { + return nil + } + return &SyncAggregate{ + SyncCommitteeBits: bytesutil.SafeCopyBytes(a.SyncCommitteeBits), + SyncCommitteeSignature: bytesutil.SafeCopyBytes(a.SyncCommitteeSignature), + } +} + +// Copy -- +func (summary *HistoricalSummary) Copy() *HistoricalSummary { + if summary == nil { + return nil + } + return &HistoricalSummary{ + BlockSummaryRoot: bytesutil.SafeCopyBytes(summary.BlockSummaryRoot), + StateSummaryRoot: bytesutil.SafeCopyBytes(summary.StateSummaryRoot), + } +} + +// ---------------------------------------------------------------------------- +// Bellatrix +// ---------------------------------------------------------------------------- + // Copy -- func (sigBlock *SignedBeaconBlockBellatrix) Copy() *SignedBeaconBlockBellatrix { if sigBlock == nil { @@ -134,6 +265,54 @@ func (body *BeaconBlockBodyBellatrix) Copy() *BeaconBlockBodyBellatrix { } } +// Copy -- +func (sigBlock *SignedBlindedBeaconBlockBellatrix) Copy() *SignedBlindedBeaconBlockBellatrix { + if sigBlock == nil { + return nil + } + return &SignedBlindedBeaconBlockBellatrix{ + Block: sigBlock.Block.Copy(), + Signature: bytesutil.SafeCopyBytes(sigBlock.Signature), + } +} + +// Copy -- +func (block *BlindedBeaconBlockBellatrix) Copy() *BlindedBeaconBlockBellatrix { + if block == nil { + return nil + } + return &BlindedBeaconBlockBellatrix{ + Slot: block.Slot, + ProposerIndex: block.ProposerIndex, + ParentRoot: bytesutil.SafeCopyBytes(block.ParentRoot), + StateRoot: bytesutil.SafeCopyBytes(block.StateRoot), + Body: block.Body.Copy(), + } +} + +// Copy -- +func (body *BlindedBeaconBlockBodyBellatrix) Copy() *BlindedBeaconBlockBodyBellatrix { + if body == nil { + return nil + } + return &BlindedBeaconBlockBodyBellatrix{ + RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), + Eth1Data: body.Eth1Data.Copy(), + Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), + ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(), + } +} + +// ---------------------------------------------------------------------------- +// Capella +// ---------------------------------------------------------------------------- + // Copy -- func (sigBlock *SignedBeaconBlockCapella) Copy() *SignedBeaconBlockCapella { if sigBlock == nil { @@ -224,6 +403,33 @@ func (body *BlindedBeaconBlockBodyCapella) Copy() *BlindedBeaconBlockBodyCapella } } +// Copy -- +func (change *SignedBLSToExecutionChange) Copy() *SignedBLSToExecutionChange { + if change == nil { + return nil + } + return &SignedBLSToExecutionChange{ + Message: change.Message.Copy(), + Signature: bytesutil.SafeCopyBytes(change.Signature), + } +} + +// Copy -- +func (change *BLSToExecutionChange) Copy() *BLSToExecutionChange { + if change == nil { + return nil + } + return &BLSToExecutionChange{ + ValidatorIndex: change.ValidatorIndex, + FromBlsPubkey: bytesutil.SafeCopyBytes(change.FromBlsPubkey), + ToExecutionAddress: bytesutil.SafeCopyBytes(change.ToExecutionAddress), + } +} + +// ---------------------------------------------------------------------------- +// Deneb +// ---------------------------------------------------------------------------- + // Copy -- func (sigBlock *SignedBlindedBeaconBlockDeneb) Copy() *SignedBlindedBeaconBlockDeneb { if sigBlock == nil { @@ -270,6 +476,61 @@ func (body *BlindedBeaconBlockBodyDeneb) Copy() *BlindedBeaconBlockBodyDeneb { } } +// Copy -- +func (sigBlock *SignedBeaconBlockDeneb) Copy() *SignedBeaconBlockDeneb { + if sigBlock == nil { + return nil + } + return &SignedBeaconBlockDeneb{ + Block: sigBlock.Block.Copy(), + Signature: bytesutil.SafeCopyBytes(sigBlock.Signature), + } +} + +// Copy -- +func (block *BeaconBlockDeneb) Copy() *BeaconBlockDeneb { + if block == nil { + return nil + } + return &BeaconBlockDeneb{ + Slot: block.Slot, + ProposerIndex: block.ProposerIndex, + ParentRoot: bytesutil.SafeCopyBytes(block.ParentRoot), + StateRoot: bytesutil.SafeCopyBytes(block.StateRoot), + Body: block.Body.Copy(), + } +} + +// Copy -- +func (body *BeaconBlockBodyDeneb) Copy() *BeaconBlockBodyDeneb { + if body == nil { + return nil + } + return &BeaconBlockBodyDeneb{ + RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), + Eth1Data: body.Eth1Data.Copy(), + Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), + ExecutionPayload: body.ExecutionPayload.Copy(), + BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges), + BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments), + } +} + +// CopyBlobKZGs copies the provided blob kzgs object. +func CopyBlobKZGs(b [][]byte) [][]byte { + return bytesutil.SafeCopy2dBytes(b) +} + +// ---------------------------------------------------------------------------- +// Electra +// ---------------------------------------------------------------------------- + // Copy -- func (sigBlock *SignedBlindedBeaconBlockElectra) Copy() *SignedBlindedBeaconBlockElectra { if sigBlock == nil { @@ -318,22 +579,22 @@ func (body *BlindedBeaconBlockBodyElectra) Copy() *BlindedBeaconBlockBodyElectra } // Copy -- -func (sigBlock *SignedBlindedBeaconBlockBellatrix) Copy() *SignedBlindedBeaconBlockBellatrix { +func (sigBlock *SignedBeaconBlockElectra) Copy() *SignedBeaconBlockElectra { if sigBlock == nil { return nil } - return &SignedBlindedBeaconBlockBellatrix{ + return &SignedBeaconBlockElectra{ Block: sigBlock.Block.Copy(), Signature: bytesutil.SafeCopyBytes(sigBlock.Signature), } } // Copy -- -func (block *BlindedBeaconBlockBellatrix) Copy() *BlindedBeaconBlockBellatrix { +func (block *BeaconBlockElectra) Copy() *BeaconBlockElectra { if block == nil { return nil } - return &BlindedBeaconBlockBellatrix{ + return &BeaconBlockElectra{ Slot: block.Slot, ProposerIndex: block.ProposerIndex, ParentRoot: bytesutil.SafeCopyBytes(block.ParentRoot), @@ -343,29 +604,27 @@ func (block *BlindedBeaconBlockBellatrix) Copy() *BlindedBeaconBlockBellatrix { } // Copy -- -func (body *BlindedBeaconBlockBodyBellatrix) Copy() *BlindedBeaconBlockBodyBellatrix { +func (body *BeaconBlockBodyElectra) Copy() *BeaconBlockBodyElectra { if body == nil { return nil } - return &BlindedBeaconBlockBodyBellatrix{ - RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: body.Eth1Data.Copy(), - Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopySlice(body.ProposerSlashings), - AttesterSlashings: CopySlice(body.AttesterSlashings), - Attestations: CopySlice(body.Attestations), - Deposits: CopySlice(body.Deposits), - VoluntaryExits: CopySlice(body.VoluntaryExits), - SyncAggregate: body.SyncAggregate.Copy(), - ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(), + return &BeaconBlockBodyElectra{ + RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), + Eth1Data: body.Eth1Data.Copy(), + Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), + ExecutionPayload: body.ExecutionPayload.Copy(), + BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges), + BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments), + ExecutionRequests: CopyExecutionRequests(body.ExecutionRequests), } } -// CopyBlobKZGs copies the provided blob kzgs object. -func CopyBlobKZGs(b [][]byte) [][]byte { - return bytesutil.SafeCopy2dBytes(b) -} - // CopyExecutionRequests copies the provided execution requests. func CopyExecutionRequests(e *enginev1.ExecutionRequests) *enginev1.ExecutionRequests { if e == nil { @@ -391,23 +650,27 @@ func CopyExecutionRequests(e *enginev1.ExecutionRequests) *enginev1.ExecutionReq } } +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- + // Copy -- -func (sigBlock *SignedBeaconBlockDeneb) Copy() *SignedBeaconBlockDeneb { +func (sigBlock *SignedBlindedBeaconBlockFulu) Copy() *SignedBlindedBeaconBlockFulu { if sigBlock == nil { return nil } - return &SignedBeaconBlockDeneb{ - Block: sigBlock.Block.Copy(), + return &SignedBlindedBeaconBlockFulu{ + Message: sigBlock.Message.Copy(), Signature: bytesutil.SafeCopyBytes(sigBlock.Signature), } } // Copy -- -func (block *BeaconBlockDeneb) Copy() *BeaconBlockDeneb { +func (block *BlindedBeaconBlockFulu) Copy() *BlindedBeaconBlockFulu { if block == nil { return nil } - return &BeaconBlockDeneb{ + return &BlindedBeaconBlockFulu{ Slot: block.Slot, ProposerIndex: block.ProposerIndex, ParentRoot: bytesutil.SafeCopyBytes(block.ParentRoot), @@ -417,43 +680,44 @@ func (block *BeaconBlockDeneb) Copy() *BeaconBlockDeneb { } // Copy -- -func (body *BeaconBlockBodyDeneb) Copy() *BeaconBlockBodyDeneb { +func (body *BlindedBeaconBlockBodyFulu) Copy() *BlindedBeaconBlockBodyFulu { if body == nil { return nil } - return &BeaconBlockBodyDeneb{ - RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: body.Eth1Data.Copy(), - Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopySlice(body.ProposerSlashings), - AttesterSlashings: CopySlice(body.AttesterSlashings), - Attestations: CopySlice(body.Attestations), - Deposits: CopySlice(body.Deposits), - VoluntaryExits: CopySlice(body.VoluntaryExits), - SyncAggregate: body.SyncAggregate.Copy(), - ExecutionPayload: body.ExecutionPayload.Copy(), - BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges), - BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments), + return &BlindedBeaconBlockBodyFulu{ + RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), + Eth1Data: body.Eth1Data.Copy(), + Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), + ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(), + BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges), + BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments), + ExecutionRequests: CopyExecutionRequests(body.ExecutionRequests), } } // Copy -- -func (sigBlock *SignedBeaconBlockElectra) Copy() *SignedBeaconBlockElectra { +func (sigBlock *SignedBeaconBlockFulu) Copy() *SignedBeaconBlockFulu { if sigBlock == nil { return nil } - return &SignedBeaconBlockElectra{ + return &SignedBeaconBlockFulu{ Block: sigBlock.Block.Copy(), Signature: bytesutil.SafeCopyBytes(sigBlock.Signature), } } // Copy -- -func (block *BeaconBlockElectra) Copy() *BeaconBlockElectra { +func (block *BeaconBlockFulu) Copy() *BeaconBlockFulu { if block == nil { return nil } - return &BeaconBlockElectra{ + return &BeaconBlockFulu{ Slot: block.Slot, ProposerIndex: block.ProposerIndex, ParentRoot: bytesutil.SafeCopyBytes(block.ParentRoot), @@ -463,11 +727,11 @@ func (block *BeaconBlockElectra) Copy() *BeaconBlockElectra { } // Copy -- -func (body *BeaconBlockBodyElectra) Copy() *BeaconBlockBodyElectra { +func (body *BeaconBlockBodyFulu) Copy() *BeaconBlockBodyFulu { if body == nil { return nil } - return &BeaconBlockBodyElectra{ + return &BeaconBlockBodyFulu{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), @@ -483,145 +747,3 @@ func (body *BeaconBlockBodyElectra) Copy() *BeaconBlockBodyElectra { ExecutionRequests: CopyExecutionRequests(body.ExecutionRequests), } } - -// Copy -- -func (data *Eth1Data) Copy() *Eth1Data { - if data == nil { - return nil - } - return &Eth1Data{ - DepositRoot: bytesutil.SafeCopyBytes(data.DepositRoot), - DepositCount: data.DepositCount, - BlockHash: bytesutil.SafeCopyBytes(data.BlockHash), - } -} - -// Copy -- -func (slashing *ProposerSlashing) Copy() *ProposerSlashing { - if slashing == nil { - return nil - } - return &ProposerSlashing{ - Header_1: slashing.Header_1.Copy(), - Header_2: slashing.Header_2.Copy(), - } -} - -// Copy -- -func (header *SignedBeaconBlockHeader) Copy() *SignedBeaconBlockHeader { - if header == nil { - return nil - } - return &SignedBeaconBlockHeader{ - Header: header.Header.Copy(), - Signature: bytesutil.SafeCopyBytes(header.Signature), - } -} - -// Copy -- -func (header *BeaconBlockHeader) Copy() *BeaconBlockHeader { - if header == nil { - return nil - } - parentRoot := bytesutil.SafeCopyBytes(header.ParentRoot) - stateRoot := bytesutil.SafeCopyBytes(header.StateRoot) - bodyRoot := bytesutil.SafeCopyBytes(header.BodyRoot) - return &BeaconBlockHeader{ - Slot: header.Slot, - ProposerIndex: header.ProposerIndex, - ParentRoot: parentRoot, - StateRoot: stateRoot, - BodyRoot: bodyRoot, - } -} - -// Copy -- -func (deposit *Deposit) Copy() *Deposit { - if deposit == nil { - return nil - } - return &Deposit{ - Proof: bytesutil.SafeCopy2dBytes(deposit.Proof), - Data: deposit.Data.Copy(), - } -} - -// Copy -- -func (depData *Deposit_Data) Copy() *Deposit_Data { - if depData == nil { - return nil - } - return &Deposit_Data{ - PublicKey: bytesutil.SafeCopyBytes(depData.PublicKey), - WithdrawalCredentials: bytesutil.SafeCopyBytes(depData.WithdrawalCredentials), - Amount: depData.Amount, - Signature: bytesutil.SafeCopyBytes(depData.Signature), - } -} - -// Copy -- -func (exit *SignedVoluntaryExit) Copy() *SignedVoluntaryExit { - if exit == nil { - return nil - } - return &SignedVoluntaryExit{ - Exit: exit.Exit.Copy(), - Signature: bytesutil.SafeCopyBytes(exit.Signature), - } -} - -// Copy -- -func (exit *VoluntaryExit) Copy() *VoluntaryExit { - if exit == nil { - return nil - } - return &VoluntaryExit{ - Epoch: exit.Epoch, - ValidatorIndex: exit.ValidatorIndex, - } -} - -// Copy -- -func (a *SyncAggregate) Copy() *SyncAggregate { - if a == nil { - return nil - } - return &SyncAggregate{ - SyncCommitteeBits: bytesutil.SafeCopyBytes(a.SyncCommitteeBits), - SyncCommitteeSignature: bytesutil.SafeCopyBytes(a.SyncCommitteeSignature), - } -} - -// Copy -- -func (change *SignedBLSToExecutionChange) Copy() *SignedBLSToExecutionChange { - if change == nil { - return nil - } - return &SignedBLSToExecutionChange{ - Message: change.Message.Copy(), - Signature: bytesutil.SafeCopyBytes(change.Signature), - } -} - -// Copy -- -func (change *BLSToExecutionChange) Copy() *BLSToExecutionChange { - if change == nil { - return nil - } - return &BLSToExecutionChange{ - ValidatorIndex: change.ValidatorIndex, - FromBlsPubkey: bytesutil.SafeCopyBytes(change.FromBlsPubkey), - ToExecutionAddress: bytesutil.SafeCopyBytes(change.ToExecutionAddress), - } -} - -// Copy -- -func (summary *HistoricalSummary) Copy() *HistoricalSummary { - if summary == nil { - return nil - } - return &HistoricalSummary{ - BlockSummaryRoot: bytesutil.SafeCopyBytes(summary.BlockSummaryRoot), - StateSummaryRoot: bytesutil.SafeCopyBytes(summary.StateSummaryRoot), - } -} diff --git a/proto/prysm/v1alpha1/beacon_block.pb.go b/proto/prysm/v1alpha1/beacon_block.pb.go index d756354ef458..0b1a05cdd24f 100755 --- a/proto/prysm/v1alpha1/beacon_block.pb.go +++ b/proto/prysm/v1alpha1/beacon_block.pb.go @@ -42,6 +42,8 @@ type GenericSignedBeaconBlock struct { // *GenericSignedBeaconBlock_BlindedDeneb // *GenericSignedBeaconBlock_Electra // *GenericSignedBeaconBlock_BlindedElectra + // *GenericSignedBeaconBlock_Fulu + // *GenericSignedBeaconBlock_BlindedFulu Block isGenericSignedBeaconBlock_Block `protobuf_oneof:"block"` IsBlinded bool `protobuf:"varint,100,opt,name=is_blinded,json=isBlinded,proto3" json:"is_blinded,omitempty"` } @@ -155,6 +157,20 @@ func (x *GenericSignedBeaconBlock) GetBlindedElectra() *SignedBlindedBeaconBlock return nil } +func (x *GenericSignedBeaconBlock) GetFulu() *SignedBeaconBlockContentsFulu { + if x, ok := x.GetBlock().(*GenericSignedBeaconBlock_Fulu); ok { + return x.Fulu + } + return nil +} + +func (x *GenericSignedBeaconBlock) GetBlindedFulu() *SignedBlindedBeaconBlockFulu { + if x, ok := x.GetBlock().(*GenericSignedBeaconBlock_BlindedFulu); ok { + return x.BlindedFulu + } + return nil +} + func (x *GenericSignedBeaconBlock) GetIsBlinded() bool { if x != nil { return x.IsBlinded @@ -206,6 +222,14 @@ type GenericSignedBeaconBlock_BlindedElectra struct { BlindedElectra *SignedBlindedBeaconBlockElectra `protobuf:"bytes,10,opt,name=blinded_electra,json=blindedElectra,proto3,oneof"` } +type GenericSignedBeaconBlock_Fulu struct { + Fulu *SignedBeaconBlockContentsFulu `protobuf:"bytes,11,opt,name=fulu,proto3,oneof"` +} + +type GenericSignedBeaconBlock_BlindedFulu struct { + BlindedFulu *SignedBlindedBeaconBlockFulu `protobuf:"bytes,12,opt,name=blinded_fulu,json=blindedFulu,proto3,oneof"` +} + func (*GenericSignedBeaconBlock_Phase0) isGenericSignedBeaconBlock_Block() {} func (*GenericSignedBeaconBlock_Altair) isGenericSignedBeaconBlock_Block() {} @@ -226,6 +250,10 @@ func (*GenericSignedBeaconBlock_Electra) isGenericSignedBeaconBlock_Block() {} func (*GenericSignedBeaconBlock_BlindedElectra) isGenericSignedBeaconBlock_Block() {} +func (*GenericSignedBeaconBlock_Fulu) isGenericSignedBeaconBlock_Block() {} + +func (*GenericSignedBeaconBlock_BlindedFulu) isGenericSignedBeaconBlock_Block() {} + type GenericBeaconBlock struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -243,6 +271,8 @@ type GenericBeaconBlock struct { // *GenericBeaconBlock_BlindedDeneb // *GenericBeaconBlock_Electra // *GenericBeaconBlock_BlindedElectra + // *GenericBeaconBlock_Fulu + // *GenericBeaconBlock_BlindedFulu Block isGenericBeaconBlock_Block `protobuf_oneof:"block"` IsBlinded bool `protobuf:"varint,100,opt,name=is_blinded,json=isBlinded,proto3" json:"is_blinded,omitempty"` PayloadValue string `protobuf:"bytes,101,opt,name=payload_value,json=payloadValue,proto3" json:"payload_value,omitempty"` @@ -357,6 +387,20 @@ func (x *GenericBeaconBlock) GetBlindedElectra() *BlindedBeaconBlockElectra { return nil } +func (x *GenericBeaconBlock) GetFulu() *BeaconBlockContentsFulu { + if x, ok := x.GetBlock().(*GenericBeaconBlock_Fulu); ok { + return x.Fulu + } + return nil +} + +func (x *GenericBeaconBlock) GetBlindedFulu() *BlindedBeaconBlockFulu { + if x, ok := x.GetBlock().(*GenericBeaconBlock_BlindedFulu); ok { + return x.BlindedFulu + } + return nil +} + func (x *GenericBeaconBlock) GetIsBlinded() bool { if x != nil { return x.IsBlinded @@ -415,6 +459,14 @@ type GenericBeaconBlock_BlindedElectra struct { BlindedElectra *BlindedBeaconBlockElectra `protobuf:"bytes,10,opt,name=blinded_electra,json=blindedElectra,proto3,oneof"` } +type GenericBeaconBlock_Fulu struct { + Fulu *BeaconBlockContentsFulu `protobuf:"bytes,11,opt,name=fulu,proto3,oneof"` +} + +type GenericBeaconBlock_BlindedFulu struct { + BlindedFulu *BlindedBeaconBlockFulu `protobuf:"bytes,12,opt,name=blinded_fulu,json=blindedFulu,proto3,oneof"` +} + func (*GenericBeaconBlock_Phase0) isGenericBeaconBlock_Block() {} func (*GenericBeaconBlock_Altair) isGenericBeaconBlock_Block() {} @@ -435,6 +487,10 @@ func (*GenericBeaconBlock_Electra) isGenericBeaconBlock_Block() {} func (*GenericBeaconBlock_BlindedElectra) isGenericBeaconBlock_Block() {} +func (*GenericBeaconBlock_Fulu) isGenericBeaconBlock_Block() {} + +func (*GenericBeaconBlock_BlindedFulu) isGenericBeaconBlock_Block() {} + type SignedBeaconBlock struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4666,19 +4722,18 @@ func (x *IndexedAttestationElectra) GetSignature() []byte { return nil } -type Deposit_Data struct { +type SignedBeaconBlockContentsFulu struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" spec-name:"pubkey" ssz-size:"48"` - WithdrawalCredentials []byte `protobuf:"bytes,2,opt,name=withdrawal_credentials,json=withdrawalCredentials,proto3" json:"withdrawal_credentials,omitempty" ssz-size:"32"` - Amount uint64 `protobuf:"varint,3,opt,name=amount,proto3" json:"amount,omitempty"` - Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` + Block *SignedBeaconBlockFulu `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` + KzgProofs [][]byte `protobuf:"bytes,2,rep,name=kzg_proofs,json=kzgProofs,proto3" json:"kzg_proofs,omitempty" ssz-max:"4096" ssz-size:"?,48"` + Blobs [][]byte `protobuf:"bytes,3,rep,name=blobs,proto3" json:"blobs,omitempty" ssz-max:"4096" ssz-size:"?,131072"` } -func (x *Deposit_Data) Reset() { - *x = Deposit_Data{} +func (x *SignedBeaconBlockContentsFulu) Reset() { + *x = SignedBeaconBlockContentsFulu{} if protoimpl.UnsafeEnabled { mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4686,13 +4741,13 @@ func (x *Deposit_Data) Reset() { } } -func (x *Deposit_Data) String() string { +func (x *SignedBeaconBlockContentsFulu) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Deposit_Data) ProtoMessage() {} +func (*SignedBeaconBlockContentsFulu) ProtoMessage() {} -func (x *Deposit_Data) ProtoReflect() protoreflect.Message { +func (x *SignedBeaconBlockContentsFulu) ProtoReflect() protoreflect.Message { mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4704,251 +4759,952 @@ func (x *Deposit_Data) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Deposit_Data.ProtoReflect.Descriptor instead. -func (*Deposit_Data) Descriptor() ([]byte, []int) { - return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP(), []int{11, 0} +// Deprecated: Use SignedBeaconBlockContentsFulu.ProtoReflect.Descriptor instead. +func (*SignedBeaconBlockContentsFulu) Descriptor() ([]byte, []int) { + return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP(), []int{59} } -func (x *Deposit_Data) GetPublicKey() []byte { +func (x *SignedBeaconBlockContentsFulu) GetBlock() *SignedBeaconBlockFulu { if x != nil { - return x.PublicKey + return x.Block } return nil } -func (x *Deposit_Data) GetWithdrawalCredentials() []byte { +func (x *SignedBeaconBlockContentsFulu) GetKzgProofs() [][]byte { if x != nil { - return x.WithdrawalCredentials + return x.KzgProofs } return nil } -func (x *Deposit_Data) GetAmount() uint64 { +func (x *SignedBeaconBlockContentsFulu) GetBlobs() [][]byte { if x != nil { - return x.Amount + return x.Blobs } - return 0 + return nil } -func (x *Deposit_Data) GetSignature() []byte { +type SignedBeaconBlockFulu struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Block *BeaconBlockFulu `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` +} + +func (x *SignedBeaconBlockFulu) Reset() { + *x = SignedBeaconBlockFulu{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedBeaconBlockFulu) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedBeaconBlockFulu) ProtoMessage() {} + +func (x *SignedBeaconBlockFulu) ProtoReflect() protoreflect.Message { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedBeaconBlockFulu.ProtoReflect.Descriptor instead. +func (*SignedBeaconBlockFulu) Descriptor() ([]byte, []int) { + return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP(), []int{60} +} + +func (x *SignedBeaconBlockFulu) GetBlock() *BeaconBlockFulu { + if x != nil { + return x.Block + } + return nil +} + +func (x *SignedBeaconBlockFulu) GetSignature() []byte { if x != nil { return x.Signature } return nil } -var File_proto_prysm_v1alpha1_beacon_block_proto protoreflect.FileDescriptor +type BeaconBlockContentsFulu struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -var file_proto_prysm_v1alpha1_beacon_block_proto_rawDesc = []byte{ - 0x0a, 0x27, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x65, 0x78, 0x74, 0x2f, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, - 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x77, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa6, 0x07, 0x0a, 0x18, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0x42, 0x0a, 0x06, 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x06, 0x70, - 0x68, 0x61, 0x73, 0x65, 0x30, 0x12, 0x48, 0x0a, 0x06, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, - 0x6c, 0x74, 0x61, 0x69, 0x72, 0x48, 0x00, 0x52, 0x06, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x12, - 0x51, 0x0a, 0x09, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, - 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, 0x00, 0x52, 0x09, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, - 0x69, 0x78, 0x12, 0x67, 0x0a, 0x11, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x62, 0x65, - 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x69, 0x6e, - 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, - 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, 0x00, 0x52, 0x10, 0x62, 0x6c, 0x69, 0x6e, 0x64, - 0x65, 0x64, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x4b, 0x0a, 0x07, 0x63, - 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x48, 0x00, 0x52, - 0x07, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, 0x61, 0x0a, 0x0f, 0x62, 0x6c, 0x69, 0x6e, - 0x64, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x36, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6c, 0x69, - 0x6e, 0x64, 0x65, 0x64, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, 0x4d, 0x0a, 0x05, 0x64, - 0x65, 0x6e, 0x65, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6e, 0x65, - 0x62, 0x48, 0x00, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x5b, 0x0a, 0x0d, 0x62, 0x6c, - 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x34, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x6c, 0x69, 0x6e, 0x64, - 0x65, 0x64, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x53, 0x0a, 0x07, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x72, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, - 0x61, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x61, 0x0a, 0x0f, - 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x48, 0x00, 0x52, - 0x0e, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, - 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x64, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x07, - 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4a, 0x04, 0x08, 0x65, 0x10, 0x66, 0x22, 0x83, 0x07, - 0x0a, 0x12, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x06, 0x70, 0x68, 0x61, 0x73, - 0x65, 0x30, 0x12, 0x42, 0x0a, 0x06, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x48, 0x00, 0x52, 0x06, - 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x12, 0x4b, 0x0a, 0x09, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, - 0x72, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, - 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, 0x00, 0x52, 0x09, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, - 0x72, 0x69, 0x78, 0x12, 0x61, 0x0a, 0x11, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x62, - 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, - 0x69, 0x78, 0x48, 0x00, 0x52, 0x10, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x6c, - 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x45, 0x0a, 0x07, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, - 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, - 0x6c, 0x61, 0x48, 0x00, 0x52, 0x07, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, 0x5b, 0x0a, - 0x0f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, - 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6c, 0x69, 0x6e, - 0x64, 0x65, 0x64, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, 0x47, 0x0a, 0x05, 0x64, 0x65, - 0x6e, 0x65, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x48, 0x00, 0x52, 0x05, 0x64, 0x65, - 0x6e, 0x65, 0x62, 0x12, 0x55, 0x0a, 0x0d, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x64, - 0x65, 0x6e, 0x65, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x6c, - 0x69, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x4d, 0x0a, 0x07, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x72, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x48, 0x00, - 0x52, 0x07, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x5b, 0x0a, 0x0f, 0x62, 0x6c, 0x69, - 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, - 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x45, 0x6c, 0x65, - 0x63, 0x74, 0x72, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x45, - 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x62, 0x6c, 0x69, - 0x6e, 0x64, 0x65, 0x64, 0x18, 0x64, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x42, 0x6c, - 0x69, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x22, 0x73, 0x0a, 0x11, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xec, 0x02, 0x0a, 0x0b, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, - 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, - 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, - 0x6c, 0x6f, 0x74, 0x12, 0x76, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, - 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, - 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, - 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0d, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0b, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, - 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, - 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, - 0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xd1, 0x04, 0x0a, 0x0f, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x2b, 0x0a, 0x0d, 0x72, - 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x64, - 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x3c, 0x0a, 0x09, 0x65, 0x74, 0x68, 0x31, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x65, 0x74, - 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, - 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, 0x5e, 0x0a, 0x12, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, - 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, - 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5d, 0x0a, 0x12, 0x61, 0x74, - 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, - 0x05, 0x92, 0xb5, 0x18, 0x01, 0x32, 0x52, 0x11, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, - 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4f, 0x0a, 0x0c, 0x61, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x92, 0xb5, 0x18, 0x03, 0x31, 0x32, 0x38, 0x52, 0x0c, 0x61, 0x74, - 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x42, 0x0a, 0x08, 0x64, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, - 0x18, 0x02, 0x31, 0x36, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x5b, - 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, - 0x78, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x0e, 0x76, 0x6f, 0x6c, - 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x17, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, - 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, - 0xdb, 0x02, 0x0a, 0x11, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + Block *BeaconBlockFulu `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` + KzgProofs [][]byte `protobuf:"bytes,2,rep,name=kzg_proofs,json=kzgProofs,proto3" json:"kzg_proofs,omitempty" ssz-max:"4096" ssz-size:"?,48"` + Blobs [][]byte `protobuf:"bytes,3,rep,name=blobs,proto3" json:"blobs,omitempty" ssz-max:"4096" ssz-size:"?,131072"` +} + +func (x *BeaconBlockContentsFulu) Reset() { + *x = BeaconBlockContentsFulu{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BeaconBlockContentsFulu) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BeaconBlockContentsFulu) ProtoMessage() {} + +func (x *BeaconBlockContentsFulu) ProtoReflect() protoreflect.Message { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BeaconBlockContentsFulu.ProtoReflect.Descriptor instead. +func (*BeaconBlockContentsFulu) Descriptor() ([]byte, []int) { + return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP(), []int{61} +} + +func (x *BeaconBlockContentsFulu) GetBlock() *BeaconBlockFulu { + if x != nil { + return x.Block + } + return nil +} + +func (x *BeaconBlockContentsFulu) GetKzgProofs() [][]byte { + if x != nil { + return x.KzgProofs + } + return nil +} + +func (x *BeaconBlockContentsFulu) GetBlobs() [][]byte { + if x != nil { + return x.Blobs + } + return nil +} + +type BeaconBlockFulu struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` + ProposerIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,2,opt,name=proposer_index,json=proposerIndex,proto3" json:"proposer_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` + ParentRoot []byte `protobuf:"bytes,3,opt,name=parent_root,json=parentRoot,proto3" json:"parent_root,omitempty" ssz-size:"32"` + StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty" ssz-size:"32"` + Body *BeaconBlockBodyFulu `protobuf:"bytes,5,opt,name=body,proto3" json:"body,omitempty"` +} + +func (x *BeaconBlockFulu) Reset() { + *x = BeaconBlockFulu{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BeaconBlockFulu) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BeaconBlockFulu) ProtoMessage() {} + +func (x *BeaconBlockFulu) ProtoReflect() protoreflect.Message { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BeaconBlockFulu.ProtoReflect.Descriptor instead. +func (*BeaconBlockFulu) Descriptor() ([]byte, []int) { + return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP(), []int{62} +} + +func (x *BeaconBlockFulu) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { + if x != nil { + return x.Slot + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) +} + +func (x *BeaconBlockFulu) GetProposerIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { + if x != nil { + return x.ProposerIndex + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) +} + +func (x *BeaconBlockFulu) GetParentRoot() []byte { + if x != nil { + return x.ParentRoot + } + return nil +} + +func (x *BeaconBlockFulu) GetStateRoot() []byte { + if x != nil { + return x.StateRoot + } + return nil +} + +func (x *BeaconBlockFulu) GetBody() *BeaconBlockBodyFulu { + if x != nil { + return x.Body + } + return nil +} + +type BeaconBlockBodyFulu struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RandaoReveal []byte `protobuf:"bytes,1,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty" ssz-size:"96"` + Eth1Data *Eth1Data `protobuf:"bytes,2,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` + Graffiti []byte `protobuf:"bytes,3,opt,name=graffiti,proto3" json:"graffiti,omitempty" ssz-size:"32"` + ProposerSlashings []*ProposerSlashing `protobuf:"bytes,4,rep,name=proposer_slashings,json=proposerSlashings,proto3" json:"proposer_slashings,omitempty" ssz-max:"16"` + AttesterSlashings []*AttesterSlashingElectra `protobuf:"bytes,5,rep,name=attester_slashings,json=attesterSlashings,proto3" json:"attester_slashings,omitempty" ssz-max:"1"` + Attestations []*AttestationElectra `protobuf:"bytes,6,rep,name=attestations,proto3" json:"attestations,omitempty" ssz-max:"8"` + Deposits []*Deposit `protobuf:"bytes,7,rep,name=deposits,proto3" json:"deposits,omitempty" ssz-max:"16"` + VoluntaryExits []*SignedVoluntaryExit `protobuf:"bytes,8,rep,name=voluntary_exits,json=voluntaryExits,proto3" json:"voluntary_exits,omitempty" ssz-max:"16"` + SyncAggregate *SyncAggregate `protobuf:"bytes,9,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` + ExecutionPayload *v1.ExecutionPayloadDeneb `protobuf:"bytes,10,opt,name=execution_payload,json=executionPayload,proto3" json:"execution_payload,omitempty"` + BlsToExecutionChanges []*SignedBLSToExecutionChange `protobuf:"bytes,11,rep,name=bls_to_execution_changes,json=blsToExecutionChanges,proto3" json:"bls_to_execution_changes,omitempty" ssz-max:"16"` + BlobKzgCommitments [][]byte `protobuf:"bytes,12,rep,name=blob_kzg_commitments,json=blobKzgCommitments,proto3" json:"blob_kzg_commitments,omitempty" ssz-max:"4096" ssz-size:"?,48"` + ExecutionRequests *v1.ExecutionRequests `protobuf:"bytes,13,opt,name=execution_requests,json=executionRequests,proto3" json:"execution_requests,omitempty"` +} + +func (x *BeaconBlockBodyFulu) Reset() { + *x = BeaconBlockBodyFulu{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BeaconBlockBodyFulu) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BeaconBlockBodyFulu) ProtoMessage() {} + +func (x *BeaconBlockBodyFulu) ProtoReflect() protoreflect.Message { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BeaconBlockBodyFulu.ProtoReflect.Descriptor instead. +func (*BeaconBlockBodyFulu) Descriptor() ([]byte, []int) { + return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP(), []int{63} +} + +func (x *BeaconBlockBodyFulu) GetRandaoReveal() []byte { + if x != nil { + return x.RandaoReveal + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetEth1Data() *Eth1Data { + if x != nil { + return x.Eth1Data + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetGraffiti() []byte { + if x != nil { + return x.Graffiti + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetProposerSlashings() []*ProposerSlashing { + if x != nil { + return x.ProposerSlashings + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetAttesterSlashings() []*AttesterSlashingElectra { + if x != nil { + return x.AttesterSlashings + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetAttestations() []*AttestationElectra { + if x != nil { + return x.Attestations + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetDeposits() []*Deposit { + if x != nil { + return x.Deposits + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetVoluntaryExits() []*SignedVoluntaryExit { + if x != nil { + return x.VoluntaryExits + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetSyncAggregate() *SyncAggregate { + if x != nil { + return x.SyncAggregate + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetExecutionPayload() *v1.ExecutionPayloadDeneb { + if x != nil { + return x.ExecutionPayload + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetBlsToExecutionChanges() []*SignedBLSToExecutionChange { + if x != nil { + return x.BlsToExecutionChanges + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetBlobKzgCommitments() [][]byte { + if x != nil { + return x.BlobKzgCommitments + } + return nil +} + +func (x *BeaconBlockBodyFulu) GetExecutionRequests() *v1.ExecutionRequests { + if x != nil { + return x.ExecutionRequests + } + return nil +} + +type SignedBlindedBeaconBlockFulu struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message *BlindedBeaconBlockFulu `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` +} + +func (x *SignedBlindedBeaconBlockFulu) Reset() { + *x = SignedBlindedBeaconBlockFulu{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedBlindedBeaconBlockFulu) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedBlindedBeaconBlockFulu) ProtoMessage() {} + +func (x *SignedBlindedBeaconBlockFulu) ProtoReflect() protoreflect.Message { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedBlindedBeaconBlockFulu.ProtoReflect.Descriptor instead. +func (*SignedBlindedBeaconBlockFulu) Descriptor() ([]byte, []int) { + return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP(), []int{64} +} + +func (x *SignedBlindedBeaconBlockFulu) GetMessage() *BlindedBeaconBlockFulu { + if x != nil { + return x.Message + } + return nil +} + +func (x *SignedBlindedBeaconBlockFulu) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +type BlindedBeaconBlockFulu struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` + ProposerIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,2,opt,name=proposer_index,json=proposerIndex,proto3" json:"proposer_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` + ParentRoot []byte `protobuf:"bytes,3,opt,name=parent_root,json=parentRoot,proto3" json:"parent_root,omitempty" ssz-size:"32"` + StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty" ssz-size:"32"` + Body *BlindedBeaconBlockBodyFulu `protobuf:"bytes,5,opt,name=body,proto3" json:"body,omitempty"` +} + +func (x *BlindedBeaconBlockFulu) Reset() { + *x = BlindedBeaconBlockFulu{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlindedBeaconBlockFulu) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlindedBeaconBlockFulu) ProtoMessage() {} + +func (x *BlindedBeaconBlockFulu) ProtoReflect() protoreflect.Message { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlindedBeaconBlockFulu.ProtoReflect.Descriptor instead. +func (*BlindedBeaconBlockFulu) Descriptor() ([]byte, []int) { + return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP(), []int{65} +} + +func (x *BlindedBeaconBlockFulu) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { + if x != nil { + return x.Slot + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) +} + +func (x *BlindedBeaconBlockFulu) GetProposerIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { + if x != nil { + return x.ProposerIndex + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) +} + +func (x *BlindedBeaconBlockFulu) GetParentRoot() []byte { + if x != nil { + return x.ParentRoot + } + return nil +} + +func (x *BlindedBeaconBlockFulu) GetStateRoot() []byte { + if x != nil { + return x.StateRoot + } + return nil +} + +func (x *BlindedBeaconBlockFulu) GetBody() *BlindedBeaconBlockBodyFulu { + if x != nil { + return x.Body + } + return nil +} + +type BlindedBeaconBlockBodyFulu struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RandaoReveal []byte `protobuf:"bytes,1,opt,name=randao_reveal,json=randaoReveal,proto3" json:"randao_reveal,omitempty" ssz-size:"96"` + Eth1Data *Eth1Data `protobuf:"bytes,2,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` + Graffiti []byte `protobuf:"bytes,3,opt,name=graffiti,proto3" json:"graffiti,omitempty" ssz-size:"32"` + ProposerSlashings []*ProposerSlashing `protobuf:"bytes,4,rep,name=proposer_slashings,json=proposerSlashings,proto3" json:"proposer_slashings,omitempty" ssz-max:"16"` + AttesterSlashings []*AttesterSlashingElectra `protobuf:"bytes,5,rep,name=attester_slashings,json=attesterSlashings,proto3" json:"attester_slashings,omitempty" ssz-max:"1"` + Attestations []*AttestationElectra `protobuf:"bytes,6,rep,name=attestations,proto3" json:"attestations,omitempty" ssz-max:"8"` + Deposits []*Deposit `protobuf:"bytes,7,rep,name=deposits,proto3" json:"deposits,omitempty" ssz-max:"16"` + VoluntaryExits []*SignedVoluntaryExit `protobuf:"bytes,8,rep,name=voluntary_exits,json=voluntaryExits,proto3" json:"voluntary_exits,omitempty" ssz-max:"16"` + SyncAggregate *SyncAggregate `protobuf:"bytes,9,opt,name=sync_aggregate,json=syncAggregate,proto3" json:"sync_aggregate,omitempty"` + ExecutionPayloadHeader *v1.ExecutionPayloadHeaderDeneb `protobuf:"bytes,10,opt,name=execution_payload_header,json=executionPayloadHeader,proto3" json:"execution_payload_header,omitempty"` + BlsToExecutionChanges []*SignedBLSToExecutionChange `protobuf:"bytes,11,rep,name=bls_to_execution_changes,json=blsToExecutionChanges,proto3" json:"bls_to_execution_changes,omitempty" ssz-max:"16"` + BlobKzgCommitments [][]byte `protobuf:"bytes,12,rep,name=blob_kzg_commitments,json=blobKzgCommitments,proto3" json:"blob_kzg_commitments,omitempty" ssz-max:"4096" ssz-size:"?,48"` + ExecutionRequests *v1.ExecutionRequests `protobuf:"bytes,13,opt,name=execution_requests,json=executionRequests,proto3" json:"execution_requests,omitempty"` +} + +func (x *BlindedBeaconBlockBodyFulu) Reset() { + *x = BlindedBeaconBlockBodyFulu{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlindedBeaconBlockBodyFulu) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlindedBeaconBlockBodyFulu) ProtoMessage() {} + +func (x *BlindedBeaconBlockBodyFulu) ProtoReflect() protoreflect.Message { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlindedBeaconBlockBodyFulu.ProtoReflect.Descriptor instead. +func (*BlindedBeaconBlockBodyFulu) Descriptor() ([]byte, []int) { + return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP(), []int{66} +} + +func (x *BlindedBeaconBlockBodyFulu) GetRandaoReveal() []byte { + if x != nil { + return x.RandaoReveal + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetEth1Data() *Eth1Data { + if x != nil { + return x.Eth1Data + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetGraffiti() []byte { + if x != nil { + return x.Graffiti + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetProposerSlashings() []*ProposerSlashing { + if x != nil { + return x.ProposerSlashings + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetAttesterSlashings() []*AttesterSlashingElectra { + if x != nil { + return x.AttesterSlashings + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetAttestations() []*AttestationElectra { + if x != nil { + return x.Attestations + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetDeposits() []*Deposit { + if x != nil { + return x.Deposits + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetVoluntaryExits() []*SignedVoluntaryExit { + if x != nil { + return x.VoluntaryExits + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetSyncAggregate() *SyncAggregate { + if x != nil { + return x.SyncAggregate + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetExecutionPayloadHeader() *v1.ExecutionPayloadHeaderDeneb { + if x != nil { + return x.ExecutionPayloadHeader + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetBlsToExecutionChanges() []*SignedBLSToExecutionChange { + if x != nil { + return x.BlsToExecutionChanges + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetBlobKzgCommitments() [][]byte { + if x != nil { + return x.BlobKzgCommitments + } + return nil +} + +func (x *BlindedBeaconBlockBodyFulu) GetExecutionRequests() *v1.ExecutionRequests { + if x != nil { + return x.ExecutionRequests + } + return nil +} + +type Deposit_Data struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" spec-name:"pubkey" ssz-size:"48"` + WithdrawalCredentials []byte `protobuf:"bytes,2,opt,name=withdrawal_credentials,json=withdrawalCredentials,proto3" json:"withdrawal_credentials,omitempty" ssz-size:"32"` + Amount uint64 `protobuf:"varint,3,opt,name=amount,proto3" json:"amount,omitempty"` + Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty" ssz-size:"96"` +} + +func (x *Deposit_Data) Reset() { + *x = Deposit_Data{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Deposit_Data) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Deposit_Data) ProtoMessage() {} + +func (x *Deposit_Data) ProtoReflect() protoreflect.Message { + mi := &file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Deposit_Data.ProtoReflect.Descriptor instead. +func (*Deposit_Data) Descriptor() ([]byte, []int) { + return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP(), []int{11, 0} +} + +func (x *Deposit_Data) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +func (x *Deposit_Data) GetWithdrawalCredentials() []byte { + if x != nil { + return x.WithdrawalCredentials + } + return nil +} + +func (x *Deposit_Data) GetAmount() uint64 { + if x != nil { + return x.Amount + } + return 0 +} + +func (x *Deposit_Data) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +var File_proto_prysm_v1alpha1_beacon_block_proto protoreflect.FileDescriptor + +var file_proto_prysm_v1alpha1_beacon_block_proto_rawDesc = []byte{ + 0x0a, 0x27, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x1a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x65, 0x78, 0x74, 0x2f, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, + 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x77, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcc, 0x08, 0x0a, 0x18, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x42, 0x0a, 0x06, 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x06, 0x70, + 0x68, 0x61, 0x73, 0x65, 0x30, 0x12, 0x48, 0x0a, 0x06, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, + 0x6c, 0x74, 0x61, 0x69, 0x72, 0x48, 0x00, 0x52, 0x06, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x12, + 0x51, 0x0a, 0x09, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, + 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, 0x00, 0x52, 0x09, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, + 0x69, 0x78, 0x12, 0x67, 0x0a, 0x11, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x62, 0x65, + 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x69, 0x6e, + 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x65, + 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, 0x00, 0x52, 0x10, 0x62, 0x6c, 0x69, 0x6e, 0x64, + 0x65, 0x64, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x4b, 0x0a, 0x07, 0x63, + 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x48, 0x00, 0x52, + 0x07, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, 0x61, 0x0a, 0x0f, 0x62, 0x6c, 0x69, 0x6e, + 0x64, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x36, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6c, 0x69, + 0x6e, 0x64, 0x65, 0x64, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x12, 0x4d, 0x0a, 0x05, 0x64, + 0x65, 0x6e, 0x65, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6e, 0x65, + 0x62, 0x48, 0x00, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x5b, 0x0a, 0x0d, 0x62, 0x6c, + 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x34, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x6c, 0x69, 0x6e, 0x64, + 0x65, 0x64, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x53, 0x0a, 0x07, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x72, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, + 0x61, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x61, 0x0a, 0x0f, + 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x48, 0x00, 0x52, + 0x0e, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, + 0x4a, 0x0a, 0x04, 0x66, 0x75, 0x6c, 0x75, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, + 0x75, 0x6c, 0x75, 0x48, 0x00, 0x52, 0x04, 0x66, 0x75, 0x6c, 0x75, 0x12, 0x58, 0x0a, 0x0c, 0x62, + 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6c, 0x75, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, + 0x64, 0x46, 0x75, 0x6c, 0x75, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x62, 0x6c, 0x69, 0x6e, + 0x64, 0x65, 0x64, 0x18, 0x64, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x42, 0x6c, 0x69, + 0x6e, 0x64, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4a, 0x04, 0x08, + 0x65, 0x10, 0x66, 0x22, 0x9d, 0x08, 0x0a, 0x12, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x68, + 0x61, 0x73, 0x65, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, + 0x52, 0x06, 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x12, 0x42, 0x0a, 0x06, 0x61, 0x6c, 0x74, 0x61, + 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x6c, 0x74, 0x61, + 0x69, 0x72, 0x48, 0x00, 0x52, 0x06, 0x61, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x12, 0x4b, 0x0a, 0x09, + 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, 0x00, 0x52, 0x09, + 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x61, 0x0a, 0x11, 0x62, 0x6c, 0x69, + 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x69, + 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, + 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x48, 0x00, 0x52, 0x10, 0x62, 0x6c, 0x69, 0x6e, + 0x64, 0x65, 0x64, 0x42, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x45, 0x0a, 0x07, + 0x63, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x48, 0x00, 0x52, 0x07, 0x63, 0x61, 0x70, 0x65, + 0x6c, 0x6c, 0x61, 0x12, 0x5b, 0x0a, 0x0f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, + 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, 0x48, 0x00, + 0x52, 0x0e, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x43, 0x61, 0x70, 0x65, 0x6c, 0x6c, 0x61, + 0x12, 0x47, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6e, 0x65, 0x62, + 0x48, 0x00, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x12, 0x55, 0x0a, 0x0d, 0x62, 0x6c, 0x69, + 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x6e, 0x65, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x6e, 0x65, 0x62, + 0x48, 0x00, 0x52, 0x0c, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x6e, 0x65, 0x62, + 0x12, 0x4d, 0x0a, 0x07, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6c, 0x65, + 0x63, 0x74, 0x72, 0x61, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, + 0x5b, 0x0a, 0x0f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x72, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6c, + 0x69, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x44, 0x0a, 0x04, + 0x66, 0x75, 0x6c, 0x75, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x75, 0x48, 0x00, 0x52, 0x04, 0x66, 0x75, + 0x6c, 0x75, 0x12, 0x52, 0x0a, 0x0c, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x66, 0x75, + 0x6c, 0x75, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x6c, 0x69, 0x6e, 0x64, + 0x65, 0x64, 0x46, 0x75, 0x6c, 0x75, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x62, 0x6c, 0x69, + 0x6e, 0x64, 0x65, 0x64, 0x18, 0x64, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x42, 0x6c, + 0x69, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x22, 0x73, 0x0a, 0x11, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xec, 0x02, 0x0a, 0x0b, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, + 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, + 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, + 0x6c, 0x6f, 0x74, 0x12, 0x76, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, + 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, + 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, + 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0d, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0b, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, + 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x62, + 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, + 0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xd1, 0x04, 0x0a, 0x0f, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x2b, 0x0a, 0x0d, 0x72, + 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x64, + 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x3c, 0x0a, 0x09, 0x65, 0x74, 0x68, 0x31, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x65, 0x74, + 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, + 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, 0x5e, 0x0a, 0x12, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, + 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, + 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5d, 0x0a, 0x12, 0x61, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, + 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, + 0x05, 0x92, 0xb5, 0x18, 0x01, 0x32, 0x52, 0x11, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, + 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4f, 0x0a, 0x0c, 0x61, 0x74, 0x74, + 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x92, 0xb5, 0x18, 0x03, 0x31, 0x32, 0x38, 0x52, 0x0c, 0x61, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x42, 0x0a, 0x08, 0x64, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, + 0x18, 0x02, 0x31, 0x36, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x5b, + 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, + 0x78, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x0e, 0x76, 0x6f, 0x6c, + 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x17, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, + 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, + 0xdb, 0x02, 0x0a, 0x11, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, @@ -6043,17 +6799,238 @@ var file_proto_prysm_v1alpha1_beacon_block_proto_rawDesc = []byte{ 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x9b, 0x01, 0x0a, 0x19, 0x6f, 0x72, 0x67, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x1d, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x75, 0x12, 0x42, 0x0a, 0x05, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2f, + 0x0a, 0x0a, 0x6b, 0x7a, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, 0x92, 0xb5, 0x18, 0x04, + 0x34, 0x30, 0x39, 0x36, 0x52, 0x09, 0x6b, 0x7a, 0x67, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, + 0x2a, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x14, + 0x8a, 0xb5, 0x18, 0x08, 0x3f, 0x2c, 0x31, 0x33, 0x31, 0x30, 0x37, 0x32, 0x92, 0xb5, 0x18, 0x04, + 0x34, 0x30, 0x39, 0x36, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x22, 0x7b, 0x0a, 0x15, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x46, 0x75, 0x6c, 0x75, 0x12, 0x3c, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, 0x52, 0x05, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x17, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x46, 0x75, 0x6c, 0x75, 0x12, 0x3c, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, 0x52, 0x05, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x2f, 0x0a, 0x0a, 0x6b, 0x7a, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, + 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x09, 0x6b, 0x7a, 0x67, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0c, 0x42, 0x14, 0x8a, 0xb5, 0x18, 0x08, 0x3f, 0x2c, 0x31, 0x33, 0x31, 0x30, 0x37, 0x32, + 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x22, + 0xf4, 0x02, 0x0a, 0x0f, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, + 0x75, 0x6c, 0x75, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, + 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, + 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x76, + 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, + 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, + 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, + 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, + 0x02, 0x33, 0x32, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, + 0x25, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x09, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x46, 0x75, 0x6c, 0x75, + 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x94, 0x08, 0x0a, 0x13, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x46, 0x75, 0x6c, 0x75, 0x12, 0x2b, + 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x0c, 0x72, + 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x3c, 0x0a, 0x09, 0x65, + 0x74, 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x10, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x65, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, + 0x02, 0x33, 0x32, 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, 0x5e, 0x0a, + 0x12, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, + 0x6e, 0x67, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x64, 0x0a, + 0x12, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, + 0x6e, 0x67, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x42, 0x05, 0x92, 0xb5, 0x18, 0x01, 0x31, + 0x52, 0x11, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x54, 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, + 0x63, 0x74, 0x72, 0x61, 0x42, 0x05, 0x92, 0xb5, 0x18, 0x01, 0x38, 0x52, 0x0c, 0x61, 0x74, 0x74, + 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x42, 0x0a, 0x08, 0x64, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, + 0x02, 0x31, 0x36, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x5b, 0x0a, + 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, + 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x0e, 0x76, 0x6f, 0x6c, 0x75, + 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x0e, 0x73, 0x79, + 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x41, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x52, 0x10, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x72, 0x0a, 0x18, 0x62, 0x6c, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x42, 0x4c, 0x53, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x15, 0x62, 0x6c, + 0x73, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x6b, 0x7a, 0x67, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, + 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, 0x92, 0xb5, 0x18, 0x04, 0x34, + 0x30, 0x39, 0x36, 0x52, 0x12, 0x62, 0x6c, 0x6f, 0x62, 0x4b, 0x7a, 0x67, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x8d, 0x01, + 0x0a, 0x1c, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, 0x12, 0x47, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, + 0x39, 0x36, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x82, 0x03, + 0x0a, 0x16, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, - 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x3b, 0x65, 0x74, 0x68, 0xaa, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x45, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, - 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x45, 0x74, 0x68, 0x5c, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, + 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, + 0x6c, 0x6f, 0x74, 0x12, 0x76, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, + 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, + 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, + 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0d, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0b, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, + 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x45, 0x0a, 0x04, 0x62, + 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x46, 0x75, 0x6c, 0x75, 0x52, 0x04, 0x62, 0x6f, + 0x64, 0x79, 0x22, 0xae, 0x08, 0x0a, 0x1a, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x65, + 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x79, 0x46, 0x75, 0x6c, + 0x75, 0x12, 0x2b, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x65, + 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, + 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x3c, + 0x0a, 0x09, 0x65, 0x74, 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x65, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x08, + 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, + 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, + 0x12, 0x5e, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x11, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x64, 0x0a, 0x12, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x42, 0x05, 0x92, 0xb5, + 0x18, 0x01, 0x31, 0x52, 0x11, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x54, 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x42, 0x05, 0x92, 0xb5, 0x18, 0x01, 0x38, 0x52, 0x0c, + 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x42, 0x0a, 0x08, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x06, + 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, + 0x12, 0x5b, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, + 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, + 0x79, 0x45, 0x78, 0x69, 0x74, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, 0x31, 0x36, 0x52, 0x0e, 0x76, + 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x73, 0x12, 0x4b, 0x0a, + 0x0e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, + 0x6e, 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x6e, + 0x63, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x18, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x52, 0x16, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x72, 0x0a, 0x18, 0x62, 0x6c, 0x73, 0x5f, 0x74, 0x6f, 0x5f, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x4c, 0x53, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x06, 0x92, 0xb5, 0x18, 0x02, + 0x31, 0x36, 0x52, 0x15, 0x62, 0x6c, 0x73, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x62, 0x6c, 0x6f, + 0x62, 0x5f, 0x6b, 0x7a, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, + 0x38, 0x92, 0xb5, 0x18, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x12, 0x62, 0x6c, 0x6f, 0x62, 0x4b, + 0x7a, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, + 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x42, 0x9b, 0x01, 0x0a, 0x19, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x42, 0x10, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, + 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, + 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x65, 0x74, + 0x68, 0xaa, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x45, 0x74, 0x68, 0x5c, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6068,7 +7045,7 @@ func file_proto_prysm_v1alpha1_beacon_block_proto_rawDescGZIP() []byte { return file_proto_prysm_v1alpha1_beacon_block_proto_rawDescData } -var file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes = make([]protoimpl.MessageInfo, 60) +var file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes = make([]protoimpl.MessageInfo, 68) var file_proto_prysm_v1alpha1_beacon_block_proto_goTypes = []interface{}{ (*GenericSignedBeaconBlock)(nil), // 0: ethereum.eth.v1alpha1.GenericSignedBeaconBlock (*GenericBeaconBlock)(nil), // 1: ethereum.eth.v1alpha1.GenericBeaconBlock @@ -6129,18 +7106,26 @@ var file_proto_prysm_v1alpha1_beacon_block_proto_goTypes = []interface{}{ (*BlindedBeaconBlockBodyElectra)(nil), // 56: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra (*AttesterSlashingElectra)(nil), // 57: ethereum.eth.v1alpha1.AttesterSlashingElectra (*IndexedAttestationElectra)(nil), // 58: ethereum.eth.v1alpha1.IndexedAttestationElectra - (*Deposit_Data)(nil), // 59: ethereum.eth.v1alpha1.Deposit.Data - (*Attestation)(nil), // 60: ethereum.eth.v1alpha1.Attestation - (*AttestationData)(nil), // 61: ethereum.eth.v1alpha1.AttestationData - (*v1.ExecutionPayloadHeader)(nil), // 62: ethereum.engine.v1.ExecutionPayloadHeader - (*v1.ExecutionPayload)(nil), // 63: ethereum.engine.v1.ExecutionPayload - (*v1.ExecutionPayloadCapella)(nil), // 64: ethereum.engine.v1.ExecutionPayloadCapella - (*SignedBLSToExecutionChange)(nil), // 65: ethereum.eth.v1alpha1.SignedBLSToExecutionChange - (*v1.ExecutionPayloadHeaderCapella)(nil), // 66: ethereum.engine.v1.ExecutionPayloadHeaderCapella - (*v1.ExecutionPayloadDeneb)(nil), // 67: ethereum.engine.v1.ExecutionPayloadDeneb - (*v1.ExecutionPayloadHeaderDeneb)(nil), // 68: ethereum.engine.v1.ExecutionPayloadHeaderDeneb - (*AttestationElectra)(nil), // 69: ethereum.eth.v1alpha1.AttestationElectra - (*v1.ExecutionRequests)(nil), // 70: ethereum.engine.v1.ExecutionRequests + (*SignedBeaconBlockContentsFulu)(nil), // 59: ethereum.eth.v1alpha1.SignedBeaconBlockContentsFulu + (*SignedBeaconBlockFulu)(nil), // 60: ethereum.eth.v1alpha1.SignedBeaconBlockFulu + (*BeaconBlockContentsFulu)(nil), // 61: ethereum.eth.v1alpha1.BeaconBlockContentsFulu + (*BeaconBlockFulu)(nil), // 62: ethereum.eth.v1alpha1.BeaconBlockFulu + (*BeaconBlockBodyFulu)(nil), // 63: ethereum.eth.v1alpha1.BeaconBlockBodyFulu + (*SignedBlindedBeaconBlockFulu)(nil), // 64: ethereum.eth.v1alpha1.SignedBlindedBeaconBlockFulu + (*BlindedBeaconBlockFulu)(nil), // 65: ethereum.eth.v1alpha1.BlindedBeaconBlockFulu + (*BlindedBeaconBlockBodyFulu)(nil), // 66: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu + (*Deposit_Data)(nil), // 67: ethereum.eth.v1alpha1.Deposit.Data + (*Attestation)(nil), // 68: ethereum.eth.v1alpha1.Attestation + (*AttestationData)(nil), // 69: ethereum.eth.v1alpha1.AttestationData + (*v1.ExecutionPayloadHeader)(nil), // 70: ethereum.engine.v1.ExecutionPayloadHeader + (*v1.ExecutionPayload)(nil), // 71: ethereum.engine.v1.ExecutionPayload + (*v1.ExecutionPayloadCapella)(nil), // 72: ethereum.engine.v1.ExecutionPayloadCapella + (*SignedBLSToExecutionChange)(nil), // 73: ethereum.eth.v1alpha1.SignedBLSToExecutionChange + (*v1.ExecutionPayloadHeaderCapella)(nil), // 74: ethereum.engine.v1.ExecutionPayloadHeaderCapella + (*v1.ExecutionPayloadDeneb)(nil), // 75: ethereum.engine.v1.ExecutionPayloadDeneb + (*v1.ExecutionPayloadHeaderDeneb)(nil), // 76: ethereum.engine.v1.ExecutionPayloadHeaderDeneb + (*AttestationElectra)(nil), // 77: ethereum.eth.v1alpha1.AttestationElectra + (*v1.ExecutionRequests)(nil), // 78: ethereum.engine.v1.ExecutionRequests } var file_proto_prysm_v1alpha1_beacon_block_proto_depIdxs = []int32{ 2, // 0: ethereum.eth.v1alpha1.GenericSignedBeaconBlock.phase0:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlock @@ -6153,151 +7138,181 @@ var file_proto_prysm_v1alpha1_beacon_block_proto_depIdxs = []int32{ 42, // 7: ethereum.eth.v1alpha1.GenericSignedBeaconBlock.blinded_deneb:type_name -> ethereum.eth.v1alpha1.SignedBlindedBeaconBlockDeneb 49, // 8: ethereum.eth.v1alpha1.GenericSignedBeaconBlock.electra:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockContentsElectra 54, // 9: ethereum.eth.v1alpha1.GenericSignedBeaconBlock.blinded_electra:type_name -> ethereum.eth.v1alpha1.SignedBlindedBeaconBlockElectra - 3, // 10: ethereum.eth.v1alpha1.GenericBeaconBlock.phase0:type_name -> ethereum.eth.v1alpha1.BeaconBlock - 20, // 11: ethereum.eth.v1alpha1.GenericBeaconBlock.altair:type_name -> ethereum.eth.v1alpha1.BeaconBlockAltair - 24, // 12: ethereum.eth.v1alpha1.GenericBeaconBlock.bellatrix:type_name -> ethereum.eth.v1alpha1.BeaconBlockBellatrix - 27, // 13: ethereum.eth.v1alpha1.GenericBeaconBlock.blinded_bellatrix:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBellatrix - 30, // 14: ethereum.eth.v1alpha1.GenericBeaconBlock.capella:type_name -> ethereum.eth.v1alpha1.BeaconBlockCapella - 33, // 15: ethereum.eth.v1alpha1.GenericBeaconBlock.blinded_capella:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockCapella - 39, // 16: ethereum.eth.v1alpha1.GenericBeaconBlock.deneb:type_name -> ethereum.eth.v1alpha1.BeaconBlockContentsDeneb - 43, // 17: ethereum.eth.v1alpha1.GenericBeaconBlock.blinded_deneb:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockDeneb - 51, // 18: ethereum.eth.v1alpha1.GenericBeaconBlock.electra:type_name -> ethereum.eth.v1alpha1.BeaconBlockContentsElectra - 55, // 19: ethereum.eth.v1alpha1.GenericBeaconBlock.blinded_electra:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockElectra - 3, // 20: ethereum.eth.v1alpha1.SignedBeaconBlock.block:type_name -> ethereum.eth.v1alpha1.BeaconBlock - 4, // 21: ethereum.eth.v1alpha1.BeaconBlock.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBody - 7, // 22: ethereum.eth.v1alpha1.BeaconBlockBody.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 8, // 23: ethereum.eth.v1alpha1.BeaconBlockBody.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing - 9, // 24: ethereum.eth.v1alpha1.BeaconBlockBody.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing - 60, // 25: ethereum.eth.v1alpha1.BeaconBlockBody.attestations:type_name -> ethereum.eth.v1alpha1.Attestation - 11, // 26: ethereum.eth.v1alpha1.BeaconBlockBody.deposits:type_name -> ethereum.eth.v1alpha1.Deposit - 12, // 27: ethereum.eth.v1alpha1.BeaconBlockBody.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 6, // 28: ethereum.eth.v1alpha1.SignedBeaconBlockHeader.header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader - 5, // 29: ethereum.eth.v1alpha1.ProposerSlashing.header_1:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockHeader - 5, // 30: ethereum.eth.v1alpha1.ProposerSlashing.header_2:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockHeader - 10, // 31: ethereum.eth.v1alpha1.AttesterSlashing.attestation_1:type_name -> ethereum.eth.v1alpha1.IndexedAttestation - 10, // 32: ethereum.eth.v1alpha1.AttesterSlashing.attestation_2:type_name -> ethereum.eth.v1alpha1.IndexedAttestation - 61, // 33: ethereum.eth.v1alpha1.IndexedAttestation.data:type_name -> ethereum.eth.v1alpha1.AttestationData - 59, // 34: ethereum.eth.v1alpha1.Deposit.data:type_name -> ethereum.eth.v1alpha1.Deposit.Data - 13, // 35: ethereum.eth.v1alpha1.SignedVoluntaryExit.exit:type_name -> ethereum.eth.v1alpha1.VoluntaryExit - 15, // 36: ethereum.eth.v1alpha1.SignedValidatorRegistrationsV1.messages:type_name -> ethereum.eth.v1alpha1.SignedValidatorRegistrationV1 - 16, // 37: ethereum.eth.v1alpha1.SignedValidatorRegistrationV1.message:type_name -> ethereum.eth.v1alpha1.ValidatorRegistrationV1 - 18, // 38: ethereum.eth.v1alpha1.SignedBuilderBid.message:type_name -> ethereum.eth.v1alpha1.BuilderBid - 62, // 39: ethereum.eth.v1alpha1.BuilderBid.header:type_name -> ethereum.engine.v1.ExecutionPayloadHeader - 20, // 40: ethereum.eth.v1alpha1.SignedBeaconBlockAltair.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockAltair - 21, // 41: ethereum.eth.v1alpha1.BeaconBlockAltair.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyAltair - 7, // 42: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 8, // 43: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing - 9, // 44: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing - 60, // 45: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.attestations:type_name -> ethereum.eth.v1alpha1.Attestation - 11, // 46: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.deposits:type_name -> ethereum.eth.v1alpha1.Deposit - 12, // 47: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 22, // 48: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate - 24, // 49: ethereum.eth.v1alpha1.SignedBeaconBlockBellatrix.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockBellatrix - 25, // 50: ethereum.eth.v1alpha1.BeaconBlockBellatrix.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix - 7, // 51: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 8, // 52: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing - 9, // 53: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing - 60, // 54: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.attestations:type_name -> ethereum.eth.v1alpha1.Attestation - 11, // 55: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.deposits:type_name -> ethereum.eth.v1alpha1.Deposit - 12, // 56: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 22, // 57: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate - 63, // 58: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayload - 27, // 59: ethereum.eth.v1alpha1.SignedBlindedBeaconBlockBellatrix.block:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBellatrix - 28, // 60: ethereum.eth.v1alpha1.BlindedBeaconBlockBellatrix.body:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix - 7, // 61: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 8, // 62: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing - 9, // 63: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing - 60, // 64: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.attestations:type_name -> ethereum.eth.v1alpha1.Attestation - 11, // 65: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.deposits:type_name -> ethereum.eth.v1alpha1.Deposit - 12, // 66: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 22, // 67: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate - 62, // 68: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeader - 30, // 69: ethereum.eth.v1alpha1.SignedBeaconBlockCapella.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockCapella - 31, // 70: ethereum.eth.v1alpha1.BeaconBlockCapella.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyCapella - 7, // 71: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 8, // 72: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing - 9, // 73: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing - 60, // 74: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.attestations:type_name -> ethereum.eth.v1alpha1.Attestation - 11, // 75: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.deposits:type_name -> ethereum.eth.v1alpha1.Deposit - 12, // 76: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 22, // 77: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate - 64, // 78: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayloadCapella - 65, // 79: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange - 33, // 80: ethereum.eth.v1alpha1.SignedBlindedBeaconBlockCapella.block:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockCapella - 34, // 81: ethereum.eth.v1alpha1.BlindedBeaconBlockCapella.body:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella - 7, // 82: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 8, // 83: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing - 9, // 84: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing - 60, // 85: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.attestations:type_name -> ethereum.eth.v1alpha1.Attestation - 11, // 86: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.deposits:type_name -> ethereum.eth.v1alpha1.Deposit - 12, // 87: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 22, // 88: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate - 66, // 89: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderCapella - 65, // 90: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange - 36, // 91: ethereum.eth.v1alpha1.SignedBuilderBidCapella.message:type_name -> ethereum.eth.v1alpha1.BuilderBidCapella - 66, // 92: ethereum.eth.v1alpha1.BuilderBidCapella.header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderCapella - 38, // 93: ethereum.eth.v1alpha1.SignedBeaconBlockContentsDeneb.block:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockDeneb - 40, // 94: ethereum.eth.v1alpha1.SignedBeaconBlockDeneb.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockDeneb - 40, // 95: ethereum.eth.v1alpha1.BeaconBlockContentsDeneb.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockDeneb - 41, // 96: ethereum.eth.v1alpha1.BeaconBlockDeneb.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyDeneb - 7, // 97: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 8, // 98: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing - 9, // 99: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing - 60, // 100: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.attestations:type_name -> ethereum.eth.v1alpha1.Attestation - 11, // 101: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.deposits:type_name -> ethereum.eth.v1alpha1.Deposit - 12, // 102: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 22, // 103: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate - 67, // 104: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayloadDeneb - 65, // 105: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange - 43, // 106: ethereum.eth.v1alpha1.SignedBlindedBeaconBlockDeneb.message:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockDeneb - 44, // 107: ethereum.eth.v1alpha1.BlindedBeaconBlockDeneb.body:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb - 7, // 108: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 8, // 109: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing - 9, // 110: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing - 60, // 111: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.attestations:type_name -> ethereum.eth.v1alpha1.Attestation - 11, // 112: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.deposits:type_name -> ethereum.eth.v1alpha1.Deposit - 12, // 113: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 22, // 114: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate - 68, // 115: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb - 65, // 116: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange - 46, // 117: ethereum.eth.v1alpha1.SignedBuilderBidDeneb.message:type_name -> ethereum.eth.v1alpha1.BuilderBidDeneb - 68, // 118: ethereum.eth.v1alpha1.BuilderBidDeneb.header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb - 48, // 119: ethereum.eth.v1alpha1.BlobSidecars.sidecars:type_name -> ethereum.eth.v1alpha1.BlobSidecar - 5, // 120: ethereum.eth.v1alpha1.BlobSidecar.signed_block_header:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockHeader - 50, // 121: ethereum.eth.v1alpha1.SignedBeaconBlockContentsElectra.block:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockElectra - 52, // 122: ethereum.eth.v1alpha1.SignedBeaconBlockElectra.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockElectra - 52, // 123: ethereum.eth.v1alpha1.BeaconBlockContentsElectra.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockElectra - 53, // 124: ethereum.eth.v1alpha1.BeaconBlockElectra.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyElectra - 7, // 125: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 8, // 126: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing - 57, // 127: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashingElectra - 69, // 128: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.attestations:type_name -> ethereum.eth.v1alpha1.AttestationElectra - 11, // 129: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.deposits:type_name -> ethereum.eth.v1alpha1.Deposit - 12, // 130: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 22, // 131: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate - 67, // 132: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayloadDeneb - 65, // 133: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange - 70, // 134: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.execution_requests:type_name -> ethereum.engine.v1.ExecutionRequests - 55, // 135: ethereum.eth.v1alpha1.SignedBlindedBeaconBlockElectra.message:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockElectra - 56, // 136: ethereum.eth.v1alpha1.BlindedBeaconBlockElectra.body:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra - 7, // 137: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 8, // 138: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing - 57, // 139: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashingElectra - 69, // 140: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.attestations:type_name -> ethereum.eth.v1alpha1.AttestationElectra - 11, // 141: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.deposits:type_name -> ethereum.eth.v1alpha1.Deposit - 12, // 142: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 22, // 143: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate - 68, // 144: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb - 65, // 145: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange - 70, // 146: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.execution_requests:type_name -> ethereum.engine.v1.ExecutionRequests - 58, // 147: ethereum.eth.v1alpha1.AttesterSlashingElectra.attestation_1:type_name -> ethereum.eth.v1alpha1.IndexedAttestationElectra - 58, // 148: ethereum.eth.v1alpha1.AttesterSlashingElectra.attestation_2:type_name -> ethereum.eth.v1alpha1.IndexedAttestationElectra - 61, // 149: ethereum.eth.v1alpha1.IndexedAttestationElectra.data:type_name -> ethereum.eth.v1alpha1.AttestationData - 150, // [150:150] is the sub-list for method output_type - 150, // [150:150] is the sub-list for method input_type - 150, // [150:150] is the sub-list for extension type_name - 150, // [150:150] is the sub-list for extension extendee - 0, // [0:150] is the sub-list for field type_name + 59, // 10: ethereum.eth.v1alpha1.GenericSignedBeaconBlock.fulu:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockContentsFulu + 64, // 11: ethereum.eth.v1alpha1.GenericSignedBeaconBlock.blinded_fulu:type_name -> ethereum.eth.v1alpha1.SignedBlindedBeaconBlockFulu + 3, // 12: ethereum.eth.v1alpha1.GenericBeaconBlock.phase0:type_name -> ethereum.eth.v1alpha1.BeaconBlock + 20, // 13: ethereum.eth.v1alpha1.GenericBeaconBlock.altair:type_name -> ethereum.eth.v1alpha1.BeaconBlockAltair + 24, // 14: ethereum.eth.v1alpha1.GenericBeaconBlock.bellatrix:type_name -> ethereum.eth.v1alpha1.BeaconBlockBellatrix + 27, // 15: ethereum.eth.v1alpha1.GenericBeaconBlock.blinded_bellatrix:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBellatrix + 30, // 16: ethereum.eth.v1alpha1.GenericBeaconBlock.capella:type_name -> ethereum.eth.v1alpha1.BeaconBlockCapella + 33, // 17: ethereum.eth.v1alpha1.GenericBeaconBlock.blinded_capella:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockCapella + 39, // 18: ethereum.eth.v1alpha1.GenericBeaconBlock.deneb:type_name -> ethereum.eth.v1alpha1.BeaconBlockContentsDeneb + 43, // 19: ethereum.eth.v1alpha1.GenericBeaconBlock.blinded_deneb:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockDeneb + 51, // 20: ethereum.eth.v1alpha1.GenericBeaconBlock.electra:type_name -> ethereum.eth.v1alpha1.BeaconBlockContentsElectra + 55, // 21: ethereum.eth.v1alpha1.GenericBeaconBlock.blinded_electra:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockElectra + 61, // 22: ethereum.eth.v1alpha1.GenericBeaconBlock.fulu:type_name -> ethereum.eth.v1alpha1.BeaconBlockContentsFulu + 65, // 23: ethereum.eth.v1alpha1.GenericBeaconBlock.blinded_fulu:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockFulu + 3, // 24: ethereum.eth.v1alpha1.SignedBeaconBlock.block:type_name -> ethereum.eth.v1alpha1.BeaconBlock + 4, // 25: ethereum.eth.v1alpha1.BeaconBlock.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBody + 7, // 26: ethereum.eth.v1alpha1.BeaconBlockBody.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 27: ethereum.eth.v1alpha1.BeaconBlockBody.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 9, // 28: ethereum.eth.v1alpha1.BeaconBlockBody.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing + 68, // 29: ethereum.eth.v1alpha1.BeaconBlockBody.attestations:type_name -> ethereum.eth.v1alpha1.Attestation + 11, // 30: ethereum.eth.v1alpha1.BeaconBlockBody.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 31: ethereum.eth.v1alpha1.BeaconBlockBody.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 6, // 32: ethereum.eth.v1alpha1.SignedBeaconBlockHeader.header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader + 5, // 33: ethereum.eth.v1alpha1.ProposerSlashing.header_1:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockHeader + 5, // 34: ethereum.eth.v1alpha1.ProposerSlashing.header_2:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockHeader + 10, // 35: ethereum.eth.v1alpha1.AttesterSlashing.attestation_1:type_name -> ethereum.eth.v1alpha1.IndexedAttestation + 10, // 36: ethereum.eth.v1alpha1.AttesterSlashing.attestation_2:type_name -> ethereum.eth.v1alpha1.IndexedAttestation + 69, // 37: ethereum.eth.v1alpha1.IndexedAttestation.data:type_name -> ethereum.eth.v1alpha1.AttestationData + 67, // 38: ethereum.eth.v1alpha1.Deposit.data:type_name -> ethereum.eth.v1alpha1.Deposit.Data + 13, // 39: ethereum.eth.v1alpha1.SignedVoluntaryExit.exit:type_name -> ethereum.eth.v1alpha1.VoluntaryExit + 15, // 40: ethereum.eth.v1alpha1.SignedValidatorRegistrationsV1.messages:type_name -> ethereum.eth.v1alpha1.SignedValidatorRegistrationV1 + 16, // 41: ethereum.eth.v1alpha1.SignedValidatorRegistrationV1.message:type_name -> ethereum.eth.v1alpha1.ValidatorRegistrationV1 + 18, // 42: ethereum.eth.v1alpha1.SignedBuilderBid.message:type_name -> ethereum.eth.v1alpha1.BuilderBid + 70, // 43: ethereum.eth.v1alpha1.BuilderBid.header:type_name -> ethereum.engine.v1.ExecutionPayloadHeader + 20, // 44: ethereum.eth.v1alpha1.SignedBeaconBlockAltair.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockAltair + 21, // 45: ethereum.eth.v1alpha1.BeaconBlockAltair.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyAltair + 7, // 46: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 47: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 9, // 48: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing + 68, // 49: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.attestations:type_name -> ethereum.eth.v1alpha1.Attestation + 11, // 50: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 51: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 52: ethereum.eth.v1alpha1.BeaconBlockBodyAltair.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 24, // 53: ethereum.eth.v1alpha1.SignedBeaconBlockBellatrix.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockBellatrix + 25, // 54: ethereum.eth.v1alpha1.BeaconBlockBellatrix.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix + 7, // 55: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 56: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 9, // 57: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing + 68, // 58: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.attestations:type_name -> ethereum.eth.v1alpha1.Attestation + 11, // 59: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 60: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 61: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 71, // 62: ethereum.eth.v1alpha1.BeaconBlockBodyBellatrix.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayload + 27, // 63: ethereum.eth.v1alpha1.SignedBlindedBeaconBlockBellatrix.block:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBellatrix + 28, // 64: ethereum.eth.v1alpha1.BlindedBeaconBlockBellatrix.body:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix + 7, // 65: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 66: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 9, // 67: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing + 68, // 68: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.attestations:type_name -> ethereum.eth.v1alpha1.Attestation + 11, // 69: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 70: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 71: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 70, // 72: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyBellatrix.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeader + 30, // 73: ethereum.eth.v1alpha1.SignedBeaconBlockCapella.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockCapella + 31, // 74: ethereum.eth.v1alpha1.BeaconBlockCapella.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyCapella + 7, // 75: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 76: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 9, // 77: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing + 68, // 78: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.attestations:type_name -> ethereum.eth.v1alpha1.Attestation + 11, // 79: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 80: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 81: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 72, // 82: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayloadCapella + 73, // 83: ethereum.eth.v1alpha1.BeaconBlockBodyCapella.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange + 33, // 84: ethereum.eth.v1alpha1.SignedBlindedBeaconBlockCapella.block:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockCapella + 34, // 85: ethereum.eth.v1alpha1.BlindedBeaconBlockCapella.body:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella + 7, // 86: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 87: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 9, // 88: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing + 68, // 89: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.attestations:type_name -> ethereum.eth.v1alpha1.Attestation + 11, // 90: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 91: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 92: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 74, // 93: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderCapella + 73, // 94: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyCapella.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange + 36, // 95: ethereum.eth.v1alpha1.SignedBuilderBidCapella.message:type_name -> ethereum.eth.v1alpha1.BuilderBidCapella + 74, // 96: ethereum.eth.v1alpha1.BuilderBidCapella.header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderCapella + 38, // 97: ethereum.eth.v1alpha1.SignedBeaconBlockContentsDeneb.block:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockDeneb + 40, // 98: ethereum.eth.v1alpha1.SignedBeaconBlockDeneb.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockDeneb + 40, // 99: ethereum.eth.v1alpha1.BeaconBlockContentsDeneb.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockDeneb + 41, // 100: ethereum.eth.v1alpha1.BeaconBlockDeneb.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyDeneb + 7, // 101: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 102: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 9, // 103: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing + 68, // 104: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.attestations:type_name -> ethereum.eth.v1alpha1.Attestation + 11, // 105: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 106: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 107: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 75, // 108: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayloadDeneb + 73, // 109: ethereum.eth.v1alpha1.BeaconBlockBodyDeneb.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange + 43, // 110: ethereum.eth.v1alpha1.SignedBlindedBeaconBlockDeneb.message:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockDeneb + 44, // 111: ethereum.eth.v1alpha1.BlindedBeaconBlockDeneb.body:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb + 7, // 112: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 113: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 9, // 114: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashing + 68, // 115: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.attestations:type_name -> ethereum.eth.v1alpha1.Attestation + 11, // 116: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 117: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 118: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 76, // 119: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb + 73, // 120: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyDeneb.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange + 46, // 121: ethereum.eth.v1alpha1.SignedBuilderBidDeneb.message:type_name -> ethereum.eth.v1alpha1.BuilderBidDeneb + 76, // 122: ethereum.eth.v1alpha1.BuilderBidDeneb.header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb + 48, // 123: ethereum.eth.v1alpha1.BlobSidecars.sidecars:type_name -> ethereum.eth.v1alpha1.BlobSidecar + 5, // 124: ethereum.eth.v1alpha1.BlobSidecar.signed_block_header:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockHeader + 50, // 125: ethereum.eth.v1alpha1.SignedBeaconBlockContentsElectra.block:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockElectra + 52, // 126: ethereum.eth.v1alpha1.SignedBeaconBlockElectra.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockElectra + 52, // 127: ethereum.eth.v1alpha1.BeaconBlockContentsElectra.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockElectra + 53, // 128: ethereum.eth.v1alpha1.BeaconBlockElectra.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyElectra + 7, // 129: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 130: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 57, // 131: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashingElectra + 77, // 132: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.attestations:type_name -> ethereum.eth.v1alpha1.AttestationElectra + 11, // 133: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 134: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 135: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 75, // 136: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayloadDeneb + 73, // 137: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange + 78, // 138: ethereum.eth.v1alpha1.BeaconBlockBodyElectra.execution_requests:type_name -> ethereum.engine.v1.ExecutionRequests + 55, // 139: ethereum.eth.v1alpha1.SignedBlindedBeaconBlockElectra.message:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockElectra + 56, // 140: ethereum.eth.v1alpha1.BlindedBeaconBlockElectra.body:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra + 7, // 141: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 142: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 57, // 143: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashingElectra + 77, // 144: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.attestations:type_name -> ethereum.eth.v1alpha1.AttestationElectra + 11, // 145: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 146: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 147: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 76, // 148: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb + 73, // 149: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange + 78, // 150: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyElectra.execution_requests:type_name -> ethereum.engine.v1.ExecutionRequests + 58, // 151: ethereum.eth.v1alpha1.AttesterSlashingElectra.attestation_1:type_name -> ethereum.eth.v1alpha1.IndexedAttestationElectra + 58, // 152: ethereum.eth.v1alpha1.AttesterSlashingElectra.attestation_2:type_name -> ethereum.eth.v1alpha1.IndexedAttestationElectra + 69, // 153: ethereum.eth.v1alpha1.IndexedAttestationElectra.data:type_name -> ethereum.eth.v1alpha1.AttestationData + 60, // 154: ethereum.eth.v1alpha1.SignedBeaconBlockContentsFulu.block:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockFulu + 62, // 155: ethereum.eth.v1alpha1.SignedBeaconBlockFulu.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockFulu + 62, // 156: ethereum.eth.v1alpha1.BeaconBlockContentsFulu.block:type_name -> ethereum.eth.v1alpha1.BeaconBlockFulu + 63, // 157: ethereum.eth.v1alpha1.BeaconBlockFulu.body:type_name -> ethereum.eth.v1alpha1.BeaconBlockBodyFulu + 7, // 158: ethereum.eth.v1alpha1.BeaconBlockBodyFulu.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 159: ethereum.eth.v1alpha1.BeaconBlockBodyFulu.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 57, // 160: ethereum.eth.v1alpha1.BeaconBlockBodyFulu.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashingElectra + 77, // 161: ethereum.eth.v1alpha1.BeaconBlockBodyFulu.attestations:type_name -> ethereum.eth.v1alpha1.AttestationElectra + 11, // 162: ethereum.eth.v1alpha1.BeaconBlockBodyFulu.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 163: ethereum.eth.v1alpha1.BeaconBlockBodyFulu.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 164: ethereum.eth.v1alpha1.BeaconBlockBodyFulu.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 75, // 165: ethereum.eth.v1alpha1.BeaconBlockBodyFulu.execution_payload:type_name -> ethereum.engine.v1.ExecutionPayloadDeneb + 73, // 166: ethereum.eth.v1alpha1.BeaconBlockBodyFulu.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange + 78, // 167: ethereum.eth.v1alpha1.BeaconBlockBodyFulu.execution_requests:type_name -> ethereum.engine.v1.ExecutionRequests + 65, // 168: ethereum.eth.v1alpha1.SignedBlindedBeaconBlockFulu.message:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockFulu + 66, // 169: ethereum.eth.v1alpha1.BlindedBeaconBlockFulu.body:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu + 7, // 170: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 8, // 171: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu.proposer_slashings:type_name -> ethereum.eth.v1alpha1.ProposerSlashing + 57, // 172: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu.attester_slashings:type_name -> ethereum.eth.v1alpha1.AttesterSlashingElectra + 77, // 173: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu.attestations:type_name -> ethereum.eth.v1alpha1.AttestationElectra + 11, // 174: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu.deposits:type_name -> ethereum.eth.v1alpha1.Deposit + 12, // 175: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu.voluntary_exits:type_name -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 22, // 176: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu.sync_aggregate:type_name -> ethereum.eth.v1alpha1.SyncAggregate + 76, // 177: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu.execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb + 73, // 178: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu.bls_to_execution_changes:type_name -> ethereum.eth.v1alpha1.SignedBLSToExecutionChange + 78, // 179: ethereum.eth.v1alpha1.BlindedBeaconBlockBodyFulu.execution_requests:type_name -> ethereum.engine.v1.ExecutionRequests + 180, // [180:180] is the sub-list for method output_type + 180, // [180:180] is the sub-list for method input_type + 180, // [180:180] is the sub-list for extension type_name + 180, // [180:180] is the sub-list for extension extendee + 0, // [0:180] is the sub-list for field type_name } func init() { file_proto_prysm_v1alpha1_beacon_block_proto_init() } @@ -7017,6 +8032,102 @@ func file_proto_prysm_v1alpha1_beacon_block_proto_init() { } } file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedBeaconBlockContentsFulu); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedBeaconBlockFulu); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BeaconBlockContentsFulu); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BeaconBlockFulu); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BeaconBlockBodyFulu); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedBlindedBeaconBlockFulu); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlindedBeaconBlockFulu); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlindedBeaconBlockBodyFulu); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Deposit_Data); i { case 0: return &v.state @@ -7040,6 +8151,8 @@ func file_proto_prysm_v1alpha1_beacon_block_proto_init() { (*GenericSignedBeaconBlock_BlindedDeneb)(nil), (*GenericSignedBeaconBlock_Electra)(nil), (*GenericSignedBeaconBlock_BlindedElectra)(nil), + (*GenericSignedBeaconBlock_Fulu)(nil), + (*GenericSignedBeaconBlock_BlindedFulu)(nil), } file_proto_prysm_v1alpha1_beacon_block_proto_msgTypes[1].OneofWrappers = []interface{}{ (*GenericBeaconBlock_Phase0)(nil), @@ -7052,6 +8165,8 @@ func file_proto_prysm_v1alpha1_beacon_block_proto_init() { (*GenericBeaconBlock_BlindedDeneb)(nil), (*GenericBeaconBlock_Electra)(nil), (*GenericBeaconBlock_BlindedElectra)(nil), + (*GenericBeaconBlock_Fulu)(nil), + (*GenericBeaconBlock_BlindedFulu)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -7059,7 +8174,7 @@ func file_proto_prysm_v1alpha1_beacon_block_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_prysm_v1alpha1_beacon_block_proto_rawDesc, NumEnums: 0, - NumMessages: 60, + NumMessages: 68, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/prysm/v1alpha1/beacon_block.proto b/proto/prysm/v1alpha1/beacon_block.proto index d243f96a9fee..684b26534848 100644 --- a/proto/prysm/v1alpha1/beacon_block.proto +++ b/proto/prysm/v1alpha1/beacon_block.proto @@ -63,6 +63,12 @@ message GenericSignedBeaconBlock { // Representing a signed, post-Electra fork blinded beacon block. SignedBlindedBeaconBlockElectra blinded_electra = 10; + + // Representing a signed, post-Fulu fork beacon block content. + SignedBeaconBlockContentsFulu fulu = 11; + + // Representing a signed, post-Fulu fork blinded beacon block. + SignedBlindedBeaconBlockFulu blinded_fulu = 12; } bool is_blinded = 100; reserved 101; // Deprecated fields @@ -99,6 +105,12 @@ message GenericBeaconBlock { // Representing a post-Electra fork blinded beacon block. BlindedBeaconBlockElectra blinded_electra = 10; + + // Representing a post-Fulu fork beacon block content. + BeaconBlockContentsFulu fulu = 11; + + // Representing a post-Fulu fork blinded beacon block. + BlindedBeaconBlockFulu blinded_fulu = 12; } bool is_blinded = 100; string payload_value = 101; @@ -985,4 +997,157 @@ message IndexedAttestationElectra { // 96 bytes aggregate signature. bytes signature = 3 [(ethereum.eth.ext.ssz_size) = "96"]; +} + +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- + +message SignedBeaconBlockContentsFulu { + SignedBeaconBlockFulu block = 1; + repeated bytes kzg_proofs = 2 [(ethereum.eth.ext.ssz_size) = "?,48", (ethereum.eth.ext.ssz_max) = "4096"]; + repeated bytes blobs = 3 [(ethereum.eth.ext.ssz_size) = "?,blob.size", (ethereum.eth.ext.ssz_max) = "4096"]; +} + +message SignedBeaconBlockFulu { + // The unsigned beacon block itself. + BeaconBlockFulu block = 1; + + // 96 byte BLS signature from the validator that produced this block. + bytes signature = 2 [(ethereum.eth.ext.ssz_size) = "96"]; +} + +message BeaconBlockContentsFulu { + BeaconBlockFulu block = 1; + repeated bytes kzg_proofs = 2 [(ethereum.eth.ext.ssz_size) = "?,48", (ethereum.eth.ext.ssz_max) = "4096"]; + repeated bytes blobs = 3 [(ethereum.eth.ext.ssz_size) = "?,blob.size", (ethereum.eth.ext.ssz_max) = "4096"]; +} + +message BeaconBlockFulu { + // Beacon chain slot that this block represents. + uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; + + // Validator index of the validator that proposed the block header. + uint64 proposer_index = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; + + // 32 byte root of the parent block. + bytes parent_root = 3 [(ethereum.eth.ext.ssz_size) = "32"]; + + // 32 byte root of the resulting state after processing this block. + bytes state_root = 4 [(ethereum.eth.ext.ssz_size) = "32"]; + + // The beacon block body. + BeaconBlockBodyFulu body = 5; +} + +message BeaconBlockBodyFulu { + // The validators RANDAO reveal 96 byte value. + bytes randao_reveal = 1 [(ethereum.eth.ext.ssz_size) = "96"]; + + // A reference to the Ethereum 1.x chain. + Eth1Data eth1_data = 2; + + // 32 byte field of arbitrary data. This field may contain any data and + // is not used for anything other than a fun message. + bytes graffiti = 3 [(ethereum.eth.ext.ssz_size) = "32"]; + + // Block operations + // Refer to spec constants at https://github.com/ethereum/consensus-specs/blob/dev/specs/core/0_beacon-chain.md#max-operations-per-block + + // At most MAX_PROPOSER_SLASHINGS. + repeated ProposerSlashing proposer_slashings = 4 [(ethereum.eth.ext.ssz_max) = "16"]; + + // At most MAX_ATTESTER_SLASHINGS_ELECTRA. + repeated AttesterSlashingElectra attester_slashings = 5 [(ethereum.eth.ext.ssz_max) = "1"]; + + // At most MAX_ATTESTATIONS_ELECTRA. + repeated AttestationElectra attestations = 6 [(ethereum.eth.ext.ssz_max) = "8"]; + + // At most MAX_DEPOSITS. + repeated Deposit deposits = 7 [(ethereum.eth.ext.ssz_max) = "16"]; + + // At most MAX_VOLUNTARY_EXITS. + repeated SignedVoluntaryExit voluntary_exits = 8 [(ethereum.eth.ext.ssz_max) = "16"]; + + // Sync aggregate object for the beacon chain to track sync committee votes. + SyncAggregate sync_aggregate = 9; + + // Execution payload from the execution chain. New in Bellatrix network upgrade. + ethereum.engine.v1.ExecutionPayloadDeneb execution_payload = 10; + + // At most MAX_BLS_TO_EXECUTION_CHANGES. New in Capella network upgrade. + repeated SignedBLSToExecutionChange bls_to_execution_changes = 11 [(ethereum.eth.ext.ssz_max) = "16"]; + + // Blob KZG commitments. + repeated bytes blob_kzg_commitments = 12 [(ethereum.eth.ext.ssz_size) = "?,48", (ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"]; + + // Execution requests. + ethereum.engine.v1.ExecutionRequests execution_requests = 13; +} + +message SignedBlindedBeaconBlockFulu { + // The unsigned blinded beacon block itself. + BlindedBeaconBlockFulu message = 1; + + // 96 byte BLS signature from the validator that produced this blinded block. + bytes signature = 2 [(ethereum.eth.ext.ssz_size) = "96"]; +} + +message BlindedBeaconBlockFulu { + // Beacon chain slot that this blinded block represents. + uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; + + // Validator index of the validator that proposed the block header. + uint64 proposer_index = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; + + // 32 byte root of the parent block. + bytes parent_root = 3 [(ethereum.eth.ext.ssz_size) = "32"]; + + // 32 byte root of the resulting state after processing this blinded block. + bytes state_root = 4 [(ethereum.eth.ext.ssz_size) = "32"]; + + // The blinded beacon block body. + BlindedBeaconBlockBodyFulu body = 5; +} + +message BlindedBeaconBlockBodyFulu { + // The validators RANDAO reveal 96 byte value. + bytes randao_reveal = 1 [(ethereum.eth.ext.ssz_size) = "96"]; + + // A reference to the Ethereum 1.x chain. + Eth1Data eth1_data = 2; + + // 32 byte field of arbitrary data. This field may contain any data and + // is not used for anything other than a fun message. + bytes graffiti = 3 [(ethereum.eth.ext.ssz_size) = "32"]; + + // At most MAX_PROPOSER_SLASHINGS. + repeated ProposerSlashing proposer_slashings = 4 [(ethereum.eth.ext.ssz_max) = "16"]; + + // At most MAX_ATTESTER_SLASHINGS_ELECTRA. + repeated AttesterSlashingElectra attester_slashings = 5 [(ethereum.eth.ext.ssz_max) = "1"]; + + // At most MAX_ATTESTATIONS_ELECTRA. + repeated AttestationElectra attestations = 6 [(ethereum.eth.ext.ssz_max) = "8"]; + + // At most MAX_DEPOSITS. + repeated Deposit deposits = 7 [(ethereum.eth.ext.ssz_max) = "16"]; + + // At most MAX_VOLUNTARY_EXITS. + repeated SignedVoluntaryExit voluntary_exits = 8 [(ethereum.eth.ext.ssz_max) = "16"]; + + // Sync aggregate object for the beacon chain to track sync committee votes. + SyncAggregate sync_aggregate = 9; + + // Execution payload header from the execution chain. + ethereum.engine.v1.ExecutionPayloadHeaderDeneb execution_payload_header = 10; + + // At most MAX_BLS_TO_EXECUTION_CHANGES. + repeated SignedBLSToExecutionChange bls_to_execution_changes = 11 [(ethereum.eth.ext.ssz_max) = "16"]; + + // Blob KZG commitments. + repeated bytes blob_kzg_commitments = 12 [(ethereum.eth.ext.ssz_size) = "?,48", (ethereum.eth.ext.ssz_max) = "max_blob_commitments.size"]; + + // Execution requests. + ethereum.engine.v1.ExecutionRequests execution_requests = 13; } \ No newline at end of file diff --git a/proto/prysm/v1alpha1/beacon_state.pb.go b/proto/prysm/v1alpha1/beacon_state.pb.go index 08d07c35ae29..144cc76c18ad 100755 --- a/proto/prysm/v1alpha1/beacon_state.pb.go +++ b/proto/prysm/v1alpha1/beacon_state.pb.go @@ -2287,6 +2287,341 @@ func (x *BeaconStateElectra) GetPendingConsolidations() []*PendingConsolidation return nil } +type BeaconStateFulu struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GenesisTime uint64 `protobuf:"varint,1001,opt,name=genesis_time,json=genesisTime,proto3" json:"genesis_time,omitempty"` + GenesisValidatorsRoot []byte `protobuf:"bytes,1002,opt,name=genesis_validators_root,json=genesisValidatorsRoot,proto3" json:"genesis_validators_root,omitempty" ssz-size:"32"` + Slot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,1003,opt,name=slot,proto3" json:"slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` + Fork *Fork `protobuf:"bytes,1004,opt,name=fork,proto3" json:"fork,omitempty"` + LatestBlockHeader *BeaconBlockHeader `protobuf:"bytes,2001,opt,name=latest_block_header,json=latestBlockHeader,proto3" json:"latest_block_header,omitempty"` + BlockRoots [][]byte `protobuf:"bytes,2002,rep,name=block_roots,json=blockRoots,proto3" json:"block_roots,omitempty" ssz-size:"8192,32"` + StateRoots [][]byte `protobuf:"bytes,2003,rep,name=state_roots,json=stateRoots,proto3" json:"state_roots,omitempty" ssz-size:"8192,32"` + HistoricalRoots [][]byte `protobuf:"bytes,2004,rep,name=historical_roots,json=historicalRoots,proto3" json:"historical_roots,omitempty" ssz-max:"16777216" ssz-size:"?,32"` + Eth1Data *Eth1Data `protobuf:"bytes,3001,opt,name=eth1_data,json=eth1Data,proto3" json:"eth1_data,omitempty"` + Eth1DataVotes []*Eth1Data `protobuf:"bytes,3002,rep,name=eth1_data_votes,json=eth1DataVotes,proto3" json:"eth1_data_votes,omitempty" ssz-max:"2048"` + Eth1DepositIndex uint64 `protobuf:"varint,3003,opt,name=eth1_deposit_index,json=eth1DepositIndex,proto3" json:"eth1_deposit_index,omitempty"` + Validators []*Validator `protobuf:"bytes,4001,rep,name=validators,proto3" json:"validators,omitempty" ssz-max:"1099511627776"` + Balances []uint64 `protobuf:"varint,4002,rep,packed,name=balances,proto3" json:"balances,omitempty" ssz-max:"1099511627776"` + RandaoMixes [][]byte `protobuf:"bytes,5001,rep,name=randao_mixes,json=randaoMixes,proto3" json:"randao_mixes,omitempty" ssz-size:"65536,32"` + Slashings []uint64 `protobuf:"varint,6001,rep,packed,name=slashings,proto3" json:"slashings,omitempty" ssz-size:"8192"` + PreviousEpochParticipation []byte `protobuf:"bytes,7001,opt,name=previous_epoch_participation,json=previousEpochParticipation,proto3" json:"previous_epoch_participation,omitempty" ssz-max:"1099511627776"` + CurrentEpochParticipation []byte `protobuf:"bytes,7002,opt,name=current_epoch_participation,json=currentEpochParticipation,proto3" json:"current_epoch_participation,omitempty" ssz-max:"1099511627776"` + JustificationBits github_com_prysmaticlabs_go_bitfield.Bitvector4 `protobuf:"bytes,8001,opt,name=justification_bits,json=justificationBits,proto3" json:"justification_bits,omitempty" cast-type:"github.com/prysmaticlabs/go-bitfield.Bitvector4" ssz-size:"1"` + PreviousJustifiedCheckpoint *Checkpoint `protobuf:"bytes,8002,opt,name=previous_justified_checkpoint,json=previousJustifiedCheckpoint,proto3" json:"previous_justified_checkpoint,omitempty"` + CurrentJustifiedCheckpoint *Checkpoint `protobuf:"bytes,8003,opt,name=current_justified_checkpoint,json=currentJustifiedCheckpoint,proto3" json:"current_justified_checkpoint,omitempty"` + FinalizedCheckpoint *Checkpoint `protobuf:"bytes,8004,opt,name=finalized_checkpoint,json=finalizedCheckpoint,proto3" json:"finalized_checkpoint,omitempty"` + InactivityScores []uint64 `protobuf:"varint,9001,rep,packed,name=inactivity_scores,json=inactivityScores,proto3" json:"inactivity_scores,omitempty" ssz-max:"1099511627776"` + CurrentSyncCommittee *SyncCommittee `protobuf:"bytes,9002,opt,name=current_sync_committee,json=currentSyncCommittee,proto3" json:"current_sync_committee,omitempty"` + NextSyncCommittee *SyncCommittee `protobuf:"bytes,9003,opt,name=next_sync_committee,json=nextSyncCommittee,proto3" json:"next_sync_committee,omitempty"` + LatestExecutionPayloadHeader *v1.ExecutionPayloadHeaderDeneb `protobuf:"bytes,10001,opt,name=latest_execution_payload_header,json=latestExecutionPayloadHeader,proto3" json:"latest_execution_payload_header,omitempty"` + NextWithdrawalIndex uint64 `protobuf:"varint,11001,opt,name=next_withdrawal_index,json=nextWithdrawalIndex,proto3" json:"next_withdrawal_index,omitempty"` + NextWithdrawalValidatorIndex github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex `protobuf:"varint,11002,opt,name=next_withdrawal_validator_index,json=nextWithdrawalValidatorIndex,proto3" json:"next_withdrawal_validator_index,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"` + HistoricalSummaries []*HistoricalSummary `protobuf:"bytes,11003,rep,name=historical_summaries,json=historicalSummaries,proto3" json:"historical_summaries,omitempty" ssz-max:"16777216"` + DepositRequestsStartIndex uint64 `protobuf:"varint,12001,opt,name=deposit_requests_start_index,json=depositRequestsStartIndex,proto3" json:"deposit_requests_start_index,omitempty"` + DepositBalanceToConsume github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei `protobuf:"varint,12002,opt,name=deposit_balance_to_consume,json=depositBalanceToConsume,proto3" json:"deposit_balance_to_consume,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Gwei"` + ExitBalanceToConsume github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei `protobuf:"varint,12003,opt,name=exit_balance_to_consume,json=exitBalanceToConsume,proto3" json:"exit_balance_to_consume,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Gwei"` + EarliestExitEpoch github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch `protobuf:"varint,12004,opt,name=earliest_exit_epoch,json=earliestExitEpoch,proto3" json:"earliest_exit_epoch,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Epoch"` + ConsolidationBalanceToConsume github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei `protobuf:"varint,12005,opt,name=consolidation_balance_to_consume,json=consolidationBalanceToConsume,proto3" json:"consolidation_balance_to_consume,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Gwei"` + EarliestConsolidationEpoch github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch `protobuf:"varint,12006,opt,name=earliest_consolidation_epoch,json=earliestConsolidationEpoch,proto3" json:"earliest_consolidation_epoch,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Epoch"` + PendingDeposits []*PendingDeposit `protobuf:"bytes,12007,rep,name=pending_deposits,json=pendingDeposits,proto3" json:"pending_deposits,omitempty" ssz-max:"134217728"` + PendingPartialWithdrawals []*PendingPartialWithdrawal `protobuf:"bytes,12008,rep,name=pending_partial_withdrawals,json=pendingPartialWithdrawals,proto3" json:"pending_partial_withdrawals,omitempty" ssz-max:"134217728"` + PendingConsolidations []*PendingConsolidation `protobuf:"bytes,12009,rep,name=pending_consolidations,json=pendingConsolidations,proto3" json:"pending_consolidations,omitempty" ssz-max:"262144"` +} + +func (x *BeaconStateFulu) Reset() { + *x = BeaconStateFulu{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_prysm_v1alpha1_beacon_state_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BeaconStateFulu) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BeaconStateFulu) ProtoMessage() {} + +func (x *BeaconStateFulu) ProtoReflect() protoreflect.Message { + mi := &file_proto_prysm_v1alpha1_beacon_state_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BeaconStateFulu.ProtoReflect.Descriptor instead. +func (*BeaconStateFulu) Descriptor() ([]byte, []int) { + return file_proto_prysm_v1alpha1_beacon_state_proto_rawDescGZIP(), []int{18} +} + +func (x *BeaconStateFulu) GetGenesisTime() uint64 { + if x != nil { + return x.GenesisTime + } + return 0 +} + +func (x *BeaconStateFulu) GetGenesisValidatorsRoot() []byte { + if x != nil { + return x.GenesisValidatorsRoot + } + return nil +} + +func (x *BeaconStateFulu) GetSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { + if x != nil { + return x.Slot + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(0) +} + +func (x *BeaconStateFulu) GetFork() *Fork { + if x != nil { + return x.Fork + } + return nil +} + +func (x *BeaconStateFulu) GetLatestBlockHeader() *BeaconBlockHeader { + if x != nil { + return x.LatestBlockHeader + } + return nil +} + +func (x *BeaconStateFulu) GetBlockRoots() [][]byte { + if x != nil { + return x.BlockRoots + } + return nil +} + +func (x *BeaconStateFulu) GetStateRoots() [][]byte { + if x != nil { + return x.StateRoots + } + return nil +} + +func (x *BeaconStateFulu) GetHistoricalRoots() [][]byte { + if x != nil { + return x.HistoricalRoots + } + return nil +} + +func (x *BeaconStateFulu) GetEth1Data() *Eth1Data { + if x != nil { + return x.Eth1Data + } + return nil +} + +func (x *BeaconStateFulu) GetEth1DataVotes() []*Eth1Data { + if x != nil { + return x.Eth1DataVotes + } + return nil +} + +func (x *BeaconStateFulu) GetEth1DepositIndex() uint64 { + if x != nil { + return x.Eth1DepositIndex + } + return 0 +} + +func (x *BeaconStateFulu) GetValidators() []*Validator { + if x != nil { + return x.Validators + } + return nil +} + +func (x *BeaconStateFulu) GetBalances() []uint64 { + if x != nil { + return x.Balances + } + return nil +} + +func (x *BeaconStateFulu) GetRandaoMixes() [][]byte { + if x != nil { + return x.RandaoMixes + } + return nil +} + +func (x *BeaconStateFulu) GetSlashings() []uint64 { + if x != nil { + return x.Slashings + } + return nil +} + +func (x *BeaconStateFulu) GetPreviousEpochParticipation() []byte { + if x != nil { + return x.PreviousEpochParticipation + } + return nil +} + +func (x *BeaconStateFulu) GetCurrentEpochParticipation() []byte { + if x != nil { + return x.CurrentEpochParticipation + } + return nil +} + +func (x *BeaconStateFulu) GetJustificationBits() github_com_prysmaticlabs_go_bitfield.Bitvector4 { + if x != nil { + return x.JustificationBits + } + return github_com_prysmaticlabs_go_bitfield.Bitvector4(nil) +} + +func (x *BeaconStateFulu) GetPreviousJustifiedCheckpoint() *Checkpoint { + if x != nil { + return x.PreviousJustifiedCheckpoint + } + return nil +} + +func (x *BeaconStateFulu) GetCurrentJustifiedCheckpoint() *Checkpoint { + if x != nil { + return x.CurrentJustifiedCheckpoint + } + return nil +} + +func (x *BeaconStateFulu) GetFinalizedCheckpoint() *Checkpoint { + if x != nil { + return x.FinalizedCheckpoint + } + return nil +} + +func (x *BeaconStateFulu) GetInactivityScores() []uint64 { + if x != nil { + return x.InactivityScores + } + return nil +} + +func (x *BeaconStateFulu) GetCurrentSyncCommittee() *SyncCommittee { + if x != nil { + return x.CurrentSyncCommittee + } + return nil +} + +func (x *BeaconStateFulu) GetNextSyncCommittee() *SyncCommittee { + if x != nil { + return x.NextSyncCommittee + } + return nil +} + +func (x *BeaconStateFulu) GetLatestExecutionPayloadHeader() *v1.ExecutionPayloadHeaderDeneb { + if x != nil { + return x.LatestExecutionPayloadHeader + } + return nil +} + +func (x *BeaconStateFulu) GetNextWithdrawalIndex() uint64 { + if x != nil { + return x.NextWithdrawalIndex + } + return 0 +} + +func (x *BeaconStateFulu) GetNextWithdrawalValidatorIndex() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex { + if x != nil { + return x.NextWithdrawalValidatorIndex + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(0) +} + +func (x *BeaconStateFulu) GetHistoricalSummaries() []*HistoricalSummary { + if x != nil { + return x.HistoricalSummaries + } + return nil +} + +func (x *BeaconStateFulu) GetDepositRequestsStartIndex() uint64 { + if x != nil { + return x.DepositRequestsStartIndex + } + return 0 +} + +func (x *BeaconStateFulu) GetDepositBalanceToConsume() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei { + if x != nil { + return x.DepositBalanceToConsume + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei(0) +} + +func (x *BeaconStateFulu) GetExitBalanceToConsume() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei { + if x != nil { + return x.ExitBalanceToConsume + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei(0) +} + +func (x *BeaconStateFulu) GetEarliestExitEpoch() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch { + if x != nil { + return x.EarliestExitEpoch + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch(0) +} + +func (x *BeaconStateFulu) GetConsolidationBalanceToConsume() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei { + if x != nil { + return x.ConsolidationBalanceToConsume + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei(0) +} + +func (x *BeaconStateFulu) GetEarliestConsolidationEpoch() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch { + if x != nil { + return x.EarliestConsolidationEpoch + } + return github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch(0) +} + +func (x *BeaconStateFulu) GetPendingDeposits() []*PendingDeposit { + if x != nil { + return x.PendingDeposits + } + return nil +} + +func (x *BeaconStateFulu) GetPendingPartialWithdrawals() []*PendingPartialWithdrawal { + if x != nil { + return x.PendingPartialWithdrawals + } + return nil +} + +func (x *BeaconStateFulu) GetPendingConsolidations() []*PendingConsolidation { + if x != nil { + return x.PendingConsolidations + } + return nil +} + var File_proto_prysm_v1alpha1_beacon_state_proto protoreflect.FileDescriptor var file_proto_prysm_v1alpha1_beacon_state_proto_rawDesc = []byte{ @@ -3231,17 +3566,220 @@ var file_proto_prysm_v1alpha1_beacon_state_proto_rawDesc = []byte{ 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x92, 0xb5, 0x18, 0x06, 0x32, 0x36, 0x32, 0x31, 0x34, 0x34, 0x52, 0x15, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x42, 0x9b, 0x01, 0x0a, 0x19, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, - 0x10, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, - 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, - 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x65, 0x74, 0x68, 0xaa, - 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x74, 0x68, 0x2e, 0x56, - 0x31, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x5c, 0x45, 0x74, 0x68, 0x5c, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x22, 0xb6, 0x19, 0x0a, 0x0f, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x46, 0x75, 0x6c, 0x75, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x67, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x17, 0x67, 0x65, 0x6e, + 0x65, 0x73, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, + 0x02, 0x33, 0x32, 0x52, 0x15, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x5a, 0x0a, 0x04, 0x73, 0x6c, + 0x6f, 0x74, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, + 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, + 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, + 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6b, 0x18, 0xec, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6f, + 0x72, 0x6b, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6b, 0x12, 0x59, 0x0a, 0x13, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, + 0xd1, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x52, 0x11, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, + 0x74, 0x73, 0x18, 0xd2, 0x0f, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x0b, 0x8a, 0xb5, 0x18, 0x07, 0x38, + 0x31, 0x39, 0x32, 0x2c, 0x33, 0x32, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, + 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, + 0x73, 0x18, 0xd3, 0x0f, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x0b, 0x8a, 0xb5, 0x18, 0x07, 0x38, 0x31, + 0x39, 0x32, 0x2c, 0x33, 0x32, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, + 0x73, 0x12, 0x40, 0x0a, 0x10, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x18, 0xd4, 0x0f, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x14, 0x8a, 0xb5, + 0x18, 0x04, 0x3f, 0x2c, 0x33, 0x32, 0x92, 0xb5, 0x18, 0x08, 0x31, 0x36, 0x37, 0x37, 0x37, 0x32, + 0x31, 0x36, 0x52, 0x0f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x6f, + 0x6f, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x09, 0x65, 0x74, 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x18, 0xb9, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x65, 0x74, 0x68, 0x31, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x52, 0x0a, 0x0f, 0x65, 0x74, 0x68, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x76, 0x6f, 0x74, 0x65, 0x73, 0x18, 0xba, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, 0x61, 0x42, 0x08, 0x92, + 0xb5, 0x18, 0x04, 0x32, 0x30, 0x34, 0x38, 0x52, 0x0d, 0x65, 0x74, 0x68, 0x31, 0x44, 0x61, 0x74, + 0x61, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x74, 0x68, 0x31, 0x5f, 0x64, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0xbb, 0x17, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x74, 0x68, 0x31, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x54, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x73, 0x18, 0xa1, 0x1f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x11, 0x92, 0xb5, + 0x18, 0x0d, 0x31, 0x30, 0x39, 0x39, 0x35, 0x31, 0x31, 0x36, 0x32, 0x37, 0x37, 0x37, 0x36, 0x52, + 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x08, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0xa2, 0x1f, 0x20, 0x03, 0x28, 0x04, 0x42, 0x11, + 0x92, 0xb5, 0x18, 0x0d, 0x31, 0x30, 0x39, 0x39, 0x35, 0x31, 0x31, 0x36, 0x32, 0x37, 0x37, 0x37, + 0x36, 0x52, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x0c, 0x72, + 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x6d, 0x69, 0x78, 0x65, 0x73, 0x18, 0x89, 0x27, 0x20, 0x03, + 0x28, 0x0c, 0x42, 0x0c, 0x8a, 0xb5, 0x18, 0x08, 0x36, 0x35, 0x35, 0x33, 0x36, 0x2c, 0x33, 0x32, + 0x52, 0x0b, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x4d, 0x69, 0x78, 0x65, 0x73, 0x12, 0x27, 0x0a, + 0x09, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x18, 0xf1, 0x2e, 0x20, 0x03, 0x28, + 0x04, 0x42, 0x08, 0x8a, 0xb5, 0x18, 0x04, 0x38, 0x31, 0x39, 0x32, 0x52, 0x09, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x54, 0x0a, 0x1c, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xd9, 0x36, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x11, 0x92, + 0xb5, 0x18, 0x0d, 0x31, 0x30, 0x39, 0x39, 0x35, 0x31, 0x31, 0x36, 0x32, 0x37, 0x37, 0x37, 0x36, + 0x52, 0x1a, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x1b, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xda, 0x36, 0x20, 0x01, + 0x28, 0x0c, 0x42, 0x11, 0x92, 0xb5, 0x18, 0x0d, 0x31, 0x30, 0x39, 0x39, 0x35, 0x31, 0x31, 0x36, + 0x32, 0x37, 0x37, 0x37, 0x36, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x68, 0x0a, 0x12, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x18, 0xc1, 0x3e, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x38, 0x82, + 0xb5, 0x18, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, + 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x67, 0x6f, 0x2d, 0x62, + 0x69, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x42, 0x69, 0x74, 0x76, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x34, 0x8a, 0xb5, 0x18, 0x01, 0x31, 0x52, 0x11, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x12, 0x66, 0x0a, 0x1d, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0xc2, 0x3e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x1b, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4a, + 0x75, 0x73, 0x74, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6a, 0x75, + 0x73, 0x74, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0xc3, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x1a, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x14, 0x66, 0x69, 0x6e, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x18, 0xc4, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x13, 0x66, 0x69, 0x6e, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x3f, 0x0a, 0x11, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x18, 0xa9, 0x46, 0x20, 0x03, 0x28, 0x04, 0x42, 0x11, 0x92, 0xb5, 0x18, + 0x0d, 0x31, 0x30, 0x39, 0x39, 0x35, 0x31, 0x31, 0x36, 0x32, 0x37, 0x37, 0x37, 0x36, 0x52, 0x10, + 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x12, 0x5b, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x18, 0xaa, 0x46, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x12, 0x55, 0x0a, + 0x13, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x65, 0x18, 0xab, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x65, 0x52, 0x11, 0x6e, 0x65, 0x78, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x65, 0x12, 0x77, 0x0a, 0x1f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x91, 0x4e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x44, 0x65, 0x6e, 0x65, 0x62, 0x52, + 0x1c, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x33, 0x0a, + 0x15, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0xf9, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x6e, + 0x65, 0x78, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x97, 0x01, 0x0a, 0x1f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0xfa, 0x55, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, + 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, + 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, + 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x1c, + 0x6e, 0x65, 0x78, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x6a, 0x0a, 0x14, + 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x69, 0x65, 0x73, 0x18, 0xfb, 0x55, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x0c, 0x92, 0xb5, 0x18, 0x08, 0x31, 0x36, 0x37, 0x37, 0x37, + 0x32, 0x31, 0x36, 0x52, 0x13, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x1c, 0x64, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0xe1, 0x5d, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x19, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x83, 0x01, 0x0a, 0x1a, 0x64, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, + 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x18, 0xe2, 0x5d, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, + 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, + 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x2e, 0x47, 0x77, 0x65, 0x69, 0x52, 0x17, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x12, 0x7d, 0x0a, 0x17, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x18, 0xe3, 0x5d, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, + 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x2e, 0x47, 0x77, 0x65, 0x69, 0x52, 0x14, 0x65, 0x78, 0x69, 0x74, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x12, + 0x77, 0x0a, 0x13, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x74, + 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0xe4, 0x5d, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, + 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, + 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, + 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x11, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, 0x74, 0x45, + 0x78, 0x69, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x8f, 0x01, 0x0a, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x18, 0xe5, 0x5d, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, + 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, + 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x47, 0x77, 0x65, 0x69, 0x52, 0x1d, 0x63, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x1c, 0x65, + 0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0xe6, 0x5d, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, + 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x1a, 0x65, 0x61, 0x72, 0x6c, + 0x69, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x60, 0x0a, 0x10, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0xe7, 0x5d, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x0d, 0x92, 0xb5, 0x18, 0x09, 0x31, 0x33, + 0x34, 0x32, 0x31, 0x37, 0x37, 0x32, 0x38, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x7f, 0x0a, 0x1b, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x18, 0xe8, 0x5d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x42, + 0x0d, 0x92, 0xb5, 0x18, 0x09, 0x31, 0x33, 0x34, 0x32, 0x31, 0x37, 0x37, 0x32, 0x38, 0x52, 0x19, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x6f, 0x0a, 0x16, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0xe9, 0x5d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x92, 0xb5, 0x18, 0x06, 0x32, 0x36, 0x32, + 0x31, 0x34, 0x34, 0x52, 0x15, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x9b, 0x01, 0x0a, 0x19, 0x6f, + 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x10, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, + 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x3b, 0x65, 0x74, 0x68, 0xaa, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x74, 0x68, 0x2e, 0x56, 0x31, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0xca, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x45, 0x74, 0x68, 0x5c, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3256,7 +3794,7 @@ func file_proto_prysm_v1alpha1_beacon_state_proto_rawDescGZIP() []byte { return file_proto_prysm_v1alpha1_beacon_state_proto_rawDescData } -var file_proto_prysm_v1alpha1_beacon_state_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_proto_prysm_v1alpha1_beacon_state_proto_msgTypes = make([]protoimpl.MessageInfo, 19) var file_proto_prysm_v1alpha1_beacon_state_proto_goTypes = []interface{}{ (*BeaconState)(nil), // 0: ethereum.eth.v1alpha1.BeaconState (*Fork)(nil), // 1: ethereum.eth.v1alpha1.Fork @@ -3276,96 +3814,112 @@ var file_proto_prysm_v1alpha1_beacon_state_proto_goTypes = []interface{}{ (*HistoricalSummary)(nil), // 15: ethereum.eth.v1alpha1.HistoricalSummary (*BeaconStateDeneb)(nil), // 16: ethereum.eth.v1alpha1.BeaconStateDeneb (*BeaconStateElectra)(nil), // 17: ethereum.eth.v1alpha1.BeaconStateElectra - (*BeaconBlockHeader)(nil), // 18: ethereum.eth.v1alpha1.BeaconBlockHeader - (*Eth1Data)(nil), // 19: ethereum.eth.v1alpha1.Eth1Data - (*Validator)(nil), // 20: ethereum.eth.v1alpha1.Validator - (*Checkpoint)(nil), // 21: ethereum.eth.v1alpha1.Checkpoint - (*AttestationData)(nil), // 22: ethereum.eth.v1alpha1.AttestationData - (*v1.ExecutionPayloadHeader)(nil), // 23: ethereum.engine.v1.ExecutionPayloadHeader - (*v1.ExecutionPayloadHeaderCapella)(nil), // 24: ethereum.engine.v1.ExecutionPayloadHeaderCapella - (*v1.ExecutionPayloadHeaderDeneb)(nil), // 25: ethereum.engine.v1.ExecutionPayloadHeaderDeneb - (*PendingDeposit)(nil), // 26: ethereum.eth.v1alpha1.PendingDeposit - (*PendingPartialWithdrawal)(nil), // 27: ethereum.eth.v1alpha1.PendingPartialWithdrawal - (*PendingConsolidation)(nil), // 28: ethereum.eth.v1alpha1.PendingConsolidation + (*BeaconStateFulu)(nil), // 18: ethereum.eth.v1alpha1.BeaconStateFulu + (*BeaconBlockHeader)(nil), // 19: ethereum.eth.v1alpha1.BeaconBlockHeader + (*Eth1Data)(nil), // 20: ethereum.eth.v1alpha1.Eth1Data + (*Validator)(nil), // 21: ethereum.eth.v1alpha1.Validator + (*Checkpoint)(nil), // 22: ethereum.eth.v1alpha1.Checkpoint + (*AttestationData)(nil), // 23: ethereum.eth.v1alpha1.AttestationData + (*v1.ExecutionPayloadHeader)(nil), // 24: ethereum.engine.v1.ExecutionPayloadHeader + (*v1.ExecutionPayloadHeaderCapella)(nil), // 25: ethereum.engine.v1.ExecutionPayloadHeaderCapella + (*v1.ExecutionPayloadHeaderDeneb)(nil), // 26: ethereum.engine.v1.ExecutionPayloadHeaderDeneb + (*PendingDeposit)(nil), // 27: ethereum.eth.v1alpha1.PendingDeposit + (*PendingPartialWithdrawal)(nil), // 28: ethereum.eth.v1alpha1.PendingPartialWithdrawal + (*PendingConsolidation)(nil), // 29: ethereum.eth.v1alpha1.PendingConsolidation } var file_proto_prysm_v1alpha1_beacon_state_proto_depIdxs = []int32{ 1, // 0: ethereum.eth.v1alpha1.BeaconState.fork:type_name -> ethereum.eth.v1alpha1.Fork - 18, // 1: ethereum.eth.v1alpha1.BeaconState.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader - 19, // 2: ethereum.eth.v1alpha1.BeaconState.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 19, // 3: ethereum.eth.v1alpha1.BeaconState.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data - 20, // 4: ethereum.eth.v1alpha1.BeaconState.validators:type_name -> ethereum.eth.v1alpha1.Validator + 19, // 1: ethereum.eth.v1alpha1.BeaconState.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader + 20, // 2: ethereum.eth.v1alpha1.BeaconState.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 20, // 3: ethereum.eth.v1alpha1.BeaconState.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data + 21, // 4: ethereum.eth.v1alpha1.BeaconState.validators:type_name -> ethereum.eth.v1alpha1.Validator 2, // 5: ethereum.eth.v1alpha1.BeaconState.previous_epoch_attestations:type_name -> ethereum.eth.v1alpha1.PendingAttestation 2, // 6: ethereum.eth.v1alpha1.BeaconState.current_epoch_attestations:type_name -> ethereum.eth.v1alpha1.PendingAttestation - 21, // 7: ethereum.eth.v1alpha1.BeaconState.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 8: ethereum.eth.v1alpha1.BeaconState.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 9: ethereum.eth.v1alpha1.BeaconState.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 22, // 10: ethereum.eth.v1alpha1.PendingAttestation.data:type_name -> ethereum.eth.v1alpha1.AttestationData + 22, // 7: ethereum.eth.v1alpha1.BeaconState.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 8: ethereum.eth.v1alpha1.BeaconState.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 9: ethereum.eth.v1alpha1.BeaconState.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 23, // 10: ethereum.eth.v1alpha1.PendingAttestation.data:type_name -> ethereum.eth.v1alpha1.AttestationData 1, // 11: ethereum.eth.v1alpha1.CheckPtInfo.fork:type_name -> ethereum.eth.v1alpha1.Fork 1, // 12: ethereum.eth.v1alpha1.BeaconStateAltair.fork:type_name -> ethereum.eth.v1alpha1.Fork - 18, // 13: ethereum.eth.v1alpha1.BeaconStateAltair.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader - 19, // 14: ethereum.eth.v1alpha1.BeaconStateAltair.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 19, // 15: ethereum.eth.v1alpha1.BeaconStateAltair.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data - 20, // 16: ethereum.eth.v1alpha1.BeaconStateAltair.validators:type_name -> ethereum.eth.v1alpha1.Validator - 21, // 17: ethereum.eth.v1alpha1.BeaconStateAltair.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 18: ethereum.eth.v1alpha1.BeaconStateAltair.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 19: ethereum.eth.v1alpha1.BeaconStateAltair.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 19, // 13: ethereum.eth.v1alpha1.BeaconStateAltair.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader + 20, // 14: ethereum.eth.v1alpha1.BeaconStateAltair.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 20, // 15: ethereum.eth.v1alpha1.BeaconStateAltair.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data + 21, // 16: ethereum.eth.v1alpha1.BeaconStateAltair.validators:type_name -> ethereum.eth.v1alpha1.Validator + 22, // 17: ethereum.eth.v1alpha1.BeaconStateAltair.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 18: ethereum.eth.v1alpha1.BeaconStateAltair.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 19: ethereum.eth.v1alpha1.BeaconStateAltair.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint 11, // 20: ethereum.eth.v1alpha1.BeaconStateAltair.current_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee 11, // 21: ethereum.eth.v1alpha1.BeaconStateAltair.next_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee 1, // 22: ethereum.eth.v1alpha1.BeaconStateBellatrix.fork:type_name -> ethereum.eth.v1alpha1.Fork - 18, // 23: ethereum.eth.v1alpha1.BeaconStateBellatrix.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader - 19, // 24: ethereum.eth.v1alpha1.BeaconStateBellatrix.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 19, // 25: ethereum.eth.v1alpha1.BeaconStateBellatrix.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data - 20, // 26: ethereum.eth.v1alpha1.BeaconStateBellatrix.validators:type_name -> ethereum.eth.v1alpha1.Validator - 21, // 27: ethereum.eth.v1alpha1.BeaconStateBellatrix.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 28: ethereum.eth.v1alpha1.BeaconStateBellatrix.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 29: ethereum.eth.v1alpha1.BeaconStateBellatrix.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 19, // 23: ethereum.eth.v1alpha1.BeaconStateBellatrix.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader + 20, // 24: ethereum.eth.v1alpha1.BeaconStateBellatrix.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 20, // 25: ethereum.eth.v1alpha1.BeaconStateBellatrix.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data + 21, // 26: ethereum.eth.v1alpha1.BeaconStateBellatrix.validators:type_name -> ethereum.eth.v1alpha1.Validator + 22, // 27: ethereum.eth.v1alpha1.BeaconStateBellatrix.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 28: ethereum.eth.v1alpha1.BeaconStateBellatrix.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 29: ethereum.eth.v1alpha1.BeaconStateBellatrix.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint 11, // 30: ethereum.eth.v1alpha1.BeaconStateBellatrix.current_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee 11, // 31: ethereum.eth.v1alpha1.BeaconStateBellatrix.next_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee - 23, // 32: ethereum.eth.v1alpha1.BeaconStateBellatrix.latest_execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeader + 24, // 32: ethereum.eth.v1alpha1.BeaconStateBellatrix.latest_execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeader 1, // 33: ethereum.eth.v1alpha1.BeaconStateCapella.fork:type_name -> ethereum.eth.v1alpha1.Fork - 18, // 34: ethereum.eth.v1alpha1.BeaconStateCapella.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader - 19, // 35: ethereum.eth.v1alpha1.BeaconStateCapella.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 19, // 36: ethereum.eth.v1alpha1.BeaconStateCapella.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data - 20, // 37: ethereum.eth.v1alpha1.BeaconStateCapella.validators:type_name -> ethereum.eth.v1alpha1.Validator - 21, // 38: ethereum.eth.v1alpha1.BeaconStateCapella.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 39: ethereum.eth.v1alpha1.BeaconStateCapella.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 40: ethereum.eth.v1alpha1.BeaconStateCapella.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 19, // 34: ethereum.eth.v1alpha1.BeaconStateCapella.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader + 20, // 35: ethereum.eth.v1alpha1.BeaconStateCapella.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 20, // 36: ethereum.eth.v1alpha1.BeaconStateCapella.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data + 21, // 37: ethereum.eth.v1alpha1.BeaconStateCapella.validators:type_name -> ethereum.eth.v1alpha1.Validator + 22, // 38: ethereum.eth.v1alpha1.BeaconStateCapella.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 39: ethereum.eth.v1alpha1.BeaconStateCapella.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 40: ethereum.eth.v1alpha1.BeaconStateCapella.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint 11, // 41: ethereum.eth.v1alpha1.BeaconStateCapella.current_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee 11, // 42: ethereum.eth.v1alpha1.BeaconStateCapella.next_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee - 24, // 43: ethereum.eth.v1alpha1.BeaconStateCapella.latest_execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderCapella + 25, // 43: ethereum.eth.v1alpha1.BeaconStateCapella.latest_execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderCapella 15, // 44: ethereum.eth.v1alpha1.BeaconStateCapella.historical_summaries:type_name -> ethereum.eth.v1alpha1.HistoricalSummary 1, // 45: ethereum.eth.v1alpha1.BeaconStateDeneb.fork:type_name -> ethereum.eth.v1alpha1.Fork - 18, // 46: ethereum.eth.v1alpha1.BeaconStateDeneb.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader - 19, // 47: ethereum.eth.v1alpha1.BeaconStateDeneb.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 19, // 48: ethereum.eth.v1alpha1.BeaconStateDeneb.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data - 20, // 49: ethereum.eth.v1alpha1.BeaconStateDeneb.validators:type_name -> ethereum.eth.v1alpha1.Validator - 21, // 50: ethereum.eth.v1alpha1.BeaconStateDeneb.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 51: ethereum.eth.v1alpha1.BeaconStateDeneb.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 52: ethereum.eth.v1alpha1.BeaconStateDeneb.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 19, // 46: ethereum.eth.v1alpha1.BeaconStateDeneb.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader + 20, // 47: ethereum.eth.v1alpha1.BeaconStateDeneb.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 20, // 48: ethereum.eth.v1alpha1.BeaconStateDeneb.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data + 21, // 49: ethereum.eth.v1alpha1.BeaconStateDeneb.validators:type_name -> ethereum.eth.v1alpha1.Validator + 22, // 50: ethereum.eth.v1alpha1.BeaconStateDeneb.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 51: ethereum.eth.v1alpha1.BeaconStateDeneb.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 52: ethereum.eth.v1alpha1.BeaconStateDeneb.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint 11, // 53: ethereum.eth.v1alpha1.BeaconStateDeneb.current_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee 11, // 54: ethereum.eth.v1alpha1.BeaconStateDeneb.next_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee - 25, // 55: ethereum.eth.v1alpha1.BeaconStateDeneb.latest_execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb + 26, // 55: ethereum.eth.v1alpha1.BeaconStateDeneb.latest_execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb 15, // 56: ethereum.eth.v1alpha1.BeaconStateDeneb.historical_summaries:type_name -> ethereum.eth.v1alpha1.HistoricalSummary 1, // 57: ethereum.eth.v1alpha1.BeaconStateElectra.fork:type_name -> ethereum.eth.v1alpha1.Fork - 18, // 58: ethereum.eth.v1alpha1.BeaconStateElectra.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader - 19, // 59: ethereum.eth.v1alpha1.BeaconStateElectra.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data - 19, // 60: ethereum.eth.v1alpha1.BeaconStateElectra.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data - 20, // 61: ethereum.eth.v1alpha1.BeaconStateElectra.validators:type_name -> ethereum.eth.v1alpha1.Validator - 21, // 62: ethereum.eth.v1alpha1.BeaconStateElectra.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 63: ethereum.eth.v1alpha1.BeaconStateElectra.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint - 21, // 64: ethereum.eth.v1alpha1.BeaconStateElectra.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 19, // 58: ethereum.eth.v1alpha1.BeaconStateElectra.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader + 20, // 59: ethereum.eth.v1alpha1.BeaconStateElectra.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 20, // 60: ethereum.eth.v1alpha1.BeaconStateElectra.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data + 21, // 61: ethereum.eth.v1alpha1.BeaconStateElectra.validators:type_name -> ethereum.eth.v1alpha1.Validator + 22, // 62: ethereum.eth.v1alpha1.BeaconStateElectra.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 63: ethereum.eth.v1alpha1.BeaconStateElectra.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 64: ethereum.eth.v1alpha1.BeaconStateElectra.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint 11, // 65: ethereum.eth.v1alpha1.BeaconStateElectra.current_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee 11, // 66: ethereum.eth.v1alpha1.BeaconStateElectra.next_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee - 25, // 67: ethereum.eth.v1alpha1.BeaconStateElectra.latest_execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb + 26, // 67: ethereum.eth.v1alpha1.BeaconStateElectra.latest_execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb 15, // 68: ethereum.eth.v1alpha1.BeaconStateElectra.historical_summaries:type_name -> ethereum.eth.v1alpha1.HistoricalSummary - 26, // 69: ethereum.eth.v1alpha1.BeaconStateElectra.pending_deposits:type_name -> ethereum.eth.v1alpha1.PendingDeposit - 27, // 70: ethereum.eth.v1alpha1.BeaconStateElectra.pending_partial_withdrawals:type_name -> ethereum.eth.v1alpha1.PendingPartialWithdrawal - 28, // 71: ethereum.eth.v1alpha1.BeaconStateElectra.pending_consolidations:type_name -> ethereum.eth.v1alpha1.PendingConsolidation - 72, // [72:72] is the sub-list for method output_type - 72, // [72:72] is the sub-list for method input_type - 72, // [72:72] is the sub-list for extension type_name - 72, // [72:72] is the sub-list for extension extendee - 0, // [0:72] is the sub-list for field type_name + 27, // 69: ethereum.eth.v1alpha1.BeaconStateElectra.pending_deposits:type_name -> ethereum.eth.v1alpha1.PendingDeposit + 28, // 70: ethereum.eth.v1alpha1.BeaconStateElectra.pending_partial_withdrawals:type_name -> ethereum.eth.v1alpha1.PendingPartialWithdrawal + 29, // 71: ethereum.eth.v1alpha1.BeaconStateElectra.pending_consolidations:type_name -> ethereum.eth.v1alpha1.PendingConsolidation + 1, // 72: ethereum.eth.v1alpha1.BeaconStateFulu.fork:type_name -> ethereum.eth.v1alpha1.Fork + 19, // 73: ethereum.eth.v1alpha1.BeaconStateFulu.latest_block_header:type_name -> ethereum.eth.v1alpha1.BeaconBlockHeader + 20, // 74: ethereum.eth.v1alpha1.BeaconStateFulu.eth1_data:type_name -> ethereum.eth.v1alpha1.Eth1Data + 20, // 75: ethereum.eth.v1alpha1.BeaconStateFulu.eth1_data_votes:type_name -> ethereum.eth.v1alpha1.Eth1Data + 21, // 76: ethereum.eth.v1alpha1.BeaconStateFulu.validators:type_name -> ethereum.eth.v1alpha1.Validator + 22, // 77: ethereum.eth.v1alpha1.BeaconStateFulu.previous_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 78: ethereum.eth.v1alpha1.BeaconStateFulu.current_justified_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 22, // 79: ethereum.eth.v1alpha1.BeaconStateFulu.finalized_checkpoint:type_name -> ethereum.eth.v1alpha1.Checkpoint + 11, // 80: ethereum.eth.v1alpha1.BeaconStateFulu.current_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee + 11, // 81: ethereum.eth.v1alpha1.BeaconStateFulu.next_sync_committee:type_name -> ethereum.eth.v1alpha1.SyncCommittee + 26, // 82: ethereum.eth.v1alpha1.BeaconStateFulu.latest_execution_payload_header:type_name -> ethereum.engine.v1.ExecutionPayloadHeaderDeneb + 15, // 83: ethereum.eth.v1alpha1.BeaconStateFulu.historical_summaries:type_name -> ethereum.eth.v1alpha1.HistoricalSummary + 27, // 84: ethereum.eth.v1alpha1.BeaconStateFulu.pending_deposits:type_name -> ethereum.eth.v1alpha1.PendingDeposit + 28, // 85: ethereum.eth.v1alpha1.BeaconStateFulu.pending_partial_withdrawals:type_name -> ethereum.eth.v1alpha1.PendingPartialWithdrawal + 29, // 86: ethereum.eth.v1alpha1.BeaconStateFulu.pending_consolidations:type_name -> ethereum.eth.v1alpha1.PendingConsolidation + 87, // [87:87] is the sub-list for method output_type + 87, // [87:87] is the sub-list for method input_type + 87, // [87:87] is the sub-list for extension type_name + 87, // [87:87] is the sub-list for extension extendee + 0, // [0:87] is the sub-list for field type_name } func init() { file_proto_prysm_v1alpha1_beacon_state_proto_init() } @@ -3594,6 +4148,18 @@ func file_proto_prysm_v1alpha1_beacon_state_proto_init() { return nil } } + file_proto_prysm_v1alpha1_beacon_state_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BeaconStateFulu); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -3601,7 +4167,7 @@ func file_proto_prysm_v1alpha1_beacon_state_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_prysm_v1alpha1_beacon_state_proto_rawDesc, NumEnums: 0, - NumMessages: 18, + NumMessages: 19, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/prysm/v1alpha1/beacon_state.proto b/proto/prysm/v1alpha1/beacon_state.proto index a26603a71877..398ca4c541e4 100644 --- a/proto/prysm/v1alpha1/beacon_state.proto +++ b/proto/prysm/v1alpha1/beacon_state.proto @@ -381,6 +381,10 @@ message BeaconStateDeneb { repeated HistoricalSummary historical_summaries = 11003 [(ethereum.eth.ext.ssz_max) = "16777216"]; } +// ---------------------------------------------------------------------------- +// Electra +// ---------------------------------------------------------------------------- + message BeaconStateElectra { // Versioning [1001-2000] uint64 genesis_time = 1001; @@ -443,4 +447,72 @@ message BeaconStateElectra { repeated PendingDeposit pending_deposits = 12007 [(ethereum.eth.ext.ssz_max) = "pending_deposits_limit"]; repeated PendingPartialWithdrawal pending_partial_withdrawals = 12008 [(ethereum.eth.ext.ssz_max) = "pending_partial_withdrawals_limit"]; repeated PendingConsolidation pending_consolidations = 12009 [(ethereum.eth.ext.ssz_max) = "pending_consolidations_limit"]; -} \ No newline at end of file +} + +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- + +message BeaconStateFulu { + // Versioning [1001-2000] + uint64 genesis_time = 1001; + bytes genesis_validators_root = 1002 [(ethereum.eth.ext.ssz_size) = "32"]; + uint64 slot = 1003 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; + Fork fork = 1004; + + // History [2001-3000] + BeaconBlockHeader latest_block_header = 2001; + repeated bytes block_roots = 2002 [(ethereum.eth.ext.ssz_size) = "block_roots.size"]; + repeated bytes state_roots = 2003 [(ethereum.eth.ext.ssz_size) = "state_roots.size"]; + repeated bytes historical_roots = 2004 [(ethereum.eth.ext.ssz_size) = "?,32", (ethereum.eth.ext.ssz_max) = "16777216"]; + + // Eth1 [3001-4000] + Eth1Data eth1_data = 3001; + repeated Eth1Data eth1_data_votes = 3002 [(ethereum.eth.ext.ssz_max) = "eth1_data_votes.size"]; + uint64 eth1_deposit_index = 3003; + + // Registry [4001-5000] + repeated Validator validators = 4001 [(ethereum.eth.ext.ssz_max) = "1099511627776"]; + repeated uint64 balances = 4002 [(ethereum.eth.ext.ssz_max) = "1099511627776"]; + + // Randomness [5001-6000] + repeated bytes randao_mixes = 5001 [(ethereum.eth.ext.ssz_size) = "randao_mixes.size"]; + + // Slashings [6001-7000] + repeated uint64 slashings = 6001 [(ethereum.eth.ext.ssz_size) = "slashings.size"]; + + // Participation [7001-8000] + bytes previous_epoch_participation = 7001 [(ethereum.eth.ext.ssz_max) = "1099511627776"]; + bytes current_epoch_participation = 7002 [(ethereum.eth.ext.ssz_max) = "1099511627776"]; + + // Finality [8001-9000] + // Spec type [4]Bitvector which means this would be a fixed size of 4 bits. + bytes justification_bits = 8001 [(ethereum.eth.ext.ssz_size) = "1", (ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/go-bitfield.Bitvector4"]; + Checkpoint previous_justified_checkpoint = 8002; + Checkpoint current_justified_checkpoint = 8003; + Checkpoint finalized_checkpoint = 8004; + + // Fields introduced in Altair fork [9001-10000] + repeated uint64 inactivity_scores = 9001 [(ethereum.eth.ext.ssz_max) = "1099511627776"]; + SyncCommittee current_sync_committee = 9002; + SyncCommittee next_sync_committee = 9003; + + // Fields introduced in Bellatrix fork [10001-11000] + ethereum.engine.v1.ExecutionPayloadHeaderDeneb latest_execution_payload_header = 10001; + + // Fields introduced in Capella fork [11001-12000] + uint64 next_withdrawal_index = 11001; + uint64 next_withdrawal_validator_index = 11002 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.ValidatorIndex"]; + repeated HistoricalSummary historical_summaries = 11003 [(ethereum.eth.ext.ssz_max) = "16777216"]; + + // Fields introduced in EIP-7251 fork [12001-13000] + uint64 deposit_requests_start_index = 12001; + uint64 deposit_balance_to_consume = 12002 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Gwei"]; + uint64 exit_balance_to_consume = 12003 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Gwei"]; + uint64 earliest_exit_epoch = 12004 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Epoch"]; + uint64 consolidation_balance_to_consume = 12005 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Gwei"]; + uint64 earliest_consolidation_epoch = 12006 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Epoch"]; + repeated PendingDeposit pending_deposits = 12007 [(ethereum.eth.ext.ssz_max) = "pending_deposits_limit"]; + repeated PendingPartialWithdrawal pending_partial_withdrawals = 12008 [(ethereum.eth.ext.ssz_max) = "pending_partial_withdrawals_limit"]; + repeated PendingConsolidation pending_consolidations = 12009 [(ethereum.eth.ext.ssz_max) = "pending_consolidations_limit"]; +} diff --git a/proto/prysm/v1alpha1/bellatrix.ssz.go b/proto/prysm/v1alpha1/bellatrix.ssz.go index d5fd6770ceda..c7adfed44990 100644 --- a/proto/prysm/v1alpha1/bellatrix.ssz.go +++ b/proto/prysm/v1alpha1/bellatrix.ssz.go @@ -1,5 +1,4 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: 19e0d83224f9401368a918fce23953593a463933f46cba5de265ac251cbffe27 package eth import ( diff --git a/proto/prysm/v1alpha1/capella.ssz.go b/proto/prysm/v1alpha1/capella.ssz.go index f08edfd251fb..503f6a720fff 100644 --- a/proto/prysm/v1alpha1/capella.ssz.go +++ b/proto/prysm/v1alpha1/capella.ssz.go @@ -1,5 +1,4 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: fad217ca811f238ede552d6184e1a7fd12830baa505fc0c6f7d1b94f88608b5e package eth import ( diff --git a/proto/prysm/v1alpha1/deneb.ssz.go b/proto/prysm/v1alpha1/deneb.ssz.go index c9645f2036ef..4eeab97e97c8 100644 --- a/proto/prysm/v1alpha1/deneb.ssz.go +++ b/proto/prysm/v1alpha1/deneb.ssz.go @@ -1,5 +1,4 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: 4e456db3c9849de6d410f9342c13926561d0b916a1fd7f88dbadd42c2ec5940a package eth import ( diff --git a/proto/prysm/v1alpha1/electra.ssz.go b/proto/prysm/v1alpha1/electra.ssz.go index fb26f46a262c..1029c5cde25a 100644 --- a/proto/prysm/v1alpha1/electra.ssz.go +++ b/proto/prysm/v1alpha1/electra.ssz.go @@ -1,5 +1,4 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: 6582a3511842fe73868eb36ce267780ebe0293eb908d635840d024baee17dd1a package eth import ( diff --git a/proto/prysm/v1alpha1/fulu.ssz.go b/proto/prysm/v1alpha1/fulu.ssz.go index 5d35d079fcb4..e4509d1bcac7 100644 --- a/proto/prysm/v1alpha1/fulu.ssz.go +++ b/proto/prysm/v1alpha1/fulu.ssz.go @@ -1,11 +1,3363 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: bb60e4d1a840dfe780ebb396cca8520a4229ce936c032da71bfb8de0d271aa19 package eth import ( ssz "github.com/prysmaticlabs/fastssz" + github_com_prysmaticlabs_prysm_v5_consensus_types_primitives "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" + v1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" ) +// MarshalSSZ ssz marshals the SignedBeaconBlockContentsFulu object +func (s *SignedBeaconBlockContentsFulu) MarshalSSZ() ([]byte, error) { + return ssz.MarshalSSZ(s) +} + +// MarshalSSZTo ssz marshals the SignedBeaconBlockContentsFulu object to a target array +func (s *SignedBeaconBlockContentsFulu) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + offset := int(12) + + // Offset (0) 'Block' + dst = ssz.WriteOffset(dst, offset) + if s.Block == nil { + s.Block = new(SignedBeaconBlockFulu) + } + offset += s.Block.SizeSSZ() + + // Offset (1) 'KzgProofs' + dst = ssz.WriteOffset(dst, offset) + offset += len(s.KzgProofs) * 48 + + // Offset (2) 'Blobs' + dst = ssz.WriteOffset(dst, offset) + offset += len(s.Blobs) * 131072 + + // Field (0) 'Block' + if dst, err = s.Block.MarshalSSZTo(dst); err != nil { + return + } + + // Field (1) 'KzgProofs' + if size := len(s.KzgProofs); size > 4096 { + err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096) + return + } + for ii := 0; ii < len(s.KzgProofs); ii++ { + if size := len(s.KzgProofs[ii]); size != 48 { + err = ssz.ErrBytesLengthFn("--.KzgProofs[ii]", size, 48) + return + } + dst = append(dst, s.KzgProofs[ii]...) + } + + // Field (2) 'Blobs' + if size := len(s.Blobs); size > 4096 { + err = ssz.ErrListTooBigFn("--.Blobs", size, 4096) + return + } + for ii := 0; ii < len(s.Blobs); ii++ { + if size := len(s.Blobs[ii]); size != 131072 { + err = ssz.ErrBytesLengthFn("--.Blobs[ii]", size, 131072) + return + } + dst = append(dst, s.Blobs[ii]...) + } + + return +} + +// UnmarshalSSZ ssz unmarshals the SignedBeaconBlockContentsFulu object +func (s *SignedBeaconBlockContentsFulu) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 12 { + return ssz.ErrSize + } + + tail := buf + var o0, o1, o2 uint64 + + // Offset (0) 'Block' + if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { + return ssz.ErrOffset + } + + if o0 != 12 { + return ssz.ErrInvalidVariableOffset + } + + // Offset (1) 'KzgProofs' + if o1 = ssz.ReadOffset(buf[4:8]); o1 > size || o0 > o1 { + return ssz.ErrOffset + } + + // Offset (2) 'Blobs' + if o2 = ssz.ReadOffset(buf[8:12]); o2 > size || o1 > o2 { + return ssz.ErrOffset + } + + // Field (0) 'Block' + { + buf = tail[o0:o1] + if s.Block == nil { + s.Block = new(SignedBeaconBlockFulu) + } + if err = s.Block.UnmarshalSSZ(buf); err != nil { + return err + } + } + + // Field (1) 'KzgProofs' + { + buf = tail[o1:o2] + num, err := ssz.DivideInt2(len(buf), 48, 4096) + if err != nil { + return err + } + s.KzgProofs = make([][]byte, num) + for ii := 0; ii < num; ii++ { + if cap(s.KzgProofs[ii]) == 0 { + s.KzgProofs[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48])) + } + s.KzgProofs[ii] = append(s.KzgProofs[ii], buf[ii*48:(ii+1)*48]...) + } + } + + // Field (2) 'Blobs' + { + buf = tail[o2:] + num, err := ssz.DivideInt2(len(buf), 131072, 4096) + if err != nil { + return err + } + s.Blobs = make([][]byte, num) + for ii := 0; ii < num; ii++ { + if cap(s.Blobs[ii]) == 0 { + s.Blobs[ii] = make([]byte, 0, len(buf[ii*131072:(ii+1)*131072])) + } + s.Blobs[ii] = append(s.Blobs[ii], buf[ii*131072:(ii+1)*131072]...) + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the SignedBeaconBlockContentsFulu object +func (s *SignedBeaconBlockContentsFulu) SizeSSZ() (size int) { + size = 12 + + // Field (0) 'Block' + if s.Block == nil { + s.Block = new(SignedBeaconBlockFulu) + } + size += s.Block.SizeSSZ() + + // Field (1) 'KzgProofs' + size += len(s.KzgProofs) * 48 + + // Field (2) 'Blobs' + size += len(s.Blobs) * 131072 + + return +} + +// HashTreeRoot ssz hashes the SignedBeaconBlockContentsFulu object +func (s *SignedBeaconBlockContentsFulu) HashTreeRoot() ([32]byte, error) { + return ssz.HashWithDefaultHasher(s) +} + +// HashTreeRootWith ssz hashes the SignedBeaconBlockContentsFulu object with a hasher +func (s *SignedBeaconBlockContentsFulu) HashTreeRootWith(hh *ssz.Hasher) (err error) { + indx := hh.Index() + + // Field (0) 'Block' + if err = s.Block.HashTreeRootWith(hh); err != nil { + return + } + + // Field (1) 'KzgProofs' + { + if size := len(s.KzgProofs); size > 4096 { + err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096) + return + } + subIndx := hh.Index() + for _, i := range s.KzgProofs { + if len(i) != 48 { + err = ssz.ErrBytesLength + return + } + hh.PutBytes(i) + } + + numItems := uint64(len(s.KzgProofs)) + hh.MerkleizeWithMixin(subIndx, numItems, 4096) + } + + // Field (2) 'Blobs' + { + if size := len(s.Blobs); size > 4096 { + err = ssz.ErrListTooBigFn("--.Blobs", size, 4096) + return + } + subIndx := hh.Index() + for _, i := range s.Blobs { + if len(i) != 131072 { + err = ssz.ErrBytesLength + return + } + hh.PutBytes(i) + } + + numItems := uint64(len(s.Blobs)) + hh.MerkleizeWithMixin(subIndx, numItems, 4096) + } + + hh.Merkleize(indx) + return +} + +// MarshalSSZ ssz marshals the SignedBeaconBlockFulu object +func (s *SignedBeaconBlockFulu) MarshalSSZ() ([]byte, error) { + return ssz.MarshalSSZ(s) +} + +// MarshalSSZTo ssz marshals the SignedBeaconBlockFulu object to a target array +func (s *SignedBeaconBlockFulu) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + offset := int(100) + + // Offset (0) 'Block' + dst = ssz.WriteOffset(dst, offset) + if s.Block == nil { + s.Block = new(BeaconBlockFulu) + } + offset += s.Block.SizeSSZ() + + // Field (1) 'Signature' + if size := len(s.Signature); size != 96 { + err = ssz.ErrBytesLengthFn("--.Signature", size, 96) + return + } + dst = append(dst, s.Signature...) + + // Field (0) 'Block' + if dst, err = s.Block.MarshalSSZTo(dst); err != nil { + return + } + + return +} + +// UnmarshalSSZ ssz unmarshals the SignedBeaconBlockFulu object +func (s *SignedBeaconBlockFulu) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 100 { + return ssz.ErrSize + } + + tail := buf + var o0 uint64 + + // Offset (0) 'Block' + if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { + return ssz.ErrOffset + } + + if o0 != 100 { + return ssz.ErrInvalidVariableOffset + } + + // Field (1) 'Signature' + if cap(s.Signature) == 0 { + s.Signature = make([]byte, 0, len(buf[4:100])) + } + s.Signature = append(s.Signature, buf[4:100]...) + + // Field (0) 'Block' + { + buf = tail[o0:] + if s.Block == nil { + s.Block = new(BeaconBlockFulu) + } + if err = s.Block.UnmarshalSSZ(buf); err != nil { + return err + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the SignedBeaconBlockFulu object +func (s *SignedBeaconBlockFulu) SizeSSZ() (size int) { + size = 100 + + // Field (0) 'Block' + if s.Block == nil { + s.Block = new(BeaconBlockFulu) + } + size += s.Block.SizeSSZ() + + return +} + +// HashTreeRoot ssz hashes the SignedBeaconBlockFulu object +func (s *SignedBeaconBlockFulu) HashTreeRoot() ([32]byte, error) { + return ssz.HashWithDefaultHasher(s) +} + +// HashTreeRootWith ssz hashes the SignedBeaconBlockFulu object with a hasher +func (s *SignedBeaconBlockFulu) HashTreeRootWith(hh *ssz.Hasher) (err error) { + indx := hh.Index() + + // Field (0) 'Block' + if err = s.Block.HashTreeRootWith(hh); err != nil { + return + } + + // Field (1) 'Signature' + if size := len(s.Signature); size != 96 { + err = ssz.ErrBytesLengthFn("--.Signature", size, 96) + return + } + hh.PutBytes(s.Signature) + + hh.Merkleize(indx) + return +} + +// MarshalSSZ ssz marshals the BeaconBlockContentsFulu object +func (b *BeaconBlockContentsFulu) MarshalSSZ() ([]byte, error) { + return ssz.MarshalSSZ(b) +} + +// MarshalSSZTo ssz marshals the BeaconBlockContentsFulu object to a target array +func (b *BeaconBlockContentsFulu) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + offset := int(12) + + // Offset (0) 'Block' + dst = ssz.WriteOffset(dst, offset) + if b.Block == nil { + b.Block = new(BeaconBlockFulu) + } + offset += b.Block.SizeSSZ() + + // Offset (1) 'KzgProofs' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.KzgProofs) * 48 + + // Offset (2) 'Blobs' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.Blobs) * 131072 + + // Field (0) 'Block' + if dst, err = b.Block.MarshalSSZTo(dst); err != nil { + return + } + + // Field (1) 'KzgProofs' + if size := len(b.KzgProofs); size > 4096 { + err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096) + return + } + for ii := 0; ii < len(b.KzgProofs); ii++ { + if size := len(b.KzgProofs[ii]); size != 48 { + err = ssz.ErrBytesLengthFn("--.KzgProofs[ii]", size, 48) + return + } + dst = append(dst, b.KzgProofs[ii]...) + } + + // Field (2) 'Blobs' + if size := len(b.Blobs); size > 4096 { + err = ssz.ErrListTooBigFn("--.Blobs", size, 4096) + return + } + for ii := 0; ii < len(b.Blobs); ii++ { + if size := len(b.Blobs[ii]); size != 131072 { + err = ssz.ErrBytesLengthFn("--.Blobs[ii]", size, 131072) + return + } + dst = append(dst, b.Blobs[ii]...) + } + + return +} + +// UnmarshalSSZ ssz unmarshals the BeaconBlockContentsFulu object +func (b *BeaconBlockContentsFulu) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 12 { + return ssz.ErrSize + } + + tail := buf + var o0, o1, o2 uint64 + + // Offset (0) 'Block' + if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { + return ssz.ErrOffset + } + + if o0 != 12 { + return ssz.ErrInvalidVariableOffset + } + + // Offset (1) 'KzgProofs' + if o1 = ssz.ReadOffset(buf[4:8]); o1 > size || o0 > o1 { + return ssz.ErrOffset + } + + // Offset (2) 'Blobs' + if o2 = ssz.ReadOffset(buf[8:12]); o2 > size || o1 > o2 { + return ssz.ErrOffset + } + + // Field (0) 'Block' + { + buf = tail[o0:o1] + if b.Block == nil { + b.Block = new(BeaconBlockFulu) + } + if err = b.Block.UnmarshalSSZ(buf); err != nil { + return err + } + } + + // Field (1) 'KzgProofs' + { + buf = tail[o1:o2] + num, err := ssz.DivideInt2(len(buf), 48, 4096) + if err != nil { + return err + } + b.KzgProofs = make([][]byte, num) + for ii := 0; ii < num; ii++ { + if cap(b.KzgProofs[ii]) == 0 { + b.KzgProofs[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48])) + } + b.KzgProofs[ii] = append(b.KzgProofs[ii], buf[ii*48:(ii+1)*48]...) + } + } + + // Field (2) 'Blobs' + { + buf = tail[o2:] + num, err := ssz.DivideInt2(len(buf), 131072, 4096) + if err != nil { + return err + } + b.Blobs = make([][]byte, num) + for ii := 0; ii < num; ii++ { + if cap(b.Blobs[ii]) == 0 { + b.Blobs[ii] = make([]byte, 0, len(buf[ii*131072:(ii+1)*131072])) + } + b.Blobs[ii] = append(b.Blobs[ii], buf[ii*131072:(ii+1)*131072]...) + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockContentsFulu object +func (b *BeaconBlockContentsFulu) SizeSSZ() (size int) { + size = 12 + + // Field (0) 'Block' + if b.Block == nil { + b.Block = new(BeaconBlockFulu) + } + size += b.Block.SizeSSZ() + + // Field (1) 'KzgProofs' + size += len(b.KzgProofs) * 48 + + // Field (2) 'Blobs' + size += len(b.Blobs) * 131072 + + return +} + +// HashTreeRoot ssz hashes the BeaconBlockContentsFulu object +func (b *BeaconBlockContentsFulu) HashTreeRoot() ([32]byte, error) { + return ssz.HashWithDefaultHasher(b) +} + +// HashTreeRootWith ssz hashes the BeaconBlockContentsFulu object with a hasher +func (b *BeaconBlockContentsFulu) HashTreeRootWith(hh *ssz.Hasher) (err error) { + indx := hh.Index() + + // Field (0) 'Block' + if err = b.Block.HashTreeRootWith(hh); err != nil { + return + } + + // Field (1) 'KzgProofs' + { + if size := len(b.KzgProofs); size > 4096 { + err = ssz.ErrListTooBigFn("--.KzgProofs", size, 4096) + return + } + subIndx := hh.Index() + for _, i := range b.KzgProofs { + if len(i) != 48 { + err = ssz.ErrBytesLength + return + } + hh.PutBytes(i) + } + + numItems := uint64(len(b.KzgProofs)) + hh.MerkleizeWithMixin(subIndx, numItems, 4096) + } + + // Field (2) 'Blobs' + { + if size := len(b.Blobs); size > 4096 { + err = ssz.ErrListTooBigFn("--.Blobs", size, 4096) + return + } + subIndx := hh.Index() + for _, i := range b.Blobs { + if len(i) != 131072 { + err = ssz.ErrBytesLength + return + } + hh.PutBytes(i) + } + + numItems := uint64(len(b.Blobs)) + hh.MerkleizeWithMixin(subIndx, numItems, 4096) + } + + hh.Merkleize(indx) + return +} + +// MarshalSSZ ssz marshals the BeaconBlockFulu object +func (b *BeaconBlockFulu) MarshalSSZ() ([]byte, error) { + return ssz.MarshalSSZ(b) +} + +// MarshalSSZTo ssz marshals the BeaconBlockFulu object to a target array +func (b *BeaconBlockFulu) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + offset := int(84) + + // Field (0) 'Slot' + dst = ssz.MarshalUint64(dst, uint64(b.Slot)) + + // Field (1) 'ProposerIndex' + dst = ssz.MarshalUint64(dst, uint64(b.ProposerIndex)) + + // Field (2) 'ParentRoot' + if size := len(b.ParentRoot); size != 32 { + err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) + return + } + dst = append(dst, b.ParentRoot...) + + // Field (3) 'StateRoot' + if size := len(b.StateRoot); size != 32 { + err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) + return + } + dst = append(dst, b.StateRoot...) + + // Offset (4) 'Body' + dst = ssz.WriteOffset(dst, offset) + if b.Body == nil { + b.Body = new(BeaconBlockBodyFulu) + } + offset += b.Body.SizeSSZ() + + // Field (4) 'Body' + if dst, err = b.Body.MarshalSSZTo(dst); err != nil { + return + } + + return +} + +// UnmarshalSSZ ssz unmarshals the BeaconBlockFulu object +func (b *BeaconBlockFulu) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 84 { + return ssz.ErrSize + } + + tail := buf + var o4 uint64 + + // Field (0) 'Slot' + b.Slot = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[0:8])) + + // Field (1) 'ProposerIndex' + b.ProposerIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[8:16])) + + // Field (2) 'ParentRoot' + if cap(b.ParentRoot) == 0 { + b.ParentRoot = make([]byte, 0, len(buf[16:48])) + } + b.ParentRoot = append(b.ParentRoot, buf[16:48]...) + + // Field (3) 'StateRoot' + if cap(b.StateRoot) == 0 { + b.StateRoot = make([]byte, 0, len(buf[48:80])) + } + b.StateRoot = append(b.StateRoot, buf[48:80]...) + + // Offset (4) 'Body' + if o4 = ssz.ReadOffset(buf[80:84]); o4 > size { + return ssz.ErrOffset + } + + if o4 != 84 { + return ssz.ErrInvalidVariableOffset + } + + // Field (4) 'Body' + { + buf = tail[o4:] + if b.Body == nil { + b.Body = new(BeaconBlockBodyFulu) + } + if err = b.Body.UnmarshalSSZ(buf); err != nil { + return err + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockFulu object +func (b *BeaconBlockFulu) SizeSSZ() (size int) { + size = 84 + + // Field (4) 'Body' + if b.Body == nil { + b.Body = new(BeaconBlockBodyFulu) + } + size += b.Body.SizeSSZ() + + return +} + +// HashTreeRoot ssz hashes the BeaconBlockFulu object +func (b *BeaconBlockFulu) HashTreeRoot() ([32]byte, error) { + return ssz.HashWithDefaultHasher(b) +} + +// HashTreeRootWith ssz hashes the BeaconBlockFulu object with a hasher +func (b *BeaconBlockFulu) HashTreeRootWith(hh *ssz.Hasher) (err error) { + indx := hh.Index() + + // Field (0) 'Slot' + hh.PutUint64(uint64(b.Slot)) + + // Field (1) 'ProposerIndex' + hh.PutUint64(uint64(b.ProposerIndex)) + + // Field (2) 'ParentRoot' + if size := len(b.ParentRoot); size != 32 { + err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) + return + } + hh.PutBytes(b.ParentRoot) + + // Field (3) 'StateRoot' + if size := len(b.StateRoot); size != 32 { + err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) + return + } + hh.PutBytes(b.StateRoot) + + // Field (4) 'Body' + if err = b.Body.HashTreeRootWith(hh); err != nil { + return + } + + hh.Merkleize(indx) + return +} + +// MarshalSSZ ssz marshals the BeaconBlockBodyFulu object +func (b *BeaconBlockBodyFulu) MarshalSSZ() ([]byte, error) { + return ssz.MarshalSSZ(b) +} + +// MarshalSSZTo ssz marshals the BeaconBlockBodyFulu object to a target array +func (b *BeaconBlockBodyFulu) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + offset := int(396) + + // Field (0) 'RandaoReveal' + if size := len(b.RandaoReveal); size != 96 { + err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) + return + } + dst = append(dst, b.RandaoReveal...) + + // Field (1) 'Eth1Data' + if b.Eth1Data == nil { + b.Eth1Data = new(Eth1Data) + } + if dst, err = b.Eth1Data.MarshalSSZTo(dst); err != nil { + return + } + + // Field (2) 'Graffiti' + if size := len(b.Graffiti); size != 32 { + err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) + return + } + dst = append(dst, b.Graffiti...) + + // Offset (3) 'ProposerSlashings' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.ProposerSlashings) * 416 + + // Offset (4) 'AttesterSlashings' + dst = ssz.WriteOffset(dst, offset) + for ii := 0; ii < len(b.AttesterSlashings); ii++ { + offset += 4 + offset += b.AttesterSlashings[ii].SizeSSZ() + } + + // Offset (5) 'Attestations' + dst = ssz.WriteOffset(dst, offset) + for ii := 0; ii < len(b.Attestations); ii++ { + offset += 4 + offset += b.Attestations[ii].SizeSSZ() + } + + // Offset (6) 'Deposits' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.Deposits) * 1240 + + // Offset (7) 'VoluntaryExits' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.VoluntaryExits) * 112 + + // Field (8) 'SyncAggregate' + if b.SyncAggregate == nil { + b.SyncAggregate = new(SyncAggregate) + } + if dst, err = b.SyncAggregate.MarshalSSZTo(dst); err != nil { + return + } + + // Offset (9) 'ExecutionPayload' + dst = ssz.WriteOffset(dst, offset) + if b.ExecutionPayload == nil { + b.ExecutionPayload = new(v1.ExecutionPayloadDeneb) + } + offset += b.ExecutionPayload.SizeSSZ() + + // Offset (10) 'BlsToExecutionChanges' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.BlsToExecutionChanges) * 172 + + // Offset (11) 'BlobKzgCommitments' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.BlobKzgCommitments) * 48 + + // Offset (12) 'ExecutionRequests' + dst = ssz.WriteOffset(dst, offset) + if b.ExecutionRequests == nil { + b.ExecutionRequests = new(v1.ExecutionRequests) + } + offset += b.ExecutionRequests.SizeSSZ() + + // Field (3) 'ProposerSlashings' + if size := len(b.ProposerSlashings); size > 16 { + err = ssz.ErrListTooBigFn("--.ProposerSlashings", size, 16) + return + } + for ii := 0; ii < len(b.ProposerSlashings); ii++ { + if dst, err = b.ProposerSlashings[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (4) 'AttesterSlashings' + if size := len(b.AttesterSlashings); size > 1 { + err = ssz.ErrListTooBigFn("--.AttesterSlashings", size, 1) + return + } + { + offset = 4 * len(b.AttesterSlashings) + for ii := 0; ii < len(b.AttesterSlashings); ii++ { + dst = ssz.WriteOffset(dst, offset) + offset += b.AttesterSlashings[ii].SizeSSZ() + } + } + for ii := 0; ii < len(b.AttesterSlashings); ii++ { + if dst, err = b.AttesterSlashings[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (5) 'Attestations' + if size := len(b.Attestations); size > 8 { + err = ssz.ErrListTooBigFn("--.Attestations", size, 8) + return + } + { + offset = 4 * len(b.Attestations) + for ii := 0; ii < len(b.Attestations); ii++ { + dst = ssz.WriteOffset(dst, offset) + offset += b.Attestations[ii].SizeSSZ() + } + } + for ii := 0; ii < len(b.Attestations); ii++ { + if dst, err = b.Attestations[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (6) 'Deposits' + if size := len(b.Deposits); size > 16 { + err = ssz.ErrListTooBigFn("--.Deposits", size, 16) + return + } + for ii := 0; ii < len(b.Deposits); ii++ { + if dst, err = b.Deposits[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (7) 'VoluntaryExits' + if size := len(b.VoluntaryExits); size > 16 { + err = ssz.ErrListTooBigFn("--.VoluntaryExits", size, 16) + return + } + for ii := 0; ii < len(b.VoluntaryExits); ii++ { + if dst, err = b.VoluntaryExits[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (9) 'ExecutionPayload' + if dst, err = b.ExecutionPayload.MarshalSSZTo(dst); err != nil { + return + } + + // Field (10) 'BlsToExecutionChanges' + if size := len(b.BlsToExecutionChanges); size > 16 { + err = ssz.ErrListTooBigFn("--.BlsToExecutionChanges", size, 16) + return + } + for ii := 0; ii < len(b.BlsToExecutionChanges); ii++ { + if dst, err = b.BlsToExecutionChanges[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (11) 'BlobKzgCommitments' + if size := len(b.BlobKzgCommitments); size > 4096 { + err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096) + return + } + for ii := 0; ii < len(b.BlobKzgCommitments); ii++ { + if size := len(b.BlobKzgCommitments[ii]); size != 48 { + err = ssz.ErrBytesLengthFn("--.BlobKzgCommitments[ii]", size, 48) + return + } + dst = append(dst, b.BlobKzgCommitments[ii]...) + } + + // Field (12) 'ExecutionRequests' + if dst, err = b.ExecutionRequests.MarshalSSZTo(dst); err != nil { + return + } + + return +} + +// UnmarshalSSZ ssz unmarshals the BeaconBlockBodyFulu object +func (b *BeaconBlockBodyFulu) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 396 { + return ssz.ErrSize + } + + tail := buf + var o3, o4, o5, o6, o7, o9, o10, o11, o12 uint64 + + // Field (0) 'RandaoReveal' + if cap(b.RandaoReveal) == 0 { + b.RandaoReveal = make([]byte, 0, len(buf[0:96])) + } + b.RandaoReveal = append(b.RandaoReveal, buf[0:96]...) + + // Field (1) 'Eth1Data' + if b.Eth1Data == nil { + b.Eth1Data = new(Eth1Data) + } + if err = b.Eth1Data.UnmarshalSSZ(buf[96:168]); err != nil { + return err + } + + // Field (2) 'Graffiti' + if cap(b.Graffiti) == 0 { + b.Graffiti = make([]byte, 0, len(buf[168:200])) + } + b.Graffiti = append(b.Graffiti, buf[168:200]...) + + // Offset (3) 'ProposerSlashings' + if o3 = ssz.ReadOffset(buf[200:204]); o3 > size { + return ssz.ErrOffset + } + + if o3 != 396 { + return ssz.ErrInvalidVariableOffset + } + + // Offset (4) 'AttesterSlashings' + if o4 = ssz.ReadOffset(buf[204:208]); o4 > size || o3 > o4 { + return ssz.ErrOffset + } + + // Offset (5) 'Attestations' + if o5 = ssz.ReadOffset(buf[208:212]); o5 > size || o4 > o5 { + return ssz.ErrOffset + } + + // Offset (6) 'Deposits' + if o6 = ssz.ReadOffset(buf[212:216]); o6 > size || o5 > o6 { + return ssz.ErrOffset + } + + // Offset (7) 'VoluntaryExits' + if o7 = ssz.ReadOffset(buf[216:220]); o7 > size || o6 > o7 { + return ssz.ErrOffset + } + + // Field (8) 'SyncAggregate' + if b.SyncAggregate == nil { + b.SyncAggregate = new(SyncAggregate) + } + if err = b.SyncAggregate.UnmarshalSSZ(buf[220:380]); err != nil { + return err + } + + // Offset (9) 'ExecutionPayload' + if o9 = ssz.ReadOffset(buf[380:384]); o9 > size || o7 > o9 { + return ssz.ErrOffset + } + + // Offset (10) 'BlsToExecutionChanges' + if o10 = ssz.ReadOffset(buf[384:388]); o10 > size || o9 > o10 { + return ssz.ErrOffset + } + + // Offset (11) 'BlobKzgCommitments' + if o11 = ssz.ReadOffset(buf[388:392]); o11 > size || o10 > o11 { + return ssz.ErrOffset + } + + // Offset (12) 'ExecutionRequests' + if o12 = ssz.ReadOffset(buf[392:396]); o12 > size || o11 > o12 { + return ssz.ErrOffset + } + + // Field (3) 'ProposerSlashings' + { + buf = tail[o3:o4] + num, err := ssz.DivideInt2(len(buf), 416, 16) + if err != nil { + return err + } + b.ProposerSlashings = make([]*ProposerSlashing, num) + for ii := 0; ii < num; ii++ { + if b.ProposerSlashings[ii] == nil { + b.ProposerSlashings[ii] = new(ProposerSlashing) + } + if err = b.ProposerSlashings[ii].UnmarshalSSZ(buf[ii*416 : (ii+1)*416]); err != nil { + return err + } + } + } + + // Field (4) 'AttesterSlashings' + { + buf = tail[o4:o5] + num, err := ssz.DecodeDynamicLength(buf, 1) + if err != nil { + return err + } + b.AttesterSlashings = make([]*AttesterSlashingElectra, num) + err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { + if b.AttesterSlashings[indx] == nil { + b.AttesterSlashings[indx] = new(AttesterSlashingElectra) + } + if err = b.AttesterSlashings[indx].UnmarshalSSZ(buf); err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + } + + // Field (5) 'Attestations' + { + buf = tail[o5:o6] + num, err := ssz.DecodeDynamicLength(buf, 8) + if err != nil { + return err + } + b.Attestations = make([]*AttestationElectra, num) + err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { + if b.Attestations[indx] == nil { + b.Attestations[indx] = new(AttestationElectra) + } + if err = b.Attestations[indx].UnmarshalSSZ(buf); err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + } + + // Field (6) 'Deposits' + { + buf = tail[o6:o7] + num, err := ssz.DivideInt2(len(buf), 1240, 16) + if err != nil { + return err + } + b.Deposits = make([]*Deposit, num) + for ii := 0; ii < num; ii++ { + if b.Deposits[ii] == nil { + b.Deposits[ii] = new(Deposit) + } + if err = b.Deposits[ii].UnmarshalSSZ(buf[ii*1240 : (ii+1)*1240]); err != nil { + return err + } + } + } + + // Field (7) 'VoluntaryExits' + { + buf = tail[o7:o9] + num, err := ssz.DivideInt2(len(buf), 112, 16) + if err != nil { + return err + } + b.VoluntaryExits = make([]*SignedVoluntaryExit, num) + for ii := 0; ii < num; ii++ { + if b.VoluntaryExits[ii] == nil { + b.VoluntaryExits[ii] = new(SignedVoluntaryExit) + } + if err = b.VoluntaryExits[ii].UnmarshalSSZ(buf[ii*112 : (ii+1)*112]); err != nil { + return err + } + } + } + + // Field (9) 'ExecutionPayload' + { + buf = tail[o9:o10] + if b.ExecutionPayload == nil { + b.ExecutionPayload = new(v1.ExecutionPayloadDeneb) + } + if err = b.ExecutionPayload.UnmarshalSSZ(buf); err != nil { + return err + } + } + + // Field (10) 'BlsToExecutionChanges' + { + buf = tail[o10:o11] + num, err := ssz.DivideInt2(len(buf), 172, 16) + if err != nil { + return err + } + b.BlsToExecutionChanges = make([]*SignedBLSToExecutionChange, num) + for ii := 0; ii < num; ii++ { + if b.BlsToExecutionChanges[ii] == nil { + b.BlsToExecutionChanges[ii] = new(SignedBLSToExecutionChange) + } + if err = b.BlsToExecutionChanges[ii].UnmarshalSSZ(buf[ii*172 : (ii+1)*172]); err != nil { + return err + } + } + } + + // Field (11) 'BlobKzgCommitments' + { + buf = tail[o11:o12] + num, err := ssz.DivideInt2(len(buf), 48, 4096) + if err != nil { + return err + } + b.BlobKzgCommitments = make([][]byte, num) + for ii := 0; ii < num; ii++ { + if cap(b.BlobKzgCommitments[ii]) == 0 { + b.BlobKzgCommitments[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48])) + } + b.BlobKzgCommitments[ii] = append(b.BlobKzgCommitments[ii], buf[ii*48:(ii+1)*48]...) + } + } + + // Field (12) 'ExecutionRequests' + { + buf = tail[o12:] + if b.ExecutionRequests == nil { + b.ExecutionRequests = new(v1.ExecutionRequests) + } + if err = b.ExecutionRequests.UnmarshalSSZ(buf); err != nil { + return err + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the BeaconBlockBodyFulu object +func (b *BeaconBlockBodyFulu) SizeSSZ() (size int) { + size = 396 + + // Field (3) 'ProposerSlashings' + size += len(b.ProposerSlashings) * 416 + + // Field (4) 'AttesterSlashings' + for ii := 0; ii < len(b.AttesterSlashings); ii++ { + size += 4 + size += b.AttesterSlashings[ii].SizeSSZ() + } + + // Field (5) 'Attestations' + for ii := 0; ii < len(b.Attestations); ii++ { + size += 4 + size += b.Attestations[ii].SizeSSZ() + } + + // Field (6) 'Deposits' + size += len(b.Deposits) * 1240 + + // Field (7) 'VoluntaryExits' + size += len(b.VoluntaryExits) * 112 + + // Field (9) 'ExecutionPayload' + if b.ExecutionPayload == nil { + b.ExecutionPayload = new(v1.ExecutionPayloadDeneb) + } + size += b.ExecutionPayload.SizeSSZ() + + // Field (10) 'BlsToExecutionChanges' + size += len(b.BlsToExecutionChanges) * 172 + + // Field (11) 'BlobKzgCommitments' + size += len(b.BlobKzgCommitments) * 48 + + // Field (12) 'ExecutionRequests' + if b.ExecutionRequests == nil { + b.ExecutionRequests = new(v1.ExecutionRequests) + } + size += b.ExecutionRequests.SizeSSZ() + + return +} + +// HashTreeRoot ssz hashes the BeaconBlockBodyFulu object +func (b *BeaconBlockBodyFulu) HashTreeRoot() ([32]byte, error) { + return ssz.HashWithDefaultHasher(b) +} + +// HashTreeRootWith ssz hashes the BeaconBlockBodyFulu object with a hasher +func (b *BeaconBlockBodyFulu) HashTreeRootWith(hh *ssz.Hasher) (err error) { + indx := hh.Index() + + // Field (0) 'RandaoReveal' + if size := len(b.RandaoReveal); size != 96 { + err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) + return + } + hh.PutBytes(b.RandaoReveal) + + // Field (1) 'Eth1Data' + if err = b.Eth1Data.HashTreeRootWith(hh); err != nil { + return + } + + // Field (2) 'Graffiti' + if size := len(b.Graffiti); size != 32 { + err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) + return + } + hh.PutBytes(b.Graffiti) + + // Field (3) 'ProposerSlashings' + { + subIndx := hh.Index() + num := uint64(len(b.ProposerSlashings)) + if num > 16 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.ProposerSlashings { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 16) + } + + // Field (4) 'AttesterSlashings' + { + subIndx := hh.Index() + num := uint64(len(b.AttesterSlashings)) + if num > 1 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.AttesterSlashings { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 1) + } + + // Field (5) 'Attestations' + { + subIndx := hh.Index() + num := uint64(len(b.Attestations)) + if num > 8 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.Attestations { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 8) + } + + // Field (6) 'Deposits' + { + subIndx := hh.Index() + num := uint64(len(b.Deposits)) + if num > 16 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.Deposits { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 16) + } + + // Field (7) 'VoluntaryExits' + { + subIndx := hh.Index() + num := uint64(len(b.VoluntaryExits)) + if num > 16 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.VoluntaryExits { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 16) + } + + // Field (8) 'SyncAggregate' + if err = b.SyncAggregate.HashTreeRootWith(hh); err != nil { + return + } + + // Field (9) 'ExecutionPayload' + if err = b.ExecutionPayload.HashTreeRootWith(hh); err != nil { + return + } + + // Field (10) 'BlsToExecutionChanges' + { + subIndx := hh.Index() + num := uint64(len(b.BlsToExecutionChanges)) + if num > 16 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.BlsToExecutionChanges { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 16) + } + + // Field (11) 'BlobKzgCommitments' + { + if size := len(b.BlobKzgCommitments); size > 4096 { + err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096) + return + } + subIndx := hh.Index() + for _, i := range b.BlobKzgCommitments { + if len(i) != 48 { + err = ssz.ErrBytesLength + return + } + hh.PutBytes(i) + } + + numItems := uint64(len(b.BlobKzgCommitments)) + hh.MerkleizeWithMixin(subIndx, numItems, 4096) + } + + // Field (12) 'ExecutionRequests' + if err = b.ExecutionRequests.HashTreeRootWith(hh); err != nil { + return + } + + hh.Merkleize(indx) + return +} + +// MarshalSSZ ssz marshals the SignedBlindedBeaconBlockFulu object +func (s *SignedBlindedBeaconBlockFulu) MarshalSSZ() ([]byte, error) { + return ssz.MarshalSSZ(s) +} + +// MarshalSSZTo ssz marshals the SignedBlindedBeaconBlockFulu object to a target array +func (s *SignedBlindedBeaconBlockFulu) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + offset := int(100) + + // Offset (0) 'Message' + dst = ssz.WriteOffset(dst, offset) + if s.Message == nil { + s.Message = new(BlindedBeaconBlockFulu) + } + offset += s.Message.SizeSSZ() + + // Field (1) 'Signature' + if size := len(s.Signature); size != 96 { + err = ssz.ErrBytesLengthFn("--.Signature", size, 96) + return + } + dst = append(dst, s.Signature...) + + // Field (0) 'Message' + if dst, err = s.Message.MarshalSSZTo(dst); err != nil { + return + } + + return +} + +// UnmarshalSSZ ssz unmarshals the SignedBlindedBeaconBlockFulu object +func (s *SignedBlindedBeaconBlockFulu) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 100 { + return ssz.ErrSize + } + + tail := buf + var o0 uint64 + + // Offset (0) 'Message' + if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { + return ssz.ErrOffset + } + + if o0 != 100 { + return ssz.ErrInvalidVariableOffset + } + + // Field (1) 'Signature' + if cap(s.Signature) == 0 { + s.Signature = make([]byte, 0, len(buf[4:100])) + } + s.Signature = append(s.Signature, buf[4:100]...) + + // Field (0) 'Message' + { + buf = tail[o0:] + if s.Message == nil { + s.Message = new(BlindedBeaconBlockFulu) + } + if err = s.Message.UnmarshalSSZ(buf); err != nil { + return err + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the SignedBlindedBeaconBlockFulu object +func (s *SignedBlindedBeaconBlockFulu) SizeSSZ() (size int) { + size = 100 + + // Field (0) 'Message' + if s.Message == nil { + s.Message = new(BlindedBeaconBlockFulu) + } + size += s.Message.SizeSSZ() + + return +} + +// HashTreeRoot ssz hashes the SignedBlindedBeaconBlockFulu object +func (s *SignedBlindedBeaconBlockFulu) HashTreeRoot() ([32]byte, error) { + return ssz.HashWithDefaultHasher(s) +} + +// HashTreeRootWith ssz hashes the SignedBlindedBeaconBlockFulu object with a hasher +func (s *SignedBlindedBeaconBlockFulu) HashTreeRootWith(hh *ssz.Hasher) (err error) { + indx := hh.Index() + + // Field (0) 'Message' + if err = s.Message.HashTreeRootWith(hh); err != nil { + return + } + + // Field (1) 'Signature' + if size := len(s.Signature); size != 96 { + err = ssz.ErrBytesLengthFn("--.Signature", size, 96) + return + } + hh.PutBytes(s.Signature) + + hh.Merkleize(indx) + return +} + +// MarshalSSZ ssz marshals the BlindedBeaconBlockFulu object +func (b *BlindedBeaconBlockFulu) MarshalSSZ() ([]byte, error) { + return ssz.MarshalSSZ(b) +} + +// MarshalSSZTo ssz marshals the BlindedBeaconBlockFulu object to a target array +func (b *BlindedBeaconBlockFulu) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + offset := int(84) + + // Field (0) 'Slot' + dst = ssz.MarshalUint64(dst, uint64(b.Slot)) + + // Field (1) 'ProposerIndex' + dst = ssz.MarshalUint64(dst, uint64(b.ProposerIndex)) + + // Field (2) 'ParentRoot' + if size := len(b.ParentRoot); size != 32 { + err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) + return + } + dst = append(dst, b.ParentRoot...) + + // Field (3) 'StateRoot' + if size := len(b.StateRoot); size != 32 { + err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) + return + } + dst = append(dst, b.StateRoot...) + + // Offset (4) 'Body' + dst = ssz.WriteOffset(dst, offset) + if b.Body == nil { + b.Body = new(BlindedBeaconBlockBodyFulu) + } + offset += b.Body.SizeSSZ() + + // Field (4) 'Body' + if dst, err = b.Body.MarshalSSZTo(dst); err != nil { + return + } + + return +} + +// UnmarshalSSZ ssz unmarshals the BlindedBeaconBlockFulu object +func (b *BlindedBeaconBlockFulu) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 84 { + return ssz.ErrSize + } + + tail := buf + var o4 uint64 + + // Field (0) 'Slot' + b.Slot = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[0:8])) + + // Field (1) 'ProposerIndex' + b.ProposerIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[8:16])) + + // Field (2) 'ParentRoot' + if cap(b.ParentRoot) == 0 { + b.ParentRoot = make([]byte, 0, len(buf[16:48])) + } + b.ParentRoot = append(b.ParentRoot, buf[16:48]...) + + // Field (3) 'StateRoot' + if cap(b.StateRoot) == 0 { + b.StateRoot = make([]byte, 0, len(buf[48:80])) + } + b.StateRoot = append(b.StateRoot, buf[48:80]...) + + // Offset (4) 'Body' + if o4 = ssz.ReadOffset(buf[80:84]); o4 > size { + return ssz.ErrOffset + } + + if o4 != 84 { + return ssz.ErrInvalidVariableOffset + } + + // Field (4) 'Body' + { + buf = tail[o4:] + if b.Body == nil { + b.Body = new(BlindedBeaconBlockBodyFulu) + } + if err = b.Body.UnmarshalSSZ(buf); err != nil { + return err + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the BlindedBeaconBlockFulu object +func (b *BlindedBeaconBlockFulu) SizeSSZ() (size int) { + size = 84 + + // Field (4) 'Body' + if b.Body == nil { + b.Body = new(BlindedBeaconBlockBodyFulu) + } + size += b.Body.SizeSSZ() + + return +} + +// HashTreeRoot ssz hashes the BlindedBeaconBlockFulu object +func (b *BlindedBeaconBlockFulu) HashTreeRoot() ([32]byte, error) { + return ssz.HashWithDefaultHasher(b) +} + +// HashTreeRootWith ssz hashes the BlindedBeaconBlockFulu object with a hasher +func (b *BlindedBeaconBlockFulu) HashTreeRootWith(hh *ssz.Hasher) (err error) { + indx := hh.Index() + + // Field (0) 'Slot' + hh.PutUint64(uint64(b.Slot)) + + // Field (1) 'ProposerIndex' + hh.PutUint64(uint64(b.ProposerIndex)) + + // Field (2) 'ParentRoot' + if size := len(b.ParentRoot); size != 32 { + err = ssz.ErrBytesLengthFn("--.ParentRoot", size, 32) + return + } + hh.PutBytes(b.ParentRoot) + + // Field (3) 'StateRoot' + if size := len(b.StateRoot); size != 32 { + err = ssz.ErrBytesLengthFn("--.StateRoot", size, 32) + return + } + hh.PutBytes(b.StateRoot) + + // Field (4) 'Body' + if err = b.Body.HashTreeRootWith(hh); err != nil { + return + } + + hh.Merkleize(indx) + return +} + +// MarshalSSZ ssz marshals the BlindedBeaconBlockBodyFulu object +func (b *BlindedBeaconBlockBodyFulu) MarshalSSZ() ([]byte, error) { + return ssz.MarshalSSZ(b) +} + +// MarshalSSZTo ssz marshals the BlindedBeaconBlockBodyFulu object to a target array +func (b *BlindedBeaconBlockBodyFulu) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + offset := int(396) + + // Field (0) 'RandaoReveal' + if size := len(b.RandaoReveal); size != 96 { + err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) + return + } + dst = append(dst, b.RandaoReveal...) + + // Field (1) 'Eth1Data' + if b.Eth1Data == nil { + b.Eth1Data = new(Eth1Data) + } + if dst, err = b.Eth1Data.MarshalSSZTo(dst); err != nil { + return + } + + // Field (2) 'Graffiti' + if size := len(b.Graffiti); size != 32 { + err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) + return + } + dst = append(dst, b.Graffiti...) + + // Offset (3) 'ProposerSlashings' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.ProposerSlashings) * 416 + + // Offset (4) 'AttesterSlashings' + dst = ssz.WriteOffset(dst, offset) + for ii := 0; ii < len(b.AttesterSlashings); ii++ { + offset += 4 + offset += b.AttesterSlashings[ii].SizeSSZ() + } + + // Offset (5) 'Attestations' + dst = ssz.WriteOffset(dst, offset) + for ii := 0; ii < len(b.Attestations); ii++ { + offset += 4 + offset += b.Attestations[ii].SizeSSZ() + } + + // Offset (6) 'Deposits' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.Deposits) * 1240 + + // Offset (7) 'VoluntaryExits' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.VoluntaryExits) * 112 + + // Field (8) 'SyncAggregate' + if b.SyncAggregate == nil { + b.SyncAggregate = new(SyncAggregate) + } + if dst, err = b.SyncAggregate.MarshalSSZTo(dst); err != nil { + return + } + + // Offset (9) 'ExecutionPayloadHeader' + dst = ssz.WriteOffset(dst, offset) + if b.ExecutionPayloadHeader == nil { + b.ExecutionPayloadHeader = new(v1.ExecutionPayloadHeaderDeneb) + } + offset += b.ExecutionPayloadHeader.SizeSSZ() + + // Offset (10) 'BlsToExecutionChanges' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.BlsToExecutionChanges) * 172 + + // Offset (11) 'BlobKzgCommitments' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.BlobKzgCommitments) * 48 + + // Offset (12) 'ExecutionRequests' + dst = ssz.WriteOffset(dst, offset) + if b.ExecutionRequests == nil { + b.ExecutionRequests = new(v1.ExecutionRequests) + } + offset += b.ExecutionRequests.SizeSSZ() + + // Field (3) 'ProposerSlashings' + if size := len(b.ProposerSlashings); size > 16 { + err = ssz.ErrListTooBigFn("--.ProposerSlashings", size, 16) + return + } + for ii := 0; ii < len(b.ProposerSlashings); ii++ { + if dst, err = b.ProposerSlashings[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (4) 'AttesterSlashings' + if size := len(b.AttesterSlashings); size > 1 { + err = ssz.ErrListTooBigFn("--.AttesterSlashings", size, 1) + return + } + { + offset = 4 * len(b.AttesterSlashings) + for ii := 0; ii < len(b.AttesterSlashings); ii++ { + dst = ssz.WriteOffset(dst, offset) + offset += b.AttesterSlashings[ii].SizeSSZ() + } + } + for ii := 0; ii < len(b.AttesterSlashings); ii++ { + if dst, err = b.AttesterSlashings[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (5) 'Attestations' + if size := len(b.Attestations); size > 8 { + err = ssz.ErrListTooBigFn("--.Attestations", size, 8) + return + } + { + offset = 4 * len(b.Attestations) + for ii := 0; ii < len(b.Attestations); ii++ { + dst = ssz.WriteOffset(dst, offset) + offset += b.Attestations[ii].SizeSSZ() + } + } + for ii := 0; ii < len(b.Attestations); ii++ { + if dst, err = b.Attestations[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (6) 'Deposits' + if size := len(b.Deposits); size > 16 { + err = ssz.ErrListTooBigFn("--.Deposits", size, 16) + return + } + for ii := 0; ii < len(b.Deposits); ii++ { + if dst, err = b.Deposits[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (7) 'VoluntaryExits' + if size := len(b.VoluntaryExits); size > 16 { + err = ssz.ErrListTooBigFn("--.VoluntaryExits", size, 16) + return + } + for ii := 0; ii < len(b.VoluntaryExits); ii++ { + if dst, err = b.VoluntaryExits[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (9) 'ExecutionPayloadHeader' + if dst, err = b.ExecutionPayloadHeader.MarshalSSZTo(dst); err != nil { + return + } + + // Field (10) 'BlsToExecutionChanges' + if size := len(b.BlsToExecutionChanges); size > 16 { + err = ssz.ErrListTooBigFn("--.BlsToExecutionChanges", size, 16) + return + } + for ii := 0; ii < len(b.BlsToExecutionChanges); ii++ { + if dst, err = b.BlsToExecutionChanges[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (11) 'BlobKzgCommitments' + if size := len(b.BlobKzgCommitments); size > 4096 { + err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096) + return + } + for ii := 0; ii < len(b.BlobKzgCommitments); ii++ { + if size := len(b.BlobKzgCommitments[ii]); size != 48 { + err = ssz.ErrBytesLengthFn("--.BlobKzgCommitments[ii]", size, 48) + return + } + dst = append(dst, b.BlobKzgCommitments[ii]...) + } + + // Field (12) 'ExecutionRequests' + if dst, err = b.ExecutionRequests.MarshalSSZTo(dst); err != nil { + return + } + + return +} + +// UnmarshalSSZ ssz unmarshals the BlindedBeaconBlockBodyFulu object +func (b *BlindedBeaconBlockBodyFulu) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 396 { + return ssz.ErrSize + } + + tail := buf + var o3, o4, o5, o6, o7, o9, o10, o11, o12 uint64 + + // Field (0) 'RandaoReveal' + if cap(b.RandaoReveal) == 0 { + b.RandaoReveal = make([]byte, 0, len(buf[0:96])) + } + b.RandaoReveal = append(b.RandaoReveal, buf[0:96]...) + + // Field (1) 'Eth1Data' + if b.Eth1Data == nil { + b.Eth1Data = new(Eth1Data) + } + if err = b.Eth1Data.UnmarshalSSZ(buf[96:168]); err != nil { + return err + } + + // Field (2) 'Graffiti' + if cap(b.Graffiti) == 0 { + b.Graffiti = make([]byte, 0, len(buf[168:200])) + } + b.Graffiti = append(b.Graffiti, buf[168:200]...) + + // Offset (3) 'ProposerSlashings' + if o3 = ssz.ReadOffset(buf[200:204]); o3 > size { + return ssz.ErrOffset + } + + if o3 != 396 { + return ssz.ErrInvalidVariableOffset + } + + // Offset (4) 'AttesterSlashings' + if o4 = ssz.ReadOffset(buf[204:208]); o4 > size || o3 > o4 { + return ssz.ErrOffset + } + + // Offset (5) 'Attestations' + if o5 = ssz.ReadOffset(buf[208:212]); o5 > size || o4 > o5 { + return ssz.ErrOffset + } + + // Offset (6) 'Deposits' + if o6 = ssz.ReadOffset(buf[212:216]); o6 > size || o5 > o6 { + return ssz.ErrOffset + } + + // Offset (7) 'VoluntaryExits' + if o7 = ssz.ReadOffset(buf[216:220]); o7 > size || o6 > o7 { + return ssz.ErrOffset + } + + // Field (8) 'SyncAggregate' + if b.SyncAggregate == nil { + b.SyncAggregate = new(SyncAggregate) + } + if err = b.SyncAggregate.UnmarshalSSZ(buf[220:380]); err != nil { + return err + } + + // Offset (9) 'ExecutionPayloadHeader' + if o9 = ssz.ReadOffset(buf[380:384]); o9 > size || o7 > o9 { + return ssz.ErrOffset + } + + // Offset (10) 'BlsToExecutionChanges' + if o10 = ssz.ReadOffset(buf[384:388]); o10 > size || o9 > o10 { + return ssz.ErrOffset + } + + // Offset (11) 'BlobKzgCommitments' + if o11 = ssz.ReadOffset(buf[388:392]); o11 > size || o10 > o11 { + return ssz.ErrOffset + } + + // Offset (12) 'ExecutionRequests' + if o12 = ssz.ReadOffset(buf[392:396]); o12 > size || o11 > o12 { + return ssz.ErrOffset + } + + // Field (3) 'ProposerSlashings' + { + buf = tail[o3:o4] + num, err := ssz.DivideInt2(len(buf), 416, 16) + if err != nil { + return err + } + b.ProposerSlashings = make([]*ProposerSlashing, num) + for ii := 0; ii < num; ii++ { + if b.ProposerSlashings[ii] == nil { + b.ProposerSlashings[ii] = new(ProposerSlashing) + } + if err = b.ProposerSlashings[ii].UnmarshalSSZ(buf[ii*416 : (ii+1)*416]); err != nil { + return err + } + } + } + + // Field (4) 'AttesterSlashings' + { + buf = tail[o4:o5] + num, err := ssz.DecodeDynamicLength(buf, 1) + if err != nil { + return err + } + b.AttesterSlashings = make([]*AttesterSlashingElectra, num) + err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { + if b.AttesterSlashings[indx] == nil { + b.AttesterSlashings[indx] = new(AttesterSlashingElectra) + } + if err = b.AttesterSlashings[indx].UnmarshalSSZ(buf); err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + } + + // Field (5) 'Attestations' + { + buf = tail[o5:o6] + num, err := ssz.DecodeDynamicLength(buf, 8) + if err != nil { + return err + } + b.Attestations = make([]*AttestationElectra, num) + err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { + if b.Attestations[indx] == nil { + b.Attestations[indx] = new(AttestationElectra) + } + if err = b.Attestations[indx].UnmarshalSSZ(buf); err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + } + + // Field (6) 'Deposits' + { + buf = tail[o6:o7] + num, err := ssz.DivideInt2(len(buf), 1240, 16) + if err != nil { + return err + } + b.Deposits = make([]*Deposit, num) + for ii := 0; ii < num; ii++ { + if b.Deposits[ii] == nil { + b.Deposits[ii] = new(Deposit) + } + if err = b.Deposits[ii].UnmarshalSSZ(buf[ii*1240 : (ii+1)*1240]); err != nil { + return err + } + } + } + + // Field (7) 'VoluntaryExits' + { + buf = tail[o7:o9] + num, err := ssz.DivideInt2(len(buf), 112, 16) + if err != nil { + return err + } + b.VoluntaryExits = make([]*SignedVoluntaryExit, num) + for ii := 0; ii < num; ii++ { + if b.VoluntaryExits[ii] == nil { + b.VoluntaryExits[ii] = new(SignedVoluntaryExit) + } + if err = b.VoluntaryExits[ii].UnmarshalSSZ(buf[ii*112 : (ii+1)*112]); err != nil { + return err + } + } + } + + // Field (9) 'ExecutionPayloadHeader' + { + buf = tail[o9:o10] + if b.ExecutionPayloadHeader == nil { + b.ExecutionPayloadHeader = new(v1.ExecutionPayloadHeaderDeneb) + } + if err = b.ExecutionPayloadHeader.UnmarshalSSZ(buf); err != nil { + return err + } + } + + // Field (10) 'BlsToExecutionChanges' + { + buf = tail[o10:o11] + num, err := ssz.DivideInt2(len(buf), 172, 16) + if err != nil { + return err + } + b.BlsToExecutionChanges = make([]*SignedBLSToExecutionChange, num) + for ii := 0; ii < num; ii++ { + if b.BlsToExecutionChanges[ii] == nil { + b.BlsToExecutionChanges[ii] = new(SignedBLSToExecutionChange) + } + if err = b.BlsToExecutionChanges[ii].UnmarshalSSZ(buf[ii*172 : (ii+1)*172]); err != nil { + return err + } + } + } + + // Field (11) 'BlobKzgCommitments' + { + buf = tail[o11:o12] + num, err := ssz.DivideInt2(len(buf), 48, 4096) + if err != nil { + return err + } + b.BlobKzgCommitments = make([][]byte, num) + for ii := 0; ii < num; ii++ { + if cap(b.BlobKzgCommitments[ii]) == 0 { + b.BlobKzgCommitments[ii] = make([]byte, 0, len(buf[ii*48:(ii+1)*48])) + } + b.BlobKzgCommitments[ii] = append(b.BlobKzgCommitments[ii], buf[ii*48:(ii+1)*48]...) + } + } + + // Field (12) 'ExecutionRequests' + { + buf = tail[o12:] + if b.ExecutionRequests == nil { + b.ExecutionRequests = new(v1.ExecutionRequests) + } + if err = b.ExecutionRequests.UnmarshalSSZ(buf); err != nil { + return err + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the BlindedBeaconBlockBodyFulu object +func (b *BlindedBeaconBlockBodyFulu) SizeSSZ() (size int) { + size = 396 + + // Field (3) 'ProposerSlashings' + size += len(b.ProposerSlashings) * 416 + + // Field (4) 'AttesterSlashings' + for ii := 0; ii < len(b.AttesterSlashings); ii++ { + size += 4 + size += b.AttesterSlashings[ii].SizeSSZ() + } + + // Field (5) 'Attestations' + for ii := 0; ii < len(b.Attestations); ii++ { + size += 4 + size += b.Attestations[ii].SizeSSZ() + } + + // Field (6) 'Deposits' + size += len(b.Deposits) * 1240 + + // Field (7) 'VoluntaryExits' + size += len(b.VoluntaryExits) * 112 + + // Field (9) 'ExecutionPayloadHeader' + if b.ExecutionPayloadHeader == nil { + b.ExecutionPayloadHeader = new(v1.ExecutionPayloadHeaderDeneb) + } + size += b.ExecutionPayloadHeader.SizeSSZ() + + // Field (10) 'BlsToExecutionChanges' + size += len(b.BlsToExecutionChanges) * 172 + + // Field (11) 'BlobKzgCommitments' + size += len(b.BlobKzgCommitments) * 48 + + // Field (12) 'ExecutionRequests' + if b.ExecutionRequests == nil { + b.ExecutionRequests = new(v1.ExecutionRequests) + } + size += b.ExecutionRequests.SizeSSZ() + + return +} + +// HashTreeRoot ssz hashes the BlindedBeaconBlockBodyFulu object +func (b *BlindedBeaconBlockBodyFulu) HashTreeRoot() ([32]byte, error) { + return ssz.HashWithDefaultHasher(b) +} + +// HashTreeRootWith ssz hashes the BlindedBeaconBlockBodyFulu object with a hasher +func (b *BlindedBeaconBlockBodyFulu) HashTreeRootWith(hh *ssz.Hasher) (err error) { + indx := hh.Index() + + // Field (0) 'RandaoReveal' + if size := len(b.RandaoReveal); size != 96 { + err = ssz.ErrBytesLengthFn("--.RandaoReveal", size, 96) + return + } + hh.PutBytes(b.RandaoReveal) + + // Field (1) 'Eth1Data' + if err = b.Eth1Data.HashTreeRootWith(hh); err != nil { + return + } + + // Field (2) 'Graffiti' + if size := len(b.Graffiti); size != 32 { + err = ssz.ErrBytesLengthFn("--.Graffiti", size, 32) + return + } + hh.PutBytes(b.Graffiti) + + // Field (3) 'ProposerSlashings' + { + subIndx := hh.Index() + num := uint64(len(b.ProposerSlashings)) + if num > 16 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.ProposerSlashings { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 16) + } + + // Field (4) 'AttesterSlashings' + { + subIndx := hh.Index() + num := uint64(len(b.AttesterSlashings)) + if num > 1 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.AttesterSlashings { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 1) + } + + // Field (5) 'Attestations' + { + subIndx := hh.Index() + num := uint64(len(b.Attestations)) + if num > 8 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.Attestations { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 8) + } + + // Field (6) 'Deposits' + { + subIndx := hh.Index() + num := uint64(len(b.Deposits)) + if num > 16 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.Deposits { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 16) + } + + // Field (7) 'VoluntaryExits' + { + subIndx := hh.Index() + num := uint64(len(b.VoluntaryExits)) + if num > 16 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.VoluntaryExits { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 16) + } + + // Field (8) 'SyncAggregate' + if err = b.SyncAggregate.HashTreeRootWith(hh); err != nil { + return + } + + // Field (9) 'ExecutionPayloadHeader' + if err = b.ExecutionPayloadHeader.HashTreeRootWith(hh); err != nil { + return + } + + // Field (10) 'BlsToExecutionChanges' + { + subIndx := hh.Index() + num := uint64(len(b.BlsToExecutionChanges)) + if num > 16 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.BlsToExecutionChanges { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 16) + } + + // Field (11) 'BlobKzgCommitments' + { + if size := len(b.BlobKzgCommitments); size > 4096 { + err = ssz.ErrListTooBigFn("--.BlobKzgCommitments", size, 4096) + return + } + subIndx := hh.Index() + for _, i := range b.BlobKzgCommitments { + if len(i) != 48 { + err = ssz.ErrBytesLength + return + } + hh.PutBytes(i) + } + + numItems := uint64(len(b.BlobKzgCommitments)) + hh.MerkleizeWithMixin(subIndx, numItems, 4096) + } + + // Field (12) 'ExecutionRequests' + if err = b.ExecutionRequests.HashTreeRootWith(hh); err != nil { + return + } + + hh.Merkleize(indx) + return +} + +// MarshalSSZ ssz marshals the BeaconStateFulu object +func (b *BeaconStateFulu) MarshalSSZ() ([]byte, error) { + return ssz.MarshalSSZ(b) +} + +// MarshalSSZTo ssz marshals the BeaconStateFulu object to a target array +func (b *BeaconStateFulu) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + offset := int(2736713) + + // Field (0) 'GenesisTime' + dst = ssz.MarshalUint64(dst, b.GenesisTime) + + // Field (1) 'GenesisValidatorsRoot' + if size := len(b.GenesisValidatorsRoot); size != 32 { + err = ssz.ErrBytesLengthFn("--.GenesisValidatorsRoot", size, 32) + return + } + dst = append(dst, b.GenesisValidatorsRoot...) + + // Field (2) 'Slot' + dst = ssz.MarshalUint64(dst, uint64(b.Slot)) + + // Field (3) 'Fork' + if b.Fork == nil { + b.Fork = new(Fork) + } + if dst, err = b.Fork.MarshalSSZTo(dst); err != nil { + return + } + + // Field (4) 'LatestBlockHeader' + if b.LatestBlockHeader == nil { + b.LatestBlockHeader = new(BeaconBlockHeader) + } + if dst, err = b.LatestBlockHeader.MarshalSSZTo(dst); err != nil { + return + } + + // Field (5) 'BlockRoots' + if size := len(b.BlockRoots); size != 8192 { + err = ssz.ErrVectorLengthFn("--.BlockRoots", size, 8192) + return + } + for ii := 0; ii < 8192; ii++ { + if size := len(b.BlockRoots[ii]); size != 32 { + err = ssz.ErrBytesLengthFn("--.BlockRoots[ii]", size, 32) + return + } + dst = append(dst, b.BlockRoots[ii]...) + } + + // Field (6) 'StateRoots' + if size := len(b.StateRoots); size != 8192 { + err = ssz.ErrVectorLengthFn("--.StateRoots", size, 8192) + return + } + for ii := 0; ii < 8192; ii++ { + if size := len(b.StateRoots[ii]); size != 32 { + err = ssz.ErrBytesLengthFn("--.StateRoots[ii]", size, 32) + return + } + dst = append(dst, b.StateRoots[ii]...) + } + + // Offset (7) 'HistoricalRoots' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.HistoricalRoots) * 32 + + // Field (8) 'Eth1Data' + if b.Eth1Data == nil { + b.Eth1Data = new(Eth1Data) + } + if dst, err = b.Eth1Data.MarshalSSZTo(dst); err != nil { + return + } + + // Offset (9) 'Eth1DataVotes' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.Eth1DataVotes) * 72 + + // Field (10) 'Eth1DepositIndex' + dst = ssz.MarshalUint64(dst, b.Eth1DepositIndex) + + // Offset (11) 'Validators' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.Validators) * 121 + + // Offset (12) 'Balances' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.Balances) * 8 + + // Field (13) 'RandaoMixes' + if size := len(b.RandaoMixes); size != 65536 { + err = ssz.ErrVectorLengthFn("--.RandaoMixes", size, 65536) + return + } + for ii := 0; ii < 65536; ii++ { + if size := len(b.RandaoMixes[ii]); size != 32 { + err = ssz.ErrBytesLengthFn("--.RandaoMixes[ii]", size, 32) + return + } + dst = append(dst, b.RandaoMixes[ii]...) + } + + // Field (14) 'Slashings' + if size := len(b.Slashings); size != 8192 { + err = ssz.ErrVectorLengthFn("--.Slashings", size, 8192) + return + } + for ii := 0; ii < 8192; ii++ { + dst = ssz.MarshalUint64(dst, b.Slashings[ii]) + } + + // Offset (15) 'PreviousEpochParticipation' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.PreviousEpochParticipation) + + // Offset (16) 'CurrentEpochParticipation' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.CurrentEpochParticipation) + + // Field (17) 'JustificationBits' + if size := len(b.JustificationBits); size != 1 { + err = ssz.ErrBytesLengthFn("--.JustificationBits", size, 1) + return + } + dst = append(dst, b.JustificationBits...) + + // Field (18) 'PreviousJustifiedCheckpoint' + if b.PreviousJustifiedCheckpoint == nil { + b.PreviousJustifiedCheckpoint = new(Checkpoint) + } + if dst, err = b.PreviousJustifiedCheckpoint.MarshalSSZTo(dst); err != nil { + return + } + + // Field (19) 'CurrentJustifiedCheckpoint' + if b.CurrentJustifiedCheckpoint == nil { + b.CurrentJustifiedCheckpoint = new(Checkpoint) + } + if dst, err = b.CurrentJustifiedCheckpoint.MarshalSSZTo(dst); err != nil { + return + } + + // Field (20) 'FinalizedCheckpoint' + if b.FinalizedCheckpoint == nil { + b.FinalizedCheckpoint = new(Checkpoint) + } + if dst, err = b.FinalizedCheckpoint.MarshalSSZTo(dst); err != nil { + return + } + + // Offset (21) 'InactivityScores' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.InactivityScores) * 8 + + // Field (22) 'CurrentSyncCommittee' + if b.CurrentSyncCommittee == nil { + b.CurrentSyncCommittee = new(SyncCommittee) + } + if dst, err = b.CurrentSyncCommittee.MarshalSSZTo(dst); err != nil { + return + } + + // Field (23) 'NextSyncCommittee' + if b.NextSyncCommittee == nil { + b.NextSyncCommittee = new(SyncCommittee) + } + if dst, err = b.NextSyncCommittee.MarshalSSZTo(dst); err != nil { + return + } + + // Offset (24) 'LatestExecutionPayloadHeader' + dst = ssz.WriteOffset(dst, offset) + if b.LatestExecutionPayloadHeader == nil { + b.LatestExecutionPayloadHeader = new(v1.ExecutionPayloadHeaderDeneb) + } + offset += b.LatestExecutionPayloadHeader.SizeSSZ() + + // Field (25) 'NextWithdrawalIndex' + dst = ssz.MarshalUint64(dst, b.NextWithdrawalIndex) + + // Field (26) 'NextWithdrawalValidatorIndex' + dst = ssz.MarshalUint64(dst, uint64(b.NextWithdrawalValidatorIndex)) + + // Offset (27) 'HistoricalSummaries' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.HistoricalSummaries) * 64 + + // Field (28) 'DepositRequestsStartIndex' + dst = ssz.MarshalUint64(dst, b.DepositRequestsStartIndex) + + // Field (29) 'DepositBalanceToConsume' + dst = ssz.MarshalUint64(dst, uint64(b.DepositBalanceToConsume)) + + // Field (30) 'ExitBalanceToConsume' + dst = ssz.MarshalUint64(dst, uint64(b.ExitBalanceToConsume)) + + // Field (31) 'EarliestExitEpoch' + dst = ssz.MarshalUint64(dst, uint64(b.EarliestExitEpoch)) + + // Field (32) 'ConsolidationBalanceToConsume' + dst = ssz.MarshalUint64(dst, uint64(b.ConsolidationBalanceToConsume)) + + // Field (33) 'EarliestConsolidationEpoch' + dst = ssz.MarshalUint64(dst, uint64(b.EarliestConsolidationEpoch)) + + // Offset (34) 'PendingDeposits' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.PendingDeposits) * 192 + + // Offset (35) 'PendingPartialWithdrawals' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.PendingPartialWithdrawals) * 24 + + // Offset (36) 'PendingConsolidations' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.PendingConsolidations) * 16 + + // Field (7) 'HistoricalRoots' + if size := len(b.HistoricalRoots); size > 16777216 { + err = ssz.ErrListTooBigFn("--.HistoricalRoots", size, 16777216) + return + } + for ii := 0; ii < len(b.HistoricalRoots); ii++ { + if size := len(b.HistoricalRoots[ii]); size != 32 { + err = ssz.ErrBytesLengthFn("--.HistoricalRoots[ii]", size, 32) + return + } + dst = append(dst, b.HistoricalRoots[ii]...) + } + + // Field (9) 'Eth1DataVotes' + if size := len(b.Eth1DataVotes); size > 2048 { + err = ssz.ErrListTooBigFn("--.Eth1DataVotes", size, 2048) + return + } + for ii := 0; ii < len(b.Eth1DataVotes); ii++ { + if dst, err = b.Eth1DataVotes[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (11) 'Validators' + if size := len(b.Validators); size > 1099511627776 { + err = ssz.ErrListTooBigFn("--.Validators", size, 1099511627776) + return + } + for ii := 0; ii < len(b.Validators); ii++ { + if dst, err = b.Validators[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (12) 'Balances' + if size := len(b.Balances); size > 1099511627776 { + err = ssz.ErrListTooBigFn("--.Balances", size, 1099511627776) + return + } + for ii := 0; ii < len(b.Balances); ii++ { + dst = ssz.MarshalUint64(dst, b.Balances[ii]) + } + + // Field (15) 'PreviousEpochParticipation' + if size := len(b.PreviousEpochParticipation); size > 1099511627776 { + err = ssz.ErrBytesLengthFn("--.PreviousEpochParticipation", size, 1099511627776) + return + } + dst = append(dst, b.PreviousEpochParticipation...) + + // Field (16) 'CurrentEpochParticipation' + if size := len(b.CurrentEpochParticipation); size > 1099511627776 { + err = ssz.ErrBytesLengthFn("--.CurrentEpochParticipation", size, 1099511627776) + return + } + dst = append(dst, b.CurrentEpochParticipation...) + + // Field (21) 'InactivityScores' + if size := len(b.InactivityScores); size > 1099511627776 { + err = ssz.ErrListTooBigFn("--.InactivityScores", size, 1099511627776) + return + } + for ii := 0; ii < len(b.InactivityScores); ii++ { + dst = ssz.MarshalUint64(dst, b.InactivityScores[ii]) + } + + // Field (24) 'LatestExecutionPayloadHeader' + if dst, err = b.LatestExecutionPayloadHeader.MarshalSSZTo(dst); err != nil { + return + } + + // Field (27) 'HistoricalSummaries' + if size := len(b.HistoricalSummaries); size > 16777216 { + err = ssz.ErrListTooBigFn("--.HistoricalSummaries", size, 16777216) + return + } + for ii := 0; ii < len(b.HistoricalSummaries); ii++ { + if dst, err = b.HistoricalSummaries[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (34) 'PendingDeposits' + if size := len(b.PendingDeposits); size > 134217728 { + err = ssz.ErrListTooBigFn("--.PendingDeposits", size, 134217728) + return + } + for ii := 0; ii < len(b.PendingDeposits); ii++ { + if dst, err = b.PendingDeposits[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (35) 'PendingPartialWithdrawals' + if size := len(b.PendingPartialWithdrawals); size > 134217728 { + err = ssz.ErrListTooBigFn("--.PendingPartialWithdrawals", size, 134217728) + return + } + for ii := 0; ii < len(b.PendingPartialWithdrawals); ii++ { + if dst, err = b.PendingPartialWithdrawals[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + // Field (36) 'PendingConsolidations' + if size := len(b.PendingConsolidations); size > 262144 { + err = ssz.ErrListTooBigFn("--.PendingConsolidations", size, 262144) + return + } + for ii := 0; ii < len(b.PendingConsolidations); ii++ { + if dst, err = b.PendingConsolidations[ii].MarshalSSZTo(dst); err != nil { + return + } + } + + return +} + +// UnmarshalSSZ ssz unmarshals the BeaconStateFulu object +func (b *BeaconStateFulu) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 2736713 { + return ssz.ErrSize + } + + tail := buf + var o7, o9, o11, o12, o15, o16, o21, o24, o27, o34, o35, o36 uint64 + + // Field (0) 'GenesisTime' + b.GenesisTime = ssz.UnmarshallUint64(buf[0:8]) + + // Field (1) 'GenesisValidatorsRoot' + if cap(b.GenesisValidatorsRoot) == 0 { + b.GenesisValidatorsRoot = make([]byte, 0, len(buf[8:40])) + } + b.GenesisValidatorsRoot = append(b.GenesisValidatorsRoot, buf[8:40]...) + + // Field (2) 'Slot' + b.Slot = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot(ssz.UnmarshallUint64(buf[40:48])) + + // Field (3) 'Fork' + if b.Fork == nil { + b.Fork = new(Fork) + } + if err = b.Fork.UnmarshalSSZ(buf[48:64]); err != nil { + return err + } + + // Field (4) 'LatestBlockHeader' + if b.LatestBlockHeader == nil { + b.LatestBlockHeader = new(BeaconBlockHeader) + } + if err = b.LatestBlockHeader.UnmarshalSSZ(buf[64:176]); err != nil { + return err + } + + // Field (5) 'BlockRoots' + b.BlockRoots = make([][]byte, 8192) + for ii := 0; ii < 8192; ii++ { + if cap(b.BlockRoots[ii]) == 0 { + b.BlockRoots[ii] = make([]byte, 0, len(buf[176:262320][ii*32:(ii+1)*32])) + } + b.BlockRoots[ii] = append(b.BlockRoots[ii], buf[176:262320][ii*32:(ii+1)*32]...) + } + + // Field (6) 'StateRoots' + b.StateRoots = make([][]byte, 8192) + for ii := 0; ii < 8192; ii++ { + if cap(b.StateRoots[ii]) == 0 { + b.StateRoots[ii] = make([]byte, 0, len(buf[262320:524464][ii*32:(ii+1)*32])) + } + b.StateRoots[ii] = append(b.StateRoots[ii], buf[262320:524464][ii*32:(ii+1)*32]...) + } + + // Offset (7) 'HistoricalRoots' + if o7 = ssz.ReadOffset(buf[524464:524468]); o7 > size { + return ssz.ErrOffset + } + + if o7 != 2736713 { + return ssz.ErrInvalidVariableOffset + } + + // Field (8) 'Eth1Data' + if b.Eth1Data == nil { + b.Eth1Data = new(Eth1Data) + } + if err = b.Eth1Data.UnmarshalSSZ(buf[524468:524540]); err != nil { + return err + } + + // Offset (9) 'Eth1DataVotes' + if o9 = ssz.ReadOffset(buf[524540:524544]); o9 > size || o7 > o9 { + return ssz.ErrOffset + } + + // Field (10) 'Eth1DepositIndex' + b.Eth1DepositIndex = ssz.UnmarshallUint64(buf[524544:524552]) + + // Offset (11) 'Validators' + if o11 = ssz.ReadOffset(buf[524552:524556]); o11 > size || o9 > o11 { + return ssz.ErrOffset + } + + // Offset (12) 'Balances' + if o12 = ssz.ReadOffset(buf[524556:524560]); o12 > size || o11 > o12 { + return ssz.ErrOffset + } + + // Field (13) 'RandaoMixes' + b.RandaoMixes = make([][]byte, 65536) + for ii := 0; ii < 65536; ii++ { + if cap(b.RandaoMixes[ii]) == 0 { + b.RandaoMixes[ii] = make([]byte, 0, len(buf[524560:2621712][ii*32:(ii+1)*32])) + } + b.RandaoMixes[ii] = append(b.RandaoMixes[ii], buf[524560:2621712][ii*32:(ii+1)*32]...) + } + + // Field (14) 'Slashings' + b.Slashings = ssz.ExtendUint64(b.Slashings, 8192) + for ii := 0; ii < 8192; ii++ { + b.Slashings[ii] = ssz.UnmarshallUint64(buf[2621712:2687248][ii*8 : (ii+1)*8]) + } + + // Offset (15) 'PreviousEpochParticipation' + if o15 = ssz.ReadOffset(buf[2687248:2687252]); o15 > size || o12 > o15 { + return ssz.ErrOffset + } + + // Offset (16) 'CurrentEpochParticipation' + if o16 = ssz.ReadOffset(buf[2687252:2687256]); o16 > size || o15 > o16 { + return ssz.ErrOffset + } + + // Field (17) 'JustificationBits' + if cap(b.JustificationBits) == 0 { + b.JustificationBits = make([]byte, 0, len(buf[2687256:2687257])) + } + b.JustificationBits = append(b.JustificationBits, buf[2687256:2687257]...) + + // Field (18) 'PreviousJustifiedCheckpoint' + if b.PreviousJustifiedCheckpoint == nil { + b.PreviousJustifiedCheckpoint = new(Checkpoint) + } + if err = b.PreviousJustifiedCheckpoint.UnmarshalSSZ(buf[2687257:2687297]); err != nil { + return err + } + + // Field (19) 'CurrentJustifiedCheckpoint' + if b.CurrentJustifiedCheckpoint == nil { + b.CurrentJustifiedCheckpoint = new(Checkpoint) + } + if err = b.CurrentJustifiedCheckpoint.UnmarshalSSZ(buf[2687297:2687337]); err != nil { + return err + } + + // Field (20) 'FinalizedCheckpoint' + if b.FinalizedCheckpoint == nil { + b.FinalizedCheckpoint = new(Checkpoint) + } + if err = b.FinalizedCheckpoint.UnmarshalSSZ(buf[2687337:2687377]); err != nil { + return err + } + + // Offset (21) 'InactivityScores' + if o21 = ssz.ReadOffset(buf[2687377:2687381]); o21 > size || o16 > o21 { + return ssz.ErrOffset + } + + // Field (22) 'CurrentSyncCommittee' + if b.CurrentSyncCommittee == nil { + b.CurrentSyncCommittee = new(SyncCommittee) + } + if err = b.CurrentSyncCommittee.UnmarshalSSZ(buf[2687381:2712005]); err != nil { + return err + } + + // Field (23) 'NextSyncCommittee' + if b.NextSyncCommittee == nil { + b.NextSyncCommittee = new(SyncCommittee) + } + if err = b.NextSyncCommittee.UnmarshalSSZ(buf[2712005:2736629]); err != nil { + return err + } + + // Offset (24) 'LatestExecutionPayloadHeader' + if o24 = ssz.ReadOffset(buf[2736629:2736633]); o24 > size || o21 > o24 { + return ssz.ErrOffset + } + + // Field (25) 'NextWithdrawalIndex' + b.NextWithdrawalIndex = ssz.UnmarshallUint64(buf[2736633:2736641]) + + // Field (26) 'NextWithdrawalValidatorIndex' + b.NextWithdrawalValidatorIndex = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.ValidatorIndex(ssz.UnmarshallUint64(buf[2736641:2736649])) + + // Offset (27) 'HistoricalSummaries' + if o27 = ssz.ReadOffset(buf[2736649:2736653]); o27 > size || o24 > o27 { + return ssz.ErrOffset + } + + // Field (28) 'DepositRequestsStartIndex' + b.DepositRequestsStartIndex = ssz.UnmarshallUint64(buf[2736653:2736661]) + + // Field (29) 'DepositBalanceToConsume' + b.DepositBalanceToConsume = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[2736661:2736669])) + + // Field (30) 'ExitBalanceToConsume' + b.ExitBalanceToConsume = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[2736669:2736677])) + + // Field (31) 'EarliestExitEpoch' + b.EarliestExitEpoch = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch(ssz.UnmarshallUint64(buf[2736677:2736685])) + + // Field (32) 'ConsolidationBalanceToConsume' + b.ConsolidationBalanceToConsume = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Gwei(ssz.UnmarshallUint64(buf[2736685:2736693])) + + // Field (33) 'EarliestConsolidationEpoch' + b.EarliestConsolidationEpoch = github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Epoch(ssz.UnmarshallUint64(buf[2736693:2736701])) + + // Offset (34) 'PendingDeposits' + if o34 = ssz.ReadOffset(buf[2736701:2736705]); o34 > size || o27 > o34 { + return ssz.ErrOffset + } + + // Offset (35) 'PendingPartialWithdrawals' + if o35 = ssz.ReadOffset(buf[2736705:2736709]); o35 > size || o34 > o35 { + return ssz.ErrOffset + } + + // Offset (36) 'PendingConsolidations' + if o36 = ssz.ReadOffset(buf[2736709:2736713]); o36 > size || o35 > o36 { + return ssz.ErrOffset + } + + // Field (7) 'HistoricalRoots' + { + buf = tail[o7:o9] + num, err := ssz.DivideInt2(len(buf), 32, 16777216) + if err != nil { + return err + } + b.HistoricalRoots = make([][]byte, num) + for ii := 0; ii < num; ii++ { + if cap(b.HistoricalRoots[ii]) == 0 { + b.HistoricalRoots[ii] = make([]byte, 0, len(buf[ii*32:(ii+1)*32])) + } + b.HistoricalRoots[ii] = append(b.HistoricalRoots[ii], buf[ii*32:(ii+1)*32]...) + } + } + + // Field (9) 'Eth1DataVotes' + { + buf = tail[o9:o11] + num, err := ssz.DivideInt2(len(buf), 72, 2048) + if err != nil { + return err + } + b.Eth1DataVotes = make([]*Eth1Data, num) + for ii := 0; ii < num; ii++ { + if b.Eth1DataVotes[ii] == nil { + b.Eth1DataVotes[ii] = new(Eth1Data) + } + if err = b.Eth1DataVotes[ii].UnmarshalSSZ(buf[ii*72 : (ii+1)*72]); err != nil { + return err + } + } + } + + // Field (11) 'Validators' + { + buf = tail[o11:o12] + num, err := ssz.DivideInt2(len(buf), 121, 1099511627776) + if err != nil { + return err + } + b.Validators = make([]*Validator, num) + for ii := 0; ii < num; ii++ { + if b.Validators[ii] == nil { + b.Validators[ii] = new(Validator) + } + if err = b.Validators[ii].UnmarshalSSZ(buf[ii*121 : (ii+1)*121]); err != nil { + return err + } + } + } + + // Field (12) 'Balances' + { + buf = tail[o12:o15] + num, err := ssz.DivideInt2(len(buf), 8, 1099511627776) + if err != nil { + return err + } + b.Balances = ssz.ExtendUint64(b.Balances, num) + for ii := 0; ii < num; ii++ { + b.Balances[ii] = ssz.UnmarshallUint64(buf[ii*8 : (ii+1)*8]) + } + } + + // Field (15) 'PreviousEpochParticipation' + { + buf = tail[o15:o16] + if len(buf) > 1099511627776 { + return ssz.ErrBytesLength + } + if cap(b.PreviousEpochParticipation) == 0 { + b.PreviousEpochParticipation = make([]byte, 0, len(buf)) + } + b.PreviousEpochParticipation = append(b.PreviousEpochParticipation, buf...) + } + + // Field (16) 'CurrentEpochParticipation' + { + buf = tail[o16:o21] + if len(buf) > 1099511627776 { + return ssz.ErrBytesLength + } + if cap(b.CurrentEpochParticipation) == 0 { + b.CurrentEpochParticipation = make([]byte, 0, len(buf)) + } + b.CurrentEpochParticipation = append(b.CurrentEpochParticipation, buf...) + } + + // Field (21) 'InactivityScores' + { + buf = tail[o21:o24] + num, err := ssz.DivideInt2(len(buf), 8, 1099511627776) + if err != nil { + return err + } + b.InactivityScores = ssz.ExtendUint64(b.InactivityScores, num) + for ii := 0; ii < num; ii++ { + b.InactivityScores[ii] = ssz.UnmarshallUint64(buf[ii*8 : (ii+1)*8]) + } + } + + // Field (24) 'LatestExecutionPayloadHeader' + { + buf = tail[o24:o27] + if b.LatestExecutionPayloadHeader == nil { + b.LatestExecutionPayloadHeader = new(v1.ExecutionPayloadHeaderDeneb) + } + if err = b.LatestExecutionPayloadHeader.UnmarshalSSZ(buf); err != nil { + return err + } + } + + // Field (27) 'HistoricalSummaries' + { + buf = tail[o27:o34] + num, err := ssz.DivideInt2(len(buf), 64, 16777216) + if err != nil { + return err + } + b.HistoricalSummaries = make([]*HistoricalSummary, num) + for ii := 0; ii < num; ii++ { + if b.HistoricalSummaries[ii] == nil { + b.HistoricalSummaries[ii] = new(HistoricalSummary) + } + if err = b.HistoricalSummaries[ii].UnmarshalSSZ(buf[ii*64 : (ii+1)*64]); err != nil { + return err + } + } + } + + // Field (34) 'PendingDeposits' + { + buf = tail[o34:o35] + num, err := ssz.DivideInt2(len(buf), 192, 134217728) + if err != nil { + return err + } + b.PendingDeposits = make([]*PendingDeposit, num) + for ii := 0; ii < num; ii++ { + if b.PendingDeposits[ii] == nil { + b.PendingDeposits[ii] = new(PendingDeposit) + } + if err = b.PendingDeposits[ii].UnmarshalSSZ(buf[ii*192 : (ii+1)*192]); err != nil { + return err + } + } + } + + // Field (35) 'PendingPartialWithdrawals' + { + buf = tail[o35:o36] + num, err := ssz.DivideInt2(len(buf), 24, 134217728) + if err != nil { + return err + } + b.PendingPartialWithdrawals = make([]*PendingPartialWithdrawal, num) + for ii := 0; ii < num; ii++ { + if b.PendingPartialWithdrawals[ii] == nil { + b.PendingPartialWithdrawals[ii] = new(PendingPartialWithdrawal) + } + if err = b.PendingPartialWithdrawals[ii].UnmarshalSSZ(buf[ii*24 : (ii+1)*24]); err != nil { + return err + } + } + } + + // Field (36) 'PendingConsolidations' + { + buf = tail[o36:] + num, err := ssz.DivideInt2(len(buf), 16, 262144) + if err != nil { + return err + } + b.PendingConsolidations = make([]*PendingConsolidation, num) + for ii := 0; ii < num; ii++ { + if b.PendingConsolidations[ii] == nil { + b.PendingConsolidations[ii] = new(PendingConsolidation) + } + if err = b.PendingConsolidations[ii].UnmarshalSSZ(buf[ii*16 : (ii+1)*16]); err != nil { + return err + } + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the BeaconStateFulu object +func (b *BeaconStateFulu) SizeSSZ() (size int) { + size = 2736713 + + // Field (7) 'HistoricalRoots' + size += len(b.HistoricalRoots) * 32 + + // Field (9) 'Eth1DataVotes' + size += len(b.Eth1DataVotes) * 72 + + // Field (11) 'Validators' + size += len(b.Validators) * 121 + + // Field (12) 'Balances' + size += len(b.Balances) * 8 + + // Field (15) 'PreviousEpochParticipation' + size += len(b.PreviousEpochParticipation) + + // Field (16) 'CurrentEpochParticipation' + size += len(b.CurrentEpochParticipation) + + // Field (21) 'InactivityScores' + size += len(b.InactivityScores) * 8 + + // Field (24) 'LatestExecutionPayloadHeader' + if b.LatestExecutionPayloadHeader == nil { + b.LatestExecutionPayloadHeader = new(v1.ExecutionPayloadHeaderDeneb) + } + size += b.LatestExecutionPayloadHeader.SizeSSZ() + + // Field (27) 'HistoricalSummaries' + size += len(b.HistoricalSummaries) * 64 + + // Field (34) 'PendingDeposits' + size += len(b.PendingDeposits) * 192 + + // Field (35) 'PendingPartialWithdrawals' + size += len(b.PendingPartialWithdrawals) * 24 + + // Field (36) 'PendingConsolidations' + size += len(b.PendingConsolidations) * 16 + + return +} + +// HashTreeRoot ssz hashes the BeaconStateFulu object +func (b *BeaconStateFulu) HashTreeRoot() ([32]byte, error) { + return ssz.HashWithDefaultHasher(b) +} + +// HashTreeRootWith ssz hashes the BeaconStateFulu object with a hasher +func (b *BeaconStateFulu) HashTreeRootWith(hh *ssz.Hasher) (err error) { + indx := hh.Index() + + // Field (0) 'GenesisTime' + hh.PutUint64(b.GenesisTime) + + // Field (1) 'GenesisValidatorsRoot' + if size := len(b.GenesisValidatorsRoot); size != 32 { + err = ssz.ErrBytesLengthFn("--.GenesisValidatorsRoot", size, 32) + return + } + hh.PutBytes(b.GenesisValidatorsRoot) + + // Field (2) 'Slot' + hh.PutUint64(uint64(b.Slot)) + + // Field (3) 'Fork' + if err = b.Fork.HashTreeRootWith(hh); err != nil { + return + } + + // Field (4) 'LatestBlockHeader' + if err = b.LatestBlockHeader.HashTreeRootWith(hh); err != nil { + return + } + + // Field (5) 'BlockRoots' + { + if size := len(b.BlockRoots); size != 8192 { + err = ssz.ErrVectorLengthFn("--.BlockRoots", size, 8192) + return + } + subIndx := hh.Index() + for _, i := range b.BlockRoots { + if len(i) != 32 { + err = ssz.ErrBytesLength + return + } + hh.Append(i) + } + hh.Merkleize(subIndx) + } + + // Field (6) 'StateRoots' + { + if size := len(b.StateRoots); size != 8192 { + err = ssz.ErrVectorLengthFn("--.StateRoots", size, 8192) + return + } + subIndx := hh.Index() + for _, i := range b.StateRoots { + if len(i) != 32 { + err = ssz.ErrBytesLength + return + } + hh.Append(i) + } + hh.Merkleize(subIndx) + } + + // Field (7) 'HistoricalRoots' + { + if size := len(b.HistoricalRoots); size > 16777216 { + err = ssz.ErrListTooBigFn("--.HistoricalRoots", size, 16777216) + return + } + subIndx := hh.Index() + for _, i := range b.HistoricalRoots { + if len(i) != 32 { + err = ssz.ErrBytesLength + return + } + hh.Append(i) + } + + numItems := uint64(len(b.HistoricalRoots)) + hh.MerkleizeWithMixin(subIndx, numItems, 16777216) + } + + // Field (8) 'Eth1Data' + if err = b.Eth1Data.HashTreeRootWith(hh); err != nil { + return + } + + // Field (9) 'Eth1DataVotes' + { + subIndx := hh.Index() + num := uint64(len(b.Eth1DataVotes)) + if num > 2048 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.Eth1DataVotes { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 2048) + } + + // Field (10) 'Eth1DepositIndex' + hh.PutUint64(b.Eth1DepositIndex) + + // Field (11) 'Validators' + { + subIndx := hh.Index() + num := uint64(len(b.Validators)) + if num > 1099511627776 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.Validators { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 1099511627776) + } + + // Field (12) 'Balances' + { + if size := len(b.Balances); size > 1099511627776 { + err = ssz.ErrListTooBigFn("--.Balances", size, 1099511627776) + return + } + subIndx := hh.Index() + for _, i := range b.Balances { + hh.AppendUint64(i) + } + hh.FillUpTo32() + + numItems := uint64(len(b.Balances)) + hh.MerkleizeWithMixin(subIndx, numItems, ssz.CalculateLimit(1099511627776, numItems, 8)) + } + + // Field (13) 'RandaoMixes' + { + if size := len(b.RandaoMixes); size != 65536 { + err = ssz.ErrVectorLengthFn("--.RandaoMixes", size, 65536) + return + } + subIndx := hh.Index() + for _, i := range b.RandaoMixes { + if len(i) != 32 { + err = ssz.ErrBytesLength + return + } + hh.Append(i) + } + hh.Merkleize(subIndx) + } + + // Field (14) 'Slashings' + { + if size := len(b.Slashings); size != 8192 { + err = ssz.ErrVectorLengthFn("--.Slashings", size, 8192) + return + } + subIndx := hh.Index() + for _, i := range b.Slashings { + hh.AppendUint64(i) + } + hh.Merkleize(subIndx) + } + + // Field (15) 'PreviousEpochParticipation' + { + elemIndx := hh.Index() + byteLen := uint64(len(b.PreviousEpochParticipation)) + if byteLen > 1099511627776 { + err = ssz.ErrIncorrectListSize + return + } + hh.PutBytes(b.PreviousEpochParticipation) + hh.MerkleizeWithMixin(elemIndx, byteLen, (1099511627776+31)/32) + } + + // Field (16) 'CurrentEpochParticipation' + { + elemIndx := hh.Index() + byteLen := uint64(len(b.CurrentEpochParticipation)) + if byteLen > 1099511627776 { + err = ssz.ErrIncorrectListSize + return + } + hh.PutBytes(b.CurrentEpochParticipation) + hh.MerkleizeWithMixin(elemIndx, byteLen, (1099511627776+31)/32) + } + + // Field (17) 'JustificationBits' + if size := len(b.JustificationBits); size != 1 { + err = ssz.ErrBytesLengthFn("--.JustificationBits", size, 1) + return + } + hh.PutBytes(b.JustificationBits) + + // Field (18) 'PreviousJustifiedCheckpoint' + if err = b.PreviousJustifiedCheckpoint.HashTreeRootWith(hh); err != nil { + return + } + + // Field (19) 'CurrentJustifiedCheckpoint' + if err = b.CurrentJustifiedCheckpoint.HashTreeRootWith(hh); err != nil { + return + } + + // Field (20) 'FinalizedCheckpoint' + if err = b.FinalizedCheckpoint.HashTreeRootWith(hh); err != nil { + return + } + + // Field (21) 'InactivityScores' + { + if size := len(b.InactivityScores); size > 1099511627776 { + err = ssz.ErrListTooBigFn("--.InactivityScores", size, 1099511627776) + return + } + subIndx := hh.Index() + for _, i := range b.InactivityScores { + hh.AppendUint64(i) + } + hh.FillUpTo32() + + numItems := uint64(len(b.InactivityScores)) + hh.MerkleizeWithMixin(subIndx, numItems, ssz.CalculateLimit(1099511627776, numItems, 8)) + } + + // Field (22) 'CurrentSyncCommittee' + if err = b.CurrentSyncCommittee.HashTreeRootWith(hh); err != nil { + return + } + + // Field (23) 'NextSyncCommittee' + if err = b.NextSyncCommittee.HashTreeRootWith(hh); err != nil { + return + } + + // Field (24) 'LatestExecutionPayloadHeader' + if err = b.LatestExecutionPayloadHeader.HashTreeRootWith(hh); err != nil { + return + } + + // Field (25) 'NextWithdrawalIndex' + hh.PutUint64(b.NextWithdrawalIndex) + + // Field (26) 'NextWithdrawalValidatorIndex' + hh.PutUint64(uint64(b.NextWithdrawalValidatorIndex)) + + // Field (27) 'HistoricalSummaries' + { + subIndx := hh.Index() + num := uint64(len(b.HistoricalSummaries)) + if num > 16777216 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.HistoricalSummaries { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 16777216) + } + + // Field (28) 'DepositRequestsStartIndex' + hh.PutUint64(b.DepositRequestsStartIndex) + + // Field (29) 'DepositBalanceToConsume' + hh.PutUint64(uint64(b.DepositBalanceToConsume)) + + // Field (30) 'ExitBalanceToConsume' + hh.PutUint64(uint64(b.ExitBalanceToConsume)) + + // Field (31) 'EarliestExitEpoch' + hh.PutUint64(uint64(b.EarliestExitEpoch)) + + // Field (32) 'ConsolidationBalanceToConsume' + hh.PutUint64(uint64(b.ConsolidationBalanceToConsume)) + + // Field (33) 'EarliestConsolidationEpoch' + hh.PutUint64(uint64(b.EarliestConsolidationEpoch)) + + // Field (34) 'PendingDeposits' + { + subIndx := hh.Index() + num := uint64(len(b.PendingDeposits)) + if num > 134217728 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.PendingDeposits { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 134217728) + } + + // Field (35) 'PendingPartialWithdrawals' + { + subIndx := hh.Index() + num := uint64(len(b.PendingPartialWithdrawals)) + if num > 134217728 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.PendingPartialWithdrawals { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 134217728) + } + + // Field (36) 'PendingConsolidations' + { + subIndx := hh.Index() + num := uint64(len(b.PendingConsolidations)) + if num > 262144 { + err = ssz.ErrIncorrectListSize + return + } + for _, elem := range b.PendingConsolidations { + if err = elem.HashTreeRootWith(hh); err != nil { + return + } + } + hh.MerkleizeWithMixin(subIndx, num, 262144) + } + + hh.Merkleize(indx) + return +} + // MarshalSSZ ssz marshals the DataColumnSidecar object func (d *DataColumnSidecar) MarshalSSZ() ([]byte, error) { return ssz.MarshalSSZ(d) diff --git a/proto/prysm/v1alpha1/non-core.ssz.go b/proto/prysm/v1alpha1/non-core.ssz.go index 4492534c6f08..58e5e30d402d 100644 --- a/proto/prysm/v1alpha1/non-core.ssz.go +++ b/proto/prysm/v1alpha1/non-core.ssz.go @@ -1,5 +1,4 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: 5314abedbe58cf5739302b3293a023537060eada88a7f791813ad139adda516c package eth import ( diff --git a/proto/prysm/v1alpha1/phase0.ssz.go b/proto/prysm/v1alpha1/phase0.ssz.go index 6b811844dfca..e95995f0e610 100644 --- a/proto/prysm/v1alpha1/phase0.ssz.go +++ b/proto/prysm/v1alpha1/phase0.ssz.go @@ -1,5 +1,4 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: cfa400e2b24ddea4df7fed35264c29ace8f6f5eef05dc9725f118f44844e1a75 package eth import ( diff --git a/proto/prysm/v1alpha1/validator-client/keymanager.pb.go b/proto/prysm/v1alpha1/validator-client/keymanager.pb.go index b6e9f1b1542a..de7def5e7d3a 100755 --- a/proto/prysm/v1alpha1/validator-client/keymanager.pb.go +++ b/proto/prysm/v1alpha1/validator-client/keymanager.pb.go @@ -107,6 +107,8 @@ type SignRequest struct { // *SignRequest_BlockElectra // *SignRequest_BlindedBlockElectra // *SignRequest_AggregateAttestationAndProofElectra + // *SignRequest_BlockFulu + // *SignRequest_BlindedBlockFulu Object isSignRequest_Object `protobuf_oneof:"object"` SigningSlot github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot `protobuf:"varint,6,opt,name=signing_slot,json=signingSlot,proto3" json:"signing_slot,omitempty" cast-type:"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"` } @@ -311,6 +313,20 @@ func (x *SignRequest) GetAggregateAttestationAndProofElectra() *v1alpha1.Aggrega return nil } +func (x *SignRequest) GetBlockFulu() *v1alpha1.BeaconBlockFulu { + if x, ok := x.GetObject().(*SignRequest_BlockFulu); ok { + return x.BlockFulu + } + return nil +} + +func (x *SignRequest) GetBlindedBlockFulu() *v1alpha1.BlindedBeaconBlockFulu { + if x, ok := x.GetObject().(*SignRequest_BlindedBlockFulu); ok { + return x.BlindedBlockFulu + } + return nil +} + func (x *SignRequest) GetSigningSlot() github_com_prysmaticlabs_prysm_v5_consensus_types_primitives.Slot { if x != nil { return x.SigningSlot @@ -402,6 +418,14 @@ type SignRequest_AggregateAttestationAndProofElectra struct { AggregateAttestationAndProofElectra *v1alpha1.AggregateAttestationAndProofElectra `protobuf:"bytes,120,opt,name=aggregate_attestation_and_proof_electra,json=aggregateAttestationAndProofElectra,proto3,oneof"` } +type SignRequest_BlockFulu struct { + BlockFulu *v1alpha1.BeaconBlockFulu `protobuf:"bytes,121,opt,name=block_fulu,json=blockFulu,proto3,oneof"` +} + +type SignRequest_BlindedBlockFulu struct { + BlindedBlockFulu *v1alpha1.BlindedBeaconBlockFulu `protobuf:"bytes,122,opt,name=blinded_block_fulu,json=blindedBlockFulu,proto3,oneof"` +} + func (*SignRequest_Block) isSignRequest_Object() {} func (*SignRequest_AttestationData) isSignRequest_Object() {} @@ -442,6 +466,10 @@ func (*SignRequest_BlindedBlockElectra) isSignRequest_Object() {} func (*SignRequest_AggregateAttestationAndProofElectra) isSignRequest_Object() {} +func (*SignRequest_BlockFulu) isSignRequest_Object() {} + +func (*SignRequest_BlindedBlockFulu) isSignRequest_Object() {} + type SignResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -698,7 +726,7 @@ var file_proto_prysm_v1alpha1_validator_client_keymanager_proto_rawDesc = []byte 0x63, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbd, 0x10, 0x0a, 0x0b, 0x53, + 0x74, 0x74, 0x65, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x11, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x67, @@ -822,85 +850,95 @@ var file_proto_prysm_v1alpha1_validator_client_keymanager_proto_rawDesc = []byte 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x48, 0x00, 0x52, 0x23, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x68, 0x0a, 0x0c, 0x73, 0x69, - 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, - 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, - 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, - 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, - 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, - 0x53, 0x6c, 0x6f, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4a, 0x04, - 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0xb7, 0x01, 0x0a, 0x0c, 0x53, - 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x4b, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3c, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, - 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, - 0x45, 0x44, 0x10, 0x03, 0x22, 0xb3, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, - 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x23, - 0x0a, 0x0d, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, - 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x08, - 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, - 0x09, 0x5f, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x22, 0xa6, 0x01, 0x0a, 0x0d, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x63, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, - 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, - 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x6c, 0x61, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6c, - 0x61, 0x79, 0x73, 0x22, 0xe7, 0x02, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x74, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5c, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x32, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x1a, 0x78, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4b, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0xce, 0x01, - 0x0a, 0x22, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, + 0x6f, 0x6f, 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x47, 0x0a, 0x0a, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x75, 0x6c, 0x75, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x46, + 0x75, 0x6c, 0x75, 0x12, 0x5d, 0x0a, 0x12, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x75, 0x6c, 0x75, 0x18, 0x7a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, 0x48, 0x00, + 0x52, 0x10, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x75, + 0x6c, 0x75, 0x12, 0x68, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, + 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, + 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, + 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, + 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, + 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x6f, 0x74, 0x42, 0x08, 0x0a, 0x06, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, + 0x10, 0x06, 0x22, 0xb7, 0x01, 0x0a, 0x0c, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x12, 0x4b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, + 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3c, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, + 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x02, + 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x22, 0xb3, 0x01, 0x0a, + 0x15, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x65, + 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, + 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x07, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x74, 0x69, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x74, 0x69, 0x22, 0xa6, 0x01, 0x0a, 0x0d, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x63, + 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, + 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, + 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x22, 0xe7, 0x02, 0x0a, 0x17, + 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x4b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, + 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5c, 0x0a, + 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0d, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x78, 0x0a, 0x13, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x2e, 0x76, 0x32, 0x42, 0x0f, 0x4b, 0x65, 0x79, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x53, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, - 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x70, 0x62, 0xaa, 0x02, 0x1e, 0x45, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x1e, - 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x5c, 0x56, 0x32, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0xce, 0x01, 0x0a, 0x22, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x32, 0x42, 0x0f, 0x4b, 0x65, + 0x79, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x53, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, + 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, + 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x70, 0x62, 0xaa, 0x02, 0x1e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x1e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x5c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x5c, 0x56, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -942,6 +980,8 @@ var file_proto_prysm_v1alpha1_validator_client_keymanager_proto_goTypes = []inte (*v1alpha1.BeaconBlockElectra)(nil), // 21: ethereum.eth.v1alpha1.BeaconBlockElectra (*v1alpha1.BlindedBeaconBlockElectra)(nil), // 22: ethereum.eth.v1alpha1.BlindedBeaconBlockElectra (*v1alpha1.AggregateAttestationAndProofElectra)(nil), // 23: ethereum.eth.v1alpha1.AggregateAttestationAndProofElectra + (*v1alpha1.BeaconBlockFulu)(nil), // 24: ethereum.eth.v1alpha1.BeaconBlockFulu + (*v1alpha1.BlindedBeaconBlockFulu)(nil), // 25: ethereum.eth.v1alpha1.BlindedBeaconBlockFulu } var file_proto_prysm_v1alpha1_validator_client_keymanager_proto_depIdxs = []int32{ 7, // 0: ethereum.validator.accounts.v2.SignRequest.block:type_name -> ethereum.eth.v1alpha1.BeaconBlock @@ -961,16 +1001,18 @@ var file_proto_prysm_v1alpha1_validator_client_keymanager_proto_depIdxs = []int3 21, // 14: ethereum.validator.accounts.v2.SignRequest.block_electra:type_name -> ethereum.eth.v1alpha1.BeaconBlockElectra 22, // 15: ethereum.validator.accounts.v2.SignRequest.blinded_block_electra:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockElectra 23, // 16: ethereum.validator.accounts.v2.SignRequest.aggregate_attestation_and_proof_electra:type_name -> ethereum.eth.v1alpha1.AggregateAttestationAndProofElectra - 0, // 17: ethereum.validator.accounts.v2.SignResponse.status:type_name -> ethereum.validator.accounts.v2.SignResponse.Status - 4, // 18: ethereum.validator.accounts.v2.ProposerOptionPayload.builder:type_name -> ethereum.validator.accounts.v2.BuilderConfig - 6, // 19: ethereum.validator.accounts.v2.ProposerSettingsPayload.proposer_config:type_name -> ethereum.validator.accounts.v2.ProposerSettingsPayload.ProposerConfigEntry - 3, // 20: ethereum.validator.accounts.v2.ProposerSettingsPayload.default_config:type_name -> ethereum.validator.accounts.v2.ProposerOptionPayload - 3, // 21: ethereum.validator.accounts.v2.ProposerSettingsPayload.ProposerConfigEntry.value:type_name -> ethereum.validator.accounts.v2.ProposerOptionPayload - 22, // [22:22] is the sub-list for method output_type - 22, // [22:22] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 24, // 17: ethereum.validator.accounts.v2.SignRequest.block_fulu:type_name -> ethereum.eth.v1alpha1.BeaconBlockFulu + 25, // 18: ethereum.validator.accounts.v2.SignRequest.blinded_block_fulu:type_name -> ethereum.eth.v1alpha1.BlindedBeaconBlockFulu + 0, // 19: ethereum.validator.accounts.v2.SignResponse.status:type_name -> ethereum.validator.accounts.v2.SignResponse.Status + 4, // 20: ethereum.validator.accounts.v2.ProposerOptionPayload.builder:type_name -> ethereum.validator.accounts.v2.BuilderConfig + 6, // 21: ethereum.validator.accounts.v2.ProposerSettingsPayload.proposer_config:type_name -> ethereum.validator.accounts.v2.ProposerSettingsPayload.ProposerConfigEntry + 3, // 22: ethereum.validator.accounts.v2.ProposerSettingsPayload.default_config:type_name -> ethereum.validator.accounts.v2.ProposerOptionPayload + 3, // 23: ethereum.validator.accounts.v2.ProposerSettingsPayload.ProposerConfigEntry.value:type_name -> ethereum.validator.accounts.v2.ProposerOptionPayload + 24, // [24:24] is the sub-list for method output_type + 24, // [24:24] is the sub-list for method input_type + 24, // [24:24] is the sub-list for extension type_name + 24, // [24:24] is the sub-list for extension extendee + 0, // [0:24] is the sub-list for field type_name } func init() { file_proto_prysm_v1alpha1_validator_client_keymanager_proto_init() } @@ -1061,6 +1103,8 @@ func file_proto_prysm_v1alpha1_validator_client_keymanager_proto_init() { (*SignRequest_BlockElectra)(nil), (*SignRequest_BlindedBlockElectra)(nil), (*SignRequest_AggregateAttestationAndProofElectra)(nil), + (*SignRequest_BlockFulu)(nil), + (*SignRequest_BlindedBlockFulu)(nil), } file_proto_prysm_v1alpha1_validator_client_keymanager_proto_msgTypes[2].OneofWrappers = []interface{}{} type x struct{} diff --git a/proto/prysm/v1alpha1/validator-client/keymanager.proto b/proto/prysm/v1alpha1/validator-client/keymanager.proto index 81769612a17c..0d868270c2c8 100644 --- a/proto/prysm/v1alpha1/validator-client/keymanager.proto +++ b/proto/prysm/v1alpha1/validator-client/keymanager.proto @@ -65,7 +65,12 @@ message SignRequest { ethereum.eth.v1alpha1.BeaconBlockElectra block_electra = 118; ethereum.eth.v1alpha1.BlindedBeaconBlockElectra blinded_block_electra = 119; ethereum.eth.v1alpha1.AggregateAttestationAndProofElectra aggregate_attestation_and_proof_electra = 120; + + // Fulu objects. + ethereum.eth.v1alpha1.BeaconBlockFulu block_fulu = 121; + ethereum.eth.v1alpha1.BlindedBeaconBlockFulu blinded_block_fulu = 122; } + reserved 4, 5; // Reserving old, deleted fields. uint64 signing_slot = 6 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives.Slot"]; } diff --git a/proto/prysm/v1alpha1/validator.pb.go b/proto/prysm/v1alpha1/validator.pb.go index f0e5cec84a48..1ced7c92328b 100755 --- a/proto/prysm/v1alpha1/validator.pb.go +++ b/proto/prysm/v1alpha1/validator.pb.go @@ -371,6 +371,7 @@ type StreamBlocksResponse struct { // *StreamBlocksResponse_CapellaBlock // *StreamBlocksResponse_DenebBlock // *StreamBlocksResponse_ElectraBlock + // *StreamBlocksResponse_FuluBlock Block isStreamBlocksResponse_Block `protobuf_oneof:"block"` } @@ -455,6 +456,13 @@ func (x *StreamBlocksResponse) GetElectraBlock() *SignedBeaconBlockElectra { return nil } +func (x *StreamBlocksResponse) GetFuluBlock() *SignedBeaconBlockFulu { + if x, ok := x.GetBlock().(*StreamBlocksResponse_FuluBlock); ok { + return x.FuluBlock + } + return nil +} + type isStreamBlocksResponse_Block interface { isStreamBlocksResponse_Block() } @@ -483,6 +491,10 @@ type StreamBlocksResponse_ElectraBlock struct { ElectraBlock *SignedBeaconBlockElectra `protobuf:"bytes,6,opt,name=electra_block,json=electraBlock,proto3,oneof"` } +type StreamBlocksResponse_FuluBlock struct { + FuluBlock *SignedBeaconBlockFulu `protobuf:"bytes,7,opt,name=fulu_block,json=fuluBlock,proto3,oneof"` +} + func (*StreamBlocksResponse_Phase0Block) isStreamBlocksResponse_Block() {} func (*StreamBlocksResponse_AltairBlock) isStreamBlocksResponse_Block() {} @@ -495,6 +507,8 @@ func (*StreamBlocksResponse_DenebBlock) isStreamBlocksResponse_Block() {} func (*StreamBlocksResponse_ElectraBlock) isStreamBlocksResponse_Block() {} +func (*StreamBlocksResponse_FuluBlock) isStreamBlocksResponse_Block() {} + type DomainRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3148,7 +3162,7 @@ var file_proto_prysm_v1alpha1_validator_proto_rawDesc = []byte{ 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x3a, 0x02, 0x18, - 0x01, 0x22, 0xa7, 0x04, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x6c, 0x6f, 0x63, + 0x01, 0x22, 0xf6, 0x04, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x70, 0x68, 0x61, 0x73, 0x65, 0x30, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, @@ -3181,226 +3195,251 @@ var file_proto_prysm_v1alpha1_validator_proto_rawDesc = []byte{ 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x48, 0x00, - 0x52, 0x0c, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x02, - 0x18, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x85, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5c, 0x0a, - 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, - 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, - 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, - 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x64, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x22, 0x3b, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x22, 0x47, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0c, 0x42, 0x08, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, 0x52, 0x0a, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xcd, 0x02, 0x0a, 0x1b, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x08, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, - 0x1a, 0xd6, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, + 0x52, 0x0c, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4d, + 0x0a, 0x0a, 0x66, 0x75, 0x6c, 0x75, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x75, + 0x48, 0x00, 0x52, 0x09, 0x66, 0x75, 0x6c, 0x75, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x02, 0x18, + 0x01, 0x42, 0x07, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5c, 0x0a, 0x05, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, + 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, + 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, + 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x22, 0x3b, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, + 0x47, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, + 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0c, 0x42, 0x08, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, 0x52, 0x0a, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xcd, 0x02, 0x0a, 0x1b, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x65, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, - 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, - 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x91, 0x01, 0x0a, 0x12, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x65, - 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0b, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, - 0x17, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, - 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x15, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x4b, 0x0a, - 0x0e, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, - 0x69, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x67, - 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x15, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x52, - 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x7f, 0x0a, 0x16, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, - 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, - 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3f, 0x0a, 0x16, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x34, - 0x38, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0xc5, 0x03, 0x0a, - 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x65, 0x74, 0x68, 0x31, - 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x65, 0x74, 0x68, - 0x31, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x16, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, - 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, - 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x14, 0x64, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x6f, 0x74, - 0x12, 0x71, 0x0a, 0x10, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, - 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, - 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x52, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x71, 0x75, - 0x65, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, - 0x75, 0x65, 0x75, 0x65, 0x22, 0x65, 0x0a, 0x1e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x1a, + 0xd6, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x65, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, + 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, + 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x91, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x65, 0x6e, + 0x65, 0x73, 0x69, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0b, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x17, + 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, + 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x15, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x4b, 0x0a, 0x0e, + 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x67, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x15, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x52, 0x09, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x7f, 0x0a, 0x16, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, + 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3f, 0x0a, 0x16, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, + 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0xc5, 0x03, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x08, 0x8a, 0xb5, 0x18, - 0x04, 0x3f, 0x2c, 0x34, 0x38, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x03, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x1f, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x29, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0c, 0x42, 0x08, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, 0x52, 0x0a, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x4a, 0x0a, 0x08, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, - 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, - 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, - 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, - 0x73, 0x22, 0x98, 0x01, 0x0a, 0x0d, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x5c, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x65, 0x74, 0x68, 0x31, 0x5f, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x65, 0x74, 0x68, 0x31, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x16, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, - 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x29, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x08, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, - 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xd3, 0x07, 0x0a, - 0x0e, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5c, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x5f, 0x64, 0x75, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x75, 0x74, 0x79, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x56, 0x0a, - 0x11, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x64, 0x75, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x44, 0x75, 0x74, 0x79, 0x52, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x44, - 0x75, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x84, 0x06, 0x0a, 0x04, 0x44, 0x75, 0x74, 0x79, 0x12, 0x6d, - 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, - 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, - 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x12, 0x78, 0x0a, - 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, + 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x14, 0x64, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x12, + 0x71, 0x0a, 0x10, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, + 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, + 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x52, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x71, 0x75, 0x65, + 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, + 0x65, 0x75, 0x65, 0x22, 0x65, 0x0a, 0x1e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x08, 0x8a, 0xb5, 0x18, 0x04, + 0x3f, 0x2c, 0x34, 0x38, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x03, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x1f, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, + 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0c, 0x42, 0x08, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, 0x52, 0x0a, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x4a, 0x0a, 0x08, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, - 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x6a, 0x0a, 0x0d, 0x61, 0x74, 0x74, 0x65, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, - 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, - 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, - 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, - 0x6c, 0x6f, 0x74, 0x12, 0x6c, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, - 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, - 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, - 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, - 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, - 0x6f, 0x74, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, - 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x52, 0x09, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x78, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, - 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, - 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, - 0x73, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x12, 0x2c, - 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x5f, - 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x65, 0x73, 0x41, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x4a, 0x04, 0x08, 0x01, - 0x10, 0x02, 0x22, 0xb0, 0x02, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, + 0x22, 0x98, 0x01, 0x0a, 0x0d, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x5c, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x2b, - 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x52, 0x0c, 0x72, - 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x08, 0x67, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, - 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, - 0x24, 0x0a, 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6d, 0x65, 0x76, 0x5f, 0x62, 0x6f, 0x6f, 0x73, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x4d, 0x65, 0x76, - 0x42, 0x6f, 0x6f, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x14, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, - 0x5f, 0x62, 0x6f, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x6f, 0x6f, 0x73, 0x74, 0x46, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x38, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, - 0x18, 0x02, 0x33, 0x32, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x22, - 0x3a, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, - 0x32, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0xed, 0x01, 0x0a, 0x16, - 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x29, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x08, 0x8a, 0xb5, 0x18, 0x04, 0x3f, 0x2c, 0x34, 0x38, 0x52, + 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xd3, 0x07, 0x0a, 0x0e, + 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, + 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, + 0x64, 0x75, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x75, 0x74, 0x79, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x11, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x64, 0x75, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, + 0x75, 0x74, 0x79, 0x52, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x44, 0x75, + 0x74, 0x69, 0x65, 0x73, 0x1a, 0x84, 0x06, 0x0a, 0x04, 0x44, 0x75, 0x74, 0x79, 0x12, 0x6d, 0x0a, + 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x04, + 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, + 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, + 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x12, 0x78, 0x0a, 0x0f, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, + 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, + 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x6a, 0x0a, 0x0d, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, + 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, + 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, + 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, + 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, + 0x6f, 0x74, 0x12, 0x6c, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, + 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, + 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, + 0x74, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x73, + 0x12, 0x25, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x52, 0x09, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x78, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, + 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, + 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, + 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x12, 0x2c, 0x0a, + 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x65, 0x73, 0x41, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, + 0x02, 0x22, 0xb0, 0x02, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, + 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, + 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x2b, 0x0a, + 0x0d, 0x72, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x52, 0x0c, 0x72, 0x61, + 0x6e, 0x64, 0x61, 0x6f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, + 0x18, 0x02, 0x33, 0x32, 0x52, 0x08, 0x67, 0x72, 0x61, 0x66, 0x66, 0x69, 0x74, 0x69, 0x12, 0x24, + 0x0a, 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6d, 0x65, 0x76, 0x5f, 0x62, 0x6f, 0x6f, 0x73, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x4d, 0x65, 0x76, 0x42, + 0x6f, 0x6f, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x14, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, + 0x62, 0x6f, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x6f, 0x6f, 0x73, 0x74, 0x46, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x22, 0x38, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, + 0x02, 0x33, 0x32, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x3a, + 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x69, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x72, 0x6f, + 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, + 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0xed, 0x01, 0x0a, 0x16, 0x41, + 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, + 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, + 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, + 0x12, 0x78, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, + 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, + 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x4c, 0x0a, 0x0e, 0x41, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x15, + 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, + 0x02, 0x33, 0x32, 0x52, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0xd0, 0x02, 0x0a, 0x19, 0x41, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, @@ -3414,658 +3453,638 @@ var file_proto_prysm_v1alpha1_validator_proto_rawDesc = []byte{ 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0e, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x4c, 0x0a, 0x0e, 0x41, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, - 0x15, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, - 0x18, 0x02, 0x33, 0x32, 0x52, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0xd0, 0x02, 0x0a, 0x19, 0x41, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, - 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, - 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, - 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, - 0x6f, 0x74, 0x12, 0x78, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, - 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, - 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, - 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0e, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2f, 0x0a, 0x0a, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, 0x70, 0x75, 0x62, 0x6b, - 0x65, 0x79, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2d, 0x0a, - 0x0e, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x0d, 0x73, - 0x6c, 0x6f, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x81, 0x01, 0x0a, - 0x1a, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x13, 0x61, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x11, 0x61, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x22, 0x8f, 0x01, 0x0a, 0x21, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, - 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x22, 0x96, 0x01, 0x0a, 0x1c, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, - 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x76, 0x0a, 0x1a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x67, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2f, 0x0a, 0x0a, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, + 0x10, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, + 0x79, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x0e, + 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x39, 0x36, 0x52, 0x0d, 0x73, 0x6c, + 0x6f, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x1a, + 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x13, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x17, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xa4, 0x01, 0x0a, 0x23, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x1a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, 0x17, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x22, 0x5b, 0x0a, 0x1d, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x15, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x13, 0x61, 0x74, 0x74, 0x65, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x6f, 0x6f, 0x74, 0x22, - 0x9a, 0x02, 0x0a, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x53, 0x75, 0x62, - 0x6e, 0x65, 0x74, 0x73, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, - 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, - 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x05, 0x73, 0x6c, 0x6f, 0x74, - 0x73, 0x12, 0x74, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x5f, 0x69, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, - 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, - 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, - 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x65, 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x61, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x08, 0x52, 0x0c, - 0x69, 0x73, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x9e, 0x05, 0x0a, - 0x09, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, - 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, - 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x16, 0x77, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, - 0x02, 0x33, 0x32, 0x52, 0x15, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, - 0x64, 0x12, 0x88, 0x01, 0x0a, 0x1c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, - 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, - 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, - 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x52, 0x1a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x69, 0x67, - 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x71, 0x0a, 0x10, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, - 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, - 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, - 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x0f, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, - 0x65, 0x0a, 0x0a, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, - 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, - 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x09, 0x65, 0x78, 0x69, - 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x75, 0x0a, 0x12, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x11, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, + 0x8f, 0x01, 0x0a, 0x21, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, + 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, 0x11, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x22, 0x96, 0x01, 0x0a, 0x1c, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x76, 0x0a, 0x1a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x17, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xa4, 0x01, 0x0a, 0x23, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x1a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, 0x17, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x22, 0x5b, 0x0a, 0x1d, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x15, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, 0x52, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x9a, + 0x02, 0x0a, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x53, 0x75, 0x62, 0x6e, + 0x65, 0x74, 0x73, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, - 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x8e, 0x05, - 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x19, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x17, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0b, 0x76, 0x6f, 0x74, 0x65, - 0x64, 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x0a, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, 0x12, 0x29, 0x0a, - 0x0e, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x65, 0x6c, 0x69, 0x67, 0x69, - 0x62, 0x6c, 0x65, 0x45, 0x74, 0x68, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x19, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, - 0x77, 0x65, 0x69, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x67, - 0x77, 0x65, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x47, 0x77, 0x65, 0x69, 0x12, 0x4c, 0x0a, 0x23, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x1f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x77, - 0x65, 0x69, 0x12, 0x3b, 0x0a, 0x1a, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x77, 0x65, 0x69, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x77, 0x65, 0x69, 0x12, - 0x41, 0x0a, 0x1d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x77, 0x65, 0x69, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x77, - 0x65, 0x69, 0x12, 0x4e, 0x0a, 0x24, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x77, - 0x65, 0x69, 0x12, 0x4a, 0x0a, 0x22, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1e, - 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x48, 0x65, 0x61, - 0x64, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x77, 0x65, 0x69, 0x22, 0xad, - 0x03, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, - 0x65, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, - 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, - 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x5c, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, - 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, - 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, - 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0xce, - 0x02, 0x0a, 0x13, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6a, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, - 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x73, 0x1a, 0xca, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, - 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x52, 0x09, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x5c, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, + 0x12, 0x74, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, + 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, + 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x65, 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x08, 0x52, 0x0c, 0x69, + 0x73, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x9e, 0x05, 0x0a, 0x09, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, 0x8a, + 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x52, + 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x16, 0x77, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, + 0x33, 0x32, 0x52, 0x15, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, + 0x12, 0x88, 0x01, 0x0a, 0x1c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, - 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, - 0x02, 0x33, 0x32, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x22, - 0xe4, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x6f, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, - 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, - 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x64, - 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x3d, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4f, 0x6e, 0x6c, - 0x79, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x3e, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4f, 0x6e, 0x6c, - 0x79, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xca, 0x02, 0x0a, 0x1c, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, - 0x65, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x69, 0x0a, 0x0a, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, - 0x73, 0x1a, 0xbe, 0x01, 0x0a, 0x15, 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x0d, 0x66, - 0x65, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x32, 0x30, 0x52, 0x0c, 0x66, 0x65, 0x65, 0x52, - 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x78, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x1a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x69, 0x67, 0x69, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x71, 0x0a, 0x10, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, + 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, + 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x0f, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x65, + 0x0a, 0x0a, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, + 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x09, 0x65, 0x78, 0x69, 0x74, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x75, 0x0a, 0x12, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x4e, 0x0a, 0x1b, 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, - 0x6e, 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, - 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x22, 0x4b, 0x0a, 0x1c, 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, - 0x6e, 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x0d, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x32, - 0x30, 0x52, 0x0c, 0x66, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x22, - 0x91, 0x01, 0x0a, 0x1e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, - 0x18, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x4b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x88, 0x02, 0x0a, 0x26, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x69, 0x67, 0x41, 0x6e, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, - 0x0a, 0x04, 0x6d, 0x73, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, 0x6d, 0x73, 0x67, 0x73, 0x12, - 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, - 0xb5, 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, + 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x8e, 0x05, 0x0a, + 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x19, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x42, 0x02, 0x18, 0x01, 0x52, 0x17, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0b, 0x76, 0x6f, 0x74, 0x65, 0x64, + 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x0a, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x0e, + 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, + 0x6c, 0x65, 0x45, 0x74, 0x68, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x67, 0x77, 0x65, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x77, + 0x65, 0x69, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x77, + 0x65, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, + 0x77, 0x65, 0x69, 0x12, 0x4c, 0x0a, 0x23, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x1f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x77, 0x65, + 0x69, 0x12, 0x3b, 0x0a, 0x1a, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x77, 0x65, 0x69, 0x12, 0x41, + 0x0a, 0x1d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x77, 0x65, + 0x69, 0x12, 0x4e, 0x0a, 0x24, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x77, 0x65, + 0x69, 0x12, 0x4a, 0x0a, 0x22, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x67, 0x77, 0x65, 0x69, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1e, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x48, 0x65, 0x61, 0x64, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x77, 0x65, 0x69, 0x22, 0xad, 0x03, + 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x65, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x4f, 0x82, + 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, - 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x75, - 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, - 0x75, 0x62, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, - 0x02, 0x33, 0x32, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x64, - 0x0a, 0x27, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x53, 0x69, 0x67, 0x41, - 0x6e, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x67, - 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0d, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x53, 0x69, 0x67, - 0x12, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x62, 0x69, 0x74, 0x73, 0x2a, 0x9a, 0x01, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, - 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x10, - 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, - 0x0a, 0x0a, 0x06, 0x45, 0x58, 0x49, 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x54, - 0x49, 0x41, 0x4c, 0x4c, 0x59, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x44, 0x10, - 0x08, 0x32, 0xf5, 0x28, 0x0a, 0x13, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x80, 0x01, 0x0a, 0x09, 0x47, 0x65, - 0x74, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x65, - 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x81, 0x01, 0x0a, - 0x0a, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x12, 0x1e, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x12, 0x8e, 0x01, 0x0a, 0x11, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2b, 0x12, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x88, 0x02, 0x01, 0x30, - 0x01, 0x12, 0xb2, 0x01, 0x0a, 0x11, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x65, 0x74, 0x68, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x5c, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, + 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, + 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0xce, 0x02, + 0x0a, 0x13, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6a, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, + 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x11, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x1a, 0xca, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x02, + 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x52, 0x09, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x5c, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x46, 0x82, 0xb5, 0x18, 0x42, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, + 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, + 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, + 0x33, 0x32, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0xe4, + 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x88, 0x02, 0x01, 0x30, 0x01, 0x12, 0x94, 0x01, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x6f, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, 0x8a, + 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x52, + 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x75, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, + 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x3d, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, + 0x6c, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, + 0x3a, 0x02, 0x18, 0x01, 0x22, 0x3e, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, + 0x3a, 0x02, 0x18, 0x01, 0x22, 0xca, 0x02, 0x0a, 0x1c, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x69, 0x0a, 0x0a, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, - 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x98, 0x01, - 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x17, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x65, 0x74, + 0x31, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, + 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x73, + 0x1a, 0xbe, 0x01, 0x0a, 0x15, 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x0d, 0x66, 0x65, + 0x65, 0x5f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x32, 0x30, 0x52, 0x0c, 0x66, 0x65, 0x65, 0x52, 0x65, + 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x78, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x4f, 0x82, 0xb5, 0x18, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, + 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, + 0x73, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x4e, 0x0a, 0x1b, 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, + 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, + 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x22, 0x4b, 0x0a, 0x1c, 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, + 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2b, 0x0a, 0x0d, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x32, 0x30, + 0x52, 0x0c, 0x66, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x91, + 0x01, 0x0a, 0x1e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x54, 0x6f, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, + 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x88, 0x02, 0x0a, 0x26, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x69, 0x67, 0x41, 0x6e, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, + 0x04, 0x6d, 0x73, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x65, 0x74, + 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, 0x6d, 0x73, 0x67, 0x73, 0x12, 0x59, + 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, 0xb5, + 0x18, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, + 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, + 0x2f, 0x76, 0x35, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x2d, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2e, 0x53, + 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x75, 0x62, + 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, + 0x33, 0x32, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x64, 0x0a, + 0x27, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x53, 0x69, 0x67, 0x41, 0x6e, + 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0d, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x53, 0x69, 0x67, 0x12, + 0x12, 0x0a, 0x04, 0x62, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, + 0x69, 0x74, 0x73, 0x2a, 0x9a, 0x01, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x44, + 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, + 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0a, + 0x0a, 0x06, 0x45, 0x58, 0x49, 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x54, 0x49, + 0x41, 0x4c, 0x4c, 0x59, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x44, 0x10, 0x08, + 0x32, 0xf5, 0x28, 0x0a, 0x13, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x80, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, + 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, + 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x87, 0x01, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x23, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x69, 0x63, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x65, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2f, + 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x0a, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, + 0x1e, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, + 0x8e, 0x01, 0x0a, 0x11, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, + 0x12, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x88, 0x02, 0x01, 0x30, 0x01, + 0x12, 0xb2, 0x01, 0x0a, 0x11, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x88, 0x02, 0x01, 0x30, 0x01, 0x12, 0x94, 0x01, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, + 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x98, 0x01, 0x0a, + 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2e, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x17, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x35, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x65, 0x74, 0x68, + 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x87, 0x01, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x23, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x69, 0x63, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, + 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x65, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2f, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, - 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, - 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x32, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0xa0, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x12, 0x33, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, - 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x70, 0x72, 0x65, - 0x70, 0x61, 0x72, 0x65, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x65, 0x72, 0x12, 0xbf, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x52, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, + 0x2a, 0x22, 0x1d, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, + 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x12, 0xa0, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x12, 0x33, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x3a, + 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x70, 0x72, 0x65, 0x70, + 0x61, 0x72, 0x65, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x65, 0x72, 0x12, 0xbf, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x52, 0x65, + 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, + 0x32, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, + 0x69, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x12, 0x32, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x65, 0x63, 0x69, - 0x70, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x65, 0x65, - 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x50, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x35, 0x3a, 0x01, 0x2a, 0x22, 0x30, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x66, 0x65, - 0x65, 0x5f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x79, 0x5f, 0x70, - 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x12, 0x98, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x74, - 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, + 0x3a, 0x01, 0x2a, 0x22, 0x30, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x66, 0x65, 0x65, + 0x5f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x75, + 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x12, 0x98, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, + 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x65, - 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x8f, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x25, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, 0x22, 0x23, - 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0xa5, 0x01, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, - 0x61, 0x12, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x1a, 0x25, 0x2e, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, 0x01, 0x2a, 0x22, 0x2b, - 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0xb2, 0x01, 0x0a, 0x1d, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x30, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x65, 0x74, + 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x8f, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x74, 0x74, 0x65, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x25, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, 0x22, 0x23, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x12, 0xc8, 0x01, 0x0a, 0x24, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x30, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x65, 0x74, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0xa5, 0x01, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, + 0x12, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x1a, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, - 0x22, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0xbe, 0x01, 0x0a, 0x23, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, 0x01, 0x2a, 0x22, 0x2b, 0x2f, + 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0xb2, 0x01, 0x0a, 0x1d, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x30, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, + 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x65, + 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, + 0xc8, 0x01, 0x0a, 0x24, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x30, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x65, 0x74, 0x68, 0x2f, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0xd4, 0x01, 0x0a, - 0x2a, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, - 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x3a, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, + 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, + 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0xbe, 0x01, 0x0a, 0x23, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x72, 0x61, 0x12, 0x8e, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x45, - 0x78, 0x69, 0x74, 0x12, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x1a, - 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x45, - 0x78, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, - 0x65, 0x78, 0x69, 0x74, 0x12, 0xa1, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x53, 0x75, 0x62, 0x6e, 0x65, - 0x74, 0x73, 0x12, 0x37, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x65, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, - 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x2f, 0x73, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x9a, 0x01, 0x0a, 0x11, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x12, 0x2a, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, - 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x65, 0x74, 0x68, + 0x72, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0xd4, 0x01, 0x0a, 0x2a, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x12, 0x3a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, - 0x24, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x67, - 0x61, 0x6e, 0x67, 0x65, 0x72, 0x12, 0x9f, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, - 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, - 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x89, 0x01, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2b, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x72, 0x61, 0x12, 0x8e, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, + 0x69, 0x74, 0x12, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x1a, 0x2a, + 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, + 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x65, + 0x78, 0x69, 0x74, 0x12, 0xa1, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x73, 0x12, 0x37, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x65, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, + 0x74, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0xb4, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, - 0x75, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x75, 0x62, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, - 0x6e, 0x63, 0x53, 0x75, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0xc4, 0x01, 0x0a, 0x1c, 0x47, - 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, - 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x01, - 0x2a, 0x22, 0x2e, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0xaf, 0x01, 0x0a, 0x20, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, - 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x2f, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x9a, 0x01, 0x0a, 0x11, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x12, 0x2a, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, + 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x67, 0x61, + 0x6e, 0x67, 0x65, 0x72, 0x12, 0x9f, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, + 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x89, 0x01, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2b, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x22, 0x35, 0x2f, 0x65, - 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x9e, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x6c, - 0x6f, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x6c, 0x6f, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x73, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x88, - 0x02, 0x01, 0x30, 0x01, 0x12, 0xa1, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x12, 0x2a, 0x2e, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x65, + 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2f, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x88, 0x02, 0x01, 0x30, 0x01, 0x12, 0x9e, 0x01, 0x0a, 0x1c, 0x53, 0x75, 0x62, - 0x6d, 0x69, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x2e, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x56, 0x31, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, - 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xae, 0x01, 0x0a, 0x17, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x53, - 0x75, 0x62, 0x6e, 0x65, 0x74, 0x12, 0x35, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x53, - 0x75, 0x62, 0x6e, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x3a, 0x01, 0x2a, 0x22, - 0x39, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2f, - 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x12, 0xec, 0x01, 0x0a, 0x1f, 0x41, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x53, 0x69, 0x67, 0x41, 0x6e, 0x64, 0x41, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x12, 0x3d, - 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x69, 0x67, 0x41, 0x6e, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0xb4, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x75, + 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x33, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x75, 0x62, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, + 0x63, 0x53, 0x75, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x27, 0x12, 0x25, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0xc4, 0x01, 0x0a, 0x1c, 0x47, 0x65, + 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x79, 0x6e, 0x63, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x01, 0x2a, + 0x22, 0x2e, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0xaf, 0x01, 0x0a, 0x20, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x22, 0x35, 0x2f, 0x65, 0x74, + 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x9e, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x6c, 0x6f, + 0x74, 0x73, 0x12, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x6c, 0x6f, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2d, 0x12, 0x2b, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x73, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x88, 0x02, + 0x01, 0x30, 0x01, 0x12, 0xa1, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x41, 0x6c, 0x74, 0x61, 0x69, 0x72, 0x12, 0x2a, 0x2e, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x65, 0x74, + 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2f, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x88, 0x02, 0x01, 0x30, 0x01, 0x12, 0x9e, 0x01, 0x0a, 0x1c, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x56, 0x31, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, + 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xae, 0x01, 0x0a, 0x17, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x53, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x12, 0x35, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x53, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x3a, 0x01, 0x2a, 0x22, 0x39, + 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2f, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, + 0x74, 0x6f, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x12, 0xec, 0x01, 0x0a, 0x1f, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x53, 0x69, 0x67, 0x41, 0x6e, 0x64, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x12, 0x3d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x53, 0x69, 0x67, 0x41, 0x6e, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x73, 0x69, 0x67, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x42, 0x93, 0x01, 0x0a, 0x19, 0x6f, 0x72, - 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, - 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x3b, 0x65, 0x74, 0x68, 0xaa, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x45, 0x74, 0x68, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x5c, 0x45, 0x74, 0x68, 0x5c, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x42, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x69, 0x67, 0x41, 0x6e, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x73, 0x69, 0x67, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x42, 0x93, 0x01, 0x0a, 0x19, 0x6f, 0x72, 0x67, + 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, + 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x3b, 0x65, 0x74, 0x68, 0xaa, 0x02, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x45, 0x74, 0x68, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x5c, 0x45, 0x74, 0x68, 0x5c, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4140,22 +4159,23 @@ var file_proto_prysm_v1alpha1_validator_proto_goTypes = []interface{}{ (*SignedBeaconBlockCapella)(nil), // 54: ethereum.eth.v1alpha1.SignedBeaconBlockCapella (*SignedBeaconBlockDeneb)(nil), // 55: ethereum.eth.v1alpha1.SignedBeaconBlockDeneb (*SignedBeaconBlockElectra)(nil), // 56: ethereum.eth.v1alpha1.SignedBeaconBlockElectra - (*wrapperspb.UInt64Value)(nil), // 57: google.protobuf.UInt64Value - (*AggregateAttestationAndProof)(nil), // 58: ethereum.eth.v1alpha1.AggregateAttestationAndProof - (*AggregateAttestationAndProofElectra)(nil), // 59: ethereum.eth.v1alpha1.AggregateAttestationAndProofElectra - (*SignedAggregateAttestationAndProof)(nil), // 60: ethereum.eth.v1alpha1.SignedAggregateAttestationAndProof - (*SignedAggregateAttestationAndProofElectra)(nil), // 61: ethereum.eth.v1alpha1.SignedAggregateAttestationAndProofElectra - (*SyncCommitteeMessage)(nil), // 62: ethereum.eth.v1alpha1.SyncCommitteeMessage - (*emptypb.Empty)(nil), // 63: google.protobuf.Empty - (*GenericSignedBeaconBlock)(nil), // 64: ethereum.eth.v1alpha1.GenericSignedBeaconBlock - (*Attestation)(nil), // 65: ethereum.eth.v1alpha1.Attestation - (*AttestationElectra)(nil), // 66: ethereum.eth.v1alpha1.AttestationElectra - (*SignedVoluntaryExit)(nil), // 67: ethereum.eth.v1alpha1.SignedVoluntaryExit - (*SignedContributionAndProof)(nil), // 68: ethereum.eth.v1alpha1.SignedContributionAndProof - (*SignedValidatorRegistrationsV1)(nil), // 69: ethereum.eth.v1alpha1.SignedValidatorRegistrationsV1 - (*GenericBeaconBlock)(nil), // 70: ethereum.eth.v1alpha1.GenericBeaconBlock - (*AttestationData)(nil), // 71: ethereum.eth.v1alpha1.AttestationData - (*SyncCommitteeContribution)(nil), // 72: ethereum.eth.v1alpha1.SyncCommitteeContribution + (*SignedBeaconBlockFulu)(nil), // 57: ethereum.eth.v1alpha1.SignedBeaconBlockFulu + (*wrapperspb.UInt64Value)(nil), // 58: google.protobuf.UInt64Value + (*AggregateAttestationAndProof)(nil), // 59: ethereum.eth.v1alpha1.AggregateAttestationAndProof + (*AggregateAttestationAndProofElectra)(nil), // 60: ethereum.eth.v1alpha1.AggregateAttestationAndProofElectra + (*SignedAggregateAttestationAndProof)(nil), // 61: ethereum.eth.v1alpha1.SignedAggregateAttestationAndProof + (*SignedAggregateAttestationAndProofElectra)(nil), // 62: ethereum.eth.v1alpha1.SignedAggregateAttestationAndProofElectra + (*SyncCommitteeMessage)(nil), // 63: ethereum.eth.v1alpha1.SyncCommitteeMessage + (*emptypb.Empty)(nil), // 64: google.protobuf.Empty + (*GenericSignedBeaconBlock)(nil), // 65: ethereum.eth.v1alpha1.GenericSignedBeaconBlock + (*Attestation)(nil), // 66: ethereum.eth.v1alpha1.Attestation + (*AttestationElectra)(nil), // 67: ethereum.eth.v1alpha1.AttestationElectra + (*SignedVoluntaryExit)(nil), // 68: ethereum.eth.v1alpha1.SignedVoluntaryExit + (*SignedContributionAndProof)(nil), // 69: ethereum.eth.v1alpha1.SignedContributionAndProof + (*SignedValidatorRegistrationsV1)(nil), // 70: ethereum.eth.v1alpha1.SignedValidatorRegistrationsV1 + (*GenericBeaconBlock)(nil), // 71: ethereum.eth.v1alpha1.GenericBeaconBlock + (*AttestationData)(nil), // 72: ethereum.eth.v1alpha1.AttestationData + (*SyncCommitteeContribution)(nil), // 73: ethereum.eth.v1alpha1.SyncCommitteeContribution } var file_proto_prysm_v1alpha1_validator_proto_depIdxs = []int32{ 51, // 0: ethereum.eth.v1alpha1.StreamBlocksResponse.phase0_block:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlock @@ -4164,91 +4184,92 @@ var file_proto_prysm_v1alpha1_validator_proto_depIdxs = []int32{ 54, // 3: ethereum.eth.v1alpha1.StreamBlocksResponse.capella_block:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockCapella 55, // 4: ethereum.eth.v1alpha1.StreamBlocksResponse.deneb_block:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockDeneb 56, // 5: ethereum.eth.v1alpha1.StreamBlocksResponse.electra_block:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockElectra - 46, // 6: ethereum.eth.v1alpha1.ValidatorActivationResponse.statuses:type_name -> ethereum.eth.v1alpha1.ValidatorActivationResponse.Status - 0, // 7: ethereum.eth.v1alpha1.ValidatorStatusResponse.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus - 16, // 8: ethereum.eth.v1alpha1.MultipleValidatorStatusResponse.statuses:type_name -> ethereum.eth.v1alpha1.ValidatorStatusResponse - 47, // 9: ethereum.eth.v1alpha1.DutiesResponse.current_epoch_duties:type_name -> ethereum.eth.v1alpha1.DutiesResponse.Duty - 47, // 10: ethereum.eth.v1alpha1.DutiesResponse.next_epoch_duties:type_name -> ethereum.eth.v1alpha1.DutiesResponse.Duty - 57, // 11: ethereum.eth.v1alpha1.BlockRequest.builder_boost_factor:type_name -> google.protobuf.UInt64Value - 58, // 12: ethereum.eth.v1alpha1.AggregateSelectionResponse.aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.AggregateAttestationAndProof - 59, // 13: ethereum.eth.v1alpha1.AggregateSelectionElectraResponse.aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.AggregateAttestationAndProofElectra - 60, // 14: ethereum.eth.v1alpha1.SignedAggregateSubmitRequest.signed_aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.SignedAggregateAttestationAndProof - 61, // 15: ethereum.eth.v1alpha1.SignedAggregateSubmitElectraRequest.signed_aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.SignedAggregateAttestationAndProofElectra - 0, // 16: ethereum.eth.v1alpha1.ValidatorInfo.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus - 48, // 17: ethereum.eth.v1alpha1.DoppelGangerRequest.validator_requests:type_name -> ethereum.eth.v1alpha1.DoppelGangerRequest.ValidatorRequest - 49, // 18: ethereum.eth.v1alpha1.DoppelGangerResponse.responses:type_name -> ethereum.eth.v1alpha1.DoppelGangerResponse.ValidatorResponse - 50, // 19: ethereum.eth.v1alpha1.PrepareBeaconProposerRequest.recipients:type_name -> ethereum.eth.v1alpha1.PrepareBeaconProposerRequest.FeeRecipientContainer - 0, // 20: ethereum.eth.v1alpha1.AssignValidatorToSubnetRequest.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus - 62, // 21: ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsRequest.msgs:type_name -> ethereum.eth.v1alpha1.SyncCommitteeMessage - 16, // 22: ethereum.eth.v1alpha1.ValidatorActivationResponse.Status.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatusResponse - 0, // 23: ethereum.eth.v1alpha1.DutiesResponse.Duty.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus - 19, // 24: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:input_type -> ethereum.eth.v1alpha1.DutiesRequest - 7, // 25: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:input_type -> ethereum.eth.v1alpha1.DomainRequest - 63, // 26: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:input_type -> google.protobuf.Empty - 9, // 27: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:input_type -> ethereum.eth.v1alpha1.ValidatorActivationRequest - 13, // 28: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:input_type -> ethereum.eth.v1alpha1.ValidatorIndexRequest - 15, // 29: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:input_type -> ethereum.eth.v1alpha1.ValidatorStatusRequest - 17, // 30: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:input_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusRequest - 21, // 31: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBeaconBlock:input_type -> ethereum.eth.v1alpha1.BlockRequest - 64, // 32: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBeaconBlock:input_type -> ethereum.eth.v1alpha1.GenericSignedBeaconBlock - 40, // 33: ethereum.eth.v1alpha1.BeaconNodeValidator.PrepareBeaconProposer:input_type -> ethereum.eth.v1alpha1.PrepareBeaconProposerRequest - 41, // 34: ethereum.eth.v1alpha1.BeaconNodeValidator.GetFeeRecipientByPubKey:input_type -> ethereum.eth.v1alpha1.FeeRecipientByPubKeyRequest - 24, // 35: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:input_type -> ethereum.eth.v1alpha1.AttestationDataRequest - 65, // 36: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:input_type -> ethereum.eth.v1alpha1.Attestation - 66, // 37: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestationElectra:input_type -> ethereum.eth.v1alpha1.AttestationElectra - 26, // 38: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.AggregateSelectionRequest - 26, // 39: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProofElectra:input_type -> ethereum.eth.v1alpha1.AggregateSelectionRequest - 29, // 40: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitRequest - 30, // 41: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProofElectra:input_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitElectraRequest - 67, // 42: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:input_type -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 32, // 43: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:input_type -> ethereum.eth.v1alpha1.CommitteeSubnetsSubscribeRequest - 36, // 44: ethereum.eth.v1alpha1.BeaconNodeValidator.CheckDoppelGanger:input_type -> ethereum.eth.v1alpha1.DoppelGangerRequest - 63, // 45: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncMessageBlockRoot:input_type -> google.protobuf.Empty - 62, // 46: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSyncMessage:input_type -> ethereum.eth.v1alpha1.SyncCommitteeMessage - 2, // 47: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncSubcommitteeIndex:input_type -> ethereum.eth.v1alpha1.SyncSubcommitteeIndexRequest - 3, // 48: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncCommitteeContribution:input_type -> ethereum.eth.v1alpha1.SyncCommitteeContributionRequest - 68, // 49: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedContributionAndProof:input_type -> ethereum.eth.v1alpha1.SignedContributionAndProof - 38, // 50: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamSlots:input_type -> ethereum.eth.v1alpha1.StreamSlotsRequest - 39, // 51: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamBlocksAltair:input_type -> ethereum.eth.v1alpha1.StreamBlocksRequest - 69, // 52: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitValidatorRegistrations:input_type -> ethereum.eth.v1alpha1.SignedValidatorRegistrationsV1 - 43, // 53: ethereum.eth.v1alpha1.BeaconNodeValidator.AssignValidatorToSubnet:input_type -> ethereum.eth.v1alpha1.AssignValidatorToSubnetRequest - 44, // 54: ethereum.eth.v1alpha1.BeaconNodeValidator.AggregatedSigAndAggregationBits:input_type -> ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsRequest - 20, // 55: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:output_type -> ethereum.eth.v1alpha1.DutiesResponse - 8, // 56: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:output_type -> ethereum.eth.v1alpha1.DomainResponse - 11, // 57: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:output_type -> ethereum.eth.v1alpha1.ChainStartResponse - 10, // 58: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:output_type -> ethereum.eth.v1alpha1.ValidatorActivationResponse - 14, // 59: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:output_type -> ethereum.eth.v1alpha1.ValidatorIndexResponse - 16, // 60: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:output_type -> ethereum.eth.v1alpha1.ValidatorStatusResponse - 18, // 61: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:output_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusResponse - 70, // 62: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBeaconBlock:output_type -> ethereum.eth.v1alpha1.GenericBeaconBlock - 22, // 63: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBeaconBlock:output_type -> ethereum.eth.v1alpha1.ProposeResponse - 63, // 64: ethereum.eth.v1alpha1.BeaconNodeValidator.PrepareBeaconProposer:output_type -> google.protobuf.Empty - 42, // 65: ethereum.eth.v1alpha1.BeaconNodeValidator.GetFeeRecipientByPubKey:output_type -> ethereum.eth.v1alpha1.FeeRecipientByPubKeyResponse - 71, // 66: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:output_type -> ethereum.eth.v1alpha1.AttestationData - 25, // 67: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:output_type -> ethereum.eth.v1alpha1.AttestResponse - 25, // 68: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestationElectra:output_type -> ethereum.eth.v1alpha1.AttestResponse - 27, // 69: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.AggregateSelectionResponse - 28, // 70: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProofElectra:output_type -> ethereum.eth.v1alpha1.AggregateSelectionElectraResponse - 31, // 71: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitResponse - 31, // 72: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProofElectra:output_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitResponse - 23, // 73: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:output_type -> ethereum.eth.v1alpha1.ProposeExitResponse - 63, // 74: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:output_type -> google.protobuf.Empty - 37, // 75: ethereum.eth.v1alpha1.BeaconNodeValidator.CheckDoppelGanger:output_type -> ethereum.eth.v1alpha1.DoppelGangerResponse - 1, // 76: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncMessageBlockRoot:output_type -> ethereum.eth.v1alpha1.SyncMessageBlockRootResponse - 63, // 77: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSyncMessage:output_type -> google.protobuf.Empty - 4, // 78: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncSubcommitteeIndex:output_type -> ethereum.eth.v1alpha1.SyncSubcommitteeIndexResponse - 72, // 79: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncCommitteeContribution:output_type -> ethereum.eth.v1alpha1.SyncCommitteeContribution - 63, // 80: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedContributionAndProof:output_type -> google.protobuf.Empty - 5, // 81: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamSlots:output_type -> ethereum.eth.v1alpha1.StreamSlotsResponse - 6, // 82: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamBlocksAltair:output_type -> ethereum.eth.v1alpha1.StreamBlocksResponse - 63, // 83: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitValidatorRegistrations:output_type -> google.protobuf.Empty - 63, // 84: ethereum.eth.v1alpha1.BeaconNodeValidator.AssignValidatorToSubnet:output_type -> google.protobuf.Empty - 45, // 85: ethereum.eth.v1alpha1.BeaconNodeValidator.AggregatedSigAndAggregationBits:output_type -> ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsResponse - 55, // [55:86] is the sub-list for method output_type - 24, // [24:55] is the sub-list for method input_type - 24, // [24:24] is the sub-list for extension type_name - 24, // [24:24] is the sub-list for extension extendee - 0, // [0:24] is the sub-list for field type_name + 57, // 6: ethereum.eth.v1alpha1.StreamBlocksResponse.fulu_block:type_name -> ethereum.eth.v1alpha1.SignedBeaconBlockFulu + 46, // 7: ethereum.eth.v1alpha1.ValidatorActivationResponse.statuses:type_name -> ethereum.eth.v1alpha1.ValidatorActivationResponse.Status + 0, // 8: ethereum.eth.v1alpha1.ValidatorStatusResponse.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus + 16, // 9: ethereum.eth.v1alpha1.MultipleValidatorStatusResponse.statuses:type_name -> ethereum.eth.v1alpha1.ValidatorStatusResponse + 47, // 10: ethereum.eth.v1alpha1.DutiesResponse.current_epoch_duties:type_name -> ethereum.eth.v1alpha1.DutiesResponse.Duty + 47, // 11: ethereum.eth.v1alpha1.DutiesResponse.next_epoch_duties:type_name -> ethereum.eth.v1alpha1.DutiesResponse.Duty + 58, // 12: ethereum.eth.v1alpha1.BlockRequest.builder_boost_factor:type_name -> google.protobuf.UInt64Value + 59, // 13: ethereum.eth.v1alpha1.AggregateSelectionResponse.aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.AggregateAttestationAndProof + 60, // 14: ethereum.eth.v1alpha1.AggregateSelectionElectraResponse.aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.AggregateAttestationAndProofElectra + 61, // 15: ethereum.eth.v1alpha1.SignedAggregateSubmitRequest.signed_aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.SignedAggregateAttestationAndProof + 62, // 16: ethereum.eth.v1alpha1.SignedAggregateSubmitElectraRequest.signed_aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.SignedAggregateAttestationAndProofElectra + 0, // 17: ethereum.eth.v1alpha1.ValidatorInfo.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus + 48, // 18: ethereum.eth.v1alpha1.DoppelGangerRequest.validator_requests:type_name -> ethereum.eth.v1alpha1.DoppelGangerRequest.ValidatorRequest + 49, // 19: ethereum.eth.v1alpha1.DoppelGangerResponse.responses:type_name -> ethereum.eth.v1alpha1.DoppelGangerResponse.ValidatorResponse + 50, // 20: ethereum.eth.v1alpha1.PrepareBeaconProposerRequest.recipients:type_name -> ethereum.eth.v1alpha1.PrepareBeaconProposerRequest.FeeRecipientContainer + 0, // 21: ethereum.eth.v1alpha1.AssignValidatorToSubnetRequest.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus + 63, // 22: ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsRequest.msgs:type_name -> ethereum.eth.v1alpha1.SyncCommitteeMessage + 16, // 23: ethereum.eth.v1alpha1.ValidatorActivationResponse.Status.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatusResponse + 0, // 24: ethereum.eth.v1alpha1.DutiesResponse.Duty.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus + 19, // 25: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:input_type -> ethereum.eth.v1alpha1.DutiesRequest + 7, // 26: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:input_type -> ethereum.eth.v1alpha1.DomainRequest + 64, // 27: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:input_type -> google.protobuf.Empty + 9, // 28: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:input_type -> ethereum.eth.v1alpha1.ValidatorActivationRequest + 13, // 29: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:input_type -> ethereum.eth.v1alpha1.ValidatorIndexRequest + 15, // 30: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:input_type -> ethereum.eth.v1alpha1.ValidatorStatusRequest + 17, // 31: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:input_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusRequest + 21, // 32: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBeaconBlock:input_type -> ethereum.eth.v1alpha1.BlockRequest + 65, // 33: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBeaconBlock:input_type -> ethereum.eth.v1alpha1.GenericSignedBeaconBlock + 40, // 34: ethereum.eth.v1alpha1.BeaconNodeValidator.PrepareBeaconProposer:input_type -> ethereum.eth.v1alpha1.PrepareBeaconProposerRequest + 41, // 35: ethereum.eth.v1alpha1.BeaconNodeValidator.GetFeeRecipientByPubKey:input_type -> ethereum.eth.v1alpha1.FeeRecipientByPubKeyRequest + 24, // 36: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:input_type -> ethereum.eth.v1alpha1.AttestationDataRequest + 66, // 37: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:input_type -> ethereum.eth.v1alpha1.Attestation + 67, // 38: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestationElectra:input_type -> ethereum.eth.v1alpha1.AttestationElectra + 26, // 39: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.AggregateSelectionRequest + 26, // 40: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProofElectra:input_type -> ethereum.eth.v1alpha1.AggregateSelectionRequest + 29, // 41: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitRequest + 30, // 42: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProofElectra:input_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitElectraRequest + 68, // 43: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:input_type -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 32, // 44: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:input_type -> ethereum.eth.v1alpha1.CommitteeSubnetsSubscribeRequest + 36, // 45: ethereum.eth.v1alpha1.BeaconNodeValidator.CheckDoppelGanger:input_type -> ethereum.eth.v1alpha1.DoppelGangerRequest + 64, // 46: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncMessageBlockRoot:input_type -> google.protobuf.Empty + 63, // 47: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSyncMessage:input_type -> ethereum.eth.v1alpha1.SyncCommitteeMessage + 2, // 48: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncSubcommitteeIndex:input_type -> ethereum.eth.v1alpha1.SyncSubcommitteeIndexRequest + 3, // 49: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncCommitteeContribution:input_type -> ethereum.eth.v1alpha1.SyncCommitteeContributionRequest + 69, // 50: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedContributionAndProof:input_type -> ethereum.eth.v1alpha1.SignedContributionAndProof + 38, // 51: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamSlots:input_type -> ethereum.eth.v1alpha1.StreamSlotsRequest + 39, // 52: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamBlocksAltair:input_type -> ethereum.eth.v1alpha1.StreamBlocksRequest + 70, // 53: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitValidatorRegistrations:input_type -> ethereum.eth.v1alpha1.SignedValidatorRegistrationsV1 + 43, // 54: ethereum.eth.v1alpha1.BeaconNodeValidator.AssignValidatorToSubnet:input_type -> ethereum.eth.v1alpha1.AssignValidatorToSubnetRequest + 44, // 55: ethereum.eth.v1alpha1.BeaconNodeValidator.AggregatedSigAndAggregationBits:input_type -> ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsRequest + 20, // 56: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:output_type -> ethereum.eth.v1alpha1.DutiesResponse + 8, // 57: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:output_type -> ethereum.eth.v1alpha1.DomainResponse + 11, // 58: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:output_type -> ethereum.eth.v1alpha1.ChainStartResponse + 10, // 59: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:output_type -> ethereum.eth.v1alpha1.ValidatorActivationResponse + 14, // 60: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:output_type -> ethereum.eth.v1alpha1.ValidatorIndexResponse + 16, // 61: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:output_type -> ethereum.eth.v1alpha1.ValidatorStatusResponse + 18, // 62: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:output_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusResponse + 71, // 63: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBeaconBlock:output_type -> ethereum.eth.v1alpha1.GenericBeaconBlock + 22, // 64: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBeaconBlock:output_type -> ethereum.eth.v1alpha1.ProposeResponse + 64, // 65: ethereum.eth.v1alpha1.BeaconNodeValidator.PrepareBeaconProposer:output_type -> google.protobuf.Empty + 42, // 66: ethereum.eth.v1alpha1.BeaconNodeValidator.GetFeeRecipientByPubKey:output_type -> ethereum.eth.v1alpha1.FeeRecipientByPubKeyResponse + 72, // 67: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:output_type -> ethereum.eth.v1alpha1.AttestationData + 25, // 68: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:output_type -> ethereum.eth.v1alpha1.AttestResponse + 25, // 69: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestationElectra:output_type -> ethereum.eth.v1alpha1.AttestResponse + 27, // 70: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.AggregateSelectionResponse + 28, // 71: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProofElectra:output_type -> ethereum.eth.v1alpha1.AggregateSelectionElectraResponse + 31, // 72: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitResponse + 31, // 73: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProofElectra:output_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitResponse + 23, // 74: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:output_type -> ethereum.eth.v1alpha1.ProposeExitResponse + 64, // 75: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:output_type -> google.protobuf.Empty + 37, // 76: ethereum.eth.v1alpha1.BeaconNodeValidator.CheckDoppelGanger:output_type -> ethereum.eth.v1alpha1.DoppelGangerResponse + 1, // 77: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncMessageBlockRoot:output_type -> ethereum.eth.v1alpha1.SyncMessageBlockRootResponse + 64, // 78: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSyncMessage:output_type -> google.protobuf.Empty + 4, // 79: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncSubcommitteeIndex:output_type -> ethereum.eth.v1alpha1.SyncSubcommitteeIndexResponse + 73, // 80: ethereum.eth.v1alpha1.BeaconNodeValidator.GetSyncCommitteeContribution:output_type -> ethereum.eth.v1alpha1.SyncCommitteeContribution + 64, // 81: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedContributionAndProof:output_type -> google.protobuf.Empty + 5, // 82: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamSlots:output_type -> ethereum.eth.v1alpha1.StreamSlotsResponse + 6, // 83: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamBlocksAltair:output_type -> ethereum.eth.v1alpha1.StreamBlocksResponse + 64, // 84: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitValidatorRegistrations:output_type -> google.protobuf.Empty + 64, // 85: ethereum.eth.v1alpha1.BeaconNodeValidator.AssignValidatorToSubnet:output_type -> google.protobuf.Empty + 45, // 86: ethereum.eth.v1alpha1.BeaconNodeValidator.AggregatedSigAndAggregationBits:output_type -> ethereum.eth.v1alpha1.AggregatedSigAndAggregationBitsResponse + 56, // [56:87] is the sub-list for method output_type + 25, // [25:56] is the sub-list for method input_type + 25, // [25:25] is the sub-list for extension type_name + 25, // [25:25] is the sub-list for extension extendee + 0, // [0:25] is the sub-list for field type_name } func init() { file_proto_prysm_v1alpha1_validator_proto_init() } @@ -4868,6 +4889,7 @@ func file_proto_prysm_v1alpha1_validator_proto_init() { (*StreamBlocksResponse_CapellaBlock)(nil), (*StreamBlocksResponse_DenebBlock)(nil), (*StreamBlocksResponse_ElectraBlock)(nil), + (*StreamBlocksResponse_FuluBlock)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/proto/prysm/v1alpha1/validator.proto b/proto/prysm/v1alpha1/validator.proto index d4d68d702851..9d981cb29c05 100644 --- a/proto/prysm/v1alpha1/validator.proto +++ b/proto/prysm/v1alpha1/validator.proto @@ -411,6 +411,9 @@ message StreamBlocksResponse { // Representing a electra block. SignedBeaconBlockElectra electra_block = 6; + + // Representing a fulu block. + SignedBeaconBlockFulu fulu_block = 7; } } diff --git a/runtime/interop/BUILD.bazel b/runtime/interop/BUILD.bazel index 454b309e009a..50cffc8cc2e0 100644 --- a/runtime/interop/BUILD.bazel +++ b/runtime/interop/BUILD.bazel @@ -24,7 +24,6 @@ go_library( "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//consensus-types/blocks:go_default_library", - "//consensus-types/interfaces:go_default_library", "//container/trie:go_default_library", "//crypto/bls:go_default_library", "//crypto/hash:go_default_library", diff --git a/runtime/interop/premine-state.go b/runtime/interop/premine-state.go index a8c316157c81..695d6755f292 100644 --- a/runtime/interop/premine-state.go +++ b/runtime/interop/premine-state.go @@ -13,7 +13,6 @@ import ( fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams" "github.com/prysmaticlabs/prysm/v5/config/params" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" - "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" "github.com/prysmaticlabs/prysm/v5/container/trie" "github.com/prysmaticlabs/prysm/v5/crypto/bls" "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" @@ -66,7 +65,7 @@ func NewPreminedGenesis(ctx context.Context, t, nvals, pCreds uint64, version in func (s *PremineGenesisConfig) prepare(ctx context.Context) (state.BeaconState, error) { switch s.Version { - case version.Phase0, version.Altair, version.Bellatrix, version.Capella, version.Deneb, version.Electra: + case version.Phase0, version.Altair, version.Bellatrix, version.Capella, version.Deneb, version.Electra, version.Fulu: default: return nil, errors.Wrapf(errUnsupportedVersion, "version=%s", version.String(s.Version)) } @@ -167,6 +166,11 @@ func (s *PremineGenesisConfig) empty() (state.BeaconState, error) { if err != nil { return nil, err } + case version.Fulu: + e, err = state_native.InitializeFromProtoFulu(ðpb.BeaconStateFulu{}) + if err != nil { + return nil, err + } default: return nil, errUnsupportedVersion } @@ -350,6 +354,8 @@ func (s *PremineGenesisConfig) setFork(g state.BeaconState) error { pv, cv = params.BeaconConfig().CapellaForkVersion, params.BeaconConfig().DenebForkVersion case version.Electra: pv, cv = params.BeaconConfig().DenebForkVersion, params.BeaconConfig().ElectraForkVersion + case version.Fulu: + pv, cv = params.BeaconConfig().ElectraForkVersion, params.BeaconConfig().FuluForkVersion default: return errUnsupportedVersion } @@ -550,7 +556,40 @@ func (s *PremineGenesisConfig) setLatestBlockHeader(g state.BeaconState) error { SyncCommitteeBits: make([]byte, fieldparams.SyncCommitteeLength/8), SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), }, - ExecutionPayload: &enginev1.ExecutionPayloadElectra{ + ExecutionPayload: &enginev1.ExecutionPayloadDeneb{ + ParentHash: make([]byte, 32), + FeeRecipient: make([]byte, 20), + StateRoot: make([]byte, 32), + ReceiptsRoot: make([]byte, 32), + LogsBloom: make([]byte, 256), + PrevRandao: make([]byte, 32), + ExtraData: make([]byte, 0), + BaseFeePerGas: make([]byte, 32), + BlockHash: make([]byte, 32), + Transactions: make([][]byte, 0), + Withdrawals: make([]*enginev1.Withdrawal, 0), + }, + BlsToExecutionChanges: make([]*ethpb.SignedBLSToExecutionChange, 0), + BlobKzgCommitments: make([][]byte, 0), + ExecutionRequests: &enginev1.ExecutionRequests{ + Deposits: make([]*enginev1.DepositRequest, 0), + Withdrawals: make([]*enginev1.WithdrawalRequest, 0), + Consolidations: make([]*enginev1.ConsolidationRequest, 0), + }, + } + case version.Fulu: + body = ðpb.BeaconBlockBodyFulu{ + RandaoReveal: make([]byte, 96), + Eth1Data: ðpb.Eth1Data{ + DepositRoot: make([]byte, 32), + BlockHash: make([]byte, 32), + }, + Graffiti: make([]byte, 32), + SyncAggregate: ðpb.SyncAggregate{ + SyncCommitteeBits: make([]byte, fieldparams.SyncCommitteeLength/8), + SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), + }, + ExecutionPayload: &enginev1.ExecutionPayloadDeneb{ ParentHash: make([]byte, 32), FeeRecipient: make([]byte, 20), StateRoot: make([]byte, 32), @@ -588,16 +627,10 @@ func (s *PremineGenesisConfig) setLatestBlockHeader(g state.BeaconState) error { } func (s *PremineGenesisConfig) setExecutionPayload(g state.BeaconState) error { - if s.Version < version.Bellatrix { - return nil - } - gb := s.GB - var ed interfaces.ExecutionData - switch s.Version { - case version.Bellatrix: - payload := &enginev1.ExecutionPayload{ + if s.Version >= version.Deneb { + payload := &enginev1.ExecutionPayloadDeneb{ ParentHash: gb.ParentHash().Bytes(), FeeRecipient: gb.Coinbase().Bytes(), StateRoot: gb.Root().Bytes(), @@ -612,20 +645,30 @@ func (s *PremineGenesisConfig) setExecutionPayload(g state.BeaconState) error { BaseFeePerGas: bytesutil.PadTo(bytesutil.ReverseByteOrder(gb.BaseFee().Bytes()), fieldparams.RootLength), BlockHash: gb.Hash().Bytes(), Transactions: make([][]byte, 0), + Withdrawals: make([]*enginev1.Withdrawal, 0), + ExcessBlobGas: unwrapUint64Ptr(gb.ExcessBlobGas()), + BlobGasUsed: unwrapUint64Ptr(gb.BlobGasUsed()), } - wep, err := blocks.WrappedExecutionPayload(payload) + + wep, err := blocks.WrappedExecutionPayloadDeneb(payload) if err != nil { return err } - eph, err := blocks.PayloadToHeader(wep) + + eph, err := blocks.PayloadToHeaderDeneb(wep) if err != nil { return err } - ed, err = blocks.WrappedExecutionPayloadHeader(eph) + + ed, err := blocks.WrappedExecutionPayloadHeaderDeneb(eph) if err != nil { return err } - case version.Capella: + + return g.SetLatestExecutionPayloadHeader(ed) + } + + if s.Version >= version.Capella { payload := &enginev1.ExecutionPayloadCapella{ ParentHash: gb.ParentHash().Bytes(), FeeRecipient: gb.Coinbase().Bytes(), @@ -643,52 +686,27 @@ func (s *PremineGenesisConfig) setExecutionPayload(g state.BeaconState) error { Transactions: make([][]byte, 0), Withdrawals: make([]*enginev1.Withdrawal, 0), } + wep, err := blocks.WrappedExecutionPayloadCapella(payload) if err != nil { return err } + eph, err := blocks.PayloadToHeaderCapella(wep) if err != nil { return err } - ed, err = blocks.WrappedExecutionPayloadHeaderCapella(eph) - if err != nil { - return err - } - case version.Deneb: - payload := &enginev1.ExecutionPayloadDeneb{ - ParentHash: gb.ParentHash().Bytes(), - FeeRecipient: gb.Coinbase().Bytes(), - StateRoot: gb.Root().Bytes(), - ReceiptsRoot: gb.ReceiptHash().Bytes(), - LogsBloom: gb.Bloom().Bytes(), - PrevRandao: params.BeaconConfig().ZeroHash[:], - BlockNumber: gb.NumberU64(), - GasLimit: gb.GasLimit(), - GasUsed: gb.GasUsed(), - Timestamp: gb.Time(), - ExtraData: gb.Extra()[:32], - BaseFeePerGas: bytesutil.PadTo(bytesutil.ReverseByteOrder(gb.BaseFee().Bytes()), fieldparams.RootLength), - BlockHash: gb.Hash().Bytes(), - Transactions: make([][]byte, 0), - Withdrawals: make([]*enginev1.Withdrawal, 0), - ExcessBlobGas: unwrapUint64Ptr(gb.ExcessBlobGas()), - BlobGasUsed: unwrapUint64Ptr(gb.BlobGasUsed()), - } - wep, err := blocks.WrappedExecutionPayloadDeneb(payload) - if err != nil { - return err - } - eph, err := blocks.PayloadToHeaderDeneb(wep) - if err != nil { - return err - } - ed, err = blocks.WrappedExecutionPayloadHeaderDeneb(eph) + + ed, err := blocks.WrappedExecutionPayloadHeaderCapella(eph) if err != nil { return err } - case version.Electra: - payload := &enginev1.ExecutionPayloadElectra{ + + return g.SetLatestExecutionPayloadHeader(ed) + } + + if s.Version >= version.Bellatrix { + payload := &enginev1.ExecutionPayload{ ParentHash: gb.ParentHash().Bytes(), FeeRecipient: gb.Coinbase().Bytes(), StateRoot: gb.Root().Bytes(), @@ -703,26 +721,31 @@ func (s *PremineGenesisConfig) setExecutionPayload(g state.BeaconState) error { BaseFeePerGas: bytesutil.PadTo(bytesutil.ReverseByteOrder(gb.BaseFee().Bytes()), fieldparams.RootLength), BlockHash: gb.Hash().Bytes(), Transactions: make([][]byte, 0), - Withdrawals: make([]*enginev1.Withdrawal, 0), - ExcessBlobGas: *gb.ExcessBlobGas(), - BlobGasUsed: *gb.BlobGasUsed(), } - wep, err := blocks.WrappedExecutionPayloadElectra(payload) + + wep, err := blocks.WrappedExecutionPayload(payload) if err != nil { return err } - eph, err := blocks.PayloadToHeaderElectra(wep) + + eph, err := blocks.PayloadToHeader(wep) if err != nil { return err } - ed, err = blocks.WrappedExecutionPayloadHeaderElectra(eph) + + ed, err := blocks.WrappedExecutionPayloadHeader(eph) if err != nil { return err } - default: - return errUnsupportedVersion + + return g.SetLatestExecutionPayloadHeader(ed) + } + + if s.Version >= version.Phase0 { + return nil } - return g.SetLatestExecutionPayloadHeader(ed) + + return errUnsupportedVersion } func unwrapUint64Ptr(u *uint64) uint64 { diff --git a/runtime/version/fork.go b/runtime/version/fork.go index ecf8521ad452..6f9cffe8faba 100644 --- a/runtime/version/fork.go +++ b/runtime/version/fork.go @@ -11,6 +11,7 @@ const ( Capella Deneb Electra + Fulu ) var versionToString = map[int]string{ @@ -20,6 +21,7 @@ var versionToString = map[int]string{ Capella: "capella", Deneb: "deneb", Electra: "electra", + Fulu: "fulu", } // stringToVersion and allVersions are populated in init() diff --git a/testing/bls/hash_to_G2_test.go b/testing/bls/hash_to_G2_test.go index 48db52b6b6f1..ff3c4c8c1689 100644 --- a/testing/bls/hash_to_G2_test.go +++ b/testing/bls/hash_to_G2_test.go @@ -17,7 +17,7 @@ func TestHashToG2(t *testing.T) { } func testHashToG2(t *testing.T) { - t.Skip("Hash To G2 needs co-ordinates exposed") + t.Skip("Hash To G2 needs coordinates exposed") fNames, fContent := utils.RetrieveFiles("hash_to_G2", t) for i, file := range fNames { diff --git a/testing/endtoend/evaluators/metrics.go b/testing/endtoend/evaluators/metrics.go index e3cb9f4095b2..5c245338ba16 100644 --- a/testing/endtoend/evaluators/metrics.go +++ b/testing/endtoend/evaluators/metrics.go @@ -215,7 +215,7 @@ func valueOfTopic(pageContent, topic string) (int, error) { } var result float64 for i, stringIndex := range indexesFound { - // Only performing every third result found since theres 2 comments above every metric. + // Only performing every third result found since there are 2 comments above every metric. if i == 0 || i%2 != 0 { continue } diff --git a/testing/spectest/shared/altair/epoch_processing/BUILD.bazel b/testing/spectest/shared/altair/epoch_processing/BUILD.bazel index d566fdbd43af..0ac32be75d29 100644 --- a/testing/spectest/shared/altair/epoch_processing/BUILD.bazel +++ b/testing/spectest/shared/altair/epoch_processing/BUILD.bazel @@ -26,7 +26,6 @@ go_library( "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", - "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", "//testing/spectest/utils:go_default_library", diff --git a/testing/spectest/shared/altair/epoch_processing/slashings.go b/testing/spectest/shared/altair/epoch_processing/slashings.go index c06b7bc172c8..0e43111ebf7a 100644 --- a/testing/spectest/shared/altair/epoch_processing/slashings.go +++ b/testing/spectest/shared/altair/epoch_processing/slashings.go @@ -7,7 +7,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" - "github.com/prysmaticlabs/prysm/v5/config/params" "github.com/prysmaticlabs/prysm/v5/testing/require" "github.com/prysmaticlabs/prysm/v5/testing/spectest/utils" ) @@ -30,7 +29,7 @@ func RunSlashingsTests(t *testing.T, config string) { } func processSlashingsWrapper(t *testing.T, st state.BeaconState) (state.BeaconState, error) { - st, err := epoch.ProcessSlashings(st, params.BeaconConfig().ProportionalSlashingMultiplierAltair) + st, err := epoch.ProcessSlashings(st) require.NoError(t, err, "Could not process slashings") return st, nil } diff --git a/testing/spectest/shared/bellatrix/epoch_processing/BUILD.bazel b/testing/spectest/shared/bellatrix/epoch_processing/BUILD.bazel index 03ac47eaec86..569637985d43 100644 --- a/testing/spectest/shared/bellatrix/epoch_processing/BUILD.bazel +++ b/testing/spectest/shared/bellatrix/epoch_processing/BUILD.bazel @@ -26,7 +26,6 @@ go_library( "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", - "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", "//testing/spectest/utils:go_default_library", diff --git a/testing/spectest/shared/bellatrix/epoch_processing/slashings.go b/testing/spectest/shared/bellatrix/epoch_processing/slashings.go index 09ea116074f4..1950e47ca0e2 100644 --- a/testing/spectest/shared/bellatrix/epoch_processing/slashings.go +++ b/testing/spectest/shared/bellatrix/epoch_processing/slashings.go @@ -7,7 +7,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" - "github.com/prysmaticlabs/prysm/v5/config/params" "github.com/prysmaticlabs/prysm/v5/testing/require" "github.com/prysmaticlabs/prysm/v5/testing/spectest/utils" ) @@ -30,7 +29,7 @@ func RunSlashingsTests(t *testing.T, config string) { } func processSlashingsWrapper(t *testing.T, st state.BeaconState) (state.BeaconState, error) { - st, err := epoch.ProcessSlashings(st, params.BeaconConfig().ProportionalSlashingMultiplierBellatrix) + st, err := epoch.ProcessSlashings(st) require.NoError(t, err, "Could not process slashings") return st, nil } diff --git a/testing/spectest/shared/capella/epoch_processing/BUILD.bazel b/testing/spectest/shared/capella/epoch_processing/BUILD.bazel index 9fd12223eb3e..02aca35745dd 100644 --- a/testing/spectest/shared/capella/epoch_processing/BUILD.bazel +++ b/testing/spectest/shared/capella/epoch_processing/BUILD.bazel @@ -26,7 +26,6 @@ go_library( "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", - "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", "//testing/spectest/utils:go_default_library", diff --git a/testing/spectest/shared/capella/epoch_processing/slashings.go b/testing/spectest/shared/capella/epoch_processing/slashings.go index ca837abc6144..b8e43db9e0b9 100644 --- a/testing/spectest/shared/capella/epoch_processing/slashings.go +++ b/testing/spectest/shared/capella/epoch_processing/slashings.go @@ -7,7 +7,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" - "github.com/prysmaticlabs/prysm/v5/config/params" "github.com/prysmaticlabs/prysm/v5/testing/require" "github.com/prysmaticlabs/prysm/v5/testing/spectest/utils" ) @@ -30,7 +29,7 @@ func RunSlashingsTests(t *testing.T, config string) { } func processSlashingsWrapper(t *testing.T, st state.BeaconState) (state.BeaconState, error) { - st, err := epoch.ProcessSlashings(st, params.BeaconConfig().ProportionalSlashingMultiplierBellatrix) + st, err := epoch.ProcessSlashings(st) require.NoError(t, err, "Could not process slashings") return st, nil } diff --git a/testing/spectest/shared/common/forkchoice/runner.go b/testing/spectest/shared/common/forkchoice/runner.go index c4d7a2d79ca6..a8211dc92570 100644 --- a/testing/spectest/shared/common/forkchoice/runner.go +++ b/testing/spectest/shared/common/forkchoice/runner.go @@ -98,6 +98,9 @@ func runTest(t *testing.T, config string, fork int, basePath string) { // nolint case version.Electra: beaconState = unmarshalElectraState(t, preBeaconStateSSZ) beaconBlock = unmarshalElectraBlock(t, blockSSZ) + case version.Fulu: + beaconState = unmarshalFuluState(t, preBeaconStateSSZ) + beaconBlock = unmarshalFuluBlock(t, blockSSZ) default: t.Fatalf("unknown fork version: %v", fork) } @@ -138,6 +141,8 @@ func runTest(t *testing.T, config string, fork int, basePath string) { // nolint beaconBlock = unmarshalSignedDenebBlock(t, blockSSZ) case version.Electra: beaconBlock = unmarshalSignedElectraBlock(t, blockSSZ) + case version.Fulu: + beaconBlock = unmarshalSignedFuluBlock(t, blockSSZ) default: t.Fatalf("unknown fork version: %v", fork) } @@ -192,6 +197,129 @@ func runTest(t *testing.T, config string, fork int, basePath string) { // nolint } } +func runBlobStep(t *testing.T, + step Step, + beaconBlock interfaces.ReadOnlySignedBeaconBlock, + fork int, + folder os.DirEntry, + testsFolderPath string, + builder *Builder, +) { + blobs := step.Blobs + proofs := step.Proofs + if blobs != nil && *blobs != "null" { + require.NotNil(t, beaconBlock) + require.Equal(t, true, fork >= version.Deneb) + + block := beaconBlock.Block() + root, err := block.HashTreeRoot() + require.NoError(t, err) + kzgs, err := block.Body().BlobKzgCommitments() + require.NoError(t, err) + + blobsFile, err := util.BazelFileBytes(testsFolderPath, folder.Name(), fmt.Sprint(*blobs, ".ssz_snappy")) + require.NoError(t, err) + blobsSSZ, err := snappy.Decode(nil /* dst */, blobsFile) + require.NoError(t, err) + sh, err := beaconBlock.Header() + require.NoError(t, err) + requireVerifyExpected := errAssertionForStep(step, verification.ErrBlobInvalid) + for index := 0; index*fieldparams.BlobLength < len(blobsSSZ); index++ { + var proof []byte + if index < len(proofs) { + proofPTR := proofs[index] + require.NotNil(t, proofPTR) + proof, err = hexutil.Decode(*proofPTR) + require.NoError(t, err) + } + + blob := [fieldparams.BlobLength]byte{} + copy(blob[:], blobsSSZ[index*fieldparams.BlobLength:]) + if len(proof) == 0 { + proof = make([]byte, 48) + } + + inclusionProof, err := blocks.MerkleProofKZGCommitment(block.Body(), index) + require.NoError(t, err) + pb := ðpb.BlobSidecar{ + Index: uint64(index), + Blob: blob[:], + KzgCommitment: kzgs[index], + KzgProof: proof, + SignedBlockHeader: sh, + CommitmentInclusionProof: inclusionProof, + } + ro, err := blocks.NewROBlobWithRoot(pb, root) + require.NoError(t, err) + ini, err := builder.vwait.WaitForInitializer(context.Background()) + require.NoError(t, err) + bv := ini.NewBlobVerifier(ro, verification.SpectestBlobSidecarRequirements) + ctx := context.Background() + if err := bv.BlobIndexInBounds(); err != nil { + t.Logf("BlobIndexInBounds error: %s", err.Error()) + } + if err := bv.NotFromFutureSlot(); err != nil { + t.Logf("NotFromFutureSlot error: %s", err.Error()) + } + if err := bv.SlotAboveFinalized(); err != nil { + t.Logf("SlotAboveFinalized error: %s", err.Error()) + } + if err := bv.SidecarInclusionProven(); err != nil { + t.Logf("SidecarInclusionProven error: %s", err.Error()) + } + if err := bv.SidecarKzgProofVerified(); err != nil { + t.Logf("SidecarKzgProofVerified error: %s", err.Error()) + } + if err := bv.ValidProposerSignature(ctx); err != nil { + t.Logf("ValidProposerSignature error: %s", err.Error()) + } + if err := bv.SidecarParentSlotLower(); err != nil { + t.Logf("SidecarParentSlotLower error: %s", err.Error()) + } + if err := bv.SidecarDescendsFromFinalized(); err != nil { + t.Logf("SidecarDescendsFromFinalized error: %s", err.Error()) + } + if err := bv.SidecarProposerExpected(ctx); err != nil { + t.Logf("SidecarProposerExpected error: %s", err.Error()) + } + + vsc, err := bv.VerifiedROBlob() + requireVerifyExpected(t, err) + + if err == nil { + require.NoError(t, builder.service.ReceiveBlob(context.Background(), vsc)) + } + } + } +} + +func errAssertionForStep(step Step, expect error) func(t *testing.T, err error) { + if !*step.Valid { + return func(t *testing.T, err error) { + require.ErrorIs(t, err, expect) + } + } + return func(t *testing.T, err error) { + if err != nil { + require.ErrorIs(t, err, verification.ErrBlobInvalid) + var me verification.VerificationMultiError + ok := errors.As(err, &me) + require.Equal(t, true, ok) + fails := me.Failures() + // we haven't performed any verification, so all the results should be this type + fmsg := make([]string, 0, len(fails)) + for k, v := range fails { + fmsg = append(fmsg, fmt.Sprintf("%s - %s", v.Error(), k.String())) + } + t.Fatal(strings.Join(fmsg, ";")) + } + } +} + +// ---------------------------------------------------------------------------- +// Phase 0 +// ---------------------------------------------------------------------------- + func unmarshalPhase0State(t *testing.T, raw []byte) state.BeaconState { base := ðpb.BeaconState{} require.NoError(t, base.UnmarshalSSZ(raw)) @@ -216,6 +344,10 @@ func unmarshalSignedPhase0Block(t *testing.T, raw []byte) interfaces.ReadOnlySig return blk } +// ---------------------------------------------------------------------------- +// Altair +// ---------------------------------------------------------------------------- + func unmarshalAltairState(t *testing.T, raw []byte) state.BeaconState { base := ðpb.BeaconStateAltair{} require.NoError(t, base.UnmarshalSSZ(raw)) @@ -240,6 +372,10 @@ func unmarshalSignedAltairBlock(t *testing.T, raw []byte) interfaces.ReadOnlySig return blk } +// ---------------------------------------------------------------------------- +// Bellatrix +// ---------------------------------------------------------------------------- + func unmarshalBellatrixState(t *testing.T, raw []byte) state.BeaconState { base := ðpb.BeaconStateBellatrix{} require.NoError(t, base.UnmarshalSSZ(raw)) @@ -264,6 +400,10 @@ func unmarshalSignedBellatrixBlock(t *testing.T, raw []byte) interfaces.ReadOnly return blk } +// ---------------------------------------------------------------------------- +// Capella +// ---------------------------------------------------------------------------- + func unmarshalCapellaState(t *testing.T, raw []byte) state.BeaconState { base := ðpb.BeaconStateCapella{} require.NoError(t, base.UnmarshalSSZ(raw)) @@ -288,6 +428,10 @@ func unmarshalSignedCapellaBlock(t *testing.T, raw []byte) interfaces.ReadOnlySi return blk } +// ---------------------------------------------------------------------------- +// Deneb +// ---------------------------------------------------------------------------- + func unmarshalDenebState(t *testing.T, raw []byte) state.BeaconState { base := ðpb.BeaconStateDeneb{} require.NoError(t, base.UnmarshalSSZ(raw)) @@ -312,6 +456,10 @@ func unmarshalSignedDenebBlock(t *testing.T, raw []byte) interfaces.SignedBeacon return blk } +// ---------------------------------------------------------------------------- +// Electra +// ---------------------------------------------------------------------------- + func unmarshalElectraState(t *testing.T, raw []byte) state.BeaconState { base := ðpb.BeaconStateElectra{} require.NoError(t, base.UnmarshalSSZ(raw)) @@ -336,121 +484,30 @@ func unmarshalSignedElectraBlock(t *testing.T, raw []byte) interfaces.SignedBeac return blk } -func runBlobStep(t *testing.T, - step Step, - beaconBlock interfaces.ReadOnlySignedBeaconBlock, - fork int, - folder os.DirEntry, - testsFolderPath string, - builder *Builder, -) { - blobs := step.Blobs - proofs := step.Proofs - if blobs != nil && *blobs != "null" { - require.NotNil(t, beaconBlock) - require.Equal(t, true, fork >= version.Deneb) - - block := beaconBlock.Block() - root, err := block.HashTreeRoot() - require.NoError(t, err) - kzgs, err := block.Body().BlobKzgCommitments() - require.NoError(t, err) - - blobsFile, err := util.BazelFileBytes(testsFolderPath, folder.Name(), fmt.Sprint(*blobs, ".ssz_snappy")) - require.NoError(t, err) - blobsSSZ, err := snappy.Decode(nil /* dst */, blobsFile) - require.NoError(t, err) - sh, err := beaconBlock.Header() - require.NoError(t, err) - requireVerifyExpected := errAssertionForStep(step, verification.ErrBlobInvalid) - for index := 0; index*fieldparams.BlobLength < len(blobsSSZ); index++ { - var proof []byte - if index < len(proofs) { - proofPTR := proofs[index] - require.NotNil(t, proofPTR) - proof, err = hexutil.Decode(*proofPTR) - require.NoError(t, err) - } - - blob := [fieldparams.BlobLength]byte{} - copy(blob[:], blobsSSZ[index*fieldparams.BlobLength:]) - if len(proof) == 0 { - proof = make([]byte, 48) - } - - inclusionProof, err := blocks.MerkleProofKZGCommitment(block.Body(), index) - require.NoError(t, err) - pb := ðpb.BlobSidecar{ - Index: uint64(index), - Blob: blob[:], - KzgCommitment: kzgs[index], - KzgProof: proof, - SignedBlockHeader: sh, - CommitmentInclusionProof: inclusionProof, - } - ro, err := blocks.NewROBlobWithRoot(pb, root) - require.NoError(t, err) - ini, err := builder.vwait.WaitForInitializer(context.Background()) - require.NoError(t, err) - bv := ini.NewBlobVerifier(ro, verification.SpectestBlobSidecarRequirements) - ctx := context.Background() - if err := bv.BlobIndexInBounds(); err != nil { - t.Logf("BlobIndexInBounds error: %s", err.Error()) - } - if err := bv.NotFromFutureSlot(); err != nil { - t.Logf("NotFromFutureSlot error: %s", err.Error()) - } - if err := bv.SlotAboveFinalized(); err != nil { - t.Logf("SlotAboveFinalized error: %s", err.Error()) - } - if err := bv.SidecarInclusionProven(); err != nil { - t.Logf("SidecarInclusionProven error: %s", err.Error()) - } - if err := bv.SidecarKzgProofVerified(); err != nil { - t.Logf("SidecarKzgProofVerified error: %s", err.Error()) - } - if err := bv.ValidProposerSignature(ctx); err != nil { - t.Logf("ValidProposerSignature error: %s", err.Error()) - } - if err := bv.SidecarParentSlotLower(); err != nil { - t.Logf("SidecarParentSlotLower error: %s", err.Error()) - } - if err := bv.SidecarDescendsFromFinalized(); err != nil { - t.Logf("SidecarDescendsFromFinalized error: %s", err.Error()) - } - if err := bv.SidecarProposerExpected(ctx); err != nil { - t.Logf("SidecarProposerExpected error: %s", err.Error()) - } +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- - vsc, err := bv.VerifiedROBlob() - requireVerifyExpected(t, err) +func unmarshalFuluState(t *testing.T, raw []byte) state.BeaconState { + base := ðpb.BeaconStateFulu{} + require.NoError(t, base.UnmarshalSSZ(raw)) + st, err := state_native.InitializeFromProtoFulu(base) + require.NoError(t, err) + return st +} - if err == nil { - require.NoError(t, builder.service.ReceiveBlob(context.Background(), vsc)) - } - } - } +func unmarshalFuluBlock(t *testing.T, raw []byte) interfaces.SignedBeaconBlock { + base := ðpb.BeaconBlockFulu{} + require.NoError(t, base.UnmarshalSSZ(raw)) + blk, err := blocks.NewSignedBeaconBlock(ðpb.SignedBeaconBlockFulu{Block: base, Signature: make([]byte, fieldparams.BLSSignatureLength)}) + require.NoError(t, err) + return blk } -func errAssertionForStep(step Step, expect error) func(t *testing.T, err error) { - if !*step.Valid { - return func(t *testing.T, err error) { - require.ErrorIs(t, err, expect) - } - } - return func(t *testing.T, err error) { - if err != nil { - require.ErrorIs(t, err, verification.ErrBlobInvalid) - var me verification.VerificationMultiError - ok := errors.As(err, &me) - require.Equal(t, true, ok) - fails := me.Failures() - // we haven't performed any verification, so all the results should be this type - fmsg := make([]string, 0, len(fails)) - for k, v := range fails { - fmsg = append(fmsg, fmt.Sprintf("%s - %s", v.Error(), k.String())) - } - t.Fatal(strings.Join(fmsg, ";")) - } - } +func unmarshalSignedFuluBlock(t *testing.T, raw []byte) interfaces.SignedBeaconBlock { + base := ðpb.SignedBeaconBlockFulu{} + require.NoError(t, base.UnmarshalSSZ(raw)) + blk, err := blocks.NewSignedBeaconBlock(base) + require.NoError(t, err) + return blk } diff --git a/testing/spectest/shared/deneb/epoch_processing/BUILD.bazel b/testing/spectest/shared/deneb/epoch_processing/BUILD.bazel index 6a483739c35f..262b87507ccf 100644 --- a/testing/spectest/shared/deneb/epoch_processing/BUILD.bazel +++ b/testing/spectest/shared/deneb/epoch_processing/BUILD.bazel @@ -26,7 +26,6 @@ go_library( "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", - "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", "//testing/spectest/utils:go_default_library", diff --git a/testing/spectest/shared/deneb/epoch_processing/slashings.go b/testing/spectest/shared/deneb/epoch_processing/slashings.go index ac4cd3baf656..aedc2f934a79 100644 --- a/testing/spectest/shared/deneb/epoch_processing/slashings.go +++ b/testing/spectest/shared/deneb/epoch_processing/slashings.go @@ -7,7 +7,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" - "github.com/prysmaticlabs/prysm/v5/config/params" "github.com/prysmaticlabs/prysm/v5/testing/require" "github.com/prysmaticlabs/prysm/v5/testing/spectest/utils" ) @@ -27,7 +26,7 @@ func RunSlashingsTests(t *testing.T, config string) { } func processSlashingsWrapper(t *testing.T, st state.BeaconState) (state.BeaconState, error) { - st, err := epoch.ProcessSlashings(st, params.BeaconConfig().ProportionalSlashingMultiplierBellatrix) + st, err := epoch.ProcessSlashings(st) require.NoError(t, err, "Could not process slashings") return st, nil } diff --git a/testing/spectest/shared/electra/epoch_processing/BUILD.bazel b/testing/spectest/shared/electra/epoch_processing/BUILD.bazel index c65c52dd9f69..ebf5fbc1cfcc 100644 --- a/testing/spectest/shared/electra/epoch_processing/BUILD.bazel +++ b/testing/spectest/shared/electra/epoch_processing/BUILD.bazel @@ -28,7 +28,6 @@ go_library( "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", - "//config/params:go_default_library", "//consensus-types/primitives:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", diff --git a/testing/spectest/shared/electra/epoch_processing/slashings.go b/testing/spectest/shared/electra/epoch_processing/slashings.go index f6c9d61e65ec..fe420e9b9ab4 100644 --- a/testing/spectest/shared/electra/epoch_processing/slashings.go +++ b/testing/spectest/shared/electra/epoch_processing/slashings.go @@ -7,7 +7,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/electra" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" - "github.com/prysmaticlabs/prysm/v5/config/params" "github.com/prysmaticlabs/prysm/v5/testing/require" "github.com/prysmaticlabs/prysm/v5/testing/spectest/utils" ) @@ -27,7 +26,7 @@ func RunSlashingsTests(t *testing.T, config string) { } func processSlashingsWrapper(t *testing.T, st state.BeaconState) (state.BeaconState, error) { - st, err := electra.ProcessSlashings(st, params.BeaconConfig().ProportionalSlashingMultiplierBellatrix) + st, err := electra.ProcessSlashings(st) require.NoError(t, err, "Could not process slashings") return st, nil } diff --git a/testing/spectest/shared/electra/operations/withdrawals.go b/testing/spectest/shared/electra/operations/withdrawals.go index 38fb73d8323b..51031d615d45 100644 --- a/testing/spectest/shared/electra/operations/withdrawals.go +++ b/testing/spectest/shared/electra/operations/withdrawals.go @@ -13,7 +13,7 @@ import ( ) func blockWithWithdrawals(ssz []byte) (interfaces.SignedBeaconBlock, error) { - e := &enginev1.ExecutionPayloadElectra{} + e := &enginev1.ExecutionPayloadDeneb{} if err := e.UnmarshalSSZ(ssz); err != nil { return nil, err } diff --git a/testing/spectest/shared/electra/ssz_static/ssz_static.go b/testing/spectest/shared/electra/ssz_static/ssz_static.go index 2bfeeaba6612..84b5c757e95a 100644 --- a/testing/spectest/shared/electra/ssz_static/ssz_static.go +++ b/testing/spectest/shared/electra/ssz_static/ssz_static.go @@ -37,9 +37,9 @@ func UnmarshalledSSZ(t *testing.T, serializedBytes []byte, folderName string) (i var obj interface{} switch folderName { case "ExecutionPayload": - obj = &enginev1.ExecutionPayloadElectra{} + obj = &enginev1.ExecutionPayloadDeneb{} case "ExecutionPayloadHeader": - obj = &enginev1.ExecutionPayloadHeaderElectra{} + obj = &enginev1.ExecutionPayloadHeaderDeneb{} case "Attestation": obj = ðpb.AttestationElectra{} case "AttestationData": diff --git a/testing/spectest/shared/phase0/epoch_processing/BUILD.bazel b/testing/spectest/shared/phase0/epoch_processing/BUILD.bazel index 68e6a1a95491..84be9a021748 100644 --- a/testing/spectest/shared/phase0/epoch_processing/BUILD.bazel +++ b/testing/spectest/shared/phase0/epoch_processing/BUILD.bazel @@ -24,7 +24,6 @@ go_library( "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", - "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", "//testing/spectest/utils:go_default_library", diff --git a/testing/spectest/shared/phase0/epoch_processing/slashings.go b/testing/spectest/shared/phase0/epoch_processing/slashings.go index cee89bd62ea1..bcebe694657c 100644 --- a/testing/spectest/shared/phase0/epoch_processing/slashings.go +++ b/testing/spectest/shared/phase0/epoch_processing/slashings.go @@ -9,7 +9,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/epoch/precompute" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" - "github.com/prysmaticlabs/prysm/v5/config/params" "github.com/prysmaticlabs/prysm/v5/testing/require" "github.com/prysmaticlabs/prysm/v5/testing/spectest/utils" ) @@ -33,7 +32,7 @@ func RunSlashingsTests(t *testing.T, config string) { } func processSlashingsWrapper(t *testing.T, s state.BeaconState) (state.BeaconState, error) { - s, err := epoch.ProcessSlashings(s, params.BeaconConfig().ProportionalSlashingMultiplier) + s, err := epoch.ProcessSlashings(s) require.NoError(t, err, "Could not process slashings") return s, nil } diff --git a/testing/util/BUILD.bazel b/testing/util/BUILD.bazel index 1603f4f3506f..1ecd6a009cf3 100644 --- a/testing/util/BUILD.bazel +++ b/testing/util/BUILD.bazel @@ -57,7 +57,6 @@ go_library( "//network/forks:go_default_library", "//proto/engine/v1:go_default_library", "//proto/eth/v1:go_default_library", - "//proto/eth/v2:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//runtime/interop:go_default_library", "//runtime/version:go_default_library", @@ -106,7 +105,6 @@ go_test( "//encoding/bytesutil:go_default_library", "//encoding/ssz:go_default_library", "//proto/eth/v1:go_default_library", - "//proto/eth/v2:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/assert:go_default_library", "//testing/require:go_default_library", diff --git a/testing/util/attestation.go b/testing/util/attestation.go index b0a79d727569..713d87cb1275 100644 --- a/testing/util/attestation.go +++ b/testing/util/attestation.go @@ -145,6 +145,16 @@ func GenerateAttestations(bState state.BeaconState, privs []bls.SecretKey, numTo return nil, err } headState = genState + case version.Fulu: + pbState, err := state_native.ProtobufBeaconStateFulu(bState.ToProto()) + if err != nil { + return nil, err + } + genState, err := state_native.InitializeFromProtoUnsafeFulu(pbState) + if err != nil { + return nil, err + } + headState = genState default: return nil, fmt.Errorf("state version %s isn't supported", version.String(bState.Version())) } diff --git a/testing/util/block.go b/testing/util/block.go index bc6f21923133..9068bd2839ae 100644 --- a/testing/util/block.go +++ b/testing/util/block.go @@ -23,7 +23,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" v1 "github.com/prysmaticlabs/prysm/v5/proto/eth/v1" - v2 "github.com/prysmaticlabs/prysm/v5/proto/eth/v2" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/runtime/version" "github.com/prysmaticlabs/prysm/v5/testing/assertions" @@ -65,6 +64,10 @@ func DefaultBlockGenConfig() *BlockGenConfig { } } +// ---------------------------------------------------------------------------- +// Phase 0 +// ---------------------------------------------------------------------------- + // NewBeaconBlock creates a beacon block with minimum marshalable fields. func NewBeaconBlock() *ethpb.SignedBeaconBlock { return ðpb.SignedBeaconBlock{ @@ -498,41 +501,6 @@ func randValIndex(bState state.BeaconState) (primitives.ValidatorIndex, error) { return primitives.ValidatorIndex(rand.NewGenerator().Uint64() % activeCount), nil } -func generateWithdrawals( - bState state.BeaconState, - privs []bls.SecretKey, - numWithdrawals uint64, -) ([]*enginev1.Withdrawal, error) { - withdrawalRequests := make([]*enginev1.Withdrawal, numWithdrawals) - for i := uint64(0); i < numWithdrawals; i++ { - valIndex, err := randValIndex(bState) - if err != nil { - return nil, err - } - amount := uint64(10000) - bal, err := bState.BalanceAtIndex(valIndex) - if err != nil { - return nil, err - } - amounts := []uint64{ - amount, // some smaller amount - bal, // the entire balance - } - // Get a random index - nBig, err := rd.Int(rd.Reader, big.NewInt(int64(len(amounts)))) - if err != nil { - return nil, err - } - randomIndex := nBig.Uint64() - withdrawalRequests[i] = &enginev1.Withdrawal{ - ValidatorIndex: valIndex, - Address: make([]byte, common.AddressLength), - Amount: amounts[randomIndex], - } - } - return withdrawalRequests, nil -} - // HydrateSignedBeaconHeader hydrates a signed beacon block header with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. func HydrateSignedBeaconHeader(h *ethpb.SignedBeaconBlockHeader) *ethpb.SignedBeaconBlockHeader { @@ -655,125 +623,16 @@ func HydrateV1BeaconBlockBody(b *v1.BeaconBlockBody) *v1.BeaconBlockBody { return b } -// HydrateV2AltairSignedBeaconBlock hydrates a signed beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2AltairSignedBeaconBlock(b *v2.SignedBeaconBlockAltair) *v2.SignedBeaconBlockAltair { - if b.Signature == nil { - b.Signature = make([]byte, fieldparams.BLSSignatureLength) - } - b.Message = HydrateV2AltairBeaconBlock(b.Message) - return b -} - -// HydrateV2AltairBeaconBlock hydrates a beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2AltairBeaconBlock(b *v2.BeaconBlockAltair) *v2.BeaconBlockAltair { - if b == nil { - b = &v2.BeaconBlockAltair{} - } - if b.ParentRoot == nil { - b.ParentRoot = make([]byte, fieldparams.RootLength) - } - if b.StateRoot == nil { - b.StateRoot = make([]byte, fieldparams.RootLength) - } - b.Body = HydrateV2AltairBeaconBlockBody(b.Body) - return b -} - -// HydrateV2AltairBeaconBlockBody hydrates a beacon block body with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2AltairBeaconBlockBody(b *v2.BeaconBlockBodyAltair) *v2.BeaconBlockBodyAltair { - if b == nil { - b = &v2.BeaconBlockBodyAltair{} - } - if b.RandaoReveal == nil { - b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength) - } - if b.Graffiti == nil { - b.Graffiti = make([]byte, fieldparams.RootLength) - } - if b.Eth1Data == nil { - b.Eth1Data = &v1.Eth1Data{ - DepositRoot: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, fieldparams.RootLength), - } - } - if b.SyncAggregate == nil { - b.SyncAggregate = &v1.SyncAggregate{ - SyncCommitteeBits: make([]byte, 64), - SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), - } - } - return b -} - -// HydrateV2BellatrixSignedBeaconBlock hydrates a signed beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BellatrixSignedBeaconBlock(b *v2.SignedBeaconBlockBellatrix) *v2.SignedBeaconBlockBellatrix { - if b.Signature == nil { - b.Signature = make([]byte, fieldparams.BLSSignatureLength) - } - b.Message = HydrateV2BellatrixBeaconBlock(b.Message) - return b -} - -// HydrateV2BellatrixBeaconBlock hydrates a beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BellatrixBeaconBlock(b *v2.BeaconBlockBellatrix) *v2.BeaconBlockBellatrix { - if b == nil { - b = &v2.BeaconBlockBellatrix{} - } - if b.ParentRoot == nil { - b.ParentRoot = make([]byte, fieldparams.RootLength) - } - if b.StateRoot == nil { - b.StateRoot = make([]byte, fieldparams.RootLength) - } - b.Body = HydrateV2BellatrixBeaconBlockBody(b.Body) - return b +func SaveBlock(tb assertions.AssertionTestingTB, ctx context.Context, db iface.NoHeadAccessDatabase, b interface{}) interfaces.SignedBeaconBlock { + wsb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(tb, err) + require.NoError(tb, db.SaveBlock(ctx, wsb)) + return wsb } -// HydrateV2BellatrixBeaconBlockBody hydrates a beacon block body with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BellatrixBeaconBlockBody(b *v2.BeaconBlockBodyBellatrix) *v2.BeaconBlockBodyBellatrix { - if b == nil { - b = &v2.BeaconBlockBodyBellatrix{} - } - if b.RandaoReveal == nil { - b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength) - } - if b.Graffiti == nil { - b.Graffiti = make([]byte, fieldparams.RootLength) - } - if b.Eth1Data == nil { - b.Eth1Data = &v1.Eth1Data{ - DepositRoot: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, fieldparams.RootLength), - } - } - if b.SyncAggregate == nil { - b.SyncAggregate = &v1.SyncAggregate{ - SyncCommitteeBits: make([]byte, 64), - SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), - } - } - if b.ExecutionPayload == nil { - b.ExecutionPayload = &enginev1.ExecutionPayload{ - ParentHash: make([]byte, fieldparams.RootLength), - FeeRecipient: make([]byte, 20), - StateRoot: make([]byte, fieldparams.RootLength), - ReceiptsRoot: make([]byte, fieldparams.RootLength), - LogsBloom: make([]byte, 256), - PrevRandao: make([]byte, fieldparams.RootLength), - ExtraData: make([]byte, 0), - BaseFeePerGas: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, fieldparams.RootLength), - Transactions: make([][]byte, 0), - } - } - return b -} +// ---------------------------------------------------------------------------- +// Altair +// ---------------------------------------------------------------------------- // HydrateSignedBeaconBlockAltair hydrates a signed beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. @@ -828,6 +687,10 @@ func HydrateBeaconBlockBodyAltair(b *ethpb.BeaconBlockBodyAltair) *ethpb.BeaconB return b } +// ---------------------------------------------------------------------------- +// Bellatrix +// ---------------------------------------------------------------------------- + // HydrateSignedBeaconBlockBellatrix hydrates a signed beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. func HydrateSignedBeaconBlockBellatrix(b *ethpb.SignedBeaconBlockBellatrix) *ethpb.SignedBeaconBlockBellatrix { @@ -962,72 +825,9 @@ func HydrateBlindedBeaconBlockBodyBellatrix(b *ethpb.BlindedBeaconBlockBodyBella return b } -// HydrateV2SignedBlindedBeaconBlockBellatrix hydrates a signed blinded beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2SignedBlindedBeaconBlockBellatrix(b *v2.SignedBlindedBeaconBlockBellatrix) *v2.SignedBlindedBeaconBlockBellatrix { - if b.Signature == nil { - b.Signature = make([]byte, fieldparams.BLSSignatureLength) - } - b.Message = HydrateV2BlindedBeaconBlockBellatrix(b.Message) - return b -} - -// HydrateV2BlindedBeaconBlockBellatrix hydrates a blinded beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BlindedBeaconBlockBellatrix(b *v2.BlindedBeaconBlockBellatrix) *v2.BlindedBeaconBlockBellatrix { - if b == nil { - b = &v2.BlindedBeaconBlockBellatrix{} - } - if b.ParentRoot == nil { - b.ParentRoot = make([]byte, fieldparams.RootLength) - } - if b.StateRoot == nil { - b.StateRoot = make([]byte, fieldparams.RootLength) - } - b.Body = HydrateV2BlindedBeaconBlockBodyBellatrix(b.Body) - return b -} - -// HydrateV2BlindedBeaconBlockBodyBellatrix hydrates a blinded beacon block body with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BlindedBeaconBlockBodyBellatrix(b *v2.BlindedBeaconBlockBodyBellatrix) *v2.BlindedBeaconBlockBodyBellatrix { - if b == nil { - b = &v2.BlindedBeaconBlockBodyBellatrix{} - } - if b.RandaoReveal == nil { - b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength) - } - if b.Graffiti == nil { - b.Graffiti = make([]byte, 32) - } - if b.Eth1Data == nil { - b.Eth1Data = &v1.Eth1Data{ - DepositRoot: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, 32), - } - } - if b.SyncAggregate == nil { - b.SyncAggregate = &v1.SyncAggregate{ - SyncCommitteeBits: make([]byte, 64), - SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), - } - } - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = &enginev1.ExecutionPayloadHeader{ - ParentHash: make([]byte, 32), - FeeRecipient: make([]byte, 20), - StateRoot: make([]byte, fieldparams.RootLength), - ReceiptsRoot: make([]byte, fieldparams.RootLength), - LogsBloom: make([]byte, 256), - PrevRandao: make([]byte, 32), - ExtraData: make([]byte, 0), - BaseFeePerGas: make([]byte, 32), - BlockHash: make([]byte, 32), - TransactionsRoot: make([]byte, fieldparams.RootLength), - } - } - return b -} +// ---------------------------------------------------------------------------- +// Capella +// ---------------------------------------------------------------------------- // HydrateSignedBeaconBlockCapella hydrates a signed beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. @@ -1165,21 +965,35 @@ func HydrateBlindedBeaconBlockBodyCapella(b *ethpb.BlindedBeaconBlockBodyCapella return b } -// HydrateV2SignedBlindedBeaconBlockCapella hydrates a signed blinded beacon block with correct field length sizes +// ---------------------------------------------------------------------------- +// Deneb +// ---------------------------------------------------------------------------- + +// HydrateSignedBeaconBlockDeneb hydrates a signed beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateV2SignedBlindedBeaconBlockCapella(b *v2.SignedBlindedBeaconBlockCapella) *v2.SignedBlindedBeaconBlockCapella { +func HydrateSignedBeaconBlockDeneb(b *ethpb.SignedBeaconBlockDeneb) *ethpb.SignedBeaconBlockDeneb { + if b == nil { + b = ðpb.SignedBeaconBlockDeneb{} + } if b.Signature == nil { b.Signature = make([]byte, fieldparams.BLSSignatureLength) } - b.Message = HydrateV2BlindedBeaconBlockCapella(b.Message) + b.Block = HydrateBeaconBlockDeneb(b.Block) + return b +} + +// HydrateSignedBeaconBlockContentsDeneb hydrates a signed beacon block with correct field length sizes +// to comply with fssz marshalling and unmarshalling rules. +func HydrateSignedBeaconBlockContentsDeneb(b *ethpb.SignedBeaconBlockContentsDeneb) *ethpb.SignedBeaconBlockContentsDeneb { + b.Block = HydrateSignedBeaconBlockDeneb(b.Block) return b } -// HydrateV2BlindedBeaconBlockCapella hydrates a blinded beacon block with correct field length sizes +// HydrateBeaconBlockDeneb hydrates a beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BlindedBeaconBlockCapella(b *v2.BlindedBeaconBlockCapella) *v2.BlindedBeaconBlockCapella { +func HydrateBeaconBlockDeneb(b *ethpb.BeaconBlockDeneb) *ethpb.BeaconBlockDeneb { if b == nil { - b = &v2.BlindedBeaconBlockCapella{} + b = ðpb.BeaconBlockDeneb{} } if b.ParentRoot == nil { b.ParentRoot = make([]byte, fieldparams.RootLength) @@ -1187,114 +1001,109 @@ func HydrateV2BlindedBeaconBlockCapella(b *v2.BlindedBeaconBlockCapella) *v2.Bli if b.StateRoot == nil { b.StateRoot = make([]byte, fieldparams.RootLength) } - b.Body = HydrateV2BlindedBeaconBlockBodyCapella(b.Body) + b.Body = HydrateBeaconBlockBodyDeneb(b.Body) return b } -// HydrateV2BlindedBeaconBlockBodyCapella hydrates a blinded beacon block body with correct field length sizes +// HydrateBeaconBlockBodyDeneb hydrates a beacon block body with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BlindedBeaconBlockBodyCapella(b *v2.BlindedBeaconBlockBodyCapella) *v2.BlindedBeaconBlockBodyCapella { +func HydrateBeaconBlockBodyDeneb(b *ethpb.BeaconBlockBodyDeneb) *ethpb.BeaconBlockBodyDeneb { if b == nil { - b = &v2.BlindedBeaconBlockBodyCapella{} + b = ðpb.BeaconBlockBodyDeneb{} } if b.RandaoReveal == nil { b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength) } if b.Graffiti == nil { - b.Graffiti = make([]byte, 32) + b.Graffiti = make([]byte, fieldparams.RootLength) } if b.Eth1Data == nil { - b.Eth1Data = &v1.Eth1Data{ + b.Eth1Data = ðpb.Eth1Data{ DepositRoot: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, 32), + BlockHash: make([]byte, fieldparams.RootLength), } } if b.SyncAggregate == nil { - b.SyncAggregate = &v1.SyncAggregate{ - SyncCommitteeBits: make([]byte, 64), + b.SyncAggregate = ðpb.SyncAggregate{ + SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength), SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), } } - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = &enginev1.ExecutionPayloadHeaderCapella{ - ParentHash: make([]byte, 32), - FeeRecipient: make([]byte, 20), - StateRoot: make([]byte, fieldparams.RootLength), - ReceiptsRoot: make([]byte, fieldparams.RootLength), - LogsBloom: make([]byte, 256), - PrevRandao: make([]byte, 32), - ExtraData: make([]byte, 0), - BaseFeePerGas: make([]byte, 32), - BlockHash: make([]byte, 32), - TransactionsRoot: make([]byte, fieldparams.RootLength), - WithdrawalsRoot: make([]byte, fieldparams.RootLength), + if b.ExecutionPayload == nil { + b.ExecutionPayload = &enginev1.ExecutionPayloadDeneb{ + ParentHash: make([]byte, fieldparams.RootLength), + FeeRecipient: make([]byte, 20), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, 256), + PrevRandao: make([]byte, fieldparams.RootLength), + ExtraData: make([]byte, 0), + BaseFeePerGas: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, fieldparams.RootLength), + Transactions: make([][]byte, 0), + Withdrawals: make([]*enginev1.Withdrawal, 0), } } return b } -func SaveBlock(tb assertions.AssertionTestingTB, ctx context.Context, db iface.NoHeadAccessDatabase, b interface{}) interfaces.SignedBeaconBlock { - wsb, err := blocks.NewSignedBeaconBlock(b) - require.NoError(tb, err) - require.NoError(tb, db.SaveBlock(ctx, wsb)) - return wsb -} - -// HydrateSignedBeaconBlockDeneb hydrates a signed beacon block with correct field length sizes +// HydrateSignedBlindedBeaconBlockDeneb hydrates a signed blinded beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateSignedBeaconBlockDeneb(b *ethpb.SignedBeaconBlockDeneb) *ethpb.SignedBeaconBlockDeneb { - if b == nil { - b = ðpb.SignedBeaconBlockDeneb{} - } +func HydrateSignedBlindedBeaconBlockDeneb(b *ethpb.SignedBlindedBeaconBlockDeneb) *ethpb.SignedBlindedBeaconBlockDeneb { if b.Signature == nil { b.Signature = make([]byte, fieldparams.BLSSignatureLength) } - b.Block = HydrateBeaconBlockDeneb(b.Block) + b.Message = HydrateBlindedBeaconBlockDeneb(b.Message) return b } -// HydrateSignedBeaconBlockElectra hydrates a signed beacon block with correct field length sizes +// HydrateBlindedBeaconBlockBodyDeneb hydrates a blinded beacon block body with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateSignedBeaconBlockElectra(b *ethpb.SignedBeaconBlockElectra) *ethpb.SignedBeaconBlockElectra { +func HydrateBlindedBeaconBlockBodyDeneb(b *ethpb.BlindedBeaconBlockBodyDeneb) *ethpb.BlindedBeaconBlockBodyDeneb { if b == nil { - b = ðpb.SignedBeaconBlockElectra{} + b = ðpb.BlindedBeaconBlockBodyDeneb{} } - if b.Signature == nil { - b.Signature = make([]byte, fieldparams.BLSSignatureLength) + if b.RandaoReveal == nil { + b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength) } - b.Block = HydrateBeaconBlockElectra(b.Block) - return b -} - -// HydrateSignedBeaconBlockContentsDeneb hydrates a signed beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateSignedBeaconBlockContentsDeneb(b *ethpb.SignedBeaconBlockContentsDeneb) *ethpb.SignedBeaconBlockContentsDeneb { - b.Block = HydrateSignedBeaconBlockDeneb(b.Block) - return b -} - -// HydrateSignedBeaconBlockContentsElectra hydrates a signed beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateSignedBeaconBlockContentsElectra(b *ethpb.SignedBeaconBlockContentsElectra) *ethpb.SignedBeaconBlockContentsElectra { - b.Block = HydrateSignedBeaconBlockElectra(b.Block) - return b -} - -// HydrateV2SignedBeaconBlockDeneb hydrates a v2 signed beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2SignedBeaconBlockDeneb(b *v2.SignedBeaconBlockDeneb) *v2.SignedBeaconBlockDeneb { - if b.Signature == nil { - b.Signature = make([]byte, fieldparams.BLSSignatureLength) + if b.Graffiti == nil { + b.Graffiti = make([]byte, 32) + } + if b.Eth1Data == nil { + b.Eth1Data = ðpb.Eth1Data{ + DepositRoot: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, 32), + } + } + if b.SyncAggregate == nil { + b.SyncAggregate = ðpb.SyncAggregate{ + SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength), + SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), + } + } + if b.ExecutionPayloadHeader == nil { + b.ExecutionPayloadHeader = &enginev1.ExecutionPayloadHeaderDeneb{ + ParentHash: make([]byte, 32), + FeeRecipient: make([]byte, 20), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, 256), + PrevRandao: make([]byte, 32), + ExtraData: make([]byte, 0), + BaseFeePerGas: make([]byte, 32), + BlockHash: make([]byte, 32), + TransactionsRoot: make([]byte, fieldparams.RootLength), + WithdrawalsRoot: make([]byte, fieldparams.RootLength), + } } - b.Message = HydrateV2BeaconBlockDeneb(b.Message) return b } -// HydrateBeaconBlockDeneb hydrates a beacon block with correct field length sizes +// HydrateBlindedBeaconBlockDeneb hydrates a blinded beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateBeaconBlockDeneb(b *ethpb.BeaconBlockDeneb) *ethpb.BeaconBlockDeneb { +func HydrateBlindedBeaconBlockDeneb(b *ethpb.BlindedBeaconBlockDeneb) *ethpb.BlindedBeaconBlockDeneb { if b == nil { - b = ðpb.BeaconBlockDeneb{} + b = ðpb.BlindedBeaconBlockDeneb{} } if b.ParentRoot == nil { b.ParentRoot = make([]byte, fieldparams.RootLength) @@ -1302,81 +1111,47 @@ func HydrateBeaconBlockDeneb(b *ethpb.BeaconBlockDeneb) *ethpb.BeaconBlockDeneb if b.StateRoot == nil { b.StateRoot = make([]byte, fieldparams.RootLength) } - b.Body = HydrateBeaconBlockBodyDeneb(b.Body) + b.Body = HydrateBlindedBeaconBlockBodyDeneb(b.Body) return b } -// HydrateBeaconBlockElectra hydrates a beacon block with correct field length sizes +// ---------------------------------------------------------------------------- +// Electra +// ---------------------------------------------------------------------------- + +// HydrateSignedBeaconBlockElectra hydrates a signed beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateBeaconBlockElectra(b *ethpb.BeaconBlockElectra) *ethpb.BeaconBlockElectra { +func HydrateSignedBeaconBlockElectra(b *ethpb.SignedBeaconBlockElectra) *ethpb.SignedBeaconBlockElectra { if b == nil { - b = ðpb.BeaconBlockElectra{} - } - if b.ParentRoot == nil { - b.ParentRoot = make([]byte, fieldparams.RootLength) + b = ðpb.SignedBeaconBlockElectra{} } - if b.StateRoot == nil { - b.StateRoot = make([]byte, fieldparams.RootLength) + if b.Signature == nil { + b.Signature = make([]byte, fieldparams.BLSSignatureLength) } - b.Body = HydrateBeaconBlockBodyElectra(b.Body) + b.Block = HydrateBeaconBlockElectra(b.Block) return b } -// HydrateV2BeaconBlockDeneb hydrates a v2 beacon block with correct field length sizes +// HydrateSignedBeaconBlockContentsElectra hydrates a signed beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BeaconBlockDeneb(b *v2.BeaconBlockDeneb) *v2.BeaconBlockDeneb { - if b == nil { - b = &v2.BeaconBlockDeneb{} - } - if b.ParentRoot == nil { - b.ParentRoot = make([]byte, fieldparams.RootLength) - } - if b.StateRoot == nil { - b.StateRoot = make([]byte, fieldparams.RootLength) - } - b.Body = HydrateV2BeaconBlockBodyDeneb(b.Body) +func HydrateSignedBeaconBlockContentsElectra(b *ethpb.SignedBeaconBlockContentsElectra) *ethpb.SignedBeaconBlockContentsElectra { + b.Block = HydrateSignedBeaconBlockElectra(b.Block) return b } -// HydrateBeaconBlockBodyDeneb hydrates a beacon block body with correct field length sizes +// HydrateBeaconBlockElectra hydrates a beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateBeaconBlockBodyDeneb(b *ethpb.BeaconBlockBodyDeneb) *ethpb.BeaconBlockBodyDeneb { +func HydrateBeaconBlockElectra(b *ethpb.BeaconBlockElectra) *ethpb.BeaconBlockElectra { if b == nil { - b = ðpb.BeaconBlockBodyDeneb{} - } - if b.RandaoReveal == nil { - b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength) - } - if b.Graffiti == nil { - b.Graffiti = make([]byte, fieldparams.RootLength) - } - if b.Eth1Data == nil { - b.Eth1Data = ðpb.Eth1Data{ - DepositRoot: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, fieldparams.RootLength), - } + b = ðpb.BeaconBlockElectra{} } - if b.SyncAggregate == nil { - b.SyncAggregate = ðpb.SyncAggregate{ - SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength), - SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), - } + if b.ParentRoot == nil { + b.ParentRoot = make([]byte, fieldparams.RootLength) } - if b.ExecutionPayload == nil { - b.ExecutionPayload = &enginev1.ExecutionPayloadDeneb{ - ParentHash: make([]byte, fieldparams.RootLength), - FeeRecipient: make([]byte, 20), - StateRoot: make([]byte, fieldparams.RootLength), - ReceiptsRoot: make([]byte, fieldparams.RootLength), - LogsBloom: make([]byte, 256), - PrevRandao: make([]byte, fieldparams.RootLength), - ExtraData: make([]byte, 0), - BaseFeePerGas: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, fieldparams.RootLength), - Transactions: make([][]byte, 0), - Withdrawals: make([]*enginev1.Withdrawal, 0), - } + if b.StateRoot == nil { + b.StateRoot = make([]byte, fieldparams.RootLength) } + b.Body = HydrateBeaconBlockBodyElectra(b.Body) return b } @@ -1405,7 +1180,7 @@ func HydrateBeaconBlockBodyElectra(b *ethpb.BeaconBlockBodyElectra) *ethpb.Beaco } } if b.ExecutionPayload == nil { - b.ExecutionPayload = &enginev1.ExecutionPayloadElectra{ + b.ExecutionPayload = &enginev1.ExecutionPayloadDeneb{ ParentHash: make([]byte, fieldparams.RootLength), FeeRecipient: make([]byte, 20), StateRoot: make([]byte, fieldparams.RootLength), @@ -1423,7 +1198,7 @@ func HydrateBeaconBlockBodyElectra(b *ethpb.BeaconBlockBodyElectra) *ethpb.Beaco return b } -// HydrateExecutionRequests fills the exectution requests with the correct field +// HydrateExecutionRequests fills the execution requests with the correct field // lengths func HydrateExecutionRequests(e *enginev1.ExecutionRequests) *enginev1.ExecutionRequests { if e == nil { @@ -1441,58 +1216,6 @@ func HydrateExecutionRequests(e *enginev1.ExecutionRequests) *enginev1.Execution return e } -// HydrateV2BeaconBlockBodyDeneb hydrates a v2 beacon block body with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BeaconBlockBodyDeneb(b *v2.BeaconBlockBodyDeneb) *v2.BeaconBlockBodyDeneb { - if b == nil { - b = &v2.BeaconBlockBodyDeneb{} - } - if b.RandaoReveal == nil { - b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength) - } - if b.Graffiti == nil { - b.Graffiti = make([]byte, fieldparams.RootLength) - } - if b.Eth1Data == nil { - b.Eth1Data = &v1.Eth1Data{ - DepositRoot: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, fieldparams.RootLength), - } - } - if b.SyncAggregate == nil { - b.SyncAggregate = &v1.SyncAggregate{ - SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength), - SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), - } - } - if b.ExecutionPayload == nil { - b.ExecutionPayload = &enginev1.ExecutionPayloadDeneb{ - ParentHash: make([]byte, fieldparams.RootLength), - FeeRecipient: make([]byte, 20), - StateRoot: make([]byte, fieldparams.RootLength), - ReceiptsRoot: make([]byte, fieldparams.RootLength), - LogsBloom: make([]byte, 256), - PrevRandao: make([]byte, fieldparams.RootLength), - ExtraData: make([]byte, 0), - BaseFeePerGas: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, fieldparams.RootLength), - Transactions: make([][]byte, 0), - Withdrawals: make([]*enginev1.Withdrawal, 0), - } - } - return b -} - -// HydrateSignedBlindedBeaconBlockDeneb hydrates a signed blinded beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateSignedBlindedBeaconBlockDeneb(b *ethpb.SignedBlindedBeaconBlockDeneb) *ethpb.SignedBlindedBeaconBlockDeneb { - if b.Signature == nil { - b.Signature = make([]byte, fieldparams.BLSSignatureLength) - } - b.Message = HydrateBlindedBeaconBlockDeneb(b.Message) - return b -} - // HydrateSignedBlindedBeaconBlockElectra hydrates a signed blinded beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. func HydrateSignedBlindedBeaconBlockElectra(b *ethpb.SignedBlindedBeaconBlockElectra) *ethpb.SignedBlindedBeaconBlockElectra { @@ -1503,32 +1226,6 @@ func HydrateSignedBlindedBeaconBlockElectra(b *ethpb.SignedBlindedBeaconBlockEle return b } -// HydrateV2SignedBlindedBeaconBlockDeneb hydrates a signed v2 blinded beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2SignedBlindedBeaconBlockDeneb(b *v2.SignedBlindedBeaconBlockDeneb) *v2.SignedBlindedBeaconBlockDeneb { - if b.Signature == nil { - b.Signature = make([]byte, fieldparams.BLSSignatureLength) - } - b.Message = HydrateV2BlindedBeaconBlockDeneb(b.Message) - return b -} - -// HydrateBlindedBeaconBlockDeneb hydrates a blinded beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateBlindedBeaconBlockDeneb(b *ethpb.BlindedBeaconBlockDeneb) *ethpb.BlindedBeaconBlockDeneb { - if b == nil { - b = ðpb.BlindedBeaconBlockDeneb{} - } - if b.ParentRoot == nil { - b.ParentRoot = make([]byte, fieldparams.RootLength) - } - if b.StateRoot == nil { - b.StateRoot = make([]byte, fieldparams.RootLength) - } - b.Body = HydrateBlindedBeaconBlockBodyDeneb(b.Body) - return b -} - // HydrateBlindedBeaconBlockElectra hydrates a blinded beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. func HydrateBlindedBeaconBlockElectra(b *ethpb.BlindedBeaconBlockElectra) *ethpb.BlindedBeaconBlockElectra { @@ -1545,27 +1242,11 @@ func HydrateBlindedBeaconBlockElectra(b *ethpb.BlindedBeaconBlockElectra) *ethpb return b } -// HydrateV2BlindedBeaconBlockDeneb hydrates a v2 blinded beacon block with correct field length sizes -// to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BlindedBeaconBlockDeneb(b *v2.BlindedBeaconBlockDeneb) *v2.BlindedBeaconBlockDeneb { - if b == nil { - b = &v2.BlindedBeaconBlockDeneb{} - } - if b.ParentRoot == nil { - b.ParentRoot = make([]byte, fieldparams.RootLength) - } - if b.StateRoot == nil { - b.StateRoot = make([]byte, fieldparams.RootLength) - } - b.Body = HydrateV2BlindedBeaconBlockBodyDeneb(b.Body) - return b -} - -// HydrateBlindedBeaconBlockBodyDeneb hydrates a blinded beacon block body with correct field length sizes +// HydrateBlindedBeaconBlockBodyElectra hydrates a blinded beacon block body with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateBlindedBeaconBlockBodyDeneb(b *ethpb.BlindedBeaconBlockBodyDeneb) *ethpb.BlindedBeaconBlockBodyDeneb { +func HydrateBlindedBeaconBlockBodyElectra(b *ethpb.BlindedBeaconBlockBodyElectra) *ethpb.BlindedBeaconBlockBodyElectra { if b == nil { - b = ðpb.BlindedBeaconBlockBodyDeneb{} + b = ðpb.BlindedBeaconBlockBodyElectra{} } if b.RandaoReveal == nil { b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength) @@ -1600,25 +1281,101 @@ func HydrateBlindedBeaconBlockBodyDeneb(b *ethpb.BlindedBeaconBlockBodyDeneb) *e WithdrawalsRoot: make([]byte, fieldparams.RootLength), } } + b.ExecutionRequests = HydrateExecutionRequests(b.ExecutionRequests) return b } -// HydrateBlindedBeaconBlockBodyElectra hydrates a blinded beacon block body with correct field length sizes +func generateWithdrawals( + bState state.BeaconState, + privs []bls.SecretKey, + numWithdrawals uint64, +) ([]*enginev1.Withdrawal, error) { + withdrawalRequests := make([]*enginev1.Withdrawal, numWithdrawals) + for i := uint64(0); i < numWithdrawals; i++ { + valIndex, err := randValIndex(bState) + if err != nil { + return nil, err + } + amount := uint64(10000) + bal, err := bState.BalanceAtIndex(valIndex) + if err != nil { + return nil, err + } + amounts := []uint64{ + amount, // some smaller amount + bal, // the entire balance + } + // Get a random index + nBig, err := rd.Int(rd.Reader, big.NewInt(int64(len(amounts)))) + if err != nil { + return nil, err + } + randomIndex := nBig.Uint64() + withdrawalRequests[i] = &enginev1.Withdrawal{ + ValidatorIndex: valIndex, + Address: make([]byte, common.AddressLength), + Amount: amounts[randomIndex], + } + } + return withdrawalRequests, nil +} + +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- + +// HydrateSignedBeaconBlockFulu hydrates a signed beacon block with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateBlindedBeaconBlockBodyElectra(b *ethpb.BlindedBeaconBlockBodyElectra) *ethpb.BlindedBeaconBlockBodyElectra { +func HydrateSignedBeaconBlockFulu(b *ethpb.SignedBeaconBlockFulu) *ethpb.SignedBeaconBlockFulu { if b == nil { - b = ðpb.BlindedBeaconBlockBodyElectra{} + b = ðpb.SignedBeaconBlockFulu{} + } + if b.Signature == nil { + b.Signature = make([]byte, fieldparams.BLSSignatureLength) + } + b.Block = HydrateBeaconBlockFulu(b.Block) + return b +} + +// HydrateSignedBeaconBlockContentsFulu hydrates a signed beacon block with correct field length sizes +// to comply with fssz marshalling and unmarshalling rules. +func HydrateSignedBeaconBlockContentsFulu(b *ethpb.SignedBeaconBlockContentsFulu) *ethpb.SignedBeaconBlockContentsFulu { + b.Block = HydrateSignedBeaconBlockFulu(b.Block) + return b +} + +// HydrateBeaconBlockFulu hydrates a beacon block with correct field length sizes +// to comply with fssz marshalling and unmarshalling rules. +func HydrateBeaconBlockFulu(b *ethpb.BeaconBlockFulu) *ethpb.BeaconBlockFulu { + if b == nil { + b = ðpb.BeaconBlockFulu{} + } + if b.ParentRoot == nil { + b.ParentRoot = make([]byte, fieldparams.RootLength) + } + if b.StateRoot == nil { + b.StateRoot = make([]byte, fieldparams.RootLength) + } + b.Body = HydrateBeaconBlockBodyFulu(b.Body) + return b +} + +// HydrateBeaconBlockBodyFulu hydrates a beacon block body with correct field length sizes +// to comply with fssz marshalling and unmarshalling rules. +func HydrateBeaconBlockBodyFulu(b *ethpb.BeaconBlockBodyFulu) *ethpb.BeaconBlockBodyFulu { + if b == nil { + b = ðpb.BeaconBlockBodyFulu{} } if b.RandaoReveal == nil { b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength) } if b.Graffiti == nil { - b.Graffiti = make([]byte, 32) + b.Graffiti = make([]byte, fieldparams.RootLength) } if b.Eth1Data == nil { b.Eth1Data = ðpb.Eth1Data{ DepositRoot: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, 32), + BlockHash: make([]byte, fieldparams.RootLength), } } if b.SyncAggregate == nil { @@ -1627,30 +1384,56 @@ func HydrateBlindedBeaconBlockBodyElectra(b *ethpb.BlindedBeaconBlockBodyElectra SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), } } - if b.ExecutionPayloadHeader == nil { - b.ExecutionPayloadHeader = &enginev1.ExecutionPayloadHeaderElectra{ - ParentHash: make([]byte, 32), - FeeRecipient: make([]byte, 20), - StateRoot: make([]byte, fieldparams.RootLength), - ReceiptsRoot: make([]byte, fieldparams.RootLength), - LogsBloom: make([]byte, 256), - PrevRandao: make([]byte, 32), - ExtraData: make([]byte, 0), - BaseFeePerGas: make([]byte, 32), - BlockHash: make([]byte, 32), - TransactionsRoot: make([]byte, fieldparams.RootLength), - WithdrawalsRoot: make([]byte, fieldparams.RootLength), + if b.ExecutionPayload == nil { + b.ExecutionPayload = &enginev1.ExecutionPayloadDeneb{ + ParentHash: make([]byte, fieldparams.RootLength), + FeeRecipient: make([]byte, 20), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, 256), + PrevRandao: make([]byte, fieldparams.RootLength), + ExtraData: make([]byte, 0), + BaseFeePerGas: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, fieldparams.RootLength), + Transactions: make([][]byte, 0), + Withdrawals: make([]*enginev1.Withdrawal, 0), } } b.ExecutionRequests = HydrateExecutionRequests(b.ExecutionRequests) return b } -// HydrateV2BlindedBeaconBlockBodyDeneb hydrates a blinded v2 beacon block body with correct field length sizes +// HydrateSignedBlindedBeaconBlockFulu hydrates a signed blinded beacon block with correct field length sizes +// to comply with fssz marshalling and unmarshalling rules. +func HydrateSignedBlindedBeaconBlockFulu(b *ethpb.SignedBlindedBeaconBlockFulu) *ethpb.SignedBlindedBeaconBlockFulu { + if b.Signature == nil { + b.Signature = make([]byte, fieldparams.BLSSignatureLength) + } + b.Message = HydrateBlindedBeaconBlockFulu(b.Message) + return b +} + +// HydrateBlindedBeaconBlockFulu hydrates a blinded beacon block with correct field length sizes +// to comply with fssz marshalling and unmarshalling rules. +func HydrateBlindedBeaconBlockFulu(b *ethpb.BlindedBeaconBlockFulu) *ethpb.BlindedBeaconBlockFulu { + if b == nil { + b = ðpb.BlindedBeaconBlockFulu{} + } + if b.ParentRoot == nil { + b.ParentRoot = make([]byte, fieldparams.RootLength) + } + if b.StateRoot == nil { + b.StateRoot = make([]byte, fieldparams.RootLength) + } + b.Body = HydrateBlindedBeaconBlockBodyFulu(b.Body) + return b +} + +// HydrateBlindedBeaconBlockBodyFulu hydrates a blinded beacon block body with correct field length sizes // to comply with fssz marshalling and unmarshalling rules. -func HydrateV2BlindedBeaconBlockBodyDeneb(b *v2.BlindedBeaconBlockBodyDeneb) *v2.BlindedBeaconBlockBodyDeneb { +func HydrateBlindedBeaconBlockBodyFulu(b *ethpb.BlindedBeaconBlockBodyFulu) *ethpb.BlindedBeaconBlockBodyFulu { if b == nil { - b = &v2.BlindedBeaconBlockBodyDeneb{} + b = ðpb.BlindedBeaconBlockBodyFulu{} } if b.RandaoReveal == nil { b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength) @@ -1659,13 +1442,13 @@ func HydrateV2BlindedBeaconBlockBodyDeneb(b *v2.BlindedBeaconBlockBodyDeneb) *v2 b.Graffiti = make([]byte, 32) } if b.Eth1Data == nil { - b.Eth1Data = &v1.Eth1Data{ + b.Eth1Data = ðpb.Eth1Data{ DepositRoot: make([]byte, fieldparams.RootLength), BlockHash: make([]byte, 32), } } if b.SyncAggregate == nil { - b.SyncAggregate = &v1.SyncAggregate{ + b.SyncAggregate = ðpb.SyncAggregate{ SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength), SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength), } @@ -1685,5 +1468,6 @@ func HydrateV2BlindedBeaconBlockBodyDeneb(b *v2.BlindedBeaconBlockBodyDeneb) *v2 WithdrawalsRoot: make([]byte, fieldparams.RootLength), } } + b.ExecutionRequests = HydrateExecutionRequests(b.ExecutionRequests) return b } diff --git a/testing/util/block_test.go b/testing/util/block_test.go index 09b1e27c55c9..c95d3d0a9267 100644 --- a/testing/util/block_test.go +++ b/testing/util/block_test.go @@ -13,7 +13,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/consensus-types/primitives" "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" ethpbv1 "github.com/prysmaticlabs/prysm/v5/proto/eth/v1" - ethpbv2 "github.com/prysmaticlabs/prysm/v5/proto/eth/v2" ethpbalpha "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/testing/require" ) @@ -216,28 +215,6 @@ func TestHydrateV1SignedBeaconBlock_NoError(t *testing.T) { require.NoError(t, err) } -func TestHydrateV2AltairSignedBeaconBlock_NoError(t *testing.T) { - b := ðpbv2.SignedBeaconBlockAltair{} - b = HydrateV2AltairSignedBeaconBlock(b) - _, err := b.HashTreeRoot() - require.NoError(t, err) - _, err = b.Message.HashTreeRoot() - require.NoError(t, err) - _, err = b.Message.Body.HashTreeRoot() - require.NoError(t, err) -} - -func TestHydrateV2BellatrixSignedBeaconBlock_NoError(t *testing.T) { - b := ðpbv2.SignedBeaconBlockBellatrix{} - b = HydrateV2BellatrixSignedBeaconBlock(b) - _, err := b.HashTreeRoot() - require.NoError(t, err) - _, err = b.Message.HashTreeRoot() - require.NoError(t, err) - _, err = b.Message.Body.HashTreeRoot() - require.NoError(t, err) -} - func TestHydrateSignedBeaconBlockAltair_NoError(t *testing.T) { b := ðpbalpha.SignedBeaconBlockAltair{} b = HydrateSignedBeaconBlockAltair(b) @@ -278,33 +255,6 @@ func TestHydrateBlindedBeaconBlockBodyBellatrix_NoError(t *testing.T) { require.NoError(t, err) } -func TestHydrateV2SignedBlindedBeaconBlockBellatrix_NoError(t *testing.T) { - b := ðpbv2.SignedBlindedBeaconBlockBellatrix{} - b = HydrateV2SignedBlindedBeaconBlockBellatrix(b) - _, err := b.HashTreeRoot() - require.NoError(t, err) - _, err = b.Message.HashTreeRoot() - require.NoError(t, err) - _, err = b.Message.Body.HashTreeRoot() - require.NoError(t, err) -} - -func TestHydrateV2BlindedBeaconBlockBellatrix_NoError(t *testing.T) { - b := ðpbv2.BlindedBeaconBlockBellatrix{} - b = HydrateV2BlindedBeaconBlockBellatrix(b) - _, err := b.HashTreeRoot() - require.NoError(t, err) - _, err = b.Body.HashTreeRoot() - require.NoError(t, err) -} - -func TestHydrateV2BlindedBeaconBlockBodyBellatrix_NoError(t *testing.T) { - b := ðpbv2.BlindedBeaconBlockBodyBellatrix{} - b = HydrateV2BlindedBeaconBlockBodyBellatrix(b) - _, err := b.HashTreeRoot() - require.NoError(t, err) -} - func TestHydrateSignedBeaconBlockCapella_NoError(t *testing.T) { b := ðpbalpha.SignedBeaconBlockCapella{} b = HydrateSignedBeaconBlockCapella(b) diff --git a/testing/util/electra.go b/testing/util/electra.go index 0c0959bdbd82..f37a1da26ac6 100644 --- a/testing/util/electra.go +++ b/testing/util/electra.go @@ -2,7 +2,6 @@ package util import ( "encoding/binary" - "math" "math/big" "testing" @@ -21,22 +20,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/time/slots" ) -// HackElectraMaxuint is helpful for tests that need to set up cases where the electra fork has passed. -// We have unit tests that assert our config matches the upstream config, where the next fork is always -// set to MaxUint64 until the fork epoch is formally set. This creates an issue for tests that want to -// work with slots that are defined to be after electra because converting the max epoch to a slot leads -// to multiplication overflow. -// Monkey patching tests with this function is the simplest workaround in these cases. -func HackElectraMaxuint(t *testing.T) func() { - bc := params.MainnetConfig().Copy() - bc.ElectraForkEpoch = math.MaxUint32 - undo, err := params.SetActiveWithUndo(bc) - require.NoError(t, err) - return func() { - require.NoError(t, undo()) - } -} - type ElectraBlockGeneratorOption func(*electraBlockGenerator) type electraBlockGenerator struct { @@ -47,7 +30,7 @@ type electraBlockGenerator struct { sk bls.SecretKey proposer primitives.ValidatorIndex valRoot []byte - payload *enginev1.ExecutionPayloadElectra + payload *enginev1.ExecutionPayloadDeneb } func WithElectraProposerSigning(idx primitives.ValidatorIndex, sk bls.SecretKey, valRoot []byte) ElectraBlockGeneratorOption { @@ -59,7 +42,7 @@ func WithElectraProposerSigning(idx primitives.ValidatorIndex, sk bls.SecretKey, } } -func WithElectraPayload(p *enginev1.ExecutionPayloadElectra) ElectraBlockGeneratorOption { +func WithElectraPayload(p *enginev1.ExecutionPayloadDeneb) ElectraBlockGeneratorOption { return func(g *electraBlockGenerator) { g.payload = p } @@ -96,7 +79,7 @@ func GenerateTestElectraBlockWithSidecar(t *testing.T, parent [32]byte, slot pri logsBloom := bytesutil.PadTo([]byte("logs"), fieldparams.LogsBloomLength) receiptsRoot := bytesutil.PadTo([]byte("receiptsRoot"), fieldparams.RootLength) parentHash := bytesutil.PadTo([]byte("parentHash"), fieldparams.RootLength) - g.payload = &enginev1.ExecutionPayloadElectra{ + g.payload = &enginev1.ExecutionPayloadDeneb{ ParentHash: parentHash, FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), StateRoot: stateRoot, diff --git a/testing/util/electra_block.go b/testing/util/electra_block.go index acd4f8c8146d..8ba401722612 100644 --- a/testing/util/electra_block.go +++ b/testing/util/electra_block.go @@ -172,7 +172,7 @@ func GenerateFullBlockElectra( return nil, err } blockHash := indexToHash(uint64(slot)) - newExecutionPayloadElectra := &v1.ExecutionPayloadElectra{ + newExecutionPayloadElectra := &v1.ExecutionPayloadDeneb{ ParentHash: parentExecution.BlockHash(), FeeRecipient: make([]byte, 20), StateRoot: params.BeaconConfig().ZeroHash[:], diff --git a/testing/util/electra_state.go b/testing/util/electra_state.go index 551af5536508..3688734a41d0 100644 --- a/testing/util/electra_state.go +++ b/testing/util/electra_state.go @@ -96,7 +96,7 @@ func emptyGenesisStateElectra() (state.BeaconState, error) { Eth1DataVotes: []*ethpb.Eth1Data{}, Eth1DepositIndex: 0, - LatestExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderElectra{}, + LatestExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderDeneb{}, DepositBalanceToConsume: primitives.Gwei(0), ExitBalanceToConsume: primitives.Gwei(0), @@ -226,7 +226,7 @@ func buildGenesisBeaconStateElectra(genesisTime uint64, preState state.BeaconSta SyncCommitteeBits: scBits[:], SyncCommitteeSignature: make([]byte, 96), }, - ExecutionPayload: &enginev1.ExecutionPayloadElectra{ + ExecutionPayload: &enginev1.ExecutionPayloadDeneb{ ParentHash: make([]byte, 32), FeeRecipient: make([]byte, 20), StateRoot: make([]byte, 32), @@ -273,7 +273,7 @@ func buildGenesisBeaconStateElectra(genesisTime uint64, preState state.BeaconSta AggregatePubkey: aggregated.Marshal(), } - st.LatestExecutionPayloadHeader = &enginev1.ExecutionPayloadHeaderElectra{ + st.LatestExecutionPayloadHeader = &enginev1.ExecutionPayloadHeaderDeneb{ ParentHash: make([]byte, 32), FeeRecipient: make([]byte, 20), StateRoot: make([]byte, 32), diff --git a/testing/util/helpers.go b/testing/util/helpers.go index b207813a0861..9d46326b4b89 100644 --- a/testing/util/helpers.go +++ b/testing/util/helpers.go @@ -4,6 +4,7 @@ import ( "context" "encoding/binary" "fmt" + "math" "testing" "github.com/pkg/errors" @@ -19,6 +20,8 @@ import ( "github.com/prysmaticlabs/prysm/v5/crypto/bls" "github.com/prysmaticlabs/prysm/v5/crypto/rand" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/v5/runtime/version" + "github.com/prysmaticlabs/prysm/v5/testing/require" ) // RandaoReveal returns a signature of the requested epoch using the beacon proposer private key. @@ -149,3 +152,28 @@ func Random32Bytes(t *testing.T) []byte { } return b } + +// HackForksMaxuint is helpful for tests that need to set up cases for some future forks. +// We have unit tests that assert our config matches the upstream config, where some forks epoch are always +// set to MaxUint64 until they aer formally set. This creates an issue for tests that want to +// work with slots that are defined to be after these forks because converting the max epoch to a slot leads +// to multiplication overflow. +// Monkey patching tests with this function is the simplest workaround in these cases. +func HackForksMaxuint(t *testing.T, forksVersion []int) func() { + bc := params.MainnetConfig().Copy() + for _, forkVersion := range forksVersion { + switch forkVersion { + case version.Electra: + bc.ElectraForkEpoch = math.MaxUint32 - 1 + case version.Fulu: + bc.FuluForkEpoch = math.MaxUint32 + default: + t.Fatalf("unsupported fork version %d", forkVersion) + } + } + undo, err := params.SetActiveWithUndo(bc) + require.NoError(t, err) + return func() { + require.NoError(t, undo()) + } +} diff --git a/testing/util/lightclient.go b/testing/util/lightclient.go index 0cbb0542f9ab..a37dbc780156 100644 --- a/testing/util/lightclient.go +++ b/testing/util/lightclient.go @@ -15,7 +15,6 @@ import ( "github.com/prysmaticlabs/prysm/v5/encoding/ssz" v11 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" - pb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/runtime/version" "github.com/prysmaticlabs/prysm/v5/testing/require" ) @@ -660,6 +659,118 @@ func (l *TestLightClient) SetupTestElectra(blinded bool) *TestLightClient { return l } +func (l *TestLightClient) SetupTestFulu(blinded bool) *TestLightClient { + ctx := context.Background() + + slot := primitives.Slot(params.BeaconConfig().FuluForkEpoch * primitives.Epoch(params.BeaconConfig().SlotsPerEpoch)).Add(1) + + attestedState, err := NewBeaconStateFulu() + require.NoError(l.T, err) + err = attestedState.SetSlot(slot) + require.NoError(l.T, err) + + finalizedBlock, err := blocks.NewSignedBeaconBlock(NewBeaconBlockFulu()) + require.NoError(l.T, err) + finalizedBlock.SetSlot(1) + finalizedHeader, err := finalizedBlock.Header() + require.NoError(l.T, err) + finalizedRoot, err := finalizedHeader.Header.HashTreeRoot() + require.NoError(l.T, err) + + require.NoError(l.T, attestedState.SetFinalizedCheckpoint(ðpb.Checkpoint{ + Epoch: params.BeaconConfig().FuluForkEpoch - 10, + Root: finalizedRoot[:], + })) + + parent := NewBeaconBlockFulu() + parent.Block.Slot = slot + + signedParent, err := blocks.NewSignedBeaconBlock(parent) + require.NoError(l.T, err) + + parentHeader, err := signedParent.Header() + require.NoError(l.T, err) + attestedHeader := parentHeader.Header + + err = attestedState.SetLatestBlockHeader(attestedHeader) + require.NoError(l.T, err) + attestedStateRoot, err := attestedState.HashTreeRoot(ctx) + require.NoError(l.T, err) + + // get a new signed block so the root is updated with the new state root + parent.Block.StateRoot = attestedStateRoot[:] + signedParent, err = blocks.NewSignedBeaconBlock(parent) + require.NoError(l.T, err) + + state, err := NewBeaconStateFulu() + require.NoError(l.T, err) + err = state.SetSlot(slot) + require.NoError(l.T, err) + + parentRoot, err := signedParent.Block().HashTreeRoot() + require.NoError(l.T, err) + + var signedBlock interfaces.SignedBeaconBlock + if blinded { + block := NewBlindedBeaconBlockFulu() + block.Message.Slot = slot + block.Message.ParentRoot = parentRoot[:] + + for i := uint64(0); i < params.BeaconConfig().MinSyncCommitteeParticipants; i++ { + block.Message.Body.SyncAggregate.SyncCommitteeBits.SetBitAt(i, true) + } + + signedBlock, err = blocks.NewSignedBeaconBlock(block) + require.NoError(l.T, err) + + h, err := signedBlock.Header() + require.NoError(l.T, err) + + err = state.SetLatestBlockHeader(h.Header) + require.NoError(l.T, err) + stateRoot, err := state.HashTreeRoot(ctx) + require.NoError(l.T, err) + + // get a new signed block so the root is updated with the new state root + block.Message.StateRoot = stateRoot[:] + signedBlock, err = blocks.NewSignedBeaconBlock(block) + require.NoError(l.T, err) + } else { + block := NewBeaconBlockFulu() + block.Block.Slot = slot + block.Block.ParentRoot = parentRoot[:] + + for i := uint64(0); i < params.BeaconConfig().MinSyncCommitteeParticipants; i++ { + block.Block.Body.SyncAggregate.SyncCommitteeBits.SetBitAt(i, true) + } + + signedBlock, err = blocks.NewSignedBeaconBlock(block) + require.NoError(l.T, err) + + h, err := signedBlock.Header() + require.NoError(l.T, err) + + err = state.SetLatestBlockHeader(h.Header) + require.NoError(l.T, err) + stateRoot, err := state.HashTreeRoot(ctx) + require.NoError(l.T, err) + + // get a new signed block so the root is updated with the new state root + block.Block.StateRoot = stateRoot[:] + signedBlock, err = blocks.NewSignedBeaconBlock(block) + require.NoError(l.T, err) + } + + l.State = state + l.AttestedState = attestedState + l.AttestedBlock = signedParent + l.Block = signedBlock + l.Ctx = ctx + l.FinalizedBlock = finalizedBlock + + return l +} + func (l *TestLightClient) SetupTestDenebFinalizedBlockCapella(blinded bool) *TestLightClient { ctx := context.Background() @@ -894,7 +1005,7 @@ func (l *TestLightClient) CheckAttestedHeader(header interfaces.LightClientHeade } } -func (l *TestLightClient) CheckSyncAggregate(sa *pb.SyncAggregate) { +func (l *TestLightClient) CheckSyncAggregate(sa *ethpb.SyncAggregate) { syncAggregate, err := l.Block.Block().Body().SyncAggregate() require.NoError(l.T, err) require.DeepSSZEqual(l.T, syncAggregate.SyncCommitteeBits, sa.SyncCommitteeBits, "SyncAggregate bits is not equal") diff --git a/testing/util/merge.go b/testing/util/merge.go index 85bf2c82a807..d911e5a12380 100644 --- a/testing/util/merge.go +++ b/testing/util/merge.go @@ -1,10 +1,13 @@ package util import ( - v2 "github.com/prysmaticlabs/prysm/v5/proto/eth/v2" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" ) +// ---------------------------------------------------------------------------- +// Bellatrix +// ---------------------------------------------------------------------------- + // NewBeaconBlockBellatrix creates a beacon block with minimum marshalable fields. func NewBeaconBlockBellatrix() *ethpb.SignedBeaconBlockBellatrix { return HydrateSignedBeaconBlockBellatrix(ðpb.SignedBeaconBlockBellatrix{}) @@ -15,10 +18,9 @@ func NewBlindedBeaconBlockBellatrix() *ethpb.SignedBlindedBeaconBlockBellatrix { return HydrateSignedBlindedBeaconBlockBellatrix(ðpb.SignedBlindedBeaconBlockBellatrix{}) } -// NewBlindedBeaconBlockBellatrixV2 creates a blinded beacon block with minimum marshalable fields. -func NewBlindedBeaconBlockBellatrixV2() *v2.SignedBlindedBeaconBlockBellatrix { - return HydrateV2SignedBlindedBeaconBlockBellatrix(&v2.SignedBlindedBeaconBlockBellatrix{}) -} +// ---------------------------------------------------------------------------- +// Capella +// ---------------------------------------------------------------------------- // NewBeaconBlockCapella creates a beacon block with minimum marshalable fields. func NewBeaconBlockCapella() *ethpb.SignedBeaconBlockCapella { @@ -30,16 +32,15 @@ func NewBlindedBeaconBlockCapella() *ethpb.SignedBlindedBeaconBlockCapella { return HydrateSignedBlindedBeaconBlockCapella(ðpb.SignedBlindedBeaconBlockCapella{}) } +// ---------------------------------------------------------------------------- +// Deneb +// ---------------------------------------------------------------------------- + // NewBeaconBlockDeneb creates a beacon block with minimum marshalable fields. func NewBeaconBlockDeneb() *ethpb.SignedBeaconBlockDeneb { return HydrateSignedBeaconBlockDeneb(ðpb.SignedBeaconBlockDeneb{}) } -// NewBeaconBlockElectra creates a beacon block with minimum marshalable fields. -func NewBeaconBlockElectra() *ethpb.SignedBeaconBlockElectra { - return HydrateSignedBeaconBlockElectra(ðpb.SignedBeaconBlockElectra{}) -} - // NewBeaconBlockContentsDeneb creates a beacon block with minimum marshalable fields. func NewBeaconBlockContentsDeneb() *ethpb.SignedBeaconBlockContentsDeneb { return HydrateSignedBeaconBlockContentsDeneb(ðpb.SignedBeaconBlockContentsDeneb{}) @@ -50,6 +51,15 @@ func NewBlindedBeaconBlockDeneb() *ethpb.SignedBlindedBeaconBlockDeneb { return HydrateSignedBlindedBeaconBlockDeneb(ðpb.SignedBlindedBeaconBlockDeneb{}) } +// ---------------------------------------------------------------------------- +// Electra +// ---------------------------------------------------------------------------- + +// NewBeaconBlockElectra creates a beacon block with minimum marshalable fields. +func NewBeaconBlockElectra() *ethpb.SignedBeaconBlockElectra { + return HydrateSignedBeaconBlockElectra(ðpb.SignedBeaconBlockElectra{}) +} + // NewBeaconBlockContentsElectra creates a beacon block with minimum marshalable fields. func NewBeaconBlockContentsElectra() *ethpb.SignedBeaconBlockContentsElectra { return HydrateSignedBeaconBlockContentsElectra(ðpb.SignedBeaconBlockContentsElectra{}) @@ -60,7 +70,21 @@ func NewBlindedBeaconBlockElectra() *ethpb.SignedBlindedBeaconBlockElectra { return HydrateSignedBlindedBeaconBlockElectra(ðpb.SignedBlindedBeaconBlockElectra{}) } -// NewBlindedBeaconBlockCapellaV2 creates a blinded beacon block with minimum marshalable fields. -func NewBlindedBeaconBlockCapellaV2() *v2.SignedBlindedBeaconBlockCapella { - return HydrateV2SignedBlindedBeaconBlockCapella(&v2.SignedBlindedBeaconBlockCapella{}) +// ---------------------------------------------------------------------------- +// Fulu +// ---------------------------------------------------------------------------- + +// NewBeaconBlockFulu creates a beacon block with minimum marshalable fields. +func NewBeaconBlockFulu() *ethpb.SignedBeaconBlockFulu { + return HydrateSignedBeaconBlockFulu(ðpb.SignedBeaconBlockFulu{}) +} + +// NewBeaconBlockContentsFulu creates a beacon block with minimum marshalable fields. +func NewBeaconBlockContentsFulu() *ethpb.SignedBeaconBlockContentsFulu { + return HydrateSignedBeaconBlockContentsFulu(ðpb.SignedBeaconBlockContentsFulu{}) +} + +// NewBlindedBeaconBlockFulu creates a blinded beacon block with minimum marshalable fields. +func NewBlindedBeaconBlockFulu() *ethpb.SignedBlindedBeaconBlockFulu { + return HydrateSignedBlindedBeaconBlockFulu(ðpb.SignedBlindedBeaconBlockFulu{}) } diff --git a/testing/util/state.go b/testing/util/state.go index 2c1f08c756b8..f8eac0ea2fb2 100644 --- a/testing/util/state.go +++ b/testing/util/state.go @@ -424,7 +424,7 @@ func NewBeaconStateElectra(options ...func(state *ethpb.BeaconStateElectra) erro Pubkeys: pubkeys, AggregatePubkey: make([]byte, 48), }, - LatestExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderElectra{ + LatestExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderDeneb{ ParentHash: make([]byte, 32), FeeRecipient: make([]byte, 20), StateRoot: make([]byte, 32), @@ -454,6 +454,74 @@ func NewBeaconStateElectra(options ...func(state *ethpb.BeaconStateElectra) erro return st.Copy(), nil } +// NewBeaconStateFulu creates a beacon state with minimum marshalable fields. +func NewBeaconStateFulu(options ...func(state *ethpb.BeaconStateFulu) error) (state.BeaconState, error) { + pubkeys := make([][]byte, 512) + for i := range pubkeys { + pubkeys[i] = make([]byte, 48) + } + + seed := ðpb.BeaconStateFulu{ + BlockRoots: filledByteSlice2D(uint64(params.BeaconConfig().SlotsPerHistoricalRoot), 32), + StateRoots: filledByteSlice2D(uint64(params.BeaconConfig().SlotsPerHistoricalRoot), 32), + Slashings: make([]uint64, params.BeaconConfig().EpochsPerSlashingsVector), + RandaoMixes: filledByteSlice2D(uint64(params.BeaconConfig().EpochsPerHistoricalVector), 32), + Validators: make([]*ethpb.Validator, 0), + CurrentJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + Eth1Data: ðpb.Eth1Data{ + DepositRoot: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, 32), + }, + Fork: ðpb.Fork{ + PreviousVersion: make([]byte, 4), + CurrentVersion: make([]byte, 4), + }, + Eth1DataVotes: make([]*ethpb.Eth1Data, 0), + HistoricalRoots: make([][]byte, 0), + JustificationBits: bitfield.Bitvector4{0x0}, + FinalizedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + LatestBlockHeader: HydrateBeaconHeader(ðpb.BeaconBlockHeader{}), + PreviousJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + PreviousEpochParticipation: make([]byte, 0), + CurrentEpochParticipation: make([]byte, 0), + CurrentSyncCommittee: ðpb.SyncCommittee{ + Pubkeys: pubkeys, + AggregatePubkey: make([]byte, 48), + }, + NextSyncCommittee: ðpb.SyncCommittee{ + Pubkeys: pubkeys, + AggregatePubkey: make([]byte, 48), + }, + LatestExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderDeneb{ + ParentHash: make([]byte, 32), + FeeRecipient: make([]byte, 20), + StateRoot: make([]byte, 32), + ReceiptsRoot: make([]byte, 32), + LogsBloom: make([]byte, 256), + PrevRandao: make([]byte, 32), + ExtraData: make([]byte, 0), + BaseFeePerGas: make([]byte, 32), + BlockHash: make([]byte, 32), + TransactionsRoot: make([]byte, 32), + WithdrawalsRoot: make([]byte, 32), + }, + } + + for _, opt := range options { + err := opt(seed) + if err != nil { + return nil, err + } + } + + var st, err = state_native.InitializeFromProtoUnsafeFulu(seed) + if err != nil { + return nil, err + } + + return st.Copy(), nil +} + // SSZ will fill 2D byte slices with their respective values, so we must fill these in too for round // trip testing. func filledByteSlice2D(length, innerLen uint64) [][]byte { diff --git a/time/slots/slottime.go b/time/slots/slottime.go index f847af7133f4..cdc7674edebb 100644 --- a/time/slots/slottime.go +++ b/time/slots/slottime.go @@ -86,6 +86,8 @@ func ToEpoch(slot primitives.Slot) primitives.Epoch { func ToForkVersion(slot primitives.Slot) int { epoch := ToEpoch(slot) switch { + case epoch >= params.BeaconConfig().FuluForkEpoch: + return version.Fulu case epoch >= params.BeaconConfig().ElectraForkEpoch: return version.Electra case epoch >= params.BeaconConfig().DenebForkEpoch: diff --git a/time/slots/slottime_test.go b/time/slots/slottime_test.go index eb57fcaee057..0cc1bbf6c56a 100644 --- a/time/slots/slottime_test.go +++ b/time/slots/slottime_test.go @@ -635,6 +635,19 @@ func TestSecondsUntilNextEpochStart(t *testing.T) { } func TestToForkVersion(t *testing.T) { + t.Run("Fulu fork version", func(t *testing.T) { + params.SetupTestConfigCleanup(t) + config := params.BeaconConfig() + config.FuluForkEpoch = 100 + params.OverrideBeaconConfig(config) + + slot, err := EpochStart(params.BeaconConfig().FuluForkEpoch) + require.NoError(t, err) + + result := ToForkVersion(slot) + require.Equal(t, version.Fulu, result) + }) + t.Run("Electra fork version", func(t *testing.T) { params.SetupTestConfigCleanup(t) config := params.BeaconConfig() diff --git a/validator/client/beacon-api/BUILD.bazel b/validator/client/beacon-api/BUILD.bazel index cc25603b9877..22e414219213 100644 --- a/validator/client/beacon-api/BUILD.bazel +++ b/validator/client/beacon-api/BUILD.bazel @@ -101,6 +101,7 @@ go_test( "propose_beacon_block_capella_test.go", "propose_beacon_block_deneb_test.go", "propose_beacon_block_electra_test.go", + "propose_beacon_block_fulu_test.go", "propose_beacon_block_phase0_test.go", "propose_beacon_block_test.go", "propose_exit_test.go", diff --git a/validator/client/beacon-api/get_beacon_block.go b/validator/client/beacon-api/get_beacon_block.go index 3c6a108a662f..3af8f1763474 100644 --- a/validator/client/beacon-api/get_beacon_block.go +++ b/validator/client/beacon-api/get_beacon_block.go @@ -72,6 +72,7 @@ func (c *beaconApiValidatorClient) beaconBlock(ctx context.Context, slot primiti return processBlockResponse(ver, blinded, decoder) } +// nolint: gocognit func processBlockResponse(ver string, isBlinded bool, decoder *json.Decoder) (*ethpb.GenericBeaconBlock, error) { var response *ethpb.GenericBeaconBlock if decoder == nil { @@ -186,6 +187,28 @@ func processBlockResponse(ver string, isBlinded bool, decoder *json.Decoder) (*e } response = genericBlock } + case version.String(version.Fulu): + if isBlinded { + jsonFuluBlock := structs.BlindedBeaconBlockFulu{} + if err := decoder.Decode(&jsonFuluBlock); err != nil { + return nil, errors.Wrap(err, "failed to decode blinded fulu block response json") + } + genericBlock, err := jsonFuluBlock.ToGeneric() + if err != nil { + return nil, errors.Wrap(err, "failed to get blinded fulu block") + } + response = genericBlock + } else { + jsonFuluBlockContents := structs.BeaconBlockContentsFulu{} + if err := decoder.Decode(&jsonFuluBlockContents); err != nil { + return nil, errors.Wrap(err, "failed to decode fulu block response json") + } + genericBlock, err := jsonFuluBlockContents.ToGeneric() + if err != nil { + return nil, errors.Wrap(err, "failed to get fulu block") + } + response = genericBlock + } default: return nil, errors.Errorf("unsupported consensus version `%s`", ver) } diff --git a/validator/client/beacon-api/propose_beacon_block.go b/validator/client/beacon-api/propose_beacon_block.go index 52e7a1e91944..06e4ad1c8406 100644 --- a/validator/client/beacon-api/propose_beacon_block.go +++ b/validator/client/beacon-api/propose_beacon_block.go @@ -14,6 +14,7 @@ import ( ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" ) +// nolint:gocognit func (c *beaconApiValidatorClient) proposeBeaconBlock(ctx context.Context, in *ethpb.GenericSignedBeaconBlock) (*ethpb.ProposeResponse, error) { var consensusVersion string var beaconBlockRoot [32]byte @@ -149,16 +150,43 @@ func (c *beaconApiValidatorClient) proposeBeaconBlock(ctx context.Context, in *e if err != nil { return nil, errors.Wrap(err, "failed to marshal blinded electra beacon block contents") } + case *ethpb.GenericSignedBeaconBlock_Fulu: + consensusVersion = "fulu" + beaconBlockRoot, err = blockType.Fulu.Block.HashTreeRoot() + if err != nil { + return nil, errors.Wrap(err, "failed to compute block root for fulu beacon block") + } + signedBlock, err := structs.SignedBeaconBlockContentsFuluFromConsensus(blockType.Fulu) + if err != nil { + return nil, errors.Wrap(err, "failed to convert fulu beacon block contents") + } + marshalledSignedBeaconBlockJson, err = json.Marshal(signedBlock) + if err != nil { + return nil, errors.Wrap(err, "failed to marshal fulu beacon block contents") + } + case *ethpb.GenericSignedBeaconBlock_BlindedFulu: + blinded = true + consensusVersion = "fulu" + beaconBlockRoot, err = blockType.BlindedFulu.HashTreeRoot() + if err != nil { + return nil, errors.Wrap(err, "failed to compute block root for blinded fulu beacon block") + } + signedBlock, err := structs.SignedBlindedBeaconBlockFuluFromConsensus(blockType.BlindedFulu) + if err != nil { + return nil, errors.Wrap(err, "failed to convert blinded fulu beacon block contents") + } + marshalledSignedBeaconBlockJson, err = json.Marshal(signedBlock) + if err != nil { + return nil, errors.Wrap(err, "failed to marshal blinded fulu beacon block contents") + } default: return nil, errors.Errorf("unsupported block type %T", in.Block) } - var endpoint string + endpoint := "/eth/v2/beacon/blocks" if blinded { endpoint = "/eth/v2/beacon/blinded_blocks" - } else { - endpoint = "/eth/v2/beacon/blocks" } headers := map[string]string{"Eth-Consensus-Version": consensusVersion} diff --git a/validator/client/beacon-api/propose_beacon_block_fulu_test.go b/validator/client/beacon-api/propose_beacon_block_fulu_test.go new file mode 100644 index 000000000000..fb760e6a34e2 --- /dev/null +++ b/validator/client/beacon-api/propose_beacon_block_fulu_test.go @@ -0,0 +1,50 @@ +package beacon_api + +import ( + "bytes" + "context" + "encoding/json" + "testing" + + "github.com/prysmaticlabs/prysm/v5/api/server/structs" + rpctesting "github.com/prysmaticlabs/prysm/v5/beacon-chain/rpc/eth/shared/testing" + "github.com/prysmaticlabs/prysm/v5/testing/assert" + "github.com/prysmaticlabs/prysm/v5/testing/require" + "github.com/prysmaticlabs/prysm/v5/validator/client/beacon-api/mock" + "go.uber.org/mock/gomock" +) + +func TestProposeBeaconBlock_Fulu(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) + + var blockContents structs.SignedBeaconBlockContentsFulu + err := json.Unmarshal([]byte(rpctesting.FuluBlockContents), &blockContents) + require.NoError(t, err) + genericSignedBlock, err := blockContents.ToGeneric() + require.NoError(t, err) + + fuluBytes, err := json.Marshal(blockContents) + require.NoError(t, err) + // Make sure that what we send in the POST body is the marshalled version of the protobuf block + headers := map[string]string{"Eth-Consensus-Version": "fulu"} + jsonRestHandler.EXPECT().Post( + gomock.Any(), + "/eth/v2/beacon/blocks", + headers, + bytes.NewBuffer(fuluBytes), + nil, + ) + + validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} + proposeResponse, err := validatorClient.proposeBeaconBlock(context.Background(), genericSignedBlock) + assert.NoError(t, err) + require.NotNil(t, proposeResponse) + + expectedBlockRoot, err := genericSignedBlock.GetFulu().Block.HashTreeRoot() + require.NoError(t, err) + + // Make sure that the block root is set + assert.DeepEqual(t, expectedBlockRoot[:], proposeResponse.BlockRoot) +} diff --git a/validator/client/propose.go b/validator/client/propose.go index a62d73ee814f..08bf10d4a6ba 100644 --- a/validator/client/propose.go +++ b/validator/client/propose.go @@ -148,6 +148,12 @@ func (v *validator) ProposeBlock(ctx context.Context, slot primitives.Slot, pubK log.WithError(err).Error("Failed to build generic signed block") return } + case version.Fulu: + genericSignedBlock, err = buildGenericSignedBlockFuluWithBlobs(pb, b) + if err != nil { + log.WithError(err).Error("Failed to build generic signed block") + return + } default: log.Errorf("Unsupported block version %s", version.String(blk.Version())) } @@ -270,6 +276,22 @@ func buildGenericSignedBlockElectraWithBlobs(pb proto.Message, b *ethpb.GenericB }, nil } +func buildGenericSignedBlockFuluWithBlobs(pb proto.Message, b *ethpb.GenericBeaconBlock) (*ethpb.GenericSignedBeaconBlock, error) { + fuluBlock, ok := pb.(*ethpb.SignedBeaconBlockFulu) + if !ok { + return nil, errors.New("could cast to fulu block") + } + return ðpb.GenericSignedBeaconBlock{ + Block: ðpb.GenericSignedBeaconBlock_Fulu{ + Fulu: ðpb.SignedBeaconBlockContentsFulu{ + Block: fuluBlock, + KzgProofs: b.GetFulu().KzgProofs, + Blobs: b.GetFulu().Blobs, + }, + }, + }, nil +} + // ProposeExit performs a voluntary exit on a validator. // The exit is signed by the validator before being sent to the beacon node for broadcasting. func ProposeExit( diff --git a/validator/client/propose_test.go b/validator/client/propose_test.go index ab75d9ec2013..96075035f109 100644 --- a/validator/client/propose_test.go +++ b/validator/client/propose_test.go @@ -665,6 +665,19 @@ func testProposeBlock(t *testing.T, graffiti []byte) { }, }, }, + { + name: "fulu block", + version: version.Fulu, + block: ðpb.GenericBeaconBlock{ + Block: ðpb.GenericBeaconBlock_Fulu{ + Fulu: func() *ethpb.BeaconBlockContentsFulu { + blk := util.NewBeaconBlockContentsFulu() + blk.Block.Block.Body.Graffiti = graffiti + return ðpb.BeaconBlockContentsFulu{Block: blk.Block.Block, KzgProofs: blk.KzgProofs, Blobs: blk.Blobs} + }(), + }, + }, + }, } for _, tt := range tests { diff --git a/validator/client/validator_test.go b/validator/client/validator_test.go index 950f4d376cfb..9217347d9a56 100644 --- a/validator/client/validator_test.go +++ b/validator/client/validator_test.go @@ -2874,7 +2874,7 @@ func TestUpdateValidatorStatusCache(t *testing.T) { beaconNodeHosts: []string{"http://localhost:8080", "http://localhost:8081"}, currentHostIndex: 0, pubkeyToStatus: map[[fieldparams.BLSPubkeyLength]byte]*validatorStatus{ - [fieldparams.BLSPubkeyLength]byte{0x03}: &validatorStatus{ // add non existant key and status to cache, should be fully removed on update + [fieldparams.BLSPubkeyLength]byte{0x03}: &validatorStatus{ // add non existent key and status to cache, should be fully removed on update publicKey: []byte{0x03}, status: ðpb.ValidatorStatusResponse{ Status: ethpb.ValidatorStatus_ACTIVE, @@ -2887,7 +2887,7 @@ func TestUpdateValidatorStatusCache(t *testing.T) { err := v.updateValidatorStatusCache(ctx, pubkeys) assert.NoError(t, err) - // make sure the nonexistant key is fully removed + // make sure the nonexistent key is fully removed _, ok := v.pubkeyToStatus[[fieldparams.BLSPubkeyLength]byte{0x03}] require.Equal(t, false, ok) // make sure we only have the added values diff --git a/validator/db/testing/setup_db.go b/validator/db/testing/setup_db.go index 288fbb4d6f62..72aeb1222693 100644 --- a/validator/db/testing/setup_db.go +++ b/validator/db/testing/setup_db.go @@ -13,14 +13,14 @@ import ( // SetupDB instantiates and returns a DB instance for the validator client. // The `minimal` flag indicates whether the DB should be instantiated with minimal, filesystem // slashing protection database. -func SetupDB(t testing.TB, pubkeys [][fieldparams.BLSPubkeyLength]byte, mimimal bool) iface.ValidatorDB { +func SetupDB(t testing.TB, pubkeys [][fieldparams.BLSPubkeyLength]byte, minimal bool) iface.ValidatorDB { var ( db iface.ValidatorDB err error ) // Create a new DB instance. - if mimimal { + if minimal { config := &filesystem.Config{PubKeys: pubkeys} db, err = filesystem.NewStore(t.TempDir(), config) } else { diff --git a/validator/rpc/handlers_health_test.go b/validator/rpc/handlers_health_test.go index ac46c31221a1..7f334c8e1361 100644 --- a/validator/rpc/handlers_health_test.go +++ b/validator/rpc/handlers_health_test.go @@ -12,7 +12,6 @@ import ( "github.com/golang/protobuf/ptypes/empty" "github.com/prysmaticlabs/prysm/v5/api" "github.com/prysmaticlabs/prysm/v5/io/logs/mock" - eth "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" pb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/testing/require" validatormock "github.com/prysmaticlabs/prysm/v5/testing/validator-mock" @@ -26,11 +25,11 @@ type MockBeaconNodeHealthClient struct { err error } -func (m *MockBeaconNodeHealthClient) StreamBeaconLogs(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (eth.Health_StreamBeaconLogsClient, error) { +func (m *MockBeaconNodeHealthClient) StreamBeaconLogs(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (pb.Health_StreamBeaconLogsClient, error) { return m, m.err } -func (m *MockBeaconNodeHealthClient) Recv() (*eth.LogsResponse, error) { +func (m *MockBeaconNodeHealthClient) Recv() (*pb.LogsResponse, error) { if len(m.logs) == 0 { return nil, io.EOF } @@ -173,7 +172,7 @@ func TestServer_GetVersion(t *testing.T) { ctx: ctx, nodeClient: mockNodeClient, } - mockNodeClient.EXPECT().Version(gomock.Any(), gomock.Any()).Return(ð.Version{ + mockNodeClient.EXPECT().Version(gomock.Any(), gomock.Any()).Return(&pb.Version{ Version: "4.10.1", Metadata: "beacon node", }, nil)