difftreelog
Transfer checks fix
in: master
2 files changed
pallets/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
pallets/nft/src/tests.rsdiffbeforeafterboth330 // do approve330 // do approve331 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 approve401 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: 100000000432 }432 }433 );433 );472 // do approve472 // do approve473 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: 100000000504 }504 }505 );505 );