use anchor_lang::prelude::{
borsh, AnchorDeserialize, AnchorSerialize, InitSpace,
};
use fix::prelude::*;
use serde::{Deserialize, Serialize};
use crate::error::CoreError;
use crate::virtual_stablecoin::VirtualStablecoin;
#[derive(
Debug,
Clone,
Copy,
AnchorSerialize,
AnchorDeserialize,
InitSpace,
Serialize,
Deserialize,
PartialEq,
Eq,
)]
pub struct PoolDrawdown {
ledger: VirtualStablecoin,
}
impl Default for PoolDrawdown {
fn default() -> PoolDrawdown {
let ledger = VirtualStablecoin::default();
PoolDrawdown { ledger }
}
}
impl PoolDrawdown {
#[must_use]
pub fn new(ledger: VirtualStablecoin) -> PoolDrawdown {
PoolDrawdown { ledger }
}
pub fn outstanding(&self) -> Result<UFix64<N6>, CoreError> {
self.ledger.supply()
}
pub fn drawdown(&mut self, amount: UFix64<N6>) -> Result<(), CoreError> {
self.ledger.mint(amount)
}
pub fn repay(&mut self, amount: UFix64<N6>) -> Result<(), CoreError> {
self.ledger.burn(amount)
}
#[must_use]
pub fn is_repaid(&self) -> bool {
*self == PoolDrawdown::default()
}
}