difftreelog
funfible item added
in: master
3 files changed
README.mddiffbeforeafterboth--- a/README.md
+++ b/README.md
@@ -117,6 +117,20 @@
"ReFungible": "(u32, u32)"
}
},
+ "Ownership": {
+ "Owner": "AccountId",
+ "Fraction": "u128"
+ },
+ "FungibleItemType": {
+ "Collection": "u64",
+ "Owner": "AccountId",
+ "Value": "u128"
+ },
+ "ReFungibleItemType": {
+ "Collection": "u64",
+ "Owner": "Vec<Ownership>",
+ "Data": "Vec<u8>"
+ },
"NftItemType": {
"Collection": "u64",
"Owner": "AccountId",
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -122,6 +122,13 @@
pub data: Vec<u8>,
}
+#[derive(Encode, Decode, Default, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Debug))]
+pub struct ApprovePermissions<AccountId> {
+ pub approved: AccountId,
+ pub amount: u64
+}
+
pub trait Trait: system::Trait {
type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
@@ -138,11 +145,13 @@
pub AdminList get(fn admin_list_collection): map hasher(identity) u64 => Vec<T::AccountId>;
pub WhiteList get(fn white_list): map hasher(identity) u64 => Vec<T::AccountId>;
- // Balance owner per collection map
+ /// Balance owner per collection map
pub Balance get(fn balance_count): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => u64;
- pub ApprovedList get(fn approved): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => Vec<T::AccountId>;
- // Item collections
+ /// second parameter: item id + owner account id
+ pub ApprovedList get(fn approved): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) (u64, T::AccountId) => Vec<ApprovePermissions<T::AccountId>>;
+
+ /// Item collections
pub NftItemList get(fn nft_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => NftItemType<T::AccountId>;
pub FungibleItemList get(fn fungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => FungibleItemType<T::AccountId>;
pub ReFungibleItemList get(fn refungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => ReFungibleItemType<T::AccountId>;
@@ -248,6 +257,7 @@
let sender = ensure_signed(origin)?;
Self::check_owner_permissions(collection_id, sender)?;
+ // TODO Items remove
<AddressTokens<T>>::remove_prefix(collection_id);
<ApprovedList<T>>::remove_prefix(collection_id);
<Balance<T>>::remove_prefix(collection_id);
@@ -356,18 +366,18 @@
pub fn create_item(origin, collection_id: u64, properties: Vec<u8>, owner: T::AccountId) -> DispatchResult {
let sender = ensure_signed(origin)?;
-
- // check size
let target_collection = <Collection<T>>::get(collection_id);
- ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
-
Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
// TODO: implement other modes
match target_collection.mode
{
CollectionMode::NFT(_) => {
- // Create nft item
+
+ // check size
+ ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
+
+ // Create nft item
let item = NftItemType {
collection: collection_id,
owner: owner,
@@ -377,7 +387,24 @@
Self::add_nft_item(item)?;
},
+ CollectionMode::Fungible(_) => {
+
+ // check size
+ ensure!(properties.len() as u32 == 0, "Size of item must be 0 with fungible type");
+
+ let item = FungibleItemType {
+ collection: collection_id,
+ owner: owner,
+ value: (10 as u128).pow(target_collection.decimal_points)
+ };
+
+ Self::add_fungible_item(item)?;
+ },
CollectionMode::ReFungible(_, _) => {
+
+ // check size
+ ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
+
let mut owner_list = Vec::new();
let value = (10 as u128).pow(target_collection.decimal_points);
owner_list.push(Ownership {owner: owner, fraction: value});
@@ -413,6 +440,7 @@
match target_collection.mode
{
CollectionMode::NFT(_) => Self::burn_nft_item(collection_id, item_id)?,
+ CollectionMode::Fungible(_) => Self::burn_fungible_item(collection_id, item_id)?,
CollectionMode::ReFungible(_, _) => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,
_ => ()
};
@@ -435,6 +463,7 @@
match target_collection.mode
{
CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,
+ CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, sender.clone(), recipient)?,
CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,
_ => ()
};
@@ -447,26 +476,26 @@
let sender = ensure_signed(origin)?;
- let item_owner = Self::is_item_owner(sender.clone(), collection_id, item_id);
- if !item_owner
- {
- Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
- }
+ // amount param stub
+ let amount = 100000000;
- let list_exists = <ApprovedList<T>>::contains_key(collection_id, item_id);
+ ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id), "Only item owner can call transfer method");
+
+ let list_exists = <ApprovedList<T>>::contains_key(collection_id, (item_id, sender.clone()));
if list_exists {
- let mut list = <ApprovedList<T>>::get(collection_id, item_id);
- let item_contains = list.contains(&approved.clone());
+ let mut list = <ApprovedList<T>>::get(collection_id, (item_id, sender.clone()));
+ let item_contains = list.iter().any(|i| i.approved == approved);
if !item_contains {
- list.push(approved.clone());
+ list.push(ApprovePermissions { approved: approved.clone(), amount: amount });
+ <ApprovedList<T>>::insert(collection_id, (item_id, sender.clone()), list);
}
} else {
- let mut itm = Vec::new();
- itm.push(approved.clone());
- <ApprovedList<T>>::insert(collection_id, item_id, itm);
+ let mut list = Vec::new();
+ list.push(ApprovePermissions { approved: approved.clone(), amount: amount });
+ <ApprovedList<T>>::insert(collection_id, (item_id, sender.clone()), list);
}
Ok(())
@@ -475,16 +504,21 @@
#[weight = 0]
pub fn transfer_from(origin, from: T::AccountId, recipient: T::AccountId, collection_id: u64, item_id: u64, value: u64 ) -> DispatchResult {
- let mut approved: bool = false;
let sender = ensure_signed(origin)?;
- let approved_list_exists = <ApprovedList<T>>::contains_key(collection_id, item_id);
+ let approved_list_exists = <ApprovedList<T>>::contains_key(collection_id, (item_id, from.clone()));
if approved_list_exists
{
- let list_itm = <ApprovedList<T>>::get(collection_id, item_id);
- approved = list_itm.contains(&recipient.clone());
- }
+ let list_itm = <ApprovedList<T>>::get(collection_id, (item_id, from.clone()));
+ let opt_item = list_itm.iter().find(|i| i.approved == sender.clone());
+ ensure!(opt_item.is_some(), "No approve found");
+ ensure!(opt_item.unwrap().amount >= value, "Requested value more than approved");
- if !approved
+ // remove approve
+ let approve_list: Vec<ApprovePermissions<T::AccountId>> = <ApprovedList<T>>::get(collection_id, (item_id, from.clone()))
+ .into_iter().filter(|i| i.approved != sender.clone()).collect();
+ <ApprovedList<T>>::insert(collection_id, (item_id, from.clone()), approve_list);
+ }
+ else
{
Self::check_owner_or_admin_permissions(collection_id, sender)?;
}
@@ -494,8 +528,8 @@
match target_collection.mode
{
CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, from, recipient)?,
- CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, from, recipient)?,
- // TODO: implement other modes
+ CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, from.clone(), recipient)?,
+ CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,
_ => ()
};
@@ -537,6 +571,121 @@
impl<T: Trait> Module<T> {
+ fn add_fungible_item(item: FungibleItemType<T::AccountId>) -> DispatchResult {
+
+ let current_index = <ItemListIndex>::get(item.collection)
+ .checked_add(1)
+ .expect("Item list index id error");
+ let itemcopy = item.clone();
+ let owner = item.owner.clone();
+ let value = item.value as u64;
+
+ Self::add_token_index(item.collection, current_index, owner.clone())?;
+
+ <ItemListIndex>::insert(item.collection, current_index);
+ <FungibleItemList<T>>::insert(item.collection, current_index, itemcopy);
+
+ // Update balance
+ let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();
+ <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
+
+ Ok(())
+ }
+
+ fn add_refungible_item(item: ReFungibleItemType<T::AccountId>) -> DispatchResult {
+
+ let current_index = <ItemListIndex>::get(item.collection)
+ .checked_add(1)
+ .expect("Item list index id error");
+ let itemcopy = item.clone();
+
+ let value = item.owner.first().unwrap().fraction as u64;
+ let owner = item.owner.first().unwrap().owner.clone();
+
+ Self::add_token_index(item.collection, current_index, owner.clone())?;
+
+ <ItemListIndex>::insert(item.collection, current_index);
+ <ReFungibleItemList<T>>::insert(item.collection, current_index, itemcopy);
+
+ // Update balance
+ let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();
+ <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
+
+ Ok(())
+ }
+
+ fn add_nft_item(item: NftItemType<T::AccountId>) -> DispatchResult {
+
+ let current_index = <ItemListIndex>::get(item.collection)
+ .checked_add(1)
+ .expect("Item list index id error");
+
+ let item_owner = item.owner.clone();
+ let collection_id = item.collection.clone();
+ Self::add_token_index(collection_id, current_index, item.owner.clone())?;
+
+ <ItemListIndex>::insert(collection_id, current_index);
+ <NftItemList<T>>::insert(collection_id, current_index, item);
+
+ // Update balance
+ let new_balance = <Balance<T>>::get(collection_id, item_owner.clone()).checked_add(1).unwrap();
+ <Balance<T>>::insert(collection_id, item_owner.clone(), new_balance);
+
+ Ok(())
+ }
+
+ fn burn_refungible_item(collection_id: u64, item_id: u64, owner: T::AccountId) -> DispatchResult {
+
+ let collection = <ReFungibleItemList<T>>::get(collection_id, item_id);
+ let item = collection.owner.iter().filter(|&i| i.owner == owner).next().unwrap();
+ Self::remove_token_index(collection_id, item_id, owner.clone())?;
+
+ // remove approve list
+ <ApprovedList<T>>::remove(collection_id, (item_id, owner.clone()));
+
+ // update balance
+ let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(item.fraction as u64).unwrap();
+ <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
+
+
+ <ReFungibleItemList<T>>::remove(collection_id, item_id);
+
+ Ok(())
+ }
+
+ fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {
+
+ let item = <NftItemList<T>>::get(collection_id, item_id);
+ Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
+
+ // remove approve list
+ <ApprovedList<T>>::remove(collection_id, (item_id, item.owner.clone()));
+
+ // update balance
+ let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(1).unwrap();
+ <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
+ <NftItemList<T>>::remove(collection_id, item_id);
+
+ Ok(())
+ }
+
+ fn burn_fungible_item(collection_id: u64, item_id: u64) -> DispatchResult {
+
+ let item = <FungibleItemList<T>>::get(collection_id, item_id);
+ Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
+
+ // remove approve list
+ <ApprovedList<T>>::remove(collection_id, (item_id, item.owner.clone()));
+
+ // update balance
+ let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(item.value as u64).unwrap();
+ <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
+
+ <FungibleItemList<T>>::remove(collection_id, item_id);
+
+ Ok(())
+ }
+
fn collection_exists(collection_id: u64) -> DispatchResult{
ensure!(<Collection<T>>::contains_key(collection_id), "This collection does not exist");
Ok(())
@@ -582,50 +731,90 @@
}
}
- fn add_refungible_item(item: ReFungibleItemType<T::AccountId>) -> DispatchResult {
+ fn transfer_fungible(collection_id: u64, item_id: u64, value: u64, owner: T::AccountId, new_owner: T::AccountId) -> DispatchResult {
+ let full_item = <FungibleItemList<T>>::get(collection_id, item_id);
+ let amount = full_item.value;
+
+ ensure!(amount >= value.into(),"Item balance not enouth");
+
+ // update balance
+ let balance_old_owner = <Balance<T>>::get(collection_id, owner.clone()).checked_sub(value).unwrap();
+ <Balance<T>>::insert(collection_id, owner.clone(), balance_old_owner);
+
+ let mut new_owner_account_id = 0;
+ let new_owner_items = <AddressTokens<T>>::get(collection_id, new_owner.clone());
+ if new_owner_items.len() > 0 {
+ new_owner_account_id = new_owner_items[0];
+ }
+
+ let val64 = value.into();
- let current_index = <ItemListIndex>::get(item.collection)
- .checked_add(1)
- .expect("Item list index id error");
+ // transfer
+ if amount == val64 && new_owner_account_id == 0
+ {
+ // change owner
+ // new owner do not have account
+ let mut new_full_item = full_item.clone();
+ new_full_item.owner = new_owner.clone();
+ <FungibleItemList<T>>::insert(collection_id, item_id, new_full_item);
- let value = item.owner.first().unwrap().fraction as u64;
- let owner = item.owner.first().unwrap().owner.clone();
+ // update balance
+ let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone()).checked_add(value).unwrap();
+ <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);
- Self::add_token_index(item.collection, current_index, owner.clone())?;
+ // update index collection
+ Self::move_token_index(collection_id, item_id, owner.clone(), new_owner.clone())?;
+ }
+ else
+ {
+ let mut new_full_item = full_item.clone();
+ new_full_item.value -= val64;
- <ItemListIndex>::insert(item.collection, current_index);
- <ReFungibleItemList<T>>::insert(item.collection, current_index, item);
-
- // Update balance
- let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();
- <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
+ // separate amount
+ if new_owner_account_id > 0 {
+
+ // new owner has account
+ let mut item = <FungibleItemList<T>>::get(collection_id, new_owner_account_id);
+ item.value += val64;
+
+ // update balance
+ let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone()).checked_add(value).unwrap();
+ <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);
- Ok(())
- }
+ <FungibleItemList<T>>::insert(collection_id, new_owner_account_id, item);
+ }
+ else
+ {
+ // new owner do not have account
+ let item = FungibleItemType {
+ collection: collection_id,
+ owner: new_owner.clone(),
+ value: val64
+ };
- fn burn_refungible_item(collection_id: u64, item_id: u64, owner: T::AccountId) -> DispatchResult {
-
- let collection = <ReFungibleItemList<T>>::get(collection_id, item_id);
- let item = collection.owner.iter().filter(|&i| i.owner == owner).next().unwrap();
- Self::remove_token_index(collection_id, item_id, owner)?;
+ Self::add_fungible_item(item)?;
+ }
- // update balance
- let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(item.fraction as u64).unwrap();
- <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
+ if amount == val64{
+ Self::remove_token_index(collection_id, item_id, full_item.owner.clone())?;
+
+ // remove approve list
+ <ApprovedList<T>>::remove(collection_id, (item_id, full_item.owner.clone()));
+ <FungibleItemList<T>>::remove(collection_id, item_id);
+ }
- // TODO
- <ReFungibleItemList<T>>::remove(collection_id, item_id);
+ <FungibleItemList<T>>::insert(collection_id, item_id, new_full_item);
+ }
Ok(())
}
fn transfer_refungible(collection_id: u64, item_id: u64, value: u64, owner: T::AccountId, new_owner: T::AccountId) -> DispatchResult {
-
let full_item = <ReFungibleItemList<T>>::get(collection_id, item_id);
let item = full_item.owner.iter().filter(|i| i.owner == owner).next().unwrap();
let amount = item.fraction;
- ensure!(amount < value.into(),"Item balance not enouth");
+ ensure!(amount >= value.into(),"Item balance not enouth");
// update balance
let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(value).unwrap();
@@ -636,9 +825,10 @@
let old_owner = item.owner.clone();
let new_owner_has_account = full_item.owner.iter().any(|i| i.owner == new_owner);
+ let val64 = value.into();
// transfer
- if amount == value.into() && !new_owner_has_account
+ if amount == val64 && !new_owner_has_account
{
// change owner
// new owner do not have account
@@ -652,17 +842,17 @@
else
{
let mut new_full_item = full_item.clone();
- new_full_item.owner.iter_mut().find(|i| i.owner == owner).unwrap().fraction -= amount;
+ new_full_item.owner.iter_mut().find(|i| i.owner == owner).unwrap().fraction -= val64;
// separate amount
if new_owner_has_account {
// new owner has account
- new_full_item.owner.iter_mut().find(|i| i.owner == new_owner).unwrap().fraction += amount;
+ new_full_item.owner.iter_mut().find(|i| i.owner == new_owner).unwrap().fraction += val64;
}
else
{
// new owner do not have account
- new_full_item.owner.push(Ownership { owner: new_owner.clone(), fraction: amount});
+ new_full_item.owner.push(Ownership { owner: new_owner.clone(), fraction: val64});
Self::add_token_index(collection_id, item_id, new_owner.clone())?;
}
@@ -671,38 +861,7 @@
Ok(())
}
-
- fn add_nft_item(item: NftItemType<T::AccountId>) -> DispatchResult {
-
- let current_index = <ItemListIndex>::get(item.collection)
- .checked_add(1)
- .expect("Item list index id error");
-
- Self::add_token_index(item.collection, current_index, item.owner.clone())?;
-
- <ItemListIndex>::insert(item.collection, current_index);
- <NftItemList<T>>::insert(item.collection, current_index, item);
- // Update balance
- let new_balance = <Balance<T>>::get(item.collection, item.owner.clone()).checked_add(1).unwrap();
- <Balance<T>>::insert(item.collection_id, item.owner.clone(), new_balance);
-
- Ok(())
- }
-
- fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {
-
- let item = <NftItemList<T>>::get(collection_id, item_id);
- Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
-
- // update balance
- let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(1).unwrap();
- <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
- <NftItemList<T>>::remove(collection_id, item_id);
-
- Ok(())
- }
-
fn transfer_nft(collection_id: u64, item_id: u64, sender: T::AccountId, new_owner: T::AccountId) -> DispatchResult {
let mut item = <NftItemList<T>>::get(collection_id, item_id);
@@ -722,12 +881,10 @@
<NftItemList<T>>::insert(collection_id, item_id, item);
// update index collection
- Self::move_token_index(collection_id, item_id, old_owner, new_owner.clone())?;
+ Self::move_token_index(collection_id, item_id, old_owner.clone(), new_owner.clone())?;
// reset approved list
- let itm: Vec<T::AccountId> = Vec::new();
- <ApprovedList<T>>::insert(collection_id, item_id, itm);
-
+ <ApprovedList<T>>::remove(collection_id, (item_id, old_owner));
Ok(())
}
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use crate::mock::*;3use frame_support::{assert_noop, assert_ok};45#[test]6fn create_collection_test() {7 new_test_ext().execute_with(|| {8 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 token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1112 let size = 1024;13 let origin1 = Origin::signed(1);14 assert_ok!(TemplateModule::create_collection(15 origin1.clone(),16 col_name1.clone(),17 col_desc1.clone(),18 token_prefix1.clone(),19 size20 ));21 assert_eq!(TemplateModule::collection(1).owner, 1);22 });23}2425#[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();3132 let size = 1024;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);48 });49}5051#[test]52fn destroy_collection() {53 new_test_ext().execute_with(|| {54 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>>();56 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();5758 let size = 1024;59 let origin1 = Origin::signed(1);6061 assert_ok!(TemplateModule::create_collection(62 origin1.clone(),63 col_name1.clone(),64 col_desc1.clone(),65 token_prefix1.clone(),66 size67 ));68 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));69 });70}7172#[test]73fn create_item() {74 new_test_ext().execute_with(|| {75 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>>();77 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();7879 let size = 1024;80 let origin1 = Origin::signed(1);81 let origin2 = Origin::signed(2);8283 assert_ok!(TemplateModule::create_collection(84 origin1.clone(),85 col_name1.clone(),86 col_desc1.clone(),87 token_prefix1.clone(),88 size89 ));90 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));91 assert_ok!(TemplateModule::create_item(92 origin2.clone(),93 1,94 [1, 1, 1].to_vec()95 ));9697 // check balance (collection with id = 1, user id = 2)98 assert_eq!(TemplateModule::balance_count((1, 2)), 1);99 });100}101102#[test]103fn burn_item() {104 new_test_ext().execute_with(|| {105 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>>();107 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();108109 let size = 1024;110 let origin1 = Origin::signed(1);111 let origin2 = Origin::signed(2);112113 assert_ok!(TemplateModule::create_collection(114 origin1.clone(),115 col_name1.clone(),116 col_desc1.clone(),117 token_prefix1.clone(),118 size119 ));120 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));121 assert_ok!(TemplateModule::create_item(122 origin2.clone(),123 1,124 [1, 1, 1].to_vec()125 ));126127 // check balance (collection with id = 1, user id = 2)128 assert_eq!(TemplateModule::balance_count((1, 2)), 1);129130 // burn item131 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));132 assert_noop!(133 TemplateModule::burn_item(origin1.clone(), 1, 1),134 "Item does not exists"135 );136137 assert_eq!(TemplateModule::balance_count((1, 1)), 0);138 });139}140141#[test]142fn add_collection_admin() {143 new_test_ext().execute_with(|| {144 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>>();146 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();147148 let size = 1024;149 let origin1 = Origin::signed(1);150 let origin2 = Origin::signed(2);151 let origin3 = Origin::signed(3);152153 assert_ok!(TemplateModule::create_collection(154 origin1.clone(),155 col_name1.clone(),156 col_desc1.clone(),157 token_prefix1.clone(),158 size159 ));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);176 assert_eq!(TemplateModule::collection(2).owner, 2);177 assert_eq!(TemplateModule::collection(3).owner, 3);178179 // collection admin180 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));181 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));182183 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);184 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);185 });186}187188#[test]189fn remove_collection_admin() {190 new_test_ext().execute_with(|| {191 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>>();193 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();194195 let size = 1024;196 let origin1 = Origin::signed(1);197 let origin2 = Origin::signed(2);198 let origin3 = Origin::signed(3);199200 assert_ok!(TemplateModule::create_collection(201 origin1.clone(),202 col_name1.clone(),203 col_desc1.clone(),204 token_prefix1.clone(),205 size206 ));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);223 assert_eq!(TemplateModule::collection(2).owner, 2);224 assert_eq!(TemplateModule::collection(3).owner, 3);225226 // collection admin227 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));228 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));229230 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);231 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);232233 // remove admin234 assert_ok!(TemplateModule::remove_collection_admin(235 origin2.clone(),236 1,237 3238 ));239 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);240 });241}242243#[test]244fn balance_of() {245 new_test_ext().execute_with(|| {246 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>>();248 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();249250 let size = 1024;251 let origin1 = Origin::signed(1);252 let origin2 = Origin::signed(2);253 let origin3 = Origin::signed(3);254255 assert_ok!(TemplateModule::create_collection(256 origin1.clone(),257 col_name1.clone(),258 col_desc1.clone(),259 token_prefix1.clone(),260 size261 ));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);278 assert_eq!(TemplateModule::collection(2).owner, 2);279 assert_eq!(TemplateModule::collection(3).owner, 3);280281 // check balance before282 assert_eq!(TemplateModule::balance_count((1, 1)), 0);283284 // create item285 assert_ok!(TemplateModule::create_item(286 origin1.clone(),287 1,288 [1, 1, 1].to_vec()289 ));290291 // check balance (collection with id = 1, user id = 2)292 assert_eq!(TemplateModule::balance_count((1, 1)), 1);293 assert_eq!(TemplateModule::item_id((1, 1)).owner, 1);294 });295}296297#[test]298fn transfer() {299 new_test_ext().execute_with(|| {300 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>>();302 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();303304 let size = 1024;305 let origin1 = Origin::signed(1);306 let origin2 = Origin::signed(2);307 let origin3 = Origin::signed(3);308309 assert_ok!(TemplateModule::create_collection(310 origin1.clone(),311 col_name1.clone(),312 col_desc1.clone(),313 token_prefix1.clone(),314 size315 ));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);332 assert_eq!(TemplateModule::collection(2).owner, 2);333 assert_eq!(TemplateModule::collection(3).owner, 3);334335 // create item336 assert_ok!(TemplateModule::create_item(337 origin1.clone(),338 1,339 [1, 1, 1].to_vec()340 ));341342 // transfer343 assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));344 assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);345346 // balance_of check347 assert_eq!(TemplateModule::balance_count((1, 1)), 0);348 assert_eq!(TemplateModule::balance_count((1, 2)), 1);349 });350}351352#[test]353fn approve() {354 new_test_ext().execute_with(|| {355 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>>();357 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();358359 let size = 1024;360 let origin1 = Origin::signed(1);361 let origin2 = Origin::signed(2);362 let origin3 = Origin::signed(3);363364 assert_ok!(TemplateModule::create_collection(365 origin1.clone(),366 col_name1.clone(),367 col_desc1.clone(),368 token_prefix1.clone(),369 size370 ));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);387 assert_eq!(TemplateModule::collection(2).owner, 2);388 assert_eq!(TemplateModule::collection(3).owner, 3);389390 // create item391 assert_ok!(TemplateModule::create_item(392 origin1.clone(),393 1,394 [1, 1, 1].to_vec()395 ));396397 // approve398 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));399 assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);400 });401}402403#[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();409410 let size = 1024;411 let origin1 = Origin::signed(1);412 let origin2 = Origin::signed(2);413 let origin3 = Origin::signed(3);414415 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 ));436437 assert_eq!(TemplateModule::collection(1).owner, 1);438 assert_eq!(TemplateModule::collection(2).owner, 2);439 assert_eq!(TemplateModule::collection(3).owner, 3);440441 // create item442 assert_ok!(TemplateModule::create_item(443 origin1.clone(),444 1,445 [1, 1, 1].to_vec()446 ));447448 // approve449 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));450 assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);451 });452}453454#[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();460461 let size = 1024;462 let origin1 = Origin::signed(1);463 let origin2 = Origin::signed(2);464 let origin3 = Origin::signed(3);465466 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 ));487488 assert_eq!(TemplateModule::collection(1).owner, 1);489 assert_eq!(TemplateModule::collection(2).owner, 2);490 assert_eq!(TemplateModule::collection(3).owner, 3);491492 // create item493 assert_ok!(TemplateModule::create_item(494 origin1.clone(),495 1,496 [1, 1, 1].to_vec()497 ));498499 // approve500 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));501 assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));502 });503}504505#[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();511512 let size = 1024;513 let origin1 = Origin::signed(1);514 let origin2 = Origin::signed(2);515 let origin3 = Origin::signed(3);516517 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 ));538539 assert_eq!(TemplateModule::collection(1).owner, 1);540 assert_eq!(TemplateModule::collection(2).owner, 2);541 assert_eq!(TemplateModule::collection(3).owner, 3);542 // create items543 assert_ok!(TemplateModule::create_item(544 origin1.clone(),545 1,546 [1, 1, 1].to_vec()547 ));548 assert_ok!(TemplateModule::create_item(549 origin1.clone(),550 1,551 [1, 1, 2].to_vec()552 ));553 assert_ok!(TemplateModule::create_item(554 origin1.clone(),555 1,556 [1, 2, 3].to_vec()557 ));558 assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 3);559 // burn one560 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));561 assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);562 // burn another one563 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));564 assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);565 });566}1// Tests to be written here2use crate::mock::*;3use crate::{CollectionMode, Ownership, ApprovePermissions};4use frame_support::{assert_noop, assert_ok};56#[test]7fn create_nft_item() {8 new_test_ext().execute_with(|| {9 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();10 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();11 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();12 let mode: CollectionMode = CollectionMode::NFT(2000);1314 let origin1 = Origin::signed(1);15 assert_ok!(TemplateModule::create_collection(16 origin1.clone(),17 col_name1.clone(),18 col_desc1.clone(),19 token_prefix1.clone(),20 mode21 ));22 assert_eq!(TemplateModule::collection(1).owner, 1);232425 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));26 assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());27 });28}2930#[test]31fn create_refungible_item() {32 new_test_ext().execute_with(|| {33 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();34 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();35 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();36 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);3738 let origin1 = Origin::signed(1);39 assert_ok!(TemplateModule::create_collection(40 origin1.clone(),41 col_name1.clone(),42 col_desc1.clone(),43 token_prefix1.clone(),44 mode45 ));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 });52 });53}5455#[test]56fn create_fungible_item() {57 new_test_ext().execute_with(|| {58 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();59 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();60 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();61 let mode: CollectionMode = CollectionMode::Fungible(3);6263 let origin1 = Origin::signed(1);64 assert_ok!(TemplateModule::create_collection(65 origin1.clone(),66 col_name1.clone(),67 col_desc1.clone(),68 token_prefix1.clone(),69 mode70 ));71 assert_eq!(TemplateModule::collection(1).owner, 1);7273 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));74 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);75 assert_eq!(TemplateModule::balance_count(1,1), 1000);76 assert_eq!(TemplateModule::address_tokens(1,1), [1]);77 });78}7980#[test]81fn transfer_fungible_item() {82 new_test_ext().execute_with(|| {83 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();84 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();85 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();86 let mode: CollectionMode = CollectionMode::Fungible(3);8788 let origin1 = Origin::signed(1);89 let origin2 = Origin::signed(2);90 assert_ok!(TemplateModule::create_collection(91 origin1.clone(),92 col_name1.clone(),93 col_desc1.clone(),94 token_prefix1.clone(),95 mode96 ));97 assert_eq!(TemplateModule::collection(1).owner, 1);9899 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));100 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);101 assert_eq!(TemplateModule::balance_count(1,1), 1000);102 assert_eq!(TemplateModule::address_tokens(1,1), [1]);103104 // change owner scenario105 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));106 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 2);107 assert_eq!(TemplateModule::fungible_item_id(1,1).value, 1000);108 assert_eq!(TemplateModule::balance_count(1,1), 0);109 assert_eq!(TemplateModule::balance_count(1,2), 1000);110 assert_eq!(TemplateModule::address_tokens(1,1), []);111 assert_eq!(TemplateModule::address_tokens(1,2), [1]);112113 // 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]);130 });131}132133#[test]134fn transfer_refungible_item() {135 new_test_ext().execute_with(|| {136 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();137 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();138 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();139 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);140141 let origin1 = Origin::signed(1);142 let origin2 = Origin::signed(2);143 assert_ok!(TemplateModule::create_collection(144 origin1.clone(),145 col_name1.clone(),146 col_desc1.clone(),147 token_prefix1.clone(),148 mode149 ));150 assert_eq!(TemplateModule::collection(1).owner, 1);151152 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));153 assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());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]);157158 // 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);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]);183 });184}185186187#[test]188fn transfer_nft_item() {189 new_test_ext().execute_with(|| {190 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();191 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();192 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();193 let mode: CollectionMode = CollectionMode::NFT(2000);194195 let origin1 = Origin::signed(1);196 assert_ok!(TemplateModule::create_collection(197 origin1.clone(),198 col_name1.clone(),199 col_desc1.clone(),200 token_prefix1.clone(),201 mode202 ));203 assert_eq!(TemplateModule::collection(1).owner, 1);204205206 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));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]);210211 // default scenario212 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));213 assert_eq!(TemplateModule::nft_item_id(1,1).owner, 2);214 assert_eq!(TemplateModule::balance_count(1,1), 0);215 assert_eq!(TemplateModule::balance_count(1,2), 1);216 assert_eq!(TemplateModule::address_tokens(1,1), []);217 assert_eq!(TemplateModule::address_tokens(1,2), [1]); 218 });219}220221#[test]222fn nft_approve_and_transfer_from() {223 new_test_ext().execute_with(|| {224 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();225 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();226 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();227 let mode: CollectionMode = CollectionMode::NFT(2000);228229 let origin1 = Origin::signed(1);230 let origin2 = Origin::signed(2);231 assert_ok!(TemplateModule::create_collection(232 origin1.clone(),233 col_name1.clone(),234 col_desc1.clone(),235 token_prefix1.clone(),236 mode237 ));238 assert_eq!(TemplateModule::collection(1).owner, 1);239240241 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));242 assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());243 assert_eq!(TemplateModule::balance_count(1,1), 1);244 assert_eq!(TemplateModule::address_tokens(1,1), [1]);245246 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));253 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);254 assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 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);260 });261}262263#[test]264fn refungible_approve_and_transfer_from() {265 new_test_ext().execute_with(|| {266 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();267 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();268 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();269 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);270271 let origin1 = Origin::signed(1);272 let origin2 = Origin::signed(2);273 assert_ok!(TemplateModule::create_collection(274 origin1.clone(),275 col_name1.clone(),276 col_desc1.clone(),277 token_prefix1.clone(),278 mode279 ));280 assert_eq!(TemplateModule::collection(1).owner, 1);281282 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));283 assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());284 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 1, fraction: 1000 });285 assert_eq!(TemplateModule::balance_count(1,1), 1000);286 assert_eq!(TemplateModule::address_tokens(1,1), [1]);287288 assert_noop!(289 TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1),290 "You do not have permissions to modify this collection"291 );292293 // do approve294 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});299300 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});308 });309}310311#[test]312fn fungible_approve_and_transfer_from() {313 new_test_ext().execute_with(|| {314 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();315 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();316 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();317 let mode: CollectionMode = CollectionMode::Fungible(3);318319 let origin1 = Origin::signed(1);320 let origin2 = Origin::signed(2);321 assert_ok!(TemplateModule::create_collection(322 origin1.clone(),323 col_name1.clone(),324 col_desc1.clone(),325 token_prefix1.clone(),326 mode327 ));328 assert_eq!(TemplateModule::collection(1).owner, 1);329330 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));331 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);332 assert_eq!(TemplateModule::balance_count(1,1), 1000);333 assert_eq!(TemplateModule::address_tokens(1,1), [1]);334335 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 approve341 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));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);364 });365}366367368369370371372373374375376377378379380381382// #[test]383// fn create_collection_test() {384// new_test_ext().execute_with(|| {385// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();386// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();387// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();388389// let size = 1024;390// let origin1 = Origin::signed(1);391// assert_ok!(TemplateModule::create_collection(392// origin1.clone(),393// col_name1.clone(),394// col_desc1.clone(),395// token_prefix1.clone(),396// size397// ));398// assert_eq!(TemplateModule::collection(1).owner, 1);399// });400// }401402// #[test]403// fn change_collection_owner() {404// new_test_ext().execute_with(|| {405// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();406// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();407// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();408409// 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// }