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
//! Contains CSPR Rate Provider Contract definition and related abstractions.
use crate::modules::Owner;
use odra::types::Balance;
use odra::{contract_env, types::Address, Variable};
/// CSPR Rate provider contract allows to read and write the current CSPR:Fiat rate.
/// Only the owner is eligible to update the rate, but any account can read the current value.
#[odra::module]
pub struct CSPRRateProviderContract {
owner: Owner,
rate: Variable<Balance>,
}
#[odra::module]
impl CSPRRateProviderContract {
/// Contract constructor.
///
/// * sets the initial CSPR:Fiat rate.
/// * sets the deployer as the owner.
///
/// [Read more](Owner::init())
#[odra(init)]
pub fn init(&mut self, rate: Balance) {
let deployer = contract_env::caller();
self.owner.init(deployer);
self.set_rate(rate);
}
/// Gets the current CSPR:Fiat rate.
pub fn get_rate(&self) -> Balance {
self.rate.get().unwrap_or_default()
}
/// Updates the current CSPR:Fiat rate.
///
/// # Errors
/// * [`NotAnOwner`](crate::utils::Error::NotAnOwner) if the caller is not the contract owner.
pub fn set_rate(&mut self, rate: Balance) {
self.owner.ensure_owner();
self.rate.set(rate);
}
/// Returns the address of the current owner.
/// [`Read more`](Owner::get_owner()).
pub fn get_owner(&self) -> Option<Address> {
self.owner.get_owner()
}
}