git.delta.rocks / unique-network / refs/commits / 068fc8208402

difftreelog

refactor Abi impls

Trubnikov Sergey2022-11-18parent: #e2559ac.patch.diff
in: master

5 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
@@ -121,7 +121,7 @@
 				#(
 					let #field_names = {
 						let value = <#field_types as ::evm_coder::abi::AbiRead>::abi_read(&mut subresult)?;
-						if !is_dynamic {subresult.seek(<#field_types as ::evm_coder::abi::AbiType>::size())};
+						if !is_dynamic {subresult.bytes_read(<#field_types as ::evm_coder::abi::AbiType>::size())};
 						value
 					};
 				)*
modifiedcrates/evm-coder/procedural/src/solidity_interface.rsdiffbeforeafterboth
--- a/crates/evm-coder/procedural/src/solidity_interface.rs
+++ b/crates/evm-coder/procedural/src/solidity_interface.rs
@@ -406,7 +406,7 @@
 		quote! {
 			#name: {
 				let value = <#ty as ::evm_coder::abi::AbiRead>::abi_read(reader)?;
-				if !is_dynamic {reader.seek(<#ty as ::evm_coder::abi::AbiType>::size())};
+				if !is_dynamic {reader.bytes_read(<#ty as ::evm_coder::abi::AbiType>::size())};
 				value
 			}
 		}
modifiedcrates/evm-coder/src/abi/impls.rsdiffbeforeafterboth
--- a/crates/evm-coder/src/abi/impls.rs
+++ b/crates/evm-coder/src/abi/impls.rs
@@ -10,12 +10,12 @@
 #[cfg(not(feature = "std"))]
 use alloc::vec::Vec;
 
-macro_rules! impl_abi_readable {
-	($ty:ty, $method:ident, $dynamic:literal) => {
+macro_rules! impl_abi_type {
+	($ty:ty, $name:ident, $dynamic:literal) => {
 		impl sealed::CanBePlacedInVec for $ty {}
 
 		impl AbiType for $ty {
-			const SIGNATURE: SignatureUnit = make_signature!(new fixed(stringify!($ty)));
+			const SIGNATURE: SignatureUnit = make_signature!(new fixed(stringify!($name)));
 
 			fn is_dynamic() -> bool {
 				$dynamic
@@ -25,7 +25,11 @@
 				ABI_ALIGNMENT
 			}
 		}
+	};
+}
 
+macro_rules! impl_abi_readable {
+	($ty:ty, $method:ident) => {
 		impl AbiRead for $ty {
 			fn abi_read(reader: &mut AbiReader) -> Result<$ty> {
 				reader.$method()
@@ -34,82 +38,75 @@
 	};
 }
 
-impl_abi_readable!(uint32, uint32, false);
-impl_abi_readable!(uint64, uint64, false);
-impl_abi_readable!(uint128, uint128, false);
-impl_abi_readable!(uint256, uint256, false);
-impl_abi_readable!(bytes4, bytes4, false);
-impl_abi_readable!(address, address, false);
-impl_abi_readable!(string, string, true);
+macro_rules! impl_abi_writeable {
+	($ty:ty, $method:ident) => {
+		impl AbiWrite for $ty {
+			fn abi_write(&self, writer: &mut AbiWriter) {
+				writer.$method(&self)
+			}
+		}
+	};
+}
 
-impl sealed::CanBePlacedInVec for bool {}
+macro_rules! impl_abi {
+	($ty:ty, $method:ident, $dynamic:literal) => {
+		impl_abi_type!($ty, $method, $dynamic);
+		impl_abi_readable!($ty, $method);
+		impl_abi_writeable!($ty, $method);
+	};
+}
 
-impl AbiType for bool {
-	const SIGNATURE: SignatureUnit = make_signature!(new fixed("bool"));
+impl_abi!(bool, bool, false);
+impl_abi!(u8, uint8, false);
+impl_abi!(u32, uint32, false);
+impl_abi!(u64, uint64, false);
+impl_abi!(u128, uint128, false);
+impl_abi!(U256, uint256, false);
+impl_abi!(H160, address, false);
+impl_abi!(string, string, true);
 
-	fn is_dynamic() -> bool {
-		false
-	}
-	fn size() -> usize {
-		ABI_ALIGNMENT
-	}
-}
-impl AbiRead for bool {
-	fn abi_read(reader: &mut AbiReader) -> Result<bool> {
-		reader.bool()
-	}
-}
+impl_abi_writeable!(&str, string);
 
-impl AbiType for uint8 {
-	const SIGNATURE: SignatureUnit = make_signature!(new fixed("uint8"));
+impl_abi_type!(bytes, bytes, true);
 
-	fn is_dynamic() -> bool {
-		false
-	}
-	fn size() -> usize {
-		ABI_ALIGNMENT
-	}
-}
-impl AbiRead for uint8 {
-	fn abi_read(reader: &mut AbiReader) -> Result<uint8> {
-		reader.uint8()
+impl AbiRead for bytes {
+	fn abi_read(reader: &mut AbiReader) -> Result<bytes> {
+		Ok(bytes(reader.bytes()?))
 	}
 }
 
-impl AbiType for bytes {
-	const SIGNATURE: SignatureUnit = make_signature!(new fixed("bytes"));
-
-	fn is_dynamic() -> bool {
-		true
-	}
-	fn size() -> usize {
-		ABI_ALIGNMENT
+impl AbiWrite for bytes {
+	fn abi_write(&self, writer: &mut AbiWriter) {
+		writer.bytes(self.0.as_slice())
 	}
 }
-impl AbiRead for bytes {
-	fn abi_read(reader: &mut AbiReader) -> Result<bytes> {
-		Ok(bytes(reader.bytes()?))
+
+impl_abi_type!(bytes4, bytes4, false);
+impl AbiRead for bytes4 {
+	fn abi_read(reader: &mut AbiReader) -> Result<bytes4> {
+		reader.bytes4()
 	}
 }
 
-impl<R: AbiType + AbiRead + sealed::CanBePlacedInVec> AbiRead for Vec<R> {
-	fn abi_read(reader: &mut AbiReader) -> Result<Vec<R>> {
+impl<T: AbiType + AbiRead + sealed::CanBePlacedInVec> AbiRead for Vec<T> {
+	fn abi_read(reader: &mut AbiReader) -> Result<Vec<T>> {
 		let mut sub = reader.subresult(None)?;
 		let size = sub.uint32()? as usize;
 		sub.subresult_offset = sub.offset;
+		let is_dynamic = <T as AbiType>::is_dynamic();
 		let mut out = Vec::with_capacity(size);
 		for _ in 0..size {
-			out.push(<R>::abi_read(&mut sub)?);
-			if !<R>::is_dynamic() {
-				sub.subresult_offset += <R>::size()
+			out.push(<T as AbiRead>::abi_read(&mut sub)?);
+			if !is_dynamic {
+				sub.bytes_read(<T as AbiType>::size());
 			};
 		}
 		Ok(out)
 	}
 }
 
-impl<R: AbiType> AbiType for Vec<R> {
-	const SIGNATURE: SignatureUnit = make_signature!(new nameof(R::SIGNATURE) fixed("[]"));
+impl<T: AbiType> AbiType for Vec<T> {
+	const SIGNATURE: SignatureUnit = make_signature!(new nameof(T::SIGNATURE) fixed("[]"));
 
 	fn is_dynamic() -> bool {
 		true
@@ -152,39 +149,9 @@
 impl AbiWrite for Property {
 	fn abi_write(&self, writer: &mut AbiWriter) {
 		(&self.key, &self.value).abi_write(writer);
-	}
-}
-
-macro_rules! impl_abi_writeable {
-	($ty:ty, $method:ident) => {
-		impl AbiWrite for $ty {
-			fn abi_write(&self, writer: &mut AbiWriter) {
-				writer.$method(&self)
-			}
-		}
-	};
-}
-
-impl_abi_writeable!(u8, uint8);
-impl_abi_writeable!(u32, uint32);
-impl_abi_writeable!(u128, uint128);
-impl_abi_writeable!(U256, uint256);
-impl_abi_writeable!(H160, address);
-impl_abi_writeable!(bool, bool);
-impl_abi_writeable!(&str, string);
-
-impl AbiWrite for string {
-	fn abi_write(&self, writer: &mut AbiWriter) {
-		writer.string(self)
 	}
 }
 
-impl AbiWrite for bytes {
-	fn abi_write(&self, writer: &mut AbiWriter) {
-		writer.bytes(self.0.as_slice())
-	}
-}
-
 impl<T: AbiWrite + AbiType> AbiWrite for Vec<T> {
 	fn abi_write(&self, writer: &mut AbiWriter) {
 		let is_dynamic = T::is_dynamic();
@@ -272,7 +239,7 @@
 				Ok((
 					$({
 						let value = <$ident>::abi_read(&mut subresult)?;
-						if !is_dynamic {subresult.seek(<$ident as AbiType>::size())};
+						if !is_dynamic {subresult.bytes_read(<$ident as AbiType>::size())};
 						value
 					},)+
 				))
modifiedcrates/evm-coder/src/abi/mod.rsdiffbeforeafterboth
--- a/crates/evm-coder/src/abi/mod.rs
+++ b/crates/evm-coder/src/abi/mod.rs
@@ -208,7 +208,7 @@
 	}
 
 	/// Notify about readed data portion.
-	pub fn seek(&mut self, size: usize) {
+	pub fn bytes_read(&mut self, size: usize) {
 		self.subresult_offset += size;
 	}
 
@@ -281,6 +281,11 @@
 		self.write_padleft(&u32::to_be_bytes(*value))
 	}
 
+	/// Write [`u64`] to end of buffer
+	pub fn uint64(&mut self, value: &u64) {
+		self.write_padleft(&u64::to_be_bytes(*value))
+	}
+
 	/// Write [`u128`] to end of buffer
 	pub fn uint128(&mut self, value: &u128) {
 		self.write_padleft(&u128::to_be_bytes(*value))
modifiedcrates/evm-coder/src/abi/test.rsdiffbeforeafterboth
before · crates/evm-coder/src/abi/test.rs
1use crate::{2	abi::{AbiRead, AbiWrite},3	types::*,4};56use super::{AbiReader, AbiWriter};7use hex_literal::hex;8use primitive_types::{H160, U256};910fn test_impl<T>(function_identifier: u32, decoded_data: T, encoded_data: &[u8])11where12	T: AbiWrite + AbiRead + std::cmp::PartialEq + std::fmt::Debug,13{14	let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap();15	assert_eq!(call, u32::to_be_bytes(function_identifier));16	let data = <T>::abi_read(&mut decoder).unwrap();17	assert_eq!(data, decoded_data);1819	let mut writer = AbiWriter::new_call(function_identifier);20	decoded_data.abi_write(&mut writer);21	let ed = writer.finish();22	similar_asserts::assert_eq!(encoded_data, ed.as_slice());23}2425macro_rules! test_impl_uint {26	($type:ident) => {27		test_impl::<$type>(28			0xdeadbeef,29			255 as $type,30			&hex!(31				"32                    deadbeef33                    00000000000000000000000000000000000000000000000000000000000000ff34                "35			),36		);37	};38}3940#[test]41fn encode_decode_uint8() {42	test_impl_uint!(uint8);43}4445#[test]46fn encode_decode_uint32() {47	test_impl_uint!(uint32);48}4950#[test]51fn encode_decode_uint128() {52	test_impl_uint!(uint128);53}5455#[test]56fn encode_decode_uint256() {57	test_impl::<uint256>(58		0xdeadbeef,59		U256([255, 0, 0, 0]),60		&hex!(61			"62                deadbeef63                00000000000000000000000000000000000000000000000000000000000000ff64            "65		),66	);67}6869#[test]70fn encode_decode_string() {71	test_impl::<String>(72		0xdeadbeef,73		"some string".to_string(),74		&hex!(75			"76                deadbeef77                000000000000000000000000000000000000000000000000000000000000002078                000000000000000000000000000000000000000000000000000000000000000b79                736f6d6520737472696e6700000000000000000000000000000000000000000080            "81		),82	);83}8485#[test]86fn encode_decode_tuple_string() {87	test_impl::<(String,)>(88		0xdeadbeef,89		("some string".to_string(),),90		&hex!(91			"92                deadbeef93                000000000000000000000000000000000000000000000000000000000000002094                000000000000000000000000000000000000000000000000000000000000002095                000000000000000000000000000000000000000000000000000000000000000b96                736f6d6520737472696e6700000000000000000000000000000000000000000097            "98		),99	);100}101102#[test]103fn encode_decode_vec_tuple_address_uint256() {104	test_impl::<Vec<(address, uint256)>>(105        0x1ACF2D55,106        vec![107            (108                H160(hex!("2D2FF76104B7BACB2E8F6731D5BFC184EBECDDBC")),109                U256([10, 0, 0, 0]),110            ),111            (112                H160(hex!("AB8E3D9134955566483B11E6825C9223B6737B10")),113                U256([20, 0, 0, 0]),114            ),115            (116                H160(hex!("8C582BDF2953046705FC56F189385255EFC1BE18")),117                U256([30, 0, 0, 0]),118            ),119        ],120        &hex!(121            "122                1ACF2D55123                0000000000000000000000000000000000000000000000000000000000000020 // offset of (address, uint256)[]124                0000000000000000000000000000000000000000000000000000000000000003 // length of (address, uint256)[]125126                0000000000000000000000002D2FF76104B7BACB2E8F6731D5BFC184EBECDDBC // address127                000000000000000000000000000000000000000000000000000000000000000A // uint256128129                000000000000000000000000AB8E3D9134955566483B11E6825C9223B6737B10 // address130                0000000000000000000000000000000000000000000000000000000000000014 // uint256131132                0000000000000000000000008C582BDF2953046705FC56F189385255EFC1BE18 // address133                000000000000000000000000000000000000000000000000000000000000001E // uint256134            "135        )136    );137}138139#[test]140fn encode_decode_vec_tuple_uint8_uint8() {141	test_impl::<Vec<(u8, u8)>>(142		0xdeadbeef,143		vec![(0x0A, 0x0B), (0x0C, 0x0D), (0x0E, 0x0F)],144		&hex!(145			"146                deadbeef147                0000000000000000000000000000000000000000000000000000000000000020148                0000000000000000000000000000000000000000000000000000000000000003149                000000000000000000000000000000000000000000000000000000000000000a150                000000000000000000000000000000000000000000000000000000000000000b151                000000000000000000000000000000000000000000000000000000000000000c152                000000000000000000000000000000000000000000000000000000000000000d153                000000000000000000000000000000000000000000000000000000000000000e154                000000000000000000000000000000000000000000000000000000000000000f155            "156		),157	);158}159160#[test]161fn encode_decode_vec_tuple_uint256_string() {162	test_impl::<Vec<(uint256, string)>>(163        0xdeadbeef,164        vec![165            (1.into(), "Test URI 0".to_string()),166            (11.into(), "Test URI 1".to_string()),167            (12.into(), "Test URI 2".to_string()),168        ],169        &hex!(170            "171                deadbeef172                0000000000000000000000000000000000000000000000000000000000000020 // offset of (uint256, string)[]173                0000000000000000000000000000000000000000000000000000000000000003 // length of (uint256, string)[]174175                0000000000000000000000000000000000000000000000000000000000000060 // offset of first elem176                00000000000000000000000000000000000000000000000000000000000000e0 // offset of second elem177                0000000000000000000000000000000000000000000000000000000000000160 // offset of third elem178179                0000000000000000000000000000000000000000000000000000000000000001 // first token id?   					#60180                0000000000000000000000000000000000000000000000000000000000000040 // offset of string181                000000000000000000000000000000000000000000000000000000000000000a // size of string182                5465737420555249203000000000000000000000000000000000000000000000 // string183184                000000000000000000000000000000000000000000000000000000000000000b // second token id? Why ==11?			#e0185                0000000000000000000000000000000000000000000000000000000000000040 // offset of string186                000000000000000000000000000000000000000000000000000000000000000a // size of string187                5465737420555249203100000000000000000000000000000000000000000000 // string188189                000000000000000000000000000000000000000000000000000000000000000c // third token id?  Why ==12?			#160190                0000000000000000000000000000000000000000000000000000000000000040 // offset of string191                000000000000000000000000000000000000000000000000000000000000000a // size of string192                5465737420555249203200000000000000000000000000000000000000000000 // string193            "194        )195    );196}197198#[test]199fn dynamic_after_static() {200	let mut encoder = AbiWriter::new();201	encoder.bool(&true);202	encoder.string("test");203	let encoded = encoder.finish();204205	let mut encoder = AbiWriter::new();206	encoder.bool(&true);207	// Offset to subresult208	encoder.uint32(&(32 * 2));209	// Len of "test"210	encoder.uint32(&4);211	encoder.write_padright(&[b't', b'e', b's', b't']);212	let alternative_encoded = encoder.finish();213214	assert_eq!(encoded, alternative_encoded);215216	let mut decoder = AbiReader::new(&encoded);217	assert!(decoder.bool().unwrap());218	assert_eq!(decoder.string().unwrap(), "test");219}220221#[test]222fn mint_sample() {223	let (call, mut decoder) = AbiReader::new_call(&hex!(224		"225            50bb4e7f226            000000000000000000000000ad2c0954693c2b5404b7e50967d3481bea432374227            0000000000000000000000000000000000000000000000000000000000000001228            0000000000000000000000000000000000000000000000000000000000000060229            0000000000000000000000000000000000000000000000000000000000000008230            5465737420555249000000000000000000000000000000000000000000000000231        "232	))233	.unwrap();234	assert_eq!(call, u32::to_be_bytes(0x50bb4e7f));235	assert_eq!(236		format!("{:?}", decoder.address().unwrap()),237		"0xad2c0954693c2b5404b7e50967d3481bea432374"238	);239	assert_eq!(decoder.uint32().unwrap(), 1);240	assert_eq!(decoder.string().unwrap(), "Test URI");241}242243#[test]244fn parse_vec_with_dynamic_type() {245	let decoded_data = (246		0x36543006,247		vec![248			(1.into(), "Test URI 0".to_string()),249			(11.into(), "Test URI 1".to_string()),250			(12.into(), "Test URI 2".to_string()),251		],252	);253254	let encoded_data = &hex!(255        "256            36543006257            00000000000000000000000053744e6da587ba10b32a2554d2efdcd985bc27a3 // address258            0000000000000000000000000000000000000000000000000000000000000040 // offset of (uint256, string)[]259            0000000000000000000000000000000000000000000000000000000000000003 // length of (uint256, string)[]260261            0000000000000000000000000000000000000000000000000000000000000060 // offset of first elem262            00000000000000000000000000000000000000000000000000000000000000e0 // offset of second elem263            0000000000000000000000000000000000000000000000000000000000000160 // offset of third elem264265            0000000000000000000000000000000000000000000000000000000000000001 // first token id?   					#60266            0000000000000000000000000000000000000000000000000000000000000040 // offset of string267            000000000000000000000000000000000000000000000000000000000000000a // size of string268            5465737420555249203000000000000000000000000000000000000000000000 // string269270            000000000000000000000000000000000000000000000000000000000000000b // second token id? Why ==11?			#e0271            0000000000000000000000000000000000000000000000000000000000000040 // offset of string272            000000000000000000000000000000000000000000000000000000000000000a // size of string273            5465737420555249203100000000000000000000000000000000000000000000 // string274275            000000000000000000000000000000000000000000000000000000000000000c // third token id?  Why ==12?			#160276            0000000000000000000000000000000000000000000000000000000000000040 // offset of string277            000000000000000000000000000000000000000000000000000000000000000a // size of string278            5465737420555249203200000000000000000000000000000000000000000000 // string279        "280    );281282	let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap();283	assert_eq!(call, u32::to_be_bytes(decoded_data.0));284	let address = decoder.address().unwrap();285	let data = <Vec<(uint256, string)>>::abi_read(&mut decoder).unwrap();286	assert_eq!(data, decoded_data.1);287288	let mut writer = AbiWriter::new_call(decoded_data.0);289	address.abi_write(&mut writer);290	decoded_data.1.abi_write(&mut writer);291	let ed = writer.finish();292	similar_asserts::assert_eq!(encoded_data, ed.as_slice());293}294295#[test]296fn encode_decode_vec_tuple_string_bytes() {297	test_impl::<Vec<(string, bytes)>>(298		0xdeadbeef,299		vec![300			(301				"Test URI 0".to_string(),302				bytes(vec![303					0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,304					0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,305					0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,306					0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,307				]),308			),309			(310				"Test URI 1".to_string(),311				bytes(vec![312					0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,313					0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,314					0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,315					0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,316				]),317			),318			("Test URI 2".to_string(), bytes(vec![0x33, 0x33])),319		],320		&hex!(321			"322                deadbeef323                0000000000000000000000000000000000000000000000000000000000000020324                0000000000000000000000000000000000000000000000000000000000000003325326                0000000000000000000000000000000000000000000000000000000000000060327                0000000000000000000000000000000000000000000000000000000000000140328                0000000000000000000000000000000000000000000000000000000000000220329330                0000000000000000000000000000000000000000000000000000000000000040331                0000000000000000000000000000000000000000000000000000000000000080332                000000000000000000000000000000000000000000000000000000000000000a333                5465737420555249203000000000000000000000000000000000000000000000334                0000000000000000000000000000000000000000000000000000000000000030335                1111111111111111111111111111111111111111111111111111111111111111336                1111111111111111111111111111111100000000000000000000000000000000337338                0000000000000000000000000000000000000000000000000000000000000040339                0000000000000000000000000000000000000000000000000000000000000080340                000000000000000000000000000000000000000000000000000000000000000a341                5465737420555249203100000000000000000000000000000000000000000000342                000000000000000000000000000000000000000000000000000000000000002f343                2222222222222222222222222222222222222222222222222222222222222222344                2222222222222222222222222222220000000000000000000000000000000000345346                0000000000000000000000000000000000000000000000000000000000000040347                0000000000000000000000000000000000000000000000000000000000000080348                000000000000000000000000000000000000000000000000000000000000000a349                5465737420555249203200000000000000000000000000000000000000000000350                0000000000000000000000000000000000000000000000000000000000000002351                3333000000000000000000000000000000000000000000000000000000000000352            "353		),354	);355}356357#[test]358// #[ignore = "reason"]359fn encode_decode_tuple0_tuple1_uint8_tuple1_string_bytes_tuple1_uint8_bytes() {360	let int = 0xff;361	let by = bytes(vec![0x11, 0x22, 0x33]);362	let string = "some string".to_string();363364	test_impl::<((u8,), (String, bytes), (u8, bytes))>(365		0xdeadbeef,366		((int,), (string.clone(), by.clone()), (int, by)),367		&hex!(368			"369                deadbeef370                0000000000000000000000000000000000000000000000000000000000000020371                00000000000000000000000000000000000000000000000000000000000000ff372                0000000000000000000000000000000000000000000000000000000000000060373                0000000000000000000000000000000000000000000000000000000000000120374                0000000000000000000000000000000000000000000000000000000000000040375                0000000000000000000000000000000000000000000000000000000000000080376                000000000000000000000000000000000000000000000000000000000000000b377                736f6d6520737472696e67000000000000000000000000000000000000000000378                0000000000000000000000000000000000000000000000000000000000000003379                1122330000000000000000000000000000000000000000000000000000000000380                00000000000000000000000000000000000000000000000000000000000000ff381                0000000000000000000000000000000000000000000000000000000000000040382                0000000000000000000000000000000000000000000000000000000000000003383                1122330000000000000000000000000000000000000000000000000000000000384            "385		),386	);387}388389#[test]390fn encode_decode_tuple0_tuple1_uint8_tuple1_uint8_uint8_tuple1_uint8_uint8() {391	test_impl::<((u8,), (u8, u8), (u8, u8))>(392		0xdeadbeef,393		((43,), (44, 45), (46, 47)),394		&hex!(395			"396                deadbeef397                000000000000000000000000000000000000000000000000000000000000002b398                000000000000000000000000000000000000000000000000000000000000002c399                000000000000000000000000000000000000000000000000000000000000002d400                000000000000000000000000000000000000000000000000000000000000002e401                000000000000000000000000000000000000000000000000000000000000002f402            "403		),404	);405}406407#[test]408fn encode_decode_tuple0_tuple1_uint8_tuple1_uint8() {409	test_impl::<((u8,), (u8,))>(410		0xdeadbeef,411		((43,), (44,)),412		&hex!(413			"414                deadbeef415                000000000000000000000000000000000000000000000000000000000000002b416                000000000000000000000000000000000000000000000000000000000000002c417            "418		),419	);420}421422#[test]423fn encode_decode_tuple0_tuple1_uint8_uint8() {424	test_impl::<((u8, u8),)>(425		0xdeadbeef,426		((43, 44),),427		&hex!(428			"429                deadbeef430                000000000000000000000000000000000000000000000000000000000000002b431                000000000000000000000000000000000000000000000000000000000000002c432            "433		),434	);435}436437#[test]438fn encode_decode_tuple_uint8_uint8() {439	test_impl::<(u8, u8)>(440		0xdeadbeef,441		(43, 44),442		&hex!(443			"444                deadbeef445                000000000000000000000000000000000000000000000000000000000000002b446                000000000000000000000000000000000000000000000000000000000000002c447            "448		),449	);450}451452#[test]453fn encode_decode_tuple0_tuple1_uint8_uint8_tuple1_uint8_uint8_and_uint8() {454	test_impl::<((u8, u8), (u8, u8), u8)>(455		0xdeadbeef,456		((10, 11), (12, 13), 14),457		&hex!(458			"459                deadbeef460                000000000000000000000000000000000000000000000000000000000000000a461                000000000000000000000000000000000000000000000000000000000000000b462                000000000000000000000000000000000000000000000000000000000000000c463                000000000000000000000000000000000000000000000000000000000000000d464                000000000000000000000000000000000000000000000000000000000000000e465            "466		),467	);468}469470#[test]471fn encode_decode_tuple0_tuple1_string() {472	test_impl::<((String,),)>(473		0xdeadbeef,474		(("some string".to_string(),),),475		&hex!(476			"477                deadbeef478                0000000000000000000000000000000000000000000000000000000000000020479                0000000000000000000000000000000000000000000000000000000000000020480                0000000000000000000000000000000000000000000000000000000000000020481                000000000000000000000000000000000000000000000000000000000000000b482                736f6d6520737472696e67000000000000000000000000000000000000000000483            "484		),485	);486}487488#[test]489fn encode_decode_tuple0_tuple1_uint8_string() {490	test_impl::<((u8, String),)>(491		0xdeadbeef,492		((0xff, "some string".to_string()),),493		&hex!(494			"495                deadbeef496                0000000000000000000000000000000000000000000000000000000000000020497                0000000000000000000000000000000000000000000000000000000000000020498                00000000000000000000000000000000000000000000000000000000000000ff499                0000000000000000000000000000000000000000000000000000000000000040500                000000000000000000000000000000000000000000000000000000000000000b501                736f6d6520737472696e67000000000000000000000000000000000000000000502            "503		),504	);505}506507#[test]508fn encode_decode_tuple0_tuple1_string_bytes() {509	test_impl::<((String, bytes),)>(510		0xdeadbeef,511		(("some string".to_string(), bytes(vec![1, 2, 3])),),512		&hex!(513			"514                deadbeef515                0000000000000000000000000000000000000000000000000000000000000020516                0000000000000000000000000000000000000000000000000000000000000020517                0000000000000000000000000000000000000000000000000000000000000040518                0000000000000000000000000000000000000000000000000000000000000080519                000000000000000000000000000000000000000000000000000000000000000b520                736f6d6520737472696e67000000000000000000000000000000000000000000521                0000000000000000000000000000000000000000000000000000000000000003522                0102030000000000000000000000000000000000000000000000000000000000523            "524		),525	);526}527528#[test]529fn encode_decode_tuple0_tuple1_uint8_tuple1_string() {530	test_impl::<((u8,), (String,))>(531		0xdeadbeef,532		((0xff,), ("some string".to_string(),)),533		&hex!(534			"535                deadbeef536                0000000000000000000000000000000000000000000000000000000000000020537                00000000000000000000000000000000000000000000000000000000000000ff538                0000000000000000000000000000000000000000000000000000000000000040539                0000000000000000000000000000000000000000000000000000000000000020540                000000000000000000000000000000000000000000000000000000000000000b541                736f6d6520737472696e67000000000000000000000000000000000000000000542            "543		),544	);545}546547#[test]548fn parse_multiple_params() {549	let encoded_data = hex!(550		"551            deadbeef552            000000000000000000000000000000000000000000000000000000000000000a553            000000000000000000000000000000000000000000000000000000000000000b554        "555	);556	let (_, mut decoder) = AbiReader::new_call(&encoded_data).unwrap();557	let p1 = <u8>::abi_read(&mut decoder).unwrap();558	let p2 = <u8>::abi_read(&mut decoder).unwrap();559	assert_eq!(p1, 0x0a);560	assert_eq!(p2, 0x0b);561}
after · crates/evm-coder/src/abi/test.rs
1use crate::{2	abi::{AbiRead, AbiWrite},3	types::*,4};56use super::{AbiReader, AbiWriter};7use hex_literal::hex;8use primitive_types::{H160, U256};910fn test_impl<T>(function_identifier: u32, decoded_data: T, encoded_data: &[u8])11where12	T: AbiWrite + AbiRead + std::cmp::PartialEq + std::fmt::Debug,13{14	let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap();15	assert_eq!(call, u32::to_be_bytes(function_identifier));16	let data = <T>::abi_read(&mut decoder).unwrap();17	assert_eq!(data, decoded_data);1819	let mut writer = AbiWriter::new_call(function_identifier);20	decoded_data.abi_write(&mut writer);21	let ed = writer.finish();22	similar_asserts::assert_eq!(encoded_data, ed.as_slice());23}2425macro_rules! test_impl_uint {26	($type:ident) => {27		test_impl::<$type>(28			0xdeadbeef,29			255 as $type,30			&hex!(31				"32                    deadbeef33                    00000000000000000000000000000000000000000000000000000000000000ff34                "35			),36		);37	};38}3940#[test]41fn encode_decode_uint8() {42	test_impl_uint!(uint8);43}4445#[test]46fn encode_decode_uint32() {47	test_impl_uint!(uint32);48}4950#[test]51fn encode_decode_uint64() {52	test_impl_uint!(uint64);53}5455#[test]56fn encode_decode_uint128() {57	test_impl_uint!(uint128);58}5960#[test]61fn encode_decode_bool_true() {62	test_impl::<bool>(63		0xdeadbeef,64		true,65		&hex!(66			"67                deadbeef68                000000000000000000000000000000000000000000000000000000000000000169            "70		),71	);72}7374#[test]75fn encode_decode_bool_false() {76	test_impl::<bool>(77		0xdeadbeef,78		false,79		&hex!(80			"81                deadbeef82                000000000000000000000000000000000000000000000000000000000000000083            "84		),85	);86}8788#[test]89fn encode_decode_uint256() {90	test_impl::<uint256>(91		0xdeadbeef,92		U256([255, 0, 0, 0]),93		&hex!(94			"95                deadbeef96                00000000000000000000000000000000000000000000000000000000000000ff97            "98		),99	);100}101102#[test]103fn encode_decode_string() {104	test_impl::<String>(105		0xdeadbeef,106		"some string".to_string(),107		&hex!(108			"109                deadbeef110                0000000000000000000000000000000000000000000000000000000000000020111                000000000000000000000000000000000000000000000000000000000000000b112                736f6d6520737472696e67000000000000000000000000000000000000000000113            "114		),115	);116}117118#[test]119fn encode_decode_tuple_string() {120	test_impl::<(String,)>(121		0xdeadbeef,122		("some string".to_string(),),123		&hex!(124			"125                deadbeef126                0000000000000000000000000000000000000000000000000000000000000020127                0000000000000000000000000000000000000000000000000000000000000020128                000000000000000000000000000000000000000000000000000000000000000b129                736f6d6520737472696e67000000000000000000000000000000000000000000130            "131		),132	);133}134135#[test]136fn encode_decode_vec_tuple_address_uint256() {137	test_impl::<Vec<(address, uint256)>>(138        0x1ACF2D55,139        vec![140            (141                H160(hex!("2D2FF76104B7BACB2E8F6731D5BFC184EBECDDBC")),142                U256([10, 0, 0, 0]),143            ),144            (145                H160(hex!("AB8E3D9134955566483B11E6825C9223B6737B10")),146                U256([20, 0, 0, 0]),147            ),148            (149                H160(hex!("8C582BDF2953046705FC56F189385255EFC1BE18")),150                U256([30, 0, 0, 0]),151            ),152        ],153        &hex!(154            "155                1ACF2D55156                0000000000000000000000000000000000000000000000000000000000000020 // offset of (address, uint256)[]157                0000000000000000000000000000000000000000000000000000000000000003 // length of (address, uint256)[]158159                0000000000000000000000002D2FF76104B7BACB2E8F6731D5BFC184EBECDDBC // address160                000000000000000000000000000000000000000000000000000000000000000A // uint256161162                000000000000000000000000AB8E3D9134955566483B11E6825C9223B6737B10 // address163                0000000000000000000000000000000000000000000000000000000000000014 // uint256164165                0000000000000000000000008C582BDF2953046705FC56F189385255EFC1BE18 // address166                000000000000000000000000000000000000000000000000000000000000001E // uint256167            "168        )169    );170}171172#[test]173fn encode_decode_vec_tuple_uint8_uint8() {174	test_impl::<Vec<(u8, u8)>>(175		0xdeadbeef,176		vec![(0x0A, 0x0B), (0x0C, 0x0D), (0x0E, 0x0F)],177		&hex!(178			"179                deadbeef180                0000000000000000000000000000000000000000000000000000000000000020181                0000000000000000000000000000000000000000000000000000000000000003182                000000000000000000000000000000000000000000000000000000000000000a183                000000000000000000000000000000000000000000000000000000000000000b184                000000000000000000000000000000000000000000000000000000000000000c185                000000000000000000000000000000000000000000000000000000000000000d186                000000000000000000000000000000000000000000000000000000000000000e187                000000000000000000000000000000000000000000000000000000000000000f188            "189		),190	);191}192193#[test]194fn encode_decode_vec_tuple_uint256_string() {195	test_impl::<Vec<(uint256, string)>>(196        0xdeadbeef,197        vec![198            (1.into(), "Test URI 0".to_string()),199            (11.into(), "Test URI 1".to_string()),200            (12.into(), "Test URI 2".to_string()),201        ],202        &hex!(203            "204                deadbeef205                0000000000000000000000000000000000000000000000000000000000000020 // offset of (uint256, string)[]206                0000000000000000000000000000000000000000000000000000000000000003 // length of (uint256, string)[]207208                0000000000000000000000000000000000000000000000000000000000000060 // offset of first elem209                00000000000000000000000000000000000000000000000000000000000000e0 // offset of second elem210                0000000000000000000000000000000000000000000000000000000000000160 // offset of third elem211212                0000000000000000000000000000000000000000000000000000000000000001 // first token id?   					#60213                0000000000000000000000000000000000000000000000000000000000000040 // offset of string214                000000000000000000000000000000000000000000000000000000000000000a // size of string215                5465737420555249203000000000000000000000000000000000000000000000 // string216217                000000000000000000000000000000000000000000000000000000000000000b // second token id? Why ==11?			#e0218                0000000000000000000000000000000000000000000000000000000000000040 // offset of string219                000000000000000000000000000000000000000000000000000000000000000a // size of string220                5465737420555249203100000000000000000000000000000000000000000000 // string221222                000000000000000000000000000000000000000000000000000000000000000c // third token id?  Why ==12?			#160223                0000000000000000000000000000000000000000000000000000000000000040 // offset of string224                000000000000000000000000000000000000000000000000000000000000000a // size of string225                5465737420555249203200000000000000000000000000000000000000000000 // string226            "227        )228    );229}230231#[test]232fn dynamic_after_static() {233	let mut encoder = AbiWriter::new();234	encoder.bool(&true);235	encoder.string("test");236	let encoded = encoder.finish();237238	let mut encoder = AbiWriter::new();239	encoder.bool(&true);240	// Offset to subresult241	encoder.uint32(&(32 * 2));242	// Len of "test"243	encoder.uint32(&4);244	encoder.write_padright(&[b't', b'e', b's', b't']);245	let alternative_encoded = encoder.finish();246247	assert_eq!(encoded, alternative_encoded);248249	let mut decoder = AbiReader::new(&encoded);250	assert!(decoder.bool().unwrap());251	assert_eq!(decoder.string().unwrap(), "test");252}253254#[test]255fn mint_sample() {256	let (call, mut decoder) = AbiReader::new_call(&hex!(257		"258            50bb4e7f259            000000000000000000000000ad2c0954693c2b5404b7e50967d3481bea432374260            0000000000000000000000000000000000000000000000000000000000000001261            0000000000000000000000000000000000000000000000000000000000000060262            0000000000000000000000000000000000000000000000000000000000000008263            5465737420555249000000000000000000000000000000000000000000000000264        "265	))266	.unwrap();267	assert_eq!(call, u32::to_be_bytes(0x50bb4e7f));268	assert_eq!(269		format!("{:?}", decoder.address().unwrap()),270		"0xad2c0954693c2b5404b7e50967d3481bea432374"271	);272	assert_eq!(decoder.uint32().unwrap(), 1);273	assert_eq!(decoder.string().unwrap(), "Test URI");274}275276#[test]277fn parse_vec_with_dynamic_type() {278	let decoded_data = (279		0x36543006,280		vec![281			(1.into(), "Test URI 0".to_string()),282			(11.into(), "Test URI 1".to_string()),283			(12.into(), "Test URI 2".to_string()),284		],285	);286287	let encoded_data = &hex!(288        "289            36543006290            00000000000000000000000053744e6da587ba10b32a2554d2efdcd985bc27a3 // address291            0000000000000000000000000000000000000000000000000000000000000040 // offset of (uint256, string)[]292            0000000000000000000000000000000000000000000000000000000000000003 // length of (uint256, string)[]293294            0000000000000000000000000000000000000000000000000000000000000060 // offset of first elem295            00000000000000000000000000000000000000000000000000000000000000e0 // offset of second elem296            0000000000000000000000000000000000000000000000000000000000000160 // offset of third elem297298            0000000000000000000000000000000000000000000000000000000000000001 // first token id?   					#60299            0000000000000000000000000000000000000000000000000000000000000040 // offset of string300            000000000000000000000000000000000000000000000000000000000000000a // size of string301            5465737420555249203000000000000000000000000000000000000000000000 // string302303            000000000000000000000000000000000000000000000000000000000000000b // second token id? Why ==11?			#e0304            0000000000000000000000000000000000000000000000000000000000000040 // offset of string305            000000000000000000000000000000000000000000000000000000000000000a // size of string306            5465737420555249203100000000000000000000000000000000000000000000 // string307308            000000000000000000000000000000000000000000000000000000000000000c // third token id?  Why ==12?			#160309            0000000000000000000000000000000000000000000000000000000000000040 // offset of string310            000000000000000000000000000000000000000000000000000000000000000a // size of string311            5465737420555249203200000000000000000000000000000000000000000000 // string312        "313    );314315	let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap();316	assert_eq!(call, u32::to_be_bytes(decoded_data.0));317	let address = decoder.address().unwrap();318	let data = <Vec<(uint256, string)>>::abi_read(&mut decoder).unwrap();319	assert_eq!(data, decoded_data.1);320321	let mut writer = AbiWriter::new_call(decoded_data.0);322	address.abi_write(&mut writer);323	decoded_data.1.abi_write(&mut writer);324	let ed = writer.finish();325	similar_asserts::assert_eq!(encoded_data, ed.as_slice());326}327328#[test]329fn encode_decode_vec_tuple_string_bytes() {330	test_impl::<Vec<(string, bytes)>>(331		0xdeadbeef,332		vec![333			(334				"Test URI 0".to_string(),335				bytes(vec![336					0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,337					0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,338					0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,339					0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,340				]),341			),342			(343				"Test URI 1".to_string(),344				bytes(vec![345					0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,346					0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,347					0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,348					0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,349				]),350			),351			("Test URI 2".to_string(), bytes(vec![0x33, 0x33])),352		],353		&hex!(354			"355                deadbeef356                0000000000000000000000000000000000000000000000000000000000000020357                0000000000000000000000000000000000000000000000000000000000000003358359                0000000000000000000000000000000000000000000000000000000000000060360                0000000000000000000000000000000000000000000000000000000000000140361                0000000000000000000000000000000000000000000000000000000000000220362363                0000000000000000000000000000000000000000000000000000000000000040364                0000000000000000000000000000000000000000000000000000000000000080365                000000000000000000000000000000000000000000000000000000000000000a366                5465737420555249203000000000000000000000000000000000000000000000367                0000000000000000000000000000000000000000000000000000000000000030368                1111111111111111111111111111111111111111111111111111111111111111369                1111111111111111111111111111111100000000000000000000000000000000370371                0000000000000000000000000000000000000000000000000000000000000040372                0000000000000000000000000000000000000000000000000000000000000080373                000000000000000000000000000000000000000000000000000000000000000a374                5465737420555249203100000000000000000000000000000000000000000000375                000000000000000000000000000000000000000000000000000000000000002f376                2222222222222222222222222222222222222222222222222222222222222222377                2222222222222222222222222222220000000000000000000000000000000000378379                0000000000000000000000000000000000000000000000000000000000000040380                0000000000000000000000000000000000000000000000000000000000000080381                000000000000000000000000000000000000000000000000000000000000000a382                5465737420555249203200000000000000000000000000000000000000000000383                0000000000000000000000000000000000000000000000000000000000000002384                3333000000000000000000000000000000000000000000000000000000000000385            "386		),387	);388}389390#[test]391// #[ignore = "reason"]392fn encode_decode_tuple0_tuple1_uint8_tuple1_string_bytes_tuple1_uint8_bytes() {393	let int = 0xff;394	let by = bytes(vec![0x11, 0x22, 0x33]);395	let string = "some string".to_string();396397	test_impl::<((u8,), (String, bytes), (u8, bytes))>(398		0xdeadbeef,399		((int,), (string.clone(), by.clone()), (int, by)),400		&hex!(401			"402                deadbeef403                0000000000000000000000000000000000000000000000000000000000000020404                00000000000000000000000000000000000000000000000000000000000000ff405                0000000000000000000000000000000000000000000000000000000000000060406                0000000000000000000000000000000000000000000000000000000000000120407                0000000000000000000000000000000000000000000000000000000000000040408                0000000000000000000000000000000000000000000000000000000000000080409                000000000000000000000000000000000000000000000000000000000000000b410                736f6d6520737472696e67000000000000000000000000000000000000000000411                0000000000000000000000000000000000000000000000000000000000000003412                1122330000000000000000000000000000000000000000000000000000000000413                00000000000000000000000000000000000000000000000000000000000000ff414                0000000000000000000000000000000000000000000000000000000000000040415                0000000000000000000000000000000000000000000000000000000000000003416                1122330000000000000000000000000000000000000000000000000000000000417            "418		),419	);420}421422#[test]423fn encode_decode_tuple0_tuple1_uint8_tuple1_uint8_uint8_tuple1_uint8_uint8() {424	test_impl::<((u8,), (u8, u8), (u8, u8))>(425		0xdeadbeef,426		((43,), (44, 45), (46, 47)),427		&hex!(428			"429                deadbeef430                000000000000000000000000000000000000000000000000000000000000002b431                000000000000000000000000000000000000000000000000000000000000002c432                000000000000000000000000000000000000000000000000000000000000002d433                000000000000000000000000000000000000000000000000000000000000002e434                000000000000000000000000000000000000000000000000000000000000002f435            "436		),437	);438}439440#[test]441fn encode_decode_tuple0_tuple1_uint8_tuple1_uint8() {442	test_impl::<((u8,), (u8,))>(443		0xdeadbeef,444		((43,), (44,)),445		&hex!(446			"447                deadbeef448                000000000000000000000000000000000000000000000000000000000000002b449                000000000000000000000000000000000000000000000000000000000000002c450            "451		),452	);453}454455#[test]456fn encode_decode_tuple0_tuple1_uint8_uint8() {457	test_impl::<((u8, u8),)>(458		0xdeadbeef,459		((43, 44),),460		&hex!(461			"462                deadbeef463                000000000000000000000000000000000000000000000000000000000000002b464                000000000000000000000000000000000000000000000000000000000000002c465            "466		),467	);468}469470#[test]471fn encode_decode_tuple_uint8_uint8() {472	test_impl::<(u8, u8)>(473		0xdeadbeef,474		(43, 44),475		&hex!(476			"477                deadbeef478                000000000000000000000000000000000000000000000000000000000000002b479                000000000000000000000000000000000000000000000000000000000000002c480            "481		),482	);483}484485#[test]486fn encode_decode_tuple0_tuple1_uint8_uint8_tuple1_uint8_uint8_and_uint8() {487	test_impl::<((u8, u8), (u8, u8), u8)>(488		0xdeadbeef,489		((10, 11), (12, 13), 14),490		&hex!(491			"492                deadbeef493                000000000000000000000000000000000000000000000000000000000000000a494                000000000000000000000000000000000000000000000000000000000000000b495                000000000000000000000000000000000000000000000000000000000000000c496                000000000000000000000000000000000000000000000000000000000000000d497                000000000000000000000000000000000000000000000000000000000000000e498            "499		),500	);501}502503#[test]504fn encode_decode_tuple0_tuple1_string() {505	test_impl::<((String,),)>(506		0xdeadbeef,507		(("some string".to_string(),),),508		&hex!(509			"510                deadbeef511                0000000000000000000000000000000000000000000000000000000000000020512                0000000000000000000000000000000000000000000000000000000000000020513                0000000000000000000000000000000000000000000000000000000000000020514                000000000000000000000000000000000000000000000000000000000000000b515                736f6d6520737472696e67000000000000000000000000000000000000000000516            "517		),518	);519}520521#[test]522fn encode_decode_tuple0_tuple1_uint8_string() {523	test_impl::<((u8, String),)>(524		0xdeadbeef,525		((0xff, "some string".to_string()),),526		&hex!(527			"528                deadbeef529                0000000000000000000000000000000000000000000000000000000000000020530                0000000000000000000000000000000000000000000000000000000000000020531                00000000000000000000000000000000000000000000000000000000000000ff532                0000000000000000000000000000000000000000000000000000000000000040533                000000000000000000000000000000000000000000000000000000000000000b534                736f6d6520737472696e67000000000000000000000000000000000000000000535            "536		),537	);538}539540#[test]541fn encode_decode_tuple0_tuple1_string_bytes() {542	test_impl::<((String, bytes),)>(543		0xdeadbeef,544		(("some string".to_string(), bytes(vec![1, 2, 3])),),545		&hex!(546			"547                deadbeef548                0000000000000000000000000000000000000000000000000000000000000020549                0000000000000000000000000000000000000000000000000000000000000020550                0000000000000000000000000000000000000000000000000000000000000040551                0000000000000000000000000000000000000000000000000000000000000080552                000000000000000000000000000000000000000000000000000000000000000b553                736f6d6520737472696e67000000000000000000000000000000000000000000554                0000000000000000000000000000000000000000000000000000000000000003555                0102030000000000000000000000000000000000000000000000000000000000556            "557		),558	);559}560561#[test]562fn encode_decode_tuple0_tuple1_uint8_tuple1_string() {563	test_impl::<((u8,), (String,))>(564		0xdeadbeef,565		((0xff,), ("some string".to_string(),)),566		&hex!(567			"568                deadbeef569                0000000000000000000000000000000000000000000000000000000000000020570                00000000000000000000000000000000000000000000000000000000000000ff571                0000000000000000000000000000000000000000000000000000000000000040572                0000000000000000000000000000000000000000000000000000000000000020573                000000000000000000000000000000000000000000000000000000000000000b574                736f6d6520737472696e67000000000000000000000000000000000000000000575            "576		),577	);578}579580#[test]581fn parse_multiple_params() {582	let encoded_data = hex!(583		"584            deadbeef585            000000000000000000000000000000000000000000000000000000000000000a586            000000000000000000000000000000000000000000000000000000000000000b587        "588	);589	let (_, mut decoder) = AbiReader::new_call(&encoded_data).unwrap();590	let p1 = <u8>::abi_read(&mut decoder).unwrap();591	let p2 = <u8>::abi_read(&mut decoder).unwrap();592	assert_eq!(p1, 0x0a);593	assert_eq!(p2, 0x0b);594}