2023-01-28 01:47:13 -05:00
|
|
|
use core::{
|
|
|
|
|
ops::{Add, Sub, Mul},
|
|
|
|
|
fmt::Debug,
|
|
|
|
|
};
|
2023-01-05 19:36:49 -05:00
|
|
|
|
|
|
|
|
use scale::{Encode, Decode, MaxEncodedLen};
|
|
|
|
|
use scale_info::TypeInfo;
|
|
|
|
|
#[cfg(feature = "std")]
|
|
|
|
|
use serde::{Serialize, Deserialize};
|
|
|
|
|
|
2023-01-28 01:47:13 -05:00
|
|
|
/// The type used for amounts within Substrate.
|
|
|
|
|
// Distinct from Amount due to Substrate's requirements on this type.
|
|
|
|
|
// While Amount could have all the necessary traits implemented, not only are they many, it'd make
|
|
|
|
|
// Amount a large type with a variety of misc functions.
|
|
|
|
|
// The current type's minimalism sets clear bounds on usage.
|
|
|
|
|
pub type SubstrateAmount = u64;
|
2023-01-05 19:36:49 -05:00
|
|
|
/// The type used for amounts.
|
|
|
|
|
#[derive(
|
2023-01-20 11:00:18 -05:00
|
|
|
Clone, Copy, PartialEq, Eq, PartialOrd, Debug, Encode, Decode, MaxEncodedLen, TypeInfo,
|
2023-01-05 19:36:49 -05:00
|
|
|
)]
|
|
|
|
|
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
|
2023-01-28 01:47:13 -05:00
|
|
|
pub struct Amount(pub SubstrateAmount);
|
2023-01-05 19:36:49 -05:00
|
|
|
|
|
|
|
|
impl Add for Amount {
|
|
|
|
|
type Output = Amount;
|
|
|
|
|
fn add(self, other: Amount) -> Amount {
|
2023-01-20 08:08:20 -05:00
|
|
|
// Explicitly use checked_add so even if range checks are disabled, this is still checked
|
|
|
|
|
Amount(self.0.checked_add(other.0).unwrap())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Sub for Amount {
|
|
|
|
|
type Output = Amount;
|
|
|
|
|
fn sub(self, other: Amount) -> Amount {
|
|
|
|
|
Amount(self.0.checked_sub(other.0).unwrap())
|
2023-01-05 19:36:49 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Mul for Amount {
|
|
|
|
|
type Output = Amount;
|
|
|
|
|
fn mul(self, other: Amount) -> Amount {
|
2023-01-20 08:08:20 -05:00
|
|
|
Amount(self.0.checked_mul(other.0).unwrap())
|
2023-01-05 19:36:49 -05:00
|
|
|
}
|
|
|
|
|
}
|
2023-01-28 01:47:13 -05:00
|
|
|
|
|
|
|
|
#[derive(Clone, PartialEq, Eq, Debug, Encode, Decode, MaxEncodedLen, TypeInfo)]
|
|
|
|
|
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
|
|
|
|
|
pub struct WithAmount<
|
|
|
|
|
T: Clone + PartialEq + Eq + Debug + Encode + Decode + MaxEncodedLen + TypeInfo,
|
|
|
|
|
> {
|
|
|
|
|
pub data: T,
|
|
|
|
|
pub amount: Amount,
|
|
|
|
|
}
|