--- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -24,6 +24,9 @@ pub struct CollectionType { pub owner: AccountId, pub next_item_id: u64, + pub name: Vec, // 64 include null escape char + pub description: Vec, // 256 include null escape char + pub token_trefix: Vec, // 16 include null escape char pub custom_data_size: u32, } @@ -79,7 +82,9 @@ where AccountId = ::AccountId, { - Created(u32, AccountId), + Created(u64, AccountId), + ItemCreated(u64), + ItemDestroyed(u64, u64), } ); @@ -91,10 +96,6 @@ // Initializing events // this is needed only if you are using events in your pallet fn deposit_event() = default; - - // Initializing events - // this is needed only if you are using events in your module - // fn deposit_event() = default; // Create collection of NFT with given parameters // @@ -106,10 +107,28 @@ // @param customDataSz size of custom data in each collection item // returns collection ID #[weight = 0] - pub fn create_collection(origin, custom_data_sz: u32) -> DispatchResult { + pub fn create_collection( origin, + collection_name: Vec, + collection_description: Vec, + token_prefix: Vec, + custom_data_sz: u32) -> DispatchResult { + // Anyone can create a collection let who = ensure_signed(origin)?; + // check params + let mut name = collection_name.to_vec(); + name.push(0); + ensure!(name.len() <= 64, "Collection name can not be longer than 63 char"); + + let mut description = collection_description.to_vec(); + description.push(0); + ensure!(name.len() <= 256, "Collection description can not be longer than 255 char"); + + let mut token_trefix = token_prefix.to_vec(); + token_trefix.push(0); + ensure!(token_trefix.len() <= 16, "Token prefix can not be longer than 15 char"); + // Generate next collection ID let next_id = NextCollectionID::get(); @@ -117,7 +136,10 @@ // Create new collection let new_collection = CollectionType { - owner: who, + owner: who.clone(), + name: name, + description: description, + token_trefix: token_trefix, next_item_id: next_id, custom_data_size: custom_data_sz, }; @@ -125,6 +147,9 @@ // Add new collection to map >::insert(next_id, new_collection); + // call event + Self::deposit_event(RawEvent::Created(next_id, who.clone())); + Ok(()) } @@ -252,6 +277,9 @@ ::insert(collection_id, current_index); >::insert((collection_id, current_index), new_item); + // call event + Self::deposit_event(RawEvent::ItemCreated(collection_id)); + Ok(()) } @@ -286,6 +314,9 @@ let new_balance = >::get((collection_id, item.owner.clone())) - 1; >::insert((collection_id, item.owner.clone()), new_balance); + // call event + Self::deposit_event(RawEvent::ItemDestroyed(collection_id, item_id)); + Ok(()) } --- a/pallets/nft/src/mock.rs +++ b/pallets/nft/src/mock.rs @@ -30,7 +30,7 @@ pub const MaximumBlockWeight: Weight = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); - pub MaximumExtrinsicWeight: Weight = 10 * WEIGHT_PER_SECOND; + pub const MaximumExtrinsicWeight: Weight = 10 * WEIGHT_PER_SECOND; } impl system::Trait for Test { --- a/pallets/nft/src/tests.rs +++ b/pallets/nft/src/tests.rs @@ -5,9 +5,14 @@ #[test] fn create_collection_test() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_eq!(TemplateModule::collection(1).owner, 1); }); } @@ -15,10 +20,15 @@ #[test] fn change_collection_owner() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_ok!(TemplateModule::change_collection_owner( origin1.clone(), 1, @@ -31,10 +41,14 @@ #[test] fn destroy_collection() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); let size = 1024; let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1)); }); } @@ -42,11 +56,16 @@ #[test] fn create_item() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); assert_ok!(TemplateModule::create_item( origin2.clone(), @@ -62,11 +81,16 @@ #[test] fn burn_item() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); assert_ok!(TemplateModule::create_item( origin2.clone(), @@ -91,14 +115,19 @@ #[test] fn add_collection_admin() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); let origin3 = Origin::signed(3); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin2.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin3.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin2.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin3.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_eq!(TemplateModule::collection(1).owner, 1); assert_eq!(TemplateModule::collection(2).owner, 2); @@ -116,14 +145,19 @@ #[test] fn remove_collection_admin() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); let origin3 = Origin::signed(3); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin2.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin3.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin2.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin3.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_eq!(TemplateModule::collection(1).owner, 1); assert_eq!(TemplateModule::collection(2).owner, 2); @@ -149,14 +183,19 @@ #[test] fn balance_of() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); let origin3 = Origin::signed(3); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin2.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin3.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin2.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin3.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_eq!(TemplateModule::collection(1).owner, 1); assert_eq!(TemplateModule::collection(2).owner, 2); @@ -181,14 +220,19 @@ #[test] fn transfer() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); let origin3 = Origin::signed(3); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin2.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin3.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin2.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin3.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_eq!(TemplateModule::collection(1).owner, 1); assert_eq!(TemplateModule::collection(2).owner, 2); @@ -214,14 +258,19 @@ #[test] fn approve() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); let origin3 = Origin::signed(3); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin2.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin3.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin2.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin3.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_eq!(TemplateModule::collection(1).owner, 1); assert_eq!(TemplateModule::collection(2).owner, 2); @@ -243,14 +292,19 @@ #[test] fn get_approved() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); let origin3 = Origin::signed(3); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin2.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin3.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin2.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin3.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_eq!(TemplateModule::collection(1).owner, 1); assert_eq!(TemplateModule::collection(2).owner, 2); @@ -272,14 +326,19 @@ #[test] fn transfer_from() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); let origin3 = Origin::signed(3); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin2.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin3.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin2.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin3.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_eq!(TemplateModule::collection(1).owner, 1); assert_eq!(TemplateModule::collection(2).owner, 2); @@ -301,14 +360,19 @@ #[test] fn index_list() { new_test_ext().execute_with(|| { + + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + let size = 1024; let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); let origin3 = Origin::signed(3); - assert_ok!(TemplateModule::create_collection(origin1.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin2.clone(), size)); - assert_ok!(TemplateModule::create_collection(origin3.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin2.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); + assert_ok!(TemplateModule::create_collection(origin3.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), size)); assert_eq!(TemplateModule::collection(1).owner, 1); assert_eq!(TemplateModule::collection(2).owner, 2);