git.delta.rocks / unique-network / refs/commits / 4a5e4b087a97

difftreelog

Merge branch 'master' of github.com:usetech-llc/nft_parachain

Greg Zaitsev2020-05-28parents: #f2aa62c #bb1c5f7.patch.diff
in: master

2 files changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -72,7 +72,7 @@
 		/// Balance owner per collection map
 		pub Balance get(balance_count): map hasher(blake2_128_concat) (u64, T::AccountId) => u64;
 
-		/// Item double map (collection)
+		pub ApprovedList get(approved): map hasher(blake2_128_concat) (u64, u64) => Vec<T::AccountId>;
 		pub ItemList get(item_id): map hasher(blake2_128_concat) (u64, u64) => NftItemType<T::AccountId>;
 		pub ItemListIndex get(item_index): map hasher(blake2_128_concat) u64 => u64;
 	}
@@ -323,7 +323,92 @@
 			item.owner = new_owner;
 			<ItemList<T>>::insert((collection_id, item_id), item);
 
+			// reset approved list
+			let itm: Vec<T::AccountId> = Vec::new();
+			<ApprovedList<T>>::insert((collection_id, item_id), itm);
+
+			Ok(())
+		}
+
+		#[weight = frame_support::weights::SimpleDispatchInfo::default()]
+		pub fn approve(origin, approved: T::AccountId, collection_id: u64, item_id: u64) -> DispatchResult {
+
+			let sender = ensure_signed(origin)?;
+			ensure!(<Collection<T>>::contains_key(collection_id), "This collection does not exist");
+
+			let target_collection = <Collection<T>>::get(collection_id);
+			let is_owner = sender == target_collection.owner;
+
+			ensure!(<ItemList<T>>::contains_key((collection_id, item_id)), "Item does not exists");
+			let item = <ItemList<T>>::get((collection_id, item_id));
+
+			if !is_owner 
+			{
+				// check if item owner
+				if item.owner != sender 
+				{
+					let no_perm_mes = "You do not have permissions to modify this collection";
+
+					ensure!(<AdminList<T>>::contains_key(collection_id), no_perm_mes);
+					ensure!(<AdminList<T>>::get(collection_id).contains(&sender), no_perm_mes);
+				}
+			}
+
+			let list_exists = <ApprovedList<T>>::contains_key((collection_id, item_id));
+			if list_exists {
+				
+				let mut list = <ApprovedList<T>>::get((collection_id, item_id));
+				let item_contains = list.contains(&approved.clone());
 
+				if !item_contains {
+					list.push(approved.clone());
+				} 
+			} else {
+				
+				let mut itm = Vec::new();
+				itm.push(approved.clone());
+				<ApprovedList<T>>::insert((collection_id, item_id), itm);
+			}
+
+			Ok(())
+		}
+
+		#[weight = frame_support::weights::SimpleDispatchInfo::default()]
+		pub fn transfer_from(origin, collection_id: u64, item_id: u64, new_owner: T::AccountId) -> DispatchResult {
+
+			// let sender = ensure_signed(origin)?;
+			// ensure!(<Collection<T>>::contains_key(collection_id), "This collection does not exist");
+
+			// let target_collection = <Collection<T>>::get(collection_id);
+			// let is_owner = sender == target_collection.owner;
+
+			// ensure!(<ItemList<T>>::contains_key((collection_id, item_id)), "Item does not exists");
+			// let mut item = <ItemList<T>>::get((collection_id, item_id));
+
+			// if !is_owner 
+			// {
+			// 	let no_perm_mes = "You do not have permissions to modify this collection";
+
+			// 	// check if item owner
+			// 	if item.owner != sender 
+			// 	{
+			// 		ensure!(<AdminList<T>>::contains_key(collection_id), no_perm_mes);
+			// 		ensure!(<AdminList<T>>::get(collection_id).contains(&sender), no_perm_mes);
+			// 	}
+
+			// 	ensure!(<ApprovedList<T>>::contains_key((collection_id, item_id)), no_perm_mes);
+			// 	let list_itm = <ApprovedList<T>>::get((collection_id, item_id));
+			// 	ensure!(list_itm.contains(&new_owner.clone()), no_perm_mes);
+
+			// }
+
+
+			let no_perm_mes = "You do not have permissions to modify this collection";
+			ensure!(<ApprovedList<T>>::contains_key((collection_id, item_id)), no_perm_mes);
+			let list_itm = <ApprovedList<T>>::get((collection_id, item_id));
+			ensure!(list_itm.contains(&new_owner.clone()), no_perm_mes);
+
+			Self::transfer(origin, collection_id, item_id, new_owner);
 
 			Ok(())
 		}
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
before · pallets/nft/src/tests.rs
1// Tests to be written here2use crate::{ mock::*};3use frame_support::{assert_ok, assert_noop};45#[test]6fn create_collection_test() {7    new_test_ext().execute_with(|| {8        let size = 1024;9        let origin1 = Origin::signed(1);10        assert_ok!(TemplateModule::create_collection(origin1.clone(), size));11        assert_eq!(TemplateModule::collection(1).owner, 1);12    });13}1415#[test]16fn change_collection_owner() {17	new_test_ext().execute_with(|| {18        let size = 1024;19        let origin1 = Origin::signed(1);2021        assert_ok!(TemplateModule::create_collection(origin1.clone(), size));22        assert_ok!(TemplateModule::change_collection_owner(origin1.clone(), 1, 2));23        assert_eq!(TemplateModule::collection(1).owner, 2);24	});25}2627#[test]28fn destroy_collection() {29	new_test_ext().execute_with(|| {30        let size = 1024;31        let origin1 = Origin::signed(1);3233        assert_ok!(TemplateModule::create_collection(origin1.clone(), size));34        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));35	});36}3738#[test]39fn create_item() {40	new_test_ext().execute_with(|| {41        let size = 1024;42        let origin1 = Origin::signed(1);43        let origin2 = Origin::signed(2);4445        assert_ok!(TemplateModule::create_collection(origin1.clone(), size));46        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));47        assert_ok!(TemplateModule::create_item(origin2.clone(), 1, [1,1,1].to_vec()));4849        // check balance (collection with id = 1, user id = 2)50        assert_eq!(TemplateModule::balance_count((1, 2)), 1);51	});52}5354#[test]55fn burn_item() {56	new_test_ext().execute_with(|| {57        let size = 1024;58        let origin1 = Origin::signed(1);59        let origin2 = Origin::signed(2);6061        assert_ok!(TemplateModule::create_collection(origin1.clone(), size));62        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));63        assert_ok!(TemplateModule::create_item(origin2.clone(), 1, [1,1,1].to_vec()));6465        // check balance (collection with id = 1, user id = 2)66        assert_eq!(TemplateModule::balance_count((1, 2)), 1);6768        // burn item69        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));70        assert_noop!(TemplateModule::burn_item(origin1.clone(), 1, 1), "Item does not exists");7172        assert_eq!(TemplateModule::balance_count((1, 1)), 0);73	});74}757677#[test]78fn add_collection_admin() {79	new_test_ext().execute_with(|| {80        let size = 1024;81        let origin1 = Origin::signed(1);82        let origin2 = Origin::signed(2);83        let origin3 = Origin::signed(3);8485        assert_ok!(TemplateModule::create_collection(origin1.clone(), size));86        assert_ok!(TemplateModule::create_collection(origin2.clone(), size));87        assert_ok!(TemplateModule::create_collection(origin3.clone(), size));8889        assert_eq!(TemplateModule::collection(1).owner, 1);90        assert_eq!(TemplateModule::collection(2).owner, 2);91        assert_eq!(TemplateModule::collection(3).owner, 3);9293        // collection admin94        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));95        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));9697        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);98        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);99        });100}101102#[test]103fn remove_collection_admin() {104	new_test_ext().execute_with(|| {105        let size = 1024;106        let origin1 = Origin::signed(1);107        let origin2 = Origin::signed(2);108        let origin3 = Origin::signed(3);109110        assert_ok!(TemplateModule::create_collection(origin1.clone(), size));111        assert_ok!(TemplateModule::create_collection(origin2.clone(), size));112        assert_ok!(TemplateModule::create_collection(origin3.clone(), size));113114        assert_eq!(TemplateModule::collection(1).owner, 1);115        assert_eq!(TemplateModule::collection(2).owner, 2);116        assert_eq!(TemplateModule::collection(3).owner, 3);117118        // collection admin119        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));120        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));121122        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);123        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);124125        // remove admin126        assert_ok!(TemplateModule::remove_collection_admin(origin2.clone(), 1, 3));127        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);128        });129}130131#[test]132fn balance_of() {133	new_test_ext().execute_with(|| {134        let size = 1024;135        let origin1 = Origin::signed(1);136        let origin2 = Origin::signed(2);137        let origin3 = Origin::signed(3);138139        assert_ok!(TemplateModule::create_collection(origin1.clone(), size));140        assert_ok!(TemplateModule::create_collection(origin2.clone(), size));141        assert_ok!(TemplateModule::create_collection(origin3.clone(), size));142143        assert_eq!(TemplateModule::collection(1).owner, 1);144        assert_eq!(TemplateModule::collection(2).owner, 2);145        assert_eq!(TemplateModule::collection(3).owner, 3);146147        // check balance before148        assert_eq!(TemplateModule::balance_count((1, 1)), 0);149150        // create item151        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,1,1].to_vec()));152 153        // check balance (collection with id = 1, user id = 2)154        assert_eq!(TemplateModule::balance_count((1, 1)), 1);155        assert_eq!(TemplateModule::item_id((1,1)).owner, 1);156        });157}158159#[test]160fn transfer() {161	new_test_ext().execute_with(|| {162        let size = 1024;163        let origin1 = Origin::signed(1);164        let origin2 = Origin::signed(2);165        let origin3 = Origin::signed(3);166167        assert_ok!(TemplateModule::create_collection(origin1.clone(), size));168        assert_ok!(TemplateModule::create_collection(origin2.clone(), size));169        assert_ok!(TemplateModule::create_collection(origin3.clone(), size));170171        assert_eq!(TemplateModule::collection(1).owner, 1);172        assert_eq!(TemplateModule::collection(2).owner, 2);173        assert_eq!(TemplateModule::collection(3).owner, 3);174175        // create item176        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,1,1].to_vec()));177178        // transfer179        assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));180        assert_eq!(TemplateModule::item_id((1,1)).owner, 2);181182        // balance_of check183        assert_eq!(TemplateModule::balance_count((1, 1)), 0);184        assert_eq!(TemplateModule::balance_count((1, 2)), 1);185        });186}