1use crate::{traits::Contains, TypeInfo};
21use alloc::{vec, vec::Vec};
22use codec::{Decode, DecodeWithMemTracking, Encode, FullCodec, HasCompact, MaxEncodedLen};
23use core::fmt::Debug;
24use sp_arithmetic::traits::{AtLeast32BitUnsigned, Zero};
25use sp_runtime::{
26 traits::{Convert, MaybeSerializeDeserialize},
27 ArithmeticError, DispatchError, TokenError,
28};
29
30#[derive(Copy, Clone, Debug, Eq, PartialEq)]
32pub enum Provenance {
33 Minted,
36 Extant,
38}
39
40#[derive(Copy, Clone, Debug, Eq, PartialEq)]
42pub enum Restriction {
43 Free,
45 OnHold,
47}
48
49#[derive(Copy, Clone, Debug, Eq, PartialEq)]
51pub enum Preservation {
52 Expendable,
54 Protect,
56 Preserve,
59}
60
61#[derive(Copy, Clone, Debug, Eq, PartialEq)]
63pub enum Fortitude {
64 Polite,
66 Force,
69}
70
71#[derive(Copy, Clone, Debug, Eq, PartialEq)]
74pub enum Precision {
75 Exact,
78 BestEffort,
81}
82
83#[derive(Copy, Clone, Debug, Eq, PartialEq)]
85pub enum WithdrawConsequence<Balance> {
86 BalanceLow,
89 WouldDie,
92 UnknownAsset,
95 Underflow,
98 Overflow,
101 Frozen,
103 ReducedToZero(Balance),
106 Success,
108}
109
110impl<Balance: Zero> WithdrawConsequence<Balance> {
111 pub fn into_result(self, keep_nonzero: bool) -> Result<Balance, DispatchError> {
114 use WithdrawConsequence::*;
115 match self {
116 BalanceLow => Err(TokenError::FundsUnavailable.into()),
117 WouldDie => Err(TokenError::OnlyProvider.into()),
118 UnknownAsset => Err(TokenError::UnknownAsset.into()),
119 Underflow => Err(ArithmeticError::Underflow.into()),
120 Overflow => Err(ArithmeticError::Overflow.into()),
121 Frozen => Err(TokenError::Frozen.into()),
122 ReducedToZero(_) if keep_nonzero => Err(TokenError::NotExpendable.into()),
123 ReducedToZero(result) => Ok(result),
124 Success => Ok(Zero::zero()),
125 }
126 }
127}
128
129#[derive(Copy, Clone, Debug, Eq, PartialEq)]
131pub enum DepositConsequence {
132 BelowMinimum,
136 CannotCreate,
139 UnknownAsset,
142 Overflow,
146 Success,
148 Blocked,
150}
151
152impl DepositConsequence {
153 pub fn into_result(self) -> Result<(), DispatchError> {
155 use DepositConsequence::*;
156 Err(match self {
157 BelowMinimum => TokenError::BelowMinimum.into(),
158 CannotCreate => TokenError::CannotCreate.into(),
159 UnknownAsset => TokenError::UnknownAsset.into(),
160 Overflow => ArithmeticError::Overflow.into(),
161 Blocked => TokenError::Blocked.into(),
162 Success => return Ok(()),
163 })
164 }
165}
166
167#[derive(Copy, Clone, Debug, Eq, PartialEq)]
169pub enum ExistenceRequirement {
170 KeepAlive,
175 AllowDeath,
177}
178
179#[derive(
181 PartialEq,
182 Eq,
183 Clone,
184 Copy,
185 Encode,
186 Decode,
187 DecodeWithMemTracking,
188 Debug,
189 scale_info::TypeInfo,
190 MaxEncodedLen,
191)]
192pub enum BalanceStatus {
193 Free,
195 Reserved,
197}
198
199bitflags::bitflags! {
200 #[derive(Encode, Decode, MaxEncodedLen)]
202 pub struct WithdrawReasons: u8 {
203 const TRANSACTION_PAYMENT = 0b00000001;
205 const TRANSFER = 0b00000010;
207 const RESERVE = 0b00000100;
209 const FEE = 0b00001000;
211 const TIP = 0b00010000;
213 }
214}
215
216impl WithdrawReasons {
217 pub fn except(one: WithdrawReasons) -> WithdrawReasons {
229 let mut flags = Self::all();
230 flags.toggle(one);
231 flags
232 }
233}
234
235pub trait AssetId:
237 FullCodec
238 + DecodeWithMemTracking
239 + Clone
240 + Eq
241 + PartialEq
242 + Debug
243 + scale_info::TypeInfo
244 + MaxEncodedLen
245{
246}
247impl<
248 T: FullCodec
249 + DecodeWithMemTracking
250 + Clone
251 + Eq
252 + PartialEq
253 + Debug
254 + scale_info::TypeInfo
255 + MaxEncodedLen,
256 > AssetId for T
257{
258}
259
260pub trait Balance:
262 AtLeast32BitUnsigned
263 + FullCodec
264 + DecodeWithMemTracking
265 + HasCompact<Type: DecodeWithMemTracking>
266 + Copy
267 + Default
268 + Debug
269 + scale_info::TypeInfo
270 + MaxEncodedLen
271 + Send
272 + Sync
273 + MaybeSerializeDeserialize
274 + 'static
275{
276}
277impl<
278 T: AtLeast32BitUnsigned
279 + FullCodec
280 + DecodeWithMemTracking
281 + HasCompact<Type: DecodeWithMemTracking>
282 + Copy
283 + Default
284 + Debug
285 + scale_info::TypeInfo
286 + MaxEncodedLen
287 + Send
288 + Sync
289 + MaybeSerializeDeserialize
290 + 'static,
291 > Balance for T
292{
293}
294
295pub trait ConversionToAssetBalance<InBalance, AssetId, AssetBalance> {
297 type Error;
298 fn to_asset_balance(balance: InBalance, asset_id: AssetId)
299 -> Result<AssetBalance, Self::Error>;
300}
301
302pub trait ConversionFromAssetBalance<AssetBalance, AssetId, OutBalance> {
304 type Error;
305 fn from_asset_balance(
306 balance: AssetBalance,
307 asset_id: AssetId,
308 ) -> Result<OutBalance, Self::Error>;
309 #[cfg(feature = "runtime-benchmarks")]
312 fn ensure_successful(asset_id: AssetId);
313}
314
315pub struct UnityAssetBalanceConversion;
318impl<AssetBalance, AssetId, OutBalance>
319 ConversionFromAssetBalance<AssetBalance, AssetId, OutBalance> for UnityAssetBalanceConversion
320where
321 AssetBalance: Into<OutBalance>,
322{
323 type Error = ();
324 fn from_asset_balance(balance: AssetBalance, _: AssetId) -> Result<OutBalance, Self::Error> {
325 Ok(balance.into())
326 }
327 #[cfg(feature = "runtime-benchmarks")]
328 fn ensure_successful(_: AssetId) {}
329}
330impl<InBalance, AssetId, AssetBalance> ConversionToAssetBalance<InBalance, AssetId, AssetBalance>
331 for UnityAssetBalanceConversion
332where
333 InBalance: Into<AssetBalance>,
334{
335 type Error = ();
336 fn to_asset_balance(balance: InBalance, _: AssetId) -> Result<AssetBalance, Self::Error> {
337 Ok(balance.into())
338 }
339}
340
341pub struct UnityOrOuterConversion<C, O>(core::marker::PhantomData<(C, O)>);
345impl<AssetBalance, AssetId, OutBalance, C, O>
346 ConversionFromAssetBalance<AssetBalance, AssetId, OutBalance> for UnityOrOuterConversion<C, O>
347where
348 C: Contains<AssetId>,
349 O: ConversionFromAssetBalance<AssetBalance, AssetId, OutBalance>,
350 AssetBalance: Into<OutBalance>,
351{
352 type Error = O::Error;
353 fn from_asset_balance(
354 balance: AssetBalance,
355 asset_id: AssetId,
356 ) -> Result<OutBalance, Self::Error> {
357 if C::contains(&asset_id) {
358 return Ok(balance.into());
359 }
360 O::from_asset_balance(balance, asset_id)
361 }
362 #[cfg(feature = "runtime-benchmarks")]
363 fn ensure_successful(asset_id: AssetId) {
364 O::ensure_successful(asset_id)
365 }
366}
367impl<InBalance, AssetId, AssetBalance, C, O>
368 ConversionToAssetBalance<InBalance, AssetId, AssetBalance> for UnityOrOuterConversion<C, O>
369where
370 C: Contains<AssetId>,
371 O: ConversionToAssetBalance<InBalance, AssetId, AssetBalance>,
372 InBalance: Into<AssetBalance>,
373{
374 type Error = O::Error;
375 fn to_asset_balance(
376 balance: InBalance,
377 asset_id: AssetId,
378 ) -> Result<AssetBalance, Self::Error> {
379 if C::contains(&asset_id) {
380 return Ok(balance.into());
381 }
382 O::to_asset_balance(balance, asset_id)
383 }
384}
385
386pub trait ProvideAssetReserves<A, R> {
388 fn reserves(id: &A) -> Vec<R>;
389}
390impl<A, R> ProvideAssetReserves<A, R> for () {
391 fn reserves(_id: &A) -> Vec<R> {
392 vec![]
393 }
394}
395
396pub trait Locker<CollectionId, ItemId> {
399 fn is_locked(collection: CollectionId, item: ItemId) -> bool;
401}
402
403impl<CollectionId, ItemId> Locker<CollectionId, ItemId> for () {
404 fn is_locked(_collection: CollectionId, _item: ItemId) -> bool {
408 false
409 }
410}
411
412pub trait GetSalary<Rank, AccountId, Balance> {
414 fn get_salary(rank: Rank, who: &AccountId) -> Balance;
417}
418
419pub struct ConvertRank<C>(core::marker::PhantomData<C>);
421impl<A, R, B, C: Convert<R, B>> GetSalary<R, A, B> for ConvertRank<C> {
422 fn get_salary(rank: R, _: &A) -> B {
423 C::convert(rank)
424 }
425}
426
427#[derive(
429 Encode, Decode, DecodeWithMemTracking, Clone, PartialEq, Eq, Debug, MaxEncodedLen, TypeInfo,
430)]
431pub struct IdAmount<Id, Balance> {
432 pub id: Id,
434 pub amount: Balance,
436}