1use super::*;
21use crate::macros::*;
22use alloc::{vec, vec::Vec};
23use codec::{DecodeWithMemTracking, EncodeLike};
24use enumflags2::{bitflags, BitFlags};
25use frame_support::{
26 pallet_prelude::{BoundedVec, MaxEncodedLen},
27 traits::Get,
28 BoundedBTreeMap, BoundedBTreeSet,
29};
30use scale_info::{build::Fields, meta_type, Path, Type, TypeInfo, TypeParameter};
31
32pub type BlockNumberFor<T, I = ()> =
33 <<T as Config<I>>::BlockNumberProvider as BlockNumberProvider>::BlockNumber;
34
35pub type DepositBalanceOf<T, I = ()> =
37 <<T as Config<I>>::Currency as Currency<<T as SystemConfig>::AccountId>>::Balance;
38pub type CollectionDetailsFor<T, I> =
40 CollectionDetails<<T as SystemConfig>::AccountId, DepositBalanceOf<T, I>>;
41pub type ApprovalsOf<T, I = ()> = BoundedBTreeMap<
43 <T as SystemConfig>::AccountId,
44 Option<BlockNumberFor<T, I>>,
45 <T as Config<I>>::ApprovalsLimit,
46>;
47pub type ItemAttributesApprovals<T, I = ()> =
49 BoundedBTreeSet<<T as SystemConfig>::AccountId, <T as Config<I>>::ItemAttributesApprovalsLimit>;
50pub type ItemDepositOf<T, I> = ItemDeposit<DepositBalanceOf<T, I>, <T as SystemConfig>::AccountId>;
52pub type AttributeDepositOf<T, I> =
54 AttributeDeposit<DepositBalanceOf<T, I>, <T as SystemConfig>::AccountId>;
55pub type ItemMetadataDepositOf<T, I> =
57 ItemMetadataDeposit<DepositBalanceOf<T, I>, <T as SystemConfig>::AccountId>;
58pub type ItemDetailsFor<T, I> =
60 ItemDetails<<T as SystemConfig>::AccountId, ItemDepositOf<T, I>, ApprovalsOf<T, I>>;
61pub type BalanceOf<T, I = ()> =
63 <<T as Config<I>>::Currency as Currency<<T as SystemConfig>::AccountId>>::Balance;
64pub type ItemPrice<T, I = ()> = BalanceOf<T, I>;
66pub type ItemTipOf<T, I = ()> = ItemTip<
68 <T as Config<I>>::CollectionId,
69 <T as Config<I>>::ItemId,
70 <T as SystemConfig>::AccountId,
71 BalanceOf<T, I>,
72>;
73pub type CollectionConfigFor<T, I = ()> =
75 CollectionConfig<BalanceOf<T, I>, BlockNumberFor<T, I>, <T as Config<I>>::CollectionId>;
76pub type PreSignedMintOf<T, I = ()> = PreSignedMint<
78 <T as Config<I>>::CollectionId,
79 <T as Config<I>>::ItemId,
80 <T as SystemConfig>::AccountId,
81 BlockNumberFor<T, I>,
82 BalanceOf<T, I>,
83>;
84pub type PreSignedAttributesOf<T, I = ()> = PreSignedAttributes<
86 <T as Config<I>>::CollectionId,
87 <T as Config<I>>::ItemId,
88 <T as SystemConfig>::AccountId,
89 BlockNumberFor<T, I>,
90>;
91
92#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo, MaxEncodedLen)]
94pub struct CollectionDetails<AccountId, DepositBalance> {
95 pub owner: AccountId,
97 pub owner_deposit: DepositBalance,
100 pub items: u32,
102 pub item_metadatas: u32,
104 pub item_configs: u32,
106 pub attributes: u32,
108}
109
110#[derive(
112 Copy,
113 Clone,
114 Encode,
115 Decode,
116 DecodeWithMemTracking,
117 Eq,
118 PartialEq,
119 Debug,
120 TypeInfo,
121 MaxEncodedLen,
122)]
123pub struct DestroyWitness {
124 #[codec(compact)]
126 pub item_metadatas: u32,
127 #[codec(compact)]
129 pub item_configs: u32,
130 #[codec(compact)]
132 pub attributes: u32,
133}
134
135impl<AccountId, DepositBalance> CollectionDetails<AccountId, DepositBalance> {
136 pub fn destroy_witness(&self) -> DestroyWitness {
137 DestroyWitness {
138 item_metadatas: self.item_metadatas,
139 item_configs: self.item_configs,
140 attributes: self.attributes,
141 }
142 }
143}
144
145#[derive(Clone, Encode, Decode, DecodeWithMemTracking, Default, Eq, PartialEq, Debug, TypeInfo)]
147pub struct MintWitness<ItemId, Balance> {
148 pub owned_item: Option<ItemId>,
150 pub mint_price: Option<Balance>,
152}
153
154#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, Default, TypeInfo, MaxEncodedLen)]
156pub struct ItemDetails<AccountId, Deposit, Approvals> {
157 pub owner: AccountId,
159 pub approvals: Approvals,
161 pub deposit: Deposit,
164}
165
166#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo, MaxEncodedLen)]
168pub struct ItemDeposit<DepositBalance, AccountId> {
169 pub account: AccountId,
171 pub amount: DepositBalance,
173}
174
175#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, Default, TypeInfo, MaxEncodedLen)]
177#[scale_info(skip_type_params(StringLimit))]
178#[codec(mel_bound(Deposit: MaxEncodedLen))]
179pub struct CollectionMetadata<Deposit, StringLimit: Get<u32>> {
180 pub deposit: Deposit,
184 pub data: BoundedVec<u8, StringLimit>,
188}
189
190#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, Default, TypeInfo, MaxEncodedLen)]
192#[scale_info(skip_type_params(StringLimit))]
193pub struct ItemMetadata<Deposit, StringLimit: Get<u32>> {
194 pub deposit: Deposit,
198 pub data: BoundedVec<u8, StringLimit>,
202}
203
204#[derive(
206 Clone, Encode, Decode, DecodeWithMemTracking, Eq, PartialEq, Debug, TypeInfo, MaxEncodedLen,
207)]
208pub struct ItemTip<CollectionId, ItemId, AccountId, Amount> {
209 pub collection: CollectionId,
211 pub item: ItemId,
213 pub receiver: AccountId,
215 pub amount: Amount,
217}
218
219#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, Default, TypeInfo, MaxEncodedLen)]
221pub struct PendingSwap<CollectionId, ItemId, ItemPriceWithDirection, Deadline> {
222 pub desired_collection: CollectionId,
224 pub desired_item: Option<ItemId>,
226 pub price: Option<ItemPriceWithDirection>,
228 pub deadline: Deadline,
230}
231
232#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo, MaxEncodedLen)]
234pub struct AttributeDeposit<DepositBalance, AccountId> {
235 pub account: Option<AccountId>,
237 pub amount: DepositBalance,
239}
240
241#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo, MaxEncodedLen)]
243pub struct ItemMetadataDeposit<DepositBalance, AccountId> {
244 pub account: Option<AccountId>,
246 pub amount: DepositBalance,
248}
249
250#[derive(
252 Clone, Encode, Decode, DecodeWithMemTracking, Eq, PartialEq, Debug, TypeInfo, MaxEncodedLen,
253)]
254pub enum PriceDirection {
255 Send,
257 Receive,
259}
260
261#[derive(
263 Clone, Encode, Decode, DecodeWithMemTracking, Eq, PartialEq, Debug, TypeInfo, MaxEncodedLen,
264)]
265pub struct PriceWithDirection<Amount> {
266 pub amount: Amount,
268 pub direction: PriceDirection,
270}
271
272#[bitflags]
274#[repr(u64)]
275#[derive(Copy, Clone, Debug, PartialEq, Eq, Encode, Decode, MaxEncodedLen, TypeInfo)]
276pub enum CollectionSetting {
277 TransferableItems,
279 UnlockedMetadata,
281 UnlockedAttributes,
283 UnlockedMaxSupply,
285 DepositRequired,
287}
288
289#[derive(Clone, Copy, PartialEq, Eq, Default, Debug)]
291pub struct CollectionSettings(pub BitFlags<CollectionSetting>);
292
293impl CollectionSettings {
294 pub fn all_enabled() -> Self {
295 Self(BitFlags::EMPTY)
296 }
297 pub fn get_disabled(&self) -> BitFlags<CollectionSetting> {
298 self.0
299 }
300 pub fn is_disabled(&self, setting: CollectionSetting) -> bool {
301 self.0.contains(setting)
302 }
303 pub fn from_disabled(settings: BitFlags<CollectionSetting>) -> Self {
304 Self(settings)
305 }
306}
307
308impl_codec_bitflags!(CollectionSettings, u64, CollectionSetting);
309impl DecodeWithMemTracking for CollectionSettings {}
312
313#[derive(
317 Clone,
318 Copy,
319 Encode,
320 Decode,
321 DecodeWithMemTracking,
322 Eq,
323 PartialEq,
324 Debug,
325 TypeInfo,
326 MaxEncodedLen,
327)]
328pub enum MintType<CollectionId> {
329 Issuer,
331 Public,
333 HolderOf(CollectionId),
335}
336
337#[derive(
339 Clone,
340 Copy,
341 Encode,
342 Decode,
343 DecodeWithMemTracking,
344 Eq,
345 PartialEq,
346 Debug,
347 TypeInfo,
348 MaxEncodedLen,
349)]
350pub struct MintSettings<Price, BlockNumber, CollectionId> {
351 pub mint_type: MintType<CollectionId>,
353 pub price: Option<Price>,
355 pub start_block: Option<BlockNumber>,
357 pub end_block: Option<BlockNumber>,
359 pub default_item_settings: ItemSettings,
361}
362
363impl<Price, BlockNumber, CollectionId> Default for MintSettings<Price, BlockNumber, CollectionId> {
364 fn default() -> Self {
365 Self {
366 mint_type: MintType::Issuer,
367 price: None,
368 start_block: None,
369 end_block: None,
370 default_item_settings: ItemSettings::all_enabled(),
371 }
372 }
373}
374
375#[derive(
377 Clone,
378 Encode,
379 Decode,
380 DecodeWithMemTracking,
381 Eq,
382 PartialEq,
383 Debug,
384 scale_info::TypeInfo,
385 MaxEncodedLen,
386)]
387pub enum AttributeNamespace<AccountId> {
388 Pallet,
390 CollectionOwner,
392 ItemOwner,
394 Account(AccountId),
396}
397
398#[derive(Clone, Encode, Decode, DecodeWithMemTracking, Eq, PartialEq, Debug, TypeInfo)]
400pub struct CancelAttributesApprovalWitness {
401 pub account_attributes: u32,
403}
404
405#[derive(
407 Clone, Encode, Decode, DecodeWithMemTracking, Eq, PartialEq, Debug, TypeInfo, MaxEncodedLen,
408)]
409pub enum PalletAttributes<CollectionId> {
410 UsedToClaim(CollectionId),
412 TransferDisabled,
414}
415
416#[derive(
418 Clone,
419 Copy,
420 Decode,
421 DecodeWithMemTracking,
422 Default,
423 Encode,
424 MaxEncodedLen,
425 PartialEq,
426 Debug,
427 TypeInfo,
428)]
429pub struct CollectionConfig<Price, BlockNumber, CollectionId> {
430 pub settings: CollectionSettings,
432 pub max_supply: Option<u32>,
434 pub mint_settings: MintSettings<Price, BlockNumber, CollectionId>,
436}
437
438impl<Price, BlockNumber, CollectionId> CollectionConfig<Price, BlockNumber, CollectionId> {
439 pub fn is_setting_enabled(&self, setting: CollectionSetting) -> bool {
440 !self.settings.is_disabled(setting)
441 }
442 pub fn has_disabled_setting(&self, setting: CollectionSetting) -> bool {
443 self.settings.is_disabled(setting)
444 }
445 pub fn enable_setting(&mut self, setting: CollectionSetting) {
446 self.settings.0.remove(setting);
447 }
448 pub fn disable_setting(&mut self, setting: CollectionSetting) {
449 self.settings.0.insert(setting);
450 }
451}
452
453#[bitflags]
455#[repr(u64)]
456#[derive(Copy, Clone, Debug, PartialEq, Eq, Encode, Decode, MaxEncodedLen, TypeInfo)]
457pub enum ItemSetting {
458 Transferable,
460 UnlockedMetadata,
462 UnlockedAttributes,
464}
465
466#[derive(Clone, Copy, PartialEq, Eq, Default, Debug)]
468pub struct ItemSettings(pub BitFlags<ItemSetting>);
469
470impl ItemSettings {
471 pub fn all_enabled() -> Self {
472 Self(BitFlags::EMPTY)
473 }
474 pub fn get_disabled(&self) -> BitFlags<ItemSetting> {
475 self.0
476 }
477 pub fn is_disabled(&self, setting: ItemSetting) -> bool {
478 self.0.contains(setting)
479 }
480 pub fn from_disabled(settings: BitFlags<ItemSetting>) -> Self {
481 Self(settings)
482 }
483}
484
485impl_codec_bitflags!(ItemSettings, u64, ItemSetting);
486impl DecodeWithMemTracking for ItemSettings {}
489
490#[derive(
492 Encode,
493 Decode,
494 DecodeWithMemTracking,
495 Default,
496 PartialEq,
497 Debug,
498 Clone,
499 Copy,
500 MaxEncodedLen,
501 TypeInfo,
502)]
503pub struct ItemConfig {
504 pub settings: ItemSettings,
506}
507
508impl ItemConfig {
509 pub fn is_setting_enabled(&self, setting: ItemSetting) -> bool {
510 !self.settings.is_disabled(setting)
511 }
512 pub fn has_disabled_setting(&self, setting: ItemSetting) -> bool {
513 self.settings.is_disabled(setting)
514 }
515 pub fn has_disabled_settings(&self) -> bool {
516 !self.settings.get_disabled().is_empty()
517 }
518 pub fn enable_setting(&mut self, setting: ItemSetting) {
519 self.settings.0.remove(setting);
520 }
521 pub fn disable_setting(&mut self, setting: ItemSetting) {
522 self.settings.0.insert(setting);
523 }
524}
525
526#[bitflags]
528#[repr(u64)]
529#[derive(Copy, Clone, Debug, PartialEq, Eq, Encode, Decode, MaxEncodedLen, TypeInfo)]
530pub enum PalletFeature {
531 Trading,
533 Attributes,
535 Approvals,
537 Swaps,
539}
540
541#[derive(Default, Debug)]
543pub struct PalletFeatures(pub BitFlags<PalletFeature>);
544
545impl PalletFeatures {
546 pub fn all_enabled() -> Self {
547 Self(BitFlags::EMPTY)
548 }
549 pub fn from_disabled(features: BitFlags<PalletFeature>) -> Self {
550 Self(features)
551 }
552 pub fn is_enabled(&self, feature: PalletFeature) -> bool {
553 !self.0.contains(feature)
554 }
555}
556impl_codec_bitflags!(PalletFeatures, u64, PalletFeature);
557
558#[bitflags]
560#[repr(u8)]
561#[derive(Copy, Clone, Debug, PartialEq, Eq, Encode, Decode, MaxEncodedLen, TypeInfo)]
562pub enum CollectionRole {
563 Issuer,
565 Freezer,
567 Admin,
569}
570
571#[derive(Clone, Copy, PartialEq, Eq, Default, Debug)]
573pub struct CollectionRoles(pub BitFlags<CollectionRole>);
574
575impl CollectionRoles {
576 pub fn none() -> Self {
577 Self(BitFlags::EMPTY)
578 }
579 pub fn has_role(&self, role: CollectionRole) -> bool {
580 self.0.contains(role)
581 }
582 pub fn add_role(&mut self, role: CollectionRole) {
583 self.0.insert(role);
584 }
585 pub fn max_roles() -> u8 {
586 let all: BitFlags<CollectionRole> = BitFlags::all();
587 all.len() as u8
588 }
589}
590impl_codec_bitflags!(CollectionRoles, u8, CollectionRole);
591
592#[derive(Clone, Eq, PartialEq, Encode, Decode, DecodeWithMemTracking, Debug, TypeInfo)]
593pub struct PreSignedMint<CollectionId, ItemId, AccountId, Deadline, Balance> {
594 pub collection: CollectionId,
596 pub item: ItemId,
598 pub attributes: Vec<(Vec<u8>, Vec<u8>)>,
600 pub metadata: Vec<u8>,
602 pub only_account: Option<AccountId>,
604 pub deadline: Deadline,
606 pub mint_price: Option<Balance>,
608}
609
610#[derive(Clone, Eq, PartialEq, Encode, Decode, DecodeWithMemTracking, Debug, TypeInfo)]
611pub struct PreSignedAttributes<CollectionId, ItemId, AccountId, Deadline> {
612 pub collection: CollectionId,
614 pub item: ItemId,
616 pub attributes: Vec<(Vec<u8>, Vec<u8>)>,
618 pub namespace: AttributeNamespace<AccountId>,
620 pub deadline: Deadline,
622}