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

difftreelog

Merge pull request #16 from usetech-llc/feature/NFTPAR-142

str-mv2020-11-16parents: #6d406a4 #eca8c84.patch.diff
in: master
Feature/nftpar-142

7 files changed

modifiedREADME.mddiffbeforeafterboth
--- a/README.md
+++ b/README.md
@@ -167,9 +167,9 @@
   "CollectionMode": {
     "_enum": {
       "Invalid": null,
-      "NFT": "u32",
+      "NFT": null,
       "Fungible": "u32",
-      "ReFungible": "(u32, u32)"
+      "ReFungible": "u32"
     }
   },
   "Ownership": {
@@ -189,7 +189,8 @@
   "NftItemType": {
     "Collection": "u64",
     "Owner": "AccountId",
-    "Data": "Vec<u8>"
+    "ConstData": "Vec<u8>",
+    "VariableData": "Vec<u8>"
   },
   "Ownership": {
     "owner": "AccountId",
@@ -198,7 +199,8 @@
   "ReFungibleItemType": {
     "Collection": "u64",
     "Owner": "Vec<Ownership<AccountId>>",
-    "Data": "Vec<u8>"
+    "ConstData": "Vec<u8>",
+    "VariableData": "Vec<u8>"
   },
   "CollectionType": {
     "Owner": "AccountId",
@@ -208,11 +210,12 @@
     "Name": "Vec<u16>",
     "Description": "Vec<u16>",
     "TokenPrefix": "Vec<u8>",
-    "CustomDataSize": "u32",
     "MintMode": "bool",
     "OffchainSchema": "Vec<u8>",
     "Sponsor": "AccountId",
-    "UnconfirmedSponsor": "AccountId"
+    "UnconfirmedSponsor": "AccountId",
+    "VariableOnChainSchema": "Vec<u8>",
+    "ConstOnChainSchema": "Vec<u8>"
   },
   "ApprovePermissions": {
     "Approved": "AccountId",
@@ -221,7 +224,23 @@
   "RawData": "Vec<u8>",
   "Address": "AccountId",
   "LookupSource": "AccountId",
-  "Weight": "u64"
+  "Weight": "u64",
+  "CreateNftData": {
+    "const_data": "Vec<u8>",
+    "variable_data": "Vec<u8>" 
+  },
+  "CreateFungibleData": {},
+  "CreateReFungibleData": {
+    "const_data": "Vec<u8>",
+    "variable_data": "Vec<u8>" 
+  },
+  "CreateItemData": {
+    "_enum": {
+      "NFT": "CreateNftData",
+      "Fungible": "CreateFungibleData",
+      "ReFungible": "CreateReFungibleData"
+    }
+  }
 }
 
 ```
\ No newline at end of file
modifiednode/src/chain_spec.rsdiffbeforeafterboth
--- a/node/src/chain_spec.rs
+++ b/node/src/chain_spec.rs
@@ -159,17 +159,18 @@
                 1,
                 CollectionType {
                     owner: get_account_id_from_seed::<sr25519::Public>("Alice"),
-                    mode: CollectionMode::NFT(50),
+                    mode: CollectionMode::NFT,
                     access: AccessMode::Normal,
                     decimal_points: 0,
                     name: vec![],
                     description: vec![],
                     token_prefix: vec![],
-                    custom_data_size: 50,
                     mint_mode: false,
                     offchain_schema: vec![],
                     sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
                     unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
+                    const_on_chain_schema: vec![],
+                    variable_on_chain_schema: vec![]
                 },
             )],
             nft_item_id: vec![],
modifiedpallets/nft/src/benchmarking.rsdiffbeforeafterboth
--- a/pallets/nft/src/benchmarking.rs
+++ b/pallets/nft/src/benchmarking.rs
@@ -9,6 +9,19 @@
 
     const SEED: u32 = 1;
 
+    fn default_nft_data() -> CreateItemData {
+        CreateItemData::NFT(CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })
+    }
+    
+    fn default_fungible_data () -> CreateItemData {
+        CreateItemData::Fungible(CreateFungibleData { })
+    }
+    
+    fn default_re_fungible_data () -> CreateItemData {
+        CreateItemData::ReFungible(CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })
+    }
+
+
     benchmarks! {
 
         _ {}
@@ -17,7 +30,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = account("caller", 0, SEED);
         }: create_collection(RawOrigin::Signed(caller.clone()), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode)
         verify {
@@ -28,7 +41,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
         }: destroy_collection(RawOrigin::Signed(caller.clone()), 2)
@@ -37,7 +50,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             let whitelist_account: T::AccountId = account("admin", 0, SEED);
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
@@ -47,7 +60,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             let whitelist_account: T::AccountId = account("admin", 0, SEED);
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
@@ -58,7 +71,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
         }: set_public_access_mode(RawOrigin::Signed(caller.clone()), 2, AccessMode::WhiteList)
@@ -67,7 +80,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
         }: set_mint_permission(RawOrigin::Signed(caller.clone()), 2, true)
@@ -76,7 +89,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
             let new_owner: T::AccountId = account("admin", 0, SEED);
@@ -86,7 +99,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
             let new_admin: T::AccountId = account("admin", 0, SEED);
@@ -96,7 +109,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
             let new_admin: T::AccountId = account("admin", 0, SEED);
@@ -107,7 +120,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
         }: set_collection_sponsor(RawOrigin::Signed(caller.clone()), 2, caller.clone())
@@ -116,7 +129,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
             Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;
@@ -126,7 +139,7 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
             Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;
@@ -138,26 +151,32 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-
-        }: create_item(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec(), caller.clone())
+            let data = default_nft_data();
+            
+        }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
 
         #[extra]
         create_item_nft_large {
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
-            let mut item_large: Vec<u8> = Vec::new(); 
+            let nft_data = CreateNftData {
+                const_data: vec![],
+                variable_data: vec![]
+            };
             for i in 0..1998 {
-                item_large.push(10);
+                nft_data.const_data.push(10);
+                nft_data.variable_data.push(10);
             }
+            let mut data = CreateItemData::NFT(nft_data);
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
 
-        }: create_item(RawOrigin::Signed(caller.clone()), 2, item_large, caller.clone())
+        }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
 
         // fungible item
         create_item_fungible {
@@ -167,28 +186,31 @@
             let mode: CollectionMode = CollectionMode::Fungible(3);
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+            let data = default_fungible_data();
 
-        }: create_item(RawOrigin::Signed(caller.clone()), 2, [].to_vec(), caller.clone())
+        }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
 
         // refungible item
         create_item_refungible {
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::ReFungible(3, 3);
+            let mode: CollectionMode = CollectionMode::ReFungible(3);
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+            let data = default_re_fungible_data();
 
-        }: create_item(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec(), caller.clone())
+        }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
 
         burn_item {
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1, 2, 3].to_vec(), caller.clone())?;
+            let data = default_nft_data();
+            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
 
         }: burn_item(RawOrigin::Signed(caller.clone()), 2, 1)
 
@@ -196,11 +218,12 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let mode: CollectionMode = CollectionMode::NFT;
             let recipient: T::AccountId = account("recipient", 0, SEED);
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1, 2, 3].to_vec(), caller.clone())?;
+            let data = default_nft_data();
+            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
 
         }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
         
@@ -212,7 +235,8 @@
             let recipient: T::AccountId = account("recipient", 0, SEED);
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [].to_vec(), caller.clone())?;
+            let data = default_fungible_data();
+            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
 
         }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
 
@@ -220,11 +244,12 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::ReFungible(3,3);
+            let mode: CollectionMode = CollectionMode::ReFungible(3);
             let recipient: T::AccountId = account("recipient", 0, SEED);
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;
+            let data = default_re_fungible_data();
+            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
 
         }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
 
@@ -232,11 +257,12 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::ReFungible(3,3);
+            let mode: CollectionMode = CollectionMode::ReFungible(3);
             let recipient: T::AccountId = account("recipient", 0, SEED);
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;
+            let data = default_re_fungible_data();
+            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
 
         }: approve(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1)
 
@@ -245,11 +271,12 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::NFT(300);
+            let mode: CollectionMode = CollectionMode::NFT;
             let recipient: T::AccountId = account("recipient", 0, SEED);
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;
+            let data = default_nft_data();
+            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
             Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
 
         }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
@@ -263,7 +290,8 @@
             let recipient: T::AccountId = account("recipient", 0, SEED);
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [].to_vec(), caller.clone())?;
+            let data = default_fungible_data();
+            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
             Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
 
         }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
@@ -273,11 +301,12 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::ReFungible(3,3);
+            let mode: CollectionMode = CollectionMode::ReFungible(3);
             let recipient: T::AccountId = account("recipient", 0, SEED);
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;
+            let data = default_re_fungible_data();
+            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
             Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
 
         }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
@@ -286,9 +315,39 @@
             let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
             let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
             let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
-            let mode: CollectionMode = CollectionMode::ReFungible(3,3);
+            let mode: CollectionMode = CollectionMode::ReFungible(3);
             let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
             Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
 
         }: set_offchain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
-    }
\ No newline at end of file
+
+        set_const_on_chain_schema {
+            let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+            let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+            let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+            let mode: CollectionMode = CollectionMode::ReFungible(3);
+            let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+            Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+        }: set_const_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
+        
+        set_variable_on_chain_schema {
+            let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+            let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+            let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+            let mode: CollectionMode = CollectionMode::ReFungible(3);
+            let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+            Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+        }: set_variable_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
+
+        set_variable_meta_data {
+            let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+            let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+            let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+            let mode: CollectionMode = CollectionMode::NFT;
+            let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+            Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+            let data = default_nft_data();
+            Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+
+        }: set_variable_meta_data(RawOrigin::Signed(caller.clone()), 2, 1, [1, 2, 3].to_vec())
+}
\ No newline at end of file
modifiedpallets/nft/src/default_weights.rsdiffbeforeafterboth
--- a/pallets/nft/src/default_weights.rs
+++ b/pallets/nft/src/default_weights.rs
@@ -92,6 +92,21 @@
             .saturating_add(DbWeight::get().reads(2 as Weight))
             .saturating_add(DbWeight::get().writes(1 as Weight))
     }
+    fn set_const_on_chain_schema() -> Weight {
+        (11_100_000 as Weight)
+            .saturating_add(DbWeight::get().reads(2 as Weight))
+            .saturating_add(DbWeight::get().writes(1 as Weight))
+    }
+    fn set_variable_on_chain_schema() -> Weight {
+        (11_100_000 as Weight)
+            .saturating_add(DbWeight::get().reads(2 as Weight))
+            .saturating_add(DbWeight::get().writes(1 as Weight))
+    }
+    fn set_variable_meta_data() -> Weight {
+        (17_500_000 as Weight)
+            .saturating_add(DbWeight::get().reads(2 as Weight))
+            .saturating_add(DbWeight::get().writes(1 as Weight))
+    }
     // fn enable_contract_sponsoring() -> Weight {
     //     (0 as Weight)
     //         .saturating_add(DbWeight::get().reads(1 as Weight))
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -10,7 +10,7 @@
 pub use frame_support::{
     construct_runtime, decl_event, decl_module, decl_storage,
     dispatch::DispatchResult,
-    ensure, parameter_types,
+    ensure, parameter_types, fail,
     traits::{
         Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
         Randomness, WithdrawReason,
@@ -53,21 +53,20 @@
 #[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 pub enum CollectionMode {
     Invalid,
-    // custom data size
-    NFT(u32),
+    NFT,
     // decimal points
     Fungible(u32),
-    // custom data size and decimal points
-    ReFungible(u32, u32),
+    // decimal points
+    ReFungible(u32),
 }
 
 impl Into<u8> for CollectionMode {
     fn into(self) -> u8 {
         match self {
             CollectionMode::Invalid => 0,
-            CollectionMode::NFT(_) => 1,
+            CollectionMode::NFT => 1,
             CollectionMode::Fungible(_) => 2,
-            CollectionMode::ReFungible(_, _) => 3,
+            CollectionMode::ReFungible(_) => 3,
         }
     }
 }
@@ -107,11 +106,12 @@
     pub name: Vec<u16>,        // 64 include null escape char
     pub description: Vec<u16>, // 256 include null escape char
     pub token_prefix: Vec<u8>, // 16 include null escape char
-    pub custom_data_size: u32,
     pub mint_mode: bool,
     pub offchain_schema: Vec<u8>,
     pub sponsor: AccountId, // Who pays fees. If set to default address, the fees are applied to the transaction sender
     pub unconfirmed_sponsor: AccountId, // Sponsor address that has not yet confirmed sponsorship
+    pub variable_on_chain_schema: Vec<u8>, //
+    pub const_on_chain_schema: Vec<u8>, //
 }
 
 #[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
@@ -126,7 +126,8 @@
 pub struct NftItemType<AccountId> {
     pub collection: u64,
     pub owner: AccountId,
-    pub data: Vec<u8>,
+    pub const_data: Vec<u8>,
+    pub variable_data: Vec<u8>,
 }
 
 #[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
@@ -142,7 +143,8 @@
 pub struct ReFungibleItemType<AccountId> {
     pub collection: u64,
     pub owner: Vec<Ownership<AccountId>>,
-    pub data: Vec<u8>,
+    pub const_data: Vec<u8>,
+    pub variable_data: Vec<u8>,
 }
 
 #[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
@@ -197,15 +199,75 @@
     fn set_collection_sponsor() -> Weight;
     fn confirm_sponsorship() -> Weight;
     fn remove_collection_sponsor() -> Weight;
-    fn create_item(s: usize, ) -> Weight;
+    fn create_item(s: usize) -> Weight;
     fn burn_item() -> Weight;
     fn transfer() -> Weight;
     fn approve() -> Weight;
     fn transfer_from() -> Weight;
     fn set_offchain_schema() -> Weight;
+    fn set_const_on_chain_schema() -> Weight;
+    fn set_variable_on_chain_schema() -> Weight;
+    fn set_variable_meta_data() -> Weight;
     // fn enable_contract_sponsoring() -> Weight;
 }
 
+#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub struct CreateNftData {
+    pub const_data: Vec<u8>,
+    pub variable_data: Vec<u8>,
+}
+
+#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub struct CreateFungibleData {
+}
+
+#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub struct CreateReFungibleData {
+    pub const_data: Vec<u8>,
+    pub variable_data: Vec<u8>,
+}
+
+#[derive(Encode, Decode, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub enum CreateItemData {
+    NFT(CreateNftData),
+    Fungible(CreateFungibleData),
+    ReFungible(CreateReFungibleData)
+}
+
+impl CreateItemData {
+    pub fn len(&self) -> usize {
+        let len = match self {
+            CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(),
+            CreateItemData::ReFungible(data) => data.variable_data.len() + data.const_data.len(),
+            _ => 0
+        };
+        
+        return len;
+    }
+}
+
+impl From<CreateNftData> for CreateItemData {
+    fn from(item: CreateNftData) -> Self {
+        CreateItemData::NFT(item)
+    }
+}
+
+impl From<CreateReFungibleData> for CreateItemData {
+    fn from(item: CreateReFungibleData) -> Self {
+        CreateItemData::ReFungible(item)
+    }
+}
+
+impl From<CreateFungibleData> for CreateItemData {
+    fn from(item: CreateFungibleData) -> Self {
+        CreateItemData::Fungible(item)
+    }
+}
+
 pub trait Trait: system::Trait + Sized + transaction_payment::Trait + pallet_contracts::Trait {
     type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
 
@@ -362,25 +424,10 @@
 
             // Anyone can create a collection
             let who = ensure_signed(origin)?;
-            let custom_data_size = match mode {
-                CollectionMode::NFT(size) => {
 
-                    // bound Custom data size
-                    ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");
-                    size
-                },
-                CollectionMode::ReFungible(size, _) => {
-
-                    // bound Custom data size
-                    ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");
-                    size
-                },
-                _ => 0
-            };
-
             let decimal_points = match mode {
                 CollectionMode::Fungible(points) => points,
-                CollectionMode::ReFungible(_, points) => points,
+                CollectionMode::ReFungible(points) => points,
                 _ => 0
             };
 
@@ -426,9 +473,10 @@
                 decimal_points: decimal_points,
                 token_prefix: prefix,
                 offchain_schema: Vec::new(),
-                custom_data_size: custom_data_size,
                 sponsor: T::AccountId::default(),
                 unconfirmed_sponsor: T::AccountId::default(),
+                variable_on_chain_schema: Vec::new(),
+                const_on_chain_schema: Vec::new(),
             };
 
             // Add new collection to map
@@ -441,7 +489,7 @@
         }
 
         /// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
-        /// 
+        ///     
         /// # Permissions
         /// 
         /// * Collection Owner.
@@ -771,77 +819,88 @@
         /// 
         /// * collection_id: ID of the collection.
         /// 
-        /// * properties: Array of bytes that contains NFT properties. Since NFT Module is agnostic of properties meaning, it is treated purely as an array of bytes.
-        /// 
         /// * owner: Address, initial owner of the NFT.
+        ///
+        /// * data: Token data to store on chain.
         // #[weight =
         // (130_000_000 as Weight)
         // .saturating_add((2135 as Weight).saturating_mul((properties.len() as u64) as Weight))
         // .saturating_add(RocksDbWeight::get().reads(10 as Weight))
         // .saturating_add(RocksDbWeight::get().writes(8 as Weight))]
 
-        #[weight = T::WeightInfo::create_item(properties.len())]
-        pub fn create_item(origin, collection_id: u64, properties: Vec<u8>, owner: T::AccountId) -> DispatchResult {
+        #[weight = T::WeightInfo::create_item(data.len())]
+        pub fn create_item(origin, collection_id: u64, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
             Self::collection_exists(collection_id)?;
             let target_collection = <Collection<T>>::get(collection_id);
 
             if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {
-                ensure!(target_collection.mint_mode == true, "Public minting is not allowed for this collection");
+                ensure!(target_collection.mint_mode == true, "Public minting is not allowed for this collection.");
                 Self::check_white_list(collection_id, &owner)?;
                 Self::check_white_list(collection_id, &sender)?;
             }
 
             match target_collection.mode
             {
-                CollectionMode::NFT(_) => {
-
-                    // check size
-                    ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
-
-                    // Create nft item
-                    let item = NftItemType {
-                        collection: collection_id,
-                        owner: owner,
-                        data: properties.clone(),
-                    };
-
-                    Self::add_nft_item(item)?;
-
+                CollectionMode::NFT => {
+                    if let CreateItemData::NFT(data) = data {
+                        // check sizes
+                        ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, "const_data exceeded data limit.");
+                        ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, "variable_data exceeded data limit.");
+    
+                        // Create nft item
+                        let item = NftItemType {
+                            collection: collection_id,
+                            owner: owner,
+                            const_data: data.const_data.clone(),
+                            variable_data: data.variable_data.clone() 
+                        };
+    
+                        Self::add_nft_item(item)?;
+                    
+                    } else {
+                        fail!("Not NFT item data used to mint in NFT collection.");
+                    }
                 },
                 CollectionMode::Fungible(_) => {
-
-                    // check size
-                    ensure!(properties.len() as u32 == 0, "Size of item must be 0 with fungible type");
-
-                    let item = FungibleItemType {
-                        collection: collection_id,
-                        owner: owner,
-                        value: (10 as u128).pow(target_collection.decimal_points)
-                    };
-
-                    Self::add_fungible_item(item)?;
+                    if let CreateItemData::Fungible(_) = data {
+    
+                        let item = FungibleItemType {
+                            collection: collection_id,
+                            owner: owner,
+                            value: (10 as u128).pow(target_collection.decimal_points)
+                        };
+    
+                        Self::add_fungible_item(item)?;
+                    } else {
+                        fail!("Not Fungible item data used to mint in Fungible collection.");
+                    }
                 },
-                CollectionMode::ReFungible(_, _) => {
-
-                    // check size
-                    ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
-
-                    let mut owner_list = Vec::new();
-                    let value = (10 as u128).pow(target_collection.decimal_points);
-                    owner_list.push(Ownership {owner: owner.clone(), fraction: value});
-
-                    let item = ReFungibleItemType {
-                        collection: collection_id,
-                        owner: owner_list,
-                        data: properties.clone()
-                    };
-
-                    Self::add_refungible_item(item)?;
+                CollectionMode::ReFungible(_) => {
+                    if let CreateItemData::ReFungible(data) = data {
+    
+                        // check sizes
+                        ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, "const_data exceeded data limit.");
+                        ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, "variable_data exceeded data limit.");
+    
+                        let mut owner_list = Vec::new();
+                        let value = (10 as u128).pow(target_collection.decimal_points);
+                        owner_list.push(Ownership {owner: owner.clone(), fraction: value});
+    
+                        let item = ReFungibleItemType {
+                            collection: collection_id,
+                            owner: owner_list,
+                            const_data: data.const_data.clone(),
+                            variable_data: data.variable_data.clone() 
+                        };
+    
+                        Self::add_refungible_item(item)?;
+                    } else {
+                        fail!("Not Re Fungible item data used to mint in Re Fungible collection.");
+                    }
                 },
-                _ => { ensure!(1 == 0,"just error"); }
-
+                _ => { ensure!(1 == 0,"Unexpected collection type."); }
             };
 
             // call event
@@ -881,9 +940,9 @@
 
             match target_collection.mode
             {
-                CollectionMode::NFT(_) => Self::burn_nft_item(collection_id, item_id)?,
+                CollectionMode::NFT => Self::burn_nft_item(collection_id, item_id)?,
                 CollectionMode::Fungible(_)  => Self::burn_fungible_item(collection_id, item_id)?,
-                CollectionMode::ReFungible(_, _)  => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,
+                CollectionMode::ReFungible(_)  => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,
                 _ => ()
             };
 
@@ -934,9 +993,9 @@
 
             match target_collection.mode
             {
-                CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,
+                CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,
                 CollectionMode::Fungible(_)  => Self::transfer_fungible(collection_id, item_id, value, sender.clone(), recipient)?,
-                CollectionMode::ReFungible(_, _)  => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,
+                CollectionMode::ReFungible(_)  => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,
                 _ => ()
             };
 
@@ -1051,9 +1110,9 @@
 
             match target_collection.mode
             {
-                CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, from, recipient)?,
+                CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, from, recipient)?,
                 CollectionMode::Fungible(_)  => Self::transfer_fungible(collection_id, item_id, value, from.clone(), recipient)?,
-                CollectionMode::ReFungible(_, _)  => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,
+                CollectionMode::ReFungible(_)  => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,
                 _ => ()
             };
 
@@ -1075,6 +1134,48 @@
 
             Ok(())
         }
+        
+        /// Set off-chain data schema.
+        /// 
+        /// # Permissions
+        /// 
+        /// * Collection Owner
+        /// * Collection Admin
+        /// 
+        /// # Arguments
+        /// 
+        /// * collection_id.
+        /// 
+        /// * schema: String representing the offchain data schema.
+        #[weight = T::WeightInfo::set_variable_meta_data()]
+        pub fn set_variable_meta_data (
+            origin,
+            collection_id: u64,
+            item_id: u64,
+            data: Vec<u8>
+        ) -> DispatchResult {
+            let sender = ensure_signed(origin)?;
+            
+            Self::collection_exists(collection_id)?;
+
+            // Modify permissions check
+            let target_collection = <Collection<T>>::get(collection_id);
+            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||
+                Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
+                "Only item owner, collection owner and admins can modify item");
+
+            Self::item_exists(collection_id, item_id, &target_collection.mode)?;
+
+            match target_collection.mode
+            {
+                CollectionMode::NFT => Self::set_nft_variable_data(collection_id, item_id, data)?,
+                CollectionMode::ReFungible(_)  => Self::set_re_fungible_variable_data(collection_id, item_id, data)?,
+                _ => ()
+            };
+
+            Ok(())
+        }
+        
 
         /// Set off-chain data schema.
         /// 
@@ -1104,6 +1205,62 @@
             Ok(())
         }
 
+        /// Set const on-chain data schema.
+        /// 
+        /// # Permissions
+        /// 
+        /// * Collection Owner
+        /// * Collection Admin
+        /// 
+        /// # Arguments
+        /// 
+        /// * collection_id.
+        /// 
+        /// * schema: String representing the const on-chain data schema.
+        #[weight = T::WeightInfo::set_const_on_chain_schema()]
+        pub fn set_const_on_chain_schema (
+            origin,
+            collection_id: u64,
+            schema: Vec<u8>
+        ) -> DispatchResult {
+            let sender = ensure_signed(origin)?;
+            Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
+
+            let mut target_collection = <Collection<T>>::get(collection_id);
+            target_collection.const_on_chain_schema = schema;
+            <Collection<T>>::insert(collection_id, target_collection);
+
+            Ok(())
+        }
+
+        /// Set variable on-chain data schema.
+        /// 
+        /// # Permissions
+        /// 
+        /// * Collection Owner
+        /// * Collection Admin
+        /// 
+        /// # Arguments
+        /// 
+        /// * collection_id.
+        /// 
+        /// * schema: String representing the variable on-chain data schema.
+        #[weight = T::WeightInfo::set_const_on_chain_schema()]
+        pub fn set_variable_on_chain_schema (
+            origin,
+            collection_id: u64,
+            schema: Vec<u8>
+        ) -> DispatchResult {
+            let sender = ensure_signed(origin)?;
+            Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
+
+            let mut target_collection = <Collection<T>>::get(collection_id);
+            target_collection.variable_on_chain_schema = schema;
+            <Collection<T>>::insert(collection_id, target_collection);
+
+            Ok(())
+        }
+
         // Sudo permissions function
         #[weight = 0]
         pub fn set_chain_limits(
@@ -1353,13 +1510,13 @@
         let target_collection = <Collection<T>>::get(collection_id);
 
         match target_collection.mode {
-            CollectionMode::NFT(_) => {
+            CollectionMode::NFT => {
                 <NftItemList<T>>::get(collection_id, item_id).owner == subject
             }
             CollectionMode::Fungible(_) => {
                 <FungibleItemList<T>>::get(collection_id, item_id).owner == subject
             }
-            CollectionMode::ReFungible(_, _) => {
+            CollectionMode::ReFungible(_) => {
                 <ReFungibleItemList<T>>::get(collection_id, item_id)
                     .owner
                     .iter()
@@ -1594,7 +1751,50 @@
         <ApprovedList<T>>::remove(collection_id, (item_id, old_owner));
         Ok(())
     }
+    
+    fn item_exists(
+        collection_id: u64,
+        item_id: u64,
+        mode: &CollectionMode
+    ) -> DispatchResult {
+        match mode {
+            CollectionMode::NFT => ensure!(<NftItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),
+            CollectionMode::ReFungible(_) => ensure!(<ReFungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),
+            CollectionMode::Fungible(_) => ensure!(<FungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),
+            _ => ()
+        };
+        
+        Ok(())
+    }
+
+    fn set_re_fungible_variable_data(
+        collection_id: u64,
+        item_id: u64,
+        data: Vec<u8>
+    ) -> DispatchResult {
+        let mut item = <ReFungibleItemList<T>>::get(collection_id, item_id);
+
+        item.variable_data = data;
 
+        <ReFungibleItemList<T>>::insert(collection_id, item_id, item);
+
+        Ok(())
+    }
+
+    fn set_nft_variable_data(
+        collection_id: u64,
+        item_id: u64,
+        data: Vec<u8>
+    ) -> DispatchResult {
+        let mut item = <NftItemList<T>>::get(collection_id, item_id);
+        
+        item.variable_data = data;
+
+        <NftItemList<T>>::insert(collection_id, item_id, item);
+        
+        Ok(())
+    }
+
     fn init_collection(item: &CollectionType<T::AccountId>) {
         // check params
         assert!(
@@ -1835,7 +2035,7 @@
 
                 // sponsor timeout
                 let sponsor_transfer = match _collection_mode {
-                    CollectionMode::NFT(_) => {
+                    CollectionMode::NFT => {
                         let basket = <NftTransferBasket<T>>::get(collection_id, _item_id);
                         let block_number = <system::Module<T>>::block_number() as T::BlockNumber;
                         let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();
@@ -1869,7 +2069,7 @@
                             true
                         }
                     }
-                    CollectionMode::ReFungible(_, _) => {
+                    CollectionMode::ReFungible(_) => {
                         let basket = <ReFungibleTransferBasket<T>>::get(collection_id, _item_id);
                         let block_number = <system::Module<T>>::block_number() as T::BlockNumber;
                         let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
1// Tests to be written here1// Tests to be written here
2use crate::mock::*;2use crate::mock::*;
3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits};3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData};
4use frame_support::{assert_noop, assert_ok};4use frame_support::{assert_noop, assert_ok};
5use frame_system::{ RawOrigin };5use frame_system::{ RawOrigin };
66
7// Use cases tests region
8// #region
9#[test]
10fn create_nft_item() {7fn default_collection_numbers_limit() -> u64 {
11 new_test_ext().execute_with(|| {
12 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();8 10
13 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();9}
14 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
15 let mode: CollectionMode = CollectionMode::NFT(2000);
1610
17 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 11fn default_limits() {
12 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
18 collection_numbers_limit: 10,13 collection_numbers_limit: default_collection_numbers_limit(),
19 account_token_ownership_limit: 10,14 account_token_ownership_limit: 10,
20 collections_admins_limit: 5,15 collections_admins_limit: 5,
21 custom_data_limit: 2048,16 custom_data_limit: 2048,
22 nft_sponsor_transfer_timeout: 15,17 nft_sponsor_transfer_timeout: 15,
23 fungible_sponsor_transfer_timeout: 15,18 fungible_sponsor_transfer_timeout: 15,
24 refungible_sponsor_transfer_timeout: 15, 19 refungible_sponsor_transfer_timeout: 15,
25 }));20 }));
21}
2622
27 let origin1 = Origin::signed(1);23fn default_nft_data() -> CreateNftData {
24 CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }
25}
26
27fn default_fungible_data () -> CreateFungibleData {
28 CreateFungibleData { }
29}
30
31fn default_re_fungible_data () -> CreateReFungibleData {
32 CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }
33}
34
35fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: u64) -> u64 {
36 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
28 assert_ok!(TemplateModule::create_collection(37 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
38 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
39
40 let origin1 = Origin::signed(owner);
41 assert_ok!(TemplateModule::create_collection(
29 origin1.clone(),42 origin1.clone(),
30 col_name1.clone(),43 col_name1.clone(),
31 col_desc1.clone(),44 col_desc1.clone(),
32 token_prefix1.clone(),45 token_prefix1.clone(),
33 mode46 mode.clone()
34 ));47 ));
35 assert_eq!(TemplateModule::collection(1).owner, 1);
3648
37 assert_ok!(TemplateModule::create_item(49 let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();
50 let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();
51 let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();
52 assert_eq!(TemplateModule::collection(id).owner, owner);
53 assert_eq!(TemplateModule::collection(id).name, saved_col_name);
54 assert_eq!(TemplateModule::collection(id).mode, *mode);
55 assert_eq!(TemplateModule::collection(id).description, saved_description);
56 assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);
57 id
58}
59
60fn create_test_collection(mode: &CollectionMode, id: u64) -> u64 {
61 create_test_collection_for_owner(&mode, 1, id)
62}
63
64fn create_test_item(collection_id: u64, data: &CreateItemData) {
65 let origin1 = Origin::signed(1);
66 assert_ok!(TemplateModule::create_item(
38 origin1.clone(),67 origin1.clone(),
68 collection_id,
39 1,69 1,
40 [1, 2, 3].to_vec(),70 data.clone()
41 1
42 ));71 ));
72
73}
74
43 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());75// Use cases tests region
76// #region
77#[test]
78fn create_nft_item() {
79 new_test_ext().execute_with(|| {
80 default_limits();
81 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
82
83 let data = default_nft_data();
84 create_test_item(collection_id, &data.clone().into());
85 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);
86 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);
44 });87 });
45}88}
4689
47#[test]90#[test]
48fn create_refungible_item() {91fn create_refungible_item() {
49 new_test_ext().execute_with(|| {92 new_test_ext().execute_with(|| {
50 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();93 default_limits();
51 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();94 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);
52 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
53 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
5495
55 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 96 let data = default_re_fungible_data();
56 collection_numbers_limit: 10,
57 account_token_ownership_limit: 10,
58 collections_admins_limit: 5,
59 custom_data_limit: 2048,
60 nft_sponsor_transfer_timeout: 15,
61 fungible_sponsor_transfer_timeout: 15,
62 refungible_sponsor_transfer_timeout: 15,
63 }));
64
65 let origin1 = Origin::signed(1);
66 assert_ok!(TemplateModule::create_collection(97 create_test_item(collection_id, &data.clone().into());
67 origin1.clone(),
68 col_name1.clone(),
69 col_desc1.clone(),
70 token_prefix1.clone(),
71 mode
72 ));
73 assert_eq!(TemplateModule::collection(1).owner, 1);
74
75 assert_ok!(TemplateModule::create_item(
76 origin1.clone(),
77 1,
78 [1, 2, 3].to_vec(),
79 1
80 ));
81 assert_eq!(98 assert_eq!(
82 TemplateModule::refungible_item_id(1, 1).data,99 TemplateModule::refungible_item_id(collection_id, 1).const_data,
83 [1, 2, 3].to_vec()100 data.const_data
84 );101 );
85 assert_eq!(102 assert_eq!(
86 TemplateModule::refungible_item_id(1, 1).owner[0],103 TemplateModule::refungible_item_id(collection_id, 1).variable_data,
104 data.variable_data
105 );
106 assert_eq!(
107 TemplateModule::refungible_item_id(collection_id, 1).owner[0],
87 Ownership {108 Ownership {
88 owner: 1,109 owner: 1,
89 fraction: 1000110 fraction: 1000
95#[test]116#[test]
96fn create_fungible_item() {117fn create_fungible_item() {
97 new_test_ext().execute_with(|| {118 new_test_ext().execute_with(|| {
98 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();119 default_limits();
99 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();120
100 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();121 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);
101 let mode: CollectionMode = CollectionMode::Fungible(3);
102122
103 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 123 let data = default_fungible_data();
104 collection_numbers_limit: 10,124 create_test_item(collection_id, &data.into());
105 account_token_ownership_limit: 10,
106 collections_admins_limit: 5,
107 custom_data_limit: 2048,
108 nft_sponsor_transfer_timeout: 15,
109 fungible_sponsor_transfer_timeout: 15,
110 refungible_sponsor_transfer_timeout: 15,
111 }));
112125
113 let origin1 = Origin::signed(1);126 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);
114 assert_ok!(TemplateModule::create_collection(
115 origin1.clone(),
116 col_name1.clone(),
117 col_desc1.clone(),
118 token_prefix1.clone(),
119 mode
120 ));
121 assert_eq!(TemplateModule::collection(1).owner, 1);
122
123 assert_ok!(TemplateModule::create_item(
124 origin1.clone(),
125 1,
126 [].to_vec(),
127 1
128 ));
129 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);
130 assert_eq!(TemplateModule::balance_count(1, 1), 1000);127 assert_eq!(TemplateModule::balance_count(1, 1), 1000);
131 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);128 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
132 });129 });
135#[test]132#[test]
136fn transfer_fungible_item() {133fn transfer_fungible_item() {
137 new_test_ext().execute_with(|| {134 new_test_ext().execute_with(|| {
138 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();135 default_limits();
139 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();136
140 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();137 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);
141 let mode: CollectionMode = CollectionMode::Fungible(3);
142138
143 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
144 collection_numbers_limit: 10,
145 account_token_ownership_limit: 10,
146 collections_admins_limit: 5,
147 custom_data_limit: 2048,
148 nft_sponsor_transfer_timeout: 15,
149 fungible_sponsor_transfer_timeout: 15,
150 refungible_sponsor_transfer_timeout: 15,
151 }));
152
153 let origin1 = Origin::signed(1);139 let origin1 = Origin::signed(1);
154 let origin2 = Origin::signed(2);140 let origin2 = Origin::signed(2);
155 assert_ok!(TemplateModule::create_collection(
156 origin1.clone(),
157 col_name1.clone(),
158 col_desc1.clone(),
159 token_prefix1.clone(),
160 mode
161 ));
162 assert_eq!(TemplateModule::collection(1).owner, 1);
163141
164 assert_ok!(TemplateModule::create_item(142 let data = default_fungible_data();
165 origin1.clone(),
166 1,143 create_test_item(collection_id, &data.into());
167 [].to_vec(),144
168 1
169 ));
170 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);145 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);
171 assert_eq!(TemplateModule::balance_count(1, 1), 1000);146 assert_eq!(TemplateModule::balance_count(1, 1), 1000);
172 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);147 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
203#[test]178#[test]
204fn transfer_refungible_item() {179fn transfer_refungible_item() {
205 new_test_ext().execute_with(|| {180 new_test_ext().execute_with(|| {
206 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();181 default_limits();
207 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();182
208 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();183 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);
209 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
210184
211 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 185 let data = default_re_fungible_data();
212 collection_numbers_limit: 10,186 create_test_item(collection_id, &data.clone().into());
213 account_token_ownership_limit: 10,
214 collections_admins_limit: 5,
215 custom_data_limit: 2048,
216 nft_sponsor_transfer_timeout: 15,
217 fungible_sponsor_transfer_timeout: 15,
218 refungible_sponsor_transfer_timeout: 15,
219 }));
220187
221 let origin1 = Origin::signed(1);188 let origin1 = Origin::signed(1);
222 let origin2 = Origin::signed(2);189 let origin2 = Origin::signed(2);
223 assert_ok!(TemplateModule::create_collection(
224 origin1.clone(),
225 col_name1.clone(),
226 col_desc1.clone(),
227 token_prefix1.clone(),
228 mode
229 ));
230 assert_eq!(TemplateModule::collection(1).owner, 1);
231
232 assert_ok!(TemplateModule::create_item(
233 origin1.clone(),
234 1,
235 [1, 2, 3].to_vec(),
236 1
237 ));
238 assert_eq!(190 assert_eq!(
239 TemplateModule::refungible_item_id(1, 1).data,191 TemplateModule::refungible_item_id(collection_id, 1).const_data,
240 [1, 2, 3].to_vec()192 data.const_data
241 );193 );
242 assert_eq!(194 assert_eq!(
243 TemplateModule::refungible_item_id(1, 1).owner[0],195 TemplateModule::refungible_item_id(collection_id, 1).variable_data,
196 data.variable_data
197 );
198 assert_eq!(
199 TemplateModule::refungible_item_id(collection_id, 1).owner[0],
244 Ownership {200 Ownership {
245 owner: 1,201 owner: 1,
246 fraction: 1000202 fraction: 1000
310#[test]266#[test]
311fn transfer_nft_item() {267fn transfer_nft_item() {
312 new_test_ext().execute_with(|| {268 new_test_ext().execute_with(|| {
313 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();269 default_limits();
314 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();270
315 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();271 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
316 let mode: CollectionMode = CollectionMode::NFT(2000);
317272
318 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 273 let data = default_nft_data();
319 collection_numbers_limit: 10,
320 account_token_ownership_limit: 10,
321 collections_admins_limit: 5,
322 custom_data_limit: 2048,
323 nft_sponsor_transfer_timeout: 15,
324 fungible_sponsor_transfer_timeout: 15,
325 refungible_sponsor_transfer_timeout: 15,
326 }));
327
328 let origin1 = Origin::signed(1);
329 assert_ok!(TemplateModule::create_collection(274 create_test_item(collection_id, &data.into());
330 origin1.clone(),
331 col_name1.clone(),
332 col_desc1.clone(),
333 token_prefix1.clone(),
334 mode
335 ));
336 assert_eq!(TemplateModule::collection(1).owner, 1);
337
338 assert_ok!(TemplateModule::create_item(
339 origin1.clone(),
340 1,
341 [1, 2, 3].to_vec(),
342 1
343 ));
344 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());
345 assert_eq!(TemplateModule::balance_count(1, 1), 1);275 assert_eq!(TemplateModule::balance_count(1, 1), 1);
346 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);276 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
347277
278 let origin1 = Origin::signed(1);
348 // default scenario279 // default scenario
349 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));280 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));
350 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);281 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);
358#[test]289#[test]
359fn nft_approve_and_transfer_from() {290fn nft_approve_and_transfer_from() {
360 new_test_ext().execute_with(|| {291 new_test_ext().execute_with(|| {
361 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();292 default_limits();
362 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();293
363 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();294 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
364 let mode: CollectionMode = CollectionMode::NFT(2000);
365295
366 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 296 let data = default_nft_data();
367 collection_numbers_limit: 10,297 create_test_item(collection_id, &data.into());
368 account_token_ownership_limit: 10,
369 collections_admins_limit: 5,
370 custom_data_limit: 2048,
371 nft_sponsor_transfer_timeout: 15,
372 fungible_sponsor_transfer_timeout: 15,
373 refungible_sponsor_transfer_timeout: 15,
374 }));
375298
376 let origin1 = Origin::signed(1);299 let origin1 = Origin::signed(1);
377 let origin2 = Origin::signed(2);300 let origin2 = Origin::signed(2);
378 assert_ok!(TemplateModule::create_collection(
379 origin1.clone(),
380 col_name1.clone(),
381 col_desc1.clone(),
382 token_prefix1.clone(),
383 mode
384 ));
385 assert_eq!(TemplateModule::collection(1).owner, 1);
386301
387 assert_ok!(TemplateModule::create_item(
388 origin1.clone(),
389 1,
390 [1, 2, 3].to_vec(),
391 1
392 ));
393 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());
394 assert_eq!(TemplateModule::balance_count(1, 1), 1);302 assert_eq!(TemplateModule::balance_count(1, 1), 1);
395 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);303 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
396304
429#[test]337#[test]
430fn nft_approve_and_transfer_from_white_list() {338fn nft_approve_and_transfer_from_white_list() {
431 new_test_ext().execute_with(|| {339 new_test_ext().execute_with(|| {
432 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();340 default_limits();
433 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();341
434 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();342 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
435 let mode: CollectionMode = CollectionMode::NFT(2000);
436343
437 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
438 collection_numbers_limit: 10,
439 account_token_ownership_limit: 10,
440 collections_admins_limit: 5,
441 custom_data_limit: 2048,
442 nft_sponsor_transfer_timeout: 15,
443 fungible_sponsor_transfer_timeout: 15,
444 refungible_sponsor_transfer_timeout: 15,
445 }));
446
447 let origin1 = Origin::signed(1);344 let origin1 = Origin::signed(1);
448 let origin2 = Origin::signed(2);345 let origin2 = Origin::signed(2);
449 assert_ok!(TemplateModule::create_collection(
450 origin1.clone(),
451 col_name1.clone(),
452 col_desc1.clone(),
453 token_prefix1.clone(),
454 mode
455 ));
456 assert_eq!(TemplateModule::collection(1).owner, 1);
457346
458 assert_ok!(TemplateModule::create_item(347 let data = default_nft_data();
459 origin1.clone(),
460 1,348 create_test_item(collection_id, &data.clone().into());
461 [1, 2, 3].to_vec(),349
462 1
463 ));
464 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());350 assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);
465 assert_eq!(TemplateModule::balance_count(1, 1), 1);351 assert_eq!(TemplateModule::balance_count(1, 1), 1);
466 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);352 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
467353
507#[test]393#[test]
508fn refungible_approve_and_transfer_from() {394fn refungible_approve_and_transfer_from() {
509 new_test_ext().execute_with(|| {395 new_test_ext().execute_with(|| {
510 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();396 default_limits();
511 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();397
512 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();398 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);
513 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
514
515 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 399
516 collection_numbers_limit: 10,
517 account_token_ownership_limit: 10,
518 collections_admins_limit: 5,
519 custom_data_limit: 2048,
520 nft_sponsor_transfer_timeout: 15,
521 fungible_sponsor_transfer_timeout: 15,
522 refungible_sponsor_transfer_timeout: 15,
523 }));
524
525 let origin1 = Origin::signed(1);400 let origin1 = Origin::signed(1);
526 let origin2 = Origin::signed(2);401 let origin2 = Origin::signed(2);
527 assert_ok!(TemplateModule::create_collection(
528 origin1.clone(),
529 col_name1.clone(),
530 col_desc1.clone(),
531 token_prefix1.clone(),
532 mode
533 ));
534 assert_eq!(TemplateModule::collection(1).owner, 1);
535402
536 assert_ok!(TemplateModule::create_item(403 let data = default_re_fungible_data();
537 origin1.clone(),
538 1,
539 [1, 2, 3].to_vec(),
540 1
541 ));
542 assert_eq!(404 create_test_item(collection_id, &data.into());
543 TemplateModule::refungible_item_id(1, 1).data,405
544 [1, 2, 3].to_vec()
545 );
546 assert_eq!(
547 TemplateModule::refungible_item_id(1, 1).owner[0],
548 Ownership {
549 owner: 1,
550 fraction: 1000
551 }
552 );
553 assert_eq!(TemplateModule::balance_count(1, 1), 1000);406 assert_eq!(TemplateModule::balance_count(1, 1), 1000);
554 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);407 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
555408
607#[test]460#[test]
608fn fungible_approve_and_transfer_from() {461fn fungible_approve_and_transfer_from() {
609 new_test_ext().execute_with(|| {462 new_test_ext().execute_with(|| {
610 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();463 default_limits();
464
611 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();465 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);
612 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();466
467 let data = default_fungible_data();
613 let mode: CollectionMode = CollectionMode::Fungible(3);468 create_test_item(collection_id, &data.into());
614469
615 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
616 collection_numbers_limit: 10,
617 account_token_ownership_limit: 10,
618 collections_admins_limit: 5,
619 custom_data_limit: 2048,
620 nft_sponsor_transfer_timeout: 15,
621 fungible_sponsor_transfer_timeout: 15,
622 refungible_sponsor_transfer_timeout: 15,
623 }));
624
625 let origin1 = Origin::signed(1);470 let origin1 = Origin::signed(1);
626 let origin2 = Origin::signed(2);471 let origin2 = Origin::signed(2);
627 assert_ok!(TemplateModule::create_collection(
628 origin1.clone(),
629 col_name1.clone(),
630 col_desc1.clone(),
631 token_prefix1.clone(),
632 mode
633 ));
634 assert_eq!(TemplateModule::collection(1).owner, 1);
635472
636 assert_ok!(TemplateModule::create_item(
637 origin1.clone(),
638 1,
639 [].to_vec(),
640 1
641 ));
642 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);
643 assert_eq!(TemplateModule::balance_count(1, 1), 1000);473 assert_eq!(TemplateModule::balance_count(1, 1), 1000);
644 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);474 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
645475
713#[test]543#[test]
714fn change_collection_owner() {544fn change_collection_owner() {
715 new_test_ext().execute_with(|| {545 new_test_ext().execute_with(|| {
716 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();546 default_limits();
717 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();547
718 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();548 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
719 let mode: CollectionMode = CollectionMode::NFT(2000);
720
721 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 549
722 collection_numbers_limit: 10,
723 account_token_ownership_limit: 10,
724 collections_admins_limit: 5,
725 custom_data_limit: 2048,
726 nft_sponsor_transfer_timeout: 15,
727 fungible_sponsor_transfer_timeout: 15,
728 refungible_sponsor_transfer_timeout: 15,
729 }));
730
731 let origin1 = Origin::signed(1);550 let origin1 = Origin::signed(1);
732 assert_ok!(TemplateModule::create_collection(
733 origin1.clone(),
734 col_name1.clone(),
735 col_desc1.clone(),
736 token_prefix1.clone(),
737 mode
738 ));
739 assert_ok!(TemplateModule::change_collection_owner(551 assert_ok!(TemplateModule::change_collection_owner(
740 origin1.clone(),552 origin1.clone(),
741 1,553 collection_id,
742 2554 2
743 ));555 ));
744 assert_eq!(TemplateModule::collection(1).owner, 2);556 assert_eq!(TemplateModule::collection(collection_id).owner, 2);
745 });557 });
746}558}
747559
748#[test]560#[test]
749fn destroy_collection() {561fn destroy_collection() {
750 new_test_ext().execute_with(|| {562 new_test_ext().execute_with(|| {
751 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();563 default_limits();
752 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();564
753 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();565 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
754 let mode: CollectionMode = CollectionMode::NFT(2000);
755
756 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 566
757 collection_numbers_limit: 10,
758 account_token_ownership_limit: 10,
759 collections_admins_limit: 5,
760 custom_data_limit: 2048,
761 nft_sponsor_transfer_timeout: 15,
762 fungible_sponsor_transfer_timeout: 15,
763 refungible_sponsor_transfer_timeout: 15,
764 }));
765
766 let origin1 = Origin::signed(1);567 let origin1 = Origin::signed(1);
767 assert_ok!(TemplateModule::create_collection(568 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));
768 origin1.clone(),
769 col_name1.clone(),
770 col_desc1.clone(),
771 token_prefix1.clone(),
772 mode
773 ));
774 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));
775 });569 });
776}570}
777571
778#[test]572#[test]
779fn burn_nft_item() {573fn burn_nft_item() {
780 new_test_ext().execute_with(|| {574 new_test_ext().execute_with(|| {
781 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();575 default_limits();
782 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();576
783 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();577 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
784 let mode: CollectionMode = CollectionMode::NFT(2000);
785578
786 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
787 collection_numbers_limit: 10,
788 account_token_ownership_limit: 10,
789 collections_admins_limit: 5,
790 custom_data_limit: 2048,
791 nft_sponsor_transfer_timeout: 15,
792 fungible_sponsor_transfer_timeout: 15,
793 refungible_sponsor_transfer_timeout: 15,
794 }));
795
796 let origin1 = Origin::signed(1);579 let origin1 = Origin::signed(1);
797 assert_ok!(TemplateModule::create_collection(580 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));
798 origin1.clone(),
799 col_name1.clone(),
800 col_desc1.clone(),
801 token_prefix1.clone(),
802 mode
803 ));
804 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
805 assert_ok!(TemplateModule::create_item(581
806 origin1.clone(),582 let data = default_nft_data();
807 1,583 create_test_item(collection_id, &data.into());
808 [1, 2, 3].to_vec(),
809 1
810 ));
811584
812 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());
813
814 // check balance (collection with id = 1, user id = 1)585 // check balance (collection with id = 1, user id = 1)
815 assert_eq!(TemplateModule::balance_count(1, 1), 1);586 assert_eq!(TemplateModule::balance_count(1, 1), 1);
816587
828#[test]599#[test]
829fn burn_fungible_item() {600fn burn_fungible_item() {
830 new_test_ext().execute_with(|| {601 new_test_ext().execute_with(|| {
831 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();602 default_limits();
832 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();603
833 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();604 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);
834 let mode: CollectionMode = CollectionMode::Fungible(3);
835
836 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
837 collection_numbers_limit: 10,605
838 account_token_ownership_limit: 10,
839 collections_admins_limit: 5,
840 custom_data_limit: 2048,
841 nft_sponsor_transfer_timeout: 15,
842 fungible_sponsor_transfer_timeout: 15,
843 refungible_sponsor_transfer_timeout: 15,
844 }));
845
846 let origin1 = Origin::signed(1);606 let origin1 = Origin::signed(1);
847 assert_ok!(TemplateModule::create_collection(607 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));
848 origin1.clone(),
849 col_name1.clone(),
850 col_desc1.clone(),
851 token_prefix1.clone(),
852 mode
853 ));
854 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
855 assert_ok!(TemplateModule::create_item(608
856 origin1.clone(),609 let data = default_fungible_data();
857 1,610 create_test_item(collection_id, &data.into());
858 [].to_vec(),
859 1
860 ));
861611
862 // check balance (collection with id = 1, user id = 1)612 // check balance (collection with id = 1, user id = 1)
863 assert_eq!(TemplateModule::balance_count(1, 1), 1000);613 assert_eq!(TemplateModule::balance_count(1, 1), 1000);
876#[test]626#[test]
877fn burn_refungible_item() {627fn burn_refungible_item() {
878 new_test_ext().execute_with(|| {628 new_test_ext().execute_with(|| {
879 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();629 default_limits();
880 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();630
881 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();631 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);
882 let mode: CollectionMode = CollectionMode::ReFungible(200, 3);
883
884 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
885 collection_numbers_limit: 10,
886 account_token_ownership_limit: 10,
887 collections_admins_limit: 5,
888 custom_data_limit: 2048,
889 nft_sponsor_transfer_timeout: 15,
890 fungible_sponsor_transfer_timeout: 15,
891 refungible_sponsor_transfer_timeout: 15,
892 }));
893
894 let origin1 = Origin::signed(1);632 let origin1 = Origin::signed(1);
895 let origin2 = Origin::signed(2);
896 assert_ok!(TemplateModule::create_collection(
897 origin1.clone(),
898 col_name1.clone(),
899 col_desc1.clone(),
900 token_prefix1.clone(),
901 mode
902 ));
903633
904 assert_ok!(TemplateModule::set_mint_permission(634 assert_ok!(TemplateModule::set_mint_permission(
905 origin1.clone(),635 origin1.clone(),
906 1,636 collection_id,
907 true637 true
908 ));638 ));
909 assert_ok!(TemplateModule::set_public_access_mode(639 assert_ok!(TemplateModule::set_public_access_mode(
910 origin1.clone(),640 origin1.clone(),
911 1,641 collection_id,
912 AccessMode::WhiteList642 AccessMode::WhiteList
913 ));643 ));
914 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));644 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
915645
916 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));646 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
917 assert_ok!(TemplateModule::create_item(647
918 origin2.clone(),648 let data = default_re_fungible_data();
919 1,649 create_test_item(collection_id, &data.into());
920 [1, 2, 3].to_vec(),
921 1
922 ));
923650
924 assert_eq!(
925 TemplateModule::refungible_item_id(1, 1).data,
926 [1, 2, 3].to_vec()
927 );
928
929 // check balance (collection with id = 1, user id = 2)651 // check balance (collection with id = 1, user id = 2)
930 assert_eq!(TemplateModule::balance_count(1, 1), 1000);652 assert_eq!(TemplateModule::balance_count(1, 1), 1000);
931653
943#[test]665#[test]
944fn add_collection_admin() {666fn add_collection_admin() {
945 new_test_ext().execute_with(|| {667 new_test_ext().execute_with(|| {
946 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();668 default_limits();
947 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();669
948 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();670 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);
949 let mode: CollectionMode = CollectionMode::NFT(2000);
950
951 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 671 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);
952 collection_numbers_limit: 10,
953 account_token_ownership_limit: 10,
954 collections_admins_limit: 5,672 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);
955 custom_data_limit: 2048,
956 nft_sponsor_transfer_timeout: 15,
957 fungible_sponsor_transfer_timeout: 15,
958 refungible_sponsor_transfer_timeout: 15, 673
959 }));
960
961 let origin1 = Origin::signed(1);674 let origin1 = Origin::signed(1);
962 let origin2 = Origin::signed(2);
963 let origin3 = Origin::signed(3);
964 assert_ok!(TemplateModule::create_collection(
965 origin1.clone(),
966 col_name1.clone(),
967 col_desc1.clone(),
968 token_prefix1.clone(),
969 mode.clone()
970 ));
971 assert_ok!(TemplateModule::create_collection(
972 origin2.clone(),
973 col_name1.clone(),
974 col_desc1.clone(),
975 token_prefix1.clone(),
976 mode.clone()
977 ));
978 assert_ok!(TemplateModule::create_collection(
979 origin3.clone(),
980 col_name1.clone(),
981 col_desc1.clone(),
982 token_prefix1.clone(),
983 mode.clone()
984 ));
985675
986 assert_eq!(TemplateModule::collection(1).owner, 1);
987 assert_eq!(TemplateModule::collection(2).owner, 2);
988 assert_eq!(TemplateModule::collection(3).owner, 3);
989
990 // collection admin676 // collection admin
991 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));677 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));
992 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));678 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));
993679
994 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);680 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);
995 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);681 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);
996 });682 });
997}683}
998684
999#[test]685#[test]
1000fn remove_collection_admin() {686fn remove_collection_admin() {
1001 new_test_ext().execute_with(|| {687 new_test_ext().execute_with(|| {
1002 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();688 default_limits();
689
1003 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();690 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);
1004 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();691 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);
1005 let mode: CollectionMode = CollectionMode::NFT(2000);692 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);
1006693
1007 let origin1 = Origin::signed(1);694 let origin1 = Origin::signed(1);
1008 let origin2 = Origin::signed(2);695 let origin2 = Origin::signed(2);
1009 let origin3 = Origin::signed(3);
1010696
1011 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1012 collection_numbers_limit: 10,
1013 account_token_ownership_limit: 10,
1014 collections_admins_limit: 5,
1015 custom_data_limit: 2048,
1016 nft_sponsor_transfer_timeout: 15,
1017 fungible_sponsor_transfer_timeout: 15,
1018 refungible_sponsor_transfer_timeout: 15,
1019 }));
1020
1021 assert_ok!(TemplateModule::create_collection(
1022 origin1.clone(),
1023 col_name1.clone(),
1024 col_desc1.clone(),
1025 token_prefix1.clone(),
1026 mode.clone()
1027 ));
1028 assert_ok!(TemplateModule::create_collection(
1029 origin2.clone(),
1030 col_name1.clone(),
1031 col_desc1.clone(),
1032 token_prefix1.clone(),
1033 mode.clone()
1034 ));
1035 assert_ok!(TemplateModule::create_collection(
1036 origin3.clone(),
1037 col_name1.clone(),
1038 col_desc1.clone(),
1039 token_prefix1.clone(),
1040 mode.clone()
1041 ));
1042
1043 assert_eq!(TemplateModule::collection(1).owner, 1);
1044 assert_eq!(TemplateModule::collection(2).owner, 2);
1045 assert_eq!(TemplateModule::collection(3).owner, 3);
1046
1047 // collection admin697 // collection admin
1048 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));698 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));
1049 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));699 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));
1050700
1051 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);701 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);
1052 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);702 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);
1064#[test]714#[test]
1065fn balance_of() {715fn balance_of() {
1066 new_test_ext().execute_with(|| {716 new_test_ext().execute_with(|| {
1067 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();717 default_limits();
1068 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();718
1069 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();719 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);
1070 let nft_mode: CollectionMode = CollectionMode::NFT(2000);
1071 let furg_mode: CollectionMode = CollectionMode::Fungible(3);720 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);
1072 let refung_mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
1073
1074 let origin1 = Origin::signed(1);721 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);
1075
1076 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1077 collection_numbers_limit: 10,
1078 account_token_ownership_limit: 10,
1079 collections_admins_limit: 5,
1080 custom_data_limit: 2048,
1081 nft_sponsor_transfer_timeout: 15,
1082 fungible_sponsor_transfer_timeout: 15,
1083 refungible_sponsor_transfer_timeout: 15,
1084 }));
1085
1086 assert_ok!(TemplateModule::create_collection(722
1087 origin1.clone(),
1088 col_name1.clone(),
1089 col_desc1.clone(),
1090 token_prefix1.clone(),
1091 nft_mode.clone()
1092 ));
1093 assert_ok!(TemplateModule::create_collection(
1094 origin1.clone(),
1095 col_name1.clone(),
1096 col_desc1.clone(),
1097 token_prefix1.clone(),
1098 furg_mode.clone()
1099 ));
1100 assert_ok!(TemplateModule::create_collection(
1101 origin1.clone(),
1102 col_name1.clone(),
1103 col_desc1.clone(),
1104 token_prefix1.clone(),
1105 refung_mode.clone()
1106 ));
1107
1108 assert_eq!(TemplateModule::collection(1).owner, 1);
1109 assert_eq!(TemplateModule::collection(2).owner, 1);
1110 assert_eq!(TemplateModule::collection(3).owner, 1);
1111
1112 // check balance before723 // check balance before
1113 assert_eq!(TemplateModule::balance_count(1, 1), 0);724 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);
1114 assert_eq!(TemplateModule::balance_count(2, 1), 0);725 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);
1115 assert_eq!(TemplateModule::balance_count(3, 1), 0);726 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);
1116727
1117 // create item728 let nft_data = default_nft_data();
1118 assert_ok!(TemplateModule::create_item(729 create_test_item(nft_collection_id, &nft_data.into());
1119 origin1.clone(),730
1120 1,731 let fungible_data = default_fungible_data();
1121 [1, 1, 1].to_vec(),732 create_test_item(fungible_collection_id, &fungible_data.into());
733
1122 1734 let re_fungible_data = default_re_fungible_data();
1123 ));735 create_test_item(re_fungible_collection_id, &re_fungible_data.into());
1124736
1125 assert_ok!(TemplateModule::create_item(
1126 origin1.clone(),
1127 2,
1128 [].to_vec(),
1129 1
1130 ));
1131
1132 assert_ok!(TemplateModule::create_item(
1133 origin1.clone(),
1134 3,
1135 [1, 1, 1].to_vec(),
1136 1
1137 ));
1138
1139 // check balance (collection with id = 1, user id = 1)737 // check balance (collection with id = 1, user id = 1)
1140 assert_eq!(TemplateModule::balance_count(1, 1), 1);738 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);
1141 assert_eq!(TemplateModule::balance_count(2, 1), 1000);739 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);
1142 assert_eq!(TemplateModule::balance_count(3, 1), 1000);740 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);
1143 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 1);741 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);
1144 assert_eq!(TemplateModule::fungible_item_id(2, 1).owner, 1);742 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);
1145 assert_eq!(TemplateModule::refungible_item_id(3, 1).owner[0].owner, 1);743 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);
1146 });744 });
1147}745}
1148746
1149#[test]747#[test]
1150fn approve() {748fn approve() {
1151 new_test_ext().execute_with(|| {749 new_test_ext().execute_with(|| {
1152 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();750 default_limits();
751
1153 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();752 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1154 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();753
1155 let nft_mode: CollectionMode = CollectionMode::NFT(2000);754 let data = default_nft_data();
1156 let origin1 = Origin::signed(1);755 create_test_item(collection_id, &data.into());
1157756
1158 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 757 let origin1 = Origin::signed(1);
1159 collection_numbers_limit: 10,
1160 account_token_ownership_limit: 10,
1161 collections_admins_limit: 5,
1162 custom_data_limit: 2048,
1163 nft_sponsor_transfer_timeout: 15,
1164 fungible_sponsor_transfer_timeout: 15,
1165 refungible_sponsor_transfer_timeout: 15,
1166 }));
1167
1168 assert_ok!(TemplateModule::create_collection(
1169 origin1.clone(),
1170 col_name1.clone(),
1171 col_desc1.clone(),
1172 token_prefix1.clone(),
1173 nft_mode.clone()
1174 ));
1175
1176 assert_eq!(TemplateModule::collection(1).owner, 1);
1177
1178 // create item758
1179 assert_ok!(TemplateModule::create_item(
1180 origin1.clone(),
1181 1,
1182 [1, 1, 1].to_vec(),
1183 1
1184 ));
1185
1186 // approve759 // approve
1187 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));760 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
1192#[test]765#[test]
1193fn transfer_from() {766fn transfer_from() {
1194 new_test_ext().execute_with(|| {767 new_test_ext().execute_with(|| {
1195 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();768 default_limits();
1196 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();769
1197 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();770 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1198 let mode: CollectionMode = CollectionMode::NFT(2000);
1199 let origin1 = Origin::signed(1);771 let origin1 = Origin::signed(1);
1200 let origin2 = Origin::signed(2);772 let origin2 = Origin::signed(2);
1201773
1202 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 774 let data = default_nft_data();
1203 collection_numbers_limit: 10,775 create_test_item(collection_id, &data.into());
1204 account_token_ownership_limit: 10,
1205 collections_admins_limit: 5,
1206 custom_data_limit: 2048,
1207 nft_sponsor_transfer_timeout: 15,
1208 fungible_sponsor_transfer_timeout: 15,
1209 refungible_sponsor_transfer_timeout: 15,
1210 }));
1211776
1212 assert_ok!(TemplateModule::create_collection(
1213 origin1.clone(),
1214 col_name1.clone(),
1215 col_desc1.clone(),
1216 token_prefix1.clone(),
1217 mode
1218 ));
1219
1220 assert_eq!(TemplateModule::collection(1).owner, 1);
1221
1222 // create item
1223 assert_ok!(TemplateModule::create_item(
1224 origin1.clone(),
1225 1,
1226 [1, 1, 1].to_vec(),
1227 1
1228 ));
1229
1230 // approve777 // approve
1231 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));778 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
1232 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);779 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);
1268#[test]815#[test]
1269fn owner_can_add_address_to_white_list() {816fn owner_can_add_address_to_white_list() {
1270 new_test_ext().execute_with(|| {817 new_test_ext().execute_with(|| {
1271 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();818 default_limits();
1272 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();819
1273 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();820 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1274 let mode: CollectionMode = CollectionMode::NFT(2000);
1275 let origin1 = Origin::signed(1);
1276821
1277 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 822 let origin1 = Origin::signed(1);
1278 collection_numbers_limit: 10,
1279 account_token_ownership_limit: 10,
1280 collections_admins_limit: 5,
1281 custom_data_limit: 2048,
1282 nft_sponsor_transfer_timeout: 15,
1283 fungible_sponsor_transfer_timeout: 15,
1284 refungible_sponsor_transfer_timeout: 15,
1285 }));
1286
1287 assert_ok!(TemplateModule::create_collection(
1288 origin1.clone(),
1289 col_name1.clone(),
1290 col_desc1.clone(),
1291 token_prefix1.clone(),
1292 mode
1293 ));
1294
1295 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));823 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
1296 assert_eq!(TemplateModule::white_list(1)[0], 2);824 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);
1297 });825 });
1298}826}
1299827
1300#[test]828#[test]
1301fn admin_can_add_address_to_white_list() {829fn admin_can_add_address_to_white_list() {
1302 new_test_ext().execute_with(|| {830 new_test_ext().execute_with(|| {
1303 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();831 default_limits();
1304 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();832
1305 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();833 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1306 let mode: CollectionMode = CollectionMode::NFT(2000);
1307 let origin1 = Origin::signed(1);834 let origin1 = Origin::signed(1);
1308 let origin2 = Origin::signed(2);835 let origin2 = Origin::signed(2);
1309836
1310 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 837 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));
1311 collection_numbers_limit: 10,
1312 account_token_ownership_limit: 10,
1313 collections_admins_limit: 5,
1314 custom_data_limit: 2048,
1315 nft_sponsor_transfer_timeout: 15,
1316 fungible_sponsor_transfer_timeout: 15,
1317 refungible_sponsor_transfer_timeout: 15,
1318 }));
1319
1320 assert_ok!(TemplateModule::create_collection(
1321 origin1.clone(),
1322 col_name1.clone(),
1323 col_desc1.clone(),
1324 token_prefix1.clone(),
1325 mode
1326 ));
1327
1328 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
1329 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3));838 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));
1330 assert_eq!(TemplateModule::white_list(1)[0], 3);839 assert_eq!(TemplateModule::white_list(collection_id)[0], 3);
1331 });840 });
1332}841}
1333842
1334#[test]843#[test]
1335fn nonprivileged_user_cannot_add_address_to_white_list() {844fn nonprivileged_user_cannot_add_address_to_white_list() {
1336 new_test_ext().execute_with(|| {845 new_test_ext().execute_with(|| {
1337 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();846 default_limits();
1338 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();847
1339 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();848 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1340 let mode: CollectionMode = CollectionMode::NFT(2000);
1341 let origin1 = Origin::signed(1);
1342 let origin2 = Origin::signed(2);
1343849
1344 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 850 let origin2 = Origin::signed(2);
1345 collection_numbers_limit: 10,
1346 account_token_ownership_limit: 10,
1347 collections_admins_limit: 5,
1348 custom_data_limit: 2048,
1349 nft_sponsor_transfer_timeout: 15,
1350 fungible_sponsor_transfer_timeout: 15,
1351 refungible_sponsor_transfer_timeout: 15,
1352 }));
1353
1354 assert_ok!(TemplateModule::create_collection(
1355 origin1.clone(),
1356 col_name1.clone(),
1357 col_desc1.clone(),
1358 token_prefix1.clone(),
1359 mode
1360 ));
1361
1362 assert_noop!(851 assert_noop!(
1363 TemplateModule::add_to_white_list(origin2.clone(), 1, 3),852 TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),
1364 "You do not have permissions to modify this collection"853 "You do not have permissions to modify this collection"
1365 );854 );
1366 });855 });
1369#[test]858#[test]
1370fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {859fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {
1371 new_test_ext().execute_with(|| {860 new_test_ext().execute_with(|| {
861 default_limits();
862
1372 let origin1 = Origin::signed(1);863 let origin1 = Origin::signed(1);
1373864
1374 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1375 collection_numbers_limit: 10,
1376 account_token_ownership_limit: 10,
1377 collections_admins_limit: 5,
1378 custom_data_limit: 2048,
1379 nft_sponsor_transfer_timeout: 15,
1380 fungible_sponsor_transfer_timeout: 15,
1381 refungible_sponsor_transfer_timeout: 15,
1382 }));
1383
1384 assert_noop!(865 assert_noop!(
1385 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),866 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),
1386 "This collection does not exist"867 "This collection does not exist"
1391#[test]872#[test]
1392fn nobody_can_add_address_to_white_list_of_deleted_collection() {873fn nobody_can_add_address_to_white_list_of_deleted_collection() {
1393 new_test_ext().execute_with(|| {874 new_test_ext().execute_with(|| {
1394 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();875 default_limits();
1395 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();876
1396 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();877 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1397 let mode: CollectionMode = CollectionMode::NFT(2000);
1398 let origin1 = Origin::signed(1);
1399878
1400 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 879 let origin1 = Origin::signed(1);
1401 collection_numbers_limit: 10,
1402 account_token_ownership_limit: 10,
1403 collections_admins_limit: 5,
1404 custom_data_limit: 2048,
1405 nft_sponsor_transfer_timeout: 15,
1406 fungible_sponsor_transfer_timeout: 15,
1407 refungible_sponsor_transfer_timeout: 15,
1408 }));
1409
1410 assert_ok!(TemplateModule::create_collection(
1411 origin1.clone(),
1412 col_name1.clone(),
1413 col_desc1.clone(),
1414 token_prefix1.clone(),
1415 mode
1416 ));
1417
1418 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));880 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));
1419 assert_noop!(881 assert_noop!(
1420 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),882 TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),
1421 "This collection does not exist"883 "This collection does not exist"
1422 );884 );
1423 });885 });
1427#[test]889#[test]
1428fn address_is_already_added_to_white_list() {890fn address_is_already_added_to_white_list() {
1429 new_test_ext().execute_with(|| {891 new_test_ext().execute_with(|| {
1430 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();892 default_limits();
1431 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();893
1432 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();894 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1433 let mode: CollectionMode = CollectionMode::NFT(2000);
1434 let origin1 = Origin::signed(1);895 let origin1 = Origin::signed(1);
1435
1436 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 896
1437 collection_numbers_limit: 10,897 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
1438 account_token_ownership_limit: 10,
1439 collections_admins_limit: 5,
1440 custom_data_limit: 2048,
1441 nft_sponsor_transfer_timeout: 15,
1442 fungible_sponsor_transfer_timeout: 15,
1443 refungible_sponsor_transfer_timeout: 15,
1444 }));
1445
1446 assert_ok!(TemplateModule::create_collection(
1447 origin1.clone(),
1448 col_name1.clone(),
1449 col_desc1.clone(),
1450 token_prefix1.clone(),
1451 mode
1452 ));
1453
1454 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
1455 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));898 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
1456 assert_eq!(TemplateModule::white_list(1)[0], 2);899 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);
1457 assert_eq!(TemplateModule::white_list(1).len(), 1);900 assert_eq!(TemplateModule::white_list(collection_id).len(), 1);
1458 });901 });
1459}902}
1460903
1461#[test]904#[test]
1462fn owner_can_remove_address_from_white_list() {905fn owner_can_remove_address_from_white_list() {
1463 new_test_ext().execute_with(|| {906 new_test_ext().execute_with(|| {
1464 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();907 default_limits();
1465 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();908
1466 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();909 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1467 let mode: CollectionMode = CollectionMode::NFT(2000);
1468 let origin1 = Origin::signed(1);
1469910
1470 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 911 let origin1 = Origin::signed(1);
1471 collection_numbers_limit: 10,
1472 account_token_ownership_limit: 10,
1473 collections_admins_limit: 5,
1474 custom_data_limit: 2048,
1475 nft_sponsor_transfer_timeout: 15,
1476 fungible_sponsor_transfer_timeout: 15,
1477 refungible_sponsor_transfer_timeout: 15,
1478 }));
1479
1480 assert_ok!(TemplateModule::create_collection(
1481 origin1.clone(),
1482 col_name1.clone(),
1483 col_desc1.clone(),
1484 token_prefix1.clone(),
1485 mode
1486 ));
1487
1488 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));912 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
1489 assert_ok!(TemplateModule::remove_from_white_list(913 assert_ok!(TemplateModule::remove_from_white_list(
1490 origin1.clone(),914 origin1.clone(),
1491 1,915 collection_id,
1492 2916 2
1493 ));917 ));
1494 assert_eq!(TemplateModule::white_list(1).len(), 0);918 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);
1495 });919 });
1496}920}
1497921
1498#[test]922#[test]
1499fn admin_can_remove_address_from_white_list() {923fn admin_can_remove_address_from_white_list() {
1500 new_test_ext().execute_with(|| {924 new_test_ext().execute_with(|| {
1501 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();925 default_limits();
1502 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();926
1503 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();927 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1504 let mode: CollectionMode = CollectionMode::NFT(2000);
1505 let origin1 = Origin::signed(1);928 let origin1 = Origin::signed(1);
1506 let origin2 = Origin::signed(2);929 let origin2 = Origin::signed(2);
1507930
1508 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 931 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));
1509 collection_numbers_limit: 10,
1510 account_token_ownership_limit: 10,
1511 collections_admins_limit: 5,
1512 custom_data_limit: 2048,
1513 nft_sponsor_transfer_timeout: 15,
1514 fungible_sponsor_transfer_timeout: 15,
1515 refungible_sponsor_transfer_timeout: 15,
1516 }));
1517932
1518 assert_ok!(TemplateModule::create_collection(933 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));
1519 origin1.clone(),
1520 col_name1.clone(),
1521 col_desc1.clone(),
1522 token_prefix1.clone(),
1523 mode
1524 ));
1525
1526 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
1527
1528 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));
1529 assert_ok!(TemplateModule::remove_from_white_list(934 assert_ok!(TemplateModule::remove_from_white_list(
1530 origin2.clone(),935 origin2.clone(),
1531 1,936 collection_id,
1532 3937 3
1533 ));938 ));
1534 assert_eq!(TemplateModule::white_list(1).len(), 0);939 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);
1535 });940 });
1536}941}
1537942
1538#[test]943#[test]
1539fn nonprivileged_user_cannot_remove_address_from_white_list() {944fn nonprivileged_user_cannot_remove_address_from_white_list() {
1540 new_test_ext().execute_with(|| {945 new_test_ext().execute_with(|| {
1541 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();946 default_limits();
1542 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();947
1543 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();948 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1544 let mode: CollectionMode = CollectionMode::NFT(2000);
1545 let origin1 = Origin::signed(1);949 let origin1 = Origin::signed(1);
1546 let origin2 = Origin::signed(2);950 let origin2 = Origin::signed(2);
1547951
1548 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 952 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
1549 collection_numbers_limit: 10,
1550 account_token_ownership_limit: 10,
1551 collections_admins_limit: 5,
1552 custom_data_limit: 2048,
1553 nft_sponsor_transfer_timeout: 15,
1554 fungible_sponsor_transfer_timeout: 15,
1555 refungible_sponsor_transfer_timeout: 15,
1556 }));
1557
1558 assert_ok!(TemplateModule::create_collection(
1559 origin1.clone(),
1560 col_name1.clone(),
1561 col_desc1.clone(),
1562 token_prefix1.clone(),
1563 mode
1564 ));
1565
1566 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
1567 assert_noop!(953 assert_noop!(
1568 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),954 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),
1569 "You do not have permissions to modify this collection"955 "You do not have permissions to modify this collection"
1570 );956 );
1571 assert_eq!(TemplateModule::white_list(1)[0], 2);957 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);
1572 });958 });
1573}959}
1574960
1575#[test]961#[test]
1576fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {962fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {
1577 new_test_ext().execute_with(|| {963 new_test_ext().execute_with(|| {
964 default_limits();
1578 let origin1 = Origin::signed(1);965 let origin1 = Origin::signed(1);
1579966
1580 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1581 collection_numbers_limit: 10,
1582 account_token_ownership_limit: 10,
1583 collections_admins_limit: 5,
1584 custom_data_limit: 2048,
1585 nft_sponsor_transfer_timeout: 15,
1586 fungible_sponsor_transfer_timeout: 15,
1587 refungible_sponsor_transfer_timeout: 15,
1588 }));
1589
1590 assert_noop!(967 assert_noop!(
1591 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),968 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),
1592 "This collection does not exist"969 "This collection does not exist"
1597#[test]974#[test]
1598fn nobody_can_remove_address_from_white_list_of_deleted_collection() {975fn nobody_can_remove_address_from_white_list_of_deleted_collection() {
1599 new_test_ext().execute_with(|| {976 new_test_ext().execute_with(|| {
1600 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();977 default_limits();
1601 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();978
1602 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();979 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1603 let mode: CollectionMode = CollectionMode::NFT(2000);
1604 let origin1 = Origin::signed(1);980 let origin1 = Origin::signed(1);
1605 let origin2 = Origin::signed(2);981 let origin2 = Origin::signed(2);
1606982
1607 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 983 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
1608 collection_numbers_limit: 10,
1609 account_token_ownership_limit: 10,
1610 collections_admins_limit: 5,
1611 custom_data_limit: 2048,
1612 nft_sponsor_transfer_timeout: 15,
1613 fungible_sponsor_transfer_timeout: 15,
1614 refungible_sponsor_transfer_timeout: 15,
1615 }));
1616
1617 assert_ok!(TemplateModule::create_collection(
1618 origin1.clone(),
1619 col_name1.clone(),
1620 col_desc1.clone(),
1621 token_prefix1.clone(),
1622 mode
1623 ));
1624
1625 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
1626 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));984 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));
1627 assert_noop!(985 assert_noop!(
1628 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),986 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),
1629 "This collection does not exist"987 "This collection does not exist"
1630 );988 );
1631 assert_eq!(TemplateModule::white_list(1).len(), 0);989 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);
1632 });990 });
1633}991}
1634992
1635// If address is already removed from white list, nothing happens993// If address is already removed from white list, nothing happens
1636#[test]994#[test]
1637fn address_is_already_removed_from_white_list() {995fn address_is_already_removed_from_white_list() {
1638 new_test_ext().execute_with(|| {996 new_test_ext().execute_with(|| {
1639 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();997 default_limits();
1640 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();998
1641 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();999 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1642 let mode: CollectionMode = CollectionMode::NFT(2000);
1643 let origin1 = Origin::signed(1);1000 let origin1 = Origin::signed(1);
16441001
1645 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1002 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
1646 collection_numbers_limit: 10,
1647 account_token_ownership_limit: 10,
1648 collections_admins_limit: 5,
1649 custom_data_limit: 2048,
1650 nft_sponsor_transfer_timeout: 15,
1651 fungible_sponsor_transfer_timeout: 15,
1652 refungible_sponsor_transfer_timeout: 15,
1653 }));
1654
1655 assert_ok!(TemplateModule::create_collection(
1656 origin1.clone(),
1657 col_name1.clone(),
1658 col_desc1.clone(),
1659 token_prefix1.clone(),
1660 mode
1661 ));
1662
1663 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
1664 assert_ok!(TemplateModule::remove_from_white_list(1003 assert_ok!(TemplateModule::remove_from_white_list(
1665 origin1.clone(),1004 origin1.clone(),
1666 1,1005 collection_id,
1667 21006 2
1668 ));1007 ));
1669 assert_ok!(TemplateModule::remove_from_white_list(1008 assert_ok!(TemplateModule::remove_from_white_list(
1670 origin1.clone(),1009 origin1.clone(),
1671 1,1010 collection_id,
1672 21011 2
1673 ));1012 ));
1674 assert_eq!(TemplateModule::white_list(1).len(), 0);1013 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);
1675 });1014 });
1676}1015}
16771016
1678// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1017// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)
1679#[test]1018#[test]
1680fn white_list_test_1() {1019fn white_list_test_1() {
1681 new_test_ext().execute_with(|| {1020 new_test_ext().execute_with(|| {
1682 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1021 default_limits();
1683 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1022
1684 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1023 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1685 let mode: CollectionMode = CollectionMode::NFT(2000);
16861024
1687 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1688 collection_numbers_limit: 10,
1689 account_token_ownership_limit: 10,
1690 collections_admins_limit: 5,
1691 custom_data_limit: 2048,
1692 nft_sponsor_transfer_timeout: 15,
1693 fungible_sponsor_transfer_timeout: 15,
1694 refungible_sponsor_transfer_timeout: 15,
1695 }));
1696
1697 let origin1 = Origin::signed(1);1025 let origin1 = Origin::signed(1);
1698 assert_ok!(TemplateModule::create_collection(1026
1699 origin1.clone(),1027 let data = default_nft_data();
1700 col_name1.clone(),1028 create_test_item(collection_id, &data.into());
1701 col_desc1.clone(),
1702 token_prefix1.clone(),
1703 mode
1704 ));
1705 assert_eq!(TemplateModule::collection(1).owner, 1);
17061029
1707 assert_ok!(TemplateModule::create_item(
1708 origin1.clone(),
1709 1,
1710 [1, 2, 3].to_vec(),
1711 1
1712 ));
1713
1714 assert_ok!(TemplateModule::set_public_access_mode(1030 assert_ok!(TemplateModule::set_public_access_mode(
1715 origin1.clone(),1031 origin1.clone(),
1716 1,1032 collection_id,
1717 AccessMode::WhiteList1033 AccessMode::WhiteList
1718 ));1034 ));
1719 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1035 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
17201036
1721 assert_noop!(1037 assert_noop!(
1722 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1038 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),
1728#[test]1044#[test]
1729fn white_list_test_2() {1045fn white_list_test_2() {
1730 new_test_ext().execute_with(|| {1046 new_test_ext().execute_with(|| {
1731 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1047 default_limits();
1732 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1048
1733 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1049 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1734 let mode: CollectionMode = CollectionMode::NFT(2000);
1735
1736 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1737 collection_numbers_limit: 10,
1738 account_token_ownership_limit: 10,
1739 collections_admins_limit: 5,
1740 custom_data_limit: 2048,
1741 nft_sponsor_transfer_timeout: 15,
1742 fungible_sponsor_transfer_timeout: 15,
1743 refungible_sponsor_transfer_timeout: 15,
1744 }));
1745
1746 let origin1 = Origin::signed(1);1050 let origin1 = Origin::signed(1);
1747 assert_ok!(TemplateModule::create_collection(1051
1748 origin1.clone(),1052 let data = default_nft_data();
1749 col_name1.clone(),1053 create_test_item(collection_id, &data.into());
1750 col_desc1.clone(),
1751 token_prefix1.clone(),
1752 mode
1753 ));
1754 assert_eq!(TemplateModule::collection(1).owner, 1);
17551054
1756 assert_ok!(TemplateModule::create_item(
1757 origin1.clone(),
1758 1,
1759 [1, 2, 3].to_vec(),
1760 1
1761 ));
1762
1763 assert_ok!(TemplateModule::set_public_access_mode(1055 assert_ok!(TemplateModule::set_public_access_mode(
1764 origin1.clone(),1056 origin1.clone(),
1765 1,1057 collection_id,
1766 AccessMode::WhiteList1058 AccessMode::WhiteList
1767 ));1059 ));
1768 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1060 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
1789#[test]1081#[test]
1790fn white_list_test_3() {1082fn white_list_test_3() {
1791 new_test_ext().execute_with(|| {1083 new_test_ext().execute_with(|| {
1792 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1084 default_limits();
1793 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1085
1794 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1086 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1795 let mode: CollectionMode = CollectionMode::NFT(2000);
17961087
1797 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1798 collection_numbers_limit: 10,
1799 account_token_ownership_limit: 10,
1800 collections_admins_limit: 5,
1801 custom_data_limit: 2048,
1802 nft_sponsor_transfer_timeout: 15,
1803 fungible_sponsor_transfer_timeout: 15,
1804 refungible_sponsor_transfer_timeout: 15,
1805 }));
1806
1807 let origin1 = Origin::signed(1);1088 let origin1 = Origin::signed(1);
1808 assert_ok!(TemplateModule::create_collection(1089
1809 origin1.clone(),1090 let data = default_nft_data();
1810 col_name1.clone(),1091 create_test_item(collection_id, &data.into());
1811 col_desc1.clone(),
1812 token_prefix1.clone(),
1813 mode
1814 ));
1815 assert_eq!(TemplateModule::collection(1).owner, 1);
18161092
1817 assert_ok!(TemplateModule::create_item(
1818 origin1.clone(),
1819 1,
1820 [1, 2, 3].to_vec(),
1821 1
1822 ));
1823
1824 assert_ok!(TemplateModule::set_public_access_mode(1093 assert_ok!(TemplateModule::set_public_access_mode(
1825 origin1.clone(),1094 origin1.clone(),
1826 1,1095 collection_id,
1827 AccessMode::WhiteList1096 AccessMode::WhiteList
1828 ));1097 ));
1829 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1098 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
1838#[test]1107#[test]
1839fn white_list_test_4() {1108fn white_list_test_4() {
1840 new_test_ext().execute_with(|| {1109 new_test_ext().execute_with(|| {
1841 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1110 default_limits();
1842 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1111
1843 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1112 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1844 let mode: CollectionMode = CollectionMode::NFT(2000);
18451113
1846 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1847 collection_numbers_limit: 10,
1848 account_token_ownership_limit: 10,
1849 collections_admins_limit: 5,
1850 custom_data_limit: 2048,
1851 nft_sponsor_transfer_timeout: 15,
1852 fungible_sponsor_transfer_timeout: 15,
1853 refungible_sponsor_transfer_timeout: 15,
1854 }));
1855
1856 let origin1 = Origin::signed(1);1114 let origin1 = Origin::signed(1);
1857 assert_ok!(TemplateModule::create_collection(
1858 origin1.clone(),
1859 col_name1.clone(),
1860 col_desc1.clone(),
1861 token_prefix1.clone(),
1862 mode
1863 ));
1864 assert_eq!(TemplateModule::collection(1).owner, 1);
18651115
1866 assert_ok!(TemplateModule::create_item(1116 let data = default_nft_data();
1867 origin1.clone(),
1868 1,1117 create_test_item(collection_id, &data.into());
1869 [1, 2, 3].to_vec(),
1870 1
1871 ));
18721118
1873 assert_ok!(TemplateModule::set_public_access_mode(1119 assert_ok!(TemplateModule::set_public_access_mode(
1874 origin1.clone(),1120 origin1.clone(),
1875 1,1121 collection_id,
1876 AccessMode::WhiteList1122 AccessMode::WhiteList
1877 ));1123 ));
1878 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1124 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));
1879 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1125 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
18801126
1881 // do approve1127 // do approve
1882 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1128 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));
1883 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);1129 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);
18841130
1885 assert_ok!(TemplateModule::remove_from_white_list(1131 assert_ok!(TemplateModule::remove_from_white_list(
1886 origin1.clone(),1132 origin1.clone(),
1887 1,1133 collection_id,
1888 21134 2
1889 ));1135 ));
18901136
1899#[test]1145#[test]
1900fn white_list_test_5() {1146fn white_list_test_5() {
1901 new_test_ext().execute_with(|| {1147 new_test_ext().execute_with(|| {
1902 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1148 default_limits();
1903 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1149
1904 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1150 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1905 let mode: CollectionMode = CollectionMode::NFT(2000);
19061151
1907 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1908 collection_numbers_limit: 10,
1909 account_token_ownership_limit: 10,
1910 collections_admins_limit: 5,
1911 custom_data_limit: 2048,
1912 nft_sponsor_transfer_timeout: 15,
1913 fungible_sponsor_transfer_timeout: 15,
1914 refungible_sponsor_transfer_timeout: 15,
1915 }));
1916
1917 let origin1 = Origin::signed(1);1152 let origin1 = Origin::signed(1);
1918 assert_ok!(TemplateModule::create_collection(
1919 origin1.clone(),
1920 col_name1.clone(),
1921 col_desc1.clone(),
1922 token_prefix1.clone(),
1923 mode
1924 ));
1925 assert_eq!(TemplateModule::collection(1).owner, 1);
19261153
1927 assert_ok!(TemplateModule::create_item(1154 let data = default_nft_data();
1928 origin1.clone(),
1929 1,1155 create_test_item(collection_id, &data.into());
1930 [1, 2, 3].to_vec(),
1931 1
1932 ));
19331156
1934 assert_ok!(TemplateModule::set_public_access_mode(1157 assert_ok!(TemplateModule::set_public_access_mode(
1935 origin1.clone(),1158 origin1.clone(),
1936 1,1159 collection_id,
1937 AccessMode::WhiteList1160 AccessMode::WhiteList
1938 ));1161 ));
1939 assert_noop!(1162 assert_noop!(
1947#[test]1170#[test]
1948fn white_list_test_6() {1171fn white_list_test_6() {
1949 new_test_ext().execute_with(|| {1172 new_test_ext().execute_with(|| {
1950 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1173 default_limits();
1951 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1174
1952 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1175 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1953 let mode: CollectionMode = CollectionMode::NFT(2000);
19541176
1955 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1956 collection_numbers_limit: 10,
1957 account_token_ownership_limit: 10,
1958 collections_admins_limit: 5,
1959 custom_data_limit: 2048,
1960 nft_sponsor_transfer_timeout: 15,
1961 fungible_sponsor_transfer_timeout: 15,
1962 refungible_sponsor_transfer_timeout: 15,
1963 }));
1964
1965 let origin1 = Origin::signed(1);1177 let origin1 = Origin::signed(1);
1966 assert_ok!(TemplateModule::create_collection(
1967 origin1.clone(),
1968 col_name1.clone(),
1969 col_desc1.clone(),
1970 token_prefix1.clone(),
1971 mode
1972 ));
1973 assert_ok!(TemplateModule::set_public_access_mode(1178 assert_ok!(TemplateModule::set_public_access_mode(
1974 origin1.clone(),1179 origin1.clone(),
1975 1,1180 collection_id,
1976 AccessMode::WhiteList1181 AccessMode::WhiteList
1977 ));1182 ));
19781183
1989#[test]1194#[test]
1990fn white_list_test_7() {1195fn white_list_test_7() {
1991 new_test_ext().execute_with(|| {1196 new_test_ext().execute_with(|| {
1992 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1197 default_limits();
1993 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1198
1994 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1199 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1995 let mode: CollectionMode = CollectionMode::NFT(2000);
19961200
1997 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1201 let data = default_nft_data();
1998 collection_numbers_limit: 10,1202 create_test_item(collection_id, &data.into());
1999 account_token_ownership_limit: 10,
2000 collections_admins_limit: 5,1203
2001 custom_data_limit: 2048,
2002 nft_sponsor_transfer_timeout: 15,
2003 fungible_sponsor_transfer_timeout: 15,
2004 refungible_sponsor_transfer_timeout: 15,
2005 }));
2006
2007 let origin1 = Origin::signed(1);1204 let origin1 = Origin::signed(1);
2008 assert_ok!(TemplateModule::create_collection(
2009 origin1.clone(),
2010 col_name1.clone(),
2011 col_desc1.clone(),
2012 token_prefix1.clone(),
2013 mode
2014 ));
2015 assert_eq!(TemplateModule::collection(1).owner, 1);
20161205
2017 assert_ok!(TemplateModule::create_item(
2018 origin1.clone(),
2019 1,
2020 [1, 2, 3].to_vec(),
2021 1
2022 ));
2023
2024 assert_ok!(TemplateModule::set_public_access_mode(1206 assert_ok!(TemplateModule::set_public_access_mode(
2025 origin1.clone(),1207 origin1.clone(),
2026 1,1208 collection_id,
2027 AccessMode::WhiteList1209 AccessMode::WhiteList
2028 ));1210 ));
2029 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1211 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));
2030 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1212 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
20311213
2032 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1214 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));
2033 });1215 });
2036#[test]1218#[test]
2037fn white_list_test_8() {1219fn white_list_test_8() {
2038 new_test_ext().execute_with(|| {1220 new_test_ext().execute_with(|| {
2039 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1221 default_limits();
2040 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1222
2041 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1223 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
2042 let mode: CollectionMode = CollectionMode::NFT(2000);
20431224
2044 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1225 let data = default_nft_data();
2045 collection_numbers_limit: 10,1226 create_test_item(collection_id, &data.into());
2046 account_token_ownership_limit: 10,
2047 collections_admins_limit: 5,1227
2048 custom_data_limit: 2048,
2049 nft_sponsor_transfer_timeout: 15,
2050 fungible_sponsor_transfer_timeout: 15,
2051 refungible_sponsor_transfer_timeout: 15,
2052 }));
2053
2054 let origin1 = Origin::signed(1);1228 let origin1 = Origin::signed(1);
2055 assert_ok!(TemplateModule::create_collection(
2056 origin1.clone(),
2057 col_name1.clone(),
2058 col_desc1.clone(),
2059 token_prefix1.clone(),
2060 mode
2061 ));
2062 assert_eq!(TemplateModule::collection(1).owner, 1);
20631229
2064 assert_ok!(TemplateModule::create_item(
2065 origin1.clone(),
2066 1,
2067 [1, 2, 3].to_vec(),
2068 1
2069 ));
2070
2071 assert_ok!(TemplateModule::set_public_access_mode(1230 assert_ok!(TemplateModule::set_public_access_mode(
2072 origin1.clone(),1231 origin1.clone(),
2073 1,1232 collection_id,
2074 AccessMode::WhiteList1233 AccessMode::WhiteList
2075 ));1234 ));
2076 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1235 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));
2077 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1236 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
20781237
2079 // do approve1238 // do approve
2080 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1239 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));
2095#[test]1254#[test]
2096fn white_list_test_9() {1255fn white_list_test_9() {
2097 new_test_ext().execute_with(|| {1256 new_test_ext().execute_with(|| {
2098 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1257 default_limits();
2099 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1258
2100 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1259 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
2101 let mode: CollectionMode = CollectionMode::NFT(2000);
2102
2103 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2104 collection_numbers_limit: 10,
2105 account_token_ownership_limit: 10,
2106 collections_admins_limit: 5,
2107 custom_data_limit: 2048,
2108 nft_sponsor_transfer_timeout: 15,
2109 fungible_sponsor_transfer_timeout: 15,
2110 refungible_sponsor_transfer_timeout: 15,
2111 }));
2112
2113 let origin1 = Origin::signed(1);1260 let origin1 = Origin::signed(1);
2114 assert_ok!(TemplateModule::create_collection(
2115 origin1.clone(),
2116 col_name1.clone(),
2117 col_desc1.clone(),
2118 token_prefix1.clone(),
2119 mode
2120 ));
21211261
2122 assert_ok!(TemplateModule::set_public_access_mode(1262 assert_ok!(TemplateModule::set_public_access_mode(
2123 origin1.clone(),1263 origin1.clone(),
2124 1,1264 collection_id,
2125 AccessMode::WhiteList1265 AccessMode::WhiteList
2126 ));1266 ));
2127 assert_ok!(TemplateModule::set_mint_permission(1267 assert_ok!(TemplateModule::set_mint_permission(
2128 origin1.clone(),1268 origin1.clone(),
2129 1,1269 collection_id,
2130 false1270 false
2131 ));1271 ));
21321272
2133 assert_ok!(TemplateModule::create_item(1273 let data = default_nft_data();
2134 origin1.clone(),
2135 1,1274 create_test_item(collection_id, &data.into());
2136 [1, 2, 3].to_vec(),
2137 1
2138 ));
2139 });1275 });
2140}1276}
21411277
2142// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1278// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.
2143#[test]1279#[test]
2144fn white_list_test_10() {1280fn white_list_test_10() {
2145 new_test_ext().execute_with(|| {1281 new_test_ext().execute_with(|| {
2146 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1282 default_limits();
2147 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1283
2148 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1284 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
2149 let mode: CollectionMode = CollectionMode::NFT(2000);
21501285
2151 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2152 collection_numbers_limit: 10,
2153 account_token_ownership_limit: 10,
2154 collections_admins_limit: 5,
2155 custom_data_limit: 2048,
2156 nft_sponsor_transfer_timeout: 15,
2157 fungible_sponsor_transfer_timeout: 15,
2158 refungible_sponsor_transfer_timeout: 15,
2159 }));
2160
2161 let origin1 = Origin::signed(1);1286 let origin1 = Origin::signed(1);
2162 let origin2 = Origin::signed(2);1287 let origin2 = Origin::signed(2);
2163 assert_ok!(TemplateModule::create_collection(
2164 origin1.clone(),
2165 col_name1.clone(),
2166 col_desc1.clone(),
2167 token_prefix1.clone(),
2168 mode
2169 ));
21701288
2171 assert_ok!(TemplateModule::set_public_access_mode(1289 assert_ok!(TemplateModule::set_public_access_mode(
2172 origin1.clone(),1290 origin1.clone(),
2173 1,1291 collection_id,
2174 AccessMode::WhiteList1292 AccessMode::WhiteList
2175 ));1293 ));
2176 assert_ok!(TemplateModule::set_mint_permission(1294 assert_ok!(TemplateModule::set_mint_permission(
2177 origin1.clone(),1295 origin1.clone(),
2178 1,1296 collection_id,
2179 false1297 false
2180 ));1298 ));
21811299
2182 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1300 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));
21831301
2184 assert_ok!(TemplateModule::create_item(1302 assert_ok!(TemplateModule::create_item(
2185 origin2.clone(),1303 origin2.clone(),
2186 1,1304 collection_id,
2187 [1, 2, 3].to_vec(),1305 2,
2188 21306 default_nft_data().into()
2189 ));1307 ));
2190 });1308 });
2191}1309}
2194#[test]1312#[test]
2195fn white_list_test_11() {1313fn white_list_test_11() {
2196 new_test_ext().execute_with(|| {1314 new_test_ext().execute_with(|| {
2197 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1315 default_limits();
2198 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1316
2199 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1317 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
2200 let mode: CollectionMode = CollectionMode::NFT(2000);
22011318
2202 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2203 collection_numbers_limit: 10,
2204 account_token_ownership_limit: 10,
2205 collections_admins_limit: 5,
2206 custom_data_limit: 2048,
2207 nft_sponsor_transfer_timeout: 15,
2208 fungible_sponsor_transfer_timeout: 15,
2209 refungible_sponsor_transfer_timeout: 15,
2210 }));
2211
2212 let origin1 = Origin::signed(1);1319 let origin1 = Origin::signed(1);
2213 let origin2 = Origin::signed(2);1320 let origin2 = Origin::signed(2);
2214 assert_ok!(TemplateModule::create_collection(
2215 origin1.clone(),
2216 col_name1.clone(),
2217 col_desc1.clone(),
2218 token_prefix1.clone(),
2219 mode
2220 ));
22211321
2222 assert_ok!(TemplateModule::set_public_access_mode(1322 assert_ok!(TemplateModule::set_public_access_mode(
2223 origin1.clone(),1323 origin1.clone(),
2224 1,1324 collection_id,
2225 AccessMode::WhiteList1325 AccessMode::WhiteList
2226 ));1326 ));
2227 assert_ok!(TemplateModule::set_mint_permission(1327 assert_ok!(TemplateModule::set_mint_permission(
2228 origin1.clone(),1328 origin1.clone(),
2229 1,1329 collection_id,
2230 false1330 false
2231 ));1331 ));
2232 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1332 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
22331333
2234 assert_noop!(1334 assert_noop!(
2235 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1335 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),
2236 "Public minting is not allowed for this collection"1336 "Public minting is not allowed for this collection."
2237 );1337 );
2238 });1338 });
2239}1339}
2242#[test]1342#[test]
2243fn white_list_test_12() {1343fn white_list_test_12() {
2244 new_test_ext().execute_with(|| {1344 new_test_ext().execute_with(|| {
2245 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1345 default_limits();
2246 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1346
2247 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1347 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
2248 let mode: CollectionMode = CollectionMode::NFT(2000);
22491348
2250 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2251 collection_numbers_limit: 10,
2252 account_token_ownership_limit: 10,
2253 collections_admins_limit: 5,
2254 custom_data_limit: 2048,
2255 nft_sponsor_transfer_timeout: 15,
2256 fungible_sponsor_transfer_timeout: 15,
2257 refungible_sponsor_transfer_timeout: 15,
2258 }));
2259
2260 let origin1 = Origin::signed(1);1349 let origin1 = Origin::signed(1);
2261 let origin2 = Origin::signed(2);1350 let origin2 = Origin::signed(2);
2262 assert_ok!(TemplateModule::create_collection(
2263 origin1.clone(),
2264 col_name1.clone(),
2265 col_desc1.clone(),
2266 token_prefix1.clone(),
2267 mode
2268 ));
22691351
2270 assert_ok!(TemplateModule::set_public_access_mode(1352 assert_ok!(TemplateModule::set_public_access_mode(
2271 origin1.clone(),1353 origin1.clone(),
2272 1,1354 collection_id,
2273 AccessMode::WhiteList1355 AccessMode::WhiteList
2274 ));1356 ));
2275 assert_ok!(TemplateModule::set_mint_permission(1357 assert_ok!(TemplateModule::set_mint_permission(
2276 origin1.clone(),1358 origin1.clone(),
2277 1,1359 collection_id,
2278 false1360 false
2279 ));1361 ));
22801362
2281 assert_noop!(1363 assert_noop!(
2282 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1364 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),
2283 "Public minting is not allowed for this collection"1365 "Public minting is not allowed for this collection."
2284 );1366 );
2285 });1367 });
2286}1368}
2289#[test]1371#[test]
2290fn white_list_test_13() {1372fn white_list_test_13() {
2291 new_test_ext().execute_with(|| {1373 new_test_ext().execute_with(|| {
2292 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1374 default_limits();
2293 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1375
2294 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1376 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
2295 let mode: CollectionMode = CollectionMode::NFT(2000);
22961377
2297 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2298 collection_numbers_limit: 10,
2299 account_token_ownership_limit: 10,
2300 collections_admins_limit: 5,
2301 custom_data_limit: 2048,
2302 nft_sponsor_transfer_timeout: 15,
2303 fungible_sponsor_transfer_timeout: 15,
2304 refungible_sponsor_transfer_timeout: 15,
2305 }));
2306
2307 let origin1 = Origin::signed(1);1378 let origin1 = Origin::signed(1);
2308 assert_ok!(TemplateModule::create_collection(
2309 origin1.clone(),
2310 col_name1.clone(),
2311 col_desc1.clone(),
2312 token_prefix1.clone(),
2313 mode
2314 ));
23151379
2316 assert_ok!(TemplateModule::set_public_access_mode(1380 assert_ok!(TemplateModule::set_public_access_mode(
2317 origin1.clone(),1381 origin1.clone(),
2318 1,1382 collection_id,
2319 AccessMode::WhiteList1383 AccessMode::WhiteList
2320 ));1384 ));
2321 assert_ok!(TemplateModule::set_mint_permission(1385 assert_ok!(TemplateModule::set_mint_permission(
2322 origin1.clone(),1386 origin1.clone(),
2323 1,1387 collection_id,
2324 true1388 true
2325 ));1389 ));
23261390
2327 assert_ok!(TemplateModule::create_item(1391 let data = default_nft_data();
2328 origin1.clone(),
2329 1,1392 create_test_item(collection_id, &data.into());
2330 [1, 2, 3].to_vec(),
2331 1
2332 ));
2333 });1393 });
2334}1394}
23351395
2336// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1396// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.
2337#[test]1397#[test]
2338fn white_list_test_14() {1398fn white_list_test_14() {
2339 new_test_ext().execute_with(|| {1399 new_test_ext().execute_with(|| {
2340 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1400 default_limits();
2341 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1401
2342 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1402 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
2343 let mode: CollectionMode = CollectionMode::NFT(2000);
23441403
2345 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2346 collection_numbers_limit: 10,
2347 account_token_ownership_limit: 10,
2348 collections_admins_limit: 5,
2349 custom_data_limit: 2048,
2350 nft_sponsor_transfer_timeout: 15,
2351 fungible_sponsor_transfer_timeout: 15,
2352 refungible_sponsor_transfer_timeout: 15,
2353 }));
2354
2355 let origin1 = Origin::signed(1);1404 let origin1 = Origin::signed(1);
2356 let origin2 = Origin::signed(2);1405 let origin2 = Origin::signed(2);
2357 assert_ok!(TemplateModule::create_collection(
2358 origin1.clone(),
2359 col_name1.clone(),
2360 col_desc1.clone(),
2361 token_prefix1.clone(),
2362 mode
2363 ));
23641406
2365 assert_ok!(TemplateModule::set_public_access_mode(1407 assert_ok!(TemplateModule::set_public_access_mode(
2366 origin1.clone(),1408 origin1.clone(),
2367 1,1409 collection_id,
2368 AccessMode::WhiteList1410 AccessMode::WhiteList
2369 ));1411 ));
2370 assert_ok!(TemplateModule::set_mint_permission(1412 assert_ok!(TemplateModule::set_mint_permission(
2371 origin1.clone(),1413 origin1.clone(),
2372 1,1414 collection_id,
2373 true1415 true
2374 ));1416 ));
23751417
2376 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1418 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));
23771419
2378 assert_ok!(TemplateModule::create_item(1420 assert_ok!(TemplateModule::create_item(
2379 origin2.clone(),1421 origin2.clone(),
2380 1,1422 1,
2381 [1, 2, 3].to_vec(),1423 2,
2382 21424 default_nft_data().into()
2383 ));1425 ));
2384 });1426 });
2385}1427}
2388#[test]1430#[test]
2389fn white_list_test_15() {1431fn white_list_test_15() {
2390 new_test_ext().execute_with(|| {1432 new_test_ext().execute_with(|| {
2391 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1433 default_limits();
2392 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1434
2393 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1435 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
2394 let mode: CollectionMode = CollectionMode::NFT(2000);
23951436
2396 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2397 collection_numbers_limit: 10,
2398 account_token_ownership_limit: 10,
2399 collections_admins_limit: 5,
2400 custom_data_limit: 2048,
2401 nft_sponsor_transfer_timeout: 15,
2402 fungible_sponsor_transfer_timeout: 15,
2403 refungible_sponsor_transfer_timeout: 15,
2404 }));
2405
2406 let origin1 = Origin::signed(1);1437 let origin1 = Origin::signed(1);
2407 let origin2 = Origin::signed(2);1438 let origin2 = Origin::signed(2);
2408 assert_ok!(TemplateModule::create_collection(
2409 origin1.clone(),
2410 col_name1.clone(),
2411 col_desc1.clone(),
2412 token_prefix1.clone(),
2413 mode
2414 ));
24151439
2416 assert_ok!(TemplateModule::set_public_access_mode(1440 assert_ok!(TemplateModule::set_public_access_mode(
2417 origin1.clone(),1441 origin1.clone(),
2418 1,1442 collection_id,
2419 AccessMode::WhiteList1443 AccessMode::WhiteList
2420 ));1444 ));
2421 assert_ok!(TemplateModule::set_mint_permission(1445 assert_ok!(TemplateModule::set_mint_permission(
2422 origin1.clone(),1446 origin1.clone(),
2423 1,1447 collection_id,
2424 true1448 true
2425 ));1449 ));
24261450
2427 assert_noop!(1451 assert_noop!(
2428 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1452 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),
2429 "Address is not in white list"1453 "Address is not in white list"
2430 );1454 );
2431 });1455 });
2435#[test]1459#[test]
2436fn white_list_test_16() {1460fn white_list_test_16() {
2437 new_test_ext().execute_with(|| {1461 new_test_ext().execute_with(|| {
2438 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1462 default_limits();
2439 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1463
2440 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1464 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
2441 let mode: CollectionMode = CollectionMode::NFT(2000);
24421465
2443 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2444 collection_numbers_limit: 10,
2445 account_token_ownership_limit: 10,
2446 collections_admins_limit: 5,
2447 custom_data_limit: 2048,
2448 nft_sponsor_transfer_timeout: 15,
2449 fungible_sponsor_transfer_timeout: 15,
2450 refungible_sponsor_transfer_timeout: 15,
2451 }));
2452
2453 let origin1 = Origin::signed(1);1466 let origin1 = Origin::signed(1);
2454 let origin2 = Origin::signed(2);1467 let origin2 = Origin::signed(2);
2455 assert_ok!(TemplateModule::create_collection(
2456 origin1.clone(),
2457 col_name1.clone(),
2458 col_desc1.clone(),
2459 token_prefix1.clone(),
2460 mode
2461 ));
24621468
2463 assert_ok!(TemplateModule::set_public_access_mode(1469 assert_ok!(TemplateModule::set_public_access_mode(
2464 origin1.clone(),1470 origin1.clone(),
2465 1,1471 collection_id,
2466 AccessMode::WhiteList1472 AccessMode::WhiteList
2467 ));1473 ));
2468 assert_ok!(TemplateModule::set_mint_permission(1474 assert_ok!(TemplateModule::set_mint_permission(
2469 origin1.clone(),1475 origin1.clone(),
2470 1,1476 collection_id,
2471 true1477 true
2472 ));1478 ));
2473 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1479 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));
24741480
2475 assert_ok!(TemplateModule::create_item(1481 assert_ok!(TemplateModule::create_item(
2476 origin2.clone(),1482 origin2.clone(),
2477 1,1483 1,
2478 [1, 2, 3].to_vec(),1484 2,
2479 21485 default_nft_data().into()
2480 ));1486 ));
2481 });1487 });
2482}1488}
2485#[test]1491#[test]
2486fn total_number_collections_bound() {1492fn total_number_collections_bound() {
2487 new_test_ext().execute_with(|| {1493 new_test_ext().execute_with(|| {
2488 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1494 default_limits();
2489 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1495
2490 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1496 create_test_collection(&CollectionMode::NFT, 1);
2491 let mode: CollectionMode = CollectionMode::NFT(2000);
2492
2493 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2494 collection_numbers_limit: 10,
2495 account_token_ownership_limit: 10,
2496 collections_admins_limit: 5,
2497 custom_data_limit: 2048,
2498 nft_sponsor_transfer_timeout: 15,
2499 fungible_sponsor_transfer_timeout: 15,
2500 refungible_sponsor_transfer_timeout: 15,
2501 }));
2502
2503 let origin1 = Origin::signed(1);
2504 assert_ok!(TemplateModule::create_collection(
2505 origin1.clone(),
2506 col_name1.clone(),
2507 col_desc1.clone(),
2508 token_prefix1.clone(),
2509 mode
2510 ));
2511 });1497 });
2512}1498}
25131499
2514// Total number of collections. Negotive test1500// Total number of collections. Negotive test
2515#[test]1501#[test]
2516fn total_number_collections_bound_neg() {1502fn total_number_collections_bound_neg() {
2517 new_test_ext().execute_with(|| {1503 new_test_ext().execute_with(|| {
2518 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1504 default_limits();
2519 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2520 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2521 let mode: CollectionMode = CollectionMode::NFT(2000);
25221505
2523 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2524 collection_numbers_limit: 10,
2525 account_token_ownership_limit: 10,
2526 collections_admins_limit: 5,
2527 custom_data_limit: 2048,
2528 nft_sponsor_transfer_timeout: 15,
2529 fungible_sponsor_transfer_timeout: 15,
2530 refungible_sponsor_transfer_timeout: 15,
2531 }));
2532
2533 let origin1 = Origin::signed(1);1506 let origin1 = Origin::signed(1);
25341507
2535 for _ in 0..10 {1508 for i in 0..default_collection_numbers_limit() {
2536
2537 assert_ok!(TemplateModule::create_collection(1509 create_test_collection(&CollectionMode::NFT, i + 1);
2538 origin1.clone(),
2539 col_name1.clone(),
2540 col_desc1.clone(),
2541 token_prefix1.clone(),
2542 mode.clone()
2543 ));
2544 }1510 }
25451511
1512 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
1513 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
1514 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1515
2546 // 11-th collection in chain. Expects error1516 // 11-th collection in chain. Expects error
2547 assert_noop!(TemplateModule::create_collection(1517 assert_noop!(TemplateModule::create_collection(
2548 origin1.clone(),1518 origin1.clone(),
2549 col_name1.clone(),1519 col_name1.clone(),
2550 col_desc1.clone(),1520 col_desc1.clone(),
2551 token_prefix1.clone(),1521 token_prefix1.clone(),
2552 mode.clone()1522 CollectionMode::NFT
2553 ), "Total collections bound exceeded");1523 ), "Total collections bound exceeded");
2554 });1524 });
2555}1525}
2558#[test]1528#[test]
2559fn owned_tokens_bound() {1529fn owned_tokens_bound() {
2560 new_test_ext().execute_with(|| {1530 new_test_ext().execute_with(|| {
2561 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1531 default_limits();
2562 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1532
2563 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1533 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
2564 let mode: CollectionMode = CollectionMode::NFT(2000);
25651534
2566 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1535 let data = default_nft_data();
2567 collection_numbers_limit: 10,
2568 account_token_ownership_limit: 10,
2569 collections_admins_limit: 5,
2570 custom_data_limit: 2048,
2571 nft_sponsor_transfer_timeout: 15,
2572 fungible_sponsor_transfer_timeout: 15,
2573 refungible_sponsor_transfer_timeout: 15,
2574 }));
2575
2576 let origin1 = Origin::signed(1);
2577 assert_ok!(TemplateModule::create_collection(1536 create_test_item(collection_id, &data.clone().into());
2578 origin1.clone(),
2579 col_name1.clone(),
2580 col_desc1.clone(),
2581 token_prefix1.clone(),
2582 mode
2583 ));
2584
2585 assert_ok!(TemplateModule::create_item(1537 create_test_item(collection_id, &data.into());
2586 origin1.clone(),
2587 1,
2588 [1, 2, 3].to_vec(),
2589 1
2590 ));
2591
2592 assert_ok!(TemplateModule::create_item(
2593 origin1.clone(),
2594 1,
2595 [1, 2, 3].to_vec(),
2596 1
2597 ));
2598 });1538 });
2599}1539}
26001540
2601// Owned tokens by a single address. Negotive test1541// Owned tokens by a single address. Negotive test
2602#[test]1542#[test]
2603fn owned_tokens_bound_neg() {1543fn owned_tokens_bound_neg() {
2604 new_test_ext().execute_with(|| {1544 new_test_ext().execute_with(|| {
2605 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2606 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2607 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2608 let mode: CollectionMode = CollectionMode::NFT(2000);
2609
2610 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1545 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2611 collection_numbers_limit: 10,1546 collection_numbers_limit: 10,
2612 account_token_ownership_limit: 1,1547 account_token_ownership_limit: 1,
2616 fungible_sponsor_transfer_timeout: 15,1551 fungible_sponsor_transfer_timeout: 15,
2617 refungible_sponsor_transfer_timeout: 15, 1552 refungible_sponsor_transfer_timeout: 15,
2618 }));1553 }));
1554
1555 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
26191556
2620 let origin1 = Origin::signed(1);1557 let origin1 = Origin::signed(1);
2621 assert_ok!(TemplateModule::create_collection(1558 let data = default_nft_data();
2622 origin1.clone(),
2623 col_name1.clone(),1559 create_test_item(collection_id, &data.clone().into());
2624 col_desc1.clone(),
2625 token_prefix1.clone(),
2626 mode
2627 ));
26281560
2629 assert_ok!(TemplateModule::create_item(
2630 origin1.clone(),
2631 1,
2632 [1, 2, 3].to_vec(),
2633 1
2634 ));
2635
2636 assert_noop!(TemplateModule::create_item(1561 assert_noop!(TemplateModule::create_item(
2637 origin1.clone(),1562 origin1.clone(),
2638 1,1563 1,
2639 [1, 2, 3].to_vec(),1564 1,
2640 11565 data.into()
2641 ), "Owned tokens by a single address bound exceeded");1566 ), "Owned tokens by a single address bound exceeded");
2642 });1567 });
2643}1568}
2646#[test]1571#[test]
2647fn collection_admins_bound() {1572fn collection_admins_bound() {
2648 new_test_ext().execute_with(|| {1573 new_test_ext().execute_with(|| {
2649 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2650 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2651 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2652 let mode: CollectionMode = CollectionMode::NFT(2000);
2653
2654 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1574 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2655 collection_numbers_limit: 10,1575 collection_numbers_limit: 10,
2656 account_token_ownership_limit: 10,1576 account_token_ownership_limit: 10,
2660 fungible_sponsor_transfer_timeout: 15,1580 fungible_sponsor_transfer_timeout: 15,
2661 refungible_sponsor_transfer_timeout: 15, 1581 refungible_sponsor_transfer_timeout: 15,
2662 }));1582 }));
1583
1584 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
26631585
2664 let origin1 = Origin::signed(1);1586 let origin1 = Origin::signed(1);
2665 assert_ok!(TemplateModule::create_collection(1587
2666 origin1.clone(),
2667 col_name1.clone(),
2668 col_desc1.clone(),
2669 token_prefix1.clone(),
2670 mode
2671 ));
2672
2673 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1588 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));
2674 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));1589 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));
2675 });1590 });
2676}1591}
26771592
2678// Number of collection admins. Negotive test1593// Number of collection admins. Negotive test
2679#[test]1594#[test]
2680fn collection_admins_bound_neg() {1595fn collection_admins_bound_neg() {
2681 new_test_ext().execute_with(|| {1596 new_test_ext().execute_with(|| {
2682 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2683 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2684 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2685 let mode: CollectionMode = CollectionMode::NFT(2000);
2686
2687 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1597 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2688 collection_numbers_limit: 10,1598 collection_numbers_limit: 10,
2689 account_token_ownership_limit: 1,1599 account_token_ownership_limit: 1,
2693 fungible_sponsor_transfer_timeout: 15,1603 fungible_sponsor_transfer_timeout: 15,
2694 refungible_sponsor_transfer_timeout: 15, 1604 refungible_sponsor_transfer_timeout: 15,
2695 }));1605 }));
1606
1607 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
26961608
2697 let origin1 = Origin::signed(1);1609 let origin1 = Origin::signed(1);
2698 assert_ok!(TemplateModule::create_collection(
2699 origin1.clone(),
2700 col_name1.clone(),
2701 col_desc1.clone(),
2702 token_prefix1.clone(),
2703 mode
2704 ));
27051610
2706 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1611 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));
2707 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3), "Number of collection admins bound exceeded");1612 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), "Number of collection admins bound exceeded");
2708 });1613 });
2709}1614}
27101615
2711// Custom data size. Positive test1616// NFT custom data size. Negative test const_data.
2712#[test]1617#[test]
2713fn custom_data_size_bound() {1618fn custom_data_size_nft_const_data_bound_neg() {
2714 new_test_ext().execute_with(|| {1619 new_test_ext().execute_with(|| {
2715 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1620 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1621 collection_numbers_limit: 10,
1622 account_token_ownership_limit: 10,
1623 collections_admins_limit: 5,
2716 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1624 custom_data_limit: 2,
1625 nft_sponsor_transfer_timeout: 15,
1626 fungible_sponsor_transfer_timeout: 15,
2717 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1627 refungible_sponsor_transfer_timeout: 15,
1628 }));
2718 let mode: CollectionMode = CollectionMode::NFT(2000);1629
1630 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
27191631
1632 let origin1 = Origin::signed(1);
1633 let too_big_const_data = CreateItemData::NFT(CreateNftData{
1634 const_data: vec![1, 2, 3, 4],
1635 variable_data: vec![]
1636 });
1637
1638 assert_noop!(TemplateModule::create_item(
1639 origin1.clone(),
1640 collection_id,
1641 1,
1642 too_big_const_data
1643 ), "const_data exceeded data limit.");
1644 });
1645}
1646
1647// NFT custom data size. Negative test variable_data.
1648#[test]
1649fn custom_data_size_nft_variable_data_bound_neg() {
1650 new_test_ext().execute_with(|| {
2720 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1651 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2721 collection_numbers_limit: 10,1652 collection_numbers_limit: 10,
2722 account_token_ownership_limit: 10,1653 account_token_ownership_limit: 10,
2723 collections_admins_limit: 5,1654 collections_admins_limit: 5,
2724 custom_data_limit: 2048,1655 custom_data_limit: 2,
2725 nft_sponsor_transfer_timeout: 15,1656 nft_sponsor_transfer_timeout: 15,
2726 fungible_sponsor_transfer_timeout: 15,1657 fungible_sponsor_transfer_timeout: 15,
2727 refungible_sponsor_transfer_timeout: 15, 1658 refungible_sponsor_transfer_timeout: 15,
2728 }));1659 }));
27291660
1661 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1662
2730 let origin1 = Origin::signed(1);1663 let origin1 = Origin::signed(1);
2731 assert_ok!(TemplateModule::create_collection(1664 let too_big_const_data = CreateItemData::NFT(CreateNftData{
1665 const_data: vec![],
1666 variable_data: vec![1, 2, 3, 4]
1667 });
1668
1669 assert_noop!(TemplateModule::create_item(
2732 origin1.clone(),1670 origin1.clone(),
2733 col_name1.clone(),1671 collection_id,
2734 col_desc1.clone(),1672 1,
2735 token_prefix1.clone(),1673 too_big_const_data
2736 mode1674 ), "variable_data exceeded data limit.");
2737 ));
2738 });1675 });
2739}1676}
27401677
2741// Custom data size. Negotive test1678// Re fungible custom data size. Negative test const_data.
2742#[test]1679#[test]
2743fn custom_data_size_bound_neg() {1680fn custom_data_size_re_fungible_const_data_bound_neg() {
2744 new_test_ext().execute_with(|| {1681 new_test_ext().execute_with(|| {
2745 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1682 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2746 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1683 collection_numbers_limit: 10,
1684 account_token_ownership_limit: 10,
1685 collections_admins_limit: 5,
2747 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1686 custom_data_limit: 2,
1687 nft_sponsor_transfer_timeout: 15,
2748 let mode: CollectionMode = CollectionMode::NFT(2000);1688 fungible_sponsor_transfer_timeout: 15,
1689 refungible_sponsor_transfer_timeout: 15,
1690 }));
27491691
1692 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1693
1694 let origin1 = Origin::signed(1);
1695 let too_big_const_data = CreateItemData::NFT(CreateNftData{
1696 const_data: vec![1, 2, 3, 4],
1697 variable_data: vec![]
1698 });
1699
1700 assert_noop!(TemplateModule::create_item(
1701 origin1.clone(),
1702 collection_id,
1703 1,
1704 too_big_const_data
1705 ), "const_data exceeded data limit.");
1706 });
1707}
1708
1709// Re fungible custom data size. Negative test variable_data.
1710#[test]
1711fn custom_data_size_re_fungible_variable_data_bound_neg() {
1712 new_test_ext().execute_with(|| {
2750 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1713 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2751 collection_numbers_limit: 10,1714 collection_numbers_limit: 10,
2752 account_token_ownership_limit: 10,1715 account_token_ownership_limit: 10,
2753 collections_admins_limit: 5,1716 collections_admins_limit: 5,
2754 custom_data_limit: 200,1717 custom_data_limit: 2,
2755 nft_sponsor_transfer_timeout: 15,1718 nft_sponsor_transfer_timeout: 15,
2756 fungible_sponsor_transfer_timeout: 15,1719 fungible_sponsor_transfer_timeout: 15,
2757 refungible_sponsor_transfer_timeout: 15, 1720 refungible_sponsor_transfer_timeout: 15,
2758 }));1721 }));
27591722
1723 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1724
2760 let origin1 = Origin::signed(1);1725 let origin1 = Origin::signed(1);
2761 assert_noop!(TemplateModule::create_collection(1726 let too_big_const_data = CreateItemData::NFT(CreateNftData{
1727 const_data: vec![],
1728 variable_data: vec![1, 2, 3, 4]
1729 });
1730
1731 assert_noop!(TemplateModule::create_item(
2762 origin1.clone(),1732 origin1.clone(),
2763 col_name1.clone(),1733 collection_id,
2764 col_desc1.clone(),1734 1,
2765 token_prefix1.clone(),1735 too_big_const_data
2766 mode1736 ), "variable_data exceeded data limit.");
2767 ), "Custom data size bound exceeded");
2768 });1737 });
2769}1738}
2770// #endregion1739// #endregion
27711740
1741#[test]
1742fn set_const_on_chain_schema() {
1743 new_test_ext().execute_with(|| {
1744 default_limits();
1745
1746 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1747
1748 let origin1 = Origin::signed(1);
1749 assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));
1750
1751 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());
1752 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());
1753 });
1754}
1755
1756#[test]
1757fn set_variable_on_chain_schema() {
1758 new_test_ext().execute_with(|| {
1759 default_limits();
1760
1761 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1762
1763 let origin1 = Origin::signed(1);
1764 assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));
1765
1766 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());
1767 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());
1768 });
1769}
modifiedruntime/src/nft_weights.rsdiffbeforeafterboth
--- a/runtime/src/nft_weights.rs
+++ b/runtime/src/nft_weights.rs
@@ -93,4 +93,19 @@
             .saturating_add(DbWeight::get().reads(2 as Weight))
             .saturating_add(DbWeight::get().writes(1 as Weight))
     }
+    fn set_const_on_chain_schema() -> Weight {
+        (11_100_000 as Weight)
+            .saturating_add(DbWeight::get().reads(2 as Weight))
+            .saturating_add(DbWeight::get().writes(1 as Weight))
+    }
+    fn set_variable_on_chain_schema() -> Weight {
+        (11_100_000 as Weight)
+            .saturating_add(DbWeight::get().reads(2 as Weight))
+            .saturating_add(DbWeight::get().writes(1 as Weight))
+    }
+    fn set_variable_meta_data() -> Weight {
+        (17_500_000 as Weight)
+            .saturating_add(DbWeight::get().reads(2 as Weight))
+            .saturating_add(DbWeight::get().writes(1 as Weight))
+    }
 }