difftreelog
refactor Abi impls
in: master
5 files changed
crates/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
};
)*
crates/evm-coder/procedural/src/solidity_interface.rsdiffbeforeafterboth--- a/crates/evm-coder/procedural/src/solidity_interface.rs
+++ b/crates/evm-coder/procedural/src/solidity_interface.rs
@@ -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
}
}
crates/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
},)+
))
crates/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))
crates/evm-coder/src/abi/test.rsdiffbeforeafterboth1use 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}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}