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 208 encoder.uint32(&(32 * 2));209 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]358359fn 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_string() {454 test_impl::<((String,),)>(455 0xdeadbeef,456 (("some string".to_string(),),),457 &hex!(458 "459 deadbeef460 0000000000000000000000000000000000000000000000000000000000000020461 0000000000000000000000000000000000000000000000000000000000000020462 0000000000000000000000000000000000000000000000000000000000000020463 000000000000000000000000000000000000000000000000000000000000000b464 736f6d6520737472696e67000000000000000000000000000000000000000000465 "466 ),467 );468}469470#[test]471fn encode_decode_tuple0_tuple1_uint8_string() {472 test_impl::<((u8, String),)>(473 0xdeadbeef,474 ((0xff, "some string".to_string()),),475 &hex!(476 "477 deadbeef478 0000000000000000000000000000000000000000000000000000000000000020479 0000000000000000000000000000000000000000000000000000000000000020480 00000000000000000000000000000000000000000000000000000000000000ff481 0000000000000000000000000000000000000000000000000000000000000040482 000000000000000000000000000000000000000000000000000000000000000b483 736f6d6520737472696e67000000000000000000000000000000000000000000484 "485 ),486 );487}488489#[test]490fn encode_decode_tuple0_tuple1_string_bytes() {491 test_impl::<((String, bytes),)>(492 0xdeadbeef,493 (("some string".to_string(), bytes(vec![1, 2, 3])),),494 &hex!(495 "496 deadbeef497 0000000000000000000000000000000000000000000000000000000000000020498 0000000000000000000000000000000000000000000000000000000000000020499 0000000000000000000000000000000000000000000000000000000000000040500 0000000000000000000000000000000000000000000000000000000000000080501 000000000000000000000000000000000000000000000000000000000000000b502 736f6d6520737472696e67000000000000000000000000000000000000000000503 0000000000000000000000000000000000000000000000000000000000000003504 0102030000000000000000000000000000000000000000000000000000000000505 "506 ),507 );508}509510#[test]511fn encode_decode_tuple0_tuple1_uint8_tuple1_string() {512 test_impl::<((u8,), (String,))>(513 0xdeadbeef,514 ((0xff,), ("some string".to_string(),)),515 &hex!(516 "517 deadbeef518 0000000000000000000000000000000000000000000000000000000000000020519 00000000000000000000000000000000000000000000000000000000000000ff520 0000000000000000000000000000000000000000000000000000000000000040521 0000000000000000000000000000000000000000000000000000000000000020522 000000000000000000000000000000000000000000000000000000000000000b523 736f6d6520737472696e67000000000000000000000000000000000000000000524 "525 ),526 );527}