use sp_runtime::{
traits::{UniqueSaturatedFrom, UniqueSaturatedInto},
SaturatedConversion,
};
pub trait CurrencyToVote<B> {
fn to_vote(value: B, issuance: B) -> u64;
fn to_currency(value: u128, issuance: B) -> B;
fn will_downscale(issuance: B) -> Option<bool>;
}
pub struct U128CurrencyToVote;
impl U128CurrencyToVote {
fn factor(issuance: u128) -> u128 {
(issuance / u64::MAX as u128).max(1)
}
}
impl CurrencyToVote<u128> for U128CurrencyToVote {
fn to_vote(value: u128, issuance: u128) -> u64 {
(value / Self::factor(issuance)).saturated_into()
}
fn to_currency(value: u128, issuance: u128) -> u128 {
value.saturating_mul(Self::factor(issuance))
}
fn will_downscale(issuance: u128) -> Option<bool> {
Some(issuance > u64::MAX as u128)
}
}
pub struct SaturatingCurrencyToVote;
impl<B: UniqueSaturatedInto<u64> + UniqueSaturatedFrom<u128>> CurrencyToVote<B>
for SaturatingCurrencyToVote
{
fn to_vote(value: B, _: B) -> u64 {
value.unique_saturated_into()
}
fn to_currency(value: u128, _: B) -> B {
B::unique_saturated_from(value)
}
fn will_downscale(_issuance: B) -> Option<bool> {
None
}
}
#[cfg(feature = "std")]
impl<B: UniqueSaturatedInto<u64> + UniqueSaturatedFrom<u128>> CurrencyToVote<B> for () {
fn to_vote(value: B, issuance: B) -> u64 {
SaturatingCurrencyToVote::to_vote(value, issuance)
}
fn to_currency(value: u128, issuance: B) -> B {
SaturatingCurrencyToVote::to_currency(value, issuance)
}
fn will_downscale(_issuance: B) -> Option<bool> {
None
}
}