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_uint256_string() {141 test_impl::<Vec<(uint256, string)>>(142 0xdeadbeef,143 vec![144 (1.into(), "Test URI 0".to_string()),145 (11.into(), "Test URI 1".to_string()),146 (12.into(), "Test URI 2".to_string()),147 ],148 &hex!(149 "150 deadbeef151 0000000000000000000000000000000000000000000000000000000000000020 // offset of (uint256, string)[]152 0000000000000000000000000000000000000000000000000000000000000003 // length of (uint256, string)[]153154 0000000000000000000000000000000000000000000000000000000000000060 // offset of first elem155 00000000000000000000000000000000000000000000000000000000000000e0 // offset of second elem156 0000000000000000000000000000000000000000000000000000000000000160 // offset of third elem157158 0000000000000000000000000000000000000000000000000000000000000001 // first token id? #60159 0000000000000000000000000000000000000000000000000000000000000040 // offset of string160 000000000000000000000000000000000000000000000000000000000000000a // size of string161 5465737420555249203000000000000000000000000000000000000000000000 // string162163 000000000000000000000000000000000000000000000000000000000000000b // second token id? Why ==11? #e0164 0000000000000000000000000000000000000000000000000000000000000040 // offset of string165 000000000000000000000000000000000000000000000000000000000000000a // size of string166 5465737420555249203100000000000000000000000000000000000000000000 // string167168 000000000000000000000000000000000000000000000000000000000000000c // third token id? Why ==12? #160169 0000000000000000000000000000000000000000000000000000000000000040 // offset of string170 000000000000000000000000000000000000000000000000000000000000000a // size of string171 5465737420555249203200000000000000000000000000000000000000000000 // string172 "173 )174 );175}176177#[test]178fn dynamic_after_static() {179 let mut encoder = AbiWriter::new();180 encoder.bool(&true);181 encoder.string("test");182 let encoded = encoder.finish();183184 let mut encoder = AbiWriter::new();185 encoder.bool(&true);186 187 encoder.uint32(&(32 * 2));188 189 encoder.uint32(&4);190 encoder.write_padright(&[b't', b'e', b's', b't']);191 let alternative_encoded = encoder.finish();192193 assert_eq!(encoded, alternative_encoded);194195 let mut decoder = AbiReader::new(&encoded);196 assert!(decoder.bool().unwrap());197 assert_eq!(decoder.string().unwrap(), "test");198}199200#[test]201fn mint_sample() {202 let (call, mut decoder) = AbiReader::new_call(&hex!(203 "204 50bb4e7f205 000000000000000000000000ad2c0954693c2b5404b7e50967d3481bea432374206 0000000000000000000000000000000000000000000000000000000000000001207 0000000000000000000000000000000000000000000000000000000000000060208 0000000000000000000000000000000000000000000000000000000000000008209 5465737420555249000000000000000000000000000000000000000000000000210 "211 ))212 .unwrap();213 assert_eq!(call, u32::to_be_bytes(0x50bb4e7f));214 assert_eq!(215 format!("{:?}", decoder.address().unwrap()),216 "0xad2c0954693c2b5404b7e50967d3481bea432374"217 );218 assert_eq!(decoder.uint32().unwrap(), 1);219 assert_eq!(decoder.string().unwrap(), "Test URI");220}221222#[test]223fn parse_vec_with_dynamic_type() {224 let decoded_data = (225 0x36543006,226 vec![227 (1.into(), "Test URI 0".to_string()),228 (11.into(), "Test URI 1".to_string()),229 (12.into(), "Test URI 2".to_string()),230 ],231 );232233 let encoded_data = &hex!(234 "235 36543006236 00000000000000000000000053744e6da587ba10b32a2554d2efdcd985bc27a3 // address237 0000000000000000000000000000000000000000000000000000000000000040 // offset of (uint256, string)[]238 0000000000000000000000000000000000000000000000000000000000000003 // length of (uint256, string)[]239240 0000000000000000000000000000000000000000000000000000000000000060 // offset of first elem241 00000000000000000000000000000000000000000000000000000000000000e0 // offset of second elem242 0000000000000000000000000000000000000000000000000000000000000160 // offset of third elem243244 0000000000000000000000000000000000000000000000000000000000000001 // first token id? #60245 0000000000000000000000000000000000000000000000000000000000000040 // offset of string246 000000000000000000000000000000000000000000000000000000000000000a // size of string247 5465737420555249203000000000000000000000000000000000000000000000 // string248249 000000000000000000000000000000000000000000000000000000000000000b // second token id? Why ==11? #e0250 0000000000000000000000000000000000000000000000000000000000000040 // offset of string251 000000000000000000000000000000000000000000000000000000000000000a // size of string252 5465737420555249203100000000000000000000000000000000000000000000 // string253254 000000000000000000000000000000000000000000000000000000000000000c // third token id? Why ==12? #160255 0000000000000000000000000000000000000000000000000000000000000040 // offset of string256 000000000000000000000000000000000000000000000000000000000000000a // size of string257 5465737420555249203200000000000000000000000000000000000000000000 // string258 "259 );260261 let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap();262 assert_eq!(call, u32::to_be_bytes(decoded_data.0));263 let address = decoder.address().unwrap();264 let data = <Vec<(uint256, string)>>::abi_read(&mut decoder).unwrap();265 assert_eq!(data, decoded_data.1);266267 let mut writer = AbiWriter::new_call(decoded_data.0);268 address.abi_write(&mut writer);269 decoded_data.1.abi_write(&mut writer);270 let ed = writer.finish();271 similar_asserts::assert_eq!(encoded_data, ed.as_slice());272}273274#[test]275fn encode_decode_vec_tuple_string_bytes() {276 test_impl::<Vec<(string, bytes)>>(277 0xdeadbeef,278 vec![279 (280 "Test URI 0".to_string(),281 bytes(vec![282 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,283 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,284 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,285 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,286 ]),287 ),288 (289 "Test URI 1".to_string(),290 bytes(vec![291 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,292 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,293 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,294 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,295 ]),296 ),297 ("Test URI 2".to_string(), bytes(vec![0x33, 0x33])),298 ],299 &hex!(300 "301 deadbeef302 0000000000000000000000000000000000000000000000000000000000000020303 0000000000000000000000000000000000000000000000000000000000000003304305 0000000000000000000000000000000000000000000000000000000000000060306 0000000000000000000000000000000000000000000000000000000000000140307 0000000000000000000000000000000000000000000000000000000000000220308309 0000000000000000000000000000000000000000000000000000000000000040310 0000000000000000000000000000000000000000000000000000000000000080311 000000000000000000000000000000000000000000000000000000000000000a312 5465737420555249203000000000000000000000000000000000000000000000313 0000000000000000000000000000000000000000000000000000000000000030314 1111111111111111111111111111111111111111111111111111111111111111315 1111111111111111111111111111111100000000000000000000000000000000316317 0000000000000000000000000000000000000000000000000000000000000040318 0000000000000000000000000000000000000000000000000000000000000080319 000000000000000000000000000000000000000000000000000000000000000a320 5465737420555249203100000000000000000000000000000000000000000000321 000000000000000000000000000000000000000000000000000000000000002f322 2222222222222222222222222222222222222222222222222222222222222222323 2222222222222222222222222222220000000000000000000000000000000000324325 0000000000000000000000000000000000000000000000000000000000000040326 0000000000000000000000000000000000000000000000000000000000000080327 000000000000000000000000000000000000000000000000000000000000000a328 5465737420555249203200000000000000000000000000000000000000000000329 0000000000000000000000000000000000000000000000000000000000000002330 3333000000000000000000000000000000000000000000000000000000000000331 "332 ),333 );334}