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
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 }