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

Split access roles #27

Closed
wants to merge 1 commit into from
Closed
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
92 changes: 71 additions & 21 deletions amm/contracts/stable_pool/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,19 @@ pub mod stable_pool {
}

#[ink(event)]
pub struct OwnerChanged {
pub struct FeeSetterChanged {
#[ink(topic)]
pub new_owner: AccountId,
pub new_fee_setter: AccountId,
}
#[ink(event)]
pub struct FeeReceiverSetterChanged {
#[ink(topic)]
pub new_fee_receiver_setter: AccountId,
}
#[ink(event)]
pub struct AmpCoefSetterChanged {
#[ink(topic)]
pub new_amp_coef_setter: AccountId,
}

#[ink(event)]
Expand Down Expand Up @@ -137,11 +147,16 @@ pub mod stable_pool {
fees: Fees,
/// Who receives protocol fees (if any).
fee_receiver: Option<AccountId>,
///
fee_setter: AccountId,
///
fee_receiver_setter: AccountId,
///
amp_coef_setter: AccountId,
}

#[ink(storage)]
pub struct StablePoolContract {
owner: AccountId,
pool: StablePoolData,
psp22: PSP22Data,
}
Expand All @@ -160,9 +175,11 @@ pub mod stable_pool {
tokens_decimals: Vec<u8>,
token_rates: Vec<TokenRate>,
amp_coef: u128,
owner: AccountId,
fees: Option<Fees>,
fee_receiver: Option<AccountId>,
fee_setter: AccountId,
fee_receiver_setter: AccountId,
amp_coef_setter: AccountId,
) -> Result<Self, StablePoolError> {
validate_amp_coef(amp_coef)?;
let mut unique_tokens = tokens.clone();
Expand Down Expand Up @@ -192,7 +209,6 @@ pub mod stable_pool {
})
.collect();
Ok(Self {
owner,
pool: StablePoolData {
tokens,
reserves: vec![0; token_count],
Expand All @@ -201,6 +217,9 @@ pub mod stable_pool {
amp_coef,
fees: fees.ok_or(StablePoolError::InvalidFee)?,
fee_receiver,
fee_setter,
fee_receiver_setter,
amp_coef_setter,
},
psp22: PSP22Data::default(),
})
Expand All @@ -211,20 +230,24 @@ pub mod stable_pool {
tokens: Vec<AccountId>,
tokens_decimals: Vec<u8>,
init_amp_coef: u128,
owner: AccountId,
trade_fee: u32,
protocol_fee: u32,
fee_receiver: Option<AccountId>,
fee_setter: AccountId,
fee_receiver_setter: AccountId,
amp_coef_setter: AccountId,
) -> Result<Self, StablePoolError> {
let token_rates = vec![TokenRate::new_constant(RATE_PRECISION); tokens.len()];
Self::new_pool(
tokens,
tokens_decimals,
token_rates,
init_amp_coef,
owner,
Fees::new(trade_fee, protocol_fee),
fee_receiver,
fee_setter,
fee_receiver_setter,
amp_coef_setter,
)
}

Expand All @@ -236,10 +259,12 @@ pub mod stable_pool {
external_rates: Vec<Option<AccountId>>,
rate_expiration_duration_ms: u64,
init_amp_coef: u128,
owner: AccountId,
trade_fee: u32,
protocol_fee: u32,
fee_receiver: Option<AccountId>,
fee_setter: AccountId,
fee_receiver_setter: AccountId,
amp_coef_setter: AccountId,
) -> Result<Self, StablePoolError> {
let current_time = Self::env().block_timestamp();
let token_rates: Vec<TokenRate> = external_rates
Expand All @@ -259,9 +284,11 @@ pub mod stable_pool {
tokens_decimals,
token_rates,
init_amp_coef,
owner,
Fees::new(trade_fee, protocol_fee),
fee_receiver,
fee_setter,
fee_receiver_setter,
amp_coef_setter,
)
}

Expand Down Expand Up @@ -330,11 +357,8 @@ pub mod stable_pool {
.collect()
}

fn ensure_owner(&self) -> Result<(), StablePoolError> {
ensure!(
self.env().caller() == self.owner,
StablePoolError::OnlyOwner
);
fn ensure_access(&self, role: AccountId) -> Result<(), StablePoolError> {
ensure!(self.env().caller() == role, StablePoolError::OnlyOwner);
Ok(())
}

Expand Down Expand Up @@ -784,10 +808,36 @@ pub mod stable_pool {
}

#[ink(message)]
fn set_owner(&mut self, new_owner: AccountId) -> Result<(), StablePoolError> {
self.ensure_owner()?;
self.owner = new_owner;
self.env().emit_event(OwnerChanged { new_owner });
fn set_fee_setter(&mut self, new_fee_setter: AccountId) -> Result<(), StablePoolError> {
self.ensure_access(self.pool.fee_setter)?;
self.pool.fee_setter = new_fee_setter;
self.env().emit_event(FeeSetterChanged { new_fee_setter });
Ok(())
}

#[ink(message)]
fn set_fee_receiver_setter(
&mut self,
new_fee_receiver_setter: AccountId,
) -> Result<(), StablePoolError> {
self.ensure_access(self.pool.fee_receiver_setter)?;
self.pool.fee_receiver_setter = new_fee_receiver_setter;
self.env().emit_event(FeeReceiverSetterChanged {
new_fee_receiver_setter,
});
Ok(())
}

#[ink(message)]
fn set_amp_coef_setter(
&mut self,
new_amp_coef_setter: AccountId,
) -> Result<(), StablePoolError> {
self.ensure_access(self.pool.amp_coef_setter)?;
self.pool.amp_coef_setter = new_amp_coef_setter;
self.env().emit_event(AmpCoefSetterChanged {
new_amp_coef_setter,
});
Ok(())
}

Expand All @@ -796,7 +846,7 @@ pub mod stable_pool {
&mut self,
fee_receiver: Option<AccountId>,
) -> Result<(), StablePoolError> {
self.ensure_owner()?;
self.ensure_access(self.pool.fee_receiver_setter)?;
self.pool.fee_receiver = fee_receiver;
self.env().emit_event(FeeReceiverChanged {
new_fee_receiver: fee_receiver,
Expand All @@ -806,7 +856,7 @@ pub mod stable_pool {

#[ink(message)]
fn set_fees(&mut self, trade_fee: u32, protocol_fee: u32) -> Result<(), StablePoolError> {
self.ensure_owner()?;
self.ensure_access(self.pool.fee_setter)?;
self.pool.fees =
Fees::new(trade_fee, protocol_fee).ok_or(StablePoolError::InvalidFee)?;
self.env().emit_event(FeeChanged {
Expand All @@ -818,7 +868,7 @@ pub mod stable_pool {

#[ink(message)]
fn set_amp_coef(&mut self, amp_coef: u128) -> Result<(), StablePoolError> {
self.ensure_owner()?;
self.ensure_access(self.pool.amp_coef_setter)?;
validate_amp_coef(amp_coef)?;
self.pool.amp_coef = amp_coef;
self.env().emit_event(AmpCoefChanged {
Expand Down
5 changes: 4 additions & 1 deletion amm/drink-tests/src/stable_swap_tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,13 @@ pub fn setup_stable_swap_with_tokens(
tokens.clone(),
token_decimals,
amp_coef,
bob(),
trade_fee,
protocol_trade_fee,
Some(fee_receiver()),
// for the sake of tests, BOB is granted all access roles
bob(),
bob(),
bob(),
);

let stable_swap: stable_pool_contract::Instance = session
Expand Down
9 changes: 7 additions & 2 deletions amm/drink-tests/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,23 +54,28 @@ pub mod stable_swap {

pub fn setup(
session: &mut Session<MinimalRuntime>,
caller: drink::AccountId32,
tokens: Vec<AccountId>,
tokens_decimals: Vec<u8>,
init_amp_coef: u128,
caller: drink::AccountId32,
trade_fee: u32,
protocol_fee: u32,
fee_receiver: Option<AccountId>,
fee_setter: AccountId,
fee_receiver_setter: AccountId,
amp_coef_setter: AccountId,
) -> stable_pool_contract::Instance {
let _ = session.set_actor(caller.clone());
let instance = stable_pool_contract::Instance::new_stable(
tokens,
tokens_decimals,
init_amp_coef,
caller.to_account_id(),
trade_fee,
protocol_fee,
fee_receiver,
fee_setter,
fee_receiver_setter,
amp_coef_setter,
);

session
Expand Down
10 changes: 8 additions & 2 deletions amm/traits/stable_pool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,10 +177,16 @@ pub trait StablePool {
#[ink(message)]
fn force_update_rate(&mut self);

// --- OWNER RESTRICTED FUNCTIONS --- //
// --- ACCESS RESTRICTED FUNCTIONS --- //

#[ink(message)]
fn set_owner(&mut self, new_owner: AccountId) -> Result<(), StablePoolError>;
fn set_fee_setter(&mut self, new_fee_setter: AccountId) -> Result<(), StablePoolError>;

#[ink(message)]
fn set_fee_receiver_setter(&mut self, new_fee_receiver_setter: AccountId) -> Result<(), StablePoolError>;

#[ink(message)]
fn set_amp_coef_setter(&mut self, new_amp_coef_setter: AccountId) -> Result<(), StablePoolError>;

#[ink(message)]
fn set_fee_receiver(&mut self, fee_receiver: Option<AccountId>) -> Result<(), StablePoolError>;
Expand Down
Loading