git.delta.rocks / unique-network / refs/commits / 424f9cb7a9fa

difftreelog

Resolved merge conflicts.

sotmorskiy2020-11-26parent: #5ecbc86.patch.diff
in: master

3 files changed

modifiedpallets/nft/src/benchmarking.rsdiffbeforeafterboth
--- a/pallets/nft/src/benchmarking.rs
+++ b/pallets/nft/src/benchmarking.rs
@@ -165,7 +165,7 @@
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
             let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
-            let nft_data = CreateNftData {
+            let mut nft_data = CreateNftData {
                 const_data: vec![],
                 variable_data: vec![]
             };
@@ -173,7 +173,7 @@
                 nft_data.const_data.push(10);
                 nft_data.variable_data.push(10);
             }
-            let mut data = CreateItemData::NFT(nft_data);
+            let data = CreateItemData::NFT(nft_data);
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
 
         }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -837,8 +837,8 @@
             let target_collection = <Collection<T>>::get(collection_id);
 
             Self::can_create_items_in_collection(collection_id, &target_collection, &sender, &owner)?;
-            Self::validate_create_item_args(&target_collection, &properties)?;
-            Self::create_item_no_validation(collection_id, &target_collection, &properties, &owner)?;
+            Self::validate_create_item_args(&target_collection, &data)?;
+            Self::create_item_no_validation(collection_id, &target_collection, owner, data)?;
 
             Ok(())
         }
@@ -858,13 +858,15 @@
         /// 
         /// * collection_id: ID of the collection.
         /// 
-        /// * properties: Array items properties. Each property is an array of bytes itself, see [create_item].
+        /// * itemsData: Array items properties. Each property is an array of bytes itself, see [create_item].
         /// 
         /// * owner: Address, initial owner of the NFT.
-        #[weight = 0]
-        pub fn create_multiple_items(origin, collection_id: u64, properties: Vec<Vec<u8>>, owner: T::AccountId) -> DispatchResult {
+        #[weight = T::WeightInfo::create_item(items_data.into_iter()
+                               .map(|data| { data.len() })
+                               .sum())]
+        pub fn create_multiple_items(origin, collection_id: u64, owner: T::AccountId, items_data: Vec<CreateItemData>) -> DispatchResult {
 
-            ensure!(properties.len() > 0, "Length of items properties must be greater than 0.");
+            ensure!(items_data.len() > 0, "Length of items properties must be greater than 0.");
             let sender = ensure_signed(origin)?;
 
             Self::collection_exists(collection_id)?;
@@ -872,11 +874,11 @@
 
             Self::can_create_items_in_collection(collection_id, &target_collection, &sender, &owner)?;
 
-            for prop in &properties {
-                Self::validate_create_item_args(&target_collection, prop)?;
+            for data in &items_data {
+                Self::validate_create_item_args(&target_collection, data)?;
             }
-            for prop in &properties {
-                Self::create_item_no_validation(collection_id, &target_collection, prop, &owner)?;
+            for data in &items_data {
+                Self::create_item_no_validation(collection_id, &target_collection, owner.clone(), data.clone())?;
             }
 
             Ok(())
@@ -1289,61 +1291,64 @@
 
         Ok(())
     }
-
-    fn validate_create_item_args(collection: &CollectionType<T::AccountId>, properties: &Vec<u8>) -> DispatchResult {
 
-        match collection.mode
+    fn validate_create_item_args(target_collection: &CollectionType<T::AccountId>, data: &CreateItemData) -> DispatchResult {
+        match target_collection.mode
         {
-            CollectionMode::NFT(_) => {
-
-                // check size
-                ensure!(collection.custom_data_size >= properties.len() as u32, "Size of item is too large")
+            CollectionMode::NFT => {
+                if let CreateItemData::NFT(data) = data {
+                    // check sizes
+                    ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, "const_data exceeded data limit.");
+                    ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, "variable_data exceeded data limit.");
+                } else {
+                    fail!("Not NFT item data used to mint in NFT collection.");
+                }
             },
             CollectionMode::Fungible(_) => {
-
-                // check size
-                ensure!(properties.len() as u32 == 0, "Size of item must be 0 with fungible type")
+                if let CreateItemData::Fungible(_) = data {
+                } else {
+                    fail!("Not Fungible item data used to mint in Fungible collection.");
+                }
             },
-            CollectionMode::ReFungible(_, _) => {
+            CollectionMode::ReFungible(_) => {
+                if let CreateItemData::ReFungible(data) = data {
 
-                // check size
-                ensure!(collection.custom_data_size >= properties.len() as u32, "Size of item is too large")
+                    // check sizes
+                    ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, "const_data exceeded data limit.");
+                    ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, "variable_data exceeded data limit.");
+                } else {
+                    fail!("Not Re Fungible item data used to mint in Re Fungible collection.");
+                }
             },
-            _ => {
-                fail!("Unexpected collection mode")
-            }
-        }
+            _ => { fail!("Unexpected collection type."); }
+        };
 
         Ok(())
     }
 
-    fn create_item_no_validation(collection_id: u64, collection: &CollectionType<T::AccountId>, properties: &Vec<u8>, owner: &T::AccountId) -> DispatchResult {
-        match collection.mode
+    fn create_item_no_validation(collection_id: u64, collection: &CollectionType<T::AccountId>, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
+        match data
         {
-            CollectionMode::NFT(_) => {
-
-                // Create nft item
+            CreateItemData::NFT(data) => {
                 let item = NftItemType {
                     collection: collection_id,
-                    owner: owner.clone(),
-                    data: properties.clone(),
+                    owner,
+                    const_data: data.const_data,
+                    variable_data: data.variable_data
                 };
 
                 Self::add_nft_item(item)?;
-
             },
-            CollectionMode::Fungible(_) => {
-
+            CreateItemData::Fungible(_) => {
                 let item = FungibleItemType {
                     collection: collection_id,
-                    owner: owner.clone(),
+                    owner,
                     value: (10 as u128).pow(collection.decimal_points)
                 };
 
                 Self::add_fungible_item(item)?;
             },
-            CollectionMode::ReFungible(_, _) => {
-
+            CreateItemData::ReFungible(data) => {
                 let mut owner_list = Vec::new();
                 let value = (10 as u128).pow(collection.decimal_points);
                 owner_list.push(Ownership {owner: owner.clone(), fraction: value});
@@ -1351,15 +1356,15 @@
                 let item = ReFungibleItemType {
                     collection: collection_id,
                     owner: owner_list,
-                    data: properties.clone()
+                    const_data: data.const_data,
+                    variable_data: data.variable_data
                 };
 
                 Self::add_refungible_item(item)?;
-            },
-            _ => { ensure!(1 == 0,"just error"); }
-
+            }
         };
 
+
         // call event
         Self::deposit_event(RawEvent::ItemCreated(collection_id, <ItemListIndex>::get(collection_id)));
 
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
92#[test]92#[test]
93fn create_nft_multiple_items() {93fn create_nft_multiple_items() {
94 new_test_ext().execute_with(|| {94 new_test_ext().execute_with(|| {
95 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();95 default_limits();
96 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();96
97 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
98 let mode: CollectionMode = CollectionMode::NFT(2000);97 create_test_collection(&CollectionMode::NFT, 1);
99
100 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
101 collection_numbers_limit: 10,
102 account_token_ownership_limit: 10,
103 collections_admins_limit: 5,
104 custom_data_limit: 2048,
105 nft_sponsor_transfer_timeout: 15,
106 fungible_sponsor_transfer_timeout: 15,
107 refungible_sponsor_transfer_timeout: 15,
108 }));
10998
110 let origin1 = Origin::signed(1);99 let origin1 = Origin::signed(1);
111 assert_ok!(TemplateModule::create_collection(
112 origin1.clone(),
113 col_name1.clone(),
114 col_desc1.clone(),
115 token_prefix1.clone(),
116 mode
117 ));
118 assert_eq!(TemplateModule::collection(1).owner, 1);
119100
120 let properties = [[1, 2, 3].to_vec(), [3, 2, 1].to_vec(), [3, 3, 3].to_vec()].to_vec();101 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];
121102
122 assert_ok!(TemplateModule::create_multiple_items(103 assert_ok!(TemplateModule::create_multiple_items(
123 origin1.clone(),104 origin1.clone(),
124 1,105 1,
106 1,
125 properties.clone(),107 items_data.clone().into_iter().map(|d| { d.into() }).collect()
126 1
127 ));108 ));
128 for (index, data) in properties.iter().enumerate() {109 for (index, data) in items_data.iter().enumerate() {
129 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as u64).data, *data);110 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as u64).const_data.to_vec(), data.const_data);
111 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as u64).variable_data.to_vec(), data.variable_data);
130 }112 }
131 });113 });
132}114}
160#[test]142#[test]
161fn create_multiple_refungible_items() {143fn create_multiple_refungible_items() {
162 new_test_ext().execute_with(|| {144 new_test_ext().execute_with(|| {
163 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();145 default_limits();
164 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();146
165 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
166 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);147 create_test_collection(&CollectionMode::ReFungible(3), 1);
167
168 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
169 collection_numbers_limit: 10,
170 account_token_ownership_limit: 10,
171 collections_admins_limit: 5,
172 custom_data_limit: 2048,
173 nft_sponsor_transfer_timeout: 15,
174 fungible_sponsor_transfer_timeout: 15,
175 refungible_sponsor_transfer_timeout: 15,
176 }));
177148
178 let origin1 = Origin::signed(1);149 let origin1 = Origin::signed(1);
179 assert_ok!(TemplateModule::create_collection(
180 origin1.clone(),
181 col_name1.clone(),
182 col_desc1.clone(),
183 token_prefix1.clone(),
184 mode
185 ));
186 assert_eq!(TemplateModule::collection(1).owner, 1);
187150
188 let properties = [[1, 2, 3].to_vec(), [3, 2, 1].to_vec(), [3, 3, 3].to_vec()].to_vec();151 let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];
189152
190 assert_ok!(TemplateModule::create_multiple_items(153 assert_ok!(TemplateModule::create_multiple_items(
191 origin1.clone(),154 origin1.clone(),
192 1,155 1,
156 1,
193 properties.clone(),157 items_data.clone().into_iter().map(|d| { d.into() }).collect()
194 1
195 ));158 ));
196 for (index, data) in properties.iter().enumerate() {159 for (index, data) in items_data.iter().enumerate() {
197160
198 let item = TemplateModule::refungible_item_id(1, (index + 1) as u64);161 let item = TemplateModule::refungible_item_id(1, (index + 1) as u64);
199 assert_eq!(item.data, *data);162 assert_eq!(item.const_data.to_vec(), data.const_data);
163 assert_eq!(item.variable_data.to_vec(), data.variable_data);
200 assert_eq!(164 assert_eq!(
201 item.owner[0],165 item.owner[0],
202 Ownership {166 Ownership {
225#[test]189#[test]
226fn create_multiple_fungible_items() {190fn create_multiple_fungible_items() {
227 new_test_ext().execute_with(|| {191 new_test_ext().execute_with(|| {
228 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();192 default_limits();
229 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();193
230 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
231 let mode: CollectionMode = CollectionMode::Fungible(3);194 create_test_collection(&CollectionMode::Fungible(3), 1);
232
233 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
234 collection_numbers_limit: 10,
235 account_token_ownership_limit: 10,
236 collections_admins_limit: 5,
237 custom_data_limit: 2048,
238 nft_sponsor_transfer_timeout: 15,
239 fungible_sponsor_transfer_timeout: 15,
240 refungible_sponsor_transfer_timeout: 15,
241 }));
242195
243 let origin1 = Origin::signed(1);196 let origin1 = Origin::signed(1);
244 assert_ok!(TemplateModule::create_collection(
245 origin1.clone(),
246 col_name1.clone(),
247 col_desc1.clone(),
248 token_prefix1.clone(),
249 mode
250 ));
251 assert_eq!(TemplateModule::collection(1).owner, 1);
252197
253 let properties = [[].to_vec(), [].to_vec(), [].to_vec()].to_vec();198 let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];
254199
255 assert_ok!(TemplateModule::create_multiple_items(200 assert_ok!(TemplateModule::create_multiple_items(
256 origin1.clone(),201 origin1.clone(),
257 1,202 1,
203 1,
258 properties.clone(),204 items_data.clone().into_iter().map(|d| { d.into() }).collect()
259 1
260 ));205 ));
261 206
262 for (index, _) in properties.iter().enumerate() {207 for (index, _) in items_data.iter().enumerate() {
263 assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as u64).owner, 1);208 assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as u64).owner, 1);
264 }209 }
265 assert_eq!(TemplateModule::balance_count(1, 1), 3000);210 assert_eq!(TemplateModule::balance_count(1, 1), 3000);
14711416
1472 assert_noop!(1417 assert_noop!(
1473 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1418 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),
1474 "Public minting is not allowed for this collection."1419 "Public minting is not allowed for this collection"
1475 );1420 );
1476 });1421 });
1477}1422}
15001445
1501 assert_noop!(1446 assert_noop!(
1502 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1447 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),
1503 "Public minting is not allowed for this collection."1448 "Public minting is not allowed for this collection"
1504 );1449 );
1505 });1450 });
1506}1451}