use odra::{
prelude::{collections::BTreeMap, vec::Vec},
types::{Address, Balance},
OdraType,
};
use super::balances::BalanceStorage;
#[odra::module]
pub struct BalanceAggregates {
reputation_storage: BalanceStorage,
}
impl BalanceAggregates {
pub fn all_balances(&self) -> AggregatedBalance {
let mut balances = BTreeMap::<Address, Balance>::new();
self.reputation_storage.holders().for_each(|address| {
balances.insert(address, self.reputation_storage.balance_of(address));
});
AggregatedBalance::new(balances, self.reputation_storage.total_supply())
}
pub fn partial_balances(&self, addresses: Vec<Address>) -> AggregatedBalance {
let mut balances = BTreeMap::<Address, Balance>::new();
let mut partial_supply = Balance::zero();
for address in addresses {
let balance = self.reputation_storage.balance_of(address);
balances.insert(address, balance);
partial_supply += balance;
}
AggregatedBalance {
balances,
total_supply: partial_supply,
}
}
}
#[derive(OdraType)]
pub struct AggregatedBalance {
balances: BTreeMap<Address, Balance>,
total_supply: Balance,
}
impl AggregatedBalance {
pub fn new(balances: BTreeMap<Address, Balance>, total_supply: Balance) -> Self {
Self {
balances,
total_supply,
}
}
pub fn balances(&self) -> &BTreeMap<Address, Balance> {
&self.balances
}
pub fn total_supply(&self) -> Balance {
self.total_supply
}
}