diff --git a/chain-factory/src/factory.rs b/chain-factory/src/factory.rs index 1c75fd24..56be7470 100644 --- a/chain-factory/src/factory.rs +++ b/chain-factory/src/factory.rs @@ -1,4 +1,5 @@ use multiversx_sc::imports::*; +use multiversx_sc_modules::only_admin; use proxies::{ chain_config_proxy::ChainConfigContractProxy, enshrine_esdt_safe_proxy::EnshrineEsdtSafeProxy, @@ -9,8 +10,8 @@ use transaction::StakeMultiArg; multiversx_sc::derive_imports!(); #[multiversx_sc::module] -pub trait FactoryModule { - #[only_owner] +pub trait FactoryModule: only_admin::OnlyAdminModule { + #[only_admin] #[endpoint(deploySovereignChainConfigContract)] fn deploy_sovereign_chain_config_contract( &self, @@ -39,7 +40,7 @@ pub trait FactoryModule { .sync_call() } - #[only_owner] + #[only_admin] #[endpoint(deployHeaderVerifier)] fn deploy_header_verifier( &self, @@ -58,7 +59,7 @@ pub trait FactoryModule { .sync_call() } - #[only_owner] + #[only_admin] #[endpoint(deployEnshrineEsdtSafe)] fn deploy_enshrine_esdt_safe( &self, @@ -85,7 +86,7 @@ pub trait FactoryModule { .sync_call() } - #[only_owner] + #[only_admin] #[endpoint(deployFeeMarket)] fn deploy_fee_market( &self, @@ -105,7 +106,7 @@ pub trait FactoryModule { .sync_call() } - #[only_owner] + #[only_admin] #[endpoint(completeSetupPhase)] fn complete_setup_phase(&self, _contract_address: ManagedAddress) { // TODO: will have to call each contract's endpoint to finish setup phase diff --git a/chain-factory/src/lib.rs b/chain-factory/src/lib.rs index 281f7bce..653c04be 100644 --- a/chain-factory/src/lib.rs +++ b/chain-factory/src/lib.rs @@ -1,24 +1,31 @@ #![no_std] +use multiversx_sc_modules::only_admin; + multiversx_sc::imports!(); pub mod factory; #[multiversx_sc::contract] -pub trait ChainFactoryContract: factory::FactoryModule + utils::UtilsModule { +pub trait ChainFactoryContract: + factory::FactoryModule + utils::UtilsModule + only_admin::OnlyAdminModule +{ #[init] fn init( &self, + sovereign_forge_address: ManagedAddress, chain_config_template: ManagedAddress, header_verifier_template: ManagedAddress, cross_chain_operation_template: ManagedAddress, fee_market_template: ManagedAddress, ) { + self.require_sc_address(&sovereign_forge_address); self.require_sc_address(&chain_config_template); self.require_sc_address(&header_verifier_template); self.require_sc_address(&cross_chain_operation_template); self.require_sc_address(&fee_market_template); + self.add_admin(sovereign_forge_address); self.chain_config_template().set(chain_config_template); self.header_verifier_template() .set(header_verifier_template); diff --git a/chain-factory/tests/chain_factory_tests.rs b/chain-factory/tests/chain_factory_tests.rs index 6a33411f..d2618810 100644 --- a/chain-factory/tests/chain_factory_tests.rs +++ b/chain-factory/tests/chain_factory_tests.rs @@ -17,6 +17,10 @@ const CODE_PATH: MxscPath = MxscPath::new("output/chain-factory.mxsc.json"); const CONFIG_ADDRESS: TestSCAddress = TestSCAddress::new("chain-config"); const CONFIG_CODE_PATH: MxscPath = MxscPath::new("../chain-config/output/chain-factory.mxsc.json"); +const HEADER_ADDRESS: TestSCAddress = TestSCAddress::new("header-verifier"); +const ESDT_SAFE_ADDRESS: TestSCAddress = TestSCAddress::new("esdt-safe"); +const FEE_MARKET_ADDRESS: TestSCAddress = TestSCAddress::new("esdt-safe"); + const OWNER: TestAddress = TestAddress::new("owner"); const OWNER_BALANCE: u64 = 100_000_000_000; @@ -68,9 +72,10 @@ impl ChainFactoryTestState { .typed(ChainFactoryContractProxy) .init( CONFIG_ADDRESS, - FACTORY_ADDRESS, - FACTORY_ADDRESS, - FACTORY_ADDRESS, + CONFIG_ADDRESS, + HEADER_ADDRESS, + ESDT_SAFE_ADDRESS, + FEE_MARKET_ADDRESS, ) .code(CODE_PATH) .new_address(FACTORY_ADDRESS) @@ -88,7 +93,7 @@ impl ChainFactoryTestState { let transaction = self .world .tx() - .from(OWNER) + .from(CONFIG_ADDRESS) .to(FACTORY_ADDRESS) .typed(ChainFactoryContractProxy) .deploy_sovereign_chain_config_contract( diff --git a/chain-factory/wasm-chain-factory-full/src/lib.rs b/chain-factory/wasm-chain-factory-full/src/lib.rs index d16f290b..36e5dd5d 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: 9 // Async Callback (empty): 1 -// Total number of exported functions: 8 +// Total number of exported functions: 12 #![no_std] @@ -25,6 +25,10 @@ multiversx_sc_wasm_adapter::endpoints! { deployEnshrineEsdtSafe => deploy_enshrine_esdt_safe deployFeeMarket => deploy_fee_market completeSetupPhase => complete_setup_phase + isAdmin => is_admin + addAdmin => add_admin + removeAdmin => remove_admin + getAdmins => admins ) } diff --git a/chain-factory/wasm/src/lib.rs b/chain-factory/wasm/src/lib.rs index d16f290b..36e5dd5d 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: 9 // Async Callback (empty): 1 -// Total number of exported functions: 8 +// Total number of exported functions: 12 #![no_std] @@ -25,6 +25,10 @@ multiversx_sc_wasm_adapter::endpoints! { deployEnshrineEsdtSafe => deploy_enshrine_esdt_safe deployFeeMarket => deploy_fee_market completeSetupPhase => complete_setup_phase + isAdmin => is_admin + addAdmin => add_admin + removeAdmin => remove_admin + getAdmins => admins ) } diff --git a/common/proxies/src/chain_factory_proxy.rs b/common/proxies/src/chain_factory_proxy.rs index 87fa8164..34198ab1 100644 --- a/common/proxies/src/chain_factory_proxy.rs +++ b/common/proxies/src/chain_factory_proxy.rs @@ -48,16 +48,19 @@ where Arg1: ProxyArg>, Arg2: ProxyArg>, Arg3: ProxyArg>, + Arg4: ProxyArg>, >( self, - chain_config_template: Arg0, - header_verifier_template: Arg1, - cross_chain_operation_template: Arg2, - fee_market_template: Arg3, + sovereign_forge_address: Arg0, + chain_config_template: Arg1, + header_verifier_template: Arg2, + cross_chain_operation_template: Arg3, + fee_market_template: Arg4, ) -> TxTypedDeploy { self.wrapped_tx .payment(NotPayable) .raw_deploy() + .argument(&sovereign_forge_address) .argument(&chain_config_template) .argument(&header_verifier_template) .argument(&cross_chain_operation_template) @@ -179,4 +182,52 @@ where .argument(&_contract_address) .original_result() } + + pub fn is_admin< + Arg0: ProxyArg>, + >( + self, + address: Arg0, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("isAdmin") + .argument(&address) + .original_result() + } + + pub fn add_admin< + Arg0: ProxyArg>, + >( + self, + address: Arg0, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("addAdmin") + .argument(&address) + .original_result() + } + + pub fn remove_admin< + Arg0: ProxyArg>, + >( + self, + address: Arg0, + ) -> TxTypedCall { + self.wrapped_tx + .payment(NotPayable) + .raw_call("removeAdmin") + .argument(&address) + .original_result() + } + + pub fn admins( + self, + ) -> TxTypedCall>> { + self.wrapped_tx + .payment(NotPayable) + .raw_call("getAdmins") + .original_result() + } } diff --git a/token-handler/tests/token_handler_blackbox_tests.rs b/token-handler/tests/token_handler_blackbox_tests.rs index c8029a3d..b92a288b 100644 --- a/token-handler/tests/token_handler_blackbox_tests.rs +++ b/token-handler/tests/token_handler_blackbox_tests.rs @@ -89,6 +89,7 @@ impl TokenHandlerTestState { FACTORY_ADDRESS, FACTORY_ADDRESS, FACTORY_ADDRESS, + FACTORY_ADDRESS, ) .code(FACTORY_CODE_PATH) .new_address(FACTORY_ADDRESS)