From 8d0715a6c090e0fd08d6d65274608e674bfb5b2c Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Mon, 13 May 2024 12:36:11 +0300 Subject: [PATCH 1/2] implement from conversion for MultiValueN --- .../feature-tests/scenario-tester/src/lib.rs | 11 ++++ .../src/scenario_tester_proxy.rs | 28 +++++++++++ .../scenario-tester/tests/st_blackbox_test.rs | 17 +++++++ .../scenario-tester/wasm/src/lib.rs | 6 ++- .../base/src/abi/type_abi_impl_codec_multi.rs | 50 +++++++++---------- 5 files changed, 85 insertions(+), 27 deletions(-) diff --git a/contracts/feature-tests/scenario-tester/src/lib.rs b/contracts/feature-tests/scenario-tester/src/lib.rs index 015b3e82c2..5b2365a741 100644 --- a/contracts/feature-tests/scenario-tester/src/lib.rs +++ b/contracts/feature-tests/scenario-tester/src/lib.rs @@ -27,4 +27,15 @@ pub trait ScenarioTester { fn add(&self, value: BigUint) { self.sum().update(|sum| *sum += value); } + + /// Tests "from" conversion for MultiValueN parameters + #[endpoint] + fn multi_param(&self, _value: MultiValue2) {} + + /// Tests "from" conversion for MultiValueN return function + #[endpoint] + fn multi_return(&self, value: BigUint) -> MultiValue2 { + let value1 = value.clone().add(1u32); + (value, value1).into() + } } diff --git a/contracts/feature-tests/scenario-tester/src/scenario_tester_proxy.rs b/contracts/feature-tests/scenario-tester/src/scenario_tester_proxy.rs index 3de83d499d..66976893c2 100644 --- a/contracts/feature-tests/scenario-tester/src/scenario_tester_proxy.rs +++ b/contracts/feature-tests/scenario-tester/src/scenario_tester_proxy.rs @@ -111,4 +111,32 @@ where .argument(&value) .original_result() } + + /// Tests "from" conversion for MultiValueN parameters + pub fn multi_param< + Arg0: ProxyArg, BigUint>>, + >( + self, + _value: Arg0, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("multi_param") + .argument(&_value) + .original_result() + } + + /// Tests "from" conversion for MultiValueN return function + pub fn multi_return< + Arg0: ProxyArg>, + >( + self, + value: Arg0, + ) -> TxTypedCall, BigUint>> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("multi_return") + .argument(&value) + .original_result() + } } diff --git a/contracts/feature-tests/scenario-tester/tests/st_blackbox_test.rs b/contracts/feature-tests/scenario-tester/tests/st_blackbox_test.rs index 20ff801864..90721fbd0d 100644 --- a/contracts/feature-tests/scenario-tester/tests/st_blackbox_test.rs +++ b/contracts/feature-tests/scenario-tester/tests/st_blackbox_test.rs @@ -95,6 +95,23 @@ fn st_blackbox() { .add(1u32) .run(); + world + .tx() + .from(OTHER_ADDRESS) + .to(ST_ADDRESS) + .typed(scenario_tester_proxy::ScenarioTesterProxy) + .multi_param(MultiValue2((1u32, 1u16))) + .run(); + + world + .tx() + .from(OTHER_ADDRESS) + .to(ST_ADDRESS) + .typed(scenario_tester_proxy::ScenarioTesterProxy) + .multi_return(1u32) + .returns(ExpectValue(MultiValue2((1u32, 2u32)))) + .run(); + world.write_scenario_trace("trace1.scen.json"); } diff --git a/contracts/feature-tests/scenario-tester/wasm/src/lib.rs b/contracts/feature-tests/scenario-tester/wasm/src/lib.rs index 28922bb61e..7976698233 100644 --- a/contracts/feature-tests/scenario-tester/wasm/src/lib.rs +++ b/contracts/feature-tests/scenario-tester/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 2 +// Endpoints: 4 // Async Callback (empty): 1 -// Total number of exported functions: 5 +// Total number of exported functions: 7 #![no_std] @@ -22,6 +22,8 @@ multiversx_sc_wasm_adapter::endpoints! { upgrade => upgrade getSum => sum add => add + multi_param => multi_param + multi_return => multi_return ) } diff --git a/framework/base/src/abi/type_abi_impl_codec_multi.rs b/framework/base/src/abi/type_abi_impl_codec_multi.rs index 4fc42f37a6..fa27b98670 100644 --- a/framework/base/src/abi/type_abi_impl_codec_multi.rs +++ b/framework/base/src/abi/type_abi_impl_codec_multi.rs @@ -75,16 +75,16 @@ impl TypeAbi for OptionalValue { } macro_rules! multi_arg_impls { - ($(($mval_struct:ident $($n:tt $name:ident)+) )+) => { + ($(($mval_struct:ident $($n:tt $t:ident $u:ident)+) )+) => { $( - impl<$($name),+ > TypeAbiFrom for crate::codec::multi_types::$mval_struct<$($name,)+> + impl<$($t, $u),+ > TypeAbiFrom> for crate::codec::multi_types::$mval_struct<$($t,)+> where - $($name: TypeAbi,)+ + $($t: TypeAbiFrom<$u>,)+ {} - impl<$($name),+ > TypeAbi for crate::codec::multi_types::$mval_struct<$($name,)+> + impl<$($t),+ > TypeAbi for crate::codec::multi_types::$mval_struct<$($t,)+> where - $($name: TypeAbi,)+ + $($t: TypeAbi,)+ { type Unmanaged = Self; @@ -95,7 +95,7 @@ macro_rules! multi_arg_impls { if $n > 0 { repr.push(','); } - repr.push_str($name::type_name().as_str()); + repr.push_str($t::type_name().as_str()); )+ repr.push('>'); repr @@ -108,7 +108,7 @@ macro_rules! multi_arg_impls { if $n > 0 { repr.push_str(", "); } - repr.push_str($name::type_name_rust().as_str()); + repr.push_str($t::type_name_rust().as_str()); )+ repr.push('>'); repr @@ -116,7 +116,7 @@ macro_rules! multi_arg_impls { fn provide_type_descriptions(accumulator: &mut TDC) { $( - $name::provide_type_descriptions(accumulator); + $t::provide_type_descriptions(accumulator); )+ } @@ -128,10 +128,10 @@ macro_rules! multi_arg_impls { let mut result = OutputAbis::new(); $( if output_names.len() > $n { - result.append(&mut $name::output_abis(&[output_names[$n]])); + result.append(&mut $t::output_abis(&[output_names[$n]])); } else { - result.append(&mut $name::output_abis(&[])); + result.append(&mut $t::output_abis(&[])); } )+ @@ -143,19 +143,19 @@ macro_rules! multi_arg_impls { } multi_arg_impls! { - (MultiValue2 0 T0 1 T1) - (MultiValue3 0 T0 1 T1 2 T2) - (MultiValue4 0 T0 1 T1 2 T2 3 T3) - (MultiValue5 0 T0 1 T1 2 T2 3 T3 4 T4) - (MultiValue6 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5) - (MultiValue7 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6) - (MultiValue8 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7) - (MultiValue9 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8) - (MultiValue10 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9) - (MultiValue11 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10) - (MultiValue12 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11) - (MultiValue13 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12) - (MultiValue14 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13) - (MultiValue15 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14) - (MultiValue16 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15) + (MultiValue2 0 T0 U0 1 T1 U1) + (MultiValue3 0 T0 U0 1 T1 U1 2 T2 U2) + (MultiValue4 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3) + (MultiValue5 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4) + (MultiValue6 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5) + (MultiValue7 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5 6 T6 U6) + (MultiValue8 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5 6 T6 U6 7 T7 U7) + (MultiValue9 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5 6 T6 U6 7 T7 U7 8 T8 U8) + (MultiValue10 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5 6 T6 U6 7 T7 U7 8 T8 U8 9 T9 U9) + (MultiValue11 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5 6 T6 U6 7 T7 U7 8 T8 U8 9 T9 U9 10 T10 U10) + (MultiValue12 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5 6 T6 U6 7 T7 U7 8 T8 U8 9 T9 U9 10 T10 U10 11 T11 U11) + (MultiValue13 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5 6 T6 U6 7 T7 U7 8 T8 U8 9 T9 U9 10 T10 U10 11 T11 U11 12 T12 U12) + (MultiValue14 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5 6 T6 U6 7 T7 U7 8 T8 U8 9 T9 U9 10 T10 U10 11 T11 U11 12 T12 U12 13 T13 U13) + (MultiValue15 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5 6 T6 U6 7 T7 U7 8 T8 U8 9 T9 U9 10 T10 U10 11 T11 U11 12 T12 U12 13 T13 U13 14 T14 U14) + (MultiValue16 0 T0 U0 1 T1 U1 2 T2 U2 3 T3 U3 4 T4 U4 5 T5 U5 6 T6 U6 7 T7 U7 8 T8 U8 9 T9 U9 10 T10 U10 11 T11 U11 12 T12 U12 13 T13 U13 14 T14 U14 15 T15 U15) } From c1299d0f7ab1d1892ae96a3fcf0748660d3bbb67 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Mon, 13 May 2024 20:27:13 +0300 Subject: [PATCH 2/2] add changes from review - unmanaged type --- contracts/feature-tests/scenario-tester/src/lib.rs | 4 ++-- .../scenario-tester/tests/st_blackbox_test.rs | 13 +++++++++++++ framework/base/src/abi/type_abi_impl_codec_multi.rs | 6 +++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/contracts/feature-tests/scenario-tester/src/lib.rs b/contracts/feature-tests/scenario-tester/src/lib.rs index 5b2365a741..97c352adeb 100644 --- a/contracts/feature-tests/scenario-tester/src/lib.rs +++ b/contracts/feature-tests/scenario-tester/src/lib.rs @@ -35,7 +35,7 @@ pub trait ScenarioTester { /// Tests "from" conversion for MultiValueN return function #[endpoint] fn multi_return(&self, value: BigUint) -> MultiValue2 { - let value1 = value.clone().add(1u32); - (value, value1).into() + let value_plus_one = &value + 1u32; + (value, value_plus_one).into() } } diff --git a/contracts/feature-tests/scenario-tester/tests/st_blackbox_test.rs b/contracts/feature-tests/scenario-tester/tests/st_blackbox_test.rs index 90721fbd0d..e4ab2b4b4d 100644 --- a/contracts/feature-tests/scenario-tester/tests/st_blackbox_test.rs +++ b/contracts/feature-tests/scenario-tester/tests/st_blackbox_test.rs @@ -112,6 +112,19 @@ fn st_blackbox() { .returns(ExpectValue(MultiValue2((1u32, 2u32)))) .run(); + let value = world + .tx() + .from(OTHER_ADDRESS) + .to(ST_ADDRESS) + .typed(scenario_tester_proxy::ScenarioTesterProxy) + .multi_return(1u32) + .returns(ReturnsResultUnmanaged) + .run(); + assert_eq!( + value, + MultiValue2((RustBigUint::from(1u32), RustBigUint::from(2u32))) + ); + world.write_scenario_trace("trace1.scen.json"); } diff --git a/framework/base/src/abi/type_abi_impl_codec_multi.rs b/framework/base/src/abi/type_abi_impl_codec_multi.rs index fa27b98670..6b1cf9ab72 100644 --- a/framework/base/src/abi/type_abi_impl_codec_multi.rs +++ b/framework/base/src/abi/type_abi_impl_codec_multi.rs @@ -77,16 +77,16 @@ impl TypeAbi for OptionalValue { macro_rules! multi_arg_impls { ($(($mval_struct:ident $($n:tt $t:ident $u:ident)+) )+) => { $( - impl<$($t, $u),+ > TypeAbiFrom> for crate::codec::multi_types::$mval_struct<$($t,)+> + impl<$($t, $u),+> TypeAbiFrom> for crate::codec::multi_types::$mval_struct<$($t,)+> where $($t: TypeAbiFrom<$u>,)+ {} - impl<$($t),+ > TypeAbi for crate::codec::multi_types::$mval_struct<$($t,)+> + impl<$($t),+> TypeAbi for crate::codec::multi_types::$mval_struct<$($t,)+> where $($t: TypeAbi,)+ { - type Unmanaged = Self; + type Unmanaged = crate::codec::multi_types::$mval_struct<$($t::Unmanaged,)+>; fn type_name() -> TypeName { let mut repr = TypeName::from("multi");