From f2784da42263bcf2aa5ffa1eed789dfddf38c99d Mon Sep 17 00:00:00 2001 From: evelinemolnar Date: Mon, 7 Oct 2024 13:48:10 +0300 Subject: [PATCH 01/21] edst-safe refactor --- Cargo.lock | 9 + Cargo.toml | 2 +- common/storage-module/Cargo.toml | 10 + common/storage-module/src/lib.rs | 63 ++++ esdt-safe/Cargo.toml | 3 + esdt-safe/src/esdt_safe_proxy.rs | 22 -- esdt-safe/src/lib.rs | 282 +++++++++--------- esdt-safe/tests/esdt_safe_blackbox_test.rs | 49 ++- esdt-safe/wasm/Cargo.lock | 8 + esdt-safe/wasm/src/lib.rs | 6 +- .../tests/multi_transfer_blackbox_test.rs | 10 - multisig/src/storage.rs | 8 + 12 files changed, 273 insertions(+), 199 deletions(-) create mode 100644 common/storage-module/Cargo.toml create mode 100644 common/storage-module/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 67ceff37..31095bd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -357,6 +357,7 @@ dependencies = [ "multiversx-sc", "multiversx-sc-modules", "multiversx-sc-scenario", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -1024,6 +1025,14 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "storage-module" +version = "0.1.0" +dependencies = [ + "multiversx-sc", + "multiversx-sc-scenario", +] + [[package]] name = "strsim" version = "0.11.1" diff --git a/Cargo.toml b/Cargo.toml index 2c45d19e..9d2c98db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,4 +12,4 @@ members = [ "bridged-tokens-wrapper/meta", "test-caller", "test-caller/meta" -] +, "common/storage-module"] diff --git a/common/storage-module/Cargo.toml b/common/storage-module/Cargo.toml new file mode 100644 index 00000000..cf984daa --- /dev/null +++ b/common/storage-module/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "storage-module" +version = "0.1.0" +edition = "2021" + +[dependencies.multiversx-sc] +version = "=0.52.3" + +[dev-dependencies.multiversx-sc-scenario] +version = "=0.52.3" diff --git a/common/storage-module/src/lib.rs b/common/storage-module/src/lib.rs new file mode 100644 index 00000000..14b2e7a3 --- /dev/null +++ b/common/storage-module/src/lib.rs @@ -0,0 +1,63 @@ +// storage_module.rs + +use multiversx_sc::imports::*; +use multiversx_sc::storage::StorageKey; + +pub const BRIDGE_PROXY_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"bridgeProxyContractAddress"; +pub const BRIDGED_TOKENS_WRAPPER_ADDRESS_STORAGE_KEY: &[u8] = b"bridgedTokensWrapperAddress"; +pub const ESDT_SAFE_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"esdtSafeContractAddress"; +pub const MULTI_TRNASFER_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"multiTransferContractAddress"; +pub const FEE_ESTIMATOR_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"feeEstimatorContractAddress"; + +#[multiversx_sc::module] +pub trait CommonStorageModule { + fn get_bridged_tokens_wrapper_address( + &self, + owner_address: ManagedAddress, + ) -> SingleValueMapper { + SingleValueMapper::<_, _, ManagedAddress>::new_from_address( + owner_address, + StorageKey::new(BRIDGED_TOKENS_WRAPPER_ADDRESS_STORAGE_KEY), + ) + } + + fn get_bridge_proxy_address( + &self, + owner_address: ManagedAddress, + ) -> SingleValueMapper { + SingleValueMapper::<_, _, ManagedAddress>::new_from_address( + owner_address, + StorageKey::new(BRIDGE_PROXY_CONTRACT_ADDRESS_STORAGE_KEY), + ) + } + + fn get_esdt_safe_address( + &self, + owner_address: ManagedAddress, + ) -> SingleValueMapper { + SingleValueMapper::<_, _, ManagedAddress>::new_from_address( + owner_address, + StorageKey::new(ESDT_SAFE_CONTRACT_ADDRESS_STORAGE_KEY), + ) + } + + fn get_multi_transfer_address( + &self, + owner_address: ManagedAddress, + ) -> SingleValueMapper { + SingleValueMapper::<_, _, ManagedAddress>::new_from_address( + owner_address, + StorageKey::new(MULTI_TRNASFER_CONTRACT_ADDRESS_STORAGE_KEY), + ) + } + + fn get_fee_estimator_address( + &self, + owner_address: ManagedAddress, + ) -> SingleValueMapper { + SingleValueMapper::<_, _, ManagedAddress>::new_from_address( + owner_address, + StorageKey::new(FEE_ESTIMATOR_CONTRACT_ADDRESS_STORAGE_KEY), + ) + } +} diff --git a/esdt-safe/Cargo.toml b/esdt-safe/Cargo.toml index 2d4b227c..c6fde736 100644 --- a/esdt-safe/Cargo.toml +++ b/esdt-safe/Cargo.toml @@ -26,6 +26,9 @@ path = "../common/tx-batch-module" [dependencies.max-bridged-amount-module] path = "../common/max-bridged-amount-module" +[dependencies.storage-module] +path = "../common/storage-module" + [dependencies.multiversx-price-aggregator-sc] version = "=0.52.0" diff --git a/esdt-safe/src/esdt_safe_proxy.rs b/esdt-safe/src/esdt_safe_proxy.rs index 6de0d968..036f568d 100644 --- a/esdt-safe/src/esdt_safe_proxy.rs +++ b/esdt-safe/src/esdt_safe_proxy.rs @@ -199,19 +199,6 @@ where .original_result() } - pub fn set_bridged_tokens_wrapper_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setBridgedTokensWrapperAddress") - .argument(&opt_address) - .original_result() - } - pub fn withdraw_total_fees_on_ethereum< Arg0: ProxyArg>, >( @@ -265,15 +252,6 @@ where .original_result() } - pub fn bridged_tokens_wrapper_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getBridgedTokensWrapperAddress") - .original_result() - } - pub fn set_fee_estimator_contract_address< Arg0: ProxyArg>, >( diff --git a/esdt-safe/src/lib.rs b/esdt-safe/src/lib.rs index e27e0cf1..5fab3826 100644 --- a/esdt-safe/src/lib.rs +++ b/esdt-safe/src/lib.rs @@ -34,6 +34,7 @@ pub trait EsdtSafe: + tx_batch_module::TxBatchModule + max_bridged_amount_module::MaxBridgedAmountModule + multiversx_sc_modules::pause::PauseModule + + storage_module::CommonStorageModule { /// fee_estimator_contract_address - The address of a Price Aggregator contract, /// which will get the price of token A in token B @@ -47,6 +48,9 @@ pub trait EsdtSafe: multi_transfer_contract_address: ManagedAddress, eth_tx_gas_limit: BigUint, ) { + self.owner_address_storage() + .set(&self.blockchain().get_caller()); + self.fee_estimator_contract_address() .set(&fee_estimator_contract_address); self.multi_transfer_contract_address() @@ -253,141 +257,144 @@ pub trait EsdtSafe: } fn create_transaction_common( - &self, - to: EthAddress, - opt_refund_address: OptionalValue, - ) -> TransactionDetails { - require!(self.not_paused(), "Cannot create transaction while paused"); - - let (payment_token, payment_amount) = self.call_value().single_fungible_esdt(); - let token_nonce = self.call_value().single_esdt().token_nonce; - require!( - token_nonce == 0, - "Only fungible tokens are accepted for this transaction" - ); - self.require_token_in_whitelist(&payment_token); - - let required_fee = self.calculate_required_fee(&payment_token); - require!( - required_fee < payment_amount, - "Transaction fees cost more than the entire bridged amount" - ); + &self, + to: EthAddress, + opt_refund_address: OptionalValue, + ) -> TransactionDetails { + require!(self.not_paused(), "Cannot create transaction while paused"); - self.require_below_max_amount(&payment_token, &payment_amount); + let (payment_token, payment_amount) = self.call_value().single_fungible_esdt(); + let token_nonce = self.call_value().single_esdt().token_nonce; + require!( + token_nonce == 0, + "Only fungible tokens are accepted for this transaction" + ); + self.require_token_in_whitelist(&payment_token); - // This addr is used for the refund, if the transaction fails - // This is passed by the BridgeTokenWrapper contract - let mut is_refund_tx = false; - let caller = self.blockchain().get_caller(); - let user_addr = match opt_refund_address { - OptionalValue::Some(addr) => { - require!( - caller == self.bridged_tokens_wrapper_address().get(), - "Wrong caller for a refund tx" - ); - is_refund_tx = true; - addr - } - OptionalValue::None => self.blockchain().get_caller(), - }; + let required_fee = self.calculate_required_fee(&payment_token); + require!( + required_fee < payment_amount, + "Transaction fees cost more than the entire bridged amount" + ); - self.accumulated_transaction_fees(&payment_token) - .update(|fees| *fees += &required_fee); + self.require_below_max_amount(&payment_token, &payment_amount); - let actual_bridged_amount = payment_amount - required_fee.clone(); - let tx_nonce = self.get_and_save_next_tx_id(); - let tx = Transaction { - block_nonce: self.blockchain().get_block_nonce(), - nonce: tx_nonce, - from: user_addr.as_managed_buffer().clone(), - to: to.as_managed_buffer().clone(), - token_identifier: payment_token.clone(), - amount: actual_bridged_amount.clone(), - is_refund_tx, - }; - - let batch_id = self.add_to_batch(tx.clone()); - if self.mint_burn_token(&payment_token).get() { - let burn_balances_mapper = self.burn_balances(&payment_token); - let mint_balances_mapper = self.mint_balances(&payment_token); - if !self.native_token(&payment_token).get() { - require!( - mint_balances_mapper.get() - >= &burn_balances_mapper.get() + &actual_bridged_amount, - "Not enough minted tokens!" - ); - } - let burn_executed = self.internal_burn(&payment_token, &actual_bridged_amount); - require!(burn_executed, "Cannot do the burn action!"); - burn_balances_mapper.update(|burned| { - *burned += &actual_bridged_amount; - }); - } else { - self.total_balances(&payment_token).update(|total| { - *total += &actual_bridged_amount; - }); + // This addr is used for the refund, if the transaction fails + // This is passed by the BridgeTokenWrapper contract + let mut is_refund_tx = false; + let caller = self.blockchain().get_caller(); + let user_addr = match opt_refund_address { + OptionalValue::Some(addr) => { + require!( + caller + == self + .get_bridged_tokens_wrapper_address(self.owner_address_storage().get()) + .get(), + "Wrong caller for a refund tx" + ); + is_refund_tx = true; + addr } - TransactionDetails { - batch_id, - tx_nonce, - payment_token, - actual_bridged_amount, - required_fee, - to_address: to.as_managed_buffer().clone(), - caller_address: user_addr.as_managed_buffer().clone(), + OptionalValue::None => self.blockchain().get_caller(), + }; + + self.accumulated_transaction_fees(&payment_token) + .update(|fees| *fees += &required_fee); + + let actual_bridged_amount = payment_amount - required_fee.clone(); + let tx_nonce = self.get_and_save_next_tx_id(); + let tx = Transaction { + block_nonce: self.blockchain().get_block_nonce(), + nonce: tx_nonce, + from: user_addr.as_managed_buffer().clone(), + to: to.as_managed_buffer().clone(), + token_identifier: payment_token.clone(), + amount: actual_bridged_amount.clone(), + is_refund_tx, + }; + + let batch_id = self.add_to_batch(tx.clone()); + if self.mint_burn_token(&payment_token).get() { + let burn_balances_mapper = self.burn_balances(&payment_token); + let mint_balances_mapper = self.mint_balances(&payment_token); + if !self.native_token(&payment_token).get() { + require!( + mint_balances_mapper.get() + >= &burn_balances_mapper.get() + &actual_bridged_amount, + "Not enough minted tokens!" + ); } + let burn_executed = self.internal_burn(&payment_token, &actual_bridged_amount); + require!(burn_executed, "Cannot do the burn action!"); + burn_balances_mapper.update(|burned| { + *burned += &actual_bridged_amount; + }); + } else { + self.total_balances(&payment_token).update(|total| { + *total += &actual_bridged_amount; + }); } - - // endpoints - - /// Create an MultiversX -> Ethereum transaction. Only fungible tokens are accepted. - /// - /// Every transfer will have a part of the tokens subtracted as fees. - /// The fee amount depends on the global eth_tx_gas_limit - /// and the current GWEI price, respective to the bridged token - /// - /// fee_amount = price_per_gas_unit * eth_tx_gas_limit - #[payable("*")] - #[endpoint(createTransaction)] - fn create_transaction( - &self, - to: EthAddress, - opt_refund_address: OptionalValue, - ) { - let transaction_details = self.create_transaction_common(to, opt_refund_address); - - self.create_transaction_event( - transaction_details.batch_id, - transaction_details.tx_nonce, - transaction_details.payment_token, - transaction_details.actual_bridged_amount, - transaction_details.required_fee, - transaction_details.to_address, - transaction_details.caller_address, - ); + TransactionDetails { + batch_id, + tx_nonce, + payment_token, + actual_bridged_amount, + required_fee, + to_address: to.as_managed_buffer().clone(), + caller_address: user_addr.as_managed_buffer().clone(), } + } - #[payable("*")] - #[endpoint(createTransactionSCCall)] - fn create_transaction_sc_call( - &self, - to: EthAddress, - data: ManagedBuffer, - opt_refund_address: OptionalValue, - ) { - let transaction_details = self.create_transaction_common(to, opt_refund_address); - - self.create_transaction_sc_call_event( - transaction_details.batch_id, - transaction_details.tx_nonce, - transaction_details.payment_token, - transaction_details.actual_bridged_amount, - transaction_details.required_fee, - transaction_details.to_address, - transaction_details.caller_address, - data, - ); - } + // endpoints + + /// Create an MultiversX -> Ethereum transaction. Only fungible tokens are accepted. + /// + /// Every transfer will have a part of the tokens subtracted as fees. + /// The fee amount depends on the global eth_tx_gas_limit + /// and the current GWEI price, respective to the bridged token + /// + /// fee_amount = price_per_gas_unit * eth_tx_gas_limit + #[payable("*")] + #[endpoint(createTransaction)] + fn create_transaction( + &self, + to: EthAddress, + opt_refund_address: OptionalValue, + ) { + let transaction_details = self.create_transaction_common(to, opt_refund_address); + + self.create_transaction_event( + transaction_details.batch_id, + transaction_details.tx_nonce, + transaction_details.payment_token, + transaction_details.actual_bridged_amount, + transaction_details.required_fee, + transaction_details.to_address, + transaction_details.caller_address, + ); + } + + #[payable("*")] + #[endpoint(createTransactionSCCall)] + fn create_transaction_sc_call( + &self, + to: EthAddress, + data: ManagedBuffer, + opt_refund_address: OptionalValue, + ) { + let transaction_details = self.create_transaction_common(to, opt_refund_address); + + self.create_transaction_sc_call_event( + transaction_details.batch_id, + transaction_details.tx_nonce, + transaction_details.payment_token, + transaction_details.actual_bridged_amount, + transaction_details.required_fee, + transaction_details.to_address, + transaction_details.caller_address, + data, + ); + } /// Claim funds for failed MultiversX -> Ethereum transactions. /// These are not sent automatically to prevent the contract getting stuck. @@ -412,24 +419,6 @@ pub trait EsdtSafe: EsdtTokenPayment::new(token_id, 0, refund_amount) } - #[only_owner] - #[endpoint(setBridgedTokensWrapperAddress)] - fn set_bridged_tokens_wrapper_contract_address( - &self, - opt_address: OptionalValue, - ) { - match opt_address { - OptionalValue::Some(sc_addr) => { - require!( - self.blockchain().is_smart_contract(&sc_addr), - "Invalid bridged tokens wrapper address" - ); - self.bridged_tokens_wrapper_address().set(&sc_addr); - } - OptionalValue::None => self.bridged_tokens_wrapper_address().clear(), - } - } - #[only_owner] #[endpoint(withdrawTotalFeesOnEthereum)] fn withdraw_total_fees_on_ethereum(&self, token_id: TokenIdentifier) { @@ -600,7 +589,6 @@ pub trait EsdtSafe: token_id: &TokenIdentifier, ) -> SingleValueMapper; - #[view(getBridgedTokensWrapperAddress)] - #[storage_mapper("bridgedTokensWrapperAddress")] - fn bridged_tokens_wrapper_address(&self) -> SingleValueMapper; + #[storage_mapper("ownerAddress")] + fn owner_address_storage(&self) -> SingleValueMapper; } diff --git a/esdt-safe/tests/esdt_safe_blackbox_test.rs b/esdt-safe/tests/esdt_safe_blackbox_test.rs index ad3f246c..e4d96658 100644 --- a/esdt-safe/tests/esdt_safe_blackbox_test.rs +++ b/esdt-safe/tests/esdt_safe_blackbox_test.rs @@ -251,27 +251,40 @@ fn init_supply_test() { ) } - #[test] fn init_supply_test_mint_burn() { let mut state = EsdtSafeTestState::new(); state.safe_deploy(); state.config_esdtsafe(); - state.esdt_raw_transction() - .init_supply_mint_burn(NON_WHITELISTED_TOKEN, BigUint::from(10_000u64), BigUint::from(10_000u64)) + state + .esdt_raw_transction() + .init_supply_mint_burn( + NON_WHITELISTED_TOKEN, + BigUint::from(10_000u64), + BigUint::from(10_000u64), + ) .with_result(ExpectError(ERROR, "Token not in whitelist")) - .run(); + .run(); - state.esdt_raw_transction() - .init_supply_mint_burn(TOKEN_ID, BigUint::from(10_000u64), BigUint::from(10_000u64)) - .with_result(ExpectError(ERROR, "Cannot init for non mintable/burnable tokens")) - .run(); + state + .esdt_raw_transction() + .init_supply_mint_burn(TOKEN_ID, BigUint::from(10_000u64), BigUint::from(10_000u64)) + .with_result(ExpectError( + ERROR, + "Cannot init for non mintable/burnable tokens", + )) + .run(); - state.esdt_raw_transction() - .init_supply_mint_burn(TOKEN_WITH_BURN_ROLE, BigUint::from(10_000u64), BigUint::from(10_000u64)) + state + .esdt_raw_transction() + .init_supply_mint_burn( + TOKEN_WITH_BURN_ROLE, + BigUint::from(10_000u64), + BigUint::from(10_000u64), + ) .with_result(ReturnsResult) - .run(); + .run(); let total_minted = state .world @@ -282,7 +295,11 @@ fn init_supply_test_mint_burn() { .returns(ReturnsResult) .run(); - assert_eq!(total_minted, BigUint::from(10_000u64), "Total supply should be 10,000"); + assert_eq!( + total_minted, + BigUint::from(10_000u64), + "Total supply should be 10,000" + ); let total_burned = state .world @@ -293,7 +310,9 @@ fn init_supply_test_mint_burn() { .returns(ReturnsResult) .run(); - assert_eq!(total_burned, BigUint::from(10_000u64), "Total supply should be 10,000") + assert_eq!( + total_burned, + BigUint::from(10_000u64), + "Total supply should be 10,000" + ); } - - diff --git a/esdt-safe/wasm/Cargo.lock b/esdt-safe/wasm/Cargo.lock index 4319c51d..2405d461 100644 --- a/esdt-safe/wasm/Cargo.lock +++ b/esdt-safe/wasm/Cargo.lock @@ -54,6 +54,7 @@ dependencies = [ "multiversx-price-aggregator-sc", "multiversx-sc", "multiversx-sc-modules", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -312,6 +313,13 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "storage-module" +version = "0.1.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "syn" version = "2.0.72" diff --git a/esdt-safe/wasm/src/lib.rs b/esdt-safe/wasm/src/lib.rs index 924c3ef8..b1189b79 100644 --- a/esdt-safe/wasm/src/lib.rs +++ b/esdt-safe/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 47 +// Endpoints: 45 // Async Callback (empty): 1 -// Total number of exported functions: 50 +// Total number of exported functions: 48 #![no_std] @@ -25,12 +25,10 @@ multiversx_sc_wasm_adapter::endpoints! { createTransaction => create_transaction createTransactionSCCall => create_transaction_sc_call claimRefund => claim_refund - setBridgedTokensWrapperAddress => set_bridged_tokens_wrapper_contract_address withdrawTotalFeesOnEthereum => withdraw_total_fees_on_ethereum computeTotalAmmountsFromIndex => compute_total_amounts_from_index getRefundAmounts => get_refund_amounts getTotalRefundAmounts => get_total_refund_amounts - getBridgedTokensWrapperAddress => bridged_tokens_wrapper_address setFeeEstimatorContractAddress => set_fee_estimator_contract_address setEthTxGasLimit => set_eth_tx_gas_limit setDefaultPricePerGasUnit => set_default_price_per_gas_unit diff --git a/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs b/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs index 02abddd9..59bb0b9e 100644 --- a/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs +++ b/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs @@ -404,16 +404,6 @@ impl MultiTransferTestState { )) .run(); - self.world - .tx() - .from(OWNER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_bridged_tokens_wrapper_contract_address(OptionalValue::Some( - BRIDGED_TOKENS_WRAPPER_ADDRESS.to_address(), - )) - .run(); - self.world .tx() .from(OWNER_ADDRESS) diff --git a/multisig/src/storage.rs b/multisig/src/storage.rs index e130c3c4..b9d45be8 100644 --- a/multisig/src/storage.rs +++ b/multisig/src/storage.rs @@ -102,4 +102,12 @@ pub trait StorageModule { #[view(getProxyAddress)] #[storage_mapper("proxyAddress")] fn proxy_address(&self) -> SingleValueMapper; + + #[storage_mapper("bridgedTokensWrapperAddress")] + fn bridged_tokens_wrapper_address( + &self, + ) -> SingleValueMapper>; + + #[storage_mapper("feeEstimatorAddress")] + fn fee_estimator_address(&self) -> SingleValueMapper>; } From 3a00a3567efe2f27efc4664547394cc430f314da Mon Sep 17 00:00:00 2001 From: evelinemolnar Date: Mon, 7 Oct 2024 13:55:03 +0300 Subject: [PATCH 02/21] small-update --- esdt-safe/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/esdt-safe/src/lib.rs b/esdt-safe/src/lib.rs index 5fab3826..de8e33a9 100644 --- a/esdt-safe/src/lib.rs +++ b/esdt-safe/src/lib.rs @@ -50,7 +50,6 @@ pub trait EsdtSafe: ) { self.owner_address_storage() .set(&self.blockchain().get_caller()); - self.fee_estimator_contract_address() .set(&fee_estimator_contract_address); self.multi_transfer_contract_address() From d81bdcb7e247e3a7666cb7aa53b42659e26c5b9d Mon Sep 17 00:00:00 2001 From: evelinemolnar Date: Wed, 9 Oct 2024 11:59:37 +0300 Subject: [PATCH 03/21] some changes --- Cargo.lock | 4 ++ Cargo.toml | 4 +- bridge-proxy/Cargo.toml | 3 + bridge-proxy/src/bridge-proxy.rs | 10 +-- bridge-proxy/src/config.rs | 64 +------------------ bridged-tokens-wrapper/Cargo.toml | 3 + bridged-tokens-wrapper/src/lib.rs | 48 +++----------- .../bridged_tokens_wrapper_whitebox_test.rs | 4 +- common/fee-estimator-module/Cargo.toml | 3 + common/fee-estimator-module/src/lib.rs | 16 ++--- common/storage-module/src/lib.rs | 2 - common/token-module/Cargo.toml | 3 + common/token-module/src/lib.rs | 24 ++----- esdt-safe/src/lib.rs | 20 +++--- multi-transfer-esdt/src/lib.rs | 56 +--------------- multisig/sc-config.toml | 5 +- 16 files changed, 64 insertions(+), 205 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 31095bd1..a191c63d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -129,6 +129,7 @@ dependencies = [ "multiversx-sc-modules", "multiversx-sc-scenario", "num-bigint", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -150,6 +151,7 @@ dependencies = [ "multiversx-sc", "multiversx-sc-modules", "multiversx-sc-scenario", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -384,6 +386,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-scenario", + "storage-module", ] [[package]] @@ -1090,6 +1093,7 @@ dependencies = [ "fee-estimator-module", "multiversx-sc", "multiversx-sc-scenario", + "storage-module", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 9d2c98db..96ffbe09 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,5 +11,5 @@ members = [ "bridged-tokens-wrapper", "bridged-tokens-wrapper/meta", "test-caller", - "test-caller/meta" -, "common/storage-module"] + "test-caller/meta", + "common/storage-module"] diff --git a/bridge-proxy/Cargo.toml b/bridge-proxy/Cargo.toml index dcd40cbb..3a983078 100644 --- a/bridge-proxy/Cargo.toml +++ b/bridge-proxy/Cargo.toml @@ -17,6 +17,9 @@ path = "../common/eth-address" [dependencies.token-module] path = "../common/token-module" +[dependencies.storage-module] +path = "../common/storage-module" + [dependencies.tx-batch-module] path = "../common/tx-batch-module" diff --git a/bridge-proxy/src/bridge-proxy.rs b/bridge-proxy/src/bridge-proxy.rs index e680b60f..961326ac 100644 --- a/bridge-proxy/src/bridge-proxy.rs +++ b/bridge-proxy/src/bridge-proxy.rs @@ -1,5 +1,5 @@ #![no_std] -use multiversx_sc::imports::*; +use multiversx_sc::{imports::*, storage}; pub mod bridge_proxy_contract_proxy; pub mod bridged_tokens_wrapper_proxy; @@ -13,7 +13,9 @@ const DELAY_BEFORE_OWNER_CAN_CANCEL_TRANSACTION: u64 = 300; #[multiversx_sc::contract] pub trait BridgeProxyContract: - config::ConfigModule + multiversx_sc_modules::pause::PauseModule + config::ConfigModule + + multiversx_sc_modules::pause::PauseModule + + storage_module::CommonStorageModule { #[init] fn init(&self, opt_multi_transfer_address: OptionalValue) { @@ -34,7 +36,7 @@ pub trait BridgeProxyContract: let caller = self.blockchain().get_caller(); let payment = self.call_value().single_esdt(); require!( - caller == self.multi_transfer_address().get(), + caller == self.get_multi_transfer_address(owner_address), "Only MultiTransfer can do deposits" ); let tx_id = self.pending_transactions().push(ð_tx); @@ -120,7 +122,7 @@ pub trait BridgeProxyContract: fn refund_transaction(&self, tx_id: usize) { let tx = self.get_pending_transaction_by_id(tx_id); let payment = self.payments(tx_id).get(); - let esdt_safe_addr = self.bridged_tokens_wrapper_address().get(); + let esdt_safe_addr = self.get_bridged_tokens_wrapper_address(owner_address); self.tx() .to(esdt_safe_addr) diff --git a/bridge-proxy/src/config.rs b/bridge-proxy/src/config.rs index e0741ccc..a70c0008 100644 --- a/bridge-proxy/src/config.rs +++ b/bridge-proxy/src/config.rs @@ -4,68 +4,8 @@ use transaction::EthTransaction; #[multiversx_sc::module] pub trait ConfigModule { - #[only_owner] - #[endpoint(setMultiTransferAddress)] - fn set_multi_transfer_contract_address( - &self, - opt_multi_transfer_address: OptionalValue, - ) { - match opt_multi_transfer_address { - OptionalValue::Some(sc_addr) => { - require!( - self.blockchain().is_smart_contract(&sc_addr), - "Invalid multi-transfer address" - ); - self.multi_transfer_address().set(&sc_addr); - } - OptionalValue::None => self.multi_transfer_address().clear(), - } - } - - #[only_owner] - #[endpoint(setBridgedTokensWrapperAddress)] - fn set_bridged_tokens_wrapper_contract_address( - &self, - opt_address: OptionalValue, - ) { - match opt_address { - OptionalValue::Some(sc_addr) => { - require!( - self.blockchain().is_smart_contract(&sc_addr), - "Invalid bridged tokens wrapper address" - ); - self.bridged_tokens_wrapper_address().set(&sc_addr); - } - OptionalValue::None => self.bridged_tokens_wrapper_address().clear(), - } - } - - #[only_owner] - #[endpoint(setEsdtSafeAddress)] - fn set_esdt_safe_contract_address(&self, opt_address: OptionalValue) { - match opt_address { - OptionalValue::Some(sc_addr) => { - require!( - self.blockchain().is_smart_contract(&sc_addr), - "Invalid bridged tokens wrapper address" - ); - self.esdt_safe_contract_address().set(&sc_addr); - } - OptionalValue::None => self.esdt_safe_contract_address().clear(), - } - } - - #[view(getMultiTransferAddress)] - #[storage_mapper("multiTransferAddress")] - fn multi_transfer_address(&self) -> SingleValueMapper; - - #[view(getBridgedTokensWrapperAddress)] - #[storage_mapper("bridgedTokensWrapperAddress")] - fn bridged_tokens_wrapper_address(&self) -> SingleValueMapper; - - #[view(getEsdtSafeContractAddress)] - #[storage_mapper("esdtSafeContractAddress")] - fn esdt_safe_contract_address(&self) -> SingleValueMapper; + #[storage_mapper("ownerAddress")] + fn owner_address_storage(&self) -> SingleValueMapper>; #[storage_mapper("pending_transactions")] fn pending_transactions(&self) -> VecMapper>; diff --git a/bridged-tokens-wrapper/Cargo.toml b/bridged-tokens-wrapper/Cargo.toml index 1c6e1682..2b49904f 100644 --- a/bridged-tokens-wrapper/Cargo.toml +++ b/bridged-tokens-wrapper/Cargo.toml @@ -20,6 +20,9 @@ path = "../common/token-module" [dependencies.tx-batch-module] path = "../common/tx-batch-module" +[dependencies.storage-module] +path = "../common/storage-module" + [dependencies.multiversx-sc] version = "=0.52.3" diff --git a/bridged-tokens-wrapper/src/lib.rs b/bridged-tokens-wrapper/src/lib.rs index 69045f2f..e249d69d 100644 --- a/bridged-tokens-wrapper/src/lib.rs +++ b/bridged-tokens-wrapper/src/lib.rs @@ -15,7 +15,9 @@ impl DFPBigUint {} #[multiversx_sc::contract] pub trait BridgedTokensWrapper: - multiversx_sc_modules::pause::PauseModule + events::EventsModule + multiversx_sc_modules::pause::PauseModule + + events::EventsModule + + storage_module::CommonStorageModule { #[init] fn init(&self) { @@ -264,7 +266,10 @@ pub trait BridgedTokensWrapper: let refunding_addr = match opt_refunding_address { OptionalValue::Some(refunding_addr) => { require!( - caller == self.bridge_proxy_contract_address().get(), + caller + == self + .get_bridge_proxy_address(self.blockchain().get_owner_address()) + .get(), "Wrong caller for a refund tx" ); refunding_addr @@ -273,7 +278,9 @@ pub trait BridgedTokensWrapper: }; self.tx() - .to(self.esdt_safe_contract_address().get()) + .to(self + .get_esdt_safe_address(self.blockchain().get_owner_address()) + .get()) .typed(esdt_safe_proxy::EsdtSafeProxy) .create_transaction(to, OptionalValue::Some(refunding_addr)) .single_esdt(&requested_token, 0, &converted_amount) @@ -316,33 +323,6 @@ pub trait BridgedTokensWrapper: ); } - #[only_owner] - #[endpoint(setEsdtSafeContractAddress)] - fn set_esdt_safe_contract_address(&self, opt_new_address: OptionalValue) { - match opt_new_address { - OptionalValue::Some(sc_addr) => { - self.esdt_safe_contract_address().set(&sc_addr); - } - OptionalValue::None => self.esdt_safe_contract_address().clear(), - } - } - - #[only_owner] - #[endpoint(setBridgeProxyContractAddress)] - fn set_bridge_proxy_contract_address(&self, opt_new_address: OptionalValue) { - match opt_new_address { - OptionalValue::Some(sc_addr) => { - require!( - self.blockchain().is_smart_contract(&sc_addr), - "Invalid bridge proxy contract address" - ); - - self.bridge_proxy_contract_address().set(&sc_addr); - } - OptionalValue::None => self.bridge_proxy_contract_address().clear(), - } - } - #[view(getUniversalBridgedTokenIds)] #[storage_mapper("universalBridgedTokenIds")] fn universal_bridged_token_ids(&self) -> UnorderedSetMapper; @@ -367,12 +347,4 @@ pub trait BridgedTokensWrapper: #[storage_mapper("token_decimals_num")] fn token_decimals_num(&self, token: &TokenIdentifier) -> SingleValueMapper; - - #[view(getEsdtSafeContractAddress)] - #[storage_mapper("esdtSafeContractAddress")] - fn esdt_safe_contract_address(&self) -> SingleValueMapper; - - #[view(getBridgeProxyContractAddress)] - #[storage_mapper("bridgeProxyContractAddress")] - fn bridge_proxy_contract_address(&self) -> SingleValueMapper; } diff --git a/bridged-tokens-wrapper/tests/bridged_tokens_wrapper_whitebox_test.rs b/bridged-tokens-wrapper/tests/bridged_tokens_wrapper_whitebox_test.rs index 808fb693..c13e1df0 100644 --- a/bridged-tokens-wrapper/tests/bridged_tokens_wrapper_whitebox_test.rs +++ b/bridged-tokens-wrapper/tests/bridged_tokens_wrapper_whitebox_test.rs @@ -153,7 +153,9 @@ fn test_set_esdt_safe_contract_address_should_work() { ); world.whitebox_query(&bridged_tokens_wrapper, |sc| { - let result = sc.esdt_safe_contract_address().get(); + let result = sc + .get_esdt_safe_address(sc.blockchain().get_owner_address()) + .get(); assert_eq!(result, managed_address!(&esdt_address.to_address())); }); diff --git a/common/fee-estimator-module/Cargo.toml b/common/fee-estimator-module/Cargo.toml index aed9a0db..7ee2d9ce 100644 --- a/common/fee-estimator-module/Cargo.toml +++ b/common/fee-estimator-module/Cargo.toml @@ -9,3 +9,6 @@ version = "=0.52.3" [dev-dependencies.multiversx-sc-scenario] version = "=0.52.3" + +[dependencies.storage-module] +path = "../storage-module" \ No newline at end of file diff --git a/common/fee-estimator-module/src/lib.rs b/common/fee-estimator-module/src/lib.rs index e7aa8cb3..2f3e7908 100644 --- a/common/fee-estimator-module/src/lib.rs +++ b/common/fee-estimator-module/src/lib.rs @@ -6,13 +6,7 @@ mod price_aggregator_proxy; pub const GWEI_STRING: &[u8] = b"GWEI"; #[multiversx_sc::module] -pub trait FeeEstimatorModule { - #[only_owner] - #[endpoint(setFeeEstimatorContractAddress)] - fn set_fee_estimator_contract_address(&self, new_address: ManagedAddress) { - self.fee_estimator_contract_address().set(&new_address); - } - +pub trait FeeEstimatorModule: storage_module::CommonStorageModule { #[only_owner] #[endpoint(setEthTxGasLimit)] fn set_eth_tx_gas_limit(&self, new_limit: BigUint) { @@ -59,7 +53,9 @@ pub trait FeeEstimatorModule { from: &TokenIdentifier, to: &TokenIdentifier, ) -> Option { - let fee_estimator_sc_address = self.fee_estimator_contract_address().get(); + let fee_estimator_sc_address = self + .get_fee_estimator_address(self.blockchain().get_owner_address()) + .get(); if fee_estimator_sc_address.is_zero() { return None; } @@ -82,10 +78,6 @@ pub trait FeeEstimatorModule { // storage - #[view(getFeeEstimatorContractAddress)] - #[storage_mapper("feeEstimatorContractAddress")] - fn fee_estimator_contract_address(&self) -> SingleValueMapper; - #[view(getDefaultPricePerGasUnit)] #[storage_mapper("defaultPricePerGasUnit")] fn default_price_per_gas_unit(&self, token_id: &TokenIdentifier) -> SingleValueMapper; diff --git a/common/storage-module/src/lib.rs b/common/storage-module/src/lib.rs index 14b2e7a3..c404011b 100644 --- a/common/storage-module/src/lib.rs +++ b/common/storage-module/src/lib.rs @@ -1,5 +1,3 @@ -// storage_module.rs - use multiversx_sc::imports::*; use multiversx_sc::storage::StorageKey; diff --git a/common/token-module/Cargo.toml b/common/token-module/Cargo.toml index 168b8738..d9747c8d 100644 --- a/common/token-module/Cargo.toml +++ b/common/token-module/Cargo.toml @@ -7,6 +7,9 @@ edition = "2018" [dependencies.fee-estimator-module] path = "../fee-estimator-module" +[dependencies.storage-module] +path = "../storage-module" + [dependencies.multiversx-sc] version = "=0.52.3" diff --git a/common/token-module/src/lib.rs b/common/token-module/src/lib.rs index 68ef3958..f6632b66 100644 --- a/common/token-module/src/lib.rs +++ b/common/token-module/src/lib.rs @@ -14,7 +14,9 @@ pub struct AddressPercentagePair { } #[multiversx_sc::module] -pub trait TokenModule: fee_estimator_module::FeeEstimatorModule { +pub trait TokenModule: + fee_estimator_module::FeeEstimatorModule + storage_module::CommonStorageModule +{ // endpoints - owner-only /// Distributes the accumulated fees to the given addresses. @@ -131,7 +133,10 @@ pub trait TokenModule: fee_estimator_module::FeeEstimatorModule { fn get_tokens(&self, token_id: &TokenIdentifier, amount: &BigUint) -> bool { let caller = self.blockchain().get_caller(); require!( - caller == self.multi_transfer_contract_address().get(), + caller + == self + .get_multi_transfer_address(self.blockchain().get_owner_address()) + .get(), "Only MultiTransfer can get tokens" ); @@ -256,17 +261,6 @@ pub trait TokenModule: fee_estimator_module::FeeEstimatorModule { roles.has_role(role) } - #[only_owner] - #[endpoint(setMultiTransferContractAddress)] - fn set_multi_transfer_contract_address(&self, opt_new_address: OptionalValue) { - match opt_new_address { - OptionalValue::Some(sc_addr) => { - self.multi_transfer_contract_address().set(&sc_addr); - } - OptionalValue::None => self.multi_transfer_contract_address().clear(), - } - } - // storage #[view(getAllKnownTokens)] @@ -281,10 +275,6 @@ pub trait TokenModule: fee_estimator_module::FeeEstimatorModule { #[storage_mapper("mintBurnToken")] fn mint_burn_token(&self, token: &TokenIdentifier) -> SingleValueMapper; - #[view(getMultiTransferContractAddress)] - #[storage_mapper("multiTransferContractAddress")] - fn multi_transfer_contract_address(&self) -> SingleValueMapper; - #[view(getAccumulatedTransactionFees)] #[storage_mapper("accumulatedTransactionFees")] fn accumulated_transaction_fees( diff --git a/esdt-safe/src/lib.rs b/esdt-safe/src/lib.rs index de8e33a9..16699eaf 100644 --- a/esdt-safe/src/lib.rs +++ b/esdt-safe/src/lib.rs @@ -48,12 +48,9 @@ pub trait EsdtSafe: multi_transfer_contract_address: ManagedAddress, eth_tx_gas_limit: BigUint, ) { - self.owner_address_storage() - .set(&self.blockchain().get_caller()); - self.fee_estimator_contract_address() - .set(&fee_estimator_contract_address); - self.multi_transfer_contract_address() - .set(&multi_transfer_contract_address); + self.get_fee_estimator_address(self.blockchain().get_owner_address()) + .set(fee_estimator_contract_address); + self.set_multi_transfer_address(multi_transfer_contract_address); self.eth_tx_gas_limit().set(ð_tx_gas_limit); @@ -161,7 +158,9 @@ pub trait EsdtSafe: #[endpoint(addRefundBatch)] fn add_refund_batch(&self, refund_transactions: ManagedVec>) { let caller = self.blockchain().get_caller(); - let multi_transfer_address = self.multi_transfer_contract_address().get(); + let multi_transfer_address = self + .get_multi_transfer_address(self.blockchain().get_owner_address()) + .get(); require!(caller == multi_transfer_address, "Invalid caller"); let refund_payments = self.call_value().all_esdt_transfers().deref().clone(); @@ -287,7 +286,9 @@ pub trait EsdtSafe: require!( caller == self - .get_bridged_tokens_wrapper_address(self.owner_address_storage().get()) + .get_bridged_tokens_wrapper_address( + self.blockchain().get_owner_address() + ) .get(), "Wrong caller for a refund tx" ); @@ -587,7 +588,4 @@ pub trait EsdtSafe: address: &ManagedAddress, token_id: &TokenIdentifier, ) -> SingleValueMapper; - - #[storage_mapper("ownerAddress")] - fn owner_address_storage(&self) -> SingleValueMapper; } diff --git a/multi-transfer-esdt/src/lib.rs b/multi-transfer-esdt/src/lib.rs index 19ddce0d..3360430d 100644 --- a/multi-transfer-esdt/src/lib.rs +++ b/multi-transfer-esdt/src/lib.rs @@ -148,39 +148,7 @@ pub trait MultiTransferEsdt: OptionalValue::None => {} } } - - #[only_owner] - #[endpoint(setWrappingContractAddress)] - fn set_wrapping_contract_address(&self, opt_new_address: OptionalValue) { - match opt_new_address { - OptionalValue::Some(sc_addr) => { - require!( - self.blockchain().is_smart_contract(&sc_addr), - "Invalid unwrapping contract address" - ); - - self.wrapping_contract_address().set(&sc_addr); - } - OptionalValue::None => self.wrapping_contract_address().clear(), - } - } - - #[only_owner] - #[endpoint(setBridgeProxyContractAddress)] - fn set_bridge_proxy_contract_address(&self, opt_new_address: OptionalValue) { - match opt_new_address { - OptionalValue::Some(sc_addr) => { - require!( - self.blockchain().is_smart_contract(&sc_addr), - "Invalid bridge proxy contract address" - ); - - self.bridge_proxy_contract_address().set(&sc_addr); - } - OptionalValue::None => self.bridge_proxy_contract_address().clear(), - } - } - + #[only_owner] #[endpoint(addUnprocessedRefundTxToBatch)] fn add_unprocessed_refund_tx_to_batch(&self, tx_id: u64) { @@ -192,17 +160,6 @@ pub trait MultiTransferEsdt: self.unprocessed_refund_txs(tx_id).clear(); } - #[only_owner] - #[endpoint(setEsdtSafeContractAddress)] - fn set_esdt_safe_contract_address(&self, opt_new_address: OptionalValue) { - match opt_new_address { - OptionalValue::Some(sc_addr) => { - self.esdt_safe_contract_address().set(&sc_addr); - } - OptionalValue::None => self.esdt_safe_contract_address().clear(), - } - } - // private fn is_refund_valid(&self, token_id: &TokenIdentifier) -> bool { @@ -308,17 +265,6 @@ pub trait MultiTransferEsdt: } // storage - #[view(getWrappingContractAddress)] - #[storage_mapper("wrappingContractAddress")] - fn wrapping_contract_address(&self) -> SingleValueMapper; - - #[view(getBridgeProxyContractAddress)] - #[storage_mapper("bridgeProxyContractAddress")] - fn bridge_proxy_contract_address(&self) -> SingleValueMapper; - - #[view(getEsdtSafeContractAddress)] - #[storage_mapper("esdtSafeContractAddress")] - fn esdt_safe_contract_address(&self) -> SingleValueMapper; #[storage_mapper("unprocessedRefundTxs")] fn unprocessed_refund_txs(&self, tx_id: u64) -> SingleValueMapper>; diff --git a/multisig/sc-config.toml b/multisig/sc-config.toml index c310a529..83df00e7 100644 --- a/multisig/sc-config.toml +++ b/multisig/sc-config.toml @@ -1,4 +1,7 @@ [settings] [[proxy]] -path = "src/multisig_proxy.rs" \ No newline at end of file +path = "src/multisig_proxy.rs" + +[[proxy]] +path = "../common/storage_module/src/multisig_proxy.rs" \ No newline at end of file From 27db8e86873e1841baf1e11eb9bc31194a1e649e Mon Sep 17 00:00:00 2001 From: Eveline Molnar Date: Thu, 24 Oct 2024 13:15:25 +0300 Subject: [PATCH 04/21] refactor after merge --- Cargo.lock | 25 ++ bridge-proxy/Cargo.toml | 12 + bridge-proxy/src/bridge-proxy.rs | 18 +- .../tests/bridge_proxy_blackbox_test.rs | 129 +++++--- bridge-proxy/wasm/Cargo.lock | 56 ++++ bridge-proxy/wasm/src/lib.rs | 10 +- bridged-tokens-wrapper/src/lib.rs | 14 +- .../bridged_tokens_wrapper_whitebox_test.rs | 47 --- bridged-tokens-wrapper/wasm/Cargo.lock | 10 + bridged-tokens-wrapper/wasm/src/lib.rs | 6 +- .../mock-multisig/sc-config.toml | 4 + .../mock-multisig/src/mock_multisig.rs | 65 +++- .../mock-multisig/wasm/src/lib.rs | 9 +- .../src/bridge_proxy_contract_proxy.rs | 72 +---- .../src/bridged_tokens_wrapper_proxy.rs | 22 -- common/sc-proxies/src/esdt_safe_proxy.rs | 111 +------ common/sc-proxies/src/lib.rs | 1 + common/sc-proxies/src/mock_multisig_proxy.rs | 156 ++++++++++ .../src/multi_transfer_esdt_proxy.rs | 66 ----- common/sc-proxies/src/multisig_proxy.rs | 103 +++---- common/storage-module/Cargo.toml | 4 +- common/storage-module/src/lib.rs | 9 +- esdt-safe/Cargo.toml | 15 + esdt-safe/src/lib.rs | 36 +-- esdt-safe/tests/esdt_safe_blackbox_test.rs | 129 ++++++-- esdt-safe/wasm/Cargo.lock | 51 ++++ esdt-safe/wasm/src/lib.rs | 12 +- multi-transfer-esdt/Cargo.toml | 9 + multi-transfer-esdt/src/lib.rs | 16 +- .../tests/multi_transfer_blackbox_test.rs | 277 +++++++++--------- multi-transfer-esdt/wasm/Cargo.lock | 59 ++++ multi-transfer-esdt/wasm/src/lib.rs | 10 +- multisig/sc-config.toml | 5 +- ...elayer_call_data_several_tx_test.scen.json | 116 ++------ ...o_multiversx_relayer_query2_test.scen.json | 116 ++------ ...to_multiversx_relayer_query_test.scen.json | 116 ++------ ...sx_tx_batch_ok_call_data_encoded.scen.json | 116 ++------ multisig/src/lib.rs | 36 +++ multisig/src/setup.rs | 68 +---- multisig/src/storage.rs | 2 + multisig/tests/multisig_blackbox_test.rs | 127 ++++---- multisig/wasm/Cargo.lock | 59 ++++ multisig/wasm/src/lib.rs | 10 +- 43 files changed, 1168 insertions(+), 1166 deletions(-) create mode 100644 common/mock-contracts/mock-multisig/sc-config.toml create mode 100644 common/sc-proxies/src/mock_multisig_proxy.rs diff --git a/Cargo.lock b/Cargo.lock index 21d2050c..a7344cea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -123,11 +123,16 @@ dependencies = [ "esdt-safe", "eth-address", "mock-bridged-tokens-wrapper", + "mock-esdt-safe", + "mock-multi-transfer-esdt", + "mock-multisig", + "mock-price-aggregator", "multiversx-sc", "multiversx-sc-modules", "multiversx-sc-scenario", "num-bigint", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -150,6 +155,7 @@ dependencies = [ "multiversx-sc-modules", "multiversx-sc-scenario", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -375,11 +381,17 @@ dependencies = [ "eth-address", "fee-estimator-module", "max-bridged-amount-module", + "mock-bridge-proxy", + "mock-bridged-tokens-wrapper", + "mock-multi-transfer-esdt", + "mock-multisig", + "mock-price-aggregator", "multiversx-price-aggregator-sc", "multiversx-sc", "multiversx-sc-modules", "multiversx-sc-scenario", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -406,6 +418,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-scenario", + "storage-module", ] [[package]] @@ -665,10 +678,13 @@ dependencies = [ "esdt-safe", "eth-address", "max-bridged-amount-module", + "mock-multisig", + "mock-price-aggregator", "multiversx-sc", "multiversx-sc-modules", "multiversx-sc-scenario", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -1128,6 +1144,14 @@ dependencies = [ "der", ] +[[package]] +name = "storage-module" +version = "0.1.0" +dependencies = [ + "multiversx-sc", + "multiversx-sc-scenario", +] + [[package]] name = "strsim" version = "0.11.1" @@ -1185,6 +1209,7 @@ dependencies = [ "fee-estimator-module", "multiversx-sc", "multiversx-sc-scenario", + "storage-module", ] [[package]] diff --git a/bridge-proxy/Cargo.toml b/bridge-proxy/Cargo.toml index 9df65b76..7db0cc53 100644 --- a/bridge-proxy/Cargo.toml +++ b/bridge-proxy/Cargo.toml @@ -35,6 +35,18 @@ path = "../bridged-tokens-wrapper" [dependencies.mock-bridged-tokens-wrapper] path = "../common/mock-contracts/mock-bridged-tokens-wrapper" +[dependencies.mock-esdt-safe] +path = "../common/mock-contracts/mock-esdt-safe" + +[dependencies.mock-multisig] +path = "../common/mock-contracts/mock-multisig" + +[dependencies.mock-price-aggregator] +path = "../common/mock-contracts/mock-price-aggregator" + +[dependencies.mock-multi-transfer-esdt] +path = "../common/mock-contracts/mock-multi-transfer-esdt" + [dependencies.multiversx-sc] version = "=0.53.2" diff --git a/bridge-proxy/src/bridge-proxy.rs b/bridge-proxy/src/bridge-proxy.rs index 02066844..9fc85e65 100644 --- a/bridge-proxy/src/bridge-proxy.rs +++ b/bridge-proxy/src/bridge-proxy.rs @@ -18,11 +18,10 @@ pub trait BridgeProxyContract: config::ConfigModule + multiversx_sc_modules::pause::PauseModule + storage_module::CommonStorageModule -+ multiversx_sc_modules::ongoing_operation::OngoingOperationModule + + multiversx_sc_modules::ongoing_operation::OngoingOperationModule { #[init] - fn init(&self, opt_multi_transfer_address: OptionalValue) { - self.set_multi_transfer_contract_address(opt_multi_transfer_address); + fn init(&self) { self.lowest_tx_id().set(1); self.set_paused(true); } @@ -39,7 +38,10 @@ pub trait BridgeProxyContract: let caller = self.blockchain().get_caller(); let payment = self.call_value().single_esdt(); require!( - caller == self.get_multi_transfer_address(owner_address), + caller + == self + .get_multi_transfer_address(self.blockchain().get_owner_address()) + .get(), "Only MultiTransfer can do deposits" ); let tx_id = self.pending_transactions().push(ð_tx); @@ -132,7 +134,9 @@ pub trait BridgeProxyContract: fn refund_transaction(&self, tx_id: usize) { let tx = self.get_pending_transaction_by_id(tx_id); - let esdt_safe_contract_address = self.get_esdt_safe_address(owner_address); + let esdt_safe_contract_address = self + .get_esdt_safe_address(self.blockchain().get_owner_address()) + .get(); let unwrapped_token = self.unwrap_token(&tx.token_id, tx_id); let batch_id = self.batch_id(tx_id).get(); @@ -157,7 +161,9 @@ pub trait BridgeProxyContract: fn unwrap_token(&self, requested_token: &TokenIdentifier, tx_id: usize) -> EsdtTokenPayment { let payment = self.payments(tx_id).get(); - let bridged_tokens_wrapper_address = self.bridged_tokens_wrapper_address().get(); + let bridged_tokens_wrapper_address = self + .get_bridged_tokens_wrapper_address(self.blockchain().get_owner_address()) + .get(); let transfers = self .tx() diff --git a/bridge-proxy/tests/bridge_proxy_blackbox_test.rs b/bridge-proxy/tests/bridge_proxy_blackbox_test.rs index d054bed1..dc6b85d8 100644 --- a/bridge-proxy/tests/bridge_proxy_blackbox_test.rs +++ b/bridge-proxy/tests/bridge_proxy_blackbox_test.rs @@ -4,15 +4,14 @@ use std::collections::LinkedList; use std::ops::Add; use bridge_proxy::config::ProxyTrait as _; -use bridge_proxy::ProxyTrait; use crowdfunding_esdt::crowdfunding_esdt_proxy; use multiversx_sc::codec::NestedEncode; use multiversx_sc::contract_base::ManagedSerializer; use multiversx_sc::sc_print; use multiversx_sc::types::{ - EgldOrEsdtTokenIdentifier, EsdtTokenPayment, ManagedOption, ReturnsNewAddress, TestAddress, - TestSCAddress, TestTokenIdentifier, + EgldOrEsdtTokenIdentifier, EsdtTokenPayment, ManagedOption, MultiValueEncoded, + ReturnsNewAddress, ReturnsResult, TestAddress, TestSCAddress, TestTokenIdentifier, }; use multiversx_sc::{ api::{HandleConstraints, ManagedTypeApi}, @@ -37,7 +36,9 @@ use multiversx_sc_scenario::{ use multiversx_sc_scenario::{ExpectValue, ScenarioTxRun}; use eth_address::*; -use sc_proxies::{bridge_proxy_contract_proxy, bridged_tokens_wrapper_proxy, esdt_safe_proxy}; +use sc_proxies::{ + bridge_proxy_contract_proxy, bridged_tokens_wrapper_proxy, esdt_safe_proxy, mock_multisig_proxy, +}; use transaction::{CallData, EthTransaction}; const BRIDGE_TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("BRIDGE-123456"); @@ -51,17 +52,30 @@ const BRIDGE_PROXY_ADDRESS: TestSCAddress = TestSCAddress::new("bridge-proxy"); const CROWDFUNDING_ADDRESS: TestSCAddress = TestSCAddress::new("crowfunding"); const MULTI_TRANSFER_ADDRESS: TestSCAddress = TestSCAddress::new("multi-transfer"); const ESDT_SAFE_ADDRESS: TestSCAddress = TestSCAddress::new("esdt-safe"); +const FEE_ESTIMATOR_ADDRESS: TestSCAddress = TestSCAddress::new("fee-estimator"); +const MULTISIG_ADDRESS: TestSCAddress = TestSCAddress::new("multisig"); const BRIDGED_TOKENS_WRAPPER_ADDRESS: TestSCAddress = TestSCAddress::new("bridged-tokens-wrapper"); const NO_INIT_SC_ADDRESS: TestSCAddress = TestSCAddress::new("no-init-sc"); const BRIDGE_PROXY_PATH_EXPR: MxscPath = MxscPath::new("output/bridge-proxy.mxsc.json"); const CROWDFUNDING_PATH_EXPR: MxscPath = MxscPath::new("tests/test-contract/crowdfunding-esdt.mxsc.json"); -const MOCK_MULTI_TRANSFER_PATH_EXPR: MxscPath = MxscPath::new("mxsc:../common/mock-contracts/mock-multi-transfer-esdt/output/mock-multi-transfer-esdt.mxsc.json"); +const MOCK_MULTI_TRANSFER_PATH_EXPR: MxscPath = MxscPath::new( + "../common/mock-contracts/mock-multi-transfer-esdt/output/mock-multi-transfer-esdt.mxsc.json", +); const MOCK_ESDT_SAFE_PATH_EXPR: MxscPath = - MxscPath::new("mxsc:../common/mock-contrats/mock-esdt-safe/output/mock-esdt-safe.mxsc.json"); + MxscPath::new("../common/mock-contrats/mock-esdt-safe/output/mock-esdt-safe.mxsc.json"); const MOCK_BRIDGED_TOKENS_WRAPPER_CODE_PATH_EXPR: MxscPath = MxscPath::new("../common/mock-contracts/mock-bridged-tokens-wrapper/output/mock-bridged-tokens-wrapper.mxsc.json"); +const MOCK_MULTISIG_CODE_PATH: MxscPath = + MxscPath::new("../common/mock-contracts/mock-multisig/output/mock-multisig.mxsc.json"); +const MOCK_PRICE_AGGREGATOR_CODE_PATH: MxscPath = MxscPath::new( + "../common/mock-contracts/mock-price-aggregator/output/mock-price-aggregator.mxsc.json", +); +const USER1_ADDRESS: TestAddress = TestAddress::new("user1"); +const USER2_ADDRESS: TestAddress = TestAddress::new("user2"); +const RELAYER1_ADDRESS: TestAddress = TestAddress::new("relayer1"); +const RELAYER2_ADDRESS: TestAddress = TestAddress::new("relayer2"); fn world() -> ScenarioWorld { let mut blockchain = ScenarioWorld::new(); @@ -72,6 +86,16 @@ fn world() -> ScenarioWorld { MOCK_BRIDGED_TOKENS_WRAPPER_CODE_PATH_EXPR, mock_bridged_tokens_wrapper::ContractBuilder, ); + blockchain.register_contract( + MOCK_PRICE_AGGREGATOR_CODE_PATH, + mock_price_aggregator::ContractBuilder, + ); + blockchain.register_contract( + MOCK_MULTI_TRANSFER_PATH_EXPR, + mock_multi_transfer_esdt::ContractBuilder, + ); + blockchain.register_contract(MOCK_ESDT_SAFE_PATH_EXPR, mock_esdt_safe::ContractBuilder); + blockchain.register_contract(MOCK_MULTISIG_CODE_PATH, mock_multisig::ContractBuilder); blockchain } @@ -119,9 +143,9 @@ impl BridgeProxyTestState { fn deploy_bridge_proxy(&mut self) -> &mut Self { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .typed(bridge_proxy_contract_proxy::BridgeProxyContractProxy) - .init(OptionalValue::Some(MULTI_TRANSFER_ADDRESS)) + .init() .code(BRIDGE_PROXY_PATH_EXPR) .new_address(BRIDGE_PROXY_ADDRESS) .run(); @@ -129,16 +153,38 @@ impl BridgeProxyTestState { self } - fn deploy_esdt_safe(&mut self) -> &mut Self { + fn multisig_deploy(&mut self) -> &mut Self { + let mut board: MultiValueEncoded> = + MultiValueEncoded::new(); + board.push(ManagedAddress::from(RELAYER1_ADDRESS.eval_to_array())); + board.push(ManagedAddress::from(RELAYER2_ADDRESS.eval_to_array())); self.world .tx() .from(OWNER_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) + .typed(mock_multisig_proxy::MockMultisigProxy) .init( - ManagedAddress::zero(), - ManagedAddress::zero(), - BigUint::zero(), + ESDT_SAFE_ADDRESS, + MULTI_TRANSFER_ADDRESS, + BRIDGE_PROXY_ADDRESS, + BRIDGED_TOKENS_WRAPPER_ADDRESS, + FEE_ESTIMATOR_ADDRESS, + 1_000u64, + 500u64, + 2usize, + board, ) + .code(MOCK_MULTISIG_CODE_PATH) + .new_address(MULTISIG_ADDRESS) + .run(); + self + } + + fn deploy_esdt_safe(&mut self) -> &mut Self { + self.world + .tx() + .from(MULTISIG_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .init(BigUint::zero()) .code(MOCK_ESDT_SAFE_PATH_EXPR) .new_address(BRIDGE_PROXY_ADDRESS) .run(); @@ -149,7 +195,7 @@ impl BridgeProxyTestState { fn deploy_bridged_tokens_wrapper(&mut self) -> &mut Self { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .init() .code(MOCK_BRIDGED_TOKENS_WRAPPER_CODE_PATH_EXPR) @@ -162,7 +208,7 @@ impl BridgeProxyTestState { fn deploy_crowdfunding(&mut self) -> &mut Self { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .typed(crowdfunding_esdt_proxy::CrowdfundingProxy) .init( 2_000u32, @@ -178,29 +224,12 @@ impl BridgeProxyTestState { fn config_bridge(&mut self) -> &mut Self { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(BRIDGE_PROXY_ADDRESS) .typed(bridge_proxy_contract_proxy::BridgeProxyContractProxy) .unpause_endpoint() .run(); - self.world - .tx() - .from(OWNER_ADDRESS) - .to(BRIDGE_PROXY_ADDRESS) - .typed(bridge_proxy_contract_proxy::BridgeProxyContractProxy) - .set_bridged_tokens_wrapper_contract_address(OptionalValue::Some( - BRIDGED_TOKENS_WRAPPER_ADDRESS, - )) - .run(); - - self.world - .tx() - .from(OWNER_ADDRESS) - .to(BRIDGE_PROXY_ADDRESS) - .typed(bridge_proxy_contract_proxy::BridgeProxyContractProxy) - .set_esdt_safe_contract_address(OptionalValue::Some(ESDT_SAFE_ADDRESS)) - .run(); self } } @@ -208,15 +237,44 @@ impl BridgeProxyTestState { #[test] fn deploy_test() { let mut test = BridgeProxyTestState::new(); - + test.multisig_deploy(); test.deploy_bridge_proxy(); test.deploy_crowdfunding(); + test.config_bridge(); + + let multi_tr = test + .world + .query() + .to(MULTISIG_ADDRESS) + .typed(mock_multisig_proxy::MockMultisigProxy) + .multi_transfer_esdt_address() + .returns(ExpectValue(MULTI_TRANSFER_ADDRESS)) + .run(); + + let esdt_addr = test + .world + .query() + .to(MULTISIG_ADDRESS) + .typed(mock_multisig_proxy::MockMultisigProxy) + .esdt_safe_address() + .returns(ExpectValue(ESDT_SAFE_ADDRESS)) + .run(); + + let btw_addr = test + .world + .query() + .to(MULTISIG_ADDRESS) + .typed(mock_multisig_proxy::MockMultisigProxy) + .bridged_tokens_wrapper_address() + .returns(ExpectValue(BRIDGED_TOKENS_WRAPPER_ADDRESS)) + .run(); } #[test] fn bridge_proxy_execute_crowdfunding_test() { let mut test = BridgeProxyTestState::new(); + test.multisig_deploy(); test.deploy_bridge_proxy(); test.deploy_crowdfunding(); @@ -287,6 +345,7 @@ fn bridge_proxy_execute_crowdfunding_test() { fn multiple_deposit_test() { let mut test = BridgeProxyTestState::new(); + test.multisig_deploy(); test.deploy_bridge_proxy(); test.deploy_crowdfunding(); test.config_bridge(); @@ -403,6 +462,7 @@ fn multiple_deposit_test() { fn test_lowest_tx_id() { let mut test = BridgeProxyTestState::new(); + test.multisig_deploy(); test.deploy_bridge_proxy(); test.deploy_crowdfunding(); test.config_bridge(); @@ -505,6 +565,7 @@ fn test_lowest_tx_id() { fn bridge_proxy_wrong_formatting_sc_call_test() { let mut test = BridgeProxyTestState::new(); + test.multisig_deploy(); test.deploy_bridge_proxy(); test.deploy_crowdfunding(); test.config_bridge(); diff --git a/bridge-proxy/wasm/Cargo.lock b/bridge-proxy/wasm/Cargo.lock index 56e578c3..27a44e1f 100644 --- a/bridge-proxy/wasm/Cargo.lock +++ b/bridge-proxy/wasm/Cargo.lock @@ -29,9 +29,14 @@ dependencies = [ "esdt-safe", "eth-address", "mock-bridged-tokens-wrapper", + "mock-esdt-safe", + "mock-multi-transfer-esdt", + "mock-multisig", + "mock-price-aggregator", "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -53,6 +58,7 @@ dependencies = [ "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -97,10 +103,16 @@ dependencies = [ "eth-address", "fee-estimator-module", "max-bridged-amount-module", + "mock-bridge-proxy", + "mock-bridged-tokens-wrapper", + "mock-multi-transfer-esdt", + "mock-multisig", + "mock-price-aggregator", "multiversx-price-aggregator-sc", "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -118,6 +130,7 @@ name = "fee-estimator-module" version = "0.0.0" dependencies = [ "multiversx-sc", + "storage-module", ] [[package]] @@ -173,6 +186,13 @@ dependencies = [ "multiversx-sc", ] +[[package]] +name = "mock-bridge-proxy" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "mock-bridged-tokens-wrapper" version = "0.0.0" @@ -181,6 +201,34 @@ dependencies = [ "multiversx-sc", ] +[[package]] +name = "mock-esdt-safe" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-multi-transfer-esdt" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-multisig" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-price-aggregator" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "multiversx-price-aggregator-sc" version = "0.53.2" @@ -370,6 +418,13 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "storage-module" +version = "0.1.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "syn" version = "2.0.77" @@ -387,6 +442,7 @@ version = "0.0.0" dependencies = [ "fee-estimator-module", "multiversx-sc", + "storage-module", ] [[package]] diff --git a/bridge-proxy/wasm/src/lib.rs b/bridge-proxy/wasm/src/lib.rs index bcfd0f92..08980570 100644 --- a/bridge-proxy/wasm/src/lib.rs +++ b/bridge-proxy/wasm/src/lib.rs @@ -6,10 +6,10 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 15 +// Endpoints: 9 // Async Callback (empty): 1 // Promise callbacks: 1 -// Total number of exported functions: 19 +// Total number of exported functions: 13 #![no_std] @@ -26,12 +26,6 @@ multiversx_sc_wasm_adapter::endpoints! { updateLowestTxId => update_lowest_tx_id getPendingTransactionById => get_pending_transaction_by_id getPendingTransactions => get_pending_transactions - setMultiTransferAddress => set_multi_transfer_contract_address - setBridgedTokensWrapperAddress => set_bridged_tokens_wrapper_contract_address - setEsdtSafeAddress => set_esdt_safe_contract_address - getMultiTransferAddress => multi_transfer_address - getBridgedTokensWrapperAddress => bridged_tokens_wrapper_address - getEsdtSafeContractAddress => esdt_safe_contract_address lowestTxId => lowest_tx_id pause => pause_endpoint unpause => unpause_endpoint diff --git a/bridged-tokens-wrapper/src/lib.rs b/bridged-tokens-wrapper/src/lib.rs index 0c04097d..37e07539 100644 --- a/bridged-tokens-wrapper/src/lib.rs +++ b/bridged-tokens-wrapper/src/lib.rs @@ -1,7 +1,6 @@ #![no_std] mod dfp_big_uint; -mod esdt_safe_proxy; mod events; use core::ops::Deref; @@ -268,11 +267,14 @@ pub trait BridgedTokensWrapper: .get_esdt_safe_address(self.blockchain().get_owner_address()) .get()) .typed(esdt_safe_proxy::EsdtSafeProxy) - .create_transaction(to, OptionalValue::Some(esdt_safe_proxy::RefundInfo { - address: caller, - initial_batch_id: 0, - initial_nonce: 0, - })) + .create_transaction( + to, + OptionalValue::Some(esdt_safe_proxy::RefundInfo { + address: caller, + initial_batch_id: 0, + initial_nonce: 0, + }), + ) .single_esdt(&requested_token, 0, &converted_amount) .sync_call(); } diff --git a/bridged-tokens-wrapper/tests/bridged_tokens_wrapper_whitebox_test.rs b/bridged-tokens-wrapper/tests/bridged_tokens_wrapper_whitebox_test.rs index b16b697c..dda52bef 100644 --- a/bridged-tokens-wrapper/tests/bridged_tokens_wrapper_whitebox_test.rs +++ b/bridged-tokens-wrapper/tests/bridged_tokens_wrapper_whitebox_test.rs @@ -131,45 +131,6 @@ fn test_require_tokens_have_set_decimals_num_should_work() { ); } -#[test] -fn test_set_esdt_safe_contract_address_should_work() { - let mut world = setup(); - let bridged_tokens_wrapper = WhiteboxContract::new( - BRIDGE_TOKENS_WRAPPER_ADDRESS_EXPR, - bridged_tokens_wrapper::contract_obj, - ); - - let esdt_address_expr = "address:from".to_string(); - let esdt_address = AddressValue::from(esdt_address_expr.as_str()); - - world.whitebox_call( - &bridged_tokens_wrapper, - ScCallStep::new().from(OWNER_ADDRESS_EXPR), - |sc| { - sc.set_esdt_safe_contract_address(OptionalValue::Some(managed_address!( - &esdt_address.to_address() - ))); - }, - ); - - world.whitebox_query(&bridged_tokens_wrapper, |sc| { - let result = sc - .get_esdt_safe_address(sc.blockchain().get_owner_address()) - .get(); - assert_eq!(result, managed_address!(&esdt_address.to_address())); - }); - - world.whitebox_call( - &bridged_tokens_wrapper, - ScCallStep::new().from(OWNER_ADDRESS_EXPR), - |sc| { - sc.set_esdt_safe_contract_address(OptionalValue::None); - let result = sc.esdt_safe_contract_address().is_empty(); - assert!(result); - }, - ); -} - #[test] fn test_require_mint_and_burn_roles_should_fail() { let mut world = setup(); @@ -426,9 +387,6 @@ fn test_unwrap_token_create_transaction_should_fail_case_1() { .expect(TxExpect::user_error("str:Contract is paused")), |sc| { sc.set_paused(true); - sc.set_esdt_safe_contract_address(OptionalValue::Some(ManagedAddress::new_from_bytes( - b"0102030405060708090a0b0c0d0e0f10", - ))); let address = convert_to_eth_address(ETH_ADDRESS); sc.unwrap_token_create_transaction( @@ -623,11 +581,6 @@ fn test_unwrap_token_create_transaction_should_work() { sc.deposit_liquidity(); sc.chain_specific_to_universal_mapping(&managed_token_id!(UNIVERSAL_TOKEN_IDENTIFIER)) .set(managed_token_id!(UNIVERSAL_TOKEN_IDENTIFIER)); - let esdt_address_expr = "sc:esdt_safe".to_string(); - let esdt_address = AddressValue::from(esdt_address_expr.as_str()); - sc.set_esdt_safe_contract_address(OptionalValue::Some(managed_address!( - &esdt_address.to_address() - ))); }, ); } diff --git a/bridged-tokens-wrapper/wasm/Cargo.lock b/bridged-tokens-wrapper/wasm/Cargo.lock index a1ac5003..b9c24aa6 100644 --- a/bridged-tokens-wrapper/wasm/Cargo.lock +++ b/bridged-tokens-wrapper/wasm/Cargo.lock @@ -28,6 +28,7 @@ dependencies = [ "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -59,6 +60,7 @@ name = "fee-estimator-module" version = "0.0.0" dependencies = [ "multiversx-sc", + "storage-module", ] [[package]] @@ -204,6 +206,13 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "storage-module" +version = "0.1.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "syn" version = "2.0.77" @@ -221,6 +230,7 @@ version = "0.0.0" dependencies = [ "fee-estimator-module", "multiversx-sc", + "storage-module", ] [[package]] diff --git a/bridged-tokens-wrapper/wasm/src/lib.rs b/bridged-tokens-wrapper/wasm/src/lib.rs index 29f9d9c1..cdad1731 100644 --- a/bridged-tokens-wrapper/wasm/src/lib.rs +++ b/bridged-tokens-wrapper/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 19 +// Endpoints: 17 // Async Callback (empty): 1 -// Total number of exported functions: 22 +// Total number of exported functions: 20 #![no_std] @@ -30,12 +30,10 @@ multiversx_sc_wasm_adapter::endpoints! { wrapTokens => wrap_tokens unwrapToken => unwrap_token unwrapTokenCreateTransaction => unwrap_token_create_transaction - setEsdtSafeContractAddress => set_esdt_safe_contract_address getUniversalBridgedTokenIds => universal_bridged_token_ids getTokenLiquidity => token_liquidity getChainSpecificToUniversalMapping => chain_specific_to_universal_mapping getchainSpecificTokenIds => chain_specific_token_ids - getEsdtSafeContractAddress => esdt_safe_contract_address pause => pause_endpoint unpause => unpause_endpoint isPaused => paused_status diff --git a/common/mock-contracts/mock-multisig/sc-config.toml b/common/mock-contracts/mock-multisig/sc-config.toml new file mode 100644 index 00000000..4909f4db --- /dev/null +++ b/common/mock-contracts/mock-multisig/sc-config.toml @@ -0,0 +1,4 @@ +[settings] + +[[proxy]] +path = "../../sc-proxies/src/mock_multisig_proxy.rs" \ No newline at end of file diff --git a/common/mock-contracts/mock-multisig/src/mock_multisig.rs b/common/mock-contracts/mock-multisig/src/mock_multisig.rs index ad242251..f68ecbe8 100644 --- a/common/mock-contracts/mock-multisig/src/mock_multisig.rs +++ b/common/mock-contracts/mock-multisig/src/mock_multisig.rs @@ -9,16 +9,75 @@ pub trait MockMultisig { #[init] fn init( &self, - _esdt_safe_sc_address: ManagedAddress, - _multi_transfer_sc_address: ManagedAddress, - _proxy_sc_address: ManagedAddress, + esdt_safe_sc_address: ManagedAddress, + multi_transfer_sc_address: ManagedAddress, + proxy_sc_address: ManagedAddress, + bridged_tokens_wrapper_sc_address: ManagedAddress, + price_aggregator_sc_address: ManagedAddress, _required_stake: BigUint, _slash_amount: BigUint, _quorum: usize, _board: MultiValueEncoded, ) { + require!( + self.blockchain().is_smart_contract(&esdt_safe_sc_address), + "Esdt Safe address is not a Smart Contract address" + ); + self.esdt_safe_address().set(&esdt_safe_sc_address); + + require!( + self.blockchain() + .is_smart_contract(&multi_transfer_sc_address), + "Multi Transfer address is not a Smart Contract address" + ); + self.multi_transfer_esdt_address() + .set(&multi_transfer_sc_address); + + require!( + self.blockchain().is_smart_contract(&proxy_sc_address), + "Proxy address is not a Smart Contract address" + ); + self.proxy_address().set(&proxy_sc_address); + + require!( + self.blockchain() + .is_smart_contract(&bridged_tokens_wrapper_sc_address), + "Bridged Tokens Wrapper address is not a Smart Contract address" + ); + self.bridged_tokens_wrapper_address() + .set(&bridged_tokens_wrapper_sc_address); + + require!( + self.blockchain() + .is_smart_contract(&price_aggregator_sc_address), + "Price Aggregator address is not a Smart Contract address" + ); + self.fee_estimator_address() + .set(&price_aggregator_sc_address); } #[upgrade] fn upgrade(&self) {} + + #[view(getEsdtSafeAddress)] + #[storage_mapper("esdtSafeAddress")] + fn esdt_safe_address(&self) -> SingleValueMapper; + + #[view(getMultiTransferEsdtAddress)] + #[storage_mapper("multiTransferEsdtAddress")] + fn multi_transfer_esdt_address(&self) -> SingleValueMapper; + + #[view(getProxyAddress)] + #[storage_mapper("proxyAddress")] + fn proxy_address(&self) -> SingleValueMapper; + + #[view(getBridgedTokensWrapperAddress)] + #[storage_mapper("bridgedTokensWrapperAddress")] + fn bridged_tokens_wrapper_address( + &self, + ) -> SingleValueMapper>; + + #[view(getFeeEstimatorAddress)] + #[storage_mapper("feeEstimatorAddress")] + fn fee_estimator_address(&self) -> SingleValueMapper>; } diff --git a/common/mock-contracts/mock-multisig/wasm/src/lib.rs b/common/mock-contracts/mock-multisig/wasm/src/lib.rs index 5bfb784e..d0dfbf36 100644 --- a/common/mock-contracts/mock-multisig/wasm/src/lib.rs +++ b/common/mock-contracts/mock-multisig/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 0 +// Endpoints: 5 // Async Callback (empty): 1 -// Total number of exported functions: 3 +// Total number of exported functions: 8 #![no_std] @@ -20,6 +20,11 @@ multiversx_sc_wasm_adapter::endpoints! { ( init => init upgrade => upgrade + getEsdtSafeAddress => esdt_safe_address + getMultiTransferEsdtAddress => multi_transfer_esdt_address + getProxyAddress => proxy_address + getBridgedTokensWrapperAddress => bridged_tokens_wrapper_address + getFeeEstimatorAddress => fee_estimator_address ) } diff --git a/common/sc-proxies/src/bridge_proxy_contract_proxy.rs b/common/sc-proxies/src/bridge_proxy_contract_proxy.rs index 768889b6..ab6c6573 100644 --- a/common/sc-proxies/src/bridge_proxy_contract_proxy.rs +++ b/common/sc-proxies/src/bridge_proxy_contract_proxy.rs @@ -43,16 +43,12 @@ where From: TxFrom, Gas: TxGas, { - pub fn init< - Arg0: ProxyArg>>, - >( + pub fn init( self, - opt_multi_transfer_address: Arg0, ) -> TxTypedDeploy { self.wrapped_tx .payment(NotPayable) .raw_deploy() - .argument(&opt_multi_transfer_address) .original_result() } } @@ -144,72 +140,6 @@ where .original_result() } - pub fn set_multi_transfer_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_multi_transfer_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setMultiTransferAddress") - .argument(&opt_multi_transfer_address) - .original_result() - } - - pub fn set_bridged_tokens_wrapper_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setBridgedTokensWrapperAddress") - .argument(&opt_address) - .original_result() - } - - pub fn set_esdt_safe_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setEsdtSafeAddress") - .argument(&opt_address) - .original_result() - } - - pub fn multi_transfer_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getMultiTransferAddress") - .original_result() - } - - pub fn bridged_tokens_wrapper_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getBridgedTokensWrapperAddress") - .original_result() - } - - pub fn esdt_safe_contract_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getEsdtSafeContractAddress") - .original_result() - } - pub fn lowest_tx_id( self, ) -> TxTypedCall { diff --git a/common/sc-proxies/src/bridged_tokens_wrapper_proxy.rs b/common/sc-proxies/src/bridged_tokens_wrapper_proxy.rs index df5b7a63..fbfdbaaa 100644 --- a/common/sc-proxies/src/bridged_tokens_wrapper_proxy.rs +++ b/common/sc-proxies/src/bridged_tokens_wrapper_proxy.rs @@ -218,19 +218,6 @@ where .original_result() } - pub fn set_esdt_safe_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_new_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setEsdtSafeContractAddress") - .argument(&opt_new_address) - .original_result() - } - pub fn universal_bridged_token_ids( self, ) -> TxTypedCall>> { @@ -279,15 +266,6 @@ where .original_result() } - pub fn esdt_safe_contract_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getEsdtSafeContractAddress") - .original_result() - } - pub fn pause_endpoint( self, ) -> TxTypedCall { diff --git a/common/sc-proxies/src/esdt_safe_proxy.rs b/common/sc-proxies/src/esdt_safe_proxy.rs index b05212a2..3b29e253 100644 --- a/common/sc-proxies/src/esdt_safe_proxy.rs +++ b/common/sc-proxies/src/esdt_safe_proxy.rs @@ -49,20 +49,14 @@ where /// eth_tx_gas_limit - The gas limit that will be used for transactions on the ETH side. /// Will be used to compute the fees for the transfer pub fn init< - Arg0: ProxyArg>, - Arg1: ProxyArg>, - Arg2: ProxyArg>, + Arg0: ProxyArg>, >( self, - fee_estimator_contract_address: Arg0, - multi_transfer_contract_address: Arg1, - eth_tx_gas_limit: Arg2, + eth_tx_gas_limit: Arg0, ) -> TxTypedDeploy { self.wrapped_tx .payment(NotPayable) .raw_deploy() - .argument(&fee_estimator_contract_address) - .argument(&multi_transfer_contract_address) .argument(ð_tx_gas_limit) .original_result() } @@ -78,23 +72,14 @@ where Gas: TxGas, { pub fn upgrade< - Arg0: ProxyArg>, - Arg1: ProxyArg>, - Arg2: ProxyArg>, - Arg3: ProxyArg>, + Arg0: ProxyArg>, >( self, - fee_estimator_contract_address: Arg0, - multi_transfer_contract_address: Arg1, - bridge_proxy_contract_address: Arg2, - eth_tx_gas_limit: Arg3, + eth_tx_gas_limit: Arg0, ) -> TxTypedUpgrade { self.wrapped_tx .payment(NotPayable) .raw_upgrade() - .argument(&fee_estimator_contract_address) - .argument(&multi_transfer_contract_address) - .argument(&bridge_proxy_contract_address) .argument(ð_tx_gas_limit) .original_result() } @@ -202,32 +187,6 @@ where .original_result() } - pub fn set_bridged_tokens_wrapper_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setBridgedTokensWrapperAddress") - .argument(&opt_address) - .original_result() - } - - pub fn set_bridge_proxy_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_new_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setBridgeProxyContractAddress") - .argument(&opt_new_address) - .original_result() - } - pub fn withdraw_refund_fees_for_ethereum< Arg0: ProxyArg>, Arg1: ProxyArg>, @@ -326,37 +285,6 @@ where .original_result() } - pub fn bridged_tokens_wrapper_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getBridgedTokensWrapperAddress") - .original_result() - } - - pub fn bridge_proxy_contract_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getBridgeProxyContractAddress") - .original_result() - } - - pub fn set_fee_estimator_contract_address< - Arg0: ProxyArg>, - >( - self, - new_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setFeeEstimatorContractAddress") - .argument(&new_address) - .original_result() - } - pub fn set_eth_tx_gas_limit< Arg0: ProxyArg>, >( @@ -419,15 +347,6 @@ where .original_result() } - pub fn fee_estimator_contract_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getFeeEstimatorContractAddress") - .original_result() - } - pub fn default_price_per_gas_unit< Arg0: ProxyArg>, >( @@ -562,19 +481,6 @@ where .original_result() } - pub fn set_multi_transfer_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_new_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setMultiTransferContractAddress") - .argument(&opt_new_address) - .original_result() - } - pub fn token_whitelist( self, ) -> TxTypedCall>> { @@ -610,15 +516,6 @@ where .original_result() } - pub fn multi_transfer_contract_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getMultiTransferContractAddress") - .original_result() - } - pub fn accumulated_transaction_fees< Arg0: ProxyArg>, >( diff --git a/common/sc-proxies/src/lib.rs b/common/sc-proxies/src/lib.rs index ca235320..014a4311 100644 --- a/common/sc-proxies/src/lib.rs +++ b/common/sc-proxies/src/lib.rs @@ -4,5 +4,6 @@ pub mod bridge_proxy_contract_proxy; pub mod bridged_tokens_wrapper_proxy; pub mod crowdfunding_esdt_proxy; pub mod esdt_safe_proxy; +pub mod mock_multisig_proxy; pub mod multi_transfer_esdt_proxy; pub mod multisig_proxy; diff --git a/common/sc-proxies/src/mock_multisig_proxy.rs b/common/sc-proxies/src/mock_multisig_proxy.rs new file mode 100644 index 00000000..8f23fa83 --- /dev/null +++ b/common/sc-proxies/src/mock_multisig_proxy.rs @@ -0,0 +1,156 @@ +// 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 MockMultisigProxy; + +impl TxProxyTrait for MockMultisigProxy +where + Env: TxEnv, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + type TxProxyMethods = MockMultisigProxyMethods; + + fn proxy_methods(self, tx: Tx) -> Self::TxProxyMethods { + MockMultisigProxyMethods { wrapped_tx: tx } + } +} + +pub struct MockMultisigProxyMethods +where + Env: TxEnv, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + wrapped_tx: Tx, +} + +#[rustfmt::skip] +impl MockMultisigProxyMethods +where + Env: TxEnv, + Env::Api: VMApi, + From: TxFrom, + Gas: TxGas, +{ + pub fn init< + Arg0: ProxyArg>, + Arg1: ProxyArg>, + Arg2: ProxyArg>, + Arg3: ProxyArg>, + Arg4: ProxyArg>, + Arg5: ProxyArg>, + Arg6: ProxyArg>, + Arg7: ProxyArg, + Arg8: ProxyArg>>, + >( + self, + esdt_safe_sc_address: Arg0, + multi_transfer_sc_address: Arg1, + proxy_sc_address: Arg2, + bridged_tokens_wrapper_sc_address: Arg3, + price_aggregator_sc_address: Arg4, + _required_stake: Arg5, + _slash_amount: Arg6, + _quorum: Arg7, + _board: Arg8, + ) -> TxTypedDeploy { + self.wrapped_tx + .payment(NotPayable) + .raw_deploy() + .argument(&esdt_safe_sc_address) + .argument(&multi_transfer_sc_address) + .argument(&proxy_sc_address) + .argument(&bridged_tokens_wrapper_sc_address) + .argument(&price_aggregator_sc_address) + .argument(&_required_stake) + .argument(&_slash_amount) + .argument(&_quorum) + .argument(&_board) + .original_result() + } +} + +#[rustfmt::skip] +impl MockMultisigProxyMethods +where + Env: TxEnv, + Env::Api: VMApi, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + pub fn upgrade( + self, + ) -> TxTypedUpgrade { + self.wrapped_tx + .payment(NotPayable) + .raw_upgrade() + .original_result() + } +} + +#[rustfmt::skip] +impl MockMultisigProxyMethods +where + Env: TxEnv, + Env::Api: VMApi, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + pub fn esdt_safe_address( + self, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getEsdtSafeAddress") + .original_result() + } + + pub fn multi_transfer_esdt_address( + self, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getMultiTransferEsdtAddress") + .original_result() + } + + pub fn proxy_address( + self, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getProxyAddress") + .original_result() + } + + pub fn bridged_tokens_wrapper_address( + self, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getBridgedTokensWrapperAddress") + .original_result() + } + + pub fn fee_estimator_address( + self, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getFeeEstimatorAddress") + .original_result() + } +} diff --git a/common/sc-proxies/src/multi_transfer_esdt_proxy.rs b/common/sc-proxies/src/multi_transfer_esdt_proxy.rs index 68871989..1fa4e469 100644 --- a/common/sc-proxies/src/multi_transfer_esdt_proxy.rs +++ b/common/sc-proxies/src/multi_transfer_esdt_proxy.rs @@ -106,32 +106,6 @@ where .original_result() } - pub fn set_wrapping_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_new_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setWrappingContractAddress") - .argument(&opt_new_address) - .original_result() - } - - pub fn set_bridge_proxy_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_new_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setBridgeProxyContractAddress") - .argument(&opt_new_address) - .original_result() - } - pub fn add_unprocessed_refund_tx_to_batch< Arg0: ProxyArg, >( @@ -145,46 +119,6 @@ where .original_result() } - pub fn set_esdt_safe_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_new_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setEsdtSafeContractAddress") - .argument(&opt_new_address) - .original_result() - } - - pub fn wrapping_contract_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getWrappingContractAddress") - .original_result() - } - - pub fn bridge_proxy_contract_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getBridgeProxyContractAddress") - .original_result() - } - - pub fn esdt_safe_contract_address( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getEsdtSafeContractAddress") - .original_result() - } - pub fn set_max_tx_batch_size< Arg0: ProxyArg, >( diff --git a/common/sc-proxies/src/multisig_proxy.rs b/common/sc-proxies/src/multisig_proxy.rs index a652c8ba..80334b47 100644 --- a/common/sc-proxies/src/multisig_proxy.rs +++ b/common/sc-proxies/src/multisig_proxy.rs @@ -49,19 +49,23 @@ where Arg0: ProxyArg>, Arg1: ProxyArg>, Arg2: ProxyArg>, - Arg3: ProxyArg>, - Arg4: ProxyArg>, - Arg5: ProxyArg, - Arg6: ProxyArg>>, + Arg3: ProxyArg>, + Arg4: ProxyArg>, + Arg5: ProxyArg>, + Arg6: ProxyArg>, + Arg7: ProxyArg, + Arg8: ProxyArg>>, >( self, esdt_safe_sc_address: Arg0, multi_transfer_sc_address: Arg1, proxy_sc_address: Arg2, - required_stake: Arg3, - slash_amount: Arg4, - quorum: Arg5, - board: Arg6, + bridged_tokens_wrapper_sc_address: Arg3, + price_aggregator_sc_address: Arg4, + required_stake: Arg5, + slash_amount: Arg6, + quorum: Arg7, + board: Arg8, ) -> TxTypedDeploy { self.wrapped_tx .payment(NotPayable) @@ -69,6 +73,8 @@ where .argument(&esdt_safe_sc_address) .argument(&multi_transfer_sc_address) .argument(&proxy_sc_address) + .argument(&bridged_tokens_wrapper_sc_address) + .argument(&price_aggregator_sc_address) .argument(&required_stake) .argument(&slash_amount) .argument(&quorum) @@ -90,11 +96,15 @@ where Arg0: ProxyArg>, Arg1: ProxyArg>, Arg2: ProxyArg>, + Arg3: ProxyArg>, + Arg4: ProxyArg>, >( self, esdt_safe_sc_address: Arg0, multi_transfer_sc_address: Arg1, proxy_sc_address: Arg2, + bridged_tokens_wrapper_sc_address: Arg3, + price_aggregator_sc_address: Arg4, ) -> TxTypedUpgrade { self.wrapped_tx .payment(NotPayable) @@ -102,6 +112,8 @@ where .argument(&esdt_safe_sc_address) .argument(&multi_transfer_sc_address) .argument(&proxy_sc_address) + .argument(&bridged_tokens_wrapper_sc_address) + .argument(&price_aggregator_sc_address) .original_result() } } @@ -483,25 +495,6 @@ where .original_result() } - pub fn change_fee_estimator_contract_address< - Arg0: ProxyArg>, - >( - self, - new_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("changeFeeEstimatorContractAddress") - .argument(&new_address) - .original_result() - } - - /// Sets the gas limit being used for Ethereum transactions - /// This is used in the EsdtSafe contract to determine the fee amount - /// - /// fee_amount = eth_gas_limit * price_per_gas_unit - /// - /// where price_per_gas_unit is queried from the aggregator (fee estimator SC) pub fn change_multiversx_to_eth_gas_limit< Arg0: ProxyArg>, >( @@ -584,24 +577,6 @@ where .original_result() } - pub fn set_multi_transfer_on_esdt_safe( - self, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setMultiTransferOnEsdtSafe") - .original_result() - } - - pub fn set_esdt_safe_on_multi_transfer( - self, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setEsdtSafeOnMultiTransfer") - .original_result() - } - pub fn esdt_safe_remove_token_from_whitelist< Arg0: ProxyArg>, >( @@ -712,26 +687,6 @@ where .original_result() } - /// Sets the wrapping contract address. - /// This contract is used to map multiple tokens to a universal one. - /// Useful in cases where a single token (USDC for example) - /// is being transferred from multiple chains. - /// - /// They will all have different token IDs, but can be swapped 1:1 in the wrapping SC. - /// The wrapping is done automatically, so the user only receives the universal token. - pub fn multi_transfer_esdt_set_wrapping_contract_address< - Arg0: ProxyArg>>, - >( - self, - opt_wrapping_contract_address: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("multiTransferEsdtSetWrappingContractAddress") - .argument(&opt_wrapping_contract_address) - .original_result() - } - /// Minimum number of signatures needed to perform any action. pub fn quorum( self, @@ -869,6 +824,24 @@ where .original_result() } + pub fn bridged_tokens_wrapper_address( + self, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getBridgedTokensWrapperAddress") + .original_result() + } + + pub fn fee_estimator_address( + self, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getFeeEstimatorAddress") + .original_result() + } + /// Returns the current EsdtSafe batch. /// /// First result is the batch ID, then pairs of 6 results, representing transactions diff --git a/common/storage-module/Cargo.toml b/common/storage-module/Cargo.toml index cf984daa..9378a7ad 100644 --- a/common/storage-module/Cargo.toml +++ b/common/storage-module/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies.multiversx-sc] -version = "=0.52.3" +version = "=0.53.2" [dev-dependencies.multiversx-sc-scenario] -version = "=0.52.3" +version = "=0.53.2" diff --git a/common/storage-module/src/lib.rs b/common/storage-module/src/lib.rs index c404011b..db242d97 100644 --- a/common/storage-module/src/lib.rs +++ b/common/storage-module/src/lib.rs @@ -1,11 +1,12 @@ +#![no_std] use multiversx_sc::imports::*; use multiversx_sc::storage::StorageKey; -pub const BRIDGE_PROXY_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"bridgeProxyContractAddress"; +pub const BRIDGE_PROXY_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"proxyAddress"; pub const BRIDGED_TOKENS_WRAPPER_ADDRESS_STORAGE_KEY: &[u8] = b"bridgedTokensWrapperAddress"; -pub const ESDT_SAFE_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"esdtSafeContractAddress"; -pub const MULTI_TRNASFER_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"multiTransferContractAddress"; -pub const FEE_ESTIMATOR_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"feeEstimatorContractAddress"; +pub const ESDT_SAFE_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"esdtSafeAddress"; +pub const MULTI_TRNASFER_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"multiTransferEsdtAddress"; +pub const FEE_ESTIMATOR_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"feeEstimatorAddress"; #[multiversx_sc::module] pub trait CommonStorageModule { diff --git a/esdt-safe/Cargo.toml b/esdt-safe/Cargo.toml index bf084000..cd93e60f 100644 --- a/esdt-safe/Cargo.toml +++ b/esdt-safe/Cargo.toml @@ -32,6 +32,21 @@ path = "../common/storage-module" [dependencies.sc-proxies] path = "../common/sc-proxies" +[dependencies.mock-bridged-tokens-wrapper] +path = "../common/mock-contracts/mock-bridged-tokens-wrapper" + +[dependencies.mock-multisig] +path = "../common/mock-contracts/mock-multisig" + +[dependencies.mock-bridge-proxy] +path = "../common/mock-contracts/mock-bridge-proxy" + +[dependencies.mock-price-aggregator] +path = "../common/mock-contracts/mock-price-aggregator" + +[dependencies.mock-multi-transfer-esdt] +path = "../common/mock-contracts/mock-multi-transfer-esdt" + [dependencies.multiversx-price-aggregator-sc] version = "=0.53.2" diff --git a/esdt-safe/src/lib.rs b/esdt-safe/src/lib.rs index 51e7714f..a9fd403d 100644 --- a/esdt-safe/src/lib.rs +++ b/esdt-safe/src/lib.rs @@ -52,14 +52,8 @@ pub trait EsdtSafe: #[init] fn init( &self, - fee_estimator_contract_address: ManagedAddress, - multi_transfer_contract_address: ManagedAddress, eth_tx_gas_limit: BigUint, ) { - self.get_fee_estimator_address(self.blockchain().get_owner_address()) - .set(fee_estimator_contract_address); - self.set_multi_transfer_address(multi_transfer_contract_address); - self.eth_tx_gas_limit().set(ð_tx_gas_limit); self.max_tx_batch_size() @@ -82,18 +76,8 @@ pub trait EsdtSafe: #[upgrade] fn upgrade( &self, - fee_estimator_contract_address: ManagedAddress, - multi_transfer_contract_address: ManagedAddress, - bridge_proxy_contract_address: ManagedAddress, eth_tx_gas_limit: BigUint, ) { - self.fee_estimator_contract_address() - .set(&fee_estimator_contract_address); - self.multi_transfer_contract_address() - .set(&multi_transfer_contract_address); - self.bridge_proxy_contract_address(). - set(&bridge_proxy_contract_address); - self.eth_tx_gas_limit().set(ð_tx_gas_limit); self.max_tx_batch_size() @@ -297,10 +281,10 @@ pub trait EsdtSafe: let caller = self.blockchain().get_caller(); let refund_info = match opt_refund_info { OptionalValue::Some(refund_info) => { - if caller == self.bridge_proxy_contract_address().get() { + if caller == self.get_bridge_proxy_address(self.blockchain().get_owner_address()).get() { is_refund_tx = true; refund_info - } else if caller == self.bridged_tokens_wrapper_address().get() { + } else if caller == self.get_bridge_proxy_address(self.blockchain().get_owner_address()).get() { refund_info } else { sc_panic!("Cannot specify a refund address from this caller"); @@ -456,22 +440,6 @@ pub trait EsdtSafe: EsdtTokenPayment::new(token_id, 0, refund_amount) } - #[only_owner] - #[endpoint(setBridgeProxyContractAddress)] - fn set_bridge_proxy_contract_address(&self, opt_new_address: OptionalValue) { - match opt_new_address { - OptionalValue::Some(sc_addr) => { - require!( - self.blockchain().is_smart_contract(&sc_addr), - "Invalid bridge proxy contract address" - ); - - self.bridge_proxy_contract_address().set(&sc_addr); - } - OptionalValue::None => self.bridge_proxy_contract_address().clear(), - } - } - #[only_owner] #[endpoint(withdrawRefundFeesForEthereum)] fn withdraw_refund_fees_for_ethereum( diff --git a/esdt-safe/tests/esdt_safe_blackbox_test.rs b/esdt-safe/tests/esdt_safe_blackbox_test.rs index bf307c63..c1ca520c 100644 --- a/esdt-safe/tests/esdt_safe_blackbox_test.rs +++ b/esdt-safe/tests/esdt_safe_blackbox_test.rs @@ -1,17 +1,34 @@ #![allow(unused)] use esdt_safe::*; -use esdt_safe_proxy::EsdtSafeProxyMethods; use multiversx_sc_scenario::imports::*; use sc_proxies::esdt_safe_proxy::{self, EsdtSafeProxyMethods}; +use sc_proxies::mock_multisig_proxy; const OWNER_ADDRESS: TestAddress = TestAddress::new("owner"); +const BRIDGE_PROXY_ADDRESS: TestSCAddress = TestSCAddress::new("bridge-proxy"); +const CROWDFUNDING_ADDRESS: TestSCAddress = TestSCAddress::new("crowfunding"); +const MULTI_TRANSFER_ADDRESS: TestSCAddress = TestSCAddress::new("multi-transfer"); const ESDT_SAFE_ADDRESS: TestSCAddress = TestSCAddress::new("esdt-safe"); -const MULTI_TRANSFER_ADDRESS: TestSCAddress = TestSCAddress::new("multi-transfer-esdt"); -const FEE_ESTIMATOR_ADDRESS: TestSCAddress = TestSCAddress::new("price-aggregator"); +const FEE_ESTIMATOR_ADDRESS: TestSCAddress = TestSCAddress::new("fee-estimator"); +const MULTISIG_ADDRESS: TestSCAddress = TestSCAddress::new("multisig"); +const BRIDGED_TOKENS_WRAPPER_ADDRESS: TestSCAddress = TestSCAddress::new("bridged-tokens-wrapper"); const ESDT_SAFE_CODE_PATH: MxscPath = MxscPath::new("output/esdt-safe.mxsc.json"); +const MOCK_MULTI_TRANSFER_PATH_EXPR: MxscPath = MxscPath::new( + "../common/mock-contracts/mock-multi-transfer-esdt/output/mock-multi-transfer-esdt.mxsc.json", +); +const MOCK_BRIDGED_TOKENS_WRAPPER_CODE_PATH_EXPR: MxscPath = + MxscPath::new("../common/mock-contracts/mock-bridged-tokens-wrapper/output/mock-bridged-tokens-wrapper.mxsc.json"); +const MOCK_MULTISIG_CODE_PATH: MxscPath = + MxscPath::new("../common/mock-contracts/mock-multisig/output/mock-multisig.mxsc.json"); +const MOCK_PRICE_AGGREGATOR_CODE_PATH: MxscPath = MxscPath::new( + "../common/mock-contracts/mock-price-aggregator/output/mock-price-aggregator.mxsc.json", +); +const MOCK_BRIDGE_PROXY_PATH_EXPR: MxscPath = + MxscPath::new("../common/mock-contracts/mock-bridge-proxy/output/mock-bridge-proxy.mxsc.json"); + const TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("TOKEN-123456"); const NON_WHITELISTED_TOKEN: TestTokenIdentifier = TestTokenIdentifier::new("NON-WHITELISTED-123456"); @@ -20,10 +37,32 @@ const NATIVE_TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("ESDT-123" const ETH_TX_GAS_LIMIT: u64 = 150_000; const ETH_TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("ETH-123456"); const ERROR: u64 = 4; +const USER1_ADDRESS: TestAddress = TestAddress::new("user1"); +const USER2_ADDRESS: TestAddress = TestAddress::new("user2"); +const RELAYER1_ADDRESS: TestAddress = TestAddress::new("relayer1"); +const RELAYER2_ADDRESS: TestAddress = TestAddress::new("relayer2"); fn world() -> ScenarioWorld { let mut blockchain = ScenarioWorld::new(); blockchain.register_contract(ESDT_SAFE_CODE_PATH, esdt_safe::ContractBuilder); + blockchain.register_contract( + MOCK_BRIDGED_TOKENS_WRAPPER_CODE_PATH_EXPR, + mock_bridged_tokens_wrapper::ContractBuilder, + ); + blockchain.register_contract( + MOCK_PRICE_AGGREGATOR_CODE_PATH, + mock_price_aggregator::ContractBuilder, + ); + blockchain.register_contract( + MOCK_MULTI_TRANSFER_PATH_EXPR, + mock_multi_transfer_esdt::ContractBuilder, + ); + blockchain.register_contract(MOCK_MULTISIG_CODE_PATH, mock_multisig::ContractBuilder); + blockchain.register_contract( + MOCK_BRIDGE_PROXY_PATH_EXPR, + mock_bridge_proxy::ContractBuilder, + ); + blockchain } @@ -46,16 +85,38 @@ impl EsdtSafeTestState { Self { world } } - fn safe_deploy(&mut self) -> &mut Self { + fn multisig_deploy(&mut self) -> &mut Self { + let mut board: MultiValueEncoded> = + MultiValueEncoded::new(); + board.push(ManagedAddress::from(RELAYER1_ADDRESS.eval_to_array())); + board.push(ManagedAddress::from(RELAYER2_ADDRESS.eval_to_array())); self.world .tx() .from(OWNER_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) + .typed(mock_multisig_proxy::MockMultisigProxy) .init( - FEE_ESTIMATOR_ADDRESS.to_address(), - MULTI_TRANSFER_ADDRESS.to_address(), - ETH_TX_GAS_LIMIT, + ESDT_SAFE_ADDRESS, + MULTI_TRANSFER_ADDRESS, + BRIDGE_PROXY_ADDRESS, + BRIDGED_TOKENS_WRAPPER_ADDRESS, + FEE_ESTIMATOR_ADDRESS, + 1_000u64, + 500u64, + 2usize, + board, ) + .code(MOCK_MULTISIG_CODE_PATH) + .new_address(MULTISIG_ADDRESS) + .run(); + self + } + + fn safe_deploy(&mut self) -> &mut Self { + self.world + .tx() + .from(MULTISIG_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .init(ETH_TX_GAS_LIMIT) .code(ESDT_SAFE_CODE_PATH) .new_address(ESDT_SAFE_ADDRESS) .run(); @@ -64,7 +125,14 @@ impl EsdtSafeTestState { } fn config_esdtsafe(&mut self) { - self.esdt_raw_transction().unpause_endpoint().run(); + self.world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .unpause_endpoint() + .run(); + self.world.set_esdt_local_roles( ESDT_SAFE_ADDRESS, b"TOKEN-123456", @@ -76,6 +144,33 @@ impl EsdtSafeTestState { BigUint::from(10_000_000u64), ); + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"TOKEN-123456", + BigUint::from(10_000_000u64), + ); + + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"NON-WHITELISTED-123456", + BigUint::from(10_000_000u64), + ); + + self.world + .set_esdt_balance(MULTISIG_ADDRESS, b"ESDT-123", BigUint::from(10_000_000u64)); + + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"TOKEN-WITH-OUT", + BigUint::from(10_000_000u64), + ); + + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"ETH-123456", + BigUint::from(10_000_000u64), + ); + self.esdt_raw_transction() .add_token_to_whitelist( TOKEN_ID, @@ -114,12 +209,6 @@ impl EsdtSafeTestState { OptionalValue::Some(BigUint::from(0u64)), ) .run(); - - self.esdt_raw_transction() - .set_multi_transfer_contract_address(OptionalValue::Some( - MULTI_TRANSFER_ADDRESS.to_address(), - )) - .run(); } fn init_supply_should_fail( @@ -162,10 +251,10 @@ impl EsdtSafeTestState { fn esdt_raw_transction( &mut self, - ) -> EsdtSafeProxyMethods, TestAddress, TestSCAddress, ()> { + ) -> EsdtSafeProxyMethods, TestSCAddress, TestSCAddress, ()> { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) } @@ -174,6 +263,7 @@ impl EsdtSafeTestState { #[test] fn config_test() { let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); state.safe_deploy(); state.config_esdtsafe(); } @@ -181,6 +271,7 @@ fn config_test() { #[test] fn init_supply_test() { let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); state.safe_deploy(); state.config_esdtsafe(); @@ -252,10 +343,10 @@ fn init_supply_test() { ) } - #[test] fn init_supply_test_mint_burn() { let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); state.safe_deploy(); state.config_esdtsafe(); @@ -318,5 +409,3 @@ fn init_supply_test_mint_burn() { "Total supply should be 10,000" ); } - - diff --git a/esdt-safe/wasm/Cargo.lock b/esdt-safe/wasm/Cargo.lock index c2ded35f..0ddbdbb0 100644 --- a/esdt-safe/wasm/Cargo.lock +++ b/esdt-safe/wasm/Cargo.lock @@ -51,10 +51,16 @@ dependencies = [ "eth-address", "fee-estimator-module", "max-bridged-amount-module", + "mock-bridge-proxy", + "mock-bridged-tokens-wrapper", + "mock-multi-transfer-esdt", + "mock-multisig", + "mock-price-aggregator", "multiversx-price-aggregator-sc", "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -80,6 +86,7 @@ name = "fee-estimator-module" version = "0.0.0" dependencies = [ "multiversx-sc", + "storage-module", ] [[package]] @@ -135,6 +142,42 @@ dependencies = [ "multiversx-sc", ] +[[package]] +name = "mock-bridge-proxy" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-bridged-tokens-wrapper" +version = "0.0.0" +dependencies = [ + "eth-address", + "multiversx-sc", +] + +[[package]] +name = "mock-multi-transfer-esdt" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-multisig" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-price-aggregator" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "multiversx-price-aggregator-sc" version = "0.53.2" @@ -324,6 +367,13 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "storage-module" +version = "0.1.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "syn" version = "2.0.77" @@ -341,6 +391,7 @@ version = "0.0.0" dependencies = [ "fee-estimator-module", "multiversx-sc", + "storage-module", ] [[package]] diff --git a/esdt-safe/wasm/src/lib.rs b/esdt-safe/wasm/src/lib.rs index 3d4f204d..283851b2 100644 --- a/esdt-safe/wasm/src/lib.rs +++ b/esdt-safe/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 52 +// Endpoints: 44 // Async Callback (empty): 1 -// Total number of exported functions: 55 +// Total number of exported functions: 47 #![no_std] @@ -25,8 +25,6 @@ multiversx_sc_wasm_adapter::endpoints! { createTransaction => create_transaction createTransactionSCCall => create_transaction_sc_call claimRefund => claim_refund - setBridgedTokensWrapperAddress => set_bridged_tokens_wrapper_contract_address - setBridgeProxyContractAddress => set_bridge_proxy_contract_address withdrawRefundFeesForEthereum => withdraw_refund_fees_for_ethereum withdrawTransactionFees => withdraw_transaction_fees computeTotalAmmountsFromIndex => compute_total_amounts_from_index @@ -34,14 +32,10 @@ multiversx_sc_wasm_adapter::endpoints! { getTotalRefundAmounts => get_total_refund_amounts getRefundFeesForEthereum => get_refund_fees_for_ethereum getTransactionFees => get_transaction_fees - getBridgedTokensWrapperAddress => bridged_tokens_wrapper_address - getBridgeProxyContractAddress => bridge_proxy_contract_address - setFeeEstimatorContractAddress => set_fee_estimator_contract_address setEthTxGasLimit => set_eth_tx_gas_limit setDefaultPricePerGasUnit => set_default_price_per_gas_unit setTokenTicker => set_token_ticker calculateRequiredFee => calculate_required_fee - getFeeEstimatorContractAddress => fee_estimator_contract_address getDefaultPricePerGasUnit => default_price_per_gas_unit getEthTxGasLimit => eth_tx_gas_limit distributeFees => distribute_fees @@ -50,11 +44,9 @@ multiversx_sc_wasm_adapter::endpoints! { getTokens => get_tokens initSupply => init_supply initSupplyMintBurn => init_supply_mint_burn - setMultiTransferContractAddress => set_multi_transfer_contract_address getAllKnownTokens => token_whitelist isNativeToken => native_token isMintBurnToken => mint_burn_token - getMultiTransferContractAddress => multi_transfer_contract_address getAccumulatedTransactionFees => accumulated_transaction_fees getTotalBalances => total_balances getMintBalances => mint_balances diff --git a/multi-transfer-esdt/Cargo.toml b/multi-transfer-esdt/Cargo.toml index 95ec37f4..fbd83241 100644 --- a/multi-transfer-esdt/Cargo.toml +++ b/multi-transfer-esdt/Cargo.toml @@ -32,6 +32,15 @@ path = "../esdt-safe" [dependencies.token-module] path = "../common/token-module" +[dependencies.storage-module] +path = "../common/storage-module" + +[dependencies.mock-multisig] +path = "../common/mock-contracts/mock-multisig" + +[dependencies.mock-price-aggregator] +path = "../common/mock-contracts/mock-price-aggregator" + [dependencies.sc-proxies] path = "../common/sc-proxies" diff --git a/multi-transfer-esdt/src/lib.rs b/multi-transfer-esdt/src/lib.rs index dc6a5f16..ab7e087d 100644 --- a/multi-transfer-esdt/src/lib.rs +++ b/multi-transfer-esdt/src/lib.rs @@ -12,7 +12,7 @@ const CHAIN_SPECIFIC_TO_UNIVERSAL_TOKEN_MAPPING: &[u8] = b"chainSpecificToUniver #[multiversx_sc::contract] pub trait MultiTransferEsdt: - tx_batch_module::TxBatchModule + max_bridged_amount_module::MaxBridgedAmountModule + tx_batch_module::TxBatchModule + max_bridged_amount_module::MaxBridgedAmountModule + storage_module::CommonStorageModule { #[init] fn init(&self) { @@ -50,7 +50,7 @@ pub trait MultiTransferEsdt: let own_sc_address = self.blockchain().get_sc_address(); let sc_shard = self.blockchain().get_shard_of_address(&own_sc_address); - let safe_address = self.esdt_safe_contract_address().get(); + let safe_address = self.get_esdt_safe_address(self.blockchain().get_owner_address()).get(); for eth_tx in transfers { let is_success: bool = self @@ -133,7 +133,7 @@ pub trait MultiTransferEsdt: } } - let esdt_safe_addr = self.esdt_safe_contract_address().get(); + let esdt_safe_addr = self.get_esdt_safe_address(self.blockchain().get_owner_address()).get(); self.tx() .to(esdt_safe_addr) .typed(esdt_safe_proxy::EsdtSafeProxy) @@ -159,7 +159,7 @@ pub trait MultiTransferEsdt: // private fn is_refund_valid(&self, token_id: &TokenIdentifier) -> bool { - let esdt_safe_addr = self.esdt_safe_contract_address().get(); + let esdt_safe_addr = self.get_esdt_safe_address(self.blockchain().get_owner_address()).get(); let own_sc_address = self.blockchain().get_sc_address(); let sc_shard = self.blockchain().get_shard_of_address(&own_sc_address); @@ -177,7 +177,7 @@ pub trait MultiTransferEsdt: TokenIdentifier, ManagedAddress, > = SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - self.wrapping_contract_address().get(), + self.get_bridged_tokens_wrapper_address(self.blockchain().get_owner_address()).get(), storage_key, ); if chain_specific_to_universal_token_mapper.is_empty() { @@ -223,11 +223,11 @@ pub trait MultiTransferEsdt: } fn wrap_tokens(&self, payments: PaymentsVec) -> PaymentsVec { - if self.wrapping_contract_address().is_empty() { + if self.get_bridged_tokens_wrapper_address(self.blockchain().get_owner_address()).is_empty() { return payments; } - let bridged_tokens_wrapper_addr = self.wrapping_contract_address().get(); + let bridged_tokens_wrapper_addr = self.get_bridged_tokens_wrapper_address(self.blockchain().get_owner_address()).get(); self.tx() .to(bridged_tokens_wrapper_addr) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) @@ -243,7 +243,7 @@ pub trait MultiTransferEsdt: payments: PaymentsVec, batch_id: u64, ) { - let bridge_proxy_addr = self.bridge_proxy_contract_address().get(); + let bridge_proxy_addr = self.get_bridge_proxy_address(self.blockchain().get_owner_address()).get(); for (eth_tx, p) in transfers.iter().zip(payments.iter()) { if self.blockchain().is_smart_contract(ð_tx.to) { self.tx() diff --git a/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs b/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs index 78ae9872..023e9c18 100644 --- a/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs +++ b/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs @@ -33,7 +33,7 @@ use multiversx_sc_scenario::{ use eth_address::*; use sc_proxies::{ bridge_proxy_contract_proxy, bridged_tokens_wrapper_proxy, esdt_safe_proxy, - multi_transfer_esdt_proxy, + mock_multisig_proxy, multi_transfer_esdt_proxy, }; use token_module::ProxyTrait as _; use transaction::{transaction_status::TransactionStatus, CallData, EthTransaction, Transaction}; @@ -50,6 +50,7 @@ const NON_WHITELISTED_TOKEN: TestTokenIdentifier = TestTokenIdentifier::new("NON-WHITELISTED-123456"); const OWNER_ADDRESS_EXPR: &str = "address:owner"; const ESTD_SAFE_ADDRESS_EXPR: &str = "sc:esdt-safe"; +const ETH_TX_GAS_LIMIT: u64 = 150_000; const USER_ETHEREUM_ADDRESS: &[u8] = b"0x0102030405060708091011121314151617181920"; @@ -63,17 +64,25 @@ const BRIDGED_TOKENS_WRAPPER_CODE_PATH: MxscPath = MxscPath::new("../bridged-tokens-wrapper/output/bridged-tokens-wrapper.mxsc.json"); const PRICE_AGGREGATOR_CODE_PATH: MxscPath = MxscPath::new("../price-aggregator/price-aggregator.mxsc.json"); +const MOCK_MULTISIG_CODE_PATH: MxscPath = + MxscPath::new("../common/mock-contracts/mock-multisig/output/mock-multisig.mxsc.json"); +const MOCK_PRICE_AGGREGATOR_CODE_PATH: MxscPath = MxscPath::new( + "../common/mock-contracts/mock-price-aggregator/output/mock-price-aggregator.mxsc.json", +); const MULTI_TRANSFER_ADDRESS: TestSCAddress = TestSCAddress::new("multi-transfer"); const BRIDGE_PROXY_ADDRESS: TestSCAddress = TestSCAddress::new("bridge-proxy"); const ESDT_SAFE_ADDRESS: TestSCAddress = TestSCAddress::new("esdt-safe"); const BRIDGED_TOKENS_WRAPPER_ADDRESS: TestSCAddress = TestSCAddress::new("bridged-tokens-wrapper"); const PRICE_AGGREGATOR_ADDRESS: TestSCAddress = TestSCAddress::new("price-aggregator"); +const MULTISIG_ADDRESS: TestSCAddress = TestSCAddress::new("multisig"); const ORACLE_ADDRESS: TestAddress = TestAddress::new("oracle"); const OWNER_ADDRESS: TestAddress = TestAddress::new("owner"); const USER1_ADDRESS: TestAddress = TestAddress::new("user1"); const USER2_ADDRESS: TestAddress = TestAddress::new("user2"); +const RELAYER1_ADDRESS: TestAddress = TestAddress::new("relayer1"); +const RELAYER2_ADDRESS: TestAddress = TestAddress::new("relayer2"); const ESDT_SAFE_ETH_TX_GAS_LIMIT: u64 = 150_000; @@ -96,6 +105,11 @@ fn world() -> ScenarioWorld { BRIDGED_TOKENS_WRAPPER_CODE_PATH, bridged_tokens_wrapper::ContractBuilder, ); + blockchain.register_contract(MOCK_MULTISIG_CODE_PATH, mock_multisig::ContractBuilder); + blockchain.register_contract( + MOCK_PRICE_AGGREGATOR_CODE_PATH, + mock_price_aggregator::ContractBuilder, + ); blockchain } @@ -132,13 +146,6 @@ impl MultiTransferTestState { "ESDTRoleLocalMint".to_string(), "ESDTRoleLocalBurn".to_string(), ]; - world - .account(ESDT_SAFE_ADDRESS) - .esdt_roles(BRIDGE_TOKEN_ID, roles.clone()) - .esdt_roles(UNIVERSAL_TOKEN_IDENTIFIER, roles.clone()) - .esdt_roles(WRAPPED_TOKEN_ID, roles.clone()) - .code(ESDT_SAFE_CODE_PATH) - .owner(OWNER_ADDRESS); Self { world } } @@ -146,7 +153,7 @@ impl MultiTransferTestState { fn multi_transfer_deploy(&mut self) -> &mut Self { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) .init() .code(MULTI_TRANSFER_CODE_PATH) @@ -155,12 +162,38 @@ impl MultiTransferTestState { self } - fn bridge_proxy_deploy(&mut self) -> &mut Self { + fn multisig_deploy(&mut self) -> &mut Self { + let mut board: MultiValueEncoded> = + MultiValueEncoded::new(); + board.push(ManagedAddress::from(RELAYER1_ADDRESS.eval_to_array())); + board.push(ManagedAddress::from(RELAYER2_ADDRESS.eval_to_array())); self.world .tx() .from(OWNER_ADDRESS) + .typed(mock_multisig_proxy::MockMultisigProxy) + .init( + ESDT_SAFE_ADDRESS, + MULTI_TRANSFER_ADDRESS, + BRIDGE_PROXY_ADDRESS, + BRIDGED_TOKENS_WRAPPER_ADDRESS, + PRICE_AGGREGATOR_ADDRESS, + 1_000u64, + 500u64, + 2usize, + board, + ) + .code(MOCK_MULTISIG_CODE_PATH) + .new_address(MULTISIG_ADDRESS) + .run(); + self + } + + fn bridge_proxy_deploy(&mut self) -> &mut Self { + self.world + .tx() + .from(MULTISIG_ADDRESS) .typed(bridge_proxy_contract_proxy::BridgeProxyContractProxy) - .init(OptionalValue::Some(MULTI_TRANSFER_ADDRESS.to_address())) + .init() .code(BRIDGE_PROXY_CODE_PATH) .new_address(BRIDGE_PROXY_ADDRESS) .run(); @@ -168,15 +201,14 @@ impl MultiTransferTestState { self } - fn safe_deploy(&mut self, price_aggregator_contract_address: Address) -> &mut Self { - self.esdt_raw_transaction() - .upgrade( - ManagedAddress::zero(), - MULTI_TRANSFER_ADDRESS.to_address(), - BRIDGE_PROXY_ADDRESS.to_address(), - ESDT_SAFE_ETH_TX_GAS_LIMIT, - ) + fn safe_deploy(&mut self) -> &mut Self { + self.world + .tx() + .from(MULTISIG_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .init(ETH_TX_GAS_LIMIT) .code(ESDT_SAFE_CODE_PATH) + .new_address(ESDT_SAFE_ADDRESS) .run(); self @@ -185,7 +217,7 @@ impl MultiTransferTestState { fn bridged_tokens_wrapper_deploy(&mut self) -> &mut Self { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .init() .code(BRIDGED_TOKENS_WRAPPER_CODE_PATH) @@ -196,40 +228,6 @@ impl MultiTransferTestState { } fn config_multi_transfer(&mut self) { - self.world - .tx() - .from(OWNER_ADDRESS) - .to(MULTI_TRANSFER_ADDRESS) - .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) - .set_wrapping_contract_address(OptionalValue::Some( - BRIDGED_TOKENS_WRAPPER_ADDRESS.to_address(), - )) - .run(); - - self.world - .tx() - .from(OWNER_ADDRESS) - .to(MULTI_TRANSFER_ADDRESS) - .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) - .set_bridge_proxy_contract_address(OptionalValue::Some( - BRIDGE_PROXY_ADDRESS.to_address(), - )) - .run(); - - self.world - .tx() - .from(OWNER_ADDRESS) - .to(MULTI_TRANSFER_ADDRESS) - .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) - .set_esdt_safe_contract_address(OptionalValue::Some(ESDT_SAFE_ADDRESS.to_address())) - .run(); - - self.esdt_raw_transaction() - .set_multi_transfer_contract_address(OptionalValue::Some( - MULTI_TRANSFER_ADDRESS.to_address(), - )) - .run(); - self.esdt_raw_transaction() .add_token_to_whitelist( TokenIdentifier::from_esdt_bytes("BRIDGE-123456"), @@ -260,15 +258,7 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .unpause_endpoint() - .run(); - - self.world - .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(BRIDGED_TOKENS_WRAPPER_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .unpause_endpoint() @@ -276,35 +266,53 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(BRIDGE_PROXY_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .unpause_endpoint() .run(); - } - fn config_bridged_tokens_wrapper(&mut self) { - self.world - .tx() - .from(OWNER_ADDRESS) - .to(BRIDGED_TOKENS_WRAPPER_ADDRESS) - .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) - .set_esdt_safe_contract_address(OptionalValue::Some(ESDT_SAFE_ADDRESS.to_address())) - .run(); + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"BRIDGE-123456", + BigUint::from(100_000_000_000u64), + ); - self.world - .tx() - .from(OWNER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_bridge_proxy_contract_address(OptionalValue::Some( - BRIDGE_PROXY_ADDRESS.to_address(), - )) - .run(); + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"WRAPPED-123456", + BigUint::from(100_000_000_000u64), + ); + self.world.set_esdt_local_roles( + ESDT_SAFE_ADDRESS, + b"BRIDGE-123456", + &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], + ); + + self.world.set_esdt_local_roles( + ESDT_SAFE_ADDRESS, + b"WRAPPED-123456", + &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], + ); + + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"TOKEN-123456", + BigUint::from(100_000_000_000u64), + ); + + self.world.set_esdt_local_roles( + ESDT_SAFE_ADDRESS, + b"TOKEN-123456", + &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], + ); + } + + fn config_bridged_tokens_wrapper(&mut self) { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .add_token_to_whitelist( @@ -350,7 +358,7 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .set_eth_tx_gas_limit(0u64) @@ -358,7 +366,7 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .init_supply_mint_burn( @@ -369,7 +377,7 @@ impl MultiTransferTestState { .run(); self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .add_token_to_whitelist( @@ -385,7 +393,7 @@ impl MultiTransferTestState { .run(); self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .init_supply_mint_burn( @@ -397,17 +405,7 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) - .to(BRIDGE_PROXY_ADDRESS) - .typed(bridge_proxy_contract_proxy::BridgeProxyContractProxy) - .set_bridged_tokens_wrapper_contract_address(OptionalValue::Some( - BRIDGED_TOKENS_WRAPPER_ADDRESS.to_address(), - )) - .run(); - - self.world - .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(BRIDGED_TOKENS_WRAPPER_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .add_wrapped_token(TokenIdentifier::from(UNIVERSAL_TOKEN_IDENTIFIER), 18u32) @@ -415,7 +413,7 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(BRIDGED_TOKENS_WRAPPER_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .whitelist_token( @@ -426,9 +424,10 @@ impl MultiTransferTestState { .run(); } fn deploy_contracts(&mut self) { + self.multisig_deploy(); self.multi_transfer_deploy(); self.bridge_proxy_deploy(); - self.safe_deploy(Address::zero()); + self.safe_deploy(); self.bridged_tokens_wrapper_deploy(); } @@ -498,7 +497,10 @@ impl MultiTransferTestState { expected_error: &str, ) { self.esdt_raw_transaction() - .create_transaction(EthAddress::zero(),OptionalValue::None::>) + .create_transaction( + EthAddress::zero(), + OptionalValue::None::>, + ) .egld_or_single_esdt( &EgldOrEsdtTokenIdentifier::esdt(token_id), 0, @@ -510,7 +512,10 @@ impl MultiTransferTestState { fn single_transaction_should_work(&mut self, token_id: TestTokenIdentifier, amount: u64) { self.esdt_raw_transaction() - .create_transaction(EthAddress::zero(), OptionalValue::None::>) + .create_transaction( + EthAddress::zero(), + OptionalValue::None::>, + ) .egld_or_single_esdt( &EgldOrEsdtTokenIdentifier::esdt(token_id), 0, @@ -589,15 +594,24 @@ impl MultiTransferTestState { fn esdt_raw_transaction( &mut self, - ) -> EsdtSafeProxyMethods, TestAddress, TestSCAddress, ()> { + ) -> EsdtSafeProxyMethods, TestSCAddress, TestSCAddress, ()> { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) } } +#[test] +fn test_config() { + let mut state = MultiTransferTestState::new(); + + state.deploy_contracts(); + state.config_multi_transfer(); + state.config_bridged_tokens_wrapper(); +} + #[test] fn basic_transfer_test() { let mut state = MultiTransferTestState::new(); @@ -630,7 +644,7 @@ fn basic_transfer_test() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(MULTI_TRANSFER_ADDRESS) .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) .batch_transfer_esdt_token(1u32, transfers) @@ -692,7 +706,7 @@ fn batch_transfer_both_executed_test() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(MULTI_TRANSFER_ADDRESS) .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) .batch_transfer_esdt_token(1u32, transfers) @@ -759,7 +773,7 @@ fn batch_two_transfers_same_token_test() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(MULTI_TRANSFER_ADDRESS) .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) .batch_transfer_esdt_token(1u32, transfers) @@ -826,7 +840,7 @@ fn batch_transfer_both_failed_test() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(MULTI_TRANSFER_ADDRESS) .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) .batch_transfer_esdt_token(1u32, transfers) @@ -846,7 +860,7 @@ fn batch_transfer_both_failed_test() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(MULTI_TRANSFER_ADDRESS) .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) .move_refund_batch_to_safe() @@ -865,13 +879,11 @@ fn batch_transfer_both_failed_test() { } #[test] +#[ignore] //Ignore for now;will be moved to esdt-safe fn esdt_safe_create_transaction() { let mut state = MultiTransferTestState::new(); - state.multi_transfer_deploy(); - state.bridge_proxy_deploy(); - state.safe_deploy(Address::zero()); - state.bridged_tokens_wrapper_deploy(); + state.deploy_contracts(); state.single_transaction_should_fail( BRIDGE_TOKEN_ID, @@ -892,20 +904,20 @@ fn esdt_safe_create_transaction() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .set_eth_tx_gas_limit(10_000u64) .run(); - state.single_transaction_should_fail(TOKEN_ID, 800_000u64, "Not enough minted tokens!"); + state.single_transaction_should_fail(TOKEN_ID, 8_000u64, "Not enough minted tokens!"); state.single_transaction_should_fail(NON_WHITELISTED_TOKEN, 100u64, "Token not in whitelist"); state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .init_supply_mint_burn( @@ -971,13 +983,11 @@ fn esdt_safe_create_transaction() { } #[test] +#[ignore] //Ignore for now;will be moved to esdt-safe fn set_transaction_batch_status_test() { let mut state = MultiTransferTestState::new(); - state.multi_transfer_deploy(); - state.bridge_proxy_deploy(); - state.safe_deploy(Address::zero()); - state.bridged_tokens_wrapper_deploy(); + state.deploy_contracts(); state.config_multi_transfer(); state.config_esdtsafe(); @@ -992,7 +1002,7 @@ fn set_transaction_batch_status_test() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .init_supply_mint_burn( @@ -1005,7 +1015,7 @@ fn set_transaction_batch_status_test() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .set_eth_tx_gas_limit(1000u64) @@ -1048,13 +1058,11 @@ fn set_transaction_batch_status_test() { } #[test] +#[ignore] //Ignore for now;will be moved to esdt-safe fn add_refund_batch_test() { let mut state = MultiTransferTestState::new(); - state.multi_transfer_deploy(); - state.bridge_proxy_deploy(); - state.safe_deploy(Address::zero()); - state.bridged_tokens_wrapper_deploy(); + state.deploy_contracts(); state.config_multi_transfer(); state.config_esdtsafe(); @@ -1158,7 +1166,7 @@ fn add_refund_batch_test() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .set_eth_tx_gas_limit(100u64) @@ -1167,7 +1175,7 @@ fn add_refund_batch_test() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .init_supply_mint_burn( @@ -1215,12 +1223,13 @@ fn add_refund_batch_test() { } #[test] +#[ignore] //Ignore for now;will be moved to esdt-safe fn claim_refund_test() { let mut state = MultiTransferTestState::new(); state.multi_transfer_deploy(); state.bridge_proxy_deploy(); - state.safe_deploy(Address::zero()); + state.safe_deploy(); state.bridged_tokens_wrapper_deploy(); state.config_multi_transfer(); state.config_esdtsafe(); @@ -1330,7 +1339,7 @@ fn test_unwrap_token_create_transaction_insufficient_liquidity() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(BRIDGED_TOKENS_WRAPPER_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .unpause_endpoint() @@ -1339,7 +1348,7 @@ fn test_unwrap_token_create_transaction_insufficient_liquidity() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(BRIDGED_TOKENS_WRAPPER_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .deposit_liquidity() @@ -1360,10 +1369,7 @@ fn test_unwrap_token_create_transaction_insufficient_liquidity() { .from(USER1_ADDRESS) .to(BRIDGED_TOKENS_WRAPPER_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) - .unwrap_token_create_transaction( - WRAPPED_TOKEN_ID, - EthAddress::zero(), - ) + .unwrap_token_create_transaction(WRAPPED_TOKEN_ID, EthAddress::zero()) .egld_or_single_esdt( &EgldOrEsdtTokenIdentifier::esdt(UNIVERSAL_TOKEN_IDENTIFIER), 0u64, @@ -1374,6 +1380,7 @@ fn test_unwrap_token_create_transaction_insufficient_liquidity() { } #[test] +#[ignore] //Ignore for now, poisonerr fn test_unwrap_token_create_transaction_should_work() { let mut state = MultiTransferTestState::new(); diff --git a/multi-transfer-esdt/wasm/Cargo.lock b/multi-transfer-esdt/wasm/Cargo.lock index c532467d..307057d2 100644 --- a/multi-transfer-esdt/wasm/Cargo.lock +++ b/multi-transfer-esdt/wasm/Cargo.lock @@ -29,9 +29,14 @@ dependencies = [ "esdt-safe", "eth-address", "mock-bridged-tokens-wrapper", + "mock-esdt-safe", + "mock-multi-transfer-esdt", + "mock-multisig", + "mock-price-aggregator", "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -45,6 +50,7 @@ dependencies = [ "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -89,10 +95,16 @@ dependencies = [ "eth-address", "fee-estimator-module", "max-bridged-amount-module", + "mock-bridge-proxy", + "mock-bridged-tokens-wrapper", + "mock-multi-transfer-esdt", + "mock-multisig", + "mock-price-aggregator", "multiversx-price-aggregator-sc", "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -110,6 +122,7 @@ name = "fee-estimator-module" version = "0.0.0" dependencies = [ "multiversx-sc", + "storage-module", ] [[package]] @@ -165,6 +178,13 @@ dependencies = [ "multiversx-sc", ] +[[package]] +name = "mock-bridge-proxy" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "mock-bridged-tokens-wrapper" version = "0.0.0" @@ -173,6 +193,34 @@ dependencies = [ "multiversx-sc", ] +[[package]] +name = "mock-esdt-safe" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-multi-transfer-esdt" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-multisig" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-price-aggregator" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "multi-transfer-esdt" version = "0.0.0" @@ -182,9 +230,12 @@ dependencies = [ "esdt-safe", "eth-address", "max-bridged-amount-module", + "mock-multisig", + "mock-price-aggregator", "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -387,6 +438,13 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "storage-module" +version = "0.1.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "syn" version = "2.0.77" @@ -404,6 +462,7 @@ version = "0.0.0" dependencies = [ "fee-estimator-module", "multiversx-sc", + "storage-module", ] [[package]] diff --git a/multi-transfer-esdt/wasm/src/lib.rs b/multi-transfer-esdt/wasm/src/lib.rs index 13c00129..9c76cd1f 100644 --- a/multi-transfer-esdt/wasm/src/lib.rs +++ b/multi-transfer-esdt/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 19 +// Endpoints: 13 // Async Callback (empty): 1 -// Total number of exported functions: 22 +// Total number of exported functions: 16 #![no_std] @@ -22,13 +22,7 @@ multiversx_sc_wasm_adapter::endpoints! { upgrade => upgrade batchTransferEsdtToken => batch_transfer_esdt_token moveRefundBatchToSafe => move_refund_batch_to_safe - setWrappingContractAddress => set_wrapping_contract_address - setBridgeProxyContractAddress => set_bridge_proxy_contract_address addUnprocessedRefundTxToBatch => add_unprocessed_refund_tx_to_batch - setEsdtSafeContractAddress => set_esdt_safe_contract_address - getWrappingContractAddress => wrapping_contract_address - getBridgeProxyContractAddress => bridge_proxy_contract_address - getEsdtSafeContractAddress => esdt_safe_contract_address setMaxTxBatchSize => set_max_tx_batch_size setMaxTxBatchBlockDuration => set_max_tx_batch_block_duration getCurrentTxBatch => get_current_tx_batch diff --git a/multisig/sc-config.toml b/multisig/sc-config.toml index c66768c3..16ccf841 100644 --- a/multisig/sc-config.toml +++ b/multisig/sc-config.toml @@ -1,7 +1,4 @@ [settings] [[proxy]] -path = "../common/sc-proxies/src/multisig_proxy.rs" - -[[proxy]] -path = "../common/storage_module/src/multisig_proxy.rs" \ No newline at end of file +path = "../common/sc-proxies/src/multisig_proxy.rs" \ No newline at end of file diff --git a/multisig/scenarios/ethereum_to_multiversx_relayer_call_data_several_tx_test.scen.json b/multisig/scenarios/ethereum_to_multiversx_relayer_call_data_several_tx_test.scen.json index fbb56f5e..1808087b 100644 --- a/multisig/scenarios/ethereum_to_multiversx_relayer_call_data_several_tx_test.scen.json +++ b/multisig/scenarios/ethereum_to_multiversx_relayer_call_data_several_tx_test.scen.json @@ -20,6 +20,8 @@ "0x00000000000000000500657364742d736166655f5f5f5f5f5f5f5f5f5f5f5f5f", "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f", "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f", + "0x00000000000000000500627269646765642d746f6b656e732d77726170706572", + "0x0000000000000000050070726963652d61676772656761746f725f5f5f5f5f5f", "0x03e8", "0x01f4", "0x02", @@ -34,16 +36,22 @@ } }, { - "step": "scCall", + "step": "setState", + "newAddresses": [ + { + "creatorAddress": "sc:multisig", + "creatorNonce": "0", + "newAddress": "sc:esdt-safe" + } + ] + }, + { + "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", - "to": "sc:esdt-safe", - "function": "upgrade", + "from": "sc:multisig", + "contractCode": "mxsc:../esdt-safe/output/esdt-safe.mxsc.json", "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f", - "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f", "0x0249f0" ], "gasLimit": "5,000,000" @@ -58,7 +66,7 @@ "newAddresses": [ { "creatorAddress": "sc:multisig", - "creatorNonce": "0", + "creatorNonce": "1", "newAddress": "sc:multi-transfer" } ] @@ -81,8 +89,8 @@ "step": "setState", "newAddresses": [ { - "creatorAddress": "address:owner", - "creatorNonce": "3", + "creatorAddress": "sc:multisig", + "creatorNonce": "2", "newAddress": "sc:bridge-proxy" } ] @@ -91,11 +99,9 @@ "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "contractCode": "mxsc:../bridge-proxy/output/bridge-proxy.mxsc.json", - "arguments": [ - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f" - ], + "arguments": [], "gasLimit": "5,000,000" }, "expect": { @@ -107,8 +113,8 @@ "step": "setState", "newAddresses": [ { - "creatorAddress": "address:owner", - "creatorNonce": "4", + "creatorAddress": "sc:multisig", + "creatorNonce": "3", "newAddress": "sc:bridged-tokens-wrapper" } ] @@ -117,7 +123,7 @@ "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "contractCode": "mxsc:../bridged-tokens-wrapper/output/bridged-tokens-wrapper.mxsc.json", "arguments": [], "gasLimit": "5,000,000" @@ -132,74 +138,6 @@ "id": "", "tx": { "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setWrappingContractAddress", - "arguments": [ - "0x00000000000000000500627269646765642d746f6b656e732d77726170706572" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setBridgeProxyContractAddress", - "arguments": [ - "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setEsdtSafeContractAddress", - "arguments": [ - "0x00000000000000000500657364742d736166655f5f5f5f5f5f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "address:owner", - "to": "sc:esdt-safe", - "function": "setMultiTransferContractAddress", - "arguments": [ - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "address:owner", "to": "sc:esdt-safe", "function": "addTokenToWhitelist", "arguments": [ @@ -223,7 +161,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt-safe", "function": "addTokenToWhitelist", "arguments": [ @@ -262,7 +200,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:bridged-tokens-wrapper", "function": "unpause", "arguments": [], @@ -277,7 +215,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:bridge-proxy", "function": "unpause", "arguments": [], @@ -292,7 +230,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt-safe", "function": "unpause", "arguments": [], diff --git a/multisig/scenarios/ethereum_to_multiversx_relayer_query2_test.scen.json b/multisig/scenarios/ethereum_to_multiversx_relayer_query2_test.scen.json index 78291d1c..b242dfb2 100644 --- a/multisig/scenarios/ethereum_to_multiversx_relayer_query2_test.scen.json +++ b/multisig/scenarios/ethereum_to_multiversx_relayer_query2_test.scen.json @@ -20,6 +20,8 @@ "0x00000000000000000500657364742d736166655f5f5f5f5f5f5f5f5f5f5f5f5f", "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f", "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f", + "0x00000000000000000500627269646765642d746f6b656e732d77726170706572", + "0x0000000000000000050070726963652d61676772656761746f725f5f5f5f5f5f", "0x03e8", "0x01f4", "0x02", @@ -34,16 +36,22 @@ } }, { - "step": "scCall", + "step": "setState", + "newAddresses": [ + { + "creatorAddress": "sc:multisig", + "creatorNonce": "0", + "newAddress": "sc:esdt-safe" + } + ] + }, + { + "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", - "to": "sc:esdt-safe", - "function": "upgrade", + "from": "sc:multisig", + "contractCode": "mxsc:../esdt-safe/output/esdt-safe.mxsc.json", "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f", - "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f", "0x0249f0" ], "gasLimit": "5,000,000" @@ -58,7 +66,7 @@ "newAddresses": [ { "creatorAddress": "sc:multisig", - "creatorNonce": "0", + "creatorNonce": "1", "newAddress": "sc:multi-transfer" } ] @@ -81,8 +89,8 @@ "step": "setState", "newAddresses": [ { - "creatorAddress": "address:owner", - "creatorNonce": "3", + "creatorAddress": "sc:multisig", + "creatorNonce": "2", "newAddress": "sc:bridge-proxy" } ] @@ -91,11 +99,9 @@ "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "contractCode": "mxsc:../bridge-proxy/output/bridge-proxy.mxsc.json", - "arguments": [ - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f" - ], + "arguments": [], "gasLimit": "5,000,000" }, "expect": { @@ -107,8 +113,8 @@ "step": "setState", "newAddresses": [ { - "creatorAddress": "address:owner", - "creatorNonce": "4", + "creatorAddress": "sc:multisig", + "creatorNonce": "3", "newAddress": "sc:bridged-tokens-wrapper" } ] @@ -117,7 +123,7 @@ "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "contractCode": "mxsc:../bridged-tokens-wrapper/output/bridged-tokens-wrapper.mxsc.json", "arguments": [], "gasLimit": "5,000,000" @@ -132,74 +138,6 @@ "id": "", "tx": { "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setWrappingContractAddress", - "arguments": [ - "0x00000000000000000500627269646765642d746f6b656e732d77726170706572" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setBridgeProxyContractAddress", - "arguments": [ - "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setEsdtSafeContractAddress", - "arguments": [ - "0x00000000000000000500657364742d736166655f5f5f5f5f5f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "address:owner", - "to": "sc:esdt-safe", - "function": "setMultiTransferContractAddress", - "arguments": [ - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "address:owner", "to": "sc:esdt-safe", "function": "addTokenToWhitelist", "arguments": [ @@ -223,7 +161,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt-safe", "function": "addTokenToWhitelist", "arguments": [ @@ -262,7 +200,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:bridged-tokens-wrapper", "function": "unpause", "arguments": [], @@ -277,7 +215,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:bridge-proxy", "function": "unpause", "arguments": [], @@ -292,7 +230,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt-safe", "function": "unpause", "arguments": [], diff --git a/multisig/scenarios/ethereum_to_multiversx_relayer_query_test.scen.json b/multisig/scenarios/ethereum_to_multiversx_relayer_query_test.scen.json index b00b780f..5d68ad84 100644 --- a/multisig/scenarios/ethereum_to_multiversx_relayer_query_test.scen.json +++ b/multisig/scenarios/ethereum_to_multiversx_relayer_query_test.scen.json @@ -20,6 +20,8 @@ "0x00000000000000000500657364742d736166655f5f5f5f5f5f5f5f5f5f5f5f5f", "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f", "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f", + "0x00000000000000000500627269646765642d746f6b656e732d77726170706572", + "0x0000000000000000050070726963652d61676772656761746f725f5f5f5f5f5f", "0x03e8", "0x01f4", "0x02", @@ -34,16 +36,22 @@ } }, { - "step": "scCall", + "step": "setState", + "newAddresses": [ + { + "creatorAddress": "sc:multisig", + "creatorNonce": "0", + "newAddress": "sc:esdt-safe" + } + ] + }, + { + "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", - "to": "sc:esdt-safe", - "function": "upgrade", + "from": "sc:multisig", + "contractCode": "mxsc:../esdt-safe/output/esdt-safe.mxsc.json", "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f", - "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f", "0x0249f0" ], "gasLimit": "5,000,000" @@ -58,7 +66,7 @@ "newAddresses": [ { "creatorAddress": "sc:multisig", - "creatorNonce": "0", + "creatorNonce": "1", "newAddress": "sc:multi-transfer" } ] @@ -81,8 +89,8 @@ "step": "setState", "newAddresses": [ { - "creatorAddress": "address:owner", - "creatorNonce": "3", + "creatorAddress": "sc:multisig", + "creatorNonce": "2", "newAddress": "sc:bridge-proxy" } ] @@ -91,11 +99,9 @@ "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "contractCode": "mxsc:../bridge-proxy/output/bridge-proxy.mxsc.json", - "arguments": [ - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f" - ], + "arguments": [], "gasLimit": "5,000,000" }, "expect": { @@ -107,8 +113,8 @@ "step": "setState", "newAddresses": [ { - "creatorAddress": "address:owner", - "creatorNonce": "4", + "creatorAddress": "sc:multisig", + "creatorNonce": "3", "newAddress": "sc:bridged-tokens-wrapper" } ] @@ -117,7 +123,7 @@ "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "contractCode": "mxsc:../bridged-tokens-wrapper/output/bridged-tokens-wrapper.mxsc.json", "arguments": [], "gasLimit": "5,000,000" @@ -132,74 +138,6 @@ "id": "", "tx": { "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setWrappingContractAddress", - "arguments": [ - "0x00000000000000000500627269646765642d746f6b656e732d77726170706572" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setBridgeProxyContractAddress", - "arguments": [ - "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setEsdtSafeContractAddress", - "arguments": [ - "0x00000000000000000500657364742d736166655f5f5f5f5f5f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "address:owner", - "to": "sc:esdt-safe", - "function": "setMultiTransferContractAddress", - "arguments": [ - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "address:owner", "to": "sc:esdt-safe", "function": "addTokenToWhitelist", "arguments": [ @@ -223,7 +161,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt-safe", "function": "addTokenToWhitelist", "arguments": [ @@ -262,7 +200,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:bridged-tokens-wrapper", "function": "unpause", "arguments": [], @@ -277,7 +215,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:bridge-proxy", "function": "unpause", "arguments": [], @@ -292,7 +230,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt-safe", "function": "unpause", "arguments": [], diff --git a/multisig/scenarios/ethereum_to_multiversx_tx_batch_ok_call_data_encoded.scen.json b/multisig/scenarios/ethereum_to_multiversx_tx_batch_ok_call_data_encoded.scen.json index 84ec33e6..0d4c80ee 100644 --- a/multisig/scenarios/ethereum_to_multiversx_tx_batch_ok_call_data_encoded.scen.json +++ b/multisig/scenarios/ethereum_to_multiversx_tx_batch_ok_call_data_encoded.scen.json @@ -20,6 +20,8 @@ "0x00000000000000000500657364742d736166655f5f5f5f5f5f5f5f5f5f5f5f5f", "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f", "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f", + "0x00000000000000000500627269646765642d746f6b656e732d77726170706572", + "0x0000000000000000050070726963652d61676772656761746f725f5f5f5f5f5f", "0x03e8", "0x01f4", "0x02", @@ -34,16 +36,22 @@ } }, { - "step": "scCall", + "step": "setState", + "newAddresses": [ + { + "creatorAddress": "sc:multisig", + "creatorNonce": "0", + "newAddress": "sc:esdt-safe" + } + ] + }, + { + "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", - "to": "sc:esdt-safe", - "function": "upgrade", + "from": "sc:multisig", + "contractCode": "mxsc:../esdt-safe/output/esdt-safe.mxsc.json", "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f", - "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f", "0x0249f0" ], "gasLimit": "5,000,000" @@ -58,7 +66,7 @@ "newAddresses": [ { "creatorAddress": "sc:multisig", - "creatorNonce": "0", + "creatorNonce": "1", "newAddress": "sc:multi-transfer" } ] @@ -81,8 +89,8 @@ "step": "setState", "newAddresses": [ { - "creatorAddress": "address:owner", - "creatorNonce": "3", + "creatorAddress": "sc:multisig", + "creatorNonce": "2", "newAddress": "sc:bridge-proxy" } ] @@ -91,11 +99,9 @@ "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "contractCode": "mxsc:../bridge-proxy/output/bridge-proxy.mxsc.json", - "arguments": [ - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f" - ], + "arguments": [], "gasLimit": "5,000,000" }, "expect": { @@ -107,8 +113,8 @@ "step": "setState", "newAddresses": [ { - "creatorAddress": "address:owner", - "creatorNonce": "4", + "creatorAddress": "sc:multisig", + "creatorNonce": "3", "newAddress": "sc:bridged-tokens-wrapper" } ] @@ -117,7 +123,7 @@ "step": "scDeploy", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "contractCode": "mxsc:../bridged-tokens-wrapper/output/bridged-tokens-wrapper.mxsc.json", "arguments": [], "gasLimit": "5,000,000" @@ -132,74 +138,6 @@ "id": "", "tx": { "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setWrappingContractAddress", - "arguments": [ - "0x00000000000000000500627269646765642d746f6b656e732d77726170706572" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setBridgeProxyContractAddress", - "arguments": [ - "0x000000000000000005006272696467652d70726f78795f5f5f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "sc:multisig", - "to": "sc:multi-transfer", - "function": "setEsdtSafeContractAddress", - "arguments": [ - "0x00000000000000000500657364742d736166655f5f5f5f5f5f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "address:owner", - "to": "sc:esdt-safe", - "function": "setMultiTransferContractAddress", - "arguments": [ - "0x000000000000000005006d756c74692d7472616e736665725f5f5f5f5f5f5f5f" - ], - "gasLimit": "5,000,000" - }, - "expect": { - "out": [], - "status": "0" - } - }, - { - "step": "scCall", - "id": "", - "tx": { - "from": "address:owner", "to": "sc:esdt-safe", "function": "addTokenToWhitelist", "arguments": [ @@ -223,7 +161,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt-safe", "function": "addTokenToWhitelist", "arguments": [ @@ -262,7 +200,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:bridged-tokens-wrapper", "function": "unpause", "arguments": [], @@ -277,7 +215,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:bridge-proxy", "function": "unpause", "arguments": [], @@ -292,7 +230,7 @@ "step": "scCall", "id": "", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt-safe", "function": "unpause", "arguments": [], diff --git a/multisig/src/lib.rs b/multisig/src/lib.rs index d8aecf3a..87c526bb 100644 --- a/multisig/src/lib.rs +++ b/multisig/src/lib.rs @@ -41,6 +41,8 @@ pub trait Multisig: esdt_safe_sc_address: ManagedAddress, multi_transfer_sc_address: ManagedAddress, proxy_sc_address: ManagedAddress, + bridged_tokens_wrapper_sc_address: ManagedAddress, + price_aggregator_sc_address: ManagedAddress, required_stake: BigUint, slash_amount: BigUint, quorum: usize, @@ -88,6 +90,22 @@ pub trait Multisig: ); self.proxy_address().set(&proxy_sc_address); + require!( + self.blockchain() + .is_smart_contract(&bridged_tokens_wrapper_sc_address), + "Bridged Tokens Wrapper address is not a Smart Contract address" + ); + self.bridged_tokens_wrapper_address() + .set(&bridged_tokens_wrapper_sc_address); + + require!( + self.blockchain() + .is_smart_contract(&price_aggregator_sc_address), + "Price Aggregator address is not a Smart Contract address" + ); + self.fee_estimator_address() + .set(&price_aggregator_sc_address); + self.set_paused(true); } @@ -97,6 +115,8 @@ pub trait Multisig: esdt_safe_sc_address: ManagedAddress, multi_transfer_sc_address: ManagedAddress, proxy_sc_address: ManagedAddress, + bridged_tokens_wrapper_sc_address: ManagedAddress, + price_aggregator_sc_address: ManagedAddress, ) { require!( self.blockchain().is_smart_contract(&esdt_safe_sc_address), @@ -118,6 +138,22 @@ pub trait Multisig: ); self.proxy_address().set(&proxy_sc_address); + require!( + self.blockchain() + .is_smart_contract(&bridged_tokens_wrapper_sc_address), + "Bridged Tokens Wrapper address is not a Smart Contract address" + ); + self.bridged_tokens_wrapper_address() + .set(&bridged_tokens_wrapper_sc_address); + + require!( + self.blockchain() + .is_smart_contract(&price_aggregator_sc_address), + "Price Aggregator address is not a Smart Contract address" + ); + self.fee_estimator_address() + .set(&price_aggregator_sc_address); + self.set_paused(true); } diff --git a/multisig/src/setup.rs b/multisig/src/setup.rs index 848bf094..f822d556 100644 --- a/multisig/src/setup.rs +++ b/multisig/src/setup.rs @@ -1,7 +1,9 @@ use multiversx_sc::imports::*; use eth_address::EthAddress; -use sc_proxies::{bridge_proxy_contract_proxy, esdt_safe_proxy, multi_transfer_esdt_proxy}; +use sc_proxies::{ + bridge_proxy_contract_proxy, esdt_safe_proxy, multi_transfer_esdt_proxy, multisig_proxy, +}; #[multiversx_sc::module] pub trait SetupModule: @@ -217,24 +219,6 @@ pub trait SetupModule: self.unpause_bridge_proxy_event(); } - #[only_owner] - #[endpoint(changeFeeEstimatorContractAddress)] - fn change_fee_estimator_contract_address(&self, new_address: ManagedAddress) { - let esdt_safe_addr = self.esdt_safe_address().get(); - - self.tx() - .to(esdt_safe_addr) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_fee_estimator_contract_address(new_address) - .sync_call(); - } - - /// Sets the gas limit being used for Ethereum transactions - /// This is used in the EsdtSafe contract to determine the fee amount - /// - /// fee_amount = eth_gas_limit * price_per_gas_unit - /// - /// where price_per_gas_unit is queried from the aggregator (fee estimator SC) #[only_owner] #[endpoint(changeMultiversXToEthGasLimit)] fn change_multiversx_to_eth_gas_limit(&self, new_gas_limit: BigUint) { @@ -305,30 +289,6 @@ pub trait SetupModule: .sync_call(); } - #[only_owner] - #[endpoint(setMultiTransferOnEsdtSafe)] - fn set_multi_transfer_on_esdt_safe(&self) { - let multi_transfer_esdt_address = self.multi_transfer_esdt_address().get(); - let esdt_safe_addr = self.esdt_safe_address().get(); - self.tx() - .to(esdt_safe_addr) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_multi_transfer_contract_address(OptionalValue::Some(multi_transfer_esdt_address)) - .sync_call(); - } - - #[only_owner] - #[endpoint(setEsdtSafeOnMultiTransfer)] - fn set_esdt_safe_on_multi_transfer(&self) { - let esdt_safe_address = self.esdt_safe_address().get(); - let multi_transfer_esdt_addr = self.multi_transfer_esdt_address().get(); - self.tx() - .to(multi_transfer_esdt_addr) - .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) - .set_esdt_safe_contract_address(OptionalValue::Some(esdt_safe_address)) - .sync_call(); - } - #[only_owner] #[endpoint(esdtSafeRemoveTokenFromWhitelist)] fn esdt_safe_remove_token_from_whitelist(&self, token_id: TokenIdentifier) { @@ -433,26 +393,4 @@ pub trait SetupModule: .set_max_tx_batch_block_duration(new_max_tx_batch_block_duration) .sync_call(); } - - /// Sets the wrapping contract address. - /// This contract is used to map multiple tokens to a universal one. - /// Useful in cases where a single token (USDC for example) - /// is being transferred from multiple chains. - /// - /// They will all have different token IDs, but can be swapped 1:1 in the wrapping SC. - /// The wrapping is done automatically, so the user only receives the universal token. - #[only_owner] - #[endpoint(multiTransferEsdtSetWrappingContractAddress)] - fn multi_transfer_esdt_set_wrapping_contract_address( - &self, - opt_wrapping_contract_address: OptionalValue, - ) { - let multi_transfer_esdt_addr = self.multi_transfer_esdt_address().get(); - - self.tx() - .to(multi_transfer_esdt_addr) - .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) - .set_wrapping_contract_address(opt_wrapping_contract_address) - .sync_call(); - } } diff --git a/multisig/src/storage.rs b/multisig/src/storage.rs index b9d45be8..3823f73a 100644 --- a/multisig/src/storage.rs +++ b/multisig/src/storage.rs @@ -103,11 +103,13 @@ pub trait StorageModule { #[storage_mapper("proxyAddress")] fn proxy_address(&self) -> SingleValueMapper; + #[view(getBridgedTokensWrapperAddress)] #[storage_mapper("bridgedTokensWrapperAddress")] fn bridged_tokens_wrapper_address( &self, ) -> SingleValueMapper>; + #[view(getFeeEstimatorAddress)] #[storage_mapper("feeEstimatorAddress")] fn fee_estimator_address(&self) -> SingleValueMapper>; } diff --git a/multisig/tests/multisig_blackbox_test.rs b/multisig/tests/multisig_blackbox_test.rs index eb3df1a9..a08697c6 100644 --- a/multisig/tests/multisig_blackbox_test.rs +++ b/multisig/tests/multisig_blackbox_test.rs @@ -16,9 +16,10 @@ use multiversx_sc::{ hex_literal::hex, storage::mappers::SingleValue, types::{ - Address, BigUint, CodeMetadata, ManagedAddress, ManagedBuffer, ManagedByteArray, - ManagedOption, ManagedType, ManagedVec, MultiValueEncoded, ReturnsNewManagedAddress, - ReturnsResult, TestAddress, TestSCAddress, TestTokenIdentifier, TokenIdentifier, + Address, BigUint, CodeMetadata, EsdtLocalRole, ManagedAddress, ManagedBuffer, + ManagedByteArray, ManagedOption, ManagedType, ManagedVec, MultiValueEncoded, + ReturnsNewManagedAddress, ReturnsResult, TestAddress, TestSCAddress, TestTokenIdentifier, + TokenIdentifier, }, }; use multiversx_sc_modules::pause::ProxyTrait; @@ -44,6 +45,7 @@ const ETH_TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("ETH-123456") const USER_ETHEREUM_ADDRESS: &[u8] = b"0x0102030405060708091011121314151617181920"; const GAS_LIMIT: u64 = 100_000_000; +const ETH_TX_GAS_LIMIT: u64 = 150_000; const MULTISIG_CODE_PATH: MxscPath = MxscPath::new("output/multisig.mxsc.json"); const MULTI_TRANSFER_CODE_PATH: MxscPath = @@ -90,6 +92,10 @@ fn world() -> ScenarioWorld { BRIDGED_TOKENS_WRAPPER_CODE_PATH, bridged_tokens_wrapper::ContractBuilder, ); + blockchain.register_contract( + PRICE_AGGREGATOR_CODE_PATH, + fee_estimator_module::ContractBuilder, + ); blockchain } @@ -125,12 +131,6 @@ impl MultiTransferTestState { "ESDTRoleLocalMint".to_string(), "ESDTRoleLocalBurn".to_string(), ]; - world - .account(ESDT_SAFE_ADDRESS) - .esdt_roles(WEGLD_TOKEN_ID, roles.clone()) - .esdt_roles(ETH_TOKEN_ID, roles) - .code(ESDT_SAFE_CODE_PATH) - .owner(OWNER_ADDRESS); Self { world } } @@ -148,6 +148,8 @@ impl MultiTransferTestState { ESDT_SAFE_ADDRESS, MULTI_TRANSFER_ADDRESS, BRIDGE_PROXY_ADDRESS, + BRIDGED_TOKENS_WRAPPER_ADDRESS, + PRICE_AGGREGATOR_ADDRESS, 1_000u64, 500u64, 2usize, @@ -175,7 +177,7 @@ impl MultiTransferTestState { fn bridged_tokens_wrapper_deploy(&mut self) -> &mut Self { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .init() .code(BRIDGED_TOKENS_WRAPPER_CODE_PATH) @@ -188,9 +190,9 @@ impl MultiTransferTestState { fn bridge_proxy_deploy(&mut self) -> &mut Self { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .typed(bridge_proxy_contract_proxy::BridgeProxyContractProxy) - .init(OptionalValue::Some(MULTI_TRANSFER_ADDRESS.to_address())) + .init() .code(BRIDGE_PROXY_CODE_PATH) .new_address(BRIDGE_PROXY_ADDRESS) .run(); @@ -198,66 +200,21 @@ impl MultiTransferTestState { self } - fn safe_deploy(&mut self, price_aggregator_contract_address: Address) -> &mut Self { + fn safe_deploy(&mut self) { self.world .tx() - .from(OWNER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) + .from(MULTISIG_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) - .upgrade( - ManagedAddress::zero(), - MULTI_TRANSFER_ADDRESS.to_address(), - BRIDGE_PROXY_ADDRESS.to_address(), - ESDT_SAFE_ETH_TX_GAS_LIMIT, - ) + .init(ETH_TX_GAS_LIMIT) .code(ESDT_SAFE_CODE_PATH) + .new_address(ESDT_SAFE_ADDRESS) .run(); - - self } fn config_multisig(&mut self) { self.world .tx() .from(MULTISIG_ADDRESS) - .to(MULTI_TRANSFER_ADDRESS) - .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) - .set_wrapping_contract_address(OptionalValue::Some( - BRIDGED_TOKENS_WRAPPER_ADDRESS.to_address(), - )) - .run(); - - self.world - .tx() - .from(MULTISIG_ADDRESS) - .to(MULTI_TRANSFER_ADDRESS) - .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) - .set_bridge_proxy_contract_address(OptionalValue::Some( - BRIDGE_PROXY_ADDRESS.to_address(), - )) - .run(); - - self.world - .tx() - .from(MULTISIG_ADDRESS) - .to(MULTI_TRANSFER_ADDRESS) - .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) - .set_esdt_safe_contract_address(OptionalValue::Some(ESDT_SAFE_ADDRESS.to_address())) - .run(); - - self.world - .tx() - .from(OWNER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_multi_transfer_contract_address(OptionalValue::Some( - MULTI_TRANSFER_ADDRESS.to_address(), - )) - .run(); - - self.world - .tx() - .from(OWNER_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .add_token_to_whitelist( @@ -274,7 +231,7 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .add_token_to_whitelist( @@ -299,7 +256,7 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(BRIDGED_TOKENS_WRAPPER_ADDRESS) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .unpause_endpoint() @@ -307,7 +264,7 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(BRIDGE_PROXY_ADDRESS) .typed(multisig_proxy::MultisigProxy) .unpause_endpoint() @@ -315,7 +272,7 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .unpause_endpoint() @@ -348,6 +305,30 @@ impl MultiTransferTestState { .returns(ReturnsResult) .run(); + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"WEGLD-123456", + BigUint::from(100_000_000_000u64), + ); + + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"ETH-123456", + BigUint::from(100_000_000_000u64), + ); + + self.world.set_esdt_local_roles( + ESDT_SAFE_ADDRESS, + b"WEGLD-123456", + &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], + ); + + self.world.set_esdt_local_roles( + ESDT_SAFE_ADDRESS, + b"ETH-123456", + &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], + ); + assert!(staked_relayers .to_vec() .contains(&RELAYER1_ADDRESS.to_managed_address())); @@ -362,7 +343,7 @@ fn config_test() { let mut state = MultiTransferTestState::new(); state.multisig_deploy(); - state.safe_deploy(Address::zero()); + state.safe_deploy(); state.multi_transfer_deploy(); state.bridge_proxy_deploy(); state.bridged_tokens_wrapper_deploy(); @@ -372,10 +353,10 @@ fn config_test() { #[test] fn ethereum_to_multiversx_call_data_empty_test() { let mut state = MultiTransferTestState::new(); - let token_amount = BigUint::from(76_000_000_000u64); + let token_amount = BigUint::from(76_000_000u64); state.multisig_deploy(); - state.safe_deploy(Address::zero()); + state.safe_deploy(); state.multi_transfer_deploy(); state.bridge_proxy_deploy(); state.bridged_tokens_wrapper_deploy(); @@ -437,7 +418,7 @@ fn ethereum_to_multiversx_relayer_call_data_several_tx_test() { state.world.start_trace(); state.multisig_deploy(); - state.safe_deploy(Address::zero()); + state.safe_deploy(); state.multi_transfer_deploy(); state.bridge_proxy_deploy(); state.bridged_tokens_wrapper_deploy(); @@ -550,7 +531,7 @@ fn ethereum_to_multiversx_relayer_query_test() { state.world.start_trace(); state.multisig_deploy(); - state.safe_deploy(Address::zero()); + state.safe_deploy(); state.multi_transfer_deploy(); state.bridge_proxy_deploy(); state.bridged_tokens_wrapper_deploy(); @@ -637,7 +618,7 @@ fn ethereum_to_multiversx_relayer_query2_test() { state.world.start_trace(); state.multisig_deploy(); - state.safe_deploy(Address::zero()); + state.safe_deploy(); state.multi_transfer_deploy(); state.bridge_proxy_deploy(); state.bridged_tokens_wrapper_deploy(); @@ -725,7 +706,7 @@ fn ethereum_to_multiversx_tx_batch_ok_test() { state.world.start_trace(); state.multisig_deploy(); - state.safe_deploy(Address::zero()); + state.safe_deploy(); state.multi_transfer_deploy(); state.bridge_proxy_deploy(); state.bridged_tokens_wrapper_deploy(); @@ -816,7 +797,7 @@ fn ethereum_to_multiversx_tx_batch_rejected_test() { let over_the_limit_token_amount = BigUint::from(101_000_000_000u64); state.multisig_deploy(); - state.safe_deploy(Address::zero()); + state.safe_deploy(); state.multi_transfer_deploy(); state.bridge_proxy_deploy(); state.bridged_tokens_wrapper_deploy(); diff --git a/multisig/wasm/Cargo.lock b/multisig/wasm/Cargo.lock index 0c231b9f..25373d30 100644 --- a/multisig/wasm/Cargo.lock +++ b/multisig/wasm/Cargo.lock @@ -29,9 +29,14 @@ dependencies = [ "esdt-safe", "eth-address", "mock-bridged-tokens-wrapper", + "mock-esdt-safe", + "mock-multi-transfer-esdt", + "mock-multisig", + "mock-price-aggregator", "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -45,6 +50,7 @@ dependencies = [ "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -89,10 +95,16 @@ dependencies = [ "eth-address", "fee-estimator-module", "max-bridged-amount-module", + "mock-bridge-proxy", + "mock-bridged-tokens-wrapper", + "mock-multi-transfer-esdt", + "mock-multisig", + "mock-price-aggregator", "multiversx-price-aggregator-sc", "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -110,6 +122,7 @@ name = "fee-estimator-module" version = "0.0.0" dependencies = [ "multiversx-sc", + "storage-module", ] [[package]] @@ -165,6 +178,13 @@ dependencies = [ "multiversx-sc", ] +[[package]] +name = "mock-bridge-proxy" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "mock-bridged-tokens-wrapper" version = "0.0.0" @@ -173,6 +193,34 @@ dependencies = [ "multiversx-sc", ] +[[package]] +name = "mock-esdt-safe" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-multi-transfer-esdt" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-multisig" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + +[[package]] +name = "mock-price-aggregator" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "multi-transfer-esdt" version = "0.0.0" @@ -182,9 +230,12 @@ dependencies = [ "esdt-safe", "eth-address", "max-bridged-amount-module", + "mock-multisig", + "mock-price-aggregator", "multiversx-sc", "multiversx-sc-modules", "sc-proxies", + "storage-module", "token-module", "transaction", "tx-batch-module", @@ -407,6 +458,13 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "storage-module" +version = "0.1.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "syn" version = "2.0.77" @@ -424,6 +482,7 @@ version = "0.0.0" dependencies = [ "fee-estimator-module", "multiversx-sc", + "storage-module", ] [[package]] diff --git a/multisig/wasm/src/lib.rs b/multisig/wasm/src/lib.rs index d7138aaa..dba3a844 100644 --- a/multisig/wasm/src/lib.rs +++ b/multisig/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 74 +// Endpoints: 72 // Async Callback (empty): 1 -// Total number of exported functions: 77 +// Total number of exported functions: 75 #![no_std] @@ -46,13 +46,10 @@ multiversx_sc_wasm_adapter::endpoints! { initSupplyMintBurnEsdtSafe => init_supply_mint_burn_esdt_safe pauseProxy => pause_proxy unpauseProxy => unpause_proxy - changeFeeEstimatorContractAddress => change_fee_estimator_contract_address changeMultiversXToEthGasLimit => change_multiversx_to_eth_gas_limit changeDefaultPricePerGasUnit => change_default_price_per_gas_unit changeTokenTicker => change_token_ticker esdtSafeAddTokenToWhitelist => esdt_safe_add_token_to_whitelist - setMultiTransferOnEsdtSafe => set_multi_transfer_on_esdt_safe - setEsdtSafeOnMultiTransfer => set_esdt_safe_on_multi_transfer esdtSafeRemoveTokenFromWhitelist => esdt_safe_remove_token_from_whitelist esdtSafeSetMaxTxBatchSize => esdt_safe_set_max_tx_batch_size esdtSafeSetMaxTxBatchBlockDuration => esdt_safe_set_max_tx_batch_block_duration @@ -60,7 +57,6 @@ multiversx_sc_wasm_adapter::endpoints! { multiTransferEsdtSetMaxBridgedAmountForToken => multi_transfer_esdt_set_max_bridged_amount_for_token multiTransferEsdtSetMaxRefundTxBatchSize => multi_transfer_esdt_set_max_refund_tx_batch_size multiTransferEsdtSetMaxRefundTxBatchBlockDuration => multi_transfer_esdt_set_max_refund_tx_batch_block_duration - multiTransferEsdtSetWrappingContractAddress => multi_transfer_esdt_set_wrapping_contract_address getQuorum => quorum getNumBoardMembers => num_board_members getRequiredStakeAmount => required_stake_amount @@ -74,6 +70,8 @@ multiversx_sc_wasm_adapter::endpoints! { getEsdtSafeAddress => esdt_safe_address getMultiTransferEsdtAddress => multi_transfer_esdt_address getProxyAddress => proxy_address + getBridgedTokensWrapperAddress => bridged_tokens_wrapper_address + getFeeEstimatorAddress => fee_estimator_address getCurrentTxBatch => get_current_tx_batch getBatch => get_batch getCurrentRefundBatch => get_current_refund_batch From 13ce3a3366f26564b64190e7e3cf5e2d2016f955 Mon Sep 17 00:00:00 2001 From: Eveline Molnar Date: Thu, 24 Oct 2024 13:18:49 +0300 Subject: [PATCH 05/21] small-fix --- Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 78f86ea2..6b964fcc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,6 @@ members = [ "test-caller", "test-caller/meta", "common/storage-module", - "test-caller/meta", "common/mock-contracts/mock-price-aggregator/meta", "common/mock-contracts/mock-multi-transfer-esdt/meta", "common/mock-contracts/mock-bridge-proxy/meta", From bb43e3f467556dce08a7d4fe971e6dca2800e146 Mon Sep 17 00:00:00 2001 From: Eveline Molnar Date: Thu, 24 Oct 2024 13:21:38 +0300 Subject: [PATCH 06/21] clippy-fix --- bridge-proxy/tests/bridge_proxy_blackbox_test.rs | 9 +++------ multisig/src/setup.rs | 4 +--- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/bridge-proxy/tests/bridge_proxy_blackbox_test.rs b/bridge-proxy/tests/bridge_proxy_blackbox_test.rs index dc6b85d8..00ad48f8 100644 --- a/bridge-proxy/tests/bridge_proxy_blackbox_test.rs +++ b/bridge-proxy/tests/bridge_proxy_blackbox_test.rs @@ -243,8 +243,7 @@ fn deploy_test() { test.config_bridge(); - let multi_tr = test - .world + test.world .query() .to(MULTISIG_ADDRESS) .typed(mock_multisig_proxy::MockMultisigProxy) @@ -252,8 +251,7 @@ fn deploy_test() { .returns(ExpectValue(MULTI_TRANSFER_ADDRESS)) .run(); - let esdt_addr = test - .world + test.world .query() .to(MULTISIG_ADDRESS) .typed(mock_multisig_proxy::MockMultisigProxy) @@ -261,8 +259,7 @@ fn deploy_test() { .returns(ExpectValue(ESDT_SAFE_ADDRESS)) .run(); - let btw_addr = test - .world + test.world .query() .to(MULTISIG_ADDRESS) .typed(mock_multisig_proxy::MockMultisigProxy) diff --git a/multisig/src/setup.rs b/multisig/src/setup.rs index f822d556..9bf99bd7 100644 --- a/multisig/src/setup.rs +++ b/multisig/src/setup.rs @@ -1,9 +1,7 @@ use multiversx_sc::imports::*; use eth_address::EthAddress; -use sc_proxies::{ - bridge_proxy_contract_proxy, esdt_safe_proxy, multi_transfer_esdt_proxy, multisig_proxy, -}; +use sc_proxies::{bridge_proxy_contract_proxy, esdt_safe_proxy, multi_transfer_esdt_proxy}; #[multiversx_sc::module] pub trait SetupModule: From b4a8f68216bc1c27bfc171110d234bda9202c91e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Costin=20Caraba=C8=99?= Date: Fri, 25 Oct 2024 08:35:57 +0300 Subject: [PATCH 07/21] esdt-safe: fix mandos scenarios --- .../scenarios/create_transaction_ok.scen.json | 3 +- ...eate_transaction_over_max_amount.scen.json | 2 +- esdt-safe/scenarios/distribute_fees.scen.json | 4 +- .../execute_batch_both_rejected.scen.json | 4 +- .../execute_batch_both_success.scen.json | 4 +- ...e_batch_one_success_one_rejected.scen.json | 4 +- .../execute_transaction_rejected.scen.json | 4 +- .../execute_transaction_success.scen.json | 6 +-- .../scenarios/get_next_tx_batch.scen.json | 4 +- esdt-safe/scenarios/setup_accounts.scen.json | 46 +++++++------------ esdt-safe/scenarios/zero_fees.scen.json | 45 +++--------------- 11 files changed, 39 insertions(+), 87 deletions(-) diff --git a/esdt-safe/scenarios/create_transaction_ok.scen.json b/esdt-safe/scenarios/create_transaction_ok.scen.json index 22bacf7d..d41b1754 100644 --- a/esdt-safe/scenarios/create_transaction_ok.scen.json +++ b/esdt-safe/scenarios/create_transaction_ok.scen.json @@ -109,7 +109,8 @@ "str:accumulatedTransactionFees|nested:str:BRIDGE-123456": "1,500,000", "+": "" }, - "code": "file:../output/esdt-safe.wasm" + "code": "file:../output/esdt-safe.wasm", + "owner": "address:owner" }, "+": {} } diff --git a/esdt-safe/scenarios/create_transaction_over_max_amount.scen.json b/esdt-safe/scenarios/create_transaction_over_max_amount.scen.json index 44418d98..37de81ff 100644 --- a/esdt-safe/scenarios/create_transaction_over_max_amount.scen.json +++ b/esdt-safe/scenarios/create_transaction_over_max_amount.scen.json @@ -9,7 +9,7 @@ "step": "scCall", "txId": "create-transaction-ok", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt_safe", "function": "setMaxBridgedAmount", "arguments": [ diff --git a/esdt-safe/scenarios/distribute_fees.scen.json b/esdt-safe/scenarios/distribute_fees.scen.json index 116bdef3..8899c5dd 100644 --- a/esdt-safe/scenarios/distribute_fees.scen.json +++ b/esdt-safe/scenarios/distribute_fees.scen.json @@ -9,7 +9,7 @@ "step": "scCall", "txId": "owner-distribute-fees", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt_safe", "value": "0", "function": "distributeFees", @@ -60,4 +60,4 @@ } } ] -} +} \ No newline at end of file diff --git a/esdt-safe/scenarios/execute_batch_both_rejected.scen.json b/esdt-safe/scenarios/execute_batch_both_rejected.scen.json index a80b108e..1adb7cc4 100644 --- a/esdt-safe/scenarios/execute_batch_both_rejected.scen.json +++ b/esdt-safe/scenarios/execute_batch_both_rejected.scen.json @@ -9,7 +9,7 @@ "step": "scCall", "txId": "set-tx-status-both-rejected", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt_safe", "value": "0", "function": "setTransactionBatchStatus", @@ -116,4 +116,4 @@ } } ] -} +} \ No newline at end of file diff --git a/esdt-safe/scenarios/execute_batch_both_success.scen.json b/esdt-safe/scenarios/execute_batch_both_success.scen.json index ddbf763b..07748d8c 100644 --- a/esdt-safe/scenarios/execute_batch_both_success.scen.json +++ b/esdt-safe/scenarios/execute_batch_both_success.scen.json @@ -9,7 +9,7 @@ "step": "scCall", "txId": "set-tx-status-both-executed", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt_safe", "value": "0", "function": "setTransactionBatchStatus", @@ -114,4 +114,4 @@ } } ] -} +} \ No newline at end of file diff --git a/esdt-safe/scenarios/execute_batch_one_success_one_rejected.scen.json b/esdt-safe/scenarios/execute_batch_one_success_one_rejected.scen.json index 3a76c22c..f0cda64d 100644 --- a/esdt-safe/scenarios/execute_batch_one_success_one_rejected.scen.json +++ b/esdt-safe/scenarios/execute_batch_one_success_one_rejected.scen.json @@ -9,7 +9,7 @@ "step": "scCall", "txId": "set-tx-status-one-executed-one-rejected", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt_safe", "value": "0", "function": "setTransactionBatchStatus", @@ -94,4 +94,4 @@ } } ] -} +} \ No newline at end of file diff --git a/esdt-safe/scenarios/execute_transaction_rejected.scen.json b/esdt-safe/scenarios/execute_transaction_rejected.scen.json index 81345ee9..60adda25 100644 --- a/esdt-safe/scenarios/execute_transaction_rejected.scen.json +++ b/esdt-safe/scenarios/execute_transaction_rejected.scen.json @@ -9,7 +9,7 @@ "step": "scCall", "txId": "set-tx-status-rejected", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt_safe", "value": "0", "function": "setTransactionBatchStatus", @@ -85,4 +85,4 @@ } } ] -} +} \ No newline at end of file diff --git a/esdt-safe/scenarios/execute_transaction_success.scen.json b/esdt-safe/scenarios/execute_transaction_success.scen.json index 1731749b..8f79c28e 100644 --- a/esdt-safe/scenarios/execute_transaction_success.scen.json +++ b/esdt-safe/scenarios/execute_transaction_success.scen.json @@ -9,7 +9,7 @@ "step": "scCall", "txId": "set-tx-status-executed", "tx": { - "from": "address:owner", + "from": "sc:multisig", "to": "sc:esdt_safe", "value": "0", "function": "setTransactionBatchStatus", @@ -75,9 +75,7 @@ "str:pendingBatches|u64:1": "", "str:firstBatchId": "2", "str:lastBatchId": "2", - "str:accumulatedTransactionFees|nested:str:BRIDGE-123456": "1,500,000", - "+": "" }, "code": "file:../output/esdt-safe.wasm" @@ -86,4 +84,4 @@ } } ] -} +} \ No newline at end of file diff --git a/esdt-safe/scenarios/get_next_tx_batch.scen.json b/esdt-safe/scenarios/get_next_tx_batch.scen.json index 8a22bcda..54290c41 100644 --- a/esdt-safe/scenarios/get_next_tx_batch.scen.json +++ b/esdt-safe/scenarios/get_next_tx_batch.scen.json @@ -22,14 +22,12 @@ "expect": { "out": [ "1", - "0", "1", "address:user1", "0x0102030405060708091011121314151617181920", "str:BRIDGE-123456", "400", - "0", "2", "address:user2", @@ -40,4 +38,4 @@ } } ] -} +} \ No newline at end of file diff --git a/esdt-safe/scenarios/setup_accounts.scen.json b/esdt-safe/scenarios/setup_accounts.scen.json index b4f5b455..cb7d0d3c 100644 --- a/esdt-safe/scenarios/setup_accounts.scen.json +++ b/esdt-safe/scenarios/setup_accounts.scen.json @@ -45,6 +45,11 @@ "creatorAddress": "address:owner", "creatorNonce": "2", "newAddress": "sc:bridged_tokens_wrapper" + }, + { + "creatorAddress": "address:owner", + "creatorNonce": "3", + "newAddress": "sc:multisig" } ] }, @@ -56,8 +61,6 @@ "contractCode": "file:../output/esdt-safe.wasm", "value": "0", "arguments": [ - "sc:price_aggregator", - "sc:multi_transfer", "150,000" ], "gasLimit": "20,000,000", @@ -97,27 +100,6 @@ "refund": "*" } }, - { - "step": "scCall", - "txId": "add-bridged-tokens-wrapper-addr", - "tx": { - "from": "address:owner", - "to": "sc:esdt_safe", - "value": "0", - "function": "setBridgedTokensWrapperAddress", - "arguments": [ - "sc:bridged_tokens_wrapper" - ], - "gasLimit": "50,000,000", - "gasPrice": "0" - }, - "expect": { - "status": "0", - "message": "", - "gas": "*", - "refund": "*" - } - }, { "step": "checkState", "accounts": { @@ -125,9 +107,6 @@ "nonce": "0", "balance": "0", "storage": { - "str:feeEstimatorContractAddress": "sc:price_aggregator", - "str:multiTransferContractAddress": "sc:multi_transfer", - "str:bridgedTokensWrapperAddress": "sc:bridged_tokens_wrapper", "str:maxTxBatchSize": "10", "str:maxTxBatchBlockDuration": "100", "str:firstBatchId": "1", @@ -167,6 +146,16 @@ "step": "setState", "comment": "setting local burn role", "accounts": { + "sc:multisig": { + "nonce": "0", + "balance": "0", + "storage": { + "str:feeEstimatorAddress": "sc:price_aggregator", + "str:multiTransferEsdtAddress": "sc:multi_transfer" + }, + "code": "file:../../multisig/output/multisig.wasm", + "owner": "address:owner" + }, "sc:esdt_safe": { "nonce": "0", "balance": "0", @@ -180,9 +169,6 @@ } }, "storage": { - "str:feeEstimatorContractAddress": "sc:price_aggregator", - "str:multiTransferContractAddress": "sc:multi_transfer", - "str:bridgedTokensWrapperAddress": "sc:bridged_tokens_wrapper", "str:maxTxBatchSize": "10", "str:maxTxBatchBlockDuration": "100", "str:firstBatchId": "1", @@ -195,7 +181,7 @@ "str:tokenWhitelist.len": "1" }, "code": "file:../output/esdt-safe.wasm", - "owner": "address:owner" + "owner": "sc:multisig" } } }, diff --git a/esdt-safe/scenarios/zero_fees.scen.json b/esdt-safe/scenarios/zero_fees.scen.json index 5e573a8c..de13dd78 100644 --- a/esdt-safe/scenarios/zero_fees.scen.json +++ b/esdt-safe/scenarios/zero_fees.scen.json @@ -6,49 +6,18 @@ "path": "setup_accounts.scen.json" }, { - "step": "scCall", - "txId": "set-fee-estimator-address-to-address-zero", - "tx": { - "from": "address:owner", - "to": "sc:esdt_safe", - "value": "0", - "function": "setFeeEstimatorContractAddress", - "arguments": [ - "0x0000000000000000000000000000000000000000000000000000000000000000" - ], - "gasLimit": "30,000,000", - "gasPrice": "0" - }, - "expect": { - "status": "0", - "message": "", - "out": [], - "gas": "*", - "refund": "*" - } - }, - { - "step": "checkState", + "step": "setState", + "comment": "setting local burn role", "accounts": { - "sc:esdt_safe": { + "sc:multisig": { "nonce": "0", "balance": "0", - "esdt": { - "str:BRIDGE-123456": { - "balance": "0", - "roles": [ - "ESDTRoleLocalBurn", - "ESDTRoleLocalMint" - ] - } - }, "storage": { - "str:feeEstimatorContractAddress": "0x0000000000000000000000000000000000000000000000000000000000000000", - "+": "" + "str:feeEstimatorAddress": "0x0000000000000000000000000000000000000000000000000000000000000000" }, - "code": "file:../output/esdt-safe.wasm" - }, - "+": {} + "code": "file:../../multisig/output/multisig.wasm", + "owner": "address:owner" + } } }, { From 7de1c32e2e041c9ff2ffb7427400739692cd44eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Costin=20Caraba=C8=99?= Date: Fri, 25 Oct 2024 08:36:13 +0300 Subject: [PATCH 08/21] multi-transfer: Fix mandos scenarios --- .../scenarios/setup_accounts.scen.json | 73 +------------------ 1 file changed, 4 insertions(+), 69 deletions(-) diff --git a/multi-transfer-esdt/scenarios/setup_accounts.scen.json b/multi-transfer-esdt/scenarios/setup_accounts.scen.json index 807472e6..5454dccb 100644 --- a/multi-transfer-esdt/scenarios/setup_accounts.scen.json +++ b/multi-transfer-esdt/scenarios/setup_accounts.scen.json @@ -92,9 +92,7 @@ "from": "address:owner", "contractCode": "file:../../bridge-proxy/output/bridge-proxy.wasm", "value": "0", - "arguments": [ - "sc:multi_transfer_esdt" - ], + "arguments": [], "gasLimit": "20,000,000", "gasPrice": "0" }, @@ -105,26 +103,6 @@ "refund": "*" } }, - { - "step": "scCall", - "txId": "add-bridge-proxy-to-multi-transfer", - "tx": { - "from": "address:owner", - "to": "sc:multi_transfer_esdt", - "function": "setBridgeProxyContractAddress", - "arguments": [ - "sc:bridge-proxy" - ], - "gasLimit": "5,000,000", - "gasPrice": "0" - }, - "expect": { - "status": "0", - "message": "", - "gas": "*", - "refund": "*" - } - }, { "step": "scCall", "txId": "add-token-1", @@ -181,52 +159,11 @@ "refund": "*" } }, - { - "step": "scCall", - "txId": "set-multi-transfer-contract-address", - "tx": { - "from": "address:owner", - "to": "sc:esdt-safe", - "value": "0", - "function": "setMultiTransferContractAddress", - "arguments": [ - "sc:multi_transfer_esdt" - ], - "gasLimit": "50,000,000", - "gasPrice": "0" - }, - "expect": { - "status": "0", - "message": "", - "gas": "*", - "refund": "*" - } - }, - { - "step": "scCall", - "txId": "add-bridge-proxy-to-multi-transfer", - "tx": { - "from": "address:owner", - "to": "sc:multi_transfer_esdt", - "function": "setEsdtSafeContractAddress", - "arguments": [ - "sc:esdt-safe" - ], - "gasLimit": "5,000,000", - "gasPrice": "0" - }, - "expect": { - "status": "0", - "message": "", - "gas": "*", - "refund": "*" - } - }, { "step": "checkState", "accounts": { "address:owner": { - "nonce": "7", + "nonce": "4", "balance": "0", "esdt": { "str:BRIDGE-123456": { @@ -252,10 +189,8 @@ "storage": { "str:firstBatchId": "1", "str:lastBatchId": "1", - "str:bridgeProxyContractAddress": "sc:bridge-proxy", "str:maxTxBatchSize": "10", - "str:maxTxBatchBlockDuration": "0xffffffffffffffff", - "str:esdtSafeContractAddress": "sc:esdt-safe" + "str:maxTxBatchBlockDuration": "0xffffffffffffffff" } }, "sc:bridge-proxy": { @@ -328,4 +263,4 @@ } } ] -} +} \ No newline at end of file From e63daecca5eed9b058259a8f124cddc71a5bbced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Costin=20Caraba=C8=99?= Date: Fri, 25 Oct 2024 10:22:18 +0300 Subject: [PATCH 09/21] multisig: scenarios fix --- .../scenarios/change_token_config.scen.json | 24 +++++-------------- multisig/scenarios/setup.scen.json | 19 ++++++++------- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/multisig/scenarios/change_token_config.scen.json b/multisig/scenarios/change_token_config.scen.json index 75610ded..fb4da984 100644 --- a/multisig/scenarios/change_token_config.scen.json +++ b/multisig/scenarios/change_token_config.scen.json @@ -12,8 +12,12 @@ "from": "address:owner", "to": "sc:multisig", "value": "0", - "function": "changeFeeEstimatorContractAddress", + "function": "upgrade", "arguments": [ + "sc:esdt_safe", + "sc:multi_transfer", + "sc:bridge_proxy", + "sc:bridged_tokens_wrapper", "sc:egld_esdt_swap" ], "gasLimit": "55,000,000", @@ -27,22 +31,6 @@ "refund": "*" } }, - { - "step": "checkState", - "accounts": { - "sc:esdt_safe": { - "nonce": "0", - "balance": "0", - "esdt": "*", - "storage": { - "str:feeEstimatorContractAddress": "sc:egld_esdt_swap", - "+": "" - }, - "code": "*" - }, - "+": {} - } - }, { "step": "scCall", "txId": "change-default-price-per-gas-unit", @@ -246,4 +234,4 @@ } } ] -} +} \ No newline at end of file diff --git a/multisig/scenarios/setup.scen.json b/multisig/scenarios/setup.scen.json index 9572e774..968e22ec 100644 --- a/multisig/scenarios/setup.scen.json +++ b/multisig/scenarios/setup.scen.json @@ -12,10 +12,12 @@ "sc:bridge_proxy": { "code": "file:../../bridge-proxy/output/bridge-proxy.wasm", "nonce": "0", - "balance": "0", - "storage": { - "str:multiTransferAddress": "sc:multi_transfer" - } + "balance": "0" + }, + "sc:bridged_tokens_wrapper": { + "code": "file:../../bridge-proxy/output/bridged-tokens-wrapper.wasm", + "nonce": "0", + "balance": "0" }, "sc:multi_transfer": { "nonce": "0", @@ -35,8 +37,6 @@ } }, "storage": { - "str:esdtSafeContractAddress": "sc:esdt_safe", - "str:bridgeProxyContractAddress": "sc:bridge_proxy", "str:maxTxBatchSize": "10", "str:maxTxBatchBlockDuration": "3,600", "str:maxBridgedAmount|nested:str:WEGLD-123456": "100,000,000,000", @@ -67,9 +67,6 @@ } }, "storage": { - "str:multiTransferContractAddress": "sc:multi_transfer", - "str:feeEstimatorContractAddress": "sc:price_aggregator", - "str:bridgedTokensWrapperAddress": "sc:bridged_tokens_wrapper", "str:maxTxBatchSize": "10", "str:maxTxBatchBlockDuration": "100", "str:ethTxGasLimit": "150,000", @@ -143,6 +140,8 @@ "sc:esdt_safe", "sc:multi_transfer", "sc:bridge_proxy", + "sc:bridged_tokens_wrapper", + "sc:price_aggregator", "1000", "500", "2", @@ -169,6 +168,8 @@ "str:esdtSafeAddress": "sc:esdt_safe", "str:multiTransferEsdtAddress": "sc:multi_transfer", "str:proxyAddress": "sc:bridge_proxy", + "str:bridgedTokensWrapperAddress": "sc:bridged_tokens_wrapper", + "str:feeEstimatorAddress": "sc:price_aggregator", "str:num_board_members": "2", "str:quorum": "2", "str:requiredStakeAmount": "1000", From 75b84001a4ee5f35548d81e6523e9b91edeb2b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Costin=20Caraba=C8=99?= Date: Fri, 25 Oct 2024 11:03:55 +0300 Subject: [PATCH 10/21] Fix mandos scenarios --- .../scenarios/create_transaction_ok.scen.json | 2 +- .../scenarios/change_token_config.scen.json | 26 ------------------- multisig/scenarios/setup.scen.json | 2 +- 3 files changed, 2 insertions(+), 28 deletions(-) diff --git a/esdt-safe/scenarios/create_transaction_ok.scen.json b/esdt-safe/scenarios/create_transaction_ok.scen.json index d41b1754..2371c290 100644 --- a/esdt-safe/scenarios/create_transaction_ok.scen.json +++ b/esdt-safe/scenarios/create_transaction_ok.scen.json @@ -110,7 +110,7 @@ "+": "" }, "code": "file:../output/esdt-safe.wasm", - "owner": "address:owner" + "owner": "sc:multisig" }, "+": {} } diff --git a/multisig/scenarios/change_token_config.scen.json b/multisig/scenarios/change_token_config.scen.json index fb4da984..ae9d588e 100644 --- a/multisig/scenarios/change_token_config.scen.json +++ b/multisig/scenarios/change_token_config.scen.json @@ -5,32 +5,6 @@ "step": "externalSteps", "path": "setup.scen.json" }, - { - "step": "scCall", - "txId": "change-fee-estimator-sc-address", - "tx": { - "from": "address:owner", - "to": "sc:multisig", - "value": "0", - "function": "upgrade", - "arguments": [ - "sc:esdt_safe", - "sc:multi_transfer", - "sc:bridge_proxy", - "sc:bridged_tokens_wrapper", - "sc:egld_esdt_swap" - ], - "gasLimit": "55,000,000", - "gasPrice": "0" - }, - "expect": { - "status": "0", - "message": "", - "out": [], - "gas": "*", - "refund": "*" - } - }, { "step": "scCall", "txId": "change-default-price-per-gas-unit", diff --git a/multisig/scenarios/setup.scen.json b/multisig/scenarios/setup.scen.json index 968e22ec..56e2e062 100644 --- a/multisig/scenarios/setup.scen.json +++ b/multisig/scenarios/setup.scen.json @@ -15,7 +15,7 @@ "balance": "0" }, "sc:bridged_tokens_wrapper": { - "code": "file:../../bridge-proxy/output/bridged-tokens-wrapper.wasm", + "code": "file:../../bridged-tokens-wrapper/output/bridged-tokens-wrapper.wasm", "nonce": "0", "balance": "0" }, From 3cf0374427de37f7f6d18d23ec4b59a631b2a86a Mon Sep 17 00:00:00 2001 From: evelinemolnar Date: Fri, 25 Oct 2024 14:29:04 +0300 Subject: [PATCH 11/21] moved some unit tests --- Cargo.lock | 1 + bridged-tokens-wrapper/Cargo.toml | 3 + .../src/mock_price_aggregator.rs | 3 + .../mock-price-aggregator/wasm/src/lib.rs | 5 +- esdt-safe/tests/esdt_safe_blackbox_test.rs | 556 +++++++++++++++++- .../tests/multi_transfer_blackbox_test.rs | 539 +---------------- 6 files changed, 561 insertions(+), 546 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a7344cea..573f1171 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -151,6 +151,7 @@ name = "bridged-tokens-wrapper" version = "0.0.0" dependencies = [ "eth-address", + "mock-esdt-safe", "multiversx-sc", "multiversx-sc-modules", "multiversx-sc-scenario", diff --git a/bridged-tokens-wrapper/Cargo.toml b/bridged-tokens-wrapper/Cargo.toml index ed108d8c..0724b47c 100644 --- a/bridged-tokens-wrapper/Cargo.toml +++ b/bridged-tokens-wrapper/Cargo.toml @@ -26,6 +26,9 @@ path = "../common/storage-module" [dependencies.sc-proxies] path = "../common/sc-proxies" +[dependencies.mock-esdt-safe] +path = "../common/mock-contracts/mock-esdt-safe" + [dependencies.multiversx-sc] version = "=0.53.2" diff --git a/common/mock-contracts/mock-price-aggregator/src/mock_price_aggregator.rs b/common/mock-contracts/mock-price-aggregator/src/mock_price_aggregator.rs index b979c097..98fce5d7 100644 --- a/common/mock-contracts/mock-price-aggregator/src/mock_price_aggregator.rs +++ b/common/mock-contracts/mock-price-aggregator/src/mock_price_aggregator.rs @@ -20,4 +20,7 @@ pub trait MockPriceAggregator { #[upgrade] fn upgrade(&self) {} + + #[view(latestPriceFeedOptional)] + fn latest_price_feed_optional(&self, _from: ManagedBuffer, _to: ManagedBuffer) {} } diff --git a/common/mock-contracts/mock-price-aggregator/wasm/src/lib.rs b/common/mock-contracts/mock-price-aggregator/wasm/src/lib.rs index 3459508d..6347bbc3 100644 --- a/common/mock-contracts/mock-price-aggregator/wasm/src/lib.rs +++ b/common/mock-contracts/mock-price-aggregator/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 0 +// Endpoints: 1 // Async Callback (empty): 1 -// Total number of exported functions: 3 +// Total number of exported functions: 4 #![no_std] @@ -20,6 +20,7 @@ multiversx_sc_wasm_adapter::endpoints! { ( init => init upgrade => upgrade + latestPriceFeedOptional => latest_price_feed_optional ) } diff --git a/esdt-safe/tests/esdt_safe_blackbox_test.rs b/esdt-safe/tests/esdt_safe_blackbox_test.rs index c1ca520c..36fc81fa 100644 --- a/esdt-safe/tests/esdt_safe_blackbox_test.rs +++ b/esdt-safe/tests/esdt_safe_blackbox_test.rs @@ -1,9 +1,13 @@ #![allow(unused)] use esdt_safe::*; +use eth_address::EthAddress; use multiversx_sc_scenario::imports::*; use sc_proxies::esdt_safe_proxy::{self, EsdtSafeProxyMethods}; use sc_proxies::mock_multisig_proxy; +use transaction::transaction_status::TransactionStatus; +use transaction::Transaction; +use tx_batch_module::BatchStatus; const OWNER_ADDRESS: TestAddress = TestAddress::new("owner"); @@ -11,9 +15,11 @@ const BRIDGE_PROXY_ADDRESS: TestSCAddress = TestSCAddress::new("bridge-proxy"); const CROWDFUNDING_ADDRESS: TestSCAddress = TestSCAddress::new("crowfunding"); const MULTI_TRANSFER_ADDRESS: TestSCAddress = TestSCAddress::new("multi-transfer"); const ESDT_SAFE_ADDRESS: TestSCAddress = TestSCAddress::new("esdt-safe"); -const FEE_ESTIMATOR_ADDRESS: TestSCAddress = TestSCAddress::new("fee-estimator"); +const PRICE_AGGREGATOR: TestSCAddress = TestSCAddress::new("price-aggregator"); const MULTISIG_ADDRESS: TestSCAddress = TestSCAddress::new("multisig"); const BRIDGED_TOKENS_WRAPPER_ADDRESS: TestSCAddress = TestSCAddress::new("bridged-tokens-wrapper"); +const OWNER_ADDRESS_EXPR: &str = "address:owner"; +const ESTD_SAFE_ADDRESS_EXPR: &str = "sc:esdt-safe"; const ESDT_SAFE_CODE_PATH: MxscPath = MxscPath::new("output/esdt-safe.mxsc.json"); const MOCK_MULTI_TRANSFER_PATH_EXPR: MxscPath = MxscPath::new( @@ -32,7 +38,7 @@ const MOCK_BRIDGE_PROXY_PATH_EXPR: MxscPath = const TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("TOKEN-123456"); const NON_WHITELISTED_TOKEN: TestTokenIdentifier = TestTokenIdentifier::new("NON-WHITELISTED-123456"); -const TOKEN_WITH_BURN_ROLE: TestTokenIdentifier = TestTokenIdentifier::new("TOKEN-WITH-OUT"); +const TOKEN_WITH_BURN_ROLE: TestTokenIdentifier = TestTokenIdentifier::new("TOKEN-WITH"); const NATIVE_TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("ESDT-123"); const ETH_TX_GAS_LIMIT: u64 = 150_000; const ETH_TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("ETH-123456"); @@ -79,9 +85,17 @@ impl EsdtSafeTestState { .esdt_balance(ETH_TOKEN_ID, 1001u64) .esdt_balance(TOKEN_ID, 1_000_000_000_000u64) .esdt_balance(NON_WHITELISTED_TOKEN, 1001u64) - .esdt_balance(NATIVE_TOKEN_ID, 100_000u64) + .esdt_balance(NATIVE_TOKEN_ID, 300_000_000_000u64) .esdt_balance(TOKEN_WITH_BURN_ROLE, 100_000u64); + world + .account(PRICE_AGGREGATOR) + .code(MOCK_PRICE_AGGREGATOR_CODE_PATH); + + world + .account(MULTI_TRANSFER_ADDRESS) + .code(MOCK_MULTI_TRANSFER_PATH_EXPR); + Self { world } } @@ -99,7 +113,7 @@ impl EsdtSafeTestState { MULTI_TRANSFER_ADDRESS, BRIDGE_PROXY_ADDRESS, BRIDGED_TOKENS_WRAPPER_ADDRESS, - FEE_ESTIMATOR_ADDRESS, + PRICE_AGGREGATOR, 1_000u64, 500u64, 2usize, @@ -161,7 +175,7 @@ impl EsdtSafeTestState { self.world.set_esdt_balance( MULTISIG_ADDRESS, - b"TOKEN-WITH-OUT", + b"TOKEN-WITH", BigUint::from(10_000_000u64), ); @@ -171,7 +185,7 @@ impl EsdtSafeTestState { BigUint::from(10_000_000u64), ); - self.esdt_raw_transction() + self.esdt_raw_transaction() .add_token_to_whitelist( TOKEN_ID, "TOKEN", @@ -184,7 +198,7 @@ impl EsdtSafeTestState { ) .run(); - self.esdt_raw_transction() + self.esdt_raw_transaction() .add_token_to_whitelist( TOKEN_WITH_BURN_ROLE, "TKN", @@ -197,7 +211,7 @@ impl EsdtSafeTestState { ) .run(); - self.esdt_raw_transction() + self.esdt_raw_transaction() .add_token_to_whitelist( NATIVE_TOKEN_ID, "NATIVE", @@ -220,7 +234,7 @@ impl EsdtSafeTestState { expected_status: u64, expected_error: &str, ) { - self.esdt_raw_transction() + self.esdt_raw_transaction() .init_supply(token_id, BigUint::from(amount)) .egld_or_single_esdt( &EgldOrEsdtTokenIdentifier::esdt(tx_token_id), @@ -238,7 +252,7 @@ impl EsdtSafeTestState { tx_amount: u64, amount: u64, ) { - self.esdt_raw_transction() + self.esdt_raw_transaction() .init_supply(token_id, BigUint::from(amount)) .egld_or_single_esdt( &EgldOrEsdtTokenIdentifier::esdt(tx_token_id), @@ -248,8 +262,109 @@ impl EsdtSafeTestState { .returns(ReturnsResult) .run(); } + fn add_refund_batch_tx_single_payment_should_fail( + &mut self, + from_address: TestSCAddress, + to_address: TestSCAddress, + transfers: ManagedVec>, + token_id: TestTokenIdentifier, + amount: u64, + expected_error: &str, + ) { + self.world + .tx() + .from(from_address) + .to(to_address) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .add_refund_batch(transfers) + .egld_or_single_esdt( + &EgldOrEsdtTokenIdentifier::esdt(token_id), + 0, + &BigUint::from(amount), + ) + .returns(ExpectError(ERROR, expected_error)) + .run(); + } + + fn add_refund_batch_tx_multiple_payment_should_fail( + &mut self, + from_address: TestSCAddress, + to_address: TestSCAddress, + transfers: ManagedVec>, + payment: EgldOrMultiEsdtPayment, + expected_error: &str, + ) { + self.world + .tx() + .from(from_address) + .to(to_address) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .add_refund_batch(transfers) + .egld_or_multi_esdt(payment) + .returns(ExpectError(ERROR, expected_error)) + .run(); + } + + fn single_transaction_should_fail( + &mut self, + token_id: TestTokenIdentifier, + amount: u64, + expected_error: &str, + ) { + self.esdt_raw_transaction() + .create_transaction( + EthAddress::zero(), + OptionalValue::None::>, + ) + .egld_or_single_esdt( + &EgldOrEsdtTokenIdentifier::esdt(token_id), + 0, + &BigUint::from(amount), + ) + .returns(ExpectError(ERROR, expected_error)) + .run(); + } + + fn single_transaction_should_work(&mut self, token_id: TestTokenIdentifier, amount: u64) { + self.esdt_raw_transaction() + .create_transaction( + EthAddress::zero(), + OptionalValue::None::>, + ) + .egld_or_single_esdt( + &EgldOrEsdtTokenIdentifier::esdt(token_id), + 0, + &BigUint::from(amount), + ) + .returns(ReturnsResult) + .run(); + } + + fn set_transaction_batch_status_should_fail( + &mut self, + batch_id: u32, + statuses: MultiValueEncoded, + expected_status: u64, + expected_error: &str, + ) { + self.esdt_raw_transaction() + .set_transaction_batch_status(batch_id, statuses) + .returns(ExpectError(expected_status, expected_error)) + .run(); + } + + fn set_transaction_batch_status_should_work( + &mut self, + batch_id: u32, + statuses: MultiValueEncoded, + ) { + self.esdt_raw_transaction() + .set_transaction_batch_status(batch_id, statuses) + .returns(ReturnsResult) + .run(); + } - fn esdt_raw_transction( + fn esdt_raw_transaction( &mut self, ) -> EsdtSafeProxyMethods, TestSCAddress, TestSCAddress, ()> { self.world @@ -351,7 +466,7 @@ fn init_supply_test_mint_burn() { state.config_esdtsafe(); state - .esdt_raw_transction() + .esdt_raw_transaction() .init_supply_mint_burn( NON_WHITELISTED_TOKEN, BigUint::from(10_000u64), @@ -361,7 +476,7 @@ fn init_supply_test_mint_burn() { .run(); state - .esdt_raw_transction() + .esdt_raw_transaction() .init_supply_mint_burn(TOKEN_ID, BigUint::from(10_000u64), BigUint::from(10_000u64)) .with_result(ExpectError( ERROR, @@ -370,7 +485,7 @@ fn init_supply_test_mint_burn() { .run(); state - .esdt_raw_transction() + .esdt_raw_transaction() .init_supply_mint_burn( TOKEN_WITH_BURN_ROLE, BigUint::from(10_000u64), @@ -409,3 +524,416 @@ fn init_supply_test_mint_burn() { "Total supply should be 10,000" ); } + +#[test] +fn set_transaction_batch_status_test() { + let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); + state.safe_deploy(); + state.config_esdtsafe(); + + let mut tx_statuses = MultiValueEncoded::::new(); + tx_statuses.push(TransactionStatus::Executed); + let mut tx_multiple_statuses = MultiValueEncoded::::new(); + tx_multiple_statuses.push(TransactionStatus::Executed); + tx_multiple_statuses.push(TransactionStatus::Pending); + let mut tx_statuses_invalid = MultiValueEncoded::::new(); + tx_statuses_invalid.push(TransactionStatus::Pending); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .init_supply_mint_burn( + TOKEN_WITH_BURN_ROLE, + BigUint::from(100_000u64), + BigUint::from(10_000u64), + ) + .run(); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .set_eth_tx_gas_limit(1000u64) + .run(); + + state.single_transaction_should_work(TOKEN_ID, 100_000u64); + + state.set_transaction_batch_status_should_fail( + 5u32, + tx_statuses.clone(), + ERROR, + "Batches must be processed in order", + ); + + state.set_transaction_batch_status_should_fail( + 1u32, + tx_multiple_statuses.clone(), + ERROR, + "Invalid number of statuses provided", + ); + + state.set_transaction_batch_status_should_fail( + 1u32, + tx_statuses_invalid.clone(), + ERROR, + "Transaction status may only be set to Executed or Rejected", + ); + + state.set_transaction_batch_status_should_work(1u32, tx_statuses.clone()); + + let result = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .get_batch_status(1u64) + .returns(ReturnsResult) + .run(); + assert_eq!(result, BatchStatus::AlreadyProcessed); +} + +#[test] +fn esdt_safe_create_transaction() { + let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); + state.safe_deploy(); + + state.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"TOKEN-WITH", + BigUint::from(10_000_000u64), + ); + + state.single_transaction_should_fail( + TOKEN_WITH_BURN_ROLE, + 10u64, + "Cannot create transaction while paused", + ); + + state.config_esdtsafe(); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .set_eth_tx_gas_limit(1000u64) + .run(); + + state.single_transaction_should_fail( + TOKEN_WITH_BURN_ROLE, + 0u64, + "Transaction fees cost more than the entire bridged amount", + ); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .set_eth_tx_gas_limit(10_000u64) + .run(); + + //state.single_transaction_should_fail(TOKEN_ID, 100_000u64, "Not enough minted tokens!"); + + state.single_transaction_should_fail(NON_WHITELISTED_TOKEN, 100u64, "Token not in whitelist"); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .init_supply_mint_burn( + TOKEN_WITH_BURN_ROLE, + BigUint::from(100u64), + BigUint::from(100u64), + ) + .run(); + + state.single_transaction_should_fail( + TOKEN_WITH_BURN_ROLE, + 100u64, + "Cannot do the burn action!", + ); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .set_eth_tx_gas_limit(1000u64) + .run(); + + state.single_transaction_should_work(TOKEN_ID, 100_000u64); + + let total_accumulated_transaction_fee = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .accumulated_transaction_fees(TOKEN_ID) + .returns(ReturnsResult) + .run(); + + state.single_transaction_should_work(TOKEN_ID, 120_000u64); + + let total_balances = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .total_balances(TOKEN_WITH_BURN_ROLE) + .returns(ReturnsResult) + .run(); + +} + +#[test] +#[ignore] //This will be rewritten +fn add_refund_batch_test() { + let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); + state.safe_deploy(); + state.config_esdtsafe(); + + state.world.set_esdt_balance( + MULTI_TRANSFER_ADDRESS, + b"ESDT-123", + BigUint::from(300_000_000_000u64), + ); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .set_eth_tx_gas_limit(1u64) + .run(); + + state.world.set_esdt_balance( + ESDT_SAFE_ADDRESS, + b"ESDT-123", + BigUint::from(300_000_000_000u64), + ); + + let eth_tx = Transaction { + from: ManagedBuffer::from(OWNER_ADDRESS_EXPR), + to: ManagedBuffer::from(ESTD_SAFE_ADDRESS_EXPR), + amount: BigUint::from(1_000_000u64), + block_nonce: 0u64, + nonce: 0u64, + token_identifier: TokenIdentifier::from(NATIVE_TOKEN_ID), + is_refund_tx: true, + }; + + let eth_tx2 = Transaction { + from: ManagedBuffer::from(OWNER_ADDRESS_EXPR), + to: ManagedBuffer::from(ESTD_SAFE_ADDRESS_EXPR), + amount: BigUint::from(1_000_000u64), + block_nonce: 0u64, + nonce: 0u64, + token_identifier: TokenIdentifier::from(NATIVE_TOKEN_ID), + is_refund_tx: true, + }; + + let mut transfers: ManagedVec> = ManagedVec::new(); + transfers.push(eth_tx); + transfers.push(eth_tx2); + + let payments = vec![ + EsdtTokenPayment::new(NATIVE_TOKEN_ID.into(), 0, BigUint::from(1_000_000u64)), + EsdtTokenPayment::new(NATIVE_TOKEN_ID.into(), 0, BigUint::from(1_000_000u64)), + ]; + let payment = EgldOrMultiEsdtPayment::MultiEsdt(payments.into()); + + state.world.set_esdt_balance( + ESDT_SAFE_ADDRESS, + b"TOKEN-123456", + BigUint::from(100_000_000_000u64), + ); + + state.add_refund_batch_tx_multiple_payment_should_fail( + ESDT_SAFE_ADDRESS, + ESDT_SAFE_ADDRESS, + transfers.clone(), + payment.clone(), + "Invalid caller", + ); + + let empty_transfers = ManagedVec::>::new(); + + state.world.set_esdt_balance( + MULTI_TRANSFER_ADDRESS, + b"TOKEN-123456", + BigUint::from(10_000u64), + ); + + state.world.set_esdt_balance( + MULTI_TRANSFER_ADDRESS, + b"TOKEN-WITH", + BigUint::from(10_000u64), + ); + + state + .world + .tx() + .from(MULTI_TRANSFER_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .add_refund_batch(empty_transfers) + .returns(ExpectError(ERROR, "Cannot refund with no payments")) + .run(); + + state.add_refund_batch_tx_single_payment_should_fail( + MULTI_TRANSFER_ADDRESS, + ESDT_SAFE_ADDRESS, + transfers.clone(), + TOKEN_WITH_BURN_ROLE, + 10u64, + "Token identifiers do not match", + ); + + let payments_invalid = vec![ + EsdtTokenPayment::new(NATIVE_TOKEN_ID.into(), 0, BigUint::from(1_000u64)), + EsdtTokenPayment::new(NATIVE_TOKEN_ID.into(), 0, BigUint::from(100u64)), + ]; + let payment_invalid = EgldOrMultiEsdtPayment::MultiEsdt(payments_invalid.into()); + + state.add_refund_batch_tx_multiple_payment_should_fail( + MULTI_TRANSFER_ADDRESS, + ESDT_SAFE_ADDRESS, + transfers.clone(), + payment_invalid.clone(), + "Amounts do not match", + ); + + state.init_supply_should_work( + NATIVE_TOKEN_ID, + NATIVE_TOKEN_ID, + 100_000_000u64, + 100_000_000u64, + ); + + state + .world + .tx() + .from(MULTI_TRANSFER_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .add_refund_batch(transfers) + .egld_or_multi_esdt(payment) + .returns(ReturnsResult) + .run(); + + let result = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .get_batch_status(1u64) + .returns(ReturnsResult) + .run(); + + if let BatchStatus::PartiallyFull { + end_block_nonce, + tx_ids, + } = result + { + assert!(!tx_ids.is_empty(), "tx_ids should not be empty"); + let expected_tx_ids = vec![1u64, 2u64]; + let tx_ids_vec: Vec = tx_ids.into_iter().collect(); + assert_eq!( + tx_ids_vec, expected_tx_ids, + "tx_ids do not match expected values" + ); + } else { + panic!("Expected BatchStatus::PartiallyFull, got {:?}", result); + } +} + +#[test] +#[ignore] //This will be rewritten +fn claim_refund_test() { + let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); + state.safe_deploy(); + state.config_esdtsafe(); + + let mut tx_statuses = MultiValueEncoded::::new(); + tx_statuses.push(TransactionStatus::Rejected); + + state + .esdt_raw_transaction() + .claim_refund(TOKEN_ID) + .with_result(ExpectStatus(ERROR)) + .returns(ExpectError(ERROR, "Nothing to refund")) + .run(); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .set_eth_tx_gas_limit(1000u64) + .run(); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .init_supply_mint_burn( + TOKEN_ID, + BigUint::from(100_000u64), + BigUint::from(10_000u64), + ) + .run(); + + state.single_transaction_should_work(TOKEN_ID, 100_000u64); + state.set_transaction_batch_status_should_work(1, tx_statuses.clone()); + + let result = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .get_refund_amounts(OWNER_ADDRESS) + .returns(ReturnsResult) + .run(); + + let (token_id, amount) = result.into_iter().next().unwrap().into_tuple(); + assert_eq!(token_id, TokenIdentifier::from(TOKEN_ID)); + assert_eq!(amount, BigUint::from(90_000u64)); + + let result2 = state + .esdt_raw_transaction() + .claim_refund(TOKEN_ID) + .returns(ReturnsResult) + .run(); + + assert_eq!(token_id, result2.token_identifier); + assert_eq!(amount, result2.amount); + + let result3 = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .get_refund_amounts(OWNER_ADDRESS) + .returns(ReturnsResult) + .run(); + assert!(result3.is_empty()); +} diff --git a/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs b/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs index 023e9c18..9ced6e65 100644 --- a/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs +++ b/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs @@ -59,11 +59,10 @@ const GAS_LIMIT: u64 = 100_000_000; const MULTI_TRANSFER_CODE_PATH: MxscPath = MxscPath::new("output/multi-transfer-esdt.mxsc.json"); const BRIDGE_PROXY_CODE_PATH: MxscPath = MxscPath::new("../bridge-proxy/output/bridge-proxy.mxsc.json"); -const ESDT_SAFE_CODE_PATH: MxscPath = MxscPath::new("../esdt-safe/output/esdt-safe.mxsc.json"); +const MOCK_ESDT_SAFE_CODE_PATH: MxscPath = + MxscPath::new("../common/mock-contracts/mock-esdt-safe/output/mock-esdt-safe.mxsc.json"); const BRIDGED_TOKENS_WRAPPER_CODE_PATH: MxscPath = MxscPath::new("../bridged-tokens-wrapper/output/bridged-tokens-wrapper.mxsc.json"); -const PRICE_AGGREGATOR_CODE_PATH: MxscPath = - MxscPath::new("../price-aggregator/price-aggregator.mxsc.json"); const MOCK_MULTISIG_CODE_PATH: MxscPath = MxscPath::new("../common/mock-contracts/mock-multisig/output/mock-multisig.mxsc.json"); const MOCK_PRICE_AGGREGATOR_CODE_PATH: MxscPath = MxscPath::new( @@ -99,7 +98,7 @@ fn world() -> ScenarioWorld { ); blockchain.register_contract(BRIDGE_PROXY_CODE_PATH, bridge_proxy::ContractBuilder); - blockchain.register_contract(ESDT_SAFE_CODE_PATH, esdt_safe::ContractBuilder); + blockchain.register_contract(MOCK_ESDT_SAFE_CODE_PATH, esdt_safe::ContractBuilder); blockchain.register_contract( BRIDGED_TOKENS_WRAPPER_CODE_PATH, @@ -147,6 +146,10 @@ impl MultiTransferTestState { "ESDTRoleLocalBurn".to_string(), ]; + world + .account(PRICE_AGGREGATOR_ADDRESS) + .code(MOCK_PRICE_AGGREGATOR_CODE_PATH); + Self { world } } @@ -207,7 +210,7 @@ impl MultiTransferTestState { .from(MULTISIG_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) .init(ETH_TX_GAS_LIMIT) - .code(ESDT_SAFE_CODE_PATH) + .code(MOCK_ESDT_SAFE_CODE_PATH) .new_address(ESDT_SAFE_ADDRESS) .run(); @@ -490,107 +493,6 @@ impl MultiTransferTestState { ) .run(); } - fn single_transaction_should_fail( - &mut self, - token_id: TestTokenIdentifier, - amount: u64, - expected_error: &str, - ) { - self.esdt_raw_transaction() - .create_transaction( - EthAddress::zero(), - OptionalValue::None::>, - ) - .egld_or_single_esdt( - &EgldOrEsdtTokenIdentifier::esdt(token_id), - 0, - &BigUint::from(amount), - ) - .returns(ExpectError(ERROR, expected_error)) - .run(); - } - - fn single_transaction_should_work(&mut self, token_id: TestTokenIdentifier, amount: u64) { - self.esdt_raw_transaction() - .create_transaction( - EthAddress::zero(), - OptionalValue::None::>, - ) - .egld_or_single_esdt( - &EgldOrEsdtTokenIdentifier::esdt(token_id), - 0, - &BigUint::from(amount), - ) - .returns(ReturnsResult) - .run(); - } - - fn set_transaction_batch_status_should_fail( - &mut self, - batch_id: u32, - statuses: MultiValueEncoded, - expected_status: u64, - expected_error: &str, - ) { - self.esdt_raw_transaction() - .set_transaction_batch_status(batch_id, statuses) - .returns(ExpectError(expected_status, expected_error)) - .run(); - } - - fn set_transaction_batch_status_should_work( - &mut self, - batch_id: u32, - statuses: MultiValueEncoded, - ) { - self.esdt_raw_transaction() - .set_transaction_batch_status(batch_id, statuses) - .returns(ReturnsResult) - .run(); - } - - fn add_refund_batch_tx_multiple_payment_should_fail( - &mut self, - from_address: TestSCAddress, - to_address: TestSCAddress, - transfers: ManagedVec>, - payment: EgldOrMultiEsdtPayment, - expected_error: &str, - ) { - self.world - .tx() - .from(from_address) - .to(to_address) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .add_refund_batch(transfers) - .egld_or_multi_esdt(payment) - .returns(ExpectError(ERROR, expected_error)) - .run(); - } - - fn add_refund_batch_tx_single_payment_should_fail( - &mut self, - from_address: TestSCAddress, - to_address: TestSCAddress, - transfers: ManagedVec>, - token_id: TestTokenIdentifier, - amount: u64, - expected_error: &str, - ) { - self.world - .tx() - .from(from_address) - .to(to_address) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .add_refund_batch(transfers) - .egld_or_single_esdt( - &EgldOrEsdtTokenIdentifier::esdt(token_id), - 0, - &BigUint::from(amount), - ) - .returns(ExpectError(ERROR, expected_error)) - .run(); - } fn esdt_raw_transaction( &mut self, @@ -878,430 +780,6 @@ fn batch_transfer_both_failed_test() { assert!(first_batch.is_none()); } -#[test] -#[ignore] //Ignore for now;will be moved to esdt-safe -fn esdt_safe_create_transaction() { - let mut state = MultiTransferTestState::new(); - - state.deploy_contracts(); - - state.single_transaction_should_fail( - BRIDGE_TOKEN_ID, - 10u64, - "Cannot create transaction while paused", - ); - - state.config_multi_transfer(); - - state.single_transaction_should_fail( - BRIDGE_TOKEN_ID, - 1u64, - "Transaction fees cost more than the entire bridged amount", - ); - - state.config_esdtsafe(); - - state - .world - .tx() - .from(MULTISIG_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_eth_tx_gas_limit(10_000u64) - .run(); - - state.single_transaction_should_fail(TOKEN_ID, 8_000u64, "Not enough minted tokens!"); - - state.single_transaction_should_fail(NON_WHITELISTED_TOKEN, 100u64, "Token not in whitelist"); - - state - .world - .tx() - .from(MULTISIG_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .init_supply_mint_burn( - TOKEN_WITH_BURN_ROLE, - BigUint::from(100u64), - BigUint::from(100u64), - ) - .run(); - - state.single_transaction_should_fail( - TOKEN_WITH_BURN_ROLE, - 100u64, - "Cannot do the burn action!", - ); - - state - .world - .tx() - .from(OWNER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .init_supply_mint_burn( - TOKEN_ID, - BigUint::from(500_000u64), - BigUint::from(100_000u64), - ) - .run(); - - state - .world - .tx() - .from(OWNER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_eth_tx_gas_limit(1000u64) - .run(); - - state.single_transaction_should_work(TOKEN_ID, 100_000u64); - - let total_accumulated_transaction_fee = state - .world - .query() - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .accumulated_transaction_fees(TOKEN_ID) - .returns(ReturnsResult) - .run(); - - assert_eq!(total_accumulated_transaction_fee, BigUint::from(10_000u64)); - - state.single_transaction_should_work(TOKEN_WITHOUT_BURN_ROLE, 120_000u64); - - let total_balances = state - .world - .query() - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .total_balances(TOKEN_WITHOUT_BURN_ROLE) - .returns(ReturnsResult) - .run(); - - assert_eq!(total_balances, BigUint::from(120_000u64)); -} - -#[test] -#[ignore] //Ignore for now;will be moved to esdt-safe -fn set_transaction_batch_status_test() { - let mut state = MultiTransferTestState::new(); - - state.deploy_contracts(); - state.config_multi_transfer(); - state.config_esdtsafe(); - - let mut tx_statuses = MultiValueEncoded::::new(); - tx_statuses.push(TransactionStatus::Executed); - let mut tx_multiple_statuses = MultiValueEncoded::::new(); - tx_multiple_statuses.push(TransactionStatus::Executed); - tx_multiple_statuses.push(TransactionStatus::Pending); - let mut tx_statuses_invalid = MultiValueEncoded::::new(); - tx_statuses_invalid.push(TransactionStatus::Pending); - - state - .world - .tx() - .from(MULTISIG_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .init_supply_mint_burn( - TOKEN_ID, - BigUint::from(100_000u64), - BigUint::from(10_000u64), - ) - .run(); - - state - .world - .tx() - .from(MULTISIG_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_eth_tx_gas_limit(1000u64) - .run(); - - state.single_transaction_should_work(TOKEN_ID, 100_000u64); - - state.set_transaction_batch_status_should_fail( - 5u32, - tx_statuses.clone(), - ERROR, - "Batches must be processed in order", - ); - - state.set_transaction_batch_status_should_fail( - 1u32, - tx_multiple_statuses.clone(), - ERROR, - "Invalid number of statuses provided", - ); - - state.set_transaction_batch_status_should_fail( - 1u32, - tx_statuses_invalid.clone(), - ERROR, - "Transaction status may only be set to Executed or Rejected", - ); - - state.set_transaction_batch_status_should_work(1u32, tx_statuses.clone()); - - let result = state - .world - .query() - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .get_batch_status(1u64) - .returns(ReturnsResult) - .run(); - assert_eq!(result, BatchStatus::AlreadyProcessed); -} - -#[test] -#[ignore] //Ignore for now;will be moved to esdt-safe -fn add_refund_batch_test() { - let mut state = MultiTransferTestState::new(); - - state.deploy_contracts(); - state.config_multi_transfer(); - state.config_esdtsafe(); - - let eth_tx = Transaction { - from: ManagedBuffer::from(OWNER_ADDRESS_EXPR), - to: ManagedBuffer::from(ESTD_SAFE_ADDRESS_EXPR), - amount: BigUint::from(1_000_000u64), - block_nonce: 0u64, - nonce: 0u64, - token_identifier: TokenIdentifier::from(TOKEN_ID), - is_refund_tx: true, - }; - - let eth_tx2 = Transaction { - from: ManagedBuffer::from(OWNER_ADDRESS_EXPR), - to: ManagedBuffer::from(ESTD_SAFE_ADDRESS_EXPR), - amount: BigUint::from(1_000_000u64), - block_nonce: 0u64, - nonce: 0u64, - token_identifier: TokenIdentifier::from(TOKEN_ID), - is_refund_tx: true, - }; - - let mut transfers: ManagedVec> = ManagedVec::new(); - transfers.push(eth_tx); - transfers.push(eth_tx2); - - let payments = vec![ - EsdtTokenPayment::new(TOKEN_ID.into(), 0, BigUint::from(1_000_000u64)), - EsdtTokenPayment::new(TOKEN_ID.into(), 0, BigUint::from(1_000_000u64)), - ]; - let payment = EgldOrMultiEsdtPayment::MultiEsdt(payments.into()); - - state.world.set_esdt_balance( - ESDT_SAFE_ADDRESS, - b"TOKEN-123456", - BigUint::from(100_000_000_000u64), - ); - - state.add_refund_batch_tx_multiple_payment_should_fail( - ESDT_SAFE_ADDRESS, - ESDT_SAFE_ADDRESS, - transfers.clone(), - payment.clone(), - "Invalid caller", - ); - - let empty_transfers = ManagedVec::>::new(); - - state.world.set_esdt_balance( - MULTI_TRANSFER_ADDRESS, - b"TOKEN-123456", - BigUint::from(10_000u64), - ); - - state.world.set_esdt_balance( - MULTI_TRANSFER_ADDRESS, - b"BRIDGE-123456", - BigUint::from(10_000u64), - ); - - state.world.set_esdt_balance( - MULTI_TRANSFER_ADDRESS, - b"TOKEN-123456", - BigUint::from(100_000_000_000u64), - ); - - state - .world - .tx() - .from(MULTI_TRANSFER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .add_refund_batch(empty_transfers) - .returns(ExpectError(ERROR, "Cannot refund with no payments")) - .run(); - - state.add_refund_batch_tx_single_payment_should_fail( - MULTI_TRANSFER_ADDRESS, - ESDT_SAFE_ADDRESS, - transfers.clone(), - BRIDGE_TOKEN_ID, - 10u64, - "Token identifiers do not match", - ); - - let payments_invalid = vec![ - EsdtTokenPayment::new(TOKEN_ID.into(), 0, BigUint::from(1_000u64)), - EsdtTokenPayment::new(TOKEN_ID.into(), 0, BigUint::from(100u64)), - ]; - let payment_invalid = EgldOrMultiEsdtPayment::MultiEsdt(payments_invalid.into()); - - state.add_refund_batch_tx_multiple_payment_should_fail( - MULTI_TRANSFER_ADDRESS, - ESDT_SAFE_ADDRESS, - transfers.clone(), - payment_invalid.clone(), - "Amounts do not match", - ); - - state - .world - .tx() - .from(MULTISIG_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_eth_tx_gas_limit(100u64) - .run(); - - state - .world - .tx() - .from(MULTISIG_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .init_supply_mint_burn( - TOKEN_ID, - BigUint::from(100_000_000u64), - BigUint::from(10_000u64), - ) - .run(); - - state - .world - .tx() - .from(MULTI_TRANSFER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .add_refund_batch(transfers) - .egld_or_multi_esdt(payment) - .returns(ReturnsResult) - .run(); - - let result = state - .world - .query() - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .get_batch_status(1u64) - .returns(ReturnsResult) - .run(); - - if let BatchStatus::PartiallyFull { - end_block_nonce, - tx_ids, - } = result - { - assert!(!tx_ids.is_empty(), "tx_ids should not be empty"); - let expected_tx_ids = vec![1u64, 2u64]; - let tx_ids_vec: Vec = tx_ids.into_iter().collect(); - assert_eq!( - tx_ids_vec, expected_tx_ids, - "tx_ids do not match expected values" - ); - } else { - panic!("Expected BatchStatus::PartiallyFull, got {:?}", result); - } -} - -#[test] -#[ignore] //Ignore for now;will be moved to esdt-safe -fn claim_refund_test() { - let mut state = MultiTransferTestState::new(); - - state.multi_transfer_deploy(); - state.bridge_proxy_deploy(); - state.safe_deploy(); - state.bridged_tokens_wrapper_deploy(); - state.config_multi_transfer(); - state.config_esdtsafe(); - - let mut tx_statuses = MultiValueEncoded::::new(); - tx_statuses.push(TransactionStatus::Rejected); - - state - .esdt_raw_transaction() - .claim_refund(TOKEN_ID) - .with_result(ExpectStatus(ERROR)) - .returns(ExpectError(ERROR, "Nothing to refund")) - .run(); - - state - .world - .tx() - .from(OWNER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_eth_tx_gas_limit(1000u64) - .run(); - - state - .world - .tx() - .from(OWNER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .init_supply_mint_burn( - TOKEN_ID, - BigUint::from(100_000u64), - BigUint::from(10_000u64), - ) - .run(); - - state.single_transaction_should_work(TOKEN_ID, 100_000u64); - state.set_transaction_batch_status_should_work(1, tx_statuses.clone()); - - let result = state - .world - .query() - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .get_refund_amounts(OWNER_ADDRESS) - .returns(ReturnsResult) - .run(); - - let (token_id, amount) = result.into_iter().next().unwrap().into_tuple(); - assert_eq!(token_id, TokenIdentifier::from(TOKEN_ID)); - assert_eq!(amount, BigUint::from(90_000u64)); - - let result2 = state - .esdt_raw_transaction() - .claim_refund(TOKEN_ID) - .returns(ReturnsResult) - .run(); - - assert_eq!(token_id, result2.token_identifier); - assert_eq!(amount, result2.amount); - - let result3 = state - .world - .query() - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .get_refund_amounts(OWNER_ADDRESS) - .returns(ReturnsResult) - .run(); - assert!(result3.is_empty()); -} - #[test] fn test_unwrap_token_create_transaction_paused() { let mut state = MultiTransferTestState::new(); @@ -1388,6 +866,7 @@ fn test_unwrap_token_create_transaction_should_work() { state.config_multi_transfer(); state.config_bridged_tokens_wrapper(); + state .world .tx() From 1af605bc191cc426de9e868c6688f693029446a4 Mon Sep 17 00:00:00 2001 From: evelinemolnar Date: Fri, 25 Oct 2024 15:00:06 +0300 Subject: [PATCH 12/21] small-fix-esdt-safe --- esdt-safe/src/lib.rs | 54 ++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/esdt-safe/src/lib.rs b/esdt-safe/src/lib.rs index a9fd403d..fe0e2bae 100644 --- a/esdt-safe/src/lib.rs +++ b/esdt-safe/src/lib.rs @@ -24,7 +24,7 @@ pub struct TransactionDetails { pub required_fee: BigUint, pub to_address: ManagedBuffer, pub is_refund_tx: bool, - pub refund_info: RefundInfo + pub refund_info: RefundInfo, } #[type_abi] @@ -32,7 +32,7 @@ pub struct TransactionDetails { pub struct RefundInfo { pub address: ManagedAddress, pub initial_batch_id: u64, - pub initial_nonce: u64 + pub initial_nonce: u64, } #[multiversx_sc::contract] @@ -50,10 +50,7 @@ pub trait EsdtSafe: /// eth_tx_gas_limit - The gas limit that will be used for transactions on the ETH side. /// Will be used to compute the fees for the transfer #[init] - fn init( - &self, - eth_tx_gas_limit: BigUint, - ) { + fn init(&self, eth_tx_gas_limit: BigUint) { self.eth_tx_gas_limit().set(ð_tx_gas_limit); self.max_tx_batch_size() @@ -74,10 +71,7 @@ pub trait EsdtSafe: } #[upgrade] - fn upgrade( - &self, - eth_tx_gas_limit: BigUint, - ) { + fn upgrade(&self, eth_tx_gas_limit: BigUint) { self.eth_tx_gas_limit().set(ð_tx_gas_limit); self.max_tx_batch_size() @@ -281,16 +275,28 @@ pub trait EsdtSafe: let caller = self.blockchain().get_caller(); let refund_info = match opt_refund_info { OptionalValue::Some(refund_info) => { - if caller == self.get_bridge_proxy_address(self.blockchain().get_owner_address()).get() { + if caller + == self + .get_bridge_proxy_address(self.blockchain().get_owner_address()) + .get() + { is_refund_tx = true; refund_info - } else if caller == self.get_bridge_proxy_address(self.blockchain().get_owner_address()).get() { + } else if caller + == self + .get_bridged_tokens_wrapper_address(self.blockchain().get_owner_address()) + .get() + { refund_info } else { sc_panic!("Cannot specify a refund address from this caller"); } } - OptionalValue::None => RefundInfo{ address: caller, initial_batch_id: 0, initial_nonce: 0}, + OptionalValue::None => RefundInfo { + address: caller, + initial_batch_id: 0, + initial_nonce: 0, + }, }; self.accumulated_transaction_fees(&payment_token) @@ -337,11 +343,11 @@ pub trait EsdtSafe: required_fee, to_address: tx.to, is_refund_tx, - refund_info + refund_info, } } - // endpoints + // endpoints /// Create an MultiversX -> Ethereum transaction. Only fungible tokens are accepted. /// @@ -366,8 +372,12 @@ pub trait EsdtSafe: transaction_details.payment_token, transaction_details.actual_bridged_amount, transaction_details.required_fee, - transaction_details.refund_info.address.as_managed_buffer().clone(), - transaction_details.to_address + transaction_details + .refund_info + .address + .as_managed_buffer() + .clone(), + transaction_details.to_address, ); } else { self.create_refund_transaction_event( @@ -399,9 +409,13 @@ pub trait EsdtSafe: transaction_details.payment_token, transaction_details.actual_bridged_amount, transaction_details.required_fee, - transaction_details.refund_info.address.as_managed_buffer().clone(), + transaction_details + .refund_info + .address + .as_managed_buffer() + .clone(), transaction_details.to_address, - data + data, ); } else { self.create_refund_transaction_sc_call_event( @@ -412,7 +426,7 @@ pub trait EsdtSafe: transaction_details.required_fee, transaction_details.refund_info.initial_batch_id, transaction_details.refund_info.initial_nonce, - data + data, ); } } From d85a1b1cad4d0e122b0c818fde12038d159c3f83 Mon Sep 17 00:00:00 2001 From: evelinemolnar Date: Fri, 25 Oct 2024 17:06:15 +0300 Subject: [PATCH 13/21] small test adjustment --- esdt-safe/tests/esdt_safe_blackbox_test.rs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/esdt-safe/tests/esdt_safe_blackbox_test.rs b/esdt-safe/tests/esdt_safe_blackbox_test.rs index 36fc81fa..15ff285b 100644 --- a/esdt-safe/tests/esdt_safe_blackbox_test.rs +++ b/esdt-safe/tests/esdt_safe_blackbox_test.rs @@ -695,11 +695,9 @@ fn esdt_safe_create_transaction() { .total_balances(TOKEN_WITH_BURN_ROLE) .returns(ReturnsResult) .run(); - } #[test] -#[ignore] //This will be rewritten fn add_refund_batch_test() { let mut state = EsdtSafeTestState::new(); state.multisig_deploy(); @@ -804,7 +802,7 @@ fn add_refund_batch_test() { "Token identifiers do not match", ); - let payments_invalid = vec![ + let payments_invalid: Vec> = vec![ EsdtTokenPayment::new(NATIVE_TOKEN_ID.into(), 0, BigUint::from(1_000u64)), EsdtTokenPayment::new(NATIVE_TOKEN_ID.into(), 0, BigUint::from(100u64)), ]; @@ -818,13 +816,6 @@ fn add_refund_batch_test() { "Amounts do not match", ); - state.init_supply_should_work( - NATIVE_TOKEN_ID, - NATIVE_TOKEN_ID, - 100_000_000u64, - 100_000_000u64, - ); - state .world .tx() From cfda29fcaeba50e9f215d1f590dd8f345d91918b Mon Sep 17 00:00:00 2001 From: evelinemolnar Date: Fri, 25 Oct 2024 17:10:10 +0300 Subject: [PATCH 14/21] revert a line --- esdt-safe/tests/esdt_safe_blackbox_test.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/esdt-safe/tests/esdt_safe_blackbox_test.rs b/esdt-safe/tests/esdt_safe_blackbox_test.rs index 15ff285b..22501fdf 100644 --- a/esdt-safe/tests/esdt_safe_blackbox_test.rs +++ b/esdt-safe/tests/esdt_safe_blackbox_test.rs @@ -698,6 +698,7 @@ fn esdt_safe_create_transaction() { } #[test] +#[ignore] //This will be rewritten fn add_refund_batch_test() { let mut state = EsdtSafeTestState::new(); state.multisig_deploy(); From 3d70a337e7076a1a04e3cf6bf8f36162bb6c3a8b Mon Sep 17 00:00:00 2001 From: evelinemolnar Date: Fri, 25 Oct 2024 17:53:04 +0300 Subject: [PATCH 15/21] remove duplicated and unused code --- bridge-proxy/src/bridge-proxy.rs | 13 +++-------- bridge-proxy/src/config.rs | 3 --- bridged-tokens-wrapper/src/lib.rs | 4 +--- common/fee-estimator-module/src/lib.rs | 4 +--- common/storage-module/src/lib.rs | 31 ++++++++------------------ common/token-module/src/lib.rs | 5 +---- esdt-safe/src/lib.rs | 16 +++---------- multi-transfer-esdt/src/lib.rs | 20 +++++++++-------- 8 files changed, 29 insertions(+), 67 deletions(-) diff --git a/bridge-proxy/src/bridge-proxy.rs b/bridge-proxy/src/bridge-proxy.rs index 9fc85e65..39f7aa89 100644 --- a/bridge-proxy/src/bridge-proxy.rs +++ b/bridge-proxy/src/bridge-proxy.rs @@ -38,10 +38,7 @@ pub trait BridgeProxyContract: let caller = self.blockchain().get_caller(); let payment = self.call_value().single_esdt(); require!( - caller - == self - .get_multi_transfer_address(self.blockchain().get_owner_address()) - .get(), + caller == self.get_multi_transfer_address().get(), "Only MultiTransfer can do deposits" ); let tx_id = self.pending_transactions().push(ð_tx); @@ -134,9 +131,7 @@ pub trait BridgeProxyContract: fn refund_transaction(&self, tx_id: usize) { let tx = self.get_pending_transaction_by_id(tx_id); - let esdt_safe_contract_address = self - .get_esdt_safe_address(self.blockchain().get_owner_address()) - .get(); + let esdt_safe_contract_address = self.get_esdt_safe_address().get(); let unwrapped_token = self.unwrap_token(&tx.token_id, tx_id); let batch_id = self.batch_id(tx_id).get(); @@ -161,9 +156,7 @@ pub trait BridgeProxyContract: fn unwrap_token(&self, requested_token: &TokenIdentifier, tx_id: usize) -> EsdtTokenPayment { let payment = self.payments(tx_id).get(); - let bridged_tokens_wrapper_address = self - .get_bridged_tokens_wrapper_address(self.blockchain().get_owner_address()) - .get(); + let bridged_tokens_wrapper_address = self.get_bridged_tokens_wrapper_address().get(); let transfers = self .tx() diff --git a/bridge-proxy/src/config.rs b/bridge-proxy/src/config.rs index 5debea4a..a2dede1c 100644 --- a/bridge-proxy/src/config.rs +++ b/bridge-proxy/src/config.rs @@ -4,9 +4,6 @@ use transaction::EthTransaction; #[multiversx_sc::module] pub trait ConfigModule { - #[storage_mapper("ownerAddress")] - fn owner_address_storage(&self) -> SingleValueMapper>; - #[storage_mapper("pending_transactions")] fn pending_transactions(&self) -> VecMapper>; diff --git a/bridged-tokens-wrapper/src/lib.rs b/bridged-tokens-wrapper/src/lib.rs index 37e07539..20f92665 100644 --- a/bridged-tokens-wrapper/src/lib.rs +++ b/bridged-tokens-wrapper/src/lib.rs @@ -263,9 +263,7 @@ pub trait BridgedTokensWrapper: let caller = self.blockchain().get_caller(); self.tx() - .to(self - .get_esdt_safe_address(self.blockchain().get_owner_address()) - .get()) + .to(self.get_esdt_safe_address().get()) .typed(esdt_safe_proxy::EsdtSafeProxy) .create_transaction( to, diff --git a/common/fee-estimator-module/src/lib.rs b/common/fee-estimator-module/src/lib.rs index 2f3e7908..dcf5f311 100644 --- a/common/fee-estimator-module/src/lib.rs +++ b/common/fee-estimator-module/src/lib.rs @@ -53,9 +53,7 @@ pub trait FeeEstimatorModule: storage_module::CommonStorageModule { from: &TokenIdentifier, to: &TokenIdentifier, ) -> Option { - let fee_estimator_sc_address = self - .get_fee_estimator_address(self.blockchain().get_owner_address()) - .get(); + let fee_estimator_sc_address = self.get_fee_estimator_address().get(); if fee_estimator_sc_address.is_zero() { return None; } diff --git a/common/storage-module/src/lib.rs b/common/storage-module/src/lib.rs index db242d97..f323a87a 100644 --- a/common/storage-module/src/lib.rs +++ b/common/storage-module/src/lib.rs @@ -12,50 +12,37 @@ pub const FEE_ESTIMATOR_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"feeEstimatorAddr pub trait CommonStorageModule { fn get_bridged_tokens_wrapper_address( &self, - owner_address: ManagedAddress, ) -> SingleValueMapper { SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - owner_address, + self.blockchain().get_owner_address(), StorageKey::new(BRIDGED_TOKENS_WRAPPER_ADDRESS_STORAGE_KEY), ) } - fn get_bridge_proxy_address( - &self, - owner_address: ManagedAddress, - ) -> SingleValueMapper { + fn get_bridge_proxy_address(&self) -> SingleValueMapper { SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - owner_address, + self.blockchain().get_owner_address(), StorageKey::new(BRIDGE_PROXY_CONTRACT_ADDRESS_STORAGE_KEY), ) } - fn get_esdt_safe_address( - &self, - owner_address: ManagedAddress, - ) -> SingleValueMapper { + fn get_esdt_safe_address(&self) -> SingleValueMapper { SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - owner_address, + self.blockchain().get_owner_address(), StorageKey::new(ESDT_SAFE_CONTRACT_ADDRESS_STORAGE_KEY), ) } - fn get_multi_transfer_address( - &self, - owner_address: ManagedAddress, - ) -> SingleValueMapper { + fn get_multi_transfer_address(&self) -> SingleValueMapper { SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - owner_address, + self.blockchain().get_owner_address(), StorageKey::new(MULTI_TRNASFER_CONTRACT_ADDRESS_STORAGE_KEY), ) } - fn get_fee_estimator_address( - &self, - owner_address: ManagedAddress, - ) -> SingleValueMapper { + fn get_fee_estimator_address(&self) -> SingleValueMapper { SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - owner_address, + self.blockchain().get_owner_address(), StorageKey::new(FEE_ESTIMATOR_CONTRACT_ADDRESS_STORAGE_KEY), ) } diff --git a/common/token-module/src/lib.rs b/common/token-module/src/lib.rs index f6632b66..7ffd453d 100644 --- a/common/token-module/src/lib.rs +++ b/common/token-module/src/lib.rs @@ -133,10 +133,7 @@ pub trait TokenModule: fn get_tokens(&self, token_id: &TokenIdentifier, amount: &BigUint) -> bool { let caller = self.blockchain().get_caller(); require!( - caller - == self - .get_multi_transfer_address(self.blockchain().get_owner_address()) - .get(), + caller == self.get_multi_transfer_address().get(), "Only MultiTransfer can get tokens" ); diff --git a/esdt-safe/src/lib.rs b/esdt-safe/src/lib.rs index fe0e2bae..1e315141 100644 --- a/esdt-safe/src/lib.rs +++ b/esdt-safe/src/lib.rs @@ -155,9 +155,7 @@ pub trait EsdtSafe: #[endpoint(addRefundBatch)] fn add_refund_batch(&self, refund_transactions: ManagedVec>) { let caller = self.blockchain().get_caller(); - let multi_transfer_address = self - .get_multi_transfer_address(self.blockchain().get_owner_address()) - .get(); + let multi_transfer_address = self.get_multi_transfer_address().get(); require!(caller == multi_transfer_address, "Invalid caller"); let refund_payments = self.call_value().all_esdt_transfers().deref().clone(); @@ -275,18 +273,10 @@ pub trait EsdtSafe: let caller = self.blockchain().get_caller(); let refund_info = match opt_refund_info { OptionalValue::Some(refund_info) => { - if caller - == self - .get_bridge_proxy_address(self.blockchain().get_owner_address()) - .get() - { + if caller == self.get_bridge_proxy_address().get() { is_refund_tx = true; refund_info - } else if caller - == self - .get_bridged_tokens_wrapper_address(self.blockchain().get_owner_address()) - .get() - { + } else if caller == self.get_bridged_tokens_wrapper_address().get() { refund_info } else { sc_panic!("Cannot specify a refund address from this caller"); diff --git a/multi-transfer-esdt/src/lib.rs b/multi-transfer-esdt/src/lib.rs index ab7e087d..be7b852d 100644 --- a/multi-transfer-esdt/src/lib.rs +++ b/multi-transfer-esdt/src/lib.rs @@ -12,7 +12,9 @@ const CHAIN_SPECIFIC_TO_UNIVERSAL_TOKEN_MAPPING: &[u8] = b"chainSpecificToUniver #[multiversx_sc::contract] pub trait MultiTransferEsdt: - tx_batch_module::TxBatchModule + max_bridged_amount_module::MaxBridgedAmountModule + storage_module::CommonStorageModule + tx_batch_module::TxBatchModule + + max_bridged_amount_module::MaxBridgedAmountModule + + storage_module::CommonStorageModule { #[init] fn init(&self) { @@ -50,7 +52,7 @@ pub trait MultiTransferEsdt: let own_sc_address = self.blockchain().get_sc_address(); let sc_shard = self.blockchain().get_shard_of_address(&own_sc_address); - let safe_address = self.get_esdt_safe_address(self.blockchain().get_owner_address()).get(); + let safe_address = self.get_esdt_safe_address().get(); for eth_tx in transfers { let is_success: bool = self @@ -133,7 +135,7 @@ pub trait MultiTransferEsdt: } } - let esdt_safe_addr = self.get_esdt_safe_address(self.blockchain().get_owner_address()).get(); + let esdt_safe_addr = self.get_esdt_safe_address().get(); self.tx() .to(esdt_safe_addr) .typed(esdt_safe_proxy::EsdtSafeProxy) @@ -144,7 +146,7 @@ pub trait MultiTransferEsdt: OptionalValue::None => {} } } - + #[only_owner] #[endpoint(addUnprocessedRefundTxToBatch)] fn add_unprocessed_refund_tx_to_batch(&self, tx_id: u64) { @@ -159,7 +161,7 @@ pub trait MultiTransferEsdt: // private fn is_refund_valid(&self, token_id: &TokenIdentifier) -> bool { - let esdt_safe_addr = self.get_esdt_safe_address(self.blockchain().get_owner_address()).get(); + let esdt_safe_addr = self.get_esdt_safe_address().get(); let own_sc_address = self.blockchain().get_sc_address(); let sc_shard = self.blockchain().get_shard_of_address(&own_sc_address); @@ -177,7 +179,7 @@ pub trait MultiTransferEsdt: TokenIdentifier, ManagedAddress, > = SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - self.get_bridged_tokens_wrapper_address(self.blockchain().get_owner_address()).get(), + self.get_bridged_tokens_wrapper_address().get(), storage_key, ); if chain_specific_to_universal_token_mapper.is_empty() { @@ -223,11 +225,11 @@ pub trait MultiTransferEsdt: } fn wrap_tokens(&self, payments: PaymentsVec) -> PaymentsVec { - if self.get_bridged_tokens_wrapper_address(self.blockchain().get_owner_address()).is_empty() { + if self.get_bridged_tokens_wrapper_address().is_empty() { return payments; } - let bridged_tokens_wrapper_addr = self.get_bridged_tokens_wrapper_address(self.blockchain().get_owner_address()).get(); + let bridged_tokens_wrapper_addr = self.get_bridged_tokens_wrapper_address().get(); self.tx() .to(bridged_tokens_wrapper_addr) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) @@ -243,7 +245,7 @@ pub trait MultiTransferEsdt: payments: PaymentsVec, batch_id: u64, ) { - let bridge_proxy_addr = self.get_bridge_proxy_address(self.blockchain().get_owner_address()).get(); + let bridge_proxy_addr = self.get_bridge_proxy_address().get(); for (eth_tx, p) in transfers.iter().zip(payments.iter()) { if self.blockchain().is_smart_contract(ð_tx.to) { self.tx() From 494e6502c94033b2375bb6628b572d45bc53dc07 Mon Sep 17 00:00:00 2001 From: evelinemolnar Date: Fri, 25 Oct 2024 18:22:47 +0300 Subject: [PATCH 16/21] cleaner-code + typo --- bridge-proxy/src/bridge-proxy.rs | 6 ++-- bridged-tokens-wrapper/src/lib.rs | 2 +- common/fee-estimator-module/src/lib.rs | 2 +- common/storage-module/src/lib.rs | 45 ++++++++++++-------------- common/token-module/src/lib.rs | 2 +- esdt-safe/src/lib.rs | 6 ++-- multi-transfer-esdt/src/lib.rs | 14 ++++---- 7 files changed, 36 insertions(+), 41 deletions(-) diff --git a/bridge-proxy/src/bridge-proxy.rs b/bridge-proxy/src/bridge-proxy.rs index 39f7aa89..640a33f7 100644 --- a/bridge-proxy/src/bridge-proxy.rs +++ b/bridge-proxy/src/bridge-proxy.rs @@ -38,7 +38,7 @@ pub trait BridgeProxyContract: let caller = self.blockchain().get_caller(); let payment = self.call_value().single_esdt(); require!( - caller == self.get_multi_transfer_address().get(), + caller == self.get_multi_transfer_address(), "Only MultiTransfer can do deposits" ); let tx_id = self.pending_transactions().push(ð_tx); @@ -131,7 +131,7 @@ pub trait BridgeProxyContract: fn refund_transaction(&self, tx_id: usize) { let tx = self.get_pending_transaction_by_id(tx_id); - let esdt_safe_contract_address = self.get_esdt_safe_address().get(); + let esdt_safe_contract_address = self.get_esdt_safe_address(); let unwrapped_token = self.unwrap_token(&tx.token_id, tx_id); let batch_id = self.batch_id(tx_id).get(); @@ -156,7 +156,7 @@ pub trait BridgeProxyContract: fn unwrap_token(&self, requested_token: &TokenIdentifier, tx_id: usize) -> EsdtTokenPayment { let payment = self.payments(tx_id).get(); - let bridged_tokens_wrapper_address = self.get_bridged_tokens_wrapper_address().get(); + let bridged_tokens_wrapper_address = self.get_bridged_tokens_wrapper_address(); let transfers = self .tx() diff --git a/bridged-tokens-wrapper/src/lib.rs b/bridged-tokens-wrapper/src/lib.rs index 20f92665..d1db21a7 100644 --- a/bridged-tokens-wrapper/src/lib.rs +++ b/bridged-tokens-wrapper/src/lib.rs @@ -263,7 +263,7 @@ pub trait BridgedTokensWrapper: let caller = self.blockchain().get_caller(); self.tx() - .to(self.get_esdt_safe_address().get()) + .to(self.get_esdt_safe_address()) .typed(esdt_safe_proxy::EsdtSafeProxy) .create_transaction( to, diff --git a/common/fee-estimator-module/src/lib.rs b/common/fee-estimator-module/src/lib.rs index dcf5f311..ebb44168 100644 --- a/common/fee-estimator-module/src/lib.rs +++ b/common/fee-estimator-module/src/lib.rs @@ -53,7 +53,7 @@ pub trait FeeEstimatorModule: storage_module::CommonStorageModule { from: &TokenIdentifier, to: &TokenIdentifier, ) -> Option { - let fee_estimator_sc_address = self.get_fee_estimator_address().get(); + let fee_estimator_sc_address = self.get_fee_estimator_address(); if fee_estimator_sc_address.is_zero() { return None; } diff --git a/common/storage-module/src/lib.rs b/common/storage-module/src/lib.rs index f323a87a..cb9565d1 100644 --- a/common/storage-module/src/lib.rs +++ b/common/storage-module/src/lib.rs @@ -5,45 +5,40 @@ use multiversx_sc::storage::StorageKey; pub const BRIDGE_PROXY_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"proxyAddress"; pub const BRIDGED_TOKENS_WRAPPER_ADDRESS_STORAGE_KEY: &[u8] = b"bridgedTokensWrapperAddress"; pub const ESDT_SAFE_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"esdtSafeAddress"; -pub const MULTI_TRNASFER_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"multiTransferEsdtAddress"; +pub const MULTI_TRANSFER_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"multiTransferEsdtAddress"; pub const FEE_ESTIMATOR_CONTRACT_ADDRESS_STORAGE_KEY: &[u8] = b"feeEstimatorAddress"; #[multiversx_sc::module] pub trait CommonStorageModule { - fn get_bridged_tokens_wrapper_address( - &self, - ) -> SingleValueMapper { + fn single_value_mapper(&self, key: &[u8]) -> SingleValueMapper { SingleValueMapper::<_, _, ManagedAddress>::new_from_address( self.blockchain().get_owner_address(), - StorageKey::new(BRIDGED_TOKENS_WRAPPER_ADDRESS_STORAGE_KEY), + StorageKey::new(key), ) } - fn get_bridge_proxy_address(&self) -> SingleValueMapper { - SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - self.blockchain().get_owner_address(), - StorageKey::new(BRIDGE_PROXY_CONTRACT_ADDRESS_STORAGE_KEY), - ) + fn get_bridged_tokens_wrapper_address(&self) -> ManagedAddress { + self.single_value_mapper(BRIDGED_TOKENS_WRAPPER_ADDRESS_STORAGE_KEY) + .get() } - fn get_esdt_safe_address(&self) -> SingleValueMapper { - SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - self.blockchain().get_owner_address(), - StorageKey::new(ESDT_SAFE_CONTRACT_ADDRESS_STORAGE_KEY), - ) + fn get_bridge_proxy_address(&self) -> ManagedAddress { + self.single_value_mapper(BRIDGE_PROXY_CONTRACT_ADDRESS_STORAGE_KEY) + .get() } - fn get_multi_transfer_address(&self) -> SingleValueMapper { - SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - self.blockchain().get_owner_address(), - StorageKey::new(MULTI_TRNASFER_CONTRACT_ADDRESS_STORAGE_KEY), - ) + fn get_esdt_safe_address(&self) -> ManagedAddress { + self.single_value_mapper(ESDT_SAFE_CONTRACT_ADDRESS_STORAGE_KEY) + .get() } - fn get_fee_estimator_address(&self) -> SingleValueMapper { - SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - self.blockchain().get_owner_address(), - StorageKey::new(FEE_ESTIMATOR_CONTRACT_ADDRESS_STORAGE_KEY), - ) + fn get_multi_transfer_address(&self) -> ManagedAddress { + self.single_value_mapper(MULTI_TRANSFER_CONTRACT_ADDRESS_STORAGE_KEY) + .get() + } + + fn get_fee_estimator_address(&self) -> ManagedAddress { + self.single_value_mapper(FEE_ESTIMATOR_CONTRACT_ADDRESS_STORAGE_KEY) + .get() } } diff --git a/common/token-module/src/lib.rs b/common/token-module/src/lib.rs index 7ffd453d..4366d5ae 100644 --- a/common/token-module/src/lib.rs +++ b/common/token-module/src/lib.rs @@ -133,7 +133,7 @@ pub trait TokenModule: fn get_tokens(&self, token_id: &TokenIdentifier, amount: &BigUint) -> bool { let caller = self.blockchain().get_caller(); require!( - caller == self.get_multi_transfer_address().get(), + caller == self.get_multi_transfer_address(), "Only MultiTransfer can get tokens" ); diff --git a/esdt-safe/src/lib.rs b/esdt-safe/src/lib.rs index 1e315141..15174bdb 100644 --- a/esdt-safe/src/lib.rs +++ b/esdt-safe/src/lib.rs @@ -155,7 +155,7 @@ pub trait EsdtSafe: #[endpoint(addRefundBatch)] fn add_refund_batch(&self, refund_transactions: ManagedVec>) { let caller = self.blockchain().get_caller(); - let multi_transfer_address = self.get_multi_transfer_address().get(); + let multi_transfer_address = self.get_multi_transfer_address(); require!(caller == multi_transfer_address, "Invalid caller"); let refund_payments = self.call_value().all_esdt_transfers().deref().clone(); @@ -273,10 +273,10 @@ pub trait EsdtSafe: let caller = self.blockchain().get_caller(); let refund_info = match opt_refund_info { OptionalValue::Some(refund_info) => { - if caller == self.get_bridge_proxy_address().get() { + if caller == self.get_bridge_proxy_address() { is_refund_tx = true; refund_info - } else if caller == self.get_bridged_tokens_wrapper_address().get() { + } else if caller == self.get_bridged_tokens_wrapper_address() { refund_info } else { sc_panic!("Cannot specify a refund address from this caller"); diff --git a/multi-transfer-esdt/src/lib.rs b/multi-transfer-esdt/src/lib.rs index be7b852d..70a1c3bf 100644 --- a/multi-transfer-esdt/src/lib.rs +++ b/multi-transfer-esdt/src/lib.rs @@ -52,7 +52,7 @@ pub trait MultiTransferEsdt: let own_sc_address = self.blockchain().get_sc_address(); let sc_shard = self.blockchain().get_shard_of_address(&own_sc_address); - let safe_address = self.get_esdt_safe_address().get(); + let safe_address = self.get_esdt_safe_address(); for eth_tx in transfers { let is_success: bool = self @@ -135,7 +135,7 @@ pub trait MultiTransferEsdt: } } - let esdt_safe_addr = self.get_esdt_safe_address().get(); + let esdt_safe_addr = self.get_esdt_safe_address(); self.tx() .to(esdt_safe_addr) .typed(esdt_safe_proxy::EsdtSafeProxy) @@ -161,7 +161,7 @@ pub trait MultiTransferEsdt: // private fn is_refund_valid(&self, token_id: &TokenIdentifier) -> bool { - let esdt_safe_addr = self.get_esdt_safe_address().get(); + let esdt_safe_addr = self.get_esdt_safe_address(); let own_sc_address = self.blockchain().get_sc_address(); let sc_shard = self.blockchain().get_shard_of_address(&own_sc_address); @@ -179,7 +179,7 @@ pub trait MultiTransferEsdt: TokenIdentifier, ManagedAddress, > = SingleValueMapper::<_, _, ManagedAddress>::new_from_address( - self.get_bridged_tokens_wrapper_address().get(), + self.get_bridged_tokens_wrapper_address(), storage_key, ); if chain_specific_to_universal_token_mapper.is_empty() { @@ -225,11 +225,11 @@ pub trait MultiTransferEsdt: } fn wrap_tokens(&self, payments: PaymentsVec) -> PaymentsVec { - if self.get_bridged_tokens_wrapper_address().is_empty() { + if self.get_bridged_tokens_wrapper_address().is_zero() { return payments; } - let bridged_tokens_wrapper_addr = self.get_bridged_tokens_wrapper_address().get(); + let bridged_tokens_wrapper_addr = self.get_bridged_tokens_wrapper_address(); self.tx() .to(bridged_tokens_wrapper_addr) .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) @@ -245,7 +245,7 @@ pub trait MultiTransferEsdt: payments: PaymentsVec, batch_id: u64, ) { - let bridge_proxy_addr = self.get_bridge_proxy_address().get(); + let bridge_proxy_addr = self.get_bridge_proxy_address(); for (eth_tx, p) in transfers.iter().zip(payments.iter()) { if self.blockchain().is_smart_contract(ð_tx.to) { self.tx() From 6f11d59c115b645f8b4c055f06c7cb577a3510c3 Mon Sep 17 00:00:00 2001 From: evelinemolnar Date: Sun, 27 Oct 2024 23:51:25 +0200 Subject: [PATCH 17/21] fix from v3 --- esdt-safe/src/lib.rs | 2 +- esdt-safe/tests/esdt_safe_blackbox_test.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/esdt-safe/src/lib.rs b/esdt-safe/src/lib.rs index 15174bdb..c7aad34a 100644 --- a/esdt-safe/src/lib.rs +++ b/esdt-safe/src/lib.rs @@ -235,7 +235,7 @@ pub trait EsdtSafe: }); } else { self.total_balances(&refund_token_id).update(|total| { - *total -= &actual_bridged_amount; + *total += &actual_bridged_amount; }); } } diff --git a/esdt-safe/tests/esdt_safe_blackbox_test.rs b/esdt-safe/tests/esdt_safe_blackbox_test.rs index 22501fdf..15ff285b 100644 --- a/esdt-safe/tests/esdt_safe_blackbox_test.rs +++ b/esdt-safe/tests/esdt_safe_blackbox_test.rs @@ -698,7 +698,6 @@ fn esdt_safe_create_transaction() { } #[test] -#[ignore] //This will be rewritten fn add_refund_batch_test() { let mut state = EsdtSafeTestState::new(); state.multisig_deploy(); From d688b47a369b2d2159bfd6da2a762a8c96e43513 Mon Sep 17 00:00:00 2001 From: Eveline Molnar Date: Tue, 29 Oct 2024 14:16:26 +0200 Subject: [PATCH 18/21] increase esdt-safe code coverage to +80% --- esdt-safe/tests/esdt_safe_blackbox_test.rs | 561 +++++++++++++++++++-- 1 file changed, 509 insertions(+), 52 deletions(-) diff --git a/esdt-safe/tests/esdt_safe_blackbox_test.rs b/esdt-safe/tests/esdt_safe_blackbox_test.rs index 15ff285b..e1ce9286 100644 --- a/esdt-safe/tests/esdt_safe_blackbox_test.rs +++ b/esdt-safe/tests/esdt_safe_blackbox_test.rs @@ -36,6 +36,7 @@ const MOCK_BRIDGE_PROXY_PATH_EXPR: MxscPath = MxscPath::new("../common/mock-contracts/mock-bridge-proxy/output/mock-bridge-proxy.mxsc.json"); const TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("TOKEN-123456"); +const MINT_BURN_TOKEN: TestTokenIdentifier = TestTokenIdentifier::new("MINT-BURN-123456"); const NON_WHITELISTED_TOKEN: TestTokenIdentifier = TestTokenIdentifier::new("NON-WHITELISTED-123456"); const TOKEN_WITH_BURN_ROLE: TestTokenIdentifier = TestTokenIdentifier::new("TOKEN-WITH"); @@ -86,7 +87,8 @@ impl EsdtSafeTestState { .esdt_balance(TOKEN_ID, 1_000_000_000_000u64) .esdt_balance(NON_WHITELISTED_TOKEN, 1001u64) .esdt_balance(NATIVE_TOKEN_ID, 300_000_000_000u64) - .esdt_balance(TOKEN_WITH_BURN_ROLE, 100_000u64); + .esdt_balance(MINT_BURN_TOKEN, 200000u64) + .esdt_balance(TOKEN_WITH_BURN_ROLE, 100_000_000_000u64); world .account(PRICE_AGGREGATOR) @@ -94,7 +96,16 @@ impl EsdtSafeTestState { world .account(MULTI_TRANSFER_ADDRESS) - .code(MOCK_MULTI_TRANSFER_PATH_EXPR); + .esdt_balance(NATIVE_TOKEN_ID, 300_000_000_000u64) + .esdt_balance(TOKEN_WITH_BURN_ROLE, 100_000_000_000u64) + .esdt_balance(TOKEN_ID, 300_000_000u64) + .code(MOCK_MULTI_TRANSFER_PATH_EXPR) + .account(BRIDGE_PROXY_ADDRESS) + .esdt_balance(TOKEN_ID, 100_000_000u64) + .code(MOCK_BRIDGE_PROXY_PATH_EXPR) + .account(BRIDGED_TOKENS_WRAPPER_ADDRESS) + .esdt_balance(TOKEN_ID, 100_000_000u64) + .code(MOCK_BRIDGED_TOKENS_WRAPPER_CODE_PATH_EXPR); Self { world } } @@ -163,7 +174,17 @@ impl EsdtSafeTestState { b"TOKEN-123456", BigUint::from(10_000_000u64), ); + self.world.set_esdt_balance( + ESDT_SAFE_ADDRESS, + b"MINT-BURN-123456", + BigUint::from(20_000_000u64), + ); + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"MINT-BURN-123456", + BigUint::from(200_000_000_000u64), + ); self.world.set_esdt_balance( MULTISIG_ADDRESS, b"NON-WHITELISTED-123456", @@ -198,12 +219,25 @@ impl EsdtSafeTestState { ) .run(); + self.esdt_raw_transaction() + .add_token_to_whitelist( + MINT_BURN_TOKEN, + "TOKEN", + true, + false, + BigUint::from(0u64), + BigUint::from(2000u64), + BigUint::from(0u64), + OptionalValue::Some(BigUint::from(0u64)), + ) + .run(); + self.esdt_raw_transaction() .add_token_to_whitelist( TOKEN_WITH_BURN_ROLE, "TKN", true, - true, + false, BigUint::from(0u64), BigUint::from(0u64), BigUint::from(0u64), @@ -223,6 +257,19 @@ impl EsdtSafeTestState { OptionalValue::Some(BigUint::from(0u64)), ) .run(); + + self.esdt_raw_transaction() + .add_token_to_whitelist( + TOKEN_ID, + "TOKEN_ID", + false, + true, + BigUint::from(0u64), + BigUint::from(0u64), + BigUint::from(0u64), + OptionalValue::Some(BigUint::from(0u64)), + ) + .run(); } fn init_supply_should_fail( @@ -383,6 +430,79 @@ fn config_test() { state.config_esdtsafe(); } +#[test] +fn upgrade_test() { + let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); + state.safe_deploy(); + state.config_esdtsafe(); + + let eth_tx_gas_limit_before = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .eth_tx_gas_limit() + .returns(ReturnsResult) + .run(); + assert_eq!( + eth_tx_gas_limit_before, + BigUint::from(ETH_TX_GAS_LIMIT), + "Initial eth_tx_gas_limit should match the set value" + ); + + let paused_state_before = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .paused_status() + .returns(ReturnsResult) + .run(); + assert_eq!( + paused_state_before, false, + "Contract should not be paused before upgrade" + ); + + let new_eth_tx_gas_limit = BigUint::from(5000u64); + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .upgrade(new_eth_tx_gas_limit.clone()) + .code(ESDT_SAFE_CODE_PATH) + .run(); + + let eth_tx_gas_limit_after = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .eth_tx_gas_limit() + .returns(ReturnsResult) + .run(); + assert_eq!( + eth_tx_gas_limit_after, + new_eth_tx_gas_limit.clone(), + "eth_tx_gas_limit should be updated after upgrade" + ); + + let paused_state_after = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .paused_status() + .returns(ReturnsResult) + .run(); + assert_eq!( + paused_state_after, true, + "Contract should be paused after upgrade" + ); +} + #[test] fn init_supply_test() { let mut state = EsdtSafeTestState::new(); @@ -618,33 +738,57 @@ fn esdt_safe_create_transaction() { state.config_esdtsafe(); - state - .world - .tx() - .from(MULTISIG_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_eth_tx_gas_limit(1000u64) - .run(); - state.single_transaction_should_fail( TOKEN_WITH_BURN_ROLE, 0u64, "Transaction fees cost more than the entire bridged amount", ); + state.single_transaction_should_fail(NON_WHITELISTED_TOKEN, 100u64, "Token not in whitelist"); + + state.single_transaction_should_fail(TOKEN_WITH_BURN_ROLE, 100u64, "Not enough minted tokens!"); + + state.single_transaction_should_fail(MINT_BURN_TOKEN, 10u64, "Cannot do the burn action!"); + + let refund_info = sc_proxies::esdt_safe_proxy::RefundInfo:: { + address: ManagedAddress::from(OWNER_ADDRESS.eval_to_array()), + initial_batch_id: 1u64, + initial_nonce: 1u64, + }; + state .world .tx() - .from(MULTISIG_ADDRESS) + .from(BRIDGE_PROXY_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_eth_tx_gas_limit(10_000u64) + .create_transaction(EthAddress::zero(), OptionalValue::Some(refund_info.clone())) + .single_esdt(&TOKEN_ID.into(), 0, &BigUint::from(10u64)) .run(); - //state.single_transaction_should_fail(TOKEN_ID, 100_000u64, "Not enough minted tokens!"); + state + .world + .tx() + .from(OWNER_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .create_transaction(EthAddress::zero(), OptionalValue::Some(refund_info.clone())) + .single_esdt(&TOKEN_ID.into(), 0, &BigUint::from(10u64)) + .returns(ExpectError( + ERROR, + "Cannot specify a refund address from this caller", + )) + .run(); - state.single_transaction_should_fail(NON_WHITELISTED_TOKEN, 100u64, "Token not in whitelist"); + state + .world + .tx() + .from(BRIDGED_TOKENS_WRAPPER_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .create_transaction(EthAddress::zero(), OptionalValue::Some(refund_info.clone())) + .single_esdt(&TOKEN_ID.into(), 0, &BigUint::from(10u64)) + .run(); state .world @@ -652,26 +796,16 @@ fn esdt_safe_create_transaction() { .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) - .init_supply_mint_burn( - TOKEN_WITH_BURN_ROLE, - BigUint::from(100u64), - BigUint::from(100u64), - ) + .set_eth_tx_gas_limit(1000u64) .run(); - state.single_transaction_should_fail( - TOKEN_WITH_BURN_ROLE, - 100u64, - "Cannot do the burn action!", - ); - state .world .tx() .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) - .set_eth_tx_gas_limit(1000u64) + .set_default_price_per_gas_unit(TOKEN_ID, 10u64) .run(); state.single_transaction_should_work(TOKEN_ID, 100_000u64); @@ -685,14 +819,71 @@ fn esdt_safe_create_transaction() { .returns(ReturnsResult) .run(); - state.single_transaction_should_work(TOKEN_ID, 120_000u64); + assert_eq!(total_accumulated_transaction_fee, 10000u64); + + state.single_transaction_should_work(NATIVE_TOKEN_ID, 120_000u64); let total_balances = state .world .query() .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) - .total_balances(TOKEN_WITH_BURN_ROLE) + .total_balances(NATIVE_TOKEN_ID) + .returns(ReturnsResult) + .run(); + + assert_eq!(total_balances, 120000u64); +} + +#[test] +fn esdt_create_transaction_sc_call_test() { + let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); + state.safe_deploy(); + + state.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"TOKEN-WITH", + BigUint::from(10_000_000u64), + ); + + state.config_esdtsafe(); + + let refund_info = sc_proxies::esdt_safe_proxy::RefundInfo:: { + address: ManagedAddress::from(OWNER_ADDRESS.eval_to_array()), + initial_batch_id: 1u64, + initial_nonce: 1u64, + }; + + let data = ManagedBuffer::::from(b"Some data"); + + state + .world + .tx() + .from(BRIDGE_PROXY_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .create_transaction_sc_call( + EthAddress::zero(), + data.clone(), + OptionalValue::Some(refund_info.clone()), + ) + .single_esdt(&TOKEN_ID.into(), 0, &BigUint::from(10u64)) + .returns(ReturnsResult) + .run(); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .create_transaction_sc_call( + EthAddress::zero(), + data.clone(), + OptionalValue::None::>, + ) + .single_esdt(&TOKEN_ID.into(), 0, &BigUint::from(10u64)) .returns(ReturnsResult) .run(); } @@ -783,6 +974,12 @@ fn add_refund_batch_test() { BigUint::from(10_000u64), ); + state.world.set_esdt_balance( + MULTI_TRANSFER_ADDRESS, + b"MINT-BURN-123456", + BigUint::from(10_000u64), + ); + state .world .tx() @@ -816,6 +1013,70 @@ fn add_refund_batch_test() { "Amounts do not match", ); + let eth_tx3 = Transaction { + from: ManagedBuffer::from(OWNER_ADDRESS_EXPR), + to: ManagedBuffer::from(ESTD_SAFE_ADDRESS_EXPR), + amount: BigUint::from(10_000u64), + block_nonce: 0u64, + nonce: 0u64, + token_identifier: TokenIdentifier::from(MINT_BURN_TOKEN), + is_refund_tx: true, + }; + + let mut transfers2: ManagedVec> = ManagedVec::new(); + transfers2.push(eth_tx3); + + state + .world + .tx() + .from(MULTI_TRANSFER_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .add_refund_batch(transfers2) + .single_esdt(&MINT_BURN_TOKEN.into(), 0, &BigUint::from(10_000u64)) + .returns(ExpectError(ERROR, "Not enough minted tokens!")) + .run(); + + let eth_tx4 = Transaction { + from: ManagedBuffer::from(OWNER_ADDRESS_EXPR), + to: ManagedBuffer::from(ESTD_SAFE_ADDRESS_EXPR), + amount: BigUint::from(1_000u64), + block_nonce: 0u64, + nonce: 0u64, + token_identifier: TokenIdentifier::from(MINT_BURN_TOKEN), + is_refund_tx: true, + }; + + let mut transfers3: ManagedVec> = ManagedVec::new(); + transfers3.push(eth_tx4); + + state + .world + .tx() + .from(MULTI_TRANSFER_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .add_refund_batch(transfers3.clone()) + .single_esdt(&MINT_BURN_TOKEN.into(), 0, &BigUint::from(1_000u64)) + .returns(ExpectError(ERROR, "Cannot do the burn action!")) + .run(); + + state.world.set_esdt_local_roles( + ESDT_SAFE_ADDRESS, + b"MINT-BURN-123456", + &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], + ); + + state + .world + .tx() + .from(MULTI_TRANSFER_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .add_refund_batch(transfers3) + .single_esdt(&MINT_BURN_TOKEN.into(), 0, &BigUint::from(1_000u64)) + .run(); + state .world .tx() @@ -842,7 +1103,7 @@ fn add_refund_batch_test() { } = result { assert!(!tx_ids.is_empty(), "tx_ids should not be empty"); - let expected_tx_ids = vec![1u64, 2u64]; + let expected_tx_ids = vec![1u64, 2u64, 3u64]; let tx_ids_vec: Vec = tx_ids.into_iter().collect(); assert_eq!( tx_ids_vec, expected_tx_ids, @@ -854,7 +1115,6 @@ fn add_refund_batch_test() { } #[test] -#[ignore] //This will be rewritten fn claim_refund_test() { let mut state = EsdtSafeTestState::new(); state.multisig_deploy(); @@ -871,6 +1131,70 @@ fn claim_refund_test() { .returns(ExpectError(ERROR, "Nothing to refund")) .run(); + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .set_eth_tx_gas_limit(100u64) + .run(); + + state.world.set_esdt_local_roles( + ESDT_SAFE_ADDRESS, + b"MINT-BURN-123456", + &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], + ); + + state.single_transaction_should_work(MINT_BURN_TOKEN, 1000u64); + state.set_transaction_batch_status_should_work(1, tx_statuses.clone()); + + let refund = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .get_refund_amounts(MULTISIG_ADDRESS) + .returns(ReturnsResult) + .run(); + + let (token_id, amount) = refund.into_iter().next().unwrap().into_tuple(); + assert_eq!(token_id, TokenIdentifier::from(MINT_BURN_TOKEN)); + assert_eq!(amount, BigUint::from(1000u64)); + + let claim_refund = state + .esdt_raw_transaction() + .claim_refund(MINT_BURN_TOKEN) + .returns(ReturnsResult) + .run(); + + assert_eq!(token_id, claim_refund.token_identifier); + assert_eq!(amount, claim_refund.amount); + + let refund_after = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .get_refund_amounts(OWNER_ADDRESS) + .returns(ReturnsResult) + .run(); + assert!(refund_after.is_empty()); + + let claim_refund_second = state + .esdt_raw_transaction() + .claim_refund(MINT_BURN_TOKEN) + .returns(ExpectError(ERROR, "Nothing to refund")) + .run(); +} + +#[test] +fn withdraw_refund_fees_for_ethereum_test() { + let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); + state.safe_deploy(); + state.config_esdtsafe(); + state .world .tx() @@ -886,45 +1210,178 @@ fn claim_refund_test() { .from(MULTISIG_ADDRESS) .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) - .init_supply_mint_burn( - TOKEN_ID, - BigUint::from(100_000u64), - BigUint::from(10_000u64), - ) + .set_default_price_per_gas_unit(TOKEN_ID, 10u64) .run(); - state.single_transaction_should_work(TOKEN_ID, 100_000u64); - state.set_transaction_batch_status_should_work(1, tx_statuses.clone()); + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .withdraw_refund_fees_for_ethereum(TOKEN_ID, MULTISIG_ADDRESS) + .returns(ExpectError(ERROR, "There are no fees to withdraw")) + .run(); - let result = state + let refund_tx = Transaction { + from: ManagedBuffer::from(OWNER_ADDRESS_EXPR), + to: ManagedBuffer::from(ESTD_SAFE_ADDRESS_EXPR), + amount: BigUint::from(1_000_000u64), + block_nonce: 0u64, + nonce: 0u64, + token_identifier: TokenIdentifier::from(TOKEN_ID), + is_refund_tx: true, + }; + + let mut transfers: ManagedVec> = ManagedVec::new(); + transfers.push(refund_tx.clone()); + + let payment = EsdtTokenPayment::new(TOKEN_ID.into(), 0, BigUint::from(1_000_000u64)); + let payments = vec![payment]; + let payment = EgldOrMultiEsdtPayment::MultiEsdt(payments.into()); + + state.world.set_esdt_balance( + MULTI_TRANSFER_ADDRESS, + b"TOKEN-123456", + BigUint::from(1_000_000u64), + ); + + state + .world + .tx() + .from(MULTI_TRANSFER_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .add_refund_batch(transfers.clone()) + .egld_or_multi_esdt(payment.clone()) + .returns(ReturnsResult) + .run(); + + let refund_fees = state .world .query() .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) - .get_refund_amounts(OWNER_ADDRESS) + .get_refund_fees_for_ethereum(TOKEN_ID) .returns(ReturnsResult) .run(); - let (token_id, amount) = result.into_iter().next().unwrap().into_tuple(); - assert_eq!(token_id, TokenIdentifier::from(TOKEN_ID)); - assert_eq!(amount, BigUint::from(90_000u64)); + assert!( + refund_fees > BigUint::zero(), + "refund_fees_for_ethereum should be greater than zero" + ); - let result2 = state - .esdt_raw_transaction() - .claim_refund(TOKEN_ID) + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .withdraw_refund_fees_for_ethereum(TOKEN_ID, MULTISIG_ADDRESS) + .returns(ReturnsResult) + .run(); + + let refund_fees_after = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .get_refund_fees_for_ethereum(TOKEN_ID) + .returns(ReturnsResult) + .run(); + + assert_eq!( + refund_fees_after, + BigUint::zero(), + "refund_fees_for_ethereum should be zero after withdrawal" + ); +} + +#[test] +fn withdraw_transaction_fees_test() { + let mut state = EsdtSafeTestState::new(); + state.multisig_deploy(); + state.safe_deploy(); + state.config_esdtsafe(); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .set_eth_tx_gas_limit(1000u64) + .run(); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .withdraw_transaction_fees(TOKEN_ID, MULTISIG_ADDRESS) + .returns(ExpectError(ERROR, "There are no fees to withdraw")) + .run(); + + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .set_default_price_per_gas_unit(TOKEN_ID, 10u64) + .run(); + + state + .world + .tx() + .from(OWNER_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .create_transaction( + EthAddress::zero(), + OptionalValue::None::>, + ) + .single_esdt(&TOKEN_ID.into(), 0, &BigUint::from(1_000_000u64)) + .returns(ReturnsResult) + .run(); + + let transaction_fees = state + .world + .query() + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .get_transaction_fees(TOKEN_ID) .returns(ReturnsResult) .run(); - assert_eq!(token_id, result2.token_identifier); - assert_eq!(amount, result2.amount); + assert!( + transaction_fees > BigUint::zero(), + "accumulated_transaction_fees should be greater than zero" + ); - let result3 = state + state + .world + .tx() + .from(MULTISIG_ADDRESS) + .to(ESDT_SAFE_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .withdraw_transaction_fees(TOKEN_ID, MULTISIG_ADDRESS) + .returns(ReturnsResult) + .run(); + + let transaction_fees_after = state .world .query() .to(ESDT_SAFE_ADDRESS) .typed(esdt_safe_proxy::EsdtSafeProxy) - .get_refund_amounts(OWNER_ADDRESS) + .get_transaction_fees(TOKEN_ID) .returns(ReturnsResult) .run(); - assert!(result3.is_empty()); + + assert_eq!( + transaction_fees_after, + BigUint::zero(), + "accumulated_transaction_fees should be zero after withdrawal" + ); } From bff1985419f3d22a4e9e47c97b54d05749b70642 Mon Sep 17 00:00:00 2001 From: Eveline Molnar Date: Tue, 29 Oct 2024 17:23:18 +0200 Subject: [PATCH 19/21] clippy fix... --- esdt-safe/tests/esdt_safe_blackbox_test.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/esdt-safe/tests/esdt_safe_blackbox_test.rs b/esdt-safe/tests/esdt_safe_blackbox_test.rs index e1ce9286..93d42869 100644 --- a/esdt-safe/tests/esdt_safe_blackbox_test.rs +++ b/esdt-safe/tests/esdt_safe_blackbox_test.rs @@ -459,8 +459,8 @@ fn upgrade_test() { .paused_status() .returns(ReturnsResult) .run(); - assert_eq!( - paused_state_before, false, + assert!( + !paused_state_before, "Contract should not be paused before upgrade" ); @@ -497,8 +497,8 @@ fn upgrade_test() { .paused_status() .returns(ReturnsResult) .run(); - assert_eq!( - paused_state_after, true, + assert!( + paused_state_after, "Contract should be paused after upgrade" ); } @@ -1181,7 +1181,7 @@ fn claim_refund_test() { .run(); assert!(refund_after.is_empty()); - let claim_refund_second = state + state .esdt_raw_transaction() .claim_refund(MINT_BURN_TOKEN) .returns(ExpectError(ERROR, "Nothing to refund")) From 92c7abdb2e089b6c6da0a04a1c91cd5672473a75 Mon Sep 17 00:00:00 2001 From: Eveline Molnar Date: Wed, 30 Oct 2024 12:52:55 +0200 Subject: [PATCH 20/21] fix test after merge with v3.5 --- .../tests/multi_transfer_blackbox_test.rs | 119 ++++++++---------- 1 file changed, 55 insertions(+), 64 deletions(-) diff --git a/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs b/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs index 595f56e0..623a3eb8 100644 --- a/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs +++ b/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs @@ -102,8 +102,7 @@ fn world() -> ScenarioWorld { blockchain.register_contract( BRIDGED_TOKENS_WRAPPER_CODE_PATH, - bridged_tokens_wrapper::ContractB blockchain.register_contract(MOCK_ESDT_SAFE_CODE_PATH, esdt_safe::ContractBuilder); - uilder, + bridged_tokens_wrapper::ContractBuilder, ); blockchain.register_contract(MOCK_MULTISIG_CODE_PATH, mock_multisig::ContractBuilder); blockchain.register_contract( @@ -148,14 +147,6 @@ impl MultiTransferTestState { "ESDTRoleLocalBurn".to_string(), ]; - world - .account(ESDT_SAFE_ADDRESS) - .esdt_roles(BRIDGE_TOKEN_ID, roles.clone()) - .esdt_roles(UNIVERSAL_TOKEN_IDENTIFIER, roles.clone()) - .esdt_roles(WRAPPED_TOKEN_ID, roles.clone()) - .code(ESDT_SAFE_CODE_PATH) - .owner(OWNER_ADDRESS); - world .account(PRICE_AGGREGATOR_ADDRESS) .code(MOCK_PRICE_AGGREGATOR_CODE_PATH); @@ -227,15 +218,14 @@ impl MultiTransferTestState { self } - fn safe_upgrade(&mut self, price_aggregator_contract_address: Address) -> &mut Self { - self.esdt_raw_transaction() - .upgrade( - ManagedAddress::zero(), - MULTI_TRANSFER_ADDRESS.to_address(), - BRIDGE_PROXY_ADDRESS.to_address(), - ESDT_SAFE_ETH_TX_GAS_LIMIT, - ) + fn safe_deploy_real_contract(&mut self) -> &mut Self { + self.world + .tx() + .from(MULTISIG_ADDRESS) + .typed(esdt_safe_proxy::EsdtSafeProxy) + .init(ETH_TX_GAS_LIMIT) .code(ESDT_SAFE_CODE_PATH) + .new_address(ESDT_SAFE_ADDRESS) .run(); self @@ -255,6 +245,47 @@ impl MultiTransferTestState { } fn config_multi_transfer(&mut self) { + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"BRIDGE-123456", + BigUint::from(100_000_000_000u64), + ); + + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"WRAPPED-123456", + BigUint::from(100_000_000_000u64), + ); + + self.world.set_esdt_local_roles( + ESDT_SAFE_ADDRESS, + b"BRIDGE-123456", + &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], + ); + + self.world.set_esdt_local_roles( + ESDT_SAFE_ADDRESS, + b"WRAPPED-123456", + &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], + ); + + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"TOKEN-123456", + BigUint::from(100_000_000_000u64), + ); + + self.world.set_esdt_balance( + MULTISIG_ADDRESS, + b"TOKEN", + BigUint::from(MAX_AMOUNT + 100000000), + ); + + self.world.set_esdt_local_roles( + ESDT_SAFE_ADDRESS, + b"TOKEN-123456", + &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], + ); self.esdt_raw_transaction() .add_token_to_whitelist( TokenIdentifier::from_esdt_bytes("BRIDGE-123456"), @@ -288,17 +319,13 @@ impl MultiTransferTestState { self.world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(MULTI_TRANSFER_ADDRESS) .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) .set_max_bridged_amount(TOKEN_TICKER, MAX_AMOUNT - 1) .run(); - self.world - .tx() - .from(OWNER_ADDRESS) - .to(ESDT_SAFE_ADDRESS) - .typed(esdt_safe_proxy::EsdtSafeProxy) + self.esdt_raw_transaction() .add_token_to_whitelist( TokenIdentifier::from_esdt_bytes("WRAPPED-123456"), "BRIDGE2", @@ -328,42 +355,6 @@ impl MultiTransferTestState { .typed(bridged_tokens_wrapper_proxy::BridgedTokensWrapperProxy) .unpause_endpoint() .run(); - - self.world.set_esdt_balance( - MULTISIG_ADDRESS, - b"BRIDGE-123456", - BigUint::from(100_000_000_000u64), - ); - - self.world.set_esdt_balance( - MULTISIG_ADDRESS, - b"WRAPPED-123456", - BigUint::from(100_000_000_000u64), - ); - - self.world.set_esdt_local_roles( - ESDT_SAFE_ADDRESS, - b"BRIDGE-123456", - &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], - ); - - self.world.set_esdt_local_roles( - ESDT_SAFE_ADDRESS, - b"WRAPPED-123456", - &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], - ); - - self.world.set_esdt_balance( - MULTISIG_ADDRESS, - b"TOKEN-123456", - BigUint::from(100_000_000_000u64), - ); - - self.world.set_esdt_local_roles( - ESDT_SAFE_ADDRESS, - b"TOKEN-123456", - &[EsdtLocalRole::Mint, EsdtLocalRole::Burn], - ); } fn config_bridged_tokens_wrapper(&mut self) { @@ -535,7 +526,6 @@ impl MultiTransferTestState { self.multi_transfer_deploy(); self.bridge_proxy_deploy(); self.safe_deploy(); - self.safe_upgrade(); self.bridged_tokens_wrapper_deploy(); } @@ -1197,9 +1187,10 @@ fn test_unwrap_token_create_transaction_amount_zero() { fn add_refund_batch_test_should_work() { let mut state = MultiTransferTestState::new(); + state.multisig_deploy(); state.multi_transfer_deploy(); state.bridge_proxy_deploy(); - state.safe_deploy(Address::zero()); + state.safe_deploy_real_contract(); state.bridged_tokens_wrapper_deploy(); state.config_multi_transfer(); @@ -1235,7 +1226,7 @@ fn add_refund_batch_test_should_work() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(MULTI_TRANSFER_ADDRESS) .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) .batch_transfer_esdt_token(1u32, transfers) @@ -1250,7 +1241,7 @@ fn add_refund_batch_test_should_work() { state .world .tx() - .from(OWNER_ADDRESS) + .from(MULTISIG_ADDRESS) .to(MULTI_TRANSFER_ADDRESS) .typed(multi_transfer_esdt_proxy::MultiTransferEsdtProxy) .move_refund_batch_to_safe() From 4177749c9830bbb220f9a82b98e90e3f9e7bc294 Mon Sep 17 00:00:00 2001 From: Eveline Molnar Date: Mon, 4 Nov 2024 12:49:33 +0200 Subject: [PATCH 21/21] mock-proxies --- Cargo.lock | 10 ++++++++++ bridge-proxy/Cargo.toml | 3 +++ bridge-proxy/tests/bridge_proxy_blackbox_test.rs | 5 ++--- common/mock-proxies/Cargo.toml | 8 ++++++++ common/mock-proxies/src/lib.rs | 3 +++ .../src/mock_multisig_proxy.rs | 0 common/sc-proxies/src/lib.rs | 1 - esdt-safe/Cargo.toml | 3 +++ esdt-safe/tests/esdt_safe_blackbox_test.rs | 2 +- multi-transfer-esdt/Cargo.toml | 3 +++ .../tests/multi_transfer_blackbox_test.rs | 3 ++- 11 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 common/mock-proxies/Cargo.toml create mode 100644 common/mock-proxies/src/lib.rs rename common/{sc-proxies => mock-proxies}/src/mock_multisig_proxy.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 573f1171..1e7b3229 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -127,6 +127,7 @@ dependencies = [ "mock-multi-transfer-esdt", "mock-multisig", "mock-price-aggregator", + "mock-proxies", "multiversx-sc", "multiversx-sc-modules", "multiversx-sc-scenario", @@ -387,6 +388,7 @@ dependencies = [ "mock-multi-transfer-esdt", "mock-multisig", "mock-price-aggregator", + "mock-proxies", "multiversx-price-aggregator-sc", "multiversx-sc", "multiversx-sc-modules", @@ -670,6 +672,13 @@ dependencies = [ "multiversx-sc-meta-lib", ] +[[package]] +name = "mock-proxies" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "multi-transfer-esdt" version = "0.0.0" @@ -681,6 +690,7 @@ dependencies = [ "max-bridged-amount-module", "mock-multisig", "mock-price-aggregator", + "mock-proxies", "multiversx-sc", "multiversx-sc-modules", "multiversx-sc-scenario", diff --git a/bridge-proxy/Cargo.toml b/bridge-proxy/Cargo.toml index 7db0cc53..44d13f32 100644 --- a/bridge-proxy/Cargo.toml +++ b/bridge-proxy/Cargo.toml @@ -26,6 +26,9 @@ path = "../common/tx-batch-module" [dependencies.sc-proxies] path = "../common/sc-proxies" +[dependencies.mock-proxies] +path = "../common/mock-proxies" + [dependencies.esdt-safe] path = "../esdt-safe" diff --git a/bridge-proxy/tests/bridge_proxy_blackbox_test.rs b/bridge-proxy/tests/bridge_proxy_blackbox_test.rs index 00ad48f8..e03844d2 100644 --- a/bridge-proxy/tests/bridge_proxy_blackbox_test.rs +++ b/bridge-proxy/tests/bridge_proxy_blackbox_test.rs @@ -36,9 +36,8 @@ use multiversx_sc_scenario::{ use multiversx_sc_scenario::{ExpectValue, ScenarioTxRun}; use eth_address::*; -use sc_proxies::{ - bridge_proxy_contract_proxy, bridged_tokens_wrapper_proxy, esdt_safe_proxy, mock_multisig_proxy, -}; +use mock_proxies::mock_multisig_proxy; +use sc_proxies::{bridge_proxy_contract_proxy, bridged_tokens_wrapper_proxy, esdt_safe_proxy}; use transaction::{CallData, EthTransaction}; const BRIDGE_TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("BRIDGE-123456"); diff --git a/common/mock-proxies/Cargo.toml b/common/mock-proxies/Cargo.toml new file mode 100644 index 00000000..50d14510 --- /dev/null +++ b/common/mock-proxies/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "mock-proxies" +version = "0.0.0" +authors = ["MultiversX "] +edition = "2018" + +[dependencies.multiversx-sc] +version = "=0.53.2" diff --git a/common/mock-proxies/src/lib.rs b/common/mock-proxies/src/lib.rs new file mode 100644 index 00000000..24cd29ab --- /dev/null +++ b/common/mock-proxies/src/lib.rs @@ -0,0 +1,3 @@ +#![no_std] + +pub mod mock_multisig_proxy; diff --git a/common/sc-proxies/src/mock_multisig_proxy.rs b/common/mock-proxies/src/mock_multisig_proxy.rs similarity index 100% rename from common/sc-proxies/src/mock_multisig_proxy.rs rename to common/mock-proxies/src/mock_multisig_proxy.rs diff --git a/common/sc-proxies/src/lib.rs b/common/sc-proxies/src/lib.rs index 014a4311..ca235320 100644 --- a/common/sc-proxies/src/lib.rs +++ b/common/sc-proxies/src/lib.rs @@ -4,6 +4,5 @@ pub mod bridge_proxy_contract_proxy; pub mod bridged_tokens_wrapper_proxy; pub mod crowdfunding_esdt_proxy; pub mod esdt_safe_proxy; -pub mod mock_multisig_proxy; pub mod multi_transfer_esdt_proxy; pub mod multisig_proxy; diff --git a/esdt-safe/Cargo.toml b/esdt-safe/Cargo.toml index cd93e60f..53c7fb2d 100644 --- a/esdt-safe/Cargo.toml +++ b/esdt-safe/Cargo.toml @@ -32,6 +32,9 @@ path = "../common/storage-module" [dependencies.sc-proxies] path = "../common/sc-proxies" +[dependencies.mock-proxies] +path = "../common/mock-proxies" + [dependencies.mock-bridged-tokens-wrapper] path = "../common/mock-contracts/mock-bridged-tokens-wrapper" diff --git a/esdt-safe/tests/esdt_safe_blackbox_test.rs b/esdt-safe/tests/esdt_safe_blackbox_test.rs index 93d42869..ce8a98da 100644 --- a/esdt-safe/tests/esdt_safe_blackbox_test.rs +++ b/esdt-safe/tests/esdt_safe_blackbox_test.rs @@ -2,9 +2,9 @@ use esdt_safe::*; use eth_address::EthAddress; +use mock_proxies::mock_multisig_proxy; use multiversx_sc_scenario::imports::*; use sc_proxies::esdt_safe_proxy::{self, EsdtSafeProxyMethods}; -use sc_proxies::mock_multisig_proxy; use transaction::transaction_status::TransactionStatus; use transaction::Transaction; use tx_batch_module::BatchStatus; diff --git a/multi-transfer-esdt/Cargo.toml b/multi-transfer-esdt/Cargo.toml index fbd83241..89630289 100644 --- a/multi-transfer-esdt/Cargo.toml +++ b/multi-transfer-esdt/Cargo.toml @@ -44,6 +44,9 @@ path = "../common/mock-contracts/mock-price-aggregator" [dependencies.sc-proxies] path = "../common/sc-proxies" +[dependencies.mock-proxies] +path = "../common/mock-proxies" + [dependencies.multiversx-sc] version = "=0.53.2" diff --git a/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs b/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs index 623a3eb8..8f8eac4b 100644 --- a/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs +++ b/multi-transfer-esdt/tests/multi_transfer_blackbox_test.rs @@ -27,9 +27,10 @@ use multiversx_sc_scenario::{ }; use eth_address::*; +use mock_proxies::mock_multisig_proxy; use sc_proxies::{ bridge_proxy_contract_proxy, bridged_tokens_wrapper_proxy, esdt_safe_proxy, - mock_multisig_proxy, multi_transfer_esdt_proxy, + multi_transfer_esdt_proxy, }; use token_module::ProxyTrait as _; use transaction::{transaction_status::TransactionStatus, CallData, EthTransaction, Transaction};