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

feat: relayer and public separate states #4

Merged
merged 1 commit into from
Jun 6, 2024
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
30 changes: 26 additions & 4 deletions interaction/devnet.snippets.sh
Original file line number Diff line number Diff line change
Expand Up @@ -121,23 +121,45 @@ setWegldContractAddress(){



setContractStateActive(){
setPublicStateActive(){
mxpy --verbose contract call ${ADDRESS} \
--recall-nonce \
--pem=${WALLET} \
--gas-limit=6000000 \
--function "setContractStateActive" \
--function "setPublicStateActive" \
--proxy ${PROXY} \
--chain ${CHAIN_ID} \
--send || return
}

setContractStateInactive(){
setPublicStateInactive(){
mxpy --verbose contract call ${ADDRESS} \
--recall-nonce \
--pem=${WALLET} \
--gas-limit=6000000 \
--function "setContractStateInactive" \
--function "setPublicStateInactive" \
--proxy ${PROXY} \
--chain ${CHAIN_ID} \
--send || return
}

setRelayerStateActive(){
mxpy --verbose contract call ${ADDRESS} \
--recall-nonce \
--pem=${WALLET} \
--gas-limit=6000000 \
--function "setRelayerStateActive" \
--proxy ${PROXY} \
--chain ${CHAIN_ID} \
--send || return
}

setRelayerStateInactive(){
mxpy --verbose contract call ${ADDRESS} \
--recall-nonce \
--pem=${WALLET} \
--gas-limit=6000000 \
--function "setRelayerStateInactive" \
--proxy ${PROXY} \
--chain ${CHAIN_ID} \
--send || return
Expand Down
38 changes: 30 additions & 8 deletions src/admin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,38 +15,60 @@ multiversx_sc::derive_imports!();
pub trait AdminModule:
crate::config::ConfigModule + storage::StorageModule + events::EventsModule
{
#[endpoint(setContractStateActive)]
fn set_contract_state_active(&self) {
#[endpoint(setPublicStateActive)]
fn set_public_state_active(&self) {
let caller = self.blockchain().get_caller();

require!(
self.is_privileged(&caller) || self.is_relayer(&caller),
ERR_NOT_PRIVILEGED
);
require!(
self.contract_state().get() == State::Inactive,
self.public_state().get() == State::Inactive,
ERR_ALREADY_ACTIVE
);
self.contract_state().set(State::Active);
self.public_state().set(State::Active);
self.set_contract_state_event(&State::Active);
}

#[endpoint(setContractStateInactive)]
fn set_contract_state_inactive(&self) {
#[endpoint(setPublicStateInactive)]
fn set_public_state_inactive(&self) {
let caller = self.blockchain().get_caller();

require!(
self.is_privileged(&caller) || self.is_relayer(&caller),
ERR_NOT_PRIVILEGED
);
require!(
self.contract_state().get() == State::Active,
self.public_state().get() == State::Active,
ERR_ALREADY_INACTIVE
);
self.contract_state().set(State::Inactive);
self.public_state().set(State::Inactive);
self.set_contract_state_event(&State::Inactive);
}

#[endpoint(setRelayerStateActive)]
fn set_relayer_state_active(&self) {
only_privileged!(self, ERR_NOT_PRIVILEGED);
require!(
self.relayer_state().get() == State::Inactive,
ERR_ALREADY_ACTIVE
);
self.relayer_state().set(State::Active);
self.set_relayer_state_event(&State::Active);
}

#[endpoint(setRelayerStateInactive)]
fn set_relayer_state_inactive(&self) {
only_privileged!(self, ERR_NOT_PRIVILEGED);
require!(
self.relayer_state().get() == State::Active,
ERR_ALREADY_INACTIVE
);
self.relayer_state().set(State::Inactive);
self.set_relayer_state_event(&State::Inactive);
}

#[endpoint(setWhitelistStateActive)]
fn set_whitelist_state_active(&self) {
only_privileged!(self, ERR_NOT_PRIVILEGED);
Expand Down
14 changes: 7 additions & 7 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,6 @@ pub trait ConfigModule: storage::StorageModule + events::EventsModule {
fn contract_is_ready(&self) -> bool {
let mut is_ready = true;

if !self.is_state_active(self.contract_state().get()) {
is_ready = false;
}

if self.administrator().is_empty() {
is_ready = false;
}
Expand Down Expand Up @@ -117,9 +113,13 @@ pub trait ConfigModule: storage::StorageModule + events::EventsModule {
#[storage_mapper("whitelist_state")]
fn whitelist_state(&self) -> SingleValueMapper<State>;

#[view(getContractState)]
#[storage_mapper("contract_state")]
fn contract_state(&self) -> SingleValueMapper<State>;
#[view(getPublicState)]
#[storage_mapper("public_state")]
fn public_state(&self) -> SingleValueMapper<State>;

#[view(getRelayerState)]
#[storage_mapper("relayer_state")]
fn relayer_state(&self) -> SingleValueMapper<State>;

#[view(getRelayer)]
#[storage_mapper("relayer")]
Expand Down
3 changes: 3 additions & 0 deletions src/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,7 @@ pub trait EventsModule {

#[event("setWegldContractAddressEvent")]
fn set_wegld_contract_address_event(&self, #[indexed] wegld_contract_address: &ManagedAddress);

#[event("setRelayerStateEvent")]
fn set_relayer_state_event(&self, #[indexed] state: &State);
}
11 changes: 10 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ pub trait CoreMxBridgeSc:

#[upgrade]
fn upgrade(&self) {
self.set_contract_state_inactive();
self.set_public_state_inactive();
self.set_relayer_state_inactive();
}

#[payable("*")]
Expand All @@ -43,6 +44,10 @@ pub trait CoreMxBridgeSc:
) {
let caller = self.blockchain().get_caller();
require_contract_ready!(self, ERR_CONTRACT_NOT_READY);
require!(
self.is_state_active(self.public_state().get()),
ERR_CONTRACT_NOT_READY
);
check_whitelist!(self, &caller, ERR_ADDRESS_NOT_WHITELISTED);

let fee_value = self.fee_value().get();
Expand Down Expand Up @@ -151,6 +156,10 @@ pub trait CoreMxBridgeSc:
receiver: ManagedAddress,
) {
require_contract_ready!(self, ERR_CONTRACT_NOT_READY);
require!(
self.is_state_active(self.relayer_state().get()),
ERR_CONTRACT_NOT_READY
);
let caller = self.blockchain().get_caller();
require!(self.relayer().get() == caller, ERR_NOT_PRIVILEGED);

Expand Down
36 changes: 33 additions & 3 deletions tests/bridge_sc/bridge_sc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ impl ContractState {
pub fn check_contract_state(&mut self, contract_state: State) -> &mut Self {
self.world.sc_query(
ScQueryStep::new()
.call(self.contract.contract_state())
.call(self.contract.public_state())
.expect_value(SingleValue::from(contract_state)),
);
self
Expand Down Expand Up @@ -291,7 +291,37 @@ impl ContractState {
self.world.sc_call(
ScCallStep::new()
.from(caller)
.call(self.contract.set_contract_state_active())
.call(self.contract.set_public_state_active())
.expect(tx_expect),
);
self
}

pub fn set_relayer_state_active(
&mut self,
caller: &str,
expect: Option<TxExpect>,
) -> &mut Self {
let tx_expect = expect.unwrap_or(TxExpect::ok());
self.world.sc_call(
ScCallStep::new()
.from(caller)
.call(self.contract.set_relayer_state_active())
.expect(tx_expect),
);
self
}

pub fn set_relayer_state_inactive(
&mut self,
caller: &str,
expect: Option<TxExpect>,
) -> &mut Self {
let tx_expect = expect.unwrap_or(TxExpect::ok());
self.world.sc_call(
ScCallStep::new()
.from(caller)
.call(self.contract.set_relayer_state_inactive())
.expect(tx_expect),
);
self
Expand All @@ -306,7 +336,7 @@ impl ContractState {
self.world.sc_call(
ScCallStep::new()
.from(caller)
.call(self.contract.set_contract_state_inactive())
.call(self.contract.set_public_state_inactive())
.expect(tx_expect),
);
self
Expand Down
2 changes: 1 addition & 1 deletion tests/endpoints/relayer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ fn relayer_test() {

state
.default_deploy_and_set()
.set_contract_state_active(OWNER_BRIDGE_CONTRACT_ADDRESS_EXPR, None);
.set_relayer_state_active(OWNER_BRIDGE_CONTRACT_ADDRESS_EXPR, None);

state.send_from_liquidity(
FIRST_USER_ADDRESS_EXPR,
Expand Down
2 changes: 1 addition & 1 deletion tests/unit_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ fn contract_is_ready_test() {

assert_eq!(check, false);

bridge_sc.contract_state().set(State::Active);
bridge_sc.public_state().set(State::Active);

check = bridge_sc.contract_is_ready();

Expand Down
13 changes: 8 additions & 5 deletions 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: 30
// Endpoints: 33
// Async Callback (empty): 1
// Total number of exported functions: 33
// Total number of exported functions: 36

#![no_std]

Expand All @@ -33,10 +33,13 @@ multiversx_sc_wasm_adapter::endpoints! {
getAdministrator => administrator
getTokensWhitelist => tokens_whitelist
getWhitelistState => whitelist_state
getContractState => contract_state
getPublicState => public_state
getRelayerState => relayer_state
getRelayer => relayer
setContractStateActive => set_contract_state_active
setContractStateInactive => set_contract_state_inactive
setPublicStateActive => set_public_state_active
setPublicStateInactive => set_public_state_inactive
setRelayerStateActive => set_relayer_state_active
setRelayerStateInactive => set_relayer_state_inactive
setWhitelistStateActive => set_whitelist_state_active
setWhitelistStateInactive => set_whitelist_state_inactive
setDepositLimits => set_deposit_limits
Expand Down
Loading