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

difftreelog

Transfer checks fix

str-mv2020-09-30parent: #5c8bf09.patch.diff
in: master

2 files changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -562,14 +562,16 @@
 
             let sender = ensure_signed(origin)?;
             Self::collection_exists(collection_id)?;
-            let item_owner = Self::is_item_owner(sender.clone(), collection_id, item_id);
-            if !item_owner
-            {
-                if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {  
-                    Self::check_white_list(collection_id, sender.clone())?;
-                }
+
+            // Transfer permissions check
+            let target_collection = <Collection<T>>::get(collection_id);
+            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || 
+                Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 
+                "Only item owner, collection owner and admins can modify item");
+
+            if target_collection.access == AccessMode::WhiteList {
+                Self::check_white_list(collection_id, sender.clone())?;
             }
-            let target_collection = <Collection<T>>::get(collection_id);
 
             match target_collection.mode
             {
@@ -590,14 +592,15 @@
 
             let sender = ensure_signed(origin)?;
 
-            // Check access and mint mode 
+            // Transfer permissions check
             let target_collection = <Collection<T>>::get(collection_id);
-            if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {
+            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || 
+                Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 
+                "Only item owner, collection owner and admins can modify item");
 
+            if target_collection.access == AccessMode::WhiteList {
                 Self::check_white_list(collection_id, sender.clone())?;
                 Self::check_white_list(collection_id, recipient.clone())?;
-                ensure!(target_collection.access == AccessMode::WhiteList, "Collection must have WhiteList access");
-                ensure!(target_collection.mint_mode == true, "Collection must be in mint mode");
             }
 
             match target_collection.mode
@@ -616,14 +619,20 @@
 
             let sender = ensure_signed(origin)?;
 
-            // amount param stub
-            let amount = 100000000;
+            // Transfer permissions check
+            let target_collection = <Collection<T>>::get(collection_id);
+            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || 
+                Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 
+                "Only item owner, collection owner and admins can approve");
 
-            let item_owner = Self::is_item_owner(sender.clone(), collection_id, item_id);
-            if !item_owner {
+            if target_collection.access == AccessMode::WhiteList {
+                Self::check_white_list(collection_id, sender.clone())?;
                 Self::check_white_list(collection_id, approved.clone())?;
             }
 
+            // amount param stub
+            let amount = 100000000;
+
             let list_exists = <ApprovedList<T>>::contains_key(collection_id, (item_id, sender.clone()));
             if list_exists {
 
@@ -648,22 +657,24 @@
         pub fn transfer_from(origin, from: T::AccountId, recipient: T::AccountId, collection_id: u64, item_id: u64, value: u64 ) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
-            let approved_list_exists = <ApprovedList<T>>::contains_key(collection_id, (item_id, from.clone()));
-            ensure!(approved_list_exists, "Only approved addresses can call this method");
+            let mut appoved_transfer = false;
 
-            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");
+            // Check approve
+            if <ApprovedList<T>>::contains_key(collection_id, (item_id, from.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());
+                appoved_transfer = opt_item.is_some();
+                ensure!(opt_item.unwrap().amount >= value, "Requested value more than approved");
+            }
 
-            // Check access and mint mode 
+            // Transfer permissions check
             let target_collection = <Collection<T>>::get(collection_id);
-            if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {
+            ensure!(appoved_transfer || Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 
+                "Only item owner, collection owner and admins can modify items");
 
+            if target_collection.access == AccessMode::WhiteList {
                 Self::check_white_list(collection_id, sender.clone())?;
                 Self::check_white_list(collection_id, recipient.clone())?;
-                ensure!(target_collection.access == AccessMode::WhiteList, "Collection must have WhiteList access");
-                ensure!(target_collection.mint_mode == true, "Collection must be in mint mode");
             }
 
             // remove approve
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
330 // do approve330 // do approve
331 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));331 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
332 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);332 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);
333 assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 1));333 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));
334 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);334 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);
335 assert_eq!(335 assert_eq!(
336 TemplateModule::approved(1, (1, 1))[0],336 TemplateModule::approved(1, (1, 1))[0],
400 // do approve400 // do approve
401 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));401 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
402 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);402 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);
403 assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 1));403 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));
404 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);404 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);
405 assert_eq!(405 assert_eq!(
406 TemplateModule::approved(1, (1, 1))[0],406 TemplateModule::approved(1, (1, 1))[0],
427 assert_eq!(427 assert_eq!(
428 TemplateModule::approved(1, (1, 1))[0],428 TemplateModule::approved(1, (1, 1))[0],
429 ApprovePermissions {429 ApprovePermissions {
430 approved: 10,430 approved: 3,
431 amount: 100000000431 amount: 100000000
432 }432 }
433 );433 );
472 // do approve472 // do approve
473 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));473 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
474 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);474 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);
475 assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 1));475 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));
476 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);476 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);
477 assert_eq!(477 assert_eq!(
478 TemplateModule::approved(1, (1, 1))[0],478 TemplateModule::approved(1, (1, 1))[0],
499 assert_eq!(499 assert_eq!(
500 TemplateModule::approved(1, (1, 1))[0],500 TemplateModule::approved(1, (1, 1))[0],
501 ApprovePermissions {501 ApprovePermissions {
502 approved: 10,502 approved: 3,
503 amount: 100000000503 amount: 100000000
504 }504 }
505 );505 );