#[allow(unused_imports)]
use crate as casper_contract_sdk;
use crate::{casper::Entity, macros::casper};
#[casper(path = crate)]
pub struct OwnableState {
owner: Option<Entity>,
}
impl Default for OwnableState {
fn default() -> Self {
Self {
owner: Some(crate::casper::get_caller()),
}
}
}
#[casper(path = crate)]
pub enum OwnableError {
NotAuthorized,
}
#[casper(path = crate, export = true)]
pub trait Ownable {
#[casper(private)]
fn state(&self) -> &OwnableState;
#[casper(private)]
fn state_mut(&mut self) -> &mut OwnableState;
#[casper(private)]
fn only_owner(&self) -> Result<(), OwnableError> {
let caller = crate::casper::get_caller();
match self.state().owner {
Some(owner) if caller != owner => {
return Err(OwnableError::NotAuthorized);
}
None => {
return Err(OwnableError::NotAuthorized);
}
Some(_owner) => {}
}
Ok(())
}
#[casper(revert_on_error)]
fn transfer_ownership(&mut self, new_owner: Entity) -> Result<(), OwnableError> {
self.only_owner()?;
self.state_mut().owner = Some(new_owner);
Ok(())
}
fn owner(&self) -> Option<Entity> {
self.state().owner
}
#[casper(revert_on_error)]
fn renounce_ownership(&mut self) -> Result<(), OwnableError> {
self.only_owner()?;
self.state_mut().owner = None;
Ok(())
}
}