difftreelog
refactor AbiRead
in: master
4 files changed
crates/evm-coder/procedural/src/solidity_interface.rsdiffbeforeafterboth--- 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)?
}
}
crates/evm-coder/src/abi.rsdiffbeforeafterboth342 }342 }343}343}344344345/// [`AbiReader`] implements reading of many types, but it should345/// [`AbiReader`] implements reading of many types.346/// be limited to types defined in spec347///348/// As this trait can't be made sealed,349/// instead of having `impl AbiRead for T`, we have `impl AbiRead<T> for AbiReader`350pub trait AbiRead<T> {346pub trait AbiRead {351 /// Read item from current position, advanding decoder347 /// Read item from current position, advanding decoder352 fn abi_read(&mut self) -> Result<T>;348 fn abi_read(reader: &mut AbiReader) -> Result<Self>349 where350 Self: Sized;353}351}354352355macro_rules! impl_abi_readable {353macro_rules! impl_abi_readable {363 ABI_ALIGNMENT361 ABI_ALIGNMENT364 }362 }365 }363 }366 impl AbiRead<$ty> for AbiReader<'_> {364 impl AbiRead for $ty {367 fn abi_read(&mut self) -> Result<$ty> {365 fn abi_read(reader: &mut AbiReader) -> Result<$ty> {368 self.$method()366 reader.$method()369 }367 }370 }368 }371 };369 };389 ABI_ALIGNMENT387 ABI_ALIGNMENT390 }388 }391}389}392impl AbiRead<bytes> for AbiReader<'_> {390impl AbiRead for bytes {393 fn abi_read(&mut self) -> Result<bytes> {391 fn abi_read(reader: &mut AbiReader) -> Result<bytes> {394 Ok(bytes(self.bytes()?))392 Ok(bytes(reader.bytes()?))395 }393 }396}394}397395405impl sealed::CanBePlacedInVec for H160 {}403impl sealed::CanBePlacedInVec for H160 {}406impl sealed::CanBePlacedInVec for EthCrossAccount {}404impl sealed::CanBePlacedInVec for EthCrossAccount {}407405408impl<R: sealed::CanBePlacedInVec> AbiRead<Vec<R>> for AbiReader<'_>406impl<R: AbiRead + sealed::CanBePlacedInVec> AbiRead for Vec<R> {409where410 Self: AbiRead<R>,411{412 fn abi_read(&mut self) -> Result<Vec<R>> {407 fn abi_read(reader: &mut AbiReader) -> Result<Vec<R>> {413 let mut sub = self.subresult(None)?;408 let mut sub = reader.subresult(None)?;414 let size = sub.uint32()? as usize;409 let size = sub.uint32()? as usize;415 sub.subresult_offset = sub.offset;410 sub.subresult_offset = sub.offset;416 let mut out = Vec::with_capacity(size);411 let mut out = Vec::with_capacity(size);417 for _ in 0..size {412 for _ in 0..size {418 out.push(<Self as AbiRead<R>>::abi_read(&mut sub)?);413 out.push(<R>::abi_read(&mut sub)?);419 }414 }420 Ok(out)415 Ok(out)421 }416 }435 }430 }436}431}437432438impl AbiRead<EthCrossAccount> for AbiReader<'_> {433impl AbiRead for EthCrossAccount {439 fn abi_read(&mut self) -> Result<EthCrossAccount> {434 fn abi_read(reader: &mut AbiReader) -> Result<EthCrossAccount> {440 let size = if !EthCrossAccount::is_dynamic() {435 let size = if !EthCrossAccount::is_dynamic() {441 Some(<EthCrossAccount as TypeHelper>::size())436 Some(<EthCrossAccount as TypeHelper>::size())442 } else {437 } else {443 None438 None444 };439 };445 let mut subresult = self.subresult(size)?;440 let mut subresult = reader.subresult(size)?;446 let eth = <Self as AbiRead<address>>::abi_read(&mut subresult)?;441 let eth = <address>::abi_read(&mut subresult)?;447 let sub = <Self as AbiRead<uint256>>::abi_read(&mut subresult)?;442 let sub = <uint256>::abi_read(&mut subresult)?;448443449 Ok(EthCrossAccount { eth, sub })444 Ok(EthCrossAccount { eth, sub })450 }445 }479474480 impl<$($ident),+> sealed::CanBePlacedInVec for ($($ident,)+) {}475 impl<$($ident),+> sealed::CanBePlacedInVec for ($($ident,)+) {}481476482 impl<$($ident),+> AbiRead<($($ident,)+)> for AbiReader<'_>477 impl<$($ident),+> AbiRead for ($($ident,)+)483 where478 where484 $(479 $($ident: AbiRead,)+485 Self: AbiRead<$ident>,486 )+487 ($($ident,)+): TypeHelper,480 ($($ident,)+): TypeHelper,488 {481 {489 fn abi_read(&mut self) -> Result<($($ident,)+)> {482 fn abi_read(reader: &mut AbiReader) -> Result<($($ident,)+)> {490 let size = if !<($($ident,)+)>::is_dynamic() { Some(<($($ident,)+)>::size()) } else { None };483 let size = if !<($($ident,)+)>::is_dynamic() { Some(<($($ident,)+)>::size()) } else { None };491 let mut subresult = self.subresult(size)?;484 let mut subresult = reader.subresult(size)?;492 Ok((485 Ok((493 $(<Self as AbiRead<$ident>>::abi_read(&mut subresult)?,)+486 $(<$ident>::abi_read(&mut subresult)?,)+494 ))487 ))495 }488 }496 }489 }683676684 let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap();677 let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap();685 assert_eq!(call, u32::to_be_bytes(function_identifier));678 assert_eq!(call, u32::to_be_bytes(function_identifier));686 let data = <AbiReader<'_> as AbiRead<$type>>::abi_read(&mut decoder).unwrap();679 let data = <$type>::abi_read(&mut decoder).unwrap();687 assert_eq!(data, decoded_data);680 assert_eq!(data, decoded_data);688681689 let mut writer = AbiWriter::new_call(function_identifier);682 let mut writer = AbiWriter::new_call(function_identifier);890 assert_eq!(call, u32::to_be_bytes(decoded_data.0));883 assert_eq!(call, u32::to_be_bytes(decoded_data.0));891 let address = decoder.address().unwrap();884 let address = decoder.address().unwrap();892 let data =885 let data = <Vec<(uint256, string)>>::abi_read(&mut decoder).unwrap();893 <AbiReader<'_> as AbiRead<Vec<(uint256, string)>>>::abi_read(&mut decoder).unwrap();894 assert_eq!(data, decoded_data.1);886 assert_eq!(data, decoded_data.1);895887896 let mut writer = AbiWriter::new_call(decoded_data.0);888 let mut writer = AbiWriter::new_call(decoded_data.0);crates/evm-coder/src/lib.rsdiffbeforeafterboth--- 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)?,
}))
}
}
pallets/common/src/erc.rsdiffbeforeafterboth--- 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.