From b9eccdc3977b0f04eb1a5995d7778b6633d367d1 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 16:43:08 +0200 Subject: [PATCH 1/9] Added first check for phase three Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 4 ++++ sovereign-forge/src/phases.rs | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 64b088e3..9664de9d 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -39,6 +39,10 @@ pub enum ScArray { #[multiversx_sc::module] pub trait UtilsModule: super::storage::StorageModule { + fn require_phase_two_completed(&self, caller: &ManagedAddress) { + self.check_if_contract_deployed(caller, ScArray::HeaderVerifier, b"HeaderVerifier"); + } + fn require_phase_1_completed(&self, caller: &ManagedAddress) { require!( self.sovereigns_mapper(caller).is_empty(), diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 9ca79248..5ec7395f 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -103,4 +103,11 @@ pub trait PhasesModule: self.sovereign_deployed_contracts(&self.sovereigns_mapper(&caller).get()) .insert(header_verifier_contract_info); } + + #[endpoint(deployPhaseThree)] + fn deploy_phase_three(&self) { + let caller = self.blockchain().get_caller(); + + self.require_phase_two_completed(&caller); + } } From 6690a9324ad3002f1d36232de676c26208dca73a Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Thu, 5 Dec 2024 10:08:04 +0200 Subject: [PATCH 2/9] Removed junk code Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 71e2c77a..b4e8e3af 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -40,7 +40,7 @@ pub enum ScArray { #[multiversx_sc::module] pub trait UtilsModule: super::storage::StorageModule { fn require_phase_two_completed(&self, caller: &ManagedAddress) { - self.check_if_contract_deployed(caller, ScArray::HeaderVerifier, b"HeaderVerifier"); + self.is_contract_deployed(caller, ScArray::HeaderVerifier); } fn require_phase_1_completed(&self, caller: &ManagedAddress) { From 4cafca9392cb0d53ae89c2b00e7f0624abb15d14 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Thu, 5 Dec 2024 10:36:28 +0200 Subject: [PATCH 3/9] Added transaction to set esdt_safe_address in header-address Signed-off-by: Andrei Baltariu --- chain-factory/src/factory.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/chain-factory/src/factory.rs b/chain-factory/src/factory.rs index 76cb1c81..60d86634 100644 --- a/chain-factory/src/factory.rs +++ b/chain-factory/src/factory.rs @@ -61,18 +61,31 @@ pub trait FactoryModule { #[only_owner] #[endpoint(deployEsdtSafe)] - fn deploy_esdt_safe(&self, is_sovereign_chain: bool) -> ManagedAddress { + fn deploy_esdt_safe( + &self, + is_sovereign_chain: bool, + header_verifier_address: ManagedAddress, + ) -> ManagedAddress { let source_address = self.enshrine_esdt_safe_template().get(); let metadata = self.blockchain().get_code_metadata(&source_address); - self.tx() + let esdt_safe_address = self + .tx() .typed(EsdtSafeProxy) .init(is_sovereign_chain) .gas(60_000_000) .from_source(source_address) .code_metadata(metadata) .returns(ReturnsNewManagedAddress) - .sync_call() + .sync_call(); + + self.tx() + .to(header_verifier_address) + .typed(HeaderverifierProxy) + .set_esdt_safe_address(esdt_safe_address.clone()) + .sync_call(); + + esdt_safe_address } #[only_owner] From f17a5d56abaa1c9c9e6476d9d8d94638a5bfd1f1 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Thu, 5 Dec 2024 10:42:42 +0200 Subject: [PATCH 4/9] Added `header_verifier_address` as endpoint parameter Signed-off-by: Andrei Baltariu --- common/proxies/src/chain_factory_proxy.rs | 3 +++ common/proxies/src/sovereign_forge_proxy.rs | 13 ++++++++++++ sovereign-forge/src/common/sc_deploy.rs | 8 ++++++-- sovereign-forge/src/phases.rs | 20 ++++++++++++++++++- .../wasm-sovereign-forge-full/src/lib.rs | 5 +++-- sovereign-forge/wasm/src/lib.rs | 5 +++-- 6 files changed, 47 insertions(+), 7 deletions(-) diff --git a/common/proxies/src/chain_factory_proxy.rs b/common/proxies/src/chain_factory_proxy.rs index 652af977..77701a47 100644 --- a/common/proxies/src/chain_factory_proxy.rs +++ b/common/proxies/src/chain_factory_proxy.rs @@ -131,14 +131,17 @@ where pub fn deploy_esdt_safe< Arg0: ProxyArg, + Arg1: ProxyArg>, >( self, is_sovereign_chain: Arg0, + header_verifier_address: Arg1, ) -> TxTypedCall> { self.wrapped_tx .payment(NotPayable) .raw_call("deployEsdtSafe") .argument(&is_sovereign_chain) + .argument(&header_verifier_address) .original_result() } diff --git a/common/proxies/src/sovereign_forge_proxy.rs b/common/proxies/src/sovereign_forge_proxy.rs index 46802e76..d45bf090 100644 --- a/common/proxies/src/sovereign_forge_proxy.rs +++ b/common/proxies/src/sovereign_forge_proxy.rs @@ -160,6 +160,19 @@ where .original_result() } + pub fn deploy_phase_three< + Arg0: ProxyArg, + >( + self, + is_sovereign_chain: Arg0, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("deployPhaseThree") + .argument(&is_sovereign_chain) + .original_result() + } + pub fn chain_factories< Arg0: ProxyArg, >( diff --git a/sovereign-forge/src/common/sc_deploy.rs b/sovereign-forge/src/common/sc_deploy.rs index 38a73ebe..a5b6bb05 100644 --- a/sovereign-forge/src/common/sc_deploy.rs +++ b/sovereign-forge/src/common/sc_deploy.rs @@ -37,11 +37,15 @@ pub trait ScDeployModule: super::utils::UtilsModule + super::storage::StorageMod } #[inline] - fn deploy_esdt_safe(&self, is_sovereign_chain: bool) -> ManagedAddress { + fn deploy_esdt_safe( + &self, + is_sovereign_chain: bool, + header_verifier_address: ManagedAddress, + ) -> ManagedAddress { self.tx() .to(self.get_chain_factory_address()) .typed(ChainFactoryContractProxy) - .deploy_esdt_safe(is_sovereign_chain) + .deploy_esdt_safe(is_sovereign_chain, header_verifier_address) .returns(ReturnsResult) .sync_call() } diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index c05cd9c3..72aa52ab 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -93,6 +93,10 @@ pub trait PhasesModule: let caller = blockchain_api.get_caller(); self.require_phase_1_completed(&caller); + require!( + self.is_contract_deployed(&caller, ScArray::HeaderVerifier), + "The Header-Verifier contract is already deployed" + ); let header_verifier_address = self.deploy_header_verifier(bls_keys); @@ -104,9 +108,23 @@ pub trait PhasesModule: } #[endpoint(deployPhaseThree)] - fn deploy_phase_three(&self) { + fn deploy_phase_three( + &self, + is_sovereign_chain: bool, + header_verifier_address: ManagedAddress, + ) { let caller = self.blockchain().get_caller(); self.require_phase_two_completed(&caller); + require!( + self.is_contract_deployed(&caller, ScArray::ESDTSafe), + "The ESDT-Safe contract is already deployed" + ); + + let esdt_safe_address = self.deploy_esdt_safe(is_sovereign_chain, header_verifier_address); + let esdt_safe_contract_info = ContractInfo::new(ScArray::ESDTSafe, esdt_safe_address); + + self.sovereign_deployed_contracts(&self.sovereigns_mapper(&caller).get()) + .insert(esdt_safe_contract_info); } } diff --git a/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs b/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs index e3412be2..07331b22 100644 --- a/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs +++ b/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 9 +// Endpoints: 10 // Async Callback (empty): 1 -// Total number of exported functions: 12 +// Total number of exported functions: 13 #![no_std] @@ -25,6 +25,7 @@ multiversx_sc_wasm_adapter::endpoints! { completeSetupPhase => complete_setup_phase deployPhaseOne => deploy_phase_one deployPhaseTwo => deploy_phase_two + deployPhaseThree => deploy_phase_three getChainFactoryAddress => chain_factories getTokenHandlerAddress => token_handlers getDeployCost => deploy_cost diff --git a/sovereign-forge/wasm/src/lib.rs b/sovereign-forge/wasm/src/lib.rs index e3412be2..07331b22 100644 --- a/sovereign-forge/wasm/src/lib.rs +++ b/sovereign-forge/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 9 +// Endpoints: 10 // Async Callback (empty): 1 -// Total number of exported functions: 12 +// Total number of exported functions: 13 #![no_std] @@ -25,6 +25,7 @@ multiversx_sc_wasm_adapter::endpoints! { completeSetupPhase => complete_setup_phase deployPhaseOne => deploy_phase_one deployPhaseTwo => deploy_phase_two + deployPhaseThree => deploy_phase_three getChainFactoryAddress => chain_factories getTokenHandlerAddress => token_handlers getDeployCost => deploy_cost From 56b81a24a933bcf277a4b64289f5b2503fb03e13 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 6 Dec 2024 11:14:42 +0200 Subject: [PATCH 5/9] Phase three TDD Signed-off-by: Andrei Baltariu --- Cargo.lock | 1 + common/proxies/src/sovereign_forge_proxy.rs | 19 ++++ sovereign-forge/Cargo.toml | 3 + sovereign-forge/src/phases.rs | 31 +++++- .../tests/sovereign_forge_unit_tests.rs | 94 +++++++++++++++++-- .../wasm-sovereign-forge-full/Cargo.lock | 44 +++++++++ .../wasm-sovereign-forge-full/src/lib.rs | 5 +- .../wasm-soveriegn-forge-view/Cargo.lock | 44 +++++++++ sovereign-forge/wasm/Cargo.lock | 44 +++++++++ sovereign-forge/wasm/src/lib.rs | 5 +- 10 files changed, 272 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba47bbcd..c6dcbe9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2128,6 +2128,7 @@ version = "0.0.0" dependencies = [ "chain-config", "chain-factory", + "esdt-safe", "header-verifier", "multiversx-sc", "multiversx-sc-modules", diff --git a/common/proxies/src/sovereign_forge_proxy.rs b/common/proxies/src/sovereign_forge_proxy.rs index d45bf090..de7a16f9 100644 --- a/common/proxies/src/sovereign_forge_proxy.rs +++ b/common/proxies/src/sovereign_forge_proxy.rs @@ -162,14 +162,33 @@ where pub fn deploy_phase_three< Arg0: ProxyArg, + Arg1: ProxyArg>, >( self, is_sovereign_chain: Arg0, + header_verifier_address: Arg1, ) -> TxTypedCall { self.wrapped_tx .payment(NotPayable) .raw_call("deployPhaseThree") .argument(&is_sovereign_chain) + .argument(&header_verifier_address) + .original_result() + } + + pub fn set_address< + Arg0: ProxyArg>, + Arg1: ProxyArg>, + >( + self, + esdt_safe_address: Arg0, + header_verifier_address: Arg1, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("setAddress") + .argument(&esdt_safe_address) + .argument(&header_verifier_address) .original_result() } diff --git a/sovereign-forge/Cargo.toml b/sovereign-forge/Cargo.toml index 3308c48a..0869d99e 100644 --- a/sovereign-forge/Cargo.toml +++ b/sovereign-forge/Cargo.toml @@ -23,6 +23,9 @@ path = "../chain-config" [dependencies.header-verifier] path = "../header-verifier" +[dependencies.esdt-safe] +path = "../esdt-safe" + [dependencies.proxies] path = "../common/proxies" diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 72aa52ab..97cf5ff0 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -1,5 +1,6 @@ use crate::err_msg; use core::ops::Deref; +use proxies::header_verifier_proxy::HeaderverifierProxy; use transaction::StakeMultiArg; use multiversx_sc::{require, types::MultiValueEncoded}; @@ -94,7 +95,7 @@ pub trait PhasesModule: self.require_phase_1_completed(&caller); require!( - self.is_contract_deployed(&caller, ScArray::HeaderVerifier), + !self.is_contract_deployed(&caller, ScArray::HeaderVerifier), "The Header-Verifier contract is already deployed" ); @@ -117,14 +118,36 @@ pub trait PhasesModule: self.require_phase_two_completed(&caller); require!( - self.is_contract_deployed(&caller, ScArray::ESDTSafe), + !self.is_contract_deployed(&caller, ScArray::ESDTSafe), "The ESDT-Safe contract is already deployed" ); - let esdt_safe_address = self.deploy_esdt_safe(is_sovereign_chain, header_verifier_address); - let esdt_safe_contract_info = ContractInfo::new(ScArray::ESDTSafe, esdt_safe_address); + let esdt_safe_address = + self.deploy_esdt_safe(is_sovereign_chain, header_verifier_address.clone()); + + let esdt_safe_contract_info = + ContractInfo::new(ScArray::ESDTSafe, esdt_safe_address.clone()); self.sovereign_deployed_contracts(&self.sovereigns_mapper(&caller).get()) .insert(esdt_safe_contract_info); + + self.tx() + .to(header_verifier_address) + .typed(HeaderverifierProxy) + .set_esdt_safe_address(esdt_safe_address.clone()) + .sync_call(); + } + + #[endpoint(setAddress)] + fn set_address( + &self, + esdt_safe_address: ManagedAddress, + header_verifier_address: ManagedAddress, + ) { + self.tx() + .to(header_verifier_address) + .typed(HeaderverifierProxy) + .set_esdt_safe_address(esdt_safe_address) + .sync_call(); } } diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs index 894af493..d00aa858 100644 --- a/sovereign-forge/tests/sovereign_forge_unit_tests.rs +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -5,7 +5,8 @@ use multiversx_sc_scenario::{ }; use proxies::{ chain_config_proxy::ChainConfigContractProxy, chain_factory_proxy::ChainFactoryContractProxy, - header_verifier_proxy::HeaderverifierProxy, sovereign_forge_proxy::SovereignForgeProxy, + esdt_safe_proxy::EsdtSafeProxy, header_verifier_proxy::HeaderverifierProxy, + sovereign_forge_proxy::SovereignForgeProxy, }; use setup_phase::SetupPhaseModule; use sovereign_forge::common::{ @@ -29,6 +30,9 @@ const HEADER_VERIFIER_ADDRESS: TestSCAddress = TestSCAddress::new("header-verifi const HEADER_VERIFIER_CODE_PATH: MxscPath = MxscPath::new("../header-verifier/output/header-verifier.mxsc.json"); +const ESDT_SAFE_ADDRESS: TestSCAddress = TestSCAddress::new("esdt-safe"); +const ESDT_SAFE_CODE_PATH: MxscPath = MxscPath::new("../esdt-safe/output/esdt-safe.mxsc.json"); + const TOKEN_HANDLER_ADDRESS: TestSCAddress = TestSCAddress::new("token-handler"); const BALANCE: u128 = 100_000_000_000_000_000; @@ -41,6 +45,7 @@ fn world() -> ScenarioWorld { blockchain.register_contract(FACTORY_CODE_PATH, chain_factory::ContractBuilder); blockchain.register_contract(CONFIG_CODE_PATH, chain_config::ContractBuilder); blockchain.register_contract(HEADER_VERIFIER_CODE_PATH, header_verifier::ContractBuilder); + blockchain.register_contract(ESDT_SAFE_CODE_PATH, esdt_safe::ContractBuilder); blockchain } @@ -69,7 +74,7 @@ impl SovereignForgeTestState { .init( CONFIG_ADDRESS, HEADER_VERIFIER_ADDRESS, - FACTORY_ADDRESS, + ESDT_SAFE_ADDRESS, FACTORY_ADDRESS, ) .code(FACTORY_CODE_PATH) @@ -128,6 +133,21 @@ impl SovereignForgeTestState { self } + fn deploy_esdt_safe_template(&mut self) -> &mut Self { + let is_sovereign_chain = false; + + self.world + .tx() + .from(OWNER_ADDRESS) + .typed(EsdtSafeProxy) + .init(is_sovereign_chain) + .code(ESDT_SAFE_CODE_PATH) + .new_address(ESDT_SAFE_ADDRESS) + .run(); + + self + } + fn register_token_handler( &mut self, shard_id: u32, @@ -186,6 +206,16 @@ impl SovereignForgeTestState { } } + fn finish_setup(&mut self) { + self.register_chain_factory(1, FACTORY_ADDRESS, None); + self.register_chain_factory(2, FACTORY_ADDRESS, None); + self.register_chain_factory(3, FACTORY_ADDRESS, None); + self.register_token_handler(1, TOKEN_HANDLER_ADDRESS, None); + self.register_token_handler(2, TOKEN_HANDLER_ADDRESS, None); + self.register_token_handler(3, TOKEN_HANDLER_ADDRESS, None); + self.complete_setup_phase(None); + } + fn deploy_phase_one( &mut self, payment: &BigUint, @@ -236,14 +266,28 @@ impl SovereignForgeTestState { } } - fn finish_setup(&mut self) { - self.register_chain_factory(1, FACTORY_ADDRESS, None); - self.register_chain_factory(2, FACTORY_ADDRESS, None); - self.register_chain_factory(3, FACTORY_ADDRESS, None); - self.register_token_handler(1, TOKEN_HANDLER_ADDRESS, None); - self.register_token_handler(2, TOKEN_HANDLER_ADDRESS, None); - self.register_token_handler(3, TOKEN_HANDLER_ADDRESS, None); - self.complete_setup_phase(None); + fn deploy_phase_three( + &mut self, + is_sovereign_chain: bool, + header_verifier_address: &TestSCAddress, + expect_error: Option, + ) { + let transaction = self + .world + .tx() + .from(OWNER_ADDRESS) + .to(FORGE_ADDRESS) + .typed(SovereignForgeProxy) + .deploy_phase_three( + is_sovereign_chain, + header_verifier_address.to_managed_address(), + ); + + if let Some(error) = expect_error { + transaction.returns(error).run(); + } else { + transaction.run(); + } } } @@ -498,3 +542,33 @@ fn deploy_phase_two_header_already_deployed() { &bls_keys, ); } + +#[test] +fn deploy_phase_three_without_phase_two() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.deploy_chain_factory(); + state.deploy_chain_config_template(); + state.finish_setup(); + + let deploy_cost = BigUint::from(100_000u32); + + state.deploy_phase_one( + &deploy_cost, + 1, + 2, + BigUint::from(2u32), + MultiValueEncoded::new(), + None, + ); + + state.deploy_header_verifier_template(); + state.deploy_esdt_safe_template(); + + let mut bls_keys = MultiValueEncoded::new(); + bls_keys.push(ManagedBuffer::from("bls1")); + bls_keys.push(ManagedBuffer::from("bls2")); + + state.deploy_phase_two(None, &bls_keys); + state.deploy_phase_three(false, &HEADER_VERIFIER_ADDRESS, None); +} diff --git a/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock b/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock index 84db6e29..988f1192 100644 --- a/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock +++ b/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock @@ -48,6 +48,33 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "esdt-safe" +version = "0.0.0" +dependencies = [ + "fee-market", + "header-verifier", + "max-bridged-amount-module", + "multiversx-sc", + "multiversx-sc-modules", + "proxies", + "setup-phase", + "token-whitelist", + "transaction", + "tx-batch-module", + "utils", +] + +[[package]] +name = "fee-market" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "proxies", + "transaction", + "utils", +] + [[package]] name = "header-verifier" version = "0.0.0" @@ -70,6 +97,13 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +[[package]] +name = "max-bridged-amount-module" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "multiversx-chain-core" version = "0.11.1" @@ -223,6 +257,7 @@ version = "0.0.0" dependencies = [ "chain-config", "chain-factory", + "esdt-safe", "header-verifier", "multiversx-sc", "multiversx-sc-modules", @@ -250,6 +285,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "token-whitelist" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "setup-phase", + "utils", +] + [[package]] name = "transaction" version = "0.0.0" diff --git a/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs b/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs index 07331b22..14450194 100644 --- a/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs +++ b/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 10 +// Endpoints: 11 // Async Callback (empty): 1 -// Total number of exported functions: 13 +// Total number of exported functions: 14 #![no_std] @@ -26,6 +26,7 @@ multiversx_sc_wasm_adapter::endpoints! { deployPhaseOne => deploy_phase_one deployPhaseTwo => deploy_phase_two deployPhaseThree => deploy_phase_three + setAddress => set_address getChainFactoryAddress => chain_factories getTokenHandlerAddress => token_handlers getDeployCost => deploy_cost diff --git a/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock b/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock index 94b30b41..20f07787 100644 --- a/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock +++ b/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock @@ -48,6 +48,33 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "esdt-safe" +version = "0.0.0" +dependencies = [ + "fee-market", + "header-verifier", + "max-bridged-amount-module", + "multiversx-sc", + "multiversx-sc-modules", + "proxies", + "setup-phase", + "token-whitelist", + "transaction", + "tx-batch-module", + "utils", +] + +[[package]] +name = "fee-market" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "proxies", + "transaction", + "utils", +] + [[package]] name = "header-verifier" version = "0.0.0" @@ -70,6 +97,13 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +[[package]] +name = "max-bridged-amount-module" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "multiversx-chain-core" version = "0.11.1" @@ -223,6 +257,7 @@ version = "0.0.0" dependencies = [ "chain-config", "chain-factory", + "esdt-safe", "header-verifier", "multiversx-sc", "multiversx-sc-modules", @@ -250,6 +285,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "token-whitelist" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "setup-phase", + "utils", +] + [[package]] name = "transaction" version = "0.0.0" diff --git a/sovereign-forge/wasm/Cargo.lock b/sovereign-forge/wasm/Cargo.lock index 2402d27c..3278000e 100644 --- a/sovereign-forge/wasm/Cargo.lock +++ b/sovereign-forge/wasm/Cargo.lock @@ -48,6 +48,33 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "esdt-safe" +version = "0.0.0" +dependencies = [ + "fee-market", + "header-verifier", + "max-bridged-amount-module", + "multiversx-sc", + "multiversx-sc-modules", + "proxies", + "setup-phase", + "token-whitelist", + "transaction", + "tx-batch-module", + "utils", +] + +[[package]] +name = "fee-market" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "proxies", + "transaction", + "utils", +] + [[package]] name = "header-verifier" version = "0.0.0" @@ -70,6 +97,13 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +[[package]] +name = "max-bridged-amount-module" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "multiversx-chain-core" version = "0.11.1" @@ -223,6 +257,7 @@ version = "0.0.0" dependencies = [ "chain-config", "chain-factory", + "esdt-safe", "header-verifier", "multiversx-sc", "multiversx-sc-modules", @@ -250,6 +285,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "token-whitelist" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "setup-phase", + "utils", +] + [[package]] name = "transaction" version = "0.0.0" diff --git a/sovereign-forge/wasm/src/lib.rs b/sovereign-forge/wasm/src/lib.rs index 07331b22..14450194 100644 --- a/sovereign-forge/wasm/src/lib.rs +++ b/sovereign-forge/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 10 +// Endpoints: 11 // Async Callback (empty): 1 -// Total number of exported functions: 13 +// Total number of exported functions: 14 #![no_std] @@ -26,6 +26,7 @@ multiversx_sc_wasm_adapter::endpoints! { deployPhaseOne => deploy_phase_one deployPhaseTwo => deploy_phase_two deployPhaseThree => deploy_phase_three + setAddress => set_address getChainFactoryAddress => chain_factories getTokenHandlerAddress => token_handlers getDeployCost => deploy_cost From b6f777fb90ce41268fe5280520c2009ee8670b64 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:02:02 +0200 Subject: [PATCH 6/9] Phase three fixes + unit tests Signed-off-by: Andrei Baltariu --- chain-factory/src/factory.rs | 19 +++- common/proxies/src/chain_factory_proxy.rs | 3 + common/proxies/src/sovereign_forge_proxy.rs | 3 - sovereign-forge/src/common/utils.rs | 15 ++- sovereign-forge/src/phases.rs | 16 +--- .../tests/sovereign_forge_unit_tests.rs | 96 ++++++++++++++++--- 6 files changed, 122 insertions(+), 30 deletions(-) diff --git a/chain-factory/src/factory.rs b/chain-factory/src/factory.rs index 2bdb30b7..fe1fd1ee 100644 --- a/chain-factory/src/factory.rs +++ b/chain-factory/src/factory.rs @@ -89,18 +89,31 @@ pub trait FactoryModule: only_admin::OnlyAdminModule { #[only_admin] #[endpoint(deployEsdtSafe)] - fn deploy_esdt_safe(&self, is_sovereign_chain: bool) -> ManagedAddress { + fn deploy_esdt_safe( + &self, + is_sovereign_chain: bool, + header_verifier_address: ManagedAddress, + ) -> ManagedAddress { let source_address = self.enshrine_esdt_safe_template().get(); let metadata = self.blockchain().get_code_metadata(&source_address); - self.tx() + let esdt_safe_address = self + .tx() .typed(EsdtSafeProxy) .init(is_sovereign_chain) .gas(60_000_000) .from_source(source_address) .code_metadata(metadata) .returns(ReturnsNewManagedAddress) - .sync_call() + .sync_call(); + + self.tx() + .to(header_verifier_address) + .typed(HeaderverifierProxy) + .set_esdt_safe_address(&esdt_safe_address) + .sync_call(); + + esdt_safe_address } #[only_admin] diff --git a/common/proxies/src/chain_factory_proxy.rs b/common/proxies/src/chain_factory_proxy.rs index 49c06a19..f586d96c 100644 --- a/common/proxies/src/chain_factory_proxy.rs +++ b/common/proxies/src/chain_factory_proxy.rs @@ -156,14 +156,17 @@ where pub fn deploy_esdt_safe< Arg0: ProxyArg, + Arg1: ProxyArg>, >( self, is_sovereign_chain: Arg0, + header_verifier_address: Arg1, ) -> TxTypedCall> { self.wrapped_tx .payment(NotPayable) .raw_call("deployEsdtSafe") .argument(&is_sovereign_chain) + .argument(&header_verifier_address) .original_result() } diff --git a/common/proxies/src/sovereign_forge_proxy.rs b/common/proxies/src/sovereign_forge_proxy.rs index de7a16f9..541dc8a3 100644 --- a/common/proxies/src/sovereign_forge_proxy.rs +++ b/common/proxies/src/sovereign_forge_proxy.rs @@ -162,17 +162,14 @@ where pub fn deploy_phase_three< Arg0: ProxyArg, - Arg1: ProxyArg>, >( self, is_sovereign_chain: Arg0, - header_verifier_address: Arg1, ) -> TxTypedCall { self.wrapped_tx .payment(NotPayable) .raw_call("deployPhaseThree") .argument(&is_sovereign_chain) - .argument(&header_verifier_address) .original_result() } diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index b4e8e3af..9f210533 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -40,7 +40,10 @@ pub enum ScArray { #[multiversx_sc::module] pub trait UtilsModule: super::storage::StorageModule { fn require_phase_two_completed(&self, caller: &ManagedAddress) { - self.is_contract_deployed(caller, ScArray::HeaderVerifier); + require!( + self.is_contract_deployed(caller, ScArray::HeaderVerifier), + "The Header-Verifier SC is not deployed, you skipped the second phase" + ); } fn require_phase_1_completed(&self, caller: &ManagedAddress) { @@ -67,6 +70,16 @@ pub trait UtilsModule: super::storage::StorageModule { .any(|sc| sc.id == sc_id) } + fn get_contract_address(&self, caller: &ManagedAddress, sc_id: ScArray) -> ManagedAddress { + let chain_id = self.sovereigns_mapper(caller).get(); + + self.sovereign_deployed_contracts(&chain_id) + .iter() + .find(|sc| sc.id == sc_id) + .unwrap() + .address + } + fn generate_chain_id(&self) -> ManagedBuffer { loop { let new_chain_id = self.generated_random_4_char_string(); diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 97cf5ff0..26c23bf0 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -109,19 +109,17 @@ pub trait PhasesModule: } #[endpoint(deployPhaseThree)] - fn deploy_phase_three( - &self, - is_sovereign_chain: bool, - header_verifier_address: ManagedAddress, - ) { + fn deploy_phase_three(&self, is_sovereign_chain: bool) { let caller = self.blockchain().get_caller(); self.require_phase_two_completed(&caller); require!( !self.is_contract_deployed(&caller, ScArray::ESDTSafe), - "The ESDT-Safe contract is already deployed" + "The ESDT-Safe SC is already deployed" ); + let header_verifier_address = self.get_contract_address(&caller, ScArray::HeaderVerifier); + let esdt_safe_address = self.deploy_esdt_safe(is_sovereign_chain, header_verifier_address.clone()); @@ -130,12 +128,6 @@ pub trait PhasesModule: self.sovereign_deployed_contracts(&self.sovereigns_mapper(&caller).get()) .insert(esdt_safe_contract_info); - - self.tx() - .to(header_verifier_address) - .typed(HeaderverifierProxy) - .set_esdt_safe_address(esdt_safe_address.clone()) - .sync_call(); } #[endpoint(setAddress)] diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs index baf067a3..ebcf2967 100644 --- a/sovereign-forge/tests/sovereign_forge_unit_tests.rs +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -267,22 +267,14 @@ impl SovereignForgeTestState { } } - fn deploy_phase_three( - &mut self, - is_sovereign_chain: bool, - header_verifier_address: &TestSCAddress, - expect_error: Option, - ) { + fn deploy_phase_three(&mut self, is_sovereign_chain: bool, expect_error: Option) { let transaction = self .world .tx() .from(OWNER_ADDRESS) .to(FORGE_ADDRESS) .typed(SovereignForgeProxy) - .deploy_phase_three( - is_sovereign_chain, - header_verifier_address.to_managed_address(), - ); + .deploy_phase_three(is_sovereign_chain); if let Some(error) = expect_error { transaction.returns(error).run(); @@ -544,6 +536,53 @@ fn deploy_phase_two_header_already_deployed() { ); } +#[test] +fn deploy_phase_three() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.deploy_chain_factory(); + state.deploy_chain_config_template(); + state.finish_setup(); + + let deploy_cost = BigUint::from(100_000u32); + + state.deploy_phase_one( + &deploy_cost, + 1, + 2, + BigUint::from(2u32), + MultiValueEncoded::new(), + None, + ); + + state.deploy_header_verifier_template(); + state.deploy_esdt_safe_template(); + + let mut bls_keys = MultiValueEncoded::new(); + bls_keys.push(ManagedBuffer::from("bls1")); + bls_keys.push(ManagedBuffer::from("bls2")); + + state.deploy_phase_two(None, &bls_keys); + state.deploy_phase_three(false, None); +} + +#[test] +fn deploy_phase_three_without_phase_one() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.deploy_chain_factory(); + state.deploy_chain_config_template(); + state.finish_setup(); + + state.deploy_phase_three( + false, + Some(ExpectError( + 4, + "The Header-Verifier SC is not deployed, you skipped the second phase", + )), + ); +} + #[test] fn deploy_phase_three_without_phase_two() { let mut state = SovereignForgeTestState::new(); @@ -566,10 +605,45 @@ fn deploy_phase_three_without_phase_two() { state.deploy_header_verifier_template(); state.deploy_esdt_safe_template(); + state.deploy_phase_three( + false, + Some(ExpectError( + 4, + "The Header-Verifier SC is not deployed, you skipped the second phase", + )), + ); +} + +#[test] +fn deploy_phase_three_already_deployed() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.deploy_chain_factory(); + state.deploy_chain_config_template(); + state.finish_setup(); + + let deploy_cost = BigUint::from(100_000u32); + + state.deploy_phase_one( + &deploy_cost, + 1, + 2, + BigUint::from(2u32), + MultiValueEncoded::new(), + None, + ); + + state.deploy_header_verifier_template(); + state.deploy_esdt_safe_template(); + let mut bls_keys = MultiValueEncoded::new(); bls_keys.push(ManagedBuffer::from("bls1")); bls_keys.push(ManagedBuffer::from("bls2")); state.deploy_phase_two(None, &bls_keys); - state.deploy_phase_three(false, &HEADER_VERIFIER_ADDRESS, None); + state.deploy_phase_three(false, None); + state.deploy_phase_three( + false, + Some(ExpectError(4, "The ESDT-Safe SC is already deployed")), + ); } From fc75117f1cc332cd99d2912d997647b4429e227a Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:16:16 +0200 Subject: [PATCH 7/9] Added reference for `ManagedAddress` Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/sc_deploy.rs | 2 +- sovereign-forge/src/phases.rs | 16 +--------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/sovereign-forge/src/common/sc_deploy.rs b/sovereign-forge/src/common/sc_deploy.rs index a5b6bb05..95259150 100644 --- a/sovereign-forge/src/common/sc_deploy.rs +++ b/sovereign-forge/src/common/sc_deploy.rs @@ -40,7 +40,7 @@ pub trait ScDeployModule: super::utils::UtilsModule + super::storage::StorageMod fn deploy_esdt_safe( &self, is_sovereign_chain: bool, - header_verifier_address: ManagedAddress, + header_verifier_address: &ManagedAddress, ) -> ManagedAddress { self.tx() .to(self.get_chain_factory_address()) diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 26c23bf0..de237af3 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -120,8 +120,7 @@ pub trait PhasesModule: let header_verifier_address = self.get_contract_address(&caller, ScArray::HeaderVerifier); - let esdt_safe_address = - self.deploy_esdt_safe(is_sovereign_chain, header_verifier_address.clone()); + let esdt_safe_address = self.deploy_esdt_safe(is_sovereign_chain, &header_verifier_address); let esdt_safe_contract_info = ContractInfo::new(ScArray::ESDTSafe, esdt_safe_address.clone()); @@ -129,17 +128,4 @@ pub trait PhasesModule: self.sovereign_deployed_contracts(&self.sovereigns_mapper(&caller).get()) .insert(esdt_safe_contract_info); } - - #[endpoint(setAddress)] - fn set_address( - &self, - esdt_safe_address: ManagedAddress, - header_verifier_address: ManagedAddress, - ) { - self.tx() - .to(header_verifier_address) - .typed(HeaderverifierProxy) - .set_esdt_safe_address(esdt_safe_address) - .sync_call(); - } } From 60d19a3e58f578d16cacdd168f4609dee79ce6c2 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:19:30 +0200 Subject: [PATCH 8/9] Built + proxy regen Signed-off-by: Andrei Baltariu --- common/proxies/src/sovereign_forge_proxy.rs | 16 ---------------- .../wasm-sovereign-forge-full/src/lib.rs | 5 ++--- sovereign-forge/wasm/src/lib.rs | 5 ++--- 3 files changed, 4 insertions(+), 22 deletions(-) diff --git a/common/proxies/src/sovereign_forge_proxy.rs b/common/proxies/src/sovereign_forge_proxy.rs index 541dc8a3..d45bf090 100644 --- a/common/proxies/src/sovereign_forge_proxy.rs +++ b/common/proxies/src/sovereign_forge_proxy.rs @@ -173,22 +173,6 @@ where .original_result() } - pub fn set_address< - Arg0: ProxyArg>, - Arg1: ProxyArg>, - >( - self, - esdt_safe_address: Arg0, - header_verifier_address: Arg1, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("setAddress") - .argument(&esdt_safe_address) - .argument(&header_verifier_address) - .original_result() - } - pub fn chain_factories< Arg0: ProxyArg, >( diff --git a/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs b/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs index 14450194..07331b22 100644 --- a/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs +++ b/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 11 +// Endpoints: 10 // Async Callback (empty): 1 -// Total number of exported functions: 14 +// Total number of exported functions: 13 #![no_std] @@ -26,7 +26,6 @@ multiversx_sc_wasm_adapter::endpoints! { deployPhaseOne => deploy_phase_one deployPhaseTwo => deploy_phase_two deployPhaseThree => deploy_phase_three - setAddress => set_address getChainFactoryAddress => chain_factories getTokenHandlerAddress => token_handlers getDeployCost => deploy_cost diff --git a/sovereign-forge/wasm/src/lib.rs b/sovereign-forge/wasm/src/lib.rs index 14450194..07331b22 100644 --- a/sovereign-forge/wasm/src/lib.rs +++ b/sovereign-forge/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 11 +// Endpoints: 10 // Async Callback (empty): 1 -// Total number of exported functions: 14 +// Total number of exported functions: 13 #![no_std] @@ -26,7 +26,6 @@ multiversx_sc_wasm_adapter::endpoints! { deployPhaseOne => deploy_phase_one deployPhaseTwo => deploy_phase_two deployPhaseThree => deploy_phase_three - setAddress => set_address getChainFactoryAddress => chain_factories getTokenHandlerAddress => token_handlers getDeployCost => deploy_cost From 7e7ac8fc8d200a7e640698c2b70752b547125888 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:22:39 +0200 Subject: [PATCH 9/9] Removed unused import Signed-off-by: Andrei Baltariu --- sovereign-forge/src/phases.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index de237af3..4fc4e3a7 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -1,6 +1,5 @@ use crate::err_msg; use core::ops::Deref; -use proxies::header_verifier_proxy::HeaderverifierProxy; use transaction::StakeMultiArg; use multiversx_sc::{require, types::MultiValueEncoded};