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
185 });185 });
186}186}
187187
188#[test]
189fn approve() {
190 new_test_ext().execute_with(|| {
191 let size = 1024;
192 let origin1 = Origin::signed(1);
193 let origin2 = Origin::signed(2);
194 let origin3 = Origin::signed(3);
195
196 assert_ok!(TemplateModule::create_collection(origin1.clone(), size));
197 assert_ok!(TemplateModule::create_collection(origin2.clone(), size));
198 assert_ok!(TemplateModule::create_collection(origin3.clone(), size));
199
200 assert_eq!(TemplateModule::collection(1).owner, 1);
201 assert_eq!(TemplateModule::collection(2).owner, 2);
202 assert_eq!(TemplateModule::collection(3).owner, 3);
203
204 // create item
205 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,1,1].to_vec()));
206
207 // approve
208 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
209 assert_eq!(TemplateModule::approved((1,1)).contains(&2), true);
210
211 });
212}
213
214#[test]
215fn get_approved() {
216 new_test_ext().execute_with(|| {
217 let size = 1024;
218 let origin1 = Origin::signed(1);
219 let origin2 = Origin::signed(2);
220 let origin3 = Origin::signed(3);
221
222 assert_ok!(TemplateModule::create_collection(origin1.clone(), size));
223 assert_ok!(TemplateModule::create_collection(origin2.clone(), size));
224 assert_ok!(TemplateModule::create_collection(origin3.clone(), size));
225
226 assert_eq!(TemplateModule::collection(1).owner, 1);
227 assert_eq!(TemplateModule::collection(2).owner, 2);
228 assert_eq!(TemplateModule::collection(3).owner, 3);
229
230 // create item
231 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,1,1].to_vec()));
232
233 // approve
234 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
235 assert_eq!(TemplateModule::approved((1,1)).contains(&2), true);
236
237 });
238}
239
240#[test]
241fn transfer_from() {
242 new_test_ext().execute_with(|| {
243 let size = 1024;
244 let origin1 = Origin::signed(1);
245 let origin2 = Origin::signed(2);
246 let origin3 = Origin::signed(3);
247
248 assert_ok!(TemplateModule::create_collection(origin1.clone(), size));
249 assert_ok!(TemplateModule::create_collection(origin2.clone(), size));
250 assert_ok!(TemplateModule::create_collection(origin3.clone(), size));
251
252 assert_eq!(TemplateModule::collection(1).owner, 1);
253 assert_eq!(TemplateModule::collection(2).owner, 2);
254 assert_eq!(TemplateModule::collection(3).owner, 3);
255
256 // create item
257 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,1,1].to_vec()));
258
259 // approve
260 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
261 assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));
262
263 });
264}