From d6ccebb784598b4d1365868993cc40c3438d2468 Mon Sep 17 00:00:00 2001 From: Greg Zaitsev Date: Tue, 04 May 2021 16:42:01 +0000 Subject: [PATCH] Add chain extension to mint --- --- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -1114,16 +1114,8 @@ #[weight = ::WeightInfo::create_item(data.len())] #[transactional] pub fn create_item(origin, collection_id: CollectionId, owner: T::AccountId, data: CreateItemData) -> DispatchResult { - let sender = ensure_signed(origin)?; - - let target_collection = Self::get_collection(collection_id)?; - - Self::can_create_items_in_collection(&target_collection, &sender, &owner, 1)?; - Self::validate_create_item_args(&target_collection, &data)?; - Self::create_item_no_validation(&target_collection, owner, data)?; - - Ok(()) + Self::create_item_internal(sender, collection_id, owner, data) } /// This method creates multiple items in a collection created with CreateCollection method. @@ -1763,6 +1755,15 @@ } impl Module { + pub fn create_item_internal(sender: T::AccountId, collection_id: CollectionId, owner: T::AccountId, data: CreateItemData) -> DispatchResult { + let target_collection = Self::get_collection(collection_id)?; + + Self::can_create_items_in_collection(&target_collection, &sender, &owner, 1)?; + Self::validate_create_item_args(&target_collection, &data)?; + Self::create_item_no_validation(&target_collection, owner, data)?; + + Ok(()) + } pub fn transfer_internal(sender: T::AccountId, recipient: T::AccountId, target_collection: &CollectionHandle, item_id: TokenId, value: u128) -> DispatchResult { // Limits check --- a/runtime/src/chain_extension.rs +++ b/runtime/src/chain_extension.rs @@ -21,6 +21,14 @@ use sp_runtime::AccountId32; use crate::Vec; +/// Create item parameters +#[derive(Debug, PartialEq, Encode, Decode)] +pub struct NFTExtCreateItem { + pub owner: ::AccountId, + pub collection_id: u32, + pub data: CreateItemData, +} + /// Transfer parameters #[derive(Debug, PartialEq, Encode, Decode)] pub struct NFTExtTransfer { @@ -67,8 +75,42 @@ _ => Err(DispatchError::Other("Transfer error")) } }, - _ => { - panic!("Passed unknown func_id to test chain extension: {}", func_id); + 1 => { + // Create Item + let mut env = env.buf_in_buf_out(); + let input: NFTExtCreateItem = env.read_as()?; + + // Contract address to AccountId32 + let mut bytes_contract: [u8; 32] = [0; 32]; + let addr_vec_contract: Vec = env.ext().address().encode(); + for i in 0..32 { + bytes_contract[i] = addr_vec_contract[i]; + } + let sender = AccountId32::from(bytes_contract); + + // Recipient to AccountId32 + let mut bytes_rec: [u8; 32] = [0; 32]; + let addr_vec_rec: Vec = input.owner.encode(); + for i in 0..32 { + bytes_rec[i] = addr_vec_rec[i]; + } + let recipient = AccountId32::from(bytes_rec); + + // Parse data + let cdata = input.data.encode(); + let vdata: [u8; 0] = [0; 0]; + let item_data = CreateItemData::NFT(CreateNftData{ + const_data: cdata, + variable_data: vdata.to_vec() + }); + + match pallet_nft::Module::::create_item_internal(sender, input.collection_id, recipient, item_data) { + Ok(_) => Ok(RetVal::Converging(func_id)), + _ => Err(DispatchError::Other("CreateItem error")) + } + }, + _ => { + panic!("Passed unknown func_id to test chain extension: {}", func_id); } } } -- gitstuff