difftreelog
refactor AbiRead
in: master
4 files changed
crates/evm-coder/procedural/src/solidity_interface.rsdiffbeforeafterboth403 fn expand_parse(&self) -> proc_macro2::TokenStream {403 fn expand_parse(&self) -> proc_macro2::TokenStream {404 assert!(!self.is_special());404 assert!(!self.is_special());405 let name = &self.name;405 let name = &self.name;406 let ty = &self.ty;406 quote! {407 quote! {407 #name: reader.abi_read()?408 #name: <#ty>::abi_read(reader)?408 }409 }409 }410 }410411crates/evm-coder/src/abi.rsdiffbeforeafterboth--- 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<T> for AbiReader`
-pub trait AbiRead<T> {
+/// [`AbiReader`] implements reading of many types.
+pub trait AbiRead {
/// Read item from current position, advanding decoder
- fn abi_read(&mut self) -> Result<T>;
+ fn abi_read(reader: &mut AbiReader) -> Result<Self>
+ 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<bytes> for AbiReader<'_> {
- fn abi_read(&mut self) -> Result<bytes> {
- Ok(bytes(self.bytes()?))
+impl AbiRead for bytes {
+ fn abi_read(reader: &mut AbiReader) -> Result<bytes> {
+ Ok(bytes(reader.bytes()?))
}
}
@@ -405,17 +403,14 @@
impl sealed::CanBePlacedInVec for H160 {}
impl sealed::CanBePlacedInVec for EthCrossAccount {}
-impl<R: sealed::CanBePlacedInVec> AbiRead<Vec<R>> for AbiReader<'_>
-where
- Self: AbiRead<R>,
-{
- fn abi_read(&mut self) -> Result<Vec<R>> {
- let mut sub = self.subresult(None)?;
+impl<R: AbiRead + sealed::CanBePlacedInVec> AbiRead for Vec<R> {
+ fn abi_read(reader: &mut AbiReader) -> Result<Vec<R>> {
+ 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(<Self as AbiRead<R>>::abi_read(&mut sub)?);
+ out.push(<R>::abi_read(&mut sub)?);
}
Ok(out)
}
@@ -435,16 +430,16 @@
}
}
-impl AbiRead<EthCrossAccount> for AbiReader<'_> {
- fn abi_read(&mut self) -> Result<EthCrossAccount> {
+impl AbiRead for EthCrossAccount {
+ fn abi_read(reader: &mut AbiReader) -> Result<EthCrossAccount> {
let size = if !EthCrossAccount::is_dynamic() {
Some(<EthCrossAccount as TypeHelper>::size())
} else {
None
};
- let mut subresult = self.subresult(size)?;
- let eth = <Self as AbiRead<address>>::abi_read(&mut subresult)?;
- let sub = <Self as AbiRead<uint256>>::abi_read(&mut subresult)?;
+ let mut subresult = reader.subresult(size)?;
+ let eth = <address>::abi_read(&mut subresult)?;
+ let sub = <uint256>::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((
- $(<Self as AbiRead<$ident>>::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 = <AbiReader<'_> 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 =
- <AbiReader<'_> as AbiRead<Vec<(uint256, string)>>>::abi_read(&mut decoder).unwrap();
+ let data = <Vec<(uint256, string)>>::abi_read(&mut decoder).unwrap();
assert_eq!(data, decoded_data.1);
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.