From 0b07f95d20c934a0eb4aba2f87c11ab4ea1e2de9 Mon Sep 17 00:00:00 2001 From: bernard-wagner Date: Wed, 7 Feb 2024 21:07:33 +0200 Subject: [PATCH 1/2] fix(dyn-abi): abi-encode-packed always pads arrays --- crates/dyn-abi/src/ty.rs | 44 ++++++++++++++++++------------------- crates/dyn-abi/src/value.rs | 27 ++++++++++++++++++++++- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/crates/dyn-abi/src/ty.rs b/crates/dyn-abi/src/ty.rs index 039ef6f72..93dcfb5b5 100644 --- a/crates/dyn-abi/src/ty.rs +++ b/crates/dyn-abi/src/ty.rs @@ -1184,16 +1184,16 @@ expect: {expected}", 1111111111111111111111111111111111111111,\ 2222222222222222222222222222222222222222\ ]", " - 1111111111111111111111111111111111111111 - 2222222222222222222222222222222222222222 + 0000000000000000000000001111111111111111111111111111111111111111 + 0000000000000000000000002222222222222222222222222222222222222222 "), fixed_array_of_addresses("address[2]", "[\ 1111111111111111111111111111111111111111,\ 2222222222222222222222222222222222222222\ ]", " - 1111111111111111111111111111111111111111 - 2222222222222222222222222222222222222222 + 0000000000000000000000001111111111111111111111111111111111111111 + 0000000000000000000000002222222222222222222222222222222222222222 "), two_addresses("(address,address)", "(\ @@ -1208,48 +1208,48 @@ expect: {expected}", [1111111111111111111111111111111111111111, 2222222222222222222222222222222222222222],\ [3333333333333333333333333333333333333333, 4444444444444444444444444444444444444444]\ ]", " - 1111111111111111111111111111111111111111 - 2222222222222222222222222222222222222222 - 3333333333333333333333333333333333333333 - 4444444444444444444444444444444444444444 + 0000000000000000000000001111111111111111111111111111111111111111 + 0000000000000000000000002222222222222222222222222222222222222222 + 0000000000000000000000003333333333333333333333333333333333333333 + 0000000000000000000000004444444444444444444444444444444444444444 "), dynamic_array_of_fixed_arrays_of_addresses("address[2][]", "[\ [1111111111111111111111111111111111111111, 2222222222222222222222222222222222222222],\ [3333333333333333333333333333333333333333, 4444444444444444444444444444444444444444]\ ]", " - 1111111111111111111111111111111111111111 - 2222222222222222222222222222222222222222 - 3333333333333333333333333333333333333333 - 4444444444444444444444444444444444444444 + 0000000000000000000000001111111111111111111111111111111111111111 + 0000000000000000000000002222222222222222222222222222222222222222 + 0000000000000000000000003333333333333333333333333333333333333333 + 0000000000000000000000004444444444444444444444444444444444444444 "), dynamic_array_of_dynamic_arrays("address[][]", "[\ [1111111111111111111111111111111111111111],\ [2222222222222222222222222222222222222222]\ ]", " - 1111111111111111111111111111111111111111 - 2222222222222222222222222222222222222222 + 0000000000000000000000001111111111111111111111111111111111111111 + 0000000000000000000000002222222222222222222222222222222222222222 "), dynamic_array_of_dynamic_arrays2("address[][]", "[\ [1111111111111111111111111111111111111111, 2222222222222222222222222222222222222222],\ [3333333333333333333333333333333333333333, 4444444444444444444444444444444444444444]\ ]", " - 1111111111111111111111111111111111111111 - 2222222222222222222222222222222222222222 - 3333333333333333333333333333333333333333 - 4444444444444444444444444444444444444444 + 0000000000000000000000001111111111111111111111111111111111111111 + 0000000000000000000000002222222222222222222222222222222222222222 + 0000000000000000000000003333333333333333333333333333333333333333 + 0000000000000000000000004444444444444444444444444444444444444444 "), dynamic_array_of_dynamic_arrays3("uint32[][]", "[\ [1, 2],\ [3, 4]\ ]", " - 00000001 - 00000002 - 00000003 - 00000004 + 0000000000000000000000000000000000000000000000000000000000000001 + 0000000000000000000000000000000000000000000000000000000000000002 + 0000000000000000000000000000000000000000000000000000000000000003 + 0000000000000000000000000000000000000000000000000000000000000004 "), } } diff --git a/crates/dyn-abi/src/value.rs b/crates/dyn-abi/src/value.rs index e2a2a0be5..4f1b1cc6d 100644 --- a/crates/dyn-abi/src/value.rs +++ b/crates/dyn-abi/src/value.rs @@ -688,8 +688,33 @@ impl DynSolValue { let start = 32usize.saturating_sub(byte_size); buf.extend_from_slice(&num.to_be_bytes::<32>()[start..]); } - as_fixed_seq!(inner) | Self::Array(inner) => { + Self::FixedArray(inner) | Self::Array(inner) => { for val in inner { + let mut buf_inner = Vec::new(); + val.abi_encode_packed_to(&mut buf_inner); + + // Array elements are always padded + if buf_inner.len() < 32usize { + // Calculate the number of padding elements needed + let padding_needed = 32usize.saturating_sub(buf_inner.len()); + + // Extend the vector with the padding elements + buf_inner.resize(32usize, 0); + + // Rotate the vector left by the number of padding elements added + buf_inner.rotate_right(padding_needed); + } + buf.extend_from_slice(&buf_inner); + } + }, + Self::Tuple(inner) => { + for val in inner { + val.abi_encode_packed_to(buf); + } + } + #[cfg(feature = "eip712")] + Self::CustomStruct { tuple, .. } => { + for val in tuple { val.abi_encode_packed_to(buf); } } From bff7dee15123af042fd998a42e6359fd06f16057 Mon Sep 17 00:00:00 2001 From: bernard-wagner Date: Wed, 7 Feb 2024 22:09:47 +0200 Subject: [PATCH 2/2] cargo +nightly fmt --- crates/dyn-abi/src/value.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/dyn-abi/src/value.rs b/crates/dyn-abi/src/value.rs index 4f1b1cc6d..84c79f8ca 100644 --- a/crates/dyn-abi/src/value.rs +++ b/crates/dyn-abi/src/value.rs @@ -706,7 +706,7 @@ impl DynSolValue { } buf.extend_from_slice(&buf_inner); } - }, + } Self::Tuple(inner) => { for val in inner { val.abi_encode_packed_to(buf);