--- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -1792,6 +1792,23 @@ Ok(()) } + pub fn create_multiple_items_internal( + sender: T::AccountId, + collection: &CollectionHandle, + owner: T::AccountId, + items_data: Vec, + ) -> DispatchResult { + Self::can_create_items_in_collection(&collection, &sender, &owner, items_data.len() as u32)?; + + for data in &items_data { + Self::validate_create_item_args(&collection, data)?; + } + for data in &items_data { + Self::create_item_no_validation(&collection, owner.clone(), data.clone())?; + } + + Ok(()) + } fn is_correct_transfer(collection: &CollectionHandle, recipient: &T::AccountId) -> DispatchResult { let collection_id = collection.id; --- a/runtime/src/chain_extension.rs +++ b/runtime/src/chain_extension.rs @@ -17,8 +17,6 @@ extern crate pallet_nft; pub use pallet_nft::*; -use crate::Runtime; -use sp_runtime::AccountId32; use crate::Vec; /// Create item parameters @@ -38,6 +36,13 @@ pub amount: u128, } +#[derive(Debug, PartialEq, Encode, Decode)] +pub struct NFTExtCreateMultipleItems { + pub owner: ::AccountId, + pub collection_id: u32, + pub data: Vec, +} + /// The chain Extension of NFT pallet pub struct NFTExtension; @@ -81,6 +86,23 @@ _ => Err(DispatchError::Other("CreateItem error")) } }, + 2 => { + // Create multiple items + let mut env = env.buf_in_buf_out(); + let input: NFTExtCreateMultipleItems = env.read_as()?; + + let collection = pallet_nft::Module::::get_collection(input.collection_id)?; + + match pallet_nft::Module::::create_multiple_items_internal( + env.ext().address().clone(), + &collection, + input.owner, + input.data, + ) { + Ok(_) => Ok(RetVal::Converging(func_id)), + _ => Err(DispatchError::Other("CreateMultipleItems error")) + } + }, _ => { panic!("Passed unknown func_id to test chain extension: {}", func_id); }