From 69b8108daec93181d4305411d8b9930a354e6ade Mon Sep 17 00:00:00 2001 From: Noah Citron Date: Wed, 18 Jan 2023 19:42:56 -0500 Subject: [PATCH] fix: deserialize wrapped lc headers correctly (#169) * fix: deserialize wrapped lc headers correctly * clippy --- consensus/src/types.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/consensus/src/types.rs b/consensus/src/types.rs index 2fb7d37..44c7056 100644 --- a/consensus/src/types.rs +++ b/consensus/src/types.rs @@ -188,6 +188,7 @@ pub struct Eth1Data { #[derive(serde::Deserialize, Debug)] pub struct Bootstrap { + #[serde(deserialize_with = "header_deserialize")] pub header: Header, pub current_sync_committee: SyncCommittee, #[serde(deserialize_with = "branch_deserialize")] @@ -196,10 +197,12 @@ pub struct Bootstrap { #[derive(serde::Deserialize, Debug, Clone)] pub struct Update { + #[serde(deserialize_with = "header_deserialize")] pub attested_header: Header, pub next_sync_committee: SyncCommittee, #[serde(deserialize_with = "branch_deserialize")] pub next_sync_committee_branch: Vec, + #[serde(deserialize_with = "header_deserialize")] pub finalized_header: Header, #[serde(deserialize_with = "branch_deserialize")] pub finality_branch: Vec, @@ -210,7 +213,9 @@ pub struct Update { #[derive(serde::Deserialize, Debug)] pub struct FinalityUpdate { + #[serde(deserialize_with = "header_deserialize")] pub attested_header: Header, + #[serde(deserialize_with = "header_deserialize")] pub finalized_header: Header, #[serde(deserialize_with = "branch_deserialize")] pub finality_branch: Vec, @@ -221,6 +226,7 @@ pub struct FinalityUpdate { #[derive(serde::Deserialize, Debug)] pub struct OptimisticUpdate { + #[serde(deserialize_with = "header_deserialize")] pub attested_header: Header, pub sync_aggregate: SyncAggregate, #[serde(deserialize_with = "u64_deserialize")] @@ -453,3 +459,27 @@ where Ok(attesting_indices) } + +fn header_deserialize<'de, D>(deserializer: D) -> Result +where + D: serde::Deserializer<'de>, +{ + let header: LightClientHeader = serde::Deserialize::deserialize(deserializer)?; + + Ok(match header { + LightClientHeader::Unwrapped(header) => header, + LightClientHeader::Wrapped(header) => header.beacon, + }) +} + +#[derive(serde::Deserialize)] +#[serde(untagged)] +enum LightClientHeader { + Unwrapped(Header), + Wrapped(Beacon), +} + +#[derive(serde::Deserialize)] +struct Beacon { + beacon: Header, +}