difftreelog
Merge branch 'master' of github.com:usetech-llc/nft_parachain
in: master
2 files changed
pallets/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(())
}
pallets/nft/src/tests.rsdiffbeforeafterboth1// 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}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}187188#[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);195196 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));199200 assert_eq!(TemplateModule::collection(1).owner, 1);201 assert_eq!(TemplateModule::collection(2).owner, 2);202 assert_eq!(TemplateModule::collection(3).owner, 3);203204 // create item205 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,1,1].to_vec()));206207 // approve208 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));209 assert_eq!(TemplateModule::approved((1,1)).contains(&2), true);210211 });212}213214#[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);221222 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));225226 assert_eq!(TemplateModule::collection(1).owner, 1);227 assert_eq!(TemplateModule::collection(2).owner, 2);228 assert_eq!(TemplateModule::collection(3).owner, 3);229230 // create item231 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,1,1].to_vec()));232233 // approve234 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));235 assert_eq!(TemplateModule::approved((1,1)).contains(&2), true);236237 });238}239240#[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);247248 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));251252 assert_eq!(TemplateModule::collection(1).owner, 1);253 assert_eq!(TemplateModule::collection(2).owner, 2);254 assert_eq!(TemplateModule::collection(3).owner, 3);255256 // create item257 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,1,1].to_vec()));258259 // approve260 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));261 assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));262263 });264}