diff --git a/eth2/utils/ssz2/src/decode/impls.rs b/eth2/utils/ssz2/src/decode/impls.rs index 22ab0d940..d92730b01 100644 --- a/eth2/utils/ssz2/src/decode/impls.rs +++ b/eth2/utils/ssz2/src/decode/impls.rs @@ -43,6 +43,8 @@ impl Decodable for Vec { return Ok(vec![]); } + // The list is non-empty. + if T::is_ssz_fixed_len() { Ok(bytes .chunks(T::ssz_fixed_len()) @@ -65,19 +67,16 @@ impl Decodable for Vec { for i in 1..=num_elems { let chunk = &bytes[(i - 1) * BYTES_PER_LENGTH_OFFSET..i * BYTES_PER_LENGTH_OFFSET]; - dbg!(offset); + let slice = if i == num_elems { + &variable[offset..] + } else { + let start = offset; + offset = decode_length(chunk)? - fixed.len(); - let end = offset + decode_length(chunk)?; - let slice = &variable[offset..end]; - offset += end; + &variable[start..offset] + }; values.push(T::from_ssz_bytes(slice)?); - - if i == num_elems { - let slice = &variable[offset..]; - dbg!(slice); - values.push(T::from_ssz_bytes(slice)?) - } } Ok(values) diff --git a/eth2/utils/ssz2/src/encode/impls.rs b/eth2/utils/ssz2/src/encode/impls.rs index 0ffd07afb..05d493f80 100644 --- a/eth2/utils/ssz2/src/encode/impls.rs +++ b/eth2/utils/ssz2/src/encode/impls.rs @@ -157,6 +157,9 @@ mod tests { #[test] fn vec_of_vec_of_u8() { + let vec: Vec> = vec![]; + assert_eq!(vec.as_ssz_bytes(), vec![]); + let vec: Vec> = vec![vec![]]; assert_eq!(vec.as_ssz_bytes(), vec![4, 0, 0, 0]); diff --git a/eth2/utils/ssz2/tests/tests.rs b/eth2/utils/ssz2/tests/tests.rs index 3cf139b36..fa1500f22 100644 --- a/eth2/utils/ssz2/tests/tests.rs +++ b/eth2/utils/ssz2/tests/tests.rs @@ -16,7 +16,9 @@ fn vec_u16_round_trip() { #[test] fn vec_of_vec_u16_round_trip() { - // round_trip::>>(vec![]); + round_trip::>>(vec![]); round_trip::>>(vec![vec![]]); - // round_trip::>>(vec![vec![], vec![]]); + round_trip::>>(vec![vec![], vec![]]); + round_trip::>>(vec![vec![], vec![1, 2, 3]]); + round_trip::>>(vec![vec![1, 2, 3], vec![1, 2, 3]]); }