Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sovereign-Forge endpoint fixed #224

Merged
merged 13 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 16 additions & 1 deletion chain-factory/src/factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,20 @@ pub trait FactoryModule: only_admin::OnlyAdminModule {
.sync_call()
}

#[only_admin]
#[endpoint(setEsdtSafeAddressInHeaderVerifier)]
fn set_esdt_safe_address_in_header_verifier(
&self,
header_verifier: ManagedAddress,
esdt_safe_address: ManagedAddress,
) {
self.tx()
.to(header_verifier)
.typed(HeaderverifierProxy)
.set_esdt_safe_address(esdt_safe_address)
.sync_call();
}

#[only_admin]
#[endpoint(deployEnshrineEsdtSafe)]
fn deploy_enshrine_esdt_safe(
Expand Down Expand Up @@ -136,9 +150,10 @@ pub trait FactoryModule: only_admin::OnlyAdminModule {
fee_market_address
}

// TODO:
#[only_admin]
#[endpoint(completeSetupPhase)]
fn complete_setup_phase(&self, _contract_address: ManagedAddress) {
fn complete_setup_phase(&self) {
// TODO: will have to call each contract's endpoint to finish setup phase
}

Expand Down
5 changes: 3 additions & 2 deletions chain-factory/wasm-chain-factory-full/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand All @@ -22,6 +22,7 @@ multiversx_sc_wasm_adapter::endpoints! {
upgrade => upgrade
deploySovereignChainConfigContract => deploy_sovereign_chain_config_contract
deployHeaderVerifier => deploy_header_verifier
setEsdtSafeAddressInHeaderVerifier => set_esdt_safe_address_in_header_verifier
deployEnshrineEsdtSafe => deploy_enshrine_esdt_safe
deployEsdtSafe => deploy_esdt_safe
deployFeeMarket => deploy_fee_market
Expand Down
5 changes: 3 additions & 2 deletions chain-factory/wasm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand All @@ -22,6 +22,7 @@ multiversx_sc_wasm_adapter::endpoints! {
upgrade => upgrade
deploySovereignChainConfigContract => deploy_sovereign_chain_config_contract
deployHeaderVerifier => deploy_header_verifier
setEsdtSafeAddressInHeaderVerifier => set_esdt_safe_address_in_header_verifier
deployEnshrineEsdtSafe => deploy_enshrine_esdt_safe
deployEsdtSafe => deploy_esdt_safe
deployFeeMarket => deploy_fee_market
Expand Down
22 changes: 17 additions & 5 deletions common/proxies/src/chain_factory_proxy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,22 @@ where
.original_result()
}

pub fn set_esdt_safe_address_in_header_verifier<
Arg0: ProxyArg<ManagedAddress<Env::Api>>,
Arg1: ProxyArg<ManagedAddress<Env::Api>>,
>(
self,
header_verifier: Arg0,
esdt_safe_address: Arg1,
) -> TxTypedCall<Env, From, To, NotPayable, Gas, ()> {
self.wrapped_tx
.payment(NotPayable)
.raw_call("setEsdtSafeAddressInHeaderVerifier")
.argument(&header_verifier)
.argument(&esdt_safe_address)
.original_result()
}

pub fn deploy_enshrine_esdt_safe<
Arg0: ProxyArg<bool>,
Arg1: ProxyArg<ManagedAddress<Env::Api>>,
Expand Down Expand Up @@ -180,16 +196,12 @@ where
.original_result()
}

pub fn complete_setup_phase<
Arg0: ProxyArg<ManagedAddress<Env::Api>>,
>(
pub fn complete_setup_phase(
self,
_contract_address: Arg0,
) -> TxTypedCall<Env, From, To, NotPayable, Gas, ()> {
self.wrapped_tx
.payment(NotPayable)
.raw_call("completeSetupPhase")
.argument(&_contract_address)
.original_result()
}

Expand Down
7 changes: 5 additions & 2 deletions common/proxies/src/sovereign_forge_proxy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,13 +127,16 @@ where
}

pub fn deploy_phase_one<
Arg0: ProxyArg<operation::SovereignConfig<Env::Api>>,
Arg0: ProxyArg<Option<ManagedBuffer<Env::Api>>>,
Arg1: ProxyArg<operation::SovereignConfig<Env::Api>>,
>(
self,
config: Arg0,
opt_preferred_chain_id: Arg0,
config: Arg1,
) -> TxTypedCall<Env, From, To, (), Gas, ()> {
self.wrapped_tx
.raw_call("deployPhaseOne")
.argument(&opt_preferred_chain_id)
.argument(&config)
.original_result()
}
Expand Down
3 changes: 3 additions & 0 deletions sovereign-forge/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ version = "=0.56.0"
[dependencies.multiversx-sc-modules]
version = "=0.56.0"

[dependencies.token-handler]
path = "../token-handler"

[dependencies.chain-factory]
path = "../chain-factory"

Expand Down
2 changes: 1 addition & 1 deletion sovereign-forge/interactor/src/interact.rs
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ impl ContractInteract {
.to(self.state.current_address())
.gas(100_000_000u64)
.typed(SovereignForgeProxy)
.deploy_phase_one(config)
.deploy_phase_one(None::<ManagedBuffer<StaticApi>>, config)
.egld(egld_amount)
.returns(ReturnsResultUnmanaged)
.run()
Expand Down
42 changes: 26 additions & 16 deletions sovereign-forge/src/common/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ pub enum ScArray {
Controller,
HeaderVerifier,
ESDTSafe,
EnshrineESDTSafe,
FeeMarket,
TokenHandler,
ChainConfig,
Expand All @@ -53,7 +54,7 @@ pub trait UtilsModule: super::storage::StorageModule {
);
}

fn require_phase_1_completed(&self, caller: &ManagedAddress) {
fn require_phase_one_completed(&self, caller: &ManagedAddress) {
require!(
!self.sovereigns_mapper(caller).is_empty(),
"The current caller has not deployed any Sovereign Chain"
Expand All @@ -63,11 +64,6 @@ pub trait UtilsModule: super::storage::StorageModule {
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 is_contract_deployed(&self, sovereign_creator: &ManagedAddress, sc_id: ScArray) -> bool {
Expand All @@ -87,18 +83,31 @@ pub trait UtilsModule: super::storage::StorageModule {
.address
}

fn generate_chain_id(&self) -> ManagedBuffer {
loop {
let new_chain_id = self.generated_random_4_char_string();
let mut chain_id_history_mapper = self.chain_ids();
if !chain_id_history_mapper.contains(&new_chain_id) {
chain_id_history_mapper.insert(new_chain_id.clone());
return new_chain_id;
fn generate_chain_id(&self, opt_preferred_chain_id: Option<ManagedBuffer>) -> ManagedBuffer {
let mut chain_id_history_mapper = self.chain_ids();

match opt_preferred_chain_id {
Some(preferred_chain_id) => {
require!(
!chain_id_history_mapper.contains(&preferred_chain_id),
"This chain ID is already used"
);

chain_id_history_mapper.insert(preferred_chain_id.clone());

preferred_chain_id
}
None => loop {
let new_chain_id = self.generated_random_four_char_string();
if !chain_id_history_mapper.contains(&new_chain_id) {
chain_id_history_mapper.insert(new_chain_id.clone());
break new_chain_id;
}
},
}
}

fn generated_random_4_char_string(&self) -> ManagedBuffer {
fn generated_random_four_char_string(&self) -> ManagedBuffer {
let mut byte_array: [u8; 4] = [0; 4];
let mut rand = RandomnessSource::new();
(0..4).for_each(|i| {
Expand All @@ -116,8 +125,9 @@ pub trait UtilsModule: super::storage::StorageModule {
}

fn get_chain_factory_address(&self) -> ManagedAddress {
let caller = self.blockchain().get_caller();
let shard_id = self.blockchain().get_shard_of_address(&caller);
let blockchain_api = self.blockchain();
let caller = blockchain_api.get_caller();
let shard_id = blockchain_api.get_shard_of_address(&caller);

self.chain_factories(shard_id).get()
}
Expand Down
25 changes: 21 additions & 4 deletions sovereign-forge/src/phases.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::err_msg;
use core::ops::Deref;
use proxies::fee_market_proxy::FeeStruct;
use proxies::{chain_factory_proxy::ChainFactoryContractProxy, fee_market_proxy::FeeStruct};

use multiversx_sc::require;
use operation::SovereignConfig;
Expand Down Expand Up @@ -39,18 +39,29 @@ pub trait PhasesModule:
);
}

self.tx()
.to(self.get_chain_factory_address())
.typed(ChainFactoryContractProxy)
.complete_setup_phase()
.sync_call();

self.setup_phase_complete().set(true);
}

#[payable("EGLD")]
#[endpoint(deployPhaseOne)]
fn deploy_phase_one(&self, config: SovereignConfig<Self::Api>) {
fn deploy_phase_one(
&self,
opt_preferred_chain_id: Option<ManagedBuffer>,
config: SovereignConfig<Self::Api>,
) {
self.require_setup_complete();

let call_value = self.call_value().egld();
self.require_correct_deploy_cost(call_value.deref());

let chain_id = self.generate_chain_id();
let chain_id = self.generate_chain_id(opt_preferred_chain_id);

let blockchain_api = self.blockchain();
let caller = blockchain_api.get_caller();
let caller_shard_id = blockchain_api.get_shard_of_address(&caller);
Expand Down Expand Up @@ -82,7 +93,7 @@ pub trait PhasesModule:
let blockchain_api = self.blockchain();
let caller = blockchain_api.get_caller();

self.require_phase_1_completed(&caller);
self.require_phase_one_completed(&caller);
require!(
!self.is_contract_deployed(&caller, ScArray::HeaderVerifier),
"The Header-Verifier contract is already deployed"
Expand Down Expand Up @@ -115,6 +126,12 @@ pub trait PhasesModule:
let esdt_safe_contract_info =
ContractInfo::new(ScArray::ESDTSafe, esdt_safe_address.clone());

self.tx()
.to(self.get_chain_factory_address())
.typed(ChainFactoryContractProxy)
.set_esdt_safe_address_in_header_verifier(header_verifier_address, esdt_safe_address)
.sync_call();

self.sovereign_deployed_contracts(&self.sovereigns_mapper(&caller).get())
.insert(esdt_safe_contract_info);
}
Expand Down
Loading
Loading