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

difftreelog

misc: add test for StructCollect generation

Trubnikov Sergey2022-11-21parent: #9e32437.patch.diff
in: master

2 files changed

modifiedcrates/evm-coder/procedural/src/abi_derive.rsdiffbeforeafterboth
--- a/crates/evm-coder/procedural/src/abi_derive.rs
+++ b/crates/evm-coder/procedural/src/abi_derive.rs
@@ -306,7 +306,7 @@
 					let doc = doc.trim();
 					let dev = if i == 0 { " @dev" } else { "" };
 					quote! {
-						writeln!(str, "///{} {}", #dev, #doc).unwrap();
+						writeln!(str, "\t///{} {}", #dev, #doc).unwrap();
 					}
 				}),
 				Err(e) => unreachable!("{:?}", e),
modifiedcrates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth
before · crates/evm-coder/tests/abi_derive_generation.rs
1use evm_coder_procedural::AbiCoder;2use evm_coder::types::bytes;34#[test]5fn empty_struct() {6	let t = trybuild::TestCases::new();7	t.compile_fail("tests/build_failed/abi_derive_generation.rs");8}910#[derive(AbiCoder, PartialEq, Debug)]11struct TypeStruct1SimpleParam {12	_a: u8,13}1415#[derive(AbiCoder, PartialEq, Debug)]16struct TypeStruct1DynamicParam {17	_a: String,18}1920#[derive(AbiCoder, PartialEq, Debug)]21struct TypeStruct2SimpleParam {22	_a: u8,23	_b: u32,24}2526#[derive(AbiCoder, PartialEq, Debug)]27struct TypeStruct2DynamicParam {28	_a: String,29	_b: bytes,30}3132#[derive(AbiCoder, PartialEq, Debug)]33struct TypeStruct2MixedParam {34	_a: u8,35	_b: bytes,36}3738#[derive(AbiCoder, PartialEq, Debug)]39struct TypeStruct1DerivedSimpleParam {40	_a: TypeStruct1SimpleParam,41}4243#[derive(AbiCoder, PartialEq, Debug)]44struct TypeStruct2DerivedSimpleParam {45	_a: TypeStruct1SimpleParam,46	_b: TypeStruct2SimpleParam,47}4849#[derive(AbiCoder, PartialEq, Debug)]50struct TypeStruct1DerivedDynamicParam {51	_a: TypeStruct1DynamicParam,52}5354#[derive(AbiCoder, PartialEq, Debug)]55struct TypeStruct2DerivedDynamicParam {56	_a: TypeStruct1DynamicParam,57	_b: TypeStruct2DynamicParam,58}5960/// Some docs61/// At multi62/// line63#[derive(AbiCoder, PartialEq, Debug)]64struct TypeStruct3DerivedMixedParam {65	/// Docs for A66	_a: TypeStruct1SimpleParam,67	/// Docs for B68	_b: TypeStruct2DynamicParam,69	/// Docs for C70	_c: TypeStruct2MixedParam,71}7273#[test]74fn empty() {}7576#[test]77fn impl_abi_type_signature() {78	assert_eq!(79		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE80			.as_str()81			.unwrap(),82		"(uint8)"83	);84	assert_eq!(85		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE86			.as_str()87			.unwrap(),88		"(string)"89	);90	assert_eq!(91		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE92			.as_str()93			.unwrap(),94		"(uint8,uint32)"95	);96	assert_eq!(97		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE98			.as_str()99			.unwrap(),100		"(string,bytes)"101	);102	assert_eq!(103		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE104			.as_str()105			.unwrap(),106		"(uint8,bytes)"107	);108	assert_eq!(109		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE110			.as_str()111			.unwrap(),112		"((uint8))"113	);114	assert_eq!(115		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE116			.as_str()117			.unwrap(),118		"((uint8),(uint8,uint32))"119	);120	assert_eq!(121		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE122			.as_str()123			.unwrap(),124		"((string))"125	);126	assert_eq!(127		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE128			.as_str()129			.unwrap(),130		"((string),(string,bytes))"131	);132	assert_eq!(133		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE134			.as_str()135			.unwrap(),136		"((uint8),(string,bytes),(uint8,bytes))"137	);138}139140#[test]141fn impl_abi_type_is_dynamic() {142	assert_eq!(143		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),144		false145	);146	assert_eq!(147		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),148		true149	);150	assert_eq!(151		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),152		false153	);154	assert_eq!(155		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),156		true157	);158	assert_eq!(159		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),160		true161	);162	assert_eq!(163		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),164		false165	);166	assert_eq!(167		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),168		false169	);170	assert_eq!(171		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),172		true173	);174	assert_eq!(175		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),176		true177	);178	assert_eq!(179		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),180		true181	);182}183184#[test]185fn impl_abi_type_size() {186	const ABI_ALIGNMENT: usize = 32;187	assert_eq!(188		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),189		ABI_ALIGNMENT190	);191	assert_eq!(192		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),193		ABI_ALIGNMENT194	);195	assert_eq!(196		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),197		ABI_ALIGNMENT * 2198	);199	assert_eq!(200		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),201		ABI_ALIGNMENT * 2202	);203	assert_eq!(204		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),205		ABI_ALIGNMENT * 2206	);207	assert_eq!(208		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),209		ABI_ALIGNMENT210	);211	assert_eq!(212		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),213		ABI_ALIGNMENT * 3214	);215	assert_eq!(216		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),217		ABI_ALIGNMENT218	);219	assert_eq!(220		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),221		ABI_ALIGNMENT * 3222	);223	assert_eq!(224		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),225		ABI_ALIGNMENT * 5226	);227}228229#[derive(AbiCoder, PartialEq, Debug)]230struct TupleStruct1SimpleParam(u8);231232#[derive(AbiCoder, PartialEq, Debug)]233struct TupleStruct1DynamicParam(String);234235#[derive(AbiCoder, PartialEq, Debug)]236struct TupleStruct2SimpleParam(u8, u32);237238#[derive(AbiCoder, PartialEq, Debug)]239struct TupleStruct2DynamicParam(String, bytes);240241#[derive(AbiCoder, PartialEq, Debug)]242struct TupleStruct2MixedParam(u8, bytes);243244#[derive(AbiCoder, PartialEq, Debug)]245struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);246247#[derive(AbiCoder, PartialEq, Debug)]248struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);249250#[derive(AbiCoder, PartialEq, Debug)]251struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);252253#[derive(AbiCoder, PartialEq, Debug)]254struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);255256#[derive(AbiCoder, PartialEq, Debug)]257struct TupleStruct3DerivedMixedParam(258	TupleStruct1SimpleParam,259	TupleStruct2DynamicParam,260	TupleStruct2MixedParam,261);262263#[test]264fn impl_abi_type_signature_same_for_structs() {265	assert_eq!(266		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE267			.as_str()268			.unwrap(),269		<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE270			.as_str()271			.unwrap()272	);273	assert_eq!(274		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE275			.as_str()276			.unwrap(),277		<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE278			.as_str()279			.unwrap()280	);281	assert_eq!(282		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE283			.as_str()284			.unwrap(),285		<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE286			.as_str()287			.unwrap()288	);289	assert_eq!(290		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE291			.as_str()292			.unwrap(),293		<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE294			.as_str()295			.unwrap()296	);297	assert_eq!(298		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE299			.as_str()300			.unwrap(),301		<TupleStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE302			.as_str()303			.unwrap(),304	);305	assert_eq!(306		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE307			.as_str()308			.unwrap(),309		<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE310			.as_str()311			.unwrap(),312	);313	assert_eq!(314		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE315			.as_str()316			.unwrap(),317		<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE318			.as_str()319			.unwrap(),320	);321	assert_eq!(322		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE323			.as_str()324			.unwrap(),325		<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE326			.as_str()327			.unwrap(),328	);329	assert_eq!(330		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE331			.as_str()332			.unwrap(),333		<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE334			.as_str()335			.unwrap(),336	);337	assert_eq!(338		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE339			.as_str()340			.unwrap(),341		<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE342			.as_str()343			.unwrap(),344	);345}346347#[test]348fn impl_abi_type_is_dynamic_same_for_structs() {349	assert_eq!(350		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),351		<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic()352	);353	assert_eq!(354		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),355		<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic()356	);357	assert_eq!(358		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),359		<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic()360	);361	assert_eq!(362		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),363		<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic()364	);365	assert_eq!(366		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),367		<TupleStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic()368	);369	assert_eq!(370		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),371		<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()372	);373	assert_eq!(374		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),375		<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()376	);377	assert_eq!(378		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),379		<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()380	);381	assert_eq!(382		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),383		<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()384	);385	assert_eq!(386		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),387		<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic()388	);389}390391#[test]392fn impl_abi_type_size_same_for_structs() {393	assert_eq!(394		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),395		<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::size()396	);397	assert_eq!(398		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),399		<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::size()400	);401	assert_eq!(402		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),403		<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::size()404	);405	assert_eq!(406		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),407		<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::size()408	);409	assert_eq!(410		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),411		<TupleStruct2MixedParam as evm_coder::abi::AbiType>::size()412	);413	assert_eq!(414		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),415		<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size()416	);417	assert_eq!(418		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),419		<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size()420	);421	assert_eq!(422		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),423		<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size()424	);425	assert_eq!(426		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),427		<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size()428	);429	assert_eq!(430		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),431		<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size()432	);433}434435const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;436437fn test_impl<Tuple, TupleStruct, TypeStruct>(438	tuple_data: Tuple,439	tuple_struct_data: TupleStruct,440	type_struct_data: TypeStruct,441) where442	TypeStruct:443		evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,444	TupleStruct:445		evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,446	Tuple:447		evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,448{449	let encoded_type_struct = test_abi_write_impl(&type_struct_data);450	let encoded_tuple_struct = test_abi_write_impl(&tuple_struct_data);451	let encoded_tuple = test_abi_write_impl(&tuple_data);452453	similar_asserts::assert_eq!(encoded_tuple, encoded_type_struct);454	similar_asserts::assert_eq!(encoded_tuple, encoded_tuple_struct);455456	{457		let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();458		let restored_struct_data = <TypeStruct>::abi_read(&mut decoder).unwrap();459		assert_eq!(restored_struct_data, type_struct_data);460	}461	{462		let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();463		let restored_struct_data = <TupleStruct>::abi_read(&mut decoder).unwrap();464		assert_eq!(restored_struct_data, tuple_struct_data);465	}466467	{468		let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_type_struct).unwrap();469		let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();470		assert_eq!(restored_tuple_data, tuple_data);471	}472	{473		let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple_struct).unwrap();474		let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();475		assert_eq!(restored_tuple_data, tuple_data);476	}477}478479fn test_abi_write_impl<A>(data: &A) -> Vec<u8>480where481	A: evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,482{483	let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);484	data.abi_write(&mut writer);485	let encoded_tuple = writer.finish();486	encoded_tuple487}488489#[test]490fn codec_struct_1_simple() {491	let _a = 0xff;492	test_impl::<(u8,), TupleStruct1SimpleParam, TypeStruct1SimpleParam>(493		(_a,),494		TupleStruct1SimpleParam(_a),495		TypeStruct1SimpleParam { _a },496	);497}498499#[test]500fn codec_struct_1_dynamic() {501	let _a: String = "some string".into();502	test_impl::<(String,), TupleStruct1DynamicParam, TypeStruct1DynamicParam>(503		(_a.clone(),),504		TupleStruct1DynamicParam(_a.clone()),505		TypeStruct1DynamicParam { _a },506	);507}508509#[test]510fn codec_struct_1_derived_simple() {511	let _a: u8 = 0xff;512	test_impl::<((u8,),), TupleStruct1DerivedSimpleParam, TypeStruct1DerivedSimpleParam>(513		((_a,),),514		TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam(_a)),515		TypeStruct1DerivedSimpleParam {516			_a: TypeStruct1SimpleParam { _a },517		},518	);519}520521#[test]522fn codec_struct_1_derived_dynamic() {523	let _a: String = "some string".into();524	test_impl::<((String,),), TupleStruct1DerivedDynamicParam, TypeStruct1DerivedDynamicParam>(525		((_a.clone(),),),526		TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam(_a.clone())),527		TypeStruct1DerivedDynamicParam {528			_a: TypeStruct1DynamicParam { _a },529		},530	);531}532533#[test]534fn codec_struct_2_simple() {535	let _a = 0xff;536	let _b = 0xbeefbaba;537	test_impl::<(u8, u32), TupleStruct2SimpleParam, TypeStruct2SimpleParam>(538		(_a, _b),539		TupleStruct2SimpleParam(_a, _b),540		TypeStruct2SimpleParam { _a, _b },541	);542}543544#[test]545fn codec_struct_2_dynamic() {546	let _a: String = "some string".into();547	let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);548	test_impl::<(String, bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(549		(_a.clone(), _b.clone()),550		TupleStruct2DynamicParam(_a.clone(), _b.clone()),551		TypeStruct2DynamicParam { _a, _b },552	);553}554555#[test]556fn codec_struct_2_mixed() {557	let _a: u8 = 0xff;558	let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);559	test_impl::<(u8, bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(560		(_a.clone(), _b.clone()),561		TupleStruct2MixedParam(_a.clone(), _b.clone()),562		TypeStruct2MixedParam { _a, _b },563	);564}565566#[test]567fn codec_struct_2_derived_simple() {568	let _a = 0xff;569	let _b = 0xbeefbaba;570	test_impl::<((u8,), (u8, u32)), TupleStruct2DerivedSimpleParam, TypeStruct2DerivedSimpleParam>(571		((_a,), (_a, _b)),572		TupleStruct2DerivedSimpleParam(573			TupleStruct1SimpleParam(_a),574			TupleStruct2SimpleParam(_a, _b),575		),576		TypeStruct2DerivedSimpleParam {577			_a: TypeStruct1SimpleParam { _a },578			_b: TypeStruct2SimpleParam { _a, _b },579		},580	);581}582583#[test]584fn codec_struct_2_derived_dynamic() {585	let _a = "some string".to_string();586	let _b = bytes(vec![0x11, 0x22, 0x33]);587	test_impl::<588		((String,), (String, bytes)),589		TupleStruct2DerivedDynamicParam,590		TypeStruct2DerivedDynamicParam,591	>(592		((_a.clone(),), (_a.clone(), _b.clone())),593		TupleStruct2DerivedDynamicParam(594			TupleStruct1DynamicParam(_a.clone()),595			TupleStruct2DynamicParam(_a.clone(), _b.clone()),596		),597		TypeStruct2DerivedDynamicParam {598			_a: TypeStruct1DynamicParam { _a: _a.clone() },599			_b: TypeStruct2DynamicParam { _a, _b },600		},601	);602}603604#[test]605fn codec_struct_3_derived_mixed() {606	let int = 0xff;607	let by = bytes(vec![0x11, 0x22, 0x33]);608	let string = "some string".to_string();609	test_impl::<610		((u8,), (String, bytes), (u8, bytes)),611		TupleStruct3DerivedMixedParam,612		TypeStruct3DerivedMixedParam,613	>(614		((int,), (string.clone(), by.clone()), (int, by.clone())),615		TupleStruct3DerivedMixedParam(616			TupleStruct1SimpleParam(int),617			TupleStruct2DynamicParam(string.clone(), by.clone()),618			TupleStruct2MixedParam(int, by.clone()),619		),620		TypeStruct3DerivedMixedParam {621			_a: TypeStruct1SimpleParam { _a: int },622			_b: TypeStruct2DynamicParam {623				_a: string.clone(),624				_b: by.clone(),625			},626			_c: TypeStruct2MixedParam { _a: int, _b: by },627		},628	);629}630631#[derive(AbiCoder, PartialEq, Debug)]632struct TypeStruct2SimpleStruct1Simple {633	_a: TypeStruct2SimpleParam,634	_b: TypeStruct2SimpleParam,635	_c: u8,636}637#[derive(AbiCoder, PartialEq, Debug)]638struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);639640#[test]641fn codec_struct_2_struct_simple_1_simple() {642	let _a = 0xff;643	let _b = 0xbeefbaba;644	test_impl::<645		((u8, u32), (u8, u32), u8),646		TupleStruct2SimpleStruct1Simple,647		TypeStruct2SimpleStruct1Simple,648	>(649		((_a, _b), (_a, _b), _a),650		TupleStruct2SimpleStruct1Simple(651			TupleStruct2SimpleParam(_a, _b),652			TupleStruct2SimpleParam(_a, _b),653			_a,654		),655		TypeStruct2SimpleStruct1Simple {656			_a: TypeStruct2SimpleParam { _a, _b },657			_b: TypeStruct2SimpleParam { _a, _b },658			_c: _a,659		},660	);661}
after · crates/evm-coder/tests/abi_derive_generation.rs
1use evm_coder_procedural::AbiCoder;2use evm_coder::types::bytes;34#[test]5fn empty_struct() {6	let t = trybuild::TestCases::new();7	t.compile_fail("tests/build_failed/abi_derive_generation.rs");8}910#[derive(AbiCoder, PartialEq, Debug)]11struct TypeStruct1SimpleParam {12	_a: u8,13}1415#[derive(AbiCoder, PartialEq, Debug)]16struct TypeStruct1DynamicParam {17	_a: String,18}1920#[derive(AbiCoder, PartialEq, Debug)]21struct TypeStruct2SimpleParam {22	_a: u8,23	_b: u32,24}2526#[derive(AbiCoder, PartialEq, Debug)]27struct TypeStruct2DynamicParam {28	_a: String,29	_b: bytes,30}3132#[derive(AbiCoder, PartialEq, Debug)]33struct TypeStruct2MixedParam {34	_a: u8,35	_b: bytes,36}3738#[derive(AbiCoder, PartialEq, Debug)]39struct TypeStruct1DerivedSimpleParam {40	_a: TypeStruct1SimpleParam,41}4243#[derive(AbiCoder, PartialEq, Debug)]44struct TypeStruct2DerivedSimpleParam {45	_a: TypeStruct1SimpleParam,46	_b: TypeStruct2SimpleParam,47}4849#[derive(AbiCoder, PartialEq, Debug)]50struct TypeStruct1DerivedDynamicParam {51	_a: TypeStruct1DynamicParam,52}5354#[derive(AbiCoder, PartialEq, Debug)]55struct TypeStruct2DerivedDynamicParam {56	_a: TypeStruct1DynamicParam,57	_b: TypeStruct2DynamicParam,58}5960/// Some docs61/// At multi62/// line63#[derive(AbiCoder, PartialEq, Debug)]64struct TypeStruct3DerivedMixedParam {65	/// Docs for A66	/// multi67	/// line68	_a: TypeStruct1SimpleParam,69	/// Docs for B70	_b: TypeStruct2DynamicParam,71	/// Docs for C72	_c: TypeStruct2MixedParam,73}7475#[test]76#[cfg(feature = "stubgen")]77fn struct_collect_TypeStruct3DerivedMixedParam() {78	assert_eq!(79		<TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),80		"TypeStruct3DerivedMixedParam"81	);82	assert_eq!(83		<TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),84		r#"/// @dev Some docs85/// At multi86/// line87struct TypeStruct3DerivedMixedParam {88	/// @dev Docs for A89	/// multi90	/// line91	TypeStruct1SimpleParam _a;92	/// @dev Docs for B93	TypeStruct2DynamicParam _b;94	/// @dev Docs for C95	TypeStruct2MixedParam _c;96}97"#98	);99}100101#[test]102fn impl_abi_type_signature() {103	assert_eq!(104		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE105			.as_str()106			.unwrap(),107		"(uint8)"108	);109	assert_eq!(110		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE111			.as_str()112			.unwrap(),113		"(string)"114	);115	assert_eq!(116		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE117			.as_str()118			.unwrap(),119		"(uint8,uint32)"120	);121	assert_eq!(122		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE123			.as_str()124			.unwrap(),125		"(string,bytes)"126	);127	assert_eq!(128		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE129			.as_str()130			.unwrap(),131		"(uint8,bytes)"132	);133	assert_eq!(134		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE135			.as_str()136			.unwrap(),137		"((uint8))"138	);139	assert_eq!(140		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE141			.as_str()142			.unwrap(),143		"((uint8),(uint8,uint32))"144	);145	assert_eq!(146		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE147			.as_str()148			.unwrap(),149		"((string))"150	);151	assert_eq!(152		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE153			.as_str()154			.unwrap(),155		"((string),(string,bytes))"156	);157	assert_eq!(158		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE159			.as_str()160			.unwrap(),161		"((uint8),(string,bytes),(uint8,bytes))"162	);163}164165#[test]166fn impl_abi_type_is_dynamic() {167	assert_eq!(168		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),169		false170	);171	assert_eq!(172		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),173		true174	);175	assert_eq!(176		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),177		false178	);179	assert_eq!(180		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),181		true182	);183	assert_eq!(184		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),185		true186	);187	assert_eq!(188		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),189		false190	);191	assert_eq!(192		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),193		false194	);195	assert_eq!(196		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),197		true198	);199	assert_eq!(200		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),201		true202	);203	assert_eq!(204		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),205		true206	);207}208209#[test]210fn impl_abi_type_size() {211	const ABI_ALIGNMENT: usize = 32;212	assert_eq!(213		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),214		ABI_ALIGNMENT215	);216	assert_eq!(217		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),218		ABI_ALIGNMENT219	);220	assert_eq!(221		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),222		ABI_ALIGNMENT * 2223	);224	assert_eq!(225		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),226		ABI_ALIGNMENT * 2227	);228	assert_eq!(229		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),230		ABI_ALIGNMENT * 2231	);232	assert_eq!(233		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),234		ABI_ALIGNMENT235	);236	assert_eq!(237		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),238		ABI_ALIGNMENT * 3239	);240	assert_eq!(241		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),242		ABI_ALIGNMENT243	);244	assert_eq!(245		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),246		ABI_ALIGNMENT * 3247	);248	assert_eq!(249		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),250		ABI_ALIGNMENT * 5251	);252}253254#[derive(AbiCoder, PartialEq, Debug)]255struct TupleStruct1SimpleParam(u8);256257#[derive(AbiCoder, PartialEq, Debug)]258struct TupleStruct1DynamicParam(String);259260#[derive(AbiCoder, PartialEq, Debug)]261struct TupleStruct2SimpleParam(u8, u32);262263#[derive(AbiCoder, PartialEq, Debug)]264struct TupleStruct2DynamicParam(String, bytes);265266#[derive(AbiCoder, PartialEq, Debug)]267struct TupleStruct2MixedParam(u8, bytes);268269#[derive(AbiCoder, PartialEq, Debug)]270struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);271272#[derive(AbiCoder, PartialEq, Debug)]273struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);274275#[derive(AbiCoder, PartialEq, Debug)]276struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);277278#[derive(AbiCoder, PartialEq, Debug)]279struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);280281#[derive(AbiCoder, PartialEq, Debug)]282struct TupleStruct3DerivedMixedParam(283	TupleStruct1SimpleParam,284	TupleStruct2DynamicParam,285	TupleStruct2MixedParam,286);287288#[test]289fn impl_abi_type_signature_same_for_structs() {290	assert_eq!(291		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE292			.as_str()293			.unwrap(),294		<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE295			.as_str()296			.unwrap()297	);298	assert_eq!(299		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE300			.as_str()301			.unwrap(),302		<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE303			.as_str()304			.unwrap()305	);306	assert_eq!(307		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE308			.as_str()309			.unwrap(),310		<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE311			.as_str()312			.unwrap()313	);314	assert_eq!(315		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE316			.as_str()317			.unwrap(),318		<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE319			.as_str()320			.unwrap()321	);322	assert_eq!(323		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE324			.as_str()325			.unwrap(),326		<TupleStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE327			.as_str()328			.unwrap(),329	);330	assert_eq!(331		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE332			.as_str()333			.unwrap(),334		<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE335			.as_str()336			.unwrap(),337	);338	assert_eq!(339		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE340			.as_str()341			.unwrap(),342		<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE343			.as_str()344			.unwrap(),345	);346	assert_eq!(347		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE348			.as_str()349			.unwrap(),350		<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE351			.as_str()352			.unwrap(),353	);354	assert_eq!(355		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE356			.as_str()357			.unwrap(),358		<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE359			.as_str()360			.unwrap(),361	);362	assert_eq!(363		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE364			.as_str()365			.unwrap(),366		<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE367			.as_str()368			.unwrap(),369	);370}371372#[test]373fn impl_abi_type_is_dynamic_same_for_structs() {374	assert_eq!(375		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),376		<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic()377	);378	assert_eq!(379		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),380		<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic()381	);382	assert_eq!(383		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),384		<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic()385	);386	assert_eq!(387		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),388		<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic()389	);390	assert_eq!(391		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),392		<TupleStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic()393	);394	assert_eq!(395		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),396		<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()397	);398	assert_eq!(399		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),400		<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()401	);402	assert_eq!(403		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),404		<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()405	);406	assert_eq!(407		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),408		<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()409	);410	assert_eq!(411		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),412		<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic()413	);414}415416#[test]417fn impl_abi_type_size_same_for_structs() {418	assert_eq!(419		<TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),420		<TupleStruct1SimpleParam as evm_coder::abi::AbiType>::size()421	);422	assert_eq!(423		<TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),424		<TupleStruct1DynamicParam as evm_coder::abi::AbiType>::size()425	);426	assert_eq!(427		<TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),428		<TupleStruct2SimpleParam as evm_coder::abi::AbiType>::size()429	);430	assert_eq!(431		<TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),432		<TupleStruct2DynamicParam as evm_coder::abi::AbiType>::size()433	);434	assert_eq!(435		<TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),436		<TupleStruct2MixedParam as evm_coder::abi::AbiType>::size()437	);438	assert_eq!(439		<TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),440		<TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size()441	);442	assert_eq!(443		<TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),444		<TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size()445	);446	assert_eq!(447		<TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),448		<TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size()449	);450	assert_eq!(451		<TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),452		<TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size()453	);454	assert_eq!(455		<TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),456		<TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size()457	);458}459460const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;461462fn test_impl<Tuple, TupleStruct, TypeStruct>(463	tuple_data: Tuple,464	tuple_struct_data: TupleStruct,465	type_struct_data: TypeStruct,466) where467	TypeStruct:468		evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,469	TupleStruct:470		evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,471	Tuple:472		evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,473{474	let encoded_type_struct = test_abi_write_impl(&type_struct_data);475	let encoded_tuple_struct = test_abi_write_impl(&tuple_struct_data);476	let encoded_tuple = test_abi_write_impl(&tuple_data);477478	similar_asserts::assert_eq!(encoded_tuple, encoded_type_struct);479	similar_asserts::assert_eq!(encoded_tuple, encoded_tuple_struct);480481	{482		let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();483		let restored_struct_data = <TypeStruct>::abi_read(&mut decoder).unwrap();484		assert_eq!(restored_struct_data, type_struct_data);485	}486	{487		let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();488		let restored_struct_data = <TupleStruct>::abi_read(&mut decoder).unwrap();489		assert_eq!(restored_struct_data, tuple_struct_data);490	}491492	{493		let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_type_struct).unwrap();494		let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();495		assert_eq!(restored_tuple_data, tuple_data);496	}497	{498		let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple_struct).unwrap();499		let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();500		assert_eq!(restored_tuple_data, tuple_data);501	}502}503504fn test_abi_write_impl<A>(data: &A) -> Vec<u8>505where506	A: evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,507{508	let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);509	data.abi_write(&mut writer);510	let encoded_tuple = writer.finish();511	encoded_tuple512}513514#[test]515fn codec_struct_1_simple() {516	let _a = 0xff;517	test_impl::<(u8,), TupleStruct1SimpleParam, TypeStruct1SimpleParam>(518		(_a,),519		TupleStruct1SimpleParam(_a),520		TypeStruct1SimpleParam { _a },521	);522}523524#[test]525fn codec_struct_1_dynamic() {526	let _a: String = "some string".into();527	test_impl::<(String,), TupleStruct1DynamicParam, TypeStruct1DynamicParam>(528		(_a.clone(),),529		TupleStruct1DynamicParam(_a.clone()),530		TypeStruct1DynamicParam { _a },531	);532}533534#[test]535fn codec_struct_1_derived_simple() {536	let _a: u8 = 0xff;537	test_impl::<((u8,),), TupleStruct1DerivedSimpleParam, TypeStruct1DerivedSimpleParam>(538		((_a,),),539		TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam(_a)),540		TypeStruct1DerivedSimpleParam {541			_a: TypeStruct1SimpleParam { _a },542		},543	);544}545546#[test]547fn codec_struct_1_derived_dynamic() {548	let _a: String = "some string".into();549	test_impl::<((String,),), TupleStruct1DerivedDynamicParam, TypeStruct1DerivedDynamicParam>(550		((_a.clone(),),),551		TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam(_a.clone())),552		TypeStruct1DerivedDynamicParam {553			_a: TypeStruct1DynamicParam { _a },554		},555	);556}557558#[test]559fn codec_struct_2_simple() {560	let _a = 0xff;561	let _b = 0xbeefbaba;562	test_impl::<(u8, u32), TupleStruct2SimpleParam, TypeStruct2SimpleParam>(563		(_a, _b),564		TupleStruct2SimpleParam(_a, _b),565		TypeStruct2SimpleParam { _a, _b },566	);567}568569#[test]570fn codec_struct_2_dynamic() {571	let _a: String = "some string".into();572	let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);573	test_impl::<(String, bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(574		(_a.clone(), _b.clone()),575		TupleStruct2DynamicParam(_a.clone(), _b.clone()),576		TypeStruct2DynamicParam { _a, _b },577	);578}579580#[test]581fn codec_struct_2_mixed() {582	let _a: u8 = 0xff;583	let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);584	test_impl::<(u8, bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(585		(_a.clone(), _b.clone()),586		TupleStruct2MixedParam(_a.clone(), _b.clone()),587		TypeStruct2MixedParam { _a, _b },588	);589}590591#[test]592fn codec_struct_2_derived_simple() {593	let _a = 0xff;594	let _b = 0xbeefbaba;595	test_impl::<((u8,), (u8, u32)), TupleStruct2DerivedSimpleParam, TypeStruct2DerivedSimpleParam>(596		((_a,), (_a, _b)),597		TupleStruct2DerivedSimpleParam(598			TupleStruct1SimpleParam(_a),599			TupleStruct2SimpleParam(_a, _b),600		),601		TypeStruct2DerivedSimpleParam {602			_a: TypeStruct1SimpleParam { _a },603			_b: TypeStruct2SimpleParam { _a, _b },604		},605	);606}607608#[test]609fn codec_struct_2_derived_dynamic() {610	let _a = "some string".to_string();611	let _b = bytes(vec![0x11, 0x22, 0x33]);612	test_impl::<613		((String,), (String, bytes)),614		TupleStruct2DerivedDynamicParam,615		TypeStruct2DerivedDynamicParam,616	>(617		((_a.clone(),), (_a.clone(), _b.clone())),618		TupleStruct2DerivedDynamicParam(619			TupleStruct1DynamicParam(_a.clone()),620			TupleStruct2DynamicParam(_a.clone(), _b.clone()),621		),622		TypeStruct2DerivedDynamicParam {623			_a: TypeStruct1DynamicParam { _a: _a.clone() },624			_b: TypeStruct2DynamicParam { _a, _b },625		},626	);627}628629#[test]630fn codec_struct_3_derived_mixed() {631	let int = 0xff;632	let by = bytes(vec![0x11, 0x22, 0x33]);633	let string = "some string".to_string();634	test_impl::<635		((u8,), (String, bytes), (u8, bytes)),636		TupleStruct3DerivedMixedParam,637		TypeStruct3DerivedMixedParam,638	>(639		((int,), (string.clone(), by.clone()), (int, by.clone())),640		TupleStruct3DerivedMixedParam(641			TupleStruct1SimpleParam(int),642			TupleStruct2DynamicParam(string.clone(), by.clone()),643			TupleStruct2MixedParam(int, by.clone()),644		),645		TypeStruct3DerivedMixedParam {646			_a: TypeStruct1SimpleParam { _a: int },647			_b: TypeStruct2DynamicParam {648				_a: string.clone(),649				_b: by.clone(),650			},651			_c: TypeStruct2MixedParam { _a: int, _b: by },652		},653	);654}655656#[derive(AbiCoder, PartialEq, Debug)]657struct TypeStruct2SimpleStruct1Simple {658	_a: TypeStruct2SimpleParam,659	_b: TypeStruct2SimpleParam,660	_c: u8,661}662#[derive(AbiCoder, PartialEq, Debug)]663struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);664665#[test]666fn codec_struct_2_struct_simple_1_simple() {667	let _a = 0xff;668	let _b = 0xbeefbaba;669	test_impl::<670		((u8, u32), (u8, u32), u8),671		TupleStruct2SimpleStruct1Simple,672		TypeStruct2SimpleStruct1Simple,673	>(674		((_a, _b), (_a, _b), _a),675		TupleStruct2SimpleStruct1Simple(676			TupleStruct2SimpleParam(_a, _b),677			TupleStruct2SimpleParam(_a, _b),678			_a,679		),680		TypeStruct2SimpleStruct1Simple {681			_a: TypeStruct2SimpleParam { _a, _b },682			_b: TypeStruct2SimpleParam { _a, _b },683			_c: _a,684		},685	);686}