--- a/crates/evm-coder/src/abi.rs +++ b/crates/evm-coder/src/abi.rs @@ -330,6 +330,7 @@ pub trait AbiRead { /// Read item from current position, advanding decoder fn abi_read(&mut self) -> Result; + fn size() -> usize; } macro_rules! impl_abi_readable { @@ -338,6 +339,10 @@ fn abi_read(&mut self) -> Result<$ty> { self.$method() } + + fn size() -> usize { + ABI_ALIGNMENT + } } }; } @@ -376,20 +381,10 @@ } Ok(out) } -} - -fn aligned_size(size: usize) -> usize { - let need_align = (size % ABI_ALIGNMENT) != 0; - let aligned_parts = size / ABI_ALIGNMENT; - (aligned_parts * ABI_ALIGNMENT) + if need_align { ABI_ALIGNMENT } else { 0 } -} -#[test] -fn test_aligned_size() { - assert_eq!(aligned_size(20), ABI_ALIGNMENT); - assert_eq!(aligned_size(32), ABI_ALIGNMENT); - assert_eq!(aligned_size(52), 2 * ABI_ALIGNMENT); - assert_eq!(aligned_size(64), 2 * ABI_ALIGNMENT); + fn size() -> usize { + ABI_ALIGNMENT + } } macro_rules! impl_tuples { @@ -403,12 +398,16 @@ ($($ident,)+): SolidityTypeName, { fn abi_read(&mut self) -> Result<($($ident,)+)> { - let size = if <($($ident,)+)>::is_simple() { Some(0 $(+aligned_size(sp_std::mem::size_of::<$ident>()))+) } else { None }; + let size = if <($($ident,)+)>::is_simple() { Some(>::size()) } else { None }; let mut subresult = self.subresult(size)?; Ok(( $(>::abi_read(&mut subresult)?,)+ )) } + + fn size() -> usize { + 0 $(+ {let _ : $ident; ABI_ALIGNMENT})+ + } } #[allow(non_snake_case)] impl<$($ident),+> AbiWrite for &($($ident,)+)