use core::ops::{Add, Sub, Mul}; #[cfg(feature = "std")] use zeroize::Zeroize; #[cfg(feature = "borsh")] use borsh::{BorshSerialize, BorshDeserialize}; #[cfg(feature = "serde")] use serde::{Serialize, Deserialize}; use scale::{Encode, Decode, DecodeWithMemTracking, MaxEncodedLen}; use crate::{Amount, Coin, ExternalCoin}; /// The type used for balances (a Coin and Balance). #[derive( Clone, Copy, PartialEq, Eq, Debug, Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, )] #[cfg_attr(feature = "std", derive(Zeroize))] #[cfg_attr(feature = "borsh", derive(BorshSerialize, BorshDeserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct Balance { pub coin: Coin, pub amount: Amount, } /// The type used for balances (a Coin and Balance). #[derive( Clone, Copy, PartialEq, Eq, Debug, Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, )] #[cfg_attr(feature = "std", derive(Zeroize))] #[cfg_attr(feature = "borsh", derive(BorshSerialize, BorshDeserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct ExternalBalance { pub coin: ExternalCoin, pub amount: Amount, } impl From for Balance { fn from(balance: ExternalBalance) -> Self { Balance { coin: balance.coin.into(), amount: balance.amount } } } impl TryFrom for ExternalBalance { type Error = (); fn try_from(balance: Balance) -> Result { match balance.coin { Coin::Serai => Err(())?, Coin::External(coin) => Ok(ExternalBalance { coin, amount: balance.amount }), } } } // TODO: these impl either should be removed or return errors in case of overflows impl Add for Balance { type Output = Balance; fn add(self, other: Amount) -> Balance { Balance { coin: self.coin, amount: self.amount + other } } } impl Sub for Balance { type Output = Balance; fn sub(self, other: Amount) -> Balance { Balance { coin: self.coin, amount: self.amount - other } } } impl Mul for Balance { type Output = Balance; fn mul(self, other: Amount) -> Balance { Balance { coin: self.coin, amount: self.amount * other } } }