1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
//! Contains Dao Ids Contract definition and related abstractions.
//!
//! There is one continuous indexation of votes in the system.
//! Each new voting gets a unique across-the-system id generated by the contract.
use crate::modules::AccessControl;
use odra::{contract_env, types::Address, Sequence};
/// Dao Ids contract manages voting ids in the system.
/// Only a whitelisted account is eligible to generate ids.
///
/// For details see [DaoIdsContract]).
#[odra::module]
pub struct DaoIdsContract {
    access_control: AccessControl,
    voting_id_seq: Sequence<u32>,
}
#[odra::module]
impl DaoIdsContract {
    delegate! {
        to self.access_control {
            /// Changes the ownership of the contract. Transfers the ownership to the `owner`.
            /// Only the current owner is permitted to call this method.
            /// [`Read more`](AccessControl::propose_new_owner())
            pub fn propose_new_owner(&mut self, owner: Address);
            /// Accepts the new owner proposition. This can be called only by the proposed owner.
            /// [`Read more`](crate::modules::access_control::AccessControl::accept_new_owner())
            pub fn accept_new_owner(&mut self);
            /// Adds a new address to the whitelist.
            ///
            /// [`Read more`](AccessControl::add_to_whitelist())
            pub fn add_to_whitelist(&mut self, address: Address);
            /// Remove address from the whitelist.
            ///
            /// [`Read more`](AccessControl::remove_from_whitelist())
            pub fn remove_from_whitelist(&mut self, address: Address);
            /// Checks whether the given address is added to the whitelist.
            ///
            /// [`Read more`](AccessControl::is_whitelisted()).
            pub fn is_whitelisted(&self, address: Address) -> bool;
            /// Returns the address of the current owner.
            ///
            /// [`Read more`](AccessControl::get_owner()).
            pub fn get_owner(&self) -> Option<Address>;
        }
    }
    ///  Initializes a contract.
    ///  Sets the deployer as the owner.
    ///
    ///  see [AccessControl](AccessControl::init())
    #[odra(init)]
    pub fn init(&mut self) {
        let deployer = contract_env::caller();
        self.access_control.init(deployer);
    }
    /// Returns the next voting id in the system.
    ///
    /// # Errors
    /// Throws [`NotWhitelisted`](crate::utils::Error::NotWhitelisted) if the caller is not whitelisted.
    pub fn next_voting_id(&mut self) -> u32 {
        self.access_control.ensure_whitelisted();
        self.voting_id_seq.next_value()
    }
}