difftreelog
NFTPAR-142 Off-chain and on-chain data schema.
in: master
6 files changed
node/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![],
pallets/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
pallets/nft/src/default_weights.rsdiffbeforeafterboth--- a/pallets/nft/src/default_weights.rs
+++ b/pallets/nft/src/default_weights.rs
@@ -92,4 +92,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))
+ }
}
pallets/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,14 +199,56 @@
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;
+}
+
+#[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;
+ }
+}
+
pub trait Trait: system::Trait + Sized {
type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
@@ -361,25 +405,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
};
@@ -425,9 +454,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
@@ -440,7 +470,7 @@
}
/// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
- ///
+ ///
/// # Permissions
///
/// * Collection Owner.
@@ -769,78 +799,89 @@
/// # Arguments
///
/// * 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
@@ -880,9 +921,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())?,
_ => ()
};
@@ -933,9 +974,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)?,
_ => ()
};
@@ -1050,9 +1091,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)?,
_ => ()
};
@@ -1074,7 +1115,49 @@
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.
///
/// # Permissions
@@ -1103,6 +1186,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(
@@ -1322,13 +1461,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()
@@ -1563,7 +1702,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!(
@@ -1804,7 +1986,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();
@@ -1838,7 +2020,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();
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use crate::mock::*;3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits};4use frame_support::{assert_noop, assert_ok};5use frame_system::{ RawOrigin };67// Use cases tests region8// #region9#[test]10fn create_nft_item() {11 new_test_ext().execute_with(|| {12 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();13 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();14 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();15 let mode: CollectionMode = CollectionMode::NFT(2000);1617 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 18 collection_numbers_limit: 10,19 account_token_ownership_limit: 10,20 collections_admins_limit: 5,21 custom_data_limit: 2048,22 nft_sponsor_transfer_timeout: 15,23 fungible_sponsor_transfer_timeout: 15,24 refungible_sponsor_transfer_timeout: 15, 25 }));2627 let origin1 = Origin::signed(1);28 assert_ok!(TemplateModule::create_collection(29 origin1.clone(),30 col_name1.clone(),31 col_desc1.clone(),32 token_prefix1.clone(),33 mode34 ));35 assert_eq!(TemplateModule::collection(1).owner, 1);3637 assert_ok!(TemplateModule::create_item(38 origin1.clone(),39 1,40 [1, 2, 3].to_vec(),41 142 ));43 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());44 });45}4647#[test]48fn create_refungible_item() {49 new_test_ext().execute_with(|| {50 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();51 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();52 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();53 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);5455 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 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 }));6465 let origin1 = Origin::signed(1);66 assert_ok!(TemplateModule::create_collection(67 origin1.clone(),68 col_name1.clone(),69 col_desc1.clone(),70 token_prefix1.clone(),71 mode72 ));73 assert_eq!(TemplateModule::collection(1).owner, 1);7475 assert_ok!(TemplateModule::create_item(76 origin1.clone(),77 1,78 [1, 2, 3].to_vec(),79 180 ));81 assert_eq!(82 TemplateModule::refungible_item_id(1, 1).data,83 [1, 2, 3].to_vec()84 );85 assert_eq!(86 TemplateModule::refungible_item_id(1, 1).owner[0],87 Ownership {88 owner: 1,89 fraction: 100090 }91 );92 });93}9495#[test]96fn create_fungible_item() {97 new_test_ext().execute_with(|| {98 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();99 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();100 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();101 let mode: CollectionMode = CollectionMode::Fungible(3);102103 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 104 collection_numbers_limit: 10,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 }));112113 let origin1 = Origin::signed(1);114 assert_ok!(TemplateModule::create_collection(115 origin1.clone(),116 col_name1.clone(),117 col_desc1.clone(),118 token_prefix1.clone(),119 mode120 ));121 assert_eq!(TemplateModule::collection(1).owner, 1);122123 assert_ok!(TemplateModule::create_item(124 origin1.clone(),125 1,126 [].to_vec(),127 1128 ));129 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);130 assert_eq!(TemplateModule::balance_count(1, 1), 1000);131 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);132 });133}134135#[test]136fn transfer_fungible_item() {137 new_test_ext().execute_with(|| {138 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();139 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();140 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();141 let mode: CollectionMode = CollectionMode::Fungible(3);142143 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 }));152153 let origin1 = Origin::signed(1);154 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 mode161 ));162 assert_eq!(TemplateModule::collection(1).owner, 1);163164 assert_ok!(TemplateModule::create_item(165 origin1.clone(),166 1,167 [].to_vec(),168 1169 ));170 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);171 assert_eq!(TemplateModule::balance_count(1, 1), 1000);172 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);173174 // change owner scenario175 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));176 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);177 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);178 assert_eq!(TemplateModule::balance_count(1, 1), 0);179 assert_eq!(TemplateModule::balance_count(1, 2), 1000);180 // assert_eq!(TemplateModule::address_tokens(1, 1), []);181 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);182183 // split item scenario184 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));185 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);186 assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);187 assert_eq!(TemplateModule::balance_count(1, 2), 500);188 assert_eq!(TemplateModule::balance_count(1, 3), 500);189 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);190 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);191192 // split item and new owner has account scenario193 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));194 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);195 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);196 assert_eq!(TemplateModule::balance_count(1, 2), 300);197 assert_eq!(TemplateModule::balance_count(1, 3), 700);198 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);199 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);200 });201}202203#[test]204fn transfer_refungible_item() {205 new_test_ext().execute_with(|| {206 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();207 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();208 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();209 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);210211 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 212 collection_numbers_limit: 10,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 }));220221 let origin1 = Origin::signed(1);222 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 mode229 ));230 assert_eq!(TemplateModule::collection(1).owner, 1);231232 assert_ok!(TemplateModule::create_item(233 origin1.clone(),234 1,235 [1, 2, 3].to_vec(),236 1237 ));238 assert_eq!(239 TemplateModule::refungible_item_id(1, 1).data,240 [1, 2, 3].to_vec()241 );242 assert_eq!(243 TemplateModule::refungible_item_id(1, 1).owner[0],244 Ownership {245 owner: 1,246 fraction: 1000247 }248 );249 assert_eq!(TemplateModule::balance_count(1, 1), 1000);250 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);251252 // change owner scenario253 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));254 assert_eq!(255 TemplateModule::refungible_item_id(1, 1).owner[0],256 Ownership {257 owner: 2,258 fraction: 1000259 }260 );261 assert_eq!(TemplateModule::balance_count(1, 1), 0);262 assert_eq!(TemplateModule::balance_count(1, 2), 1000);263 // assert_eq!(TemplateModule::address_tokens(1, 1), []);264 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);265266 // split item scenario267 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));268 assert_eq!(269 TemplateModule::refungible_item_id(1, 1).owner[0],270 Ownership {271 owner: 2,272 fraction: 500273 }274 );275 assert_eq!(276 TemplateModule::refungible_item_id(1, 1).owner[1],277 Ownership {278 owner: 3,279 fraction: 500280 }281 );282 assert_eq!(TemplateModule::balance_count(1, 2), 500);283 assert_eq!(TemplateModule::balance_count(1, 3), 500);284 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);285 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);286287 // split item and new owner has account scenario288 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));289 assert_eq!(290 TemplateModule::refungible_item_id(1, 1).owner[0],291 Ownership {292 owner: 2,293 fraction: 300294 }295 );296 assert_eq!(297 TemplateModule::refungible_item_id(1, 1).owner[1],298 Ownership {299 owner: 3,300 fraction: 700301 }302 );303 assert_eq!(TemplateModule::balance_count(1, 2), 300);304 assert_eq!(TemplateModule::balance_count(1, 3), 700);305 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);306 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);307 });308}309310#[test]311fn transfer_nft_item() {312 new_test_ext().execute_with(|| {313 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();314 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();315 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();316 let mode: CollectionMode = CollectionMode::NFT(2000);317318 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 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 }));327328 let origin1 = Origin::signed(1);329 assert_ok!(TemplateModule::create_collection(330 origin1.clone(),331 col_name1.clone(),332 col_desc1.clone(),333 token_prefix1.clone(),334 mode335 ));336 assert_eq!(TemplateModule::collection(1).owner, 1);337338 assert_ok!(TemplateModule::create_item(339 origin1.clone(),340 1,341 [1, 2, 3].to_vec(),342 1343 ));344 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());345 assert_eq!(TemplateModule::balance_count(1, 1), 1);346 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);347348 // default scenario349 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));350 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);351 assert_eq!(TemplateModule::balance_count(1, 1), 0);352 assert_eq!(TemplateModule::balance_count(1, 2), 1);353 // assert_eq!(TemplateModule::address_tokens(1, 1), []);354 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);355 });356}357358#[test]359fn nft_approve_and_transfer_from() {360 new_test_ext().execute_with(|| {361 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();362 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();363 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();364 let mode: CollectionMode = CollectionMode::NFT(2000);365366 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 367 collection_numbers_limit: 10,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 }));375376 let origin1 = Origin::signed(1);377 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 mode384 ));385 assert_eq!(TemplateModule::collection(1).owner, 1);386387 assert_ok!(TemplateModule::create_item(388 origin1.clone(),389 1,390 [1, 2, 3].to_vec(),391 1392 ));393 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());394 assert_eq!(TemplateModule::balance_count(1, 1), 1);395 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);396397 assert_ok!(TemplateModule::set_mint_permission(398 origin1.clone(),399 1,400 true401 ));402 assert_ok!(TemplateModule::set_public_access_mode(403 origin1.clone(),404 1,405 AccessMode::WhiteList406 ));407 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));408 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));409 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));410411 // do approve412 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));413 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);414 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));415 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);416 assert_eq!(417 TemplateModule::approved(1, (1, 1))[0],418 ApprovePermissions {419 approved: 2,420 amount: 100000000421 }422 );423424 assert_ok!(TemplateModule::transfer_from(425 origin2.clone(),426 1,427 3,428 1,429 1,430 1431 ));432 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);433 });434}435436#[test]437fn refungible_approve_and_transfer_from() {438 new_test_ext().execute_with(|| {439 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();440 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();441 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();442 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);443444 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 445 collection_numbers_limit: 10,446 account_token_ownership_limit: 10,447 collections_admins_limit: 5,448 custom_data_limit: 2048,449 nft_sponsor_transfer_timeout: 15,450 fungible_sponsor_transfer_timeout: 15,451 refungible_sponsor_transfer_timeout: 15, 452 }));453454 let origin1 = Origin::signed(1);455 let origin2 = Origin::signed(2);456 assert_ok!(TemplateModule::create_collection(457 origin1.clone(),458 col_name1.clone(),459 col_desc1.clone(),460 token_prefix1.clone(),461 mode462 ));463 assert_eq!(TemplateModule::collection(1).owner, 1);464465 assert_ok!(TemplateModule::create_item(466 origin1.clone(),467 1,468 [1, 2, 3].to_vec(),469 1470 ));471 assert_eq!(472 TemplateModule::refungible_item_id(1, 1).data,473 [1, 2, 3].to_vec()474 );475 assert_eq!(476 TemplateModule::refungible_item_id(1, 1).owner[0],477 Ownership {478 owner: 1,479 fraction: 1000480 }481 );482 assert_eq!(TemplateModule::balance_count(1, 1), 1000);483 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);484485 assert_ok!(TemplateModule::set_mint_permission(486 origin1.clone(),487 1,488 true489 ));490 assert_ok!(TemplateModule::set_public_access_mode(491 origin1.clone(),492 1,493 AccessMode::WhiteList494 ));495 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));496 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));497 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));498499 // do approve500 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));501 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);502 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));503 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);504 assert_eq!(505 TemplateModule::approved(1, (1, 1))[0],506 ApprovePermissions {507 approved: 2,508 amount: 100000000509 }510 );511512 assert_ok!(TemplateModule::transfer_from(513 origin2.clone(),514 1,515 3,516 1,517 1,518 100519 ));520 assert_eq!(TemplateModule::balance_count(1, 1), 900);521 assert_eq!(TemplateModule::balance_count(1, 3), 100);522 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);523 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);524525 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);526 assert_eq!(527 TemplateModule::approved(1, (1, 1))[0],528 ApprovePermissions {529 approved: 3,530 amount: 100000000531 }532 );533 });534}535536#[test]537fn fungible_approve_and_transfer_from() {538 new_test_ext().execute_with(|| {539 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();540 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();541 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();542 let mode: CollectionMode = CollectionMode::Fungible(3);543544 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 545 collection_numbers_limit: 10,546 account_token_ownership_limit: 10,547 collections_admins_limit: 5,548 custom_data_limit: 2048,549 nft_sponsor_transfer_timeout: 15,550 fungible_sponsor_transfer_timeout: 15,551 refungible_sponsor_transfer_timeout: 15, 552 }));553554 let origin1 = Origin::signed(1);555 let origin2 = Origin::signed(2);556 assert_ok!(TemplateModule::create_collection(557 origin1.clone(),558 col_name1.clone(),559 col_desc1.clone(),560 token_prefix1.clone(),561 mode562 ));563 assert_eq!(TemplateModule::collection(1).owner, 1);564565 assert_ok!(TemplateModule::create_item(566 origin1.clone(),567 1,568 [].to_vec(),569 1570 ));571 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);572 assert_eq!(TemplateModule::balance_count(1, 1), 1000);573 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);574575 assert_ok!(TemplateModule::set_mint_permission(576 origin1.clone(),577 1,578 true579 ));580 assert_ok!(TemplateModule::set_public_access_mode(581 origin1.clone(),582 1,583 AccessMode::WhiteList584 ));585 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));586 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));587 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));588589 // do approve590 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));591 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);592 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));593 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);594 assert_eq!(595 TemplateModule::approved(1, (1, 1))[0],596 ApprovePermissions {597 approved: 2,598 amount: 100000000599 }600 );601602 assert_ok!(TemplateModule::transfer_from(603 origin2.clone(),604 1,605 3,606 1,607 1,608 100609 ));610 assert_eq!(TemplateModule::balance_count(1, 1), 900);611 assert_eq!(TemplateModule::balance_count(1, 3), 100);612 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);613 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);614615 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);616 assert_eq!(617 TemplateModule::approved(1, (1, 1))[0],618 ApprovePermissions {619 approved: 3,620 amount: 100000000621 }622 );623624 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));625 assert_ok!(TemplateModule::transfer_from(626 origin2.clone(),627 1,628 3,629 1,630 1,631 900632 ));633 assert_eq!(TemplateModule::balance_count(1, 1), 0);634 assert_eq!(TemplateModule::balance_count(1, 3), 1000);635 // assert_eq!(TemplateModule::address_tokens(1, 1), []);636 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);637638 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);639 });640}641642#[test]643fn change_collection_owner() {644 new_test_ext().execute_with(|| {645 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();646 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();647 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();648 let mode: CollectionMode = CollectionMode::NFT(2000);649650 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 651 collection_numbers_limit: 10,652 account_token_ownership_limit: 10,653 collections_admins_limit: 5,654 custom_data_limit: 2048,655 nft_sponsor_transfer_timeout: 15,656 fungible_sponsor_transfer_timeout: 15,657 refungible_sponsor_transfer_timeout: 15, 658 }));659660 let origin1 = Origin::signed(1);661 assert_ok!(TemplateModule::create_collection(662 origin1.clone(),663 col_name1.clone(),664 col_desc1.clone(),665 token_prefix1.clone(),666 mode667 ));668 assert_ok!(TemplateModule::change_collection_owner(669 origin1.clone(),670 1,671 2672 ));673 assert_eq!(TemplateModule::collection(1).owner, 2);674 });675}676677#[test]678fn destroy_collection() {679 new_test_ext().execute_with(|| {680 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();681 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();682 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();683 let mode: CollectionMode = CollectionMode::NFT(2000);684685 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 686 collection_numbers_limit: 10,687 account_token_ownership_limit: 10,688 collections_admins_limit: 5,689 custom_data_limit: 2048,690 nft_sponsor_transfer_timeout: 15,691 fungible_sponsor_transfer_timeout: 15,692 refungible_sponsor_transfer_timeout: 15, 693 }));694695 let origin1 = Origin::signed(1);696 assert_ok!(TemplateModule::create_collection(697 origin1.clone(),698 col_name1.clone(),699 col_desc1.clone(),700 token_prefix1.clone(),701 mode702 ));703 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));704 });705}706707#[test]708fn burn_nft_item() {709 new_test_ext().execute_with(|| {710 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();711 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();712 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();713 let mode: CollectionMode = CollectionMode::NFT(2000);714715 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 716 collection_numbers_limit: 10,717 account_token_ownership_limit: 10,718 collections_admins_limit: 5,719 custom_data_limit: 2048,720 nft_sponsor_transfer_timeout: 15,721 fungible_sponsor_transfer_timeout: 15,722 refungible_sponsor_transfer_timeout: 15, 723 }));724725 let origin1 = Origin::signed(1);726 assert_ok!(TemplateModule::create_collection(727 origin1.clone(),728 col_name1.clone(),729 col_desc1.clone(),730 token_prefix1.clone(),731 mode732 ));733 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));734 assert_ok!(TemplateModule::create_item(735 origin1.clone(),736 1,737 [1, 2, 3].to_vec(),738 1739 ));740741 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());742743 // check balance (collection with id = 1, user id = 1)744 assert_eq!(TemplateModule::balance_count(1, 1), 1);745746 // burn item747 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));748 assert_noop!(749 TemplateModule::burn_item(origin1.clone(), 1, 1),750 "Item does not exists"751 );752753 assert_eq!(TemplateModule::balance_count(1, 1), 0);754 });755}756757#[test]758fn burn_fungible_item() {759 new_test_ext().execute_with(|| {760 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();761 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();762 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();763 let mode: CollectionMode = CollectionMode::Fungible(3);764765 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 766 collection_numbers_limit: 10,767 account_token_ownership_limit: 10,768 collections_admins_limit: 5,769 custom_data_limit: 2048,770 nft_sponsor_transfer_timeout: 15,771 fungible_sponsor_transfer_timeout: 15,772 refungible_sponsor_transfer_timeout: 15, 773 }));774775 let origin1 = Origin::signed(1);776 assert_ok!(TemplateModule::create_collection(777 origin1.clone(),778 col_name1.clone(),779 col_desc1.clone(),780 token_prefix1.clone(),781 mode782 ));783 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));784 assert_ok!(TemplateModule::create_item(785 origin1.clone(),786 1,787 [].to_vec(),788 1789 ));790791 // check balance (collection with id = 1, user id = 1)792 assert_eq!(TemplateModule::balance_count(1, 1), 1000);793794 // burn item795 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));796 assert_noop!(797 TemplateModule::burn_item(origin1.clone(), 1, 1),798 "Item does not exists"799 );800801 assert_eq!(TemplateModule::balance_count(1, 1), 0);802 });803}804805#[test]806fn burn_refungible_item() {807 new_test_ext().execute_with(|| {808 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();809 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();810 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();811 let mode: CollectionMode = CollectionMode::ReFungible(200, 3);812813 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 814 collection_numbers_limit: 10,815 account_token_ownership_limit: 10,816 collections_admins_limit: 5,817 custom_data_limit: 2048,818 nft_sponsor_transfer_timeout: 15,819 fungible_sponsor_transfer_timeout: 15,820 refungible_sponsor_transfer_timeout: 15, 821 }));822823 let origin1 = Origin::signed(1);824 let origin2 = Origin::signed(2);825 assert_ok!(TemplateModule::create_collection(826 origin1.clone(),827 col_name1.clone(),828 col_desc1.clone(),829 token_prefix1.clone(),830 mode831 ));832833 assert_ok!(TemplateModule::set_mint_permission(834 origin1.clone(),835 1,836 true837 ));838 assert_ok!(TemplateModule::set_public_access_mode(839 origin1.clone(),840 1,841 AccessMode::WhiteList842 ));843 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));844845 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));846 assert_ok!(TemplateModule::create_item(847 origin2.clone(),848 1,849 [1, 2, 3].to_vec(),850 1851 ));852853 assert_eq!(854 TemplateModule::refungible_item_id(1, 1).data,855 [1, 2, 3].to_vec()856 );857858 // check balance (collection with id = 1, user id = 2)859 assert_eq!(TemplateModule::balance_count(1, 1), 1000);860861 // burn item862 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));863 assert_noop!(864 TemplateModule::burn_item(origin1.clone(), 1, 1),865 "Item does not exists"866 );867868 assert_eq!(TemplateModule::balance_count(1, 1), 0);869 });870}871872#[test]873fn add_collection_admin() {874 new_test_ext().execute_with(|| {875 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();876 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();877 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();878 let mode: CollectionMode = CollectionMode::NFT(2000);879880 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 881 collection_numbers_limit: 10,882 account_token_ownership_limit: 10,883 collections_admins_limit: 5,884 custom_data_limit: 2048,885 nft_sponsor_transfer_timeout: 15,886 fungible_sponsor_transfer_timeout: 15,887 refungible_sponsor_transfer_timeout: 15, 888 }));889890 let origin1 = Origin::signed(1);891 let origin2 = Origin::signed(2);892 let origin3 = Origin::signed(3);893 assert_ok!(TemplateModule::create_collection(894 origin1.clone(),895 col_name1.clone(),896 col_desc1.clone(),897 token_prefix1.clone(),898 mode.clone()899 ));900 assert_ok!(TemplateModule::create_collection(901 origin2.clone(),902 col_name1.clone(),903 col_desc1.clone(),904 token_prefix1.clone(),905 mode.clone()906 ));907 assert_ok!(TemplateModule::create_collection(908 origin3.clone(),909 col_name1.clone(),910 col_desc1.clone(),911 token_prefix1.clone(),912 mode.clone()913 ));914915 assert_eq!(TemplateModule::collection(1).owner, 1);916 assert_eq!(TemplateModule::collection(2).owner, 2);917 assert_eq!(TemplateModule::collection(3).owner, 3);918919 // collection admin920 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));921 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));922923 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);924 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);925 });926}927928#[test]929fn remove_collection_admin() {930 new_test_ext().execute_with(|| {931 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();932 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();933 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();934 let mode: CollectionMode = CollectionMode::NFT(2000);935936 let origin1 = Origin::signed(1);937 let origin2 = Origin::signed(2);938 let origin3 = Origin::signed(3);939940 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 941 collection_numbers_limit: 10,942 account_token_ownership_limit: 10,943 collections_admins_limit: 5,944 custom_data_limit: 2048,945 nft_sponsor_transfer_timeout: 15,946 fungible_sponsor_transfer_timeout: 15,947 refungible_sponsor_transfer_timeout: 15, 948 }));949950 assert_ok!(TemplateModule::create_collection(951 origin1.clone(),952 col_name1.clone(),953 col_desc1.clone(),954 token_prefix1.clone(),955 mode.clone()956 ));957 assert_ok!(TemplateModule::create_collection(958 origin2.clone(),959 col_name1.clone(),960 col_desc1.clone(),961 token_prefix1.clone(),962 mode.clone()963 ));964 assert_ok!(TemplateModule::create_collection(965 origin3.clone(),966 col_name1.clone(),967 col_desc1.clone(),968 token_prefix1.clone(),969 mode.clone()970 ));971972 assert_eq!(TemplateModule::collection(1).owner, 1);973 assert_eq!(TemplateModule::collection(2).owner, 2);974 assert_eq!(TemplateModule::collection(3).owner, 3);975976 // collection admin977 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));978 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));979980 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);981 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);982983 // remove admin984 assert_ok!(TemplateModule::remove_collection_admin(985 origin2.clone(),986 1,987 3988 ));989 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);990 });991}992993#[test]994fn balance_of() {995 new_test_ext().execute_with(|| {996 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();997 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();998 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();999 let nft_mode: CollectionMode = CollectionMode::NFT(2000);1000 let furg_mode: CollectionMode = CollectionMode::Fungible(3);1001 let refung_mode: CollectionMode = CollectionMode::ReFungible(2000, 3);10021003 let origin1 = Origin::signed(1);10041005 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1006 collection_numbers_limit: 10,1007 account_token_ownership_limit: 10,1008 collections_admins_limit: 5,1009 custom_data_limit: 2048,1010 nft_sponsor_transfer_timeout: 15,1011 fungible_sponsor_transfer_timeout: 15,1012 refungible_sponsor_transfer_timeout: 15, 1013 }));10141015 assert_ok!(TemplateModule::create_collection(1016 origin1.clone(),1017 col_name1.clone(),1018 col_desc1.clone(),1019 token_prefix1.clone(),1020 nft_mode.clone()1021 ));1022 assert_ok!(TemplateModule::create_collection(1023 origin1.clone(),1024 col_name1.clone(),1025 col_desc1.clone(),1026 token_prefix1.clone(),1027 furg_mode.clone()1028 ));1029 assert_ok!(TemplateModule::create_collection(1030 origin1.clone(),1031 col_name1.clone(),1032 col_desc1.clone(),1033 token_prefix1.clone(),1034 refung_mode.clone()1035 ));10361037 assert_eq!(TemplateModule::collection(1).owner, 1);1038 assert_eq!(TemplateModule::collection(2).owner, 1);1039 assert_eq!(TemplateModule::collection(3).owner, 1);10401041 // check balance before1042 assert_eq!(TemplateModule::balance_count(1, 1), 0);1043 assert_eq!(TemplateModule::balance_count(2, 1), 0);1044 assert_eq!(TemplateModule::balance_count(3, 1), 0);10451046 // create item1047 assert_ok!(TemplateModule::create_item(1048 origin1.clone(),1049 1,1050 [1, 1, 1].to_vec(),1051 11052 ));10531054 assert_ok!(TemplateModule::create_item(1055 origin1.clone(),1056 2,1057 [].to_vec(),1058 11059 ));10601061 assert_ok!(TemplateModule::create_item(1062 origin1.clone(),1063 3,1064 [1, 1, 1].to_vec(),1065 11066 ));10671068 // check balance (collection with id = 1, user id = 1)1069 assert_eq!(TemplateModule::balance_count(1, 1), 1);1070 assert_eq!(TemplateModule::balance_count(2, 1), 1000);1071 assert_eq!(TemplateModule::balance_count(3, 1), 1000);1072 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 1);1073 assert_eq!(TemplateModule::fungible_item_id(2, 1).owner, 1);1074 assert_eq!(TemplateModule::refungible_item_id(3, 1).owner[0].owner, 1);1075 });1076}10771078#[test]1079fn approve() {1080 new_test_ext().execute_with(|| {1081 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1082 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1083 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1084 let nft_mode: CollectionMode = CollectionMode::NFT(2000);1085 let origin1 = Origin::signed(1);10861087 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1088 collection_numbers_limit: 10,1089 account_token_ownership_limit: 10,1090 collections_admins_limit: 5,1091 custom_data_limit: 2048,1092 nft_sponsor_transfer_timeout: 15,1093 fungible_sponsor_transfer_timeout: 15,1094 refungible_sponsor_transfer_timeout: 15, 1095 }));10961097 assert_ok!(TemplateModule::create_collection(1098 origin1.clone(),1099 col_name1.clone(),1100 col_desc1.clone(),1101 token_prefix1.clone(),1102 nft_mode.clone()1103 ));11041105 assert_eq!(TemplateModule::collection(1).owner, 1);11061107 // create item1108 assert_ok!(TemplateModule::create_item(1109 origin1.clone(),1110 1,1111 [1, 1, 1].to_vec(),1112 11113 ));11141115 // approve1116 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));1117 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);1118 });1119}11201121#[test]1122fn transfer_from() {1123 new_test_ext().execute_with(|| {1124 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1125 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1126 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1127 let mode: CollectionMode = CollectionMode::NFT(2000);1128 let origin1 = Origin::signed(1);1129 let origin2 = Origin::signed(2);11301131 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1132 collection_numbers_limit: 10,1133 account_token_ownership_limit: 10,1134 collections_admins_limit: 5,1135 custom_data_limit: 2048,1136 nft_sponsor_transfer_timeout: 15,1137 fungible_sponsor_transfer_timeout: 15,1138 refungible_sponsor_transfer_timeout: 15, 1139 }));11401141 assert_ok!(TemplateModule::create_collection(1142 origin1.clone(),1143 col_name1.clone(),1144 col_desc1.clone(),1145 token_prefix1.clone(),1146 mode1147 ));11481149 assert_eq!(TemplateModule::collection(1).owner, 1);11501151 // create item1152 assert_ok!(TemplateModule::create_item(1153 origin1.clone(),1154 1,1155 [1, 1, 1].to_vec(),1156 11157 ));11581159 // approve1160 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));1161 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);11621163 assert_ok!(TemplateModule::set_mint_permission(1164 origin1.clone(),1165 1,1166 true1167 ));1168 assert_ok!(TemplateModule::set_public_access_mode(1169 origin1.clone(),1170 1,1171 AccessMode::WhiteList1172 ));1173 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1174 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1175 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));11761177 assert_ok!(TemplateModule::transfer_from(1178 origin2.clone(),1179 1,1180 2,1181 1,1182 1,1183 11184 ));11851186 // after transfer1187 assert_eq!(TemplateModule::balance_count(1, 1), 0);1188 assert_eq!(TemplateModule::balance_count(1, 2), 1);1189 });1190}11911192// #endregion11931194// Coverage tests region1195// #region11961197#[test]1198fn owner_can_add_address_to_white_list() {1199 new_test_ext().execute_with(|| {1200 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1201 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1202 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1203 let mode: CollectionMode = CollectionMode::NFT(2000);1204 let origin1 = Origin::signed(1);12051206 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1207 collection_numbers_limit: 10,1208 account_token_ownership_limit: 10,1209 collections_admins_limit: 5,1210 custom_data_limit: 2048,1211 nft_sponsor_transfer_timeout: 15,1212 fungible_sponsor_transfer_timeout: 15,1213 refungible_sponsor_transfer_timeout: 15, 1214 }));12151216 assert_ok!(TemplateModule::create_collection(1217 origin1.clone(),1218 col_name1.clone(),1219 col_desc1.clone(),1220 token_prefix1.clone(),1221 mode1222 ));12231224 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1225 assert_eq!(TemplateModule::white_list(1)[0], 2);1226 });1227}12281229#[test]1230fn admin_can_add_address_to_white_list() {1231 new_test_ext().execute_with(|| {1232 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1233 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1234 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1235 let mode: CollectionMode = CollectionMode::NFT(2000);1236 let origin1 = Origin::signed(1);1237 let origin2 = Origin::signed(2);12381239 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1240 collection_numbers_limit: 10,1241 account_token_ownership_limit: 10,1242 collections_admins_limit: 5,1243 custom_data_limit: 2048,1244 nft_sponsor_transfer_timeout: 15,1245 fungible_sponsor_transfer_timeout: 15,1246 refungible_sponsor_transfer_timeout: 15, 1247 }));12481249 assert_ok!(TemplateModule::create_collection(1250 origin1.clone(),1251 col_name1.clone(),1252 col_desc1.clone(),1253 token_prefix1.clone(),1254 mode1255 ));12561257 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1258 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3));1259 assert_eq!(TemplateModule::white_list(1)[0], 3);1260 });1261}12621263#[test]1264fn nonprivileged_user_cannot_add_address_to_white_list() {1265 new_test_ext().execute_with(|| {1266 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1267 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1268 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1269 let mode: CollectionMode = CollectionMode::NFT(2000);1270 let origin1 = Origin::signed(1);1271 let origin2 = Origin::signed(2);12721273 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1274 collection_numbers_limit: 10,1275 account_token_ownership_limit: 10,1276 collections_admins_limit: 5,1277 custom_data_limit: 2048,1278 nft_sponsor_transfer_timeout: 15,1279 fungible_sponsor_transfer_timeout: 15,1280 refungible_sponsor_transfer_timeout: 15, 1281 }));12821283 assert_ok!(TemplateModule::create_collection(1284 origin1.clone(),1285 col_name1.clone(),1286 col_desc1.clone(),1287 token_prefix1.clone(),1288 mode1289 ));12901291 assert_noop!(1292 TemplateModule::add_to_white_list(origin2.clone(), 1, 3),1293 "You do not have permissions to modify this collection"1294 );1295 });1296}12971298#[test]1299fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1300 new_test_ext().execute_with(|| {1301 let origin1 = Origin::signed(1);13021303 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1304 collection_numbers_limit: 10,1305 account_token_ownership_limit: 10,1306 collections_admins_limit: 5,1307 custom_data_limit: 2048,1308 nft_sponsor_transfer_timeout: 15,1309 fungible_sponsor_transfer_timeout: 15,1310 refungible_sponsor_transfer_timeout: 15, 1311 }));13121313 assert_noop!(1314 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1315 "This collection does not exist"1316 );1317 });1318}13191320#[test]1321fn nobody_can_add_address_to_white_list_of_deleted_collection() {1322 new_test_ext().execute_with(|| {1323 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1324 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1325 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1326 let mode: CollectionMode = CollectionMode::NFT(2000);1327 let origin1 = Origin::signed(1);13281329 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1330 collection_numbers_limit: 10,1331 account_token_ownership_limit: 10,1332 collections_admins_limit: 5,1333 custom_data_limit: 2048,1334 nft_sponsor_transfer_timeout: 15,1335 fungible_sponsor_transfer_timeout: 15,1336 refungible_sponsor_transfer_timeout: 15, 1337 }));13381339 assert_ok!(TemplateModule::create_collection(1340 origin1.clone(),1341 col_name1.clone(),1342 col_desc1.clone(),1343 token_prefix1.clone(),1344 mode1345 ));13461347 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1348 assert_noop!(1349 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1350 "This collection does not exist"1351 );1352 });1353}13541355// If address is already added to white list, nothing happens1356#[test]1357fn address_is_already_added_to_white_list() {1358 new_test_ext().execute_with(|| {1359 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1360 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1361 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1362 let mode: CollectionMode = CollectionMode::NFT(2000);1363 let origin1 = Origin::signed(1);13641365 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1366 collection_numbers_limit: 10,1367 account_token_ownership_limit: 10,1368 collections_admins_limit: 5,1369 custom_data_limit: 2048,1370 nft_sponsor_transfer_timeout: 15,1371 fungible_sponsor_transfer_timeout: 15,1372 refungible_sponsor_transfer_timeout: 15, 1373 }));13741375 assert_ok!(TemplateModule::create_collection(1376 origin1.clone(),1377 col_name1.clone(),1378 col_desc1.clone(),1379 token_prefix1.clone(),1380 mode1381 ));13821383 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1384 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1385 assert_eq!(TemplateModule::white_list(1)[0], 2);1386 assert_eq!(TemplateModule::white_list(1).len(), 1);1387 });1388}13891390#[test]1391fn owner_can_remove_address_from_white_list() {1392 new_test_ext().execute_with(|| {1393 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1394 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1395 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1396 let mode: CollectionMode = CollectionMode::NFT(2000);1397 let origin1 = Origin::signed(1);13981399 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1400 collection_numbers_limit: 10,1401 account_token_ownership_limit: 10,1402 collections_admins_limit: 5,1403 custom_data_limit: 2048,1404 nft_sponsor_transfer_timeout: 15,1405 fungible_sponsor_transfer_timeout: 15,1406 refungible_sponsor_transfer_timeout: 15, 1407 }));14081409 assert_ok!(TemplateModule::create_collection(1410 origin1.clone(),1411 col_name1.clone(),1412 col_desc1.clone(),1413 token_prefix1.clone(),1414 mode1415 ));14161417 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1418 assert_ok!(TemplateModule::remove_from_white_list(1419 origin1.clone(),1420 1,1421 21422 ));1423 assert_eq!(TemplateModule::white_list(1).len(), 0);1424 });1425}14261427#[test]1428fn admin_can_remove_address_from_white_list() {1429 new_test_ext().execute_with(|| {1430 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1431 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1432 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1433 let mode: CollectionMode = CollectionMode::NFT(2000);1434 let origin1 = Origin::signed(1);1435 let origin2 = Origin::signed(2);14361437 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1438 collection_numbers_limit: 10,1439 account_token_ownership_limit: 10,1440 collections_admins_limit: 5,1441 custom_data_limit: 2048,1442 nft_sponsor_transfer_timeout: 15,1443 fungible_sponsor_transfer_timeout: 15,1444 refungible_sponsor_transfer_timeout: 15, 1445 }));14461447 assert_ok!(TemplateModule::create_collection(1448 origin1.clone(),1449 col_name1.clone(),1450 col_desc1.clone(),1451 token_prefix1.clone(),1452 mode1453 ));14541455 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));14561457 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));1458 assert_ok!(TemplateModule::remove_from_white_list(1459 origin2.clone(),1460 1,1461 31462 ));1463 assert_eq!(TemplateModule::white_list(1).len(), 0);1464 });1465}14661467#[test]1468fn nonprivileged_user_cannot_remove_address_from_white_list() {1469 new_test_ext().execute_with(|| {1470 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1471 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1472 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1473 let mode: CollectionMode = CollectionMode::NFT(2000);1474 let origin1 = Origin::signed(1);1475 let origin2 = Origin::signed(2);14761477 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1478 collection_numbers_limit: 10,1479 account_token_ownership_limit: 10,1480 collections_admins_limit: 5,1481 custom_data_limit: 2048,1482 nft_sponsor_transfer_timeout: 15,1483 fungible_sponsor_transfer_timeout: 15,1484 refungible_sponsor_transfer_timeout: 15, 1485 }));14861487 assert_ok!(TemplateModule::create_collection(1488 origin1.clone(),1489 col_name1.clone(),1490 col_desc1.clone(),1491 token_prefix1.clone(),1492 mode1493 ));14941495 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1496 assert_noop!(1497 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),1498 "You do not have permissions to modify this collection"1499 );1500 assert_eq!(TemplateModule::white_list(1)[0], 2);1501 });1502}15031504#[test]1505fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1506 new_test_ext().execute_with(|| {1507 let origin1 = Origin::signed(1);15081509 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1510 collection_numbers_limit: 10,1511 account_token_ownership_limit: 10,1512 collections_admins_limit: 5,1513 custom_data_limit: 2048,1514 nft_sponsor_transfer_timeout: 15,1515 fungible_sponsor_transfer_timeout: 15,1516 refungible_sponsor_transfer_timeout: 15, 1517 }));15181519 assert_noop!(1520 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1521 "This collection does not exist"1522 );1523 });1524}15251526#[test]1527fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1528 new_test_ext().execute_with(|| {1529 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1530 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1531 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1532 let mode: CollectionMode = CollectionMode::NFT(2000);1533 let origin1 = Origin::signed(1);1534 let origin2 = Origin::signed(2);15351536 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1537 collection_numbers_limit: 10,1538 account_token_ownership_limit: 10,1539 collections_admins_limit: 5,1540 custom_data_limit: 2048,1541 nft_sponsor_transfer_timeout: 15,1542 fungible_sponsor_transfer_timeout: 15,1543 refungible_sponsor_transfer_timeout: 15, 1544 }));15451546 assert_ok!(TemplateModule::create_collection(1547 origin1.clone(),1548 col_name1.clone(),1549 col_desc1.clone(),1550 token_prefix1.clone(),1551 mode1552 ));15531554 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1555 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1556 assert_noop!(1557 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),1558 "This collection does not exist"1559 );1560 assert_eq!(TemplateModule::white_list(1).len(), 0);1561 });1562}15631564// If address is already removed from white list, nothing happens1565#[test]1566fn address_is_already_removed_from_white_list() {1567 new_test_ext().execute_with(|| {1568 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1569 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1570 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1571 let mode: CollectionMode = CollectionMode::NFT(2000);1572 let origin1 = Origin::signed(1);15731574 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1575 collection_numbers_limit: 10,1576 account_token_ownership_limit: 10,1577 collections_admins_limit: 5,1578 custom_data_limit: 2048,1579 nft_sponsor_transfer_timeout: 15,1580 fungible_sponsor_transfer_timeout: 15,1581 refungible_sponsor_transfer_timeout: 15, 1582 }));15831584 assert_ok!(TemplateModule::create_collection(1585 origin1.clone(),1586 col_name1.clone(),1587 col_desc1.clone(),1588 token_prefix1.clone(),1589 mode1590 ));15911592 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1593 assert_ok!(TemplateModule::remove_from_white_list(1594 origin1.clone(),1595 1,1596 21597 ));1598 assert_ok!(TemplateModule::remove_from_white_list(1599 origin1.clone(),1600 1,1601 21602 ));1603 assert_eq!(TemplateModule::white_list(1).len(), 0);1604 });1605}16061607// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1608#[test]1609fn white_list_test_1() {1610 new_test_ext().execute_with(|| {1611 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1612 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1613 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1614 let mode: CollectionMode = CollectionMode::NFT(2000);16151616 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1617 collection_numbers_limit: 10,1618 account_token_ownership_limit: 10,1619 collections_admins_limit: 5,1620 custom_data_limit: 2048,1621 nft_sponsor_transfer_timeout: 15,1622 fungible_sponsor_transfer_timeout: 15,1623 refungible_sponsor_transfer_timeout: 15, 1624 }));16251626 let origin1 = Origin::signed(1);1627 assert_ok!(TemplateModule::create_collection(1628 origin1.clone(),1629 col_name1.clone(),1630 col_desc1.clone(),1631 token_prefix1.clone(),1632 mode1633 ));1634 assert_eq!(TemplateModule::collection(1).owner, 1);16351636 assert_ok!(TemplateModule::create_item(1637 origin1.clone(),1638 1,1639 [1, 2, 3].to_vec(),1640 11641 ));16421643 assert_ok!(TemplateModule::set_public_access_mode(1644 origin1.clone(),1645 1,1646 AccessMode::WhiteList1647 ));1648 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));16491650 assert_noop!(1651 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1652 "Address is not in white list"1653 );1654 });1655}16561657#[test]1658fn white_list_test_2() {1659 new_test_ext().execute_with(|| {1660 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1661 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1662 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1663 let mode: CollectionMode = CollectionMode::NFT(2000);16641665 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1666 collection_numbers_limit: 10,1667 account_token_ownership_limit: 10,1668 collections_admins_limit: 5,1669 custom_data_limit: 2048,1670 nft_sponsor_transfer_timeout: 15,1671 fungible_sponsor_transfer_timeout: 15,1672 refungible_sponsor_transfer_timeout: 15, 1673 }));16741675 let origin1 = Origin::signed(1);1676 assert_ok!(TemplateModule::create_collection(1677 origin1.clone(),1678 col_name1.clone(),1679 col_desc1.clone(),1680 token_prefix1.clone(),1681 mode1682 ));1683 assert_eq!(TemplateModule::collection(1).owner, 1);16841685 assert_ok!(TemplateModule::create_item(1686 origin1.clone(),1687 1,1688 [1, 2, 3].to_vec(),1689 11690 ));16911692 assert_ok!(TemplateModule::set_public_access_mode(1693 origin1.clone(),1694 1,1695 AccessMode::WhiteList1696 ));1697 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1698 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));16991700 // do approve1701 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1702 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);17031704 assert_ok!(TemplateModule::remove_from_white_list(1705 origin1.clone(),1706 1,1707 11708 ));17091710 assert_noop!(1711 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1712 "Address is not in white list"1713 );1714 });1715}17161717// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1718#[test]1719fn white_list_test_3() {1720 new_test_ext().execute_with(|| {1721 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1722 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1723 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1724 let mode: CollectionMode = CollectionMode::NFT(2000);17251726 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1727 collection_numbers_limit: 10,1728 account_token_ownership_limit: 10,1729 collections_admins_limit: 5,1730 custom_data_limit: 2048,1731 nft_sponsor_transfer_timeout: 15,1732 fungible_sponsor_transfer_timeout: 15,1733 refungible_sponsor_transfer_timeout: 15, 1734 }));17351736 let origin1 = Origin::signed(1);1737 assert_ok!(TemplateModule::create_collection(1738 origin1.clone(),1739 col_name1.clone(),1740 col_desc1.clone(),1741 token_prefix1.clone(),1742 mode1743 ));1744 assert_eq!(TemplateModule::collection(1).owner, 1);17451746 assert_ok!(TemplateModule::create_item(1747 origin1.clone(),1748 1,1749 [1, 2, 3].to_vec(),1750 11751 ));17521753 assert_ok!(TemplateModule::set_public_access_mode(1754 origin1.clone(),1755 1,1756 AccessMode::WhiteList1757 ));1758 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));17591760 assert_noop!(1761 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1762 "Address is not in white list"1763 );1764 });1765}17661767#[test]1768fn white_list_test_4() {1769 new_test_ext().execute_with(|| {1770 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1771 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1772 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1773 let mode: CollectionMode = CollectionMode::NFT(2000);17741775 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1776 collection_numbers_limit: 10,1777 account_token_ownership_limit: 10,1778 collections_admins_limit: 5,1779 custom_data_limit: 2048,1780 nft_sponsor_transfer_timeout: 15,1781 fungible_sponsor_transfer_timeout: 15,1782 refungible_sponsor_transfer_timeout: 15, 1783 }));17841785 let origin1 = Origin::signed(1);1786 assert_ok!(TemplateModule::create_collection(1787 origin1.clone(),1788 col_name1.clone(),1789 col_desc1.clone(),1790 token_prefix1.clone(),1791 mode1792 ));1793 assert_eq!(TemplateModule::collection(1).owner, 1);17941795 assert_ok!(TemplateModule::create_item(1796 origin1.clone(),1797 1,1798 [1, 2, 3].to_vec(),1799 11800 ));18011802 assert_ok!(TemplateModule::set_public_access_mode(1803 origin1.clone(),1804 1,1805 AccessMode::WhiteList1806 ));1807 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1808 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));18091810 // do approve1811 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1812 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);18131814 assert_ok!(TemplateModule::remove_from_white_list(1815 origin1.clone(),1816 1,1817 21818 ));18191820 assert_noop!(1821 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1822 "Address is not in white list"1823 );1824 });1825}18261827// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1828#[test]1829fn white_list_test_5() {1830 new_test_ext().execute_with(|| {1831 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1832 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1833 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1834 let mode: CollectionMode = CollectionMode::NFT(2000);18351836 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1837 collection_numbers_limit: 10,1838 account_token_ownership_limit: 10,1839 collections_admins_limit: 5,1840 custom_data_limit: 2048,1841 nft_sponsor_transfer_timeout: 15,1842 fungible_sponsor_transfer_timeout: 15,1843 refungible_sponsor_transfer_timeout: 15, 1844 }));18451846 let origin1 = Origin::signed(1);1847 assert_ok!(TemplateModule::create_collection(1848 origin1.clone(),1849 col_name1.clone(),1850 col_desc1.clone(),1851 token_prefix1.clone(),1852 mode1853 ));1854 assert_eq!(TemplateModule::collection(1).owner, 1);18551856 assert_ok!(TemplateModule::create_item(1857 origin1.clone(),1858 1,1859 [1, 2, 3].to_vec(),1860 11861 ));18621863 assert_ok!(TemplateModule::set_public_access_mode(1864 origin1.clone(),1865 1,1866 AccessMode::WhiteList1867 ));1868 assert_noop!(1869 TemplateModule::burn_item(origin1.clone(), 1, 1),1870 "Address is not in white list"1871 );1872 });1873}18741875// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1876#[test]1877fn white_list_test_6() {1878 new_test_ext().execute_with(|| {1879 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1880 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1881 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1882 let mode: CollectionMode = CollectionMode::NFT(2000);18831884 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1885 collection_numbers_limit: 10,1886 account_token_ownership_limit: 10,1887 collections_admins_limit: 5,1888 custom_data_limit: 2048,1889 nft_sponsor_transfer_timeout: 15,1890 fungible_sponsor_transfer_timeout: 15,1891 refungible_sponsor_transfer_timeout: 15, 1892 }));18931894 let origin1 = Origin::signed(1);1895 assert_ok!(TemplateModule::create_collection(1896 origin1.clone(),1897 col_name1.clone(),1898 col_desc1.clone(),1899 token_prefix1.clone(),1900 mode1901 ));1902 assert_ok!(TemplateModule::set_public_access_mode(1903 origin1.clone(),1904 1,1905 AccessMode::WhiteList1906 ));19071908 // do approve1909 assert_noop!(1910 TemplateModule::approve(origin1.clone(), 1, 1, 1),1911 "Address is not in white list"1912 );1913 });1914}19151916// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1917// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1918#[test]1919fn white_list_test_7() {1920 new_test_ext().execute_with(|| {1921 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1922 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1923 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1924 let mode: CollectionMode = CollectionMode::NFT(2000);19251926 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1927 collection_numbers_limit: 10,1928 account_token_ownership_limit: 10,1929 collections_admins_limit: 5,1930 custom_data_limit: 2048,1931 nft_sponsor_transfer_timeout: 15,1932 fungible_sponsor_transfer_timeout: 15,1933 refungible_sponsor_transfer_timeout: 15, 1934 }));19351936 let origin1 = Origin::signed(1);1937 assert_ok!(TemplateModule::create_collection(1938 origin1.clone(),1939 col_name1.clone(),1940 col_desc1.clone(),1941 token_prefix1.clone(),1942 mode1943 ));1944 assert_eq!(TemplateModule::collection(1).owner, 1);19451946 assert_ok!(TemplateModule::create_item(1947 origin1.clone(),1948 1,1949 [1, 2, 3].to_vec(),1950 11951 ));19521953 assert_ok!(TemplateModule::set_public_access_mode(1954 origin1.clone(),1955 1,1956 AccessMode::WhiteList1957 ));1958 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1959 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));19601961 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1962 });1963}19641965#[test]1966fn white_list_test_8() {1967 new_test_ext().execute_with(|| {1968 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1969 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1970 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1971 let mode: CollectionMode = CollectionMode::NFT(2000);19721973 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1974 collection_numbers_limit: 10,1975 account_token_ownership_limit: 10,1976 collections_admins_limit: 5,1977 custom_data_limit: 2048,1978 nft_sponsor_transfer_timeout: 15,1979 fungible_sponsor_transfer_timeout: 15,1980 refungible_sponsor_transfer_timeout: 15, 1981 }));19821983 let origin1 = Origin::signed(1);1984 assert_ok!(TemplateModule::create_collection(1985 origin1.clone(),1986 col_name1.clone(),1987 col_desc1.clone(),1988 token_prefix1.clone(),1989 mode1990 ));1991 assert_eq!(TemplateModule::collection(1).owner, 1);19921993 assert_ok!(TemplateModule::create_item(1994 origin1.clone(),1995 1,1996 [1, 2, 3].to_vec(),1997 11998 ));19992000 assert_ok!(TemplateModule::set_public_access_mode(2001 origin1.clone(),2002 1,2003 AccessMode::WhiteList2004 ));2005 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));2006 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));20072008 // do approve2009 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));2010 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);20112012 assert_ok!(TemplateModule::transfer_from(2013 origin1.clone(),2014 1,2015 2,2016 1,2017 1,2018 12019 ));2020 });2021}20222023// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.2024#[test]2025fn white_list_test_9() {2026 new_test_ext().execute_with(|| {2027 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2028 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2029 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2030 let mode: CollectionMode = CollectionMode::NFT(2000);20312032 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2033 collection_numbers_limit: 10,2034 account_token_ownership_limit: 10,2035 collections_admins_limit: 5,2036 custom_data_limit: 2048,2037 nft_sponsor_transfer_timeout: 15,2038 fungible_sponsor_transfer_timeout: 15,2039 refungible_sponsor_transfer_timeout: 15, 2040 }));20412042 let origin1 = Origin::signed(1);2043 assert_ok!(TemplateModule::create_collection(2044 origin1.clone(),2045 col_name1.clone(),2046 col_desc1.clone(),2047 token_prefix1.clone(),2048 mode2049 ));20502051 assert_ok!(TemplateModule::set_public_access_mode(2052 origin1.clone(),2053 1,2054 AccessMode::WhiteList2055 ));2056 assert_ok!(TemplateModule::set_mint_permission(2057 origin1.clone(),2058 1,2059 false2060 ));20612062 assert_ok!(TemplateModule::create_item(2063 origin1.clone(),2064 1,2065 [1, 2, 3].to_vec(),2066 12067 ));2068 });2069}20702071// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.2072#[test]2073fn white_list_test_10() {2074 new_test_ext().execute_with(|| {2075 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2076 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2077 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2078 let mode: CollectionMode = CollectionMode::NFT(2000);20792080 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2081 collection_numbers_limit: 10,2082 account_token_ownership_limit: 10,2083 collections_admins_limit: 5,2084 custom_data_limit: 2048,2085 nft_sponsor_transfer_timeout: 15,2086 fungible_sponsor_transfer_timeout: 15,2087 refungible_sponsor_transfer_timeout: 15, 2088 }));20892090 let origin1 = Origin::signed(1);2091 let origin2 = Origin::signed(2);2092 assert_ok!(TemplateModule::create_collection(2093 origin1.clone(),2094 col_name1.clone(),2095 col_desc1.clone(),2096 token_prefix1.clone(),2097 mode2098 ));20992100 assert_ok!(TemplateModule::set_public_access_mode(2101 origin1.clone(),2102 1,2103 AccessMode::WhiteList2104 ));2105 assert_ok!(TemplateModule::set_mint_permission(2106 origin1.clone(),2107 1,2108 false2109 ));21102111 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));21122113 assert_ok!(TemplateModule::create_item(2114 origin2.clone(),2115 1,2116 [1, 2, 3].to_vec(),2117 22118 ));2119 });2120}21212122// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.2123#[test]2124fn white_list_test_11() {2125 new_test_ext().execute_with(|| {2126 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2127 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2128 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2129 let mode: CollectionMode = CollectionMode::NFT(2000);21302131 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2132 collection_numbers_limit: 10,2133 account_token_ownership_limit: 10,2134 collections_admins_limit: 5,2135 custom_data_limit: 2048,2136 nft_sponsor_transfer_timeout: 15,2137 fungible_sponsor_transfer_timeout: 15,2138 refungible_sponsor_transfer_timeout: 15, 2139 }));21402141 let origin1 = Origin::signed(1);2142 let origin2 = Origin::signed(2);2143 assert_ok!(TemplateModule::create_collection(2144 origin1.clone(),2145 col_name1.clone(),2146 col_desc1.clone(),2147 token_prefix1.clone(),2148 mode2149 ));21502151 assert_ok!(TemplateModule::set_public_access_mode(2152 origin1.clone(),2153 1,2154 AccessMode::WhiteList2155 ));2156 assert_ok!(TemplateModule::set_mint_permission(2157 origin1.clone(),2158 1,2159 false2160 ));2161 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));21622163 assert_noop!(2164 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),2165 "Public minting is not allowed for this collection"2166 );2167 });2168}21692170// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.2171#[test]2172fn white_list_test_12() {2173 new_test_ext().execute_with(|| {2174 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2175 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2176 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2177 let mode: CollectionMode = CollectionMode::NFT(2000);21782179 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2180 collection_numbers_limit: 10,2181 account_token_ownership_limit: 10,2182 collections_admins_limit: 5,2183 custom_data_limit: 2048,2184 nft_sponsor_transfer_timeout: 15,2185 fungible_sponsor_transfer_timeout: 15,2186 refungible_sponsor_transfer_timeout: 15, 2187 }));21882189 let origin1 = Origin::signed(1);2190 let origin2 = Origin::signed(2);2191 assert_ok!(TemplateModule::create_collection(2192 origin1.clone(),2193 col_name1.clone(),2194 col_desc1.clone(),2195 token_prefix1.clone(),2196 mode2197 ));21982199 assert_ok!(TemplateModule::set_public_access_mode(2200 origin1.clone(),2201 1,2202 AccessMode::WhiteList2203 ));2204 assert_ok!(TemplateModule::set_mint_permission(2205 origin1.clone(),2206 1,2207 false2208 ));22092210 assert_noop!(2211 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),2212 "Public minting is not allowed for this collection"2213 );2214 });2215}22162217// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.2218#[test]2219fn white_list_test_13() {2220 new_test_ext().execute_with(|| {2221 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2222 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2223 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2224 let mode: CollectionMode = CollectionMode::NFT(2000);22252226 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2227 collection_numbers_limit: 10,2228 account_token_ownership_limit: 10,2229 collections_admins_limit: 5,2230 custom_data_limit: 2048,2231 nft_sponsor_transfer_timeout: 15,2232 fungible_sponsor_transfer_timeout: 15,2233 refungible_sponsor_transfer_timeout: 15, 2234 }));22352236 let origin1 = Origin::signed(1);2237 assert_ok!(TemplateModule::create_collection(2238 origin1.clone(),2239 col_name1.clone(),2240 col_desc1.clone(),2241 token_prefix1.clone(),2242 mode2243 ));22442245 assert_ok!(TemplateModule::set_public_access_mode(2246 origin1.clone(),2247 1,2248 AccessMode::WhiteList2249 ));2250 assert_ok!(TemplateModule::set_mint_permission(2251 origin1.clone(),2252 1,2253 true2254 ));22552256 assert_ok!(TemplateModule::create_item(2257 origin1.clone(),2258 1,2259 [1, 2, 3].to_vec(),2260 12261 ));2262 });2263}22642265// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.2266#[test]2267fn white_list_test_14() {2268 new_test_ext().execute_with(|| {2269 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2270 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2271 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2272 let mode: CollectionMode = CollectionMode::NFT(2000);22732274 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2275 collection_numbers_limit: 10,2276 account_token_ownership_limit: 10,2277 collections_admins_limit: 5,2278 custom_data_limit: 2048,2279 nft_sponsor_transfer_timeout: 15,2280 fungible_sponsor_transfer_timeout: 15,2281 refungible_sponsor_transfer_timeout: 15, 2282 }));22832284 let origin1 = Origin::signed(1);2285 let origin2 = Origin::signed(2);2286 assert_ok!(TemplateModule::create_collection(2287 origin1.clone(),2288 col_name1.clone(),2289 col_desc1.clone(),2290 token_prefix1.clone(),2291 mode2292 ));22932294 assert_ok!(TemplateModule::set_public_access_mode(2295 origin1.clone(),2296 1,2297 AccessMode::WhiteList2298 ));2299 assert_ok!(TemplateModule::set_mint_permission(2300 origin1.clone(),2301 1,2302 true2303 ));23042305 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));23062307 assert_ok!(TemplateModule::create_item(2308 origin2.clone(),2309 1,2310 [1, 2, 3].to_vec(),2311 22312 ));2313 });2314}23152316// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.2317#[test]2318fn white_list_test_15() {2319 new_test_ext().execute_with(|| {2320 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2321 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2322 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2323 let mode: CollectionMode = CollectionMode::NFT(2000);23242325 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2326 collection_numbers_limit: 10,2327 account_token_ownership_limit: 10,2328 collections_admins_limit: 5,2329 custom_data_limit: 2048,2330 nft_sponsor_transfer_timeout: 15,2331 fungible_sponsor_transfer_timeout: 15,2332 refungible_sponsor_transfer_timeout: 15, 2333 }));23342335 let origin1 = Origin::signed(1);2336 let origin2 = Origin::signed(2);2337 assert_ok!(TemplateModule::create_collection(2338 origin1.clone(),2339 col_name1.clone(),2340 col_desc1.clone(),2341 token_prefix1.clone(),2342 mode2343 ));23442345 assert_ok!(TemplateModule::set_public_access_mode(2346 origin1.clone(),2347 1,2348 AccessMode::WhiteList2349 ));2350 assert_ok!(TemplateModule::set_mint_permission(2351 origin1.clone(),2352 1,2353 true2354 ));23552356 assert_noop!(2357 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),2358 "Address is not in white list"2359 );2360 });2361}23622363// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.2364#[test]2365fn white_list_test_16() {2366 new_test_ext().execute_with(|| {2367 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2368 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2369 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2370 let mode: CollectionMode = CollectionMode::NFT(2000);23712372 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2373 collection_numbers_limit: 10,2374 account_token_ownership_limit: 10,2375 collections_admins_limit: 5,2376 custom_data_limit: 2048,2377 nft_sponsor_transfer_timeout: 15,2378 fungible_sponsor_transfer_timeout: 15,2379 refungible_sponsor_transfer_timeout: 15, 2380 }));23812382 let origin1 = Origin::signed(1);2383 let origin2 = Origin::signed(2);2384 assert_ok!(TemplateModule::create_collection(2385 origin1.clone(),2386 col_name1.clone(),2387 col_desc1.clone(),2388 token_prefix1.clone(),2389 mode2390 ));23912392 assert_ok!(TemplateModule::set_public_access_mode(2393 origin1.clone(),2394 1,2395 AccessMode::WhiteList2396 ));2397 assert_ok!(TemplateModule::set_mint_permission(2398 origin1.clone(),2399 1,2400 true2401 ));2402 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));24032404 assert_ok!(TemplateModule::create_item(2405 origin2.clone(),2406 1,2407 [1, 2, 3].to_vec(),2408 22409 ));2410 });2411}24122413// Total number of collections. Positive test2414#[test]2415fn total_number_collections_bound() {2416 new_test_ext().execute_with(|| {2417 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2418 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2419 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2420 let mode: CollectionMode = CollectionMode::NFT(2000);24212422 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2423 collection_numbers_limit: 10,2424 account_token_ownership_limit: 10,2425 collections_admins_limit: 5,2426 custom_data_limit: 2048,2427 nft_sponsor_transfer_timeout: 15,2428 fungible_sponsor_transfer_timeout: 15,2429 refungible_sponsor_transfer_timeout: 15, 2430 }));24312432 let origin1 = Origin::signed(1);2433 assert_ok!(TemplateModule::create_collection(2434 origin1.clone(),2435 col_name1.clone(),2436 col_desc1.clone(),2437 token_prefix1.clone(),2438 mode2439 ));2440 });2441}24422443// Total number of collections. Negotive test2444#[test]2445fn total_number_collections_bound_neg() {2446 new_test_ext().execute_with(|| {2447 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2448 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2449 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2450 let mode: CollectionMode = CollectionMode::NFT(2000);24512452 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2453 collection_numbers_limit: 10,2454 account_token_ownership_limit: 10,2455 collections_admins_limit: 5,2456 custom_data_limit: 2048,2457 nft_sponsor_transfer_timeout: 15,2458 fungible_sponsor_transfer_timeout: 15,2459 refungible_sponsor_transfer_timeout: 15, 2460 }));24612462 let origin1 = Origin::signed(1);24632464 for _ in 0..10 {24652466 assert_ok!(TemplateModule::create_collection(2467 origin1.clone(),2468 col_name1.clone(),2469 col_desc1.clone(),2470 token_prefix1.clone(),2471 mode.clone()2472 ));2473 }24742475 // 11-th collection in chain. Expects error2476 assert_noop!(TemplateModule::create_collection(2477 origin1.clone(),2478 col_name1.clone(),2479 col_desc1.clone(),2480 token_prefix1.clone(),2481 mode.clone()2482 ), "Total collections bound exceeded");2483 });2484}24852486// Owned tokens by a single address. Positive test2487#[test]2488fn owned_tokens_bound() {2489 new_test_ext().execute_with(|| {2490 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2491 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2492 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2493 let mode: CollectionMode = CollectionMode::NFT(2000);24942495 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2496 collection_numbers_limit: 10,2497 account_token_ownership_limit: 10,2498 collections_admins_limit: 5,2499 custom_data_limit: 2048,2500 nft_sponsor_transfer_timeout: 15,2501 fungible_sponsor_transfer_timeout: 15,2502 refungible_sponsor_transfer_timeout: 15, 2503 }));25042505 let origin1 = Origin::signed(1);2506 assert_ok!(TemplateModule::create_collection(2507 origin1.clone(),2508 col_name1.clone(),2509 col_desc1.clone(),2510 token_prefix1.clone(),2511 mode2512 ));25132514 assert_ok!(TemplateModule::create_item(2515 origin1.clone(),2516 1,2517 [1, 2, 3].to_vec(),2518 12519 ));25202521 assert_ok!(TemplateModule::create_item(2522 origin1.clone(),2523 1,2524 [1, 2, 3].to_vec(),2525 12526 ));2527 });2528}25292530// Owned tokens by a single address. Negotive test2531#[test]2532fn owned_tokens_bound_neg() {2533 new_test_ext().execute_with(|| {2534 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2535 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2536 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2537 let mode: CollectionMode = CollectionMode::NFT(2000);25382539 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2540 collection_numbers_limit: 10,2541 account_token_ownership_limit: 1,2542 collections_admins_limit: 5,2543 custom_data_limit: 2048,2544 nft_sponsor_transfer_timeout: 15,2545 fungible_sponsor_transfer_timeout: 15,2546 refungible_sponsor_transfer_timeout: 15, 2547 }));25482549 let origin1 = Origin::signed(1);2550 assert_ok!(TemplateModule::create_collection(2551 origin1.clone(),2552 col_name1.clone(),2553 col_desc1.clone(),2554 token_prefix1.clone(),2555 mode2556 ));25572558 assert_ok!(TemplateModule::create_item(2559 origin1.clone(),2560 1,2561 [1, 2, 3].to_vec(),2562 12563 ));25642565 assert_noop!(TemplateModule::create_item(2566 origin1.clone(),2567 1,2568 [1, 2, 3].to_vec(),2569 12570 ), "Owned tokens by a single address bound exceeded");2571 });2572}25732574// Number of collection admins. Positive test2575#[test]2576fn collection_admins_bound() {2577 new_test_ext().execute_with(|| {2578 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2579 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2580 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2581 let mode: CollectionMode = CollectionMode::NFT(2000);25822583 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2584 collection_numbers_limit: 10,2585 account_token_ownership_limit: 10,2586 collections_admins_limit: 2,2587 custom_data_limit: 2048,2588 nft_sponsor_transfer_timeout: 15,2589 fungible_sponsor_transfer_timeout: 15,2590 refungible_sponsor_transfer_timeout: 15, 2591 }));25922593 let origin1 = Origin::signed(1);2594 assert_ok!(TemplateModule::create_collection(2595 origin1.clone(),2596 col_name1.clone(),2597 col_desc1.clone(),2598 token_prefix1.clone(),2599 mode2600 ));26012602 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2603 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));2604 });2605}26062607// Number of collection admins. Negotive test2608#[test]2609fn collection_admins_bound_neg() {2610 new_test_ext().execute_with(|| {2611 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2612 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2613 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2614 let mode: CollectionMode = CollectionMode::NFT(2000);26152616 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2617 collection_numbers_limit: 10,2618 account_token_ownership_limit: 1,2619 collections_admins_limit: 1,2620 custom_data_limit: 2048,2621 nft_sponsor_transfer_timeout: 15,2622 fungible_sponsor_transfer_timeout: 15,2623 refungible_sponsor_transfer_timeout: 15, 2624 }));26252626 let origin1 = Origin::signed(1);2627 assert_ok!(TemplateModule::create_collection(2628 origin1.clone(),2629 col_name1.clone(),2630 col_desc1.clone(),2631 token_prefix1.clone(),2632 mode2633 ));26342635 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2636 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3), "Number of collection admins bound exceeded");2637 });2638}26392640// Custom data size. Positive test2641#[test]2642fn custom_data_size_bound() {2643 new_test_ext().execute_with(|| {2644 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2645 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2646 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2647 let mode: CollectionMode = CollectionMode::NFT(2000);26482649 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2650 collection_numbers_limit: 10,2651 account_token_ownership_limit: 10,2652 collections_admins_limit: 5,2653 custom_data_limit: 2048,2654 nft_sponsor_transfer_timeout: 15,2655 fungible_sponsor_transfer_timeout: 15,2656 refungible_sponsor_transfer_timeout: 15, 2657 }));26582659 let origin1 = Origin::signed(1);2660 assert_ok!(TemplateModule::create_collection(2661 origin1.clone(),2662 col_name1.clone(),2663 col_desc1.clone(),2664 token_prefix1.clone(),2665 mode2666 ));2667 });2668}26692670// Custom data size. Negotive test2671#[test]2672fn custom_data_size_bound_neg() {2673 new_test_ext().execute_with(|| {2674 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2675 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2676 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2677 let mode: CollectionMode = CollectionMode::NFT(2000);26782679 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2680 collection_numbers_limit: 10,2681 account_token_ownership_limit: 10,2682 collections_admins_limit: 5,2683 custom_data_limit: 200,2684 nft_sponsor_transfer_timeout: 15,2685 fungible_sponsor_transfer_timeout: 15,2686 refungible_sponsor_transfer_timeout: 15, 2687 }));26882689 let origin1 = Origin::signed(1);2690 assert_noop!(TemplateModule::create_collection(2691 origin1.clone(),2692 col_name1.clone(),2693 col_desc1.clone(),2694 token_prefix1.clone(),2695 mode2696 ), "Custom data size bound exceeded");2697 });2698}2699// #endregion1// Tests to be written here2use crate::mock::*;3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits, CreateItemData, NftItemType, CreateNftData, CreateFungibleData, CreateReFungibleData};4use frame_support::{assert_noop, assert_ok};5use frame_system::{ RawOrigin };67fn default_collection_numbers_limit() -> u64 {8 109}1011fn default_limits() {12 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 13 collection_numbers_limit: default_collection_numbers_limit(),14 account_token_ownership_limit: 10,15 collections_admins_limit: 5,16 custom_data_limit: 2048,17 nft_sponsor_transfer_timeout: 15,18 fungible_sponsor_transfer_timeout: 15,19 refungible_sponsor_transfer_timeout: 15, 20 }));21}2223fn default_nft_data() -> CreateItemData {24 CreateItemData::NFT(CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })25}2627fn default_fungible_data () -> CreateItemData {28 CreateItemData::Fungible(CreateFungibleData { })29}3031fn default_re_fungible_data () -> CreateItemData {32 CreateItemData::ReFungible(CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })33}3435fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64) -> u64 {36 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();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();3940 let collection_id = TemplateModule::nextCollectionID();41 let origin1 = Origin::signed(owner);42 assert_ok!(TemplateModule::create_collection(43 origin1.clone(),44 col_name1.clone(),45 col_desc1.clone(),46 token_prefix1.clone(),47 mode48 ));49 assert_eq!(TemplateModule::collection(collection_id).owner, owner);50 return collection_id;51}5253fn create_test_collection(mode: &CollectionMode) -> u64 {54 return create_test_collection_for_owner(&mode, 1);55}5657fn create_test_item(collection_id: u64, data: &CreateItemData) {58 let origin1 = Origin::signed(1);59 assert_ok!(TemplateModule::create_item(60 origin1.clone(),61 collection_id,62 1,63 data.clone()64 ));6566}6768// Use cases tests region69// #region70#[test]71fn create_nft_item() {72 new_test_ext().execute_with(|| {73 default_limits();74 let collection_id = create_test_collection(&CollectionMode::NFT);7576 let data = default_nft_data();77 create_test_item(collection_id, &data);78 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);79 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);80 });81}8283#[test]84fn create_refungible_item() {85 new_test_ext().execute_with(|| {86 default_limits();87 let collection_id = create_test_collection(&CollectionMode::ReFungible(3));8889 let data = default_re_fungible_data();90 create_test_item(collection_id, &data);91 assert_eq!(92 TemplateModule::refungible_item_id(collection_id, 1).const_data,93 data.const_data94 );95 assert_eq!(96 TemplateModule::refungible_item_id(collection_id, 1).variable_data,97 data.variable_data98 );99 assert_eq!(100 TemplateModule::refungible_item_id(collection_id, 1).owner[0],101 Ownership {102 owner: 1,103 fraction: 1000104 }105 );106 });107}108109#[test]110fn create_fungible_item() {111 new_test_ext().execute_with(|| {112 let collection_id = create_test_collection(&CollectionMode::Fungible(3));113114 let data = default_fungible_data();115 create_test_item(collection_id, &data);116117 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);118 assert_eq!(TemplateModule::balance_count(1, 1), 1000);119 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);120 });121}122123#[test]124fn transfer_fungible_item() {125 new_test_ext().execute_with(|| {126 default_limits();127 128 let collection_id = create_test_collection(&CollectionMode::Fungible(3));129130 let origin1 = Origin::signed(1);131 let origin2 = Origin::signed(2);132133 let data = default_fungible_data();134 create_test_item(collection_id, &data);135136 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);137 assert_eq!(TemplateModule::balance_count(1, 1), 1000);138 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);139140 // change owner scenario141 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));142 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);143 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);144 assert_eq!(TemplateModule::balance_count(1, 1), 0);145 assert_eq!(TemplateModule::balance_count(1, 2), 1000);146 // assert_eq!(TemplateModule::address_tokens(1, 1), []);147 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);148149 // split item scenario150 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));151 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);152 assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);153 assert_eq!(TemplateModule::balance_count(1, 2), 500);154 assert_eq!(TemplateModule::balance_count(1, 3), 500);155 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);156 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);157158 // split item and new owner has account scenario159 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));160 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);161 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);162 assert_eq!(TemplateModule::balance_count(1, 2), 300);163 assert_eq!(TemplateModule::balance_count(1, 3), 700);164 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);165 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);166 });167}168169#[test]170fn transfer_refungible_item() {171 new_test_ext().execute_with(|| {172 default_limits();173 174 let collection_id = create_test_collection(&CollectionMode::ReFungible(3));175176 let data = default_re_fungible_data();177 create_test_item(collection_id, &data);178179 let origin1 = Origin::signed(1);180 let origin2 = Origin::signed(2);181 assert_eq!(182 TemplateModule::refungible_item_id(collection_id, 1).const_data,183 data.const_data184 );185 assert_eq!(186 TemplateModule::refungible_item_id(collection_id, 1).variable_data,187 data.variable_data188 );189 assert_eq!(190 TemplateModule::refungible_item_id(collection_id, 1).owner[0],191 Ownership {192 owner: 1,193 fraction: 1000194 }195 );196 assert_eq!(TemplateModule::balance_count(1, 1), 1000);197 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);198199 // change owner scenario200 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));201 assert_eq!(202 TemplateModule::refungible_item_id(1, 1).owner[0],203 Ownership {204 owner: 2,205 fraction: 1000206 }207 );208 assert_eq!(TemplateModule::balance_count(1, 1), 0);209 assert_eq!(TemplateModule::balance_count(1, 2), 1000);210 // assert_eq!(TemplateModule::address_tokens(1, 1), []);211 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);212213 // split item scenario214 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));215 assert_eq!(216 TemplateModule::refungible_item_id(1, 1).owner[0],217 Ownership {218 owner: 2,219 fraction: 500220 }221 );222 assert_eq!(223 TemplateModule::refungible_item_id(1, 1).owner[1],224 Ownership {225 owner: 3,226 fraction: 500227 }228 );229 assert_eq!(TemplateModule::balance_count(1, 2), 500);230 assert_eq!(TemplateModule::balance_count(1, 3), 500);231 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);232 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);233234 // split item and new owner has account scenario235 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));236 assert_eq!(237 TemplateModule::refungible_item_id(1, 1).owner[0],238 Ownership {239 owner: 2,240 fraction: 300241 }242 );243 assert_eq!(244 TemplateModule::refungible_item_id(1, 1).owner[1],245 Ownership {246 owner: 3,247 fraction: 700248 }249 );250 assert_eq!(TemplateModule::balance_count(1, 2), 300);251 assert_eq!(TemplateModule::balance_count(1, 3), 700);252 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);253 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);254 });255}256257#[test]258fn transfer_nft_item() {259 new_test_ext().execute_with(|| {260 default_limits();261 262 let collection_id = create_test_collection(&CollectionMode::NFT);263264 let data = default_nft_data();265 create_test_item(collection_id, &data);266 assert_eq!(TemplateModule::balance_count(1, 1), 1);267 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);268269 // default scenario270 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));271 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);272 assert_eq!(TemplateModule::balance_count(1, 1), 0);273 assert_eq!(TemplateModule::balance_count(1, 2), 1);274 // assert_eq!(TemplateModule::address_tokens(1, 1), []);275 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);276 });277}278279#[test]280fn nft_approve_and_transfer_from() {281 new_test_ext().execute_with(|| {282 default_limits();283 284 let collection_id = create_test_collection(&CollectionMode::NFT);285286 let data = default_nft_data();287 create_test_item(collection_id, &data);288289 let origin1 = Origin::signed(1);290 let origin2 = Origin::signed(2);291292 assert_eq!(TemplateModule::balance_count(1, 1), 1);293 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);294295 assert_ok!(TemplateModule::set_mint_permission(296 origin1.clone(),297 1,298 true299 ));300 assert_ok!(TemplateModule::set_public_access_mode(301 origin1.clone(),302 1,303 AccessMode::WhiteList304 ));305 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));306 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));307 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));308309 // do approve310 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));311 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);312 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));313 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);314 assert_eq!(315 TemplateModule::approved(1, (1, 1))[0],316 ApprovePermissions {317 approved: 2,318 amount: 100000000319 }320 );321322 assert_ok!(TemplateModule::transfer_from(323 origin2.clone(),324 1,325 3,326 1,327 1,328 1329 ));330 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);331 });332}333334#[test]335fn refungible_approve_and_transfer_from() {336 new_test_ext().execute_with(|| {337 default_limits();338 339 let collection_id = create_test_collection(&CollectionMode::ReFungible(3));340 341 let origin1 = Origin::signed(1);342 let origin2 = Origin::signed(2);343344 let data = default_re_fungible_data();345 create_test_item(collection_id, &data);346347 assert_eq!(TemplateModule::balance_count(1, 1), 1000);348 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);349350 assert_ok!(TemplateModule::set_mint_permission(351 origin1.clone(),352 1,353 true354 ));355 assert_ok!(TemplateModule::set_public_access_mode(356 origin1.clone(),357 1,358 AccessMode::WhiteList359 ));360 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));361 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));362 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));363364 // do approve365 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));366 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);367 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));368 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);369 assert_eq!(370 TemplateModule::approved(1, (1, 1))[0],371 ApprovePermissions {372 approved: 2,373 amount: 100000000374 }375 );376377 assert_ok!(TemplateModule::transfer_from(378 origin2.clone(),379 1,380 3,381 1,382 1,383 100384 ));385 assert_eq!(TemplateModule::balance_count(1, 1), 900);386 assert_eq!(TemplateModule::balance_count(1, 3), 100);387 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);388 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);389390 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);391 assert_eq!(392 TemplateModule::approved(1, (1, 1))[0],393 ApprovePermissions {394 approved: 3,395 amount: 100000000396 }397 );398 });399}400401#[test]402fn fungible_approve_and_transfer_from() {403 new_test_ext().execute_with(|| {404 default_limits();405 406 let collection_id = create_test_collection(&CollectionMode::Fungible(3));407 408 let data = default_fungible_data();409 create_test_item(collection_id, &data);410411 let origin1 = Origin::signed(1);412 let origin2 = Origin::signed(2);413414 assert_eq!(TemplateModule::balance_count(1, 1), 1000);415 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);416417 assert_ok!(TemplateModule::set_mint_permission(418 origin1.clone(),419 1,420 true421 ));422 assert_ok!(TemplateModule::set_public_access_mode(423 origin1.clone(),424 1,425 AccessMode::WhiteList426 ));427 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));428 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));429 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));430431 // do approve432 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));433 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);434 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));435 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);436 assert_eq!(437 TemplateModule::approved(1, (1, 1))[0],438 ApprovePermissions {439 approved: 2,440 amount: 100000000441 }442 );443444 assert_ok!(TemplateModule::transfer_from(445 origin2.clone(),446 1,447 3,448 1,449 1,450 100451 ));452 assert_eq!(TemplateModule::balance_count(1, 1), 900);453 assert_eq!(TemplateModule::balance_count(1, 3), 100);454 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);455 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);456457 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);458 assert_eq!(459 TemplateModule::approved(1, (1, 1))[0],460 ApprovePermissions {461 approved: 3,462 amount: 100000000463 }464 );465466 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));467 assert_ok!(TemplateModule::transfer_from(468 origin2.clone(),469 1,470 3,471 1,472 1,473 900474 ));475 assert_eq!(TemplateModule::balance_count(1, 1), 0);476 assert_eq!(TemplateModule::balance_count(1, 3), 1000);477 // assert_eq!(TemplateModule::address_tokens(1, 1), []);478 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);479480 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);481 });482}483484#[test]485fn change_collection_owner() {486 new_test_ext().execute_with(|| {487 default_limits();488 489 let collection_id = create_test_collection(&CollectionMode::NFT);490 491 let origin1 = Origin::signed(1);492 assert_ok!(TemplateModule::change_collection_owner(493 origin1.clone(),494 collection_id,495 2496 ));497 assert_eq!(TemplateModule::collection(collection_id).owner, 2);498 });499}500501#[test]502fn destroy_collection() {503 new_test_ext().execute_with(|| {504 default_limits();505 506 let collection_id = create_test_collection(&CollectionMode::NFT);507 508 let origin1 = Origin::signed(1);509 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));510 });511}512513#[test]514fn burn_nft_item() {515 new_test_ext().execute_with(|| {516 default_limits();517 518 let collection_id = create_test_collection(&CollectionMode::NFT);519520 let origin1 = Origin::signed(1);521 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));522 523 let data = default_nft_data();524 create_test_item(collection_id, &data);525526 // check balance (collection with id = 1, user id = 1)527 assert_eq!(TemplateModule::balance_count(1, 1), 1);528529 // burn item530 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));531 assert_noop!(532 TemplateModule::burn_item(origin1.clone(), 1, 1),533 "Item does not exists"534 );535536 assert_eq!(TemplateModule::balance_count(1, 1), 0);537 });538}539540#[test]541fn burn_fungible_item() {542 new_test_ext().execute_with(|| {543 default_limits();544 545 let collection_id = create_test_collection(&CollectionMode::Fungible(3));546 547 let origin1 = Origin::signed(1);548 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));549 550 let data = default_fungible_data();551 create_test_item(collection_id, &data);552553 // check balance (collection with id = 1, user id = 1)554 assert_eq!(TemplateModule::balance_count(1, 1), 1000);555556 // burn item557 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));558 assert_noop!(559 TemplateModule::burn_item(origin1.clone(), 1, 1),560 "Item does not exists"561 );562563 assert_eq!(TemplateModule::balance_count(1, 1), 0);564 });565}566567#[test]568fn burn_refungible_item() {569 new_test_ext().execute_with(|| {570 default_limits();571 572 let collection_id = create_test_collection(&CollectionMode::ReFungible(3));573 let origin1 = Origin::signed(1);574 let origin2 = Origin::signed(2);575576 assert_ok!(TemplateModule::set_mint_permission(577 origin1.clone(),578 collection_id,579 true580 ));581 assert_ok!(TemplateModule::set_public_access_mode(582 origin1.clone(),583 collection_id,584 AccessMode::WhiteList585 ));586 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));587588 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));589 590 let data = default_re_fungible_data();591 create_test_item(collection_id, &data);592593 // check balance (collection with id = 1, user id = 2)594 assert_eq!(TemplateModule::balance_count(1, 1), 1000);595596 // burn item597 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));598 assert_noop!(599 TemplateModule::burn_item(origin1.clone(), 1, 1),600 "Item does not exists"601 );602603 assert_eq!(TemplateModule::balance_count(1, 1), 0);604 });605}606607#[test]608fn add_collection_admin() {609 new_test_ext().execute_with(|| {610 default_limits();611 612 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1);613 create_test_collection_for_owner(&CollectionMode::NFT, 2);614 create_test_collection_for_owner(&CollectionMode::NFT, 3);615 616 let origin1 = Origin::signed(1);617618 // collection admin619 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));620 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));621622 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);623 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);624 });625}626627#[test]628fn remove_collection_admin() {629 new_test_ext().execute_with(|| {630 default_limits();631 632 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1);633 create_test_collection_for_owner(&CollectionMode::NFT, 2);634 create_test_collection_for_owner(&CollectionMode::NFT, 3);635636 let origin1 = Origin::signed(1);637 let origin2 = Origin::signed(2);638639 // collection admin640 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));641 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));642643 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);644 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);645646 // remove admin647 assert_ok!(TemplateModule::remove_collection_admin(648 origin2.clone(),649 1,650 3651 ));652 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);653 });654}655656#[test]657fn balance_of() {658 new_test_ext().execute_with(|| {659 default_limits();660 661 let nft_collection_id = create_test_collection(&CollectionMode::NFT);662 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3));663 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3));664 665 let origin1 = Origin::signed(1);666667 // check balance before668 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);669 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);670 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);671672 let nft_data = default_nft_data();673 create_test_item(nft_collection_id, &nft_data);674 675 let fungible_data = default_fungible_data();676 create_test_item(fungible_collection_id, &fungible_data);677 678 let re_fungible_data = default_re_fungible_data();679 create_test_item(re_fungible_collection_id, &re_fungible_data);680681 // check balance (collection with id = 1, user id = 1)682 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);683 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);684 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);685 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);686 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);687 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);688 });689}690691#[test]692fn approve() {693 new_test_ext().execute_with(|| {694 default_limits();695 696 let collection_id = create_test_collection(&CollectionMode::NFT);697 698 let data = default_nft_data();699 create_test_item(collection_id, &data);700701 let origin1 = Origin::signed(1);702 703 // approve704 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));705 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);706 });707}708709#[test]710fn transfer_from() {711 new_test_ext().execute_with(|| {712 default_limits();713 714 let collection_id = create_test_collection(&CollectionMode::NFT);715 let origin1 = Origin::signed(1);716 let origin2 = Origin::signed(2);717718 let data = default_nft_data();719 create_test_item(collection_id, &data);720721 // approve722 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));723 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);724725 assert_ok!(TemplateModule::set_mint_permission(726 origin1.clone(),727 1,728 true729 ));730 assert_ok!(TemplateModule::set_public_access_mode(731 origin1.clone(),732 1,733 AccessMode::WhiteList734 ));735 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));736 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));737 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));738739 assert_ok!(TemplateModule::transfer_from(740 origin2.clone(),741 1,742 2,743 1,744 1,745 1746 ));747748 // after transfer749 assert_eq!(TemplateModule::balance_count(1, 1), 0);750 assert_eq!(TemplateModule::balance_count(1, 2), 1);751 });752}753754// #endregion755756// Coverage tests region757// #region758759#[test]760fn owner_can_add_address_to_white_list() {761 new_test_ext().execute_with(|| {762 default_limits();763 764 let collection_id = create_test_collection(&CollectionMode::NFT);765766 let origin1 = Origin::signed(1);767 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));768 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);769 });770}771772#[test]773fn admin_can_add_address_to_white_list() {774 new_test_ext().execute_with(|| {775 default_limits();776 777 let collection_id = create_test_collection(&CollectionMode::NFT);778 let origin1 = Origin::signed(1);779 let origin2 = Origin::signed(2);780781 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));782 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));783 assert_eq!(TemplateModule::white_list(collection_id)[0], 3);784 });785}786787#[test]788fn nonprivileged_user_cannot_add_address_to_white_list() {789 new_test_ext().execute_with(|| {790 default_limits();791 792 let collection_id = create_test_collection(&CollectionMode::NFT);793794 let origin2 = Origin::signed(2);795 assert_noop!(796 TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),797 "You do not have permissions to modify this collection"798 );799 });800}801802#[test]803fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {804 new_test_ext().execute_with(|| {805 default_limits();806807 let origin1 = Origin::signed(1);808809 assert_noop!(810 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),811 "This collection does not exist"812 );813 });814}815816#[test]817fn nobody_can_add_address_to_white_list_of_deleted_collection() {818 new_test_ext().execute_with(|| {819 default_limits();820 821 let collection_id = create_test_collection(&CollectionMode::NFT);822823 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));824 assert_noop!(825 TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),826 "This collection does not exist"827 );828 });829}830831// If address is already added to white list, nothing happens832#[test]833fn address_is_already_added_to_white_list() {834 new_test_ext().execute_with(|| {835 default_limits();836 837 let collection_id = create_test_collection(&CollectionMode::NFT);838 let origin1 = Origin::signed(1);839 840 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));841 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));842 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);843 assert_eq!(TemplateModule::white_list(collection_id).len(), 1);844 });845}846847#[test]848fn owner_can_remove_address_from_white_list() {849 new_test_ext().execute_with(|| {850 default_limits();851 852 let collection_id = create_test_collection(&CollectionMode::NFT);853854 let origin1 = Origin::signed(1);855 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));856 assert_ok!(TemplateModule::remove_from_white_list(857 origin1.clone(),858 collection_id,859 2860 ));861 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);862 });863}864865#[test]866fn admin_can_remove_address_from_white_list() {867 new_test_ext().execute_with(|| {868 default_limits();869 870 let collection_id = create_test_collection(&CollectionMode::NFT);871 let origin1 = Origin::signed(1);872 let origin2 = Origin::signed(2);873874 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));875876 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));877 assert_ok!(TemplateModule::remove_from_white_list(878 origin2.clone(),879 collection_id,880 3881 ));882 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);883 });884}885886#[test]887fn nonprivileged_user_cannot_remove_address_from_white_list() {888 new_test_ext().execute_with(|| {889 default_limits();890 891 let collection_id = create_test_collection(&CollectionMode::NFT);892 let origin1 = Origin::signed(1);893 let origin2 = Origin::signed(2);894895 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));896 assert_noop!(897 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),898 "You do not have permissions to modify this collection"899 );900 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);901 });902}903904#[test]905fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {906 new_test_ext().execute_with(|| {907 default_limits();908 let origin1 = Origin::signed(1);909910 assert_noop!(911 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),912 "This collection does not exist"913 );914 });915}916917#[test]918fn nobody_can_remove_address_from_white_list_of_deleted_collection() {919 new_test_ext().execute_with(|| {920 default_limits();921 922 let collection_id = create_test_collection(&CollectionMode::NFT);923 let origin1 = Origin::signed(1);924 let origin2 = Origin::signed(2);925926 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));927 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));928 assert_noop!(929 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),930 "This collection does not exist"931 );932 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);933 });934}935936// If address is already removed from white list, nothing happens937#[test]938fn address_is_already_removed_from_white_list() {939 new_test_ext().execute_with(|| {940 default_limits();941 942 let collection_id = create_test_collection(&CollectionMode::NFT);943 let origin1 = Origin::signed(1);944945 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));946 assert_ok!(TemplateModule::remove_from_white_list(947 origin1.clone(),948 collection_id,949 2950 ));951 assert_ok!(TemplateModule::remove_from_white_list(952 origin1.clone(),953 collection_id,954 2955 ));956 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);957 });958}959960// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)961#[test]962fn white_list_test_1() {963 new_test_ext().execute_with(|| {964 default_limits();965 966 let collection_id = create_test_collection(&CollectionMode::NFT);967968 let origin1 = Origin::signed(1);969 970 let data = default_nft_data();971 create_test_item(collection_id, &data);972973 assert_ok!(TemplateModule::set_public_access_mode(974 origin1.clone(),975 collection_id,976 AccessMode::WhiteList977 ));978 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));979980 assert_noop!(981 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),982 "Address is not in white list"983 );984 });985}986987#[test]988fn white_list_test_2() {989 new_test_ext().execute_with(|| {990 default_limits();991 992 let collection_id = create_test_collection(&CollectionMode::NFT);993 let origin1 = Origin::signed(1);994 995 let data = default_nft_data();996 create_test_item(collection_id, &data);997998 assert_ok!(TemplateModule::set_public_access_mode(999 origin1.clone(),1000 collection_id,1001 AccessMode::WhiteList1002 ));1003 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1004 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));10051006 // do approve1007 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1008 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);10091010 assert_ok!(TemplateModule::remove_from_white_list(1011 origin1.clone(),1012 1,1013 11014 ));10151016 assert_noop!(1017 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1018 "Address is not in white list"1019 );1020 });1021}10221023// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1024#[test]1025fn white_list_test_3() {1026 new_test_ext().execute_with(|| {1027 default_limits();1028 1029 let collection_id = create_test_collection(&CollectionMode::NFT);10301031 let origin1 = Origin::signed(1);1032 1033 let data = default_nft_data();1034 create_test_item(collection_id, &data);10351036 assert_ok!(TemplateModule::set_public_access_mode(1037 origin1.clone(),1038 collection_id,1039 AccessMode::WhiteList1040 ));1041 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));10421043 assert_noop!(1044 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1045 "Address is not in white list"1046 );1047 });1048}10491050#[test]1051fn white_list_test_4() {1052 new_test_ext().execute_with(|| {1053 default_limits();1054 1055 let collection_id = create_test_collection(&CollectionMode::NFT);10561057 let origin1 = Origin::signed(1);10581059 let data = default_nft_data();1060 create_test_item(collection_id, &data);10611062 assert_ok!(TemplateModule::set_public_access_mode(1063 origin1.clone(),1064 collection_id,1065 AccessMode::WhiteList1066 ));1067 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1068 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));10691070 // do approve1071 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1072 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);10731074 assert_ok!(TemplateModule::remove_from_white_list(1075 origin1.clone(),1076 collection_id,1077 21078 ));10791080 assert_noop!(1081 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1082 "Address is not in white list"1083 );1084 });1085}10861087// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1088#[test]1089fn white_list_test_5() {1090 new_test_ext().execute_with(|| {1091 default_limits();1092 1093 let collection_id = create_test_collection(&CollectionMode::NFT);10941095 let origin1 = Origin::signed(1);10961097 let data = default_nft_data();1098 create_test_item(collection_id, &data);10991100 assert_ok!(TemplateModule::set_public_access_mode(1101 origin1.clone(),1102 collection_id,1103 AccessMode::WhiteList1104 ));1105 assert_noop!(1106 TemplateModule::burn_item(origin1.clone(), 1, 1),1107 "Address is not in white list"1108 );1109 });1110}11111112// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1113#[test]1114fn white_list_test_6() {1115 new_test_ext().execute_with(|| {1116 default_limits();1117 1118 let collection_id = create_test_collection(&CollectionMode::NFT);11191120 let origin1 = Origin::signed(1);1121 assert_ok!(TemplateModule::set_public_access_mode(1122 origin1.clone(),1123 collection_id,1124 AccessMode::WhiteList1125 ));11261127 // do approve1128 assert_noop!(1129 TemplateModule::approve(origin1.clone(), 1, 1, 1),1130 "Address is not in white list"1131 );1132 });1133}11341135// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1136// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1137#[test]1138fn white_list_test_7() {1139 new_test_ext().execute_with(|| {1140 default_limits();1141 1142 let collection_id = create_test_collection(&CollectionMode::NFT);11431144 let data = default_nft_data();1145 create_test_item(collection_id, &data);1146 1147 let origin1 = Origin::signed(1);11481149 assert_ok!(TemplateModule::set_public_access_mode(1150 origin1.clone(),1151 collection_id,1152 AccessMode::WhiteList1153 ));1154 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1155 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11561157 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1158 });1159}11601161#[test]1162fn white_list_test_8() {1163 new_test_ext().execute_with(|| {1164 default_limits();1165 1166 let collection_id = create_test_collection(&CollectionMode::NFT);11671168 let data = default_nft_data();1169 create_test_item(collection_id, &data);1170 1171 let origin1 = Origin::signed(1);11721173 assert_ok!(TemplateModule::set_public_access_mode(1174 origin1.clone(),1175 collection_id,1176 AccessMode::WhiteList1177 ));1178 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1179 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11801181 // do approve1182 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1183 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);11841185 assert_ok!(TemplateModule::transfer_from(1186 origin1.clone(),1187 1,1188 2,1189 1,1190 1,1191 11192 ));1193 });1194}11951196// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1197#[test]1198fn white_list_test_9() {1199 new_test_ext().execute_with(|| {1200 default_limits();1201 1202 let collection_id = create_test_collection(&CollectionMode::NFT);1203 let origin1 = Origin::signed(1);12041205 assert_ok!(TemplateModule::set_public_access_mode(1206 origin1.clone(),1207 collection_id,1208 AccessMode::WhiteList1209 ));1210 assert_ok!(TemplateModule::set_mint_permission(1211 origin1.clone(),1212 collection_id,1213 false1214 ));12151216 let data = default_nft_data();1217 create_test_item(collection_id, &data);1218 });1219}12201221// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1222#[test]1223fn white_list_test_10() {1224 new_test_ext().execute_with(|| {1225 default_limits();1226 1227 let collection_id = create_test_collection(&CollectionMode::NFT);12281229 let origin1 = Origin::signed(1);1230 let origin2 = Origin::signed(2);12311232 assert_ok!(TemplateModule::set_public_access_mode(1233 origin1.clone(),1234 collection_id,1235 AccessMode::WhiteList1236 ));1237 assert_ok!(TemplateModule::set_mint_permission(1238 origin1.clone(),1239 collection_id,1240 false1241 ));12421243 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));12441245 assert_ok!(TemplateModule::create_item(1246 origin2.clone(),1247 collection_id,1248 2,1249 default_nft_data()1250 ));1251 });1252}12531254// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1255#[test]1256fn white_list_test_11() {1257 new_test_ext().execute_with(|| {1258 default_limits();1259 1260 let collection_id = create_test_collection(&CollectionMode::NFT);12611262 let origin1 = Origin::signed(1);1263 let origin2 = Origin::signed(2);12641265 assert_ok!(TemplateModule::set_public_access_mode(1266 origin1.clone(),1267 collection_id,1268 AccessMode::WhiteList1269 ));1270 assert_ok!(TemplateModule::set_mint_permission(1271 origin1.clone(),1272 collection_id,1273 false1274 ));1275 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12761277 assert_noop!(1278 TemplateModule::create_item(origin2.clone(), 1, vec![1, 2, 3], 2),1279 "Public minting is not allowed for this collection"1280 );1281 });1282}12831284// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1285#[test]1286fn white_list_test_12() {1287 new_test_ext().execute_with(|| {1288 default_limits();1289 1290 let collection_id = create_test_collection(&CollectionMode::NFT);12911292 let origin1 = Origin::signed(1);1293 let origin2 = Origin::signed(2);12941295 assert_ok!(TemplateModule::set_public_access_mode(1296 origin1.clone(),1297 collection_id,1298 AccessMode::WhiteList1299 ));1300 assert_ok!(TemplateModule::set_mint_permission(1301 origin1.clone(),1302 collection_id,1303 false1304 ));13051306 assert_noop!(1307 TemplateModule::create_item(origin2.clone(), 1, vec![1, 2, 3], 2),1308 "Public minting is not allowed for this collection"1309 );1310 });1311}13121313// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1314#[test]1315fn white_list_test_13() {1316 new_test_ext().execute_with(|| {1317 default_limits();1318 1319 let collection_id = create_test_collection(&CollectionMode::NFT);13201321 let origin1 = Origin::signed(1);13221323 assert_ok!(TemplateModule::set_public_access_mode(1324 origin1.clone(),1325 collection_id,1326 AccessMode::WhiteList1327 ));1328 assert_ok!(TemplateModule::set_mint_permission(1329 origin1.clone(),1330 collection_id,1331 true1332 ));13331334 let data = default_nft_data();1335 create_test_item(collection_id, &data);1336 });1337}13381339// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1340#[test]1341fn white_list_test_14() {1342 new_test_ext().execute_with(|| {1343 default_limits();1344 1345 let collection_id = create_test_collection(&CollectionMode::NFT);13461347 let origin1 = Origin::signed(1);1348 let origin2 = Origin::signed(2);13491350 assert_ok!(TemplateModule::set_public_access_mode(1351 origin1.clone(),1352 collection_id,1353 AccessMode::WhiteList1354 ));1355 assert_ok!(TemplateModule::set_mint_permission(1356 origin1.clone(),1357 collection_id,1358 true1359 ));13601361 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));13621363 assert_ok!(TemplateModule::create_item(1364 origin2.clone(),1365 1,1366 2,1367 default_nft_data()1368 ));1369 });1370}13711372// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1373#[test]1374fn white_list_test_15() {1375 new_test_ext().execute_with(|| {1376 default_limits();1377 1378 let collection_id = create_test_collection(&CollectionMode::NFT);13791380 let origin1 = Origin::signed(1);1381 let origin2 = Origin::signed(2);13821383 assert_ok!(TemplateModule::set_public_access_mode(1384 origin1.clone(),1385 collection_id,1386 AccessMode::WhiteList1387 ));1388 assert_ok!(TemplateModule::set_mint_permission(1389 origin1.clone(),1390 collection_id,1391 true1392 ));13931394 assert_noop!(1395 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data()),1396 "Address is not in white list"1397 );1398 });1399}14001401// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1402#[test]1403fn white_list_test_16() {1404 new_test_ext().execute_with(|| {1405 default_limits();1406 1407 let collection_id = create_test_collection(&CollectionMode::NFT);14081409 let origin1 = Origin::signed(1);1410 let origin2 = Origin::signed(2);14111412 assert_ok!(TemplateModule::set_public_access_mode(1413 origin1.clone(),1414 collection_id,1415 AccessMode::WhiteList1416 ));1417 assert_ok!(TemplateModule::set_mint_permission(1418 origin1.clone(),1419 collection_id,1420 true1421 ));1422 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14231424 assert_ok!(TemplateModule::create_item(1425 origin2.clone(),1426 1,1427 2,1428 default_nft_data()1429 ));1430 });1431}14321433// Total number of collections. Positive test1434#[test]1435fn total_number_collections_bound() {1436 new_test_ext().execute_with(|| {1437 default_limits();1438 1439 create_test_collection(&CollectionMode::NFT);1440 });1441}14421443// Total number of collections. Negotive test1444#[test]1445fn total_number_collections_bound_neg() {1446 new_test_ext().execute_with(|| {1447 default_limits();14481449 let origin1 = Origin::signed(1);14501451 for _ in 0..default_collection_numbers_limit() {1452 create_test_collection(&CollectionMode::NFT)1453 }14541455 // 11-th collection in chain. Expects error1456 assert_noop!(TemplateModule::create_collection(1457 origin1.clone(),1458 col_name1.clone(),1459 col_desc1.clone(),1460 token_prefix1.clone(),1461 mode.clone()1462 ), "Total collections bound exceeded");1463 });1464}14651466// Owned tokens by a single address. Positive test1467#[test]1468fn owned_tokens_bound() {1469 new_test_ext().execute_with(|| {1470 default_limits();1471 1472 let collection_id = create_test_collection(&CollectionMode::NFT);14731474 let data = default_nft_data();1475 create_test_item(collection_id, &data);1476 create_test_item(collection_id, &data);1477 });1478}14791480// Owned tokens by a single address. Negotive test1481#[test]1482fn owned_tokens_bound_neg() {1483 new_test_ext().execute_with(|| {1484 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1485 collection_numbers_limit: 10,1486 account_token_ownership_limit: 1,1487 collections_admins_limit: 5,1488 custom_data_limit: 2048,1489 nft_sponsor_transfer_timeout: 15,1490 fungible_sponsor_transfer_timeout: 15,1491 refungible_sponsor_transfer_timeout: 15, 1492 }));1493 1494 let collection_id = create_test_collection(&CollectionMode::NFT);14951496 let origin1 = Origin::signed(1);1497 let data = default_nft_data();1498 create_test_item(collection_id, &data);14991500 assert_noop!(TemplateModule::create_item(1501 origin1.clone(),1502 1,1503 1,1504 data1505 ), "Owned tokens by a single address bound exceeded");1506 });1507}15081509// Number of collection admins. Positive test1510#[test]1511fn collection_admins_bound() {1512 new_test_ext().execute_with(|| {1513 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1514 collection_numbers_limit: 10,1515 account_token_ownership_limit: 10,1516 collections_admins_limit: 2,1517 custom_data_limit: 2048,1518 nft_sponsor_transfer_timeout: 15,1519 fungible_sponsor_transfer_timeout: 15,1520 refungible_sponsor_transfer_timeout: 15, 1521 }));1522 1523 let collection_id = create_test_collection(&CollectionMode::NFT);15241525 let origin1 = Origin::signed(1);1526 1527 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1528 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1529 });1530}15311532// Number of collection admins. Negotive test1533#[test]1534fn collection_admins_bound_neg() {1535 new_test_ext().execute_with(|| {1536 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1537 collection_numbers_limit: 10,1538 account_token_ownership_limit: 1,1539 collections_admins_limit: 1,1540 custom_data_limit: 2048,1541 nft_sponsor_transfer_timeout: 15,1542 fungible_sponsor_transfer_timeout: 15,1543 refungible_sponsor_transfer_timeout: 15, 1544 }));1545 1546 let collection_id = create_test_collection(&CollectionMode::NFT);15471548 let origin1 = Origin::signed(1);15491550 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1551 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), "Number of collection admins bound exceeded");1552 });1553}15541555// NFT custom data size. Negative test const_data.1556#[test]1557fn custom_data_size_nft_const_data_bound_neg() {1558 new_test_ext().execute_with(|| {1559 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1560 collection_numbers_limit: 10,1561 account_token_ownership_limit: 10,1562 collections_admins_limit: 5,1563 custom_data_limit: 2,1564 nft_sponsor_transfer_timeout: 15,1565 fungible_sponsor_transfer_timeout: 15,1566 refungible_sponsor_transfer_timeout: 15, 1567 }));1568 1569 let collection_id = create_test_collection(&CollectionMode::NFT);15701571 let origin1 = Origin::signed(1);1572 let too_big_const_data = CreateItemData::NFT(CreateNftData{1573 const_data: vec![1, 2, 3, 4],1574 variable_data: vec![]1575 });15761577 assert_noop!(TemplateModule::create_item(1578 origin1.clone(),1579 collection_id,1580 1,1581 too_big_const_data1582 ), "const_data exceeded data limit: 2.");1583 });1584}15851586// NFT custom data size. Negative test variable_data.1587#[test]1588fn custom_data_size_nft_variable_data_bound_neg() {1589 new_test_ext().execute_with(|| {1590 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1591 collection_numbers_limit: 10,1592 account_token_ownership_limit: 10,1593 collections_admins_limit: 5,1594 custom_data_limit: 2,1595 nft_sponsor_transfer_timeout: 15,1596 fungible_sponsor_transfer_timeout: 15,1597 refungible_sponsor_transfer_timeout: 15, 1598 }));15991600 let collection_id = create_test_collection(&CollectionMode::NFT);16011602 let origin1 = Origin::signed(1);1603 let too_big_const_data = CreateItemData::NFT(CreateNftData{1604 const_data: vec![],1605 variable_data: vec![1, 2, 3, 4]1606 });16071608 assert_noop!(TemplateModule::create_item(1609 origin1.clone(),1610 collection_id,1611 1,1612 too_big_const_data1613 ), "variable_data exceeded data limit: 2.");1614 });1615}16161617// Re fungible custom data size. Negative test const_data.1618#[test]1619fn custom_data_size_re_fungible_const_data_bound_neg() {1620 new_test_ext().execute_with(|| {1621 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1622 collection_numbers_limit: 10,1623 account_token_ownership_limit: 10,1624 collections_admins_limit: 5,1625 custom_data_limit: 2,1626 nft_sponsor_transfer_timeout: 15,1627 fungible_sponsor_transfer_timeout: 15,1628 refungible_sponsor_transfer_timeout: 15, 1629 }));16301631 let collection_id = create_test_collection(&CollectionMode::NFT);16321633 let origin1 = Origin::signed(1);1634 let too_big_const_data = CreateItemData::NFT(CreateNftData{1635 const_data: vec![1, 2, 3, 4],1636 variable_data: vec![]1637 });16381639 assert_noop!(TemplateModule::create_item(1640 origin1.clone(),1641 collection_id,1642 1,1643 too_big_const_data1644 ), "const_data exceeded data limit: 2.");1645 });1646}16471648// Re fungible custom data size. Negative test variable_data.1649#[test]1650fn custom_data_size_re_fungible_variable_data_bound_neg() {1651 new_test_ext().execute_with(|| {1652 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1653 collection_numbers_limit: 10,1654 account_token_ownership_limit: 10,1655 collections_admins_limit: 5,1656 custom_data_limit: 2,1657 nft_sponsor_transfer_timeout: 15,1658 fungible_sponsor_transfer_timeout: 15,1659 refungible_sponsor_transfer_timeout: 15, 1660 }));16611662 let collection_id = create_test_collection(&CollectionMode::NFT);16631664 let origin1 = Origin::signed(1);1665 let too_big_const_data = CreateItemData::NFT(CreateNftData{1666 const_data: vec![],1667 variable_data: vec![1, 2, 3, 4]1668 });16691670 assert_noop!(TemplateModule::create_item(1671 origin1.clone(),1672 collection_id,1673 1,1674 too_big_const_data1675 ), "variable_data exceeded data limit: 2.");1676 });1677}1678// #endregion16791680#[test]1681fn set_const_on_chain_schema() {1682 new_test_ext().execute_with(|| {1683 default_limits();16841685 let collection_id = create_test_collection(&CollectionMode::NFT);16861687 let origin1 = Origin::signed(1);1688 assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, "test const on chain schema".to_vec()));16891690 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, "test const on chain schema".to_vec());1691 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, "".to_vec());1692 });1693}16941695#[test]1696fn set_variable_on_chain_schema() {1697 new_test_ext().execute_with(|| {1698 default_limits();1699 1700 let collection_id = create_test_collection(&CollectionMode::NFT);17011702 let origin1 = Origin::signed(1);1703 assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, "test variable on chain schema".to_vec()));17041705 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, "".to_vec());1706 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, "test variable on chain schema".to_vec());1707 });1708}runtime/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))
+ }
}