git.delta.rocks / unique-network / refs/commits / 13a0a851fa96

difftreelog

feat set_variable_meta_data chain extension

Yaroslav Bolyukin2021-05-06parent: #3c083fe.patch.diff
in: master

2 files changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -1334,23 +1334,9 @@
         ) -> DispatchResult {
             let sender = ensure_signed(origin)?;
             
-            let target_collection = Self::get_collection(collection_id)?;
-            Self::token_exists(&target_collection, item_id)?;
-
-            ensure!(ChainLimit::get().custom_data_limit >= data.len() as u32, Error::<T>::TokenVariableDataLimitExceeded);
-
-            // Modify permissions check
-            ensure!(Self::is_item_owner(sender.clone(), &target_collection, item_id) ||
-                Self::is_owner_or_admin_permissions(&target_collection, sender.clone()),
-                Error::<T>::NoPermission);
+            let collection = Self::get_collection(collection_id)?;
 
-            match target_collection.mode
-            {
-                CollectionMode::NFT => Self::set_nft_variable_data(&target_collection, item_id, data)?,
-                CollectionMode::ReFungible  => Self::set_re_fungible_variable_data(&target_collection, item_id, data)?,
-                CollectionMode::Fungible(_) => fail!(Error::<T>::CantStoreMetadataInFungibleTokens),
-                _ => fail!(Error::<T>::UnexpectedCollectionType)
-            };
+            Self::set_variable_meta_data_internal(sender, &collection, item_id, data)?;
 
             Ok(())
         }
@@ -1821,6 +1807,32 @@
 		Ok(())
 	}
 
+    pub fn set_variable_meta_data_internal(
+        sender: T::AccountId,
+        collection: &CollectionHandle<T>, 
+        item_id: TokenId,
+        data: Vec<u8>,
+    ) -> DispatchResult {
+        Self::token_exists(&collection, item_id)?;
+
+        ensure!(ChainLimit::get().custom_data_limit >= data.len() as u32, Error::<T>::TokenVariableDataLimitExceeded);
+
+        // Modify permissions check
+        ensure!(Self::is_item_owner(sender.clone(), &collection, item_id) ||
+            Self::is_owner_or_admin_permissions(&collection, sender.clone()),
+            Error::<T>::NoPermission);
+
+        match collection.mode
+        {
+            CollectionMode::NFT => Self::set_nft_variable_data(&collection, item_id, data)?,
+            CollectionMode::ReFungible  => Self::set_re_fungible_variable_data(&collection, item_id, data)?,
+            CollectionMode::Fungible(_) => fail!(Error::<T>::CantStoreMetadataInFungibleTokens),
+            _ => fail!(Error::<T>::UnexpectedCollectionType)
+        };
+
+        Ok(())
+    }
+
     pub fn create_multiple_items_internal(
         sender: T::AccountId,
         collection: &CollectionHandle<T>,
modifiedruntime/src/chain_extension.rsdiffbeforeafterboth
60 pub amount: u128,60 pub amount: u128,
61}61}
62
63#[derive(Debug, PartialEq, Encode, Decode)]
64pub struct NFTExtSetVariableMetaData {
65 pub collection_id: u32,
66 pub item_id: u32,
67 pub data: Vec<u8>,
68}
6269
63/// The chain Extension of NFT pallet70/// The chain Extension of NFT pallet
64pub struct NFTExtension;71pub struct NFTExtension;
153 )?;160 )?;
154 Ok(RetVal::Converging(func_id))161 Ok(RetVal::Converging(func_id))
155 },162 },
163 5 => {
164 // Set variable metadata
165 let mut env = env.buf_in_buf_out();
166 let input: NFTExtSetVariableMetaData = env.read_as()?;
167
168 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
169
170 pallet_nft::Module::<C>::set_variable_meta_data_internal(
171 env.ext().address().clone(),
172 &collection,
173 input.item_id,
174 input.data,
175 )?;
176 Ok(RetVal::Converging(func_id))
177 },
156 _ => {178 _ => {
157 panic!("Passed unknown func_id to test chain extension: {}", func_id);179 panic!("Passed unknown func_id to test chain extension: {}", func_id);
158 }180 }