1use crate::{traits::Contains, TypeInfo};
10use alloc::{vec, vec::Vec};
11use codec::{Decode, DecodeWithMemTracking, Encode, FullCodec, HasCompact, MaxEncodedLen};
12use core::fmt::Debug;
13use subsoil::arithmetic::traits::{AtLeast32BitUnsigned, Zero};
14use subsoil::runtime::{
15 traits::{Convert, MaybeSerializeDeserialize},
16 ArithmeticError, DispatchError, TokenError,
17};
18
19#[derive(Copy, Clone, Debug, Eq, PartialEq)]
21pub enum Provenance {
22 Minted,
25 Extant,
27}
28
29#[derive(Copy, Clone, Debug, Eq, PartialEq)]
31pub enum Restriction {
32 Free,
34 OnHold,
36}
37
38#[derive(Copy, Clone, Debug, Eq, PartialEq)]
40pub enum Preservation {
41 Expendable,
43 Protect,
45 Preserve,
48}
49
50#[derive(Copy, Clone, Debug, Eq, PartialEq)]
52pub enum Fortitude {
53 Polite,
55 Force,
58}
59
60#[derive(Copy, Clone, Debug, Eq, PartialEq)]
63pub enum Precision {
64 Exact,
67 BestEffort,
70}
71
72#[derive(Copy, Clone, Debug, Eq, PartialEq)]
74pub enum WithdrawConsequence<Balance> {
75 BalanceLow,
78 WouldDie,
81 UnknownAsset,
84 Underflow,
87 Overflow,
90 Frozen,
92 ReducedToZero(Balance),
95 Success,
97}
98
99impl<Balance: Zero> WithdrawConsequence<Balance> {
100 pub fn into_result(self, keep_nonzero: bool) -> Result<Balance, DispatchError> {
103 use WithdrawConsequence::*;
104 match self {
105 BalanceLow => Err(TokenError::FundsUnavailable.into()),
106 WouldDie => Err(TokenError::OnlyProvider.into()),
107 UnknownAsset => Err(TokenError::UnknownAsset.into()),
108 Underflow => Err(ArithmeticError::Underflow.into()),
109 Overflow => Err(ArithmeticError::Overflow.into()),
110 Frozen => Err(TokenError::Frozen.into()),
111 ReducedToZero(_) if keep_nonzero => Err(TokenError::NotExpendable.into()),
112 ReducedToZero(result) => Ok(result),
113 Success => Ok(Zero::zero()),
114 }
115 }
116}
117
118#[derive(Copy, Clone, Debug, Eq, PartialEq)]
120pub enum DepositConsequence {
121 BelowMinimum,
125 CannotCreate,
128 UnknownAsset,
131 Overflow,
135 Success,
137 Blocked,
139}
140
141impl DepositConsequence {
142 pub fn into_result(self) -> Result<(), DispatchError> {
144 use DepositConsequence::*;
145 Err(match self {
146 BelowMinimum => TokenError::BelowMinimum.into(),
147 CannotCreate => TokenError::CannotCreate.into(),
148 UnknownAsset => TokenError::UnknownAsset.into(),
149 Overflow => ArithmeticError::Overflow.into(),
150 Blocked => TokenError::Blocked.into(),
151 Success => return Ok(()),
152 })
153 }
154}
155
156#[derive(Copy, Clone, Debug, Eq, PartialEq)]
158pub enum ExistenceRequirement {
159 KeepAlive,
164 AllowDeath,
166}
167
168#[derive(
170 PartialEq,
171 Eq,
172 Clone,
173 Copy,
174 Encode,
175 Decode,
176 DecodeWithMemTracking,
177 Debug,
178 scale_info::TypeInfo,
179 MaxEncodedLen,
180)]
181pub enum BalanceStatus {
182 Free,
184 Reserved,
186}
187
188bitflags::bitflags! {
189 #[derive(Encode, Decode, MaxEncodedLen)]
191 pub struct WithdrawReasons: u8 {
192 const TRANSACTION_PAYMENT = 0b00000001;
194 const TRANSFER = 0b00000010;
196 const RESERVE = 0b00000100;
198 const FEE = 0b00001000;
200 const TIP = 0b00010000;
202 }
203}
204
205impl WithdrawReasons {
206 pub fn except(one: WithdrawReasons) -> WithdrawReasons {
218 let mut flags = Self::all();
219 flags.toggle(one);
220 flags
221 }
222}
223
224pub trait AssetId:
226 FullCodec
227 + DecodeWithMemTracking
228 + Clone
229 + Eq
230 + PartialEq
231 + Debug
232 + scale_info::TypeInfo
233 + MaxEncodedLen
234{
235}
236impl<
237 T: FullCodec
238 + DecodeWithMemTracking
239 + Clone
240 + Eq
241 + PartialEq
242 + Debug
243 + scale_info::TypeInfo
244 + MaxEncodedLen,
245 > AssetId for T
246{
247}
248
249pub trait Balance:
251 AtLeast32BitUnsigned
252 + FullCodec
253 + DecodeWithMemTracking
254 + HasCompact<Type: DecodeWithMemTracking>
255 + Copy
256 + Default
257 + Debug
258 + scale_info::TypeInfo
259 + MaxEncodedLen
260 + Send
261 + Sync
262 + MaybeSerializeDeserialize
263 + 'static
264{
265}
266impl<
267 T: AtLeast32BitUnsigned
268 + FullCodec
269 + DecodeWithMemTracking
270 + HasCompact<Type: DecodeWithMemTracking>
271 + Copy
272 + Default
273 + Debug
274 + scale_info::TypeInfo
275 + MaxEncodedLen
276 + Send
277 + Sync
278 + MaybeSerializeDeserialize
279 + 'static,
280 > Balance for T
281{
282}
283
284pub trait ConversionToAssetBalance<InBalance, AssetId, AssetBalance> {
286 type Error;
287 fn to_asset_balance(balance: InBalance, asset_id: AssetId)
288 -> Result<AssetBalance, Self::Error>;
289}
290
291pub trait ConversionFromAssetBalance<AssetBalance, AssetId, OutBalance> {
293 type Error;
294 fn from_asset_balance(
295 balance: AssetBalance,
296 asset_id: AssetId,
297 ) -> Result<OutBalance, Self::Error>;
298 #[cfg(feature = "runtime-benchmarks")]
301 fn ensure_successful(asset_id: AssetId);
302}
303
304pub struct UnityAssetBalanceConversion;
307impl<AssetBalance, AssetId, OutBalance>
308 ConversionFromAssetBalance<AssetBalance, AssetId, OutBalance> for UnityAssetBalanceConversion
309where
310 AssetBalance: Into<OutBalance>,
311{
312 type Error = ();
313 fn from_asset_balance(balance: AssetBalance, _: AssetId) -> Result<OutBalance, Self::Error> {
314 Ok(balance.into())
315 }
316 #[cfg(feature = "runtime-benchmarks")]
317 fn ensure_successful(_: AssetId) {}
318}
319impl<InBalance, AssetId, AssetBalance> ConversionToAssetBalance<InBalance, AssetId, AssetBalance>
320 for UnityAssetBalanceConversion
321where
322 InBalance: Into<AssetBalance>,
323{
324 type Error = ();
325 fn to_asset_balance(balance: InBalance, _: AssetId) -> Result<AssetBalance, Self::Error> {
326 Ok(balance.into())
327 }
328}
329
330pub struct UnityOrOuterConversion<C, O>(core::marker::PhantomData<(C, O)>);
334impl<AssetBalance, AssetId, OutBalance, C, O>
335 ConversionFromAssetBalance<AssetBalance, AssetId, OutBalance> for UnityOrOuterConversion<C, O>
336where
337 C: Contains<AssetId>,
338 O: ConversionFromAssetBalance<AssetBalance, AssetId, OutBalance>,
339 AssetBalance: Into<OutBalance>,
340{
341 type Error = O::Error;
342 fn from_asset_balance(
343 balance: AssetBalance,
344 asset_id: AssetId,
345 ) -> Result<OutBalance, Self::Error> {
346 if C::contains(&asset_id) {
347 return Ok(balance.into());
348 }
349 O::from_asset_balance(balance, asset_id)
350 }
351 #[cfg(feature = "runtime-benchmarks")]
352 fn ensure_successful(asset_id: AssetId) {
353 O::ensure_successful(asset_id)
354 }
355}
356impl<InBalance, AssetId, AssetBalance, C, O>
357 ConversionToAssetBalance<InBalance, AssetId, AssetBalance> for UnityOrOuterConversion<C, O>
358where
359 C: Contains<AssetId>,
360 O: ConversionToAssetBalance<InBalance, AssetId, AssetBalance>,
361 InBalance: Into<AssetBalance>,
362{
363 type Error = O::Error;
364 fn to_asset_balance(
365 balance: InBalance,
366 asset_id: AssetId,
367 ) -> Result<AssetBalance, Self::Error> {
368 if C::contains(&asset_id) {
369 return Ok(balance.into());
370 }
371 O::to_asset_balance(balance, asset_id)
372 }
373}
374
375pub trait ProvideAssetReserves<A, R> {
377 fn reserves(id: &A) -> Vec<R>;
378}
379impl<A, R> ProvideAssetReserves<A, R> for () {
380 fn reserves(_id: &A) -> Vec<R> {
381 vec![]
382 }
383}
384
385pub trait Locker<CollectionId, ItemId> {
388 fn is_locked(collection: CollectionId, item: ItemId) -> bool;
390}
391
392impl<CollectionId, ItemId> Locker<CollectionId, ItemId> for () {
393 fn is_locked(_collection: CollectionId, _item: ItemId) -> bool {
397 false
398 }
399}
400
401pub trait GetSalary<Rank, AccountId, Balance> {
403 fn get_salary(rank: Rank, who: &AccountId) -> Balance;
406}
407
408pub struct ConvertRank<C>(core::marker::PhantomData<C>);
410impl<A, R, B, C: Convert<R, B>> GetSalary<R, A, B> for ConvertRank<C> {
411 fn get_salary(rank: R, _: &A) -> B {
412 C::convert(rank)
413 }
414}
415
416#[derive(
418 Encode, Decode, DecodeWithMemTracking, Clone, PartialEq, Eq, Debug, MaxEncodedLen, TypeInfo,
419)]
420pub struct IdAmount<Id, Balance> {
421 pub id: Id,
423 pub amount: Balance,
425}