git.delta.rocks / unique-network / refs/commits / aa92af0d2bde

difftreelog

funfible item added

str-mv2020-08-06parent: #a55594d.patch.diff
in: master

3 files changed

modifiedREADME.mddiffbeforeafterboth
117 "ReFungible": "(u32, u32)"117 "ReFungible": "(u32, u32)"
118 }118 }
119 },119 },
120 "Ownership": {
121 "Owner": "AccountId",
122 "Fraction": "u128"
123 },
124 "FungibleItemType": {
125 "Collection": "u64",
126 "Owner": "AccountId",
127 "Value": "u128"
128 },
129 "ReFungibleItemType": {
130 "Collection": "u64",
131 "Owner": "Vec<Ownership>",
132 "Data": "Vec<u8>"
133 },
120 "NftItemType": {134 "NftItemType": {
121 "Collection": "u64",135 "Collection": "u64",
122 "Owner": "AccountId",136 "Owner": "AccountId",
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
122 pub data: Vec<u8>,122 pub data: Vec<u8>,
123}123}
124
125#[derive(Encode, Decode, Default, Clone, PartialEq)]
126#[cfg_attr(feature = "std", derive(Debug))]
127pub struct ApprovePermissions<AccountId> {
128 pub approved: AccountId,
129 pub amount: u64
130}
124131
125pub trait Trait: system::Trait {132pub trait Trait: system::Trait {
126 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;133 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
138 pub AdminList get(fn admin_list_collection): map hasher(identity) u64 => Vec<T::AccountId>;145 pub AdminList get(fn admin_list_collection): map hasher(identity) u64 => Vec<T::AccountId>;
139 pub WhiteList get(fn white_list): map hasher(identity) u64 => Vec<T::AccountId>;146 pub WhiteList get(fn white_list): map hasher(identity) u64 => Vec<T::AccountId>;
140147
141 // Balance owner per collection map148 /// Balance owner per collection map
142 pub Balance get(fn balance_count): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => u64;149 pub Balance get(fn balance_count): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => u64;
150
151 /// second parameter: item id + owner account id
143 pub ApprovedList get(fn approved): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => Vec<T::AccountId>;152 pub ApprovedList get(fn approved): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) (u64, T::AccountId) => Vec<ApprovePermissions<T::AccountId>>;
144153
145 // Item collections154 /// Item collections
146 pub NftItemList get(fn nft_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => NftItemType<T::AccountId>;155 pub NftItemList get(fn nft_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => NftItemType<T::AccountId>;
147 pub FungibleItemList get(fn fungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => FungibleItemType<T::AccountId>;156 pub FungibleItemList get(fn fungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => FungibleItemType<T::AccountId>;
148 pub ReFungibleItemList get(fn refungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => ReFungibleItemType<T::AccountId>;157 pub ReFungibleItemList get(fn refungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => ReFungibleItemType<T::AccountId>;
248 let sender = ensure_signed(origin)?;257 let sender = ensure_signed(origin)?;
249 Self::check_owner_permissions(collection_id, sender)?;258 Self::check_owner_permissions(collection_id, sender)?;
250259
260 // TODO Items remove
251 <AddressTokens<T>>::remove_prefix(collection_id);261 <AddressTokens<T>>::remove_prefix(collection_id);
252 <ApprovedList<T>>::remove_prefix(collection_id);262 <ApprovedList<T>>::remove_prefix(collection_id);
253 <Balance<T>>::remove_prefix(collection_id);263 <Balance<T>>::remove_prefix(collection_id);
357367
358 let sender = ensure_signed(origin)?;368 let sender = ensure_signed(origin)?;
359
360 // check size
361 let target_collection = <Collection<T>>::get(collection_id);369 let target_collection = <Collection<T>>::get(collection_id);
362 ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
363
364 Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;370 Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
365371
368 {374 {
369 CollectionMode::NFT(_) => {375 CollectionMode::NFT(_) => {
376
377 // check size
378 ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
379
370 // Create nft item380 // Create nft item
371 let item = NftItemType {381 let item = NftItemType {
377 Self::add_nft_item(item)?;387 Self::add_nft_item(item)?;
378 388
379 },389 },
390 CollectionMode::Fungible(_) => {
391
392 // check size
393 ensure!(properties.len() as u32 == 0, "Size of item must be 0 with fungible type");
394
395 let item = FungibleItemType {
396 collection: collection_id,
397 owner: owner,
398 value: (10 as u128).pow(target_collection.decimal_points)
399 };
400
401 Self::add_fungible_item(item)?;
402 },
380 CollectionMode::ReFungible(_, _) => {403 CollectionMode::ReFungible(_, _) => {
404
405 // check size
406 ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
407
381 let mut owner_list = Vec::new();408 let mut owner_list = Vec::new();
382 let value = (10 as u128).pow(target_collection.decimal_points);409 let value = (10 as u128).pow(target_collection.decimal_points);
413 match target_collection.mode 440 match target_collection.mode
414 {441 {
415 CollectionMode::NFT(_) => Self::burn_nft_item(collection_id, item_id)?,442 CollectionMode::NFT(_) => Self::burn_nft_item(collection_id, item_id)?,
443 CollectionMode::Fungible(_) => Self::burn_fungible_item(collection_id, item_id)?,
416 CollectionMode::ReFungible(_, _) => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,444 CollectionMode::ReFungible(_, _) => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,
417 _ => ()445 _ => ()
418 };446 };
435 match target_collection.mode 463 match target_collection.mode
436 {464 {
437 CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,465 CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,
466 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, sender.clone(), recipient)?,
438 CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,467 CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,
439 _ => ()468 _ => ()
440 };469 };
447476
448 let sender = ensure_signed(origin)?;477 let sender = ensure_signed(origin)?;
449478
479 // amount param stub
450 let item_owner = Self::is_item_owner(sender.clone(), collection_id, item_id);480 let amount = 100000000;
451 if !item_owner481
452 {
453 Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;482 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id), "Only item owner can call transfer method");
454 }
455483
456 let list_exists = <ApprovedList<T>>::contains_key(collection_id, item_id);484 let list_exists = <ApprovedList<T>>::contains_key(collection_id, (item_id, sender.clone()));
457 if list_exists {485 if list_exists {
458486
459 let mut list = <ApprovedList<T>>::get(collection_id, item_id);487 let mut list = <ApprovedList<T>>::get(collection_id, (item_id, sender.clone()));
460 let item_contains = list.contains(&approved.clone());488 let item_contains = list.iter().any(|i| i.approved == approved);
461489
462 if !item_contains {490 if !item_contains {
463 list.push(approved.clone());491 list.push(ApprovePermissions { approved: approved.clone(), amount: amount });
492 <ApprovedList<T>>::insert(collection_id, (item_id, sender.clone()), list);
464 }493 }
465 } else {494 } else {
466495
467 let mut itm = Vec::new();496 let mut list = Vec::new();
468 itm.push(approved.clone());497 list.push(ApprovePermissions { approved: approved.clone(), amount: amount });
469 <ApprovedList<T>>::insert(collection_id, item_id, itm);498 <ApprovedList<T>>::insert(collection_id, (item_id, sender.clone()), list);
470 }499 }
471500
472 Ok(())501 Ok(())
475 #[weight = 0]504 #[weight = 0]
476 pub fn transfer_from(origin, from: T::AccountId, recipient: T::AccountId, collection_id: u64, item_id: u64, value: u64 ) -> DispatchResult {505 pub fn transfer_from(origin, from: T::AccountId, recipient: T::AccountId, collection_id: u64, item_id: u64, value: u64 ) -> DispatchResult {
477506
478 let mut approved: bool = false;
479 let sender = ensure_signed(origin)?;507 let sender = ensure_signed(origin)?;
480 let approved_list_exists = <ApprovedList<T>>::contains_key(collection_id, item_id);508 let approved_list_exists = <ApprovedList<T>>::contains_key(collection_id, (item_id, from.clone()));
481 if approved_list_exists509 if approved_list_exists
482 {510 {
483 let list_itm = <ApprovedList<T>>::get(collection_id, item_id);511 let list_itm = <ApprovedList<T>>::get(collection_id, (item_id, from.clone()));
484 approved = list_itm.contains(&recipient.clone());512 let opt_item = list_itm.iter().find(|i| i.approved == sender.clone());
513 ensure!(opt_item.is_some(), "No approve found");
514 ensure!(opt_item.unwrap().amount >= value, "Requested value more than approved");
515
516 // remove approve
517 let approve_list: Vec<ApprovePermissions<T::AccountId>> = <ApprovedList<T>>::get(collection_id, (item_id, from.clone()))
518 .into_iter().filter(|i| i.approved != sender.clone()).collect();
519 <ApprovedList<T>>::insert(collection_id, (item_id, from.clone()), approve_list);
485 }520 }
486521 else
487 if !approved
488 {522 {
489 Self::check_owner_or_admin_permissions(collection_id, sender)?;523 Self::check_owner_or_admin_permissions(collection_id, sender)?;
490 }524 }
494 match target_collection.mode528 match target_collection.mode
495 {529 {
496 CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, from, recipient)?,530 CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, from, recipient)?,
531 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, from.clone(), recipient)?,
497 CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, from, recipient)?,532 CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,
498 // TODO: implement other modes
499 _ => ()533 _ => ()
500 };534 };
501535
537571
538impl<T: Trait> Module<T> {572impl<T: Trait> Module<T> {
573
574 fn add_fungible_item(item: FungibleItemType<T::AccountId>) -> DispatchResult {
575
576 let current_index = <ItemListIndex>::get(item.collection)
577 .checked_add(1)
578 .expect("Item list index id error");
579 let itemcopy = item.clone();
580 let owner = item.owner.clone();
581 let value = item.value as u64;
582
583 Self::add_token_index(item.collection, current_index, owner.clone())?;
584
585 <ItemListIndex>::insert(item.collection, current_index);
586 <FungibleItemList<T>>::insert(item.collection, current_index, itemcopy);
587
588 // Update balance
589 let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();
590 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
591
592 Ok(())
593 }
594
595 fn add_refungible_item(item: ReFungibleItemType<T::AccountId>) -> DispatchResult {
596
597 let current_index = <ItemListIndex>::get(item.collection)
598 .checked_add(1)
599 .expect("Item list index id error");
600 let itemcopy = item.clone();
601
602 let value = item.owner.first().unwrap().fraction as u64;
603 let owner = item.owner.first().unwrap().owner.clone();
604
605 Self::add_token_index(item.collection, current_index, owner.clone())?;
606
607 <ItemListIndex>::insert(item.collection, current_index);
608 <ReFungibleItemList<T>>::insert(item.collection, current_index, itemcopy);
609
610 // Update balance
611 let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();
612 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
613
614 Ok(())
615 }
616
617 fn add_nft_item(item: NftItemType<T::AccountId>) -> DispatchResult {
618
619 let current_index = <ItemListIndex>::get(item.collection)
620 .checked_add(1)
621 .expect("Item list index id error");
622
623 let item_owner = item.owner.clone();
624 let collection_id = item.collection.clone();
625 Self::add_token_index(collection_id, current_index, item.owner.clone())?;
626
627 <ItemListIndex>::insert(collection_id, current_index);
628 <NftItemList<T>>::insert(collection_id, current_index, item);
629
630 // Update balance
631 let new_balance = <Balance<T>>::get(collection_id, item_owner.clone()).checked_add(1).unwrap();
632 <Balance<T>>::insert(collection_id, item_owner.clone(), new_balance);
633
634 Ok(())
635 }
636
637 fn burn_refungible_item(collection_id: u64, item_id: u64, owner: T::AccountId) -> DispatchResult {
638
639 let collection = <ReFungibleItemList<T>>::get(collection_id, item_id);
640 let item = collection.owner.iter().filter(|&i| i.owner == owner).next().unwrap();
641 Self::remove_token_index(collection_id, item_id, owner.clone())?;
642
643 // remove approve list
644 <ApprovedList<T>>::remove(collection_id, (item_id, owner.clone()));
645
646 // update balance
647 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(item.fraction as u64).unwrap();
648 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
649
650
651 <ReFungibleItemList<T>>::remove(collection_id, item_id);
652
653 Ok(())
654 }
655
656 fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {
657
658 let item = <NftItemList<T>>::get(collection_id, item_id);
659 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
660
661 // remove approve list
662 <ApprovedList<T>>::remove(collection_id, (item_id, item.owner.clone()));
663
664 // update balance
665 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(1).unwrap();
666 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
667 <NftItemList<T>>::remove(collection_id, item_id);
668
669 Ok(())
670 }
671
672 fn burn_fungible_item(collection_id: u64, item_id: u64) -> DispatchResult {
673
674 let item = <FungibleItemList<T>>::get(collection_id, item_id);
675 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
676
677 // remove approve list
678 <ApprovedList<T>>::remove(collection_id, (item_id, item.owner.clone()));
679
680 // update balance
681 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(item.value as u64).unwrap();
682 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
683
684 <FungibleItemList<T>>::remove(collection_id, item_id);
685
686 Ok(())
687 }
539688
540 fn collection_exists(collection_id: u64) -> DispatchResult{689 fn collection_exists(collection_id: u64) -> DispatchResult{
541 ensure!(<Collection<T>>::contains_key(collection_id), "This collection does not exist");690 ensure!(<Collection<T>>::contains_key(collection_id), "This collection does not exist");
582 }731 }
583 }732 }
584
585 fn add_refungible_item(item: ReFungibleItemType<T::AccountId>) -> DispatchResult {
586
587 let current_index = <ItemListIndex>::get(item.collection)
588 .checked_add(1)
589 .expect("Item list index id error");
590
591 let value = item.owner.first().unwrap().fraction as u64;
592 let owner = item.owner.first().unwrap().owner.clone();
593
594 Self::add_token_index(item.collection, current_index, owner.clone())?;
595
596 <ItemListIndex>::insert(item.collection, current_index);
597 <ReFungibleItemList<T>>::insert(item.collection, current_index, item);
598
599 // Update balance
600 let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();
601 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
602
603 Ok(())
604 }
605733
606 fn burn_refungible_item(collection_id: u64, item_id: u64, owner: T::AccountId) -> DispatchResult {734 fn transfer_fungible(collection_id: u64, item_id: u64, value: u64, owner: T::AccountId, new_owner: T::AccountId) -> DispatchResult {
607
608 let collection = <ReFungibleItemList<T>>::get(collection_id, item_id);735 let full_item = <FungibleItemList<T>>::get(collection_id, item_id);
736 let amount = full_item.value;
737
738 ensure!(amount >= value.into(),"Item balance not enouth");
739
740 // update balance
609 let item = collection.owner.iter().filter(|&i| i.owner == owner).next().unwrap();741 let balance_old_owner = <Balance<T>>::get(collection_id, owner.clone()).checked_sub(value).unwrap();
610 Self::remove_token_index(collection_id, item_id, owner)?;742 <Balance<T>>::insert(collection_id, owner.clone(), balance_old_owner);
743
744 let mut new_owner_account_id = 0;
745 let new_owner_items = <AddressTokens<T>>::get(collection_id, new_owner.clone());
746 if new_owner_items.len() > 0 {
747 new_owner_account_id = new_owner_items[0];
748 }
749
750 let val64 = value.into();
751
752 // transfer
753 if amount == val64 && new_owner_account_id == 0
754 {
755 // change owner
756 // new owner do not have account
757 let mut new_full_item = full_item.clone();
758 new_full_item.owner = new_owner.clone();
759 <FungibleItemList<T>>::insert(collection_id, item_id, new_full_item);
611760
612 // update balance761 // update balance
613 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(item.fraction as u64).unwrap();762 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone()).checked_add(value).unwrap();
614 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);763 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);
615764
616 // TODO765 // update index collection
766 Self::move_token_index(collection_id, item_id, owner.clone(), new_owner.clone())?;
767 }
768 else
769 {
770 let mut new_full_item = full_item.clone();
771 new_full_item.value -= val64;
772
773 // separate amount
774 if new_owner_account_id > 0 {
775
776 // new owner has account
777 let mut item = <FungibleItemList<T>>::get(collection_id, new_owner_account_id);
778 item.value += val64;
779
780 // update balance
781 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone()).checked_add(value).unwrap();
782 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);
783
784 <FungibleItemList<T>>::insert(collection_id, new_owner_account_id, item);
785 }
786 else
787 {
788 // new owner do not have account
789 let item = FungibleItemType {
790 collection: collection_id,
791 owner: new_owner.clone(),
792 value: val64
793 };
794
795 Self::add_fungible_item(item)?;
796 }
797
798 if amount == val64{
799 Self::remove_token_index(collection_id, item_id, full_item.owner.clone())?;
800
801 // remove approve list
617 <ReFungibleItemList<T>>::remove(collection_id, item_id);802 <ApprovedList<T>>::remove(collection_id, (item_id, full_item.owner.clone()));
803 <FungibleItemList<T>>::remove(collection_id, item_id);
804 }
805
806 <FungibleItemList<T>>::insert(collection_id, item_id, new_full_item);
807 }
618808
619 Ok(())809 Ok(())
620 }810 }
625 let item = full_item.owner.iter().filter(|i| i.owner == owner).next().unwrap();814 let item = full_item.owner.iter().filter(|i| i.owner == owner).next().unwrap();
626 let amount = item.fraction;815 let amount = item.fraction;
627816
628 ensure!(amount < value.into(),"Item balance not enouth");817 ensure!(amount >= value.into(),"Item balance not enouth");
629818
630 // update balance819 // update balance
631 let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(value).unwrap();820 let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(value).unwrap();
637 let old_owner = item.owner.clone();826 let old_owner = item.owner.clone();
638 let new_owner_has_account = full_item.owner.iter().any(|i| i.owner == new_owner);827 let new_owner_has_account = full_item.owner.iter().any(|i| i.owner == new_owner);
639
640 // transfer
641 if amount == value.into() && !new_owner_has_account828 let val64 = value.into();
829
830 // transfer
831 if amount == val64 && !new_owner_has_account
642 {832 {
643 // change owner833 // change owner
644 // new owner do not have account834 // new owner do not have account
652 else842 else
653 {843 {
654 let mut new_full_item = full_item.clone();844 let mut new_full_item = full_item.clone();
655 new_full_item.owner.iter_mut().find(|i| i.owner == owner).unwrap().fraction -= amount;845 new_full_item.owner.iter_mut().find(|i| i.owner == owner).unwrap().fraction -= val64;
656846
657 // separate amount847 // separate amount
658 if new_owner_has_account {848 if new_owner_has_account {
659 // new owner has account849 // new owner has account
660 new_full_item.owner.iter_mut().find(|i| i.owner == new_owner).unwrap().fraction += amount;850 new_full_item.owner.iter_mut().find(|i| i.owner == new_owner).unwrap().fraction += val64;
661 }851 }
662 else852 else
663 {853 {
664 // new owner do not have account854 // new owner do not have account
665 new_full_item.owner.push(Ownership { owner: new_owner.clone(), fraction: amount});855 new_full_item.owner.push(Ownership { owner: new_owner.clone(), fraction: val64});
666 Self::add_token_index(collection_id, item_id, new_owner.clone())?;856 Self::add_token_index(collection_id, item_id, new_owner.clone())?;
667 }857 }
668858
672 Ok(())862 Ok(())
673 }863 }
674
675 fn add_nft_item(item: NftItemType<T::AccountId>) -> DispatchResult {
676
677 let current_index = <ItemListIndex>::get(item.collection)
678 .checked_add(1)
679 .expect("Item list index id error");
680
681 Self::add_token_index(item.collection, current_index, item.owner.clone())?;
682
683 <ItemListIndex>::insert(item.collection, current_index);
684 <NftItemList<T>>::insert(item.collection, current_index, item);
685
686 // Update balance
687 let new_balance = <Balance<T>>::get(item.collection, item.owner.clone()).checked_add(1).unwrap();
688 <Balance<T>>::insert(item.collection_id, item.owner.clone(), new_balance);
689
690 Ok(())
691 }
692
693 fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {
694
695 let item = <NftItemList<T>>::get(collection_id, item_id);
696 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
697
698 // update balance
699 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(1).unwrap();
700 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
701 <NftItemList<T>>::remove(collection_id, item_id);
702
703 Ok(())
704 }
705864
706 fn transfer_nft(collection_id: u64, item_id: u64, sender: T::AccountId, new_owner: T::AccountId) -> DispatchResult {865 fn transfer_nft(collection_id: u64, item_id: u64, sender: T::AccountId, new_owner: T::AccountId) -> DispatchResult {
707866
722 <NftItemList<T>>::insert(collection_id, item_id, item);881 <NftItemList<T>>::insert(collection_id, item_id, item);
723882
724 // update index collection883 // update index collection
725 Self::move_token_index(collection_id, item_id, old_owner, new_owner.clone())?;884 Self::move_token_index(collection_id, item_id, old_owner.clone(), new_owner.clone())?;
726885
727 // reset approved list886 // reset approved list
728 let itm: Vec<T::AccountId> = Vec::new();
729 <ApprovedList<T>>::insert(collection_id, item_id, itm);887 <ApprovedList<T>>::remove(collection_id, (item_id, old_owner));
730
731 Ok(())888 Ok(())
732 }889 }
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
1// Tests to be written here1// Tests to be written here
2use crate::mock::*;2use crate::mock::*;
3use crate::{CollectionMode, Ownership, ApprovePermissions};
3use frame_support::{assert_noop, assert_ok};4use frame_support::{assert_noop, assert_ok};
45
5#[test]6#[test]
6fn create_collection_test() {7fn create_nft_item() {
7 new_test_ext().execute_with(|| {8 new_test_ext().execute_with(|| {
8 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();9 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
9 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();10 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
10 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();11 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
12 let mode: CollectionMode = CollectionMode::NFT(2000);
1113
12 let size = 1024;
13 let origin1 = Origin::signed(1);14 let origin1 = Origin::signed(1);
14 assert_ok!(TemplateModule::create_collection(15 assert_ok!(TemplateModule::create_collection(
15 origin1.clone(),16 origin1.clone(),
16 col_name1.clone(),17 col_name1.clone(),
17 col_desc1.clone(),18 col_desc1.clone(),
18 token_prefix1.clone(),19 token_prefix1.clone(),
19 size20 mode
20 ));21 ));
21 assert_eq!(TemplateModule::collection(1).owner, 1);22 assert_eq!(TemplateModule::collection(1).owner, 1);
22 });
23}
2423
25#[test]
26fn change_collection_owner() {
27 new_test_ext().execute_with(|| {
28 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
29 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
30 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
3124
32 let size = 1024;25 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
33 let origin1 = Origin::signed(1);
34
35 assert_ok!(TemplateModule::create_collection(
36 origin1.clone(),
37 col_name1.clone(),
38 col_desc1.clone(),
39 token_prefix1.clone(),
40 size
41 ));
42 assert_ok!(TemplateModule::change_collection_owner(
43 origin1.clone(),
44 1,
45 2
46 ));
47 assert_eq!(TemplateModule::collection(1).owner, 2);26 assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());
48 });27 });
49}28}
5029
51#[test]30#[test]
52fn destroy_collection() {31fn create_refungible_item() {
53 new_test_ext().execute_with(|| {32 new_test_ext().execute_with(|| {
54 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();33 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
55 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();34 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
56 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();35 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
36 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
5737
58 let size = 1024;
59 let origin1 = Origin::signed(1);38 let origin1 = Origin::signed(1);
60
61 assert_ok!(TemplateModule::create_collection(39 assert_ok!(TemplateModule::create_collection(
62 origin1.clone(),40 origin1.clone(),
63 col_name1.clone(),41 col_name1.clone(),
64 col_desc1.clone(),42 col_desc1.clone(),
65 token_prefix1.clone(),43 token_prefix1.clone(),
66 size44 mode
67 ));45 ));
68 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));46 assert_eq!(TemplateModule::collection(1).owner, 1);
47
48
49 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
50 assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());
51 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 1, fraction: 1000 });
69 });52 });
70}53}
7154
72#[test]55#[test]
73fn create_item() {56fn create_fungible_item() {
74 new_test_ext().execute_with(|| {57 new_test_ext().execute_with(|| {
75 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();58 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
76 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();59 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
77 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();60 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
61 let mode: CollectionMode = CollectionMode::Fungible(3);
7862
79 let size = 1024;
80 let origin1 = Origin::signed(1);63 let origin1 = Origin::signed(1);
81 let origin2 = Origin::signed(2);
82
83 assert_ok!(TemplateModule::create_collection(64 assert_ok!(TemplateModule::create_collection(
84 origin1.clone(),65 origin1.clone(),
85 col_name1.clone(),66 col_name1.clone(),
86 col_desc1.clone(),67 col_desc1.clone(),
87 token_prefix1.clone(),68 token_prefix1.clone(),
88 size69 mode
89 ));70 ));
90 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));71 assert_eq!(TemplateModule::collection(1).owner, 1);
91 assert_ok!(TemplateModule::create_item(
92 origin2.clone(),
93 1,
94 [1, 1, 1].to_vec()
95 ));
9672
97 // check balance (collection with id = 1, user id = 2)73 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));
74 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);
98 assert_eq!(TemplateModule::balance_count((1, 2)), 1);75 assert_eq!(TemplateModule::balance_count(1,1), 1000);
76 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
99 });77 });
100}78}
10179
102#[test]80#[test]
103fn burn_item() {81fn transfer_fungible_item() {
104 new_test_ext().execute_with(|| {82 new_test_ext().execute_with(|| {
105 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();83 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
106 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();84 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
107 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();85 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
86 let mode: CollectionMode = CollectionMode::Fungible(3);
10887
109 let size = 1024;
110 let origin1 = Origin::signed(1);88 let origin1 = Origin::signed(1);
111 let origin2 = Origin::signed(2);89 let origin2 = Origin::signed(2);
112
113 assert_ok!(TemplateModule::create_collection(90 assert_ok!(TemplateModule::create_collection(
114 origin1.clone(),91 origin1.clone(),
115 col_name1.clone(),92 col_name1.clone(),
116 col_desc1.clone(),93 col_desc1.clone(),
117 token_prefix1.clone(),94 token_prefix1.clone(),
118 size95 mode
119 ));96 ));
120 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));97 assert_eq!(TemplateModule::collection(1).owner, 1);
121 assert_ok!(TemplateModule::create_item(
122 origin2.clone(),
123 1,
124 [1, 1, 1].to_vec()
125 ));
12698
127 // check balance (collection with id = 1, user id = 2)99 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));
100 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);
128 assert_eq!(TemplateModule::balance_count((1, 2)), 1);101 assert_eq!(TemplateModule::balance_count(1,1), 1000);
102 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
129103
130 // burn item104 // change owner scenario
131 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));105 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));
132 assert_noop!(106 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 2);
133 TemplateModule::burn_item(origin1.clone(), 1, 1),107 assert_eq!(TemplateModule::fungible_item_id(1,1).value, 1000);
108 assert_eq!(TemplateModule::balance_count(1,1), 0);
134 "Item does not exists"109 assert_eq!(TemplateModule::balance_count(1,2), 1000);
110 assert_eq!(TemplateModule::address_tokens(1,1), []);
135 );111 assert_eq!(TemplateModule::address_tokens(1,2), [1]);
136112
137 assert_eq!(TemplateModule::balance_count((1, 1)), 0);113 // split item scenario
114 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));
115 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 2);
116 assert_eq!(TemplateModule::fungible_item_id(1,2).owner, 3);
117 assert_eq!(TemplateModule::balance_count(1,2), 500);
118 assert_eq!(TemplateModule::balance_count(1,3), 500);
119 assert_eq!(TemplateModule::address_tokens(1,2), [1]);
120 assert_eq!(TemplateModule::address_tokens(1,3), [2]);
121
122 // split item and new owner has account scenario
123 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));
124 assert_eq!(TemplateModule::fungible_item_id(1,1).value, 300);
125 assert_eq!(TemplateModule::fungible_item_id(1,2).value, 700);
126 assert_eq!(TemplateModule::balance_count(1,2), 300);
127 assert_eq!(TemplateModule::balance_count(1,3), 700);
128 assert_eq!(TemplateModule::address_tokens(1,2), [1]);
129 assert_eq!(TemplateModule::address_tokens(1,3), [2]);
138 });130 });
139}131}
140132
141#[test]133#[test]
142fn add_collection_admin() {134fn transfer_refungible_item() {
143 new_test_ext().execute_with(|| {135 new_test_ext().execute_with(|| {
144 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();136 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
145 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();137 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
146 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();138 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
139 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
147140
148 let size = 1024;
149 let origin1 = Origin::signed(1);141 let origin1 = Origin::signed(1);
150 let origin2 = Origin::signed(2);142 let origin2 = Origin::signed(2);
151 let origin3 = Origin::signed(3);
152
153 assert_ok!(TemplateModule::create_collection(143 assert_ok!(TemplateModule::create_collection(
154 origin1.clone(),144 origin1.clone(),
155 col_name1.clone(),145 col_name1.clone(),
156 col_desc1.clone(),146 col_desc1.clone(),
157 token_prefix1.clone(),147 token_prefix1.clone(),
158 size148 mode
159 ));149 ));
160 assert_ok!(TemplateModule::create_collection(
161 origin2.clone(),
162 col_name1.clone(),
163 col_desc1.clone(),
164 token_prefix1.clone(),
165 size
166 ));
167 assert_ok!(TemplateModule::create_collection(
168 origin3.clone(),
169 col_name1.clone(),
170 col_desc1.clone(),
171 token_prefix1.clone(),
172 size
173 ));
174
175 assert_eq!(TemplateModule::collection(1).owner, 1);150 assert_eq!(TemplateModule::collection(1).owner, 1);
176 assert_eq!(TemplateModule::collection(2).owner, 2);
177 assert_eq!(TemplateModule::collection(3).owner, 3);
178151
179 // collection admin152 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
180 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));153 assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());
181 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));154 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 1, fraction: 1000 });
155 assert_eq!(TemplateModule::balance_count(1,1), 1000);
156 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
182157
183 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);158 // change owner scenario
159 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));
160 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 2, fraction: 1000 });
161 assert_eq!(TemplateModule::balance_count(1,1), 0);
162 assert_eq!(TemplateModule::balance_count(1,2), 1000);
184 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);163 assert_eq!(TemplateModule::address_tokens(1,1), []);
164 assert_eq!(TemplateModule::address_tokens(1,2), [1]);
165
166 // split item scenario
167 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));
168 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 2, fraction: 500 });
169 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[1], Ownership { owner: 3, fraction: 500 });
170 assert_eq!(TemplateModule::balance_count(1,2), 500);
171 assert_eq!(TemplateModule::balance_count(1,3), 500);
172 assert_eq!(TemplateModule::address_tokens(1,2), [1]);
173 assert_eq!(TemplateModule::address_tokens(1,3), [1]);
174
175 // split item and new owner has account scenario
176 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));
177 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 2, fraction: 300 });
178 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[1], Ownership { owner: 3, fraction: 700 });
179 assert_eq!(TemplateModule::balance_count(1,2), 300);
180 assert_eq!(TemplateModule::balance_count(1,3), 700);
181 assert_eq!(TemplateModule::address_tokens(1,2), [1]);
182 assert_eq!(TemplateModule::address_tokens(1,3), [1]);
185 });183 });
186}184}
187185
186
188#[test]187#[test]
189fn remove_collection_admin() {188fn transfer_nft_item() {
190 new_test_ext().execute_with(|| {189 new_test_ext().execute_with(|| {
191 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();190 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
192 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();191 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
193 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();192 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
193 let mode: CollectionMode = CollectionMode::NFT(2000);
194194
195 let size = 1024;
196 let origin1 = Origin::signed(1);195 let origin1 = Origin::signed(1);
197 let origin2 = Origin::signed(2);
198 let origin3 = Origin::signed(3);
199
200 assert_ok!(TemplateModule::create_collection(196 assert_ok!(TemplateModule::create_collection(
201 origin1.clone(),197 origin1.clone(),
202 col_name1.clone(),198 col_name1.clone(),
203 col_desc1.clone(),199 col_desc1.clone(),
204 token_prefix1.clone(),200 token_prefix1.clone(),
205 size201 mode
206 ));202 ));
207 assert_ok!(TemplateModule::create_collection(
208 origin2.clone(),
209 col_name1.clone(),
210 col_desc1.clone(),
211 token_prefix1.clone(),
212 size
213 ));
214 assert_ok!(TemplateModule::create_collection(
215 origin3.clone(),
216 col_name1.clone(),
217 col_desc1.clone(),
218 token_prefix1.clone(),
219 size
220 ));
221
222 assert_eq!(TemplateModule::collection(1).owner, 1);203 assert_eq!(TemplateModule::collection(1).owner, 1);
223 assert_eq!(TemplateModule::collection(2).owner, 2);
224 assert_eq!(TemplateModule::collection(3).owner, 3);
225204
226 // collection admin
227 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
228 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
229205
230 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);206 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
231 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);207 assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());
208 assert_eq!(TemplateModule::balance_count(1,1), 1);
209 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
232210
233 // remove admin211 // default scenario
234 assert_ok!(TemplateModule::remove_collection_admin(212 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));
235 origin2.clone(),213 assert_eq!(TemplateModule::nft_item_id(1,1).owner, 2);
236 1,214 assert_eq!(TemplateModule::balance_count(1,1), 0);
237 3215 assert_eq!(TemplateModule::balance_count(1,2), 1);
238 ));216 assert_eq!(TemplateModule::address_tokens(1,1), []);
239 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);217 assert_eq!(TemplateModule::address_tokens(1,2), [1]);
240 });218 });
241}219}
242220
243#[test]221#[test]
244fn balance_of() {222fn nft_approve_and_transfer_from() {
245 new_test_ext().execute_with(|| {223 new_test_ext().execute_with(|| {
246 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();224 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
247 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();225 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
248 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();226 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
227 let mode: CollectionMode = CollectionMode::NFT(2000);
249228
250 let size = 1024;
251 let origin1 = Origin::signed(1);229 let origin1 = Origin::signed(1);
252 let origin2 = Origin::signed(2);230 let origin2 = Origin::signed(2);
253 let origin3 = Origin::signed(3);
254
255 assert_ok!(TemplateModule::create_collection(231 assert_ok!(TemplateModule::create_collection(
256 origin1.clone(),232 origin1.clone(),
257 col_name1.clone(),233 col_name1.clone(),
258 col_desc1.clone(),234 col_desc1.clone(),
259 token_prefix1.clone(),235 token_prefix1.clone(),
260 size236 mode
261 ));237 ));
262 assert_ok!(TemplateModule::create_collection(
263 origin2.clone(),
264 col_name1.clone(),
265 col_desc1.clone(),
266 token_prefix1.clone(),
267 size
268 ));
269 assert_ok!(TemplateModule::create_collection(
270 origin3.clone(),
271 col_name1.clone(),
272 col_desc1.clone(),
273 token_prefix1.clone(),
274 size
275 ));
276
277 assert_eq!(TemplateModule::collection(1).owner, 1);238 assert_eq!(TemplateModule::collection(1).owner, 1);
278 assert_eq!(TemplateModule::collection(2).owner, 2);
279 assert_eq!(TemplateModule::collection(3).owner, 3);
280239
281 // check balance before
282 assert_eq!(TemplateModule::balance_count((1, 1)), 0);
283240
284 // create item241 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
285 assert_ok!(TemplateModule::create_item(
286 origin1.clone(),
287 1,242 assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());
288 [1, 1, 1].to_vec()243 assert_eq!(TemplateModule::balance_count(1,1), 1);
289 ));244 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
290245
291 // check balance (collection with id = 1, user id = 2)246 assert_noop!(
247 TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1),
248 "You do not have permissions to modify this collection"
249 );
250
251 // do approve
252 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
292 assert_eq!(TemplateModule::balance_count((1, 1)), 1);253 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);
254 assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 1));
293 assert_eq!(TemplateModule::item_id((1, 1)).owner, 1);255 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 2);
256 assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 2, amount: 100000000});
257
258 assert_ok!(TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1));
259 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 0);
294 });260 });
295}261}
296262
297#[test]263#[test]
298fn transfer() {264fn refungible_approve_and_transfer_from() {
299 new_test_ext().execute_with(|| {265 new_test_ext().execute_with(|| {
300 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();266 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
301 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();267 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
302 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();268 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
269 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
303270
304 let size = 1024;
305 let origin1 = Origin::signed(1);271 let origin1 = Origin::signed(1);
306 let origin2 = Origin::signed(2);272 let origin2 = Origin::signed(2);
307 let origin3 = Origin::signed(3);
308
309 assert_ok!(TemplateModule::create_collection(273 assert_ok!(TemplateModule::create_collection(
310 origin1.clone(),274 origin1.clone(),
311 col_name1.clone(),275 col_name1.clone(),
312 col_desc1.clone(),276 col_desc1.clone(),
313 token_prefix1.clone(),277 token_prefix1.clone(),
314 size278 mode
315 ));279 ));
316 assert_ok!(TemplateModule::create_collection(
317 origin2.clone(),
318 col_name1.clone(),
319 col_desc1.clone(),
320 token_prefix1.clone(),
321 size
322 ));
323 assert_ok!(TemplateModule::create_collection(
324 origin3.clone(),
325 col_name1.clone(),
326 col_desc1.clone(),
327 token_prefix1.clone(),
328 size
329 ));
330
331 assert_eq!(TemplateModule::collection(1).owner, 1);280 assert_eq!(TemplateModule::collection(1).owner, 1);
332 assert_eq!(TemplateModule::collection(2).owner, 2);
333 assert_eq!(TemplateModule::collection(3).owner, 3);
334281
335 // create item282 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
336 assert_ok!(TemplateModule::create_item(
337 origin1.clone(),283 assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());
338 1,284 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 1, fraction: 1000 });
339 [1, 1, 1].to_vec()285 assert_eq!(TemplateModule::balance_count(1,1), 1000);
340 ));286 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
341287
342 // transfer288 assert_noop!(
343 assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));289 TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1),
344 assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);290 "You do not have permissions to modify this collection"
291 );
345292
346 // balance_of check293 // do approve
347 assert_eq!(TemplateModule::balance_count((1, 1)), 0);294 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
295 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);
296 assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 1));
297 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 2);
298 assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 2, amount: 100000000});
299
348 assert_eq!(TemplateModule::balance_count((1, 2)), 1);300 assert_ok!(TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 100));
301 assert_eq!(TemplateModule::balance_count(1,1), 900);
302 assert_eq!(TemplateModule::balance_count(1,3), 100);
303 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
304 assert_eq!(TemplateModule::address_tokens(1,3), [1]);
305
306 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);
307 assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 10, amount: 100000000});
349 });308 });
350}309}
351310
352#[test]311#[test]
353fn approve() {312fn fungible_approve_and_transfer_from() {
354 new_test_ext().execute_with(|| {313 new_test_ext().execute_with(|| {
355 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();314 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
356 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();315 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
357 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();316 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
317 let mode: CollectionMode = CollectionMode::Fungible(3);
358318
359 let size = 1024;
360 let origin1 = Origin::signed(1);319 let origin1 = Origin::signed(1);
361 let origin2 = Origin::signed(2);320 let origin2 = Origin::signed(2);
362 let origin3 = Origin::signed(3);
363
364 assert_ok!(TemplateModule::create_collection(321 assert_ok!(TemplateModule::create_collection(
365 origin1.clone(),322 origin1.clone(),
366 col_name1.clone(),323 col_name1.clone(),
367 col_desc1.clone(),324 col_desc1.clone(),
368 token_prefix1.clone(),325 token_prefix1.clone(),
369 size326 mode
370 ));327 ));
371 assert_ok!(TemplateModule::create_collection(
372 origin2.clone(),
373 col_name1.clone(),
374 col_desc1.clone(),
375 token_prefix1.clone(),
376 size
377 ));
378 assert_ok!(TemplateModule::create_collection(
379 origin3.clone(),
380 col_name1.clone(),
381 col_desc1.clone(),
382 token_prefix1.clone(),
383 size
384 ));
385
386 assert_eq!(TemplateModule::collection(1).owner, 1);328 assert_eq!(TemplateModule::collection(1).owner, 1);
387 assert_eq!(TemplateModule::collection(2).owner, 2);
388 assert_eq!(TemplateModule::collection(3).owner, 3);
389329
390 // create item330 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));
391 assert_ok!(TemplateModule::create_item(
392 origin1.clone(),
393 1,331 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);
394 [1, 1, 1].to_vec()332 assert_eq!(TemplateModule::balance_count(1,1), 1000);
395 ));333 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
396334
397 // approve335 assert_noop!(
336 TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1),
337 "You do not have permissions to modify this collection"
338 );
339
340 // do approve
398 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));341 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
399 assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);342 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);
343 assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 1));
344 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 2);
345 assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 2, amount: 100000000});
346
347 assert_ok!(TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 100));
348 assert_eq!(TemplateModule::balance_count(1,1), 900);
349 assert_eq!(TemplateModule::balance_count(1,3), 100);
350 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
351 assert_eq!(TemplateModule::address_tokens(1,3), [2]);
352
353 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);
354 assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 10, amount: 100000000});
355
356 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
357 assert_ok!(TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 900));
358 assert_eq!(TemplateModule::balance_count(1,1), 0);
359 assert_eq!(TemplateModule::balance_count(1,3), 1000);
360 assert_eq!(TemplateModule::address_tokens(1,1), []);
361 assert_eq!(TemplateModule::address_tokens(1,3), [2]);
362
363 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 0);
400 });364 });
401}365}
402366
403#[test]
404fn get_approved() {
405 new_test_ext().execute_with(|| {
406 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
407 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
408 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
409367
410 let size = 1024;
411 let origin1 = Origin::signed(1);
412 let origin2 = Origin::signed(2);
413 let origin3 = Origin::signed(3);
414368
415 assert_ok!(TemplateModule::create_collection(
416 origin1.clone(),
417 col_name1.clone(),
418 col_desc1.clone(),
419 token_prefix1.clone(),
420 size
421 ));
422 assert_ok!(TemplateModule::create_collection(
423 origin2.clone(),
424 col_name1.clone(),
425 col_desc1.clone(),
426 token_prefix1.clone(),
427 size
428 ));
429 assert_ok!(TemplateModule::create_collection(
430 origin3.clone(),
431 col_name1.clone(),
432 col_desc1.clone(),
433 token_prefix1.clone(),
434 size
435 ));
436369
437 assert_eq!(TemplateModule::collection(1).owner, 1);
438 assert_eq!(TemplateModule::collection(2).owner, 2);
439 assert_eq!(TemplateModule::collection(3).owner, 3);
440370
441 // create item
442 assert_ok!(TemplateModule::create_item(
443 origin1.clone(),
444 1,
445 [1, 1, 1].to_vec()
446 ));
447371
448 // approve
449 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
450 assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);
451 });
452}
453372
454#[test]
455fn transfer_from() {
456 new_test_ext().execute_with(|| {
457 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
458 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
459 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
460373
461 let size = 1024;
462 let origin1 = Origin::signed(1);
463 let origin2 = Origin::signed(2);
464 let origin3 = Origin::signed(3);
465374
466 assert_ok!(TemplateModule::create_collection(
467 origin1.clone(),
468 col_name1.clone(),
469 col_desc1.clone(),
470 token_prefix1.clone(),
471 size
472 ));
473 assert_ok!(TemplateModule::create_collection(
474 origin2.clone(),
475 col_name1.clone(),
476 col_desc1.clone(),
477 token_prefix1.clone(),
478 size
479 ));
480 assert_ok!(TemplateModule::create_collection(
481 origin3.clone(),
482 col_name1.clone(),
483 col_desc1.clone(),
484 token_prefix1.clone(),
485 size
486 ));
487375
488 assert_eq!(TemplateModule::collection(1).owner, 1);
489 assert_eq!(TemplateModule::collection(2).owner, 2);
490 assert_eq!(TemplateModule::collection(3).owner, 3);
491376
492 // create item
493 assert_ok!(TemplateModule::create_item(
494 origin1.clone(),
495 1,
496 [1, 1, 1].to_vec()
497 ));
498377
499 // approve
500 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
501 assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));
502 });
503}
504378
505#[test]
506fn index_list() {
507 new_test_ext().execute_with(|| {
508 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
509 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
510 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
511379
512 let size = 1024;
513 let origin1 = Origin::signed(1);
514 let origin2 = Origin::signed(2);
515 let origin3 = Origin::signed(3);
516380
517 assert_ok!(TemplateModule::create_collection(
518 origin1.clone(),
519 col_name1.clone(),
520 col_desc1.clone(),
521 token_prefix1.clone(),
522 size
523 ));
524 assert_ok!(TemplateModule::create_collection(
525 origin2.clone(),
526 col_name1.clone(),
527 col_desc1.clone(),
528 token_prefix1.clone(),
529 size
530 ));
531 assert_ok!(TemplateModule::create_collection(
532 origin3.clone(),
533 col_name1.clone(),
534 col_desc1.clone(),
535 token_prefix1.clone(),
536 size
537 ));
538381
539 assert_eq!(TemplateModule::collection(1).owner, 1);382// #[test]
540 assert_eq!(TemplateModule::collection(2).owner, 2);383// fn create_collection_test() {
541 assert_eq!(TemplateModule::collection(3).owner, 3);384// new_test_ext().execute_with(|| {
542 // create items385// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
543 assert_ok!(TemplateModule::create_item(386// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
544 origin1.clone(),387// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
545 1,388
546 [1, 1, 1].to_vec()389// let size = 1024;
547 ));390// let origin1 = Origin::signed(1);
548 assert_ok!(TemplateModule::create_item(391// assert_ok!(TemplateModule::create_collection(
549 origin1.clone(),392// origin1.clone(),
550 1,393// col_name1.clone(),
551 [1, 1, 2].to_vec()394// col_desc1.clone(),
552 ));395// token_prefix1.clone(),
553 assert_ok!(TemplateModule::create_item(396// size
554 origin1.clone(),397// ));
555 1,398// assert_eq!(TemplateModule::collection(1).owner, 1);
556 [1, 2, 3].to_vec()399// });
557 ));400// }
558 assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 3);401
559 // burn one402// #[test]
560 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));403// fn change_collection_owner() {
561 assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);404// new_test_ext().execute_with(|| {
562 // burn another one405// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
563 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));406// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
564 assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);407// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
565 });408
566}409// let size = 1024;
410// let origin1 = Origin::signed(1);
411
412// assert_ok!(TemplateModule::create_collection(
413// origin1.clone(),
414// col_name1.clone(),
415// col_desc1.clone(),
416// token_prefix1.clone(),
417// size
418// ));
419// assert_ok!(TemplateModule::change_collection_owner(
420// origin1.clone(),
421// 1,
422// 2
423// ));
424// assert_eq!(TemplateModule::collection(1).owner, 2);
425// });
426// }
427
428// #[test]
429// fn destroy_collection() {
430// new_test_ext().execute_with(|| {
431// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
432// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
433// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
434
435// let size = 1024;
436// let origin1 = Origin::signed(1);
437
438// assert_ok!(TemplateModule::create_collection(
439// origin1.clone(),
440// col_name1.clone(),
441// col_desc1.clone(),
442// token_prefix1.clone(),
443// size
444// ));
445// assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));
446// });
447// }
448
449// #[test]
450// fn create_item() {
451// new_test_ext().execute_with(|| {
452// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
453// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
454// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
455
456// let size = 1024;
457// let origin1 = Origin::signed(1);
458// let origin2 = Origin::signed(2);
459
460// assert_ok!(TemplateModule::create_collection(
461// origin1.clone(),
462// col_name1.clone(),
463// col_desc1.clone(),
464// token_prefix1.clone(),
465// size
466// ));
467// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
468// assert_ok!(TemplateModule::create_item(
469// origin2.clone(),
470// 1,
471// [1, 1, 1].to_vec()
472// ));
473
474// // check balance (collection with id = 1, user id = 2)
475// assert_eq!(TemplateModule::balance_count((1, 2)), 1);
476// });
477// }
478
479// #[test]
480// fn burn_item() {
481// new_test_ext().execute_with(|| {
482// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
483// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
484// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
485
486// let size = 1024;
487// let origin1 = Origin::signed(1);
488// let origin2 = Origin::signed(2);
489
490// assert_ok!(TemplateModule::create_collection(
491// origin1.clone(),
492// col_name1.clone(),
493// col_desc1.clone(),
494// token_prefix1.clone(),
495// size
496// ));
497// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
498// assert_ok!(TemplateModule::create_item(
499// origin2.clone(),
500// 1,
501// [1, 1, 1].to_vec()
502// ));
503
504// // check balance (collection with id = 1, user id = 2)
505// assert_eq!(TemplateModule::balance_count((1, 2)), 1);
506
507// // burn item
508// assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));
509// assert_noop!(
510// TemplateModule::burn_item(origin1.clone(), 1, 1),
511// "Item does not exists"
512// );
513
514// assert_eq!(TemplateModule::balance_count((1, 1)), 0);
515// });
516// }
517
518// #[test]
519// fn add_collection_admin() {
520// new_test_ext().execute_with(|| {
521// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
522// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
523// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
524
525// let size = 1024;
526// let origin1 = Origin::signed(1);
527// let origin2 = Origin::signed(2);
528// let origin3 = Origin::signed(3);
529
530// assert_ok!(TemplateModule::create_collection(
531// origin1.clone(),
532// col_name1.clone(),
533// col_desc1.clone(),
534// token_prefix1.clone(),
535// size
536// ));
537// assert_ok!(TemplateModule::create_collection(
538// origin2.clone(),
539// col_name1.clone(),
540// col_desc1.clone(),
541// token_prefix1.clone(),
542// size
543// ));
544// assert_ok!(TemplateModule::create_collection(
545// origin3.clone(),
546// col_name1.clone(),
547// col_desc1.clone(),
548// token_prefix1.clone(),
549// size
550// ));
551
552// assert_eq!(TemplateModule::collection(1).owner, 1);
553// assert_eq!(TemplateModule::collection(2).owner, 2);
554// assert_eq!(TemplateModule::collection(3).owner, 3);
555
556// // collection admin
557// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
558// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
559
560// assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);
561// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);
562// });
563// }
564
565// #[test]
566// fn remove_collection_admin() {
567// new_test_ext().execute_with(|| {
568// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
569// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
570// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
571
572// let size = 1024;
573// let origin1 = Origin::signed(1);
574// let origin2 = Origin::signed(2);
575// let origin3 = Origin::signed(3);
576
577// assert_ok!(TemplateModule::create_collection(
578// origin1.clone(),
579// col_name1.clone(),
580// col_desc1.clone(),
581// token_prefix1.clone(),
582// size
583// ));
584// assert_ok!(TemplateModule::create_collection(
585// origin2.clone(),
586// col_name1.clone(),
587// col_desc1.clone(),
588// token_prefix1.clone(),
589// size
590// ));
591// assert_ok!(TemplateModule::create_collection(
592// origin3.clone(),
593// col_name1.clone(),
594// col_desc1.clone(),
595// token_prefix1.clone(),
596// size
597// ));
598
599// assert_eq!(TemplateModule::collection(1).owner, 1);
600// assert_eq!(TemplateModule::collection(2).owner, 2);
601// assert_eq!(TemplateModule::collection(3).owner, 3);
602
603// // collection admin
604// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
605// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
606
607// assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);
608// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);
609
610// // remove admin
611// assert_ok!(TemplateModule::remove_collection_admin(
612// origin2.clone(),
613// 1,
614// 3
615// ));
616// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);
617// });
618// }
619
620// #[test]
621// fn balance_of() {
622// new_test_ext().execute_with(|| {
623// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
624// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
625// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
626
627// let size = 1024;
628// let origin1 = Origin::signed(1);
629// let origin2 = Origin::signed(2);
630// let origin3 = Origin::signed(3);
631
632// assert_ok!(TemplateModule::create_collection(
633// origin1.clone(),
634// col_name1.clone(),
635// col_desc1.clone(),
636// token_prefix1.clone(),
637// size
638// ));
639// assert_ok!(TemplateModule::create_collection(
640// origin2.clone(),
641// col_name1.clone(),
642// col_desc1.clone(),
643// token_prefix1.clone(),
644// size
645// ));
646// assert_ok!(TemplateModule::create_collection(
647// origin3.clone(),
648// col_name1.clone(),
649// col_desc1.clone(),
650// token_prefix1.clone(),
651// size
652// ));
653
654// assert_eq!(TemplateModule::collection(1).owner, 1);
655// assert_eq!(TemplateModule::collection(2).owner, 2);
656// assert_eq!(TemplateModule::collection(3).owner, 3);
657
658// // check balance before
659// assert_eq!(TemplateModule::balance_count((1, 1)), 0);
660
661// // create item
662// assert_ok!(TemplateModule::create_item(
663// origin1.clone(),
664// 1,
665// [1, 1, 1].to_vec()
666// ));
667
668// // check balance (collection with id = 1, user id = 2)
669// assert_eq!(TemplateModule::balance_count((1, 1)), 1);
670// assert_eq!(TemplateModule::item_id((1, 1)).owner, 1);
671// });
672// }
673
674// #[test]
675// fn transfer() {
676// new_test_ext().execute_with(|| {
677// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
678// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
679// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
680
681// let size = 1024;
682// let origin1 = Origin::signed(1);
683// let origin2 = Origin::signed(2);
684// let origin3 = Origin::signed(3);
685
686// assert_ok!(TemplateModule::create_collection(
687// origin1.clone(),
688// col_name1.clone(),
689// col_desc1.clone(),
690// token_prefix1.clone(),
691// size
692// ));
693// assert_ok!(TemplateModule::create_collection(
694// origin2.clone(),
695// col_name1.clone(),
696// col_desc1.clone(),
697// token_prefix1.clone(),
698// size
699// ));
700// assert_ok!(TemplateModule::create_collection(
701// origin3.clone(),
702// col_name1.clone(),
703// col_desc1.clone(),
704// token_prefix1.clone(),
705// size
706// ));
707
708// assert_eq!(TemplateModule::collection(1).owner, 1);
709// assert_eq!(TemplateModule::collection(2).owner, 2);
710// assert_eq!(TemplateModule::collection(3).owner, 3);
711
712// // create item
713// assert_ok!(TemplateModule::create_item(
714// origin1.clone(),
715// 1,
716// [1, 1, 1].to_vec()
717// ));
718
719// // transfer
720// assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));
721// assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);
722
723// // balance_of check
724// assert_eq!(TemplateModule::balance_count((1, 1)), 0);
725// assert_eq!(TemplateModule::balance_count((1, 2)), 1);
726// });
727// }
728
729// #[test]
730// fn approve() {
731// new_test_ext().execute_with(|| {
732// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
733// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
734// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
735
736// let size = 1024;
737// let origin1 = Origin::signed(1);
738// let origin2 = Origin::signed(2);
739// let origin3 = Origin::signed(3);
740
741// assert_ok!(TemplateModule::create_collection(
742// origin1.clone(),
743// col_name1.clone(),
744// col_desc1.clone(),
745// token_prefix1.clone(),
746// size
747// ));
748// assert_ok!(TemplateModule::create_collection(
749// origin2.clone(),
750// col_name1.clone(),
751// col_desc1.clone(),
752// token_prefix1.clone(),
753// size
754// ));
755// assert_ok!(TemplateModule::create_collection(
756// origin3.clone(),
757// col_name1.clone(),
758// col_desc1.clone(),
759// token_prefix1.clone(),
760// size
761// ));
762
763// assert_eq!(TemplateModule::collection(1).owner, 1);
764// assert_eq!(TemplateModule::collection(2).owner, 2);
765// assert_eq!(TemplateModule::collection(3).owner, 3);
766
767// // create item
768// assert_ok!(TemplateModule::create_item(
769// origin1.clone(),
770// 1,
771// [1, 1, 1].to_vec()
772// ));
773
774// // approve
775// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
776// assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);
777// });
778// }
779
780// #[test]
781// fn get_approved() {
782// new_test_ext().execute_with(|| {
783// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
784// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
785// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
786
787// let size = 1024;
788// let origin1 = Origin::signed(1);
789// let origin2 = Origin::signed(2);
790// let origin3 = Origin::signed(3);
791
792// assert_ok!(TemplateModule::create_collection(
793// origin1.clone(),
794// col_name1.clone(),
795// col_desc1.clone(),
796// token_prefix1.clone(),
797// size
798// ));
799// assert_ok!(TemplateModule::create_collection(
800// origin2.clone(),
801// col_name1.clone(),
802// col_desc1.clone(),
803// token_prefix1.clone(),
804// size
805// ));
806// assert_ok!(TemplateModule::create_collection(
807// origin3.clone(),
808// col_name1.clone(),
809// col_desc1.clone(),
810// token_prefix1.clone(),
811// size
812// ));
813
814// assert_eq!(TemplateModule::collection(1).owner, 1);
815// assert_eq!(TemplateModule::collection(2).owner, 2);
816// assert_eq!(TemplateModule::collection(3).owner, 3);
817
818// // create item
819// assert_ok!(TemplateModule::create_item(
820// origin1.clone(),
821// 1,
822// [1, 1, 1].to_vec()
823// ));
824
825// // approve
826// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
827// assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);
828// });
829// }
830
831// #[test]
832// fn transfer_from() {
833// new_test_ext().execute_with(|| {
834// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
835// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
836// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
837
838// let size = 1024;
839// let origin1 = Origin::signed(1);
840// let origin2 = Origin::signed(2);
841// let origin3 = Origin::signed(3);
842
843// assert_ok!(TemplateModule::create_collection(
844// origin1.clone(),
845// col_name1.clone(),
846// col_desc1.clone(),
847// token_prefix1.clone(),
848// size
849// ));
850// assert_ok!(TemplateModule::create_collection(
851// origin2.clone(),
852// col_name1.clone(),
853// col_desc1.clone(),
854// token_prefix1.clone(),
855// size
856// ));
857// assert_ok!(TemplateModule::create_collection(
858// origin3.clone(),
859// col_name1.clone(),
860// col_desc1.clone(),
861// token_prefix1.clone(),
862// size
863// ));
864
865// assert_eq!(TemplateModule::collection(1).owner, 1);
866// assert_eq!(TemplateModule::collection(2).owner, 2);
867// assert_eq!(TemplateModule::collection(3).owner, 3);
868
869// // create item
870// assert_ok!(TemplateModule::create_item(
871// origin1.clone(),
872// 1,
873// [1, 1, 1].to_vec()
874// ));
875
876// // approve
877// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
878// assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));
879// });
880// }
881
882// #[test]
883// fn index_list() {
884// new_test_ext().execute_with(|| {
885// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
886// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
887// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
888
889// let size = 1024;
890// let origin1 = Origin::signed(1);
891// let origin2 = Origin::signed(2);
892// let origin3 = Origin::signed(3);
893
894// assert_ok!(TemplateModule::create_collection(
895// origin1.clone(),
896// col_name1.clone(),
897// col_desc1.clone(),
898// token_prefix1.clone(),
899// size
900// ));
901// assert_ok!(TemplateModule::create_collection(
902// origin2.clone(),
903// col_name1.clone(),
904// col_desc1.clone(),
905// token_prefix1.clone(),
906// size
907// ));
908// assert_ok!(TemplateModule::create_collection(
909// origin3.clone(),
910// col_name1.clone(),
911// col_desc1.clone(),
912// token_prefix1.clone(),
913// size
914// ));
915
916// assert_eq!(TemplateModule::collection(1).owner, 1);
917// assert_eq!(TemplateModule::collection(2).owner, 2);
918// assert_eq!(TemplateModule::collection(3).owner, 3);
919// // create items
920// assert_ok!(TemplateModule::create_item(
921// origin1.clone(),
922// 1,
923// [1, 1, 1].to_vec()
924// ));
925// assert_ok!(TemplateModule::create_item(
926// origin1.clone(),
927// 1,
928// [1, 1, 2].to_vec()
929// ));
930// assert_ok!(TemplateModule::create_item(
931// origin1.clone(),
932// 1,
933// [1, 2, 3].to_vec()
934// ));
935// assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 3);
936// // burn one
937// assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));
938// assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);
939// // burn another one
940// assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));
941// assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);
942// });
943// }
567944