From f487641e7e35393138daed69f1b2f167c039553f Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 25 Nov 2024 13:41:26 +0200 Subject: [PATCH 01/87] Removed bridge module Signed-off-by: Andrei Baltariu --- chain-config/src/bridge.rs | 40 -------------------------------------- chain-config/src/lib.rs | 3 +-- 2 files changed, 1 insertion(+), 42 deletions(-) delete mode 100644 chain-config/src/bridge.rs diff --git a/chain-config/src/bridge.rs b/chain-config/src/bridge.rs deleted file mode 100644 index 5af92cae..00000000 --- a/chain-config/src/bridge.rs +++ /dev/null @@ -1,40 +0,0 @@ -multiversx_sc::imports!(); - -mod bridge_proxy { - multiversx_sc::imports!(); - - #[multiversx_sc::proxy] - pub trait BridgeProxy { - #[init] - fn init(&self, min_valid_signers: u32, signers: MultiValueEncoded); - } -} - -#[multiversx_sc::module] -pub trait BridgeModule { - #[only_owner] - #[endpoint(deployBridge)] - fn deploy_bridge( - &self, - code: ManagedBuffer, - min_valid_signers: u32, - signers: MultiValueEncoded, - ) { - require!(self.bridge_address().is_empty(), "Bridge already deployed"); - - let metadata = - CodeMetadata::PAYABLE_BY_SC | CodeMetadata::UPGRADEABLE | CodeMetadata::READABLE; - let (sc_address, _) = self - .bridge_proxy() - .init(min_valid_signers, signers) - .deploy_contract::(&code, metadata); - - self.bridge_address().set(sc_address); - } - - #[proxy] - fn bridge_proxy(&self) -> bridge_proxy::Proxy; - - #[storage_mapper("bridgeAddress")] - fn bridge_address(&self) -> SingleValueMapper; -} diff --git a/chain-config/src/lib.rs b/chain-config/src/lib.rs index 7850e21b..c27c243b 100644 --- a/chain-config/src/lib.rs +++ b/chain-config/src/lib.rs @@ -6,12 +6,11 @@ use validator_rules::TokenIdAmountPair; multiversx_sc::imports!(); -pub mod bridge; pub mod validator_rules; #[multiversx_sc::contract] pub trait ChainConfigContract: - bridge::BridgeModule + validator_rules::ValidatorRulesModule + only_admin::OnlyAdminModule + validator_rules::ValidatorRulesModule + only_admin::OnlyAdminModule { #[init] fn init( From 3aedf9e4645d6cea82cb0f13f07d8185cb21c405 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 25 Nov 2024 14:21:36 +0200 Subject: [PATCH 02/87] Added `update_config` endpoint Signed-off-by: Andrei Baltariu --- chain-config/src/lib.rs | 29 +++++++++++++++++++ chain-config/src/validator_rules.rs | 1 + .../wasm-chain-config-full/src/lib.rs | 5 ++-- chain-config/wasm/src/lib.rs | 5 ++-- common/proxies/src/chain_config_proxy.rs | 19 ------------ 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/chain-config/src/lib.rs b/chain-config/src/lib.rs index c27c243b..5a0ce52c 100644 --- a/chain-config/src/lib.rs +++ b/chain-config/src/lib.rs @@ -41,6 +41,35 @@ pub trait ChainConfigContract: self.additional_stake_required().set(additional_stake_vec); } + #[only_admin] + fn update_config( + &self, + opt_min_validators: Option, + opt_max_validators: Option, + opt_min_stake: Option, + opt_additional_stake_required: Option>>, + ) { + if let Some(min_validators) = opt_min_validators { + self.min_validators().set(min_validators); + } + if let Some(max_validators) = opt_max_validators { + self.max_validators().set(max_validators); + } + if let Some(min_stake) = opt_min_stake { + self.min_stake().set(min_stake); + } + if let Some(additional_stake_required) = opt_additional_stake_required { + let mut additional_stake_vec = ManagedVec::new(); + for multi_value in additional_stake_required { + let (token_id, amount) = multi_value.into_tuple(); + let value = TokenIdAmountPair { token_id, amount }; + + additional_stake_vec.push(value); + } + self.additional_stake_required().set(additional_stake_vec); + } + } + #[upgrade] fn upgrade(&self) {} } diff --git a/chain-config/src/validator_rules.rs b/chain-config/src/validator_rules.rs index f6b850fb..798602de 100644 --- a/chain-config/src/validator_rules.rs +++ b/chain-config/src/validator_rules.rs @@ -26,6 +26,7 @@ pub trait ValidatorRulesModule { #[storage_mapper("minStake")] fn min_stake(&self) -> SingleValueMapper; + // NOTE: ManagedVec or MultiValueEncoded ? // TODO: Read user stake and verify #[view(getAdditionalStakeRequired)] #[storage_mapper("additionalStakeRequired")] diff --git a/chain-config/wasm-chain-config-full/src/lib.rs b/chain-config/wasm-chain-config-full/src/lib.rs index b69bd79d..f5ed49af 100644 --- a/chain-config/wasm-chain-config-full/src/lib.rs +++ b/chain-config/wasm-chain-config-full/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 10 +// Endpoints: 9 // Async Callback (empty): 1 -// Total number of exported functions: 13 +// Total number of exported functions: 12 #![no_std] @@ -20,7 +20,6 @@ multiversx_sc_wasm_adapter::endpoints! { ( init => init upgrade => upgrade - deployBridge => deploy_bridge getMinValidators => min_validators getMaxValidators => max_validators getMinStake => min_stake diff --git a/chain-config/wasm/src/lib.rs b/chain-config/wasm/src/lib.rs index b69bd79d..f5ed49af 100644 --- a/chain-config/wasm/src/lib.rs +++ b/chain-config/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 10 +// Endpoints: 9 // Async Callback (empty): 1 -// Total number of exported functions: 13 +// Total number of exported functions: 12 #![no_std] @@ -20,7 +20,6 @@ multiversx_sc_wasm_adapter::endpoints! { ( init => init upgrade => upgrade - deployBridge => deploy_bridge getMinValidators => min_validators getMaxValidators => max_validators getMinStake => min_stake diff --git a/common/proxies/src/chain_config_proxy.rs b/common/proxies/src/chain_config_proxy.rs index ed5e1468..9e676c53 100644 --- a/common/proxies/src/chain_config_proxy.rs +++ b/common/proxies/src/chain_config_proxy.rs @@ -97,25 +97,6 @@ where To: TxTo, Gas: TxGas, { - pub fn deploy_bridge< - Arg0: ProxyArg>, - Arg1: ProxyArg, - Arg2: ProxyArg>>, - >( - self, - code: Arg0, - min_valid_signers: Arg1, - signers: Arg2, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("deployBridge") - .argument(&code) - .argument(&min_valid_signers) - .argument(&signers) - .original_result() - } - pub fn min_validators( self, ) -> TxTypedCall { From 03267f8423b64467f9be74e769dccdd6f8893607 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 25 Nov 2024 14:31:59 +0200 Subject: [PATCH 03/87] Added endpoint to finish setup_phase Signed-off-by: Andrei Baltariu --- Cargo.lock | 1 + chain-config/Cargo.toml | 3 +++ chain-config/src/lib.rs | 11 ++++++++++- chain-config/src/validator_rules.rs | 19 +++++++++++++++++++ .../wasm-chain-config-full/Cargo.lock | 8 ++++++++ .../wasm-chain-config-view/Cargo.lock | 8 ++++++++ chain-config/wasm/Cargo.lock | 8 ++++++++ common/setup-phase/src/lib.rs | 8 ++++++++ 8 files changed, 65 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 46e0b6ef..0a27360b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -234,6 +234,7 @@ dependencies = [ "multiversx-sc-modules", "multiversx-sc-scenario", "num-bigint", + "setup-phase", "transaction", ] diff --git a/chain-config/Cargo.toml b/chain-config/Cargo.toml index 9b0a1e78..46881cb9 100644 --- a/chain-config/Cargo.toml +++ b/chain-config/Cargo.toml @@ -22,3 +22,6 @@ version = "=0.54.4" [dependencies.transaction] path = "../common/transaction" + +[dependencies.setup-phase] +path = "../common/setup-phase" diff --git a/chain-config/src/lib.rs b/chain-config/src/lib.rs index 5a0ce52c..fa017261 100644 --- a/chain-config/src/lib.rs +++ b/chain-config/src/lib.rs @@ -10,7 +10,7 @@ pub mod validator_rules; #[multiversx_sc::contract] pub trait ChainConfigContract: - validator_rules::ValidatorRulesModule + only_admin::OnlyAdminModule + validator_rules::ValidatorRulesModule + only_admin::OnlyAdminModule + setup_phase::SetupPhaseModule { #[init] fn init( @@ -70,6 +70,15 @@ pub trait ChainConfigContract: } } + #[only_owner] + fn complete_setup_phase(&self) { + self.require_setup_not_complete(); + self.require_config_set(); + // validator set in header verifier + // change ownership to header-verifier + // update setup_phase_complete + } + #[upgrade] fn upgrade(&self) {} } diff --git a/chain-config/src/validator_rules.rs b/chain-config/src/validator_rules.rs index 798602de..334f5392 100644 --- a/chain-config/src/validator_rules.rs +++ b/chain-config/src/validator_rules.rs @@ -13,6 +13,25 @@ pub struct TokenIdAmountPair { #[multiversx_sc::module] pub trait ValidatorRulesModule { + fn require_config_set(&self) { + require!( + !self.min_validators().is_empty(), + "The minimum number of validators is not set" + ); + require!( + !self.max_validators().is_empty(), + "The maximum number of validators is not set" + ); + require!( + !self.min_stake().is_empty(), + "The mininum number of stake is not set" + ); + require!( + !self.additional_stake_required().is_empty(), + "The additional stake criteria is not set" + ); + } + #[view(getMinValidators)] #[storage_mapper("minValidators")] fn min_validators(&self) -> SingleValueMapper; diff --git a/chain-config/wasm-chain-config-full/Cargo.lock b/chain-config/wasm-chain-config-full/Cargo.lock index c7ac6df5..f911435a 100644 --- a/chain-config/wasm-chain-config-full/Cargo.lock +++ b/chain-config/wasm-chain-config-full/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] @@ -180,6 +181,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/chain-config/wasm-chain-config-view/Cargo.lock b/chain-config/wasm-chain-config-view/Cargo.lock index 00b5eb9b..50e98a22 100644 --- a/chain-config/wasm-chain-config-view/Cargo.lock +++ b/chain-config/wasm-chain-config-view/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] @@ -180,6 +181,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/chain-config/wasm/Cargo.lock b/chain-config/wasm/Cargo.lock index f970c06a..c19e95ee 100644 --- a/chain-config/wasm/Cargo.lock +++ b/chain-config/wasm/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] @@ -180,6 +181,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/common/setup-phase/src/lib.rs b/common/setup-phase/src/lib.rs index 9d1dcbfa..60385d6e 100644 --- a/common/setup-phase/src/lib.rs +++ b/common/setup-phase/src/lib.rs @@ -16,6 +16,14 @@ pub trait SetupPhaseModule { require!(self.is_setup_phase_complete(), "The setup is not completed"); } + #[inline] + fn require_setup_not_complete(&self) { + require!( + !self.is_setup_phase_complete(), + "The setup phase is already completed" + ); + } + #[inline] fn is_setup_phase_complete(&self) -> bool { self.setup_phase_complete().get() From 5fe6ad85e426e470533c98eeee2d762502584420 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 25 Nov 2024 14:58:25 +0200 Subject: [PATCH 04/87] Added endpoint to deploy esdt_safe Signed-off-by: Andrei Baltariu --- chain-factory/src/factory.rs | 17 +++++++++++++++++ .../wasm-chain-factory-full/Cargo.lock | 8 ++++++++ .../wasm-chain-factory-full/src/lib.rs | 5 +++-- .../wasm-chain-factory-view/Cargo.lock | 8 ++++++++ chain-factory/wasm/Cargo.lock | 8 ++++++++ chain-factory/wasm/src/lib.rs | 5 +++-- common/proxies/src/chain_factory_proxy.rs | 13 +++++++++++++ 7 files changed, 60 insertions(+), 4 deletions(-) diff --git a/chain-factory/src/factory.rs b/chain-factory/src/factory.rs index 1c75fd24..76cb1c81 100644 --- a/chain-factory/src/factory.rs +++ b/chain-factory/src/factory.rs @@ -2,6 +2,7 @@ use multiversx_sc::imports::*; use proxies::{ chain_config_proxy::ChainConfigContractProxy, enshrine_esdt_safe_proxy::EnshrineEsdtSafeProxy, + esdt_safe_proxy::EsdtSafeProxy, fee_market_proxy::{FeeMarketProxy, FeeStruct}, header_verifier_proxy::HeaderverifierProxy, }; @@ -58,6 +59,22 @@ pub trait FactoryModule { .sync_call() } + #[only_owner] + #[endpoint(deployEsdtSafe)] + fn deploy_esdt_safe(&self, is_sovereign_chain: bool) -> ManagedAddress { + let source_address = self.enshrine_esdt_safe_template().get(); + let metadata = self.blockchain().get_code_metadata(&source_address); + + self.tx() + .typed(EsdtSafeProxy) + .init(is_sovereign_chain) + .gas(60_000_000) + .from_source(source_address) + .code_metadata(metadata) + .returns(ReturnsNewManagedAddress) + .sync_call() + } + #[only_owner] #[endpoint(deployEnshrineEsdtSafe)] fn deploy_enshrine_esdt_safe( diff --git a/chain-factory/wasm-chain-factory-full/Cargo.lock b/chain-factory/wasm-chain-factory-full/Cargo.lock index 7954fee4..a749ee84 100644 --- a/chain-factory/wasm-chain-factory-full/Cargo.lock +++ b/chain-factory/wasm-chain-factory-full/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] @@ -201,6 +202,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/chain-factory/wasm-chain-factory-full/src/lib.rs b/chain-factory/wasm-chain-factory-full/src/lib.rs index d16f290b..d842e5b7 100644 --- a/chain-factory/wasm-chain-factory-full/src/lib.rs +++ b/chain-factory/wasm-chain-factory-full/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 5 +// Endpoints: 6 // Async Callback (empty): 1 -// Total number of exported functions: 8 +// Total number of exported functions: 9 #![no_std] @@ -22,6 +22,7 @@ multiversx_sc_wasm_adapter::endpoints! { upgrade => upgrade deploySovereignChainConfigContract => deploy_sovereign_chain_config_contract deployHeaderVerifier => deploy_header_verifier + deployEsdtSafe => deploy_esdt_safe deployEnshrineEsdtSafe => deploy_enshrine_esdt_safe deployFeeMarket => deploy_fee_market completeSetupPhase => complete_setup_phase diff --git a/chain-factory/wasm-chain-factory-view/Cargo.lock b/chain-factory/wasm-chain-factory-view/Cargo.lock index 781f80ab..e9c5979e 100644 --- a/chain-factory/wasm-chain-factory-view/Cargo.lock +++ b/chain-factory/wasm-chain-factory-view/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] @@ -201,6 +202,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/chain-factory/wasm/Cargo.lock b/chain-factory/wasm/Cargo.lock index f27d1568..0042b9a2 100644 --- a/chain-factory/wasm/Cargo.lock +++ b/chain-factory/wasm/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] @@ -201,6 +202,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/chain-factory/wasm/src/lib.rs b/chain-factory/wasm/src/lib.rs index d16f290b..d842e5b7 100644 --- a/chain-factory/wasm/src/lib.rs +++ b/chain-factory/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 5 +// Endpoints: 6 // Async Callback (empty): 1 -// Total number of exported functions: 8 +// Total number of exported functions: 9 #![no_std] @@ -22,6 +22,7 @@ multiversx_sc_wasm_adapter::endpoints! { upgrade => upgrade deploySovereignChainConfigContract => deploy_sovereign_chain_config_contract deployHeaderVerifier => deploy_header_verifier + deployEsdtSafe => deploy_esdt_safe deployEnshrineEsdtSafe => deploy_enshrine_esdt_safe deployFeeMarket => deploy_fee_market completeSetupPhase => complete_setup_phase diff --git a/common/proxies/src/chain_factory_proxy.rs b/common/proxies/src/chain_factory_proxy.rs index 87fa8164..1e9d453e 100644 --- a/common/proxies/src/chain_factory_proxy.rs +++ b/common/proxies/src/chain_factory_proxy.rs @@ -129,6 +129,19 @@ where .original_result() } + pub fn deploy_esdt_safe< + Arg0: ProxyArg, + >( + self, + is_sovereign_chain: Arg0, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("deployEsdtSafe") + .argument(&is_sovereign_chain) + .original_result() + } + pub fn deploy_enshrine_esdt_safe< Arg0: ProxyArg, Arg1: ProxyArg>, From 0d251bf7db20bfb5d8b879c953ec03f1febb2afa Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 25 Nov 2024 14:58:43 +0200 Subject: [PATCH 05/87] Added functions to deploy esdt-safe and header-verifier Signed-off-by: Andrei Baltariu --- sovereign-forge/src/phases.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index ab871fb3..4f393a6f 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -117,4 +117,30 @@ pub trait PhasesModule: .returns(ReturnsResult) .sync_call() } + + fn deploy_header_verifier( + &self, + chain_factory_address: ManagedAddress, + bls_keys: MultiValueEncoded, + ) -> ManagedAddress { + self.tx() + .to(chain_factory_address) + .typed(ChainFactoryContractProxy) + .deploy_header_verifier(bls_keys) + .returns(ReturnsResult) + .sync_call() + } + + fn deploy_esdt_safe( + &self, + chain_factory_address: ManagedAddress, + is_sovereign_chain: bool, + ) -> ManagedAddress { + self.tx() + .to(chain_factory_address) + .typed(ChainFactoryContractProxy) + .deploy_esdt_safe(is_sovereign_chain) + .returns(ReturnsResult) + .sync_call() + } } From ed0de2885d4f65ff6985bcdcba9d5261570d7409 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 25 Nov 2024 15:13:28 +0200 Subject: [PATCH 06/87] Added `complete_phases` module for chain-factory SC Signed-off-by: Andrei Baltariu --- chain-factory/src/complete_phases.rs | 14 ++++++++++++++ chain-factory/src/lib.rs | 5 ++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 chain-factory/src/complete_phases.rs diff --git a/chain-factory/src/complete_phases.rs b/chain-factory/src/complete_phases.rs new file mode 100644 index 00000000..47fb5c45 --- /dev/null +++ b/chain-factory/src/complete_phases.rs @@ -0,0 +1,14 @@ +#[multiversx_sc::module] +pub trait CompletePhasesModule { + #[endpoint(completeChainConfigSetup)] + fn complete_chain_config_setup(&self) {} + + #[endpoint(completeHeaderVerifierSetup)] + fn complete_header_verifier_setup(&self) {} + + #[endpoint(completeFeeMarketSetup)] + fn complete_fee_market_setup(&self) {} + + #[endpoint(completeEsdtSafeSetup)] + fn complete_esdt_safe_setup(&self) {} +} diff --git a/chain-factory/src/lib.rs b/chain-factory/src/lib.rs index 281f7bce..82eb3d75 100644 --- a/chain-factory/src/lib.rs +++ b/chain-factory/src/lib.rs @@ -2,10 +2,13 @@ multiversx_sc::imports!(); +pub mod complete_phases; pub mod factory; #[multiversx_sc::contract] -pub trait ChainFactoryContract: factory::FactoryModule + utils::UtilsModule { +pub trait ChainFactoryContract: + factory::FactoryModule + complete_phases::CompletePhasesModule + utils::UtilsModule +{ #[init] fn init( &self, From 9388b08b02d5d45d414a320a3dfa6db1aee0d3e7 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 26 Nov 2024 11:46:43 +0200 Subject: [PATCH 07/87] Added empty `deploy_phase_two` endpoint Signed-off-by: Andrei Baltariu --- sovereign-forge/src/phases.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 4f393a6f..dd857cd1 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -97,6 +97,13 @@ pub trait PhasesModule: sovereigns_mapper.set(chain_contracts_map); } + #[endpoint(deployPhaseTwo)] + fn deploy_phase_two(&self) { + // check chain config was deployed && header was not + // deploy header + // update mapper + } + fn deploy_chain_config( &self, chain_factory_address: ManagedAddress, From 49ea528c5c094d1bd717898d86fb7bdff8fd20fe Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 26 Nov 2024 11:54:41 +0200 Subject: [PATCH 08/87] Added `chain-factory` as dependency Signed-off-by: Andrei Baltariu --- Cargo.lock | 1 + sovereign-forge/Cargo.toml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 0a27360b..ca19ee36 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2125,6 +2125,7 @@ dependencies = [ name = "sovereign-forge" version = "0.0.0" dependencies = [ + "chain-factory", "multiversx-sc", "multiversx-sc-modules", "multiversx-sc-scenario", diff --git a/sovereign-forge/Cargo.toml b/sovereign-forge/Cargo.toml index 229555aa..312f95f7 100644 --- a/sovereign-forge/Cargo.toml +++ b/sovereign-forge/Cargo.toml @@ -20,6 +20,9 @@ version = "=0.54.4" [dependencies.multiversx-sc-modules] version = "=0.54.4" +[dependencies.chain-factory] +path = "../chain-factory" + [dependencies.proxies] path = "../common/proxies" From 219c8581357625dd73ab3711e5dd895e8d7e49c1 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 26 Nov 2024 12:06:07 +0200 Subject: [PATCH 09/87] Regenerated proxy and added export for sovereign forge Signed-off-by: Andrei Baltariu --- common/proxies/src/chain_factory_proxy.rs | 36 +++++++++++++++++++++ common/proxies/src/lib.rs | 1 + common/proxies/src/sovereign_forge_proxy.rs | 9 ++++++ 3 files changed, 46 insertions(+) diff --git a/common/proxies/src/chain_factory_proxy.rs b/common/proxies/src/chain_factory_proxy.rs index 1e9d453e..652af977 100644 --- a/common/proxies/src/chain_factory_proxy.rs +++ b/common/proxies/src/chain_factory_proxy.rs @@ -192,4 +192,40 @@ where .argument(&_contract_address) .original_result() } + + pub fn complete_chain_config_setup( + self, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("completeChainConfigSetup") + .original_result() + } + + pub fn complete_header_verifier_setup( + self, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("completeHeaderVerifierSetup") + .original_result() + } + + pub fn complete_fee_market_setup( + self, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("completeFeeMarketSetup") + .original_result() + } + + pub fn complete_esdt_safe_setup( + self, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("completeEsdtSafeSetup") + .original_result() + } } diff --git a/common/proxies/src/lib.rs b/common/proxies/src/lib.rs index a7bb5a6d..1773a27d 100644 --- a/common/proxies/src/lib.rs +++ b/common/proxies/src/lib.rs @@ -5,5 +5,6 @@ pub mod enshrine_esdt_safe_proxy; pub mod esdt_safe_proxy; pub mod fee_market_proxy; pub mod header_verifier_proxy; +pub mod sovereign_forge_proxy; pub mod testing_sc_proxy; pub mod token_handler_proxy; diff --git a/common/proxies/src/sovereign_forge_proxy.rs b/common/proxies/src/sovereign_forge_proxy.rs index 77ca1418..9d0a8c46 100644 --- a/common/proxies/src/sovereign_forge_proxy.rs +++ b/common/proxies/src/sovereign_forge_proxy.rs @@ -147,6 +147,15 @@ where .original_result() } + pub fn deploy_phase_two( + self, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("deployPhaseTwo") + .original_result() + } + pub fn deploy_cost( self, ) -> TxTypedCall> { From 7425469acce120fc5211520a7ccac1be53c00cf3 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 26 Nov 2024 16:32:12 +0200 Subject: [PATCH 10/87] Added views + build + proxy regen Signed-off-by: Andrei Baltariu --- .../wasm-chain-factory-full/src/lib.rs | 8 +++-- chain-factory/wasm/src/lib.rs | 8 +++-- common/proxies/src/sovereign_forge_proxy.rs | 26 ++++++++++++++++ .../wasm-enshrine-esdt-safe-full/Cargo.lock | 1 + .../wasm-enshrine-esdt-safe-view/Cargo.lock | 1 + enshrine-esdt-safe/wasm/Cargo.lock | 1 + sovereign-forge/src/common/storage.rs | 2 ++ sovereign-forge/src/lib.rs | 4 +-- .../wasm-sovereign-forge-full/Cargo.lock | 30 +++++++++++++++++++ .../wasm-sovereign-forge-full/src/lib.rs | 7 +++-- .../wasm-soveriegn-forge-view/Cargo.lock | 30 +++++++++++++++++++ sovereign-forge/wasm/Cargo.lock | 30 +++++++++++++++++++ sovereign-forge/wasm/src/lib.rs | 7 +++-- .../wasm-token-handler-full/Cargo.lock | 8 +++++ .../wasm-token-handler-view/Cargo.lock | 8 +++++ token-handler/wasm/Cargo.lock | 8 +++++ 16 files changed, 169 insertions(+), 10 deletions(-) diff --git a/chain-factory/wasm-chain-factory-full/src/lib.rs b/chain-factory/wasm-chain-factory-full/src/lib.rs index d842e5b7..b6c04a84 100644 --- a/chain-factory/wasm-chain-factory-full/src/lib.rs +++ b/chain-factory/wasm-chain-factory-full/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 6 +// Endpoints: 10 // Async Callback (empty): 1 -// Total number of exported functions: 9 +// Total number of exported functions: 13 #![no_std] @@ -26,6 +26,10 @@ multiversx_sc_wasm_adapter::endpoints! { deployEnshrineEsdtSafe => deploy_enshrine_esdt_safe deployFeeMarket => deploy_fee_market completeSetupPhase => complete_setup_phase + completeChainConfigSetup => complete_chain_config_setup + completeHeaderVerifierSetup => complete_header_verifier_setup + completeFeeMarketSetup => complete_fee_market_setup + completeEsdtSafeSetup => complete_esdt_safe_setup ) } diff --git a/chain-factory/wasm/src/lib.rs b/chain-factory/wasm/src/lib.rs index d842e5b7..b6c04a84 100644 --- a/chain-factory/wasm/src/lib.rs +++ b/chain-factory/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 6 +// Endpoints: 10 // Async Callback (empty): 1 -// Total number of exported functions: 9 +// Total number of exported functions: 13 #![no_std] @@ -26,6 +26,10 @@ multiversx_sc_wasm_adapter::endpoints! { deployEnshrineEsdtSafe => deploy_enshrine_esdt_safe deployFeeMarket => deploy_fee_market completeSetupPhase => complete_setup_phase + completeChainConfigSetup => complete_chain_config_setup + completeHeaderVerifierSetup => complete_header_verifier_setup + completeFeeMarketSetup => complete_fee_market_setup + completeEsdtSafeSetup => complete_esdt_safe_setup ) } diff --git a/common/proxies/src/sovereign_forge_proxy.rs b/common/proxies/src/sovereign_forge_proxy.rs index 9d0a8c46..0f2fdd3c 100644 --- a/common/proxies/src/sovereign_forge_proxy.rs +++ b/common/proxies/src/sovereign_forge_proxy.rs @@ -156,6 +156,32 @@ where .original_result() } + pub fn chain_factories< + Arg0: ProxyArg, + >( + self, + shard_id: Arg0, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getChainFactoryAddress") + .argument(&shard_id) + .original_result() + } + + pub fn token_handlers< + Arg0: ProxyArg, + >( + self, + shard_id: Arg0, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getTokenHandlerAddress") + .argument(&shard_id) + .original_result() + } + pub fn deploy_cost( self, ) -> TxTypedCall> { diff --git a/enshrine-esdt-safe/wasm-enshrine-esdt-safe-full/Cargo.lock b/enshrine-esdt-safe/wasm-enshrine-esdt-safe-full/Cargo.lock index 4dcbd30d..11c00cb9 100644 --- a/enshrine-esdt-safe/wasm-enshrine-esdt-safe-full/Cargo.lock +++ b/enshrine-esdt-safe/wasm-enshrine-esdt-safe-full/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] diff --git a/enshrine-esdt-safe/wasm-enshrine-esdt-safe-view/Cargo.lock b/enshrine-esdt-safe/wasm-enshrine-esdt-safe-view/Cargo.lock index 96981f4c..40980dbc 100644 --- a/enshrine-esdt-safe/wasm-enshrine-esdt-safe-view/Cargo.lock +++ b/enshrine-esdt-safe/wasm-enshrine-esdt-safe-view/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] diff --git a/enshrine-esdt-safe/wasm/Cargo.lock b/enshrine-esdt-safe/wasm/Cargo.lock index 97ff1d06..014a999b 100644 --- a/enshrine-esdt-safe/wasm/Cargo.lock +++ b/enshrine-esdt-safe/wasm/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] diff --git a/sovereign-forge/src/common/storage.rs b/sovereign-forge/src/common/storage.rs index 6c8ba251..7ff38cf6 100644 --- a/sovereign-forge/src/common/storage.rs +++ b/sovereign-forge/src/common/storage.rs @@ -10,9 +10,11 @@ pub trait StorageModule { sovereign_creator: &ManagedAddress, ) -> SingleValueMapper>; + #[view(getChainFactoryAddress)] #[storage_mapper("chainFactories")] fn chain_factories(&self, shard_id: u32) -> SingleValueMapper; + #[view(getTokenHandlerAddress)] #[storage_mapper("tokenHadlersFactories")] fn token_handlers(&self, shard_id: u32) -> SingleValueMapper; diff --git a/sovereign-forge/src/lib.rs b/sovereign-forge/src/lib.rs index 5562ec37..d19db2f7 100644 --- a/sovereign-forge/src/lib.rs +++ b/sovereign-forge/src/lib.rs @@ -3,8 +3,8 @@ use crate::err_msg; use multiversx_sc::imports::*; -mod common; -mod phases; +pub mod common; +pub mod phases; #[multiversx_sc::contract] pub trait SovereignForge: diff --git a/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock b/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock index 6a3f603e..d32cf72d 100644 --- a/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock +++ b/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock @@ -20,6 +20,28 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "chain-config" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "multiversx-sc-modules", + "setup-phase", + "transaction", +] + +[[package]] +name = "chain-factory" +version = "0.0.0" +dependencies = [ + "chain-config", + "multiversx-sc", + "multiversx-sc-modules", + "proxies", + "transaction", + "utils", +] + [[package]] name = "endian-type" version = "0.1.2" @@ -189,6 +211,7 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" name = "sovereign-forge" version = "0.0.0" dependencies = [ + "chain-factory", "multiversx-sc", "multiversx-sc-modules", "proxies", @@ -241,3 +264,10 @@ name = "unwrap-infallible" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "151ac09978d3c2862c4e39b557f4eceee2cc72150bc4cb4f16abf061b6e381fb" + +[[package]] +name = "utils" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] diff --git a/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs b/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs index fdaa11c8..e3412be2 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: 6 +// Endpoints: 9 // Async Callback (empty): 1 -// Total number of exported functions: 9 +// Total number of exported functions: 12 #![no_std] @@ -24,6 +24,9 @@ multiversx_sc_wasm_adapter::endpoints! { registerChainFactory => register_chain_factory completeSetupPhase => complete_setup_phase deployPhaseOne => deploy_phase_one + deployPhaseTwo => deploy_phase_two + getChainFactoryAddress => chain_factories + getTokenHandlerAddress => token_handlers getDeployCost => deploy_cost getAllChainIds => chain_ids ) diff --git a/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock b/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock index 2c332060..491130b9 100644 --- a/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock +++ b/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock @@ -20,6 +20,28 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "chain-config" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "multiversx-sc-modules", + "setup-phase", + "transaction", +] + +[[package]] +name = "chain-factory" +version = "0.0.0" +dependencies = [ + "chain-config", + "multiversx-sc", + "multiversx-sc-modules", + "proxies", + "transaction", + "utils", +] + [[package]] name = "endian-type" version = "0.1.2" @@ -189,6 +211,7 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" name = "sovereign-forge" version = "0.0.0" dependencies = [ + "chain-factory", "multiversx-sc", "multiversx-sc-modules", "proxies", @@ -241,3 +264,10 @@ name = "unwrap-infallible" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "151ac09978d3c2862c4e39b557f4eceee2cc72150bc4cb4f16abf061b6e381fb" + +[[package]] +name = "utils" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] diff --git a/sovereign-forge/wasm/Cargo.lock b/sovereign-forge/wasm/Cargo.lock index 8ff48dfb..da12af97 100644 --- a/sovereign-forge/wasm/Cargo.lock +++ b/sovereign-forge/wasm/Cargo.lock @@ -20,6 +20,28 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "chain-config" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "multiversx-sc-modules", + "setup-phase", + "transaction", +] + +[[package]] +name = "chain-factory" +version = "0.0.0" +dependencies = [ + "chain-config", + "multiversx-sc", + "multiversx-sc-modules", + "proxies", + "transaction", + "utils", +] + [[package]] name = "endian-type" version = "0.1.2" @@ -189,6 +211,7 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" name = "sovereign-forge" version = "0.0.0" dependencies = [ + "chain-factory", "multiversx-sc", "multiversx-sc-modules", "proxies", @@ -241,3 +264,10 @@ name = "unwrap-infallible" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "151ac09978d3c2862c4e39b557f4eceee2cc72150bc4cb4f16abf061b6e381fb" + +[[package]] +name = "utils" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] diff --git a/sovereign-forge/wasm/src/lib.rs b/sovereign-forge/wasm/src/lib.rs index fdaa11c8..e3412be2 100644 --- a/sovereign-forge/wasm/src/lib.rs +++ b/sovereign-forge/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 6 +// Endpoints: 9 // Async Callback (empty): 1 -// Total number of exported functions: 9 +// Total number of exported functions: 12 #![no_std] @@ -24,6 +24,9 @@ multiversx_sc_wasm_adapter::endpoints! { registerChainFactory => register_chain_factory completeSetupPhase => complete_setup_phase deployPhaseOne => deploy_phase_one + deployPhaseTwo => deploy_phase_two + getChainFactoryAddress => chain_factories + getTokenHandlerAddress => token_handlers getDeployCost => deploy_cost getAllChainIds => chain_ids ) diff --git a/token-handler/wasm-token-handler-full/Cargo.lock b/token-handler/wasm-token-handler-full/Cargo.lock index de66184c..3e8180cd 100644 --- a/token-handler/wasm-token-handler-full/Cargo.lock +++ b/token-handler/wasm-token-handler-full/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] @@ -193,6 +194,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/token-handler/wasm-token-handler-view/Cargo.lock b/token-handler/wasm-token-handler-view/Cargo.lock index cf375cee..a64c821f 100644 --- a/token-handler/wasm-token-handler-view/Cargo.lock +++ b/token-handler/wasm-token-handler-view/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] @@ -193,6 +194,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/token-handler/wasm/Cargo.lock b/token-handler/wasm/Cargo.lock index 94237b14..4de8926f 100644 --- a/token-handler/wasm/Cargo.lock +++ b/token-handler/wasm/Cargo.lock @@ -26,6 +26,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "multiversx-sc-modules", + "setup-phase", "transaction", ] @@ -193,6 +194,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" From f41524b96a86a5e3f4c06dd2c06866a9dd3e2679 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 26 Nov 2024 16:32:38 +0200 Subject: [PATCH 11/87] Fixed endpoint bug Signed-off-by: Andrei Baltariu --- sovereign-forge/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sovereign-forge/src/lib.rs b/sovereign-forge/src/lib.rs index d19db2f7..bf5551be 100644 --- a/sovereign-forge/src/lib.rs +++ b/sovereign-forge/src/lib.rs @@ -38,7 +38,7 @@ pub trait SovereignForge: "The given address is not a valid SC address" ); - self.token_handlers(shard_id).set(chain_factory_address); + self.chain_factories(shard_id).set(chain_factory_address); } #[upgrade] From d00a00af03e5bfafe5284685b187b992e42cc2e2 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 26 Nov 2024 16:57:28 +0200 Subject: [PATCH 12/87] Fixed `complete_setup_phase` bug Signed-off-by: Andrei Baltariu --- sovereign-forge/src/phases.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index dd857cd1..7c3ef26c 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -24,7 +24,7 @@ pub trait PhasesModule: #[only_owner] #[endpoint(completeSetupPhase)] fn complete_setup_phase(&self) { - if !self.is_setup_phase_complete() { + if self.is_setup_phase_complete() { return; } From 76c00f49ffdc17d3465439620ca3b0938d1ac0ef Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 27 Nov 2024 11:44:18 +0200 Subject: [PATCH 13/87] Added unit tests Signed-off-by: Andrei Baltariu --- .../tests/sovereign_forge_unit_tests.rs | 226 ++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 sovereign-forge/tests/sovereign_forge_unit_tests.rs diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs new file mode 100644 index 00000000..aefaadfe --- /dev/null +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -0,0 +1,226 @@ +use multiversx_sc::types::{BigUint, TestAddress, TestSCAddress}; +use multiversx_sc_scenario::{ + imports::MxscPath, ExpectError, ScenarioTxRun, ScenarioTxWhitebox, ScenarioWorld, +}; +use proxies::{ + chain_factory_proxy::ChainFactoryContractProxy, sovereign_forge_proxy::SovereignForgeProxy, +}; +use setup_phase::SetupPhaseModule; +use sovereign_forge::common::storage::StorageModule; + +const FORGE_ADDRESS: TestSCAddress = TestSCAddress::new("sovereign-forge"); +const FORGE_CODE_PATH: MxscPath = MxscPath::new("output/sovereign-forge.mxsc.json"); +const OWNER_ADDRESS: TestAddress = TestAddress::new("owner"); + +const FACTORY_ADDRESS: TestSCAddress = TestSCAddress::new("chain-factory"); +const FACTORY_CODE_PATH: MxscPath = + MxscPath::new("../chain-factory/output/chain-factory.mxsc.json"); + +const TOKEN_HANDLER_ADDRESS: TestSCAddress = TestSCAddress::new("token-handler"); + +const BALANCE: u128 = 100_000_000_000_000_000; +const DEPLOY_COST: u64 = 100_000; + +fn world() -> ScenarioWorld { + let mut blockchain = ScenarioWorld::new(); + + blockchain.register_contract(FORGE_CODE_PATH, sovereign_forge::ContractBuilder); + blockchain.register_contract(FACTORY_CODE_PATH, chain_factory::ContractBuilder); + + blockchain +} + +struct SovereignForgeTestState { + world: ScenarioWorld, +} + +impl SovereignForgeTestState { + fn new() -> Self { + let mut world = world(); + + world + .account(OWNER_ADDRESS) + .balance(BigUint::from(BALANCE)) + .nonce(1); + + Self { world } + } + + fn deploy_chain_factory(&mut self) -> &mut Self { + self.world + .tx() + .from(OWNER_ADDRESS) + .typed(ChainFactoryContractProxy) + .init( + FACTORY_ADDRESS, + FACTORY_ADDRESS, + FACTORY_ADDRESS, + FACTORY_ADDRESS, + ) + .code(FACTORY_CODE_PATH) + .new_address(FACTORY_ADDRESS) + .run(); + + self + } + + fn deploy_sovereign_forge(&mut self) -> &mut Self { + self.world + .tx() + .from(OWNER_ADDRESS) + .typed(SovereignForgeProxy) + .init(DEPLOY_COST) + .code(FORGE_CODE_PATH) + .new_address(FORGE_ADDRESS) + .run(); + + self + } + + fn register_token_handler( + &mut self, + shard_id: u32, + token_handler_address: TestSCAddress, + expected_result: Option, + ) { + let transaction = self + .world + .tx() + .from(OWNER_ADDRESS) + .to(FORGE_ADDRESS) + .typed(SovereignForgeProxy) + .register_token_handler(shard_id, token_handler_address); + + if let Some(error) = expected_result { + transaction.returns(error).run(); + } else { + transaction.run(); + } + } + + fn register_chain_factory( + &mut self, + shard_id: u32, + chain_factory_address: TestSCAddress, + expected_result: Option, + ) { + let transaction = self + .world + .tx() + .from(OWNER_ADDRESS) + .to(FORGE_ADDRESS) + .typed(SovereignForgeProxy) + .register_chain_factory(shard_id, chain_factory_address); + + if let Some(error) = expected_result { + transaction.returns(error).run(); + } else { + transaction.run(); + } + } + + fn complete_setup_phase(&mut self, expected_result: Option) { + let transaction = self + .world + .tx() + .from(OWNER_ADDRESS) + .to(FORGE_ADDRESS) + .typed(SovereignForgeProxy) + .complete_setup_phase(); + + if let Some(error) = expected_result { + transaction.returns(error).run(); + } else { + transaction.run(); + } + } +} + +#[test] +fn test_deploy_forge() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); +} + +#[test] +fn test_chain_factory() { + let mut state = SovereignForgeTestState::new(); + state.deploy_chain_factory(); +} + +#[test] +fn test_register_token_handler() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + + state.register_token_handler(2, FACTORY_ADDRESS, None); + + state + .world + .query() + .to(FORGE_ADDRESS) + .whitebox(sovereign_forge::contract_obj, |sc| { + assert!(!sc.token_handlers(2).is_empty()); + }); +} + +#[test] +fn test_register_chain_factory() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + + state.register_chain_factory(2, TOKEN_HANDLER_ADDRESS, None); + + state + .world + .query() + .to(FORGE_ADDRESS) + .whitebox(sovereign_forge::contract_obj, |sc| { + assert!(!sc.chain_factories(2).is_empty()); + }); +} + +#[test] +fn complete_setup_phase_no_chain_config_registered() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + + state.complete_setup_phase(Some(ExpectError( + 4, + "There is no Chain-Factory contract assigned for shard 1", + ))); +} + +#[test] +fn complete_setup_phase_no_token_handler_registered() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.register_chain_factory(1, FACTORY_ADDRESS, None); + + state.complete_setup_phase(Some(ExpectError( + 4, + "There is no Token-Handler contract assigned for shard 1", + ))); +} + +#[test] +fn complete_setup_phase() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.register_chain_factory(1, FACTORY_ADDRESS, None); + state.register_chain_factory(2, FACTORY_ADDRESS, None); + state.register_chain_factory(3, FACTORY_ADDRESS, None); + state.register_token_handler(1, TOKEN_HANDLER_ADDRESS, None); + state.register_token_handler(2, TOKEN_HANDLER_ADDRESS, None); + state.register_token_handler(3, TOKEN_HANDLER_ADDRESS, None); + + state.complete_setup_phase(None); + + state + .world + .query() + .to(FORGE_ADDRESS) + .whitebox(sovereign_forge::contract_obj, |sc| { + assert!(sc.is_setup_phase_complete()); + }); +} From 07543dd804b225cfa56419ab376c760b52073803 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 27 Nov 2024 11:47:23 +0200 Subject: [PATCH 14/87] Fix after review Signed-off-by: Andrei Baltariu --- chain-config/src/lib.rs | 4 +++- common/setup-phase/src/lib.rs | 8 -------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/chain-config/src/lib.rs b/chain-config/src/lib.rs index fa017261..c084eff6 100644 --- a/chain-config/src/lib.rs +++ b/chain-config/src/lib.rs @@ -72,7 +72,9 @@ pub trait ChainConfigContract: #[only_owner] fn complete_setup_phase(&self) { - self.require_setup_not_complete(); + if self.is_setup_phase_complete() { + return; + } self.require_config_set(); // validator set in header verifier // change ownership to header-verifier diff --git a/common/setup-phase/src/lib.rs b/common/setup-phase/src/lib.rs index 60385d6e..9d1dcbfa 100644 --- a/common/setup-phase/src/lib.rs +++ b/common/setup-phase/src/lib.rs @@ -16,14 +16,6 @@ pub trait SetupPhaseModule { require!(self.is_setup_phase_complete(), "The setup is not completed"); } - #[inline] - fn require_setup_not_complete(&self) { - require!( - !self.is_setup_phase_complete(), - "The setup phase is already completed" - ); - } - #[inline] fn is_setup_phase_complete(&self) -> bool { self.setup_phase_complete().get() From a3af379bd74b082fb08b1736566750e46426b1bb Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 27 Nov 2024 11:49:43 +0200 Subject: [PATCH 15/87] Set `setup_phase_complete` to true Signed-off-by: Andrei Baltariu --- chain-config/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chain-config/src/lib.rs b/chain-config/src/lib.rs index c084eff6..e7cb54f0 100644 --- a/chain-config/src/lib.rs +++ b/chain-config/src/lib.rs @@ -75,10 +75,11 @@ pub trait ChainConfigContract: if self.is_setup_phase_complete() { return; } + self.require_config_set(); // validator set in header verifier // change ownership to header-verifier - // update setup_phase_complete + self.setup_phase_complete().set(true); } #[upgrade] From 6c19855b543869905da6e3bdb40d99148fe214bd Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 27 Nov 2024 12:46:14 +0200 Subject: [PATCH 16/87] Added more tests Signed-off-by: Andrei Baltariu --- .../tests/sovereign_forge_unit_tests.rs | 103 +++++++++++++++--- 1 file changed, 87 insertions(+), 16 deletions(-) diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs index aefaadfe..bc74f31b 100644 --- a/sovereign-forge/tests/sovereign_forge_unit_tests.rs +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -1,12 +1,14 @@ -use multiversx_sc::types::{BigUint, TestAddress, TestSCAddress}; +use multiversx_sc::types::{BigUint, MultiValueEncoded, TestAddress, TestSCAddress}; use multiversx_sc_scenario::{ - imports::MxscPath, ExpectError, ScenarioTxRun, ScenarioTxWhitebox, ScenarioWorld, + api::StaticApi, imports::MxscPath, ExpectError, ScenarioTxRun, ScenarioTxWhitebox, + ScenarioWorld, }; use proxies::{ chain_factory_proxy::ChainFactoryContractProxy, sovereign_forge_proxy::SovereignForgeProxy, }; use setup_phase::SetupPhaseModule; use sovereign_forge::common::storage::StorageModule; +use transaction::StakeMultiArg; const FORGE_ADDRESS: TestSCAddress = TestSCAddress::new("sovereign-forge"); const FORGE_CODE_PATH: MxscPath = MxscPath::new("output/sovereign-forge.mxsc.json"); @@ -49,7 +51,7 @@ impl SovereignForgeTestState { fn deploy_chain_factory(&mut self) -> &mut Self { self.world .tx() - .from(OWNER_ADDRESS) + .from(FORGE_ADDRESS) .typed(ChainFactoryContractProxy) .init( FACTORY_ADDRESS, @@ -134,17 +136,52 @@ impl SovereignForgeTestState { transaction.run(); } } -} -#[test] -fn test_deploy_forge() { - let mut state = SovereignForgeTestState::new(); - state.deploy_sovereign_forge(); + fn deploy_phase_one( + &mut self, + payment: BigUint, + min_validators: u64, + max_validators: u64, + min_stake: BigUint, + additional_stake_required: MultiValueEncoded>, + expected_result: Option, + ) { + let transaction = self + .world + .tx() + .from(OWNER_ADDRESS) + .to(FORGE_ADDRESS) + .typed(SovereignForgeProxy) + .deploy_phase_one( + min_validators, + max_validators, + min_stake, + additional_stake_required, + ) + .egld(payment); + + if let Some(error) = expected_result { + transaction.returns(error).run(); + } else { + transaction.run(); + } + } + + 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); + } } #[test] -fn test_chain_factory() { +fn test_deploy_contracts() { let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); state.deploy_chain_factory(); } @@ -207,14 +244,8 @@ fn complete_setup_phase_no_token_handler_registered() { fn complete_setup_phase() { let mut state = SovereignForgeTestState::new(); state.deploy_sovereign_forge(); - state.register_chain_factory(1, FACTORY_ADDRESS, None); - state.register_chain_factory(2, FACTORY_ADDRESS, None); - state.register_chain_factory(3, FACTORY_ADDRESS, None); - state.register_token_handler(1, TOKEN_HANDLER_ADDRESS, None); - state.register_token_handler(2, TOKEN_HANDLER_ADDRESS, None); - state.register_token_handler(3, TOKEN_HANDLER_ADDRESS, None); - state.complete_setup_phase(None); + state.finish_setup(); state .world @@ -224,3 +255,43 @@ fn complete_setup_phase() { assert!(sc.is_setup_phase_complete()); }); } + +#[test] +fn deploy_phase_one_deploy_cost_too_low() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.finish_setup(); + + let deploy_cost = BigUint::from(1u32); + + state.deploy_phase_one( + deploy_cost, + 1, + 2, + BigUint::from(2u32), + MultiValueEncoded::new(), + Some(ExpectError( + 4, + "The given deploy cost is not equal to the standard amount", + )), + ); +} + +#[test] +fn deploy_phase_one_chain_config_missing() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.deploy_chain_factory(); + state.finish_setup(); + + let deploy_cost = BigUint::from(100_000u32); + + state.deploy_phase_one( + deploy_cost, + 1, + 2, + BigUint::from(2u32), + MultiValueEncoded::new(), + Some(ExpectError(10, "error signalled by smartcontract")), + ); +} From ab15d7fbec2420a4bc04a203cbfd44c0e793ac61 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 12:52:51 +0200 Subject: [PATCH 17/87] Completed endpoint for phase two deployment Signed-off-by: Andrei Baltariu --- enshrine-esdt-safe/interactor/src/config.rs | 15 +++++---------- sovereign-forge/src/common/storage.rs | 1 + sovereign-forge/src/common/utils.rs | 19 +++++++++++++++++++ sovereign-forge/src/phases.rs | 16 ++++++++++++---- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/enshrine-esdt-safe/interactor/src/config.rs b/enshrine-esdt-safe/interactor/src/config.rs index 4bf7c7d1..2d072b4b 100644 --- a/enshrine-esdt-safe/interactor/src/config.rs +++ b/enshrine-esdt-safe/interactor/src/config.rs @@ -3,25 +3,22 @@ use serde::Deserialize; use std::io::Read; - /// Config file const CONFIG_FILE: &str = "config.toml"; - #[derive(Debug, Deserialize)] #[serde(rename_all = "lowercase")] pub enum ChainType { Real, Simulator, - } +} /// Contract Interact configuration #[derive(Debug, Deserialize)] pub struct Config { pub gateway_uri: String, pub chain_type: ChainType, - } - +} impl Config { // Deserializes config from file @@ -36,7 +33,7 @@ impl Config { Config { gateway_uri: "http://localhost:8085".to_owned(), chain_type: ChainType::Simulator, - } + } } // Returns the gateway URI @@ -49,8 +46,6 @@ impl Config { match self.chain_type { ChainType::Real => false, ChainType::Simulator => true, + } } - } - } - - +} diff --git a/sovereign-forge/src/common/storage.rs b/sovereign-forge/src/common/storage.rs index 7ff38cf6..bfc345ac 100644 --- a/sovereign-forge/src/common/storage.rs +++ b/sovereign-forge/src/common/storage.rs @@ -4,6 +4,7 @@ use super::utils::ChainContractsMap; #[multiversx_sc::module] pub trait StorageModule { + // TODO: This has to be easily modifiable #[storage_mapper("sovereignsMapper")] fn sovereigns_mapper( &self, diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index df455e92..74e4b5c2 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -55,6 +55,25 @@ pub enum ScArray { #[multiversx_sc::module] pub trait UtilsModule: super::storage::StorageModule { + fn check_phase_one_completed(&self, sovereign_creator: &ManagedAddress) { + let sovereigns_mapper = self.sovereigns_mapper(sovereign_creator); + + require!( + !sovereigns_mapper.is_empty(), + "There are no contracts deployed for this Sovereign" + ); + + let last_deployed_contract = sovereigns_mapper + .get() + .contracts_info + .iter() + .last() + .unwrap() + .id; + + require!(last_deployed_contract == ScArray::ChainConfig, "The last deployed contract is not Chain-Config, please be attentive to the order of deployment!"); + } + 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 7c3ef26c..a563a36f 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -98,10 +98,18 @@ pub trait PhasesModule: } #[endpoint(deployPhaseTwo)] - fn deploy_phase_two(&self) { - // check chain config was deployed && header was not - // deploy header - // update mapper + fn deploy_phase_two(&self, bls_keys: MultiValueEncoded) { + let blockchain_api = self.blockchain(); + let caller = blockchain_api.get_caller(); + let caller_shard_id = blockchain_api.get_shard_of_address(&caller); + + self.check_phase_one_completed(&caller); + + let chain_factories_mapper = self.chain_factories(caller_shard_id); + let chain_factory_address = chain_factories_mapper.get(); + let header_verifier_address = self.deploy_header_verifier(chain_factory_address, bls_keys); + + // self.sovereigns_mapper(caller). } fn deploy_chain_config( From 6db7e2785bdf839356b83b8ffd5fec4304d9b171 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 13:05:05 +0200 Subject: [PATCH 18/87] Modified storage logic for sovereign history Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/storage.rs | 10 ++++++++-- sovereign-forge/src/common/utils.rs | 18 +----------------- sovereign-forge/src/phases.rs | 21 ++++++++------------- 3 files changed, 17 insertions(+), 32 deletions(-) diff --git a/sovereign-forge/src/common/storage.rs b/sovereign-forge/src/common/storage.rs index 7ff38cf6..8d923531 100644 --- a/sovereign-forge/src/common/storage.rs +++ b/sovereign-forge/src/common/storage.rs @@ -1,6 +1,6 @@ use multiversx_sc::imports::{SingleValueMapper, UnorderedSetMapper}; -use super::utils::ChainContractsMap; +use super::utils::ContractInfo; #[multiversx_sc::module] pub trait StorageModule { @@ -8,7 +8,13 @@ pub trait StorageModule { fn sovereigns_mapper( &self, sovereign_creator: &ManagedAddress, - ) -> SingleValueMapper>; + ) -> SingleValueMapper; + + #[storage_mapper("sovereignDeployedContracts")] + fn sovereign_deployed_contracts( + &self, + chain_id: &ManagedBuffer, + ) -> UnorderedSetMapper>; #[view(getChainFactoryAddress)] #[storage_mapper("chainFactories")] diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index df455e92..916b7786 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -4,7 +4,7 @@ use multiversx_sc::{ derive::{type_abi, ManagedVecItem}, proxy_imports::{NestedDecode, NestedEncode, TopDecode, TopEncode}, require, - types::{ManagedAddress, ManagedBuffer, ManagedVec}, + types::ManagedAddress, }; const CHARSET: &[u8] = b"0123456789abcdefghijklmnopqrstuvwxyz"; @@ -24,22 +24,6 @@ impl ContractInfo { } } -#[type_abi] -#[derive(TopEncode, TopDecode, NestedEncode, NestedDecode, ManagedVecItem)] -pub struct ChainContractsMap { - pub chain_id: ManagedBuffer, - pub contracts_info: ManagedVec>, -} - -impl ChainContractsMap { - pub fn new(chain_id: ManagedBuffer, contracts_info: ManagedVec>) -> Self { - ChainContractsMap { - chain_id, - contracts_info, - } - } -} - #[type_abi] #[derive(TopEncode, TopDecode, NestedEncode, NestedDecode, Clone, ManagedVecItem, PartialEq)] pub enum ScArray { diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 7c3ef26c..30a7f71b 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -1,18 +1,16 @@ +use crate::err_msg; use core::ops::Deref; use proxies::chain_factory_proxy::ChainFactoryContractProxy; use transaction::StakeMultiArg; use multiversx_sc::{ require, - types::{ManagedVec, MultiValueEncoded, ReturnsResult}, + types::{MultiValueEncoded, ReturnsResult}, }; -use crate::{ - common::{ - self, - utils::{ChainContractsMap, ContractInfo, ScArray}, - }, - err_msg, +use crate::common::{ + self, + utils::{ContractInfo, ScArray}, }; const NUMBER_OF_SHARDS: u32 = 3; @@ -89,12 +87,9 @@ pub trait PhasesModule: let chain_factory_contract_info = ContractInfo::new(ScArray::ChainConfig, chain_config_address); - let mut contracts_info = ManagedVec::new(); - contracts_info.push(chain_factory_contract_info); - - let chain_contracts_map = ChainContractsMap::new(chain_id, contracts_info); - - sovereigns_mapper.set(chain_contracts_map); + self.sovereign_deployed_contracts(&chain_id) + .insert(chain_factory_contract_info); + sovereigns_mapper.set(chain_id); } #[endpoint(deployPhaseTwo)] From ce21a4c0f73ad2b36f59323125af5c143896618e Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 15:37:31 +0200 Subject: [PATCH 19/87] Added alias type to be more explicit Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/storage.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sovereign-forge/src/common/storage.rs b/sovereign-forge/src/common/storage.rs index 69cb02c8..b71c5f4c 100644 --- a/sovereign-forge/src/common/storage.rs +++ b/sovereign-forge/src/common/storage.rs @@ -1,7 +1,12 @@ -use multiversx_sc::imports::{SingleValueMapper, UnorderedSetMapper}; +use multiversx_sc::{ + imports::{SingleValueMapper, UnorderedSetMapper}, + types::ManagedBuffer, +}; use super::utils::ContractInfo; +type ChainId = ManagedBuffer; + #[multiversx_sc::module] pub trait StorageModule { // TODO: This has to be easily modifiable @@ -9,7 +14,7 @@ pub trait StorageModule { fn sovereigns_mapper( &self, sovereign_creator: &ManagedAddress, - ) -> SingleValueMapper; + ) -> SingleValueMapper>; #[storage_mapper("sovereignDeployedContracts")] fn sovereign_deployed_contracts( From 3be917a14075112c976c36fec82ac6ca9b992139 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 15:41:03 +0200 Subject: [PATCH 20/87] Modified helper function to check for deployed contract with parameter Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 92b92afb..ced9418f 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -39,7 +39,7 @@ pub enum ScArray { #[multiversx_sc::module] pub trait UtilsModule: super::storage::StorageModule { - fn check_phase_one_completed(&self, sovereign_creator: &ManagedAddress) { + fn check_if_contract_deployed(&self, sovereign_creator: &ManagedAddress, sc_id: ScArray) { let sovereigns_mapper = self.sovereigns_mapper(sovereign_creator); require!( @@ -47,15 +47,10 @@ pub trait UtilsModule: super::storage::StorageModule { "There are no contracts deployed for this Sovereign" ); - let last_deployed_contract = sovereigns_mapper - .get() - .contracts_info - .iter() - .last() - .unwrap() - .id; + let chain_id = sovereigns_mapper.get(); + let deployed_contracts = self.sovereign_deployed_contracts(&chain_id); - require!(last_deployed_contract == ScArray::ChainConfig, "The last deployed contract is not Chain-Config, please be attentive to the order of deployment!"); + require!(deployed_contracts.iter().any(|sc| sc.id == ScArray::ChainConfig), "The last deployed contract is not Chain-Config, please be attentive to the order of deployment!"); } fn generate_chain_id(&self) -> ManagedBuffer { From cf59257d147e84fb80690f1a7c2ba225f52fce22 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 15:47:22 +0200 Subject: [PATCH 21/87] Made type alias public Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/storage.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sovereign-forge/src/common/storage.rs b/sovereign-forge/src/common/storage.rs index b71c5f4c..3d288cfb 100644 --- a/sovereign-forge/src/common/storage.rs +++ b/sovereign-forge/src/common/storage.rs @@ -5,7 +5,7 @@ use multiversx_sc::{ use super::utils::ContractInfo; -type ChainId = ManagedBuffer; +pub type ChainId = ManagedBuffer; #[multiversx_sc::module] pub trait StorageModule { From 6c890841ed71f892da14bc5bbabe18a2b0f45c45 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 15:47:30 +0200 Subject: [PATCH 22/87] Added getter function for chain_id Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index ced9418f..80d27ddf 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -11,6 +11,8 @@ const CHARSET: &[u8] = b"0123456789abcdefghijklmnopqrstuvwxyz"; use crate::err_msg; +use super::storage::ChainId; + #[type_abi] #[derive(TopEncode, TopDecode, NestedEncode, NestedDecode, ManagedVecItem)] pub struct ContractInfo { @@ -80,4 +82,14 @@ pub trait UtilsModule: super::storage::StorageModule { "The given deploy cost is not equal to the standard amount" ); } + + fn get_sovereign_chain_id(&self, sovereign_creator: &ManagedAddress) -> ChainId { + let sovereign_mapper = self.sovereigns_mapper(sovereign_creator); + require!( + !sovereign_mapper.is_empty(), + "There is no sovereign created by this address" + ); + + sovereign_mapper.get() + } } From e26b18f2ede08586f194ff8ebd112715685c9ec4 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 15:49:54 +0200 Subject: [PATCH 23/87] Renamed contracts in enum Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 80d27ddf..6380f437 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -31,8 +31,8 @@ impl ContractInfo { pub enum ScArray { ChainFactory, Controller, - SovereignHeaderVerifier, - SovereignCrossChainOperation, + HeaderVerifier, + ESDTSafe, FeeMarket, TokenHandler, ChainConfig, From 897e6c406c0adcfe4535e16e7cc48ee41fb0039c Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 15:50:06 +0200 Subject: [PATCH 24/87] Added logic for phase two of deployment Signed-off-by: Andrei Baltariu --- sovereign-forge/src/phases.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index bf2a9462..6c776649 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -98,13 +98,19 @@ pub trait PhasesModule: let caller = blockchain_api.get_caller(); let caller_shard_id = blockchain_api.get_shard_of_address(&caller); - self.check_phase_one_completed(&caller); + self.check_if_contract_deployed(&caller, ScArray::ChainConfig); let chain_factories_mapper = self.chain_factories(caller_shard_id); let chain_factory_address = chain_factories_mapper.get(); let header_verifier_address = self.deploy_header_verifier(chain_factory_address, bls_keys); - // self.sovereigns_mapper(caller). + let chain_factory_contract_info = + ContractInfo::new(ScArray::HeaderVerifier, header_verifier_address); + + let chain_id = self.get_sovereign_chain_id(&caller); + + self.sovereign_deployed_contracts(&chain_id) + .insert(chain_factory_contract_info); } fn deploy_chain_config( From 8731152a36fcff682de34278f7ef49fea5815750 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 15:54:25 +0200 Subject: [PATCH 25/87] Updated proxy Signed-off-by: Andrei Baltariu --- common/proxies/src/sovereign_forge_proxy.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/proxies/src/sovereign_forge_proxy.rs b/common/proxies/src/sovereign_forge_proxy.rs index 0f2fdd3c..46802e76 100644 --- a/common/proxies/src/sovereign_forge_proxy.rs +++ b/common/proxies/src/sovereign_forge_proxy.rs @@ -147,12 +147,16 @@ where .original_result() } - pub fn deploy_phase_two( + pub fn deploy_phase_two< + Arg0: ProxyArg>>, + >( self, + bls_keys: Arg0, ) -> TxTypedCall { self.wrapped_tx .payment(NotPayable) .raw_call("deployPhaseTwo") + .argument(&bls_keys) .original_result() } From 166c241d40da51096e5c2881b977beb7d5a4f120 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 16:02:19 +0200 Subject: [PATCH 26/87] Used parameter instead of hardcoded `ScArray` id 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 6380f437..b4e6350e 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -52,7 +52,7 @@ pub trait UtilsModule: super::storage::StorageModule { let chain_id = sovereigns_mapper.get(); let deployed_contracts = self.sovereign_deployed_contracts(&chain_id); - require!(deployed_contracts.iter().any(|sc| sc.id == ScArray::ChainConfig), "The last deployed contract is not Chain-Config, please be attentive to the order of deployment!"); + require!(deployed_contracts.iter().any(|sc| sc.id == sc_id), "The last deployed contract is not Chain-Config, please be attentive to the order of deployment!"); } fn generate_chain_id(&self) -> ManagedBuffer { From 8092094e210ffd1f2317612a1097fe2a5f713105 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 16:03:54 +0200 Subject: [PATCH 27/87] Added error unit test Signed-off-by: Andrei Baltariu --- .../tests/sovereign_forge_unit_tests.rs | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs index bc74f31b..552e7ca3 100644 --- a/sovereign-forge/tests/sovereign_forge_unit_tests.rs +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -1,4 +1,4 @@ -use multiversx_sc::types::{BigUint, MultiValueEncoded, TestAddress, TestSCAddress}; +use multiversx_sc::types::{BigUint, ManagedBuffer, MultiValueEncoded, TestAddress, TestSCAddress}; use multiversx_sc_scenario::{ api::StaticApi, imports::MxscPath, ExpectError, ScenarioTxRun, ScenarioTxWhitebox, ScenarioWorld, @@ -167,6 +167,26 @@ impl SovereignForgeTestState { } } + fn deploy_phase_two( + &mut self, + expected_result: Option, + bls_keys: MultiValueEncoded>, + ) { + let transaction = self + .world + .tx() + .from(OWNER_ADDRESS) + .to(FORGE_ADDRESS) + .typed(SovereignForgeProxy) + .deploy_phase_two(bls_keys); + + if let Some(error) = expected_result { + transaction.returns(error).run(); + } else { + transaction.run(); + } + } + fn finish_setup(&mut self) { self.register_chain_factory(1, FACTORY_ADDRESS, None); self.register_chain_factory(2, FACTORY_ADDRESS, None); @@ -295,3 +315,21 @@ fn deploy_phase_one_chain_config_missing() { Some(ExpectError(10, "error signalled by smartcontract")), ); } + +#[test] +fn deploy_phase_two_without_first_phase() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.deploy_chain_factory(); + state.finish_setup(); + + let bls_keys = MultiValueEncoded::>::new(); + + state.deploy_phase_two( + Some(ExpectError( + 4, + "There are no contracts deployed for this Sovereign", + )), + bls_keys, + ); +} From 2815501f79bcb5086f539ae2960214e1628a1a78 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 16:21:28 +0200 Subject: [PATCH 28/87] Added `complete_setup_phase` for HeaderVerifier Signed-off-by: Andrei Baltariu --- header-verifier/Cargo.toml | 3 +++ header-verifier/src/lib.rs | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/header-verifier/Cargo.toml b/header-verifier/Cargo.toml index b3204992..ce245c25 100644 --- a/header-verifier/Cargo.toml +++ b/header-verifier/Cargo.toml @@ -17,6 +17,9 @@ path = "../common/transaction" [dependencies.proxies] path = "../common/proxies" +[dependencies.setup-phase] +path = "../common/setup-phase" + [dev-dependencies] num-bigint = "0.4.2" diff --git a/header-verifier/src/lib.rs b/header-verifier/src/lib.rs index d01736d5..607dd4d8 100644 --- a/header-verifier/src/lib.rs +++ b/header-verifier/src/lib.rs @@ -12,7 +12,7 @@ pub enum OperationHashStatus { } #[multiversx_sc::contract] -pub trait Headerverifier { +pub trait Headerverifier: setup_phase::SetupPhaseModule { #[init] fn init(&self, bls_pub_keys: MultiValueEncoded) { for pub_key in bls_pub_keys { @@ -90,6 +90,33 @@ pub trait Headerverifier { } } + #[only_owner] + #[endpoint(completeSetupPhase)] + fn complete_setup_phase(&self) { + if self.is_setup_phase_complete() { + return; + } + + let chain_config_mapper = self.chain_config_address(); + require!( + !chain_config_mapper.is_empty(), + "The Chain-Config address is not set" + ); + + let chain_config_address = chain_config_mapper.get(); + let min_validators = self.min_validators(chain_config_address).get(); + let number_of_validators = self.bls_pub_keys().len() as u32; + + require!( + number_of_validators > min_validators, + "There should be at least {} more validators so the setup phase can be completed", + (number_of_validators - min_validators) + ); + + // change ownership + self.setup_phase_complete().set(true); + } + fn require_caller_esdt_safe(&self) { let esdt_safe_mapper = self.esdt_safe_address(); @@ -155,4 +182,10 @@ pub trait Headerverifier { #[storage_mapper("esdtSafeAddress")] fn esdt_safe_address(&self) -> SingleValueMapper; + + #[storage_mapper("chainConfigAddress")] + fn chain_config_address(&self) -> SingleValueMapper; + + #[storage_mapper_from_address("minValidators")] + fn min_validators(&self, sc_address: ManagedAddress) -> SingleValueMapper; } From af698beb29614022d7e11932a9633633d2b20f80 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 16:21:36 +0200 Subject: [PATCH 29/87] Update cargo lock Signed-off-by: Andrei Baltariu --- Cargo.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.lock b/Cargo.lock index ca19ee36..77684297 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -788,6 +788,7 @@ dependencies = [ "multiversx-sc-scenario", "num-bigint", "proxies", + "setup-phase", "transaction", ] From ac70b2670ce31c340387355c3c27476ad01dcea1 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 29 Nov 2024 16:30:56 +0200 Subject: [PATCH 30/87] Build + proxy regen Signed-off-by: Andrei Baltariu --- common/proxies/src/header_verifier_proxy.rs | 9 +++++++++ .../wasm-enshrine-esdt-safe-full/Cargo.lock | 1 + .../wasm-enshrine-esdt-safe-view/Cargo.lock | 1 + enshrine-esdt-safe/wasm/Cargo.lock | 1 + esdt-safe/wasm-esdt-safe-full/Cargo.lock | 1 + esdt-safe/wasm-esdt-safe-view/Cargo.lock | 1 + esdt-safe/wasm/Cargo.lock | 1 + header-verifier/wasm-header-verifier-full/Cargo.lock | 8 ++++++++ header-verifier/wasm-header-verifier-full/src/lib.rs | 5 +++-- header-verifier/wasm-multisig-view/Cargo.lock | 8 ++++++++ header-verifier/wasm/Cargo.lock | 8 ++++++++ header-verifier/wasm/src/lib.rs | 5 +++-- 12 files changed, 45 insertions(+), 4 deletions(-) diff --git a/common/proxies/src/header_verifier_proxy.rs b/common/proxies/src/header_verifier_proxy.rs index 9de9ca01..01a7b046 100644 --- a/common/proxies/src/header_verifier_proxy.rs +++ b/common/proxies/src/header_verifier_proxy.rs @@ -148,4 +148,13 @@ where .argument(&operation_hash) .original_result() } + + pub fn complete_setup_phase( + self, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("completeSetupPhase") + .original_result() + } } diff --git a/enshrine-esdt-safe/wasm-enshrine-esdt-safe-full/Cargo.lock b/enshrine-esdt-safe/wasm-enshrine-esdt-safe-full/Cargo.lock index 11c00cb9..acf88ee3 100644 --- a/enshrine-esdt-safe/wasm-enshrine-esdt-safe-full/Cargo.lock +++ b/enshrine-esdt-safe/wasm-enshrine-esdt-safe-full/Cargo.lock @@ -90,6 +90,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "proxies", + "setup-phase", "transaction", ] diff --git a/enshrine-esdt-safe/wasm-enshrine-esdt-safe-view/Cargo.lock b/enshrine-esdt-safe/wasm-enshrine-esdt-safe-view/Cargo.lock index 40980dbc..08e1e96a 100644 --- a/enshrine-esdt-safe/wasm-enshrine-esdt-safe-view/Cargo.lock +++ b/enshrine-esdt-safe/wasm-enshrine-esdt-safe-view/Cargo.lock @@ -90,6 +90,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "proxies", + "setup-phase", "transaction", ] diff --git a/enshrine-esdt-safe/wasm/Cargo.lock b/enshrine-esdt-safe/wasm/Cargo.lock index 014a999b..14150e4c 100644 --- a/enshrine-esdt-safe/wasm/Cargo.lock +++ b/enshrine-esdt-safe/wasm/Cargo.lock @@ -90,6 +90,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "proxies", + "setup-phase", "transaction", ] diff --git a/esdt-safe/wasm-esdt-safe-full/Cargo.lock b/esdt-safe/wasm-esdt-safe-full/Cargo.lock index 2d74536c..37725942 100644 --- a/esdt-safe/wasm-esdt-safe-full/Cargo.lock +++ b/esdt-safe/wasm-esdt-safe-full/Cargo.lock @@ -67,6 +67,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "proxies", + "setup-phase", "transaction", ] diff --git a/esdt-safe/wasm-esdt-safe-view/Cargo.lock b/esdt-safe/wasm-esdt-safe-view/Cargo.lock index b06898af..b5d4c56d 100644 --- a/esdt-safe/wasm-esdt-safe-view/Cargo.lock +++ b/esdt-safe/wasm-esdt-safe-view/Cargo.lock @@ -67,6 +67,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "proxies", + "setup-phase", "transaction", ] diff --git a/esdt-safe/wasm/Cargo.lock b/esdt-safe/wasm/Cargo.lock index 2dd09b84..82dc9047 100644 --- a/esdt-safe/wasm/Cargo.lock +++ b/esdt-safe/wasm/Cargo.lock @@ -67,6 +67,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "proxies", + "setup-phase", "transaction", ] diff --git a/header-verifier/wasm-header-verifier-full/Cargo.lock b/header-verifier/wasm-header-verifier-full/Cargo.lock index e2b65e4f..4cd55340 100644 --- a/header-verifier/wasm-header-verifier-full/Cargo.lock +++ b/header-verifier/wasm-header-verifier-full/Cargo.lock @@ -32,6 +32,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "proxies", + "setup-phase", "transaction", ] @@ -180,6 +181,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/header-verifier/wasm-header-verifier-full/src/lib.rs b/header-verifier/wasm-header-verifier-full/src/lib.rs index 67d2506f..31cdc8ff 100644 --- a/header-verifier/wasm-header-verifier-full/src/lib.rs +++ b/header-verifier/wasm-header-verifier-full/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 4 +// Endpoints: 5 // Async Callback (empty): 1 -// Total number of exported functions: 7 +// Total number of exported functions: 8 #![no_std] @@ -24,6 +24,7 @@ multiversx_sc_wasm_adapter::endpoints! { setEsdtSafeAddress => set_esdt_safe_address removeExecutedHash => remove_executed_hash lockOperationHash => lock_operation_hash + completeSetupPhase => complete_setup_phase ) } diff --git a/header-verifier/wasm-multisig-view/Cargo.lock b/header-verifier/wasm-multisig-view/Cargo.lock index a08fa3e8..e357439e 100644 --- a/header-verifier/wasm-multisig-view/Cargo.lock +++ b/header-verifier/wasm-multisig-view/Cargo.lock @@ -32,6 +32,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "proxies", + "setup-phase", "transaction", ] @@ -180,6 +181,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/header-verifier/wasm/Cargo.lock b/header-verifier/wasm/Cargo.lock index 75a990c8..6c9dce66 100644 --- a/header-verifier/wasm/Cargo.lock +++ b/header-verifier/wasm/Cargo.lock @@ -32,6 +32,7 @@ version = "0.0.0" dependencies = [ "multiversx-sc", "proxies", + "setup-phase", "transaction", ] @@ -180,6 +181,13 @@ dependencies = [ "nibble_vec", ] +[[package]] +name = "setup-phase" +version = "0.0.0" +dependencies = [ + "multiversx-sc", +] + [[package]] name = "smallvec" version = "1.13.2" diff --git a/header-verifier/wasm/src/lib.rs b/header-verifier/wasm/src/lib.rs index 67d2506f..31cdc8ff 100644 --- a/header-verifier/wasm/src/lib.rs +++ b/header-verifier/wasm/src/lib.rs @@ -6,9 +6,9 @@ // Init: 1 // Upgrade: 1 -// Endpoints: 4 +// Endpoints: 5 // Async Callback (empty): 1 -// Total number of exported functions: 7 +// Total number of exported functions: 8 #![no_std] @@ -24,6 +24,7 @@ multiversx_sc_wasm_adapter::endpoints! { setEsdtSafeAddress => set_esdt_safe_address removeExecutedHash => remove_executed_hash lockOperationHash => lock_operation_hash + completeSetupPhase => complete_setup_phase ) } From 8f1f159855c26728e09fbe2af3057a1cbdd1d7ac Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 2 Dec 2024 16:35:14 +0200 Subject: [PATCH 31/87] Modified logic for checking if SC is deployed Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index b4e6350e..2b379bc7 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -2,6 +2,7 @@ use multiversx_sc::{ api::ManagedTypeApi, codec, derive::{type_abi, ManagedVecItem}, + formatter::SCDisplay, proxy_imports::{NestedDecode, NestedEncode, TopDecode, TopEncode}, require, types::ManagedAddress, @@ -27,7 +28,9 @@ impl ContractInfo { } #[type_abi] -#[derive(TopEncode, TopDecode, NestedEncode, NestedDecode, Clone, ManagedVecItem, PartialEq)] +#[derive( + TopEncode, TopDecode, NestedEncode, NestedDecode, Clone, ManagedVecItem, PartialEq, SCDisplay, +)] pub enum ScArray { ChainFactory, Controller, @@ -50,9 +53,16 @@ pub trait UtilsModule: super::storage::StorageModule { ); let chain_id = sovereigns_mapper.get(); - let deployed_contracts = self.sovereign_deployed_contracts(&chain_id); + let deployed_contracts_mapper = self.sovereign_deployed_contracts(&chain_id); - require!(deployed_contracts.iter().any(|sc| sc.id == sc_id), "The last deployed contract is not Chain-Config, please be attentive to the order of deployment!"); + let is_contract_deployed = deployed_contracts_mapper.iter().any(|sc| sc.id == sc_id); + let sc_id_as_u32 = sc_id as u32; + + require!( + is_contract_deployed, + "The {} SC is not deployed inside this Sovereign Chain", + sc_id_as_u32 + ); } fn generate_chain_id(&self) -> ManagedBuffer { From b100aa621a2fa13d28d88027b793d18b4cd49681 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 2 Dec 2024 16:46:01 +0200 Subject: [PATCH 32/87] Removed SCDisplay trait Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 2b379bc7..f62f6cfd 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -28,9 +28,7 @@ impl ContractInfo { } #[type_abi] -#[derive( - TopEncode, TopDecode, NestedEncode, NestedDecode, Clone, ManagedVecItem, PartialEq, SCDisplay, -)] +#[derive(TopEncode, TopDecode, NestedEncode, NestedDecode, Clone, ManagedVecItem, PartialEq)] pub enum ScArray { ChainFactory, Controller, From d63d6280cc6ee832f7d0b26133954bd5de8e67e5 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 2 Dec 2024 16:47:35 +0200 Subject: [PATCH 33/87] Removed unused import Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index f62f6cfd..9678626c 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -2,7 +2,6 @@ use multiversx_sc::{ api::ManagedTypeApi, codec, derive::{type_abi, ManagedVecItem}, - formatter::SCDisplay, proxy_imports::{NestedDecode, NestedEncode, TopDecode, TopEncode}, require, types::ManagedAddress, From 5aae9b0cf7ff24007db60a79afa72c3067e3628b Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 2 Dec 2024 21:58:12 +0200 Subject: [PATCH 34/87] Fix after review Signed-off-by: Andrei Baltariu --- sovereign-forge/src/phases.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 6c776649..c9b6b131 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -100,17 +100,15 @@ pub trait PhasesModule: self.check_if_contract_deployed(&caller, ScArray::ChainConfig); - let chain_factories_mapper = self.chain_factories(caller_shard_id); - let chain_factory_address = chain_factories_mapper.get(); - let header_verifier_address = self.deploy_header_verifier(chain_factory_address, bls_keys); + let header_verifier_address = + self.deploy_header_verifier(self.chain_factories(caller_shard_id).get(), bls_keys); - let chain_factory_contract_info = + let header_verifier_contract_info = ContractInfo::new(ScArray::HeaderVerifier, header_verifier_address); - let chain_id = self.get_sovereign_chain_id(&caller); self.sovereign_deployed_contracts(&chain_id) - .insert(chain_factory_contract_info); + .insert(header_verifier_contract_info); } fn deploy_chain_config( From 39e5a75fe37e565d35dfdc32991a5c7b3b3b19ad Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 14:23:36 +0200 Subject: [PATCH 35/87] Added getter for `chain_factory` address Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/storage.rs | 3 +-- sovereign-forge/src/common/utils.rs | 7 +++++++ sovereign-forge/src/phases.rs | 26 +++++++++----------------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/sovereign-forge/src/common/storage.rs b/sovereign-forge/src/common/storage.rs index 3d288cfb..5df3bdbf 100644 --- a/sovereign-forge/src/common/storage.rs +++ b/sovereign-forge/src/common/storage.rs @@ -9,7 +9,6 @@ pub type ChainId = ManagedBuffer; #[multiversx_sc::module] pub trait StorageModule { - // TODO: This has to be easily modifiable #[storage_mapper("sovereignsMapper")] fn sovereigns_mapper( &self, @@ -19,7 +18,7 @@ pub trait StorageModule { #[storage_mapper("sovereignDeployedContracts")] fn sovereign_deployed_contracts( &self, - chain_id: &ManagedBuffer, + chain_id: &ChainId, ) -> UnorderedSetMapper>; #[view(getChainFactoryAddress)] diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 9678626c..081d464a 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -90,6 +90,13 @@ pub trait UtilsModule: super::storage::StorageModule { ); } + fn get_caller_shard_id(&self) -> ManagedAddress { + let caller = self.blockchain().get_caller(); + let shard_id = self.blockchain().get_shard_of_address(&caller); + + self.chain_factories(shard_id).get() + } + fn get_sovereign_chain_id(&self, sovereign_creator: &ManagedAddress) -> ChainId { let sovereign_mapper = self.sovereigns_mapper(sovereign_creator); require!( diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index c9b6b131..992635a2 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -68,10 +68,7 @@ pub trait PhasesModule: caller_shard_id ); - let chain_factory_address = chain_factories_mapper.get(); - let chain_config_address = self.deploy_chain_config( - chain_factory_address, min_validators, max_validators, min_stake, @@ -96,12 +93,10 @@ pub trait PhasesModule: fn deploy_phase_two(&self, bls_keys: MultiValueEncoded) { let blockchain_api = self.blockchain(); let caller = blockchain_api.get_caller(); - let caller_shard_id = blockchain_api.get_shard_of_address(&caller); self.check_if_contract_deployed(&caller, ScArray::ChainConfig); - let header_verifier_address = - self.deploy_header_verifier(self.chain_factories(caller_shard_id).get(), bls_keys); + let header_verifier_address = self.deploy_header_verifier(bls_keys); let header_verifier_contract_info = ContractInfo::new(ScArray::HeaderVerifier, header_verifier_address); @@ -113,12 +108,13 @@ pub trait PhasesModule: fn deploy_chain_config( &self, - chain_factory_address: ManagedAddress, min_validators: u64, max_validators: u64, min_stake: BigUint, additional_stake_required: MultiValueEncoded>, ) -> ManagedAddress { + let chain_factory_address = self.get_caller_shard_id(); + self.tx() .to(chain_factory_address) .typed(ChainFactoryContractProxy) @@ -132,11 +128,9 @@ pub trait PhasesModule: .sync_call() } - fn deploy_header_verifier( - &self, - chain_factory_address: ManagedAddress, - bls_keys: MultiValueEncoded, - ) -> ManagedAddress { + fn deploy_header_verifier(&self, bls_keys: MultiValueEncoded) -> ManagedAddress { + let chain_factory_address = self.get_caller_shard_id(); + self.tx() .to(chain_factory_address) .typed(ChainFactoryContractProxy) @@ -145,11 +139,9 @@ pub trait PhasesModule: .sync_call() } - fn deploy_esdt_safe( - &self, - chain_factory_address: ManagedAddress, - is_sovereign_chain: bool, - ) -> ManagedAddress { + fn deploy_esdt_safe(&self, is_sovereign_chain: bool) -> ManagedAddress { + let chain_factory_address = self.get_caller_shard_id(); + self.tx() .to(chain_factory_address) .typed(ChainFactoryContractProxy) From 18f4662c53ade024a24efbc327e52f1fb09a472d Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 14:31:28 +0200 Subject: [PATCH 36/87] Added common `sc_deploy` module for the deploy functions Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/mod.rs | 1 + sovereign-forge/src/common/sc_deploy.rs | 51 +++++++++++++++++++++++ sovereign-forge/src/lib.rs | 1 + sovereign-forge/src/phases.rs | 55 +++---------------------- 4 files changed, 58 insertions(+), 50 deletions(-) create mode 100644 sovereign-forge/src/common/sc_deploy.rs diff --git a/sovereign-forge/src/common/mod.rs b/sovereign-forge/src/common/mod.rs index 7826b9e3..60c24b24 100644 --- a/sovereign-forge/src/common/mod.rs +++ b/sovereign-forge/src/common/mod.rs @@ -1,2 +1,3 @@ +pub mod sc_deploy; pub mod storage; pub mod utils; diff --git a/sovereign-forge/src/common/sc_deploy.rs b/sovereign-forge/src/common/sc_deploy.rs new file mode 100644 index 00000000..2c55cb53 --- /dev/null +++ b/sovereign-forge/src/common/sc_deploy.rs @@ -0,0 +1,51 @@ +use crate::err_msg; +use multiversx_sc::types::{MultiValueEncoded, ReturnsResult}; +use proxies::chain_factory_proxy::ChainFactoryContractProxy; +use transaction::StakeMultiArg; + +#[multiversx_sc::module] +pub trait ScDeployModule: super::utils::UtilsModule + super::storage::StorageModule { + fn deploy_chain_config( + &self, + min_validators: u64, + max_validators: u64, + min_stake: BigUint, + additional_stake_required: MultiValueEncoded>, + ) -> ManagedAddress { + let chain_factory_address = self.get_caller_shard_id(); + + self.tx() + .to(chain_factory_address) + .typed(ChainFactoryContractProxy) + .deploy_sovereign_chain_config_contract( + min_validators, + max_validators, + min_stake, + additional_stake_required, + ) + .returns(ReturnsResult) + .sync_call() + } + + fn deploy_header_verifier(&self, bls_keys: MultiValueEncoded) -> ManagedAddress { + let chain_factory_address = self.get_caller_shard_id(); + + self.tx() + .to(chain_factory_address) + .typed(ChainFactoryContractProxy) + .deploy_header_verifier(bls_keys) + .returns(ReturnsResult) + .sync_call() + } + + fn deploy_esdt_safe(&self, is_sovereign_chain: bool) -> ManagedAddress { + let chain_factory_address = self.get_caller_shard_id(); + + self.tx() + .to(chain_factory_address) + .typed(ChainFactoryContractProxy) + .deploy_esdt_safe(is_sovereign_chain) + .returns(ReturnsResult) + .sync_call() + } +} diff --git a/sovereign-forge/src/lib.rs b/sovereign-forge/src/lib.rs index bf5551be..9d7023dc 100644 --- a/sovereign-forge/src/lib.rs +++ b/sovereign-forge/src/lib.rs @@ -11,6 +11,7 @@ pub trait SovereignForge: phases::PhasesModule + common::storage::StorageModule + common::utils::UtilsModule + + common::sc_deploy::ScDeployModule + setup_phase::SetupPhaseModule { #[init] diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 992635a2..4f1f168f 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -1,12 +1,8 @@ use crate::err_msg; use core::ops::Deref; -use proxies::chain_factory_proxy::ChainFactoryContractProxy; use transaction::StakeMultiArg; -use multiversx_sc::{ - require, - types::{MultiValueEncoded, ReturnsResult}, -}; +use multiversx_sc::{require, types::MultiValueEncoded}; use crate::common::{ self, @@ -17,7 +13,10 @@ const NUMBER_OF_SHARDS: u32 = 3; #[multiversx_sc::module] pub trait PhasesModule: - common::utils::UtilsModule + common::storage::StorageModule + setup_phase::SetupPhaseModule + common::utils::UtilsModule + + common::storage::StorageModule + + setup_phase::SetupPhaseModule + + common::sc_deploy::ScDeployModule { #[only_owner] #[endpoint(completeSetupPhase)] @@ -105,48 +104,4 @@ pub trait PhasesModule: self.sovereign_deployed_contracts(&chain_id) .insert(header_verifier_contract_info); } - - fn deploy_chain_config( - &self, - min_validators: u64, - max_validators: u64, - min_stake: BigUint, - additional_stake_required: MultiValueEncoded>, - ) -> ManagedAddress { - let chain_factory_address = self.get_caller_shard_id(); - - self.tx() - .to(chain_factory_address) - .typed(ChainFactoryContractProxy) - .deploy_sovereign_chain_config_contract( - min_validators, - max_validators, - min_stake, - additional_stake_required, - ) - .returns(ReturnsResult) - .sync_call() - } - - fn deploy_header_verifier(&self, bls_keys: MultiValueEncoded) -> ManagedAddress { - let chain_factory_address = self.get_caller_shard_id(); - - self.tx() - .to(chain_factory_address) - .typed(ChainFactoryContractProxy) - .deploy_header_verifier(bls_keys) - .returns(ReturnsResult) - .sync_call() - } - - fn deploy_esdt_safe(&self, is_sovereign_chain: bool) -> ManagedAddress { - let chain_factory_address = self.get_caller_shard_id(); - - self.tx() - .to(chain_factory_address) - .typed(ChainFactoryContractProxy) - .deploy_esdt_safe(is_sovereign_chain) - .returns(ReturnsResult) - .sync_call() - } } From 48bb1283f9a6168cbb4db9bffe2d9d2665fae5bb Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 14:46:34 +0200 Subject: [PATCH 37/87] Added parameter for the function that checks if the contract is deployed Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 11 ++++++++--- sovereign-forge/src/phases.rs | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 081d464a..267c9390 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -41,7 +41,12 @@ pub enum ScArray { #[multiversx_sc::module] pub trait UtilsModule: super::storage::StorageModule { - fn check_if_contract_deployed(&self, sovereign_creator: &ManagedAddress, sc_id: ScArray) { + fn check_if_contract_deployed( + &self, + sovereign_creator: &ManagedAddress, + sc_id: ScArray, + sc_name: &[u8], + ) { let sovereigns_mapper = self.sovereigns_mapper(sovereign_creator); require!( @@ -53,12 +58,12 @@ pub trait UtilsModule: super::storage::StorageModule { let deployed_contracts_mapper = self.sovereign_deployed_contracts(&chain_id); let is_contract_deployed = deployed_contracts_mapper.iter().any(|sc| sc.id == sc_id); - let sc_id_as_u32 = sc_id as u32; + let sc_name_buffer = ManagedBuffer::from(sc_name); require!( is_contract_deployed, "The {} SC is not deployed inside this Sovereign Chain", - sc_id_as_u32 + sc_name_buffer ); } diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 4f1f168f..620f1562 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -93,7 +93,7 @@ pub trait PhasesModule: let blockchain_api = self.blockchain(); let caller = blockchain_api.get_caller(); - self.check_if_contract_deployed(&caller, ScArray::ChainConfig); + self.check_if_contract_deployed(&caller, ScArray::ChainConfig, b"ChainConfig"); let header_verifier_address = self.deploy_header_verifier(bls_keys); From e03a74ff1b7f2069097ee8cc05970f29b04229c8 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 14:48:17 +0200 Subject: [PATCH 38/87] Removed unnecessary variable and made deploy functions `#[inline]` Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/sc_deploy.rs | 15 ++++++--------- sovereign-forge/src/common/utils.rs | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/sovereign-forge/src/common/sc_deploy.rs b/sovereign-forge/src/common/sc_deploy.rs index 2c55cb53..38a73ebe 100644 --- a/sovereign-forge/src/common/sc_deploy.rs +++ b/sovereign-forge/src/common/sc_deploy.rs @@ -5,6 +5,7 @@ use transaction::StakeMultiArg; #[multiversx_sc::module] pub trait ScDeployModule: super::utils::UtilsModule + super::storage::StorageModule { + #[inline] fn deploy_chain_config( &self, min_validators: u64, @@ -12,10 +13,8 @@ pub trait ScDeployModule: super::utils::UtilsModule + super::storage::StorageMod min_stake: BigUint, additional_stake_required: MultiValueEncoded>, ) -> ManagedAddress { - let chain_factory_address = self.get_caller_shard_id(); - self.tx() - .to(chain_factory_address) + .to(self.get_chain_factory_address()) .typed(ChainFactoryContractProxy) .deploy_sovereign_chain_config_contract( min_validators, @@ -27,22 +26,20 @@ pub trait ScDeployModule: super::utils::UtilsModule + super::storage::StorageMod .sync_call() } + #[inline] fn deploy_header_verifier(&self, bls_keys: MultiValueEncoded) -> ManagedAddress { - let chain_factory_address = self.get_caller_shard_id(); - self.tx() - .to(chain_factory_address) + .to(self.get_chain_factory_address()) .typed(ChainFactoryContractProxy) .deploy_header_verifier(bls_keys) .returns(ReturnsResult) .sync_call() } + #[inline] fn deploy_esdt_safe(&self, is_sovereign_chain: bool) -> ManagedAddress { - let chain_factory_address = self.get_caller_shard_id(); - self.tx() - .to(chain_factory_address) + .to(self.get_chain_factory_address()) .typed(ChainFactoryContractProxy) .deploy_esdt_safe(is_sovereign_chain) .returns(ReturnsResult) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 267c9390..d1602ee9 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -95,7 +95,7 @@ pub trait UtilsModule: super::storage::StorageModule { ); } - fn get_caller_shard_id(&self) -> ManagedAddress { + fn get_chain_factory_address(&self) -> ManagedAddress { let caller = self.blockchain().get_caller(); let shard_id = self.blockchain().get_shard_of_address(&caller); From 41ab7e0a964ec42ca05a2beeb0295be24d5e9c74 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 16:14:49 +0200 Subject: [PATCH 39/87] Added function to check if the first phase is completed Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 20 ++++++++------------ sovereign-forge/src/phases.rs | 5 ++--- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index d1602ee9..997ff967 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -11,8 +11,6 @@ const CHARSET: &[u8] = b"0123456789abcdefghijklmnopqrstuvwxyz"; use crate::err_msg; -use super::storage::ChainId; - #[type_abi] #[derive(TopEncode, TopDecode, NestedEncode, NestedDecode, ManagedVecItem)] pub struct ContractInfo { @@ -41,6 +39,14 @@ pub enum ScArray { #[multiversx_sc::module] pub trait UtilsModule: super::storage::StorageModule { + fn require_phase_1_completed(&self, caller: &ManagedAddress) { + require!( + self.sovereigns_mapper(caller).is_empty(), + "The current caller has not deployed any Sovereign Chain" + ); + self.check_if_contract_deployed(&caller, ScArray::ChainConfig, b"ChainConfig"); + } + fn check_if_contract_deployed( &self, sovereign_creator: &ManagedAddress, @@ -101,14 +107,4 @@ pub trait UtilsModule: super::storage::StorageModule { self.chain_factories(shard_id).get() } - - fn get_sovereign_chain_id(&self, sovereign_creator: &ManagedAddress) -> ChainId { - let sovereign_mapper = self.sovereigns_mapper(sovereign_creator); - require!( - !sovereign_mapper.is_empty(), - "There is no sovereign created by this address" - ); - - sovereign_mapper.get() - } } diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 620f1562..9ca79248 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -93,15 +93,14 @@ pub trait PhasesModule: let blockchain_api = self.blockchain(); let caller = blockchain_api.get_caller(); - self.check_if_contract_deployed(&caller, ScArray::ChainConfig, b"ChainConfig"); + self.require_phase_1_completed(&caller); let header_verifier_address = self.deploy_header_verifier(bls_keys); let header_verifier_contract_info = ContractInfo::new(ScArray::HeaderVerifier, header_verifier_address); - let chain_id = self.get_sovereign_chain_id(&caller); - self.sovereign_deployed_contracts(&chain_id) + self.sovereign_deployed_contracts(&self.sovereigns_mapper(&caller).get()) .insert(header_verifier_contract_info); } } From 7dee3f29b460364786efd9b3c5f9d3d3c5baaa9f Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 16:18:16 +0200 Subject: [PATCH 40/87] Clippy fix 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 997ff967..64b088e3 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -44,7 +44,7 @@ pub trait UtilsModule: super::storage::StorageModule { self.sovereigns_mapper(caller).is_empty(), "The current caller has not deployed any Sovereign Chain" ); - self.check_if_contract_deployed(&caller, ScArray::ChainConfig, b"ChainConfig"); + self.check_if_contract_deployed(caller, ScArray::ChainConfig, b"ChainConfig"); } fn check_if_contract_deployed( From b9eccdc3977b0f04eb1a5995d7778b6633d367d1 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 16:43:08 +0200 Subject: [PATCH 41/87] 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 6deed30be8b494ac3450092a113e7c696e4bb094 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 16:58:28 +0200 Subject: [PATCH 42/87] Modified function to check first phase of deployment Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 27 ++++++++++++--------------- sovereign-forge/src/phases.rs | 7 +++---- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 64b088e3..a88c8b57 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -44,15 +44,19 @@ pub trait UtilsModule: super::storage::StorageModule { self.sovereigns_mapper(caller).is_empty(), "The current caller has not deployed any Sovereign Chain" ); - self.check_if_contract_deployed(caller, ScArray::ChainConfig, b"ChainConfig"); + + require!( + self.is_contract_deployed(caller, ScArray::ChainConfig), + "The Chain-Config SC is not deployed" + ); + + require!( + !self.is_contract_deployed(caller, ScArray::HeaderVerifier), + "The Header-Verifier SC is already deployed" + ); } - fn check_if_contract_deployed( - &self, - sovereign_creator: &ManagedAddress, - sc_id: ScArray, - sc_name: &[u8], - ) { + fn is_contract_deployed(&self, sovereign_creator: &ManagedAddress, sc_id: ScArray) -> bool { let sovereigns_mapper = self.sovereigns_mapper(sovereign_creator); require!( @@ -63,14 +67,7 @@ pub trait UtilsModule: super::storage::StorageModule { let chain_id = sovereigns_mapper.get(); let deployed_contracts_mapper = self.sovereign_deployed_contracts(&chain_id); - let is_contract_deployed = deployed_contracts_mapper.iter().any(|sc| sc.id == sc_id); - let sc_name_buffer = ManagedBuffer::from(sc_name); - - require!( - is_contract_deployed, - "The {} SC is not deployed inside this Sovereign Chain", - sc_name_buffer - ); + deployed_contracts_mapper.iter().any(|sc| sc.id == sc_id) } fn generate_chain_id(&self) -> ManagedBuffer { diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 9ca79248..8fabae97 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -74,10 +74,9 @@ pub trait PhasesModule: additional_stake_required, ); - let sovereigns_mapper = self.sovereigns_mapper(&caller); require!( - sovereigns_mapper.is_empty(), - "There is already a deployed Sovereign Chain for this user" + !self.is_contract_deployed(&caller, ScArray::ChainConfig), + "The Chain-Factory Contract is already deployed" ); let chain_factory_contract_info = @@ -85,7 +84,7 @@ pub trait PhasesModule: self.sovereign_deployed_contracts(&chain_id) .insert(chain_factory_contract_info); - sovereigns_mapper.set(chain_id); + self.sovereigns_mapper(&caller).set(chain_id); } #[endpoint(deployPhaseTwo)] From 90fbe0880d8e172e9c972b3491f2d257b39d2e54 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 16:59:27 +0200 Subject: [PATCH 43/87] Added require before deployment Signed-off-by: Andrei Baltariu --- sovereign-forge/src/phases.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 8fabae97..59e0fc98 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -67,6 +67,11 @@ pub trait PhasesModule: caller_shard_id ); + require!( + !self.is_contract_deployed(&caller, ScArray::ChainConfig), + "The Chain-Factory Contract is already deployed" + ); + let chain_config_address = self.deploy_chain_config( min_validators, max_validators, @@ -74,11 +79,6 @@ pub trait PhasesModule: additional_stake_required, ); - require!( - !self.is_contract_deployed(&caller, ScArray::ChainConfig), - "The Chain-Factory Contract is already deployed" - ); - let chain_factory_contract_info = ContractInfo::new(ScArray::ChainConfig, chain_config_address); From ca44ef206d0a00f4bb8d12ed185249bbbe9cbc95 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 3 Dec 2024 17:03:07 +0200 Subject: [PATCH 44/87] Fixed failing test Signed-off-by: Andrei Baltariu --- sovereign-forge/tests/sovereign_forge_unit_tests.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs index 552e7ca3..42124551 100644 --- a/sovereign-forge/tests/sovereign_forge_unit_tests.rs +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -312,7 +312,10 @@ fn deploy_phase_one_chain_config_missing() { 2, BigUint::from(2u32), MultiValueEncoded::new(), - Some(ExpectError(10, "error signalled by smartcontract")), + Some(ExpectError( + 4, + "There are no contracts deployed for this Sovereign", + )), ); } From 23d7de9c1011212cba24a92df1fe2d11b94ec00b Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 4 Dec 2024 10:42:59 +0200 Subject: [PATCH 45/87] Fixed bug in `is_contract_deployed` function Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index a88c8b57..9742a4b5 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -57,17 +57,8 @@ pub trait UtilsModule: super::storage::StorageModule { } fn is_contract_deployed(&self, sovereign_creator: &ManagedAddress, sc_id: ScArray) -> bool { - let sovereigns_mapper = self.sovereigns_mapper(sovereign_creator); - - require!( - !sovereigns_mapper.is_empty(), - "There are no contracts deployed for this Sovereign" - ); - - let chain_id = sovereigns_mapper.get(); - let deployed_contracts_mapper = self.sovereign_deployed_contracts(&chain_id); - - deployed_contracts_mapper.iter().any(|sc| sc.id == sc_id) + let chain_id = self.sovereigns_mapper(sovereign_creator).get(); + self.sovereign_deployed_contracts(&chain_id).iter().any(|sc| sc.id == sc_id) } fn generate_chain_id(&self) -> ManagedBuffer { From 78a202f9c0c4a37c267bea925e8ddb042b5eb15d Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 4 Dec 2024 11:31:30 +0200 Subject: [PATCH 46/87] Fixed wrong require message Signed-off-by: Andrei Baltariu --- sovereign-forge/src/phases.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 59e0fc98..04d39e02 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -69,7 +69,7 @@ pub trait PhasesModule: require!( !self.is_contract_deployed(&caller, ScArray::ChainConfig), - "The Chain-Factory Contract is already deployed" + "The Chain-Config Contract is already deployed" ); let chain_config_address = self.deploy_chain_config( From bbb49b851831080fa8e15006f578015039aa5078 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 4 Dec 2024 11:36:03 +0200 Subject: [PATCH 47/87] Fixed require condition Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/utils.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 9742a4b5..2337f7e7 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -41,7 +41,7 @@ pub enum ScArray { pub trait UtilsModule: super::storage::StorageModule { fn require_phase_1_completed(&self, caller: &ManagedAddress) { require!( - self.sovereigns_mapper(caller).is_empty(), + !self.sovereigns_mapper(caller).is_empty(), "The current caller has not deployed any Sovereign Chain" ); @@ -58,7 +58,9 @@ pub trait UtilsModule: super::storage::StorageModule { fn is_contract_deployed(&self, sovereign_creator: &ManagedAddress, sc_id: ScArray) -> bool { let chain_id = self.sovereigns_mapper(sovereign_creator).get(); - self.sovereign_deployed_contracts(&chain_id).iter().any(|sc| sc.id == sc_id) + self.sovereign_deployed_contracts(&chain_id) + .iter() + .any(|sc| sc.id == sc_id) } fn generate_chain_id(&self) -> ManagedBuffer { From a98d9806cfa463258e7d036d6fffe672e01b441b Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 4 Dec 2024 12:10:01 +0200 Subject: [PATCH 48/87] Added coverage for sovereign-forge Signed-off-by: Andrei Baltariu --- Cargo.lock | 4 +- sovereign-forge/Cargo.toml | 6 + sovereign-forge/src/phases.rs | 2 +- .../tests/sovereign_forge_unit_tests.rs | 134 +++++++++++++++++- .../wasm-sovereign-forge-full/Cargo.lock | 14 +- .../wasm-soveriegn-forge-view/Cargo.lock | 14 +- sovereign-forge/wasm/Cargo.lock | 14 +- 7 files changed, 177 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 77684297..bcf5d375 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -2126,7 +2126,9 @@ dependencies = [ name = "sovereign-forge" version = "0.0.0" dependencies = [ + "chain-config", "chain-factory", + "header-verifier", "multiversx-sc", "multiversx-sc-modules", "multiversx-sc-scenario", diff --git a/sovereign-forge/Cargo.toml b/sovereign-forge/Cargo.toml index 312f95f7..f276ce48 100644 --- a/sovereign-forge/Cargo.toml +++ b/sovereign-forge/Cargo.toml @@ -23,6 +23,12 @@ version = "=0.54.4" [dependencies.chain-factory] path = "../chain-factory" +[dependencies.chain-config] +path = "../chain-config" + +[dependencies.header-verifier] +path = "../header-verifier" + [dependencies.proxies] path = "../common/proxies" diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 04d39e02..b897fa75 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -69,7 +69,7 @@ pub trait PhasesModule: require!( !self.is_contract_deployed(&caller, ScArray::ChainConfig), - "The Chain-Config Contract is already deployed" + "The Chain-Config contract is already deployed" ); let chain_config_address = self.deploy_chain_config( diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs index 42124551..82d4ff3c 100644 --- a/sovereign-forge/tests/sovereign_forge_unit_tests.rs +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -4,10 +4,11 @@ use multiversx_sc_scenario::{ ScenarioWorld, }; use proxies::{ - chain_factory_proxy::ChainFactoryContractProxy, sovereign_forge_proxy::SovereignForgeProxy, + chain_config_proxy::ChainConfigContractProxy, chain_factory_proxy::ChainFactoryContractProxy, + header_verifier_proxy::HeaderverifierProxy, sovereign_forge_proxy::SovereignForgeProxy, }; use setup_phase::SetupPhaseModule; -use sovereign_forge::common::storage::StorageModule; +use sovereign_forge::common::{storage::StorageModule, utils::ScArray}; use transaction::StakeMultiArg; const FORGE_ADDRESS: TestSCAddress = TestSCAddress::new("sovereign-forge"); @@ -18,6 +19,13 @@ const FACTORY_ADDRESS: TestSCAddress = TestSCAddress::new("chain-factory"); const FACTORY_CODE_PATH: MxscPath = MxscPath::new("../chain-factory/output/chain-factory.mxsc.json"); +const CONFIG_ADDRESS: TestSCAddress = TestSCAddress::new("chain-config"); +const CONFIG_CODE_PATH: MxscPath = MxscPath::new("../chain-config/output/chain-config.mxsc.json"); + +const HEADER_VERIFIER_ADDRESS: TestSCAddress = TestSCAddress::new("header-verifier"); +const HEADER_VERIFIER_CODE_PATH: MxscPath = + MxscPath::new("../header-verifier/output/header-verifier.mxsc.json"); + const TOKEN_HANDLER_ADDRESS: TestSCAddress = TestSCAddress::new("token-handler"); const BALANCE: u128 = 100_000_000_000_000_000; @@ -28,6 +36,8 @@ fn world() -> ScenarioWorld { blockchain.register_contract(FORGE_CODE_PATH, sovereign_forge::ContractBuilder); 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 } @@ -54,7 +64,7 @@ impl SovereignForgeTestState { .from(FORGE_ADDRESS) .typed(ChainFactoryContractProxy) .init( - FACTORY_ADDRESS, + CONFIG_ADDRESS, FACTORY_ADDRESS, FACTORY_ADDRESS, FACTORY_ADDRESS, @@ -79,6 +89,42 @@ impl SovereignForgeTestState { self } + fn deploy_chain_config_template(&mut self) -> &mut Self { + self.world + .tx() + .from(OWNER_ADDRESS) + .typed(ChainConfigContractProxy) + .init( + 1u64, + 2u64, + BigUint::from(1u32), + OWNER_ADDRESS, + MultiValueEncoded::>::new(), + ) + .code(CONFIG_CODE_PATH) + .new_address(CONFIG_ADDRESS) + .run(); + + self + } + + fn deploy_header_verifier_template(&mut self) -> &mut Self { + let mut bls_keys = MultiValueEncoded::new(); + bls_keys.push(ManagedBuffer::from("bls1")); + bls_keys.push(ManagedBuffer::from("bls2")); + + self.world + .tx() + .from(OWNER_ADDRESS) + .typed(HeaderverifierProxy) + .init(bls_keys) + .code(HEADER_VERIFIER_CODE_PATH) + .new_address(HEADER_VERIFIER_ADDRESS) + .run(); + + self + } + fn register_token_handler( &mut self, shard_id: u32, @@ -298,14 +344,24 @@ fn deploy_phase_one_deploy_cost_too_low() { } #[test] -fn deploy_phase_one_chain_config_missing() { +fn deploy_phase_one_chain_config_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.clone(), + 1, + 2, + BigUint::from(2u32), + MultiValueEncoded::new(), + None, + ); + state.deploy_phase_one( deploy_cost, 1, @@ -314,11 +370,49 @@ fn deploy_phase_one_chain_config_missing() { MultiValueEncoded::new(), Some(ExpectError( 4, - "There are no contracts deployed for this Sovereign", + "The Chain-Config contract is already deployed", )), ); } +#[test] +fn deploy_phase_one() { + 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 + .world + .query() + .to(FORGE_ADDRESS) + .whitebox(sovereign_forge::contract_obj, |sc| { + let sovereign_mapper = sc.sovereigns_mapper(&OWNER_ADDRESS.to_managed_address()); + + assert!(!sovereign_mapper.is_empty()); + + let chain_id = sovereign_mapper.get(); + + let is_chain_config_deployed = sc + .sovereign_deployed_contracts(&chain_id) + .iter() + .any(|sc_info| sc_info.id == ScArray::ChainConfig); + assert!(is_chain_config_deployed); + }) +} + #[test] fn deploy_phase_two_without_first_phase() { let mut state = SovereignForgeTestState::new(); @@ -331,8 +425,36 @@ fn deploy_phase_two_without_first_phase() { state.deploy_phase_two( Some(ExpectError( 4, - "There are no contracts deployed for this Sovereign", + "The current caller has not deployed any Sovereign Chain", )), bls_keys, ); } + +#[test] +fn deploy_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(); + + 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); +} diff --git a/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock b/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock index d32cf72d..0d28ed81 100644 --- a/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock +++ b/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -48,6 +48,16 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "header-verifier" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "proxies", + "setup-phase", + "transaction", +] + [[package]] name = "hex" version = "0.4.3" @@ -211,7 +221,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" name = "sovereign-forge" version = "0.0.0" dependencies = [ + "chain-config", "chain-factory", + "header-verifier", "multiversx-sc", "multiversx-sc-modules", "proxies", diff --git a/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock b/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock index 491130b9..74bd87eb 100644 --- a/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock +++ b/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -48,6 +48,16 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "header-verifier" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "proxies", + "setup-phase", + "transaction", +] + [[package]] name = "hex" version = "0.4.3" @@ -211,7 +221,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" name = "sovereign-forge" version = "0.0.0" dependencies = [ + "chain-config", "chain-factory", + "header-verifier", "multiversx-sc", "multiversx-sc-modules", "proxies", diff --git a/sovereign-forge/wasm/Cargo.lock b/sovereign-forge/wasm/Cargo.lock index da12af97..1858e149 100644 --- a/sovereign-forge/wasm/Cargo.lock +++ b/sovereign-forge/wasm/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "arrayvec" @@ -48,6 +48,16 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "header-verifier" +version = "0.0.0" +dependencies = [ + "multiversx-sc", + "proxies", + "setup-phase", + "transaction", +] + [[package]] name = "hex" version = "0.4.3" @@ -211,7 +221,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" name = "sovereign-forge" version = "0.0.0" dependencies = [ + "chain-config", "chain-factory", + "header-verifier", "multiversx-sc", "multiversx-sc-modules", "proxies", From bbabe4d5a66af64b166598348230ef9f6affca83 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 4 Dec 2024 13:48:50 +0200 Subject: [PATCH 49/87] Fixed setup bug Signed-off-by: Andrei Baltariu --- sovereign-forge/tests/sovereign_forge_unit_tests.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs index 82d4ff3c..feefce37 100644 --- a/sovereign-forge/tests/sovereign_forge_unit_tests.rs +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -65,7 +65,7 @@ impl SovereignForgeTestState { .typed(ChainFactoryContractProxy) .init( CONFIG_ADDRESS, - FACTORY_ADDRESS, + HEADER_VERIFIER_ADDRESS, FACTORY_ADDRESS, FACTORY_ADDRESS, ) @@ -90,6 +90,8 @@ impl SovereignForgeTestState { } fn deploy_chain_config_template(&mut self) -> &mut Self { + let additional_stake_required = MultiValueEncoded::new(); + self.world .tx() .from(OWNER_ADDRESS) @@ -99,7 +101,7 @@ impl SovereignForgeTestState { 2u64, BigUint::from(1u32), OWNER_ADDRESS, - MultiValueEncoded::>::new(), + additional_stake_required, ) .code(CONFIG_CODE_PATH) .new_address(CONFIG_ADDRESS) @@ -109,15 +111,13 @@ impl SovereignForgeTestState { } fn deploy_header_verifier_template(&mut self) -> &mut Self { - let mut bls_keys = MultiValueEncoded::new(); - bls_keys.push(ManagedBuffer::from("bls1")); - bls_keys.push(ManagedBuffer::from("bls2")); + let bls_pub_keys = MultiValueEncoded::new(); self.world .tx() .from(OWNER_ADDRESS) .typed(HeaderverifierProxy) - .init(bls_keys) + .init(bls_pub_keys) .code(HEADER_VERIFIER_CODE_PATH) .new_address(HEADER_VERIFIER_ADDRESS) .run(); From 02c06e8356e54f5e4dcaa2080998e52a45c825aa Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 4 Dec 2024 13:58:27 +0200 Subject: [PATCH 50/87] Added reference Signed-off-by: Andrei Baltariu --- .../tests/sovereign_forge_unit_tests.rs | 84 ++++++++++++++----- 1 file changed, 62 insertions(+), 22 deletions(-) diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs index feefce37..894af493 100644 --- a/sovereign-forge/tests/sovereign_forge_unit_tests.rs +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -8,7 +8,10 @@ use proxies::{ header_verifier_proxy::HeaderverifierProxy, sovereign_forge_proxy::SovereignForgeProxy, }; use setup_phase::SetupPhaseModule; -use sovereign_forge::common::{storage::StorageModule, utils::ScArray}; +use sovereign_forge::common::{ + storage::StorageModule, + utils::{ScArray, UtilsModule}, +}; use transaction::StakeMultiArg; const FORGE_ADDRESS: TestSCAddress = TestSCAddress::new("sovereign-forge"); @@ -185,7 +188,7 @@ impl SovereignForgeTestState { fn deploy_phase_one( &mut self, - payment: BigUint, + payment: &BigUint, min_validators: u64, max_validators: u64, min_stake: BigUint, @@ -216,7 +219,7 @@ impl SovereignForgeTestState { fn deploy_phase_two( &mut self, expected_result: Option, - bls_keys: MultiValueEncoded>, + bls_keys: &MultiValueEncoded>, ) { let transaction = self .world @@ -245,14 +248,14 @@ impl SovereignForgeTestState { } #[test] -fn test_deploy_contracts() { +fn deploy_contracts() { let mut state = SovereignForgeTestState::new(); state.deploy_sovereign_forge(); state.deploy_chain_factory(); } #[test] -fn test_register_token_handler() { +fn register_token_handler() { let mut state = SovereignForgeTestState::new(); state.deploy_sovereign_forge(); @@ -268,7 +271,7 @@ fn test_register_token_handler() { } #[test] -fn test_register_chain_factory() { +fn register_chain_factory() { let mut state = SovereignForgeTestState::new(); state.deploy_sovereign_forge(); @@ -331,7 +334,7 @@ fn deploy_phase_one_deploy_cost_too_low() { let deploy_cost = BigUint::from(1u32); state.deploy_phase_one( - deploy_cost, + &deploy_cost, 1, 2, BigUint::from(2u32), @@ -354,7 +357,7 @@ fn deploy_phase_one_chain_config_already_deployed() { let deploy_cost = BigUint::from(100_000u32); state.deploy_phase_one( - deploy_cost.clone(), + &deploy_cost, 1, 2, BigUint::from(2u32), @@ -363,7 +366,7 @@ fn deploy_phase_one_chain_config_already_deployed() { ); state.deploy_phase_one( - deploy_cost, + &deploy_cost, 1, 2, BigUint::from(2u32), @@ -386,7 +389,7 @@ fn deploy_phase_one() { let deploy_cost = BigUint::from(100_000u32); state.deploy_phase_one( - deploy_cost, + &deploy_cost, 1, 2, BigUint::from(2u32), @@ -399,16 +402,12 @@ fn deploy_phase_one() { .query() .to(FORGE_ADDRESS) .whitebox(sovereign_forge::contract_obj, |sc| { - let sovereign_mapper = sc.sovereigns_mapper(&OWNER_ADDRESS.to_managed_address()); - - assert!(!sovereign_mapper.is_empty()); - - let chain_id = sovereign_mapper.get(); + assert!(!sc + .sovereigns_mapper(&OWNER_ADDRESS.to_managed_address()) + .is_empty()); - let is_chain_config_deployed = sc - .sovereign_deployed_contracts(&chain_id) - .iter() - .any(|sc_info| sc_info.id == ScArray::ChainConfig); + let is_chain_config_deployed = + sc.is_contract_deployed(&OWNER_ADDRESS.to_managed_address(), ScArray::ChainConfig); assert!(is_chain_config_deployed); }) } @@ -427,7 +426,7 @@ fn deploy_phase_two_without_first_phase() { 4, "The current caller has not deployed any Sovereign Chain", )), - bls_keys, + &bls_keys, ); } @@ -442,7 +441,7 @@ fn deploy_phase_two() { let deploy_cost = BigUint::from(100_000u32); state.deploy_phase_one( - deploy_cost, + &deploy_cost, 1, 2, BigUint::from(2u32), @@ -456,5 +455,46 @@ fn deploy_phase_two() { bls_keys.push(ManagedBuffer::from("bls1")); bls_keys.push(ManagedBuffer::from("bls2")); - state.deploy_phase_two(None, bls_keys); + state.deploy_phase_two(None, &bls_keys); + + state + .world + .query() + .to(FORGE_ADDRESS) + .whitebox(sovereign_forge::contract_obj, |sc| { + let is_header_verifier_deployed = sc + .is_contract_deployed(&OWNER_ADDRESS.to_managed_address(), ScArray::HeaderVerifier); + + assert!(is_header_verifier_deployed); + }) +} + +#[test] +fn deploy_phase_two_header_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(); + + let bls_keys = MultiValueEncoded::new(); + + state.deploy_phase_two(None, &bls_keys); + state.deploy_phase_two( + Some(ExpectError(4, "The Header-Verifier SC is already deployed")), + &bls_keys, + ); } From 6690a9324ad3002f1d36232de676c26208dca73a Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Thu, 5 Dec 2024 10:08:04 +0200 Subject: [PATCH 51/87] 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 52/87] 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 53/87] 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 54/87] 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 e6ac6eb7e606c67ee72e12ccfb1005ef83e2f500 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 6 Dec 2024 12:32:45 +0200 Subject: [PATCH 55/87] Added interactor setup Signed-off-by: Andrei Baltariu --- Cargo.lock | 13 + Cargo.toml | 1 + sovereign-forge/interactor/.gitignore | 2 + sovereign-forge/interactor/Cargo.toml | 34 ++ sovereign-forge/interactor/config.toml | 7 + sovereign-forge/interactor/src/config.rs | 51 ++ sovereign-forge/interactor/src/interact.rs | 451 ++++++++++++++++++ .../interactor/src/interactor_main.rs | 7 + sovereign-forge/interactor/src/proxy.rs | 238 +++++++++ sovereign-forge/interactor/state.toml | 1 + .../interactor/tests/interact_cs_tests.rs | 21 + .../interactor/tests/interact_tests.rs | 19 + sovereign-forge/sc-config.toml | 4 + 13 files changed, 849 insertions(+) create mode 100644 sovereign-forge/interactor/.gitignore create mode 100644 sovereign-forge/interactor/Cargo.toml create mode 100644 sovereign-forge/interactor/config.toml create mode 100644 sovereign-forge/interactor/src/config.rs create mode 100644 sovereign-forge/interactor/src/interact.rs create mode 100644 sovereign-forge/interactor/src/interactor_main.rs create mode 100644 sovereign-forge/interactor/src/proxy.rs create mode 100644 sovereign-forge/interactor/state.toml create mode 100644 sovereign-forge/interactor/tests/interact_cs_tests.rs create mode 100644 sovereign-forge/interactor/tests/interact_tests.rs diff --git a/Cargo.lock b/Cargo.lock index c6dcbe9f..7cfbdf3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -639,6 +639,19 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "forge-rust-interact" +version = "0.0.0" +dependencies = [ + "clap", + "multiversx-sc", + "multiversx-sc-snippets", + "proxies", + "serde", + "sovereign-forge", + "toml", +] + [[package]] name = "form_urlencoded" version = "1.2.1" diff --git a/Cargo.toml b/Cargo.toml index 4dda3dc6..60134fc0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,5 +21,6 @@ members = [ "testing-sc", "testing-sc/meta", "sovereign-forge", + "sovereign-forge/interactor", "sovereign-forge/meta", ] diff --git a/sovereign-forge/interactor/.gitignore b/sovereign-forge/interactor/.gitignore new file mode 100644 index 00000000..5a64d09a --- /dev/null +++ b/sovereign-forge/interactor/.gitignore @@ -0,0 +1,2 @@ +# Pem files are used for interactions, but shouldn't be committed +*.pem diff --git a/sovereign-forge/interactor/Cargo.toml b/sovereign-forge/interactor/Cargo.toml new file mode 100644 index 00000000..71b1d326 --- /dev/null +++ b/sovereign-forge/interactor/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "forge-rust-interact" +version = "0.0.0" +authors = ["you"] +edition = "2021" +publish = false + +[[bin]] +name = "forge-rust-interact" +path = "src/interactor_main.rs" + +[lib] +path = "src/interact.rs" + +[dependencies.sovereign-forge] +path = ".." + +[dependencies.multiversx-sc-snippets] +version = "0.54.5" + +[dependencies.multiversx-sc] +version = "0.54.5" + +[dependencies.proxies] +path = "../../common/proxies" + +[dependencies] +clap = { version = "4.4.7", features = ["derive"] } +serde = { version = "1.0", features = ["derive"] } +toml = "0.8.6" + +[features] +chain-simulator-tests = [] + diff --git a/sovereign-forge/interactor/config.toml b/sovereign-forge/interactor/config.toml new file mode 100644 index 00000000..a53e51c9 --- /dev/null +++ b/sovereign-forge/interactor/config.toml @@ -0,0 +1,7 @@ + +chain_type = 'simulator' +gateway_uri = 'http://localhost:8085' + +# chain_type = 'real' +# gateway_uri = 'https://devnet-gateway.multiversx.com' + diff --git a/sovereign-forge/interactor/src/config.rs b/sovereign-forge/interactor/src/config.rs new file mode 100644 index 00000000..2d072b4b --- /dev/null +++ b/sovereign-forge/interactor/src/config.rs @@ -0,0 +1,51 @@ +#![allow(unused)] + +use serde::Deserialize; +use std::io::Read; + +/// Config file +const CONFIG_FILE: &str = "config.toml"; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum ChainType { + Real, + Simulator, +} + +/// Contract Interact configuration +#[derive(Debug, Deserialize)] +pub struct Config { + pub gateway_uri: String, + pub chain_type: ChainType, +} + +impl Config { + // Deserializes config from file + pub fn new() -> Self { + let mut file = std::fs::File::open(CONFIG_FILE).unwrap(); + let mut content = String::new(); + file.read_to_string(&mut content).unwrap(); + toml::from_str(&content).unwrap() + } + + pub fn chain_simulator_config() -> Self { + Config { + gateway_uri: "http://localhost:8085".to_owned(), + chain_type: ChainType::Simulator, + } + } + + // Returns the gateway URI + pub fn gateway_uri(&self) -> &str { + &self.gateway_uri + } + + // Returns if chain type is chain simulator + pub fn use_chain_simulator(&self) -> bool { + match self.chain_type { + ChainType::Real => false, + ChainType::Simulator => true, + } + } +} diff --git a/sovereign-forge/interactor/src/interact.rs b/sovereign-forge/interactor/src/interact.rs new file mode 100644 index 00000000..da238842 --- /dev/null +++ b/sovereign-forge/interactor/src/interact.rs @@ -0,0 +1,451 @@ +#![allow(non_snake_case)] + +mod config; +mod proxy; + +use config::Config; +use multiversx_sc_snippets::{imports::*, sdk::bech32}; +use proxies::{ + chain_config_proxy::ChainConfigContractProxy, chain_factory_proxy::ChainFactoryContractProxy, + header_verifier_proxy::HeaderverifierProxy, sovereign_forge_proxy::SovereignForgeProxy, +}; +use serde::{Deserialize, Serialize}; +use std::{ + io::{Read, Write}, + path::Path, +}; + +const STATE_FILE: &str = "state.toml"; +const CHAIN_CONFIG_CODE_PATH: &str = "../../chain-config/output/chain-config.mxsc.json"; +const HEADER_VERIFIER_CODE_PATH: &str = "../../header-verifier/output/header-verifier.mxsc.json"; + +pub async fn sovereign_forge_cli() { + env_logger::init(); + + let mut args = std::env::args(); + let _ = args.next(); + let cmd = args.next().expect("at least one argument required"); + let mut interact = ContractInteract::new().await; + match cmd.as_str() { + "deploy" => interact.deploy().await, + "upgrade" => interact.upgrade().await, + "registerTokenHandler" => interact.register_token_handler().await, + "registerChainFactory" => interact.register_chain_factory().await, + "completeSetupPhase" => interact.complete_setup_phase().await, + "deployPhaseOne" => interact.deploy_phase_one().await, + "deployPhaseTwo" => interact.deploy_phase_two().await, + "deployPhaseThree" => interact.deploy_phase_three().await, + "setAddress" => interact.set_address().await, + "getChainFactoryAddress" => interact.chain_factories().await, + "getTokenHandlerAddress" => interact.token_handlers().await, + "getDeployCost" => interact.deploy_cost().await, + "getAllChainIds" => interact.chain_ids().await, + _ => panic!("unknown command: {}", &cmd), + } +} + +#[derive(Debug, Default, Serialize, Deserialize)] +pub struct State { + contract_address: Option, + config_address: Option, + header_verifier_address: Option, +} + +impl State { + // Deserializes state from file + pub fn load_state() -> Self { + if Path::new(STATE_FILE).exists() { + let mut file = std::fs::File::open(STATE_FILE).unwrap(); + let mut content = String::new(); + file.read_to_string(&mut content).unwrap(); + toml::from_str(&content).unwrap() + } else { + Self::default() + } + } + + /// Sets the contract address + pub fn set_address(&mut self, address: Bech32Address) { + self.contract_address = Some(address); + } + + /// Sets the contract address + pub fn set_config_template(&mut self, address: Bech32Address) { + self.config_address = Some(address); + } + + /// Sets the contract address + pub fn set_header_verifier_address(&mut self, address: Bech32Address) { + self.header_verifier_address = Some(address); + } + + /// Returns the contract address + pub fn current_address(&self) -> &Bech32Address { + self.contract_address + .as_ref() + .expect("no known contract, deploy first") + } +} + +impl Drop for State { + // Serializes state to file + fn drop(&mut self) { + let mut file = std::fs::File::create(STATE_FILE).unwrap(); + file.write_all(toml::to_string(self).unwrap().as_bytes()) + .unwrap(); + } +} + +pub struct ContractInteract { + interactor: Interactor, + wallet_address: Address, + contract_code: BytesValue, + state: State, +} + +impl ContractInteract { + pub async fn new() -> Self { + let config = Config::new(); + let mut interactor = Interactor::new(config.gateway_uri()) + .await + .use_chain_simulator(config.use_chain_simulator()); + + interactor.set_current_dir_from_workspace("sovereign_forge"); + let wallet_address = interactor.register_wallet(test_wallets::alice()).await; + + // Useful in the chain simulator setting + // generate blocks until ESDTSystemSCAddress is enabled + interactor.generate_blocks_until_epoch(1).await.unwrap(); + + let contract_code = BytesValue::interpret_from( + "mxsc:../output/sovereign-forge.mxsc.json", + &InterpreterContext::default(), + ); + + ContractInteract { + interactor, + wallet_address, + contract_code, + state: State::load_state(), + } + } + + pub async fn deploy(&mut self) { + let deploy_cost = BigUint::::from(100u128); + + let new_address = self + .interactor + .tx() + .from(&self.wallet_address) + .gas(30_000_000u64) + .typed(SovereignForgeProxy) + .init(deploy_cost) + .code(&self.contract_code) + .returns(ReturnsNewAddress) + .run() + .await; + let new_address_bech32 = bech32::encode(&new_address); + self.state.set_address(Bech32Address::from_bech32_string( + new_address_bech32.clone(), + )); + + println!("new address: {new_address_bech32}"); + } + + pub async fn deploy_chain_factory(&mut self) { + let header_verifier_bech32 = &self.state.header_verifier_address.as_ref().unwrap(); + let header_verifier_address = header_verifier_bech32.to_address(); + let header_verifier_managed_address = ManagedAddress::from(header_verifier_address); + + let new_address = self + .interactor + .tx() + .from(&self.wallet_address) + .gas(30_000_000u64) + .typed(ChainFactoryContractProxy) + .init( + ManagedAddress::from(&self.state.config_address.as_ref().unwrap().to_address()), + header_verifier_managed_address.clone(), + header_verifier_managed_address.clone(), + header_verifier_managed_address, + ) + .code(&self.contract_code) + .returns(ReturnsNewAddress) + .run() + .await; + + let new_address_bech32 = bech32::encode(&new_address); + self.state.set_address(Bech32Address::from_bech32_string( + new_address_bech32.clone(), + )); + + println!("new address: {new_address_bech32}"); + } + + pub async fn deploy_header_verifier(&mut self) { + let new_address = self + .interactor + .tx() + .from(&self.wallet_address) + .typed(HeaderverifierProxy) + .init(MultiValueEncoded::new()) + .returns(ReturnsNewAddress) + .code(MxscPath::new(HEADER_VERIFIER_CODE_PATH)) + .run() + .await; + + let new_address_bech32 = bech32::encode(&new_address); + self.state + .set_header_verifier_address(Bech32Address::from_bech32_string( + new_address_bech32.clone(), + )); + } + + pub async fn deploy_chain_config(&mut self) { + let new_address = self + .interactor + .tx() + .from(&self.wallet_address) + .typed(ChainConfigContractProxy) + .init( + 1u64, + 2u64, + BigUint::from(100u64), + &self.wallet_address, + MultiValueEncoded::new(), + ) + .returns(ReturnsNewAddress) + .code(MxscPath::new(CHAIN_CONFIG_CODE_PATH)) + .run() + .await; + + let new_address_bech32 = bech32::encode(&new_address); + self.state + .set_config_template(Bech32Address::from_bech32_string( + new_address_bech32.clone(), + )); + } + + pub async fn upgrade(&mut self) { + let response = self + .interactor + .tx() + .to(self.state.current_address()) + .from(&self.wallet_address) + .gas(30_000_000u64) + .typed(SovereignForgeProxy) + .upgrade() + .code(&self.contract_code) + .code_metadata(CodeMetadata::UPGRADEABLE) + .returns(ReturnsNewAddress) + .run() + .await; + + println!("Result: {response:?}"); + } + + pub async fn register_token_handler(&mut self) { + let shard_id = 0u32; + let token_handler_address = bech32::decode(""); + + let response = self + .interactor + .tx() + .from(&self.wallet_address) + .to(self.state.current_address()) + .gas(30_000_000u64) + .typed(SovereignForgeProxy) + .register_token_handler(shard_id, token_handler_address) + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {response:?}"); + } + + pub async fn register_chain_factory(&mut self) { + let shard_id = 0u32; + let chain_factory_address = bech32::decode(""); + + let response = self + .interactor + .tx() + .from(&self.wallet_address) + .to(self.state.current_address()) + .gas(30_000_000u64) + .typed(SovereignForgeProxy) + .register_chain_factory(shard_id, chain_factory_address) + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {response:?}"); + } + + pub async fn complete_setup_phase(&mut self) { + let response = self + .interactor + .tx() + .from(&self.wallet_address) + .to(self.state.current_address()) + .gas(30_000_000u64) + .typed(proxy::SovereignForgeProxy) + .complete_setup_phase() + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {response:?}"); + } + + pub async fn deploy_phase_one(&mut self) { + let egld_amount = BigUint::::from(100u128); + + let min_validators = 0u64; + let max_validators = 0u64; + let min_stake = BigUint::::from(0u128); + let additional_stake_required = MultiValueVec::from(vec![MultiValue2::< + TokenIdentifier, + BigUint, + >::from(( + TokenIdentifier::from_esdt_bytes(&b""[..]), + BigUint::::from(0u128), + ))]); + + let response = self + .interactor + .tx() + .from(&self.wallet_address) + .to(self.state.current_address()) + .gas(30_000_000u64) + .typed(proxy::SovereignForgeProxy) + .deploy_phase_one( + min_validators, + max_validators, + min_stake, + additional_stake_required, + ) + .egld(egld_amount) + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {response:?}"); + } + + pub async fn deploy_phase_two(&mut self) { + let bls_keys = MultiValueVec::from(vec![ManagedBuffer::new_from_bytes(&b""[..])]); + + let response = self + .interactor + .tx() + .from(&self.wallet_address) + .to(self.state.current_address()) + .gas(30_000_000u64) + .typed(SovereignForgeProxy) + .deploy_phase_two(bls_keys) + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {response:?}"); + } + + pub async fn deploy_phase_three(&mut self) { + let is_sovereign_chain = false; + let header_verifier_address = bech32::decode(""); + + let response = self + .interactor + .tx() + .from(&self.wallet_address) + .to(self.state.current_address()) + .gas(30_000_000u64) + .typed(proxy::SovereignForgeProxy) + .deploy_phase_three(is_sovereign_chain, header_verifier_address) + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {response:?}"); + } + + pub async fn set_address(&mut self) { + let esdt_safe_address = bech32::decode(""); + let header_verifier_address = bech32::decode(""); + + let response = self + .interactor + .tx() + .from(&self.wallet_address) + .to(self.state.current_address()) + .gas(30_000_000u64) + .typed(SovereignForgeProxy) + .set_address(esdt_safe_address, header_verifier_address) + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {response:?}"); + } + + pub async fn chain_factories(&mut self) { + let shard_id = 0u32; + + let result_value = self + .interactor + .query() + .to(self.state.current_address()) + .typed(proxy::SovereignForgeProxy) + .chain_factories(shard_id) + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {result_value:?}"); + } + + pub async fn token_handlers(&mut self) { + let shard_id = 0u32; + + let result_value = self + .interactor + .query() + .to(self.state.current_address()) + .typed(SovereignForgeProxy) + .token_handlers(shard_id) + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {result_value:?}"); + } + + pub async fn deploy_cost(&mut self) { + let result_value = self + .interactor + .query() + .to(self.state.current_address()) + .typed(proxy::SovereignForgeProxy) + .deploy_cost() + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {result_value:?}"); + } + + pub async fn chain_ids(&mut self) { + let result_value = self + .interactor + .query() + .to(self.state.current_address()) + .typed(SovereignForgeProxy) + .chain_ids() + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {result_value:?}"); + } +} diff --git a/sovereign-forge/interactor/src/interactor_main.rs b/sovereign-forge/interactor/src/interactor_main.rs new file mode 100644 index 00000000..b4c06c2f --- /dev/null +++ b/sovereign-forge/interactor/src/interactor_main.rs @@ -0,0 +1,7 @@ +use forge_rust_interact::sovereign_forge_cli; +use multiversx_sc_snippets::imports::*; + +#[tokio::main] +async fn main() { + sovereign_forge_cli().await; +} diff --git a/sovereign-forge/interactor/src/proxy.rs b/sovereign-forge/interactor/src/proxy.rs new file mode 100644 index 00000000..de7a16f9 --- /dev/null +++ b/sovereign-forge/interactor/src/proxy.rs @@ -0,0 +1,238 @@ +// 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 SovereignForgeProxy; + +impl TxProxyTrait for SovereignForgeProxy +where + Env: TxEnv, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + type TxProxyMethods = SovereignForgeProxyMethods; + + fn proxy_methods(self, tx: Tx) -> Self::TxProxyMethods { + SovereignForgeProxyMethods { wrapped_tx: tx } + } +} + +pub struct SovereignForgeProxyMethods +where + Env: TxEnv, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + wrapped_tx: Tx, +} + +#[rustfmt::skip] +impl SovereignForgeProxyMethods +where + Env: TxEnv, + Env::Api: VMApi, + From: TxFrom, + Gas: TxGas, +{ + pub fn init< + Arg0: ProxyArg>, + >( + self, + deploy_cost: Arg0, + ) -> TxTypedDeploy { + self.wrapped_tx + .payment(NotPayable) + .raw_deploy() + .argument(&deploy_cost) + .original_result() + } +} + +#[rustfmt::skip] +impl SovereignForgeProxyMethods +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 SovereignForgeProxyMethods +where + Env: TxEnv, + Env::Api: VMApi, + From: TxFrom, + To: TxTo, + Gas: TxGas, +{ + pub fn register_token_handler< + Arg0: ProxyArg, + Arg1: ProxyArg>, + >( + self, + shard_id: Arg0, + token_handler_address: Arg1, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("registerTokenHandler") + .argument(&shard_id) + .argument(&token_handler_address) + .original_result() + } + + pub fn register_chain_factory< + Arg0: ProxyArg, + Arg1: ProxyArg>, + >( + self, + shard_id: Arg0, + chain_factory_address: Arg1, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("registerChainFactory") + .argument(&shard_id) + .argument(&chain_factory_address) + .original_result() + } + + pub fn complete_setup_phase( + self, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("completeSetupPhase") + .original_result() + } + + pub fn deploy_phase_one< + Arg0: ProxyArg, + Arg1: ProxyArg, + Arg2: ProxyArg>, + Arg3: ProxyArg, BigUint>>>, + >( + self, + min_validators: Arg0, + max_validators: Arg1, + min_stake: Arg2, + additional_stake_required: Arg3, + ) -> TxTypedCall { + self.wrapped_tx + .raw_call("deployPhaseOne") + .argument(&min_validators) + .argument(&max_validators) + .argument(&min_stake) + .argument(&additional_stake_required) + .original_result() + } + + pub fn deploy_phase_two< + Arg0: ProxyArg>>, + >( + self, + bls_keys: Arg0, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("deployPhaseTwo") + .argument(&bls_keys) + .original_result() + } + + 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() + } + + pub fn chain_factories< + Arg0: ProxyArg, + >( + self, + shard_id: Arg0, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getChainFactoryAddress") + .argument(&shard_id) + .original_result() + } + + pub fn token_handlers< + Arg0: ProxyArg, + >( + self, + shard_id: Arg0, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getTokenHandlerAddress") + .argument(&shard_id) + .original_result() + } + + pub fn deploy_cost( + self, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getDeployCost") + .original_result() + } + + pub fn chain_ids( + self, + ) -> TxTypedCall>> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getAllChainIds") + .original_result() + } +} diff --git a/sovereign-forge/interactor/state.toml b/sovereign-forge/interactor/state.toml new file mode 100644 index 00000000..02d2f2d2 --- /dev/null +++ b/sovereign-forge/interactor/state.toml @@ -0,0 +1 @@ +contract_address = "erd1qqqqqqqqqqqqqpgqkgnuqzpdwhu4kju6ldnargywgtcumswad8sslg3vv0" diff --git a/sovereign-forge/interactor/tests/interact_cs_tests.rs b/sovereign-forge/interactor/tests/interact_cs_tests.rs new file mode 100644 index 00000000..2a17fc9e --- /dev/null +++ b/sovereign-forge/interactor/tests/interact_cs_tests.rs @@ -0,0 +1,21 @@ +use forge_rust_interact::ContractInteract; +use multiversx_sc_snippets::imports::*; + +// Simple deploy test that runs using the chain simulator configuration. +// In order for this test to work, make sure that the `config.toml` file contains the chain simulator config (or choose it manually) +// The chain simulator should already be installed and running before attempting to run this test. +// The chain-simulator-tests feature should be present in Cargo.toml. +// Can be run with `sc-meta test -c`. +#[tokio::test] +// #[cfg_attr(not(feature = "chain-simulator-tests"), ignore)] +async fn deploy_test_sovereign_forge_cs() { + let mut interactor = ContractInteract::new().await; + + interactor.deploy().await; + interactor.deploy_chain_config().await; + interactor.deploy_header_verifier().await; + + interactor.deploy_phase_one().await; + interactor.deploy_phase_two().await; + interactor.deploy_phase_three().await; +} diff --git a/sovereign-forge/interactor/tests/interact_tests.rs b/sovereign-forge/interactor/tests/interact_tests.rs new file mode 100644 index 00000000..5a094607 --- /dev/null +++ b/sovereign-forge/interactor/tests/interact_tests.rs @@ -0,0 +1,19 @@ +use forge_rust_interact::ContractInteract; +use multiversx_sc_snippets::imports::*; + +// Simple deploy test that runs on the real blockchain configuration. +// In order for this test to work, make sure that the `config.toml` file contains the real blockchain config (or choose it manually) +// Can be run with `sc-meta test`. +// #[tokio::test] +// #[ignore = "run on demand, relies on real blockchain state"] +// async fn deploy_test_sovereign_forge() { +// let mut interactor = ContractInteract::new().await; +// +// interactor.deploy().await; +// interactor.deploy_chain_config().await; +// interactor.deploy_header_verifier().await; +// +// interactor.deploy_phase_one().await; +// interactor.deploy_phase_two().await; +// interactor.deploy_phase_three().await; +// } diff --git a/sovereign-forge/sc-config.toml b/sovereign-forge/sc-config.toml index 163cb6f7..0bc6a705 100644 --- a/sovereign-forge/sc-config.toml +++ b/sovereign-forge/sc-config.toml @@ -17,3 +17,7 @@ add-labels = ["sovereign-forge-external-view"] [[proxy]] path = "../common/proxies/src/sovereign_forge_proxy.rs" + +[[proxy]] +path = "interactor/src/proxy.rs" + From bd87dec0b0517bd656ec37a7704f5c4079fd83a3 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Fri, 6 Dec 2024 15:00:53 +0200 Subject: [PATCH 56/87] WIP Sovereign Forge interactor setup fixes Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/src/interact.rs | 18 +++++++++----- sovereign-forge/interactor/state.toml | 4 +++- .../interactor/tests/interact_cs_tests.rs | 9 +++++++ sovereign-forge/src/phases.rs | 24 +++++++++---------- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/sovereign-forge/interactor/src/interact.rs b/sovereign-forge/interactor/src/interact.rs index da238842..142756bc 100644 --- a/sovereign-forge/interactor/src/interact.rs +++ b/sovereign-forge/interactor/src/interact.rs @@ -110,7 +110,7 @@ impl ContractInteract { .await .use_chain_simulator(config.use_chain_simulator()); - interactor.set_current_dir_from_workspace("sovereign_forge"); + interactor.set_current_dir_from_workspace("sovereign_forge/interactor"); let wallet_address = interactor.register_wallet(test_wallets::alice()).await; // Useful in the chain simulator setting @@ -137,7 +137,7 @@ impl ContractInteract { .interactor .tx() .from(&self.wallet_address) - .gas(30_000_000u64) + .gas(50_000_000u64) .typed(SovereignForgeProxy) .init(deploy_cost) .code(&self.contract_code) @@ -149,7 +149,7 @@ impl ContractInteract { new_address_bech32.clone(), )); - println!("new address: {new_address_bech32}"); + println!("new Forge address: {new_address_bech32}"); } pub async fn deploy_chain_factory(&mut self) { @@ -161,7 +161,7 @@ impl ContractInteract { .interactor .tx() .from(&self.wallet_address) - .gas(30_000_000u64) + .gas(50_000_000u64) .typed(ChainFactoryContractProxy) .init( ManagedAddress::from(&self.state.config_address.as_ref().unwrap().to_address()), @@ -179,7 +179,7 @@ impl ContractInteract { new_address_bech32.clone(), )); - println!("new address: {new_address_bech32}"); + println!("new Chain-Factory address: {new_address_bech32}"); } pub async fn deploy_header_verifier(&mut self) { @@ -187,6 +187,7 @@ impl ContractInteract { .interactor .tx() .from(&self.wallet_address) + .gas(50_000_000u64) .typed(HeaderverifierProxy) .init(MultiValueEncoded::new()) .returns(ReturnsNewAddress) @@ -199,6 +200,8 @@ impl ContractInteract { .set_header_verifier_address(Bech32Address::from_bech32_string( new_address_bech32.clone(), )); + + println!("new Header-Verifier address: {new_address_bech32}"); } pub async fn deploy_chain_config(&mut self) { @@ -206,6 +209,7 @@ impl ContractInteract { .interactor .tx() .from(&self.wallet_address) + .gas(50_000_000u64) .typed(ChainConfigContractProxy) .init( 1u64, @@ -224,6 +228,8 @@ impl ContractInteract { .set_config_template(Bech32Address::from_bech32_string( new_address_bech32.clone(), )); + + println!("new Chain-Config address: {new_address_bech32}"); } pub async fn upgrade(&mut self) { @@ -232,7 +238,7 @@ impl ContractInteract { .tx() .to(self.state.current_address()) .from(&self.wallet_address) - .gas(30_000_000u64) + .gas(50_000_000u64) .typed(SovereignForgeProxy) .upgrade() .code(&self.contract_code) diff --git a/sovereign-forge/interactor/state.toml b/sovereign-forge/interactor/state.toml index 02d2f2d2..3289cfe0 100644 --- a/sovereign-forge/interactor/state.toml +++ b/sovereign-forge/interactor/state.toml @@ -1 +1,3 @@ -contract_address = "erd1qqqqqqqqqqqqqpgqkgnuqzpdwhu4kju6ldnargywgtcumswad8sslg3vv0" +contract_address = "erd1qqqqqqqqqqqqqpgqcyn80qhgs926gtl2l7s6x6rneyksuxyvd8ssje4jl2" +config_address = "erd1qqqqqqqqqqqqqpgqg3rhq4rucjhnnxk6zhantd3yuh8v9m5cd8ssp73zh7" +header_verifier_address = "erd1qqqqqqqqqqqqqpgq59k00lhu335g6h0q894pz38uuk3ddmjwd8ssxtd8wr" diff --git a/sovereign-forge/interactor/tests/interact_cs_tests.rs b/sovereign-forge/interactor/tests/interact_cs_tests.rs index 2a17fc9e..5407c304 100644 --- a/sovereign-forge/interactor/tests/interact_cs_tests.rs +++ b/sovereign-forge/interactor/tests/interact_cs_tests.rs @@ -14,6 +14,15 @@ async fn deploy_test_sovereign_forge_cs() { interactor.deploy().await; interactor.deploy_chain_config().await; interactor.deploy_header_verifier().await; + interactor.complete_setup_phase().await; + + interactor.register_token_handler().await; + interactor.register_token_handler().await; + interactor.register_token_handler().await; + + interactor.register_chain_factory().await; + interactor.register_chain_factory().await; + interactor.register_chain_factory().await; interactor.deploy_phase_one().await; interactor.deploy_phase_two().await; diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 97cf5ff0..3dac5035 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -26,18 +26,18 @@ pub trait PhasesModule: return; } - for shard_id in 1..=NUMBER_OF_SHARDS { - require!( - !self.chain_factories(shard_id).is_empty(), - "There is no Chain-Factory contract assigned for shard {}", - shard_id - ); - require!( - !self.token_handlers(shard_id).is_empty(), - "There is no Token-Handler contract assigned for shard {}", - shard_id - ); - } + // for shard_id in 1..=NUMBER_OF_SHARDS { + // require!( + // !self.chain_factories(shard_id).is_empty(), + // "There is no Chain-Factory contract assigned for shard {}", + // shard_id + // ); + // require!( + // !self.token_handlers(shard_id).is_empty(), + // "There is no Token-Handler contract assigned for shard {}", + // shard_id + // ); + // } self.setup_phase_complete().set(true); } From af54cc1bf8be16e41076c40a0113b4a94f2c4498 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 9 Dec 2024 13:30:02 +0200 Subject: [PATCH 57/87] Uncommented code Signed-off-by: Andrei Baltariu --- sovereign-forge/src/phases.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 3dac5035..97cf5ff0 100644 --- a/sovereign-forge/src/phases.rs +++ b/sovereign-forge/src/phases.rs @@ -26,18 +26,18 @@ pub trait PhasesModule: return; } - // for shard_id in 1..=NUMBER_OF_SHARDS { - // require!( - // !self.chain_factories(shard_id).is_empty(), - // "There is no Chain-Factory contract assigned for shard {}", - // shard_id - // ); - // require!( - // !self.token_handlers(shard_id).is_empty(), - // "There is no Token-Handler contract assigned for shard {}", - // shard_id - // ); - // } + for shard_id in 1..=NUMBER_OF_SHARDS { + require!( + !self.chain_factories(shard_id).is_empty(), + "There is no Chain-Factory contract assigned for shard {}", + shard_id + ); + require!( + !self.token_handlers(shard_id).is_empty(), + "There is no Token-Handler contract assigned for shard {}", + shard_id + ); + } self.setup_phase_complete().set(true); } From 207d459c6a62c88e6b2b7aeea09e1d776c632233 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 9 Dec 2024 15:47:47 +0200 Subject: [PATCH 58/87] WIP interactor setp Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/config.toml | 2 +- sovereign-forge/interactor/src/interact.rs | 86 ++++++++++--------- sovereign-forge/interactor/state.toml | 7 +- .../interactor/tests/interact_cs_tests.rs | 31 +++++-- 4 files changed, 74 insertions(+), 52 deletions(-) diff --git a/sovereign-forge/interactor/config.toml b/sovereign-forge/interactor/config.toml index a53e51c9..1a67ad8d 100644 --- a/sovereign-forge/interactor/config.toml +++ b/sovereign-forge/interactor/config.toml @@ -1,7 +1,7 @@ chain_type = 'simulator' gateway_uri = 'http://localhost:8085' - +# # chain_type = 'real' # gateway_uri = 'https://devnet-gateway.multiversx.com' diff --git a/sovereign-forge/interactor/src/interact.rs b/sovereign-forge/interactor/src/interact.rs index 142756bc..e90e55ca 100644 --- a/sovereign-forge/interactor/src/interact.rs +++ b/sovereign-forge/interactor/src/interact.rs @@ -1,7 +1,6 @@ #![allow(non_snake_case)] mod config; -mod proxy; use config::Config; use multiversx_sc_snippets::{imports::*, sdk::bech32}; @@ -17,6 +16,7 @@ use std::{ const STATE_FILE: &str = "state.toml"; const CHAIN_CONFIG_CODE_PATH: &str = "../../chain-config/output/chain-config.mxsc.json"; +const CHAIN_FACTORY_CODE_PATH: &str = "../../chain-factory/output/chain-factory.mxsc.json"; const HEADER_VERIFIER_CODE_PATH: &str = "../../header-verifier/output/header-verifier.mxsc.json"; pub async fn sovereign_forge_cli() { @@ -29,8 +29,6 @@ pub async fn sovereign_forge_cli() { match cmd.as_str() { "deploy" => interact.deploy().await, "upgrade" => interact.upgrade().await, - "registerTokenHandler" => interact.register_token_handler().await, - "registerChainFactory" => interact.register_chain_factory().await, "completeSetupPhase" => interact.complete_setup_phase().await, "deployPhaseOne" => interact.deploy_phase_one().await, "deployPhaseTwo" => interact.deploy_phase_two().await, @@ -48,6 +46,7 @@ pub async fn sovereign_forge_cli() { pub struct State { contract_address: Option, config_address: Option, + factory_address: Option, header_verifier_address: Option, } @@ -74,6 +73,11 @@ impl State { self.config_address = Some(address); } + /// Sets the contract address + pub fn set_factory_template(&mut self, address: Bech32Address) { + self.factory_address = Some(address); + } + /// Sets the contract address pub fn set_header_verifier_address(&mut self, address: Bech32Address) { self.header_verifier_address = Some(address); @@ -144,6 +148,7 @@ impl ContractInteract { .returns(ReturnsNewAddress) .run() .await; + let new_address_bech32 = bech32::encode(&new_address); self.state.set_address(Bech32Address::from_bech32_string( new_address_bech32.clone(), @@ -169,67 +174,68 @@ impl ContractInteract { header_verifier_managed_address.clone(), header_verifier_managed_address, ) - .code(&self.contract_code) + .code(MxscPath::new(CHAIN_FACTORY_CODE_PATH)) .returns(ReturnsNewAddress) .run() .await; let new_address_bech32 = bech32::encode(&new_address); - self.state.set_address(Bech32Address::from_bech32_string( - new_address_bech32.clone(), - )); + self.state + .set_factory_template(Bech32Address::from_bech32_string( + new_address_bech32.clone(), + )); println!("new Chain-Factory address: {new_address_bech32}"); } - pub async fn deploy_header_verifier(&mut self) { + pub async fn deploy_chain_config_template(&mut self) { let new_address = self .interactor .tx() .from(&self.wallet_address) .gas(50_000_000u64) - .typed(HeaderverifierProxy) - .init(MultiValueEncoded::new()) + .typed(ChainConfigContractProxy) + .init( + 1u64, + 2u64, + BigUint::from(100u64), + &self.wallet_address, + MultiValueEncoded::new(), + ) .returns(ReturnsNewAddress) - .code(MxscPath::new(HEADER_VERIFIER_CODE_PATH)) + .code(MxscPath::new(CHAIN_CONFIG_CODE_PATH)) .run() .await; let new_address_bech32 = bech32::encode(&new_address); self.state - .set_header_verifier_address(Bech32Address::from_bech32_string( + .set_config_template(Bech32Address::from_bech32_string( new_address_bech32.clone(), )); - println!("new Header-Verifier address: {new_address_bech32}"); + println!("new Chain-Config address: {new_address_bech32}"); } - pub async fn deploy_chain_config(&mut self) { + pub async fn deploy_header_verifier_template(&mut self) { let new_address = self .interactor .tx() .from(&self.wallet_address) .gas(50_000_000u64) - .typed(ChainConfigContractProxy) - .init( - 1u64, - 2u64, - BigUint::from(100u64), - &self.wallet_address, - MultiValueEncoded::new(), - ) + .typed(HeaderverifierProxy) + .init(MultiValueEncoded::new()) .returns(ReturnsNewAddress) - .code(MxscPath::new(CHAIN_CONFIG_CODE_PATH)) + .code(MxscPath::new(HEADER_VERIFIER_CODE_PATH)) .run() .await; let new_address_bech32 = bech32::encode(&new_address); self.state - .set_config_template(Bech32Address::from_bech32_string( + .set_header_verifier_address(Bech32Address::from_bech32_string( new_address_bech32.clone(), )); - println!("new Chain-Config address: {new_address_bech32}"); + println!("new Header-Verifier address: {new_address_bech32}"); } pub async fn upgrade(&mut self) { @@ -250,9 +256,10 @@ impl ContractInteract { println!("Result: {response:?}"); } - pub async fn register_token_handler(&mut self) { - let shard_id = 0u32; - let token_handler_address = bech32::decode(""); + pub async fn register_token_handler(&mut self, shard_id: u32) { + let bech32 = &self.state.header_verifier_address.as_ref().unwrap(); + let address = bech32.to_address(); + let token_handler_address = ManagedAddress::from(address); let response = self .interactor @@ -269,9 +276,10 @@ impl ContractInteract { println!("Result: {response:?}"); } - pub async fn register_chain_factory(&mut self) { - let shard_id = 0u32; - let chain_factory_address = bech32::decode(""); + pub async fn register_chain_factory(&mut self, shard_id: u32) { + let bech32 = &self.state.factory_address.as_ref().unwrap(); + let address = bech32.to_address(); + let chain_factory_address = ManagedAddress::from(address); let response = self .interactor @@ -295,7 +303,7 @@ impl ContractInteract { .from(&self.wallet_address) .to(self.state.current_address()) .gas(30_000_000u64) - .typed(proxy::SovereignForgeProxy) + .typed(SovereignForgeProxy) .complete_setup_phase() .returns(ReturnsResultUnmanaged) .run() @@ -307,8 +315,8 @@ impl ContractInteract { pub async fn deploy_phase_one(&mut self) { let egld_amount = BigUint::::from(100u128); - let min_validators = 0u64; - let max_validators = 0u64; + let min_validators = 1u64; + let max_validators = 3u64; let min_stake = BigUint::::from(0u128); let additional_stake_required = MultiValueVec::from(vec![MultiValue2::< TokenIdentifier, @@ -323,8 +331,8 @@ impl ContractInteract { .tx() .from(&self.wallet_address) .to(self.state.current_address()) - .gas(30_000_000u64) - .typed(proxy::SovereignForgeProxy) + .gas(100_000_000u64) + .typed(SovereignForgeProxy) .deploy_phase_one( min_validators, max_validators, @@ -367,7 +375,7 @@ impl ContractInteract { .from(&self.wallet_address) .to(self.state.current_address()) .gas(30_000_000u64) - .typed(proxy::SovereignForgeProxy) + .typed(SovereignForgeProxy) .deploy_phase_three(is_sovereign_chain, header_verifier_address) .returns(ReturnsResultUnmanaged) .run() @@ -402,7 +410,7 @@ impl ContractInteract { .interactor .query() .to(self.state.current_address()) - .typed(proxy::SovereignForgeProxy) + .typed(SovereignForgeProxy) .chain_factories(shard_id) .returns(ReturnsResultUnmanaged) .run() @@ -432,7 +440,7 @@ impl ContractInteract { .interactor .query() .to(self.state.current_address()) - .typed(proxy::SovereignForgeProxy) + .typed(SovereignForgeProxy) .deploy_cost() .returns(ReturnsResultUnmanaged) .run() diff --git a/sovereign-forge/interactor/state.toml b/sovereign-forge/interactor/state.toml index 3289cfe0..36e76a7c 100644 --- a/sovereign-forge/interactor/state.toml +++ b/sovereign-forge/interactor/state.toml @@ -1,3 +1,4 @@ -contract_address = "erd1qqqqqqqqqqqqqpgqcyn80qhgs926gtl2l7s6x6rneyksuxyvd8ssje4jl2" -config_address = "erd1qqqqqqqqqqqqqpgqg3rhq4rucjhnnxk6zhantd3yuh8v9m5cd8ssp73zh7" -header_verifier_address = "erd1qqqqqqqqqqqqqpgq59k00lhu335g6h0q894pz38uuk3ddmjwd8ssxtd8wr" +contract_address = "erd1qqqqqqqqqqqqqpgqt5w9vlsdcmu5t5wvzdj8xnp42kqm4x3ud8ssrk9q8s" +config_address = "erd1qqqqqqqqqqqqqpgqn2ju3265cuh08uc3mesevpkjktggjhded8ssqa0spk" +factory_address = "erd1qqqqqqqqqqqqqpgqll6ncfgjppe7gns40vq7xuq6wsvkfk6kd8ss8ujx5r" +header_verifier_address = "erd1qqqqqqqqqqqqqpgquxv6eew4nzmcy0sr4r939p6wzcm0zkc8d8ssjspkj7" diff --git a/sovereign-forge/interactor/tests/interact_cs_tests.rs b/sovereign-forge/interactor/tests/interact_cs_tests.rs index 5407c304..d588eb2d 100644 --- a/sovereign-forge/interactor/tests/interact_cs_tests.rs +++ b/sovereign-forge/interactor/tests/interact_cs_tests.rs @@ -12,19 +12,32 @@ async fn deploy_test_sovereign_forge_cs() { let mut interactor = ContractInteract::new().await; interactor.deploy().await; - interactor.deploy_chain_config().await; - interactor.deploy_header_verifier().await; - interactor.complete_setup_phase().await; + println!("=========CHAIN FACTORY DEPLOY=========="); + interactor.deploy_chain_factory().await; + interactor.deploy_chain_config_template().await; + println!("=========HEADER VERIFIER DEPLOY=========="); + interactor.deploy_header_verifier_template().await; + + println!("=========REGISTER TOKEN HANDLERS=========="); + interactor.register_token_handler(1).await; + interactor.register_token_handler(2).await; + interactor.register_token_handler(3).await; - interactor.register_token_handler().await; - interactor.register_token_handler().await; - interactor.register_token_handler().await; + println!("=========REGISTER CHAIN FACTORIES=========="); + interactor.register_chain_factory(1).await; + interactor.register_chain_factory(2).await; + interactor.register_chain_factory(3).await; - interactor.register_chain_factory().await; - interactor.register_chain_factory().await; - interactor.register_chain_factory().await; + println!("=========COMPLETE SETUP PHASE=========="); + interactor.complete_setup_phase().await; + println!("=========PHASE ONE START=========="); interactor.deploy_phase_one().await; + println!("=========PHASE ONE END =========="); + interactor.deploy_phase_two().await; + println!("=========PHASE TWO=========="); + interactor.deploy_phase_three().await; + println!("=========PHASE THREE=========="); } From 34ad384be61284841587fbe4ff3a92a6c52ce1ed Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Mon, 9 Dec 2024 17:03:44 +0200 Subject: [PATCH 59/87] Fixes for CI/CD Signed-off-by: Andrei Baltariu --- chain-factory/src/factory.rs | 16 ++++++++++++ .../wasm-chain-factory-full/src/lib.rs | 6 ++--- chain-factory/wasm/src/lib.rs | 6 ++--- common/proxies/src/chain_factory_proxy.rs | 26 +++++++++---------- .../tests/sovereign_forge_unit_tests.rs | 1 + 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/chain-factory/src/factory.rs b/chain-factory/src/factory.rs index 48ed6ab6..2bdb30b7 100644 --- a/chain-factory/src/factory.rs +++ b/chain-factory/src/factory.rs @@ -87,6 +87,22 @@ pub trait FactoryModule: only_admin::OnlyAdminModule { .sync_call() } + #[only_admin] + #[endpoint(deployEsdtSafe)] + fn deploy_esdt_safe(&self, is_sovereign_chain: bool) -> ManagedAddress { + let source_address = self.enshrine_esdt_safe_template().get(); + let metadata = self.blockchain().get_code_metadata(&source_address); + + self.tx() + .typed(EsdtSafeProxy) + .init(is_sovereign_chain) + .gas(60_000_000) + .from_source(source_address) + .code_metadata(metadata) + .returns(ReturnsNewManagedAddress) + .sync_call() + } + #[only_admin] #[endpoint(deployFeeMarket)] fn deploy_fee_market( diff --git a/chain-factory/wasm-chain-factory-full/src/lib.rs b/chain-factory/wasm-chain-factory-full/src/lib.rs index 4081c44a..6f409e05 100644 --- a/chain-factory/wasm-chain-factory-full/src/lib.rs +++ b/chain-factory/wasm-chain-factory-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] @@ -22,8 +22,8 @@ multiversx_sc_wasm_adapter::endpoints! { upgrade => upgrade deploySovereignChainConfigContract => deploy_sovereign_chain_config_contract deployHeaderVerifier => deploy_header_verifier - deployEsdtSafe => deploy_esdt_safe deployEnshrineEsdtSafe => deploy_enshrine_esdt_safe + deployEsdtSafe => deploy_esdt_safe deployFeeMarket => deploy_fee_market completeSetupPhase => complete_setup_phase isAdmin => is_admin diff --git a/chain-factory/wasm/src/lib.rs b/chain-factory/wasm/src/lib.rs index 4081c44a..6f409e05 100644 --- a/chain-factory/wasm/src/lib.rs +++ b/chain-factory/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] @@ -22,8 +22,8 @@ multiversx_sc_wasm_adapter::endpoints! { upgrade => upgrade deploySovereignChainConfigContract => deploy_sovereign_chain_config_contract deployHeaderVerifier => deploy_header_verifier - deployEsdtSafe => deploy_esdt_safe deployEnshrineEsdtSafe => deploy_enshrine_esdt_safe + deployEsdtSafe => deploy_esdt_safe deployFeeMarket => deploy_fee_market completeSetupPhase => complete_setup_phase isAdmin => is_admin diff --git a/common/proxies/src/chain_factory_proxy.rs b/common/proxies/src/chain_factory_proxy.rs index d68846f9..49c06a19 100644 --- a/common/proxies/src/chain_factory_proxy.rs +++ b/common/proxies/src/chain_factory_proxy.rs @@ -132,19 +132,6 @@ where .original_result() } - pub fn deploy_esdt_safe< - Arg0: ProxyArg, - >( - self, - is_sovereign_chain: Arg0, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("deployEsdtSafe") - .argument(&is_sovereign_chain) - .original_result() - } - pub fn deploy_enshrine_esdt_safe< Arg0: ProxyArg, Arg1: ProxyArg>, @@ -167,6 +154,19 @@ where .original_result() } + pub fn deploy_esdt_safe< + Arg0: ProxyArg, + >( + self, + is_sovereign_chain: Arg0, + ) -> TxTypedCall> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("deployEsdtSafe") + .argument(&is_sovereign_chain) + .original_result() + } + pub fn deploy_fee_market< Arg0: ProxyArg>, Arg1: ProxyArg>>, diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs index 894af493..ad88d27b 100644 --- a/sovereign-forge/tests/sovereign_forge_unit_tests.rs +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -67,6 +67,7 @@ impl SovereignForgeTestState { .from(FORGE_ADDRESS) .typed(ChainFactoryContractProxy) .init( + FORGE_ADDRESS, CONFIG_ADDRESS, HEADER_VERIFIER_ADDRESS, FACTORY_ADDRESS, From b6f777fb90ce41268fe5280520c2009ee8670b64 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:02:02 +0200 Subject: [PATCH 60/87] 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 61/87] 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 62/87] 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 63/87] 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}; From 1ec46e1e05f858ba023b61c76f9a69102d13057b Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:39:03 +0200 Subject: [PATCH 64/87] Added helper function to get managed address Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/src/interact.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/sovereign-forge/interactor/src/interact.rs b/sovereign-forge/interactor/src/interact.rs index e90e55ca..732f8049 100644 --- a/sovereign-forge/interactor/src/interact.rs +++ b/sovereign-forge/interactor/src/interact.rs @@ -158,9 +158,10 @@ impl ContractInteract { } pub async fn deploy_chain_factory(&mut self) { - let header_verifier_bech32 = &self.state.header_verifier_address.as_ref().unwrap(); - let header_verifier_address = header_verifier_bech32.to_address(); - let header_verifier_managed_address = ManagedAddress::from(header_verifier_address); + let header_verifier_managed_address = + self.convert_address_to_managed(self.state.header_verifier_address.clone()); + let forge_managed_address = + self.convert_address_to_managed(self.state.config_address.clone()); let new_address = self .interactor @@ -169,7 +170,8 @@ impl ContractInteract { .gas(50_000_000u64) .typed(ChainFactoryContractProxy) .init( - ManagedAddress::from(&self.state.config_address.as_ref().unwrap().to_address()), + forge_managed_address, + header_verifier_managed_address.clone(), header_verifier_managed_address.clone(), header_verifier_managed_address.clone(), header_verifier_managed_address, @@ -188,6 +190,15 @@ impl ContractInteract { println!("new Chain-Factory address: {new_address_bech32}"); } + pub fn convert_address_to_managed( + &mut self, + address: Option, + ) -> ManagedAddress { + let address_bech32 = address.as_ref().unwrap(); + + ManagedAddress::from(address_bech32.to_address()) + } + pub async fn deploy_chain_config_template(&mut self) { let new_address = self .interactor From 7a9bf146b56f22d3c063cbd9f6124f980ed65ab7 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:50:59 +0200 Subject: [PATCH 65/87] Fixed address bug Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/src/interact.rs | 25 ++-------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/sovereign-forge/interactor/src/interact.rs b/sovereign-forge/interactor/src/interact.rs index 732f8049..79417cf9 100644 --- a/sovereign-forge/interactor/src/interact.rs +++ b/sovereign-forge/interactor/src/interact.rs @@ -33,7 +33,6 @@ pub async fn sovereign_forge_cli() { "deployPhaseOne" => interact.deploy_phase_one().await, "deployPhaseTwo" => interact.deploy_phase_two().await, "deployPhaseThree" => interact.deploy_phase_three().await, - "setAddress" => interact.set_address().await, "getChainFactoryAddress" => interact.chain_factories().await, "getTokenHandlerAddress" => interact.token_handlers().await, "getDeployCost" => interact.deploy_cost().await, @@ -161,7 +160,7 @@ impl ContractInteract { let header_verifier_managed_address = self.convert_address_to_managed(self.state.header_verifier_address.clone()); let forge_managed_address = - self.convert_address_to_managed(self.state.config_address.clone()); + self.convert_address_to_managed(self.state.contract_address.clone()); let new_address = self .interactor @@ -378,7 +377,6 @@ impl ContractInteract { pub async fn deploy_phase_three(&mut self) { let is_sovereign_chain = false; - let header_verifier_address = bech32::decode(""); let response = self .interactor @@ -387,26 +385,7 @@ impl ContractInteract { .to(self.state.current_address()) .gas(30_000_000u64) .typed(SovereignForgeProxy) - .deploy_phase_three(is_sovereign_chain, header_verifier_address) - .returns(ReturnsResultUnmanaged) - .run() - .await; - - println!("Result: {response:?}"); - } - - pub async fn set_address(&mut self) { - let esdt_safe_address = bech32::decode(""); - let header_verifier_address = bech32::decode(""); - - let response = self - .interactor - .tx() - .from(&self.wallet_address) - .to(self.state.current_address()) - .gas(30_000_000u64) - .typed(SovereignForgeProxy) - .set_address(esdt_safe_address, header_verifier_address) + .deploy_phase_three(is_sovereign_chain) .returns(ReturnsResultUnmanaged) .run() .await; From 4a4da1469295698294ff08fe5bdcdc3bf6debbde Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:53:19 +0200 Subject: [PATCH 66/87] Modified .gitignore to ignore state file Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/.gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sovereign-forge/interactor/.gitignore b/sovereign-forge/interactor/.gitignore index 5a64d09a..a13fe940 100644 --- a/sovereign-forge/interactor/.gitignore +++ b/sovereign-forge/interactor/.gitignore @@ -1,2 +1,5 @@ # Pem files are used for interactions, but shouldn't be committed *.pem + +# State files are used for interactions, but shouldn't be committed +*state.toml From 3646982a0f481888c477966bd92e43a448182faa Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:56:07 +0200 Subject: [PATCH 67/87] Uncommented on-chain test Signed-off-by: Andrei Baltariu --- .../interactor/tests/interact_tests.rs | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/sovereign-forge/interactor/tests/interact_tests.rs b/sovereign-forge/interactor/tests/interact_tests.rs index 5a094607..a428bb99 100644 --- a/sovereign-forge/interactor/tests/interact_tests.rs +++ b/sovereign-forge/interactor/tests/interact_tests.rs @@ -1,19 +1,29 @@ use forge_rust_interact::ContractInteract; -use multiversx_sc_snippets::imports::*; +use multiversx_sc_snippets::imports::tokio; // Simple deploy test that runs on the real blockchain configuration. // In order for this test to work, make sure that the `config.toml` file contains the real blockchain config (or choose it manually) // Can be run with `sc-meta test`. -// #[tokio::test] -// #[ignore = "run on demand, relies on real blockchain state"] -// async fn deploy_test_sovereign_forge() { -// let mut interactor = ContractInteract::new().await; -// -// interactor.deploy().await; -// interactor.deploy_chain_config().await; -// interactor.deploy_header_verifier().await; -// -// interactor.deploy_phase_one().await; -// interactor.deploy_phase_two().await; -// interactor.deploy_phase_three().await; -// } +#[tokio::test] +#[ignore = "run on demand, relies on real blockchain state"] +async fn deploy_test_sovereign_forge() { + let mut interactor = ContractInteract::new().await; + interactor.deploy().await; + + interactor.deploy_chain_factory().await; + interactor.deploy_chain_config_template().await; + interactor.deploy_header_verifier_template().await; + + interactor.register_token_handler(1).await; + interactor.register_token_handler(2).await; + interactor.register_token_handler(3).await; + interactor.register_chain_factory(1).await; + interactor.register_chain_factory(2).await; + interactor.register_chain_factory(3).await; + + interactor.complete_setup_phase().await; + + interactor.deploy_phase_one().await; + interactor.deploy_phase_two().await; + interactor.deploy_phase_three().await; +} From 1a0ad425c5a13d8e875b718ec59b7ebf5363ad6f Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:56:19 +0200 Subject: [PATCH 68/87] Removed comments + added feature flag Signed-off-by: Andrei Baltariu --- .../interactor/tests/interact_cs_tests.rs | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/sovereign-forge/interactor/tests/interact_cs_tests.rs b/sovereign-forge/interactor/tests/interact_cs_tests.rs index d588eb2d..50792886 100644 --- a/sovereign-forge/interactor/tests/interact_cs_tests.rs +++ b/sovereign-forge/interactor/tests/interact_cs_tests.rs @@ -7,37 +7,25 @@ use multiversx_sc_snippets::imports::*; // The chain-simulator-tests feature should be present in Cargo.toml. // Can be run with `sc-meta test -c`. #[tokio::test] -// #[cfg_attr(not(feature = "chain-simulator-tests"), ignore)] +#[cfg_attr(not(feature = "chain-simulator-tests"), ignore)] async fn deploy_test_sovereign_forge_cs() { let mut interactor = ContractInteract::new().await; - interactor.deploy().await; - println!("=========CHAIN FACTORY DEPLOY=========="); + interactor.deploy_chain_factory().await; interactor.deploy_chain_config_template().await; - println!("=========HEADER VERIFIER DEPLOY=========="); interactor.deploy_header_verifier_template().await; - println!("=========REGISTER TOKEN HANDLERS=========="); interactor.register_token_handler(1).await; interactor.register_token_handler(2).await; interactor.register_token_handler(3).await; - - println!("=========REGISTER CHAIN FACTORIES=========="); interactor.register_chain_factory(1).await; interactor.register_chain_factory(2).await; interactor.register_chain_factory(3).await; - println!("=========COMPLETE SETUP PHASE=========="); interactor.complete_setup_phase().await; - println!("=========PHASE ONE START=========="); interactor.deploy_phase_one().await; - println!("=========PHASE ONE END =========="); - interactor.deploy_phase_two().await; - println!("=========PHASE TWO=========="); - interactor.deploy_phase_three().await; - println!("=========PHASE THREE=========="); } From 410bb3b6abbc0af652f838d1e8a3161204f618b2 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 11:59:50 +0200 Subject: [PATCH 69/87] Modified gitignore Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sovereign-forge/interactor/.gitignore b/sovereign-forge/interactor/.gitignore index a13fe940..4f9be44d 100644 --- a/sovereign-forge/interactor/.gitignore +++ b/sovereign-forge/interactor/.gitignore @@ -2,4 +2,4 @@ *.pem # State files are used for interactions, but shouldn't be committed -*state.toml +state.toml From ed7d46cd0bf79c62a5cfaf84ff12e51146fbe2ed Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 14:43:07 +0200 Subject: [PATCH 70/87] Added workflow for chain-simulator tests Signed-off-by: Andrei Baltariu --- .github/workflows/on_pull_request_build_contracts.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/on_pull_request_build_contracts.yml b/.github/workflows/on_pull_request_build_contracts.yml index 68af298d..0404ddbd 100644 --- a/.github/workflows/on_pull_request_build_contracts.yml +++ b/.github/workflows/on_pull_request_build_contracts.yml @@ -11,3 +11,11 @@ jobs: uses: multiversx/mx-sc-actions/.github/workflows/reproducible-build.yml@v3.2.0 with: image_tag: v8.0.0 + + test: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v3 + - name: Run cargo tests + run: cargo test --features chain-simulator-tests From 95100abc2da8292afbc7379c14f38c3948deb13d Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 14:53:16 +0200 Subject: [PATCH 71/87] Added Makefile Signed-off-by: Andrei Baltariu --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..0e10eb9c --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +chain-simulator: + @docker compose -f docker-compose.yml build + @docker compose -f docker-compose.yml up & sc-meta test -c + @docker compose -f docker-compose.yml down -v From 3968673020840aa69d8d0524352a208cdc627276 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 14:54:22 +0200 Subject: [PATCH 72/87] Added docker-compose file Signed-off-by: Andrei Baltariu --- docker-compose.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..4d5f8094 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +version: "3.9" + +services: + chain-simulator: + image: multiversx/chainsimulator:latest + ports: + - 8085:8085 + volumes: + - "../scripts:/docker/scripts" + entrypoint: "./chainsimulator -log-level *:INFO" From 586e475a667ec3d165d2d1fde08b849060b55bf3 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 14:57:12 +0200 Subject: [PATCH 73/87] Removed proxy and modified sc-config to not generate proxy in interactor Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/src/proxy.rs | 238 ------------------------ sovereign-forge/sc-config.toml | 4 - 2 files changed, 242 deletions(-) delete mode 100644 sovereign-forge/interactor/src/proxy.rs diff --git a/sovereign-forge/interactor/src/proxy.rs b/sovereign-forge/interactor/src/proxy.rs deleted file mode 100644 index de7a16f9..00000000 --- a/sovereign-forge/interactor/src/proxy.rs +++ /dev/null @@ -1,238 +0,0 @@ -// Code generated by the multiversx-sc proxy generator. DO NOT EDIT. - -//////////////////////////////////////////////////// -////////////////// AUTO-GENERATED ////////////////// -//////////////////////////////////////////////////// - -#![allow(dead_code)] -#![allow(clippy::all)] - -use multiversx_sc::proxy_imports::*; - -pub struct SovereignForgeProxy; - -impl TxProxyTrait for SovereignForgeProxy -where - Env: TxEnv, - From: TxFrom, - To: TxTo, - Gas: TxGas, -{ - type TxProxyMethods = SovereignForgeProxyMethods; - - fn proxy_methods(self, tx: Tx) -> Self::TxProxyMethods { - SovereignForgeProxyMethods { wrapped_tx: tx } - } -} - -pub struct SovereignForgeProxyMethods -where - Env: TxEnv, - From: TxFrom, - To: TxTo, - Gas: TxGas, -{ - wrapped_tx: Tx, -} - -#[rustfmt::skip] -impl SovereignForgeProxyMethods -where - Env: TxEnv, - Env::Api: VMApi, - From: TxFrom, - Gas: TxGas, -{ - pub fn init< - Arg0: ProxyArg>, - >( - self, - deploy_cost: Arg0, - ) -> TxTypedDeploy { - self.wrapped_tx - .payment(NotPayable) - .raw_deploy() - .argument(&deploy_cost) - .original_result() - } -} - -#[rustfmt::skip] -impl SovereignForgeProxyMethods -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 SovereignForgeProxyMethods -where - Env: TxEnv, - Env::Api: VMApi, - From: TxFrom, - To: TxTo, - Gas: TxGas, -{ - pub fn register_token_handler< - Arg0: ProxyArg, - Arg1: ProxyArg>, - >( - self, - shard_id: Arg0, - token_handler_address: Arg1, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("registerTokenHandler") - .argument(&shard_id) - .argument(&token_handler_address) - .original_result() - } - - pub fn register_chain_factory< - Arg0: ProxyArg, - Arg1: ProxyArg>, - >( - self, - shard_id: Arg0, - chain_factory_address: Arg1, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("registerChainFactory") - .argument(&shard_id) - .argument(&chain_factory_address) - .original_result() - } - - pub fn complete_setup_phase( - self, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("completeSetupPhase") - .original_result() - } - - pub fn deploy_phase_one< - Arg0: ProxyArg, - Arg1: ProxyArg, - Arg2: ProxyArg>, - Arg3: ProxyArg, BigUint>>>, - >( - self, - min_validators: Arg0, - max_validators: Arg1, - min_stake: Arg2, - additional_stake_required: Arg3, - ) -> TxTypedCall { - self.wrapped_tx - .raw_call("deployPhaseOne") - .argument(&min_validators) - .argument(&max_validators) - .argument(&min_stake) - .argument(&additional_stake_required) - .original_result() - } - - pub fn deploy_phase_two< - Arg0: ProxyArg>>, - >( - self, - bls_keys: Arg0, - ) -> TxTypedCall { - self.wrapped_tx - .payment(NotPayable) - .raw_call("deployPhaseTwo") - .argument(&bls_keys) - .original_result() - } - - 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() - } - - pub fn chain_factories< - Arg0: ProxyArg, - >( - self, - shard_id: Arg0, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getChainFactoryAddress") - .argument(&shard_id) - .original_result() - } - - pub fn token_handlers< - Arg0: ProxyArg, - >( - self, - shard_id: Arg0, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getTokenHandlerAddress") - .argument(&shard_id) - .original_result() - } - - pub fn deploy_cost( - self, - ) -> TxTypedCall> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getDeployCost") - .original_result() - } - - pub fn chain_ids( - self, - ) -> TxTypedCall>> { - self.wrapped_tx - .payment(NotPayable) - .raw_call("getAllChainIds") - .original_result() - } -} diff --git a/sovereign-forge/sc-config.toml b/sovereign-forge/sc-config.toml index 0bc6a705..163cb6f7 100644 --- a/sovereign-forge/sc-config.toml +++ b/sovereign-forge/sc-config.toml @@ -17,7 +17,3 @@ add-labels = ["sovereign-forge-external-view"] [[proxy]] path = "../common/proxies/src/sovereign_forge_proxy.rs" - -[[proxy]] -path = "interactor/src/proxy.rs" - From f1711bdc43d9e5cec850e72648ac9ebd8bcb85c4 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 14:57:28 +0200 Subject: [PATCH 74/87] Updated state.toml Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/state.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sovereign-forge/interactor/state.toml b/sovereign-forge/interactor/state.toml index 36e76a7c..f1c81fd8 100644 --- a/sovereign-forge/interactor/state.toml +++ b/sovereign-forge/interactor/state.toml @@ -1,4 +1,4 @@ -contract_address = "erd1qqqqqqqqqqqqqpgqt5w9vlsdcmu5t5wvzdj8xnp42kqm4x3ud8ssrk9q8s" -config_address = "erd1qqqqqqqqqqqqqpgqn2ju3265cuh08uc3mesevpkjktggjhded8ssqa0spk" -factory_address = "erd1qqqqqqqqqqqqqpgqll6ncfgjppe7gns40vq7xuq6wsvkfk6kd8ss8ujx5r" -header_verifier_address = "erd1qqqqqqqqqqqqqpgquxv6eew4nzmcy0sr4r939p6wzcm0zkc8d8ssjspkj7" +contract_address = "erd1qqqqqqqqqqqqqpgqp7savykx0n380r5fykpfg629dumcqm6ud8ss2rkes5" +config_address = "erd1qqqqqqqqqqqqqpgq4f6lm4mppra83zrz5r68f8ysutx7xqlrd8ssu2a8gu" +factory_address = "erd1qqqqqqqqqqqqqpgq55shtd9738tvtcndca46utay5wfqm84sd8sskm267y" +header_verifier_address = "erd1qqqqqqqqqqqqqpgqsl0phg7xmzhqmk768h9agrrscgm7qwudd8ssls3aq2" From 6ec98428e7a85174ac1498f78aad5c95a9f6a1ad Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 15:09:25 +0200 Subject: [PATCH 75/87] Removed makefile and docker-compose Signed-off-by: Andrei Baltariu --- Makefile | 4 ---- docker-compose.yml | 10 ---------- 2 files changed, 14 deletions(-) delete mode 100644 Makefile delete mode 100644 docker-compose.yml diff --git a/Makefile b/Makefile deleted file mode 100644 index 0e10eb9c..00000000 --- a/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -chain-simulator: - @docker compose -f docker-compose.yml build - @docker compose -f docker-compose.yml up & sc-meta test -c - @docker compose -f docker-compose.yml down -v diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 4d5f8094..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,10 +0,0 @@ -version: "3.9" - -services: - chain-simulator: - image: multiversx/chainsimulator:latest - ports: - - 8085:8085 - volumes: - - "../scripts:/docker/scripts" - entrypoint: "./chainsimulator -log-level *:INFO" From 769c41fa0c28a04d2376ca6462eefc8db1057001 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Tue, 10 Dec 2024 15:09:38 +0200 Subject: [PATCH 76/87] Added commit hash for action.yml Signed-off-by: Andrei Baltariu --- .github/workflows/actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 31dc66a2..c1f12bae 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -20,7 +20,7 @@ permissions: jobs: contracts: name: Contracts - uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@v3.3.1 + uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@79d7ac76e34b3208fbe07559ac276d0ea48be4da with: rust-toolchain: stable coverage-args: --ignore-filename-regex='/.cargo/git' --output ./coverage.md From b42d94aca51f0ddc68737b571560cef11a0e9f46 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 11:19:41 +0200 Subject: [PATCH 77/87] Fixed cs test Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/src/interact.rs | 46 ++++++++++++++++--- sovereign-forge/interactor/state.toml | 9 ++-- .../interactor/tests/interact_cs_tests.rs | 5 +- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/sovereign-forge/interactor/src/interact.rs b/sovereign-forge/interactor/src/interact.rs index 79417cf9..09eced50 100644 --- a/sovereign-forge/interactor/src/interact.rs +++ b/sovereign-forge/interactor/src/interact.rs @@ -6,7 +6,8 @@ use config::Config; use multiversx_sc_snippets::{imports::*, sdk::bech32}; 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 serde::{Deserialize, Serialize}; use std::{ @@ -18,6 +19,7 @@ const STATE_FILE: &str = "state.toml"; const CHAIN_CONFIG_CODE_PATH: &str = "../../chain-config/output/chain-config.mxsc.json"; const CHAIN_FACTORY_CODE_PATH: &str = "../../chain-factory/output/chain-factory.mxsc.json"; const HEADER_VERIFIER_CODE_PATH: &str = "../../header-verifier/output/header-verifier.mxsc.json"; +const ESDT_SAFE_CODE_PATH: &str = "../../esdt-safe/output/esdt-safe.mxsc.json"; pub async fn sovereign_forge_cli() { env_logger::init(); @@ -47,6 +49,7 @@ pub struct State { config_address: Option, factory_address: Option, header_verifier_address: Option, + esdt_safe_address: Option, } impl State { @@ -82,6 +85,10 @@ impl State { self.header_verifier_address = Some(address); } + pub fn set_esdt_safe_address(&mut self, address: Bech32Address) { + self.esdt_safe_address = Some(address); + } + /// Returns the contract address pub fn current_address(&self) -> &Bech32Address { self.contract_address @@ -161,6 +168,10 @@ impl ContractInteract { self.convert_address_to_managed(self.state.header_verifier_address.clone()); let forge_managed_address = self.convert_address_to_managed(self.state.contract_address.clone()); + let config_managed_address = + self.convert_address_to_managed(self.state.config_address.clone()); + let esdt_safe_managed_address = + self.convert_address_to_managed(self.state.esdt_safe_address.clone()); let new_address = self .interactor @@ -169,11 +180,11 @@ impl ContractInteract { .gas(50_000_000u64) .typed(ChainFactoryContractProxy) .init( - forge_managed_address, - header_verifier_managed_address.clone(), - header_verifier_managed_address.clone(), - header_verifier_managed_address.clone(), + forge_managed_address.clone(), + config_managed_address, header_verifier_managed_address, + esdt_safe_managed_address, + forge_managed_address, // USE ACTUAL FEE-MARKET TEMPLATE ) .code(MxscPath::new(CHAIN_FACTORY_CODE_PATH)) .returns(ReturnsNewAddress) @@ -248,6 +259,27 @@ impl ContractInteract { println!("new Header-Verifier address: {new_address_bech32}"); } + pub async fn deploy_esdt_safe_template(&mut self) { + let new_address = self + .interactor + .tx() + .from(&self.wallet_address) + .gas(80_000_000u64) + .typed(EsdtSafeProxy) + .init(false) + .returns(ReturnsNewAddress) + .code(MxscPath::new(ESDT_SAFE_CODE_PATH)) + .run() + .await; + + let new_address_bech32 = bech32::encode(&new_address); + self.state + .set_esdt_safe_address(Bech32Address::from_bech32_string( + new_address_bech32.clone(), + )); + + println!("new Header-Verifier address: {new_address_bech32}"); + } pub async fn upgrade(&mut self) { let response = self .interactor @@ -267,7 +299,7 @@ impl ContractInteract { } pub async fn register_token_handler(&mut self, shard_id: u32) { - let bech32 = &self.state.header_verifier_address.as_ref().unwrap(); + let bech32 = &self.state.contract_address.as_ref().unwrap(); let address = bech32.to_address(); let token_handler_address = ManagedAddress::from(address); @@ -383,7 +415,7 @@ impl ContractInteract { .tx() .from(&self.wallet_address) .to(self.state.current_address()) - .gas(30_000_000u64) + .gas(80_000_000u64) .typed(SovereignForgeProxy) .deploy_phase_three(is_sovereign_chain) .returns(ReturnsResultUnmanaged) diff --git a/sovereign-forge/interactor/state.toml b/sovereign-forge/interactor/state.toml index f1c81fd8..de9f43bb 100644 --- a/sovereign-forge/interactor/state.toml +++ b/sovereign-forge/interactor/state.toml @@ -1,4 +1,5 @@ -contract_address = "erd1qqqqqqqqqqqqqpgqp7savykx0n380r5fykpfg629dumcqm6ud8ss2rkes5" -config_address = "erd1qqqqqqqqqqqqqpgq4f6lm4mppra83zrz5r68f8ysutx7xqlrd8ssu2a8gu" -factory_address = "erd1qqqqqqqqqqqqqpgq55shtd9738tvtcndca46utay5wfqm84sd8sskm267y" -header_verifier_address = "erd1qqqqqqqqqqqqqpgqsl0phg7xmzhqmk768h9agrrscgm7qwudd8ssls3aq2" +contract_address = "erd1qqqqqqqqqqqqqpgqt54uz2y2frvy7fqet479a6efarnyw3yud8ssj6kyuz" +config_address = "erd1qqqqqqqqqqqqqpgqd3sm30pzrsqs2y7ct6368tlt94d6xvl6d8ssqhckfm" +factory_address = "erd1qqqqqqqqqqqqqpgq9xqda668zt76c8tvfqe9t39g7pz0j9t2d8sss3w65z" +header_verifier_address = "erd1qqqqqqqqqqqqqpgqlmtayq49qt94dj7gghagd7ap3d3htj76d8sszr0t7z" +esdt_safe_address = "erd1qqqqqqqqqqqqqpgqvxvmyp2fgr6qekksx8n6t8netkpweh28d8ssw9gwh8" diff --git a/sovereign-forge/interactor/tests/interact_cs_tests.rs b/sovereign-forge/interactor/tests/interact_cs_tests.rs index 50792886..120d497a 100644 --- a/sovereign-forge/interactor/tests/interact_cs_tests.rs +++ b/sovereign-forge/interactor/tests/interact_cs_tests.rs @@ -12,9 +12,10 @@ async fn deploy_test_sovereign_forge_cs() { let mut interactor = ContractInteract::new().await; interactor.deploy().await; - interactor.deploy_chain_factory().await; - interactor.deploy_chain_config_template().await; interactor.deploy_header_verifier_template().await; + interactor.deploy_chain_config_template().await; + interactor.deploy_esdt_safe_template().await; + interactor.deploy_chain_factory().await; interactor.register_token_handler(1).await; interactor.register_token_handler(2).await; From 6e90a97c9284f2aba571216afb0dfaad466f9899 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 11:36:04 +0200 Subject: [PATCH 78/87] Reverted yml file Signed-off-by: Andrei Baltariu --- .github/workflows/on_pull_request_build_contracts.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/on_pull_request_build_contracts.yml b/.github/workflows/on_pull_request_build_contracts.yml index 0404ddbd..68af298d 100644 --- a/.github/workflows/on_pull_request_build_contracts.yml +++ b/.github/workflows/on_pull_request_build_contracts.yml @@ -11,11 +11,3 @@ jobs: uses: multiversx/mx-sc-actions/.github/workflows/reproducible-build.yml@v3.2.0 with: image_tag: v8.0.0 - - test: - runs-on: ubuntu-latest - needs: build - steps: - - uses: actions/checkout@v3 - - name: Run cargo tests - run: cargo test --features chain-simulator-tests From ad67803ac938b71a961d55cbb1e3ba1dd71b493b Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 14:18:15 +0200 Subject: [PATCH 79/87] Added `deploy_phase_four` endpoint Signed-off-by: Andrei Baltariu --- sovereign-forge/src/common/sc_deploy.rs | 16 +++++++++++++++- sovereign-forge/src/common/utils.rs | 7 +++++++ sovereign-forge/src/phases.rs | 21 +++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/sovereign-forge/src/common/sc_deploy.rs b/sovereign-forge/src/common/sc_deploy.rs index 95259150..765013de 100644 --- a/sovereign-forge/src/common/sc_deploy.rs +++ b/sovereign-forge/src/common/sc_deploy.rs @@ -1,6 +1,6 @@ use crate::err_msg; use multiversx_sc::types::{MultiValueEncoded, ReturnsResult}; -use proxies::chain_factory_proxy::ChainFactoryContractProxy; +use proxies::{chain_factory_proxy::ChainFactoryContractProxy, fee_market_proxy::FeeStruct}; use transaction::StakeMultiArg; #[multiversx_sc::module] @@ -49,4 +49,18 @@ pub trait ScDeployModule: super::utils::UtilsModule + super::storage::StorageMod .returns(ReturnsResult) .sync_call() } + + #[inline] + fn deploy_fee_market( + &self, + esdt_safe_address: &ManagedAddress, + fee: Option>, + ) -> ManagedAddress { + self.tx() + .to(self.get_chain_factory_address()) + .typed(ChainFactoryContractProxy) + .deploy_fee_market(esdt_safe_address, fee) + .returns(ReturnsResult) + .sync_call() + } } diff --git a/sovereign-forge/src/common/utils.rs b/sovereign-forge/src/common/utils.rs index 9f210533..8c5bd2c1 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -39,6 +39,13 @@ pub enum ScArray { #[multiversx_sc::module] pub trait UtilsModule: super::storage::StorageModule { + fn require_phase_three_completed(&self, caller: &ManagedAddress) { + require!( + self.is_contract_deployed(caller, ScArray::ESDTSafe), + "The Header-Verifier SC is not deployed, you skipped the second phase" + ); + } + fn require_phase_two_completed(&self, caller: &ManagedAddress) { require!( self.is_contract_deployed(caller, ScArray::HeaderVerifier), diff --git a/sovereign-forge/src/phases.rs b/sovereign-forge/src/phases.rs index 4fc4e3a7..777a69a4 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::fee_market_proxy::FeeStruct; use transaction::StakeMultiArg; use multiversx_sc::{require, types::MultiValueEncoded}; @@ -127,4 +128,24 @@ pub trait PhasesModule: self.sovereign_deployed_contracts(&self.sovereigns_mapper(&caller).get()) .insert(esdt_safe_contract_info); } + + #[endpoint(deployPhaseFour)] + fn deploy_phase_four(&self, fee: Option>) { + let caller = self.blockchain().get_caller(); + + self.require_phase_three_completed(&caller); + require!( + !self.is_contract_deployed(&caller, ScArray::FeeMarket), + "The Fee-Market SC is already deployed" + ); + + let esdt_safe_address = self.get_contract_address(&caller, ScArray::ESDTSafe); + + let fee_market_address = self.deploy_fee_market(&esdt_safe_address, fee); + + let fee_market_contract_info = ContractInfo::new(ScArray::FeeMarket, fee_market_address); + + self.sovereign_deployed_contracts(&self.sovereigns_mapper(&caller).get()) + .insert(fee_market_contract_info); + } } From 767794cc2ef8302bf900e147a7182f7cd0590738 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 14:18:49 +0200 Subject: [PATCH 80/87] Removed comments Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/tests/interact_cs_tests.rs | 5 ----- sovereign-forge/interactor/tests/interact_tests.rs | 3 --- 2 files changed, 8 deletions(-) diff --git a/sovereign-forge/interactor/tests/interact_cs_tests.rs b/sovereign-forge/interactor/tests/interact_cs_tests.rs index 120d497a..f035b97d 100644 --- a/sovereign-forge/interactor/tests/interact_cs_tests.rs +++ b/sovereign-forge/interactor/tests/interact_cs_tests.rs @@ -1,11 +1,6 @@ use forge_rust_interact::ContractInteract; use multiversx_sc_snippets::imports::*; -// Simple deploy test that runs using the chain simulator configuration. -// In order for this test to work, make sure that the `config.toml` file contains the chain simulator config (or choose it manually) -// The chain simulator should already be installed and running before attempting to run this test. -// The chain-simulator-tests feature should be present in Cargo.toml. -// Can be run with `sc-meta test -c`. #[tokio::test] #[cfg_attr(not(feature = "chain-simulator-tests"), ignore)] async fn deploy_test_sovereign_forge_cs() { diff --git a/sovereign-forge/interactor/tests/interact_tests.rs b/sovereign-forge/interactor/tests/interact_tests.rs index a428bb99..3d755c41 100644 --- a/sovereign-forge/interactor/tests/interact_tests.rs +++ b/sovereign-forge/interactor/tests/interact_tests.rs @@ -1,9 +1,6 @@ use forge_rust_interact::ContractInteract; use multiversx_sc_snippets::imports::tokio; -// Simple deploy test that runs on the real blockchain configuration. -// In order for this test to work, make sure that the `config.toml` file contains the real blockchain config (or choose it manually) -// Can be run with `sc-meta test`. #[tokio::test] #[ignore = "run on demand, relies on real blockchain state"] async fn deploy_test_sovereign_forge() { From 2f07c42d968fc76767e3299f100128155326140b Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 14:27:21 +0200 Subject: [PATCH 81/87] Added fee-market as dependency Signed-off-by: Andrei Baltariu --- Cargo.lock | 1 + sovereign-forge/Cargo.toml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 49e0494a..094c8454 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2141,6 +2141,7 @@ dependencies = [ "chain-config", "chain-factory", "esdt-safe", + "fee-market", "header-verifier", "multiversx-sc", "multiversx-sc-modules", diff --git a/sovereign-forge/Cargo.toml b/sovereign-forge/Cargo.toml index 0869d99e..6ed26821 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.fee-market] +path = "../fee-market" + [dependencies.esdt-safe] path = "../esdt-safe" From 9872203a3730c007b2496b5f3e52f1ef428a4190 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 14:32:06 +0200 Subject: [PATCH 82/87] Added proxy rename + regen Signed-off-by: Andrei Baltariu --- common/proxies/src/sovereign_forge_proxy.rs | 13 +++++++++++++ sovereign-forge/sc-config.toml | 4 ++++ .../wasm-sovereign-forge-full/Cargo.lock | 1 + .../wasm-sovereign-forge-full/src/lib.rs | 5 +++-- .../wasm-soveriegn-forge-view/Cargo.lock | 1 + sovereign-forge/wasm/Cargo.lock | 1 + sovereign-forge/wasm/src/lib.rs | 5 +++-- 7 files changed, 26 insertions(+), 4 deletions(-) diff --git a/common/proxies/src/sovereign_forge_proxy.rs b/common/proxies/src/sovereign_forge_proxy.rs index d45bf090..48de77cb 100644 --- a/common/proxies/src/sovereign_forge_proxy.rs +++ b/common/proxies/src/sovereign_forge_proxy.rs @@ -173,6 +173,19 @@ where .original_result() } + pub fn deploy_phase_four< + Arg0: ProxyArg>>, + >( + self, + fee: Arg0, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("deployPhaseFour") + .argument(&fee) + .original_result() + } + pub fn chain_factories< Arg0: ProxyArg, >( diff --git a/sovereign-forge/sc-config.toml b/sovereign-forge/sc-config.toml index 163cb6f7..56baf08c 100644 --- a/sovereign-forge/sc-config.toml +++ b/sovereign-forge/sc-config.toml @@ -17,3 +17,7 @@ add-labels = ["sovereign-forge-external-view"] [[proxy]] path = "../common/proxies/src/sovereign_forge_proxy.rs" + +[[proxy.path-rename]] +from = "proxies::fee_market_proxy::FeeStruct" +to = "super::fee_market_proxy::FeeStruct" diff --git a/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock b/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock index 988f1192..f46cced9 100644 --- a/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock +++ b/sovereign-forge/wasm-sovereign-forge-full/Cargo.lock @@ -258,6 +258,7 @@ dependencies = [ "chain-config", "chain-factory", "esdt-safe", + "fee-market", "header-verifier", "multiversx-sc", "multiversx-sc-modules", diff --git a/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs b/sovereign-forge/wasm-sovereign-forge-full/src/lib.rs index 07331b22..5eb34350 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 + deployPhaseFour => deploy_phase_four 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 20f07787..5dcedc03 100644 --- a/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock +++ b/sovereign-forge/wasm-soveriegn-forge-view/Cargo.lock @@ -258,6 +258,7 @@ dependencies = [ "chain-config", "chain-factory", "esdt-safe", + "fee-market", "header-verifier", "multiversx-sc", "multiversx-sc-modules", diff --git a/sovereign-forge/wasm/Cargo.lock b/sovereign-forge/wasm/Cargo.lock index 3278000e..bbb98c75 100644 --- a/sovereign-forge/wasm/Cargo.lock +++ b/sovereign-forge/wasm/Cargo.lock @@ -258,6 +258,7 @@ dependencies = [ "chain-config", "chain-factory", "esdt-safe", + "fee-market", "header-verifier", "multiversx-sc", "multiversx-sc-modules", diff --git a/sovereign-forge/wasm/src/lib.rs b/sovereign-forge/wasm/src/lib.rs index 07331b22..5eb34350 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 + deployPhaseFour => deploy_phase_four getChainFactoryAddress => chain_factories getTokenHandlerAddress => token_handlers getDeployCost => deploy_cost From 6f3e18174830750f84ab4597492c35ab309b94cb Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 14:48:09 +0200 Subject: [PATCH 83/87] Modified error message 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 8c5bd2c1..bffccaf9 100644 --- a/sovereign-forge/src/common/utils.rs +++ b/sovereign-forge/src/common/utils.rs @@ -42,7 +42,7 @@ pub trait UtilsModule: super::storage::StorageModule { fn require_phase_three_completed(&self, caller: &ManagedAddress) { require!( self.is_contract_deployed(caller, ScArray::ESDTSafe), - "The Header-Verifier SC is not deployed, you skipped the second phase" + "The ESDT-Safe SC is not deployed, you skipped the third phase" ); } From 47fde5d1b85682cf0a23786370c9f9eacb1833f5 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 14:48:14 +0200 Subject: [PATCH 84/87] Added unit tests Signed-off-by: Andrei Baltariu --- .../tests/sovereign_forge_unit_tests.rs | 174 +++++++++++++++++- 1 file changed, 171 insertions(+), 3 deletions(-) diff --git a/sovereign-forge/tests/sovereign_forge_unit_tests.rs b/sovereign-forge/tests/sovereign_forge_unit_tests.rs index ebcf2967..c6af19e5 100644 --- a/sovereign-forge/tests/sovereign_forge_unit_tests.rs +++ b/sovereign-forge/tests/sovereign_forge_unit_tests.rs @@ -4,8 +4,11 @@ use multiversx_sc_scenario::{ ScenarioWorld, }; use proxies::{ - chain_config_proxy::ChainConfigContractProxy, chain_factory_proxy::ChainFactoryContractProxy, - esdt_safe_proxy::EsdtSafeProxy, header_verifier_proxy::HeaderverifierProxy, + chain_config_proxy::ChainConfigContractProxy, + chain_factory_proxy::ChainFactoryContractProxy, + esdt_safe_proxy::EsdtSafeProxy, + fee_market_proxy::{FeeMarketProxy, FeeStruct}, + header_verifier_proxy::HeaderverifierProxy, sovereign_forge_proxy::SovereignForgeProxy, }; use setup_phase::SetupPhaseModule; @@ -33,6 +36,9 @@ const HEADER_VERIFIER_CODE_PATH: MxscPath = 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 FEE_MARKET_ADDRESS: TestSCAddress = TestSCAddress::new("fee-market"); +const FEE_MARKET_CODE_PATH: MxscPath = MxscPath::new("../fee-market/output/fee-market.mxsc.json"); + const TOKEN_HANDLER_ADDRESS: TestSCAddress = TestSCAddress::new("token-handler"); const BALANCE: u128 = 100_000_000_000_000_000; @@ -46,6 +52,7 @@ fn world() -> ScenarioWorld { 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.register_contract(FEE_MARKET_CODE_PATH, fee_market::ContractBuilder); blockchain } @@ -76,7 +83,7 @@ impl SovereignForgeTestState { CONFIG_ADDRESS, HEADER_VERIFIER_ADDRESS, ESDT_SAFE_ADDRESS, - FACTORY_ADDRESS, + FEE_MARKET_ADDRESS, ) .code(FACTORY_CODE_PATH) .new_address(FACTORY_ADDRESS) @@ -149,6 +156,20 @@ impl SovereignForgeTestState { self } + fn deploy_fee_market_template(&mut self) -> &mut Self { + let fee: Option> = None; + + self.world + .tx() + .from(OWNER_ADDRESS) + .typed(FeeMarketProxy) + .init(ESDT_SAFE_ADDRESS, fee) + .code(FEE_MARKET_CODE_PATH) + .new_address(FEE_MARKET_ADDRESS) + .run(); + + self + } fn register_token_handler( &mut self, shard_id: u32, @@ -282,6 +303,26 @@ impl SovereignForgeTestState { transaction.run(); } } + + fn deploy_phase_four( + &mut self, + fee: Option>, + expect_error: Option, + ) { + let transaction = self + .world + .tx() + .from(OWNER_ADDRESS) + .to(FORGE_ADDRESS) + .typed(SovereignForgeProxy) + .deploy_phase_four(fee); + + if let Some(error) = expect_error { + transaction.returns(error).run(); + } else { + transaction.run(); + } + } } #[test] @@ -564,6 +605,17 @@ fn deploy_phase_three() { state.deploy_phase_two(None, &bls_keys); state.deploy_phase_three(false, None); + + state + .world + .query() + .to(FORGE_ADDRESS) + .whitebox(sovereign_forge::contract_obj, |sc| { + let is_esdt_safe_deployed = + sc.is_contract_deployed(&OWNER_ADDRESS.to_managed_address(), ScArray::ESDTSafe); + + assert!(is_esdt_safe_deployed); + }) } #[test] @@ -647,3 +699,119 @@ fn deploy_phase_three_already_deployed() { Some(ExpectError(4, "The ESDT-Safe SC is already deployed")), ); } + +#[test] +fn deploy_phase_four() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.deploy_chain_factory(); + state.deploy_chain_config_template(); + state.deploy_fee_market_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); + state.deploy_phase_four(None, None); + + state + .world + .query() + .to(FORGE_ADDRESS) + .whitebox(sovereign_forge::contract_obj, |sc| { + let is_fee_market_deployed = + sc.is_contract_deployed(&OWNER_ADDRESS.to_managed_address(), ScArray::FeeMarket); + + assert!(is_fee_market_deployed); + }) +} + +#[test] +fn deploy_phase_four_without_previous_phase() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.deploy_chain_factory(); + state.deploy_chain_config_template(); + state.deploy_fee_market_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_four( + None, + Some(ExpectError( + 4, + "The ESDT-Safe SC is not deployed, you skipped the third phase", + )), + ); +} + +#[test] +fn deploy_phase_four_fee_market_already_deployed() { + let mut state = SovereignForgeTestState::new(); + state.deploy_sovereign_forge(); + state.deploy_chain_factory(); + state.deploy_chain_config_template(); + state.deploy_fee_market_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); + state.deploy_phase_four(None, None); + state.deploy_phase_four( + None, + Some(ExpectError(4, "The Fee-Market SC is already deployed")), + ); +} From 4f366ed2d95b7d5ade7eba2ff1d5fb3754a61f09 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 14:57:18 +0200 Subject: [PATCH 85/87] Added logic to also set `fee_market_address` in ESDTSafe contract Signed-off-by: Andrei Baltariu --- chain-factory/src/factory.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/chain-factory/src/factory.rs b/chain-factory/src/factory.rs index fe1fd1ee..3021d809 100644 --- a/chain-factory/src/factory.rs +++ b/chain-factory/src/factory.rs @@ -126,14 +126,23 @@ pub trait FactoryModule: only_admin::OnlyAdminModule { let source_address = self.fee_market_template().get(); let metadata = self.blockchain().get_code_metadata(&source_address); - self.tx() + let fee_market_address = self + .tx() .typed(FeeMarketProxy) - .init(esdt_safe_address, fee) + .init(&esdt_safe_address, fee) .gas(60_000_000) .from_source(source_address) .code_metadata(metadata) .returns(ReturnsNewManagedAddress) - .sync_call() + .sync_call(); + + self.tx() + .to(&esdt_safe_address) + .typed(EsdtSafeProxy) + .set_fee_market_address(&fee_market_address) + .sync_call(); + + fee_market_address } #[only_admin] From 120737f77d3fbefb92ca8903e3e1394e098e4e88 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 15:45:16 +0200 Subject: [PATCH 86/87] Added setup + chain-simulator test update Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/src/interact.rs | 73 +++++++++++++++++-- .../interactor/tests/interact_cs_tests.rs | 2 + 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/sovereign-forge/interactor/src/interact.rs b/sovereign-forge/interactor/src/interact.rs index 09eced50..81e727ec 100644 --- a/sovereign-forge/interactor/src/interact.rs +++ b/sovereign-forge/interactor/src/interact.rs @@ -5,8 +5,11 @@ mod config; use config::Config; use multiversx_sc_snippets::{imports::*, sdk::bech32}; use proxies::{ - chain_config_proxy::ChainConfigContractProxy, chain_factory_proxy::ChainFactoryContractProxy, - esdt_safe_proxy::EsdtSafeProxy, header_verifier_proxy::HeaderverifierProxy, + chain_config_proxy::ChainConfigContractProxy, + chain_factory_proxy::ChainFactoryContractProxy, + esdt_safe_proxy::EsdtSafeProxy, + fee_market_proxy::{FeeMarketProxy, FeeStruct}, + header_verifier_proxy::HeaderverifierProxy, sovereign_forge_proxy::SovereignForgeProxy, }; use serde::{Deserialize, Serialize}; @@ -20,6 +23,7 @@ const CHAIN_CONFIG_CODE_PATH: &str = "../../chain-config/output/chain-config.mxs const CHAIN_FACTORY_CODE_PATH: &str = "../../chain-factory/output/chain-factory.mxsc.json"; const HEADER_VERIFIER_CODE_PATH: &str = "../../header-verifier/output/header-verifier.mxsc.json"; const ESDT_SAFE_CODE_PATH: &str = "../../esdt-safe/output/esdt-safe.mxsc.json"; +const FEE_MARKET_CODE_PATH: &str = "../../fee-market/output/fee-market.mxsc.json"; pub async fn sovereign_forge_cli() { env_logger::init(); @@ -50,6 +54,7 @@ pub struct State { factory_address: Option, header_verifier_address: Option, esdt_safe_address: Option, + fee_market_address: Option, } impl State { @@ -65,30 +70,36 @@ impl State { } } - /// Sets the contract address + /// Sets the Sovereign-Forge contract address pub fn set_address(&mut self, address: Bech32Address) { self.contract_address = Some(address); } - /// Sets the contract address + /// Sets the Chain-Config contract address pub fn set_config_template(&mut self, address: Bech32Address) { self.config_address = Some(address); } - /// Sets the contract address + /// Sets the Chain-Factory contract address pub fn set_factory_template(&mut self, address: Bech32Address) { self.factory_address = Some(address); } - /// Sets the contract address + /// Sets the Header-Verifier contract address pub fn set_header_verifier_address(&mut self, address: Bech32Address) { self.header_verifier_address = Some(address); } + /// Sets the Esdt-Safe contract address pub fn set_esdt_safe_address(&mut self, address: Bech32Address) { self.esdt_safe_address = Some(address); } + /// Sets the Fee-Market contract address + pub fn set_fee_market_address(&mut self, address: Bech32Address) { + self.fee_market_address = Some(address); + } + /// Returns the contract address pub fn current_address(&self) -> &Bech32Address { self.contract_address @@ -172,6 +183,8 @@ impl ContractInteract { self.convert_address_to_managed(self.state.config_address.clone()); let esdt_safe_managed_address = self.convert_address_to_managed(self.state.esdt_safe_address.clone()); + let fee_market_mananged_address = + self.convert_address_to_managed(self.state.fee_market_address.clone()); let new_address = self .interactor @@ -184,7 +197,7 @@ impl ContractInteract { config_managed_address, header_verifier_managed_address, esdt_safe_managed_address, - forge_managed_address, // USE ACTUAL FEE-MARKET TEMPLATE + fee_market_mananged_address, ) .code(MxscPath::new(CHAIN_FACTORY_CODE_PATH)) .returns(ReturnsNewAddress) @@ -278,8 +291,35 @@ impl ContractInteract { new_address_bech32.clone(), )); - println!("new Header-Verifier address: {new_address_bech32}"); + println!("new ESDT-Safe address: {new_address_bech32}"); } + + pub async fn deploy_fee_market_template(&mut self) { + let esdt_safe_managed_address = + self.convert_address_to_managed(self.state.esdt_safe_address.clone()); + let fee: Option> = None; + + let new_address = self + .interactor + .tx() + .from(&self.wallet_address) + .gas(80_000_000u64) + .typed(FeeMarketProxy) + .init(esdt_safe_managed_address, fee) + .returns(ReturnsNewAddress) + .code(MxscPath::new(FEE_MARKET_CODE_PATH)) + .run() + .await; + + let new_address_bech32 = bech32::encode(&new_address); + self.state + .set_fee_market_address(Bech32Address::from_bech32_string( + new_address_bech32.clone(), + )); + + println!("new Fee-Market address: {new_address_bech32}"); + } + pub async fn upgrade(&mut self) { let response = self .interactor @@ -425,6 +465,23 @@ impl ContractInteract { println!("Result: {response:?}"); } + pub async fn deploy_phase_four(&mut self) { + let fee: Option> = None; + + let response = self + .interactor + .tx() + .from(&self.wallet_address) + .to(self.state.current_address()) + .gas(80_000_000u64) + .typed(SovereignForgeProxy) + .deploy_phase_four(fee) + .returns(ReturnsResultUnmanaged) + .run() + .await; + + println!("Result: {response:?}"); + } pub async fn chain_factories(&mut self) { let shard_id = 0u32; diff --git a/sovereign-forge/interactor/tests/interact_cs_tests.rs b/sovereign-forge/interactor/tests/interact_cs_tests.rs index f035b97d..b478f4ae 100644 --- a/sovereign-forge/interactor/tests/interact_cs_tests.rs +++ b/sovereign-forge/interactor/tests/interact_cs_tests.rs @@ -10,6 +10,7 @@ async fn deploy_test_sovereign_forge_cs() { interactor.deploy_header_verifier_template().await; interactor.deploy_chain_config_template().await; interactor.deploy_esdt_safe_template().await; + interactor.deploy_fee_market_template().await; interactor.deploy_chain_factory().await; interactor.register_token_handler(1).await; @@ -24,4 +25,5 @@ async fn deploy_test_sovereign_forge_cs() { interactor.deploy_phase_one().await; interactor.deploy_phase_two().await; interactor.deploy_phase_three().await; + interactor.deploy_phase_four().await; } From 8412739e2d2f8adbb80c625ad3557a8f452aa124 Mon Sep 17 00:00:00 2001 From: Andrei Baltariu Date: Wed, 11 Dec 2024 16:04:06 +0200 Subject: [PATCH 87/87] Removed `state.toml` Signed-off-by: Andrei Baltariu --- sovereign-forge/interactor/state.toml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 sovereign-forge/interactor/state.toml diff --git a/sovereign-forge/interactor/state.toml b/sovereign-forge/interactor/state.toml deleted file mode 100644 index de9f43bb..00000000 --- a/sovereign-forge/interactor/state.toml +++ /dev/null @@ -1,5 +0,0 @@ -contract_address = "erd1qqqqqqqqqqqqqpgqt54uz2y2frvy7fqet479a6efarnyw3yud8ssj6kyuz" -config_address = "erd1qqqqqqqqqqqqqpgqd3sm30pzrsqs2y7ct6368tlt94d6xvl6d8ssqhckfm" -factory_address = "erd1qqqqqqqqqqqqqpgq9xqda668zt76c8tvfqe9t39g7pz0j9t2d8sss3w65z" -header_verifier_address = "erd1qqqqqqqqqqqqqpgqlmtayq49qt94dj7gghagd7ap3d3htj76d8sszr0t7z" -esdt_safe_address = "erd1qqqqqqqqqqqqqpgqvxvmyp2fgr6qekksx8n6t8netkpweh28d8ssw9gwh8"