use frame_suite::{assets::LazyBalance, commitment::*};
use sp_runtime::{
traits::{CheckedAdd, CheckedSub},
ArithmeticError, DispatchError, DispatchResult,
};
pub trait CommitBalance<Proprietor, Pallet>
where
Pallet: LazyBalance<Asset = <Pallet as InspectAsset<Proprietor>>::Asset>
+ InspectAsset<Proprietor>
+ Commitment<Proprietor>,
{
type Imbalance;
fn resolve_imbalance(
who: &Proprietor,
imbalance: Self::Imbalance,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn deduct_balance(
who: &Proprietor,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
qualifier: &Pallet::Intent,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn deduct_from_imbalance(
imbalance: &mut Self::Imbalance,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
) -> Result<Self::Imbalance, DispatchError>;
}
pub trait CommitDeposit<Proprietor, Pallet>
where
Pallet: LazyBalance<
Asset = <Pallet as InspectAsset<Proprietor>>::Asset,
Variant = Pallet::Position,
Id = Pallet::Digest,
> + DigestModel<Proprietor>
+ CommitVariant<Proprietor>,
{
type Receipt;
fn deposit_to(
who: &Proprietor,
reason: &Pallet::Reason,
digest_model: &Pallet::Model,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
variant: &Pallet::Position,
qualifier: &Pallet::Intent,
) -> Result<(Self::Receipt, <Pallet as InspectAsset<Proprietor>>::Asset), DispatchError>;
fn deposit_to_digest(
who: &Proprietor,
reason: &Pallet::Reason,
digest: &Pallet::Digest,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
variant: &Pallet::Position,
qualifier: &Pallet::Intent,
) -> Result<(Self::Receipt, <Pallet as InspectAsset<Proprietor>>::Asset), DispatchError>;
fn deposit_to_index(
who: &Proprietor,
reason: &Pallet::Reason,
index_of: &Pallet::Digest,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
variant: &Pallet::Position,
qualifier: &Pallet::Intent,
) -> Result<(Self::Receipt, <Pallet as InspectAsset<Proprietor>>::Asset), DispatchError>;
fn deposit_to_pool(
who: &Proprietor,
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
variant: &Pallet::Position,
qualifier: &Pallet::Intent,
) -> Result<(Self::Receipt, <Pallet as InspectAsset<Proprietor>>::Asset), DispatchError>;
}
pub trait CommitWithdraw<Proprietor, Pallet>: CommitBalance<Proprietor, Pallet>
where
Pallet: LazyBalance<
Asset = <Pallet as InspectAsset<Proprietor>>::Asset,
Variant = Pallet::Position,
Id = Pallet::Digest,
> + DigestModel<Proprietor>
+ CommitVariant<Proprietor>,
{
fn withdraw_for(
who: &Proprietor,
reason: &Pallet::Reason,
digest_model: &Pallet::Model,
variant: &Pallet::Position,
) -> Result<Self::Imbalance, DispatchError>;
fn withdraw_from_digest(
who: &Proprietor,
reason: &Pallet::Reason,
digest: &Pallet::Digest,
variant: &Pallet::Position,
) -> Result<Self::Imbalance, DispatchError>;
fn withdraw_from_index(
who: &Proprietor,
reason: &Pallet::Reason,
index_of: &Pallet::Digest,
variant: &Pallet::Position,
) -> Result<Self::Imbalance, DispatchError>;
fn withdraw_from_pool(
who: &Proprietor,
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
variant: &Pallet::Position,
) -> Result<Self::Imbalance, DispatchError>;
}
pub trait CommitOps<Proprietor, Pallet>
where
Pallet: LazyBalance<
Asset = <Pallet as InspectAsset<Proprietor>>::Asset,
Variant = Pallet::Position,
Id = Pallet::Digest,
> + DigestModel<Proprietor>
+ CommitVariant<Proprietor>,
{
fn place_commit_of(
who: &Proprietor,
reason: &Pallet::Reason,
digest_model: &Pallet::Model,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
variant: &Pallet::Position,
qualifier: &Pallet::Intent,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn place_digest_commit(
who: &Proprietor,
reason: &Pallet::Reason,
digest: &Pallet::Digest,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
variant: &Pallet::Position,
qualifier: &Pallet::Intent,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn place_index_commit(
who: &Proprietor,
reason: &Pallet::Reason,
index_of: &Pallet::Digest,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
variant: &Pallet::Position,
qualifier: &Pallet::Intent,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn place_pool_commit(
who: &Proprietor,
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
variant: &Pallet::Position,
qualifier: &Pallet::Intent,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn raise_commit_of(
who: &Proprietor,
reason: &Pallet::Reason,
digest_model: &Pallet::Model,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
qualifier: &Pallet::Intent,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn raise_digest_commit(
who: &Proprietor,
reason: &Pallet::Reason,
digest: &Pallet::Digest,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
qualifier: &Pallet::Intent,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn raise_index_commit(
who: &Proprietor,
reason: &Pallet::Reason,
index_of: &Pallet::Digest,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
qualifier: &Pallet::Intent,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn raise_pool_commit(
who: &Proprietor,
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
qualifier: &Pallet::Intent,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn resolve_commit_of(
who: &Proprietor,
reason: &Pallet::Reason,
digest_model: &Pallet::Model,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn resolve_digest_commit(
who: &Proprietor,
reason: &Pallet::Reason,
digest: &Pallet::Digest,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn resolve_index_commit(
who: &Proprietor,
reason: &Pallet::Reason,
index_of: &Pallet::Digest,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn resolve_pool_commit(
who: &Proprietor,
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn set_total_value(reason: &Pallet::Reason, value: <Pallet as InspectAsset<Proprietor>>::Asset);
fn add_to_total_value(
reason: &Pallet::Reason,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
) -> DispatchResult {
let current = Pallet::get_total_value(reason);
let new_total = current
.checked_add(&value)
.ok_or(DispatchError::Arithmetic(ArithmeticError::Overflow))?;
Self::set_total_value(reason, new_total);
Ok(())
}
fn sub_from_total_value(
reason: &Pallet::Reason,
value: <Pallet as InspectAsset<Proprietor>>::Asset,
) -> DispatchResult {
let current = Pallet::get_total_value(reason);
let new_total = current
.checked_sub(&value)
.ok_or(DispatchError::Arithmetic(ArithmeticError::Underflow))?;
Self::set_total_value(reason, new_total);
Ok(())
}
}
pub trait CommitInspect<Proprietor, Pallet>
where
Pallet: LazyBalance<Asset = <Pallet as InspectAsset<Proprietor>>::Asset, Id = Pallet::Digest>
+ DigestModel<Proprietor>
+ Commitment<Proprietor>,
{
fn commit_value_of(
who: &Proprietor,
reason: &Pallet::Reason,
digest_model: &Pallet::Model,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn digest_commit_value(
who: &Proprietor,
reason: &Pallet::Reason,
digest: &Pallet::Digest,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn index_commit_value(
who: &Proprietor,
reason: &Pallet::Reason,
index_of: &Pallet::Digest,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn index_entry_commit_value(
who: &Proprietor,
reason: &Pallet::Reason,
index_of: &Pallet::Digest,
entry_of: &Pallet::Digest,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn pool_commit_value(
who: &Proprietor,
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn pool_slot_commit_value(
who: &Proprietor,
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
slot_of: &Pallet::Digest,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
fn value_of(
digest_model: Option<&Pallet::Model>,
reason: &Pallet::Reason,
) -> Result<<Pallet as InspectAsset<Proprietor>>::Asset, DispatchError>;
}
pub trait PoolOps<Proprietor, Pallet>
where
Pallet: LazyBalance<
Asset = <Pallet as InspectAsset<Proprietor>>::Asset,
Variant = Pallet::Position,
Id = Pallet::Digest,
> + PoolVariant<Proprietor>,
{
type PoolBalance;
fn release_pool(
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
) -> Result<Self::PoolBalance, DispatchError>;
fn recover_pool(
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
balance: &Self::PoolBalance,
) -> DispatchResult;
fn remove_pool_slot(
who: &Proprietor,
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
slot_of: &Pallet::Digest,
) -> DispatchResult;
fn set_pool_slot(
who: &Proprietor,
reason: &Pallet::Reason,
pool_of: &Pallet::Digest,
slot_of: &Pallet::Digest,
shares: Pallet::Shares,
variant: &Pallet::Position,
) -> DispatchResult;
}
pub trait IndexOps<Proprietor, Pallet>
where
Pallet: LazyBalance<
Asset = <Pallet as InspectAsset<Proprietor>>::Asset,
Variant = Pallet::Position,
Id = Pallet::Digest,
> + IndexVariant<Proprietor>,
{
fn remove_index_entry(
who: &Proprietor,
reason: &Pallet::Reason,
index_of: &Pallet::Digest,
entry_of: &Pallet::Digest,
) -> Result<Pallet::Digest, DispatchError>;
fn set_index_entry(
who: &Proprietor,
reason: &Pallet::Reason,
index_of: &Pallet::Digest,
entry_of: &Pallet::Digest,
shares: Pallet::Shares,
variant: &Pallet::Position,
) -> Result<Pallet::Digest, DispatchError>;
}