git.delta.rocks / unique-network / refs/commits / f60077612324

difftreelog

feat create_multiple_items chain extension

Yaroslav Bolyukin2021-05-06parent: #172f80a.patch.diff
in: master

2 files changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
1792 Ok(())1792 Ok(())
1793 }1793 }
17941794
1795 pub fn create_multiple_items_internal(
1796 sender: T::AccountId,
1797 collection: &CollectionHandle<T>,
1798 owner: T::AccountId,
1799 items_data: Vec<CreateItemData>,
1800 ) -> DispatchResult {
1801 Self::can_create_items_in_collection(&collection, &sender, &owner, items_data.len() as u32)?;
1802
1803 for data in &items_data {
1804 Self::validate_create_item_args(&collection, data)?;
1805 }
1806 for data in &items_data {
1807 Self::create_item_no_validation(&collection, owner.clone(), data.clone())?;
1808 }
1809
1810 Ok(())
1811 }
17951812
1796 fn is_correct_transfer(collection: &CollectionHandle<T>, recipient: &T::AccountId) -> DispatchResult {1813 fn is_correct_transfer(collection: &CollectionHandle<T>, recipient: &T::AccountId) -> DispatchResult {
1797 let collection_id = collection.id;1814 let collection_id = collection.id;
modifiedruntime/src/chain_extension.rsdiffbeforeafterboth
--- 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<E: Ext> {
+    pub owner: <E::T as SysConfig>::AccountId,
+    pub collection_id: u32,
+    pub data: Vec<CreateItemData>,
+}
+
 /// 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<E> = env.read_as()?;
+
+                let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
+
+                match pallet_nft::Module::<C>::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);
             }