git.delta.rocks / unique-network / refs/commits / e6b665a657b2

difftreelog

fix PR

Trubnikov Sergey2022-12-22parent: #a22e53f.patch.diff
in: master

10 files changed

modifiedcrates/evm-coder/procedural/src/abi_derive/derive_enum.rsdiffbeforeafterboth
--- a/crates/evm-coder/procedural/src/abi_derive/derive_enum.rs
+++ b/crates/evm-coder/procedural/src/abi_derive/derive_enum.rs
@@ -47,11 +47,10 @@
 	)
 }
 
-pub fn impl_enum_abi_type(name: &syn::Ident, option_count: usize) -> proc_macro2::TokenStream {
+pub fn impl_enum_abi_type(name: &syn::Ident) -> proc_macro2::TokenStream {
 	quote! {
 		impl ::evm_coder::abi::AbiType for #name {
 			const SIGNATURE: ::evm_coder::custom_signature::SignatureUnit = <u8 as ::evm_coder::abi::AbiType>::SIGNATURE;
-			const FIELDS_COUNT: usize = #option_count;
 
 			fn is_dynamic() -> bool {
 				<u8 as ::evm_coder::abi::AbiType>::is_dynamic()
modifiedcrates/evm-coder/procedural/src/abi_derive/derive_struct.rsdiffbeforeafterboth
--- a/crates/evm-coder/procedural/src/abi_derive/derive_struct.rs
+++ b/crates/evm-coder/procedural/src/abi_derive/derive_struct.rs
@@ -100,12 +100,10 @@
 pub fn impl_struct_abi_type(
 	name: &syn::Ident,
 	tuple_type: proc_macro2::TokenStream,
-	fields_count: usize,
 ) -> proc_macro2::TokenStream {
 	quote! {
 		impl ::evm_coder::abi::AbiType for #name {
 			const SIGNATURE: ::evm_coder::custom_signature::SignatureUnit = <#tuple_type as ::evm_coder::abi::AbiType>::SIGNATURE;
-			const FIELDS_COUNT: usize = #fields_count;
 			fn is_dynamic() -> bool {
 				<#tuple_type as ::evm_coder::abi::AbiType>::is_dynamic()
 			}
modifiedcrates/evm-coder/procedural/src/abi_derive/mod.rsdiffbeforeafterboth
--- a/crates/evm-coder/procedural/src/abi_derive/mod.rs
+++ b/crates/evm-coder/procedural/src/abi_derive/mod.rs
@@ -49,7 +49,7 @@
 	let struct_from_tuple = struct_from_tuple(name, is_named_fields, field_names.clone());
 
 	let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name);
-	let abi_type = impl_struct_abi_type(name, tuple_type.clone(), params_count);
+	let abi_type = impl_struct_abi_type(name, tuple_type.clone());
 	let abi_read = impl_struct_abi_read(name, tuple_type, tuple_names, struct_from_tuple);
 	let abi_write = impl_struct_abi_write(name, is_named_fields, tuple_ref_type, tuple_data);
 	let solidity_type = impl_struct_solidity_type(name, field_types.clone(), params_count);
@@ -83,7 +83,7 @@
 	let from = impl_enum_from_u8(name, enum_options.clone());
 	let solidity_option = impl_solidity_option(name, enum_options.clone());
 	let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name);
-	let abi_type = impl_enum_abi_type(name, option_count);
+	let abi_type = impl_enum_abi_type(name);
 	let abi_read = impl_enum_abi_read(name);
 	let abi_write = impl_enum_abi_write(name);
 	let solidity_type = impl_enum_solidity_type(name);
modifiedcrates/evm-coder/src/abi/impls.rsdiffbeforeafterboth
--- a/crates/evm-coder/src/abi/impls.rs
+++ b/crates/evm-coder/src/abi/impls.rs
@@ -16,7 +16,6 @@
 
 		impl AbiType for $ty {
 			const SIGNATURE: SignatureUnit = make_signature!(new fixed(stringify!($name)));
-			const FIELDS_COUNT: usize = 1;
 
 			fn is_dynamic() -> bool {
 				$dynamic
@@ -97,7 +96,6 @@
 
 impl<T: AbiType> AbiType for &T {
 	const SIGNATURE: SignatureUnit = T::SIGNATURE;
-	const FIELDS_COUNT: usize = T::FIELDS_COUNT;
 
 	fn is_dynamic() -> bool {
 		T::is_dynamic()
@@ -127,7 +125,6 @@
 
 impl<T: AbiType> AbiType for Vec<T> {
 	const SIGNATURE: SignatureUnit = make_signature!(new nameof(T::SIGNATURE) fixed("[]"));
-	const FIELDS_COUNT: usize = 1;
 
 	fn is_dynamic() -> bool {
 		true
@@ -203,7 +200,6 @@
                 shift_left(1)
                 fixed(")")
             );
-			const FIELDS_COUNT: usize = count!($($ident)*);
 
 			fn is_dynamic() -> bool {
 				false
modifiedcrates/evm-coder/src/abi/traits.rsdiffbeforeafterboth
--- a/crates/evm-coder/src/abi/traits.rs
+++ b/crates/evm-coder/src/abi/traits.rs
@@ -10,9 +10,6 @@
 	/// Signature for Etherium ABI.
 	const SIGNATURE: SignatureUnit;
 
-	/// Count of enum variants or struct fields.
-	const FIELDS_COUNT: usize;
-
 	/// Signature as str.
 	fn as_str() -> &'static str {
 		from_utf8(&Self::SIGNATURE.data[..Self::SIGNATURE.len]).expect("bad utf-8")
modifiedcrates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth
before · crates/evm-coder/tests/abi_derive_generation.rs
1mod test_struct {2	use evm_coder_procedural::AbiCoder;3	use evm_coder::types::bytes;45	#[test]6	fn empty_struct() {7		let t = trybuild::TestCases::new();8		t.compile_fail("tests/build_failed/abi_derive_struct_generation.rs");9	}1011	#[derive(AbiCoder, PartialEq, Debug)]12	struct TypeStruct1SimpleParam {13		_a: u8,14	}1516	#[derive(AbiCoder, PartialEq, Debug)]17	struct TypeStruct1DynamicParam {18		_a: String,19	}2021	#[derive(AbiCoder, PartialEq, Debug)]22	struct TypeStruct2SimpleParam {23		_a: u8,24		_b: u32,25	}2627	#[derive(AbiCoder, PartialEq, Debug)]28	struct TypeStruct2DynamicParam {29		_a: String,30		_b: bytes,31	}3233	#[derive(AbiCoder, PartialEq, Debug)]34	struct TypeStruct2MixedParam {35		_a: u8,36		_b: bytes,37	}3839	#[derive(AbiCoder, PartialEq, Debug)]40	struct TypeStruct1DerivedSimpleParam {41		_a: TypeStruct1SimpleParam,42	}4344	#[derive(AbiCoder, PartialEq, Debug)]45	struct TypeStruct2DerivedSimpleParam {46		_a: TypeStruct1SimpleParam,47		_b: TypeStruct2SimpleParam,48	}4950	#[derive(AbiCoder, PartialEq, Debug)]51	struct TypeStruct1DerivedDynamicParam {52		_a: TypeStruct1DynamicParam,53	}5455	#[derive(AbiCoder, PartialEq, Debug)]56	struct TypeStruct2DerivedDynamicParam {57		_a: TypeStruct1DynamicParam,58		_b: TypeStruct2DynamicParam,59	}6061	/// Some docs62	/// At multi63	/// line64	#[derive(AbiCoder, PartialEq, Debug)]65	struct TypeStruct3DerivedMixedParam {66		/// Docs for A67		/// multi68		/// line69		_a: TypeStruct1SimpleParam,70		/// Docs for B71		_b: TypeStruct2DynamicParam,72		/// Docs for C73		_c: TypeStruct2MixedParam,74	}7576	#[test]77	#[cfg(feature = "stubgen")]78	fn struct_collect_type_struct3_derived_mixed_param() {79		assert_eq!(80			<TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),81			"TypeStruct3DerivedMixedParam"82		);83		similar_asserts::assert_eq!(84			<TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),85			r#"/// @dev Some docs86/// At multi87/// line88struct TypeStruct3DerivedMixedParam {89	/// @dev Docs for A90	/// multi91	/// line92	TypeStruct1SimpleParam _a;93	/// @dev Docs for B94	TypeStruct2DynamicParam _b;95	/// @dev Docs for C96	TypeStruct2MixedParam _c;97}98"#99		);100	}101102	#[test]103	#[cfg(feature = "stubgen")]104	fn struct_collect_vec() {105		assert_eq!(106			<Vec<u8> as ::evm_coder::solidity::StructCollect>::name(),107			"uint8[]"108		);109	}110111	#[test]112	fn impl_abi_type_signature() {113		assert_eq!(114			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE115				.as_str()116				.unwrap(),117			"(uint8)"118		);119		assert_eq!(120			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE121				.as_str()122				.unwrap(),123			"(string)"124		);125		assert_eq!(126			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE127				.as_str()128				.unwrap(),129			"(uint8,uint32)"130		);131		assert_eq!(132			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE133				.as_str()134				.unwrap(),135			"(string,bytes)"136		);137		assert_eq!(138			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE139				.as_str()140				.unwrap(),141			"(uint8,bytes)"142		);143		assert_eq!(144			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE145				.as_str()146				.unwrap(),147			"((uint8))"148		);149		assert_eq!(150			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE151				.as_str()152				.unwrap(),153			"((uint8),(uint8,uint32))"154		);155		assert_eq!(156			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE157				.as_str()158				.unwrap(),159			"((string))"160		);161		assert_eq!(162			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE163				.as_str()164				.unwrap(),165			"((string),(string,bytes))"166		);167		assert_eq!(168			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE169				.as_str()170				.unwrap(),171			"((uint8),(string,bytes),(uint8,bytes))"172		);173	}174175	#[test]176	fn impl_abi_type_fields_count() {177		assert_eq!(178			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::FIELDS_COUNT,179			1180		);181		assert_eq!(182			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::FIELDS_COUNT,183			1184		);185		assert_eq!(186			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::FIELDS_COUNT,187			2188		);189		assert_eq!(190			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::FIELDS_COUNT,191			2192		);193		assert_eq!(194			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::FIELDS_COUNT,195			2196		);197		assert_eq!(198			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::FIELDS_COUNT,199			1200		);201		assert_eq!(202			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::FIELDS_COUNT,203			2204		);205		assert_eq!(206			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::FIELDS_COUNT,207			1208		);209		assert_eq!(210			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::FIELDS_COUNT,211			2212		);213		assert_eq!(214			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::FIELDS_COUNT,215			3216		);217	}218219	#[test]220	fn impl_abi_type_is_dynamic() {221		assert_eq!(222			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),223			false224		);225		assert_eq!(226			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),227			true228		);229		assert_eq!(230			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),231			false232		);233		assert_eq!(234			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),235			true236		);237		assert_eq!(238			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),239			true240		);241		assert_eq!(242			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),243			false244		);245		assert_eq!(246			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),247			false248		);249		assert_eq!(250			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),251			true252		);253		assert_eq!(254			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),255			true256		);257		assert_eq!(258			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),259			true260		);261	}262263	#[test]264	fn impl_abi_type_size() {265		const ABI_ALIGNMENT: usize = 32;266		assert_eq!(267			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),268			ABI_ALIGNMENT269		);270		assert_eq!(271			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),272			ABI_ALIGNMENT273		);274		assert_eq!(275			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),276			ABI_ALIGNMENT * 2277		);278		assert_eq!(279			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),280			ABI_ALIGNMENT * 2281		);282		assert_eq!(283			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),284			ABI_ALIGNMENT * 2285		);286		assert_eq!(287			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),288			ABI_ALIGNMENT289		);290		assert_eq!(291			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),292			ABI_ALIGNMENT * 3293		);294		assert_eq!(295			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),296			ABI_ALIGNMENT297		);298		assert_eq!(299			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),300			ABI_ALIGNMENT * 3301		);302		assert_eq!(303			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),304			ABI_ALIGNMENT * 5305		);306	}307308	#[derive(AbiCoder, PartialEq, Debug)]309	struct TupleStruct1SimpleParam(u8);310311	#[derive(AbiCoder, PartialEq, Debug)]312	struct TupleStruct1DynamicParam(String);313314	#[derive(AbiCoder, PartialEq, Debug)]315	struct TupleStruct2SimpleParam(u8, u32);316317	#[derive(AbiCoder, PartialEq, Debug)]318	struct TupleStruct2DynamicParam(String, bytes);319320	#[derive(AbiCoder, PartialEq, Debug)]321	struct TupleStruct2MixedParam(u8, bytes);322323	#[derive(AbiCoder, PartialEq, Debug)]324	struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);325326	#[derive(AbiCoder, PartialEq, Debug)]327	struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);328329	#[derive(AbiCoder, PartialEq, Debug)]330	struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);331332	#[derive(AbiCoder, PartialEq, Debug)]333	struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);334335	/// Some docs336	/// At multi337	/// line338	#[derive(AbiCoder, PartialEq, Debug)]339	struct TupleStruct3DerivedMixedParam(340		/// Docs for A341		/// multi342		/// line343		TupleStruct1SimpleParam,344		TupleStruct2DynamicParam,345		/// Docs for C346		TupleStruct2MixedParam,347	);348349	#[test]350	#[cfg(feature = "stubgen")]351	fn struct_collect_tuple_struct3_derived_mixed_param() {352		assert_eq!(353			<TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),354			"TupleStruct3DerivedMixedParam"355		);356		similar_asserts::assert_eq!(357			<TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),358			r#"/// @dev Some docs359/// At multi360/// line361struct TupleStruct3DerivedMixedParam {362	/// @dev Docs for A363	/// multi364	/// line365	TupleStruct1SimpleParam field0;366	TupleStruct2DynamicParam field1;367	/// @dev Docs for C368	TupleStruct2MixedParam field2;369}370"#371		);372	}373374	#[test]375	fn impl_abi_type_signature_same_for_structs() {376		assert_eq!(377			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE378				.as_str()379				.unwrap(),380			<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE381				.as_str()382				.unwrap()383		);384		assert_eq!(385			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE386				.as_str()387				.unwrap(),388			<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE389				.as_str()390				.unwrap()391		);392		assert_eq!(393			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE394				.as_str()395				.unwrap(),396			<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE397				.as_str()398				.unwrap()399		);400		assert_eq!(401			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE402				.as_str()403				.unwrap(),404			<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE405				.as_str()406				.unwrap()407		);408		assert_eq!(409			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE410				.as_str()411				.unwrap(),412			<TupleStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE413				.as_str()414				.unwrap(),415		);416		assert_eq!(417			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE418				.as_str()419				.unwrap(),420			<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE421				.as_str()422				.unwrap(),423		);424		assert_eq!(425			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE426				.as_str()427				.unwrap(),428			<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE429				.as_str()430				.unwrap(),431		);432		assert_eq!(433			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE434				.as_str()435				.unwrap(),436			<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE437				.as_str()438				.unwrap(),439		);440		assert_eq!(441			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE442				.as_str()443				.unwrap(),444			<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE445				.as_str()446				.unwrap(),447		);448		assert_eq!(449			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE450				.as_str()451				.unwrap(),452			<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE453				.as_str()454				.unwrap(),455		);456	}457458	#[test]459	fn impl_abi_type_is_dynamic_same_for_structs() {460		assert_eq!(461			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),462			<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic()463		);464		assert_eq!(465			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),466			<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic()467		);468		assert_eq!(469			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),470			<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic()471		);472		assert_eq!(473			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),474			<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic()475		);476		assert_eq!(477			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),478			<TupleStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic()479		);480		assert_eq!(481			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),482			<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()483		);484		assert_eq!(485			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),486			<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()487		);488		assert_eq!(489			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),490			<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()491		);492		assert_eq!(493			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),494			<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()495		);496		assert_eq!(497			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),498			<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic()499		);500	}501502	#[test]503	fn impl_abi_type_size_same_for_structs() {504		assert_eq!(505			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),506			<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::size()507		);508		assert_eq!(509			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),510			<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::size()511		);512		assert_eq!(513			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),514			<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::size()515		);516		assert_eq!(517			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),518			<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::size()519		);520		assert_eq!(521			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),522			<TupleStruct2MixedParam as evm_coder::abi::AbiType>::size()523		);524		assert_eq!(525			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),526			<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size()527		);528		assert_eq!(529			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),530			<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size()531		);532		assert_eq!(533			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),534			<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size()535		);536		assert_eq!(537			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),538			<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size()539		);540		assert_eq!(541			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),542			<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size()543		);544	}545546	const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;547548	fn test_impl<Tuple, TupleStruct, TypeStruct>(549		tuple_data: Tuple,550		tuple_struct_data: TupleStruct,551		type_struct_data: TypeStruct,552	) where553		TypeStruct: evm_coder::abi::AbiWrite554			+ evm_coder::abi::AbiRead555			+ std::cmp::PartialEq556			+ std::fmt::Debug,557		TupleStruct: evm_coder::abi::AbiWrite558			+ evm_coder::abi::AbiRead559			+ std::cmp::PartialEq560			+ std::fmt::Debug,561		Tuple: evm_coder::abi::AbiWrite562			+ evm_coder::abi::AbiRead563			+ std::cmp::PartialEq564			+ std::fmt::Debug,565	{566		let encoded_type_struct = test_abi_write_impl(&type_struct_data);567		let encoded_tuple_struct = test_abi_write_impl(&tuple_struct_data);568		let encoded_tuple = test_abi_write_impl(&tuple_data);569570		similar_asserts::assert_eq!(encoded_tuple, encoded_type_struct);571		similar_asserts::assert_eq!(encoded_tuple, encoded_tuple_struct);572573		{574			let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();575			let restored_struct_data = <TypeStruct>::abi_read(&mut decoder).unwrap();576			assert_eq!(restored_struct_data, type_struct_data);577		}578		{579			let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();580			let restored_struct_data = <TupleStruct>::abi_read(&mut decoder).unwrap();581			assert_eq!(restored_struct_data, tuple_struct_data);582		}583584		{585			let (_, mut decoder) =586				evm_coder::abi::AbiReader::new_call(&encoded_type_struct).unwrap();587			let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();588			assert_eq!(restored_tuple_data, tuple_data);589		}590		{591			let (_, mut decoder) =592				evm_coder::abi::AbiReader::new_call(&encoded_tuple_struct).unwrap();593			let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();594			assert_eq!(restored_tuple_data, tuple_data);595		}596	}597598	fn test_abi_write_impl<A>(data: &A) -> Vec<u8>599	where600		A: evm_coder::abi::AbiWrite601			+ evm_coder::abi::AbiRead602			+ std::cmp::PartialEq603			+ std::fmt::Debug,604	{605		let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);606		data.abi_write(&mut writer);607		let encoded_tuple = writer.finish();608		encoded_tuple609	}610611	#[test]612	fn codec_struct_1_simple() {613		let _a = 0xff;614		test_impl::<(u8,), TupleStruct1SimpleParam, TypeStruct1SimpleParam>(615			(_a,),616			TupleStruct1SimpleParam(_a),617			TypeStruct1SimpleParam { _a },618		);619	}620621	#[test]622	fn codec_struct_1_dynamic() {623		let _a: String = "some string".into();624		test_impl::<(String,), TupleStruct1DynamicParam, TypeStruct1DynamicParam>(625			(_a.clone(),),626			TupleStruct1DynamicParam(_a.clone()),627			TypeStruct1DynamicParam { _a },628		);629	}630631	#[test]632	fn codec_struct_1_derived_simple() {633		let _a: u8 = 0xff;634		test_impl::<((u8,),), TupleStruct1DerivedSimpleParam, TypeStruct1DerivedSimpleParam>(635			((_a,),),636			TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam(_a)),637			TypeStruct1DerivedSimpleParam {638				_a: TypeStruct1SimpleParam { _a },639			},640		);641	}642643	#[test]644	fn codec_struct_1_derived_dynamic() {645		let _a: String = "some string".into();646		test_impl::<((String,),), TupleStruct1DerivedDynamicParam, TypeStruct1DerivedDynamicParam>(647			((_a.clone(),),),648			TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam(_a.clone())),649			TypeStruct1DerivedDynamicParam {650				_a: TypeStruct1DynamicParam { _a },651			},652		);653	}654655	#[test]656	fn codec_struct_2_simple() {657		let _a = 0xff;658		let _b = 0xbeefbaba;659		test_impl::<(u8, u32), TupleStruct2SimpleParam, TypeStruct2SimpleParam>(660			(_a, _b),661			TupleStruct2SimpleParam(_a, _b),662			TypeStruct2SimpleParam { _a, _b },663		);664	}665666	#[test]667	fn codec_struct_2_dynamic() {668		let _a: String = "some string".into();669		let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);670		test_impl::<(String, bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(671			(_a.clone(), _b.clone()),672			TupleStruct2DynamicParam(_a.clone(), _b.clone()),673			TypeStruct2DynamicParam { _a, _b },674		);675	}676677	#[test]678	fn codec_struct_2_mixed() {679		let _a: u8 = 0xff;680		let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);681		test_impl::<(u8, bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(682			(_a.clone(), _b.clone()),683			TupleStruct2MixedParam(_a.clone(), _b.clone()),684			TypeStruct2MixedParam { _a, _b },685		);686	}687688	#[test]689	fn codec_struct_2_derived_simple() {690		let _a = 0xff;691		let _b = 0xbeefbaba;692		test_impl::<693			((u8,), (u8, u32)),694			TupleStruct2DerivedSimpleParam,695			TypeStruct2DerivedSimpleParam,696		>(697			((_a,), (_a, _b)),698			TupleStruct2DerivedSimpleParam(699				TupleStruct1SimpleParam(_a),700				TupleStruct2SimpleParam(_a, _b),701			),702			TypeStruct2DerivedSimpleParam {703				_a: TypeStruct1SimpleParam { _a },704				_b: TypeStruct2SimpleParam { _a, _b },705			},706		);707	}708709	#[test]710	fn codec_struct_2_derived_dynamic() {711		let _a = "some string".to_string();712		let _b = bytes(vec![0x11, 0x22, 0x33]);713		test_impl::<714			((String,), (String, bytes)),715			TupleStruct2DerivedDynamicParam,716			TypeStruct2DerivedDynamicParam,717		>(718			((_a.clone(),), (_a.clone(), _b.clone())),719			TupleStruct2DerivedDynamicParam(720				TupleStruct1DynamicParam(_a.clone()),721				TupleStruct2DynamicParam(_a.clone(), _b.clone()),722			),723			TypeStruct2DerivedDynamicParam {724				_a: TypeStruct1DynamicParam { _a: _a.clone() },725				_b: TypeStruct2DynamicParam { _a, _b },726			},727		);728	}729730	#[test]731	fn codec_struct_3_derived_mixed() {732		let int = 0xff;733		let by = bytes(vec![0x11, 0x22, 0x33]);734		let string = "some string".to_string();735		test_impl::<736			((u8,), (String, bytes), (u8, bytes)),737			TupleStruct3DerivedMixedParam,738			TypeStruct3DerivedMixedParam,739		>(740			((int,), (string.clone(), by.clone()), (int, by.clone())),741			TupleStruct3DerivedMixedParam(742				TupleStruct1SimpleParam(int),743				TupleStruct2DynamicParam(string.clone(), by.clone()),744				TupleStruct2MixedParam(int, by.clone()),745			),746			TypeStruct3DerivedMixedParam {747				_a: TypeStruct1SimpleParam { _a: int },748				_b: TypeStruct2DynamicParam {749					_a: string.clone(),750					_b: by.clone(),751				},752				_c: TypeStruct2MixedParam { _a: int, _b: by },753			},754		);755	}756757	#[derive(AbiCoder, PartialEq, Debug)]758	struct TypeStruct2SimpleStruct1Simple {759		_a: TypeStruct2SimpleParam,760		_b: TypeStruct2SimpleParam,761		_c: u8,762	}763	#[derive(AbiCoder, PartialEq, Debug)]764	struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);765766	#[test]767	fn codec_struct_2_struct_simple_1_simple() {768		let _a = 0xff;769		let _b = 0xbeefbaba;770		test_impl::<771			((u8, u32), (u8, u32), u8),772			TupleStruct2SimpleStruct1Simple,773			TypeStruct2SimpleStruct1Simple,774		>(775			((_a, _b), (_a, _b), _a),776			TupleStruct2SimpleStruct1Simple(777				TupleStruct2SimpleParam(_a, _b),778				TupleStruct2SimpleParam(_a, _b),779				_a,780			),781			TypeStruct2SimpleStruct1Simple {782				_a: TypeStruct2SimpleParam { _a, _b },783				_b: TypeStruct2SimpleParam { _a, _b },784				_c: _a,785			},786		);787	}788}789790mod test_enum {791	use evm_coder::AbiCoder;792793	/// Some docs794	/// At multi795	/// line796	#[derive(AbiCoder, Debug, PartialEq, Default, Clone, Copy)]797	#[repr(u8)]798	enum Color {799		/// Docs for Red800		/// multi801		/// line802		Red,803		Green,804		/// Docs for Blue805		#[default]806		Blue,807	}808809	#[test]810	fn empty() {}811812	#[test]813	fn bad_enums() {814		let t = trybuild::TestCases::new();815		t.compile_fail("tests/build_failed/abi_derive_enum_generation.rs");816	}817818	#[test]819	fn impl_abi_type_signature_same_for_structs() {820		assert_eq!(821			<Color as evm_coder::abi::AbiType>::SIGNATURE822				.as_str()823				.unwrap(),824			<u8 as evm_coder::abi::AbiType>::SIGNATURE.as_str().unwrap()825		);826	}827828	#[test]829	fn impl_abi_type_is_dynamic_same_for_structs() {830		assert_eq!(831			<Color as evm_coder::abi::AbiType>::is_dynamic(),832			<u8 as evm_coder::abi::AbiType>::is_dynamic()833		);834	}835836	#[test]837	fn impl_abi_type_size_same_for_structs() {838		assert_eq!(839			<Color as evm_coder::abi::AbiType>::size(),840			<u8 as evm_coder::abi::AbiType>::size()841		);842	}843844	#[test]845	fn test_coder() {846		const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;847848		let encoded_enum = {849			let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);850			<Color as evm_coder::abi::AbiWrite>::abi_write(&Color::Green, &mut writer);851			writer.finish()852		};853854		let encoded_u8 = {855			let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);856			<u8 as evm_coder::abi::AbiWrite>::abi_write(&(Color::Green as u8), &mut writer);857			writer.finish()858		};859860		similar_asserts::assert_eq!(encoded_enum, encoded_u8);861862		{863			let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_enum).unwrap();864			let restored_enum_data =865				<Color as evm_coder::abi::AbiRead>::abi_read(&mut decoder).unwrap();866			assert_eq!(restored_enum_data, Color::Green);867		}868	}869870	#[test]871	#[cfg(feature = "stubgen")]872	fn struct_collect_enum() {873		assert_eq!(874			<Color as ::evm_coder::solidity::StructCollect>::name(),875			"Color"876		);877		similar_asserts::assert_eq!(878			<Color as ::evm_coder::solidity::StructCollect>::declaration(),879			r#"/// @dev Some docs880/// At multi881/// line882enum Color {883	/// @dev Docs for Red884	/// multi885	/// line886	Red,887	Green,888	/// @dev Docs for Blue889	Blue890}891"#892		);893	}894}
after · crates/evm-coder/tests/abi_derive_generation.rs
1mod test_struct {2	use evm_coder_procedural::AbiCoder;3	use evm_coder::types::bytes;45	#[test]6	fn empty_struct() {7		let t = trybuild::TestCases::new();8		t.compile_fail("tests/build_failed/abi_derive_struct_generation.rs");9	}1011	#[derive(AbiCoder, PartialEq, Debug)]12	struct TypeStruct1SimpleParam {13		_a: u8,14	}1516	#[derive(AbiCoder, PartialEq, Debug)]17	struct TypeStruct1DynamicParam {18		_a: String,19	}2021	#[derive(AbiCoder, PartialEq, Debug)]22	struct TypeStruct2SimpleParam {23		_a: u8,24		_b: u32,25	}2627	#[derive(AbiCoder, PartialEq, Debug)]28	struct TypeStruct2DynamicParam {29		_a: String,30		_b: bytes,31	}3233	#[derive(AbiCoder, PartialEq, Debug)]34	struct TypeStruct2MixedParam {35		_a: u8,36		_b: bytes,37	}3839	#[derive(AbiCoder, PartialEq, Debug)]40	struct TypeStruct1DerivedSimpleParam {41		_a: TypeStruct1SimpleParam,42	}4344	#[derive(AbiCoder, PartialEq, Debug)]45	struct TypeStruct2DerivedSimpleParam {46		_a: TypeStruct1SimpleParam,47		_b: TypeStruct2SimpleParam,48	}4950	#[derive(AbiCoder, PartialEq, Debug)]51	struct TypeStruct1DerivedDynamicParam {52		_a: TypeStruct1DynamicParam,53	}5455	#[derive(AbiCoder, PartialEq, Debug)]56	struct TypeStruct2DerivedDynamicParam {57		_a: TypeStruct1DynamicParam,58		_b: TypeStruct2DynamicParam,59	}6061	/// Some docs62	/// At multi63	/// line64	#[derive(AbiCoder, PartialEq, Debug)]65	struct TypeStruct3DerivedMixedParam {66		/// Docs for A67		/// multi68		/// line69		_a: TypeStruct1SimpleParam,70		/// Docs for B71		_b: TypeStruct2DynamicParam,72		/// Docs for C73		_c: TypeStruct2MixedParam,74	}7576	#[test]77	#[cfg(feature = "stubgen")]78	fn struct_collect_type_struct3_derived_mixed_param() {79		assert_eq!(80			<TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),81			"TypeStruct3DerivedMixedParam"82		);83		similar_asserts::assert_eq!(84			<TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),85			r#"/// @dev Some docs86/// At multi87/// line88struct TypeStruct3DerivedMixedParam {89	/// @dev Docs for A90	/// multi91	/// line92	TypeStruct1SimpleParam _a;93	/// @dev Docs for B94	TypeStruct2DynamicParam _b;95	/// @dev Docs for C96	TypeStruct2MixedParam _c;97}98"#99		);100	}101102	#[test]103	#[cfg(feature = "stubgen")]104	fn struct_collect_vec() {105		assert_eq!(106			<Vec<u8> as ::evm_coder::solidity::StructCollect>::name(),107			"uint8[]"108		);109	}110111	#[test]112	fn impl_abi_type_signature() {113		assert_eq!(114			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE115				.as_str()116				.unwrap(),117			"(uint8)"118		);119		assert_eq!(120			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE121				.as_str()122				.unwrap(),123			"(string)"124		);125		assert_eq!(126			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE127				.as_str()128				.unwrap(),129			"(uint8,uint32)"130		);131		assert_eq!(132			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE133				.as_str()134				.unwrap(),135			"(string,bytes)"136		);137		assert_eq!(138			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE139				.as_str()140				.unwrap(),141			"(uint8,bytes)"142		);143		assert_eq!(144			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE145				.as_str()146				.unwrap(),147			"((uint8))"148		);149		assert_eq!(150			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE151				.as_str()152				.unwrap(),153			"((uint8),(uint8,uint32))"154		);155		assert_eq!(156			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE157				.as_str()158				.unwrap(),159			"((string))"160		);161		assert_eq!(162			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE163				.as_str()164				.unwrap(),165			"((string),(string,bytes))"166		);167		assert_eq!(168			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE169				.as_str()170				.unwrap(),171			"((uint8),(string,bytes),(uint8,bytes))"172		);173	}174175	#[test]176	fn impl_abi_type_is_dynamic() {177		assert_eq!(178			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),179			false180		);181		assert_eq!(182			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),183			true184		);185		assert_eq!(186			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),187			false188		);189		assert_eq!(190			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),191			true192		);193		assert_eq!(194			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),195			true196		);197		assert_eq!(198			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),199			false200		);201		assert_eq!(202			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),203			false204		);205		assert_eq!(206			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),207			true208		);209		assert_eq!(210			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),211			true212		);213		assert_eq!(214			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),215			true216		);217	}218219	#[test]220	fn impl_abi_type_size() {221		const ABI_ALIGNMENT: usize = 32;222		assert_eq!(223			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),224			ABI_ALIGNMENT225		);226		assert_eq!(227			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),228			ABI_ALIGNMENT229		);230		assert_eq!(231			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),232			ABI_ALIGNMENT * 2233		);234		assert_eq!(235			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),236			ABI_ALIGNMENT * 2237		);238		assert_eq!(239			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),240			ABI_ALIGNMENT * 2241		);242		assert_eq!(243			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),244			ABI_ALIGNMENT245		);246		assert_eq!(247			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),248			ABI_ALIGNMENT * 3249		);250		assert_eq!(251			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),252			ABI_ALIGNMENT253		);254		assert_eq!(255			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),256			ABI_ALIGNMENT * 3257		);258		assert_eq!(259			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),260			ABI_ALIGNMENT * 5261		);262	}263264	#[derive(AbiCoder, PartialEq, Debug)]265	struct TupleStruct1SimpleParam(u8);266267	#[derive(AbiCoder, PartialEq, Debug)]268	struct TupleStruct1DynamicParam(String);269270	#[derive(AbiCoder, PartialEq, Debug)]271	struct TupleStruct2SimpleParam(u8, u32);272273	#[derive(AbiCoder, PartialEq, Debug)]274	struct TupleStruct2DynamicParam(String, bytes);275276	#[derive(AbiCoder, PartialEq, Debug)]277	struct TupleStruct2MixedParam(u8, bytes);278279	#[derive(AbiCoder, PartialEq, Debug)]280	struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);281282	#[derive(AbiCoder, PartialEq, Debug)]283	struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);284285	#[derive(AbiCoder, PartialEq, Debug)]286	struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);287288	#[derive(AbiCoder, PartialEq, Debug)]289	struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);290291	/// Some docs292	/// At multi293	/// line294	#[derive(AbiCoder, PartialEq, Debug)]295	struct TupleStruct3DerivedMixedParam(296		/// Docs for A297		/// multi298		/// line299		TupleStruct1SimpleParam,300		TupleStruct2DynamicParam,301		/// Docs for C302		TupleStruct2MixedParam,303	);304305	#[test]306	#[cfg(feature = "stubgen")]307	fn struct_collect_tuple_struct3_derived_mixed_param() {308		assert_eq!(309			<TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),310			"TupleStruct3DerivedMixedParam"311		);312		similar_asserts::assert_eq!(313			<TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),314			r#"/// @dev Some docs315/// At multi316/// line317struct TupleStruct3DerivedMixedParam {318	/// @dev Docs for A319	/// multi320	/// line321	TupleStruct1SimpleParam field0;322	TupleStruct2DynamicParam field1;323	/// @dev Docs for C324	TupleStruct2MixedParam field2;325}326"#327		);328	}329330	#[test]331	fn impl_abi_type_signature_same_for_structs() {332		assert_eq!(333			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE334				.as_str()335				.unwrap(),336			<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE337				.as_str()338				.unwrap()339		);340		assert_eq!(341			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE342				.as_str()343				.unwrap(),344			<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE345				.as_str()346				.unwrap()347		);348		assert_eq!(349			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE350				.as_str()351				.unwrap(),352			<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE353				.as_str()354				.unwrap()355		);356		assert_eq!(357			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE358				.as_str()359				.unwrap(),360			<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE361				.as_str()362				.unwrap()363		);364		assert_eq!(365			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE366				.as_str()367				.unwrap(),368			<TupleStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE369				.as_str()370				.unwrap(),371		);372		assert_eq!(373			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE374				.as_str()375				.unwrap(),376			<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE377				.as_str()378				.unwrap(),379		);380		assert_eq!(381			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE382				.as_str()383				.unwrap(),384			<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE385				.as_str()386				.unwrap(),387		);388		assert_eq!(389			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE390				.as_str()391				.unwrap(),392			<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE393				.as_str()394				.unwrap(),395		);396		assert_eq!(397			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE398				.as_str()399				.unwrap(),400			<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE401				.as_str()402				.unwrap(),403		);404		assert_eq!(405			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE406				.as_str()407				.unwrap(),408			<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE409				.as_str()410				.unwrap(),411		);412	}413414	#[test]415	fn impl_abi_type_is_dynamic_same_for_structs() {416		assert_eq!(417			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),418			<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic()419		);420		assert_eq!(421			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),422			<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic()423		);424		assert_eq!(425			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),426			<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic()427		);428		assert_eq!(429			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),430			<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic()431		);432		assert_eq!(433			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),434			<TupleStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic()435		);436		assert_eq!(437			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),438			<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()439		);440		assert_eq!(441			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),442			<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()443		);444		assert_eq!(445			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),446			<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()447		);448		assert_eq!(449			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),450			<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()451		);452		assert_eq!(453			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),454			<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic()455		);456	}457458	#[test]459	fn impl_abi_type_size_same_for_structs() {460		assert_eq!(461			<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),462			<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::size()463		);464		assert_eq!(465			<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),466			<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::size()467		);468		assert_eq!(469			<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),470			<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::size()471		);472		assert_eq!(473			<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),474			<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::size()475		);476		assert_eq!(477			<TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),478			<TupleStruct2MixedParam as evm_coder::abi::AbiType>::size()479		);480		assert_eq!(481			<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),482			<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size()483		);484		assert_eq!(485			<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),486			<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size()487		);488		assert_eq!(489			<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),490			<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size()491		);492		assert_eq!(493			<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),494			<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size()495		);496		assert_eq!(497			<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),498			<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size()499		);500	}501502	const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;503504	fn test_impl<Tuple, TupleStruct, TypeStruct>(505		tuple_data: Tuple,506		tuple_struct_data: TupleStruct,507		type_struct_data: TypeStruct,508	) where509		TypeStruct: evm_coder::abi::AbiWrite510			+ evm_coder::abi::AbiRead511			+ std::cmp::PartialEq512			+ std::fmt::Debug,513		TupleStruct: evm_coder::abi::AbiWrite514			+ evm_coder::abi::AbiRead515			+ std::cmp::PartialEq516			+ std::fmt::Debug,517		Tuple: evm_coder::abi::AbiWrite518			+ evm_coder::abi::AbiRead519			+ std::cmp::PartialEq520			+ std::fmt::Debug,521	{522		let encoded_type_struct = test_abi_write_impl(&type_struct_data);523		let encoded_tuple_struct = test_abi_write_impl(&tuple_struct_data);524		let encoded_tuple = test_abi_write_impl(&tuple_data);525526		similar_asserts::assert_eq!(encoded_tuple, encoded_type_struct);527		similar_asserts::assert_eq!(encoded_tuple, encoded_tuple_struct);528529		{530			let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();531			let restored_struct_data = <TypeStruct>::abi_read(&mut decoder).unwrap();532			assert_eq!(restored_struct_data, type_struct_data);533		}534		{535			let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();536			let restored_struct_data = <TupleStruct>::abi_read(&mut decoder).unwrap();537			assert_eq!(restored_struct_data, tuple_struct_data);538		}539540		{541			let (_, mut decoder) =542				evm_coder::abi::AbiReader::new_call(&encoded_type_struct).unwrap();543			let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();544			assert_eq!(restored_tuple_data, tuple_data);545		}546		{547			let (_, mut decoder) =548				evm_coder::abi::AbiReader::new_call(&encoded_tuple_struct).unwrap();549			let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();550			assert_eq!(restored_tuple_data, tuple_data);551		}552	}553554	fn test_abi_write_impl<A>(data: &A) -> Vec<u8>555	where556		A: evm_coder::abi::AbiWrite557			+ evm_coder::abi::AbiRead558			+ std::cmp::PartialEq559			+ std::fmt::Debug,560	{561		let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);562		data.abi_write(&mut writer);563		let encoded_tuple = writer.finish();564		encoded_tuple565	}566567	#[test]568	fn codec_struct_1_simple() {569		let _a = 0xff;570		test_impl::<(u8,), TupleStruct1SimpleParam, TypeStruct1SimpleParam>(571			(_a,),572			TupleStruct1SimpleParam(_a),573			TypeStruct1SimpleParam { _a },574		);575	}576577	#[test]578	fn codec_struct_1_dynamic() {579		let _a: String = "some string".into();580		test_impl::<(String,), TupleStruct1DynamicParam, TypeStruct1DynamicParam>(581			(_a.clone(),),582			TupleStruct1DynamicParam(_a.clone()),583			TypeStruct1DynamicParam { _a },584		);585	}586587	#[test]588	fn codec_struct_1_derived_simple() {589		let _a: u8 = 0xff;590		test_impl::<((u8,),), TupleStruct1DerivedSimpleParam, TypeStruct1DerivedSimpleParam>(591			((_a,),),592			TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam(_a)),593			TypeStruct1DerivedSimpleParam {594				_a: TypeStruct1SimpleParam { _a },595			},596		);597	}598599	#[test]600	fn codec_struct_1_derived_dynamic() {601		let _a: String = "some string".into();602		test_impl::<((String,),), TupleStruct1DerivedDynamicParam, TypeStruct1DerivedDynamicParam>(603			((_a.clone(),),),604			TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam(_a.clone())),605			TypeStruct1DerivedDynamicParam {606				_a: TypeStruct1DynamicParam { _a },607			},608		);609	}610611	#[test]612	fn codec_struct_2_simple() {613		let _a = 0xff;614		let _b = 0xbeefbaba;615		test_impl::<(u8, u32), TupleStruct2SimpleParam, TypeStruct2SimpleParam>(616			(_a, _b),617			TupleStruct2SimpleParam(_a, _b),618			TypeStruct2SimpleParam { _a, _b },619		);620	}621622	#[test]623	fn codec_struct_2_dynamic() {624		let _a: String = "some string".into();625		let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);626		test_impl::<(String, bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(627			(_a.clone(), _b.clone()),628			TupleStruct2DynamicParam(_a.clone(), _b.clone()),629			TypeStruct2DynamicParam { _a, _b },630		);631	}632633	#[test]634	fn codec_struct_2_mixed() {635		let _a: u8 = 0xff;636		let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);637		test_impl::<(u8, bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(638			(_a.clone(), _b.clone()),639			TupleStruct2MixedParam(_a.clone(), _b.clone()),640			TypeStruct2MixedParam { _a, _b },641		);642	}643644	#[test]645	fn codec_struct_2_derived_simple() {646		let _a = 0xff;647		let _b = 0xbeefbaba;648		test_impl::<649			((u8,), (u8, u32)),650			TupleStruct2DerivedSimpleParam,651			TypeStruct2DerivedSimpleParam,652		>(653			((_a,), (_a, _b)),654			TupleStruct2DerivedSimpleParam(655				TupleStruct1SimpleParam(_a),656				TupleStruct2SimpleParam(_a, _b),657			),658			TypeStruct2DerivedSimpleParam {659				_a: TypeStruct1SimpleParam { _a },660				_b: TypeStruct2SimpleParam { _a, _b },661			},662		);663	}664665	#[test]666	fn codec_struct_2_derived_dynamic() {667		let _a = "some string".to_string();668		let _b = bytes(vec![0x11, 0x22, 0x33]);669		test_impl::<670			((String,), (String, bytes)),671			TupleStruct2DerivedDynamicParam,672			TypeStruct2DerivedDynamicParam,673		>(674			((_a.clone(),), (_a.clone(), _b.clone())),675			TupleStruct2DerivedDynamicParam(676				TupleStruct1DynamicParam(_a.clone()),677				TupleStruct2DynamicParam(_a.clone(), _b.clone()),678			),679			TypeStruct2DerivedDynamicParam {680				_a: TypeStruct1DynamicParam { _a: _a.clone() },681				_b: TypeStruct2DynamicParam { _a, _b },682			},683		);684	}685686	#[test]687	fn codec_struct_3_derived_mixed() {688		let int = 0xff;689		let by = bytes(vec![0x11, 0x22, 0x33]);690		let string = "some string".to_string();691		test_impl::<692			((u8,), (String, bytes), (u8, bytes)),693			TupleStruct3DerivedMixedParam,694			TypeStruct3DerivedMixedParam,695		>(696			((int,), (string.clone(), by.clone()), (int, by.clone())),697			TupleStruct3DerivedMixedParam(698				TupleStruct1SimpleParam(int),699				TupleStruct2DynamicParam(string.clone(), by.clone()),700				TupleStruct2MixedParam(int, by.clone()),701			),702			TypeStruct3DerivedMixedParam {703				_a: TypeStruct1SimpleParam { _a: int },704				_b: TypeStruct2DynamicParam {705					_a: string.clone(),706					_b: by.clone(),707				},708				_c: TypeStruct2MixedParam { _a: int, _b: by },709			},710		);711	}712713	#[derive(AbiCoder, PartialEq, Debug)]714	struct TypeStruct2SimpleStruct1Simple {715		_a: TypeStruct2SimpleParam,716		_b: TypeStruct2SimpleParam,717		_c: u8,718	}719	#[derive(AbiCoder, PartialEq, Debug)]720	struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);721722	#[test]723	fn codec_struct_2_struct_simple_1_simple() {724		let _a = 0xff;725		let _b = 0xbeefbaba;726		test_impl::<727			((u8, u32), (u8, u32), u8),728			TupleStruct2SimpleStruct1Simple,729			TypeStruct2SimpleStruct1Simple,730		>(731			((_a, _b), (_a, _b), _a),732			TupleStruct2SimpleStruct1Simple(733				TupleStruct2SimpleParam(_a, _b),734				TupleStruct2SimpleParam(_a, _b),735				_a,736			),737			TypeStruct2SimpleStruct1Simple {738				_a: TypeStruct2SimpleParam { _a, _b },739				_b: TypeStruct2SimpleParam { _a, _b },740				_c: _a,741			},742		);743	}744}745746mod test_enum {747	use evm_coder::AbiCoder;748749	/// Some docs750	/// At multi751	/// line752	#[derive(AbiCoder, Debug, PartialEq, Default, Clone, Copy)]753	#[repr(u8)]754	enum Color {755		/// Docs for Red756		/// multi757		/// line758		Red,759		Green,760		/// Docs for Blue761		#[default]762		Blue,763	}764765	#[test]766	fn empty() {}767768	#[test]769	fn bad_enums() {770		let t = trybuild::TestCases::new();771		t.compile_fail("tests/build_failed/abi_derive_enum_generation.rs");772	}773774	#[test]775	fn impl_abi_type_signature_same_for_structs() {776		assert_eq!(777			<Color as evm_coder::abi::AbiType>::SIGNATURE778				.as_str()779				.unwrap(),780			<u8 as evm_coder::abi::AbiType>::SIGNATURE.as_str().unwrap()781		);782	}783784	#[test]785	fn impl_abi_type_is_dynamic_same_for_structs() {786		assert_eq!(787			<Color as evm_coder::abi::AbiType>::is_dynamic(),788			<u8 as evm_coder::abi::AbiType>::is_dynamic()789		);790	}791792	#[test]793	fn impl_abi_type_size_same_for_structs() {794		assert_eq!(795			<Color as evm_coder::abi::AbiType>::size(),796			<u8 as evm_coder::abi::AbiType>::size()797		);798	}799800	#[test]801	fn test_coder() {802		const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;803804		let encoded_enum = {805			let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);806			<Color as evm_coder::abi::AbiWrite>::abi_write(&Color::Green, &mut writer);807			writer.finish()808		};809810		let encoded_u8 = {811			let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);812			<u8 as evm_coder::abi::AbiWrite>::abi_write(&(Color::Green as u8), &mut writer);813			writer.finish()814		};815816		similar_asserts::assert_eq!(encoded_enum, encoded_u8);817818		{819			let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_enum).unwrap();820			let restored_enum_data =821				<Color as evm_coder::abi::AbiRead>::abi_read(&mut decoder).unwrap();822			assert_eq!(restored_enum_data, Color::Green);823		}824	}825826	#[test]827	#[cfg(feature = "stubgen")]828	fn struct_collect_enum() {829		assert_eq!(830			<Color as ::evm_coder::solidity::StructCollect>::name(),831			"Color"832		);833		similar_asserts::assert_eq!(834			<Color as ::evm_coder::solidity::StructCollect>::declaration(),835			r#"/// @dev Some docs836/// At multi837/// line838enum Color {839	/// @dev Docs for Red840	/// multi841	/// line842	Red,843	Green,844	/// @dev Docs for Blue845	Blue846}847"#848		);849	}850}
modifiedpallets/common/src/erc.rsdiffbeforeafterboth
--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -347,6 +347,10 @@
 	) -> Result<void> {
 		self.consume_store_reads_and_writes(1, 1)?;
 
+		if !limit.has_value() {
+			return Err(Error::Revert("user can't disable limits".into()));
+		}
+
 		let caller = T::CrossAccountId::from_eth(caller);
 		<Pallet<T>>::update_limits(&caller, self, limit.try_into()?).map_err(dispatch_to_evm::<T>)
 	}
modifiedpallets/common/src/eth.rsdiffbeforeafterboth
--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -264,16 +264,17 @@
 			value: value.into(),
 		}
 	}
+
+	/// Whether the field contains a value.
+	pub fn has_value(&self) -> bool {
+		self.value.status
+	}
 }
 
 impl TryInto<up_data_structs::CollectionLimits> for CollectionLimit {
 	type Error = evm_coder::execution::Error;
 
 	fn try_into(self) -> Result<up_data_structs::CollectionLimits, Self::Error> {
-		if !self.value.status {
-			return Err(Self::Error::Revert("user can't disable limits".into()));
-		}
-
 		let value = self.value.value.try_into().map_err(|error| {
 			Self::Error::Revert(format!(
 				"can't convert value to u32 \"{}\" because: \"{error}\"",
@@ -433,17 +434,6 @@
 		let mut perms = Vec::new();
 
 		for TokenPropertyPermission { key, permissions } in permissions {
-			if permissions.len() > <TokenPermissionField as evm_coder::abi::AbiType>::FIELDS_COUNT {
-				return Err(alloc::format!(
-					"Actual number of fields {} for {}, which exceeds the maximum value of {}",
-					permissions.len(),
-					stringify!(EthTokenPermissions),
-					<TokenPermissionField as evm_coder::abi::AbiType>::FIELDS_COUNT
-				)
-				.as_str()
-				.into());
-			}
-
 			let token_permission = PropertyPermission::from_vec(permissions);
 
 			perms.push(up_data_structs::PropertyKeyPermission {
modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -38,6 +38,7 @@
 use pallet_common::{
 	CollectionHandle, CollectionPropertyPermissions, CommonCollectionOperations,
 	erc::{CommonEvmHandler, PrecompileResult, CollectionCall, static_property::key},
+	eth,
 };
 use pallet_evm::{account::CrossAccountId, PrecompileHandle};
 use pallet_evm_coder_substrate::call;
@@ -93,25 +94,21 @@
 	fn set_token_property_permissions(
 		&mut self,
 		caller: caller,
-		permissions: Vec<pallet_common::eth::TokenPropertyPermission>,
+		permissions: Vec<eth::TokenPropertyPermission>,
 	) -> Result<()> {
 		let caller = T::CrossAccountId::from_eth(caller);
-		let perms = pallet_common::eth::TokenPropertyPermission::into_property_key_permissions(
-			permissions,
-		)?;
+		let perms = eth::TokenPropertyPermission::into_property_key_permissions(permissions)?;
 
 		<Pallet<T>>::set_token_property_permissions(self, &caller, perms)
 			.map_err(dispatch_to_evm::<T>)
 	}
 
 	/// @notice Get permissions for token properties.
-	fn token_property_permissions(
-		&self,
-	) -> Result<Vec<pallet_common::eth::TokenPropertyPermission>> {
+	fn token_property_permissions(&self) -> Result<Vec<eth::TokenPropertyPermission>> {
 		let perms = <Pallet<T>>::token_property_permission(self.id);
 		Ok(perms
 			.into_iter()
-			.map(pallet_common::eth::TokenPropertyPermission::from)
+			.map(eth::TokenPropertyPermission::from)
 			.collect())
 	}
 
@@ -159,7 +156,7 @@
 		&mut self,
 		caller: caller,
 		token_id: uint256,
-		properties: Vec<pallet_common::eth::Property>,
+		properties: Vec<eth::Property>,
 	) -> Result<()> {
 		let caller = T::CrossAccountId::from_eth(caller);
 		let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
@@ -170,7 +167,7 @@
 
 		let properties = properties
 			.into_iter()
-			.map(pallet_common::eth::Property::try_into)
+			.map(eth::Property::try_into)
 			.collect::<Result<Vec<_>>>()?;
 
 		<Pallet<T>>::set_token_properties(
@@ -753,9 +750,9 @@
 	/// Returns the owner (in cross format) of the token.
 	///
 	/// @param tokenId Id for the token.
-	fn cross_owner_of(&self, token_id: uint256) -> Result<pallet_common::eth::CrossAddress> {
+	fn cross_owner_of(&self, token_id: uint256) -> Result<eth::CrossAddress> {
 		Self::token_owner(&self, token_id.try_into()?)
-			.map(|o| pallet_common::eth::CrossAddress::from_sub_cross_account::<T>(&o))
+			.map(|o| eth::CrossAddress::from_sub_cross_account::<T>(&o))
 			.ok_or(Error::Revert("key too large".into()))
 	}
 
@@ -764,11 +761,7 @@
 	/// @param tokenId Id for the token.
 	/// @param keys Properties keys. Empty keys for all propertyes.
 	/// @return Vector of properties key/value pairs.
-	fn properties(
-		&self,
-		token_id: uint256,
-		keys: Vec<string>,
-	) -> Result<Vec<pallet_common::eth::Property>> {
+	fn properties(&self, token_id: uint256, keys: Vec<string>) -> Result<Vec<eth::Property>> {
 		let keys = keys
 			.into_iter()
 			.map(|key| {
@@ -784,7 +777,7 @@
 			if keys.is_empty() { None } else { Some(keys) },
 		)
 		.into_iter()
-		.map(pallet_common::eth::Property::try_from)
+		.map(eth::Property::try_from)
 		.collect::<Result<Vec<_>>>()
 	}
 
@@ -798,7 +791,7 @@
 	fn approve_cross(
 		&mut self,
 		caller: caller,
-		approved: pallet_common::eth::CrossAddress,
+		approved: eth::CrossAddress,
 		token_id: uint256,
 	) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -837,7 +830,7 @@
 	fn transfer_cross(
 		&mut self,
 		caller: caller,
-		to: pallet_common::eth::CrossAddress,
+		to: eth::CrossAddress,
 		token_id: uint256,
 	) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -861,8 +854,8 @@
 	fn transfer_from_cross(
 		&mut self,
 		caller: caller,
-		from: pallet_common::eth::CrossAddress,
-		to: pallet_common::eth::CrossAddress,
+		from: eth::CrossAddress,
+		to: eth::CrossAddress,
 		token_id: uint256,
 	) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -908,7 +901,7 @@
 	fn burn_from_cross(
 		&mut self,
 		caller: caller,
-		from: pallet_common::eth::CrossAddress,
+		from: eth::CrossAddress,
 		token_id: uint256,
 	) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -1030,8 +1023,8 @@
 	fn mint_cross(
 		&mut self,
 		caller: caller,
-		to: pallet_common::eth::CrossAddress,
-		properties: Vec<pallet_common::eth::Property>,
+		to: eth::CrossAddress,
+		properties: Vec<eth::Property>,
 	) -> Result<uint256> {
 		let token_id = <TokensMinted<T>>::get(self.id)
 			.checked_add(1)
@@ -1041,7 +1034,7 @@
 
 		let properties = properties
 			.into_iter()
-			.map(pallet_common::eth::Property::try_into)
+			.map(eth::Property::try_into)
 			.collect::<Result<Vec<_>>>()?
 			.try_into()
 			.map_err(|_| Error::Revert(alloc::format!("too many properties")))?;
modifiedpallets/refungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -32,8 +32,9 @@
 use frame_support::{BoundedBTreeMap, BoundedVec};
 use pallet_common::{
 	CollectionHandle, CollectionPropertyPermissions, CommonCollectionOperations,
+	Error as CommonError,
 	erc::{CommonEvmHandler, CollectionCall, static_property::key},
-	Error as CommonError,
+	eth,
 };
 use pallet_evm::{account::CrossAccountId, PrecompileHandle};
 use pallet_evm_coder_substrate::{call, dispatch_to_evm};
@@ -96,25 +97,21 @@
 	fn set_token_property_permissions(
 		&mut self,
 		caller: caller,
-		permissions: Vec<pallet_common::eth::TokenPropertyPermission>,
+		permissions: Vec<eth::TokenPropertyPermission>,
 	) -> Result<()> {
 		let caller = T::CrossAccountId::from_eth(caller);
-		let perms = pallet_common::eth::TokenPropertyPermission::into_property_key_permissions(
-			permissions,
-		)?;
+		let perms = eth::TokenPropertyPermission::into_property_key_permissions(permissions)?;
 
 		<Pallet<T>>::set_token_property_permissions(self, &caller, perms)
 			.map_err(dispatch_to_evm::<T>)
 	}
 
 	/// @notice Get permissions for token properties.
-	fn token_property_permissions(
-		&self,
-	) -> Result<Vec<pallet_common::eth::TokenPropertyPermission>> {
+	fn token_property_permissions(&self) -> Result<Vec<eth::TokenPropertyPermission>> {
 		let perms = <Pallet<T>>::token_property_permission(self.id);
 		Ok(perms
 			.into_iter()
-			.map(pallet_common::eth::TokenPropertyPermission::from)
+			.map(eth::TokenPropertyPermission::from)
 			.collect())
 	}
 
@@ -162,7 +159,7 @@
 		&mut self,
 		caller: caller,
 		token_id: uint256,
-		properties: Vec<pallet_common::eth::Property>,
+		properties: Vec<eth::Property>,
 	) -> Result<()> {
 		let caller = T::CrossAccountId::from_eth(caller);
 		let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
@@ -173,7 +170,7 @@
 
 		let properties = properties
 			.into_iter()
-			.map(pallet_common::eth::Property::try_into)
+			.map(eth::Property::try_into)
 			.collect::<Result<Vec<_>>>()?;
 
 		<Pallet<T>>::set_token_properties(
@@ -788,9 +785,9 @@
 	/// Returns the owner (in cross format) of the token.
 	///
 	/// @param tokenId Id for the token.
-	fn cross_owner_of(&self, token_id: uint256) -> Result<pallet_common::eth::CrossAddress> {
+	fn cross_owner_of(&self, token_id: uint256) -> Result<eth::CrossAddress> {
 		Self::token_owner(&self, token_id.try_into()?)
-			.map(|o| pallet_common::eth::CrossAddress::from_sub_cross_account::<T>(&o))
+			.map(|o| eth::CrossAddress::from_sub_cross_account::<T>(&o))
 			.ok_or(Error::Revert("key too large".into()))
 	}
 
@@ -799,11 +796,7 @@
 	/// @param tokenId Id for the token.
 	/// @param keys Properties keys. Empty keys for all propertyes.
 	/// @return Vector of properties key/value pairs.
-	fn properties(
-		&self,
-		token_id: uint256,
-		keys: Vec<string>,
-	) -> Result<Vec<pallet_common::eth::Property>> {
+	fn properties(&self, token_id: uint256, keys: Vec<string>) -> Result<Vec<eth::Property>> {
 		let keys = keys
 			.into_iter()
 			.map(|key| {
@@ -819,7 +812,7 @@
 			if keys.is_empty() { None } else { Some(keys) },
 		)
 		.into_iter()
-		.map(pallet_common::eth::Property::try_from)
+		.map(eth::Property::try_from)
 		.collect::<Result<Vec<_>>>()
 	}
 	/// @notice Transfer ownership of an RFT
@@ -855,7 +848,7 @@
 	fn transfer_cross(
 		&mut self,
 		caller: caller,
-		to: pallet_common::eth::CrossAddress,
+		to: eth::CrossAddress,
 		token_id: uint256,
 	) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -883,8 +876,8 @@
 	fn transfer_from_cross(
 		&mut self,
 		caller: caller,
-		from: pallet_common::eth::CrossAddress,
-		to: pallet_common::eth::CrossAddress,
+		from: eth::CrossAddress,
+		to: eth::CrossAddress,
 		token_id: uint256,
 	) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -939,7 +932,7 @@
 	fn burn_from_cross(
 		&mut self,
 		caller: caller,
-		from: pallet_common::eth::CrossAddress,
+		from: eth::CrossAddress,
 		token_id: uint256,
 	) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -1076,8 +1069,8 @@
 	fn mint_cross(
 		&mut self,
 		caller: caller,
-		to: pallet_common::eth::CrossAddress,
-		properties: Vec<pallet_common::eth::Property>,
+		to: eth::CrossAddress,
+		properties: Vec<eth::Property>,
 	) -> Result<uint256> {
 		let token_id = <TokensMinted<T>>::get(self.id)
 			.checked_add(1)
@@ -1087,7 +1080,7 @@
 
 		let properties = properties
 			.into_iter()
-			.map(pallet_common::eth::Property::try_into)
+			.map(eth::Property::try_into)
 			.collect::<Result<Vec<_>>>()?
 			.try_into()
 			.map_err(|_| Error::Revert(alloc::format!("too many properties")))?;