diff --git a/zebra-chain/src/transaction/serialize.rs b/zebra-chain/src/transaction/serialize.rs index 0efbb0a3..85d374f4 100644 --- a/zebra-chain/src/transaction/serialize.rs +++ b/zebra-chain/src/transaction/serialize.rs @@ -44,24 +44,22 @@ impl ZcashSerialize for JoinSplitData

{ impl ZcashDeserialize for Option> { fn zcash_deserialize(mut reader: R) -> Result { - let num_joinsplits = reader.read_compactsize()?; - match num_joinsplits { - 0 => Ok(None), - n => { - let first = sprout::JoinSplit::zcash_deserialize(&mut reader)?; - let mut rest = Vec::with_capacity((n - 1) as usize); - for _ in 0..(n - 1) { - rest.push(sprout::JoinSplit::zcash_deserialize(&mut reader)?); - } - let pub_key = reader.read_32_bytes()?.into(); - let sig = reader.read_64_bytes()?.into(); - Ok(Some(JoinSplitData { - first, - rest, - pub_key, - sig, - })) - } + let joinsplits: Vec> = Vec::zcash_deserialize(&mut reader)?; + + if joinsplits.is_empty() { + Ok(None) + } else { + let (first, rest) = joinsplits + .split_first() + .expect("a non-empty Vec must have at least one entry"); + let pub_key = reader.read_32_bytes()?.into(); + let sig = reader.read_64_bytes()?.into(); + Ok(Some(JoinSplitData { + first: first.clone(), + rest: rest.to_vec(), + pub_key, + sig, + })) } } }