From 13a0a851fa9670342af61a044c1141e768913397 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Thu, 06 May 2021 13:35:05 +0000 Subject: [PATCH] feat: set_variable_meta_data chain extension --- --- 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::::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::::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::::CantStoreMetadataInFungibleTokens), - _ => fail!(Error::::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, + item_id: TokenId, + data: Vec, + ) -> DispatchResult { + Self::token_exists(&collection, item_id)?; + + ensure!(ChainLimit::get().custom_data_limit >= data.len() as u32, Error::::TokenVariableDataLimitExceeded); + + // Modify permissions check + ensure!(Self::is_item_owner(sender.clone(), &collection, item_id) || + Self::is_owner_or_admin_permissions(&collection, sender.clone()), + Error::::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::::CantStoreMetadataInFungibleTokens), + _ => fail!(Error::::UnexpectedCollectionType) + }; + + Ok(()) + } + pub fn create_multiple_items_internal( sender: T::AccountId, collection: &CollectionHandle, --- 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, +} + /// 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::::get_collection(input.collection_id)?; + + pallet_nft::Module::::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); } -- gitstuff