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
1334 ) -> DispatchResult {1334 ) -> DispatchResult {
1335 let sender = ensure_signed(origin)?;1335 let sender = ensure_signed(origin)?;
1336 1336
1337 let target_collection = Self::get_collection(collection_id)?;1337 let collection = Self::get_collection(collection_id)?;
1338
1338 Self::token_exists(&target_collection, item_id)?;1339 Self::set_variable_meta_data_internal(sender, &collection, item_id, data)?;
1339
1340 ensure!(ChainLimit::get().custom_data_limit >= data.len() as u32, Error::<T>::TokenVariableDataLimitExceeded);
1341
1342 // Modify permissions check
1343 ensure!(Self::is_item_owner(sender.clone(), &target_collection, item_id) ||
1344 Self::is_owner_or_admin_permissions(&target_collection, sender.clone()),
1345 Error::<T>::NoPermission);
1346
1347 match target_collection.mode
1348 {
1349 CollectionMode::NFT => Self::set_nft_variable_data(&target_collection, item_id, data)?,
1350 CollectionMode::ReFungible => Self::set_re_fungible_variable_data(&target_collection, item_id, data)?,
1351 CollectionMode::Fungible(_) => fail!(Error::<T>::CantStoreMetadataInFungibleTokens),
1352 _ => fail!(Error::<T>::UnexpectedCollectionType)
1353 };
13541340
1355 Ok(())1341 Ok(())
1356 }1342 }
1821 Ok(())1807 Ok(())
1822 }1808 }
1809
1810 pub fn set_variable_meta_data_internal(
1811 sender: T::AccountId,
1812 collection: &CollectionHandle<T>,
1813 item_id: TokenId,
1814 data: Vec<u8>,
1815 ) -> DispatchResult {
1816 Self::token_exists(&collection, item_id)?;
1817
1818 ensure!(ChainLimit::get().custom_data_limit >= data.len() as u32, Error::<T>::TokenVariableDataLimitExceeded);
1819
1820 // Modify permissions check
1821 ensure!(Self::is_item_owner(sender.clone(), &collection, item_id) ||
1822 Self::is_owner_or_admin_permissions(&collection, sender.clone()),
1823 Error::<T>::NoPermission);
1824
1825 match collection.mode
1826 {
1827 CollectionMode::NFT => Self::set_nft_variable_data(&collection, item_id, data)?,
1828 CollectionMode::ReFungible => Self::set_re_fungible_variable_data(&collection, item_id, data)?,
1829 CollectionMode::Fungible(_) => fail!(Error::<T>::CantStoreMetadataInFungibleTokens),
1830 _ => fail!(Error::<T>::UnexpectedCollectionType)
1831 };
1832
1833 Ok(())
1834 }
18231835
1824 pub fn create_multiple_items_internal(1836 pub fn create_multiple_items_internal(
1825 sender: T::AccountId,1837 sender: T::AccountId,
modifiedruntime/src/chain_extension.rsdiffbeforeafterboth
--- a/runtime/src/chain_extension.rs
+++ b/runtime/src/chain_extension.rs
@@ -60,6 +60,13 @@
     pub amount: u128,
 }
 
+#[derive(Debug, PartialEq, Encode, Decode)]
+pub struct NFTExtSetVariableMetaData {
+    pub collection_id: u32,
+    pub item_id: u32,
+    pub data: Vec<u8>,   
+}
+
 /// The chain Extension of NFT pallet
 pub struct NFTExtension;
 
@@ -153,6 +160,21 @@
                 )?;
                 Ok(RetVal::Converging(func_id))
             },
+            5 => {
+                // Set variable metadata
+                let mut env = env.buf_in_buf_out();
+                let input: NFTExtSetVariableMetaData = env.read_as()?;
+
+                let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
+
+                pallet_nft::Module::<C>::set_variable_meta_data_internal(
+                    env.ext().address().clone(),
+                    &collection,
+                    input.item_id,
+                    input.data,
+                )?;
+                Ok(RetVal::Converging(func_id))
+            },
             _ => {
                 panic!("Passed unknown func_id to test chain extension: {}", func_id);
             }