diff --git a/consensus/types/src/execution/mod.rs b/consensus/types/src/execution/mod.rs index 5dd5597cc7..d3452546ba 100644 --- a/consensus/types/src/execution/mod.rs +++ b/consensus/types/src/execution/mod.rs @@ -47,6 +47,7 @@ pub use payload::{ }; pub use signed_bls_to_execution_change::SignedBlsToExecutionChange; pub use signed_execution_payload_bid::{ - SignedExecutionPayloadBidGloas, SignedExecutionPayloadBidHeze, SignedExecutionPayloadBidRef, + SignedExecutionPayloadBid, SignedExecutionPayloadBidGloas, SignedExecutionPayloadBidHeze, + SignedExecutionPayloadBidRef, }; pub use signed_execution_payload_envelope::SignedExecutionPayloadEnvelope; diff --git a/consensus/types/src/execution/signed_execution_payload_bid.rs b/consensus/types/src/execution/signed_execution_payload_bid.rs index 6f1e7f0c02..b2c18e948f 100644 --- a/consensus/types/src/execution/signed_execution_payload_bid.rs +++ b/consensus/types/src/execution/signed_execution_payload_bid.rs @@ -1,4 +1,7 @@ -use crate::execution::{ExecutionPayloadBidGloas, ExecutionPayloadBidHeze, ExecutionPayloadBidRef}; +use crate::execution::{ + ExecutionPayloadBid, ExecutionPayloadBidGloas, ExecutionPayloadBidHeze, ExecutionPayloadBidRef, +}; +use crate::state::BeaconStateError; use crate::test_utils::TestRandom; use crate::{EthSpec, ForkName}; use bls::Signature; @@ -6,23 +9,92 @@ use context_deserialize::context_deserialize; use educe::Educe; use serde::{Deserialize, Serialize}; use ssz_derive::{Decode, Encode}; +use superstruct::superstruct; use test_random_derive::TestRandom; use tree_hash_derive::TreeHash; -#[derive(TestRandom, TreeHash, Debug, Clone, Encode, Decode, Serialize, Deserialize, Educe)] +#[superstruct( + variants(Gloas, Heze), + variant_attributes( + derive( + Debug, + Clone, + Serialize, + Deserialize, + Encode, + Decode, + TestRandom, + TreeHash, + Educe, + ), + educe(PartialEq, Hash(bound(E: EthSpec))), + context_deserialize(ForkName), + serde(bound = "E: EthSpec"), + cfg_attr( + feature = "arbitrary", + derive(arbitrary::Arbitrary), + arbitrary(bound = "E: EthSpec"), + ), + ), + cast_error( + ty = "BeaconStateError", + expr = "BeaconStateError::IncorrectStateVariant" + ), + partial_getter_error( + ty = "BeaconStateError", + expr = "BeaconStateError::IncorrectStateVariant" + ), + map_ref_into(ExecutionPayloadBidRef) +)] #[cfg_attr( feature = "arbitrary", derive(arbitrary::Arbitrary), arbitrary(bound = "E: EthSpec") )] -#[educe(PartialEq, Hash)] -#[serde(bound = "E: EthSpec")] -#[context_deserialize(ForkName)] -pub struct SignedExecutionPayloadBidGloas { - pub message: ExecutionPayloadBidGloas, +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Encode, TreeHash)] +#[serde(untagged)] +#[tree_hash(enum_behaviour = "transparent")] +#[ssz(enum_behaviour = "transparent")] +#[serde(bound = "E: EthSpec", deny_unknown_fields)] +pub struct SignedExecutionPayloadBid { + #[superstruct(flatten)] + pub message: ExecutionPayloadBid, pub signature: Signature, } +impl SignedExecutionPayloadBid { + pub fn message(&self) -> ExecutionPayloadBidRef<'_, E> { + match self { + Self::Gloas(inner) => ExecutionPayloadBidRef::Gloas(&inner.message), + Self::Heze(inner) => ExecutionPayloadBidRef::Heze(&inner.message), + } + } + + pub fn empty_gloas() -> Self { + Self::Gloas(SignedExecutionPayloadBidGloas { + message: ExecutionPayloadBidGloas::default(), + signature: Signature::empty(), + }) + } + + pub fn empty_heze() -> Self { + Self::Heze(SignedExecutionPayloadBidHeze { + message: ExecutionPayloadBidHeze::default(), + signature: Signature::empty(), + }) + } +} + +impl<'a, E: EthSpec> SignedExecutionPayloadBidRef<'a, E> { + pub fn message(&self) -> ExecutionPayloadBidRef<'a, E> { + map_signed_execution_payload_bid_ref_into_execution_payload_bid_ref!( + &'a _, + *self, + |inner, cons| { cons(&inner.message) } + ) + } +} + impl SignedExecutionPayloadBidGloas { pub fn empty() -> Self { Self { @@ -32,20 +104,6 @@ impl SignedExecutionPayloadBidGloas { } } -#[derive(TestRandom, TreeHash, Debug, Clone, Encode, Decode, Serialize, Deserialize, Educe)] -#[cfg_attr( - feature = "arbitrary", - derive(arbitrary::Arbitrary), - arbitrary(bound = "E: EthSpec") -)] -#[educe(PartialEq, Hash)] -#[serde(bound = "E: EthSpec")] -#[context_deserialize(ForkName)] -pub struct SignedExecutionPayloadBidHeze { - pub message: ExecutionPayloadBidHeze, - pub signature: Signature, -} - impl SignedExecutionPayloadBidHeze { pub fn empty() -> Self { Self { @@ -55,27 +113,6 @@ impl SignedExecutionPayloadBidHeze { } } -pub enum SignedExecutionPayloadBidRef<'a, E: EthSpec> { - Gloas(&'a SignedExecutionPayloadBidGloas), - Heze(&'a SignedExecutionPayloadBidHeze), -} - -impl<'a, E: EthSpec> SignedExecutionPayloadBidRef<'a, E> { - pub fn message(&self) -> ExecutionPayloadBidRef<'a, E> { - match self { - Self::Gloas(inner) => ExecutionPayloadBidRef::Gloas(&inner.message), - Self::Heze(inner) => ExecutionPayloadBidRef::Heze(&inner.message), - } - } - - pub fn signature(&self) -> &'a Signature { - match self { - Self::Gloas(inner) => &inner.signature, - Self::Heze(inner) => &inner.signature, - } - } -} - #[cfg(test)] mod tests { use super::*;