--- a/crates/evm-coder/procedural/src/solidity_interface.rs +++ b/crates/evm-coder/procedural/src/solidity_interface.rs @@ -403,8 +403,9 @@ fn expand_parse(&self) -> proc_macro2::TokenStream { assert!(!self.is_special()); let name = &self.name; + let ty = &self.ty; quote! { - #name: reader.abi_read()? + #name: <#ty>::abi_read(reader)? } } --- a/crates/evm-coder/src/abi.rs +++ b/crates/evm-coder/src/abi.rs @@ -342,14 +342,12 @@ } } -/// [`AbiReader`] implements reading of many types, but it should -/// be limited to types defined in spec -/// -/// As this trait can't be made sealed, -/// instead of having `impl AbiRead for T`, we have `impl AbiRead for AbiReader` -pub trait AbiRead { +/// [`AbiReader`] implements reading of many types. +pub trait AbiRead { /// Read item from current position, advanding decoder - fn abi_read(&mut self) -> Result; + fn abi_read(reader: &mut AbiReader) -> Result + where + Self: Sized; } macro_rules! impl_abi_readable { @@ -363,9 +361,9 @@ ABI_ALIGNMENT } } - impl AbiRead<$ty> for AbiReader<'_> { - fn abi_read(&mut self) -> Result<$ty> { - self.$method() + impl AbiRead for $ty { + fn abi_read(reader: &mut AbiReader) -> Result<$ty> { + reader.$method() } } }; @@ -389,9 +387,9 @@ ABI_ALIGNMENT } } -impl AbiRead for AbiReader<'_> { - fn abi_read(&mut self) -> Result { - Ok(bytes(self.bytes()?)) +impl AbiRead for bytes { + fn abi_read(reader: &mut AbiReader) -> Result { + Ok(bytes(reader.bytes()?)) } } @@ -405,17 +403,14 @@ impl sealed::CanBePlacedInVec for H160 {} impl sealed::CanBePlacedInVec for EthCrossAccount {} -impl AbiRead> for AbiReader<'_> -where - Self: AbiRead, -{ - fn abi_read(&mut self) -> Result> { - let mut sub = self.subresult(None)?; +impl AbiRead for Vec { + fn abi_read(reader: &mut AbiReader) -> Result> { + let mut sub = reader.subresult(None)?; let size = sub.uint32()? as usize; sub.subresult_offset = sub.offset; let mut out = Vec::with_capacity(size); for _ in 0..size { - out.push(>::abi_read(&mut sub)?); + out.push(::abi_read(&mut sub)?); } Ok(out) } @@ -435,16 +430,16 @@ } } -impl AbiRead for AbiReader<'_> { - fn abi_read(&mut self) -> Result { +impl AbiRead for EthCrossAccount { + fn abi_read(reader: &mut AbiReader) -> Result { let size = if !EthCrossAccount::is_dynamic() { Some(::size()) } else { None }; - let mut subresult = self.subresult(size)?; - let eth = >::abi_read(&mut subresult)?; - let sub = >::abi_read(&mut subresult)?; + let mut subresult = reader.subresult(size)?; + let eth =
::abi_read(&mut subresult)?; + let sub = ::abi_read(&mut subresult)?; Ok(EthCrossAccount { eth, sub }) } @@ -479,18 +474,16 @@ impl<$($ident),+> sealed::CanBePlacedInVec for ($($ident,)+) {} - impl<$($ident),+> AbiRead<($($ident,)+)> for AbiReader<'_> + impl<$($ident),+> AbiRead for ($($ident,)+) where - $( - Self: AbiRead<$ident>, - )+ + $($ident: AbiRead,)+ ($($ident,)+): TypeHelper, { - fn abi_read(&mut self) -> Result<($($ident,)+)> { + fn abi_read(reader: &mut AbiReader) -> Result<($($ident,)+)> { let size = if !<($($ident,)+)>::is_dynamic() { Some(<($($ident,)+)>::size()) } else { None }; - let mut subresult = self.subresult(size)?; + let mut subresult = reader.subresult(size)?; Ok(( - $(>::abi_read(&mut subresult)?,)+ + $(<$ident>::abi_read(&mut subresult)?,)+ )) } } @@ -683,7 +676,7 @@ let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap(); assert_eq!(call, u32::to_be_bytes(function_identifier)); - let data = as AbiRead<$type>>::abi_read(&mut decoder).unwrap(); + let data = <$type>::abi_read(&mut decoder).unwrap(); assert_eq!(data, decoded_data); let mut writer = AbiWriter::new_call(function_identifier); @@ -889,8 +882,7 @@ let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap(); assert_eq!(call, u32::to_be_bytes(decoded_data.0)); let address = decoder.address().unwrap(); - let data = - as AbiRead>>::abi_read(&mut decoder).unwrap(); + let data = >::abi_read(&mut decoder).unwrap(); assert_eq!(data, decoded_data.1); let mut writer = AbiWriter::new_call(decoded_data.0); --- a/crates/evm-coder/src/lib.rs +++ b/crates/evm-coder/src/lib.rs @@ -341,7 +341,7 @@ return Ok(None); } Ok(Some(Self::SupportsInterface { - interface_id: input.abi_read()?, + interface_id: types::bytes4::abi_read(input)?, })) } } --- a/pallets/common/src/erc.rs +++ b/pallets/common/src/erc.rs @@ -35,8 +35,7 @@ use crate::{ Pallet, CollectionHandle, Config, CollectionProperties, SelfWeightOf, - eth::{convert_cross_account_to_uint256, convert_tuple_to_cross_account}, - weights::WeightInfo, + eth::convert_cross_account_to_uint256, weights::WeightInfo, }; /// Events for ethereum collection helper.