difftreelog
funfible item added
in: master
3 files changed
README.mddiffbeforeafterboth117 "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",pallets/nft/src/lib.rsdiffbeforeafterboth122 pub data: Vec<u8>,122 pub data: Vec<u8>,123}123}124125#[derive(Encode, Decode, Default, Clone, PartialEq)]126#[cfg_attr(feature = "std", derive(Debug))]127pub struct ApprovePermissions<AccountId> {128 pub approved: AccountId,129 pub amount: u64130}124131125pub 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>;140147141 // Balance owner per collection map148 /// Balance owner per collection map142 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;150151 /// second parameter: item id + owner account id143 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>>;144153145 // Item collections154 /// Item collections146 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)?;250259260 // TODO Items remove251 <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);357367358 let sender = ensure_signed(origin)?;368 let sender = ensure_signed(origin)?;359360 // check size361 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");363364 Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;370 Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;365371368 {374 {369 CollectionMode::NFT(_) => {375 CollectionMode::NFT(_) => {376377 // check size378 ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");379370 // Create nft item380 // Create nft item371 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(_) => {391392 // check size393 ensure!(properties.len() as u32 == 0, "Size of item must be 0 with fungible type");394395 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(_, _) => {404405 // check size406 ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");407381 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 };447476448 let sender = ensure_signed(origin)?;477 let sender = ensure_signed(origin)?;449478479 // amount param stub450 let item_owner = Self::is_item_owner(sender.clone(), collection_id, item_id);480 let amount = 100000000;451 if !item_owner481452 {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 }455483456 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 {458486459 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);461489462 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 {466495467 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 }471500472 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 {477506478 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_exists482 {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"); 515516 // remove approve517 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 else487 if !approved488 {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.mode495 {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 modes499 _ => ()533 _ => ()500 };534 };501535537571538impl<T: Trait> Module<T> {572impl<T: Trait> Module<T> {573574 fn add_fungible_item(item: FungibleItemType<T::AccountId>) -> DispatchResult {575576 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;582583 Self::add_token_index(item.collection, current_index, owner.clone())?;584585 <ItemListIndex>::insert(item.collection, current_index);586 <FungibleItemList<T>>::insert(item.collection, current_index, itemcopy); 587 588 // Update balance589 let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();590 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);591592 Ok(())593 }594595 fn add_refungible_item(item: ReFungibleItemType<T::AccountId>) -> DispatchResult {596597 let current_index = <ItemListIndex>::get(item.collection)598 .checked_add(1)599 .expect("Item list index id error");600 let itemcopy = item.clone();601602 let value = item.owner.first().unwrap().fraction as u64;603 let owner = item.owner.first().unwrap().owner.clone();604605 Self::add_token_index(item.collection, current_index, owner.clone())?;606607 <ItemListIndex>::insert(item.collection, current_index);608 <ReFungibleItemList<T>>::insert(item.collection, current_index, itemcopy); 609 610 // Update balance611 let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();612 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);613614 Ok(())615 }616617 fn add_nft_item(item: NftItemType<T::AccountId>) -> DispatchResult {618619 let current_index = <ItemListIndex>::get(item.collection)620 .checked_add(1)621 .expect("Item list index id error");622623 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())?;626627 <ItemListIndex>::insert(collection_id, current_index);628 <NftItemList<T>>::insert(collection_id, current_index, item);629630 // Update balance631 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);633634 Ok(())635 }636637 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())?;642643 // remove approve list644 <ApprovedList<T>>::remove(collection_id, (item_id, owner.clone()));645646 // update balance647 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);649650651 <ReFungibleItemList<T>>::remove(collection_id, item_id);652653 Ok(())654 }655656 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())?;660661 // remove approve list662 <ApprovedList<T>>::remove(collection_id, (item_id, item.owner.clone()));663664 // update balance665 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);668669 Ok(())670 }671672 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())?;676677 // remove approve list678 <ApprovedList<T>>::remove(collection_id, (item_id, item.owner.clone()));679680 // update balance681 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);683684 <FungibleItemList<T>>::remove(collection_id, item_id);685686 Ok(()) 687 }539688540 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 }584585 fn add_refungible_item(item: ReFungibleItemType<T::AccountId>) -> DispatchResult {586587 let current_index = <ItemListIndex>::get(item.collection)588 .checked_add(1)589 .expect("Item list index id error");590591 let value = item.owner.first().unwrap().fraction as u64;592 let owner = item.owner.first().unwrap().owner.clone();593594 Self::add_token_index(item.collection, current_index, owner.clone())?;595596 <ItemListIndex>::insert(item.collection, current_index);597 <ReFungibleItemList<T>>::insert(item.collection, current_index, item); 598 599 // Update balance600 let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();601 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);602603 Ok(())604 }605733606 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;737738 ensure!(amount >= value.into(),"Item balance not enouth");739740 // update balance609 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);743744 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 }749750 let val64 = value.into();751752 // transfer753 if amount == val64 && new_owner_account_id == 0754 {755 // change owner756 // new owner do not have account757 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);611760612 // update balance761 // update balance613 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);615764616 // TODO765 // update index collection766 Self::move_token_index(collection_id, item_id, owner.clone(), new_owner.clone())?;767 }768 else769 {770 let mut new_full_item = full_item.clone();771 new_full_item.value -= val64;772773 // separate amount774 if new_owner_account_id > 0 {775776 // new owner has account777 let mut item = <FungibleItemList<T>>::get(collection_id, new_owner_account_id);778 item.value += val64;779780 // update balance781 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);783784 <FungibleItemList<T>>::insert(collection_id, new_owner_account_id, item);785 }786 else787 {788 // new owner do not have account789 let item = FungibleItemType {790 collection: collection_id,791 owner: new_owner.clone(),792 value: val64793 };794795 Self::add_fungible_item(item)?;796 }797798 if amount == val64{799 Self::remove_token_index(collection_id, item_id, full_item.owner.clone())?;800 801 // remove approve list617 <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 }805806 <FungibleItemList<T>>::insert(collection_id, item_id, new_full_item);807 }618808619 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;627816628 ensure!(amount < value.into(),"Item balance not enouth");817 ensure!(amount >= value.into(),"Item balance not enouth");629818630 // update balance819 // update balance631 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);639640 // transfer641 if amount == value.into() && !new_owner_has_account828 let val64 = value.into();829830 // transfer831 if amount == val64 && !new_owner_has_account642 {832 {643 // change owner833 // change owner644 // new owner do not have account834 // new owner do not have account652 else842 else653 {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;656846657 // separate amount847 // separate amount658 if new_owner_has_account {848 if new_owner_has_account {659 // new owner has account849 // new owner has account660 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 else663 {853 {664 // new owner do not have account854 // new owner do not have account665 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 }668858672 Ok(())862 Ok(())673 }863 }674 675 fn add_nft_item(item: NftItemType<T::AccountId>) -> DispatchResult {676677 let current_index = <ItemListIndex>::get(item.collection)678 .checked_add(1)679 .expect("Item list index id error");680681 Self::add_token_index(item.collection, current_index, item.owner.clone())?;682683 <ItemListIndex>::insert(item.collection, current_index);684 <NftItemList<T>>::insert(item.collection, current_index, item);685686 // Update balance687 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);689690 Ok(())691 }692693 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())?;697698 // update balance699 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);702703 Ok(())704 }705864706 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 {707866722 <NftItemList<T>>::insert(collection_id, item_id, item);881 <NftItemList<T>>::insert(collection_id, item_id, item);723882724 // update index collection883 // update index collection725 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())?;726885727 // reset approved list886 // reset approved list728 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));730731 Ok(())888 Ok(())732 }889 }pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here1// Tests to be written here2use crate::mock::*;2use crate::mock::*;3use crate::{CollectionMode, Ownership, ApprovePermissions};3use frame_support::{assert_noop, assert_ok};4use frame_support::{assert_noop, assert_ok};455#[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);111312 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 mode20 ));21 ));21 assert_eq!(TemplateModule::collection(1).owner, 1);22 assert_eq!(TemplateModule::collection(1).owner, 1);22 });23}242325#[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();312432 let size = 1024;25 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));33 let origin1 = Origin::signed(1);3435 assert_ok!(TemplateModule::create_collection(36 origin1.clone(),37 col_name1.clone(),38 col_desc1.clone(),39 token_prefix1.clone(),40 size41 ));42 assert_ok!(TemplateModule::change_collection_owner(43 origin1.clone(),44 1,45 246 ));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}502951#[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);573758 let size = 1024;59 let origin1 = Origin::signed(1);38 let origin1 = Origin::signed(1);6061 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 mode67 ));45 ));68 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));46 assert_eq!(TemplateModule::collection(1).owner, 1);474849 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}715472#[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);786279 let size = 1024;80 let origin1 = Origin::signed(1);63 let origin1 = Origin::signed(1);81 let origin2 = Origin::signed(2);8283 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 mode89 ));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 ));967297 // 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}10179102#[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);10887109 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);112113 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 mode119 ));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 ));12698127 // 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]);129103130 // burn item104 // change owner scenario131 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]);136112137 assert_eq!(TemplateModule::balance_count((1, 1)), 0);113 // split item scenario114 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]);121122 // split item and new owner has account scenario123 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}140132141#[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);147140148 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);152153 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 mode159 ));149 ));160 assert_ok!(TemplateModule::create_collection(161 origin2.clone(),162 col_name1.clone(),163 col_desc1.clone(),164 token_prefix1.clone(),165 size166 ));167 assert_ok!(TemplateModule::create_collection(168 origin3.clone(),169 col_name1.clone(),170 col_desc1.clone(),171 token_prefix1.clone(),172 size173 ));174175 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);178151179 // 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]);182157183 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);158 // change owner scenario159 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]);165166 // split item scenario167 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]);174175 // split item and new owner has account scenario176 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}187185186188#[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);194194195 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);199200 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 mode206 ));202 ));207 assert_ok!(TemplateModule::create_collection(208 origin2.clone(),209 col_name1.clone(),210 col_desc1.clone(),211 token_prefix1.clone(),212 size213 ));214 assert_ok!(TemplateModule::create_collection(215 origin3.clone(),216 col_name1.clone(),217 col_desc1.clone(),218 token_prefix1.clone(),219 size220 ));221222 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);225204226 // collection admin227 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));228 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));229205230 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]);232210233 // remove admin211 // default scenario234 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}242220243#[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);249228250 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);254255 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 mode261 ));237 ));262 assert_ok!(TemplateModule::create_collection(263 origin2.clone(),264 col_name1.clone(),265 col_desc1.clone(),266 token_prefix1.clone(),267 size268 ));269 assert_ok!(TemplateModule::create_collection(270 origin3.clone(),271 col_name1.clone(),272 col_desc1.clone(),273 token_prefix1.clone(),274 size275 ));276277 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);280239281 // check balance before282 assert_eq!(TemplateModule::balance_count((1, 1)), 0);283240284 // 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]);290245291 // 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 );250251 // do approve252 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});257258 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}296262297#[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);303270304 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);308309 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 mode315 ));279 ));316 assert_ok!(TemplateModule::create_collection(317 origin2.clone(),318 col_name1.clone(),319 col_desc1.clone(),320 token_prefix1.clone(),321 size322 ));323 assert_ok!(TemplateModule::create_collection(324 origin3.clone(),325 col_name1.clone(),326 col_desc1.clone(),327 token_prefix1.clone(),328 size329 ));330331 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);334281335 // 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]);341287342 // 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 );345292346 // balance_of check293 // do approve347 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});299348 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]);305306 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}351310352#[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);358318359 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);363364 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 mode370 ));327 ));371 assert_ok!(TemplateModule::create_collection(372 origin2.clone(),373 col_name1.clone(),374 col_desc1.clone(),375 token_prefix1.clone(),376 size377 ));378 assert_ok!(TemplateModule::create_collection(379 origin3.clone(),380 col_name1.clone(),381 col_desc1.clone(),382 token_prefix1.clone(),383 size384 ));385386 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);389329390 // 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]);396334397 // 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 );339340 // do approve398 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});346347 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]);352353 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);354 assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 10, amount: 100000000});355356 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]);362363 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 0);400 });364 });401}365}402366403#[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();409367410 let size = 1024;411 let origin1 = Origin::signed(1);412 let origin2 = Origin::signed(2);413 let origin3 = Origin::signed(3);414368415 assert_ok!(TemplateModule::create_collection(416 origin1.clone(),417 col_name1.clone(),418 col_desc1.clone(),419 token_prefix1.clone(),420 size421 ));422 assert_ok!(TemplateModule::create_collection(423 origin2.clone(),424 col_name1.clone(),425 col_desc1.clone(),426 token_prefix1.clone(),427 size428 ));429 assert_ok!(TemplateModule::create_collection(430 origin3.clone(),431 col_name1.clone(),432 col_desc1.clone(),433 token_prefix1.clone(),434 size435 ));436369437 assert_eq!(TemplateModule::collection(1).owner, 1);438 assert_eq!(TemplateModule::collection(2).owner, 2);439 assert_eq!(TemplateModule::collection(3).owner, 3);440370441 // create item442 assert_ok!(TemplateModule::create_item(443 origin1.clone(),444 1,445 [1, 1, 1].to_vec()446 ));447371448 // approve449 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));450 assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);451 });452}453372454#[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();460373461 let size = 1024;462 let origin1 = Origin::signed(1);463 let origin2 = Origin::signed(2);464 let origin3 = Origin::signed(3);465374466 assert_ok!(TemplateModule::create_collection(467 origin1.clone(),468 col_name1.clone(),469 col_desc1.clone(),470 token_prefix1.clone(),471 size472 ));473 assert_ok!(TemplateModule::create_collection(474 origin2.clone(),475 col_name1.clone(),476 col_desc1.clone(),477 token_prefix1.clone(),478 size479 ));480 assert_ok!(TemplateModule::create_collection(481 origin3.clone(),482 col_name1.clone(),483 col_desc1.clone(),484 token_prefix1.clone(),485 size486 ));487375488 assert_eq!(TemplateModule::collection(1).owner, 1);489 assert_eq!(TemplateModule::collection(2).owner, 2);490 assert_eq!(TemplateModule::collection(3).owner, 3);491376492 // create item493 assert_ok!(TemplateModule::create_item(494 origin1.clone(),495 1,496 [1, 1, 1].to_vec()497 ));498377499 // approve500 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));501 assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));502 });503}504378505#[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();511379512 let size = 1024;513 let origin1 = Origin::signed(1);514 let origin2 = Origin::signed(2);515 let origin3 = Origin::signed(3);516380517 assert_ok!(TemplateModule::create_collection(518 origin1.clone(),519 col_name1.clone(),520 col_desc1.clone(),521 token_prefix1.clone(),522 size523 ));524 assert_ok!(TemplateModule::create_collection(525 origin2.clone(),526 col_name1.clone(),527 col_desc1.clone(),528 token_prefix1.clone(),529 size530 ));531 assert_ok!(TemplateModule::create_collection(532 origin3.clone(),533 col_name1.clone(),534 col_desc1.clone(),535 token_prefix1.clone(),536 size537 ));538381539 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,388546 [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// size554 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);401559 // 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 });408566}409// let size = 1024;410// let origin1 = Origin::signed(1);411412// assert_ok!(TemplateModule::create_collection(413// origin1.clone(),414// col_name1.clone(),415// col_desc1.clone(),416// token_prefix1.clone(),417// size418// ));419// assert_ok!(TemplateModule::change_collection_owner(420// origin1.clone(),421// 1,422// 2423// ));424// assert_eq!(TemplateModule::collection(1).owner, 2);425// });426// }427428// #[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();434435// let size = 1024;436// let origin1 = Origin::signed(1);437438// assert_ok!(TemplateModule::create_collection(439// origin1.clone(),440// col_name1.clone(),441// col_desc1.clone(),442// token_prefix1.clone(),443// size444// ));445// assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));446// });447// }448449// #[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();455456// let size = 1024;457// let origin1 = Origin::signed(1);458// let origin2 = Origin::signed(2);459460// assert_ok!(TemplateModule::create_collection(461// origin1.clone(),462// col_name1.clone(),463// col_desc1.clone(),464// token_prefix1.clone(),465// size466// ));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// ));473474// // check balance (collection with id = 1, user id = 2)475// assert_eq!(TemplateModule::balance_count((1, 2)), 1);476// });477// }478479// #[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();485486// let size = 1024;487// let origin1 = Origin::signed(1);488// let origin2 = Origin::signed(2);489490// assert_ok!(TemplateModule::create_collection(491// origin1.clone(),492// col_name1.clone(),493// col_desc1.clone(),494// token_prefix1.clone(),495// size496// ));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// ));503504// // check balance (collection with id = 1, user id = 2)505// assert_eq!(TemplateModule::balance_count((1, 2)), 1);506507// // burn item508// 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// );513514// assert_eq!(TemplateModule::balance_count((1, 1)), 0);515// });516// }517518// #[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();524525// let size = 1024;526// let origin1 = Origin::signed(1);527// let origin2 = Origin::signed(2);528// let origin3 = Origin::signed(3);529530// assert_ok!(TemplateModule::create_collection(531// origin1.clone(),532// col_name1.clone(),533// col_desc1.clone(),534// token_prefix1.clone(),535// size536// ));537// assert_ok!(TemplateModule::create_collection(538// origin2.clone(),539// col_name1.clone(),540// col_desc1.clone(),541// token_prefix1.clone(),542// size543// ));544// assert_ok!(TemplateModule::create_collection(545// origin3.clone(),546// col_name1.clone(),547// col_desc1.clone(),548// token_prefix1.clone(),549// size550// ));551552// assert_eq!(TemplateModule::collection(1).owner, 1);553// assert_eq!(TemplateModule::collection(2).owner, 2);554// assert_eq!(TemplateModule::collection(3).owner, 3);555556// // collection admin557// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));558// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));559560// assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);561// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);562// });563// }564565// #[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();571572// let size = 1024;573// let origin1 = Origin::signed(1);574// let origin2 = Origin::signed(2);575// let origin3 = Origin::signed(3);576577// assert_ok!(TemplateModule::create_collection(578// origin1.clone(),579// col_name1.clone(),580// col_desc1.clone(),581// token_prefix1.clone(),582// size583// ));584// assert_ok!(TemplateModule::create_collection(585// origin2.clone(),586// col_name1.clone(),587// col_desc1.clone(),588// token_prefix1.clone(),589// size590// ));591// assert_ok!(TemplateModule::create_collection(592// origin3.clone(),593// col_name1.clone(),594// col_desc1.clone(),595// token_prefix1.clone(),596// size597// ));598599// assert_eq!(TemplateModule::collection(1).owner, 1);600// assert_eq!(TemplateModule::collection(2).owner, 2);601// assert_eq!(TemplateModule::collection(3).owner, 3);602603// // collection admin604// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));605// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));606607// assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);608// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);609610// // remove admin611// assert_ok!(TemplateModule::remove_collection_admin(612// origin2.clone(),613// 1,614// 3615// ));616// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);617// });618// }619620// #[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();626627// let size = 1024;628// let origin1 = Origin::signed(1);629// let origin2 = Origin::signed(2);630// let origin3 = Origin::signed(3);631632// assert_ok!(TemplateModule::create_collection(633// origin1.clone(),634// col_name1.clone(),635// col_desc1.clone(),636// token_prefix1.clone(),637// size638// ));639// assert_ok!(TemplateModule::create_collection(640// origin2.clone(),641// col_name1.clone(),642// col_desc1.clone(),643// token_prefix1.clone(),644// size645// ));646// assert_ok!(TemplateModule::create_collection(647// origin3.clone(),648// col_name1.clone(),649// col_desc1.clone(),650// token_prefix1.clone(),651// size652// ));653654// assert_eq!(TemplateModule::collection(1).owner, 1);655// assert_eq!(TemplateModule::collection(2).owner, 2);656// assert_eq!(TemplateModule::collection(3).owner, 3);657658// // check balance before659// assert_eq!(TemplateModule::balance_count((1, 1)), 0);660661// // create item662// assert_ok!(TemplateModule::create_item(663// origin1.clone(),664// 1,665// [1, 1, 1].to_vec()666// ));667668// // 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// }673674// #[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();680681// let size = 1024;682// let origin1 = Origin::signed(1);683// let origin2 = Origin::signed(2);684// let origin3 = Origin::signed(3);685686// assert_ok!(TemplateModule::create_collection(687// origin1.clone(),688// col_name1.clone(),689// col_desc1.clone(),690// token_prefix1.clone(),691// size692// ));693// assert_ok!(TemplateModule::create_collection(694// origin2.clone(),695// col_name1.clone(),696// col_desc1.clone(),697// token_prefix1.clone(),698// size699// ));700// assert_ok!(TemplateModule::create_collection(701// origin3.clone(),702// col_name1.clone(),703// col_desc1.clone(),704// token_prefix1.clone(),705// size706// ));707708// assert_eq!(TemplateModule::collection(1).owner, 1);709// assert_eq!(TemplateModule::collection(2).owner, 2);710// assert_eq!(TemplateModule::collection(3).owner, 3);711712// // create item713// assert_ok!(TemplateModule::create_item(714// origin1.clone(),715// 1,716// [1, 1, 1].to_vec()717// ));718719// // transfer720// assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));721// assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);722723// // balance_of check724// assert_eq!(TemplateModule::balance_count((1, 1)), 0);725// assert_eq!(TemplateModule::balance_count((1, 2)), 1);726// });727// }728729// #[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();735736// let size = 1024;737// let origin1 = Origin::signed(1);738// let origin2 = Origin::signed(2);739// let origin3 = Origin::signed(3);740741// assert_ok!(TemplateModule::create_collection(742// origin1.clone(),743// col_name1.clone(),744// col_desc1.clone(),745// token_prefix1.clone(),746// size747// ));748// assert_ok!(TemplateModule::create_collection(749// origin2.clone(),750// col_name1.clone(),751// col_desc1.clone(),752// token_prefix1.clone(),753// size754// ));755// assert_ok!(TemplateModule::create_collection(756// origin3.clone(),757// col_name1.clone(),758// col_desc1.clone(),759// token_prefix1.clone(),760// size761// ));762763// assert_eq!(TemplateModule::collection(1).owner, 1);764// assert_eq!(TemplateModule::collection(2).owner, 2);765// assert_eq!(TemplateModule::collection(3).owner, 3);766767// // create item768// assert_ok!(TemplateModule::create_item(769// origin1.clone(),770// 1,771// [1, 1, 1].to_vec()772// ));773774// // approve775// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));776// assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);777// });778// }779780// #[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();786787// let size = 1024;788// let origin1 = Origin::signed(1);789// let origin2 = Origin::signed(2);790// let origin3 = Origin::signed(3);791792// assert_ok!(TemplateModule::create_collection(793// origin1.clone(),794// col_name1.clone(),795// col_desc1.clone(),796// token_prefix1.clone(),797// size798// ));799// assert_ok!(TemplateModule::create_collection(800// origin2.clone(),801// col_name1.clone(),802// col_desc1.clone(),803// token_prefix1.clone(),804// size805// ));806// assert_ok!(TemplateModule::create_collection(807// origin3.clone(),808// col_name1.clone(),809// col_desc1.clone(),810// token_prefix1.clone(),811// size812// ));813814// assert_eq!(TemplateModule::collection(1).owner, 1);815// assert_eq!(TemplateModule::collection(2).owner, 2);816// assert_eq!(TemplateModule::collection(3).owner, 3);817818// // create item819// assert_ok!(TemplateModule::create_item(820// origin1.clone(),821// 1,822// [1, 1, 1].to_vec()823// ));824825// // approve826// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));827// assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);828// });829// }830831// #[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();837838// let size = 1024;839// let origin1 = Origin::signed(1);840// let origin2 = Origin::signed(2);841// let origin3 = Origin::signed(3);842843// assert_ok!(TemplateModule::create_collection(844// origin1.clone(),845// col_name1.clone(),846// col_desc1.clone(),847// token_prefix1.clone(),848// size849// ));850// assert_ok!(TemplateModule::create_collection(851// origin2.clone(),852// col_name1.clone(),853// col_desc1.clone(),854// token_prefix1.clone(),855// size856// ));857// assert_ok!(TemplateModule::create_collection(858// origin3.clone(),859// col_name1.clone(),860// col_desc1.clone(),861// token_prefix1.clone(),862// size863// ));864865// assert_eq!(TemplateModule::collection(1).owner, 1);866// assert_eq!(TemplateModule::collection(2).owner, 2);867// assert_eq!(TemplateModule::collection(3).owner, 3);868869// // create item870// assert_ok!(TemplateModule::create_item(871// origin1.clone(),872// 1,873// [1, 1, 1].to_vec()874// ));875876// // approve877// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));878// assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));879// });880// }881882// #[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();888889// let size = 1024;890// let origin1 = Origin::signed(1);891// let origin2 = Origin::signed(2);892// let origin3 = Origin::signed(3);893894// assert_ok!(TemplateModule::create_collection(895// origin1.clone(),896// col_name1.clone(),897// col_desc1.clone(),898// token_prefix1.clone(),899// size900// ));901// assert_ok!(TemplateModule::create_collection(902// origin2.clone(),903// col_name1.clone(),904// col_desc1.clone(),905// token_prefix1.clone(),906// size907// ));908// assert_ok!(TemplateModule::create_collection(909// origin3.clone(),910// col_name1.clone(),911// col_desc1.clone(),912// token_prefix1.clone(),913// size914// ));915916// 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 items920// 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 one937// assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));938// assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);939// // burn another one940// assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));941// assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);942// });943// }567944