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

difftreelog

fix solidity param parser

Trubnikov Sergey2022-11-17parent: #2bb7a04.patch.diff
in: master

4 files changed

modifiedcrates/evm-coder/procedural/src/solidity_interface.rsdiffbeforeafterboth
404 let name = &self.name;404 let name = &self.name;
405 let ty = &self.ty;405 let ty = &self.ty;
406 quote! {406 quote! {
407 #name: <#ty>::abi_read(reader)?407 #name: {
408 let value = <#ty as ::evm_coder::abi::AbiRead>::abi_read(reader)?;
409 if !is_dynamic {reader.seek(<#ty as ::evm_coder::abi::AbiType>::size())};
410 value
411 }
408 }412 }
409 }413 }
410414
630 let pascal_name = &self.pascal_name;634 let pascal_name = &self.pascal_name;
631 let screaming_name = &self.screaming_name;635 let screaming_name = &self.screaming_name;
632 if self.has_normal_args {636 if self.has_normal_args {
633 let parsers = self637 let args_iter = self.args.iter().filter(|a| !a.is_special());
634 .args638 let arg_type = args_iter.clone().map(|a| &a.ty);
635 .iter()
636 .filter(|a| !a.is_special())
637 .map(|a| a.expand_parse());639 let parsers = args_iter.map(|a| a.expand_parse());
638 quote! {640 quote! {
639 Self::#screaming_name => return Ok(Some(Self::#pascal_name {641 Self::#screaming_name => {
642 let is_dynamic = false #(|| <#arg_type as ::evm_coder::abi::AbiType>::is_dynamic())*;
643 return Ok(Some(Self::#pascal_name {
640 #(644 #(
641 #parsers,645 #parsers,
642 )*646 )*
643 }))647 }))
648 }
644 }649 }
645 } else {650 } else {
646 quote! { Self::#screaming_name => return Ok(Some(Self::#pascal_name)) }651 quote! { Self::#screaming_name => return Ok(Some(Self::#pascal_name)) }
modifiedcrates/evm-coder/src/abi/impls.rsdiffbeforeafterboth
262262
263 impl<$($ident),+> AbiRead for ($($ident,)+)263 impl<$($ident),+> AbiRead for ($($ident,)+)
264 where264 where
265 Self: AbiType,
265 $($ident: AbiRead + AbiType,)+266 $($ident: AbiRead + AbiType,)+
266 ($($ident,)+): AbiType,
267 {267 {
268 fn abi_read(reader: &mut AbiReader) -> Result<($($ident,)+)> {268 fn abi_read(reader: &mut AbiReader) -> Result<($($ident,)+)> {
269 let is_dynamic = <($($ident,)+)>::is_dynamic();269 let is_dynamic = <Self>::is_dynamic();
270 let size = if !is_dynamic { Some(<($($ident,)+)>::size()) } else { None };270 let size = if !is_dynamic { Some(<Self>::size()) } else { None };
271 let mut subresult = reader.subresult(size)?;271 let mut subresult = reader.subresult(size)?;
272 Ok((272 Ok((
273 $({273 $({
modifiedcrates/evm-coder/src/abi/test.rsdiffbeforeafterboth
449 );449 );
450}450}
451
452#[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 deadbeef
460 000000000000000000000000000000000000000000000000000000000000000a
461 000000000000000000000000000000000000000000000000000000000000000b
462 000000000000000000000000000000000000000000000000000000000000000c
463 000000000000000000000000000000000000000000000000000000000000000d
464 000000000000000000000000000000000000000000000000000000000000000e
465 "
466 ),
467 );
468}
451469
452#[test]470#[test]
453fn encode_decode_tuple0_tuple1_string() {471fn encode_decode_tuple0_tuple1_string() {
526 );544 );
527}545}
546
547#[test]
548fn parse_multiple_params() {
549 let encoded_data = hex!(
550 "
551 deadbeef
552 000000000000000000000000000000000000000000000000000000000000000a
553 000000000000000000000000000000000000000000000000000000000000000b
554 "
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}
528562
modifiedcrates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth
620 );620 );
621}621}
622
623#[derive(AbiCoder, PartialEq, Debug)]
624struct TypeStruct2SimpleStruct1Simple {
625 _a: TypeStruct2SimpleParam,
626 _b: TypeStruct2SimpleParam,
627 _c: u8,
628}
629#[derive(AbiCoder, PartialEq, Debug)]
630struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);
631
632#[test]
633fn codec_struct_2_struct_simple_1_simple() {
634 let _a = 0xff;
635 let _b = 0xbeefbaba;
636 test_impl::<
637 ((u8, u32), (u8, u32), u8),
638 TupleStruct2SimpleStruct1Simple,
639 TypeStruct2SimpleStruct1Simple,
640 >(
641 ((_a, _b), (_a, _b), _a),
642 TupleStruct2SimpleStruct1Simple(
643 TupleStruct2SimpleParam(_a, _b),
644 TupleStruct2SimpleParam(_a, _b),
645 _a,
646 ),
647 TypeStruct2SimpleStruct1Simple {
648 _a: TypeStruct2SimpleParam { _a, _b },
649 _b: TypeStruct2SimpleParam { _a, _b },
650 _c: _a,
651 },
652 );
653}
622654