From cc6febd2570a2d7bbdb75604abca0fa6b4c9e799 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Thu, 18 Apr 2024 23:07:40 +0300 Subject: [PATCH 1/3] unified syntax - migrate multisig blackbox tests --- contracts/examples/adder/sc-config.toml | 3 + .../tests/crowdfunding_esdt_blackbox_test.rs | 20 +- .../examples/multisig/src/adder_proxy.rs | 110 ++++ .../multisig/tests/multisig_blackbox_test.rs | 578 ++++++++++-------- 4 files changed, 441 insertions(+), 270 deletions(-) create mode 100644 contracts/examples/multisig/src/adder_proxy.rs diff --git a/contracts/examples/adder/sc-config.toml b/contracts/examples/adder/sc-config.toml index b56f82b429..091de3f7f6 100644 --- a/contracts/examples/adder/sc-config.toml +++ b/contracts/examples/adder/sc-config.toml @@ -2,3 +2,6 @@ [[proxy]] path = "src/adder_proxy.rs" + +[[proxy]] +path = "../multisig/src/adder_proxy.rs" diff --git a/contracts/examples/crowdfunding-esdt/tests/crowdfunding_esdt_blackbox_test.rs b/contracts/examples/crowdfunding-esdt/tests/crowdfunding_esdt_blackbox_test.rs index c3a1e383f3..d7b8d616a0 100644 --- a/contracts/examples/crowdfunding-esdt/tests/crowdfunding_esdt_blackbox_test.rs +++ b/contracts/examples/crowdfunding-esdt/tests/crowdfunding_esdt_blackbox_test.rs @@ -1,7 +1,6 @@ use crowdfunding_esdt::crowdfunding_esdt_proxy; use multiversx_sc_scenario::imports::*; -use num_bigint::BigUint; const CF_DEADLINE: u64 = 7 * 24 * 60 * 60; // 1 week in seconds const CF_TOKEN_ID: &[u8] = b"CROWD-123456"; @@ -29,10 +28,9 @@ struct CrowdfundingESDTTestState { impl CrowdfundingESDTTestState { fn new() -> Self { let mut world = world(); - let owner_address: &str = "address:owner"; world - .account(owner_address) + .account(OWNER_ADDRESS) .nonce(1) .account(FIRST_USER_ADDRESS) .nonce(1) @@ -43,7 +41,7 @@ impl CrowdfundingESDTTestState { .esdt_balance(CF_TOKEN_ID_EXPR, "1000"); world.set_state_step(SetStateStep::new().new_address( - owner_address, + OWNER_ADDRESS.eval_to_expr().as_str(), 1, SC_CROWDFUNDING_ESDT_EXPR.eval_to_expr().as_str(), )); @@ -81,29 +79,23 @@ impl CrowdfundingESDTTestState { } fn check_deposit(&mut self, donor: AddressExpr, amount: u64) { - let value = self - .world + self.world .query() .to(SC_CROWDFUNDING_ESDT_EXPR) .typed(crowdfunding_esdt_proxy::CrowdfundingProxy) .deposit(donor.eval_to_array()) - .returns(ReturnsResultConv::::new()) + .returns(ExpectValue(amount)) .run(); - - assert_eq!(value, amount.into()); } fn check_status(&mut self, expected_value: crowdfunding_esdt_proxy::Status) { - let status = self - .world + self.world .query() .to(SC_CROWDFUNDING_ESDT_EXPR) .typed(crowdfunding_esdt_proxy::CrowdfundingProxy) .status() - .returns(ReturnsResult) + .returns(ExpectValue(expected_value)) .run(); - - assert_eq!(status, expected_value); } fn claim(&mut self, address: AddressExpr) { diff --git a/contracts/examples/multisig/src/adder_proxy.rs b/contracts/examples/multisig/src/adder_proxy.rs new file mode 100644 index 0000000000..0b1b663669 --- /dev/null +++ b/contracts/examples/multisig/src/adder_proxy.rs @@ -0,0 +1,110 @@ +// Code generated by the multiversx-sc proxy generator. DO NOT EDIT. + +//////////////////////////////////////////////////// +////////////////// AUTO-GENERATED ////////////////// +//////////////////////////////////////////////////// + +#![allow(dead_code)] +#![allow(clippy::all)] + +use multiversx_sc::proxy_imports::*; + +pub struct AdderProxy; + +impl TxProxyTrait for AdderProxy +where + Env: TxEnv, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + type TxProxyMethods = AdderProxyMethods; + + fn proxy_methods(self, tx: Tx) -> Self::TxProxyMethods { + AdderProxyMethods { wrapped_tx: tx } + } +} + +pub struct AdderProxyMethods +where + Env: TxEnv, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + wrapped_tx: Tx, +} + +#[rustfmt::skip] +impl AdderProxyMethods +where + Env: TxEnv, + Env::Api: VMApi, + From: TxFrom, + Gas: TxGas, +{ + pub fn init< + Arg0: CodecInto>, + >( + self, + initial_value: Arg0, + ) -> TxProxyDeploy { + self.wrapped_tx + .raw_deploy() + .argument(&initial_value) + .original_result() + } +} + +#[rustfmt::skip] +impl AdderProxyMethods +where + Env: TxEnv, + Env::Api: VMApi, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + pub fn upgrade< + Arg0: CodecInto>, + >( + self, + initial_value: Arg0, + ) -> TxProxyUpgrade { + self.wrapped_tx + .raw_upgrade() + .argument(&initial_value) + .original_result() + } +} + +#[rustfmt::skip] +impl AdderProxyMethods +where + Env: TxEnv, + Env::Api: VMApi, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + pub fn sum( + self, + ) -> TxProxyCall> { + self.wrapped_tx + .raw_call("getSum") + .original_result() + } + + /// Add desired amount to the storage variable. + pub fn add< + Arg0: CodecInto>, + >( + self, + value: Arg0, + ) -> TxProxyCall { + self.wrapped_tx + .raw_call("add") + .argument(&value) + .original_result() + } +} diff --git a/contracts/examples/multisig/tests/multisig_blackbox_test.rs b/contracts/examples/multisig/tests/multisig_blackbox_test.rs index 691c2750db..1529746ec6 100644 --- a/contracts/examples/multisig/tests/multisig_blackbox_test.rs +++ b/contracts/examples/multisig/tests/multisig_blackbox_test.rs @@ -1,21 +1,23 @@ use multiversx_sc::codec::top_encode_to_vec_u8_or_panic; use multiversx_sc_scenario::imports::*; -use adder::ProxyTrait as _; -use multisig::{ - multisig_perform::ProxyTrait as _, multisig_propose::ProxyTrait as _, user_role::UserRole, - ProxyTrait as _, -}; +use adder::{adder_proxy, ProxyTrait as _}; +use multisig::{multisig_perform::ProxyTrait as _, multisig_proxy}; use num_bigint::BigUint; const ADDER_ADDRESS_EXPR: &str = "sc:adder"; -const ADDER_OWNER_ADDRESS_EXPR: &str = "address:adder-owner"; +const SC_ADDER_EXPR: ScExpr = ScExpr("adder"); +const ADDER_OWNER_ADDRESS_EXPR: AddressExpr = AddressExpr("adder-owner"); const ADDER_PATH_EXPR: &str = "mxsc:test-contracts/adder.mxsc.json"; +const ADDER_CODE_EXPR: MxscExpr = MxscExpr("test-contracts/adder.mxsc.json"); const BOARD_MEMBER_ADDRESS_EXPR: &str = "address:board-member"; +const BOARD_MEMBER_ADDRESS_EXPR_REPL: AddressExpr = AddressExpr("board-member"); const MULTISIG_ADDRESS_EXPR: &str = "sc:multisig"; +const SC_MULTISIG_EXPR: ScExpr = ScExpr("multisig"); const MULTISIG_PATH_EXPR: &str = "mxsc:output/multisig.mxsc.json"; -const OWNER_ADDRESS_EXPR: &str = "address:owner"; -const PROPOSER_ADDRESS_EXPR: &str = "address:proposer"; +const MULTISIG_CODE_EXPR: MxscExpr = MxscExpr("output/multisig.mxsc.json"); +const OWNER_ADDRESS_EXPR_REPL: AddressExpr = AddressExpr("owner"); +const PROPOSER_ADDRESS_EXPR: AddressExpr = AddressExpr("proposer"); const PROPOSER_BALANCE_EXPR: &str = "100,000,000"; const QUORUM_SIZE: usize = 1; @@ -33,8 +35,6 @@ fn world() -> ScenarioWorld { struct MultisigTestState { world: ScenarioWorld, - proposer_address: Address, - board_member_address: Address, multisig_contract: MultisigContract, adder_contract: AdderContract, adder_address: Address, @@ -43,29 +43,36 @@ struct MultisigTestState { impl MultisigTestState { fn new() -> Self { let mut world = world(); - world.set_state_step( - SetStateStep::new() - .put_account(OWNER_ADDRESS_EXPR, Account::new().nonce(1)) - .new_address(OWNER_ADDRESS_EXPR, 1, MULTISIG_ADDRESS_EXPR) - .put_account( - PROPOSER_ADDRESS_EXPR, - Account::new().nonce(1).balance(PROPOSER_BALANCE_EXPR), - ) - .put_account(BOARD_MEMBER_ADDRESS_EXPR, Account::new().nonce(1)) - .put_account(ADDER_OWNER_ADDRESS_EXPR, Account::new().nonce(1)) - .new_address(ADDER_OWNER_ADDRESS_EXPR, 1, ADDER_ADDRESS_EXPR), - ); - - let proposer_address = AddressValue::from(PROPOSER_ADDRESS_EXPR).to_address(); - let board_member_address = AddressValue::from(BOARD_MEMBER_ADDRESS_EXPR).to_address(); - let multisig_contract = MultisigContract::new(MULTISIG_ADDRESS_EXPR); - let adder_contract = AdderContract::new(ADDER_ADDRESS_EXPR); - let adder_address = AddressValue::from(ADDER_ADDRESS_EXPR).to_address(); + + world + .account(OWNER_ADDRESS_EXPR_REPL) + .nonce(1) + .account(PROPOSER_ADDRESS_EXPR) + .nonce(1) + .balance(PROPOSER_BALANCE_EXPR) + .account(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .nonce(1) + .account(ADDER_OWNER_ADDRESS_EXPR) + .nonce(1); + + world.set_state_step(SetStateStep::new().new_address( + OWNER_ADDRESS_EXPR_REPL.eval_to_expr().as_str(), + 1, + SC_MULTISIG_EXPR.eval_to_expr().as_str(), + )); + + world.set_state_step(SetStateStep::new().new_address( + ADDER_OWNER_ADDRESS_EXPR.eval_to_expr().as_str(), + 1, + SC_ADDER_EXPR.eval_to_expr().as_str(), + )); + + let multisig_contract = MultisigContract::new(SC_MULTISIG_EXPR.eval_to_expr().as_str()); + let adder_contract = AdderContract::new(SC_ADDER_EXPR.eval_to_expr().as_str()); + let adder_address = AddressValue::from(SC_ADDER_EXPR.eval_to_expr().as_str()).to_address(); Self { world, - proposer_address, - board_member_address, multisig_contract, adder_contract, adder_address, @@ -73,70 +80,76 @@ impl MultisigTestState { } fn deploy_multisig_contract(&mut self) -> &mut Self { - let multisig_code = self.world.code_expression(MULTISIG_PATH_EXPR); - let board_members = MultiValueVec::from(vec![self.board_member_address.clone()]); - - self.world.sc_deploy( - ScDeployStep::new() - .from(OWNER_ADDRESS_EXPR) - .code(multisig_code) - .call(self.multisig_contract.init(QUORUM_SIZE, board_members)), - ); - - let action_id: usize = self.world.sc_call_get_result( - ScCallStep::new().from(BOARD_MEMBER_ADDRESS_EXPR).call( - self.multisig_contract - .propose_add_proposer(self.proposer_address.clone()), - ), - ); + let board_members = + MultiValueVec::from(vec![BOARD_MEMBER_ADDRESS_EXPR_REPL.eval_to_array()]); + + self.world + .tx() + .from(OWNER_ADDRESS_EXPR_REPL) + .typed(multisig_proxy::MultisigProxy) + .init(QUORUM_SIZE, board_members) + .code(MULTISIG_CODE_EXPR) + .run(); + + let action_id: usize = self + .world + .tx() + .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_add_proposer(PROPOSER_ADDRESS_EXPR.eval_to_array()) + .returns(ReturnsResult) + .run(); + self.sign(action_id); self.perform(action_id); - self.expect_user_role(&self.proposer_address.clone(), UserRole::Proposer); + self.expect_user_role(PROPOSER_ADDRESS_EXPR, multisig_proxy::UserRole::Proposer); self } - fn deploy_adder_contract(&mut self) -> &mut Self { - let adder_code = self.world.code_expression(ADDER_PATH_EXPR); - - self.world.sc_deploy( - ScDeployStep::new() - .from(ADDER_OWNER_ADDRESS_EXPR) - .code(adder_code) - .call(self.adder_contract.init(5u64)), - ); - - self + fn deploy_adder_contract(&mut self) { + self.world + .tx() + .from(ADDER_OWNER_ADDRESS_EXPR) + .typed(adder_proxy::AdderProxy) + .init(5u64) + .code(ADDER_CODE_EXPR) + .run(); } - fn propose_add_board_member(&mut self, board_member_address: Address) -> usize { + fn propose_add_board_member(&mut self, board_member_address: AddressExpr) -> usize { self.world .tx() - .from(AddressExpr("proposer")) - .call( - self.multisig_contract - .propose_add_board_member(board_member_address), - ) + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_add_board_member(board_member_address.eval_to_array()) .returns(ReturnsResult) .run() } - fn propose_add_proposer(&mut self, proposer_address: Address) -> usize { - self.world.sc_call_get_result( - ScCallStep::new().from(PROPOSER_ADDRESS_EXPR).call( - self.multisig_contract - .propose_add_proposer(proposer_address), - ), - ) + fn propose_add_proposer(&mut self, proposer_address: AddressExpr) -> usize { + self.world + .tx() + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_add_proposer(proposer_address.eval_to_array()) + .returns(ReturnsResult) + .run() } fn propose_change_quorum(&mut self, new_quorum: usize) -> usize { - self.world.sc_call_get_result( - ScCallStep::new() - .from(PROPOSER_ADDRESS_EXPR) - .call(self.multisig_contract.propose_change_quorum(new_quorum)), - ) + self.world + .tx() + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_change_quorum(new_quorum) + .returns(ReturnsResult) + .run() } fn propose_transfer_execute( @@ -145,12 +158,14 @@ impl MultisigTestState { egld_amount: u64, contract_call: FunctionCall, ) -> usize { - self.world.sc_call_get_result( - ScCallStep::new().from(PROPOSER_ADDRESS_EXPR).call( - self.multisig_contract - .propose_transfer_execute(to, egld_amount, contract_call), - ), - ) + self.world + .tx() + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_transfer_execute(to, egld_amount, contract_call) + .returns(ReturnsResult) + .run() } fn propose_async_call( @@ -159,20 +174,25 @@ impl MultisigTestState { egld_amount: u64, contract_call: FunctionCall, ) -> usize { - self.world.sc_call_get_result( - ScCallStep::new().from(PROPOSER_ADDRESS_EXPR).call( - self.multisig_contract - .propose_async_call(to, egld_amount, contract_call), - ), - ) + self.world + .tx() + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_async_call(to, egld_amount, contract_call) + .returns(ReturnsResult) + .run() } - fn propose_remove_user(&mut self, user_address: Address) -> usize { - self.world.sc_call_get_result( - ScCallStep::new() - .from(PROPOSER_ADDRESS_EXPR) - .call(self.multisig_contract.propose_remove_user(user_address)), - ) + fn propose_remove_user(&mut self, user_address: AddressExpr) -> usize { + self.world + .tx() + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_remove_user(user_address.eval_to_array()) + .returns(ReturnsResult) + .run() } fn propose_sc_deploy_from_source( @@ -183,14 +203,13 @@ impl MultisigTestState { arguments: MultiValueVec>, ) -> usize { self.world - .sc_call_get_result(ScCallStep::new().from(PROPOSER_ADDRESS_EXPR).call( - self.multisig_contract.propose_sc_deploy_from_source( - amount, - source, - code_metadata, - arguments, - ), - )) + .tx() + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_sc_deploy_from_source(amount, source, code_metadata, arguments) + .returns(ReturnsResult) + .run() } fn propose_sc_upgrade_from_source( @@ -202,48 +221,58 @@ impl MultisigTestState { arguments: MultiValueVec>, ) -> usize { self.world - .sc_call_get_result(ScCallStep::new().from(PROPOSER_ADDRESS_EXPR).call( - self.multisig_contract.propose_sc_upgrade_from_source( - sc_address, - amount, - source, - code_metadata, - arguments, - ), - )) + .tx() + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_sc_upgrade_from_source(sc_address, amount, source, code_metadata, arguments) + .returns(ReturnsResult) + .run() } fn perform(&mut self, action_id: usize) { - self.world.sc_call( - ScCallStep::new() - .from(BOARD_MEMBER_ADDRESS_EXPR) - .call(self.multisig_contract.perform_action_endpoint(action_id)), - ); + self.world + .tx() + .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .perform_action_endpoint(action_id) + .run(); } fn perform_and_expect_err(&mut self, action_id: usize, err_message: &str) { - self.world.sc_call( - ScCallStep::new() - .from(BOARD_MEMBER_ADDRESS_EXPR) - .call(self.multisig_contract.perform_action_endpoint(action_id)) - .expect(TxExpect::user_error("str:".to_string() + err_message)), - ); + self.world + .tx() + .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .perform_action_endpoint(action_id) + .with_result(ExpectError(4, err_message)) + .run(); } fn sign(&mut self, action_id: usize) { - self.world.sc_call( - ScCallStep::new() - .from(BOARD_MEMBER_ADDRESS_EXPR) - .call(self.multisig_contract.sign(action_id)), - ); + self.world + .tx() + .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .sign(action_id) + .run(); } - fn expect_user_role(&mut self, user: &Address, expected_user_role: UserRole) { - self.world.sc_query( - ScQueryStep::new() - .call(self.multisig_contract.user_role(user.clone())) - .expect_value(expected_user_role), - ); + fn expect_user_role( + &mut self, + user: AddressExpr, + expected_user_role: multisig_proxy::UserRole, + ) { + self.world + .query() + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .user_role(user.eval_to_array()) + .returns(ExpectValue(expected_user_role)) + .run(); } } @@ -252,28 +281,30 @@ fn test_add_board_member() { let mut state = MultisigTestState::new(); state.deploy_multisig_contract(); - const NEW_BOARD_MEMBER_ADDRESS_EXPR: &str = "address:new-board-member"; - let new_board_member_address = AddressValue::from(NEW_BOARD_MEMBER_ADDRESS_EXPR).to_address(); + let new_board_member_expr: AddressExpr = AddressExpr("new-board-member"); - state.world.set_state_step( - SetStateStep::new().put_account(NEW_BOARD_MEMBER_ADDRESS_EXPR, Account::new().nonce(1)), - ); + state.world.account(new_board_member_expr).nonce(1); - state.expect_user_role(&new_board_member_address, UserRole::None); + state.expect_user_role(new_board_member_expr, multisig_proxy::UserRole::None); - let action_id = state.propose_add_board_member(new_board_member_address.clone()); + let action_id = state.propose_add_board_member(new_board_member_expr); state.sign(action_id); state.perform(action_id); - state.expect_user_role(&new_board_member_address, UserRole::BoardMember); - state.world.sc_query( - ScQueryStep::new() - .call(state.multisig_contract.get_all_board_members()) - .expect_value(MultiValueVec::
::from(vec![ - state.board_member_address.clone(), - new_board_member_address.clone(), - ])), - ); + let expected_value = MultiValueVec::from(vec![ + BOARD_MEMBER_ADDRESS_EXPR_REPL.eval_to_array(), + new_board_member_expr.eval_to_array(), + ]); + + state.expect_user_role(new_board_member_expr, multisig_proxy::UserRole::BoardMember); + state + .world + .query() + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .get_all_board_members() + .returns(ExpectValue(expected_value)) + .run() } #[test] @@ -281,28 +312,33 @@ fn test_add_proposer() { let mut state = MultisigTestState::new(); state.deploy_multisig_contract(); - const NEW_PROPOSER_ADDRESS_EXPR: &str = "address:new-proposer"; - let new_proposer_address = AddressValue::from(NEW_PROPOSER_ADDRESS_EXPR).to_address(); + let new_proposer_address_expr: AddressExpr = AddressExpr("new-proposer"); - state.world.set_state_step( - SetStateStep::new().put_account(NEW_PROPOSER_ADDRESS_EXPR, Account::new().nonce(1)), - ); + state.world.account(new_proposer_address_expr).nonce(1); - state.expect_user_role(&new_proposer_address, UserRole::None); + state.expect_user_role(new_proposer_address_expr, multisig_proxy::UserRole::None); - let action_id = state.propose_add_proposer(new_proposer_address.clone()); + let action_id = state.propose_add_proposer(new_proposer_address_expr); state.sign(action_id); state.perform(action_id); - state.expect_user_role(&new_proposer_address, UserRole::Proposer); - state.world.sc_query( - ScQueryStep::new() - .call(state.multisig_contract.get_all_proposers()) - .expect_value(MultiValueVec::
::from(vec![ - state.proposer_address.clone(), - new_proposer_address.clone(), - ])), + state.expect_user_role( + new_proposer_address_expr, + multisig_proxy::UserRole::Proposer, ); + + let expected_value = MultiValueVec::from(vec![ + PROPOSER_ADDRESS_EXPR.eval_to_array(), + new_proposer_address_expr.eval_to_array(), + ]); + state + .world + .query() + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .get_all_proposers() + .returns(ExpectValue(expected_value)) + .run(); } #[test] @@ -310,18 +346,21 @@ fn test_remove_proposer() { let mut state = MultisigTestState::new(); state.deploy_multisig_contract(); - state.expect_user_role(&state.proposer_address.clone(), UserRole::Proposer); + state.expect_user_role(PROPOSER_ADDRESS_EXPR, multisig_proxy::UserRole::Proposer); - let action_id = state.propose_remove_user(state.proposer_address.clone()); + let action_id = state.propose_remove_user(PROPOSER_ADDRESS_EXPR); state.sign(action_id); state.perform(action_id); - state.expect_user_role(&state.proposer_address.clone(), UserRole::None); - state.world.sc_query( - ScQueryStep::new() - .call(state.multisig_contract.get_all_proposers()) - .expect_value(MultiValueVec::
::new()), - ); + state.expect_user_role(PROPOSER_ADDRESS_EXPR, multisig_proxy::UserRole::None); + state + .world + .query() + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .get_all_proposers() + .returns(ExpectValue(MultiValueVec::
::new())) + .run(); } #[test] @@ -329,7 +368,7 @@ fn test_try_remove_all_board_members() { let mut state = MultisigTestState::new(); state.deploy_multisig_contract(); - let action_id = state.propose_remove_user(state.board_member_address.clone()); + let action_id = state.propose_remove_user(BOARD_MEMBER_ADDRESS_EXPR_REPL); state.sign(action_id); state.perform_and_expect_err(action_id, "quorum cannot exceed board size") } @@ -346,45 +385,55 @@ fn test_change_quorum() { state.perform_and_expect_err(action_id, "quorum cannot exceed board size"); // try discard before unsigning - state.world.sc_call( - ScCallStep::new() - .from(BOARD_MEMBER_ADDRESS_EXPR) - .call(state.multisig_contract.discard_action(action_id)) - .expect(TxExpect::user_error( - "str:cannot discard action with valid signatures", - )), - ); + state + .world + .tx() + .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .discard_action(action_id) + .with_result(ExpectError( + 4, + "cannot discard action with valid signatures", + )) + .run(); // unsign and discard action - state.world.sc_call( - ScCallStep::new() - .from(BOARD_MEMBER_ADDRESS_EXPR) - .call(state.multisig_contract.unsign(action_id)), - ); + state + .world + .tx() + .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .unsign(action_id) + .run(); - state.world.sc_call( - ScCallStep::new() - .from(BOARD_MEMBER_ADDRESS_EXPR) - .call(state.multisig_contract.discard_action(action_id)), - ); + state + .world + .tx() + .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .discard_action(action_id) + .run(); // try sign discarded action - state.world.sc_call( - ScCallStep::new() - .from(BOARD_MEMBER_ADDRESS_EXPR) - .call(state.multisig_contract.sign(action_id)) - .expect(TxExpect::user_error("str:action does not exist")), - ); + state + .world + .tx() + .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .sign(action_id) + .with_result(ExpectError(4, "action does not exist")) + .run(); // add another board member - const NEW_BOARD_MEMBER_ADDRESS_EXPR: &str = "address:new-board-member"; - let new_board_member_address = AddressValue::from(NEW_BOARD_MEMBER_ADDRESS_EXPR).to_address(); + let new_board_member_address_expr: AddressExpr = AddressExpr("new-board-member"); - state.world.set_state_step( - SetStateStep::new().put_account(NEW_BOARD_MEMBER_ADDRESS_EXPR, Account::new().nonce(1)), - ); + state.world.account(new_board_member_address_expr).nonce(1); - let action_id = state.propose_add_board_member(new_board_member_address); + let action_id = state.propose_add_board_member(new_board_member_address_expr); state.sign(action_id); state.perform(action_id); @@ -399,57 +448,62 @@ fn test_transfer_execute_to_user() { let mut state = MultisigTestState::new(); state.deploy_multisig_contract(); - const NEW_USER_ADDRESS_EXPR: &str = "address:new-user"; - state.world.set_state_step( - SetStateStep::new().put_account(NEW_USER_ADDRESS_EXPR, Account::new().nonce(1)), - ); + let new_user_address_expr: AddressExpr = AddressExpr("new-user"); + state.world.account(new_user_address_expr).nonce(1); - const AMOUNT: &str = "100"; + let amount: u64 = 100; - state.world.sc_call( - ScCallStep::new() - .from(PROPOSER_ADDRESS_EXPR) - .egld_value(AMOUNT) - .call(state.multisig_contract.deposit()), - ); + state + .world + .tx() + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .deposit() + .egld(amount) + .run(); - state.world.check_state_step( - CheckStateStep::new() - .put_account(MULTISIG_ADDRESS_EXPR, CheckAccount::new().balance(AMOUNT)), - ); + state + .world + .check_account(SC_MULTISIG_EXPR) + .balance(amount.to_string().as_str()); // failed attempt - let new_user_address = AddressValue::from(NEW_USER_ADDRESS_EXPR).to_address(); - - state.world.sc_call( - ScCallStep::new() - .from(PROPOSER_ADDRESS_EXPR) - .call(state.multisig_contract.propose_transfer_execute( - new_user_address.clone(), - 0u64, - FunctionCall::empty(), - )) - .expect(TxExpect::user_error("str:proposed action has no effect")), - ); + state + .world + .tx() + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_transfer_execute( + new_user_address_expr.eval_to_array(), + 0u64, + FunctionCall::empty(), + ) + .with_result(ExpectError(4, "proposed action has no effect")) + .run(); // propose - let action_id = - state - .world - .sc_call_get_result(ScCallStep::new().from(PROPOSER_ADDRESS_EXPR).call( - state.multisig_contract.propose_transfer_execute( - new_user_address, - AMOUNT.parse::().unwrap(), - FunctionCall::empty(), - ), - )); + let action_id = state + .world + .tx() + .from(PROPOSER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .propose_transfer_execute( + new_user_address_expr.eval_to_array(), + amount, + FunctionCall::empty(), + ) + .returns(ReturnsResult) + .run(); state.sign(action_id); state.perform(action_id); - state.world.check_state_step( - CheckStateStep::new() - .put_account(NEW_USER_ADDRESS_EXPR, CheckAccount::new().balance(AMOUNT)), - ); + state + .world + .check_account(new_user_address_expr) + .balance(amount.to_string().as_str()); } #[test] @@ -457,17 +511,26 @@ fn test_transfer_execute_sc_all() { let mut state = MultisigTestState::new(); state.deploy_multisig_contract().deploy_adder_contract(); - let adder_call = state.adder_contract.add(5u64).into_function_call(); + let adder_call = state + .world + .tx() + .typed(adder_proxy::AdderProxy) + .add(5u64) + .into_function_call(); + let adder_address = AddressValue::from(SC_ADDER_EXPR.eval_to_expr().as_str()).to_address(); - let action_id = state.propose_transfer_execute(state.adder_address.clone(), 0u64, adder_call); + let action_id = state.propose_transfer_execute(adder_address, 0u64, adder_call); state.sign(action_id); state.perform(action_id); - state.world.sc_query( - ScQueryStep::new() - .call(state.adder_contract.sum()) - .expect_value(SingleValue::from(BigUint::from(10u64))), - ); + state + .world + .query() + .to(SC_ADDER_EXPR) + .typed(adder_proxy::AdderProxy) + .sum() + .with_result(ExpectValue(BigUint::from(10u64))) + .run(); } #[test] @@ -481,11 +544,14 @@ fn test_async_call_to_sc() { state.sign(action_id); state.perform(action_id); - state.world.sc_query( - ScQueryStep::new() - .call(state.adder_contract.sum()) - .expect_value(SingleValue::from(BigUint::from(10u64))), - ); + state + .world + .query() + .to(SC_ADDER_EXPR) + .typed(adder_proxy::AdderProxy) + .sum() + .returns(ExpectValue(10u64)) + .run(); } #[test] From 8eb704cc9e811b22d48e3621e6f3e463627a2bea Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Fri, 19 Apr 2024 13:22:17 +0300 Subject: [PATCH 2/3] unified syntax - migrate all tests --- .../tests/crowdfunding_esdt_blackbox_test.rs | 12 +- .../multisig/tests/multisig_blackbox_test.rs | 196 +++++++++--------- .../scenario/src/facade/expr/mxsc_expr.rs | 20 ++ 3 files changed, 128 insertions(+), 100 deletions(-) diff --git a/contracts/examples/crowdfunding-esdt/tests/crowdfunding_esdt_blackbox_test.rs b/contracts/examples/crowdfunding-esdt/tests/crowdfunding_esdt_blackbox_test.rs index d7b8d616a0..e47e5ea385 100644 --- a/contracts/examples/crowdfunding-esdt/tests/crowdfunding_esdt_blackbox_test.rs +++ b/contracts/examples/crowdfunding-esdt/tests/crowdfunding_esdt_blackbox_test.rs @@ -12,12 +12,12 @@ const CODE_EXPR: MxscExpr = MxscExpr("output/crowdfunding-esdt.mxsc.json"); const SC_CROWDFUNDING_ESDT_EXPR: ScExpr = ScExpr("crowdfunding-esdt"); fn world() -> ScenarioWorld { - let contract_path: &str = "mxsc:output/crowdfunding-esdt.mxsc.json"; - let mut blockchain = ScenarioWorld::new(); - blockchain.set_current_dir_from_workspace("contracts/examples/crowdfunding-esdt"); - blockchain.register_contract(contract_path, crowdfunding_esdt::ContractBuilder); + blockchain.register_contract( + CODE_EXPR.eval_to_expr().as_str(), + crowdfunding_esdt::ContractBuilder, + ); blockchain } @@ -41,9 +41,9 @@ impl CrowdfundingESDTTestState { .esdt_balance(CF_TOKEN_ID_EXPR, "1000"); world.set_state_step(SetStateStep::new().new_address( - OWNER_ADDRESS.eval_to_expr().as_str(), + OWNER_ADDRESS, 1, - SC_CROWDFUNDING_ESDT_EXPR.eval_to_expr().as_str(), + SC_CROWDFUNDING_ESDT_EXPR, )); Self { world } diff --git a/contracts/examples/multisig/tests/multisig_blackbox_test.rs b/contracts/examples/multisig/tests/multisig_blackbox_test.rs index 1529746ec6..22a4219fd4 100644 --- a/contracts/examples/multisig/tests/multisig_blackbox_test.rs +++ b/contracts/examples/multisig/tests/multisig_blackbox_test.rs @@ -1,43 +1,38 @@ use multiversx_sc::codec::top_encode_to_vec_u8_or_panic; use multiversx_sc_scenario::imports::*; -use adder::{adder_proxy, ProxyTrait as _}; -use multisig::{multisig_perform::ProxyTrait as _, multisig_proxy}; +use adder::adder_proxy; +use multisig::multisig_proxy; use num_bigint::BigUint; -const ADDER_ADDRESS_EXPR: &str = "sc:adder"; const SC_ADDER_EXPR: ScExpr = ScExpr("adder"); const ADDER_OWNER_ADDRESS_EXPR: AddressExpr = AddressExpr("adder-owner"); -const ADDER_PATH_EXPR: &str = "mxsc:test-contracts/adder.mxsc.json"; const ADDER_CODE_EXPR: MxscExpr = MxscExpr("test-contracts/adder.mxsc.json"); -const BOARD_MEMBER_ADDRESS_EXPR: &str = "address:board-member"; -const BOARD_MEMBER_ADDRESS_EXPR_REPL: AddressExpr = AddressExpr("board-member"); -const MULTISIG_ADDRESS_EXPR: &str = "sc:multisig"; +const BOARD_MEMBER_ADDRESS_EXPR: AddressExpr = AddressExpr("board-member"); const SC_MULTISIG_EXPR: ScExpr = ScExpr("multisig"); -const MULTISIG_PATH_EXPR: &str = "mxsc:output/multisig.mxsc.json"; const MULTISIG_CODE_EXPR: MxscExpr = MxscExpr("output/multisig.mxsc.json"); -const OWNER_ADDRESS_EXPR_REPL: AddressExpr = AddressExpr("owner"); +const OWNER_ADDRESS_EXPR: AddressExpr = AddressExpr("owner"); const PROPOSER_ADDRESS_EXPR: AddressExpr = AddressExpr("proposer"); const PROPOSER_BALANCE_EXPR: &str = "100,000,000"; const QUORUM_SIZE: usize = 1; -type MultisigContract = ContractInfo>; -type AdderContract = ContractInfo>; - fn world() -> ScenarioWorld { let mut blockchain = ScenarioWorld::new(); blockchain.set_current_dir_from_workspace("contracts/examples/multisig"); - blockchain.register_contract(MULTISIG_PATH_EXPR, multisig::ContractBuilder); - blockchain.register_contract(ADDER_PATH_EXPR, adder::ContractBuilder); + blockchain.register_contract( + MULTISIG_CODE_EXPR.eval_to_expr().as_str(), + multisig::ContractBuilder, + ); + blockchain.register_contract( + ADDER_CODE_EXPR.eval_to_expr().as_str(), + adder::ContractBuilder, + ); blockchain } struct MultisigTestState { world: ScenarioWorld, - multisig_contract: MultisigContract, - adder_contract: AdderContract, - adder_address: Address, } impl MultisigTestState { @@ -45,47 +40,37 @@ impl MultisigTestState { let mut world = world(); world - .account(OWNER_ADDRESS_EXPR_REPL) + .account(OWNER_ADDRESS_EXPR) .nonce(1) .account(PROPOSER_ADDRESS_EXPR) .nonce(1) .balance(PROPOSER_BALANCE_EXPR) - .account(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .account(BOARD_MEMBER_ADDRESS_EXPR) .nonce(1) .account(ADDER_OWNER_ADDRESS_EXPR) .nonce(1); world.set_state_step(SetStateStep::new().new_address( - OWNER_ADDRESS_EXPR_REPL.eval_to_expr().as_str(), + OWNER_ADDRESS_EXPR, 1, - SC_MULTISIG_EXPR.eval_to_expr().as_str(), + SC_MULTISIG_EXPR, )); world.set_state_step(SetStateStep::new().new_address( - ADDER_OWNER_ADDRESS_EXPR.eval_to_expr().as_str(), + ADDER_OWNER_ADDRESS_EXPR, 1, - SC_ADDER_EXPR.eval_to_expr().as_str(), + SC_ADDER_EXPR, )); - let multisig_contract = MultisigContract::new(SC_MULTISIG_EXPR.eval_to_expr().as_str()); - let adder_contract = AdderContract::new(SC_ADDER_EXPR.eval_to_expr().as_str()); - let adder_address = AddressValue::from(SC_ADDER_EXPR.eval_to_expr().as_str()).to_address(); - - Self { - world, - multisig_contract, - adder_contract, - adder_address, - } + Self { world } } fn deploy_multisig_contract(&mut self) -> &mut Self { - let board_members = - MultiValueVec::from(vec![BOARD_MEMBER_ADDRESS_EXPR_REPL.eval_to_array()]); + let board_members = MultiValueVec::from(vec![BOARD_MEMBER_ADDRESS_EXPR.eval_to_array()]); self.world .tx() - .from(OWNER_ADDRESS_EXPR_REPL) + .from(OWNER_ADDRESS_EXPR) .typed(multisig_proxy::MultisigProxy) .init(QUORUM_SIZE, board_members) .code(MULTISIG_CODE_EXPR) @@ -94,7 +79,7 @@ impl MultisigTestState { let action_id: usize = self .world .tx() - .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .from(BOARD_MEMBER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) .propose_add_proposer(PROPOSER_ADDRESS_EXPR.eval_to_array()) @@ -154,7 +139,7 @@ impl MultisigTestState { fn propose_transfer_execute( &mut self, - to: Address, + to: ScExpr, egld_amount: u64, contract_call: FunctionCall, ) -> usize { @@ -163,14 +148,14 @@ impl MultisigTestState { .from(PROPOSER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) - .propose_transfer_execute(to, egld_amount, contract_call) + .propose_transfer_execute(to.eval_to_array(), egld_amount, contract_call) .returns(ReturnsResult) .run() } fn propose_async_call( &mut self, - to: Address, + to: ScExpr, egld_amount: u64, contract_call: FunctionCall, ) -> usize { @@ -179,7 +164,7 @@ impl MultisigTestState { .from(PROPOSER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) - .propose_async_call(to, egld_amount, contract_call) + .propose_async_call(to.eval_to_array(), egld_amount, contract_call) .returns(ReturnsResult) .run() } @@ -198,7 +183,7 @@ impl MultisigTestState { fn propose_sc_deploy_from_source( &mut self, amount: u64, - source: Address, + source: ScExpr, code_metadata: CodeMetadata, arguments: MultiValueVec>, ) -> usize { @@ -207,16 +192,16 @@ impl MultisigTestState { .from(PROPOSER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) - .propose_sc_deploy_from_source(amount, source, code_metadata, arguments) + .propose_sc_deploy_from_source(amount, source.eval_to_array(), code_metadata, arguments) .returns(ReturnsResult) .run() } fn propose_sc_upgrade_from_source( &mut self, - sc_address: Address, + sc_address: ScExpr, amount: u64, - source: Address, + source: ScExpr, code_metadata: CodeMetadata, arguments: MultiValueVec>, ) -> usize { @@ -225,7 +210,13 @@ impl MultisigTestState { .from(PROPOSER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) - .propose_sc_upgrade_from_source(sc_address, amount, source, code_metadata, arguments) + .propose_sc_upgrade_from_source( + sc_address.eval_to_array(), + amount, + source.eval_to_array(), + code_metadata, + arguments, + ) .returns(ReturnsResult) .run() } @@ -233,7 +224,7 @@ impl MultisigTestState { fn perform(&mut self, action_id: usize) { self.world .tx() - .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .from(BOARD_MEMBER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) .perform_action_endpoint(action_id) @@ -243,7 +234,7 @@ impl MultisigTestState { fn perform_and_expect_err(&mut self, action_id: usize, err_message: &str) { self.world .tx() - .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .from(BOARD_MEMBER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) .perform_action_endpoint(action_id) @@ -254,7 +245,7 @@ impl MultisigTestState { fn sign(&mut self, action_id: usize) { self.world .tx() - .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .from(BOARD_MEMBER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) .sign(action_id) @@ -292,7 +283,7 @@ fn test_add_board_member() { state.perform(action_id); let expected_value = MultiValueVec::from(vec![ - BOARD_MEMBER_ADDRESS_EXPR_REPL.eval_to_array(), + BOARD_MEMBER_ADDRESS_EXPR.eval_to_array(), new_board_member_expr.eval_to_array(), ]); @@ -368,7 +359,7 @@ fn test_try_remove_all_board_members() { let mut state = MultisigTestState::new(); state.deploy_multisig_contract(); - let action_id = state.propose_remove_user(BOARD_MEMBER_ADDRESS_EXPR_REPL); + let action_id = state.propose_remove_user(BOARD_MEMBER_ADDRESS_EXPR); state.sign(action_id); state.perform_and_expect_err(action_id, "quorum cannot exceed board size") } @@ -388,7 +379,7 @@ fn test_change_quorum() { state .world .tx() - .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .from(BOARD_MEMBER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) .discard_action(action_id) @@ -402,7 +393,7 @@ fn test_change_quorum() { state .world .tx() - .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .from(BOARD_MEMBER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) .unsign(action_id) @@ -411,7 +402,7 @@ fn test_change_quorum() { state .world .tx() - .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .from(BOARD_MEMBER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) .discard_action(action_id) @@ -421,7 +412,7 @@ fn test_change_quorum() { state .world .tx() - .from(BOARD_MEMBER_ADDRESS_EXPR_REPL) + .from(BOARD_MEMBER_ADDRESS_EXPR) .to(SC_MULTISIG_EXPR) .typed(multisig_proxy::MultisigProxy) .sign(action_id) @@ -517,9 +508,8 @@ fn test_transfer_execute_sc_all() { .typed(adder_proxy::AdderProxy) .add(5u64) .into_function_call(); - let adder_address = AddressValue::from(SC_ADDER_EXPR.eval_to_expr().as_str()).to_address(); - let action_id = state.propose_transfer_execute(adder_address, 0u64, adder_call); + let action_id = state.propose_transfer_execute(SC_ADDER_EXPR, 0u64, adder_call); state.sign(action_id); state.perform(action_id); @@ -538,9 +528,14 @@ fn test_async_call_to_sc() { let mut state = MultisigTestState::new(); state.deploy_multisig_contract().deploy_adder_contract(); - let adder_call = state.adder_contract.add(5u64).into_function_call(); + let adder_call = state + .world + .tx() + .typed(adder_proxy::AdderProxy) + .add(5u64) + .into_function_call(); - let action_id = state.propose_async_call(state.adder_address.clone(), 0u64, adder_call); + let action_id = state.propose_async_call(SC_ADDER_EXPR, 0u64, adder_call); state.sign(action_id); state.perform(action_id); @@ -559,69 +554,82 @@ fn test_deploy_and_upgrade_from_source() { let mut state = MultisigTestState::new(); state.deploy_multisig_contract().deploy_adder_contract(); - const NEW_ADDER_ADDRESS_EXPR: &str = "sc:new-adder"; + let new_adder_address_expr: ScExpr = ScExpr("new-adder"); state.world.set_state_step(SetStateStep::new().new_address( - MULTISIG_ADDRESS_EXPR, + SC_MULTISIG_EXPR, 0, - NEW_ADDER_ADDRESS_EXPR, + new_adder_address_expr, )); - let new_adder_address = AddressValue::from(NEW_ADDER_ADDRESS_EXPR).to_address(); - let action_id = state.propose_sc_deploy_from_source( 0u64, - state.adder_address.clone(), + SC_ADDER_EXPR, CodeMetadata::all(), MultiValueVec::from([top_encode_to_vec_u8_or_panic(&5u64)]), ); state.sign(action_id); - state.world.sc_call( - ScCallStep::new() - .from(BOARD_MEMBER_ADDRESS_EXPR) - .call(state.multisig_contract.perform_action_endpoint(action_id)) - .expect_value(OptionalValue::Some(new_adder_address.clone())), - ); + state + .world + .tx() + .from(BOARD_MEMBER_ADDRESS_EXPR) + .to(SC_MULTISIG_EXPR) + .typed(multisig_proxy::MultisigProxy) + .perform_action_endpoint(action_id) + .returns(ExpectValue(OptionalValue::Some( + new_adder_address_expr.to_address(), + ))) + .run(); - let adder_call = state.adder_contract.add(5u64).into_function_call(); + let adder_call = state + .world + .tx() + .to(SC_ADDER_EXPR) + .typed(adder_proxy::AdderProxy) + .add(5u64) + .into_function_call(); - let action_id = state.propose_transfer_execute(new_adder_address, 0u64, adder_call); + let action_id = state.propose_transfer_execute(new_adder_address_expr, 0u64, adder_call); state.sign(action_id); state.perform(action_id); - let mut new_adder_contract = AdderContract::new(NEW_ADDER_ADDRESS_EXPR); + state + .world + .query() + .to(new_adder_address_expr) + .typed(adder_proxy::AdderProxy) + .sum() + .returns(ExpectValue(BigUint::from(10u64))) + .run(); - state.world.sc_query( - ScQueryStep::new() - .call(new_adder_contract.sum()) - .expect_value(SingleValue::from(BigUint::from(10u64))), - ); + let factorial_address_expr: ScExpr = ScExpr("factorial"); + let factorial_path_expr: MxscExpr = MxscExpr("test-contracts/factorial.mxsc.json"); - const FACTORIAL_ADDRESS_EXPR: &str = "sc:factorial"; - const FACTORIAL_PATH_EXPR: &str = "mxsc:test-contracts/factorial.mxsc.json"; + let factorial_code = state + .world + .code_expression(factorial_path_expr.eval_to_expr().as_str()); - let factorial_code = state.world.code_expression(FACTORIAL_PATH_EXPR); - let factorial_address = AddressValue::from(FACTORIAL_ADDRESS_EXPR).to_address(); + state.world.register_contract( + factorial_path_expr.eval_to_expr().as_str(), + factorial::ContractBuilder, + ); state .world - .register_contract(FACTORIAL_PATH_EXPR, factorial::ContractBuilder); - state.world.set_state_step(SetStateStep::new().put_account( - FACTORIAL_ADDRESS_EXPR, - Account::new().nonce(1).code(factorial_code.clone()), - )); + .account(factorial_address_expr) + .code(factorial_code.clone()); let action_id = state.propose_sc_upgrade_from_source( - state.adder_address.clone(), + SC_ADDER_EXPR, 0u64, - factorial_address, + factorial_address_expr, CodeMetadata::all(), MultiValueVec::new(), ); state.sign(action_id); state.perform(action_id); - state.world.check_state_step( - CheckStateStep::new() - .put_account(ADDER_ADDRESS_EXPR, CheckAccount::new().code(factorial_code)), - ); + state + .world + .check_account(SC_ADDER_EXPR) + .code(factorial_path_expr.eval_to_expr().as_str()); } diff --git a/framework/scenario/src/facade/expr/mxsc_expr.rs b/framework/scenario/src/facade/expr/mxsc_expr.rs index 0946b93327..d130102600 100644 --- a/framework/scenario/src/facade/expr/mxsc_expr.rs +++ b/framework/scenario/src/facade/expr/mxsc_expr.rs @@ -30,3 +30,23 @@ where } impl<'a, Env> TxCodeValue for MxscExpr<'a> where Env: ScenarioTxEnv {} + +impl<'a> MxscExpr<'a> { + pub fn eval_to_expr(&self) -> String { + format!("{MXSC_PREFIX}{}", self.0) + } +} + +#[cfg(test)] +pub mod tests { + use crate::imports::MxscExpr; + + fn assert_eq_eval(expr: &'static str, expected: &str) { + assert_eq!(&MxscExpr(expr).eval_to_expr(), expected); + } + + #[test] + fn test_address_value() { + assert_eq_eval("output/adder.mxsc.json", "mxsc:output/adder.mxsc.json"); + } +} From 68a6df617e3cbc1ef56e1aa3c6a251fc68d66846 Mon Sep 17 00:00:00 2001 From: Andrei Marinica Date: Mon, 22 Apr 2024 13:59:09 +0300 Subject: [PATCH 3/3] cleanup --- contracts/examples/adder/sc-config.toml | 3 - .../examples/multisig/src/adder_proxy.rs | 110 ------------------ 2 files changed, 113 deletions(-) delete mode 100644 contracts/examples/multisig/src/adder_proxy.rs diff --git a/contracts/examples/adder/sc-config.toml b/contracts/examples/adder/sc-config.toml index 091de3f7f6..b56f82b429 100644 --- a/contracts/examples/adder/sc-config.toml +++ b/contracts/examples/adder/sc-config.toml @@ -2,6 +2,3 @@ [[proxy]] path = "src/adder_proxy.rs" - -[[proxy]] -path = "../multisig/src/adder_proxy.rs" diff --git a/contracts/examples/multisig/src/adder_proxy.rs b/contracts/examples/multisig/src/adder_proxy.rs deleted file mode 100644 index 0b1b663669..0000000000 --- a/contracts/examples/multisig/src/adder_proxy.rs +++ /dev/null @@ -1,110 +0,0 @@ -// Code generated by the multiversx-sc proxy generator. DO NOT EDIT. - -//////////////////////////////////////////////////// -////////////////// AUTO-GENERATED ////////////////// -//////////////////////////////////////////////////// - -#![allow(dead_code)] -#![allow(clippy::all)] - -use multiversx_sc::proxy_imports::*; - -pub struct AdderProxy; - -impl TxProxyTrait for AdderProxy -where - Env: TxEnv, - From: TxFrom, - To: TxTo, - Gas: TxGas, -{ - type TxProxyMethods = AdderProxyMethods; - - fn proxy_methods(self, tx: Tx) -> Self::TxProxyMethods { - AdderProxyMethods { wrapped_tx: tx } - } -} - -pub struct AdderProxyMethods -where - Env: TxEnv, - From: TxFrom, - To: TxTo, - Gas: TxGas, -{ - wrapped_tx: Tx, -} - -#[rustfmt::skip] -impl AdderProxyMethods -where - Env: TxEnv, - Env::Api: VMApi, - From: TxFrom, - Gas: TxGas, -{ - pub fn init< - Arg0: CodecInto>, - >( - self, - initial_value: Arg0, - ) -> TxProxyDeploy { - self.wrapped_tx - .raw_deploy() - .argument(&initial_value) - .original_result() - } -} - -#[rustfmt::skip] -impl AdderProxyMethods -where - Env: TxEnv, - Env::Api: VMApi, - From: TxFrom, - To: TxTo, - Gas: TxGas, -{ - pub fn upgrade< - Arg0: CodecInto>, - >( - self, - initial_value: Arg0, - ) -> TxProxyUpgrade { - self.wrapped_tx - .raw_upgrade() - .argument(&initial_value) - .original_result() - } -} - -#[rustfmt::skip] -impl AdderProxyMethods -where - Env: TxEnv, - Env::Api: VMApi, - From: TxFrom, - To: TxTo, - Gas: TxGas, -{ - pub fn sum( - self, - ) -> TxProxyCall> { - self.wrapped_tx - .raw_call("getSum") - .original_result() - } - - /// Add desired amount to the storage variable. - pub fn add< - Arg0: CodecInto>, - >( - self, - value: Arg0, - ) -> TxProxyCall { - self.wrapped_tx - .raw_call("add") - .argument(&value) - .original_result() - } -}